diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 2392f33c6..5b621fac0 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,4 +1,3 @@ # These are supported funding model platforms -github: wekan custom: ['https://wekan.fi/commercial-support/'] diff --git a/.github/workflows/depsreview.yaml b/.github/workflows/depsreview.yaml index ae5ae5989..8461b453c 100644 --- a/.github/workflows/depsreview.yaml +++ b/.github/workflows/depsreview.yaml @@ -9,6 +9,6 @@ jobs: runs-on: ubuntu-latest steps: - name: 'Checkout Repository' - uses: actions/checkout@v6 + uses: actions/checkout@v5 - name: 'Dependency Review' uses: actions/dependency-review-action@v4 diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index febfde53f..54af974ce 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -32,7 +32,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v6 + uses: actions/checkout@v5 # Login against a Docker registry except on PR # https://github.com/docker/login-action @@ -48,7 +48,7 @@ jobs: # https://github.com/docker/metadata-action - name: Extract Docker metadata id: meta - uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 + uses: docker/metadata-action@c1e51972afc2121e065aed6d45c65596fe445f3f with: images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} diff --git a/.github/workflows/dockerimage.yml b/.github/workflows/dockerimage.yml index 0f85c0d96..14f8dfe01 100644 --- a/.github/workflows/dockerimage.yml +++ b/.github/workflows/dockerimage.yml @@ -15,6 +15,6 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v5 - name: Build the Docker image run: docker build . --file Dockerfile --tag wekan:$(date +%s) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0c05c85e6..9d93b7588 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v6 + uses: actions/checkout@v5 with: fetch-depth: 0 diff --git a/.github/workflows/test_suite.yml b/.github/workflows/test_suite.yml index 1b3effdac..b3498f613 100644 --- a/.github/workflows/test_suite.yml +++ b/.github/workflows/test_suite.yml @@ -18,7 +18,7 @@ jobs: # runs-on: ubuntu-latest # steps: # - name: checkout -# uses: actions/checkout@v6 +# uses: actions/checkout@v5 # # - name: setup node # uses: actions/setup-node@v1 @@ -42,7 +42,7 @@ jobs: # needs: [lintcode] # steps: # - name: checkout -# uses: actions/checkout@v6 +# uses: actions/checkout@v5 # # - name: setup node # uses: actions/setup-node@v1 @@ -65,7 +65,7 @@ jobs: # needs: [lintcode,lintstyle] # steps: # - name: checkout -# uses: actions/checkout@v6 +# uses: actions/checkout@v5 # # - name: setup node # uses: actions/setup-node@v1 @@ -90,12 +90,12 @@ jobs: # CHECKOUTS - name: Checkout - uses: actions/checkout@v6 + uses: actions/checkout@v5 # CACHING - name: Install Meteor id: cache-meteor-install - uses: actions/cache@v5 + uses: actions/cache@v4 with: path: ~/.meteor key: v1-meteor-${{ hashFiles('.meteor/versions') }} @@ -104,7 +104,7 @@ jobs: - name: Cache NPM dependencies id: cache-meteor-npm - uses: actions/cache@v5 + uses: actions/cache@v4 with: path: ~/.npm key: v1-npm-${{ hashFiles('package-lock.json') }} @@ -113,7 +113,7 @@ jobs: - name: Cache Meteor build id: cache-meteor-build - uses: actions/cache@v5 + uses: actions/cache@v4 with: path: | .meteor/local/resolver-result-cache.json @@ -136,7 +136,7 @@ jobs: run: sh ./test-wekan.sh -cv - name: Upload coverage - uses: actions/upload-artifact@v6 + uses: actions/upload-artifact@v4 with: name: coverage-folder path: .coverage/ @@ -147,10 +147,10 @@ jobs: needs: [tests] steps: - name: Checkout - uses: actions/checkout@v6 + uses: actions/checkout@v5 - name: Download coverage - uses: actions/download-artifact@v7 + uses: actions/download-artifact@v5 with: name: coverage-folder path: .coverage/ diff --git a/.tx/config b/.tx/config index f6bdb4cda..7745b5608 100644 --- a/.tx/config +++ b/.tx/config @@ -1,6 +1,6 @@ [main] host = https://www.transifex.com -lang_map = te_IN: te-IN, es_AR: es-AR, es_419: es-LA, es_TX: es-TX, he_IL: he-IL, zh_CN: zh-CN, ar_EG: ar-EG, cs_CZ: cs-CZ, fa_IR: fa-IR, ms_MY: ms-MY, nl_NL: nl-NL, de_CH: de-CH, en_IT: en-IT, uz_UZ: uz-UZ, fr_CH: fr-CH, hi_IN: hi-IN, et_EE: et-EE, es_PE: es-PE, es_MX: es-MX, gl_ES: gl-ES, mn_MN: mn, zh_TW: zh-TW, ast_ES: ast-ES, es_CL: es-CL, ja_JP: ja, lv_LV: lv, ro_RO: ro-RO, az_AZ: az-AZ, cy_GB: cy-GB, gu_IN: gu-IN, pl_PL: pl-PL, vep: ve-PP, en_BR: en-BR, en@ysv: en-YS, hu_HU: hu, ko_KR: ko-KR, pt_BR: pt-BR, zh_HK: zh-HK, zu_ZA: zu-ZA, en_MY: en-MY, ja-Hira: ja-HI, fi_FI: fi, vec: ve-CC, vi_VN: vi-VN, fr_FR: fr-FR, id_ID: id, zh_Hans: zh-Hans, en_DE: en-DE, en_GB: en-GB, el_GR: el-GR, uk_UA: uk-UA, az@latin: az-LA, de_AT: de-AT, uz@Latn: uz-LA, vls: vl-SS, ar_DZ: ar-DZ, bg_BG: bg, es_PY: es-PY, fy_NL: fy-NL, uz@Arab: uz-AR, ru_UA: ru-UA, war: wa-RR, zh_CN.GB2312: zh-GB +lang_map = te_IN: te-IN, es_AR: es-AR, es_419: es-LA, es_TX: es-TX, he_IL: he-IL, zh_CN: zh-CN, ar_EG: ar-EG, cs_CZ: cs-CZ, fa_IR: fa-IR, ms_MY: ms-MY, nl_NL: nl-NL, de_CH: de-CH, en_IT: en-IT, uz_UZ: uz-UZ, fr_CH: fr-CH, hi_IN: hi-IN, et_EE: et-EE, es_PE: es-PE, es_MX: es-MX, gl_ES: gl-ES, mn_MN: mn, sl_SI: sl, zh_TW: zh-TW, ast_ES: ast-ES, es_CL: es-CL, ja_JP: ja, lv_LV: lv, ro_RO: ro-RO, az_AZ: az-AZ, cy_GB: cy-GB, gu_IN: gu-IN, pl_PL: pl-PL, vep: ve-PP, en_BR: en-BR, en@ysv: en-YS, hu_HU: hu, ko_KR: ko-KR, pt_BR: pt-BR, zh_HK: zh-HK, zu_ZA: zu-ZA, en_MY: en-MY, ja-Hira: ja-HI, fi_FI: fi, vec: ve-CC, vi_VN: vi-VN, fr_FR: fr-FR, id_ID: id, zh_Hans: zh-Hans, en_DE: en-DE, en_GB: en-GB, el_GR: el-GR, uk_UA: uk-UA, az@latin: az-LA, de_AT: de-AT, uz@Latn: uz-LA, vls: vl-SS, ar_DZ: ar-DZ, bg_BG: bg, es_PY: es-PY, fy_NL: fy-NL, uz@Arab: uz-AR, ru_UA: ru-UA, war: wa-RR, zh_CN.GB2312: zh-GB [o:wekan:p:wekan:r:application] file_filter = imports/i18n/data/.i18n.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 992b5e785..60fe5bb49 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,283 +22,6 @@ Fixing other platforms In Progress. WeKan 8.00-8.06 had wrong raw database directory setting /var/snap/wekan/common/wekan and some cards were not visible. Those are fixed at WeKan 8.07 where database directory is back to /var/snap/wekan/common and all cards are visible. -# Upcoming WeKan ® release - -This release fixes the following CRITICAL SECURITY ISSUES of [Snowbleed](https://wekan.fi/hall-of-fame/snowbleed/): - -- [Security Fix 1: There was not enough permission checks. Moved migrations to Admin Panel/Settings/Cron](https://github.com/wekan/wekan/commit/cbb1cd78de3e40264a5e047ace0ce27f8635b4e6). - Thanks to [Joshua Rogers](https://joshua.hu) of [Aisle Research](https://aisle.com) and xet7. -- [Security Fix 2: ](https://github.com/wekan/wekan/commit/). - Thanks to [Joshua Rogers](https://joshua.hu) of [Aisle Research](https://aisle.com) and xet7. -- [Security Fix 3: ](https://github.com/wekan/wekan/commit/). - Thanks to [Joshua Rogers](https://joshua.hu) of [Aisle Research](https://aisle.com) and xet7. -- [Security Fix 4: ](https://github.com/wekan/wekan/commit/). - Thanks to [Joshua Rogers](https://joshua.hu) of [Aisle Research](https://aisle.com) and xet7. -- [Security Fix 5: ](https://github.com/wekan/wekan/commit/). - Thanks to [Joshua Rogers](https://joshua.hu) of [Aisle Research](https://aisle.com) and xet7. -- [Security Fix 6: ](https://github.com/wekan/wekan/commit/). - Thanks to [Joshua Rogers](https://joshua.hu) of [Aisle Research](https://aisle.com) and xet7. -- [Security Fix 7: ](https://github.com/wekan/wekan/commit/). - Thanks to [Joshua Rogers](https://joshua.hu) of [Aisle Research](https://aisle.com) and xet7. -- [Security Fix 8: ](https://github.com/wekan/wekan/commit/). - Thanks to [Joshua Rogers](https://joshua.hu) of [Aisle Research](https://aisle.com) and xet7. -- [Security Fix 9: ](https://github.com/wekan/wekan/commit/). - Thanks to [Joshua Rogers](https://joshua.hu) of [Aisle Research](https://aisle.com) and xet7. -- [Security Fix 10: ](https://github.com/wekan/wekan/commit/). - Thanks to [Joshua Rogers](https://joshua.hu) of [Aisle Research](https://aisle.com) and xet7. -- [Security Fix 11: ](https://github.com/wekan/wekan/commit/). - Thanks to [Joshua Rogers](https://joshua.hu) of [Aisle Research](https://aisle.com) and xet7. -- [Security Fix 12: ](https://github.com/wekan/wekan/commit/). - Thanks to [Joshua Rogers](https://joshua.hu) of [Aisle Research](https://aisle.com) and xet7. -- [Security Fix 13: ](https://github.com/wekan/wekan/commit/). - Thanks to [Joshua Rogers](https://joshua.hu) of [Aisle Research](https://aisle.com) and xet7. -- [Security Fix 14: ](https://github.com/wekan/wekan/commit/). - Thanks to [Joshua Rogers](https://joshua.hu) of [Aisle Research](https://aisle.com) and xet7. - -and adds the following updates: - -- [Updated dependencies](https://github.com/wekan/wekan/pull/6059). - Thanks to dependabot. -- [Updated dependencies and published as @wekanteam npm packages to npmjs.com](https://github.com/wekan/wekan/commit/a9a89b501a91ffcdbdd611a05029d9483c59e4db). - Thanks to xet7. -- Added FerretDB2/PostgreSQL Docs. - [Part 1](https://github.com/wekan/wekan/commit/9fb1aeb8272b011c3d0b6b2c26ff7cb498c7b37f), - [Part 2](https://github.com/wekan/wekan/commit/f198421f10dd3be9d58f64a242d12ea1ef45fee3). - Thanks to juri_ at WeKan Libera.Chat IRC and xet7. - -and fixes the following bugs: - -- [Fix attachment download error with non-ASCII filenames](https://github.com/wekan/wekan/pull/6056). - Thanks to brlin-tw. - -Thanks to above GitHub users for their contributions and translators for their translations. - -# v8.19 2025-12-29 WeKan ® release - -This release fixes the following CRITICAL SECURITY ISSUES of [Megableed](https://wekan.fi/hall-of-fame/megableed/): - -- [Security Fix 1: IDOR in setCreateTranslation. Non-admin could change Custom Translation](https://github.com/wekan/wekan/commit/f244a43771f6ebf40218b83b9f46dba6b940d7de). - Thanks to [Joshua Rogers](https://joshua.hu) of [Aisle Research](https://aisle.com) and xet7. -- [Security Fix 2: Private-only board setting can be bypassed](https://github.com/wekan/wekan/commit/7ed76c180ede46ab1dac6b8ad27e9128a272c2c8). - Thanks to [Joshua Rogers](https://joshua.hu) of [Aisle Research](https://aisle.com) and xet7. -- [Security Fix 3: Card comment author spoofing (IDOR) via API](https://github.com/wekan/wekan/commit/67cb47173c1a152d9eaf5469740992b2dacdf62d). - Thanks to [Joshua Rogers](https://joshua.hu) of [Aisle Research](https://aisle.com) and xet7. -- [Security Fix 4: Cross-board card move without destination authorization](https://github.com/wekan/wekan/commit/198509e7600981400353aec6259247b3c04e043e). - Thanks to [Joshua Rogers](https://joshua.hu) of [Aisle Research](https://aisle.com) and xet7. -- [Security Fix 5: Read-only roles can still update cards](https://github.com/wekan/wekan/commit/181f837d8cbae96bdf9dcbd31beaa3653c2c0285). - Thanks to [Joshua Rogers](https://joshua.hu) of [Aisle Research](https://aisle.com) and xet7. -- [Security Fix 6: Checklist delete IDOR: checklist not verified against board/card](https://github.com/wekan/wekan/commit/08a6f084eba09487743a7c807fb4a9000fcfa9ac). - Thanks to [Joshua Rogers](https://joshua.hu) of [Aisle Research](https://aisle.com) and xet7. -- [Security Fix 7: Checklist create IDOR: cardId not verified against boardId](https://github.com/wekan/wekan/commit/5cd875813fdec5a3c40a0358b30a347967c85c14). - Thanks to [Joshua Rogers](https://joshua.hu) of [Aisle Research](https://aisle.com) and xet7. -- [Security Fix 8: Attachments publication leaks metadata without auth](https://github.com/wekan/wekan/commit/6dfa3beb2b6ab23438d0f4395b84bf0749eb4820). - Thanks to [Joshua Rogers](https://joshua.hu) of [Aisle Research](https://aisle.com) and xet7. -- [Security Fix 9: Attachment upload not scoped to card/board relationship](https://github.com/wekan/wekan/commit/1d16955b6d4f0a0282e89c2c1b0415c7597019b8). - Thanks to [Joshua Rogers](https://joshua.hu) of [Aisle Research](https://aisle.com) and xet7. -- [Security Fix 10: LDAP filter injection in LDAP auth](https://github.com/wekan/wekan/commit/0b0e16c3eae28bbf453d33a81a9c58ce7db6d5bb). - Thanks to [Joshua Rogers](https://joshua.hu) of [Aisle Research](https://aisle.com) and xet7. - -and adds the following new features: - -- [Opened card Checklist menu: Hide finished tasks. Show Checklist at Minicard](https://github.com/wekan/wekan/commit/fbfde81bc8208b718c070a6eeba4b2e2d2ce83ba). - Thanks to C0rn3j and xet7. - -and adds the following updates: - -- [Helm Chart: Updated MongoDB to 7.0.28 at artifacthub.io](https://github.com/wekan/charts/commit/5e6d344e0b976ce683116b66a1fb8417590115aa). - Thanks to xet7 and titver968. - -and fixes the following bugs: - -- [Re-add JS closing class to unicode close announcement symbol](https://github.com/wekan/wekan/pull/6050). - Thanks to Chostakovitch. -- [Cannot re-arrange lists within swimlanes](https://github.com/wekan/wekan/pull/6052). - Thanks to Chostakovitch. -- Converted Gantt from js to Jade, and made card title to render markdown at Gantt view. - [Part 1](https://github.com/wekan/wekan/commit/2d3bef9033134c3b62cf22179bbee4b6fea81444), - [Part 2](https://github.com/wekan/wekan/commit/3af3c9a89d8a4020b6f1ccada7da2ccbec1a8562). - Thanks to xet7. -- [Fix find.sh work with spaces, for example: ./find.sh "Some text"](https://github.com/wekan/wekan/commit/db4b04d8377523440fd2c36c1633ee74d7b05146). - Thanks to xet7. -- [Fix copy move card at board and MultiSelect to have numbered target of board, card above or below. Added MultiSelect change color](https://github.com/wekan/wekan/commit/74f1dfde72b9448645552ae28ba8d989d3e823d8). - Thanks to mimZD and xet7. -- [Fix move card last selection is gone](https://github.com/wekan/wekan/commit/2d87ba18b31ab5d8dc91dce01199cf7b313bd560). - Thanks to mimZD and xet7. -- [Fix Unable to delete Checklist. Added confirm delete to Checklist and Chekclist Item](https://github.com/wekan/wekan/commit/cf62807ad5d056ce9b8045c55f7cf6c29044967b). - Thanks to C0rn3j and xet7. - -Thanks to above GitHub users for their contributions and translators for their translations. - -# v8.18 2025-12-28 WeKan ® release - -This release adds the following CRITICAL SECURITY FIXES: - -- [Upgraded MongoDB to 7.0.28 to fix mongobleed at Snap Candidate](https://github.com/wekan/wekan/commit/e210c9973be55a4fa4e7dd15aefc24e06dbc3e7f). - Thanks to developers of MongoDB. - -and adds the following new features: - -- [Gantt chart view to one board view menu Swimlanes/Lists/Calendar/Gantt](https://github.com/wekan/wekan/commit/f34e4c0e363e386dbcce8e6ee8933b2d50491c58). - Thanks to xet7. -- [Number of cards per list and sum of custom number field in list head](https://github.com/wekan/wekan/commit/e569c2957ecc2b5fbf65ddcf0793b97c3ed5da81). - Thanks to xet7. -- [New Board Permissions: NormalAssignedOnly, CommentAssignedOnly, ReadOnly, ReadAssignedOnly](https://github.com/wekan/wekan/commit/c1168d181b3ff34f5ee7794a5740281c4ab5e253). - Thanks to xet7. -- [More translations. Added support page to Admin Panel / Settings / Layout](https://github.com/wekan/wekan/commit/a7400dca4503961267cc5fd6a1c8efaa78668f77). - Thanks to xet7. -- [Right top User Settings / Grey Icons. Also fixed Change Language popup](https://github.com/wekan/wekan/commit/300b653ea3416892faf2d08f5e0be3752e2041d6). - Thanks to xet7. -- [Collapse Swimlane, List, Opened Card. Opened Card window X and Y position can be moved freely from drag handle. Fix some dragging not possible. Fix iPhone Safari](https://github.com/wekan/wekan/commit/58f4884ad603e4f8c68a8819dfb1440234da70b6). - Thanks to xet7. -- Per-User and Board-level data save fixes. Per-User is collapse, width, height. Per-Board is Swimlanes, Lists, Cards etc. - [Part 1](https://github.com/wekan/wekan/commit/414b8dbf41ecf368d54aeceb6a78ccd0aa58f6a6), - [Part 2](https://github.com/wekan/wekan/commit/58e970d68508a76a1b9333941eb1696fb8fb7727). - Thanks to xet7. - -and adds the following updates: - -- [Update GitHub docker/metadata-action from 5.8.0 to 5.9.0](https://github.com/wekan/wekan/pull/6012). - Thanks to dependabot. -- [Updated security.md](https://github.com/wekan/wekan/commit/7ff1649d8909917cae590c68def6eecac0442f91). - Thanks to xet7. -- [Updated build script for Linux arm64 bundle](https://github.com/wekan/wekan/commit/3db1305e58168f7417023ccd8d54995026844b18). - Thanks to xet7. -- Update Backup docs about migrating to newest WeKan. - [Part 1](https://github.com/wekan/wekan/commit/e669b1b9c72278c8debbc9de74d3fa02224a66d8), - [Part 2](https://github.com/wekan/wekan/commit/19fa12bb26a0444acffd49f24123ed993c425f6a), - [Part 3](https://github.com/wekan/wekan/commit/4e346c0ab7fbfb39544063cbd0e095307b26648f), - [Part 4](https://github.com/wekan/wekan/commit/59fc756a0bda8e11b9d86961daa35bb755110a68), - [Part 5](https://github.com/wekan/wekan/commit/30541260f0f979662889bc40b4db461af1583a07), - [Part 6](https://github.com/wekan/wekan/commit/784c5c6b0c83397ab4344d1a0fa231f33ff26564), - [Part 7](https://github.com/wekan/wekan/commit/5686c92e05452a5d91c10ed436fae71103ecfb1f), - [Part 8](https://github.com/wekan/wekan/commit/b7ff370561153bbfbb07426f9bd8b4d2977b1d0c), - [Part 9](https://github.com/wekan/wekan/commit/fe4b36b85d4ac8efddb2c7148bc5d2413cd643e1), - [Part 10](https://github.com/wekan/wekan/commit/9ebdc82d46d86029df12adaafba95c0ecfc9d2c2), - [Part 11](https://github.com/wekan/wekan/commit/3ef0a3e685657eba1cc07314ac8d195f89dbef74), - [Part 12](https://github.com/wekan/wekan/commit/2cbf64da33aff2d0b77ee91e7e9ac360cd1edb99), - [Part 13](https://github.com/wekan/wekan/commit/3c578403404084ae10e4349b5570b0d50ecd8eb4), - [Part 14](https://github.com/wekan/wekan/commit/451e9f78705dbbac2ed6ce123fd5440a871b6dcc), - [Part 15](https://github.com/wekan/wekan/commit/e07e461e482f54c8ddaebc63373c93dc4aa0d956). - -and fixes the following bugs: - -- [Fix Broken Strikethroughs in Markdown to HTML conversion](https://github.com/wekan/wekan/pull/6009). - Thanks to brlin-tw. -- [Updated Mac docs for Applite](https://github.com/wekan/wekan/commit/400eb81206f346a973d871a8aaa55d4ac5d48753). - Thanks to xet7. -- [Fix checklist delete action (issue #6020), link-card popup defaults, and stabilize due-cards ordering](https://github.com/wekan/wekan/pull/5967). - Thanks to seve12. -- [Improve rules UI board dropdowns/loading, rule header titles, and ensure card move updates attachment metadata](https://github.com/wekan/wekan/pull/5967). - Thanks to seve12. -- [Improve imports: normalize id → _id, add default swimlane fallback, and add regression test](https://github.com/wekan/wekan/pull/5967). - Thanks to seve12. - -Thanks to above GitHub users for their contributions and translators for their translations. - -# v8.17 2025-11-06 WeKan ® release - -This release adds the following new feature: - -- [Feature: Workspaces, at All Boards page](https://github.com/wekan/wekan/commit/0afbdc95b49537e06b4f9cf98f51a669ef249384). - Thanks to xet7. - -and fixes the following bugs: - -- [Fix 8.16: Switching Board View fails with 403 error](https://github.com/wekan/wekan/commit/550d87ac6cb3ec946600616485afdbd242983ab4). - Thanks to xet7. -- [Moved migrations from opening board to right sidebar / Migrations](https://github.com/wekan/wekan/commit/1b25d1d5720d4f486a10d2acce37e315cf9b6057). - Thanks to xet7. -- [Fix 8.16 Lists with no items are deleted every time when board is opened. Moved migrations to right sidebar](https://github.com/wekan/wekan/commit/7713e613b431e44dc13cee72e7a1e5f031473fa6). - Thanks to xet7. -- [Remove old translations and code not in use anymore](https://github.com/wekan/wekan/commit/ba49d4d140bc0d4cfb5a96db9ab077bc85db58f1). - Thanks to xet7. -- [Fixed sidebar migrations to be per-board, not global. Clarified translations](https://github.com/wekan/wekan/commit/e4638d5fbcbe004ac393462331805cac3ba25097). - Thanks to xet7. -- [Fix star board](https://github.com/wekan/wekan/commit/8711b476be30496b96b845529b5717bb6e685c27). - Thanks to xet7. -- [Fix Card emoji issues](https://github.com/wekan/wekan/commit/e5e711c938edcca23c974c3eec97296898bcf24e). - Thanks to xet7. -- [Try to fix Edit Custom Fields button not working. Removed duplicate option from Boards Settings](https://github.com/wekan/wekan/commit/20af0a2ef55b11e7205845859ee92a929616ce91). - Thanks to xet7. -- [Fix Regression - calendar popup to set due date has gone](https://github.com/wekan/wekan/commit/581733d605b7e0494e72229c45947cff134f6dd6). - Thanks to xet7. -- [Remove not working Bookmark menu option](https://github.com/wekan/wekan/commit/c829c073cf822e48b7cd84bbfb79d42867412517). - Thanks to xet7. -- [Fix Workspaces at All Boards to have correct count of remaining etc, while starred also at Starred/Favorites](https://github.com/wekan/wekan/commit/6244657ca53a54646ec01e702851a51d89bd0d55). - Thanks to xet7. -- [Fix Worker Permissions does not allow for cards to be moved. - v8.15. Removed buttons Worker should not use](https://github.com/wekan/wekan/commit/18003900c2d497c129793d1653d4d9872a2f19da). - Thanks to xet7. - -Thanks to above GitHub users for their contributions and translators for their translations. - -# v8.16 2025-11-02 WeKan ® release - -This release fixes the following CRITICAL SECURITY ISSUES of [Spacebleed](https://wekan.fi/hall-of-fame/spacebleed/): - -- [Fix SECURITY ISSUE 1: File Attachments enables stored XSS (High)](https://github.com/wekan/wekan/commit/e9a727301d7b4f1689a703503df668c0f4f4cab8). - Thanks to Siam Thanat Hack (STH) and xet7. -- [Fix SECURITY ISSUE 2: Access to boards of any Orgs/Teams, and avatar permissions](https://github.com/wekan/wekan/commit/f26d58201855e861bab1cd1fda4d62c664efdb81). - Thanks to Siam Thanat Hack (STH) and xet7. -- [Fix SECURITY ISSUE 3: Unauthenticated (or any) user can update board sort](https://github.com/wekan/wekan/commit/ea310d7508b344512e5de0dfbc9bdfd38145c5c5). - Thanks to Siam Thanat Hack (STH) and xet7. -- [Fix SECURITY ISSUE 4: Members can forge others’ votes (Low). Bonus: Similar fixes to planning poker too done by xet7](https://github.com/wekan/wekan/commit/0a1a075f3153e71d9a858576f1c68d2925230d9c). - Thanks to Siam Thanat Hack (STH) and xet7. -- [Fix SECURITY ISSUE 5: Attachment API uses bearer value as userId and DoS (Low)](https://github.com/wekan/wekan/commit/ccd90343394f433b287733ad0a33c08e0a71f53c). - Thanks to Siam Thanat Hack (STH) and xet7. - -and adds the following new features: - -- [List menu / More / Delete duplicate lists that do not have any cards](https://github.com/wekan/wekan/commit/91b846e2cdee9154b045d11b4b4c1a7ae1d79016). - Thanks to xet7. -- [Disabled migrations that happen when opening board. Defaulting to per-swimlane lists and drag drop list to same or different swimlane](https://github.com/wekan/wekan/commit/034dc08269520ca31c780cce64e0150969e9228e). - Thanks to xet7. - -and fixes the following bugs: - -- [Fix changing swimlane color to not reload webpage](https://github.com/wekan/wekan/commit/ecf2418347cae4329deb292b534f68eb099d3f90). - Thanks to xet7. - -Thanks to above GitHub users for their contributions and translators for their translations. - -# v8.15 2025-10-23 WeKan ® release - -This release fixes the following bugs: - -- Fix drag lists did not work - [Part 1](https://github.com/wekan/wekan/commit/8662c96d1c8d4fa76ce7b31eb06678ad59c3ebe1), - [Part 2](https://github.com/wekan/wekan/commit/0cebd8aa4dbe0bf2418b814716744ab806b671c2). - Thanks to xet7. - -Thanks to above GitHub users for their contributions and translators for their translations. - -# v8.14 2025-10-23 WeKan ® release - -This release fixes the following bugs: - -- [Fix board reloading page every second](https://github.com/wekan/wekan/commit/b4b598f542d0cefc5f2d5d6c7286f0a312cf6a55). - Thanks to xet7. - -Thanks to above GitHub users for their contributions and translators for their translations. - -# v8.12 2025-10-23 WeKan ® release - -This release fixes the following bugs: - -- [Fix Regression - unable to view cards by due date v8.11](https://github.com/wekan/wekan/commit/ae11e80bde79d9ad412d185f20e5a7f802685260). - Thanks to xet7. -- [Fix Regression - unable to rearrange tasks within a checklist - v8.11](https://github.com/wekan/wekan/commit/544b24ceb1687e5b568d8c7b74403a5a2e3f6bc6). - Thanks to xet7. -- [Fix unable to add members to board](https://github.com/wekan/wekan/commit/c6d46006837a29fb311e444f94fa65f236e23bc7). - Thanks to xet7. -- [Removed not needed | at left side of minicard badges](https://github.com/wekan/wekan/commit/a0c30c35ed57113df041ef1020d3e9e5449f35e4). - Thanks to xet7. -- [Fix opened card Date Format to be used at dates popups](https://github.com/wekan/wekan/commit/7ca81285b14d1ec60d6e7e9c191d1194950f18c8). - Thanks to xet7. -- [Fix UI issues of Right Sidebar / Subtasks Settings and Card Settings](https://github.com/wekan/wekan/commit/45537ede870eca59ad72cd7ad013a12f60032df4). - Thanks to xet7. - -Thanks to above GitHub users for their contributions and translators for their translations. - # v8.11 2025-10-21 WeKan ® release This release fixes the following bugs: diff --git a/Dockerfile b/Dockerfile index d322f66f1..d3c8b246b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -249,9 +249,9 @@ cd /home/wekan/app # Remove legacy webbroser bundle, so that Wekan works also at Android Firefox, iOS Safari, etc. #rm -rf /home/wekan/app_build/bundle/programs/web.browser.legacy #mv /home/wekan/app_build/bundle /build -wget "https://github.com/wekan/wekan/releases/download/v8.19/wekan-8.19-amd64.zip" -unzip wekan-8.19-amd64.zip -rm wekan-8.19-amd64.zip +wget "https://github.com/wekan/wekan/releases/download/v8.11/wekan-8.11-amd64.zip" +unzip wekan-8.11-amd64.zip +rm wekan-8.11-amd64.zip mv /home/wekan/app/bundle /build # Put back the original tar diff --git a/SECURITY.md b/SECURITY.md index 5cde5926b..aadecbf6e 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -1,20 +1,12 @@ +About money, see [CONTRIBUTING.md](CONTRIBUTING.md) -## Responsible Security Disclosure +Security is very important to us. If you discover any issue regarding security, please disclose +the information responsibly by sending an email from Protonmail to security@wekan.fi +that is Protomail email address, or by using this PGP key +[security-at-wekan.fi.asc](security-at-wekan.fi.asc) to security@wekan.fi +and not by creating a GitHub issue. We will respond swiftly to fix verifiable security issues. -- To send email, use [ProtonMail](https://proton.me) email address or use PGP key [security-at-wekan.fi.asc](security-at-wekan.fi.asc) -- Send info about security issue ONLY to security@wekan.fi (that is Protomail email address). NOT TO ANYWHERE ELSE. NO CC, NO BCC. -- Wait for new WeKan release that fixes security issue -- If you approve, we thank you by adding you to Hall of Fame: https://wekan.fi/hall-of-fame/ - -## Bonus Points - -- If you include code for fixing security issue - -## Losing Points - -- If you ask about [bounty](CONTRIBUTING.md). There is no bounty. WeKan is NOT Big Tech. WeKan is FLOSS. -- If you forget to include vulnerability details. -- If you send info about security issue to somewhere else than security@wekan.fi +We thank you with a place at our hall of fame page, that is at https://wekan.fi/hall-of-fame ## How should reports be formatted? @@ -34,7 +26,7 @@ CWSS (optional): %cwss Anyone who reports a unique security issue in scope and does not disclose it to a third party before we have patched and updated may be upon their approval -added to the WeKan Hall of Fame https://wekan.fi/hall-of-fame/ +added to the Wekan Hall of Fame. ## Which domains are in scope? @@ -71,6 +63,11 @@ and by by companies that have 30k users. - If you are thinking about TLS MITM, look at https://github.com/caddyserver/caddy/issues/2530 - Let's Encrypt TLS requires publicly accessible webserver, that Let's Encrypt TLS validation servers check. - If firewall limits to only allowed IP addresses, you may need non-Let's Encrypt TLS cert. +- For On Premise: + - https://caddyserver.com/docs/automatic-https#local-https + - https://github.com/wekan/wekan/wiki/Caddy-Webserver-Config + - https://github.com/wekan/wekan/wiki/Azure + - https://github.com/wekan/wekan/wiki/Traefik-and-self-signed-SSL-certs ## XSS @@ -175,57 +172,6 @@ Meteor.startup(() => { - https://github.com/wekan/wekan/blob/main/client/components/cards/attachments.js#L303-L312 - https://wekan.github.io/hall-of-fame/filebleed/ -### Attachments: Forced download to prevent stored XSS - -- To prevent browser-side execution of uploaded content under the app origin, all attachment downloads are served with safe headers: - - `Content-Type: application/octet-stream` - - `Content-Disposition: attachment` - - `X-Content-Type-Options: nosniff` - - A restrictive `Content-Security-Policy` with `sandbox` -- This means attachments are downloaded instead of rendered inline by default. This mitigates HTML/JS/SVG based stored XSS vectors. -- Avatars and inline images remain supported but SVG uploads are blocked and never rendered inline. - -## Users: Client update restrictions - -- Client-side updates to user documents are limited to safe fields only: - - `username` - - `profile.*` -- Sensitive fields are blocked from any client updates and can only be modified by server methods with authorization: - - `orgs`, `teams`, `roles`, `isAdmin`, `createdThroughApi`, `loginDisabled`, `authenticationMethod`, `services.*`, `emails.*`, `sessionData.*` -- Attempts to update forbidden fields from the client are denied. -- Admin operations like managing org/team membership or toggling flags must use server methods that check permissions. - -## Voting: integrity and authorization - -- Client updates to card `vote` fields are blocked to prevent forged votes and inconsistent policy enforcement. -- Voting is performed via a server method that enforces: - - Authentication and board membership, or an explicit per-card flag allowing non-members to vote. - - Only the caller's own userId is added/removed from `vote.positive`/`vote.negative`. -- This prevents members from fabricating other users' votes and ensures non-members cannot vote unless explicitly allowed. - -## Planning Poker: integrity and authorization - -- Client updates to card `poker` fields are blocked. All poker actions go through server methods that enforce: - - Authentication and board membership for configuration and results. - - For casting a poker vote, either board membership or an explicit per-card flag allowing non-members to participate. - - Only the caller's own userId is added/removed from the selected estimation bucket (e.g., one, two, five, etc.). -- Methods cover setting/unsetting poker question/end, casting votes, replaying, and setting final estimation. - -## Attachment API: authentication and DoS prevention - -- The attachment API (`/api/attachment/*`) requires proper authentication using `X-User-Id` and `X-Auth-Token` headers. -- Authentication validates tokens by hashing with `Accounts._hashLoginToken` and matching against stored login tokens, preventing identity spoofing. -- Request handlers implement: - - 30-second timeout to prevent hanging connections. - - Request body size limits (50MB for uploads, 10MB for metadata operations). - - Proper error handling and guaranteed response completion. - - Request error event handlers to clean up failed connections. -- This prevents: - - DoS attacks via concurrent unauthenticated or malformed requests. - - Identity spoofing by using arbitrary bearer tokens or user IDs. - - Resource exhaustion from hanging connections or excessive payloads. -- Access control: all attachment operations verify board membership before allowing access. - ## Brute force login protection - https://github.com/wekan/wekan/commit/23e5e1e3bd081699ce39ce5887db7e612616014d @@ -272,4 +218,9 @@ Typical already known or "no impact" bugs such as: - Email spoofing, SPF, DMARC & DKIM. Wekan does not include email server. Wekan is Open Source with MIT license, and free to use also for commercial use. -We welcome all fixes to improve security by email to security@wekan.fi +We welcome all fixes to improve security by email to security@wekan.team + +## Bonus Points + +If your Responsible Security Disclosure includes code for fixing security issue, +you get bonus points, as seen on [Hall of Fame](https://wekan.github.io/hall-of-fame). diff --git a/Stackerfile.yml b/Stackerfile.yml index fb8614872..272a675a1 100644 --- a/Stackerfile.yml +++ b/Stackerfile.yml @@ -1,5 +1,5 @@ appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928 -appVersion: "v8.19.0" +appVersion: "v8.11.0" files: userUploads: - README.md diff --git a/client/00-startup.js b/client/00-startup.js index 02954353b..a6f049322 100644 --- a/client/00-startup.js +++ b/client/00-startup.js @@ -10,72 +10,8 @@ import '/client/lib/boardConverter'; import '/client/components/boardConversionProgress'; // Import migration manager and progress UI -import '/client/lib/attachmentMigrationManager'; -import '/client/components/settings/migrationProgress'; +import '/client/lib/migrationManager'; +import '/client/components/migrationProgress'; // Import cron settings import '/client/components/settings/cronSettings'; - -// Mirror Meteor login token into a cookie for server-side file route auth -// This enables cookie-based auth for /cdn/storage/* without leaking ROOT_URL -// Token already lives in localStorage; cookie adds same-origin send-on-request semantics -Meteor.startup(() => { - const COOKIE_NAME = 'meteor_login_token'; - const cookieAttrs = () => { - const attrs = ['Path=/', 'SameSite=Lax']; - try { - if (window.location && window.location.protocol === 'https:') { - attrs.push('Secure'); - } - } catch (_) {} - return attrs.join('; '); - }; - - const setCookie = (name, value) => { - if (!value) return; - document.cookie = `${encodeURIComponent(name)}=${encodeURIComponent(value)}; ${cookieAttrs()}`; - }; - const clearCookie = (name) => { - document.cookie = `${encodeURIComponent(name)}=; Expires=Thu, 01 Jan 1970 00:00:00 GMT; ${cookieAttrs()}`; - }; - - const syncCookie = () => { - try { - const token = Accounts && typeof Accounts._storedLoginToken === 'function' ? Accounts._storedLoginToken() : null; - if (token) setCookie(COOKIE_NAME, token); else clearCookie(COOKIE_NAME); - } catch (e) { - // ignore - } - }; - - // Initial sync on startup - syncCookie(); - - // Keep cookie in sync on login/logout - if (Accounts && typeof Accounts.onLogin === 'function') Accounts.onLogin(syncCookie); - if (Accounts && typeof Accounts.onLogout === 'function') Accounts.onLogout(syncCookie); - - // Sync across tabs/windows when localStorage changes - window.addEventListener('storage', (ev) => { - if (ev && typeof ev.key === 'string' && ev.key.indexOf('Meteor.loginToken') !== -1) { - syncCookie(); - } - }); -}); - -// Subscribe to per-user small publications -Meteor.startup(() => { - Tracker.autorun(() => { - if (Meteor.userId()) { - Meteor.subscribe('userGreyIcons'); - } - }); - - // Initialize mobile mode on startup for iOS devices - // This ensures mobile mode is applied correctly on page load - Tracker.afterFlush(() => { - if (typeof Utils !== 'undefined' && Utils.initializeUserSettings) { - Utils.initializeUserSettings(); - } - }); -}); diff --git a/client/components/activities/comments.css b/client/components/activities/comments.css index de0189de7..f495ca361 100644 --- a/client/components/activities/comments.css +++ b/client/components/activities/comments.css @@ -108,12 +108,15 @@ text-decoration: none; height: 24px; } -.comments .comment .comment-desc .reactions .open-comment-reaction-popup span { - display: inline-block; - font-size: clamp(14px, 2vw, 18px); +.comments .comment .comment-desc .reactions .open-comment-reaction-popup i.fa.fa-smile-o { + font-size: 17px; font-weight: 500; - line-height: 1; - margin-left: 4px; + margin-left: 2px; +} +.comments .comment .comment-desc .reactions .open-comment-reaction-popup i.fa.fa-plus { + font-size: 8px; + margin-top: -7px; + margin-left: 1px; } .comments .comment .comment-desc .reactions .reaction { cursor: pointer; diff --git a/client/components/activities/comments.jade b/client/components/activities/comments.jade index f459fc664..07b52d47d 100644 --- a/client/components/activities/comments.jade +++ b/client/components/activities/comments.jade @@ -25,7 +25,7 @@ template(name="comment") = text .edit-controls button.primary(type="submit") {{_ 'edit'}} - a.js-close-inlined-form(title="{{_ 'close' }}") ❌ + .fa.fa-times-thin.js-close-inlined-form else .comment-text +viewer @@ -55,8 +55,8 @@ template(name="commentReactions") span.reaction-count #{reaction.userIds.length} if (currentUser.isBoardMember) a.open-comment-reaction-popup(title="{{_ 'addReactionPopup-title'}}") - span(title="{{_ 'reaction' }}") 😀 - span(title="{{_ 'add' }}") ➕ + i.fa.fa-smile-o + i.fa.fa-plus template(name="addReactionPopup") .reactions-popup diff --git a/client/components/activities/comments.js b/client/components/activities/comments.js index 74441021e..62629252d 100644 --- a/client/components/activities/comments.js +++ b/client/components/activities/comments.js @@ -57,9 +57,8 @@ BlazeComponent.extendComponent({ BlazeComponent.extendComponent({ getComments() { - const data = this.data(); - if (!data || typeof data.comments !== 'function') return []; - return data.comments(); + const ret = this.data().comments(); + return ret; }, }).register("comments"); diff --git a/client/components/boards/boardArchive.jade b/client/components/boards/boardArchive.jade index ada3dc81a..d9a251ebd 100644 --- a/client/components/boards/boardArchive.jade +++ b/client/components/boards/boardArchive.jade @@ -1,6 +1,6 @@ template(name="archivedBoards") h2 - span(title="{{_ 'archived-boards'}}") 📦 + i.fa.fa-archive | {{_ 'archived-boards'}} ul.archived-lists @@ -8,10 +8,10 @@ template(name="archivedBoards") li.archived-lists-item div.board-header-btns button.board-header-btn.js-delete-board - | 🗑️ + i.fa.fa-trash-o | {{_ 'delete-board'}} button.board-header-btn.js-restore-board - | ↩️ + i.fa.fa-undo | {{_ 'restore-board'}} = title span {{ moment archivedAt 'LLL' }} diff --git a/client/components/boards/boardBody.css b/client/components/boards/boardBody.css index b23d7f4d8..05fa8fc58 100644 --- a/client/components/boards/boardBody.css +++ b/client/components/boards/boardBody.css @@ -231,30 +231,6 @@ font-size: 1em !important; /* Keep original icon size */ } -/* Mobile iPhone: scale card details text and icons to 2x */ -body.mobile-mode.iphone-device .card-details { - font-size: 2em !important; -} -body.mobile-mode.iphone-device .card-details .fa, -body.mobile-mode.iphone-device .card-details .icon, -body.mobile-mode.iphone-device .card-details i, -body.mobile-mode.iphone-device .card-details .emoji-icon, -body.mobile-mode.iphone-device .card-details a, -body.mobile-mode.iphone-device .card-details p, -body.mobile-mode.iphone-device .card-details span, -body.mobile-mode.iphone-device .card-details div, -body.mobile-mode.iphone-device .card-details button, -body.mobile-mode.iphone-device .card-details input, -body.mobile-mode.iphone-device .card-details select, -body.mobile-mode.iphone-device .card-details textarea { - font-size: inherit !important; -} -/* Section titles slightly larger than content but not as big as card title */ -body.mobile-mode.iphone-device .card-details .card-details-item-title { - font-size: 1.1em !important; - font-weight: bold; -} - /* Ensure scrollbars are positioned correctly */ #content[style*="overflow-x: auto"]::-webkit-scrollbar:vertical { width: 12px; @@ -287,106 +263,63 @@ body.mobile-mode.iphone-device .card-details .card-details-item-title { animation: fadeIn 0.2s; z-index: 16; } - -/* Fix for mobile Safari: ensure overlay stays behind card details */ -@media screen and (max-width: 800px) { - .board-wrapper .board-canvas .board-overlay { - z-index: 17 !important; - } - - /* In desktop mode on small screens, still keep overlay behind card */ - body.desktop-mode .board-wrapper .board-canvas .board-overlay { - z-index: 17 !important; - } -} - -/* In mobile mode, lower the overlay z-index to stay behind card details */ -body.mobile-mode .board-wrapper .board-canvas .board-overlay { - z-index: 17 !important; -} - -/* iPhone in desktop mode: remove overlay to avoid blocking card */ -body.desktop-mode.iphone-device .board-wrapper .board-canvas .board-overlay { - display: none !important; - pointer-events: none !important; -} - -/* Desktop mode: hide overlay to allow multiple cards and board interaction */ -body.desktop-mode .board-wrapper .board-canvas .board-overlay { - display: none !important; - pointer-events: none !important; -} .board-wrapper .board-canvas.is-dragging-active .open-minicard-composer, .board-wrapper .board-canvas.is-dragging-active .minicard-wrapper.is-checked { display: none; } /* Mobile view styles - applied when isMiniScreen is true (iPhone, etc.) */ .board-wrapper.mobile-view { - width: 100vw !important; - max-width: 100vw !important; - min-width: 100vw !important; + width: 100% !important; + min-width: 100% !important; left: 0 !important; right: 0 !important; - overflow-x: hidden !important; - overflow-y: auto !important; } .board-wrapper.mobile-view .board-canvas { - width: 100vw !important; - max-width: 100vw !important; - min-width: 100vw !important; + width: 100% !important; + min-width: 100% !important; left: 0 !important; right: 0 !important; - overflow-x: hidden !important; - overflow-y: auto !important; } .board-wrapper.mobile-view .board-canvas.mobile-view .swimlane { border-bottom: 1px solid #ccc; - display: block !important; + display: flex; flex-direction: column; margin: 0; padding: 0; - overflow-x: hidden !important; + overflow-x: hidden; overflow-y: auto; - width: 100vw !important; - max-width: 100vw !important; - min-width: 100vw !important; + width: 100%; + min-width: 100%; } @media screen and (max-width: 800px), screen and (max-device-width: 932px) and (-webkit-min-device-pixel-ratio: 3) { .board-wrapper { - width: 100vw !important; - max-width: 100vw !important; - min-width: 100vw !important; + width: 100% !important; + min-width: 100% !important; left: 0 !important; right: 0 !important; - overflow-x: hidden !important; - overflow-y: auto !important; } .board-wrapper .board-canvas { - width: 100vw !important; - max-width: 100vw !important; - min-width: 100vw !important; + width: 100% !important; + min-width: 100% !important; left: 0 !important; right: 0 !important; - overflow-x: hidden !important; - overflow-y: auto !important; } .board-wrapper .board-canvas .swimlane { border-bottom: 1px solid #ccc; - display: block !important; + display: flex; flex-direction: column; margin: 0; padding: 0; - overflow-x: hidden !important; + overflow-x: hidden; overflow-y: auto; - width: 100vw !important; - max-width: 100vw !important; - min-width: 100vw !important; + width: 100%; + min-width: 100%; } } .calendar-event-green { diff --git a/client/components/boards/boardBody.jade b/client/components/boards/boardBody.jade index 4af638f08..d2118112b 100644 --- a/client/components/boards/boardBody.jade +++ b/client/components/boards/boardBody.jade @@ -1,6 +1,8 @@ template(name="board") - if isConverting.get + if isMigrating.get + +migrationProgress + else if isConverting.get +boardConversionProgress else if isBoardReady.get if currentBoard @@ -22,7 +24,7 @@ template(name="boardBody") // Debug information (remove in production) if debugBoardState .debug-info(style="position: fixed; top: 0; left: 0; background: rgba(0,0,0,0.8); color: white; padding: 10px; z-index: 9999; font-size: 12px;") - | {{_ 'board'}}: {{currentBoard.title}} | {{_ 'view'}}: {{boardView}} | {{_ 'has-swimlanes'}}: {{hasSwimlanes}} | {{_ 'swimlanes'}}: {{currentBoard.swimlanes.length}} + | Board: {{currentBoard.title}} | View: {{boardView}} | HasSwimlanes: {{hasSwimlanes}} | Swimlanes: {{currentBoard.swimlanes.length}} .board-wrapper(class=currentBoard.colorClass class="{{#if isMiniScreen}}mobile-view{{/if}}") .board-canvas.js-swimlanes( class="{{#if hasSwimlanes}}dragscroll{{/if}}" @@ -47,8 +49,6 @@ template(name="boardBody") +listsGroup(currentBoard) else if isViewCalendar +calendarView - else if isViewGantt - +ganttView else // Default view - show swimlanes if they exist, otherwise show lists if hasSwimlanes @@ -56,10 +56,6 @@ template(name="boardBody") +swimlane(this) else +listsGroup(currentBoard) - //- Render multiple open cards in desktop mode - unless isMiniScreen - each openCards - +cardDetails(this cardIndex=@index) +sidebar template(name="calendarView") @@ -67,4 +63,4 @@ template(name="calendarView") .calendar-view.swimlane if currentCard +cardDetails(currentCard) - +fullcalendar(calendarOptions) \ No newline at end of file + +fullcalendar(calendarOptions) diff --git a/client/components/boards/boardBody.js b/client/components/boards/boardBody.js index 74c1f25a9..d4afe0bb2 100644 --- a/client/components/boards/boardBody.js +++ b/client/components/boards/boardBody.js @@ -1,9 +1,9 @@ import { ReactiveCache } from '/imports/reactiveCache'; -import '../gantt/gantt.js'; import { TAPi18n } from '/imports/i18n'; import dragscroll from '@wekanteam/dragscroll'; import { boardConverter } from '/client/lib/boardConverter'; -import { formatDateByUserPreference } from '/imports/lib/dateUtils'; +import { migrationManager } from '/client/lib/migrationManager'; +import { attachmentMigrationManager } from '/client/lib/attachmentMigrationManager'; import Swimlanes from '/models/swimlanes'; import Lists from '/models/lists'; @@ -15,9 +15,8 @@ BlazeComponent.extendComponent({ onCreated() { this.isBoardReady = new ReactiveVar(false); this.isConverting = new ReactiveVar(false); + this.isMigrating = new ReactiveVar(false); this._swimlaneCreated = new Set(); // Track boards where we've created swimlanes - this._boardProcessed = false; // Track if board has been processed - this._lastProcessedBoardId = null; // Track last processed board ID // The pattern we use to manually handle data loading is described here: // https://kadira.io/academy/meteor-routing-guide/content/subscriptions-and-data-management/using-subs-manager @@ -29,32 +28,21 @@ BlazeComponent.extendComponent({ const handle = subManager.subscribe('board', currentBoardId, false); - // Use a separate autorun for subscription ready state to avoid reactive loops - this.subscriptionReadyAutorun = Tracker.autorun(() => { - if (handle.ready()) { - if (!this._boardProcessed || this._lastProcessedBoardId !== currentBoardId) { - this._boardProcessed = true; - this._lastProcessedBoardId = currentBoardId; - + Tracker.nonreactive(() => { + Tracker.autorun(() => { + if (handle.ready()) { // Ensure default swimlane exists (only once per board) this.ensureDefaultSwimlane(currentBoardId); // Check if board needs conversion this.checkAndConvertBoard(currentBoardId); + } else { + this.isBoardReady.set(false); } - } else { - this.isBoardReady.set(false); - } + }); }); }); }, - onDestroyed() { - // Clean up the subscription ready autorun to prevent memory leaks - if (this.subscriptionReadyAutorun) { - this.subscriptionReadyAutorun.stop(); - } - }, - ensureDefaultSwimlane(boardId) { // Only create swimlane once per board if (this._swimlaneCreated.has(boardId)) { @@ -96,31 +84,334 @@ BlazeComponent.extendComponent({ return; } - this.isBoardReady.set(true); + // Check if board needs migration based on migration version + const needsMigration = !board.migrationVersion || board.migrationVersion < 1; + + if (needsMigration) { + // Start background migration for old boards + this.isMigrating.set(true); + await this.startBackgroundMigration(boardId); + this.isMigrating.set(false); + } + // Check if board needs conversion (for old structure) + if (boardConverter.isBoardConverted(boardId)) { + if (process.env.DEBUG === 'true') { + console.log(`Board ${boardId} has already been converted, skipping conversion`); + } + this.isBoardReady.set(true); + } else { + const needsConversion = boardConverter.needsConversion(boardId); + + if (needsConversion) { + this.isConverting.set(true); + const success = await boardConverter.convertBoard(boardId); + this.isConverting.set(false); + + if (success) { + this.isBoardReady.set(true); + } else { + console.error('Board conversion failed, setting ready to true anyway'); + this.isBoardReady.set(true); // Still show board even if conversion failed + } + } else { + this.isBoardReady.set(true); + } + } + + // Convert shared lists to per-swimlane lists if needed + await this.convertSharedListsToPerSwimlane(boardId); + + // Fix missing lists migration (for cards with wrong listId references) + await this.fixMissingLists(boardId); + + // Fix duplicate lists created by WeKan 8.10 + await this.fixDuplicateLists(boardId); + + // Start attachment migration in background if needed + this.startAttachmentMigrationIfNeeded(boardId); } catch (error) { console.error('Error during board conversion check:', error); this.isConverting.set(false); + this.isMigrating.set(false); this.isBoardReady.set(true); // Show board even if conversion check failed } }, + async startBackgroundMigration(boardId) { + try { + // Start background migration using the cron system + Meteor.call('boardMigration.startBoardMigration', boardId, (error, result) => { + if (error) { + console.error('Failed to start background migration:', error); + } else { + if (process.env.DEBUG === 'true') { + console.log('Background migration started for board:', boardId); + } + } + }); + } catch (error) { + console.error('Error starting background migration:', error); + } + }, + + async convertSharedListsToPerSwimlane(boardId) { + try { + const board = ReactiveCache.getBoard(boardId); + if (!board) return; + + // Check if board has already been processed for shared lists conversion + if (board.hasSharedListsConverted) { + if (process.env.DEBUG === 'true') { + console.log(`Board ${boardId} has already been processed for shared lists conversion`); + } + return; + } + + // Get all lists for this board + const allLists = board.lists(); + const swimlanes = board.swimlanes(); + + if (swimlanes.length === 0) { + if (process.env.DEBUG === 'true') { + console.log(`Board ${boardId} has no swimlanes, skipping shared lists conversion`); + } + return; + } + + // Find shared lists (lists with empty swimlaneId or null swimlaneId) + const sharedLists = allLists.filter(list => !list.swimlaneId || list.swimlaneId === ''); + + if (sharedLists.length === 0) { + if (process.env.DEBUG === 'true') { + console.log(`Board ${boardId} has no shared lists to convert`); + } + // Mark as processed even if no shared lists + Meteor.call('boards.update', boardId, { $set: { hasSharedListsConverted: true } }); + return; + } + + if (process.env.DEBUG === 'true') { + console.log(`Converting ${sharedLists.length} shared lists to per-swimlane lists for board ${boardId}`); + } + + // Convert each shared list to per-swimlane lists + for (const sharedList of sharedLists) { + // Create a copy of the list for each swimlane + for (const swimlane of swimlanes) { + // Check if this list already exists in this swimlane + const existingList = Lists.findOne({ + boardId: boardId, + swimlaneId: swimlane._id, + title: sharedList.title + }); + + if (!existingList) { + // Double-check to avoid race conditions + const doubleCheckList = ReactiveCache.getList({ + boardId: boardId, + swimlaneId: swimlane._id, + title: sharedList.title + }); + + if (!doubleCheckList) { + // Create a new list in this swimlane + const newListData = { + title: sharedList.title, + boardId: boardId, + swimlaneId: swimlane._id, + sort: sharedList.sort || 0, + archived: sharedList.archived || false, // Preserve archived state from original list + createdAt: new Date(), + modifiedAt: new Date() + }; + + // Copy other properties if they exist + if (sharedList.color) newListData.color = sharedList.color; + if (sharedList.wipLimit) newListData.wipLimit = sharedList.wipLimit; + if (sharedList.wipLimitEnabled) newListData.wipLimitEnabled = sharedList.wipLimitEnabled; + if (sharedList.wipLimitSoft) newListData.wipLimitSoft = sharedList.wipLimitSoft; + + Lists.insert(newListData); + + if (process.env.DEBUG === 'true') { + const archivedStatus = sharedList.archived ? ' (archived)' : ' (active)'; + console.log(`Created list "${sharedList.title}"${archivedStatus} for swimlane ${swimlane.title || swimlane._id}`); + } + } else { + if (process.env.DEBUG === 'true') { + console.log(`List "${sharedList.title}" already exists in swimlane ${swimlane.title || swimlane._id} (double-check), skipping`); + } + } + } else { + if (process.env.DEBUG === 'true') { + console.log(`List "${sharedList.title}" already exists in swimlane ${swimlane.title || swimlane._id}, skipping`); + } + } + } + + // Remove the original shared list completely + Lists.remove(sharedList._id); + + if (process.env.DEBUG === 'true') { + console.log(`Removed shared list "${sharedList.title}"`); + } + } + + // Mark board as processed + Meteor.call('boards.update', boardId, { $set: { hasSharedListsConverted: true } }); + + if (process.env.DEBUG === 'true') { + console.log(`Successfully converted ${sharedLists.length} shared lists to per-swimlane lists for board ${boardId}`); + } + + } catch (error) { + console.error('Error converting shared lists to per-swimlane:', error); + } + }, + + async fixMissingLists(boardId) { + try { + const board = ReactiveCache.getBoard(boardId); + if (!board) return; + + // Check if board has already been processed for missing lists fix + if (board.fixMissingListsCompleted) { + if (process.env.DEBUG === 'true') { + console.log(`Board ${boardId} has already been processed for missing lists fix`); + } + return; + } + + // Check if migration is needed + const needsMigration = await new Promise((resolve, reject) => { + Meteor.call('fixMissingListsMigration.needsMigration', boardId, (error, result) => { + if (error) { + reject(error); + } else { + resolve(result); + } + }); + }); + + if (!needsMigration) { + if (process.env.DEBUG === 'true') { + console.log(`Board ${boardId} does not need missing lists fix`); + } + return; + } + + if (process.env.DEBUG === 'true') { + console.log(`Starting fix missing lists migration for board ${boardId}`); + } + + // Execute the migration + const result = await new Promise((resolve, reject) => { + Meteor.call('fixMissingListsMigration.execute', boardId, (error, result) => { + if (error) { + reject(error); + } else { + resolve(result); + } + }); + }); + + if (result && result.success) { + if (process.env.DEBUG === 'true') { + console.log(`Successfully fixed missing lists for board ${boardId}: created ${result.createdLists} lists, updated ${result.updatedCards} cards`); + } + } + + } catch (error) { + console.error('Error fixing missing lists:', error); + } + }, + + async fixDuplicateLists(boardId) { + try { + const board = ReactiveCache.getBoard(boardId); + if (!board) return; + + // Check if board has already been processed for duplicate lists fix + if (board.fixDuplicateListsCompleted) { + if (process.env.DEBUG === 'true') { + console.log(`Board ${boardId} has already been processed for duplicate lists fix`); + } + return; + } + + if (process.env.DEBUG === 'true') { + console.log(`Starting duplicate lists fix for board ${boardId}`); + } + + // Execute the duplicate lists fix + const result = await new Promise((resolve, reject) => { + Meteor.call('fixDuplicateLists.fixBoard', boardId, (error, result) => { + if (error) { + reject(error); + } else { + resolve(result); + } + }); + }); + + if (result && result.fixed > 0) { + if (process.env.DEBUG === 'true') { + console.log(`Successfully fixed ${result.fixed} duplicate lists for board ${boardId}: ${result.fixedSwimlanes} swimlanes, ${result.fixedLists} lists`); + } + + // Mark board as processed + Meteor.call('boards.update', boardId, { $set: { fixDuplicateListsCompleted: true } }); + } else if (process.env.DEBUG === 'true') { + console.log(`No duplicate lists found for board ${boardId}`); + // Still mark as processed to avoid repeated checks + Meteor.call('boards.update', boardId, { $set: { fixDuplicateListsCompleted: true } }); + } else { + // Still mark as processed to avoid repeated checks + Meteor.call('boards.update', boardId, { $set: { fixDuplicateListsCompleted: true } }); + } + + } catch (error) { + console.error('Error fixing duplicate lists:', error); + } + }, + + async startAttachmentMigrationIfNeeded(boardId) { + try { + // Check if board has already been migrated + if (attachmentMigrationManager.isBoardMigrated(boardId)) { + if (process.env.DEBUG === 'true') { + console.log(`Board ${boardId} has already been migrated, skipping`); + } + return; + } + + // Check if there are unconverted attachments + const unconvertedAttachments = attachmentMigrationManager.getUnconvertedAttachments(boardId); + + if (unconvertedAttachments.length > 0) { + if (process.env.DEBUG === 'true') { + console.log(`Starting attachment migration for ${unconvertedAttachments.length} attachments in board ${boardId}`); + } + await attachmentMigrationManager.startAttachmentMigration(boardId); + } else { + // No attachments to migrate, mark board as migrated + // This will be handled by the migration manager itself + if (process.env.DEBUG === 'true') { + console.log(`Board ${boardId} has no attachments to migrate`); + } + } + } catch (error) { + console.error('Error starting attachment migration:', error); + } + }, + onlyShowCurrentCard() { const isMiniScreen = Utils.isMiniScreen(); const currentCardId = Utils.getCurrentCardId(true); return isMiniScreen && currentCardId; }, - openCards() { - // In desktop mode, return array of all open cards - const isMobile = Utils.getMobileMode(); - if (!isMobile) { - const openCardIds = Session.get('openCards') || []; - return openCardIds.map(id => ReactiveCache.getCard(id)).filter(card => card); - } - return []; - }, - goHome() { FlowRouter.go('home'); }, @@ -129,6 +420,10 @@ BlazeComponent.extendComponent({ return this.isConverting.get(); }, + isMigrating() { + return this.isMigrating.get(); + }, + isBoardReady() { return this.isBoardReady.get(); }, @@ -146,50 +441,39 @@ BlazeComponent.extendComponent({ this._isDragging = false; // Used to set the overlay this.mouseHasEnterCardDetails = false; - this._sortFieldsFixed = new Set(); // Track which boards have had sort fields fixed // fix swimlanes sort field if there are null values const currentBoardData = Utils.getCurrentBoard(); if (currentBoardData && Swimlanes) { - const boardId = currentBoardData._id; - // Only fix sort fields once per board to prevent reactive loops - if (!this._sortFieldsFixed.has(`swimlanes-${boardId}`)) { - const nullSortSwimlanes = currentBoardData.nullSortSwimlanes(); - if (nullSortSwimlanes.length > 0) { - const swimlanes = currentBoardData.swimlanes(); - let count = 0; - swimlanes.forEach(s => { - Swimlanes.update(s._id, { - $set: { - sort: count, - }, - }); - count += 1; + const nullSortSwimlanes = currentBoardData.nullSortSwimlanes(); + if (nullSortSwimlanes.length > 0) { + const swimlanes = currentBoardData.swimlanes(); + let count = 0; + swimlanes.forEach(s => { + Swimlanes.update(s._id, { + $set: { + sort: count, + }, }); - } - this._sortFieldsFixed.add(`swimlanes-${boardId}`); + count += 1; + }); } } // fix lists sort field if there are null values if (currentBoardData && Lists) { - const boardId = currentBoardData._id; - // Only fix sort fields once per board to prevent reactive loops - if (!this._sortFieldsFixed.has(`lists-${boardId}`)) { - const nullSortLists = currentBoardData.nullSortLists(); - if (nullSortLists.length > 0) { - const lists = currentBoardData.lists(); - let count = 0; - lists.forEach(l => { - Lists.update(l._id, { - $set: { - sort: count, - }, - }); - count += 1; + const nullSortLists = currentBoardData.nullSortLists(); + if (nullSortLists.length > 0) { + const lists = currentBoardData.lists(); + let count = 0; + lists.forEach(l => { + Lists.update(l._id, { + $set: { + sort: count, + }, }); - } - this._sortFieldsFixed.add(`lists-${boardId}`); + count += 1; + }); } } }, @@ -580,19 +864,6 @@ BlazeComponent.extendComponent({ return boardView === 'board-view-cal'; }, - isViewGantt() { - const currentUser = ReactiveCache.getCurrentUser(); - let boardView; - - if (currentUser) { - boardView = (currentUser.profile || {}).boardView; - } else { - boardView = window.localStorage.getItem('boardView'); - } - - return boardView === 'board-view-gantt'; - }, - hasSwimlanes() { const currentBoard = Utils.getCurrentBoard(); if (!currentBoard) { @@ -636,6 +907,7 @@ BlazeComponent.extendComponent({ const currentBoardId = Session.get('currentBoard'); const isBoardReady = this.isBoardReady.get(); const isConverting = this.isConverting.get(); + const isMigrating = this.isMigrating.get(); const boardView = Utils.boardView(); if (process.env.DEBUG === 'true') { @@ -644,6 +916,7 @@ BlazeComponent.extendComponent({ console.log('currentBoard:', !!currentBoard, currentBoard ? currentBoard.title : 'none'); console.log('isBoardReady:', isBoardReady); console.log('isConverting:', isConverting); + console.log('isMigrating:', isMigrating); console.log('boardView:', boardView); console.log('========================'); } @@ -654,6 +927,7 @@ BlazeComponent.extendComponent({ currentBoardTitle: currentBoard ? currentBoard.title : 'none', isBoardReady, isConverting, + isMigrating, boardView }; }, @@ -1020,8 +1294,3 @@ BlazeComponent.extendComponent({ } }, }).register('calendarView'); -/** - * Gantt View Component - * Displays cards as a Gantt chart with start/due dates - */ - diff --git a/client/components/boards/boardHeader.css b/client/components/boards/boardHeader.css index faf20e2f5..f3cb652e7 100644 --- a/client/components/boards/boardHeader.css +++ b/client/components/boards/boardHeader.css @@ -505,73 +505,73 @@ flex-wrap: nowrap !important; align-items: stretch !important; justify-content: flex-start !important; - width: 100vw !important; - max-width: 100vw !important; - min-width: 100vw !important; + width: 100% !important; + max-width: 100% !important; + min-width: 100% !important; overflow-x: hidden !important; overflow-y: auto !important; } - .mobile-mode .swimlane { - display: block !important; - width: 100vw !important; - max-width: 100vw !important; - min-width: 100vw !important; - margin: 0 0 2rem 0 !important; - padding: 0 !important; - float: none !important; - clear: both !important; - } +.mobile-mode .swimlane { + display: block !important; + width: 100% !important; + max-width: 100% !important; + min-width: 100% !important; + margin: 0 0 2rem 0 !important; + padding: 0 !important; + float: none !important; + clear: both !important; +} - .mobile-mode .swimlane .swimlane-header { - display: block !important; - width: 100vw !important; - max-width: 100vw !important; - min-width: 100vw !important; - margin: 0 0 1rem 0 !important; - padding: 1rem !important; - font-size: clamp(18px, 2.5vw, 32px) !important; - font-weight: bold !important; - border-bottom: 2px solid #ccc !important; - } +.mobile-mode .swimlane .swimlane-header { + display: block !important; + width: 100% !important; + max-width: 100% !important; + min-width: 100% !important; + margin: 0 0 1rem 0 !important; + padding: 1rem !important; + font-size: clamp(18px, 2.5vw, 32px) !important; + font-weight: bold !important; + border-bottom: 2px solid #ccc !important; +} - .mobile-mode .swimlane .lists { - display: block !important; - width: 100vw !important; - max-width: 100vw !important; - min-width: 100vw !important; - margin: 0 !important; - padding: 0 !important; - flex-direction: column !important; - flex-wrap: nowrap !important; - align-items: stretch !important; - justify-content: flex-start !important; - } +.mobile-mode .swimlane .lists { + display: block !important; + width: 100% !important; + max-width: 100% !important; + min-width: 100% !important; + margin: 0 !important; + padding: 0 !important; + flex-direction: column !important; + flex-wrap: nowrap !important; + align-items: stretch !important; + justify-content: flex-start !important; +} - .mobile-mode .list { - display: block !important; - width: 100vw !important; - max-width: 100vw !important; - min-width: 100vw !important; - margin: 0 0 2rem 0 !important; - padding: 0 !important; - float: none !important; - clear: both !important; - border-left: none !important; - border-right: none !important; - border-top: none !important; - border-bottom: 2px solid #ccc !important; - flex: none !important; - flex-basis: auto !important; - flex-grow: 0 !important; - flex-shrink: 0 !important; - position: static !important; - left: auto !important; - right: auto !important; - top: auto !important; - bottom: auto !important; - transform: none !important; - } +.mobile-mode .list { + display: block !important; + width: 100% !important; + max-width: 100% !important; + min-width: 100% !important; + margin: 0 0 2rem 0 !important; + padding: 0 !important; + float: none !important; + clear: both !important; + border-left: none !important; + border-right: none !important; + border-top: none !important; + border-bottom: 2px solid #ccc !important; + flex: none !important; + flex-basis: auto !important; + flex-grow: 0 !important; + flex-shrink: 0 !important; + position: static !important; + left: auto !important; + right: auto !important; + top: auto !important; + bottom: auto !important; + transform: none !important; +} .mobile-mode .list:first-child { margin-left: 0 !important; @@ -667,9 +667,9 @@ flex-wrap: nowrap !important; align-items: stretch !important; justify-content: flex-start !important; - width: 100vw !important; - max-width: 100vw !important; - min-width: 100vw !important; + width: 100% !important; + max-width: 100% !important; + min-width: 100% !important; overflow-x: hidden !important; overflow-y: auto !important; } diff --git a/client/components/boards/boardHeader.jade b/client/components/boards/boardHeader.jade index a5c61e12e..013cb3619 100644 --- a/client/components/boards/boardHeader.jade +++ b/client/components/boards/boardHeader.jade @@ -16,6 +16,13 @@ template(name="boardHeaderBar") a.board-header-btn(class="{{#if currentUser.isBoardAdmin}}js-edit-board-title{{else}}is-disabled{{/if}}" title="{{_ 'edit'}}" value=title) | ✏️ + a.board-header-btn.js-star-board(class="{{#if isStarred}}is-active{{/if}}" + title="{{#if isStarred}}{{_ 'star-board-short-unstar'}}{{else}}{{_ 'star-board-short-star'}}{{/if}}" aria-label="{{#if isStarred}}{{_ 'star-board-short-unstar'}}{{else}}{{_ 'star-board-short-star'}}{{/if}}") + | {{#if isStarred}}⭐{{else}}☆{{/if}} + if showStarCounter + span + = currentBoard.stars + a.board-header-btn( class="{{#if currentUser.isBoardAdmin}}js-change-visibility{{else}}is-disabled{{/if}}" title="{{_ currentBoard.permission}}") @@ -31,13 +38,6 @@ template(name="boardHeaderBar") if $eq watchLevel "muted" | 🔕 span {{_ watchLevel}} - a.board-header-btn.js-star-board(title="{{_ 'star-board'}}") - if isStarred - | ⭐ - else - | ☆ - if showStarCounter - span.board-star-counter {{currentBoard.stars}} a.board-header-btn(title="{{_ 'sort-cards'}}" class="{{#if isSortActive }}emphasis{{else}} js-sort-cards {{/if}}") | {{sortCardsIcon}} span {{#if isSortActive }}{{_ 'sort-is-on'}}{{else}}{{_ 'sort-cards'}}{{/if}} @@ -61,6 +61,10 @@ template(name="boardHeaderBar") a.board-header-btn(class="{{#if currentUser.isBoardAdmin}}js-edit-board-title{{else}}is-disabled{{/if}}" title="{{_ 'edit'}}" value=title) | ✏️ + a.board-header-btn.js-star-board(class="{{#if isStarred}}is-active{{/if}}" + title="{{#if isStarred}}{{_ 'click-to-unstar'}}{{else}}{{_ 'click-to-star'}}{{/if}} {{_ 'starred-boards-description'}}") + | {{#if isStarred}}⭐{{else}}☆{{/if}} + a.board-header-btn( class="{{#if currentUser.isBoardAdmin}}js-change-visibility{{else}}is-disabled{{/if}}" title="{{_ currentBoard.permission}}") @@ -74,11 +78,6 @@ template(name="boardHeaderBar") | 🔔 if $eq watchLevel "muted" | 🔕 - a.board-header-btn.js-star-board(title="{{_ 'star-board'}}") - if isStarred - | ⭐ - else - | ☆ a.board-header-btn(title="{{_ 'sort-cards'}}" class="{{#if isSortActive }}emphasis{{else}} js-sort-cards {{/if}}") | {{sortCardsIcon}} if isSortActive @@ -109,7 +108,7 @@ template(name="boardHeaderBar") | ❌ a.board-header-btn.js-open-search-view(title="{{_ 'search'}}") - span.emoji-icon 🔍 + | 🔍 unless currentBoard.isTemplatesBoard a.board-header-btn.js-toggle-board-view( @@ -121,8 +120,6 @@ template(name="boardHeaderBar") | 📋 if $eq boardView 'board-view-cal' | 📅 - if $eq boardView 'board-view-gantt' - | 📊 if canModifyBoard a.board-header-btn.js-multiselection-activate( @@ -210,13 +207,6 @@ template(name="boardChangeViewPopup") | {{_ 'board-view-cal'}} if $eq Utils.boardView "board-view-cal" | ✅ - li - with "board-view-gantt" - a.js-open-gantt-view - | 📊 - | {{_ 'board-view-gantt'}} - if $eq Utils.boardView "board-view-gantt" - | ✅ template(name="createBoard") form @@ -276,36 +266,6 @@ template(name="createBoardPopup") | / a.js-board-template {{_ 'template'}} -// New popup for Template Container creation; shares the same form content -template(name="createTemplateContainerPopup") - form - label - | {{_ 'title'}} - input.js-new-board-title(type="text" placeholder="{{_ 'bucket-example'}}" autofocus required) - if visibilityMenuIsOpen.get - +boardVisibilityList - else - p.quiet - if $eq visibility.get 'public' - span 🌐 - = " " - | {{{_ 'board-public-info'}}} - else - span 🔒 - = " " - | {{{_ 'board-private-info'}}} - a.js-change-visibility {{_ 'change'}}. - a.flex.js-toggle-add-template-container - .materialCheckBox#add-template-container - span {{_ 'add-template-container'}} - input.primary.wide(type="submit" value="{{_ 'create'}}") - span.quiet - | {{_ 'or'}} - a.js-import-board {{_ 'import'}} - span.quiet - | / - a.js-board-template {{_ 'template'}} - //template(name="listsortPopup") // h2 // | {{_ 'list-sort-by'}} diff --git a/client/components/boards/boardHeader.js b/client/components/boards/boardHeader.js index 292a6b042..b95a45395 100644 --- a/client/components/boards/boardHeader.js +++ b/client/components/boards/boardHeader.js @@ -72,10 +72,7 @@ BlazeComponent.extendComponent({ { 'click .js-edit-board-title': Popup.open('boardChangeTitle'), 'click .js-star-board'() { - const boardId = Session.get('currentBoard'); - if (boardId) { - Meteor.call('toggleBoardStar', boardId); - } + ReactiveCache.getCurrentUser().toggleBoardStar(Session.get('currentBoard')); }, 'click .js-open-board-menu': Popup.open('boardMenu'), 'click .js-change-visibility': Popup.open('boardChangeVisibility'), @@ -208,10 +205,6 @@ Template.boardChangeViewPopup.events({ Utils.setBoardView('board-view-cal'); Popup.back(); }, - 'click .js-open-gantt-view'() { - Utils.setBoardView('board-view-gantt'); - Popup.back(); - }, }); const CreateBoard = BlazeComponent.extendComponent({ @@ -298,15 +291,6 @@ const CreateBoard = BlazeComponent.extendComponent({ }, ); - // Assign to space if one was selected - const spaceId = Session.get('createBoardInWorkspace'); - if (spaceId) { - Meteor.call('assignBoardToWorkspace', this.boardId.get(), spaceId, (err) => { - if (err) console.error('Error assigning board to space:', err); - }); - Session.set('createBoardInWorkspace', null); // Clear after use - } - Utils.goBoardId(this.boardId.get()); } else { @@ -325,15 +309,6 @@ const CreateBoard = BlazeComponent.extendComponent({ boardId: this.boardId.get(), }); - // Assign to space if one was selected - const spaceId = Session.get('createBoardInWorkspace'); - if (spaceId) { - Meteor.call('assignBoardToWorkspace', this.boardId.get(), spaceId, (err) => { - if (err) console.error('Error assigning board to space:', err); - }); - Session.set('createBoardInWorkspace', null); // Clear after use - } - Utils.goBoardId(this.boardId.get()); } }, @@ -355,13 +330,6 @@ const CreateBoard = BlazeComponent.extendComponent({ }, }).register('createBoardPopup'); -(class CreateTemplateContainerPopup extends CreateBoard { - onRendered() { - // Always pre-check the template container checkbox for this popup - $('#add-template-container').addClass('is-checked'); - } -}).register('createTemplateContainerPopup'); - (class HeaderBarCreateBoard extends CreateBoard { onSubmit(event) { super.onSubmit(event); diff --git a/client/components/boards/boardsList.css b/client/components/boards/boardsList.css index e0f716932..f834af830 100644 --- a/client/components/boards/boardsList.css +++ b/client/components/boards/boardsList.css @@ -8,273 +8,6 @@ padding: 1vh 0; } -/* Two-column layout for All Boards */ -.boards-layout { - display: grid; - grid-template-columns: 260px 1fr; - gap: 16px; -} - -.boards-left-menu { - border-right: 1px solid #e0e0e0; - padding-right: 12px; -} - -.boards-left-menu ul.menu { - list-style: none; - padding: 0; - margin: 0 0 12px 0; -} - -.boards-left-menu .menu-item { - margin: 4px 0; -} -.boards-left-menu .menu-item a { - display: flex; - justify-content: space-between; - align-items: center; - padding: 8px 10px; - border-radius: 4px; - cursor: pointer; -} -.boards-left-menu .menu-item .menu-label { - flex: 1; -} -.boards-left-menu .menu-item .menu-count { - background: #ddd; - padding: 2px 8px; - border-radius: 12px; - font-size: 12px; - font-weight: bold; - margin-left: 8px; -} -.boards-left-menu .menu-item.active a, -.boards-left-menu .menu-item a:hover { - background: #f0f0f0; -} -.boards-left-menu .menu-item.active .menu-count { - background: #bbb; -} - -/* Drag-over state for menu items (for dropping boards on Remaining) */ -.boards-left-menu .menu-item a.drag-over { - background: #d0e8ff; - border: 2px dashed #2196F3; -} - -.workspaces-header { - display: flex; - align-items: center; - justify-content: space-between; - font-weight: bold; - margin-top: 12px; -} -.workspaces-header .js-add-space { - text-decoration: none; - font-weight: bold; - border: 1px solid #ccc; - padding: 2px 8px; - border-radius: 4px; -} - -.workspace-tree { - list-style: none; - padding-left: 10px; -} - -.workspace-node { - margin: 2px 0; - position: relative; -} - -.workspace-node-content { - display: flex; - align-items: center; - gap: 4px; - padding: 4px; - border-radius: 4px; - transition: background-color 0.2s; -} - -.workspace-node.dragging > .workspace-node-content { - opacity: 0.5; - background: #e0e0e0; -} - -.workspace-node.drag-over > .workspace-node-content { - background: #d0e8ff; - border: 2px dashed #2196F3; -} - -.workspace-drag-handle { - cursor: grab; - color: #999; - font-size: 14px; - padding: 0 4px; - user-select: none; -} - -.workspace-drag-handle:active { - cursor: grabbing; -} - -.workspace-node .js-select-space { - display: flex; - align-items: center; - gap: 6px; - padding: 4px 8px; - border-radius: 4px; - cursor: pointer; - flex: 1; - text-decoration: none; -} - -.workspace-node .workspace-icon { - font-size: 16px; - line-height: 1; -} - -.workspace-node .workspace-name { - flex: 1; -} - -.workspace-node .workspace-count { - background: #ddd; - padding: 2px 6px; - border-radius: 10px; - font-size: 11px; - font-weight: bold; - min-width: 20px; - text-align: center; -} - -.workspace-node .js-edit-space, -.workspace-node .js-add-subspace { - padding: 2px 6px; - border-radius: 3px; - cursor: pointer; - text-decoration: none; - font-size: 14px; - opacity: 0.6; - transition: opacity 0.2s; -} - -.workspace-node .js-edit-space:hover, -.workspace-node .js-add-subspace:hover { - opacity: 1; - background: #e0e0e0; -} - -.workspace-node.active > .workspace-node-content .js-select-space, -.workspace-node > .workspace-node-content:hover .js-select-space { - background: #f0f0f0; -} - -.workspace-node.active .workspace-count { - background: #bbb; -} - -.boards-right-grid { - min-height: 200px; -} - -.boards-path-header { - display: flex; - align-items: center; - justify-content: space-between; - gap: 8px; - padding: 12px 16px; - margin-bottom: 16px; - background: #f5f5f5; - border-radius: 6px; - font-size: 16px; - font-weight: 500; -} - -.boards-path-header .path-left { - display: flex; - align-items: center; - gap: 8px; - flex: 1; -} - -.boards-path-header .multiselection-hint { - background: #FFF3CD; - color: #856404; - padding: 4px 12px; - border-radius: 4px; - font-size: 13px; - font-weight: normal; - border: 1px solid #FFE69C; - animation: pulse 2s ease-in-out infinite; -} - -@keyframes pulse { - 0%, 100% { opacity: 1; } - 50% { opacity: 0.7; } -} - -.boards-path-header .path-right { - display: flex; - align-items: center; - gap: 8px; -} - -.boards-path-header .path-icon { - font-size: 18px; -} - -.boards-path-header .path-text { - color: #333; -} - -.boards-path-header .board-header-btn { - padding: 6px 12px; - background: #fff; - border: 1px solid #ddd; - border-radius: 4px; - cursor: pointer; - display: flex; - align-items: center; - gap: 6px; - font-size: 14px; - transition: all 0.2s; -} - -.boards-path-header .board-header-btn:hover { - background: #f0f0f0; - border-color: #bbb; -} - -.boards-path-header .board-header-btn.emphasis { - background: #2196F3; - color: #fff; - border-color: #2196F3; - font-weight: bold; - box-shadow: 0 2px 8px rgba(33, 150, 243, 0.5); - transform: scale(1.05); -} - -.boards-path-header .board-header-btn.emphasis:hover { - background: #1976D2; - box-shadow: 0 3px 12px rgba(33, 150, 243, 0.7); -} - -.boards-path-header .board-header-btn-close { - padding: 4px 10px; - background: #f44336; - color: #000; - border: none; - border-radius: 4px; - cursor: pointer; - font-size: 16px; - margin-left: 10px; /* Extra space between MultiSelection toggle and Remove Filter */ -} - -.boards-path-header .board-header-btn-close:hover { - background: #d32f2f; -} - .zoom-controls { display: flex; align-items: center; @@ -373,35 +106,23 @@ .board-list li.starred .is-star-active, .board-list li.starred .is-not-star-active { opacity: 1; - color: #ffd700; -} -/* Show star icon on hover even for non-starred boards */ -.board-list li:hover .is-star-active, -.board-list li:hover .is-not-star-active { - opacity: 1; } .board-list .board-list-item { overflow: hidden; - background-color: inherit; /* Inherit board color from parent li.js-board */ + background-color: #999; color: #f6f6f6; min-height: 100px; font-size: 16px; line-height: 22px; - border-radius: 0; /* No border-radius - parent .js-board has it */ + border-radius: 3px; display: block; font-weight: 700; - padding: 36px 8px 32px 8px; /* Top padding for drag handle, bottom for checkbox */ - margin: 0; /* No margin - moved to parent .js-board */ + padding: 8px; + margin: 8px; position: relative; text-decoration: none; word-wrap: break-word; } - -.board-list .board-list-item > .js-open-board { - text-decoration: none; - color: inherit; - display: block; -} .board-list .board-list-item.template-container { border: 4px solid #fff; } @@ -429,20 +150,13 @@ .board-list .js-add-board .label { font-weight: normal; line-height: 56px; - min-height: 100px; - display: flex; - align-items: center; - justify-content: center; - background-color: #999; /* Darker background for better text contrast */ - border-radius: 3px; - padding: 36px 8px 32px 8px; } -.board-list .js-add-board .label:hover { - background-color: #808080; /* Even darker on hover */ +.board-list .js-add-board :hover { + background-color: #939393; } .board-list .is-star-active, .board-list .is-not-star-active { - top: 0; + bottom: 0; font-size: 14px; height: 18px; line-height: 18px; @@ -450,6 +164,7 @@ padding: 9px 9px; position: absolute; right: 0; + top: 0; transition-duration: 0.15s; transition-property: color, font-size, background; } @@ -523,107 +238,6 @@ .board-list li:hover a .is-not-star-active { opacity: 1; } - -/* Board drag handle - always visible and positioned at top */ -.board-list .board-handle { - position: absolute; - padding: 4px 6px; - top: 4px; - left: 50%; - transform: translateX(-50%); - font-size: 14px; - color: #fff; - background: rgba(0,0,0,0.4); - border-radius: 4px; - display: flex; - align-items: center; - justify-content: center; - z-index: 10; - transition: background-color 0.2s ease; - cursor: grab; - opacity: 1; - user-select: none; -} - -.board-list .board-handle:active { - cursor: grabbing; -} - -.board-list .board-handle:hover { - background: rgba(255, 255, 0, 0.8) !important; - color: #000; -} - -/* Multiselection checkbox on board items */ -.board-list .board-list-item .multi-selection-checkbox { - position: absolute !important; - bottom: 4px !important; - left: 4px !important; - top: auto !important; - width: 24px; - height: 24px; - border: 3px solid #fff; - background: rgba(0,0,0,0.5); - border-radius: 4px; - cursor: pointer; - z-index: 11; - display: flex; - align-items: center; - justify-content: center; - transition: all 0.2s; - box-shadow: 0 2px 4px rgba(0,0,0,0.3); - transform: none !important; - margin: 0 !important; -} - -.board-list .board-list-item .multi-selection-checkbox:hover { - background: rgba(0,0,0,0.7); - transform: scale(1.15) !important; - box-shadow: 0 3px 6px rgba(0,0,0,0.5); -} - -.board-list .board-list-item .multi-selection-checkbox.is-checked { - background: #3cb500; - border-color: #3cb500; - box-shadow: 0 2px 8px rgba(60, 181, 0, 0.6); - width: 24px !important; - height: 24px !important; - top: auto !important; - left: 4px !important; - transform: none !important; - border-radius: 4px !important; -} - -.board-list .board-list-item .multi-selection-checkbox.is-checked::after { - content: '✓'; - color: #fff; - font-size: 16px; - font-weight: bold; -} - -/* Grey checkboxes when grey icons setting is enabled */ -body.grey-icons-enabled .board-list .board-list-item .multi-selection-checkbox.is-checked { - background: #7a7a7a; - border-color: #7a7a7a; - box-shadow: 0 2px 8px rgba(122, 122, 122, 0.6); -} - -body.grey-icons-enabled .board-list.is-multiselection-active .js-board.is-checked { - outline: 4px solid #7a7a7a; - box-shadow: 0 4px 12px rgba(122, 122, 122, 0.4); -} - -.board-list.is-multiselection-active .js-board.is-checked { - outline: 4px solid #3cb500; - outline-offset: -4px; - box-shadow: 0 4px 12px rgba(60, 181, 0, 0.4); -} - -/* Visual hint when multiselection is active */ -.board-list.is-multiselection-active .board-list-item { - border: 2px dashed rgba(33, 150, 243, 0.3); -} - .board-backgrounds-list .board-background-select { box-sizing: border-box; display: block; @@ -657,19 +271,8 @@ body.grey-icons-enabled .board-list.is-multiselection-active .js-board.is-checke } .board-backgrounds-list .board-background-select .background-box i.fa-check { font-size: 25px; - color: #3cb500; + color: #fff; } -/* Grey check icons when grey icons setting is enabled */ -body.grey-icons-enabled .board-backgrounds-list .board-background-select .background-box i.fa-check { - color: #7a7a7a; -} - -/* Prevent Grey Icons from affecting checkmarks in background color list */ -body.grey-icons-enabled .checkmark-no-grey { - filter: none !important; - -webkit-filter: none !important; -} - /* Mobile view styles - applied when isMiniScreen is true (iPhone, etc.) */ .board-list.mobile-view { height: calc(100vh - 120px); @@ -1136,62 +739,9 @@ body.grey-icons-enabled .checkmark-no-grey { #resetBtn { display: inline; } - -#resetBtn.filter-reset-btn { - background: #f44336; - color: #000; - border: none; - border-radius: 4px; - padding: 6px 12px; - cursor: pointer; - font-size: 14px; - display: inline-flex; - align-items: center; - gap: 6px; - transition: background 0.2s; -} - -#resetBtn.filter-reset-btn:hover { - background: #d32f2f; -} - -#resetBtn.filter-reset-btn .reset-icon { - font-size: 14px; -} - .js-board { display: block; - background-color: #999; /* Default gray background if no color class is applied */ - border-radius: 3px; /* Rounded corners for board items */ - overflow: hidden; /* Ensure children respect rounded corners */ - margin: 8px; /* Space between board items */ } - -/* Reset background for add-board button */ -.js-add-board { - background-color: transparent !important; - margin: 8px !important; /* Keep margin for add-board */ -} - -/* Apply board colors to li.js-board parent instead of just the link */ -.board-list .board-color-nephritis { background-color: #27ae60; } -.board-list .board-color-pomegranate { background-color: #c0392b; } -.board-list .board-color-belize { background-color: #2980b9; } -.board-list .board-color-wisteria { background-color: #8e44ad; } -.board-list .board-color-midnight { background-color: #2c3e50; } -.board-list .board-color-pumpkin { background-color: #e67e22; } -.board-list .board-color-moderatepink { background-color: #cd5a91; } -.board-list .board-color-strongcyan { background-color: #00aecc; } -.board-list .board-color-limegreen { background-color: #4bbf6b; } -.board-list .board-color-dark { background-color: #2c3e51; } -.board-list .board-color-relax { background-color: #27ae61; } -.board-list .board-color-corteza { background-color: #568ba2; } -.board-list .board-color-clearblue { background-color: #3498db; } -.board-list .board-color-natural { background-color: #596557; } -.board-list .board-color-modern { background-color: #2a80b8; } -.board-list .board-color-moderndark { background-color: #2a2a2a; } -.board-list .board-color-exodark { background-color: #222; } - .minicard-members { padding: 6px 0 6px 8px; width: 100%; diff --git a/client/components/boards/boardsList.jade b/client/components/boards/boardsList.jade index 1003d183a..3d01c19c9 100644 --- a/client/components/boards/boardsList.jade +++ b/client/components/boards/boardsList.jade @@ -2,180 +2,151 @@ template(name="boardList") .wrapper .board-list-header - .boards-layout - // Left menu - .boards-left-menu - ul.menu - li(class="menu-item {{#if isSelectedMenu 'starred'}}active{{/if}}") - a.js-select-menu(data-type="starred") - span.menu-label - span.emoji-icon ⭐ - | {{_ 'allboards.starred'}} - span.menu-count {{menuItemCount 'starred'}} - li(class="menu-item {{#if isSelectedMenu 'templates'}}active{{/if}}") - a.js-select-menu(data-type="templates") - span.menu-label - span.emoji-icon 📋 - | {{_ 'allboards.templates'}} - span.menu-count {{menuItemCount 'templates'}} - li(class="menu-item {{#if isSelectedMenu 'remaining'}}active{{/if}}") - a.js-select-menu(data-type="remaining") - span.menu-label - span.emoji-icon 📂 - | {{_ 'allboards.remaining'}} - span.menu-count {{menuItemCount 'remaining'}} - .workspaces-header - span - span.emoji-icon 🗂️ - | {{_ 'allboards.workspaces'}} - a.js-add-workspace(title="{{_ 'allboards.add-workspace'}}") + - // Workspaces tree - +workspaceTree(nodes=workspacesTree selectedWorkspaceId=selectedWorkspaceId) + ul.AllBoardTeamsOrgs + li.AllBoardTeams + if userHasTeams + select.js-AllBoardTeams#jsAllBoardTeams("multiple") + option(value="-1") {{_ 'teams'}} : + each teamsDatas + option(value="{{teamId}}") {{_ teamDisplayName}} - // Existing filter by orgs/teams (kept) - ul.AllBoardTeamsOrgs - li.AllBoardTeams - if userHasTeams - select.js-AllBoardTeams#jsAllBoardTeams("multiple") - option(value="-1") {{_ 'teams'}} : - each teamsDatas - option(value="{{teamId}}") {{_ teamDisplayName}} + li.AllBoardOrgs + if userHasOrgs + select.js-AllBoardOrgs#jsAllBoardOrgs("multiple") + option(value="-1") {{_ 'organizations'}} : + each orgsDatas + option(value="{{orgId}}") {{orgDisplayName}} - li.AllBoardOrgs - if userHasOrgs - select.js-AllBoardOrgs#jsAllBoardOrgs("multiple") - option(value="-1") {{_ 'organizations'}} : - each orgsDatas - option(value="{{orgId}}") {{orgDisplayName}} + //li.AllBoardTemplates + // if userHasTemplates + // select.js-AllBoardTemplates#jsAllBoardTemplates("multiple") + // option(value="-1") {{_ 'templates'}} : + // each templatesDatas + // option(value="{{templateId}}") {{_ templateDisplayName}} - li.AllBoardBtns - div.AllBoardButtonsContainer - if userHasOrgsOrTeams - span.emoji-icon 🔍 - input#filterBtn(type="button" value="{{_ 'filter'}}") - button#resetBtn.filter-reset-btn - span.reset-icon - span.emoji-icon ❌ - span {{_ 'filter-clear'}} + li.AllBoardBtns + div.AllBoardButtonsContainer + if userHasOrgsOrTeams + i.fa.fa-filter + input#filterBtn(type="button" value="{{_ 'filter'}}") + input#resetBtn(type="button" value="{{_ 'filter-clear'}}") - // Right boards grid - .boards-right-grid - .boards-path-header - .path-left - span.path-icon.emoji-icon {{currentMenuPath.icon}} - span.path-text {{currentMenuPath.text}} - if BoardMultiSelection.isActive - span.multiselection-hint - span.emoji-icon 📌 - | {{_ 'multi-selection-active'}} - .path-right - if canModifyBoards - if hasBoardsSelected - button.js-archive-selected-boards.board-header-btn - span.emoji-icon 📦 - span {{_ 'archive-board'}} - button.js-duplicate-selected-boards.board-header-btn - span.emoji-icon 📋 - span {{_ 'duplicate-board'}} - a.board-header-btn.js-multiselection-activate( - title="{{#if BoardMultiSelection.isActive}}{{_ 'multi-selection-on'}}{{else}}{{_ 'multi-selection'}}{{/if}}" - class="{{#if BoardMultiSelection.isActive}}emphasis{{/if}}") - span.emoji-icon ☑️ - if BoardMultiSelection.isActive - a.board-header-btn-close.js-multiselection-reset(title="{{_ 'filter-clear'}}") - span.emoji-icon ✖ - ul.board-list.clearfix.js-boards(class="{{#if isMiniScreen}}mobile-view{{/if}} {{#if BoardMultiSelection.isActive}}is-multiselection-active{{/if}}") - li.js-add-board - if isSelectedMenu 'templates' - a.board-list-item.label(title="{{_ 'add-template-container'}}") - span.emoji-icon ➕ - | {{_ 'add-template-container'}} + ul.board-list.clearfix.js-boards(class="{{#if isMiniScreen}}mobile-view{{/if}}") + li.js-add-board + a.board-list-item.label(title="{{_ 'add-board'}}") + | {{_ 'add-board'}} + each boards + li(class="{{_id}}" class="{{#if isStarred}}starred{{/if}}" class=colorClass).js-board + if isInvited + .board-list-item + span.details + span.board-list-item-name= title + i.fa.js-star-board( + class="fa-star{{#if isStarred}} is-star-active{{else}}-o{{/if}}" + title="{{_ 'star-board-title'}}") + p.board-list-item-desc {{_ 'just-invited'}} + button.js-accept-invite.primary {{_ 'accept'}} + button.js-decline-invite {{_ 'decline'}} + else + if $eq type "template-container" + a.js-open-board.template-container.board-list-item(href="{{pathFor 'board' id=_id slug=slug}}") + span.details + span.board-list-item-name(title="{{_ 'template-container'}}") + +viewer + = title + i.fa.js-star-board( + class="fa-star{{#if isStarred}} is-star-active{{else}}-o{{/if}}" + title="{{_ 'star-board-title'}}") + p.board-list-item-desc + +viewer + = description + 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}}") + i.fa.board-handle( + class="fa-arrows" + title="{{_ 'drag-board'}}") + if isSandstorm + i.fa.js-clone-board( + class="fa-clone" + title="{{_ 'duplicate-board'}}") + i.fa.js-archive-board( + class="fa-archive" + title="{{_ 'archive-board'}}") + else if isAdministrable + i.fa.js-clone-board( + class="fa-clone" + title="{{_ 'duplicate-board'}}") + i.fa.js-archive-board( + class="fa-archive" + title="{{_ 'archive-board'}}") + else if currentUser.isAdmin + i.fa.js-clone-board( + class="fa-clone" + title="{{_ 'duplicate-board'}}") + i.fa.js-archive-board( + class="fa-archive" + title="{{_ 'archive-board'}}") else - a.board-list-item.label(title="{{_ 'add-board'}}") - span.emoji-icon ➕ - | {{_ 'add-board'}} - each boards - li.js-board(class="{{_id}} {{#if isStarred}}starred{{/if}} {{colorClass}} {{#if BoardMultiSelection.isSelected _id}}is-checked{{/if}}", draggable="true") - if isInvited - .board-list-item - if BoardMultiSelection.isActive - .materialCheckBox.multi-selection-checkbox.js-toggle-board-multi-selection( - class="{{#if BoardMultiSelection.isSelected _id}}is-checked{{/if}}") - span.details - span.board-list-item-name= title - span.js-star-board( - class="{{#if isStarred}}is-star-active{{else}}is-not-star-active{{/if}}" - title="{{_ 'star-board-title'}}") - span.emoji-icon - | {{#if isStarred}}⭐{{else}}☆{{/if}} - p.board-list-item-desc {{_ 'just-invited'}} - button.js-accept-invite.primary {{_ 'accept'}} - button.js-decline-invite {{_ 'decline'}} - else - if $eq type "template-container" - .template-container.board-list-item - if BoardMultiSelection.isActive - .materialCheckBox.multi-selection-checkbox.js-toggle-board-multi-selection( - class="{{#if BoardMultiSelection.isSelected _id}}is-checked{{/if}}") - span.board-handle(title="{{_ 'drag-board'}}") - span.emoji-icon ↕️ - - a.js-open-board(href="{{pathFor 'board' id=_id slug=slug}}") - span.details - span.board-list-item-name(title="{{_ 'template-container'}}") - +viewer - = title - p.board-list-item-desc - +viewer - = description - if hasSpentTimeCards - span.js-has-spenttime-cards( - class="{{#if hasOvertimeCards}}has-overtime-card-active{{else}}no-overtime-card-active{{/if}}" - title="{{#if hasOvertimeCards}}{{_ 'has-overtime-cards'}}{{else}}{{_ 'has-spenttime-cards'}}{{/if}}") - span.emoji-icon ⏱️ - span.js-star-board( - class="{{#if isStarred}}is-star-active{{else}}is-not-star-active{{/if}}" - title="{{_ 'star-board-title'}}") - span.emoji-icon - | {{#if isStarred}}⭐{{else}}☆{{/if}} - else - .board-list-item - if BoardMultiSelection.isActive - .materialCheckBox.multi-selection-checkbox.js-toggle-board-multi-selection( - class="{{#if BoardMultiSelection.isSelected _id}}is-checked{{/if}}") - span.board-handle(title="{{_ 'drag-board'}}") - span.emoji-icon ↕️ - - a.js-open-board(href="{{pathFor 'board' id=_id slug=slug}}") - span.details - span.board-list-item-name(title="{{_ 'board-drag-drop-reorder-or-click-open'}}") - +viewer - = title - unless currentSetting.hideBoardMemberList - if allowsBoardMemberList - .minicard-members - each member in boardMembers _id - a.name - +userAvatar(userId=member noRemove=true) - unless currentSetting.hideCardCounterList - if allowsCardCounterList - .minicard-lists.flex.flex-wrap - each list in boardLists _id - .item - | {{ list }} - p.board-list-item-desc - +viewer - = description - if hasSpentTimeCards - span.js-has-spenttime-cards( - class="{{#if hasOvertimeCards}}has-overtime-card-active{{else}}no-overtime-card-active{{/if}}" - title="{{#if hasOvertimeCards}}{{_ 'has-overtime-cards'}}{{else}}{{_ 'has-spenttime-cards'}}{{/if}}") - span.emoji-icon ⏱️ - a.js-star-board( - class="{{#if isStarred}}is-star-active{{else}}is-not-star-active{{/if}}" - title="{{_ 'star-board-title'}}") - span.emoji-icon - | {{#if isStarred}}⭐{{else}}☆{{/if}} + a.js-open-board.board-list-item(href="{{pathFor 'board' id=_id slug=slug}}") + span.details + span.board-list-item-name(title="{{_ 'board-drag-drop-reorder-or-click-open'}}") + +viewer + = title + unless currentSetting.hideBoardMemberList + if allowsBoardMemberList + .minicard-members + each member in boardMembers _id + a.name + +userAvatar(userId=member noRemove=true) + unless currentSetting.hideCardCounterList + if allowsCardCounterList + .minicard-lists.flex.flex-wrap + each list in boardLists _id + .item + | {{ list }} + a.js-star-board( + class="{{#if isStarred}}is-star-active{{else}}is-not-star-active{{/if}}" + title="{{_ 'star-board-title'}}") + | {{#if isStarred}}⭐{{else}}☆{{/if}} + p.board-list-item-desc + +viewer + = description + 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}}") + i.fa.board-handle( + class="fa-arrows" + title="{{_ 'drag-board'}}") + if isSandstorm + a.js-clone-board( + class="fa-clone" + title="{{_ 'duplicate-board'}}") + | 📋 + a.js-archive-board( + class="fa-archive" + title="{{_ 'archive-board'}}") + | 📦 + else if isAdministrable + a.js-clone-board( + class="fa-clone" + title="{{_ 'duplicate-board'}}") + | 📋 + a.js-archive-board( + class="fa-archive" + title="{{_ 'archive-board'}}") + | 📦 + else if currentUser.isAdmin + a.js-clone-board( + class="fa-clone" + title="{{_ 'duplicate-board'}}") + | 📋 + a.js-archive-board( + class="fa-archive" + title="{{_ 'archive-board'}}") + | 📦 template(name="boardListHeaderBar") h1 {{_ title }} @@ -186,28 +157,3 @@ template(name="boardListHeaderBar") // a.board-header-btn(href="{{pathFor 'board' id=templatesBoardId slug=templatesBoardSlug}}") // i.fa.fa-clone // span {{_ 'templates'}} - -// Recursive template for workspaces tree -template(name="workspaceTree") - if nodes - ul.workspace-tree.js-workspace-tree - each nodes - li.workspace-node(class="{{#if $eq id selectedWorkspaceId}}active{{/if}}" data-workspace-id="{{id}}" draggable="true") - .workspace-node-content - span.workspace-drag-handle - span.emoji-icon ↕️ - - a.js-select-workspace(data-id="{{id}}") - span.workspace-icon - if icon - +viewer - = icon - else - span.emoji-icon 📁 - span.workspace-name= name - a.js-edit-workspace(data-id="{{id}}" title="{{_ 'allboards.edit-workspace'}}") - span.emoji-icon ✏️ - span.workspace-count {{workspaceCount id}} - a.js-add-subworkspace(data-id="{{id}}" title="{{_ 'allboards.add-subworkspace'}}") + - if children - +workspaceTree(nodes=children selectedWorkspaceId=selectedWorkspaceId) diff --git a/client/components/boards/boardsList.js b/client/components/boards/boardsList.js index c3d973948..1d655fd11 100644 --- a/client/components/boards/boardsList.js +++ b/client/components/boards/boardsList.js @@ -14,9 +14,6 @@ Template.boardList.helpers({ return Utils.isMiniScreen() && Session.get('currentBoard'); */ return true; }, - BoardMultiSelection() { - return BoardMultiSelection; - }, }) Template.boardListHeaderBar.events({ @@ -48,9 +45,6 @@ BlazeComponent.extendComponent({ onCreated() { Meteor.subscribe('setting'); Meteor.subscribe('tableVisibilityModeSettings'); - this.selectedMenu = new ReactiveVar('starred'); - this.selectedWorkspaceIdVar = new ReactiveVar(null); - this.workspacesTreeVar = new ReactiveVar([]); let currUser = ReactiveCache.getCurrentUser(); let userLanguage; if (currUser && currUser.profile) { @@ -59,72 +53,9 @@ BlazeComponent.extendComponent({ if (userLanguage) { TAPi18n.setLanguage(userLanguage); } - // Load workspaces tree reactively - this.autorun(() => { - const u = ReactiveCache.getCurrentUser(); - const tree = (u && u.profile && u.profile.boardWorkspacesTree) || []; - this.workspacesTreeVar.set(tree); - }); - }, - - reorderWorkspaces(draggedSpaceId, targetSpaceId) { - const tree = this.workspacesTreeVar.get(); - - // Helper to remove a space from tree - const removeSpace = (nodes, id) => { - for (let i = 0; i < nodes.length; i++) { - if (nodes[i].id === id) { - const removed = nodes.splice(i, 1)[0]; - return { tree: nodes, removed }; - } - if (nodes[i].children) { - const result = removeSpace(nodes[i].children, id); - if (result.removed) { - return { tree: nodes, removed: result.removed }; - } - } - } - return { tree: nodes, removed: null }; - }; - - // Helper to insert a space after target - const insertAfter = (nodes, targetId, spaceToInsert) => { - for (let i = 0; i < nodes.length; i++) { - if (nodes[i].id === targetId) { - nodes.splice(i + 1, 0, spaceToInsert); - return true; - } - if (nodes[i].children) { - if (insertAfter(nodes[i].children, targetId, spaceToInsert)) { - return true; - } - } - } - return false; - }; - - // Clone the tree - const newTree = EJSON.clone(tree); - - // Remove the dragged space - const { tree: treeAfterRemoval, removed } = removeSpace(newTree, draggedSpaceId); - - if (removed) { - // Insert after target - insertAfter(treeAfterRemoval, targetSpaceId, removed); - - // Save the new tree - Meteor.call('setWorkspacesTree', treeAfterRemoval, (err) => { - if (err) console.error(err); - }); - } }, onRendered() { - // jQuery sortable is disabled in favor of HTML5 drag-and-drop for space management - // The old sortable code has been removed to prevent conflicts - - /* OLD SORTABLE CODE - DISABLED const itemsSelector = '.js-board:not(.placeholder)'; const $boards = this.$('.js-boards'); @@ -142,20 +73,27 @@ BlazeComponent.extendComponent({ EscapeActions.executeUpTo('popup-close'); }, 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 prevBoardDom = ui.item.prev('.js-board').get(0); - const nextBoardDom = ui.item.next('.js-board').get(0); - const sortIndex = Utils.calculateIndex(prevBoardDom, nextBoardDom, 1); + const nextBoardBom = ui.item.next('.js-board').get(0); + const sortIndex = Utils.calculateIndex(prevBoardDom, nextBoardBom, 1); const boardDomElement = ui.item.get(0); const board = Blaze.getData(boardDomElement); + // Normally the jquery-ui sortable library moves the dragged DOM element + // to its new position, which disrupts Blaze reactive updates mechanism + // (especially when we move the last card of a list, or when multiple + // users move some cards at the same time). To prevent these UX glitches + // we ask sortable to gracefully cancel the move, and to put back the + // DOM in its initial state. The card move is then handled reactively by + // Blaze with the below query. $boards.sortable('cancel'); - const currentUser = ReactiveCache.getCurrentUser(); - if (currentUser && typeof currentUser.setBoardSortIndex === 'function') { - currentUser.setBoardSortIndex(board._id, sortIndex.base); - } + board.move(sortIndex.base); }, }); + // Disable drag-dropping if the current user is not a board member or is comment only this.autorun(() => { if (Utils.isTouchScreenOrShowDesktopDragHandles()) { $boards.sortable({ @@ -163,7 +101,6 @@ BlazeComponent.extendComponent({ }); } }); - */ }, userHasTeams() { if (ReactiveCache.getCurrentUser()?.teams?.length > 0) @@ -195,55 +132,22 @@ BlazeComponent.extendComponent({ const ret = this.userHasOrgs() || this.userHasTeams(); return ret; }, - currentMenuPath() { - const sel = this.selectedMenu.get(); - const currentUser = ReactiveCache.getCurrentUser(); - - // Helper to find space by id in tree - const findSpaceById = (nodes, targetId, path = []) => { - for (const node of nodes) { - if (node.id === targetId) { - return [...path, node]; - } - if (node.children && node.children.length > 0) { - const result = findSpaceById(node.children, targetId, [...path, node]); - if (result) return result; - } - } - return null; - }; - - if (sel === 'starred') { - return { icon: '⭐', text: TAPi18n.__('allboards.starred') }; - } else if (sel === 'templates') { - return { icon: '📋', text: TAPi18n.__('allboards.templates') }; - } else if (sel === 'remaining') { - return { icon: '📂', text: TAPi18n.__('allboards.remaining') }; - } else { - // sel is a workspaceId, build path - const tree = this.workspacesTreeVar.get(); - const spacePath = findSpaceById(tree, sel); - if (spacePath && spacePath.length > 0) { - const pathText = spacePath.map(s => s.name).join(' / '); - return { icon: '🗂️', text: `${TAPi18n.__('allboards.workspaces')} / ${pathText}` }; - } - return { icon: '🗂️', text: TAPi18n.__('allboards.workspaces') }; - } - }, boards() { let query = { + // { type: 'board' }, + // { type: { $in: ['board','template-container'] } }, $and: [ { archived: false }, { type: { $in: ['board', 'template-container'] } }, + { $or: [] }, { title: { $not: { $regex: /^\^.*\^$/ } } } ] }; - const membershipOrs = []; let allowPrivateVisibilityOnly = TableVisibilityModeSettings.findOne('tableVisibilityMode-allowPrivateOnly'); if (FlowRouter.getRouteName() === 'home') { - membershipOrs.push({ 'members.userId': Meteor.userId() }); + query.$and[2].$or.push({ 'members.userId': Meteor.userId() }); if (allowPrivateVisibilityOnly !== undefined && allowPrivateVisibilityOnly.booleanValue) { query.$and.push({ 'permission': 'private' }); @@ -258,7 +162,7 @@ BlazeComponent.extendComponent({ // } //query.$and[2].$or.push({'orgs': {$elemMatch : {orgId: orgsIds[0]}}}); - membershipOrs.push({ 'orgs.orgId': { $in: orgsIds } }); + query.$and[2].$or.push({ 'orgs.orgId': { $in: orgsIds } }); } let teamIdsUserBelongs = currUser?.teamIdsUserBelongs() || ''; @@ -268,11 +172,8 @@ BlazeComponent.extendComponent({ // query.$or[2].$or.push({'teams.teamId': teamsIds[i]}); // } //query.$and[2].$or.push({'teams': { $elemMatch : {teamId: teamsIds[0]}}}); - membershipOrs.push({ 'teams.teamId': { $in: teamsIds } }); + query.$and[2].$or.push({ 'teams.teamId': { $in: teamsIds } }); } - if (membershipOrs.length) { - query.$and.splice(2, 0, { $or: membershipOrs }); - } } else if (allowPrivateVisibilityOnly !== undefined && !allowPrivateVisibilityOnly.booleanValue) { query = { @@ -283,33 +184,10 @@ BlazeComponent.extendComponent({ }; } - const boards = ReactiveCache.getBoards(query, {}); - const currentUser = ReactiveCache.getCurrentUser(); - let list = boards; - // Apply left menu filtering - const sel = this.selectedMenu.get(); - const assignments = (currentUser && currentUser.profile && currentUser.profile.boardWorkspaceAssignments) || {}; - if (sel === 'starred') { - list = list.filter(b => currentUser && currentUser.hasStarred(b._id)); - } else if (sel === 'templates') { - list = list.filter(b => b.type === 'template-container'); - } else if (sel === 'remaining') { - // Show boards not in any workspace AND not templates - // Keep starred boards visible in Remaining too - list = list.filter(b => - !assignments[b._id] && - b.type !== 'template-container' - ); - } else { - // assume sel is a workspaceId - // Keep starred boards visible in their workspace too - list = list.filter(b => assignments[b._id] === sel); - } - - if (currentUser && typeof currentUser.sortBoardsForUser === 'function') { - return currentUser.sortBoardsForUser(list); - } - return list.slice().sort((a, b) => (a.title || '').localeCompare(b.title || '')); + const ret = ReactiveCache.getBoards(query, { + sort: { sort: 1 /* boards default sorting */ }, + }); + return ret; }, boardLists(boardId) { /* Bug Board icons random dance https://github.com/wekan/wekan/issues/4214 @@ -357,65 +235,11 @@ BlazeComponent.extendComponent({ events() { return [ { - 'click .js-select-menu'(evt) { - const type = evt.currentTarget.getAttribute('data-type'); - this.selectedWorkspaceIdVar.set(null); - this.selectedMenu.set(type); - }, - 'click .js-select-workspace'(evt) { - const id = evt.currentTarget.getAttribute('data-id'); - this.selectedWorkspaceIdVar.set(id); - this.selectedMenu.set(id); - }, - 'click .js-add-workspace'(evt) { - evt.preventDefault(); - const name = prompt(TAPi18n.__('allboards.add-workspace-prompt') || 'New Space name'); - if (name && name.trim()) { - Meteor.call('createWorkspace', { parentId: null, name: name.trim() }, (err, res) => { - if (err) console.error(err); - }); - } - }, - 'click .js-add-board'(evt) { - // Store the currently selected workspace/menu for board creation - const selectedWorkspaceId = this.selectedWorkspaceIdVar.get(); - const selectedMenu = this.selectedMenu.get(); - - if (selectedWorkspaceId) { - Session.set('createBoardInWorkspace', selectedWorkspaceId); - } else { - Session.set('createBoardInWorkspace', null); - } - - // Open different popup based on context - if (selectedMenu === 'templates') { - Popup.open('createTemplateContainer')(evt); - } else { - Popup.open('createBoard')(evt); - } - }, + 'click .js-add-board': Popup.open('createBoard'), 'click .js-star-board'(evt) { + const boardId = this.currentData()._id; + ReactiveCache.getCurrentUser().toggleBoardStar(boardId); evt.preventDefault(); - evt.stopPropagation(); - const boardId = this.currentData()._id; - if (boardId) { - Meteor.call('toggleBoardStar', boardId); - } - }, - // HTML5 DnD from boards to spaces - 'dragstart .js-board'(evt) { - const boardId = this.currentData()._id; - - // Support multi-drag - if (BoardMultiSelection.isActive() && BoardMultiSelection.isSelected(boardId)) { - const selectedIds = BoardMultiSelection.getSelectedBoardIds(); - try { - evt.originalEvent.dataTransfer.setData('text/plain', JSON.stringify(selectedIds)); - evt.originalEvent.dataTransfer.setData('application/x-board-multi', 'true'); - } catch (e) {} - } else { - try { evt.originalEvent.dataTransfer.setData('text/plain', boardId); } catch (e) {} - } }, 'click .js-clone-board'(evt) { if (confirm(TAPi18n.__('duplicate-board-confirm'))) { @@ -466,58 +290,6 @@ BlazeComponent.extendComponent({ } }); }, - 'click .js-multiselection-activate'(evt) { - evt.preventDefault(); - if (BoardMultiSelection.isActive()) { - BoardMultiSelection.disable(); - } else { - BoardMultiSelection.activate(); - } - }, - 'click .js-multiselection-reset'(evt) { - evt.preventDefault(); - BoardMultiSelection.disable(); - }, - 'click .js-toggle-board-multi-selection'(evt) { - evt.preventDefault(); - evt.stopPropagation(); - const boardId = this.currentData()._id; - BoardMultiSelection.toogle(boardId); - }, - 'click .js-archive-selected-boards'(evt) { - evt.preventDefault(); - const selectedBoards = BoardMultiSelection.getSelectedBoardIds(); - if (selectedBoards.length > 0 && confirm(TAPi18n.__('archive-board-confirm'))) { - selectedBoards.forEach(boardId => { - Meteor.call('archiveBoard', boardId); - }); - BoardMultiSelection.reset(); - } - }, - 'click .js-duplicate-selected-boards'(evt) { - evt.preventDefault(); - const selectedBoards = BoardMultiSelection.getSelectedBoardIds(); - if (selectedBoards.length > 0 && confirm(TAPi18n.__('duplicate-board-confirm'))) { - selectedBoards.forEach(boardId => { - const board = ReactiveCache.getBoard(boardId); - if (board) { - Meteor.call( - 'copyBoard', - boardId, - { - sort: ReactiveCache.getBoards({ archived: false }).length, - type: 'board', - title: board.title, - }, - (err, res) => { - if (err) console.error(err); - } - ); - } - }); - BoardMultiSelection.reset(); - } - }, 'click #resetBtn'(event) { let allBoards = document.getElementsByClassName("js-board"); let currBoard; @@ -546,18 +318,15 @@ BlazeComponent.extendComponent({ const query = { $and: [ { archived: false }, - { type: 'board' } + { type: 'board' }, + { $or: [] } ] }; - const ors = []; if (selectedTeamsValues.length > 0) { - ors.push({ 'teams.teamId': { $in: selectedTeamsValues } }); + query.$and[2].$or.push({ 'teams.teamId': { $in: selectedTeamsValues } }); } if (selectedOrgsValues.length > 0) { - ors.push({ 'orgs.orgId': { $in: selectedOrgsValues } }); - } - if (ors.length) { - query.$and.push({ $or: ors }); + query.$and[2].$or.push({ 'orgs.orgId': { $in: selectedOrgsValues } }); } let filteredBoards = ReactiveCache.getBoards(query, {}); @@ -587,260 +356,7 @@ BlazeComponent.extendComponent({ } } }, - 'click .js-edit-workspace'(evt) { - evt.preventDefault(); - evt.stopPropagation(); - const workspaceId = evt.currentTarget.getAttribute('data-id'); - - // Find the space in the tree - const findSpace = (nodes, id) => { - for (const node of nodes) { - if (node.id === id) return node; - if (node.children) { - const found = findSpace(node.children, id); - if (found) return found; - } - } - return null; - }; - - const tree = this.workspacesTreeVar.get(); - const space = findSpace(tree, workspaceId); - - if (space) { - const newName = prompt(TAPi18n.__('allboards.edit-workspace-name') || 'Space name:', space.name); - const newIcon = prompt(TAPi18n.__('allboards.edit-workspace-icon') || 'Space icon (markdown):', space.icon || '📁'); - - if (newName !== null && newName.trim()) { - // Update space in tree - const updateSpaceInTree = (nodes, id, updates) => { - return nodes.map(node => { - if (node.id === id) { - return { ...node, ...updates }; - } - if (node.children) { - return { ...node, children: updateSpaceInTree(node.children, id, updates) }; - } - return node; - }); - }; - - const updatedTree = updateSpaceInTree(tree, workspaceId, { - name: newName.trim(), - icon: newIcon || '📁' - }); - - Meteor.call('setWorkspacesTree', updatedTree, (err) => { - if (err) console.error(err); - }); - } - } - }, - 'click .js-add-subworkspace'(evt) { - evt.preventDefault(); - evt.stopPropagation(); - const parentId = evt.currentTarget.getAttribute('data-id'); - const name = prompt(TAPi18n.__('allboards.add-subworkspace-prompt') || 'Subspace name:'); - - if (name && name.trim()) { - Meteor.call('createWorkspace', { parentId, name: name.trim() }, (err) => { - if (err) console.error(err); - }); - } - }, - 'dragstart .workspace-node'(evt) { - const workspaceId = evt.currentTarget.getAttribute('data-workspace-id'); - evt.originalEvent.dataTransfer.effectAllowed = 'move'; - evt.originalEvent.dataTransfer.setData('application/x-workspace-id', workspaceId); - - // Create a better drag image - const dragImage = evt.currentTarget.cloneNode(true); - dragImage.style.position = 'absolute'; - dragImage.style.top = '-9999px'; - dragImage.style.opacity = '0.8'; - document.body.appendChild(dragImage); - evt.originalEvent.dataTransfer.setDragImage(dragImage, 0, 0); - setTimeout(() => document.body.removeChild(dragImage), 0); - - evt.currentTarget.classList.add('dragging'); - }, - 'dragend .workspace-node'(evt) { - evt.currentTarget.classList.remove('dragging'); - document.querySelectorAll('.workspace-node').forEach(el => { - el.classList.remove('drag-over'); - }); - }, - 'dragover .workspace-node'(evt) { - evt.preventDefault(); - evt.stopPropagation(); - - const draggingEl = document.querySelector('.workspace-node.dragging'); - const targetEl = evt.currentTarget; - - // Allow dropping boards on any space - // Or allow dropping spaces on other spaces (but not on itself or descendants) - if (!draggingEl || (targetEl !== draggingEl && !draggingEl.contains(targetEl))) { - evt.originalEvent.dataTransfer.dropEffect = 'move'; - targetEl.classList.add('drag-over'); - } - }, - 'dragleave .workspace-node'(evt) { - evt.currentTarget.classList.remove('drag-over'); - }, - 'drop .workspace-node'(evt) { - evt.preventDefault(); - evt.stopPropagation(); - - const targetEl = evt.currentTarget; - targetEl.classList.remove('drag-over'); - - // Check what's being dropped - board or workspace - const draggedWorkspaceId = evt.originalEvent.dataTransfer.getData('application/x-workspace-id'); - const isMultiBoard = evt.originalEvent.dataTransfer.getData('application/x-board-multi'); - const boardData = evt.originalEvent.dataTransfer.getData('text/plain'); - - if (draggedWorkspaceId && !boardData) { - // This is a workspace reorder operation - const targetWorkspaceId = targetEl.getAttribute('data-workspace-id'); - - if (draggedWorkspaceId !== targetWorkspaceId) { - this.reorderWorkspaces(draggedWorkspaceId, targetWorkspaceId); - } - } else if (boardData) { - // This is a board assignment operation - // Get the workspace ID directly from the dropped workspace-node's data-workspace-id attribute - const workspaceId = targetEl.getAttribute('data-workspace-id'); - - if (workspaceId) { - if (isMultiBoard) { - // Multi-board drag - try { - const boardIds = JSON.parse(boardData); - boardIds.forEach(boardId => { - Meteor.call('assignBoardToWorkspace', boardId, workspaceId); - }); - } catch (e) { - // Error parsing multi-board data - } - } else { - // Single board drag - Meteor.call('assignBoardToWorkspace', boardData, workspaceId); - } - } - } - }, - 'dragover .js-select-menu'(evt) { - evt.preventDefault(); - evt.stopPropagation(); - - const menuType = evt.currentTarget.getAttribute('data-type'); - // Only allow drop on "remaining" menu to unassign boards from spaces - if (menuType === 'remaining') { - evt.originalEvent.dataTransfer.dropEffect = 'move'; - evt.currentTarget.classList.add('drag-over'); - } - }, - 'dragleave .js-select-menu'(evt) { - evt.currentTarget.classList.remove('drag-over'); - }, - 'drop .js-select-menu'(evt) { - evt.preventDefault(); - evt.stopPropagation(); - - const menuType = evt.currentTarget.getAttribute('data-type'); - evt.currentTarget.classList.remove('drag-over'); - - // Only handle drops on "remaining" menu - if (menuType !== 'remaining') return; - - const isMultiBoard = evt.originalEvent.dataTransfer.getData('application/x-board-multi'); - const boardData = evt.originalEvent.dataTransfer.getData('text/plain'); - - if (boardData) { - if (isMultiBoard) { - // Multi-board drag - unassign all from workspaces - try { - const boardIds = JSON.parse(boardData); - boardIds.forEach(boardId => { - Meteor.call('unassignBoardFromWorkspace', boardId); - }); - } catch (e) { - // Error parsing multi-board data - } - } else { - // Single board drag - unassign from workspace - Meteor.call('unassignBoardFromWorkspace', boardData); - } - } - }, }, ]; }, - // Helpers for templates - workspacesTree() { - return this.workspacesTreeVar.get(); - }, - selectedWorkspaceId() { - return this.selectedWorkspaceIdVar.get(); - }, - isSelectedMenu(type) { - return this.selectedMenu.get() === type; - }, - isSpaceSelected(id) { - return this.selectedWorkspaceIdVar.get() === id; - }, - menuItemCount(type) { - const currentUser = ReactiveCache.getCurrentUser(); - const assignments = (currentUser && currentUser.profile && currentUser.profile.boardWorkspaceAssignments) || {}; - - // Get all boards for counting - let query = { - $and: [ - { archived: false }, - { type: { $in: ['board', 'template-container'] } }, - { $or: [{ 'members.userId': Meteor.userId() }] }, - { title: { $not: { $regex: /^\^.*\^$/ } } } - ] - }; - const allBoards = ReactiveCache.getBoards(query, {}); - - if (type === 'starred') { - return allBoards.filter(b => currentUser && currentUser.hasStarred(b._id)).length; - } else if (type === 'templates') { - return allBoards.filter(b => b.type === 'template-container').length; - } else if (type === 'remaining') { - // Count boards not in any workspace AND not templates - // Include starred boards (they appear in both Starred and Remaining) - return allBoards.filter(b => - !assignments[b._id] && - b.type !== 'template-container' - ).length; - } - return 0; - }, - workspaceCount(workspaceId) { - const currentUser = ReactiveCache.getCurrentUser(); - const assignments = (currentUser && currentUser.profile && currentUser.profile.boardWorkspaceAssignments) || {}; - - // Get all boards for counting - let query = { - $and: [ - { archived: false }, - { type: { $in: ['board', 'template-container'] } }, - { $or: [{ 'members.userId': Meteor.userId() }] }, - { title: { $not: { $regex: /^\^.*\^$/ } } } - ] - }; - const allBoards = ReactiveCache.getBoards(query, {}); - - // Count boards directly assigned to this space (not including children) - return allBoards.filter(b => assignments[b._id] === workspaceId).length; - }, - canModifyBoards() { - const currentUser = ReactiveCache.getCurrentUser(); - return currentUser && !currentUser.isCommentOnly(); - }, - hasBoardsSelected() { - return BoardMultiSelection.count() > 0; - }, }).register('boardList'); diff --git a/client/components/boards/miniboard.jade b/client/components/boards/miniboard.jade index ea40604a7..d1fb0b075 100644 --- a/client/components/boards/miniboard.jade +++ b/client/components/boards/miniboard.jade @@ -3,6 +3,6 @@ template(name="miniboard") class="minicard-{{colorClass}}") .minicard-title .handle - span.drag-handle(title="{{_ 'dragBoard'}}") ↕️ + .fa.fa-arrows +viewer = title diff --git a/client/components/cards/attachments.css b/client/components/cards/attachments.css index 64a0c8735..becb29160 100644 --- a/client/components/cards/attachments.css +++ b/client/components/cards/attachments.css @@ -336,3 +336,36 @@ margin-top: 10px; } } + +/* Attachment migration styles */ +.attachment-item.migrating { + position: relative; + opacity: 0.7; +} + +.attachment-migration-overlay { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(255, 255, 255, 0.9); + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + z-index: 10; + border-radius: 4px; +} + +.migration-spinner { + font-size: 24px; + color: #007cba; + margin-bottom: 8px; +} + +.migration-text { + font-size: 12px; + color: #666; + text-align: center; +} diff --git a/client/components/cards/cardCustomFields.jade b/client/components/cards/cardCustomFields.jade index 5534c9c77..35afa772b 100644 --- a/client/components/cards/cardCustomFields.jade +++ b/client/components/cards/cardCustomFields.jade @@ -55,9 +55,10 @@ template(name="cardCustomField-number") template(name="cardCustomField-checkbox") .js-checklist-item.checklist-item(class="{{#if data.value }}is-checked{{/if}}") if canModifyCard - span.check-box-unicode {{#if data.value }}✅{{else}}⬜{{/if}} + .check-box-container + .check-box.materialCheckBox(class="{{#if data.value }}is-checked{{/if}}") else - span.check-box-unicode {{#if data.value }}✅{{else}}⬜{{/if}} + .materialCheckBox(class="{{#if data.value }}is-checked{{/if}}") template(name="cardCustomField-currency") if canModifyCard diff --git a/client/components/cards/cardCustomFields.js b/client/components/cards/cardCustomFields.js index f519e4d3c..82c025503 100644 --- a/client/components/cards/cardCustomFields.js +++ b/client/components/cards/cardCustomFields.js @@ -112,7 +112,6 @@ CardCustomField.register('cardCustomField'); events() { return [ { - 'click .js-checklist-item .check-box-unicode': this.toggleItem, 'click .js-checklist-item .check-box-container': this.toggleItem, }, ]; diff --git a/client/components/cards/cardDate.jade b/client/components/cards/cardDate.jade index c8c6f45a3..e387112bc 100644 --- a/client/components/cards/cardDate.jade +++ b/client/components/cards/cardDate.jade @@ -97,12 +97,6 @@ template(name="minicardCustomFieldDate") template(name="editCardReceivedDatePopup") form.edit-card-received-date .datepicker - // Date input field (existing) - // Insert calendar selector right after date input - .calendar-selector - label(for="calendar-received") 🗓️ - input#calendar-received.js-calendar-date(type="date") - // Time input field (if present) .clear-date a.js-clear-date {{_ 'clear'}} .datepicker-actions @@ -112,11 +106,6 @@ template(name="editCardReceivedDatePopup") template(name="editCardStartDatePopup") form.edit-card-start-date .datepicker - // Date input field (existing) - .calendar-selector - label(for="calendar-start") 🗓️ - input#calendar-start.js-calendar-date(type="date") - // Time input field (if present) .clear-date a.js-clear-date {{_ 'clear'}} .datepicker-actions @@ -126,11 +115,6 @@ template(name="editCardStartDatePopup") template(name="editCardDueDatePopup") form.edit-card-due-date .datepicker - // Date input field (existing) - .calendar-selector - label(for="calendar-due") 🗓️ - input#calendar-due.js-calendar-date(type="date") - // Time input field (if present) .clear-date a.js-clear-date {{_ 'clear'}} .datepicker-actions @@ -140,11 +124,6 @@ template(name="editCardDueDatePopup") template(name="editCardEndDatePopup") form.edit-card-end-date .datepicker - // Date input field (existing) - .calendar-selector - label(for="calendar-end") 🗓️ - input#calendar-end.js-calendar-date(type="date") - // Time input field (if present) .clear-date a.js-clear-date {{_ 'clear'}} .datepicker-actions diff --git a/client/components/cards/cardDate.js b/client/components/cards/cardDate.js index a470bbba4..bf40538db 100644 --- a/client/components/cards/cardDate.js +++ b/client/components/cards/cardDate.js @@ -50,17 +50,6 @@ import { onRendered() { super.onRendered(); // DatePicker base class handles initialization with native HTML inputs - const self = this; - this.$('.js-calendar-date').on('change', function(evt) { - const currentUser = ReactiveCache.getCurrentUser && ReactiveCache.getCurrentUser(); - const dateFormat = currentUser ? currentUser.getDateFormat() : 'YYYY-MM-DD'; - const value = evt.target.value; - if (value) { - // Format date according to user preference - const formatted = formatDateByUserPreference(new Date(value), dateFormat, true); - self._storeDate(new Date(value)); - } - }); } _storeDate(date) { diff --git a/client/components/cards/cardDetails.css b/client/components/cards/cardDetails.css index c387bf3aa..fb68b2957 100644 --- a/client/components/cards/cardDetails.css +++ b/client/components/cards/cardDetails.css @@ -31,8 +31,8 @@ display: block; position: relative; float: left; - height: clamp(24px, 3.5vw, 36px); - width: clamp(24px, 3.5vw, 36px); + height: 30px; + width: 30px; margin: .3vh; cursor: pointer; user-select: none; @@ -118,65 +118,6 @@ transition: flex-basis 0.1s; box-sizing: border-box; } - -/* Desktop mode: position card below board header */ -body.desktop-mode .card-details:not(.card-details-popup) { - position: fixed; - width: auto; - max-width: 800px; - flex-basis: auto; - border-radius: 8px; - z-index: 100; -} - -/* Default position for first card or when dragged */ -body.desktop-mode .card-details:not(.card-details-popup):not([style*="left"]):not([style*="top"]) { - top: 50px; - left: 20px; - right: 20px; - bottom: 20px; -} - -/* Stagger positions for multiple cards using nth-of-type */ -body.desktop-mode .card-details:not(.card-details-popup):nth-of-type(1) { - top: 50px; - left: 20px; -} -body.desktop-mode .card-details:not(.card-details-popup):nth-of-type(2) { - top: 80px; - left: 50px; -} -body.desktop-mode .card-details:not(.card-details-popup):nth-of-type(3) { - top: 110px; - left: 80px; -} -body.desktop-mode .card-details:not(.card-details-popup):nth-of-type(4) { - top: 140px; - left: 110px; -} -body.desktop-mode .card-details:not(.card-details-popup):nth-of-type(5) { - top: 170px; - left: 140px; -} - -/* For expanded cards, set dimensions */ -body.desktop-mode .card-details:not(.card-details-popup):not(.card-details-collapsed) { - right: 20px; - bottom: 20px; -} - -/* Collapsed card state - hide content and set height to title row only */ -.card-details.card-details-collapsed .card-details-canvas > *:not(.card-details-header) { - display: none; -} -.card-details.card-details-collapsed { - height: auto !important; - bottom: auto !important; - overflow: visible; -} -body.desktop-mode .card-details.card-details-collapsed { - bottom: auto !important; -} .card-details .mCustomScrollBox { padding-left: 0; } @@ -198,30 +139,6 @@ body.desktop-mode .card-details.card-details-collapsed { display: inline-block; margin-right: 5px; } - -/* Collapse toggle triangle */ -.card-details .card-details-header .card-collapse-toggle { - float: left; - font-size: 20px; - padding: 7px 10px; - margin-left: -10px; - margin-right: 5px; - cursor: pointer; - user-select: none; - color: #000; -} - -/* Drag handle */ -.card-details .card-details-header .card-drag-handle { - font-size: 20px; - padding: 8px 10px; - margin-right: 10px; - cursor: move; - user-select: none; - display: inline-block; - float: right; -} - .card-details .card-details-header .close-card-details, .card-details .card-details-header .maximize-card-details, .card-details .card-details-header .minimize-card-details, @@ -239,16 +156,11 @@ body.desktop-mode .card-details.card-details-collapsed { font-size: 24px; padding: 5px 10px 5px 10px; margin-right: -8px; - cursor: pointer; - user-select: none; } -.card-details .card-details-header .close-card-details-mobile-web, -.card-details .card-details-header .card-mobile-desktop-toggle { +.card-details .card-details-header .close-card-details-mobile-web { font-size: 24px; padding: 5px; - margin-right: 5px; - cursor: pointer; - user-select: none; + margin-right: 40px; } .card-details .card-details-header .card-copy-button { font-size: 17px; @@ -269,36 +181,6 @@ body.desktop-mode .card-details.card-details-collapsed { padding: 10px; margin-right: 30px; } -.card-details .card-details-header .card-mobile-desktop-toggle, -.card-details .card-details-header .card-zoom-in, -.card-details .card-details-header .card-zoom-out { - font-size: 24px; - padding: 5px 10px 5px 10px; - margin-right: 5px; - cursor: pointer; - user-select: none; - float: right; -} - -/* Unify all card text to match title size */ -.card-details { - font-size: 1em; -} -.card-details p, -.card-details span, -.card-details div, -.card-details a, -.card-details label, -.card-details input, -.card-details textarea, -.card-details select, -.card-details button, -.card-details .card-details-item-title, -.card-details .card-label, -.card-details .viewer { - font-size: inherit; - line-height: 1.4; -} .card-details .card-details-header .card-details-watch { font-size: 17px; padding-left: 7px; @@ -402,19 +284,6 @@ body.desktop-mode .card-details.card-details-collapsed { position: fixed; resize: both; } - - /* Override for mobile mode even on larger screens */ - body.mobile-mode .card-details { - width: 100vw !important; - top: 0 !important; - left: 0 !important; - right: 0 !important; - bottom: 0 !important; - height: 100vh !important; - max-height: 100vh !important; - resize: none !important; - } - .card-details-maximized { padding: 0; flex-shrink: 0; @@ -466,53 +335,19 @@ input[type="submit"].attachment-add-link-submit { } @media screen and (max-width: 800px) { .card-details { - width: 100% !important; - padding: 0px 0px 0px 0px !important; - margin: 0px !important; + width: calc(100% - 1px); + padding: 0px 20px 0px 20px; + margin: 0px; transition: none; - overflow-y: auto; - overflow-x: hidden; - /* iOS Safari specific fixes */ - -webkit-overflow-scrolling: touch; - position: fixed !important; - top: 0 !important; - left: 0 !important; - right: 0 !important; - bottom: 0 !important; - z-index: 100 !important; - height: 100vh !important; - max-height: 100vh !important; - border-radius: 0 !important; - box-shadow: none !important; - } - - /* Ensure card details are above everything on mobile */ - body.mobile-mode .card-details { - z-index: 100 !important; - width: 100vw !important; - left: 0 !important; - right: 0 !important; + overflow-y: revert; + overflow-x: revert; } .card-details .card-details-canvas { width: 100%; padding-left: 0px; - padding: 0 15px; } .card-details .card-details-header .close-card-details { margin-right: 0px; - display: block !important; - } - .card-details .card-details-header .close-card-details-mobile-web { - display: block !important; - margin-right: 5px !important; - } - .card-details .card-details-header .card-mobile-desktop-toggle { - display: block !important; - margin-right: 5px !important; - } - .card-details .card-details-header .card-mobile-desktop-toggle { - display: block !important; - margin-right: 5px !important; } .card-details .card-details-header .card-details-menu { margin-right: 40px; @@ -538,62 +373,6 @@ input[type="submit"].attachment-add-link-submit { .pop-over > .content-wrapper > .popup-container-depth-0 .card-details-header { margin: 0; } - /* iPhone mobile: enlarge header buttons and increase spacing */ - body.mobile-mode.iphone-device .card-details .card-details-header { - padding-right: 16px; - } - body.mobile-mode.iphone-device .card-details .card-details-header .close-card-details, - body.mobile-mode.iphone-device .card-details .card-details-header .maximize-card-details, - body.mobile-mode.iphone-device .card-details .card-details-header .minimize-card-details, - body.mobile-mode.iphone-device .card-details .card-details-header .card-details-menu-mobile-web, - body.mobile-mode.iphone-device .card-details .card-details-header .card-copy-mobile-button, - body.mobile-mode.iphone-device .card-details .card-details-header .card-mobile-desktop-toggle, - body.mobile-mode.iphone-device .card-details .card-details-header .card-zoom-in, - body.mobile-mode.iphone-device .card-details .card-details-header .card-zoom-out { - font-size: 2em !important; /* 2x bigger */ - padding: 0.3em !important; - margin-right: 0.75em !important; /* 2x space compared to default */ - margin-left: 0 !important; - } - /* Avoid clipping of the close button on the right edge */ - body.mobile-mode.iphone-device .card-details .card-details-header .close-card-details { - margin-right: 0.75em !important; - } - /* Enlarge the header title too */ - body.mobile-mode.iphone-device .card-details .card-details-header .card-details-title { - font-size: 1.2em !important; - font-weight: bold; - } -} - -/* Mobile mode styles - apply when body has mobile-mode class regardless of screen size */ -body.mobile-mode .card-details { - width: 100vw !important; - padding: 0px !important; - margin: 0px !important; - position: fixed !important; - top: 0 !important; - left: 0 !important; - right: 0 !important; - bottom: 0 !important; - z-index: 100 !important; - height: 100vh !important; - max-height: 100vh !important; - border-radius: 0 !important; - box-shadow: none !important; - overflow-y: auto !important; - overflow-x: hidden !important; - -webkit-overflow-scrolling: touch; -} - -body.mobile-mode .card-details .card-details-canvas { - width: 100% !important; - padding: 0 15px !important; -} - -body.mobile-mode .card-details .card-details-header .close-card-details, -body.mobile-mode .card-details .card-details-header .close-card-details-mobile-web { - display: block !important; } .card-details-white { background: #fff !important; diff --git a/client/components/cards/cardDetails.jade b/client/components/cards/cardDetails.jade index 0b8f23c7a..90b3fef31 100644 --- a/client/components/cards/cardDetails.jade +++ b/client/components/cards/cardDetails.jade @@ -5,18 +5,13 @@ template(name="cardDetails") +attachmentViewer - section.card-details.js-card-details.nodragscroll(class='{{#if cardMaximized}}card-details-maximized{{/if}}' class='{{#if isPopup}}card-details-popup{{/if}}' class='{{#unless isVerticalScrollbars}}no-scrollbars{{/unless}}' class='{{#if cardCollapsed}}card-details-collapsed{{/if}}'): .card-details-canvas + section.card-details.js-card-details.nodragscroll(class='{{#if cardMaximized}}card-details-maximized{{/if}}' class='{{#if isPopup}}card-details-popup{{/if}}' class='{{#unless isVerticalScrollbars}}no-scrollbars{{/unless}}'): .card-details-canvas .card-details-header(class='{{#if colorClass}}card-details-{{colorClass}}{{/if}}') +inlinedForm(classNames="js-card-details-title") +editCardTitleForm else unless isMiniScreen unless isPopup - span.card-collapse-toggle.js-card-collapse-toggle(title="{{_ 'collapse-card'}}") - if cardCollapsed - | ▶ - else - | 🔽 a.close-card-details.js-close-card-details(title="{{_ 'close-card'}}") | ❌ if canModifyCard @@ -31,40 +26,24 @@ template(name="cardDetails") | ☰ a.card-copy-button.js-copy-link( id="cardURL_copy" + class="fa-link" title="{{_ 'copy-card-link-to-clipboard'}}" href="{{ originRelativeUrl }}" ) - span.emoji-icon 🔗 - span.card-drag-handle.js-card-drag-handle(title="Drag card") - | ↕️ span.copied-tooltip {{_ 'copied'}} else - a.close-card-details.js-close-card-details(title="{{_ 'close-card'}}") - | ❌ - a.card-zoom-out.js-card-zoom-out(title="{{_ 'zoom-out'}}") - | 🔍➖ - a.card-zoom-in.js-card-zoom-in(title="{{_ 'zoom-in'}}") - | 🔍➕ - a.card-mobile-desktop-toggle.js-card-mobile-desktop-toggle(title="{{_ 'mobile-desktop-toggle'}}") - if mobileMode - | 🖥️ - else - | 📱 + unless isPopup + a.close-card-details.js-close-card-details(title="{{_ 'close-card'}}") + | ❌ if canModifyCard - if cardMaximized - a.minimize-card-details.js-minimize-card-details(title="{{_ 'minimize-card'}}") - | 🔽 - else - a.maximize-card-details.js-maximize-card-details(title="{{_ 'maximize-card'}}") - | 🔼 a.card-details-menu-mobile-web.js-open-card-details-menu(title="{{_ 'cardDetailsActionsPopup-title'}}") | ☰ a.card-copy-mobile-button.js-copy-link( id="cardURL_copy" + class="fa-link" title="{{_ 'copy-card-link-to-clipboard'}}" href="{{ originRelativeUrl }}" ) - span.emoji-icon 🔗 span.copied-tooltip {{_ 'copied'}} h2.card-details-title.js-card-title( class="{{#if canModifyCard}}js-open-inlined-form is-editable{{/if}}") @@ -212,7 +191,7 @@ template(name="cardDetails") if currentBoard.allowsMembers .card-details-item.card-details-item-members h3.card-details-item-title - | 👥 + | 👤s | {{_ 'members'}} each userId in getMembers +userAvatar(userId=userId cardId=_id) @@ -263,7 +242,7 @@ template(name="cardDetails") if currentBoard.allowsAssignedBy .card-details-item.card-details-item-name h3.card-details-item-title - | ✍️ + | 👤-plus | {{_ 'assigned-by'}} if canModifyCard unless currentUser.isWorker @@ -325,7 +304,7 @@ template(name="cardDetails") hr .card-details-item.card-details-item-customfield h3.card-details-item-title - | 📋 + | 📋-alt = definition.name +cardCustomField @@ -699,7 +678,7 @@ template(name="cardDetailsActionsPopup") | 👁️ | {{_ 'unwatch'}} else - | 👁️ + | 👁️-slash | {{_ 'watch'}} hr if canModifyCard @@ -719,7 +698,7 @@ template(name="cardDetailsActionsPopup") if currentUser.isBoardAdmin li a.js-custom-fields - | 📋 + | 📋-alt | {{_ 'card-edit-custom-fields'}} //li: a.js-received-date {{_ 'editCardReceivedDatePopup-title'}} //li: a.js-start-date {{_ 'editCardStartDatePopup-title'}} @@ -739,7 +718,7 @@ template(name="cardDetailsActionsPopup") | 👁️ | {{_ 'hide-list-on-minicard'}} else - | 👁️ + | 👁️-slash | {{_ 'show-list-on-minicard'}} hr ul.pop-over-list @@ -788,7 +767,7 @@ template(name="cardDetailsActionsPopup") ul.pop-over-list li a.js-more - span.emoji-icon 🔗 + | 🔗 | {{_ 'cardMorePopup-title'}} template(name="exportCardPopup") @@ -824,29 +803,17 @@ template(name="copyAndMoveCard") label {{_ 'boards'}}: select.js-select-boards(autofocus) each boards - option(value="{{_id}}" selected="{{#if isDialogOptionBoardId _id}}selected{{/if}}") {{add @index 1}}. {{title}} + option(value="{{_id}}" selected="{{#if isDialogOptionBoardId _id}}selected{{/if}}") {{title}} label {{_ 'swimlanes'}}: select.js-select-swimlanes each swimlanes - option(value="{{_id}}" selected="{{#if isDialogOptionSwimlaneId _id}}selected{{/if}}") {{add @index 1}}. {{title}} + option(value="{{_id}}" selected="{{#if isDialogOptionSwimlaneId _id}}selected{{/if}}") {{title}} label {{_ 'lists'}}: select.js-select-lists each lists - option(value="{{_id}}" selected="{{#if isDialogOptionListId _id}}selected{{/if}}") {{add @index 1}}. {{title}} - - label {{_ 'cards'}}: - select.js-select-cards - each cards - option(value="{{_id}}" selected="{{#if isDialogOptionCardId _id}}selected{{/if}}") {{add @index 1}}. {{title}} - - div - input(type="radio" name="position" value="above" checked id="position-above" style="display: inline") - label(for="position-above") {{_ 'above-selected-card'}} - div - input(type="radio" name="position" value="below" id="position-below" style="display: inline") - label(for="position-below") {{_ 'below-selected-card'}} + option(value="{{_id}}" selected="{{#if isDialogOptionListId _id}}selected{{/if}}") {{title}} .edit-controls.clearfix button.primary.confirm.js-done {{_ 'done'}} diff --git a/client/components/cards/cardDetails.js b/client/components/cards/cardDetails.js index 532fc641b..bbbd49a73 100644 --- a/client/components/cards/cardDetails.js +++ b/client/components/cards/cardDetails.js @@ -31,7 +31,6 @@ import CardComments from '/models/cardComments'; import { ALLOWED_COLORS } from '/config/const'; import { UserAvatar } from '../users/userAvatar'; import { DialogWithBoardSwimlaneList } from '/client/lib/dialogWithBoardSwimlaneList'; -import { DialogWithBoardSwimlaneListCard } from '/client/lib/dialogWithBoardSwimlaneListCard'; import { handleFileUpload } from './attachments'; import uploadProgressManager from '../../lib/uploadProgressManager'; @@ -64,11 +63,7 @@ BlazeComponent.extendComponent({ const boardBody = this.parentComponent().parentComponent(); //in Miniview parent is Board, not BoardBody. if (boardBody !== null) { - // Only show overlay in mobile mode, not in desktop mode - const isMobile = Utils.getMobileMode(); - if (isMobile) { - boardBody.showOverlay.set(true); - } + boardBody.showOverlay.set(true); boardBody.mouseHasEnterCardDetails = false; } } @@ -86,7 +81,6 @@ BlazeComponent.extendComponent({ isWatching() { const card = this.currentData(); - if (!card || typeof card.findWatcher !== 'function') return false; return card.findWatcher(Meteor.userId()); }, @@ -99,18 +93,6 @@ BlazeComponent.extendComponent({ return !Utils.getPopupCardId() && ReactiveCache.getCurrentUser().hasCardMaximized(); }, - cardCollapsed() { - const user = ReactiveCache.getCurrentUser(); - if (user && user.profile) { - return !!user.profile.cardCollapsed; - } - if (Users.getPublicCardCollapsed) { - const stored = Users.getPublicCardCollapsed(); - if (typeof stored === 'boolean') return stored; - } - return false; - }, - presentParentTask() { let result = this.currentBoard.presentParentTask; if (result === null || result === undefined) { @@ -163,9 +145,8 @@ BlazeComponent.extendComponent({ * @return is the list id the current list id ? */ isCurrentListId(listId) { - const data = this.data(); - if (!data || typeof data.listId === 'undefined') return false; - return data.listId == listId; + const ret = this.data().listId == listId; + return ret; }, onRendered() { @@ -315,74 +296,8 @@ BlazeComponent.extendComponent({ return [ { ...events, - 'click .js-card-collapse-toggle'() { - const user = ReactiveCache.getCurrentUser(); - const currentState = user && user.profile ? !!user.profile.cardCollapsed : !!Users.getPublicCardCollapsed(); - if (user) { - Meteor.call('setCardCollapsed', !currentState); - } else if (Users.setPublicCardCollapsed) { - Users.setPublicCardCollapsed(!currentState); - } - }, - 'mousedown .js-card-drag-handle'(event) { - event.preventDefault(); - const $card = $(event.target).closest('.card-details'); - const startX = event.clientX; - const startY = event.clientY; - const startLeft = $card.offset().left; - const startTop = $card.offset().top; - - const onMouseMove = (e) => { - const deltaX = e.clientX - startX; - const deltaY = e.clientY - startY; - $card.css({ - left: startLeft + deltaX + 'px', - top: startTop + deltaY + 'px' - }); - }; - - const onMouseUp = () => { - $(document).off('mousemove', onMouseMove); - $(document).off('mouseup', onMouseUp); - }; - - $(document).on('mousemove', onMouseMove); - $(document).on('mouseup', onMouseUp); - }, 'click .js-close-card-details'() { - // Get board ID from either the card data or current board in session - const card = this.currentData() || this.data(); - const boardId = (card && card.boardId) || Utils.getCurrentBoard()._id; - const cardId = card && card._id; - - if (boardId) { - // In desktop mode, remove from openCards array - const isMobile = Utils.getMobileMode(); - if (!isMobile && cardId) { - const openCards = Session.get('openCards') || []; - const filtered = openCards.filter(id => id !== cardId); - Session.set('openCards', filtered); - - // If this was the current card, clear it - if (Session.get('currentCard') === cardId) { - Session.set('currentCard', null); - } - // Don't navigate away in desktop mode - just close the card - return; - } - - // Mobile mode: Clear the current card session to close the card - Session.set('currentCard', null); - - // Navigate back to board without card - const board = ReactiveCache.getBoard(boardId); - if (board) { - FlowRouter.go('board', { - id: board._id, - slug: board.slug, - }); - } - } + Utils.goBoardId(this.data().boardId); }, 'click .js-copy-link'(event) { event.preventDefault(); @@ -396,34 +311,6 @@ BlazeComponent.extendComponent({ Meteor.call('changeDateFormat', dateFormat); }, 'click .js-open-card-details-menu': Popup.open('cardDetailsActions'), - // Mobile: switch to desktop popup view (maximize) - 'click .js-mobile-switch-to-desktop'(event) { - event.preventDefault(); - // Switch global mode to desktop so the card appears as desktop popup - Utils.setMobileMode(false); - }, - 'click .js-card-zoom-in'(event) { - event.preventDefault(); - const current = Utils.getCardZoom(); - const newZoom = Math.min(3.0, current + 0.1); - Utils.setCardZoom(newZoom); - }, - 'click .js-card-zoom-out'(event) { - event.preventDefault(); - const current = Utils.getCardZoom(); - const newZoom = Math.max(0.5, current - 0.1); - Utils.setCardZoom(newZoom); - }, - 'click .js-card-mobile-desktop-toggle'(event) { - event.preventDefault(); - const currentMode = Utils.getMobileMode(); - Utils.setMobileMode(!currentMode); - }, - 'click .js-card-mobile-desktop-toggle'(event) { - event.preventDefault(); - const currentMode = Utils.getMobileMode(); - Utils.setMobileMode(!currentMode); - }, 'submit .js-card-description'(event) { event.preventDefault(); const description = this.currentComponent().getValue(); @@ -543,57 +430,56 @@ BlazeComponent.extendComponent({ ) { newState = forIt; } - // Use secure server method; direct client updates to vote are blocked - Meteor.call('cards.vote', this.data()._id, newState); + this.data().setVote(Meteor.userId(), newState); }, 'click .js-poker'(e) { let newState = null; if ($(e.target).hasClass('js-poker-vote-one')) { newState = 'one'; - Meteor.call('cards.pokerVote', this.data()._id, newState); + this.data().setPoker(Meteor.userId(), newState); } if ($(e.target).hasClass('js-poker-vote-two')) { newState = 'two'; - Meteor.call('cards.pokerVote', this.data()._id, newState); + this.data().setPoker(Meteor.userId(), newState); } if ($(e.target).hasClass('js-poker-vote-three')) { newState = 'three'; - Meteor.call('cards.pokerVote', this.data()._id, newState); + this.data().setPoker(Meteor.userId(), newState); } if ($(e.target).hasClass('js-poker-vote-five')) { newState = 'five'; - Meteor.call('cards.pokerVote', this.data()._id, newState); + this.data().setPoker(Meteor.userId(), newState); } if ($(e.target).hasClass('js-poker-vote-eight')) { newState = 'eight'; - Meteor.call('cards.pokerVote', this.data()._id, newState); + this.data().setPoker(Meteor.userId(), newState); } if ($(e.target).hasClass('js-poker-vote-thirteen')) { newState = 'thirteen'; - Meteor.call('cards.pokerVote', this.data()._id, newState); + this.data().setPoker(Meteor.userId(), newState); } if ($(e.target).hasClass('js-poker-vote-twenty')) { newState = 'twenty'; - Meteor.call('cards.pokerVote', this.data()._id, newState); + this.data().setPoker(Meteor.userId(), newState); } if ($(e.target).hasClass('js-poker-vote-forty')) { newState = 'forty'; - Meteor.call('cards.pokerVote', this.data()._id, newState); + this.data().setPoker(Meteor.userId(), newState); } if ($(e.target).hasClass('js-poker-vote-one-hundred')) { newState = 'oneHundred'; - Meteor.call('cards.pokerVote', this.data()._id, newState); + this.data().setPoker(Meteor.userId(), newState); } if ($(e.target).hasClass('js-poker-vote-unsure')) { newState = 'unsure'; - Meteor.call('cards.pokerVote', this.data()._id, newState); + this.data().setPoker(Meteor.userId(), newState); } }, 'click .js-poker-finish'(e) { if ($(e.target).hasClass('js-poker-finish')) { e.preventDefault(); - const now = new Date(); - Meteor.call('cards.setPokerEnd', this.data()._id, now); + const now = formatDateTime(new Date()); + this.data().setPokerEnd(now); } }, @@ -601,9 +487,9 @@ BlazeComponent.extendComponent({ if ($(e.target).hasClass('js-poker-replay')) { e.preventDefault(); this.currentCard = this.currentData(); - Meteor.call('cards.replayPoker', this.currentCard._id); - Meteor.call('cards.unsetPokerEnd', this.currentCard._id); - Meteor.call('cards.unsetPokerEstimation', this.currentCard._id); + this.currentCard.replayPoker(); + this.data().unsetPokerEnd(); + this.data().unsetPokerEstimation(); } }, 'click .js-poker-estimation'(event) { @@ -614,9 +500,9 @@ BlazeComponent.extendComponent({ this.find('#pokerEstimation').value = ''; if (ruleTitle) { - Meteor.call('cards.setPokerEstimation', this.data()._id, parseInt(ruleTitle, 10)); + this.data().setPokerEstimation(parseInt(ruleTitle, 10)); } else { - Meteor.call('cards.unsetPokerEstimation', this.data()._id); + this.data().setPokerEstimation(''); } } }, @@ -796,7 +682,6 @@ Template.editCardSortOrderForm.onRendered(function () { Template.cardDetailsActionsPopup.helpers({ isWatching() { - if (!this || typeof this.findWatcher !== 'function') return false; return this.findWatcher(Meteor.userId()); }, @@ -950,42 +835,26 @@ Template.editCardAssignerForm.events({ }); /** Move Card Dialog */ -(class extends DialogWithBoardSwimlaneListCard { +(class extends DialogWithBoardSwimlaneList { getDialogOptions() { const ret = ReactiveCache.getCurrentUser().getMoveAndCopyDialogOptions(); return ret; } - setDone(cardId, options) { + setDone(boardId, swimlaneId, listId, options) { ReactiveCache.getCurrentUser().setMoveAndCopyDialogOption(this.currentBoardId, options); const card = this.data(); - let sortIndex = 0; - - if (cardId) { - const targetCard = ReactiveCache.getCard(cardId); - if (targetCard) { - const position = this.$('input[name="position"]:checked').val(); - if (position === 'above') { - sortIndex = targetCard.sort - 0.5; - } else { - sortIndex = targetCard.sort + 0.5; - } - } - } else { - // If no card selected, move to end - sortIndex = card.getMaxSort(options.listId, options.swimlaneId) + 1; - } - - card.move(options.boardId, options.swimlaneId, options.listId, sortIndex); + const minOrder = card.getMinSort(listId, swimlaneId); + card.move(boardId, swimlaneId, listId, minOrder - 1); } }).register('moveCardPopup'); /** Copy Card Dialog */ -(class extends DialogWithBoardSwimlaneListCard { +(class extends DialogWithBoardSwimlaneList { getDialogOptions() { const ret = ReactiveCache.getCurrentUser().getMoveAndCopyDialogOptions(); return ret; } - setDone(cardId, options) { + setDone(boardId, swimlaneId, listId, options) { ReactiveCache.getCurrentUser().setMoveAndCopyDialogOption(this.currentBoardId, options); const card = this.data(); @@ -994,30 +863,8 @@ Template.editCardAssignerForm.events({ const title = textarea.val().trim(); if (title) { - const newCardId = Meteor.call('copyCard', card._id, options.boardId, options.swimlaneId, options.listId, true, {title: title}); - - // Position the copied card - if (newCardId) { - const newCard = ReactiveCache.getCard(newCardId); - let sortIndex = 0; - - if (cardId) { - const targetCard = ReactiveCache.getCard(cardId); - if (targetCard) { - const position = this.$('input[name="position"]:checked').val(); - if (position === 'above') { - sortIndex = targetCard.sort - 0.5; - } else { - sortIndex = targetCard.sort + 0.5; - } - } - } else { - // If no card selected, copy to end - sortIndex = newCard.getMaxSort(options.listId, options.swimlaneId) + 1; - } - - newCard.move(options.boardId, options.swimlaneId, options.listId, sortIndex); - } + // insert new card to the top of new list + const newCardId = Meteor.call('copyCard', card._id, boardId, swimlaneId, listId, true, {title: title}); // 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 @@ -1029,12 +876,12 @@ Template.editCardAssignerForm.events({ }).register('copyCardPopup'); /** Convert Checklist-Item to card dialog */ -(class extends DialogWithBoardSwimlaneListCard { +(class extends DialogWithBoardSwimlaneList { getDialogOptions() { const ret = ReactiveCache.getCurrentUser().getMoveAndCopyDialogOptions(); return ret; } - setDone(cardId, options) { + setDone(boardId, swimlaneId, listId, options) { ReactiveCache.getCurrentUser().setMoveAndCopyDialogOption(this.currentBoardId, options); const card = this.data(); @@ -1044,29 +891,14 @@ Template.editCardAssignerForm.events({ if (title) { const _id = Cards.insert({ title: title, - listId: options.listId, - boardId: options.boardId, - swimlaneId: options.swimlaneId, + listId: listId, + boardId: boardId, + swimlaneId: swimlaneId, sort: 0, }); - const newCard = ReactiveCache.getCard(_id); - - let sortIndex = 0; - if (cardId) { - const targetCard = ReactiveCache.getCard(cardId); - if (targetCard) { - const position = this.$('input[name="position"]:checked').val(); - if (position === 'above') { - sortIndex = targetCard.sort - 0.5; - } else { - sortIndex = targetCard.sort + 0.5; - } - } - } else { - sortIndex = newCard.getMaxSort(options.listId, options.swimlaneId) + 1; - } - - newCard.move(options.boardId, options.swimlaneId, options.listId, sortIndex); + const card = ReactiveCache.getCard(_id); + const minOrder = card.getMinSort(); + card.move(card.boardId, card.swimlaneId, card.listId, minOrder - 1); Filter.addException(_id); } @@ -1074,12 +906,12 @@ Template.editCardAssignerForm.events({ }).register('convertChecklistItemToCardPopup'); /** Copy many cards dialog */ -(class extends DialogWithBoardSwimlaneListCard { +(class extends DialogWithBoardSwimlaneList { getDialogOptions() { const ret = ReactiveCache.getCurrentUser().getMoveAndCopyDialogOptions(); return ret; } - setDone(cardId, options) { + setDone(boardId, swimlaneId, listId, options) { ReactiveCache.getCurrentUser().setMoveAndCopyDialogOption(this.currentBoardId, options); const card = this.data(); @@ -1089,29 +921,7 @@ Template.editCardAssignerForm.events({ if (title) { const titleList = JSON.parse(title); for (const obj of titleList) { - const newCardId = Meteor.call('copyCard', card._id, options.boardId, options.swimlaneId, options.listId, false, {title: obj.title, description: obj.description}); - - // Position the copied card - if (newCardId) { - const newCard = ReactiveCache.getCard(newCardId); - let sortIndex = 0; - - if (cardId) { - const targetCard = ReactiveCache.getCard(cardId); - if (targetCard) { - const position = this.$('input[name="position"]:checked').val(); - if (position === 'above') { - sortIndex = targetCard.sort - 0.5; - } else { - sortIndex = targetCard.sort + 0.5; - } - } - } else { - sortIndex = newCard.getMaxSort(options.listId, options.swimlaneId) + 1; - } - - newCard.move(options.boardId, options.swimlaneId, options.listId, sortIndex); - } + const newCardId = Meteor.call('copyCard', card._id, boardId, swimlaneId, listId, false, {title: obj.title, description: obj.description}); // 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 @@ -1161,51 +971,6 @@ BlazeComponent.extendComponent({ }, }).register('setCardColorPopup'); -BlazeComponent.extendComponent({ - onCreated() { - this.currentColor = new ReactiveVar(null); - }, - - colors() { - return ALLOWED_COLORS.map((color) => ({ color, name: '' })); - }, - - isSelected(color) { - return this.currentColor.get() === color; - }, - - events() { - return [ - { - 'click .js-palette-color'(event) { - // Extract color from class name like "card-details-red" - const classes = $(event.currentTarget).attr('class').split(' '); - const colorClass = classes.find(cls => cls.startsWith('card-details-')); - const color = colorClass ? colorClass.replace('card-details-', '') : null; - this.currentColor.set(color); - }, - 'click .js-submit'(event) { - event.preventDefault(); - const color = this.currentColor.get(); - // Use MultiSelection to get selected cards and set color on each - ReactiveCache.getCards(MultiSelection.getMongoSelector()).forEach(card => { - card.setColor(color); - }); - Popup.back(); - }, - 'click .js-remove-color'(event) { - event.preventDefault(); - // Use MultiSelection to get selected cards and remove color from each - ReactiveCache.getCards(MultiSelection.getMongoSelector()).forEach(card => { - card.setColor(null); - }); - Popup.back(); - }, - }, - ]; - }, -}).register('setSelectionColorPopup'); - BlazeComponent.extendComponent({ onCreated() { this.currentCard = this.currentData(); @@ -1340,15 +1105,20 @@ BlazeComponent.extendComponent({ 'is-checked', ); const endString = this.currentCard.getVoteEnd(); - Meteor.call('cards.setVoteQuestion', this.currentCard._id, voteQuestion, publicVote, allowNonBoardMembers); + + this.currentCard.setVoteQuestion( + voteQuestion, + publicVote, + allowNonBoardMembers, + ); if (endString) { - Meteor.call('cards.setVoteEnd', this.currentCard._id, endString); + this.currentCard.setVoteEnd(endString); } Popup.back(); }, 'click .js-remove-vote': Popup.afterConfirm('deleteVote', () => { event.preventDefault(); - Meteor.call('cards.unsetVote', this.currentCard._id); + this.currentCard.unsetVote(); Popup.back(); }), 'click a.js-toggle-vote-public'(event) { @@ -1547,10 +1317,10 @@ BlazeComponent.extendComponent({ ]; } _storeDate(newDate) { - Meteor.call('cards.setVoteEnd', this.card._id, newDate); + this.card.setVoteEnd(newDate); } _deleteDate() { - Meteor.call('cards.unsetVoteEnd', this.card._id); + this.card.unsetVoteEnd(); } }.register('editVoteEndDatePopup')); @@ -1572,14 +1342,17 @@ BlazeComponent.extendComponent({ ); const endString = this.currentCard.getPokerEnd(); - Meteor.call('cards.setPokerQuestion', this.currentCard._id, pokerQuestion, allowNonBoardMembers); + this.currentCard.setPokerQuestion( + pokerQuestion, + allowNonBoardMembers, + ); if (endString) { - Meteor.call('cards.setPokerEnd', this.currentCard._id, new Date(endString)); + this.currentCard.setPokerEnd(endString); } Popup.back(); }, 'click .js-remove-poker': Popup.afterConfirm('deletePoker', (event) => { - Meteor.call('cards.unsetPoker', this.currentCard._id); + this.currentCard.unsetPoker(); Popup.back(); }), 'click a.js-toggle-poker-allow-non-members'(event) { @@ -1800,10 +1573,10 @@ BlazeComponent.extendComponent({ ]; } _storeDate(newDate) { - Meteor.call('cards.setPokerEnd', this.card._id, newDate); + this.card.setPokerEnd(newDate); } _deleteDate() { - Meteor.call('cards.unsetPokerEnd', this.card._id); + this.card.unsetPokerEnd(); } }.register('editPokerEndDatePopup')); diff --git a/client/components/cards/checklists.css b/client/components/cards/checklists.css index 78cba4610..6b8c7e8f9 100644 --- a/client/components/cards/checklists.css +++ b/client/components/cards/checklists.css @@ -37,23 +37,14 @@ textarea.js-edit-checklist-item { .checklist-progress-bar-container .checklist-progress-bar { width: 80%; height: 10px; - background-color: #d6ebff !important; - border-radius: 16px; } .checklist-progress-bar-container .checklist-progress-bar .checklist-progress { color: #fff !important; - background-color: #3cb500 !important; + background-color: #2196f3 !important; padding: 0.01em 16px; border-radius: 16px; height: 100%; } -/* Grey progress bar when grey icons setting is enabled */ -body.grey-icons-enabled .checklist-progress-bar-container .checklist-progress-bar { - background-color: #d9d9d9; -} -body.grey-icons-enabled .checklist-progress-bar-container .checklist-progress-bar .checklist-progress { - background-color: #7a7a7a !important; -} .checklist-title { padding: 10px; } @@ -76,14 +67,10 @@ body.grey-icons-enabled .checklist-progress-bar-container .checklist-progress-ba .checklist-title .checklist-stat.is-finished { color: #3cb500; } -.checklist-title span.checklist-handle { +.checklist-title span.fa.checklist-handle { padding-right: 20px; padding-top: 3px; float: left; - display: inline-block; - width: 1.2em; - text-align: center; - color: #999; } #card-details-overlay { top: 0; @@ -114,25 +101,6 @@ body.grey-icons-enabled .checklist-progress-bar-container .checklist-progress-ba height: auto; overflow: hidden; } - -/* iPhone mobile: larger checklist titles and more spacing between items */ -body.mobile-mode.iphone-device .checklist-title .title { - font-size: 1.3em !important; - font-weight: bold; -} - -body.mobile-mode.iphone-device .checklist-item { - margin-top: 12px !important; - margin-bottom: 8px !important; - padding: 8px 4px !important; - min-height: 44px; /* iOS recommended touch target size */ -} - -body.mobile-mode.iphone-device .checklist-item span.checklistitem-handle { - font-size: 1.5em !important; - padding-right: 15px !important; - width: 1.5em !important; -} .checklist-item.is-checked.invisible { opacity: 0; height: 0; @@ -162,27 +130,6 @@ body.mobile-mode.iphone-device .checklist-item span.checklistitem-handle { border-bottom: 2px solid #3cb500; border-right: 2px solid #3cb500; } -/* Unicode checkbox icons styling */ -.checklist-item .check-box-unicode, -.cardCustomField-checkbox .check-box-unicode { - font-size: 1.3em; - margin-right: 8px; - cursor: pointer; - display: inline-block; - vertical-align: middle; - line-height: 1; -} -/* Grey checkmarks when grey icons setting is enabled */ -body.grey-icons-enabled .checklist-item .check-box.is-checked { - border-bottom: 2px solid #7a7a7a; - border-right: 2px solid #7a7a7a; -} -body.grey-icons-enabled .checklist-item .check-box-unicode, -body.grey-icons-enabled .cardCustomField-checkbox .check-box-unicode { - filter: grayscale(100%); - -webkit-filter: grayscale(100%); - opacity: 0.85; -} .checklist-item .item-title { flex: 1; } @@ -197,14 +144,9 @@ body.grey-icons-enabled .cardCustomField-checkbox .check-box-unicode { word-wrap: break-word; max-width: 420px; } -.checklist-item span.checklistitem-handle { +.checklist-item span.fa.checklistitem-handle { padding-top: 2px; padding-right: 10px; - display: inline-block; - width: 1.2em; - text-align: center; - color: #999; - cursor: pointer; } .js-delete-checklist-item, .js-convert-checklist-item-to-card { diff --git a/client/components/cards/checklists.jade b/client/components/cards/checklists.jade index 75d9fbd9c..82e4a1a6e 100644 --- a/client/components/cards/checklists.jade +++ b/client/components/cards/checklists.jade @@ -9,10 +9,19 @@ template(name="checklists") else a.add-checklist-top.js-open-inlined-form(title="{{_ 'add-checklist'}}") | ➕ + if currentUser.isBoardMember + .material-toggle-switch(title="{{_ 'hide-finished-checklist'}}") + //span.toggle-switch-title + if card.hideFinishedChecklistIfItemsAreHidden + input.toggle-switch(type="checkbox" id="toggleHideFinishedChecklist" checked="checked") + else + input.toggle-switch(type="checkbox" id="toggleHideFinishedChecklist") + label.toggle-label(for="toggleHideFinishedChecklist") .card-checklist-items each checklist in checklists - +checklistDetail(checklist = checklist card = card) + if checklist.showChecklist card.hideFinishedChecklistIfItemsAreHidden + +checklistDetail(checklist = checklist card = card) if canModifyCard +inlinedForm(autoclose=false classNames="js-add-checklist" cardId = cardId) @@ -29,12 +38,12 @@ template(name="checklistDetail") .checklist-title span if canModifyCard - a.checklist-details-menu.js-open-checklist-details-menu(title="{{_ 'checklistActionsPopup-title'}}") ☰ + a.checklist-details-menu.js-open-checklist-details-menu(title="{{_ 'checklistActionsPopup-title'}}") if canModifyCard h4.title.js-open-inlined-form.is-editable if isTouchScreenOrShowDesktopDragHandles - span.checklist-handle(title="{{_ 'dragChecklist'}}") ↕️ + span.fa.checklist-handle(class="fa-arrows" title="{{_ 'dragChecklist'}}") +viewer = checklist.title else @@ -53,10 +62,6 @@ template(name="checklistDeletePopup") p {{_ 'confirm-checklist-delete-popup'}} button.js-confirm.negate.full(type="submit") {{_ 'delete'}} -template(name="checklistItemDeletePopup") - p {{_ 'confirm-checklist-delete-popup'}} - button.js-confirm.negate.full(type="submit") {{_ 'delete'}} - template(name="addChecklistItemForm") a(title="{{_ 'copy-text-to-clipboard'}}") span.copied-tooltip {{_ 'copied'}} @@ -64,7 +69,6 @@ template(name="addChecklistItemForm") .edit-controls.clearfix button.primary.confirm.js-submit-add-checklist-item-form(type="submit") {{_ 'save'}} a.js-close-inlined-form(title="{{_ 'close-add-checklist-item'}}") - | ❌ if showNewlineBecomesNewChecklistItem .material-toggle-switch(title="{{_ 'newlineBecomesNewChecklistItem'}}") input.toggle-switch(type="checkbox" id="toggleNewlineBecomesNewChecklistItem") @@ -87,16 +91,12 @@ template(name="editChecklistItemForm") .edit-controls.clearfix button.primary.confirm.js-submit-edit-checklist-item-form(type="submit") {{_ 'save'}} a.js-close-inlined-form(title="{{_ 'close-edit-checklist-item'}}") - | ❌ span(title=createdAt) {{ moment createdAt }} if canModifyCard - if $eq type 'item' - a.js-delete-checklist-item {{_ "delete"}}... - a.js-convert-checklist-item-to-card - | 📋 - | {{_ 'convertChecklistItemToCardPopup-title'}} - else - a.js-delete-checklist {{_ "delete"}}... + a.js-delete-checklist-item {{_ "delete"}}... + a.js-convert-checklist-item-to-card + | 📋 + | {{_ 'convertChecklistItemToCardPopup-title'}} template(name="checklistItems") if checklist.items.length @@ -123,13 +123,14 @@ template(name='checklistItemDetail') .js-checklist-item.checklist-item(class="{{#if item.isFinished }}is-checked{{#if checklist.hideCheckedChecklistItems}} invisible{{/if}}{{/if}}{{#if checklist.hideAllChecklistItems}} is-checked invisible{{/if}}" role="checkbox" aria-checked="{{#if item.isFinished }}true{{else}}false{{/if}}" tabindex="0") if canModifyCard - span.check-box-unicode {{#if item.isFinished }}✅{{else}}⬜{{/if}} - span.checklistitem-handle(title="{{_ 'dragChecklistItem'}}") ↕️ + .check-box-container + .check-box.materialCheckBox(class="{{#if item.isFinished }}is-checked{{/if}}") + span.fa.checklistitem-handle(class="fa-arrows" title="{{_ 'dragChecklistItem'}}") .item-title.js-open-inlined-form.is-editable(class="{{#if item.isFinished }}is-checked{{/if}}") +viewer = item.title else - span.check-box-unicode {{#if item.isFinished }}✅{{else}}⬜{{/if}} + .materialCheckBox(class="{{#if item.isFinished }}is-checked{{/if}}") .item-title(class="{{#if item.isFinished }}is-checked{{/if}}") +viewer = item.title @@ -164,62 +165,34 @@ template(name="checklistActionsPopup") else input.toggle-switch(type="checkbox" id="toggleHideAllChecklistItems_{{checklist._id}}") label.toggle-label(for="toggleHideAllChecklistItems_{{checklist._id}}") - a.js-toggle-show-checklist-at-minicard - | 📋 - | {{_ "showChecklistAtMinicard"}} ... - .material-toggle-switch(title="{{_ 'showChecklistAtMinicard'}}") - if checklist.showChecklistAtMinicard - input.toggle-switch(type="checkbox" id="toggleShowChecklistAtMinicard_{{checklist._id}}" checked="checked") - else - input.toggle-switch(type="checkbox" id="toggleShowChecklistAtMinicard_{{checklist._id}}") - label.toggle-label(for="toggleShowChecklistAtMinicard_{{checklist._id}}") template(name="copyChecklistPopup") - unless currentUser.isWorker - label {{_ 'boards'}}: - select.js-select-boards(autofocus) - each boards - option(value="{{_id}}" selected="{{#if isDialogOptionBoardId _id}}selected{{/if}}") {{add @index 1}}. {{title}} - - label {{_ 'swimlanes'}}: - select.js-select-swimlanes - each swimlanes - option(value="{{_id}}" selected="{{#if isDialogOptionSwimlaneId _id}}selected{{/if}}") {{add @index 1}}. {{title}} - - label {{_ 'lists'}}: - select.js-select-lists - each lists - option(value="{{_id}}" selected="{{#if isDialogOptionListId _id}}selected{{/if}}") {{add @index 1}}. {{title}} - - label {{_ 'card'}}: - select.js-select-cards - each cards - option(value="{{_id}}" selected="{{#if isDialogOptionCardId _id}}selected{{/if}}") {{add @index 1}}. {{title}} - - .edit-controls.clearfix - button.primary.confirm.js-done {{_ 'done'}} + +copyAndMoveChecklist template(name="moveChecklistPopup") + +copyAndMoveChecklist + +template(name="copyAndMoveChecklist") unless currentUser.isWorker label {{_ 'boards'}}: select.js-select-boards(autofocus) each boards - option(value="{{_id}}" selected="{{#if isDialogOptionBoardId _id}}selected{{/if}}") {{add @index 1}}. {{title}} + option(value="{{_id}}" selected="{{#if isDialogOptionBoardId _id}}selected{{/if}}") {{title}} label {{_ 'swimlanes'}}: select.js-select-swimlanes each swimlanes - option(value="{{_id}}" selected="{{#if isDialogOptionSwimlaneId _id}}selected{{/if}}") {{add @index 1}}. {{title}} + option(value="{{_id}}" selected="{{#if isDialogOptionSwimlaneId _id}}selected{{/if}}") {{title}} label {{_ 'lists'}}: select.js-select-lists each lists - option(value="{{_id}}" selected="{{#if isDialogOptionListId _id}}selected{{/if}}") {{add @index 1}}. {{title}} + option(value="{{_id}}" selected="{{#if isDialogOptionListId _id}}selected{{/if}}") {{title}} - label {{_ 'card'}}: + label {{_ 'cards'}}: select.js-select-cards each cards - option(value="{{_id}}" selected="{{#if isDialogOptionCardId _id}}selected{{/if}}") {{add @index 1}}. {{title}} + option(value="{{_id}}" selected="{{#if isDialogOptionCardId _id}}selected{{/if}}") {{title}} .edit-controls.clearfix button.primary.confirm.js-done {{_ 'done'}} diff --git a/client/components/cards/checklists.js b/client/components/cards/checklists.js index 15a9b9fa1..6762eab02 100644 --- a/client/components/cards/checklists.js +++ b/client/components/cards/checklists.js @@ -65,7 +65,7 @@ BlazeComponent.extendComponent({ $(self.itemsDom).sortable('option', 'disabled', !userIsMember()); if (Utils.isTouchScreenOrShowDesktopDragHandles()) { $(self.itemsDom).sortable({ - handle: 'span.checklistitem-handle', + handle: 'span.fa.checklistitem-handle', }); } } @@ -157,6 +157,14 @@ BlazeComponent.extendComponent({ textarea.focus(); }, + 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'); @@ -208,28 +216,14 @@ BlazeComponent.extendComponent({ 'submit .js-add-checklist-item': this.addChecklistItem, 'submit .js-edit-checklist-item': this.editChecklistItem, 'click .js-convert-checklist-item-to-card': Popup.open('convertChecklistItemToCard'), - 'click .js-delete-checklist-item'(event) { - const item = this.currentData().item; - const confirmFunc = Popup.afterConfirm('checklistItemDelete', function () { - if (item && item._id) { - ChecklistItems.remove(item._id); - } - }); - confirmFunc.call(this, event); - }, - 'click .js-delete-checklist'(event) { - const checklist = this.currentData().checklist; - const confirmFunc = Popup.afterConfirm('checklistDelete', function () { - Popup.back(2); - if (checklist && checklist._id) { - Checklists.remove(checklist._id); - } - }); - confirmFunc.call(this, event); - }, + 'click .js-delete-checklist-item': this.deleteItem, 'focus .js-add-checklist-item': this.focusChecklistItem, // add and delete checklist / checklist-item 'click .js-open-inlined-form': this.closeAllInlinedForms, + 'click #toggleHideFinishedChecklist'(event) { + event.preventDefault(); + this.data().card.toggleHideFinishedChecklist(); + }, keydown: this.pressKey, }, ]; @@ -281,8 +275,8 @@ BlazeComponent.extendComponent({ Template.checklists.helpers({ checklists() { const card = ReactiveCache.getCard(this.cardId); - if (!card || typeof card.checklists !== 'function') return []; - return card.checklists(); + const ret = card.checklists(); + return ret; }, }); @@ -309,16 +303,13 @@ BlazeComponent.extendComponent({ events() { return [ { - 'click .js-delete-checklist'(event) { - const checklist = this.data().checklist; - const confirmFunc = Popup.afterConfirm('checklistDelete', function () { - Popup.back(2); - if (checklist && checklist._id) { - Checklists.remove(checklist._id); - } - }); - confirmFunc.call(this, event); - }, + 'click .js-delete-checklist': Popup.afterConfirm('checklistDelete', function () { + Popup.back(2); + const checklist = this.checklist; + if (checklist && checklist._id) { + Checklists.remove(checklist._id); + } + }), 'click .js-move-checklist': Popup.open('moveChecklist'), 'click .js-copy-checklist': Popup.open('copyChecklist'), 'click .js-hide-checked-checklist-items'(event) { @@ -331,12 +322,6 @@ BlazeComponent.extendComponent({ this.data().checklist.toggleHideAllChecklistItems(); Popup.back(); }, - 'click .js-toggle-show-checklist-at-minicard'(event) { - event.preventDefault(); - const checklist = this.data().checklist; - checklist.toggleShowChecklistAtMinicard(); - Popup.back(); - }, } ] } @@ -375,7 +360,6 @@ BlazeComponent.extendComponent({ events() { return [ { - 'click .js-checklist-item .check-box-unicode': this.toggleItem, 'click .js-checklist-item .check-box-container': this.toggleItem, }, ]; @@ -390,12 +374,7 @@ BlazeComponent.extendComponent({ } setDone(cardId, options) { ReactiveCache.getCurrentUser().setMoveChecklistDialogOption(this.currentBoardId, options); - const checklist = this.data().checklist; - Meteor.call('moveChecklist', checklist._id, cardId, (error) => { - if (error) { - console.error('Error moving checklist:', error); - } - }); + this.data().checklist.move(cardId); } }).register('moveChecklistPopup'); diff --git a/client/components/cards/labels.css b/client/components/cards/labels.css index 19a8746a8..f4738a879 100644 --- a/client/components/cards/labels.css +++ b/client/components/cards/labels.css @@ -223,13 +223,9 @@ .card-label-edit-button:hover { background: #dbdbdb; } -ul.edit-labels-pop-over span.label-handle { +ul.edit-labels-pop-over span.fa.label-handle { padding-right: 10px; - display: inline-block; - width: 1.2em; - text-align: center; - color: #999; } -ul.edit-labels-pop-over span.label-handle + .card-label { +ul.edit-labels-pop-over span.fa.label-handle + .card-label { max-width: 180px; } diff --git a/client/components/cards/labels.jade b/client/components/cards/labels.jade index a32256748..d49c939d2 100644 --- a/client/components/cards/labels.jade +++ b/client/components/cards/labels.jade @@ -31,7 +31,7 @@ template(name="cardLabelsPopup") a.card-label-edit-button.js-edit-label | ✏️ if isTouchScreenOrShowDesktopDragHandles - span.label-handle(title="{{_ 'dragLabel'}}") ↕️ + span.fa.label-handle(class="fa-arrows" title="{{_ 'dragLabel'}}") span.card-label.card-label-selectable.js-select-label.card-label-wrapper(class="card-label-{{color}}" class="{{# if isLabelSelected ../_id }}active{{/if}}") +viewer diff --git a/client/components/cards/minicard.css b/client/components/cards/minicard.css index 2ef301d86..8e6158826 100644 --- a/client/components/cards/minicard.css +++ b/client/components/cards/minicard.css @@ -142,12 +142,9 @@ display: block; } } -.minicard .handle .drag-handle { +.minicard .handle .fa-arrows { font-size: clamp(16px, 3vw, 20px); color: #ccc; - display: inline-block; - width: 1.4em; - text-align: center; } .minicard .minicard-title .card-number { color: #b3b3b3; @@ -300,6 +297,19 @@ background-color: #1976d2 !important; } +/* Font Awesome icons in minicard dates */ +.minicard .card-date i.fa { + margin-right: 0.3vw; + font-size: 0.9em; + vertical-align: middle; +} + +/* Font Awesome icons in minicard spent time */ +.minicard .card-time i.fa { + margin-right: 0.3vw; + font-size: 0.9em; + vertical-align: middle; +} .minicard .badges { float: left; margin-top: 1vh; @@ -731,80 +741,7 @@ gap: 0.3vw; } -/* Checklist display on minicard */ -.minicard-checklist { - width: 100%; - margin-top: 0.5vh; - margin-bottom: 0.5vh; - padding: 0.3vh 0.5vw; - background-color: rgba(255, 255, 255, 0.8); - border-radius: 0.3vw; - border: 1px solid #e0e0e0; -} - -.minicard-checklist .checklist-header { - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: 0.3vh; -} - -.minicard-checklist .checklist-title { +.minicard-list-name i.fa { font-size: 0.8em; - font-weight: bold; - color: #4d4d4d; - flex: 1; -} - -.minicard-checklist .checklist-menu { - font-size: 1.2em; - color: #666; - cursor: pointer; - padding: 0 0.3vw; - border-radius: 0.2vw; - transition: background-color 0.2s; -} - -.minicard-checklist .checklist-menu:hover { - background-color: rgba(0, 0, 0, 0.1); -} - -.minicard-checklist .checklist-item { - font-size: 0.75em; - color: #666; - margin-bottom: 0.2vh; - display: flex; - align-items: flex-start; - gap: 0.3vw; - line-height: 1.2; - cursor: pointer; - padding: 0.2vh 0; - border-radius: 0.2vw; - transition: background-color 0.2s; -} - -.minicard-checklist .checklist-item:hover { - background-color: rgba(0, 0, 0, 0.05); -} - -.minicard-checklist .checklist-item.is-checked { - text-decoration: line-through; - color: #999; -} - -.minicard-checklist .checklist-item .check-box-unicode { - flex-shrink: 0; - font-size: 0.8em; - margin-top: 0.1vh; - transition: transform 0.2s; -} - -.minicard-checklist .checklist-item:hover .check-box-unicode { - transform: scale(1.1); -} - -.minicard-checklist .checklist-item .item-title { - flex: 1; - word-wrap: break-word; - overflow-wrap: break-word; + opacity: 0.7; } diff --git a/client/components/cards/minicard.jade b/client/components/cards/minicard.jade index ccb546476..43c8db9bd 100644 --- a/client/components/cards/minicard.jade +++ b/client/components/cards/minicard.jade @@ -5,7 +5,6 @@ template(name="minicard") class="{{#if colorClass}}minicard-{{colorClass}}{{/if}}") if canModifyCard a.minicard-details-menu-with-handle.js-open-minicard-details-menu(title="{{_ 'cardDetailsActionsPopup-title'}}") ☰ - if canMoveCard .handle | ↕️ .dates @@ -142,7 +141,7 @@ template(name="minicard") if canModifyCard if comments.length .badge(title="{{_ 'card-comments-title' comments.length }}") - span.badge-icon.badge-comment.badge-text 💬 + span.badge-icon.badge-comment.badge-text | 💬 = ' ' = comments.length //span.badge-comment.badge-text @@ -150,36 +149,37 @@ template(name="minicard") if getDescription unless currentBoard.allowsDescriptionTextOnMinicard .badge.badge-state-image-only(title=getDescription) - span.badge-icon 📝 + span.badge-icon | 📝 if getVoteQuestion .badge.badge-state-image-only(title=getVoteQuestion) - span.badge-icon(class="{{#if voteState}}text-green{{/if}}") 👍 + span.badge-icon(class="{{#if voteState}}text-green{{/if}}") | 👍 span.badge-text {{ voteCountPositive }} - span.badge-icon(class="{{#if $eq voteState false}}text-red{{/if}}") 👎 + span.badge-icon(class="{{#if $eq voteState false}}text-red{{/if}}") | 👎 span.badge-text {{ voteCountNegative }} if getPokerQuestion .badge.badge-state-image-only(title=getPokerQuestion) - span.badge-icon(class="{{#if pokerState}}text-green{{/if}}") ✅ + span.badge-icon(class="{{#if pokerState}}text-green{{/if}}") | ✅ if expiredPoker span.badge-text {{ getPokerEstimation }} if attachments.length if currentBoard.allowsBadgeAttachmentOnMinicard .badge - span.badge-icon 📎 + span.badge-icon | 📎 span.badge-text= attachments.length + if checklists.length + .badge(class="{{#if checklistFinished}}is-finished{{/if}}") + span.badge-icon | ☑️ + span.badge-text.check-list-text {{checklistFinishedCount}}/{{checklistItemCount}} if allSubtasks.count .badge - span.badge-icon 🌐 + span.badge-icon | 🌐 span.badge-text.check-list-text {{subtasksFinishedCount}}/{{allSubtasksCount}} //{{subtasksFinishedCount}}/{{subtasksCount}} does not work because when a subtaks is archived, the count goes down if currentBoard.allowsCardSortingByNumber if currentBoard.allowsCardSortingByNumberOnMinicard .badge - span.badge-icon 🔢 + span.badge-icon | 🔢 span.badge-text.check-list-sort {{ sort }} - if shouldShowChecklistAtMinicard - each shouldShowChecklistAtMinicard - +minicardChecklist(checklist=. card=..) if currentBoard.allowsDescriptionTextOnMinicard if getDescription .minicard-description @@ -201,12 +201,55 @@ template(name="editCardSortOrderPopup") .edit-controls.clearfix button.primary.confirm.js-submit-edit-card-sort-popup(type="submit") {{_ 'save'}} -template(name="minicardChecklist") - .minicard-checklist - .checklist-header - .checklist-title= checklist.title - if canModifyCard - a.checklist-menu.js-open-checklist-menu(title="{{_ 'checklistActionsPopup-title'}}") ☰ - each visibleItems - +checklistItemDetail(item = . checklist = checklist card = card) +template(name="minicardDetailsActionsPopup") + ul.pop-over-list + if canModifyCard + li + a.js-move-card + | ➡️ + | {{_ 'moveCardPopup-title'}} + li + a.js-copy-card + | 📋 + | {{_ 'copyCardPopup-title'}} + hr + li + a.js-archive + | ➡️ + | 📦 + | {{_ 'archive-card'}} + hr + li + a.js-move-card-to-top + | ⬆️ + | {{_ 'moveCardToTop-title'}} + li + a.js-move-card-to-bottom + | ⬇️ + | {{_ 'moveCardToBottom-title'}} + hr + li + a.js-add-labels + | 🏷️ + | {{_ 'card-edit-labels'}} + li + a.js-due-date + | 📥 + | {{_ 'editCardDueDatePopup-title'}} + li + a.js-set-card-color + | 🎨 + | {{_ 'setCardColorPopup-title'}} + li + a.js-link + | 🔗 + | {{_ 'link-card'}} + li + a.js-toggle-watch-card + if isWatching + | 👁️ + | {{_ 'unwatch'}} + else + | 👁️-slash + | {{_ 'watch'}} diff --git a/client/components/cards/minicard.js b/client/components/cards/minicard.js index 194f37ee9..91ebddc8c 100644 --- a/client/components/cards/minicard.js +++ b/client/components/cards/minicard.js @@ -91,13 +91,6 @@ BlazeComponent.extendComponent({ } }, - toggleChecklistItem() { - const item = this.currentData(); - if (item && item._id) { - item.toggleItem(); - } - }, - events() { return [ { @@ -115,7 +108,7 @@ BlazeComponent.extendComponent({ }, 'click span.badge-icon.fa.fa-sort, click span.badge-text.check-list-sort' : Popup.open("editCardSortOrder"), 'click .minicard-labels' : this.cardLabelsPopup, - 'click .js-open-minicard-details-menu': Popup.open('cardDetailsActions'), + 'click .js-open-minicard-details-menu': Popup.open('minicardDetailsActions'), // Drag and drop file upload handlers 'dragover .minicard'(event) { // Only prevent default for file drags to avoid interfering with sortable @@ -177,43 +170,6 @@ BlazeComponent.extendComponent({ }, }).register('minicard'); -BlazeComponent.extendComponent({ - template() { - return 'minicardChecklist'; - }, - - events() { - return [ - { - 'click .js-open-checklist-menu'(event) { - const data = this.currentData(); - const checklist = data.checklist || data; - const card = data.card || this.data(); - const context = { currentData: () => ({ checklist, card }) }; - Popup.open('checklistActions').call(context, event); - }, - }, - ]; - }, - - visibleItems() { - const checklist = this.currentData().checklist || this.currentData(); - const items = checklist.items(); - - return items.filter(item => { - // Hide finished items if hideCheckedChecklistItems is true - if (item.isFinished && checklist.hideCheckedChecklistItems) { - return false; - } - // Hide all items if hideAllChecklistItems is true - if (checklist.hideAllChecklistItems) { - return false; - } - return true; - }); - }, -}).register('minicardChecklist'); - Template.minicard.helpers({ hiddenMinicardLabelText() { const currentUser = ReactiveCache.getCurrentUser(); @@ -253,29 +209,9 @@ Template.minicard.helpers({ // Show list name if either: // 1. Board-wide setting is enabled, OR // 2. This specific card has the setting enabled - const currentBoard = this.board(); + const currentBoard = this.currentBoard; if (!currentBoard) return false; return currentBoard.allowsShowListsOnMinicard || this.showListOnMinicard; - }, - - shouldShowChecklistAtMinicard() { - // Return checklists that should be shown on minicard - const currentBoard = this.board(); - if (!currentBoard) return []; - - const checklists = this.checklists(); - const visibleChecklists = []; - - checklists.forEach(checklist => { - // Show checklist if either: - // 1. Board-wide setting is enabled, OR - // 2. This specific checklist has the setting enabled - if (currentBoard.allowsChecklistAtMinicard || checklist.showChecklistAtMinicard) { - visibleChecklists.push(checklist); - } - }); - - return visibleChecklists; } }); @@ -306,7 +242,7 @@ BlazeComponent.extendComponent({ } }).register('editCardSortOrderPopup'); -Template.cardDetailsActionsPopup.events({ +Template.minicardDetailsActionsPopup.events({ 'click .js-due-date': Popup.open('editCardDueDate'), 'click .js-move-card': Popup.open('moveCard'), 'click .js-copy-card': Popup.open('copyCard'), diff --git a/client/components/cards/resultCard.jade b/client/components/cards/resultCard.jade index 5259f8ecc..f2bd16657 100644 --- a/client/components/cards/resultCard.jade +++ b/client/components/cards/resultCard.jade @@ -11,7 +11,7 @@ template(name="resultCard") = getBoard.title else .broken-cards-null - | {{_ 'no-name'}} + | NULL if getBoard.archived | 📦 li.result-card-context.result-card-context-separator @@ -25,7 +25,7 @@ template(name="resultCard") = getSwimlane.title else .broken-cards-null - | {{_ 'no-name'}} + | NULL if getSwimlane.archived | 📦 li.result-card-context.result-card-context-separator @@ -39,6 +39,6 @@ template(name="resultCard") = getList.title else .broken-cards-null - | {{_ 'no-name'}} + | NULL if getList.archived | 📦 diff --git a/client/components/cards/subtasks.css b/client/components/cards/subtasks.css index ba89ad2b0..08f5122c2 100644 --- a/client/components/cards/subtasks.css +++ b/client/components/cards/subtasks.css @@ -87,15 +87,6 @@ textarea.js-edit-subtask-item { top: 0; bottom: -600px; right: 0; - z-index: 15; -} - -/* Fix for mobile Safari: ensure this doesn't block card interaction */ -@media screen and (max-width: 800px) { - #card-details-overlay { - z-index: 15; - pointer-events: none; - } } .subtasks { background: #f7f7f7; @@ -136,25 +127,6 @@ textarea.js-edit-subtask-item { border-bottom: 2px solid #3cb500; border-right: 2px solid #3cb500; } -/* Unicode checkbox icons styling */ -.subtasks-item .check-box-unicode { - font-size: 1.3em; - margin-right: 8px; - cursor: pointer; - display: inline-block; - vertical-align: middle; - line-height: 1; -} -/* Grey checkmarks when grey icons setting is enabled */ -body.grey-icons-enabled .subtasks-item .check-box.is-checked { - border-bottom: 2px solid #7a7a7a; - border-right: 2px solid #7a7a7a; -} -body.grey-icons-enabled .subtasks-item .check-box-unicode { - filter: grayscale(100%); - -webkit-filter: grayscale(100%); - opacity: 0.85; -} .subtasks-item .item-title { flex: 1; padding-left: 10px; diff --git a/client/components/cards/subtasks.jade b/client/components/cards/subtasks.jade index 987235f2a..ceb860e6e 100644 --- a/client/components/cards/subtasks.jade +++ b/client/components/cards/subtasks.jade @@ -74,12 +74,12 @@ template(name="subtasksItems") template(name='subtaskItemDetail') .js-subtasks-item.subtasks-item if canModifyCard - span.check-box-unicode {{#if item.isFinished }}✅{{else}}⬜{{/if}} + .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}}") +viewer = item.title else - span.check-box-unicode {{#if item.isFinished }}✅{{else}}⬜{{/if}} + .materialCheckBox(class="{{#if item.isFinished }}is-checked{{/if}}") .item-title(class="{{#if item.isFinished }}is-checked{{/if}}") +viewer = item.title diff --git a/client/components/cards/subtasks.js b/client/components/cards/subtasks.js index d1c390883..af5654802 100644 --- a/client/components/cards/subtasks.js +++ b/client/components/cards/subtasks.js @@ -104,19 +104,7 @@ BlazeComponent.extendComponent({ }).register('subtasks'); BlazeComponent.extendComponent({ - toggleItem() { - const item = this.currentData().item; - if (item && item._id) { - item.toggleItem(); - } - }, - events() { - return [ - { - 'click .js-subtasks-item .check-box-unicode': this.toggleItem, - }, - ]; - }, + // ... }).register('subtaskItemDetail'); BlazeComponent.extendComponent({ diff --git a/client/components/common/originalPosition.html b/client/components/common/originalPosition.html index 0dc9e953b..3e3191e27 100644 --- a/client/components/common/originalPosition.html +++ b/client/components/common/originalPosition.html @@ -2,17 +2,19 @@
{{#if isLoading}}
- ⏳ Loading original position... + Loading original position...
{{else if showOriginalPosition}}
{{#if hasMovedFromOriginal}}
- ℹ️ {{getOriginalPositionDescription}} + + {{getOriginalPositionDescription}}
{{else}}
- ✅ In original position + + In original position
{{/if}} diff --git a/client/components/forms/forms.css b/client/components/forms/forms.css index f2fd7fbc4..3b1566514 100644 --- a/client/components/forms/forms.css +++ b/client/components/forms/forms.css @@ -315,18 +315,11 @@ textarea::-moz-placeholder { margin-right: 6px; border-top: 2px solid transparent; border-left: 2px solid transparent; - border-bottom: 2px solid #3cb500; - border-right: 2px solid #3cb500; transform: rotate(40deg); -webkit-backface-visibility: hidden; backface-visibility: hidden; transform-origin: 100% 100%; } -/* Grey checkmarks when grey icons setting is enabled */ -body.grey-icons-enabled .materialCheckBox.is-checked { - border-bottom: 2px solid #7a7a7a; - border-right: 2px solid #7a7a7a; -} .button-link { background: #fff; background: linear-gradient(#fff, #f5f5f5); diff --git a/client/components/gantt/gantt.css b/client/components/gantt/gantt.css deleted file mode 100644 index 81139f07b..000000000 --- a/client/components/gantt/gantt.css +++ /dev/null @@ -1,203 +0,0 @@ -/* Gantt chart cell background colors for Received, Start, Due, End (matching cardDetails) */ -.ganttview-received { - background-color: #dbdbdb !important; - color: #000 !important; - font-size: 18px !important; - font-weight: bold !important; -} -.ganttview-start { - background-color: #90ee90 !important; - color: #000 !important; - font-size: 18px !important; - font-weight: bold !important; -} -.ganttview-due { - background-color: #ffd700 !important; - color: #000 !important; - font-size: 18px !important; - font-weight: bold !important; -} -.ganttview-end { - background-color: #ffb3b3 !important; - color: #000 !important; - font-size: 18px !important; - font-weight: bold !important; -} -/* Gantt View Styles */ - -.gantt-view { - width: 100%; - height: auto; - overflow: visible; - background-color: #fff; -} - -.gantt-view.swimlane { - background-color: #fff; - padding: 10px; -} - -.gantt-container { - overflow-x: auto; - overflow-y: visible; - background-color: #fff; - display: block; - width: 100%; -} - -.gantt-container table, -.gantt-table { - border-collapse: collapse; - width: 100%; - min-width: 800px; - border: 2px solid #666; - font-family: sans-serif; - font-size: 13px; - background-color: #fff; -} - -.gantt-container thead { - background-color: #e8e8e8; - border-bottom: 2px solid #666; - font-weight: bold; - position: sticky; - top: 0; - z-index: 10; -} - -.gantt-container thead th, -.gantt-container thead tr > td:first-child { - border-right: 2px solid #666; - padding: 4px; /* half of 8px */ - width: 100px; /* half of 200px */ - text-align: left; - font-weight: bold; - background-color: #e8e8e8; - min-width: 100px; /* half of 200px */ -} - -.gantt-container thead td { - border-right: 1px solid #999; - padding: 2px 1px; /* half */ - text-align: center; - background-color: #f5f5f5; - font-size: 11px; - min-width: 15px; /* half of 30px */ - font-weight: bold; - height: auto; - line-height: 1.2; - white-space: normal; - word-break: break-word; -} - -.gantt-container tbody tr { - border-bottom: 1px solid #999; - height: 32px; -} - -.gantt-container tbody tr:hover { - background-color: #f9f9f9; -} - -.gantt-container tbody tr:hover td { - background-color: #f9f9f9 !important; -} - -.gantt-container tbody td { - border-right: 1px solid #ccc; - padding: 1px; /* half */ - text-align: center; - min-width: 15px; /* half of 30px */ - height: 32px; - vertical-align: middle; - line-height: 28px; - background-color: #ffffff; - font-size: 18px; - font-weight: bold; -} - -.gantt-container tbody td:nth-child(even) { - background-color: #fafafa; -} - -.gantt-container tbody td:first-child { - border-right: 2px solid #666; - padding: 4px; /* half of 8px */ - font-weight: 500; - cursor: pointer; - background-color: #fafafa !important; - text-align: left; - width: 100px; /* half of 200px */ - min-width: 100px; /* half of 200px */ - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - height: auto; - line-height: normal; -} - -.gantt-container tbody td:first-child:hover { - background-color: #f0f0f0 !important; - text-decoration: underline; -} - -.js-gantt-task-cell { - cursor: pointer; -} - -.js-gantt-date-icon { - cursor: pointer; -} - -.gantt-container .ganttview-weekend { - background-color: #efefef; -} - -.gantt-container .ganttview-today { - background-color: #fcf8e3; - border-right: 2px solid #ffb347; -} - -/* Task bar styling - VERY VISIBLE */ -.gantt-container tbody td.ganttview-block { - background-color: #4CAF50 !important; - color: #fff !important; - font-size: 18px !important; - font-weight: bold !important; - padding: 2px !important; - border-radius: 2px; -} - -/* Responsive adjustments */ -@media (max-width: 768px) { - .gantt-container table { - font-size: 11px; - } - - .gantt-container thead td { - min-width: 20px; - padding: 2px; - } - - .gantt-container tbody td { - min-width: 20px; - padding: 1px; - height: 20px; - } - - .gantt-container tbody td:first-child { - width: 100px; - font-size: 12px; - } -} - -/* Print styles */ -@media print { - .gantt-container { - overflow: visible; - } - - .gantt-container table { - page-break-inside: avoid; - } -} diff --git a/client/components/gantt/gantt.jade b/client/components/gantt/gantt.jade deleted file mode 100644 index cf841ed2e..000000000 --- a/client/components/gantt/gantt.jade +++ /dev/null @@ -1,27 +0,0 @@ -//- Gantt Chart View Template -template(name="ganttView") - link(rel="stylesheet" href="/client/components/gantt/gantt.css") - link(rel="stylesheet" href="/client/components/gantt/ganttCard.css") - .gantt-view - h2 {{_ 'board-view-gantt'}} - if hasSelectedCard - +ganttCard(selectedCard) - each weeks - table.gantt-table - thead - tr - th {{_ 'task'}} {{_ 'predicate-week'}} {{week}} - each weekDays this - th - | {{formattedDate .}} {{weekdayLabel .}} - tbody - each cardsInWeek this - tr(data-card-id="{{cardId .}}") - td.js-gantt-task-cell - a.js-gantt-card-title(href="#") - +viewer - | {{cardTitle .}} - each weekDays .. - td(class="{{cellClasses .. .}}" data-card-id="{{cardId ..}}" data-date-type="{{cellContentClass .. .}}") - | {{cellContent .. .}} - diff --git a/client/components/gantt/gantt.js b/client/components/gantt/gantt.js deleted file mode 100644 index d10560dea..000000000 --- a/client/components/gantt/gantt.js +++ /dev/null @@ -1,217 +0,0 @@ -// Add click handler to ganttView for card titles -Template.ganttView.events({ - 'click .js-gantt-card-title'(event, template) { - event.preventDefault(); - // Get card ID from the closest row's data attribute - const $row = template.$(event.currentTarget).closest('tr'); - const cardId = $row.data('card-id'); - - if (cardId) { - template.selectedCardId.set(cardId); - } - }, -}); -import { Template } from 'meteor/templating'; - -// Blaze template helpers for ganttView -function getISOWeekInfo(d) { - const date = new Date(Date.UTC(d.getFullYear(), d.getMonth(), d.getDate())); - const dayNum = date.getUTCDay() || 7; - date.setUTCDate(date.getUTCDate() + 4 - dayNum); - const yearStart = new Date(Date.UTC(date.getUTCFullYear(), 0, 1)); - const week = Math.ceil((((date - yearStart) / 86400000) + 1) / 7); - return { year: date.getUTCFullYear(), week }; -} -function startOfISOWeek(d) { - const date = new Date(d); - const day = date.getDay() || 7; - if (day !== 1) date.setDate(date.getDate() - (day - 1)); - date.setHours(0,0,0,0); - return date; -} - -Template.ganttView.helpers({ - weeks() { - const board = Utils.getCurrentBoard(); - if (!board) return []; - const cards = Cards.find({ boardId: board._id }, { sort: { startAt: 1, dueAt: 1 } }).fetch(); - const weeksMap = new Map(); - const relevantCards = cards.filter(c => c.receivedAt || c.startAt || c.dueAt || c.endAt); - relevantCards.forEach(card => { - ['receivedAt','startAt','dueAt','endAt'].forEach(field => { - if (card[field]) { - const dt = new Date(card[field]); - const info = getISOWeekInfo(dt); - const key = `${info.year}-W${info.week}`; - if (!weeksMap.has(key)) { - weeksMap.set(key, { year: info.year, week: info.week, start: startOfISOWeek(dt) }); - } - } - }); - }); - return Array.from(weeksMap.values()).sort((a,b) => a.start - b.start); - }, - weekDays(week) { - const weekStart = new Date(week.start); - return Array.from({length:7}, (_,i) => { - const d = new Date(weekStart); - d.setDate(d.getDate() + i); - d.setHours(0,0,0,0); - return d; - }); - }, - weekdayLabel(day) { - const weekdayKeys = ['monday','tuesday','wednesday','thursday','friday','saturday','sunday']; - return TAPi18n.__(weekdayKeys[day.getDay() === 0 ? 6 : day.getDay() - 1]); - }, - formattedDate(day) { - const currentUser = ReactiveCache.getCurrentUser && ReactiveCache.getCurrentUser(); - const dateFormat = currentUser ? currentUser.getDateFormat() : 'YYYY-MM-DD'; - return formatDateByUserPreference(day, dateFormat, false); - }, - cardsInWeek(week) { - const board = Utils.getCurrentBoard(); - if (!board) return []; - const cards = Cards.find({ boardId: board._id }).fetch(); - return cards.filter(card => { - return ['receivedAt','startAt','dueAt','endAt'].some(field => { - if (card[field]) { - const dt = new Date(card[field]); - const info = getISOWeekInfo(dt); - return info.week === week.week && info.year === week.year; - } - return false; - }); - }); - }, - cardTitle(card) { - return card.title; - }, - cardId(card) { - return card._id; - }, - cardUrl(card) { - if (!card) return '#'; - const board = ReactiveCache.getBoard(card.boardId); - if (!board) return '#'; - return FlowRouter.path('card', { - boardId: card.boardId, - slug: board.slug, - cardId: card._id, - }); - }, - cellContentClass(card, day) { - const cardDates = { - receivedAt: card.receivedAt ? new Date(card.receivedAt) : null, - startAt: card.startAt ? new Date(card.startAt) : null, - dueAt: card.dueAt ? new Date(card.dueAt) : null, - endAt: card.endAt ? new Date(card.endAt) : null, - }; - if (cardDates.receivedAt && cardDates.receivedAt.toDateString() === day.toDateString()) return 'ganttview-received'; - if (cardDates.startAt && cardDates.startAt.toDateString() === day.toDateString()) return 'ganttview-start'; - if (cardDates.dueAt && cardDates.dueAt.toDateString() === day.toDateString()) return 'ganttview-due'; - if (cardDates.endAt && cardDates.endAt.toDateString() === day.toDateString()) return 'ganttview-end'; - return ''; - }, - cellContent(card, day) { - const cardDates = { - receivedAt: card.receivedAt ? new Date(card.receivedAt) : null, - startAt: card.startAt ? new Date(card.startAt) : null, - dueAt: card.dueAt ? new Date(card.dueAt) : null, - endAt: card.endAt ? new Date(card.endAt) : null, - }; - if (cardDates.receivedAt && cardDates.receivedAt.toDateString() === day.toDateString()) return '📥'; - if (cardDates.startAt && cardDates.startAt.toDateString() === day.toDateString()) return '🚀'; - if (cardDates.dueAt && cardDates.dueAt.toDateString() === day.toDateString()) return '⏰'; - if (cardDates.endAt && cardDates.endAt.toDateString() === day.toDateString()) return '🏁'; - return ''; - }, - isToday(day) { - const today = new Date(); - return day.toDateString() === today.toDateString(); - }, - isWeekend(day) { - const idx = day.getDay(); - return idx === 0 || idx === 6; - }, - hasSelectedCard() { - return Template.instance().selectedCardId.get() !== null; - }, - selectedCard() { - const cardId = Template.instance().selectedCardId.get(); - return cardId ? ReactiveCache.getCard(cardId) : null; - }, - cellClasses(card, day) { - // Get the base class from cellContentClass logic - const cardDates = { - receivedAt: card.receivedAt ? new Date(card.receivedAt) : null, - startAt: card.startAt ? new Date(card.startAt) : null, - dueAt: card.dueAt ? new Date(card.dueAt) : null, - endAt: card.endAt ? new Date(card.endAt) : null, - }; - let classes = ''; - if (cardDates.receivedAt && cardDates.receivedAt.toDateString() === day.toDateString()) classes = 'ganttview-received'; - else if (cardDates.startAt && cardDates.startAt.toDateString() === day.toDateString()) classes = 'ganttview-start'; - else if (cardDates.dueAt && cardDates.dueAt.toDateString() === day.toDateString()) classes = 'ganttview-due'; - else if (cardDates.endAt && cardDates.endAt.toDateString() === day.toDateString()) classes = 'ganttview-end'; - - // Add conditional classes - const today = new Date(); - if (day.toDateString() === today.toDateString()) classes += ' ganttview-today'; - const idx = day.getDay(); - if (idx === 0 || idx === 6) classes += ' ganttview-weekend'; - if (classes.trim()) classes += ' js-gantt-date-icon'; - - return classes.trim(); - } -}); - -Template.ganttView.onCreated(function() { - this.selectedCardId = new ReactiveVar(null); - // Provide properties expected by cardDetails component - this.showOverlay = new ReactiveVar(false); - this.mouseHasEnterCardDetails = false; -}); - -// Blaze onRendered logic for ganttView -Template.ganttView.onRendered(function() { - const self = this; - this.autorun(() => { - // If you have legacy imperative rendering, keep it here - if (typeof renderGanttChart === 'function') { - renderGanttChart(); - } - }); - // Add click handler for date cells (Received, Start, Due, End) - this.$('.gantt-table').on('click', '.js-gantt-date-icon', function(e) { - e.preventDefault(); - e.stopPropagation(); - const $cell = self.$(this); - const cardId = $cell.data('card-id'); - let dateType = $cell.data('date-type'); - // Remove 'ganttview-' prefix to match popup map - if (typeof dateType === 'string' && dateType.startsWith('ganttview-')) { - dateType = dateType.replace('ganttview-', ''); - } - const popupMap = { - received: 'editCardReceivedDate', - start: 'editCardStartDate', - due: 'editCardDueDate', - end: 'editCardEndDate', - }; - const popupName = popupMap[dateType]; - if (!popupName || typeof Popup === 'undefined' || typeof Popup.open !== 'function') return; - const card = ReactiveCache.getCard(cardId); - if (!card) return; - const openFn = Popup.open(popupName); - openFn.call({ currentData: () => card }, e, { dataContextIfCurrentDataIsUndefined: card }); - }); - -}); - -import markdownit from 'markdown-it'; -import { TAPi18n } from '/imports/i18n'; -import { formatDateByUserPreference } from '/imports/lib/dateUtils'; -import { ReactiveCache } from '/imports/reactiveCache'; - -const md = markdownit({ breaks: true, linkify: true }); diff --git a/client/components/gantt/ganttCard.css b/client/components/gantt/ganttCard.css deleted file mode 100644 index d43c5ee93..000000000 --- a/client/components/gantt/ganttCard.css +++ /dev/null @@ -1,47 +0,0 @@ -.gantt-card-wrapper { - background: white; - border: 1px solid #ddd; - border-radius: 5px; - margin: 1rem 0; - padding: 1rem; - box-shadow: 0 2px 4px rgba(0,0,0,0.1); -} - -.gantt-card-header { - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: 1rem; - border-bottom: 1px solid #eee; - padding-bottom: 0.5rem; -} - -.gantt-card-header h3 { - margin: 0; - color: #333; -} - -.close-button { - background: none; - border: none; - font-size: 1.5rem; - cursor: pointer; - color: #666; - padding: 0; - width: 30px; - height: 30px; - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; -} - -.close-button:hover { - background-color: #f0f0f0; - color: #333; -} - -.gantt-card-content { - max-height: 400px; - overflow-y: auto; -} \ No newline at end of file diff --git a/client/components/gantt/ganttCard.jade b/client/components/gantt/ganttCard.jade deleted file mode 100644 index cbe2474ef..000000000 --- a/client/components/gantt/ganttCard.jade +++ /dev/null @@ -1,2 +0,0 @@ -template(name="ganttCard") - +cardDetails(selectedCard) \ No newline at end of file diff --git a/client/components/gantt/ganttCard.js b/client/components/gantt/ganttCard.js deleted file mode 100644 index 285670751..000000000 --- a/client/components/gantt/ganttCard.js +++ /dev/null @@ -1,45 +0,0 @@ -BlazeComponent.extendComponent({ - onCreated() { - // Provide the expected parent component properties for cardDetails - this.showOverlay = new ReactiveVar(false); - this.mouseHasEnterCardDetails = false; - }, - - selectedCard() { - // The selected card is now passed as a parameter to the component - return this.currentData(); - }, - - events() { - return [ - { - 'click .js-close-card-details'(event) { - event.preventDefault(); - // Find the ganttView template instance and clear selectedCardId - let view = Blaze.currentView; - while (view) { - if (view.templateInstance && view.templateInstance().selectedCardId) { - view.templateInstance().selectedCardId.set(null); - break; - } - view = view.parentView; - } - }, - }, - ]; - }, -}).register('ganttCard'); - -// Add click handler to ganttView for card titles -Template.ganttView.events({ - 'click .js-gantt-card-title'(event, template) { - event.preventDefault(); - // Get card ID from the closest row's data attribute - const $row = template.$(event.currentTarget).closest('tr'); - const cardId = $row.data('card-id'); - - if (cardId) { - template.selectedCardId.set(cardId); - } - }, -}); \ No newline at end of file diff --git a/client/components/import/import.jade b/client/components/import/import.jade index 18039c7f5..7b55dadbd 100644 --- a/client/components/import/import.jade +++ b/client/components/import/import.jade @@ -1,7 +1,7 @@ template(name="importHeaderBar") h1 a.back-btn(href="{{pathFor 'home'}}") - | ⬅️ + i.fa.fa-chevron-left | {{_ title}} template(name="import") @@ -36,7 +36,7 @@ template(name="importMapMembers") +userAvatar(userId=wekanId) else a.member.add-member - | ➕ + i.fa.fa-plus //- Due to the way the flewbox layout is working, we need to set some invisible items so that the last row items have a consistent width. @@ -56,17 +56,17 @@ template(name="importMapMembersAddPopup") p | {{_ 'import-user-select'}} .js-map-member - input.js-search-member-input(type="text" placeholder="{{_ 'search-users'}}") + +EasySearch.Input(index=searchIndex) ul.pop-over-list - each searchResults + +EasySearch.Each(index=searchIndex) li.item.js-member-item - a.name.js-select-import(title="{{profile.fullname}} ({{username}})" data-id="{{_id}}") - +userAvatar(userId=_id) + a.name.js-select-import(title="{{profile.fullname}} ({{username}})" data-id="{{__originalId}}") + +userAvatar(userId=__originalId) span.full-name = profile.fullname | ({{username}}) - if searching.get + +EasySearch.IfSearching(index=searchIndex) +spinner - if noResults.get + +EasySearch.IfNoResults(index=searchIndex) .manage-member-section p.quiet {{_ 'no-results'}} diff --git a/client/components/import/import.js b/client/components/import/import.js index 757b55e41..4d4ba7fa7 100644 --- a/client/components/import/import.js +++ b/client/components/import/import.js @@ -311,73 +311,6 @@ BlazeComponent.extendComponent({ }, }).register('importMapMembersAddPopup'); -// Global reactive variables for import member popup -const importMemberPopupState = { - searching: new ReactiveVar(false), - searchResults: new ReactiveVar([]), - noResults: new ReactiveVar(false), - searchTimeout: null -}; - -BlazeComponent.extendComponent({ - onCreated() { - // Use global state - this.searching = importMemberPopupState.searching; - this.searchResults = importMemberPopupState.searchResults; - this.noResults = importMemberPopupState.noResults; - this.searchTimeout = importMemberPopupState.searchTimeout; - }, - - onRendered() { - this.find('.js-search-member-input').focus(); - }, - - performSearch(query) { - if (!query || query.length < 2) { - this.searchResults.set([]); - this.noResults.set(false); - return; - } - - this.searching.set(true); - this.noResults.set(false); - - const results = UserSearchIndex.search(query, { limit: 20 }).fetch(); - this.searchResults.set(results); - this.searching.set(false); - - if (results.length === 0) { - this.noResults.set(true); - } - }, - - events() { - return [ - { - 'keyup .js-search-member-input'(event) { - const query = event.target.value.trim(); - - if (this.searchTimeout) { - clearTimeout(this.searchTimeout); - } - - this.searchTimeout = setTimeout(() => { - this.performSearch(query); - }, 300); - }, - }, - ]; - }, -}).register('importMapMembersAddPopupSearch'); - Template.importMapMembersAddPopup.helpers({ - searchResults() { - return importMemberPopupState.searchResults.get(); - }, - searching() { - return importMemberPopupState.searching; - }, - noResults() { - return importMemberPopupState.noResults; - } + searchIndex: () => UserSearchIndex, }) diff --git a/client/components/lists/list.css b/client/components/lists/list.css index 5e916ffcb..7c238efcd 100644 --- a/client/components/lists/list.css +++ b/client/components/lists/list.css @@ -282,7 +282,7 @@ body.list-resizing-active * { margin: 0 auto; } .list.list-collapsed .list-header .js-collapse { - margin: 0 auto 0 auto; + margin: 0 auto 20px auto; z-index: 10; padding: 8px 12px; font-size: 12px; @@ -290,12 +290,6 @@ body.list-resizing-active * { display: block; width: fit-content; } -.list.list-collapsed .list-header .list-header-handle { - position: absolute !important; - top: 30px !important; - right: 1.5vw !important; - z-index: 15 !important; -} .list.list-collapsed .list-header .list-rotated { width: auto !important; height: auto !important; @@ -303,6 +297,7 @@ body.list-resizing-active * { position: relative !important; overflow: visible !important; } + .list.list-collapsed .list-header .list-rotated h2.list-header-name { text-align: left; overflow: visible; @@ -313,15 +308,15 @@ body.list-resizing-active * { color: #333; background-color: rgba(255, 255, 255, 0.95); border: 1px solid #ddd; - padding: 0; + padding: 8px 4px; border-radius: 4px; - margin: 0; - width: 100vh; - height: 30px; + margin: 0 auto; + width: 25vh; + height: 60vh; position: absolute; - left: 40px; + left: 50%; top: 50%; - transform: translateY(calc(-50% + 20px)) rotate(0deg); + transform: translate(calc(-50% + 50px), -50%) rotate(0deg); z-index: 10; visibility: visible !important; opacity: 1 !important; @@ -373,18 +368,6 @@ body.list-resizing-active * { text-overflow: ellipsis; word-wrap: break-word; } -/* Sum badge shown before list title */ -.list-header .list-sum-badge { - display: inline-block; - margin-right: 8px; - padding: 0; - border-radius: 0; - background: transparent; - color: #8c8c8c; - font-weight: bold; - font-size: 12px; - vertical-align: middle; -} .list-rotated { width: 1.3vw; height: 35vh; @@ -395,6 +378,9 @@ body.list-resizing-active * { position: relative; text-overflow: ellipsis; white-space: nowrap; +} +.list-header .list-rotated { + } .list-header .list-header-watch-icon { padding-left: 10px; @@ -420,42 +406,22 @@ body.list-resizing-active * { color: #a6a6a6; margin-right: 15px; } -/* List header collapse button styling */ -.list-header .list-header-collapse-container { - display: flex; - flex-direction: row; - align-items: flex-start; - gap: 10px; - flex: 1; - min-width: 0; -} - .list-header .js-collapse { color: #a6a6a6; + margin-right: 15px; display: inline-block; vertical-align: middle; padding: 5px 8px; - border: none; - border-radius: 0; - background-color: transparent; + border: 1px solid #ccc; + border-radius: 4px; + background-color: #f5f5f5; cursor: pointer; - font-size: 18px; - line-height: 1; - min-width: 30px; - text-align: center; - flex-shrink: 0; - text-decoration: none; - margin: 0; + font-size: 14px; } .list-header .js-collapse:hover { - background-color: transparent; + background-color: #e0e0e0; color: #333; } - -.list-header .list-header-collapse-container > div { - flex: 1; - min-width: 0; -} .list.list-collapsed .list-header .js-collapse { display: inline-block !important; visibility: visible !important; @@ -484,18 +450,17 @@ body.list-resizing-active * { position: relative !important; } .list.list-collapsed .list-header .list-rotated h2.list-header-name { - width: 100vh; + width: 15vh; font-size: 12px; height: 30px; line-height: 1.2; - padding: 0; - margin: 0; - overflow: visible; + padding: 8px 4px; + margin: 0 auto; position: absolute; - left: 40px; + left: 50%; top: 50%; - transform: translateY(calc(-50% + 120px)) rotate(0deg); - text-align: center; + transform: translate(calc(-50% + 50px), -50%) rotate(0deg); + text-align: left; visibility: visible !important; opacity: 1 !important; display: block !important; @@ -525,18 +490,17 @@ body.list-resizing-active * { position: relative !important; } .list.list-collapsed .list-header .list-rotated h2.list-header-name { - width: 100vh; + width: 15vh; font-size: 12px; height: 30px; line-height: 1.2; - padding: 0; - margin: 0; - overflow: visible; + padding: 8px 4px; + margin: 0 auto; position: absolute; - left: 40px; + left: 50%; top: 50%; - transform: translateY(calc(-50% + 120px)) rotate(0deg); - text-align: center; + transform: translate(calc(-50% + 50px), -50%) rotate(0deg); + text-align: left; visibility: visible !important; opacity: 1 !important; display: block !important; @@ -566,17 +530,16 @@ body.list-resizing-active * { position: relative !important; } .list.list-collapsed .list-header .list-rotated h2.list-header-name { - width: 100vh; + width: 15vh; font-size: 12px; height: 30px; line-height: 1.2; - padding: 0; - margin: 0; - overflow: visible; + padding: 8px 4px; + margin: 0 auto; position: absolute; - left: 40px; + left: 50%; top: 50%; - transform: translateY(calc(-50% + 40px)) rotate(0deg); + transform: translate(calc(-50% + 50px), -50%) rotate(0deg); text-align: left; visibility: visible !important; opacity: 1 !important; @@ -681,22 +644,17 @@ body.list-resizing-active * { .mini-list.mobile-view { flex: 0 0 60px; height: auto; - width: 100vw; - max-width: 100vw; - min-width: 100vw; + width: 100%; + min-width: 100%; border-left: 0px !important; border-bottom: 1px solid #ccc; - display: block !important; } .list.mobile-view { - display: block !important; + display: contents; flex-basis: auto; - width: 100vw; - max-width: 100vw; - min-width: 100vw; + width: 100%; + min-width: 100%; border-left: 0px !important; - margin: 0 !important; - padding: 0 !important; } .list.mobile-view:first-child { margin-left: 0px; @@ -704,11 +662,9 @@ body.list-resizing-active * { .list.mobile-view.ui-sortable-helper { flex: 0 0 60px; height: 60px; - width: 100vw; - max-width: 100vw; + width: 100%; border-left: 0px !important; border-bottom: 1px solid #ccc; - display: block !important; } .list.mobile-view.ui-sortable-helper .list-header.ui-sortable-handle { cursor: grabbing; @@ -716,17 +672,14 @@ body.list-resizing-active * { .list.mobile-view.placeholder { flex: 0 0 60px; height: 60px; - width: 100vw; - max-width: 100vw; + width: 100%; border-left: 0px !important; border-bottom: 1px solid #ccc; - display: block !important; } .list.mobile-view .list-body { padding: 15px 19px; - width: 100vw; - max-width: 100vw; - min-width: 100vw; + width: 100%; + min-width: 100%; } .list.mobile-view .list-header { /*Updated padding values for mobile devices, this should fix text grouping issue*/ @@ -735,9 +688,8 @@ body.list-resizing-active * { min-height: 30px; margin-top: 10px; align-items: center; - width: 100vw; - max-width: 100vw; - min-width: 100vw; + width: 100%; + min-width: 100%; /* Force grid layout for iPhone */ display: grid !important; grid-template-columns: 30px 1fr auto auto !important; @@ -790,9 +742,6 @@ body.list-resizing-active * { grid-row: 2; grid-column: 2; align-self: start; - text-align: left; - padding-left: 0; - margin-left: 0; font-size: 16px !important; line-height: 1.2; } @@ -821,22 +770,17 @@ body.list-resizing-active * { .mini-list { flex: 0 0 60px; height: auto; - width: 100vw; - max-width: 100vw; - min-width: 100vw; + width: 100%; + min-width: 100%; border-left: 0px !important; border-bottom: 1px solid #ccc; - display: block !important; } .list { - display: block !important; + display: contents; flex-basis: auto; - width: 100vw; - max-width: 100vw; - min-width: 100vw; + width: 100%; + min-width: 100%; border-left: 0px !important; - margin: 0 !important; - padding: 0 !important; } .list:first-child { margin-left: 0px; @@ -844,11 +788,9 @@ body.list-resizing-active * { .list.ui-sortable-helper { flex: 0 0 60px; height: 60px; - width: 100vw; - max-width: 100vw; + width: 100%; border-left: 0px !important; border-bottom: 1px solid #ccc; - display: block !important; } .list.ui-sortable-helper .list-header.ui-sortable-handle { cursor: grabbing; @@ -856,17 +798,14 @@ body.list-resizing-active * { .list.placeholder { flex: 0 0 60px; height: 60px; - width: 100vw; - max-width: 100vw; + width: 100%; border-left: 0px !important; border-bottom: 1px solid #ccc; - display: block !important; } .list-body { padding: 15px 19px; - width: 100vw; - max-width: 100vw; - min-width: 100vw; + width: 100%; + min-width: 100%; } .list-header { /*Updated padding values for mobile devices, this should fix text grouping issue*/ @@ -875,9 +814,8 @@ body.list-resizing-active * { min-height: 30px; margin-top: 10px; align-items: center; - width: 100vw; - max-width: 100vw; - min-width: 100vw; + width: 100%; + min-width: 100%; } .list-header .list-header-left-icon { padding: 7px; @@ -1007,9 +945,6 @@ body.list-resizing-active * { grid-row: 2 !important; grid-column: 2 !important; align-self: start !important; - text-align: left !important; - padding-left: 0 !important; - margin-left: 0 !important; font-size: 16px !important; line-height: 1.2 !important; } @@ -1081,23 +1016,6 @@ body.list-resizing-active * { grid-row: 1/3 !important; grid-column: 1 !important; } - -/* Allow long list titles to expand on desktop (non-mobile, non-collapsed) */ -.list:not(.mobile-view):not(.list-collapsed) .list-header { - overflow: visible !important; -} - -.list:not(.mobile-view):not(.list-collapsed) .list-header .list-header-name { - /* Permit wrapping and full visibility */ - white-space: normal !important; - overflow: visible !important; - text-overflow: clip !important; - display: inline-block !important; - /* Reserve space for right-side controls (menu, handle, count) */ - max-width: calc(100% - 120px) !important; - /* Break long words to avoid overflow */ - word-break: break-word !important; -} .link-board-wrapper { display: flex; align-items: baseline; diff --git a/client/components/lists/list.jade b/client/components/lists/list.jade index c28dd1a9c..eed4d67f9 100644 --- a/client/components/lists/list.jade +++ b/client/components/lists/list.jade @@ -3,9 +3,8 @@ template(name='list') style="{{#unless collapsed}}min-width:{{listWidth}}px;max-width:{{listConstraint}}px;{{/unless}}" class="{{#if collapsed}}list-collapsed{{/if}} {{#if autoWidth}}list-auto-width{{/if}} {{#if isMiniScreen}}mobile-view{{/if}}") +listHeader - unless collapsed - +listBody - .list-resize-handle.js-list-resize-handle.nodragscroll + +listBody + .list-resize-handle.js-list-resize-handle.nodragscroll template(name='miniList') a.mini-list.js-select-list.js-list(id="js-list-{{_id}}" class="{{#if isMiniScreen}}mobile-view{{/if}}") diff --git a/client/components/lists/list.js b/client/components/lists/list.js index 2938b2be3..7501886ae 100644 --- a/client/components/lists/list.js +++ b/client/components/lists/list.js @@ -279,8 +279,7 @@ BlazeComponent.extendComponent({ // Only enable resize for non-collapsed, non-auto-width lists const isAutoWidth = this.autoWidth(); - const isCollapsed = Utils.getListCollapseState(list); - if (isCollapsed || isAutoWidth) { + if (list.collapsed || isAutoWidth) { $resizeHandle.hide(); return; } @@ -434,10 +433,9 @@ BlazeComponent.extendComponent({ }); - // Reactively update resize handle visibility when auto-width or collapse changes + // Reactively update resize handle visibility when auto-width changes component.autorun(() => { - const collapsed = Utils.getListCollapseState(list); - if (component.autoWidth() || collapsed) { + if (component.autoWidth()) { $resizeHandle.hide(); } else { $resizeHandle.show(); @@ -454,12 +452,6 @@ BlazeComponent.extendComponent({ }, }).register('list'); -Template.list.helpers({ - collapsed() { - return Utils.getListCollapseState(this); - }, -}); - Template.miniList.events({ 'click .js-select-list'() { const listId = this._id; diff --git a/client/components/lists/listBody.jade b/client/components/lists/listBody.jade index 7128148b8..e08684a4f 100644 --- a/client/components/lists/listBody.jade +++ b/client/components/lists/listBody.jade @@ -85,19 +85,16 @@ template(name="linkCardPopup") label {{_ 'swimlanes'}}: select.js-select-swimlanes - option(value="") {{_ 'custom-field-dropdown-none'}} each swimlanes option(value="{{_id}}") {{isTitleDefault title}} label {{_ 'lists'}}: select.js-select-lists - option(value="") {{_ 'custom-field-dropdown-none'}} each lists option(value="{{_id}}") {{isTitleDefault title}} label {{_ 'cards'}}: select.js-select-cards - option(value="") {{_ 'custom-field-dropdown-none'}} each cards option(value="{{getRealId}}") {{getTitle}} diff --git a/client/components/lists/listBody.js b/client/components/lists/listBody.js index eeda23cb2..529c70fc8 100644 --- a/client/components/lists/listBody.js +++ b/client/components/lists/listBody.js @@ -16,50 +16,11 @@ BlazeComponent.extendComponent({ }, customFieldsSum() { - const list = Template.currentData(); - if (!list) return []; - const boardId = Session.get('currentBoard'); - const fields = ReactiveCache.getCustomFields({ - boardIds: { $in: [boardId] }, + const ret = ReactiveCache.getCustomFields({ + boardIds: { $in: [Session.get('currentBoard')] }, showSumAtTopOfList: true, }); - - if (!fields || !fields.length) return []; - - const cards = ReactiveCache.getCards({ - listId: list._id, - archived: false, - }); - - const result = fields.map(field => { - let sum = 0; - if (cards && cards.length) { - cards.forEach(card => { - const cfs = (card.customFields || []); - const cf = cfs.find(f => f && f._id === field._id); - if (!cf || cf.value === null || cf.value === undefined) return; - let v = cf.value; - if (typeof v === 'string') { - // try to parse string numbers, accept comma decimal - const parsed = parseFloat(v.replace(',', '.')); - if (isNaN(parsed)) return; - v = parsed; - } - if (typeof v === 'number' && isFinite(v)) { - sum += v; - } - }); - } - return { - _id: field._id, - name: field.name, - type: field.type, - settings: field.settings || {}, - value: sum, - }; - }); - - return result; + return ret; }, openForm(options) { @@ -293,22 +254,6 @@ BlazeComponent.extendComponent({ }, }).register('listBody'); -// Helpers for listBody template context -Template.listBody.helpers({ - formattedCurrencyCustomFieldValue(val) { - // `this` is the custom field sum object from customFieldsSum each-iteration - const field = this || {}; - const code = (field.settings && field.settings.currencyCode) || 'USD'; - try { - const n = typeof val === 'number' ? val : parseFloat(val); - if (!isFinite(n)) return val; - return new Intl.NumberFormat(undefined, { style: 'currency', currency: code }).format(n); - } catch (e) { - return `${code} ${val}`; - } - }, -}); - function toggleValueInReactiveArray(reactiveValue, value) { const array = reactiveValue.get(); const valueIndex = array.indexOf(value); @@ -542,6 +487,8 @@ BlazeComponent.extendComponent({ { sort: { sort: 1 }, }); + if (swimlanes.length) + this.selectedSwimlaneId.set(swimlanes[0]._id); return swimlanes; }, @@ -556,6 +503,7 @@ BlazeComponent.extendComponent({ { sort: { sort: 1 }, }); + if (lists.length) this.selectedListId.set(lists[0]._id); return lists; }, @@ -564,17 +512,19 @@ BlazeComponent.extendComponent({ return []; } const ownCardsIds = this.board.cards().map(card => card.getRealId()); - const selector = { + const ret = ReactiveCache.getCards( + { + boardId: this.selectedBoardId.get(), + swimlaneId: this.selectedSwimlaneId.get(), + listId: this.selectedListId.get(), archived: false, linkedId: { $nin: ownCardsIds }, _id: { $nin: ownCardsIds }, type: { $nin: ['template-card'] }, - }; - if (this.selectedBoardId.get()) selector.boardId = this.selectedBoardId.get(); - if (this.selectedSwimlaneId.get()) selector.swimlaneId = this.selectedSwimlaneId.get(); - if (this.selectedListId.get()) selector.listId = this.selectedListId.get(); - - const ret = ReactiveCache.getCards(selector, { sort: { sort: 1 } }); + }, + { + sort: { sort: 1 }, + }); return ret; }, @@ -595,12 +545,8 @@ BlazeComponent.extendComponent({ return [ { 'change .js-select-boards'(evt) { - const val = $(evt.currentTarget).val(); - subManager.subscribe('board', val, false); - // Clear selections to allow linking only board or re-choose swimlane/list - this.selectedSwimlaneId.set(''); - this.selectedListId.set(''); - this.selectedBoardId.set(val); + subManager.subscribe('board', $(evt.currentTarget).val(), false); + this.selectedBoardId.set($(evt.currentTarget).val()); }, 'change .js-select-swimlanes'(evt) { this.selectedSwimlaneId.set($(evt.currentTarget).val()); diff --git a/client/components/lists/listHeader.jade b/client/components/lists/listHeader.jade index a3f7e239c..df3c31f51 100644 --- a/client/components/lists/listHeader.jade +++ b/client/components/lists/listHeader.jade @@ -26,32 +26,24 @@ template(name="listHeader") |/#{wipLimit.value}) if showCardsCountForList cards.length span.cardCount {{cardsCount}} {{cardsCountForListIsOne cards.length}} - if hasNumberFieldsSum - |   - span.list-sum-badge(title="{{_ 'sum-of-number-fields'}}") ∑ {{numberFieldsSum}} else - div.list-header-collapse-container - a.list-collapse-indicator.js-collapse(title="{{_ 'collapse'}}") - if collapsed - | ▶ - else - | 🔽 - div(class="{{#if collapsed}}list-rotated{{/if}}") - h2.list-header-name( - title="{{ moment modifiedAt 'LLL' }}" - class="{{#if currentUser.isBoardMember}}{{#unless currentUser.isCommentOnly}}{{#unless currentUser.isWorker}}js-open-inlined-form is-editable{{/unless}}{{/unless}}{{/if}}") - +viewer - = title - if wipLimit.enabled - | ( - span(class="{{#if exceededWipLimit}}highlight{{/if}}") {{cards.length}} - |/#{wipLimit.value}) + if collapsed + a.js-collapse(title="{{_ 'uncollapse'}}") + | ⬅️ + | ➡️ + div(class="{{#if collapsed}}list-rotated{{/if}}") + h2.list-header-name( + title="{{ moment modifiedAt 'LLL' }}" + class="{{#if currentUser.isBoardMember}}{{#unless currentUser.isCommentOnly}}{{#unless currentUser.isWorker}}js-open-inlined-form is-editable{{/unless}}{{/unless}}{{/if}}") + +viewer + = title + if wipLimit.enabled + | ( + span(class="{{#if exceededWipLimit}}highlight{{/if}}") {{cards.length}} + |/#{wipLimit.value}) unless collapsed if showCardsCountForList cards.length span.cardCount {{cardsCount}} {{cardsCountForListIsOne cards.length}} - if hasNumberFieldsSum - |   - span.list-sum-badge(title="{{_ 'sum-of-number-fields'}}") ∑ {{numberFieldsSum}} if isMiniScreen if currentList if isWatching @@ -63,13 +55,8 @@ template(name="listHeader") a.js-open-list-menu(title="{{_ 'listActionPopup-title'}}") ☰ else a.list-header-menu-icon.js-select-list ▶️ - unless currentUser.isWorker - a.list-header-handle.handle.js-list-handle ↕️ + a.list-header-handle.handle.js-list-handle ↕️ else if currentUser.isBoardMember - if currentUser.isBoardMember - unless currentUser.isCommentOnly - unless currentUser.isWorker - a.list-header-handle.handle.js-list-handle ↕️ if isWatching i.list-header-watch-icon | 👁️ unless collapsed @@ -79,8 +66,13 @@ template(name="listHeader") // a.fa.js-list-star.list-header-plus-top(class="fa-star{{#unless starred}}-o{{/unless}}") if canSeeAddCard a.js-add-card.list-header-plus-top(title="{{_ 'add-card-to-top-of-list'}}") ➕ - + a.js-collapse(title="{{_ 'collapse'}}") + | ⬅️ + | ➡️ a.js-open-list-menu(title="{{_ 'listActionPopup-title'}}") ☰ + if currentUser.isBoardMember + unless currentUser.isCommentOnly + a.list-header-handle.handle.js-list-handle ↕️ template(name="editListTitleForm") .list-composer diff --git a/client/components/lists/listHeader.js b/client/components/lists/listHeader.js index b42bbfffa..5a3e212d8 100644 --- a/client/components/lists/listHeader.js +++ b/client/components/lists/listHeader.js @@ -34,14 +34,13 @@ BlazeComponent.extendComponent({ }, collapsed(check = undefined) { const list = Template.currentData(); - const status = Utils.getListCollapseState(list); + const status = list.isCollapsed(); if (check === undefined) { // just check return status; } else { - const next = typeof check === 'boolean' ? check : !status; - Utils.setListCollapseState(list, next); - return next; + list.collapse(!status); + return !status; } }, editTitle(event) { @@ -143,48 +142,7 @@ BlazeComponent.extendComponent({ Template.listHeader.helpers({ isBoardAdmin() { return ReactiveCache.getCurrentUser().isBoardAdmin(); - }, - numberFieldsSum() { - const list = Template.currentData(); - if (!list) return 0; - const boardId = Session.get('currentBoard'); - const fields = ReactiveCache.getCustomFields({ - boardIds: { $in: [boardId] }, - showSumAtTopOfList: true, - type: 'number', - }); - if (!fields || !fields.length) return 0; - const cards = ReactiveCache.getCards({ listId: list._id, archived: false }); - let total = 0; - if (cards && cards.length) { - cards.forEach(card => { - const cfs = (card.customFields || []); - fields.forEach(field => { - const cf = cfs.find(f => f && f._id === field._id); - if (!cf || cf.value === null || cf.value === undefined) return; - let v = cf.value; - if (typeof v === 'string') { - const parsed = parseFloat(v.replace(',', '.')); - if (isNaN(parsed)) return; - v = parsed; - } - if (typeof v === 'number' && isFinite(v)) { - total += v; - } - }); - }); - } - return total; - }, - hasNumberFieldsSum() { - const boardId = Session.get('currentBoard'); - const fields = ReactiveCache.getCustomFields({ - boardIds: { $in: [boardId] }, - showSumAtTopOfList: true, - type: 'number', - }); - return !!(fields && fields.length); - }, + } }); Template.listActionPopup.helpers({ diff --git a/client/components/lists/minilist.jade b/client/components/lists/minilist.jade index 142308da8..e34214c40 100644 --- a/client/components/lists/minilist.jade +++ b/client/components/lists/minilist.jade @@ -3,6 +3,6 @@ template(name="minilist") class="minicard-{{colorClass}}") .minicard-title .handle - span.drag-handle(title="{{_ 'dragList'}}") ↕️ + .fa.fa-arrows +viewer = title diff --git a/client/components/main/dueCards.jade b/client/components/main/dueCards.jade index f482c9233..3a7dce08b 100644 --- a/client/components/main/dueCards.jade +++ b/client/components/main/dueCards.jade @@ -32,16 +32,8 @@ template(name="dueCards") span.global-search-error-messages = msg else - .due-cards-results-header - h1 - = resultsText each card in dueCardsList +resultCard(card) - else - .global-search-results-list-wrapper - .no-results - h3 {{_ 'dueCards-noResults-title'}} - p {{_ 'dueCards-noResults-description'}} template(name="dueCardsViewChangePopup") if currentUser diff --git a/client/components/main/dueCards.js b/client/components/main/dueCards.js index bdde0e1df..ef77f9467 100644 --- a/client/components/main/dueCards.js +++ b/client/components/main/dueCards.js @@ -1,6 +1,5 @@ import { ReactiveCache } from '/imports/reactiveCache'; import { BlazeComponent } from 'meteor/peerlibrary:blaze-components'; -import { TAPi18n } from '/imports/i18n'; // const subManager = new SubsManager(); @@ -25,25 +24,22 @@ Template.dueCards.helpers({ return Meteor.userId(); }, dueCardsList() { - const component = BlazeComponent.getComponentForElement(this.firstNode); + const component = BlazeComponent.getComponentForElement(this); if (component && component.dueCardsList) { return component.dueCardsList(); } return []; }, hasResults() { - const component = BlazeComponent.getComponentForElement(this.firstNode); - if (component && component.hasResults) { - return component.hasResults.get(); + const component = BlazeComponent.getComponentForElement(this); + if (component && component.dueCardsList) { + const cards = component.dueCardsList(); + return cards && cards.length > 0; } return false; }, searching() { - const component = BlazeComponent.getComponentForElement(this.firstNode); - if (component && component.isLoading) { - return component.isLoading.get(); - } - return true; // Show loading by default + return false; // No longer using search, so always false }, hasQueryErrors() { return false; // No longer using search, so always false @@ -51,20 +47,6 @@ Template.dueCards.helpers({ errorMessages() { return []; // No longer using search, so always empty }, - cardsCount() { - const component = BlazeComponent.getComponentForElement(this.firstNode); - if (component && component.cardsCount) { - return component.cardsCount(); - } - return 0; - }, - resultsText() { - const component = BlazeComponent.getComponentForElement(this.firstNode); - if (component && component.resultsText) { - return component.resultsText(); - } - return ''; - }, }); BlazeComponent.extendComponent({ @@ -96,9 +78,6 @@ class DueCardsComponent extends BlazeComponent { this._cachedCards = null; this._cachedTimestamp = null; this.subscriptionHandle = null; - this.isLoading = new ReactiveVar(true); - this.hasResults = new ReactiveVar(false); - this.searching = new ReactiveVar(false); // Subscribe to the optimized due cards publication this.autorun(() => { @@ -107,24 +86,6 @@ class DueCardsComponent extends BlazeComponent { this.subscriptionHandle.stop(); } this.subscriptionHandle = Meteor.subscribe('dueCards', allUsers); - - // Update loading state based on subscription - this.autorun(() => { - if (this.subscriptionHandle && this.subscriptionHandle.ready()) { - if (process.env.DEBUG === 'true') { - console.log('dueCards: subscription ready, loading data...'); - } - this.isLoading.set(false); - const cards = this.dueCardsList(); - this.hasResults.set(cards && cards.length > 0); - } else { - if (process.env.DEBUG === 'true') { - console.log('dueCards: subscription not ready, showing loading...'); - } - this.isLoading.set(true); - this.hasResults.set(false); - } - }); }); } @@ -145,45 +106,9 @@ class DueCardsComponent extends BlazeComponent { return this.dueCardsView() === 'board'; } - hasResults() { - return this.hasResults.get(); - } - - cardsCount() { - const cards = this.dueCardsList(); - return cards ? cards.length : 0; - } - - resultsText() { - const count = this.cardsCount(); - if (count === 1) { - return TAPi18n.__('one-card-found'); - } else { - // Get the translated text and manually replace %s with the count - const baseText = TAPi18n.__('n-cards-found'); - const result = baseText.replace('%s', count); - - if (process.env.DEBUG === 'true') { - console.log('dueCards: base text:', baseText, 'count:', count, 'result:', result); - } - return result; - } - } - dueCardsList() { - // Check if subscription is ready - if (!this.subscriptionHandle || !this.subscriptionHandle.ready()) { - if (process.env.DEBUG === 'true') { - console.log('dueCards client: subscription not ready'); - } - return []; - } - // Use cached results if available to avoid expensive re-sorting if (this._cachedCards && this._cachedTimestamp && (Date.now() - this._cachedTimestamp < 5000)) { - if (process.env.DEBUG === 'true') { - console.log('dueCards client: using cached results,', this._cachedCards.length, 'cards'); - } return this._cachedCards; } @@ -194,74 +119,23 @@ class DueCardsComponent extends BlazeComponent { dueAt: { $exists: true, $nin: [null, ''] } }); - if (process.env.DEBUG === 'true') { - console.log('dueCards client: found', cards.length, 'cards with due dates'); - console.log('dueCards client: cards details:', cards.map(c => ({ - id: c._id, - title: c.title, - dueAt: c.dueAt, - boardId: c.boardId, - members: c.members, - assignees: c.assignees, - userId: c.userId - }))); - } - // Filter cards based on user view preference const allUsers = this.dueCardsView() === 'all'; const currentUser = ReactiveCache.getCurrentUser(); let filteredCards = cards; - if (process.env.DEBUG === 'true') { - console.log('dueCards client: current user:', currentUser ? currentUser._id : 'none'); - console.log('dueCards client: showing all users:', allUsers); - } - if (!allUsers && currentUser) { filteredCards = cards.filter(card => { - const isMember = card.members && card.members.includes(currentUser._id); - const isAssignee = card.assignees && card.assignees.includes(currentUser._id); - const isAuthor = card.userId === currentUser._id; - const matches = isMember || isAssignee || isAuthor; - - if (process.env.DEBUG === 'true' && matches) { - console.log('dueCards client: card matches user:', card.title, { isMember, isAssignee, isAuthor }); - } - - return matches; + return card.members && card.members.includes(currentUser._id) || + card.assignees && card.assignees.includes(currentUser._id) || + card.userId === currentUser._id; }); } - // Normalize dueAt to timestamps for stable client-side ordering - const future = new Date('2100-12-31').getTime(); - const toTime = v => { - if (v === null || v === undefined || v === '') return future; - if (v instanceof Date) return v.getTime(); - const t = new Date(v); - if (!isNaN(t.getTime())) return t.getTime(); - return future; - }; - - filteredCards.sort((a, b) => { - const x = toTime(a.dueAt); - const y = toTime(b.dueAt); - if (x > y) return 1; - if (x < y) return -1; - return 0; - }); - - if (process.env.DEBUG === 'true') { - console.log('dueCards client: filtered to', filteredCards.length, 'cards'); - } - // Cache the results for 5 seconds to avoid re-filtering on every render this._cachedCards = filteredCards; this._cachedTimestamp = Date.now(); - // Update reactive variables - this.hasResults.set(filteredCards && filteredCards.length > 0); - this.isLoading.set(false); - return filteredCards; } } diff --git a/client/components/main/header.css b/client/components/main/header.css index ee17d00c3..609941320 100644 --- a/client/components/main/header.css +++ b/client/components/main/header.css @@ -339,20 +339,15 @@ width: 100%; min-width: 3vw; font-size: clamp(12px, 2vw, 14px); - box-sizing: border-box; - -webkit-appearance: none; - appearance: none; - flex: 0 0 auto; } /* Make zoom input wider on all mobile screens */ @media screen and (max-width: 800px), screen and (max-device-width: 932px) and (-webkit-min-device-pixel-ratio: 3) { #header-quick-access .zoom-controls .zoom-input { - min-width: 80px !important; /* Wider on mobile to show 3 digits */ - width: 80px !important; /* Fixed width to show 100 fully */ - font-size: 16px !important; /* Slightly larger text */ - flex: 0 0 80px !important; /* Prevent shrinking in flex */ + min-width: 50px !important; /* Wider on mobile */ + width: 50px !important; /* Fixed width to show all numbers */ + font-size: 14px !important; /* Slightly larger text */ } } @@ -855,9 +850,8 @@ #header-quick-access .zoom-controls .zoom-input { font-size: 16px !important; /* Larger input text */ padding: 0.5vh 0.8vw !important; - min-width: 80px !important; /* Wider to fit 100 */ - width: 80px !important; /* Fixed width to show 100 fully */ - flex: 0 0 80px !important; /* Prevent shrinking in flex */ + min-width: 6vw !important; /* Much wider for mobile */ + width: 60px !important; /* Fixed width to show all numbers */ } /* Make mobile mode toggle larger */ diff --git a/client/components/main/header.jade b/client/components/main/header.jade index e32399d00..b7e870dc2 100644 --- a/client/components/main/header.jade +++ b/client/components/main/header.jade @@ -83,6 +83,10 @@ template(name="header") i.mobile-icon(class="{{#if mobileMode}}active{{/if}}") 📱 i.desktop-icon(class="{{#unless mobileMode}}active{{/unless}}") 🖥️ + // Bookmarks button - desktop opens popup, mobile routes to page + a.board-header-btn.js-open-bookmarks(title="{{_ 'bookmarks'}}") + | 🔖 + // Notifications +notifications @@ -111,9 +115,7 @@ template(name="header") | 📢 +viewer | #{announcement} - a - .js-close-announcement - | ❌ + | ❌ template(name="offlineWarning") .offline-warning diff --git a/client/components/main/layouts.css b/client/components/main/layouts.css index 8847291fb..fb8f4bf5c 100644 --- a/client/components/main/layouts.css +++ b/client/components/main/layouts.css @@ -81,27 +81,6 @@ body { display: flex; flex-direction: column; height: 100vh; - /* iOS Safari fixes */ - -webkit-overflow-scrolling: touch; -} - -/* Mobile mode specific fixes for iOS Safari */ -body.mobile-mode { - overflow-x: hidden; - position: fixed; - width: 100%; - height: 100vh; - /* Prevent iOS Safari bounce scroll */ - overscroll-behavior: none; - -webkit-overflow-scrolling: touch; -} - -/* Ensure content area is scrollable in mobile mode */ -body.mobile-mode #content { - overflow-y: auto; - overflow-x: hidden; - -webkit-overflow-scrolling: touch; - height: calc(100vh - 48px); } #content { position: relative; @@ -548,7 +527,7 @@ a:not(.disabled).is-active i.fa { /* Board canvas */ .board-canvas { - padding: 0 8px 8px 0; + padding: 8px; overflow-x: auto; -webkit-overflow-scrolling: touch; } @@ -696,7 +675,7 @@ a:not(.disabled).is-active i.fa { } .board-canvas { - padding: 0 12px 12px 0; + padding: 12px; } #header { @@ -777,7 +756,7 @@ a:not(.disabled).is-active i.fa { .inline-input { height: 37px; margin: 8px 10px 0 0; - width: 100px; + width: 50px; } .select-authentication { width: 100%; @@ -920,40 +899,6 @@ a:not(.disabled).is-active i.fa { height: 100%; } } - -/* iOS Safari Mobile Mode Fixes */ -@media screen and (max-width: 800px) { - /* Prevent scrolling issues on iOS Safari when card popup is open */ - body.mobile-mode { - overflow: hidden; - position: fixed; - width: 100%; - height: 100vh; - } - - /* Fix z-index stacking for mobile Safari */ - body.mobile-mode .board-wrapper { - z-index: 1; - } - - body.mobile-mode .board-wrapper .board-canvas .board-overlay { - z-index: 17 !important; - } - - body.mobile-mode .card-details { - z-index: 100 !important; - } - - body.mobile-mode .pop-over { - z-index: 999; - } - - /* Ensure smooth scrolling on iOS */ - body.mobile-mode .card-details, - body.mobile-mode .pop-over .content-wrapper { - -webkit-overflow-scrolling: touch; - } -} @-moz-keyframes lds-roller { 0% { transform: rotate(0deg); diff --git a/client/components/main/layouts.jade b/client/components/main/layouts.jade index 7f50d0438..469524e04 100644 --- a/client/components/main/layouts.jade +++ b/client/components/main/layouts.jade @@ -2,10 +2,8 @@ template(name="main") html(lang="{{TAPi18n.getLanguage}}") head title - meta(name="viewport" content="width=device-width, initial-scale=1, maximum-scale=5, user-scalable=yes, viewport-fit=cover") + meta(name="viewport" content="width=device-width, initial-scale=1, maximum-scale=5, user-scalable=yes") meta(http-equiv="X-UA-Compatible" content="IE=edge") - meta(name="apple-mobile-web-app-capable" content="yes") - meta(name="apple-mobile-web-app-status-bar-style" content="black-translucent") //- XXX We should use pathFor in the following `href` to support the case where the application is deployed with a path prefix, but it seems to be difficult to do that cleanly with Blaze -- at least without adding extra @@ -79,6 +77,7 @@ template(name="defaultLayout") | {{{afterBodyStart}}} +Template.dynamic(template=content) | {{{beforeBodyEnd}}} + +migrationProgress +boardConversionProgress if (Modal.isOpen) #modal diff --git a/client/components/main/popup.css b/client/components/main/popup.css index 2fed6211b..7ddba701c 100644 --- a/client/components/main/popup.css +++ b/client/components/main/popup.css @@ -94,24 +94,24 @@ } /* Admin edit popups: use full height */ -.pop-over[data-popup="editUserPopup"], -.pop-over[data-popup="editOrgPopup"], -.pop-over[data-popup="editTeamPopup"] { +.pop-over[data-popup="editUser"], +.pop-over[data-popup="editOrg"], +.pop-over[data-popup="editTeam"] { height: calc(100vh - 20px) !important; max-height: calc(100vh - 20px) !important; } -.pop-over[data-popup="editUserPopup"] .content-wrapper, -.pop-over[data-popup="editOrgPopup"] .content-wrapper, -.pop-over[data-popup="editTeamPopup"] .content-wrapper { +.pop-over[data-popup="editUser"] .content-wrapper, +.pop-over[data-popup="editOrg"] .content-wrapper, +.pop-over[data-popup="editTeam"] .content-wrapper { max-height: calc(100vh - 80px) !important; /* Subtract header height */ height: calc(100vh - 80px) !important; overflow-y: auto !important; } -.pop-over[data-popup="editUserPopup"] .content-container, -.pop-over[data-popup="editOrgPopup"] .content-container, -.pop-over[data-popup="editTeamPopup"] .content-container { +.pop-over[data-popup="editUser"] .content-container, +.pop-over[data-popup="editOrg"] .content-container, +.pop-over[data-popup="editTeam"] .content-container { max-height: calc(100vh - 80px) !important; /* Subtract header height */ height: calc(100vh - 80px) !important; } @@ -123,7 +123,7 @@ } /* Specific styling for language popup list */ -.pop-over[data-popup="changeLanguagePopup"] .pop-over-list { +.pop-over[data-popup="changeLanguage"] .pop-over-list { max-height: none; overflow: visible; height: auto; @@ -131,69 +131,46 @@ } /* Ensure content div in language popup contains all items */ -.pop-over[data-popup="changeLanguagePopup"] .content { +.pop-over[data-popup="changeLanguage"] .content { height: auto; - /* Remove forced min-height to avoid top gap */ + min-height: 100%; display: flex; flex-direction: column; } -/* Ensure hidden stack pages truly take no space */ -.pop-over[data-popup="changeLanguagePopup"] .content.no-height { - min-height: 0 !important; - height: 0 !important; - padding: 0 !important; - margin: 0 !important; - visibility: hidden !important; +/* Allow dynamic height for Change Language popup */ +.pop-over[data-popup="changeLanguage"] .content-wrapper { + max-height: inherit; /* Use dynamic height from JavaScript */ +} + +.pop-over[data-popup="changeLanguage"] .content-container { + max-height: inherit; /* Use dynamic height from JavaScript */ } /* Make language popup extend to bottom of browser window */ -.pop-over[data-popup="changeLanguagePopup"] { - position: fixed !important; - bottom: 0 !important; - top: auto !important; - left: auto !important; - right: 20px !important; - width: auto !important; - max-width: 450px !important; - height: 100vh !important; - max-height: 100vh !important; - min-height: 300px !important; - display: flex !important; - flex-direction: column !important; - margin: 0 !important; +.pop-over[data-popup="changeLanguage"] { + height: calc(100vh - 30px); + min-height: 300px; + /* Adjust positioning to move popup 30px higher */ + transform: translateY(-30px); } -/* Allow dynamic height for Change Language popup */ -.pop-over[data-popup="changeLanguagePopup"] .header { - flex-shrink: 0 !important; - height: auto !important; +.pop-over[data-popup="changeLanguage"] .content-wrapper { + height: calc(100% - 50px); /* Subtract header height more precisely */ + min-height: 250px; + overflow-y: auto; + max-height: none; /* Remove any max-height constraints */ + display: flex; + flex-direction: column; } -.pop-over[data-popup="changeLanguagePopup"] .content-wrapper { - flex: 1 !important; - overflow-y: auto !important; - overflow-x: hidden !important; - min-height: 0 !important; - max-height: none !important; - height: auto !important; - width: 100% !important; -} - -.pop-over[data-popup="changeLanguagePopup"] .content-container { - height: auto !important; - max-height: none !important; - flex: 1 !important; - display: flex !important; - flex-direction: column !important; - width: 100% !important; -} - -.pop-over[data-popup="changeLanguagePopup"] .content { - height: auto !important; - max-height: none !important; - padding-bottom: 50px !important; - width: 100% !important; +.pop-over[data-popup="changeLanguage"] .content-container { + height: auto; /* Let content determine height */ + min-height: 250px; + max-height: none; /* Remove any max-height constraints */ + flex: 1; + display: flex; + flex-direction: column; } /* Date popup sizing for native HTML inputs */ @@ -316,8 +293,6 @@ overflow-y: auto !important; } - - .pop-over[data-popup="editCardReceivedDatePopup"] .edit-date button, .pop-over[data-popup="editCardStartDatePopup"] .edit-date button, .pop-over[data-popup="editCardDueDatePopup"] .edit-date button, @@ -412,6 +387,9 @@ margin: 0; visibility: hidden; } +.pop-over .quiet { +/* padding: 6px 6px 4px;*/ +} .pop-over.search-over { background: #f0f0f0; min-height: 14vh; @@ -538,7 +516,6 @@ position: absolute; top: 6px; right: 12px; - color: #3cb500; } .pop-over-list .pop-over-list.checkable li.active a { padding-right: 28px; @@ -546,10 +523,6 @@ .pop-over-list .pop-over-list.checkable li.active a .fa-check { display: block; } -/* Grey check icons when grey icons setting is enabled */ -body.grey-icons-enabled .pop-over-list .pop-over-list.checkable .fa-check { - color: #7a7a7a; -} .pop-over.miniprofile .header { border-bottom-color: transparent; height: 30px; @@ -595,10 +568,6 @@ body.grey-icons-enabled .pop-over-list .pop-over-list.checkable .fa-check { overflow: hidden; margin-top: 0px; border: 0px solid #dbdbdb; - /* Ensure popups appear above card details on mobile */ - z-index: 999999 !important; - /* iOS Safari scrolling fix */ - -webkit-overflow-scrolling: touch; } .pop-over .header { color: #fff; @@ -683,23 +652,3 @@ body.grey-icons-enabled .pop-over-list .pop-over-list.checkable .fa-check { transform: none !important; } } - -/* Force full-screen popups in mobile mode regardless of screen width */ -body.mobile-mode .pop-over { - position: fixed !important; - top: 0 !important; - left: 0 !important; - right: 0 !important; - bottom: 0 !important; - width: 100vw !important; - height: 100vh !important; - max-width: 100vw !important; - max-height: 100vh !important; -} -body.mobile-mode .pop-over .content-wrapper { - width: 100% !important; - height: calc(100vh - 48px) !important; - max-height: calc(100vh - 48px) !important; - overflow-y: auto !important; - overflow-x: hidden !important; -} diff --git a/client/components/main/popup.tpl.jade b/client/components/main/popup.tpl.jade index 630998962..bcc5756e4 100644 --- a/client/components/main/popup.tpl.jade +++ b/client/components/main/popup.tpl.jade @@ -2,7 +2,6 @@ class="{{#unless title}}miniprofile{{/unless}}" class=currentBoard.colorClass class="{{#unless title}}no-title{{/unless}}" - data-popup="{{popupName}}" style="left:{{offset.left}}px; top:{{offset.top}}px;{{#if offset.maxHeight}} max-height:{{offset.maxHeight}}px;{{/if}}") .header a.back-btn.js-back-view(class="{{#unless hasPopupParent}}is-hidden{{/unless}}") diff --git a/client/components/main/support.jade b/client/components/main/support.jade deleted file mode 100644 index 97529476b..000000000 --- a/client/components/main/support.jade +++ /dev/null @@ -1,29 +0,0 @@ -template(name="supportHeaderBar") - h1 - if isSupportEnabled - = supportTitle - else - | {{_ 'support'}} - -template(name="support") - .support-page - if isSupportPublic - if isSupportEnabled - .support-page-content - +viewer - | {{supportContent}} - else - .support-page-content - | {{_ 'support-info-not-added-yet'}} - else - if currentUser - if isSupportEnabled - .support-page-content - +viewer - | {{supportContent}} - else - .support-page-content - | {{_ 'support-info-not-added-yet'}} - else - .support-page-content - | {{_ 'support-info-only-for-logged-in-users'}} diff --git a/client/components/main/support.js b/client/components/main/support.js deleted file mode 100644 index 0aaa9dcb1..000000000 --- a/client/components/main/support.js +++ /dev/null @@ -1,41 +0,0 @@ -import { ReactiveCache } from '/imports/reactiveCache'; -import { TAPi18n } from '/imports/i18n'; - -// Shared helpers for both support templates -const supportHelpers = { - supportTitle() { - const setting = ReactiveCache.getCurrentSetting(); - return setting && setting.supportTitle ? setting.supportTitle : TAPi18n.__('support'); - }, - supportContent() { - const setting = ReactiveCache.getCurrentSetting(); - return setting && setting.supportPageText ? setting.supportPageText : TAPi18n.__('support-info-not-added-yet'); - }, - isSupportEnabled() { - const setting = ReactiveCache.getCurrentSetting(); - return setting && setting.supportPageEnabled; - }, - isSupportPublic() { - const setting = ReactiveCache.getCurrentSetting(); - return setting && setting.supportPagePublic; - } -}; - -// Main support page component -BlazeComponent.extendComponent({ - onCreated() { - this.error = new ReactiveVar(''); - this.loading = new ReactiveVar(false); - - Meteor.subscribe('setting'); - }, - ...supportHelpers -}).register('support'); - -// Header bar component -BlazeComponent.extendComponent({ - onCreated() { - Meteor.subscribe('setting'); - }, - ...supportHelpers -}).register('supportHeaderBar'); diff --git a/client/components/migrationProgress.css b/client/components/migrationProgress.css new file mode 100644 index 000000000..d44f4eda8 --- /dev/null +++ b/client/components/migrationProgress.css @@ -0,0 +1,372 @@ +/* Migration Progress Styles */ +.migration-overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.8); + z-index: 10000; + display: none; + align-items: center; + justify-content: center; + overflow-y: auto; +} + +.migration-overlay.active { + display: flex; +} + +.migration-modal { + background: white; + border-radius: 12px; + box-shadow: 0 20px 60px rgba(0, 0, 0, 0.4); + max-width: 800px; + width: 95%; + max-height: 90vh; + overflow: hidden; + animation: slideInScale 0.4s ease-out; + margin: 20px; +} + +@keyframes slideInScale { + from { + opacity: 0; + transform: translateY(-30px) scale(0.95); + } + to { + opacity: 1; + transform: translateY(0) scale(1); + } +} + +.migration-header { + padding: 24px 32px 20px; + border-bottom: 2px solid #e0e0e0; + text-align: center; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + color: white; +} + +.migration-header h3 { + margin: 0 0 8px 0; + font-size: 24px; + font-weight: 600; +} + +.migration-header h3 i { + margin-right: 12px; + color: #FFD700; +} + +.migration-header p { + margin: 0; + font-size: 16px; + opacity: 0.9; +} + +.migration-content { + padding: 24px 32px; + max-height: 60vh; + overflow-y: auto; +} + +.migration-overview { + margin-bottom: 32px; + padding: 20px; + background: #f8f9fa; + border-radius: 8px; + border-left: 4px solid #667eea; +} + +.overall-progress { + margin-bottom: 20px; +} + +.progress-bar { + width: 100%; + height: 12px; + background-color: #e0e0e0; + border-radius: 6px; + overflow: hidden; + margin-bottom: 8px; + position: relative; +} + +.progress-fill { + height: 100%; + background: linear-gradient(90deg, #667eea, #764ba2); + border-radius: 6px; + transition: width 0.3s ease; + position: relative; +} + +.progress-fill::after { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: linear-gradient( + 90deg, + transparent, + rgba(255, 255, 255, 0.4), + transparent + ); + animation: shimmer 2s infinite; +} + +@keyframes shimmer { + 0% { + transform: translateX(-100%); + } + 100% { + transform: translateX(100%); + } +} + +.progress-text { + text-align: center; + font-weight: 700; + color: #667eea; + font-size: 18px; +} + +.progress-label { + text-align: center; + color: #666; + font-size: 14px; + margin-top: 4px; +} + +.current-step { + text-align: center; + color: #333; + font-size: 16px; + font-weight: 500; + margin-bottom: 16px; +} + +.current-step i { + margin-right: 8px; + color: #667eea; +} + +.estimated-time { + text-align: center; + color: #666; + font-size: 14px; + background-color: #fff3cd; + padding: 8px 12px; + border-radius: 4px; + border: 1px solid #ffeaa7; +} + +.estimated-time i { + margin-right: 6px; + color: #f39c12; +} + +.migration-steps { + margin-bottom: 24px; +} + +.migration-steps h4 { + margin: 0 0 16px 0; + color: #333; + font-size: 18px; + font-weight: 600; +} + +.steps-list { + max-height: 300px; + overflow-y: auto; + border: 1px solid #e0e0e0; + border-radius: 8px; +} + +.migration-step { + padding: 16px 20px; + border-bottom: 1px solid #f0f0f0; + transition: all 0.3s ease; +} + +.migration-step:last-child { + border-bottom: none; +} + +.migration-step.completed { + background-color: #d4edda; + border-left: 4px solid #28a745; +} + +.migration-step.current { + background-color: #cce7ff; + border-left: 4px solid #667eea; + animation: pulse 2s infinite; +} + +@keyframes pulse { + 0% { + box-shadow: 0 0 0 0 rgba(102, 126, 234, 0.4); + } + 70% { + box-shadow: 0 0 0 10px rgba(102, 126, 234, 0); + } + 100% { + box-shadow: 0 0 0 0 rgba(102, 126, 234, 0); + } +} + +.step-header { + display: flex; + align-items: center; + margin-bottom: 8px; +} + +.step-icon { + margin-right: 12px; + font-size: 18px; + width: 24px; + text-align: center; +} + +.step-icon i.fa-check-circle { + color: #28a745; +} + +.step-icon i.fa-cog.fa-spin { + color: #667eea; +} + +.step-icon i.fa-circle-o { + color: #ccc; +} + +.step-info { + flex: 1; +} + +.step-name { + font-weight: 600; + color: #333; + font-size: 14px; + margin-bottom: 2px; +} + +.step-description { + color: #666; + font-size: 12px; + line-height: 1.3; +} + +.step-progress { + text-align: right; + min-width: 40px; +} + +.step-progress .progress-text { + font-size: 12px; + font-weight: 600; +} + +.step-progress-bar { + width: 100%; + height: 4px; + background-color: #e0e0e0; + border-radius: 2px; + overflow: hidden; + margin-top: 8px; +} + +.step-progress-bar .progress-fill { + height: 100%; + background: linear-gradient(90deg, #667eea, #764ba2); + border-radius: 2px; + transition: width 0.3s ease; +} + +.migration-status { + text-align: center; + color: #333; + font-size: 16px; + background-color: #e3f2fd; + padding: 12px 16px; + border-radius: 6px; + border: 1px solid #bbdefb; + margin-bottom: 16px; +} + +.migration-status i { + margin-right: 8px; + color: #2196f3; +} + +.migration-footer { + padding: 16px 32px 24px; + border-top: 1px solid #e0e0e0; + background-color: #f8f9fa; +} + +.migration-info { + text-align: center; + color: #666; + font-size: 13px; + line-height: 1.4; + margin-bottom: 8px; +} + +.migration-info i { + margin-right: 6px; + color: #667eea; +} + +.migration-warning { + text-align: center; + color: #856404; + font-size: 12px; + line-height: 1.3; + background-color: #fff3cd; + padding: 8px 12px; + border-radius: 4px; + border: 1px solid #ffeaa7; +} + +.migration-warning i { + margin-right: 6px; + color: #f39c12; +} + +/* Responsive design */ +@media (max-width: 768px) { + .migration-modal { + width: 98%; + margin: 10px; + } + + .migration-header, + .migration-content, + .migration-footer { + padding-left: 16px; + padding-right: 16px; + } + + .migration-header h3 { + font-size: 20px; + } + + .step-header { + flex-direction: column; + align-items: flex-start; + } + + .step-progress { + text-align: left; + margin-top: 8px; + } + + .steps-list { + max-height: 200px; + } +} diff --git a/client/components/migrationProgress.jade b/client/components/migrationProgress.jade new file mode 100644 index 000000000..274ea4621 --- /dev/null +++ b/client/components/migrationProgress.jade @@ -0,0 +1,63 @@ +template(name="migrationProgress") + .migration-overlay(class="{{#if isMigrating}}active{{/if}}") + .migration-modal + .migration-header + h3 + | 🗄️ + | {{_ 'database-migration'}} + p {{_ 'database-migration-description'}} + + .migration-content + .migration-overview + .overall-progress + .progress-bar + .progress-fill(style="width: {{migrationProgress}}%") + .progress-text {{migrationProgress}}% + .progress-label {{_ 'overall-progress'}} + + .current-step + | ⚙️ + | {{migrationCurrentStep}} + + .estimated-time(style="{{#unless migrationEstimatedTime}}display: none;{{/unless}}") + | ⏰ + | {{_ 'estimated-time-remaining'}}: {{migrationEstimatedTime}} + + .migration-steps + h4 {{_ 'migration-steps'}} + .steps-list + each migrationSteps + .migration-step(class="{{#if completed}}completed{{/if}}" class="{{#if isCurrentStep}}current{{/if}}") + .step-header + .step-icon + if completed + | ✅ + else if isCurrentStep + | ⚙️ + else + | ⭕ + .step-info + .step-name {{name}} + .step-description {{description}} + .step-progress + if completed + .progress-text 100% + else if isCurrentStep + .progress-text {{progress}}% + else + .progress-text 0% + if isCurrentStep + .step-progress-bar + .progress-fill(style="width: {{progress}}%") + + .migration-status + | ℹ️ + | {{migrationStatus}} + + .migration-footer + .migration-info + | 💡 + | {{_ 'migration-info-text'}} + .migration-warning + | ⚠️ + | {{_ 'migration-warning-text'}} diff --git a/client/components/migrationProgress.js b/client/components/migrationProgress.js new file mode 100644 index 000000000..83a05ea36 --- /dev/null +++ b/client/components/migrationProgress.js @@ -0,0 +1,54 @@ +import { Template } from 'meteor/templating'; +import { + migrationManager, + isMigrating, + migrationProgress, + migrationStatus, + migrationCurrentStep, + migrationEstimatedTime, + migrationSteps +} from '/client/lib/migrationManager'; + +Template.migrationProgress.helpers({ + isMigrating() { + return isMigrating.get(); + }, + + migrationProgress() { + return migrationProgress.get(); + }, + + migrationStatus() { + return migrationStatus.get(); + }, + + migrationCurrentStep() { + return migrationCurrentStep.get(); + }, + + migrationEstimatedTime() { + return migrationEstimatedTime.get(); + }, + + migrationSteps() { + const steps = migrationSteps.get(); + const currentStep = migrationCurrentStep.get(); + + return steps.map(step => ({ + ...step, + isCurrentStep: step.name === currentStep + })); + } +}); + +Template.migrationProgress.onCreated(function() { + // Subscribe to migration state changes + this.autorun(() => { + isMigrating.get(); + migrationProgress.get(); + migrationStatus.get(); + migrationCurrentStep.get(); + migrationEstimatedTime.get(); + migrationSteps.get(); + }); +}); diff --git a/client/components/notifications/notification.css b/client/components/notifications/notification.css index 397061fc8..0ced61d37 100644 --- a/client/components/notifications/notification.css +++ b/client/components/notifications/notification.css @@ -20,10 +20,10 @@ height: 3vw; } #notifications-drawer .notification .read-status .activity-type { - margin: 8px 0 0; - width: 1.2em; - height: 1.2em; - font-size: clamp(14px, 2vw, 17px); + margin: 2vh 0 0; + width: 2.2vw; + height: 2.2vw; + font-size: clamp(14px, 2.5vw, 17px); display: block; color: #bbb; } diff --git a/client/components/notifications/notification.jade b/client/components/notifications/notification.jade index 0ee76306f..c98bbdba5 100644 --- a/client/components/notifications/notification.jade +++ b/client/components/notifications/notification.jade @@ -7,4 +7,4 @@ template(name='notification') +activity(activity=activityData mode='none') if read .remove - a(title="{{_ 'delete'}}") 🗑️ + a.fa.fa-trash diff --git a/client/components/notifications/notificationIcon.jade b/client/components/notifications/notificationIcon.jade index 9b4c629ee..ff35739c4 100644 --- a/client/components/notifications/notificationIcon.jade +++ b/client/components/notifications/notificationIcon.jade @@ -1,8 +1,8 @@ template(name='notificationIcon') if($in activityType 'deleteAttachment' 'addAttachment') - span.activity-type(title="attachment") 📎 + i.fa.fa-paperclip.activity-type(title="attachment") else if($in activityType 'createBoard' 'importBoard') - span.activity-type(title="board") 🗂️ + i.fa.fa-chalkboard.activity-type(title="board") else if($in activityType 'createCard' 'importCard' 'moveCard') +cardNotificationIcon @@ -19,17 +19,17 @@ template(name='notificationIcon') //- DRY and consistant else if($in activityType 'checkedItem' 'uncheckedItem' 'addChecklistItem' 'removedChecklistItem') - span.activity-type(title="checklist item") ☑️ + i.fa.fa-check-square.activity-type(title="checklist item") else if($in activityType 'addComment') - span.activity-type(title="comment") 💬 + i.fa.fa-comment-o.activity-type(title="comment") else if($in activityType 'createCustomField' 'setCustomField' 'unsetCustomField') - span.activity-type(title="custom field") 🧩 + i.fa.fa-code.activity-type(title="custom field") else if($in activityType 'addedLabel' 'removedLabel') - span.activity-type(title="label") 🏷️ + i.fa.fa-tag.activity-type(title="label") else if($in activityType 'a-startAt' 'a-receivedAt') - span.activity-type(title="date") ⏰ + i.fa.fa-clock-o.activity-type(title="date") else if($in activityType 'a-dueAt' 'a-endAt') - span.activity-type(title="date") ⏰ + i.fa.fa-clock-o.activity-type(title="date") else if($in activityType 'createList' 'removeList' 'archivedList') +listNotificationIcon @@ -41,17 +41,17 @@ template(name='notificationIcon') //- elswhere in the app we use fa-trello to indicate lists... //- i personally like fa-columns a bit better else if($in activityType 'unjoinMember' 'addBoardMember' 'joinMember' 'removeBoardMember') - span.activity-type(title="member") 👤 + i.fa.fa-user.activity-type(title="member") else if($in activityType 'createSwimlane' 'archivedSwimlane') - span.activity-type(title="swimlane") 🧭 + i.fa.fa-th-large.activity-type(title="swimlane") else - span.activity-type(title="can't find icon for #{activityType}") 🐞 + i.fa.fa-bug.activity-type(title="can't find icon for #{activityType}") template(name='cardNotificationIcon') - span.activity-type(title="card") 🗒️ + i.fa.fa-clone.activity-type(title="card") template(name='checklistNotificationIcon') - span.activity-type(title="checklist") 📝 + i.fa.fa-list.activity-type(title="checklist") template(name='listNotificationIcon') - span.activity-type(title="list") 📋 + i.fa.fa-columns.activity-type(title="list") diff --git a/client/components/notifications/notificationsDrawer.css b/client/components/notifications/notificationsDrawer.css index 758018404..d8ffcb153 100644 --- a/client/components/notifications/notificationsDrawer.css +++ b/client/components/notifications/notificationsDrawer.css @@ -55,6 +55,9 @@ section#notifications-drawer .remove-read { section#notifications-drawer .remove-read:hover { color: #eb4646 !important; } +section#notifications-drawer .remove-read:hover i.fa { + color: inherit; +} section#notifications-drawer ul.notifications { display: block; padding: 0px 16px 0px 16px; diff --git a/client/components/notifications/notificationsDrawer.jade b/client/components/notifications/notificationsDrawer.jade index 66c53b849..2fd2bb229 100644 --- a/client/components/notifications/notificationsDrawer.jade +++ b/client/components/notifications/notificationsDrawer.jade @@ -8,7 +8,7 @@ template(name='notificationsDrawer') h5 {{_ 'notifications'}} if($gt unreadNotifications 0) |(#{unreadNotifications}) - a.close ❌ + a.fa.fa-times-thin.close ul.notifications each transformedProfile.notifications +notification(activityData=activityObj index=dbIndex read=read) @@ -16,5 +16,5 @@ template(name='notificationsDrawer') a.all-read {{_ 'mark-all-as-read'}} if ($and ($.Session.get 'showReadNotifications') ($gt readNotifications 0)) a.remove-read - | 🗑️ + i.fa.fa-trash | {{_ 'remove-all-read'}} diff --git a/client/components/rules/actions/boardActions.jade b/client/components/rules/actions/boardActions.jade index 85ff97ebe..6f63635fa 100644 --- a/client/components/rules/actions/boardActions.jade +++ b/client/components/rules/actions/boardActions.jade @@ -24,7 +24,6 @@ template(name="boardActions") | {{_'r-the-board'}} div.trigger-dropdown select(id="board-id") - option(value="" disabled selected if=not boards.length) {{loadingBoardsLabel}} each boards if $eq _id currentBoard._id option(value="{{_id}}" selected) {{_ 'current'}} @@ -86,7 +85,6 @@ template(name="boardActions") | {{_'r-the-board'}} div.trigger-dropdown select(id="board-id-link") - option(value="" disabled selected if=not boards.length) {{loadingBoardsLabel}} each boards if $eq _id currentBoard._id option(value="{{_id}}" selected) {{_ 'current'}} diff --git a/client/components/rules/actions/boardActions.js b/client/components/rules/actions/boardActions.js index 0d3a9b2b6..b69e9f476 100644 --- a/client/components/rules/actions/boardActions.js +++ b/client/components/rules/actions/boardActions.js @@ -1,11 +1,7 @@ import { ReactiveCache } from '/imports/reactiveCache'; -import { TAPi18n } from '/imports/i18n'; BlazeComponent.extendComponent({ - onCreated() { - // Ensure boards are available for action dropdowns - this.subscribe('boards'); - }, + onCreated() {}, boards() { const ret = ReactiveCache.getBoards( @@ -23,16 +19,6 @@ BlazeComponent.extendComponent({ return ret; }, - loadingBoardsLabel() { - try { - const txt = TAPi18n.__('loading-boards'); - if (txt && !txt.startsWith("key '")) return txt; - } catch (e) { - // ignore translation lookup errors - } - return 'Loading boards...'; - }, - events() { return [ { diff --git a/client/components/rules/ruleDetails.js b/client/components/rules/ruleDetails.js index e300c77b6..235f17179 100644 --- a/client/components/rules/ruleDetails.js +++ b/client/components/rules/ruleDetails.js @@ -5,7 +5,6 @@ BlazeComponent.extendComponent({ this.subscribe('allRules'); this.subscribe('allTriggers'); this.subscribe('allActions'); - this.subscribe('boards'); }, trigger() { diff --git a/client/components/rules/rulesActions.jade b/client/components/rules/rulesActions.jade index 3deb7ba6d..bcc5d7ff0 100644 --- a/client/components/rules/rulesActions.jade +++ b/client/components/rules/rulesActions.jade @@ -1,7 +1,7 @@ template(name="rulesActions") h2 | ✨ - | {{_ 'r-rule' }} "{{ruleNameStr}}" - {{_ 'r-add-action'}} + | {{_ 'r-rule' }} "#{data.ruleName.get}" - {{_ 'r-add-action'}} .triggers-content .triggers-body .triggers-side-menu @@ -15,13 +15,13 @@ template(name="rulesActions") li.js-set-mail-actions | @ .triggers-main-body - if $eq currentActions.get 'board' + if ($eq currentActions.get 'board') +boardActions(ruleName=data.ruleName triggerVar=data.triggerVar) - else if $eq currentActions.get 'card' + else if ($eq currentActions.get 'card') +cardActions(ruleName=data.ruleName triggerVar=data.triggerVar) - else if $eq currentActions.get 'checklist' + else if ($eq currentActions.get 'checklist') +checklistActions(ruleName=data.ruleName triggerVar=data.triggerVar) - else if $eq currentActions.get 'mail' + else if ($eq currentActions.get 'mail') +mailActions(ruleName=data.ruleName triggerVar=data.triggerVar) div.rules-back button.js-goback diff --git a/client/components/rules/rulesActions.js b/client/components/rules/rulesActions.js index 9e60ad760..32b4c3897 100644 --- a/client/components/rules/rulesActions.js +++ b/client/components/rules/rulesActions.js @@ -5,15 +5,6 @@ BlazeComponent.extendComponent({ this.currentActions = new ReactiveVar('board'); }, - ruleNameStr() { - const rn = this.data() && this.data().ruleName; - try { - return rn && typeof rn.get === 'function' ? rn.get() : ''; - } catch (_) { - return ''; - } - }, - setBoardActions() { this.currentActions.set('board'); $('.js-set-card-actions').removeClass('active'); diff --git a/client/components/rules/rulesTriggers.jade b/client/components/rules/rulesTriggers.jade index e110198c5..e34c1dfb5 100644 --- a/client/components/rules/rulesTriggers.jade +++ b/client/components/rules/rulesTriggers.jade @@ -1,7 +1,7 @@ template(name="rulesTriggers") h2 | ✨ - | {{_ 'r-rule' }} "{{ruleNameStr}}" - {{_ 'r-add-trigger'}} + | {{_ 'r-rule' }} "#{data.ruleName.get}" - {{_ 'r-add-trigger'}} .triggers-content .triggers-body .triggers-side-menu diff --git a/client/components/rules/rulesTriggers.js b/client/components/rules/rulesTriggers.js index 240d7d2a8..960484267 100644 --- a/client/components/rules/rulesTriggers.js +++ b/client/components/rules/rulesTriggers.js @@ -7,15 +7,6 @@ BlazeComponent.extendComponent({ this.showChecklistTrigger = new ReactiveVar(false); }, - ruleNameStr() { - const rn = this.data() && this.data().ruleName; - try { - return rn && typeof rn.get === 'function' ? rn.get() : ''; - } catch (_) { - return ''; - } - }, - setBoardTriggers() { this.showBoardTrigger.set(true); this.showCardTrigger.set(false); diff --git a/client/components/rules/triggers/boardTriggers.jade b/client/components/rules/triggers/boardTriggers.jade index 419c5faaf..d9d2c4e17 100644 --- a/client/components/rules/triggers/boardTriggers.jade +++ b/client/components/rules/triggers/boardTriggers.jade @@ -105,7 +105,7 @@ template(name="boardTriggers") template(name="boardCardTitlePopup") form label - | {{_ 'boardCardTitlePopup-title'}} + | Card Title Filter input.js-card-filter-name(type="text" value=title autofocus) input.js-card-filter-button.primary.wide(type="submit" value="{{_ 'set-filter'}}") diff --git a/client/components/settings/adminReports.jade b/client/components/settings/adminReports.jade index c6dc7feb1..e474ee465 100644 --- a/client/components/settings/adminReports.jade +++ b/client/components/settings/adminReports.jade @@ -8,27 +8,27 @@ template(name="adminReports") ul li a.js-report-broken(data-id="report-broken") - span.emoji-icon 🔗 + | 🔗 | {{_ 'broken-cards'}} li a.js-report-files(data-id="report-files") - span.emoji-icon 📎 + | 📎 | {{_ 'filesReportTitle'}} li a.js-report-rules(data-id="report-rules") - span.emoji-icon ✨ + | ✨ | {{_ 'rulesReportTitle'}} li a.js-report-boards(data-id="report-boards") - span.emoji-icon ✨ + | ✨ | {{_ 'boardsReportTitle'}} li a.js-report-cards(data-id="report-cards") - span.emoji-icon ✨ + | ✨ | {{_ 'cardsReportTitle'}} .main-body diff --git a/client/components/settings/migrationProgress.css b/client/components/settings/migrationProgress.css deleted file mode 100644 index 2077cc524..000000000 --- a/client/components/settings/migrationProgress.css +++ /dev/null @@ -1,301 +0,0 @@ -/* Migration Progress Styles */ -.migration-progress-overlay { - position: fixed; - top: 0; - left: 0; - right: 0; - bottom: 0; - background: rgba(0, 0, 0, 0.7); - z-index: 9999; - display: flex; - align-items: center; - justify-content: center; - backdrop-filter: blur(2px); -} - -.migration-progress-modal { - background: white; - border-radius: 8px; - box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3); - max-width: 500px; - width: 90%; - max-height: 80vh; - overflow: hidden; - animation: migrationModalSlideIn 0.3s ease-out; -} - -@keyframes migrationModalSlideIn { - from { - opacity: 0; - transform: translateY(-20px) scale(0.95); - } - to { - opacity: 1; - transform: translateY(0) scale(1); - } -} - -.migration-progress-header { - background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); - color: white; - padding: 20px; - display: flex; - justify-content: space-between; - align-items: center; -} - -.migration-progress-title { - margin: 0; - font-size: 18px; - font-weight: 600; -} - -.migration-progress-close { - cursor: pointer; - font-size: 16px; - opacity: 0.8; - transition: opacity 0.2s ease; -} - -.migration-progress-close:hover { - opacity: 1; -} - -.migration-progress-content { - padding: 30px; -} - -.migration-progress-overall { - margin-bottom: 25px; -} - -.migration-progress-overall-label { - font-weight: 600; - color: #333; - margin-bottom: 8px; - font-size: 14px; -} - -.migration-progress-overall-bar { - background: #e9ecef; - border-radius: 10px; - height: 12px; - overflow: hidden; - margin-bottom: 5px; -} - -.migration-progress-overall-fill { - background: linear-gradient(90deg, #28a745, #20c997); - height: 100%; - border-radius: 10px; - transition: width 0.3s ease; - position: relative; -} - -.migration-progress-overall-fill::after { - content: ''; - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - background: linear-gradient(90deg, transparent, rgba(255,255,255,0.3), transparent); - animation: migrationProgressShimmer 2s infinite; -} - -@keyframes migrationProgressShimmer { - 0% { transform: translateX(-100%); } - 100% { transform: translateX(100%); } -} - -.migration-progress-overall-percentage { - text-align: right; - font-size: 12px; - color: #666; - font-weight: 600; -} - -.migration-progress-current-step { - margin-bottom: 25px; -} - -.migration-progress-step-label { - font-weight: 600; - color: #333; - margin-bottom: 8px; - font-size: 14px; -} - -.migration-progress-step-bar { - background: #e9ecef; - border-radius: 8px; - height: 8px; - overflow: hidden; - margin-bottom: 5px; -} - -.migration-progress-step-fill { - background: linear-gradient(90deg, #007bff, #0056b3); - height: 100%; - border-radius: 8px; - transition: width 0.3s ease; -} - -.migration-progress-step-percentage { - text-align: right; - font-size: 12px; - color: #666; - font-weight: 600; -} - -.migration-progress-status { - margin-bottom: 20px; - padding: 15px; - background: #f8f9fa; - border-radius: 6px; - border-left: 4px solid #007bff; -} - -.migration-progress-status-label { - font-weight: 600; - color: #333; - margin-bottom: 5px; - font-size: 13px; -} - -.migration-progress-status-text { - color: #555; - font-size: 14px; - line-height: 1.4; -} - -.migration-progress-details { - margin-bottom: 20px; - padding: 12px; - background: #e3f2fd; - border-radius: 6px; - border-left: 4px solid #2196f3; -} - -.migration-progress-details-label { - font-weight: 600; - color: #1976d2; - margin-bottom: 5px; - font-size: 13px; -} - -.migration-progress-details-text { - color: #1565c0; - font-size: 13px; - line-height: 1.4; -} - -.migration-progress-footer { - padding: 20px 30px; - background: #f8f9fa; - border-top: 1px solid #e9ecef; -} - -.migration-progress-note { - text-align: center; - color: #666; - font-size: 13px; - font-style: italic; -} - -/* Responsive design */ -@media (max-width: 600px) { - .migration-progress-modal { - width: 95%; - margin: 20px; - } - - .migration-progress-content { - padding: 20px; - } - - .migration-progress-header { - padding: 15px; - } - - .migration-progress-title { - font-size: 16px; - } -} - -/* Dark mode support */ -@media (prefers-color-scheme: dark) { - .migration-progress-modal { - background: #2d3748; - color: #e2e8f0; - } - - .migration-progress-overall-label, - .migration-progress-step-label, - .migration-progress-status-label { - color: #e2e8f0; - } - - .migration-progress-status { - background: #4a5568; - border-left-color: #63b3ed; - } - - .migration-progress-status-text { - color: #cbd5e0; - } - - .migration-progress-details { - background: #2b6cb0; - border-left-color: #4299e1; - } - - .migration-progress-details-label { - color: #bee3f8; - } - - .migration-progress-details-text { - color: #90cdf4; - } - - .migration-progress-footer { - background: #4a5568; - border-top-color: #718096; - } - - .migration-progress-note { - color: #a0aec0; - } -} -/* Attachment migration styles */ -.attachment-item.migrating { - position: relative; - opacity: 0.7; -} - -.attachment-migration-overlay { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - background: rgba(255, 255, 255, 0.9); - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - z-index: 10; - border-radius: 4px; -} - -.migration-spinner { - font-size: 24px; - color: #007cba; - margin-bottom: 8px; -} - -.migration-text { - font-size: 12px; - color: #666; - text-align: center; -} diff --git a/client/components/settings/migrationProgress.jade b/client/components/settings/migrationProgress.jade deleted file mode 100644 index c68a3836a..000000000 --- a/client/components/settings/migrationProgress.jade +++ /dev/null @@ -1,43 +0,0 @@ -template(name="migrationProgress") - if isMigrating - .migration-progress-overlay - .migration-progress-modal - .migration-progress-header - h3.migration-progress-title - | 🔄 {{_ 'migration-progress-title'}} - .migration-progress-close.js-close-migration-progress - | ❌ - - .migration-progress-content - .migration-progress-overall - .migration-progress-overall-label - | {{_ 'migration-progress-overall'}}: {{currentStep}} {{_ 'of'}} {{totalSteps}} {{_ 'steps'}} - .migration-progress-overall-bar - .migration-progress-overall-fill(style="{{progressBarStyle}}") - .migration-progress-overall-percentage - | {{overallProgress}}% - - .migration-progress-current-step - .migration-progress-step-label - | {{_ 'migration-progress-current-step'}}: {{stepNameFormatted}} - .migration-progress-step-bar - .migration-progress-step-fill(style="{{stepProgressBarStyle}}") - .migration-progress-step-percentage - | {{stepProgress}}% - - .migration-progress-status - .migration-progress-status-label - | {{_ 'migration-progress-status'}}: - .migration-progress-status-text - | {{stepStatus}} - - if stepDetailsFormatted - .migration-progress-details - .migration-progress-details-label - | {{_ 'migration-progress-details'}}: - .migration-progress-details-text - | {{stepDetailsFormatted}} - - .migration-progress-footer - .migration-progress-note - | {{_ 'migration-progress-note'}} \ No newline at end of file diff --git a/client/components/settings/migrationProgress.js b/client/components/settings/migrationProgress.js deleted file mode 100644 index 7c4064d39..000000000 --- a/client/components/settings/migrationProgress.js +++ /dev/null @@ -1,212 +0,0 @@ -/** - * Migration Progress Component - * Displays detailed progress for comprehensive board migration - */ - -import { ReactiveVar } from 'meteor/reactive-var'; -import { ReactiveCache } from '/imports/reactiveCache'; - -// Reactive variables for migration progress -export const migrationProgress = new ReactiveVar(0); -export const migrationStatus = new ReactiveVar(''); -export const migrationStepName = new ReactiveVar(''); -export const migrationStepProgress = new ReactiveVar(0); -export const migrationStepStatus = new ReactiveVar(''); -export const migrationStepDetails = new ReactiveVar(null); -export const migrationCurrentStep = new ReactiveVar(0); -export const migrationTotalSteps = new ReactiveVar(0); -export const isMigrating = new ReactiveVar(false); - -class MigrationProgressManager { - constructor() { - this.progressHistory = []; - } - - /** - * Update migration progress - */ - updateProgress(progressData) { - const { - overallProgress, - currentStep, - totalSteps, - stepName, - stepProgress, - stepStatus, - stepDetails, - boardId - } = progressData; - - // Update reactive variables - migrationProgress.set(overallProgress); - migrationCurrentStep.set(currentStep); - migrationTotalSteps.set(totalSteps); - migrationStepName.set(stepName); - migrationStepProgress.set(stepProgress); - migrationStepStatus.set(stepStatus); - migrationStepDetails.set(stepDetails); - - // Store in history - this.progressHistory.push({ - timestamp: new Date(), - ...progressData - }); - - // Update overall status - migrationStatus.set(`${stepName}: ${stepStatus}`); - } - - /** - * Start migration - */ - startMigration() { - isMigrating.set(true); - migrationProgress.set(0); - migrationStatus.set('Starting migration...'); - migrationStepName.set(''); - migrationStepProgress.set(0); - migrationStepStatus.set(''); - migrationStepDetails.set(null); - migrationCurrentStep.set(0); - migrationTotalSteps.set(0); - this.progressHistory = []; - } - - /** - * Complete migration - */ - completeMigration() { - isMigrating.set(false); - migrationProgress.set(100); - migrationStatus.set('Migration completed successfully!'); - - // Clear step details after a delay - setTimeout(() => { - migrationStepName.set(''); - migrationStepProgress.set(0); - migrationStepStatus.set(''); - migrationStepDetails.set(null); - migrationCurrentStep.set(0); - migrationTotalSteps.set(0); - }, 3000); - } - - /** - * Fail migration - */ - failMigration(error) { - isMigrating.set(false); - migrationStatus.set(`Migration failed: ${error.message || error}`); - migrationStepStatus.set('Error occurred'); - } - - /** - * Get progress history - */ - getProgressHistory() { - return this.progressHistory; - } - - /** - * Clear progress - */ - clearProgress() { - isMigrating.set(false); - migrationProgress.set(0); - migrationStatus.set(''); - migrationStepName.set(''); - migrationStepProgress.set(0); - migrationStepStatus.set(''); - migrationStepDetails.set(null); - migrationCurrentStep.set(0); - migrationTotalSteps.set(0); - this.progressHistory = []; - } -} - -// Export singleton instance -export const migrationProgressManager = new MigrationProgressManager(); - -// Template helpers -Template.migrationProgress.helpers({ - isMigrating() { - return isMigrating.get(); - }, - - overallProgress() { - return migrationProgress.get(); - }, - - overallStatus() { - return migrationStatus.get(); - }, - - currentStep() { - return migrationCurrentStep.get(); - }, - - totalSteps() { - return migrationTotalSteps.get(); - }, - - stepName() { - return migrationStepName.get(); - }, - - stepProgress() { - return migrationStepProgress.get(); - }, - - stepStatus() { - return migrationStepStatus.get(); - }, - - stepDetails() { - return migrationStepDetails.get(); - }, - - progressBarStyle() { - const progress = migrationProgress.get(); - return `width: ${progress}%`; - }, - - stepProgressBarStyle() { - const progress = migrationStepProgress.get(); - return `width: ${progress}%`; - }, - - stepNameFormatted() { - const stepName = migrationStepName.get(); - if (!stepName) return ''; - - // Convert snake_case to Title Case - return stepName - .split('_') - .map(word => word.charAt(0).toUpperCase() + word.slice(1)) - .join(' '); - }, - - stepDetailsFormatted() { - const details = migrationStepDetails.get(); - if (!details) return ''; - - const formatted = []; - for (const [key, value] of Object.entries(details)) { - const formattedKey = key - .split(/(?=[A-Z])/) - .join(' ') - .toLowerCase() - .replace(/^\w/, c => c.toUpperCase()); - formatted.push(`${formattedKey}: ${value}`); - } - - return formatted.join(', '); - } -}); - -// Template events -Template.migrationProgress.events({ - 'click .js-close-migration-progress'() { - migrationProgressManager.clearProgress(); - } -}); \ No newline at end of file diff --git a/client/components/settings/peopleBody.jade b/client/components/settings/peopleBody.jade index dda0197d9..0aa9a4dba 100644 --- a/client/components/settings/peopleBody.jade +++ b/client/components/settings/peopleBody.jade @@ -48,7 +48,7 @@ template(name="people") option(value="inactive") {{_ 'admin-people-filter-inactive'}} option(value="admin") Admin button#unlockAllUsers.unlock-all-btn - span.emoji-icon 🔓 + | 🔓 | {{_ 'accounts-lockout-unlock-all'}} .ext-box-right span {{#unless isMiniScreen}}{{_ 'people-number'}}{{/unless}} #{peopleNumber} @@ -58,7 +58,7 @@ template(name="people") | {{_ 'add'}} / {{_ 'delete'}} {{_ 'teams'}} else if lockedUsersSetting.get span - span.emoji-icon.text-red 🔒 + span.text-red 🔒 unless isMiniScreen | {{_ 'accounts-lockout-locked-users'}} @@ -79,7 +79,7 @@ template(name="people") | {{_ 'people'}} li a.js-locked-users-menu(data-id="locked-users-setting") - span.emoji-icon.text-red 🔒 + span.text-red 🔒 | {{_ 'accounts-lockout-locked-users'}} .main-body if loading.get @@ -247,9 +247,9 @@ template(name="peopleRow") input.selectUserChkBox(type="checkbox", id="{{userData._id}}") td.account-status if isUserLocked - span.text-red.js-toggle-lock-status.emoji-icon(data-user-id=userData._id, data-is-locked="true", title="{{_ 'accounts-lockout-click-to-unlock'}}") 🔒 + span.text-red.js-toggle-lock-status(data-user-id=userData._id, data-is-locked="true", title="{{_ 'accounts-lockout-click-to-unlock'}}") 🔒 else - span.text-green.js-toggle-lock-status.emoji-icon(data-user-id=userData._id, data-is-locked="false", title="{{_ 'accounts-lockout-user-unlocked'}}") 🔓 + span.text-green.js-toggle-lock-status(data-user-id=userData._id, data-is-locked="false", title="{{_ 'accounts-lockout-user-unlocked'}}") 🔓 td.account-active-status if userData.loginDisabled span.text-red.js-toggle-active-status(data-user-id=userData._id, data-is-active="false", title="{{_ 'admin-people-user-inactive'}}") 🚫 diff --git a/client/components/settings/settingBody.css b/client/components/settings/settingBody.css index b69914713..765baa77c 100644 --- a/client/components/settings/settingBody.css +++ b/client/components/settings/settingBody.css @@ -137,13 +137,8 @@ padding: 0.5rem 0.5rem; } .setting-content .content-body .main-body ul li a .is-checked { - border-bottom: 2px solid #3cb500; - border-right: 2px solid #3cb500; -} -/* Grey checkmarks when grey icons setting is enabled */ -body.grey-icons-enabled .setting-content .content-body .main-body ul li a .is-checked { - border-bottom: 2px solid #7a7a7a; - border-right: 2px solid #7a7a7a; + border-bottom: 2px solid #2980b9; + border-right: 2px solid #2980b9; } .setting-content .content-body .main-body ul li a span { padding: 0 0.5rem; diff --git a/client/components/settings/settingBody.jade b/client/components/settings/settingBody.jade index 5653d84a9..9101e18f7 100644 --- a/client/components/settings/settingBody.jade +++ b/client/components/settings/settingBody.jade @@ -6,87 +6,87 @@ template(name="setting") .content-title.ext-box if isGeneralSetting span - span.emoji-icon 🔑 + | 🔑 | {{_ 'registration'}} else if isEmailSetting span - span.emoji-icon ✉️ + | ✉️ | {{_ 'email'}} else if isAccountSetting span - span.emoji-icon 👥 + | 👥 | {{_ 'accounts'}} else if isTableVisibilityModeSetting span - span.emoji-icon 👁️ + | 👁️ | {{_ 'tableVisibilityMode'}} else if isAnnouncementSetting span - span.emoji-icon 📢 + | 📢 | {{_ 'admin-announcement'}} else if isAccessibilitySetting span - span.emoji-icon ♿ + | ♿ | {{_ 'accessibility'}} else if isLayoutSetting span - span.emoji-icon 🔗 + | 🔗 | {{_ 'layout'}} else if isWebhookSetting span - span.emoji-icon 🌐 + | 🌐 | {{_ 'global-webhook'}} else if isAttachmentSettings span - span.emoji-iconpan.emoji-icon 📎 + | 📎 | {{_ 'attachments'}} else if isCronSettings span - span.emoji-icon ⏰ + | ⏰ | {{_ 'cron'}} .content-body .side-menu ul li(class="{{#if isGeneralSetting}}active{{/if}}") a.js-setting-menu(data-id="registration-setting") - span.emoji-icon 🔑 + | 🔑 | {{_ 'registration'}} unless isSandstorm li(class="{{#if isEmailSetting}}active{{/if}}") a.js-setting-menu(data-id="email-setting") - span.emoji-icon ✉️ + | ✉️ | {{_ 'email'}} li(class="{{#if isAccountSetting}}active{{/if}}") a.js-setting-menu(data-id="account-setting") - span.emoji-icon 👥 + | 👥 | {{_ 'accounts'}} li(class="{{#if isTableVisibilityModeSetting}}active{{/if}}") a.js-setting-menu(data-id="tableVisibilityMode-setting") - span.emoji-icon 👁️ + | 👁️ | {{_ 'tableVisibilityMode'}} li(class="{{#if isAnnouncementSetting}}active{{/if}}") a.js-setting-menu(data-id="announcement-setting") - span.emoji-icon 📢 + | 📢 | {{_ 'admin-announcement'}} li(class="{{#if isAccessibilitySetting}}active{{/if}}") a.js-setting-menu(data-id="accessibility-setting") - span.emoji-icon ♿ + | ♿ | {{_ 'accessibility'}} li(class="{{#if isLayoutSetting}}active{{/if}}") a.js-setting-menu(data-id="layout-setting") - span.emoji-icon 🔗 + | 🔗 | {{_ 'layout'}} li(class="{{#if isWebhookSetting}}active{{/if}}") a.js-setting-menu(data-id="webhook-setting") - span.emoji-icon 🌐 + | 🌐 | {{_ 'global-webhook'}} li(class="{{#if isAttachmentSettings}}active{{/if}}") a.js-setting-menu(data-id="attachment-settings") - span.emoji-icon 📎 + | 📎 | {{_ 'attachments'}} li(class="{{#if isCronSettings}}active{{/if}}") a.js-setting-menu(data-id="cron-settings") - span.emoji-icon ⏰ + | ⏰ | {{_ 'cron'}} .main-body if isLoading @@ -170,10 +170,7 @@ template(name="setting") label {{_ 'migration-status'}} .status-indicator span.status-label {{_ 'status'}}: - span.status-value {{#if isMigrating}}{{migrationStatus}}{{else}}{{_ 'idle'}}{{/if}} - .current-step(class="{{#unless migrationCurrentStep}}hide{{/unless}}") - span.step-label {{_ 'current-step'}}: - span.step-value {{migrationCurrentStep}} + span.status-value {{migrationStatus}} .progress-section .progress .progress-bar(role="progressbar" style="width: {{migrationProgress}}%" aria-valuenow="{{migrationProgress}}" aria-valuemin="0" aria-valuemax="100") @@ -182,13 +179,9 @@ template(name="setting") | {{migrationProgress}}% {{_ 'complete'}} .form-group - button.js-start-all-migrations.btn.btn-primary {{#if isMigrating}}disabled{{/if}} {{_ 'start-all-migrations'}} - button.js-pause-all-migrations.btn.btn-warning {{#unless isMigrating}}disabled{{/unless}} {{_ 'pause-all-migrations'}} - button.js-stop-all-migrations.btn.btn-danger {{#unless isMigrating}}disabled{{/unless}} {{_ 'stop-all-migrations'}} - - li - h3 {{_ 'migration-steps'}} - p Migration steps section temporarily removed + button.js-start-all-migrations.btn.btn-primary {{_ 'start-all-migrations'}} + button.js-pause-all-migrations.btn.btn-warning {{_ 'pause-all-migrations'}} + button.js-stop-all-migrations.btn.btn-danger {{_ 'stop-all-migrations'}} li h3 {{_ 'board-operations'}} @@ -207,7 +200,7 @@ template(name="setting") .job-info .job-name {{name}} .job-schedule {{schedule}} - .job-status {{status}} + .job-description {{description}} .job-actions button.js-pause-job.btn.btn-sm.btn-warning(data-job-id="{{_id}}") {{_ 'pause'}} button.js-delete-job.btn.btn-sm.btn-danger(data-job-id="{{_id}}") {{_ 'delete'}} @@ -281,7 +274,7 @@ template(name='email') // li.smtp-form // .title {{_ 'smtp-username'}} // .form-group - // input.wekan-form-control#mail-server-username(type="text", placeholder="{{_ 'username'}}" value="{{currentSetting.mailServer.username}}") + // input.wekan-form-control#mail-server-u"accounts-allowUserNameChange": "Allow Username Change",sername(type="text", placeholder="{{_ 'username'}}" value="{{currentSetting.mailServer.username}}") // li.smtp-form // .title {{_ 'smtp-password'}} // .form-group @@ -382,29 +375,6 @@ template(name='layoutSettings') ul#layout-setting.setting-detail li button.js-all-boards-hide-activities.primary {{_ 'hide-activities-of-all-boards'}} - li - a(href="/support" style="text-decoration: underline; color: blue;") {{_ 'support'}} - li - a.flex.js-toggle-support - .materialCheckBox(class="{{#if currentSetting.supportPageEnabled}}is-checked{{/if}}") - - span {{_ 'support-page-enabled'}} - li - .support-content(class="{{#if currentSetting.supportPageEnabled}}{{else}}hide{{/if}}") - ul - li - a.flex.js-toggle-support-public - .materialCheckBox(class="{{#if currentSetting.supportPagePublic}}is-checked{{/if}}") - - span {{_ 'public'}} - li - .title {{_ 'support-title'}} - textarea#support-title.wekan-form-control= currentSetting.supportTitle - li - .title {{_ 'support-content'}} - textarea#support-page-text.wekan-form-control= currentSetting.supportPageText - li - button.js-support-save.primary {{_ 'save'}} li.layout-form .title {{_ 'oidc-button-text'}} .form-group diff --git a/client/components/settings/settingBody.js b/client/components/settings/settingBody.js index bad99ebfa..682479c92 100644 --- a/client/components/settings/settingBody.js +++ b/client/components/settings/settingBody.js @@ -2,14 +2,6 @@ import { ReactiveCache } from '/imports/reactiveCache'; import { TAPi18n } from '/imports/i18n'; import { ALLOWED_WAIT_SPINNERS } from '/config/const'; import LockoutSettings from '/models/lockoutSettings'; -import { - cronMigrationProgress, - cronMigrationStatus, - cronMigrationCurrentStep, - cronMigrationSteps, - cronIsMigrating, - cronJobs -} from '/imports/cronMigrationClient'; BlazeComponent.extendComponent({ @@ -123,27 +115,15 @@ BlazeComponent.extendComponent({ // Cron settings helpers migrationStatus() { - return cronMigrationStatus.get() || TAPi18n.__('idle'); + return TAPi18n.__('idle'); // Placeholder }, migrationProgress() { - return cronMigrationProgress.get() || 0; - }, - - migrationCurrentStep() { - return cronMigrationCurrentStep.get() || ''; - }, - - isMigrating() { - return cronIsMigrating.get() || false; - }, - - migrationSteps() { - return cronMigrationSteps.get() || []; + return 0; // Placeholder }, cronJobs() { - return cronJobs.get() || []; + return []; // Placeholder }, setLoading(w) { @@ -189,9 +169,7 @@ BlazeComponent.extendComponent({ // Event handlers for cron settings 'click button.js-start-all-migrations'(event) { event.preventDefault(); - this.setLoading(true); - Meteor.call('cron.startAllMigrations', (error, result) => { - this.setLoading(false); + Meteor.call('startAllMigrations', (error, result) => { if (error) { alert(TAPi18n.__('migration-start-failed') + ': ' + error.reason); } else { @@ -202,9 +180,7 @@ BlazeComponent.extendComponent({ 'click button.js-pause-all-migrations'(event) { event.preventDefault(); - this.setLoading(true); - Meteor.call('cron.pauseAllMigrations', (error, result) => { - this.setLoading(false); + Meteor.call('pauseAllMigrations', (error, result) => { if (error) { alert(TAPi18n.__('migration-pause-failed') + ': ' + error.reason); } else { @@ -216,9 +192,7 @@ BlazeComponent.extendComponent({ 'click button.js-stop-all-migrations'(event) { event.preventDefault(); if (confirm(TAPi18n.__('migration-stop-confirm'))) { - this.setLoading(true); - Meteor.call('cron.stopAllMigrations', (error, result) => { - this.setLoading(false); + Meteor.call('stopAllMigrations', (error, result) => { if (error) { alert(TAPi18n.__('migration-stop-failed') + ': ' + error.reason); } else { @@ -230,28 +204,41 @@ BlazeComponent.extendComponent({ 'click button.js-schedule-board-cleanup'(event) { event.preventDefault(); - // Placeholder - board cleanup scheduling - alert(TAPi18n.__('board-cleanup-scheduled')); + Meteor.call('scheduleBoardCleanup', (error, result) => { + if (error) { + alert(TAPi18n.__('board-cleanup-failed') + ': ' + error.reason); + } else { + alert(TAPi18n.__('board-cleanup-scheduled')); + } + }); }, 'click button.js-schedule-board-archive'(event) { event.preventDefault(); - // Placeholder - board archive scheduling - alert(TAPi18n.__('board-archive-scheduled')); + Meteor.call('scheduleBoardArchive', (error, result) => { + if (error) { + alert(TAPi18n.__('board-archive-failed') + ': ' + error.reason); + } else { + alert(TAPi18n.__('board-archive-scheduled')); + } + }); }, 'click button.js-schedule-board-backup'(event) { event.preventDefault(); - // Placeholder - board backup scheduling - alert(TAPi18n.__('board-backup-scheduled')); + Meteor.call('scheduleBoardBackup', (error, result) => { + if (error) { + alert(TAPi18n.__('board-backup-failed') + ': ' + error.reason); + } else { + alert(TAPi18n.__('board-backup-scheduled')); + } + }); }, 'click button.js-pause-job'(event) { event.preventDefault(); const jobId = $(event.target).data('job-id'); - this.setLoading(true); - Meteor.call('cron.pauseJob', jobId, (error, result) => { - this.setLoading(false); + Meteor.call('pauseCronJob', jobId, (error, result) => { if (error) { alert(TAPi18n.__('cron-job-pause-failed') + ': ' + error.reason); } else { @@ -264,9 +251,7 @@ BlazeComponent.extendComponent({ event.preventDefault(); const jobId = $(event.target).data('job-id'); if (confirm(TAPi18n.__('cron-job-delete-confirm'))) { - this.setLoading(true); - Meteor.call('cron.removeJob', jobId, (error, result) => { - this.setLoading(false); + Meteor.call('deleteCronJob', jobId, (error, result) => { if (error) { alert(TAPi18n.__('cron-job-delete-failed') + ': ' + error.reason); } else { @@ -533,45 +518,6 @@ BlazeComponent.extendComponent({ DocHead.setTitle(productName); }, - toggleSupportPage() { - this.setLoading(true); - const supportPageEnabled = !$('.js-toggle-support .materialCheckBox').hasClass('is-checked'); - $('.js-toggle-support .materialCheckBox').toggleClass('is-checked'); - $('.support-content').toggleClass('hide'); - Settings.update(Settings.findOne()._id, { - $set: { supportPageEnabled }, - }); - this.setLoading(false); - }, - - toggleSupportPublic() { - this.setLoading(true); - const supportPagePublic = !$('.js-toggle-support-public .materialCheckBox').hasClass('is-checked'); - $('.js-toggle-support-public .materialCheckBox').toggleClass('is-checked'); - Settings.update(Settings.findOne()._id, { - $set: { supportPagePublic }, - }); - this.setLoading(false); - }, - - saveSupportSettings() { - this.setLoading(true); - const supportTitle = ($('#support-title').val() || '').trim(); - const supportPageText = ($('#support-page-text').val() || '').trim(); - try { - Settings.update(Settings.findOne()._id, { - $set: { - supportTitle, - supportPageText, - }, - }); - } catch (e) { - return; - } finally { - this.setLoading(false); - } - }, - sendSMTPTestEmail() { Meteor.call('sendSMTPTestEmail', (err, ret) => { if (!err && ret) { @@ -600,9 +546,6 @@ BlazeComponent.extendComponent({ 'click a.js-toggle-hide-card-counter-list': this.toggleHideCardCounterList, 'click a.js-toggle-hide-board-member-list': this.toggleHideBoardMemberList, 'click button.js-save-layout': this.saveLayout, - 'click a.js-toggle-support': this.toggleSupportPage, - 'click a.js-toggle-support-public': this.toggleSupportPublic, - 'click button.js-support-save': this.saveSupportSettings, 'click a.js-toggle-display-authentication-method': this .toggleDisplayAuthenticationMethod, }, diff --git a/client/components/settings/settingHeader.jade b/client/components/settings/settingHeader.jade index 7ce77ba4e..cbbb9b03b 100644 --- a/client/components/settings/settingHeader.jade +++ b/client/components/settings/settingHeader.jade @@ -5,31 +5,31 @@ template(name="settingHeaderBar") .setting-header-btns.left if currentUser a.setting-header-btn.settings(href="{{pathFor 'setting'}}") - span.emoji-icon ⚙️ + | ⚙️ span {{_ 'settings'}} a.setting-header-btn.people(href="{{pathFor 'people'}}") - span.emoji-icon 👥 + | 👥 span {{_ 'people'}} a.setting-header-btn.informations(href="{{pathFor 'admin-reports'}}") - span.emoji-icon 📋 + | 📋 span {{_ 'reports'}} a.setting-header-btn.informations(href="{{pathFor 'attachments'}}") - span.emoji-icon 📎 + | 📎 span {{_ 'attachments'}} a.setting-header-btn.informations(href="{{pathFor 'translation'}}") - span.emoji-icon 🔤 + | 🔤 span {{_ 'translation'}} a.setting-header-btn.informations(href="{{pathFor 'information'}}") - span.emoji-icon ℹ️ + | ℹ️ span {{_ 'info'}} else a.setting-header-btn.js-log-in( title="{{_ 'log-in'}}") - span.emoji-icon 🚪 + | 🚪 span {{_ 'log-in'}} diff --git a/client/components/settings/translationBody.js b/client/components/settings/translationBody.js index dcd1075fa..c9a5c71ad 100644 --- a/client/components/settings/translationBody.js +++ b/client/components/settings/translationBody.js @@ -208,7 +208,7 @@ Template.newTranslationPopup.events({ Template.settingsTranslationPopup.events({ 'click #deleteButton'(event) { event.preventDefault(); - Meteor.call('deleteTranslation', this.translationId); + Translation.remove(this.translationId); Popup.back(); } }); diff --git a/client/components/sidebar/sidebar.css b/client/components/sidebar/sidebar.css index 5b0ad44cf..831719f36 100644 --- a/client/components/sidebar/sidebar.css +++ b/client/components/sidebar/sidebar.css @@ -48,67 +48,6 @@ display: flex; flex-direction: column; } - -/* Use checklist-style green checkboxes for all sidebar checkboxes */ -.sidebar .materialCheckBox.is-checked, -.boardCardSettingsPopup .materialCheckBox.is-checked, -.boardSubtaskSettingsPopup .materialCheckBox.is-checked { - top: -4px !important; - left: -3px !important; - width: 7px !important; - height: 15px !important; - margin-right: 6px !important; - border-top: 2px solid transparent !important; - border-left: 2px solid transparent !important; - border-bottom: 2px solid #3cb500 !important; - border-right: 2px solid #3cb500 !important; - transform: rotate(40deg) !important; - -webkit-backface-visibility: hidden !important; - backface-visibility: hidden !important; - transform-origin: 100% 100% !important; -} - -/* Grey checkmarks when grey icons setting is enabled */ -body.grey-icons-enabled .sidebar .materialCheckBox.is-checked, -body.grey-icons-enabled .boardCardSettingsPopup .materialCheckBox.is-checked, -body.grey-icons-enabled .boardSubtaskSettingsPopup .materialCheckBox.is-checked { - border-bottom: 2px solid #7a7a7a !important; - border-right: 2px solid #7a7a7a !important; -} - -/* Card Settings 3-column grid layout */ -.card-settings-grid { - display: grid; - grid-template-columns: 1fr 1fr 2fr; - gap: 10px; - margin-bottom: 10px; -} - -.card-settings-row { - display: grid; - grid-template-columns: 1fr 1fr 2fr; - gap: 10px; - align-items: center; - padding: 5px 0; - border-bottom: 1px solid #eee; -} - -.card-settings-column { - display: flex; - align-items: center; - justify-content: center; -} - -.card-settings-column:last-child { - justify-content: flex-start; -} - -.card-settings-column h4 { - margin: 0; - font-size: 12px; - font-weight: bold; - text-align: center; -} .sidebar .sidebar-content ul.sidebar-list li > a { display: flex; height: 30px; @@ -138,11 +77,6 @@ body.grey-icons-enabled .boardSubtaskSettingsPopup .materialCheckBox.is-checked } .sidebar .sidebar-content ul.sidebar-list li > a .fa.fa-check { margin: 0 4px; - color: #3cb500; -} -/* Grey check icons when grey icons setting is enabled */ -body.grey-icons-enabled .sidebar .sidebar-content ul.sidebar-list li > a .fa.fa-check { - color: #7a7a7a; } .sidebar .sidebar-content ul.sidebar-list li .minicard { padding: 6px 8px 4px; @@ -162,9 +96,6 @@ body.grey-icons-enabled .sidebar .sidebar-content ul.sidebar-list li > a .fa.fa- border-radius: 3px; background: #e6e6e6; } -.sidebar .sidebar-content .sidebar-btn * { - color: #fff; -} .sidebar .sidebar-content .sidebar-btn:hover * { color: #fff; } diff --git a/client/components/sidebar/sidebar.jade b/client/components/sidebar/sidebar.jade index 02ef256ef..d63ea9d98 100644 --- a/client/components/sidebar/sidebar.jade +++ b/client/components/sidebar/sidebar.jade @@ -34,26 +34,32 @@ template(name='homeSidebar') hr ul#cards.label-text-hidden a.flex.js-toggle-minicard-label-text(title="{{_ 'hide-minicard-label-text'}}") - span {{#if hiddenMinicardLabelText}}✅{{else}}⬜{{/if}} span {{_ 'hide-minicard-label-text'}} + b   + .materialCheckBox(class="{{#if hiddenMinicardLabelText}}is-checked{{/if}}") if currentUser ul#cards.vertical-scrollbars-toggle a.flex.js-vertical-scrollbars-toggle(title="{{_ 'enable-vertical-scrollbars'}}") - span {{#if isVerticalScrollbars}}✅{{else}}⬜{{/if}} span {{_ 'enable-vertical-scrollbars'}} + b   + .materialCheckBox(class="{{#if isVerticalScrollbars}}is-checked{{/if}}") ul#cards.show-week-of-year-toggle a.flex.js-show-week-of-year-toggle(title="{{_ 'show-week-of-year'}}") - span {{#if isShowWeekOfYear}}✅{{else}}⬜{{/if}} span {{_ 'show-week-of-year'}} + b   + .materialCheckBox(class="{{#if isShowWeekOfYear}}is-checked{{/if}}") hr unless currentUser.isNoComments h3.activity-title | 💬 | {{_ 'activities'}} - a.flex.js-toggle-show-activities(title="{{_ 'show-activities'}}") - span {{#if showActivities}}✅{{else}}⬜{{/if}} - span {{_ 'show-activities'}} + .material-toggle-switch(title="{{_ 'show-activities'}}") + if showActivities + input.toggle-switch(type="checkbox" id="toggleShowActivitiesBoard" checked="checked") + else + input.toggle-switch(type="checkbox" id="toggleShowActivitiesBoard") + label.toggle-label(for="toggleShowActivitiesBoard") +activities(mode="board") template(name="membersWidget") @@ -155,7 +161,7 @@ template(name="boardChangeColorPopup") span.background-box(class="board-color-{{this}}") span {{this}} if isSelected - span.checkmark-no-grey ✅ + | ✅ template(name="boardChangeBackgroundImagePopup") form @@ -179,282 +185,165 @@ template(name="boardInfoOnMyBoardsPopup") unless currentSetting.hideCardCounterList div.check-div a.flex.js-field-has-cardcounterlist(class="{{#if allowsCardCounterList}}is-checked{{/if}}") - span {{#if allowsCardCounterList}}✅{{else}}⬜{{/if}} + .materialCheckBox(class="{{#if allowsCardCounterList}}is-checked{{/if}}") span | 🚪 | {{_ 'show-card-counter-per-list'}} unless currentSetting.hideBoardMemberList div.check-div a.flex.js-field-has-boardmemberlist(class="{{#if allowsBoardMemberList}}is-checked{{/if}}") - span {{#if allowsBoardMemberList}}✅{{else}}⬜{{/if}} + .materialCheckBox(class="{{#if allowsBoardMemberList}}is-checked{{/if}}") span | ⏳ | {{_ 'show-board_members-avatar'}} template(name="boardCardSettingsPopup") form.board-card-settings - .card-settings-grid - .card-settings-column - h4 {{_ 'show-on-card'}} - .card-settings-column - h4 {{_ 'show-on-minicard'}} - .card-settings-column - h4 {{_ 'description'}} - .card-settings-row - .card-settings-column - a.flex.js-field-has-receiveddate(title="{{_ 'card-received'}}" class="{{#if allowsReceivedDate}}is-checked{{/if}}") - span {{#if allowsReceivedDate}}✅{{else}}⬜{{/if}} - .card-settings-column - a.flex.js-field-has-receiveddate(title="{{_ 'card-received'}}" class="{{#if allowsReceivedDate}}is-checked{{/if}}") - span {{#if allowsReceivedDate}}✅{{else}}⬜{{/if}} - .card-settings-column + h3 {{_ 'show-on-card'}}, {{_ 'show-on-minicard'}} + div.check-div + a.flex.js-field-has-receiveddate(class="{{#if allowsReceivedDate}}is-checked{{/if}}") + .materialCheckBox(class="{{#if allowsReceivedDate}}is-checked{{/if}}") span | 🚪 | {{_ 'card-received'}} - .card-settings-row - .card-settings-column - a.flex.js-field-has-startdate(title="{{_ 'card-start'}}" class="{{#if allowsStartDate}}is-checked{{/if}}") - span {{#if allowsStartDate}}✅{{else}}⬜{{/if}} - .card-settings-column - a.flex.js-field-has-startdate(title="{{_ 'card-start'}}" class="{{#if allowsStartDate}}is-checked{{/if}}") - span {{#if allowsStartDate}}✅{{else}}⬜{{/if}} - .card-settings-column + div.check-div + a.flex.js-field-has-startdate(class="{{#if allowsStartDate}}is-checked{{/if}}") + .materialCheckBox(class="{{#if allowsStartDate}}is-checked{{/if}}") span | ⏳ | {{_ 'card-start'}} - .card-settings-row - .card-settings-column - a.flex.js-field-has-duedate(title="{{_ 'card-due'}}" class="{{#if allowsDueDate}}is-checked{{/if}}") - span {{#if allowsDueDate}}✅{{else}}⬜{{/if}} - .card-settings-column - a.flex.js-field-has-duedate(title="{{_ 'card-due'}}" class="{{#if allowsDueDate}}is-checked{{/if}}") - span {{#if allowsDueDate}}✅{{else}}⬜{{/if}} - .card-settings-column + div.check-div + a.flex.js-field-has-duedate(class="{{#if allowsDueDate}}is-checked{{/if}}") + .materialCheckBox(class="{{#if allowsDueDate}}is-checked{{/if}}") span | 🚪 | {{_ 'card-due'}} - .card-settings-row - .card-settings-column - a.flex.js-field-has-enddate(title="{{_ 'card-end'}}" class="{{#if allowsEndDate}}is-checked{{/if}}") - span {{#if allowsEndDate}}✅{{else}}⬜{{/if}} - .card-settings-column - a.flex.js-field-has-enddate(title="{{_ 'card-end'}}" class="{{#if allowsEndDate}}is-checked{{/if}}") - span {{#if allowsEndDate}}✅{{else}}⬜{{/if}} - .card-settings-column + div.check-div + a.flex.js-field-has-enddate(class="{{#if allowsEndDate}}is-checked{{/if}}") + .materialCheckBox(class="{{#if allowsEndDate}}is-checked{{/if}}") span | ⏰ | {{_ 'card-end'}} - .card-settings-row - .card-settings-column - a.flex.js-field-has-members(title="{{_ 'members'}}" class="{{#if allowsMembers}}is-checked{{/if}}") - span {{#if allowsMembers}}✅{{else}}⬜{{/if}} - .card-settings-column - a.flex.js-field-has-members(title="{{_ 'members'}}" class="{{#if allowsMembers}}is-checked{{/if}}") - span {{#if allowsMembers}}✅{{else}}⬜{{/if}} - .card-settings-column + div.check-div + a.flex.js-field-has-members(class="{{#if allowsMembers}}is-checked{{/if}}") + .materialCheckBox(class="{{#if allowsMembers}}is-checked{{/if}}") span | 👥 | {{_ 'members'}} - .card-settings-row - .card-settings-column - a.flex.js-field-has-creator(title="{{_ 'creator'}}" class="{{#if allowsCreator}}is-checked{{/if}}") - span {{#if allowsCreator}}✅{{else}}⬜{{/if}} - .card-settings-column - span - .card-settings-column + div.check-div + a.flex.js-field-has-creator(class="{{#if allowsCreator}}is-checked{{/if}}") + .materialCheckBox(class="{{#if allowsCreator}}is-checked{{/if}}") span | 👤 | {{_ 'creator'}} - .card-settings-row - .card-settings-column - span - .card-settings-column - a.flex.js-field-has-creator-on-minicard(title="{{_ 'creator-on-minicard'}}" class="{{#if allowsCreatorOnMinicard}}is-checked{{/if}}") - span {{#if allowsCreatorOnMinicard}}✅{{else}}⬜{{/if}} - .card-settings-column + div.check-div + a.flex.js-field-has-creator-on-minicard(class="{{#if allowsCreatorOnMinicard}}is-checked{{/if}}") + .materialCheckBox(class="{{#if allowsCreatorOnMinicard}}is-checked{{/if}}") span | 👤 | {{_ 'creator-on-minicard'}} - .card-settings-row - .card-settings-column - a.flex.js-field-has-assignee(title="{{_ 'assignee'}}" class="{{#if allowsAssignee}}is-checked{{/if}}") - span {{#if allowsAssignee}}✅{{else}}⬜{{/if}} - .card-settings-column - a.flex.js-field-has-assignee(title="{{_ 'assignee'}}" class="{{#if allowsAssignee}}is-checked{{/if}}") - span {{#if allowsAssignee}}✅{{else}}⬜{{/if}} - .card-settings-column + div.check-div + a.flex.js-field-has-assignee(class="{{#if allowsAssignee}}is-checked{{/if}}") + .materialCheckBox(class="{{#if allowsAssignee}}is-checked{{/if}}") span | 👤 | {{_ 'assignee'}} - .card-settings-row - .card-settings-column - a.flex.js-field-has-assigned-by(title="{{_ 'assigned-by'}}" class="{{#if allowsAssignedBy}}is-checked{{/if}}") - span {{#if allowsAssignedBy}}✅{{else}}⬜{{/if}} - .card-settings-column - a.flex.js-field-has-assigned-by(title="{{_ 'assigned-by'}}" class="{{#if allowsAssignedBy}}is-checked{{/if}}") - span {{#if allowsAssignedBy}}✅{{else}}⬜{{/if}} - .card-settings-column + div.check-div + a.flex.js-field-has-assigned-by(class="{{#if allowsAssignedBy}}is-checked{{/if}}") + .materialCheckBox(class="{{#if allowsAssignedBy}}is-checked{{/if}}") span | 🛒 | {{_ 'assigned-by'}} - .card-settings-row - .card-settings-column - a.flex.js-field-has-requested-by(title="{{_ 'requested-by'}}" class="{{#if allowsRequestedBy}}is-checked{{/if}}") - span {{#if allowsRequestedBy}}✅{{else}}⬜{{/if}} - .card-settings-column - a.flex.js-field-has-requested-by(title="{{_ 'requested-by'}}" class="{{#if allowsRequestedBy}}is-checked{{/if}}") - span {{#if allowsRequestedBy}}✅{{else}}⬜{{/if}} - .card-settings-column + div.check-div + a.flex.js-field-has-requested-by(class="{{#if allowsRequestedBy}}is-checked{{/if}}") + .materialCheckBox(class="{{#if allowsRequestedBy}}is-checked{{/if}}") span | 👤➕ | {{_ 'requested-by'}} - .card-settings-row - .card-settings-column - a.flex.js-field-has-card-sorting-by-number(title="{{_ 'card-sorting-by-number'}}" class="{{#if allowsCardSortingByNumber}}is-checked{{/if}}") - span {{#if allowsCardSortingByNumber}}✅{{else}}⬜{{/if}} - .card-settings-column - span - .card-settings-column + div.check-div + a.flex.js-field-has-card-sorting-by-number(class="{{#if allowsCardSortingByNumber}}is-checked{{/if}}") + .materialCheckBox(class="{{#if allowsCardSortingByNumber}}is-checked{{/if}}") span | 🔢 | {{_ 'card-sorting-by-number'}} - .card-settings-row - .card-settings-column - span - .card-settings-column - a.flex.js-field-has-card-sorting-by-number-on-minicard(title="{{_ 'card-sorting-by-number-on-minicard'}}" class="{{#if allowsCardSortingByNumberOnMinicard}}is-checked{{/if}}") - span {{#if allowsCardSortingByNumberOnMinicard}}✅{{else}}⬜{{/if}} - .card-settings-column + div.check-div + a.flex.js-field-has-card-sorting-by-number-on-minicard(class="{{#if allowsCardSortingByNumberOnMinicard}}is-checked{{/if}}") + .materialCheckBox(class="{{#if allowsCardSortingByNumberOnMinicard}}is-checked{{/if}}") span | 🔢 | {{_ 'card-sorting-by-number-on-minicard'}} - .card-settings-row - .card-settings-column - a.flex.js-field-has-card-show-lists(title="{{_ 'card-show-lists'}}" class="{{#if allowsShowLists}}is-checked{{/if}}") - span {{#if allowsShowLists}}✅{{else}}⬜{{/if}} - .card-settings-column - span - .card-settings-column + div.check-div + a.flex.js-field-has-card-show-lists(class="{{#if allowsShowLists}}is-checked{{/if}}") + .materialCheckBox(class="{{#if allowsShowLists}}is-checked{{/if}}") span | 📋 | {{_ 'card-show-lists'}} - .card-settings-row - .card-settings-column - a.flex.js-field-has-labels(title="{{_ 'labels'}}" class="{{#if allowsLabels}}is-checked{{/if}}") - span {{#if allowsLabels}}✅{{else}}⬜{{/if}} - .card-settings-column - a.flex.js-field-has-labels(title="{{_ 'labels'}}" class="{{#if allowsLabels}}is-checked{{/if}}") - span {{#if allowsLabels}}✅{{else}}⬜{{/if}} - .card-settings-column + div.check-div + a.flex.js-field-has-labels(class="{{#if allowsLabels}}is-checked{{/if}}") + .materialCheckBox(class="{{#if allowsLabels}}is-checked{{/if}}") span | 🏷️ | {{_ 'labels'}} - .card-settings-row - .card-settings-column - span - .card-settings-column - a.flex.js-field-has-card-show-lists-on-minicard(title="{{_ 'card-show-lists-on-minicard'}}" class="{{#if allowsShowListsOnMinicard}}is-checked{{/if}}") - span {{#if allowsShowListsOnMinicard}}✅{{else}}⬜{{/if}} - .card-settings-column + div.check-div + a.flex.js-field-has-card-show-lists-on-minicard(class="{{#if allowsShowListsOnMinicard}}is-checked{{/if}}") + .materialCheckBox(class="{{#if allowsShowListsOnMinicard}}is-checked{{/if}}") span | 📋 | {{_ 'card-show-lists-on-minicard'}} - .card-settings-row - .card-settings-column - a.flex.js-field-has-card-number(title="{{_ 'card'}} {{_ 'number'}}" class="{{#if allowsCardNumber}}is-checked{{/if}}") - span {{#if allowsCardNumber}}✅{{else}}⬜{{/if}} - .card-settings-column - a.flex.js-field-has-card-number(title="{{_ 'card'}} {{_ 'number'}}" class="{{#if allowsCardNumber}}is-checked{{/if}}") - span {{#if allowsCardNumber}}✅{{else}}⬜{{/if}} - .card-settings-column + div.check-div + a.flex.js-field-has-card-number(class="{{#if allowsCardNumber}}is-checked{{/if}}") + .materialCheckBox(class="{{#if allowsCardNumber}}is-checked{{/if}}") span | #️⃣ | {{_ 'card'}} | {{_ 'number'}} - .card-settings-row - .card-settings-column - a.flex.js-field-has-description-title(title="{{_ 'description'}} {{_ 'title'}}" class="{{#if allowsDescriptionTitle}}is-checked{{/if}}") - span {{#if allowsDescriptionTitle}}✅{{else}}⬜{{/if}} - .card-settings-column - a.flex.js-field-has-description-title(title="{{_ 'description'}} {{_ 'title'}}" class="{{#if allowsDescriptionTitle}}is-checked{{/if}}") - span {{#if allowsDescriptionTitle}}✅{{else}}⬜{{/if}} - .card-settings-column + div.check-div + a.flex.js-field-has-description-title(class="{{#if allowsDescriptionTitle}}is-checked{{/if}}") + .materialCheckBox(class="{{#if allowsDescriptionTitle}}is-checked{{/if}}") span | 📝 | {{_ 'description'}} | {{_ 'title'}} - .card-settings-row - .card-settings-column - a.flex.js-field-has-description-text(title="{{_ 'description'}} {{_ 'custom-field-text'}}" class="{{#if allowsDescriptionText}}is-checked{{/if}}") - span {{#if allowsDescriptionText}}✅{{else}}⬜{{/if}} - .card-settings-column - a.flex.js-field-has-description-text(title="{{_ 'description'}} {{_ 'custom-field-text'}}" class="{{#if allowsDescriptionText}}is-checked{{/if}}") - span {{#if allowsDescriptionText}}✅{{else}}⬜{{/if}} - .card-settings-column + div.check-div + a.flex.js-field-has-description-text(class="{{#if allowsDescriptionText}}is-checked{{/if}}") + .materialCheckBox(class="{{#if allowsDescriptionText}}is-checked{{/if}}") span | 📝 | {{_ 'description'}} | {{_ 'custom-field-text'}} - .card-settings-row - .card-settings-column - span - .card-settings-column - a.flex.js-field-has-description-text-on-minicard(title="{{_ 'description-on-minicard'}}" class="{{#if allowsDescriptionTextOnMinicard}}is-checked{{/if}}") - span {{#if allowsDescriptionTextOnMinicard}}✅{{else}}⬜{{/if}} - .card-settings-column + div.check-div + a.flex.js-field-has-description-text-on-minicard(class="{{#if allowsDescriptionTextOnMinicard}}is-checked{{/if}}") + .materialCheckBox(class="{{#if allowsDescriptionTextOnMinicard}}is-checked{{/if}}") span | 📝 | {{_ 'description-on-minicard'}} - .card-settings-row - .card-settings-column - a.flex.js-field-has-checklists(title="{{_ 'checklists'}}" class="{{#if allowsChecklists}}is-checked{{/if}}") - span {{#if allowsChecklists}}✅{{else}}⬜{{/if}} - .card-settings-column - a.flex.js-field-has-checklists(title="{{_ 'checklists'}}" class="{{#if allowsChecklists}}is-checked{{/if}}") - span {{#if allowsChecklists}}✅{{else}}⬜{{/if}} - .card-settings-column + div.check-div + a.flex.js-field-has-checklists(class="{{#if allowsChecklists}}is-checked{{/if}}") + .materialCheckBox(class="{{#if allowsChecklists}}is-checked{{/if}}") span | ✅ | {{_ 'checklists'}} - .card-settings-row - .card-settings-column - a.flex.js-field-has-subtasks(title="{{_ 'subtasks'}}" class="{{#if allowsSubtasks}}is-checked{{/if}}") - span {{#if allowsSubtasks}}✅{{else}}⬜{{/if}} - .card-settings-column - a.flex.js-field-has-subtasks(title="{{_ 'subtasks'}}" class="{{#if allowsSubtasks}}is-checked{{/if}}") - span {{#if allowsSubtasks}}✅{{else}}⬜{{/if}} - .card-settings-column + div.check-div + a.flex.js-field-has-subtasks(class="{{#if allowsSubtasks}}is-checked{{/if}}") + .materialCheckBox(class="{{#if allowsSubtasks}}is-checked{{/if}}") span | 🌐 | {{_ 'subtasks'}} - .card-settings-row - .card-settings-column - a.flex.js-field-has-attachments(title="{{_ 'attachments'}}" class="{{#if allowsAttachments}}is-checked{{/if}}") - span {{#if allowsAttachments}}✅{{else}}⬜{{/if}} - .card-settings-column - a.flex.js-field-has-attachments(title="{{_ 'attachments'}}" class="{{#if allowsAttachments}}is-checked{{/if}}") - span {{#if allowsAttachments}}✅{{else}}⬜{{/if}} - .card-settings-column + div.check-div + a.flex.js-field-has-attachments(class="{{#if allowsAttachments}}is-checked{{/if}}") + .materialCheckBox(class="{{#if allowsAttachments}}is-checked{{/if}}") span | 📎 | {{_ 'attachments'}} - .card-settings-row - .card-settings-column - span - .card-settings-column - a.flex.js-field-has-badge-attachment-on-minicard(title="{{_ 'badge-attachment-on-minicard'}}" class="{{#if allowsBadgeAttachmentOnMinicard}}is-checked{{/if}}") - span {{#if allowsBadgeAttachmentOnMinicard}}✅{{else}}⬜{{/if}} - .card-settings-column + div.check-div + a.flex.js-field-has-badge-attachment-on-minicard(class="{{#if allowsBadgeAttachmentOnMinicard}}is-checked{{/if}}") + .materialCheckBox(class="{{#if allowsBadgeAttachmentOnMinicard}}is-checked{{/if}}") span | 📎 | {{_ 'badge-attachment-on-minicard'}} - .card-settings-row - .card-settings-column - span - .card-settings-column - a.flex.js-field-has-cover-attachment-on-minicard(title="{{_ 'cover-attachment-on-minicard'}}" class="{{#if allowsCoverAttachmentOnMinicard}}is-checked{{/if}}") - span {{#if allowsCoverAttachmentOnMinicard}}✅{{else}}⬜{{/if}} - .card-settings-column + div.check-div + a.flex.js-field-has-cover-attachment-on-minicard(class="{{#if allowsCoverAttachmentOnMinicard}}is-checked{{/if}}") + .materialCheckBox(class="{{#if allowsCoverAttachmentOnMinicard}}is-checked{{/if}}") span | 📖 | 🖼️ @@ -475,27 +364,27 @@ template(name="boardCardSettingsPopup") template(name="boardSubtaskSettingsPopup") form.board-subtask-settings h3 {{_ 'show-parent-in-minicard'}} - a#prefix-with-full-path.flex.js-field-show-parent-in-minicard(title="{{_ 'prefix-with-full-path'}}" class="{{#if $eq presentParentTask 'prefix-with-full-path'}}is-checked{{/if}}") - span {{#if $eq presentParentTask 'prefix-with-full-path'}}✅{{else}}⬜{{/if}} + a#prefix-with-full-path.flex.js-field-show-parent-in-minicard(class="{{#if $eq presentParentTask 'prefix-with-full-path'}}is-checked{{/if}}") + .materialCheckBox(class="{{#if $eq presentParentTask 'prefix-with-full-path'}}is-checked{{/if}}") span {{_ 'prefix-with-full-path'}} - a#prefix-with-parent.flex.js-field-show-parent-in-minicard(title="{{_ 'prefix-with-parent'}}" class="{{#if $eq presentParentTask 'prefix-with-parent'}}is-checked{{/if}}") - span {{#if $eq presentParentTask 'prefix-with-parent'}}✅{{else}}⬜{{/if}} + a#prefix-with-parent.flex.js-field-show-parent-in-minicard(class="{{#if $eq presentParentTask 'prefix-with-parent'}}is-checked{{/if}}") + .materialCheckBox(class="{{#if $eq presentParentTask 'prefix-with-parent'}}is-checked{{/if}}") span {{_ 'prefix-with-parent'}} - a#subtext-with-full-path.flex.js-field-show-parent-in-minicard(title="{{_ 'subtext-with-full-path'}}" class="{{#if $eq presentParentTask 'subtext-with-full-path'}}is-checked{{/if}}") - span {{#if $eq presentParentTask 'subtext-with-full-path'}}✅{{else}}⬜{{/if}} + a#subtext-with-full-path.flex.js-field-show-parent-in-minicard(class="{{#if $eq presentParentTask 'subtext-with-full-path'}}is-checked{{/if}}") + .materialCheckBox(class="{{#if $eq presentParentTask 'subtext-with-full-path'}}is-checked{{/if}}") span {{_ 'subtext-with-full-path'}} - a#subtext-with-parent.flex.js-field-show-parent-in-minicard(title="{{_ 'subtext-with-parent'}}" class="{{#if $eq presentParentTask 'subtext-with-parent'}}is-checked{{/if}}") - span {{#if $eq presentParentTask 'subtext-with-parent'}}✅{{else}}⬜{{/if}} + a#subtext-with-parent.flex.js-field-show-parent-in-minicard(class="{{#if $eq presentParentTask 'subtext-with-parent'}}is-checked{{/if}}") + .materialCheckBox(class="{{#if $eq presentParentTask 'subtext-with-parent'}}is-checked{{/if}}") span {{_ 'subtext-with-parent'}} - a#no-parent.flex.js-field-show-parent-in-minicard(title="{{_ 'no-parent'}}" class="{{#if $eq presentParentTask 'no-parent'}}is-checked{{/if}}") - span {{#if $eq presentParentTask 'no-parent'}}✅{{else}}⬜{{/if}} + a#no-parent.flex.js-field-show-parent-in-minicard(class="{{#if $eq presentParentTask 'no-parent'}}is-checked{{/if}}") + .materialCheckBox(class="{{#if $eq presentParentTask 'no-parent'}}is-checked{{/if}}") span {{_ 'no-parent'}} div hr div.check-div - a.flex.js-field-has-subtasks(title="{{_ 'show-subtasks-field'}}" class="{{#if allowsSubtasks}}is-checked{{/if}}") - span {{#if allowsSubtasks}}✅{{else}}⬜{{/if}} + a.flex.js-field-has-subtasks(class="{{#if allowsSubtasks}}is-checked{{/if}}") + .materialCheckBox(class="{{#if allowsSubtasks}}is-checked{{/if}}") span {{_ 'show-subtasks-field'}} label @@ -537,18 +426,13 @@ template(name="archiveBoardPopup") | 📦 | {{_ 'archive'}} -template(name="deleteDuplicateListsPopup") - p {{_ 'delete-duplicate-lists-confirm'}} - button.js-confirm.negate.full(type="submit") - | 🗑️ - | {{_ 'delete'}} - template(name="outgoingWebhooksPopup") each integrations form.integration-form a.flex - span {{#unless enabled}}✅{{else}}⬜{{/unless}} span {{_ 'disable-webhook'}} + b   + .materialCheckBox(class="{{#unless enabled}}is-checked{{/unless}}") input.js-outgoing-webhooks-title(placeholder="{{_ 'webhook-title'}}" type="text" name="title" value=title) input.js-outgoing-webhooks-url(type="text" name="url" value=url) input.js-outgoing-webhooks-token(placeholder="{{_ 'webhook-token' }}" type="text" value=token name="token") @@ -575,8 +459,7 @@ template(name="boardMenuPopup") if currentUser.isBoardAdmin li a.js-open-rules-view(title="{{_ 'rules'}}") - span.emoji-icon - | ✨ + | ✨ | {{_ 'rules'}} if currentUser.isBoardAdmin li @@ -628,14 +511,9 @@ template(name="boardMenuPopup") if currentUser.isBoardAdmin hr ul.pop-over-list - // li - // a.js-delete-duplicate-lists - // | 🗑️ - // | {{_ 'delete-duplicate-lists'}} li a.js-archive-board - span.emoji-icon - | ➡️📦 + | ➡️📦 | {{_ 'archive-board'}} template(name="exportBoard") @@ -753,7 +631,7 @@ template(name="removeBoardTeamPopup") template(name="addMemberPopup") .js-search-member - input.js-search-member-input(type="text" placeholder="{{_ 'email-address'}}") + +EasySearch.Input(index=searchIndex) if loading.get +spinner @@ -761,38 +639,25 @@ template(name="addMemberPopup") .warning {{_ error.get}} else ul.pop-over-list - each searchResults + +EasySearch.Each(index=searchIndex) li.item.js-member-item(class="{{#if isBoardMember}}disabled{{/if}}") a.name.js-select-member(title="{{profile.fullname}} ({{username}})") - +userAvatar(userId=_id) + +userAvatar(userId=__originalId) span.full-name = profile.fullname | ({{username}}) if isBoardMember .quiet ({{_ 'joined'}}) - if searching.get + +EasySearch.IfSearching(index=searchIndex) +spinner - if noResults.get + +EasySearch.IfNoResults(index=searchIndex) .manage-member-section p.quiet {{_ 'no-results'}} button.js-email-invite.primary.full {{_ 'email-invite'}} -template(name="addMemberPopupTest") - .js-search-member - input.js-search-member-input(type="text" placeholder="{{_ 'email-address'}}") - ul.pop-over-list - each searchResults - li.item.js-member-item - a.name.js-select-member(title="{{profile.fullname}} ({{username}})") - +userAvatar(userId=_id) - span.full-name - = profile.fullname - | ({{username}}) - button.js-email-invite.primary.full {{_ 'email-invite'}} - template(name="changePermissionsPopup") ul.pop-over-list li @@ -807,12 +672,6 @@ template(name="changePermissionsPopup") if isNormal | ✅ span.sub-name {{_ 'normal-desc'}} - li - a(class="{{#if isLastAdmin}}disabled{{else}}js-set-normal-assigned-only{{/if}}") - | {{_ 'normal-assigned-only'}} - if isNormalAssignedOnly - | ✅ - span.sub-name {{_ 'normal-assigned-only-desc'}} li a(class="{{#if isLastAdmin}}disabled{{else}}js-set-no-comments{{/if}}") | {{_ 'no-comments'}} @@ -825,24 +684,6 @@ template(name="changePermissionsPopup") if isCommentOnly | ✅ span.sub-name {{_ 'comment-only-desc'}} - li - a(class="{{#if isLastAdmin}}disabled{{else}}js-set-comment-assigned-only{{/if}}") - | {{_ 'comment-assigned-only'}} - if isCommentAssignedOnly - | ✅ - span.sub-name {{_ 'comment-assigned-only-desc'}} - li - a(class="{{#if isLastAdmin}}disabled{{else}}js-set-read-only{{/if}}") - | {{_ 'read-only'}} - if isReadOnly - | ✅ - span.sub-name {{_ 'read-only-desc'}} - li - a(class="{{#if isLastAdmin}}disabled{{else}}js-set-read-assigned-only{{/if}}") - | {{_ 'read-assigned-only'}} - if isReadAssignedOnly - | ✅ - span.sub-name {{_ 'read-assigned-only-desc'}} li a(class="{{#if isLastAdmin}}disabled{{else}}js-set-worker{{/if}}") | {{_ 'worker'}} diff --git a/client/components/sidebar/sidebar.js b/client/components/sidebar/sidebar.js index c61ff3996..9f1d9c5c1 100644 --- a/client/components/sidebar/sidebar.js +++ b/client/components/sidebar/sidebar.js @@ -195,7 +195,7 @@ BlazeComponent.extendComponent({ events() { return [ { - 'click .js-toggle-show-activities'() { + 'click #toggleShowActivitiesBoard'() { Utils.getCurrentBoard().toggleShowActivities(); }, }, @@ -238,20 +238,8 @@ Template.memberPopup.helpers({ const commentOnly = currentBoard.hasCommentOnly(this.userId); const noComments = currentBoard.hasNoComments(this.userId); const worker = currentBoard.hasWorker(this.userId); - const normalAssignedOnly = currentBoard.hasNormalAssignedOnly(this.userId); - const commentAssignedOnly = currentBoard.hasCommentAssignedOnly(this.userId); - const readOnly = currentBoard.hasReadOnly(this.userId); - const readAssignedOnly = currentBoard.hasReadAssignedOnly(this.userId); - if (readAssignedOnly) { - return TAPi18n.__('read-assigned-only'); - } else if (readOnly) { - return TAPi18n.__('read-only'); - } else if (commentAssignedOnly) { - return TAPi18n.__('comment-assigned-only'); - } else if (commentOnly) { + if (commentOnly) { return TAPi18n.__('comment-only'); - } else if (normalAssignedOnly) { - return TAPi18n.__('normal-assigned-only'); } else if (noComments) { return TAPi18n.__('no-comments'); } else if (worker) { @@ -287,45 +275,6 @@ Template.boardMenuPopup.events({ 'click .js-change-background-image': Popup.open('boardChangeBackgroundImage'), 'click .js-board-info-on-my-boards': Popup.open('boardInfoOnMyBoards'), 'click .js-change-language': Popup.open('changeLanguage'), - 'click .js-delete-duplicate-lists': Popup.afterConfirm('deleteDuplicateLists', function() { - const currentBoard = Utils.getCurrentBoard(); - if (!currentBoard) return; - - // Get all lists in the current board - const allLists = ReactiveCache.getLists({ boardId: currentBoard._id, archived: false }); - - // Group lists by title to find duplicates - const listsByTitle = {}; - allLists.forEach(list => { - if (!listsByTitle[list.title]) { - listsByTitle[list.title] = []; - } - listsByTitle[list.title].push(list); - }); - - // Find and delete duplicate lists that have no cards - let deletedCount = 0; - Object.keys(listsByTitle).forEach(title => { - const listsWithSameTitle = listsByTitle[title]; - if (listsWithSameTitle.length > 1) { - // Keep the first list, delete the rest if they have no cards - for (let i = 1; i < listsWithSameTitle.length; i++) { - const list = listsWithSameTitle[i]; - const cardsInList = ReactiveCache.getCards({ listId: list._id, archived: false }); - - if (cardsInList.length === 0) { - Lists.remove(list._id); - deletedCount++; - } - } - } - }); - - // Show notification - if (deletedCount > 0) { - // You could add a toast notification here if available - } - }), 'click .js-archive-board ': Popup.afterConfirm('archiveBoard', function() { const currentBoard = Utils.getCurrentBoard(); currentBoard.archive(); @@ -401,7 +350,6 @@ Template.memberPopup.events({ FlowRouter.go('home'); }); }), - }); Template.removeMemberPopup.helpers({ @@ -874,11 +822,7 @@ BlazeComponent.extendComponent({ }, allowsSubtasks() { - // Get the current board reactively using board ID from Session - const boardId = Session.get('currentBoard'); - const currentBoard = ReactiveCache.getBoard(boardId); - const result = currentBoard ? currentBoard.allowsSubtasks : false; - return result; + return this.currentBoard.allowsSubtasks; }, allowsReceivedDate() { @@ -930,11 +874,7 @@ BlazeComponent.extendComponent({ }, presentParentTask() { - // Get the current board reactively using board ID from Session - const boardId = Session.get('currentBoard'); - const currentBoard = ReactiveCache.getBoard(boardId); - - let result = currentBoard ? currentBoard.presentParentTask : null; + let result = this.currentBoard.presentParentTask; if (result === null || result === undefined) { result = 'no-parent'; } @@ -946,11 +886,19 @@ BlazeComponent.extendComponent({ { 'click .js-field-has-subtasks'(evt) { evt.preventDefault(); - const newValue = !this.currentBoard.allowsSubtasks; - Boards.update(this.currentBoard._id, { $set: { allowsSubtasks: newValue } }); + this.currentBoard.allowsSubtasks = !this.currentBoard.allowsSubtasks; + this.currentBoard.setAllowsSubtasks(this.currentBoard.allowsSubtasks); + $(`.js-field-has-subtasks ${MCB}`).toggleClass( + CKCLS, + this.currentBoard.allowsSubtasks, + ); + $('.js-field-has-subtasks').toggleClass( + CKCLS, + this.currentBoard.allowsSubtasks, + ); $('.js-field-deposit-board').prop( 'disabled', - !newValue, + !this.currentBoard.allowsSubtasks, ); }, 'change .js-field-deposit-board'(evt) { @@ -966,13 +914,28 @@ BlazeComponent.extendComponent({ evt.preventDefault(); }, 'click .js-field-show-parent-in-minicard'(evt) { - // Get the ID from the anchor element, not the span - const anchorElement = $(evt.target).closest('.js-field-show-parent-in-minicard')[0]; - const value = anchorElement ? anchorElement.id : null; - - if (value) { - Boards.update(this.currentBoard._id, { $set: { presentParentTask: value } }); - } + const value = + evt.target.id || + $(evt.target).parent()[0].id || + $(evt.target) + .parent()[0] + .parent()[0].id; + const options = [ + 'prefix-with-full-path', + 'prefix-with-parent', + 'subtext-with-full-path', + 'subtext-with-parent', + 'no-parent', + ]; + options.forEach(function(element) { + if (element !== value) { + $(`#${element} ${MCB}`).toggleClass(CKCLS, false); + $(`#${element}`).toggleClass(CKCLS, false); + } + }); + $(`#${value} ${MCB}`).toggleClass(CKCLS, true); + $(`#${value}`).toggleClass(CKCLS, true); + this.currentBoard.setPresentParentTask(value); evt.preventDefault(); }, }, @@ -986,168 +949,115 @@ BlazeComponent.extendComponent({ }, allowsReceivedDate() { - const boardId = Session.get('currentBoard'); - const currentBoard = ReactiveCache.getBoard(boardId); - return currentBoard ? currentBoard.allowsReceivedDate : false; + return this.currentBoard.allowsReceivedDate; }, allowsStartDate() { - const boardId = Session.get('currentBoard'); - const currentBoard = ReactiveCache.getBoard(boardId); - return currentBoard ? currentBoard.allowsStartDate : false; + return this.currentBoard.allowsStartDate; }, allowsDueDate() { - const boardId = Session.get('currentBoard'); - const currentBoard = ReactiveCache.getBoard(boardId); - return currentBoard ? currentBoard.allowsDueDate : false; + return this.currentBoard.allowsDueDate; }, allowsEndDate() { - const boardId = Session.get('currentBoard'); - const currentBoard = ReactiveCache.getBoard(boardId); - return currentBoard ? currentBoard.allowsEndDate : false; + return this.currentBoard.allowsEndDate; }, allowsSubtasks() { - const boardId = Session.get('currentBoard'); - const currentBoard = ReactiveCache.getBoard(boardId); - return currentBoard ? currentBoard.allowsSubtasks : false; + return this.currentBoard.allowsSubtasks; }, allowsCreator() { - const boardId = Session.get('currentBoard'); - const currentBoard = ReactiveCache.getBoard(boardId); - return currentBoard ? (currentBoard.allowsCreator ?? false) : false; + return this.currentBoard.allowsCreator ?? false; }, allowsCreatorOnMinicard() { - const boardId = Session.get('currentBoard'); - const currentBoard = ReactiveCache.getBoard(boardId); - return currentBoard ? (currentBoard.allowsCreatorOnMinicard ?? false) : false; + return this.currentBoard.allowsCreatorOnMinicard ?? false; }, allowsMembers() { - const boardId = Session.get('currentBoard'); - const currentBoard = ReactiveCache.getBoard(boardId); - return currentBoard ? currentBoard.allowsMembers : false; + return this.currentBoard.allowsMembers; }, allowsAssignee() { - const boardId = Session.get('currentBoard'); - const currentBoard = ReactiveCache.getBoard(boardId); - return currentBoard ? currentBoard.allowsAssignee : false; + return this.currentBoard.allowsAssignee; }, allowsAssignedBy() { - const boardId = Session.get('currentBoard'); - const currentBoard = ReactiveCache.getBoard(boardId); - return currentBoard ? currentBoard.allowsAssignedBy : false; + return this.currentBoard.allowsAssignedBy; }, allowsRequestedBy() { - const boardId = Session.get('currentBoard'); - const currentBoard = ReactiveCache.getBoard(boardId); - return currentBoard ? currentBoard.allowsRequestedBy : false; + return this.currentBoard.allowsRequestedBy; }, allowsCardSortingByNumber() { - const boardId = Session.get('currentBoard'); - const currentBoard = ReactiveCache.getBoard(boardId); - return currentBoard ? currentBoard.allowsCardSortingByNumber : false; + return this.currentBoard.allowsCardSortingByNumber; }, allowsShowLists() { - const boardId = Session.get('currentBoard'); - const currentBoard = ReactiveCache.getBoard(boardId); - return currentBoard ? currentBoard.allowsShowLists : false; + return this.currentBoard.allowsShowLists; }, + allowsLabels() { - const boardId = Session.get('currentBoard'); - const currentBoard = ReactiveCache.getBoard(boardId); - return currentBoard ? currentBoard.allowsLabels : false; + return this.currentBoard.allowsLabels; }, allowsShowListsOnMinicard() { - const boardId = Session.get('currentBoard'); - const currentBoard = ReactiveCache.getBoard(boardId); - return currentBoard ? currentBoard.allowsShowListsOnMinicard : false; + return this.currentBoard.allowsShowListsOnMinicard; }, allowsChecklists() { - const boardId = Session.get('currentBoard'); - const currentBoard = ReactiveCache.getBoard(boardId); - return currentBoard ? currentBoard.allowsChecklists : false; + return this.currentBoard.allowsChecklists; }, allowsAttachments() { - const boardId = Session.get('currentBoard'); - const currentBoard = ReactiveCache.getBoard(boardId); - return currentBoard ? currentBoard.allowsAttachments : false; + return this.currentBoard.allowsAttachments; }, allowsComments() { - const boardId = Session.get('currentBoard'); - const currentBoard = ReactiveCache.getBoard(boardId); - return currentBoard ? currentBoard.allowsComments : false; + return this.currentBoard.allowsComments; }, allowsCardNumber() { - const boardId = Session.get('currentBoard'); - const currentBoard = ReactiveCache.getBoard(boardId); - return currentBoard ? currentBoard.allowsCardNumber : false; + return this.currentBoard.allowsCardNumber; }, allowsDescriptionTitle() { - const boardId = Session.get('currentBoard'); - const currentBoard = ReactiveCache.getBoard(boardId); - return currentBoard ? currentBoard.allowsDescriptionTitle : false; + return this.currentBoard.allowsDescriptionTitle; }, allowsDescriptionText() { - const boardId = Session.get('currentBoard'); - const currentBoard = ReactiveCache.getBoard(boardId); - return currentBoard ? currentBoard.allowsDescriptionText : false; + return this.currentBoard.allowsDescriptionText; }, isBoardSelected() { - const boardId = Session.get('currentBoard'); - const currentBoard = ReactiveCache.getBoard(boardId); - return currentBoard ? currentBoard.dateSettingsDefaultBoardID : false; + return this.currentBoard.dateSettingsDefaultBoardID; }, isNullBoardSelected() { - const boardId = Session.get('currentBoard'); - const currentBoard = ReactiveCache.getBoard(boardId); - return currentBoard ? ( - currentBoard.dateSettingsDefaultBoardId === null || - currentBoard.dateSettingsDefaultBoardId === undefined - ) : true; + return ( + this.currentBoard.dateSettingsDefaultBoardId === null || + this.currentBoard.dateSettingsDefaultBoardId === undefined + ); }, allowsDescriptionTextOnMinicard() { - const boardId = Session.get('currentBoard'); - const currentBoard = ReactiveCache.getBoard(boardId); - return currentBoard ? currentBoard.allowsDescriptionTextOnMinicard : false; + return this.currentBoard.allowsDescriptionTextOnMinicard; }, allowsCoverAttachmentOnMinicard() { - const boardId = Session.get('currentBoard'); - const currentBoard = ReactiveCache.getBoard(boardId); - return currentBoard ? currentBoard.allowsCoverAttachmentOnMinicard : false; + return this.currentBoard.allowsCoverAttachmentOnMinicard; }, allowsBadgeAttachmentOnMinicard() { - const boardId = Session.get('currentBoard'); - const currentBoard = ReactiveCache.getBoard(boardId); - return currentBoard ? currentBoard.allowsBadgeAttachmentOnMinicard : false; + return this.currentBoard.allowsBadgeAttachmentOnMinicard; }, allowsCardSortingByNumberOnMinicard() { - const boardId = Session.get('currentBoard'); - const currentBoard = ReactiveCache.getBoard(boardId); - return currentBoard ? currentBoard.allowsCardSortingByNumberOnMinicard : false; + return this.currentBoard.allowsCardSortingByNumberOnMinicard; }, boards() { @@ -1190,73 +1100,203 @@ BlazeComponent.extendComponent({ { 'click .js-field-has-receiveddate'(evt) { evt.preventDefault(); - const newValue = !this.currentBoard.allowsReceivedDate; - Boards.update(this.currentBoard._id, { $set: { allowsReceivedDate: newValue } }); + this.currentBoard.allowsReceivedDate = !this.currentBoard + .allowsReceivedDate; + this.currentBoard.setAllowsReceivedDate( + this.currentBoard.allowsReceivedDate, + ); + $(`.js-field-has-receiveddate ${MCB}`).toggleClass( + CKCLS, + this.currentBoard.allowsReceivedDate, + ); + $('.js-field-has-receiveddate').toggleClass( + CKCLS, + this.currentBoard.allowsReceivedDate, + ); }, 'click .js-field-has-startdate'(evt) { evt.preventDefault(); - const newValue = !this.currentBoard.allowsStartDate; - Boards.update(this.currentBoard._id, { $set: { allowsStartDate: newValue } }); + this.currentBoard.allowsStartDate = !this.currentBoard + .allowsStartDate; + this.currentBoard.setAllowsStartDate( + this.currentBoard.allowsStartDate, + ); + $(`.js-field-has-startdate ${MCB}`).toggleClass( + CKCLS, + this.currentBoard.allowsStartDate, + ); + $('.js-field-has-startdate').toggleClass( + CKCLS, + this.currentBoard.allowsStartDate, + ); }, 'click .js-field-has-enddate'(evt) { evt.preventDefault(); - const newValue = !this.currentBoard.allowsEndDate; - Boards.update(this.currentBoard._id, { $set: { allowsEndDate: newValue } }); + this.currentBoard.allowsEndDate = !this.currentBoard.allowsEndDate; + this.currentBoard.setAllowsEndDate(this.currentBoard.allowsEndDate); + $(`.js-field-has-enddate ${MCB}`).toggleClass( + CKCLS, + this.currentBoard.allowsEndDate, + ); + $('.js-field-has-enddate').toggleClass( + CKCLS, + this.currentBoard.allowsEndDate, + ); }, 'click .js-field-has-duedate'(evt) { evt.preventDefault(); - const newValue = !this.currentBoard.allowsDueDate; - Boards.update(this.currentBoard._id, { $set: { allowsDueDate: newValue } }); + this.currentBoard.allowsDueDate = !this.currentBoard.allowsDueDate; + this.currentBoard.setAllowsDueDate(this.currentBoard.allowsDueDate); + $(`.js-field-has-duedate ${MCB}`).toggleClass( + CKCLS, + this.currentBoard.allowsDueDate, + ); + $('.js-field-has-duedate').toggleClass( + CKCLS, + this.currentBoard.allowsDueDate, + ); }, 'click .js-field-has-subtasks'(evt) { evt.preventDefault(); - const newValue = !this.currentBoard.allowsSubtasks; - Boards.update(this.currentBoard._id, { $set: { allowsSubtasks: newValue } }); + this.currentBoard.allowsSubtasks = !this.currentBoard.allowsSubtasks; + this.currentBoard.setAllowsSubtasks(this.currentBoard.allowsSubtasks); + $(`.js-field-has-subtasks ${MCB}`).toggleClass( + CKCLS, + this.currentBoard.allowsSubtasks, + ); + $('.js-field-has-subtasks').toggleClass( + CKCLS, + this.currentBoard.allowsSubtasks, + ); }, 'click .js-field-has-creator'(evt) { evt.preventDefault(); - const newValue = !this.currentBoard.allowsCreator; - Boards.update(this.currentBoard._id, { $set: { allowsCreator: newValue } }); + this.currentBoard.allowsCreator = !this.currentBoard.allowsCreator; + this.currentBoard.setAllowsCreator(this.currentBoard.allowsCreator); + $(`.js-field-has-creator ${MCB}`).toggleClass( + CKCLS, + this.currentBoard.allowsCreator, + ); + $('.js-field-has-creator').toggleClass( + CKCLS, + this.currentBoard.allowsCreator, + ); }, 'click .js-field-has-creator-on-minicard'(evt) { evt.preventDefault(); - const newValue = !this.currentBoard.allowsCreatorOnMinicard; - Boards.update(this.currentBoard._id, { $set: { allowsCreatorOnMinicard: newValue } }); + this.currentBoard.allowsCreatorOnMinicard = !this.currentBoard.allowsCreatorOnMinicard; + this.currentBoard.setAllowsCreatorOnMinicard(this.currentBoard.allowsCreatorOnMinicard); + $(`.js-field-has-creator-on-minicard ${MCB}`).toggleClass( + CKCLS, + this.currentBoard.allowsCreatorOnMinicard, + ); + $('.js-field-has-creator-on-minicard').toggleClass( + CKCLS, + this.currentBoard.allowsCreatorOnMinicard, + ); }, 'click .js-field-has-members'(evt) { evt.preventDefault(); - const newValue = !this.currentBoard.allowsMembers; - Boards.update(this.currentBoard._id, { $set: { allowsMembers: newValue } }); + this.currentBoard.allowsMembers = !this.currentBoard.allowsMembers; + this.currentBoard.setAllowsMembers(this.currentBoard.allowsMembers); + $(`.js-field-has-members ${MCB}`).toggleClass( + CKCLS, + this.currentBoard.allowsMembers, + ); + $('.js-field-has-members').toggleClass( + CKCLS, + this.currentBoard.allowsMembers, + ); }, 'click .js-field-has-assignee'(evt) { evt.preventDefault(); - const newValue = !this.currentBoard.allowsAssignee; - Boards.update(this.currentBoard._id, { $set: { allowsAssignee: newValue } }); + this.currentBoard.allowsAssignee = !this.currentBoard.allowsAssignee; + this.currentBoard.setAllowsAssignee(this.currentBoard.allowsAssignee); + $(`.js-field-has-assignee ${MCB}`).toggleClass( + CKCLS, + this.currentBoard.allowsAssignee, + ); + $('.js-field-has-assignee').toggleClass( + CKCLS, + this.currentBoard.allowsAssignee, + ); }, 'click .js-field-has-assigned-by'(evt) { evt.preventDefault(); - const newValue = !this.currentBoard.allowsAssignedBy; - Boards.update(this.currentBoard._id, { $set: { allowsAssignedBy: newValue } }); + this.currentBoard.allowsAssignedBy = !this.currentBoard + .allowsAssignedBy; + this.currentBoard.setAllowsAssignedBy( + this.currentBoard.allowsAssignedBy, + ); + $(`.js-field-has-assigned-by ${MCB}`).toggleClass( + CKCLS, + this.currentBoard.allowsAssignedBy, + ); + $('.js-field-has-assigned-by').toggleClass( + CKCLS, + this.currentBoard.allowsAssignedBy, + ); }, 'click .js-field-has-requested-by'(evt) { evt.preventDefault(); - const newValue = !this.currentBoard.allowsRequestedBy; - Boards.update(this.currentBoard._id, { $set: { allowsRequestedBy: newValue } }); + this.currentBoard.allowsRequestedBy = !this.currentBoard + .allowsRequestedBy; + this.currentBoard.setAllowsRequestedBy( + this.currentBoard.allowsRequestedBy, + ); + $(`.js-field-has-requested-by ${MCB}`).toggleClass( + CKCLS, + this.currentBoard.allowsRequestedBy, + ); + $('.js-field-has-requested-by').toggleClass( + CKCLS, + this.currentBoard.allowsRequestedBy, + ); }, 'click .js-field-has-card-sorting-by-number'(evt) { evt.preventDefault(); - const newValue = !this.currentBoard.allowsCardSortingByNumber; - Boards.update(this.currentBoard._id, { $set: { allowsCardSortingByNumber: newValue } }); + this.currentBoard.allowsCardSortingByNumber = !this.currentBoard + .allowsCardSortingByNumber; + this.currentBoard.setAllowsCardSortingByNumber( + this.currentBoard.allowsCardSortingByNumber, + ); + $(`.js-field-has-card-sorting-by-number ${MCB}`).toggleClass( + CKCLS, + this.currentBoard.allowsCardSortingByNumber, + ); + $('.js-field-has-card-sorting-by-number').toggleClass( + CKCLS, + this.currentBoard.allowsCardSortingByNumber, + ); }, 'click .js-field-has-card-show-lists'(evt) { evt.preventDefault(); - const newValue = !this.currentBoard.allowsShowLists; - Boards.update(this.currentBoard._id, { $set: { allowsShowLists: newValue } }); + this.currentBoard.allowsShowLists = !this.currentBoard + .allowsShowLists; + this.currentBoard.setAllowsShowLists( + this.currentBoard.allowsShowLists, + ); + $(`.js-field-has-card-show-lists ${MCB}`).toggleClass( + CKCLS, + this.currentBoard.allowsShowLists, + ); + $('.js-field-has-card-show-lists').toggleClass( + CKCLS, + this.currentBoard.allowsShowLists, + ); }, 'click .js-field-has-labels'(evt) { evt.preventDefault(); - const newValue = !this.currentBoard.allowsLabels; - Boards.update(this.currentBoard._id, { $set: { allowsLabels: newValue } }); + this.currentBoard.allowsLabels = !this.currentBoard.allowsLabels; + this.currentBoard.setAllowsLabels(this.currentBoard.allowsLabels); + $(`.js-field-has-labels ${MCB}`).toggleClass( + CKCLS, + this.currentBoard.allowsLabels, + ); + $('.js-field-has-labels').toggleClass( + CKCLS, + this.currentBoard.allowsLabels, + ); }, 'click .js-field-has-card-show-lists-on-minicard'(evt) { evt.preventDefault(); @@ -1452,27 +1492,19 @@ BlazeComponent.extendComponent({ }, }).register('boardCardSettingsPopup'); -// Use Session variables instead of global ReactiveVars -Session.setDefault('addMemberPopup.searchResults', []); -Session.setDefault('addMemberPopup.searching', false); -Session.setDefault('addMemberPopup.noResults', false); -Session.setDefault('addMemberPopup.loading', false); -Session.setDefault('addMemberPopup.error', ''); - - BlazeComponent.extendComponent({ onCreated() { - // Use Session variables - this.searchTimeout = null; + this.error = new ReactiveVar(''); + this.loading = new ReactiveVar(false); }, onRendered() { - this.find('.js-search-member-input').focus(); + this.find('.js-search-member input').focus(); this.setLoading(false); }, isBoardMember() { - const userId = this.currentData()._id; + const userId = this.currentData().__originalId; const user = ReactiveCache.getUser(userId); return user && user.isBoardMember(); }, @@ -1482,35 +1514,15 @@ BlazeComponent.extendComponent({ }, setError(error) { - Session.set('addMemberPopup.error', error); + this.error.set(error); }, setLoading(w) { - Session.set('addMemberPopup.loading', w); + this.loading.set(w); }, isLoading() { - return Session.get('addMemberPopup.loading'); - }, - - performSearch(query) { - if (!query || query.length < 2) { - Session.set('addMemberPopup.searchResults', []); - Session.set('addMemberPopup.noResults', false); - return; - } - - Session.set('addMemberPopup.searching', true); - Session.set('addMemberPopup.noResults', false); - - // Use the fallback search - const results = UserSearchIndex.search(query, { limit: 20 }).fetch(); - Session.set('addMemberPopup.searchResults', results); - Session.set('addMemberPopup.searching', false); - - if (results.length === 0) { - Session.set('addMemberPopup.noResults', true); - } + return this.loading.get(); }, inviteUser(idNameEmail) { @@ -1528,30 +1540,18 @@ BlazeComponent.extendComponent({ events() { return [ { - 'keyup .js-search-member-input'(event) { + 'keyup input'() { this.setError(''); - const query = event.target.value.trim(); - this.searchQuery.set(query); - - // Clear previous timeout - if (this.searchTimeout) { - clearTimeout(this.searchTimeout); - } - - // Debounce search - this.searchTimeout = setTimeout(() => { - this.performSearch(query); - }, 300); }, 'click .js-select-member'() { - const userId = this.currentData()._id; + const userId = this.currentData().__originalId; const currentBoard = Utils.getCurrentBoard(); if (!currentBoard.hasMember(userId)) { this.inviteUser(userId); } }, 'click .js-email-invite'() { - const idNameEmail = $('.js-search-member-input').val(); + const idNameEmail = $('.js-search-member input').val(); if (idNameEmail.indexOf('@') < 0 || this.isValidEmail(idNameEmail)) { this.inviteUser(idNameEmail); } else this.setError('email-invalid'); @@ -1562,35 +1562,7 @@ BlazeComponent.extendComponent({ }).register('addMemberPopup'); Template.addMemberPopup.helpers({ - searchResults() { - const results = Session.get('addMemberPopup.searchResults'); - console.log('searchResults helper called, returning:', results); - return results; - }, - searching() { - return Session.get('addMemberPopup.searching'); - }, - noResults() { - return Session.get('addMemberPopup.noResults'); - }, - loading() { - return Session.get('addMemberPopup.loading'); - }, - error() { - return Session.get('addMemberPopup.error'); - }, - isBoardMember() { - const userId = this._id; - const user = ReactiveCache.getUser(userId); - return user && user.isBoardMember(); - } -}) - -Template.addMemberPopupTest.helpers({ - searchResults() { - console.log('addMemberPopupTest searchResults helper called'); - return Session.get('addMemberPopup.searchResults') || []; - } + searchIndex: () => UserSearchIndex, }) BlazeComponent.extendComponent({ @@ -1933,7 +1905,7 @@ Template.removeBoardTeamPopup.helpers({ }); Template.changePermissionsPopup.events({ - 'click .js-set-admin, click .js-set-normal, click .js-set-normal-assigned-only, click .js-set-no-comments, click .js-set-comment-only, click .js-set-comment-assigned-only, click .js-set-read-only, click .js-set-read-assigned-only, click .js-set-worker'( + 'click .js-set-admin, click .js-set-normal, click .js-set-no-comments, click .js-set-comment-only, click .js-set-worker'( event, ) { const currentBoard = Utils.getCurrentBoard(); @@ -1942,14 +1914,6 @@ Template.changePermissionsPopup.events({ const isCommentOnly = $(event.currentTarget).hasClass( 'js-set-comment-only', ); - const isNormalAssignedOnly = $(event.currentTarget).hasClass( - 'js-set-normal-assigned-only', - ); - const isCommentAssignedOnly = $(event.currentTarget).hasClass( - 'js-set-comment-assigned-only', - ); - const isReadOnly = $(event.currentTarget).hasClass('js-set-read-only'); - const isReadAssignedOnly = $(event.currentTarget).hasClass('js-set-read-assigned-only'); const isNoComments = $(event.currentTarget).hasClass('js-set-no-comments'); const isWorker = $(event.currentTarget).hasClass('js-set-worker'); currentBoard.setMemberPermission( @@ -1958,10 +1922,6 @@ Template.changePermissionsPopup.events({ isNoComments, isCommentOnly, isWorker, - isNormalAssignedOnly, - isCommentAssignedOnly, - isReadOnly, - isReadAssignedOnly, ); Popup.back(1); }, @@ -1979,22 +1939,10 @@ Template.changePermissionsPopup.helpers({ !currentBoard.hasAdmin(this.userId) && !currentBoard.hasNoComments(this.userId) && !currentBoard.hasCommentOnly(this.userId) && - !currentBoard.hasNormalAssignedOnly(this.userId) && - !currentBoard.hasCommentAssignedOnly(this.userId) && - !currentBoard.hasReadOnly(this.userId) && - !currentBoard.hasReadAssignedOnly(this.userId) && !currentBoard.hasWorker(this.userId) ); }, - isNormalAssignedOnly() { - const currentBoard = Utils.getCurrentBoard(); - return ( - !currentBoard.hasAdmin(this.userId) && - currentBoard.hasNormalAssignedOnly(this.userId) - ); - }, - isNoComments() { const currentBoard = Utils.getCurrentBoard(); return ( @@ -2011,30 +1959,6 @@ Template.changePermissionsPopup.helpers({ ); }, - isCommentAssignedOnly() { - const currentBoard = Utils.getCurrentBoard(); - return ( - !currentBoard.hasAdmin(this.userId) && - currentBoard.hasCommentAssignedOnly(this.userId) - ); - }, - - isReadOnly() { - const currentBoard = Utils.getCurrentBoard(); - return ( - !currentBoard.hasAdmin(this.userId) && - currentBoard.hasReadOnly(this.userId) - ); - }, - - isReadAssignedOnly() { - const currentBoard = Utils.getCurrentBoard(); - return ( - !currentBoard.hasAdmin(this.userId) && - currentBoard.hasReadAssignedOnly(this.userId) - ); - }, - isWorker() { const currentBoard = Utils.getCurrentBoard(); return ( diff --git a/client/components/sidebar/sidebarCustomFields.jade b/client/components/sidebar/sidebarCustomFields.jade index 0d16559f8..1cc270681 100644 --- a/client/components/sidebar/sidebarCustomFields.jade +++ b/client/components/sidebar/sidebarCustomFields.jade @@ -95,7 +95,3 @@ template(name="createCustomFieldPopup") template(name="deleteCustomFieldPopup") p {{_ "custom-field-delete-pop"}} button.js-confirm.negate.full(type="submit") {{_ 'delete'}} - -// Reuse the create form for editing to satisfy popup template lookup -template(name="editCustomFieldPopup") - +Template.dynamic(template="createCustomFieldPopup") diff --git a/client/components/sidebar/sidebarFilters.jade b/client/components/sidebar/sidebarFilters.jade index ae14cdae9..918711b09 100644 --- a/client/components/sidebar/sidebarFilters.jade +++ b/client/components/sidebar/sidebarFilters.jade @@ -36,7 +36,7 @@ template(name="filterSidebar") else span.quiet {{_ "label-default" (_ (concat "color-" color))}} if Filter.labelIds.isSelected _id - | ✅ + i.fa.fa-check hr h3 | 👥 @@ -68,7 +68,7 @@ template(name="filterSidebar") span.sidebar-list-item-description | {{_ 'filter-no-assignee'}} if Filter.assignees.isSelected undefined - | ✅ + i.fa.fa-check each currentBoard.activeMembers with getUser userId li(class="{{#if Filter.assignees.isSelected _id}}active{{/if}}") @@ -90,37 +90,37 @@ template(name="filterSidebar") span.sidebar-list-item-description | {{_ 'filter-no-due-date' }} if Filter.dueAt.isSelected 'noDate' - | ✅ + i.fa.fa-check li(class="{{#if Filter.dueAt.isSelected 'past'}}active{{/if}}") a.name.js-toggle-overdue-filter span.sidebar-list-item-description | {{_ 'filter-overdue' }} if Filter.dueAt.isSelected 'past' - | ✅ + i.fa.fa-check li(class="{{#if Filter.dueAt.isSelected 'today'}}active{{/if}}") a.name.js-toggle-due-today-filter span.sidebar-list-item-description | {{_ 'filter-due-today' }} if Filter.dueAt.isSelected 'today' - | ✅ + i.fa.fa-check li(class="{{#if Filter.dueAt.isSelected 'tomorrow'}}active{{/if}}") a.name.js-toggle-due-tomorrow-filter span.sidebar-list-item-description | {{_ 'filter-due-tomorrow' }} if Filter.dueAt.isSelected 'tomorrow' - | ✅ + i.fa.fa-check li(class="{{#if Filter.dueAt.isSelected 'thisweek'}}active{{/if}}") a.name.js-toggle-due-this-week-filter span.sidebar-list-item-description | {{_ 'filter-due-this-week' }} if Filter.dueAt.isSelected 'thisweek' - | ✅ + i.fa.fa-check li(class="{{#if Filter.dueAt.isSelected 'nextweek'}}active{{/if}}") a.name.js-toggle-due-next-week-filter span.sidebar-list-item-description | {{_ 'filter-due-next-week' }} if Filter.dueAt.isSelected 'nextweek' - | ✅ + i.fa.fa-check hr h3 | 📋 @@ -138,7 +138,7 @@ template(name="filterSidebar") span.sidebar-list-item-description | {{ name }} if Filter.customFields.isSelected _id - | ✅ + i.fa.fa-check hr h3 | {{_ 'other-filters-label'}} @@ -148,14 +148,14 @@ template(name="filterSidebar") span.sidebar-list-item-description | {{_ 'filter-show-archive'}} if Filter.archive.isSelected _id - | ✅ + i.fa.fa-check ul.sidebar-list li(class="{{#if Filter.hideEmpty.isSelected _id}}active{{/if}}") a.name.js-toggle-hideEmpty-filter span.sidebar-list-item-description | {{_ 'filter-hide-empty'}} if Filter.hideEmpty.isSelected _id - | ✅ + i.fa.fa-check hr h3 {{_ 'advanced-filter-label'}} input.js-field-advanced-filter(type="text") @@ -206,12 +206,6 @@ template(name="multiselectionSidebar") | ⋯ if currentUser.isBoardAdmin hr - a.sidebar-btn.js-selection-color - | 🎨 - span {{_ 'selection-color'}} - a.sidebar-btn.js-copy-selection - | 📋 - span {{_ 'copy-selection'}} a.sidebar-btn.js-move-selection | 📤 span {{_ 'move-selection'}} @@ -230,76 +224,4 @@ template(name="disambiguateMultiMemberPopup") button.wide.js-assign-member {{_ 'assign-member'}} template(name="moveSelectionPopup") - h3 {{_ 'moveSelectionPopup-title'}} - label {{_ 'boards'}}: - select.js-select-boards - each boards - option(value="{{_id}}" selected="{{#if isDialogOptionBoardId _id}}selected{{/if}}") {{add @index 1}}. {{title}} - - label {{_ 'swimlanes'}}: - select.js-select-swimlanes - each swimlanes - option(value="{{_id}}" selected="{{#if isDialogOptionSwimlaneId _id}}selected{{/if}}") {{add @index 1}}. {{title}} - - label {{_ 'lists'}}: - select.js-select-lists - each lists - option(value="{{_id}}" selected="{{#if isDialogOptionListId _id}}selected{{/if}}") {{add @index 1}}. {{title}} - - label {{_ 'cards'}}: - select.js-select-cards - each cards - option(value="{{_id}}") {{add @index 1}}. {{title}} - - div - input(type="radio" name="position" value="above" checked id="position-above-move" style="display: inline") - label(for="position-above-move") {{_ 'above-selected-card'}} - div - input(type="radio" name="position" value="below" id="position-below-move" style="display: inline") - label(for="position-below-move") {{_ 'below-selected-card'}} - - .edit-controls.clearfix - button.primary.confirm.js-done {{_ 'done'}} - -template(name="copySelectionPopup") - h3 {{_ 'copySelectionPopup-title'}} - label {{_ 'boards'}}: - select.js-select-boards - each boards - option(value="{{_id}}" selected="{{#if isDialogOptionBoardId _id}}selected{{/if}}") {{add @index 1}}. {{title}} - - label {{_ 'swimlanes'}}: - select.js-select-swimlanes - each swimlanes - option(value="{{_id}}" selected="{{#if isDialogOptionSwimlaneId _id}}selected{{/if}}") {{add @index 1}}. {{title}} - - label {{_ 'lists'}}: - select.js-select-lists - each lists - option(value="{{_id}}" selected="{{#if isDialogOptionListId _id}}selected{{/if}}") {{add @index 1}}. {{title}} - - label {{_ 'cards'}}: - select.js-select-cards - each cards - option(value="{{_id}}") {{add @index 1}}. {{title}} - - div - input(type="radio" name="position" value="above" checked id="position-above-copy" style="display: inline") - label(for="position-above-copy") {{_ 'above-selected-card'}} - div - input(type="radio" name="position" value="below" id="position-below-copy" style="display: inline") - label(for="position-below-copy") {{_ 'below-selected-card'}} - - .edit-controls.clearfix - button.primary.confirm.js-done {{_ 'done'}} - -template(name="setSelectionColorPopup") - h3 {{_ 'setSelectionColorPopup-title'}} - form.edit-label - .palette-colors: each colors - unless $eq color 'white' - span.card-label.palette-color.js-palette-color(class="card-details-{{color}}") - if(isSelected color) - | ✅ - button.primary.confirm.js-submit {{_ 'save'}} - button.js-remove-color.negate.wide.right {{_ 'unset-color'}} + +boardLists diff --git a/client/components/sidebar/sidebarFilters.js b/client/components/sidebar/sidebarFilters.js index f6786c7d1..64c6f3d8c 100644 --- a/client/components/sidebar/sidebarFilters.js +++ b/client/components/sidebar/sidebarFilters.js @@ -162,8 +162,6 @@ BlazeComponent.extendComponent({ } }, 'click .js-move-selection': Popup.open('moveSelection'), - 'click .js-copy-selection': Popup.open('copySelection'), - 'click .js-selection-color': Popup.open('setSelectionColor'), 'click .js-archive-selection'() { mutateSelectedCards('archive'); EscapeActions.executeUpTo('multiselection'); @@ -204,267 +202,10 @@ Template.disambiguateMultiMemberPopup.events({ }, }); -Template.moveSelectionPopup.onCreated(function() { - this.selectedBoardId = new ReactiveVar(Session.get('currentBoard')); - this.selectedSwimlaneId = new ReactiveVar(''); - this.selectedListId = new ReactiveVar(''); - this.selectedCardId = new ReactiveVar(''); - this.position = new ReactiveVar('above'); - - this.getBoardData = function(boardId) { - const self = this; - Meteor.subscribe('board', boardId, false, { - onReady() { - const sameBoardId = self.selectedBoardId.get() === boardId; - self.selectedBoardId.set(boardId); - - if (!sameBoardId) { - self.setFirstSwimlaneId(); - self.setFirstListId(); - } - }, - }); - }; - - this.setFirstSwimlaneId = function() { - try { - const board = ReactiveCache.getBoard(this.selectedBoardId.get()); - const swimlaneId = board.swimlanes()[0]._id; - this.selectedSwimlaneId.set(swimlaneId); - } catch (e) {} - }; - - this.setFirstListId = function() { - try { - const board = ReactiveCache.getBoard(this.selectedBoardId.get()); - const listId = board.lists()[0]._id; - this.selectedListId.set(listId); - } catch (e) {} - }; - - this.getBoardData(Session.get('currentBoard')); - this.setFirstSwimlaneId(); - this.setFirstListId(); -}); - -Template.moveSelectionPopup.helpers({ - boards() { - return ReactiveCache.getBoards( - { - archived: false, - 'members.userId': Meteor.userId(), - _id: { $ne: ReactiveCache.getCurrentUser().getTemplatesBoardId() }, - }, - { - sort: { sort: 1 }, - }, - ); - }, - swimlanes() { - const board = ReactiveCache.getBoard(Template.instance().selectedBoardId.get()); - return board ? board.swimlanes() : []; - }, - lists() { - const board = ReactiveCache.getBoard(Template.instance().selectedBoardId.get()); - return board ? board.lists() : []; - }, - cards() { - const instance = Template.instance(); - const list = ReactiveCache.getList(instance.selectedListId.get()); - if (!list) return []; - return list.cards(instance.selectedSwimlaneId.get()).sort((a, b) => a.sort - b.sort); - }, - isDialogOptionBoardId(boardId) { - return Template.instance().selectedBoardId.get() === boardId; - }, - isDialogOptionSwimlaneId(swimlaneId) { - return Template.instance().selectedSwimlaneId.get() === swimlaneId; - }, - isDialogOptionListId(listId) { - return Template.instance().selectedListId.get() === listId; - }, -}); - Template.moveSelectionPopup.events({ - 'change .js-select-boards'(event) { - const boardId = $(event.currentTarget).val(); - Template.instance().getBoardData(boardId); - }, - 'change .js-select-swimlanes'(event) { - Template.instance().selectedSwimlaneId.set($(event.currentTarget).val()); - }, - 'change .js-select-lists'(event) { - Template.instance().selectedListId.set($(event.currentTarget).val()); - }, - 'change .js-select-cards'(event) { - Template.instance().selectedCardId.set($(event.currentTarget).val()); - }, - 'change input[name="position"]'(event) { - Template.instance().position.set($(event.currentTarget).val()); - }, - 'click .js-done'() { - const instance = Template.instance(); - const boardId = instance.selectedBoardId.get(); - const swimlaneId = instance.selectedSwimlaneId.get(); - const listId = instance.selectedListId.get(); - const cardId = instance.selectedCardId.get(); - const position = instance.position.get(); - - // Calculate sortIndex - let sortIndex = 0; - if (cardId) { - const targetCard = ReactiveCache.getCard(cardId); - if (targetCard) { - if (position === 'above') { - sortIndex = targetCard.sort - 0.5; - } else { - sortIndex = targetCard.sort + 0.5; - } - } - } else { - // If no card selected, move to end - const board = ReactiveCache.getBoard(boardId); - const cards = board.cards({ swimlaneId, listId }).sort('sort'); - if (cards.length > 0) { - sortIndex = cards[cards.length - 1].sort + 1; - } - } - - mutateSelectedCards('move', boardId, swimlaneId, listId, sortIndex); - EscapeActions.executeUpTo('multiselection'); - }, -}); - -Template.copySelectionPopup.onCreated(function() { - this.selectedBoardId = new ReactiveVar(Session.get('currentBoard')); - this.selectedSwimlaneId = new ReactiveVar(''); - this.selectedListId = new ReactiveVar(''); - this.selectedCardId = new ReactiveVar(''); - this.position = new ReactiveVar('above'); - - this.getBoardData = function(boardId) { - const self = this; - Meteor.subscribe('board', boardId, false, { - onReady() { - const sameBoardId = self.selectedBoardId.get() === boardId; - self.selectedBoardId.set(boardId); - - if (!sameBoardId) { - self.setFirstSwimlaneId(); - self.setFirstListId(); - } - }, - }); - }; - - this.setFirstSwimlaneId = function() { - try { - const board = ReactiveCache.getBoard(this.selectedBoardId.get()); - const swimlaneId = board.swimlanes()[0]._id; - this.selectedSwimlaneId.set(swimlaneId); - } catch (e) {} - }; - - this.setFirstListId = function() { - try { - const board = ReactiveCache.getBoard(this.selectedBoardId.get()); - const listId = board.lists()[0]._id; - this.selectedListId.set(listId); - } catch (e) {} - }; - - this.getBoardData(Session.get('currentBoard')); - this.setFirstSwimlaneId(); - this.setFirstListId(); -}); - -Template.copySelectionPopup.helpers({ - boards() { - return ReactiveCache.getBoards( - { - archived: false, - 'members.userId': Meteor.userId(), - _id: { $ne: ReactiveCache.getCurrentUser().getTemplatesBoardId() }, - }, - { - sort: { sort: 1 }, - }, - ); - }, - swimlanes() { - const board = ReactiveCache.getBoard(Template.instance().selectedBoardId.get()); - return board ? board.swimlanes() : []; - }, - lists() { - const board = ReactiveCache.getBoard(Template.instance().selectedBoardId.get()); - return board ? board.lists() : []; - }, - cards() { - const instance = Template.instance(); - const list = ReactiveCache.getList(instance.selectedListId.get()); - if (!list) return []; - return list.cards(instance.selectedSwimlaneId.get()).sort((a, b) => a.sort - b.sort); - }, - isDialogOptionBoardId(boardId) { - return Template.instance().selectedBoardId.get() === boardId; - }, - isDialogOptionSwimlaneId(swimlaneId) { - return Template.instance().selectedSwimlaneId.get() === swimlaneId; - }, - isDialogOptionListId(listId) { - return Template.instance().selectedListId.get() === listId; - }, -}); - -Template.copySelectionPopup.events({ - 'change .js-select-boards'(event) { - const boardId = $(event.currentTarget).val(); - Template.instance().getBoardData(boardId); - }, - 'change .js-select-swimlanes'(event) { - Template.instance().selectedSwimlaneId.set($(event.currentTarget).val()); - }, - 'change .js-select-lists'(event) { - Template.instance().selectedListId.set($(event.currentTarget).val()); - }, - 'change .js-select-cards'(event) { - Template.instance().selectedCardId.set($(event.currentTarget).val()); - }, - 'change input[name="position"]'(event) { - Template.instance().position.set($(event.currentTarget).val()); - }, - 'click .js-done'() { - const instance = Template.instance(); - const boardId = instance.selectedBoardId.get(); - const swimlaneId = instance.selectedSwimlaneId.get(); - const listId = instance.selectedListId.get(); - const cardId = instance.selectedCardId.get(); - const position = instance.position.get(); - - mutateSelectedCards((card) => { - const newCard = card.copy(boardId, swimlaneId, listId); - if (newCard) { - let sortIndex = 0; - if (cardId) { - const targetCard = ReactiveCache.getCard(cardId); - if (targetCard) { - if (position === 'above') { - sortIndex = targetCard.sort - 0.5; - } else { - sortIndex = targetCard.sort + 0.5; - } - } - } else { - // To end - const board = ReactiveCache.getBoard(boardId); - const cards = board.cards({ swimlaneId, listId }).sort('sort'); - if (cards.length > 0) { - sortIndex = cards[cards.length - 1].sort + 1; - } - } - newCard.setSort(sortIndex); - } - }); + 'click .js-select-list'() { + // Move the minicard to the end of the target list + mutateSelectedCards('moveToEndOfList', { listId: this._id }); EscapeActions.executeUpTo('multiselection'); }, }); diff --git a/client/components/swimlanes/swimlaneHeader.jade b/client/components/swimlanes/swimlaneHeader.jade index 4fb717463..04548ffa6 100644 --- a/client/components/swimlanes/swimlaneHeader.jade +++ b/client/components/swimlanes/swimlaneHeader.jade @@ -25,22 +25,25 @@ template(name="swimlaneFixedHeader") .swimlane-header-menu if currentUser unless currentUser.isCommentOnly - unless currentUser.isWorker - a.swimlane-collapse-indicator.js-collapse-swimlane.swimlane-header-collapse(title="{{_ 'collapse'}}") - if collapseSwimlane - | ▶ - else - | 🔽 - a.js-open-add-swimlane-menu.swimlane-header-plus-icon(title="{{_ 'add-swimlane'}}") - | ➕ - unless isTouchScreen - a.swimlane-header-handle.handle.js-swimlane-header-handle - | ↕️ - if isTouchScreen - a.swimlane-header-miniscreen-handle.handle.js-swimlane-header-handle - | ↕️ - a.js-open-swimlane-menu(title="{{_ 'swimlaneActionPopup-title'}}") - | ☰ + a.js-open-add-swimlane-menu.swimlane-header-plus-icon(title="{{_ 'add-swimlane'}}") + | ➕ + a.js-open-swimlane-menu(title="{{_ 'swimlaneActionPopup-title'}}") + | ☰ + //// TODO: Collapse Swimlane: make button working, etc. + //unless collapsed + // a.js-collapse-swimlane(title="{{_ 'collapse'}}") + // i.fa.fa-arrow-down.swimlane-header-collapse-down + // ⬆️.swimlane-header-collapse-up + //if collapsed + // a.js-collapse-swimlane(title="{{_ 'uncollapse'}}") + // ⬆️.swimlane-header-collapse-up + // i.fa.fa-arrow-down.swimlane-header-collapse-down + unless isTouchScreen + a.swimlane-header-handle.handle.js-swimlane-header-handle + | ↕️ + if isTouchScreen + a.swimlane-header-miniscreen-handle.handle.js-swimlane-header-handle + | ↕️ template(name="editSwimlaneTitleForm") .list-composer diff --git a/client/components/swimlanes/swimlaneHeader.js b/client/components/swimlanes/swimlaneHeader.js index 1caeda34c..17988f454 100644 --- a/client/components/swimlanes/swimlaneHeader.js +++ b/client/components/swimlanes/swimlaneHeader.js @@ -20,14 +20,13 @@ BlazeComponent.extendComponent({ }, collapsed(check = undefined) { const swimlane = Template.currentData(); - const status = Utils.getSwimlaneCollapseState(swimlane); + const status = swimlane.isCollapsed(); if (check === undefined) { // just check return status; } else { - const next = typeof check === 'boolean' ? check : !status; - Utils.setSwimlaneCollapseState(swimlane, next); - return next; + swimlane.collapse(!status); + return !status; } }, @@ -50,10 +49,6 @@ Template.swimlaneFixedHeader.helpers({ isBoardAdmin() { return ReactiveCache.getCurrentUser().isBoardAdmin(); }, - collapseSwimlane() { - const swimlane = Template.currentData(); - return Utils.getSwimlaneCollapseState(swimlane); - }, isTitleDefault(title) { // https://github.com/wekan/wekan/issues/4763 // https://github.com/wekan/wekan/issues/4742 @@ -183,11 +178,6 @@ BlazeComponent.extendComponent({ events() { return [ { - 'submit form'(event) { - event.preventDefault(); - this.currentSwimlane.setColor(this.currentColor.get()); - Popup.back(); - }, 'click .js-palette-color'() { this.currentColor.set(this.currentData().color); }, diff --git a/client/components/swimlanes/swimlanes.css b/client/components/swimlanes/swimlanes.css index e801654a4..4c20cb0f4 100644 --- a/client/components/swimlanes/swimlanes.css +++ b/client/components/swimlanes/swimlanes.css @@ -54,14 +54,12 @@ width: 100%; min-width: 100%; position: relative; - overflow: visible; + overflow: hidden; min-height: 33px; - padding: 0; - margin: 0; } .swimlane .swimlane-header-wrap .swimlane-header { font-size: 14px; - padding: 0; + padding: 5px 5px; font-weight: bold; min-height: 33px; width: 100%; @@ -76,39 +74,30 @@ } .swimlane .swimlane-header-wrap .swimlane-header-menu { position: absolute; - top: 0; - left: 0; - padding: 0; - margin: 0; + padding: 5px 5px; font-size: 22px; - line-height: 1; z-index: 20; pointer-events: auto; } -.swimlane .swimlane-header-wrap .swimlane-header-menu .js-open-swimlane-menu { - top: calc(50% + 6px); - padding: 5px; - display: inline-block; - margin-left: 74px; -} @media print { .swimlane .swimlane-header-wrap .swimlane-header-menu { display: none; } } .swimlane .swimlane-header-wrap .swimlane-header-plus-icon { - top: calc(50% + 6px); - padding: 5px; + margin-left: 5px; + padding-right: 20px; font-size: 22px; } .swimlane .swimlane-header-wrap .swimlane-header-menu-icon { - top: calc(50% + 6px); - padding: 5px; + padding-right: 20px; font-size: 22px; } .swimlane .swimlane-header-wrap .swimlane-header-handle { - top: calc(50% + 2px); - padding: 2px; + position: absolute; + padding: 7px; + top: 50%; + left: 230px; font-size: clamp(16px, 3vw, 20px); transform: translateY(-50%); display: flex; @@ -120,39 +109,22 @@ } .swimlane .swimlane-header-wrap .swimlane-header-miniscreen-handle { position: absolute; - padding: 2px; - top: calc(50% + 2px); + padding: 7px; + top: 50%; transform: translateY(-50%); - right: 60px; + left: 87vw; font-size: 24px; cursor: move; z-index: 15; pointer-events: auto; } -/* Swimlane collapse button styling - matches list collapse button */ -.swimlane .swimlane-header-wrap .swimlane-header-menu .swimlane-collapse-indicator { - color: #a6a6a6; - display: inline-block; - vertical-align: middle; - padding: 5px 8px; - border: none; - border-radius: 0; - background-color: transparent; - cursor: pointer; - font-size: 18px; - line-height: 1; - min-width: 30px; - text-align: center; - text-decoration: none; - margin: 0; - flex-shrink: 0; +/* Safety: ensure wrapper is interactive and above list content */ +.swimlane .swimlane-header-wrap { + position: relative; + z-index: 9; + pointer-events: auto; } -.swimlane .swimlane-header-wrap .swimlane-header-menu .swimlane-collapse-indicator:hover { - background-color: transparent; - color: #333; -} - #js-swimlane-height-edit .swimlane-height-error { display: none; } diff --git a/client/components/swimlanes/swimlanes.js b/client/components/swimlanes/swimlanes.js index a210a27a0..cb0eb4c9d 100644 --- a/client/components/swimlanes/swimlanes.js +++ b/client/components/swimlanes/swimlanes.js @@ -2,147 +2,7 @@ import { ReactiveCache } from '/imports/reactiveCache'; import dragscroll from '@wekanteam/dragscroll'; const { calculateIndex } = Utils; -function saveSorting(ui) { - // To attribute the new index number, we need to get the DOM element - // of the previous and the following list -- 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); - const listDomElement = ui.item.get(0); - if (!listDomElement) { - return; - } - - let list; - try { - list = Blaze.getData(listDomElement); - } catch (error) { - return; - } - - if (!list) { - return; - } - - // Detect if the list was dropped in a different swimlane - const targetSwimlaneDom = ui.item.closest('.js-swimlane'); - let targetSwimlaneId = null; - - if (targetSwimlaneDom.length > 0) { - // List was dropped in a swimlane - try { - targetSwimlaneId = targetSwimlaneDom.attr('id').replace('swimlane-', ''); - } catch (error) { - return; - } - } else { - // List was dropped in lists view (not swimlanes view) - // In this case, assign to the default swimlane - const currentBoard = ReactiveCache.getBoard(Session.get('currentBoard')); - if (currentBoard) { - const defaultSwimlane = currentBoard.getDefaultSwimline(); - if (defaultSwimlane) { - targetSwimlaneId = defaultSwimlane._id; - } - } - } - - // Get the original swimlane ID of the list (handle backward compatibility) - const originalSwimlaneId = list.getEffectiveSwimlaneId ? list.getEffectiveSwimlaneId() : (list.swimlaneId || null); - - // Prepare update object - const updateData = { - sort: sortIndex.base, - }; - - // Check if the list was dropped in a different swimlane - const isDifferentSwimlane = targetSwimlaneId && targetSwimlaneId !== originalSwimlaneId; - - // If the list was dropped in a different swimlane, update the swimlaneId - if (isDifferentSwimlane) { - updateData.swimlaneId = targetSwimlaneId; - - // Move all cards in the list to the new swimlane - const cardsInList = ReactiveCache.getCards({ - listId: list._id, - archived: false - }); - - cardsInList.forEach(card => { - card.move(list.boardId, targetSwimlaneId, list._id); - }); - - // Don't cancel the sortable when moving to a different swimlane - // The DOM move should be allowed to complete - } - // Allow reordering within the same swimlane by not canceling the sortable - - try { - Lists.update(list._id, { - $set: updateData, - }); - } catch (error) { - return; - } - - // Save to localStorage for non-logged-in users (backup) - if (!Meteor.userId()) { - try { - const boardId = list.boardId; - const listId = list._id; - const listOrderKey = `wekan-list-order-${boardId}`; - - let listOrder = JSON.parse(localStorage.getItem(listOrderKey) || '{}'); - if (!listOrder.lists) listOrder.lists = []; - - const listIndex = listOrder.lists.findIndex(l => l.id === listId); - if (listIndex >= 0) { - listOrder.lists[listIndex].sort = sortIndex.base; - listOrder.lists[listIndex].swimlaneId = updateData.swimlaneId; - listOrder.lists[listIndex].updatedAt = new Date().toISOString(); - } else { - listOrder.lists.push({ - id: listId, - sort: sortIndex.base, - swimlaneId: updateData.swimlaneId - }); - } - - localStorage.setItem(listOrderKey, JSON.stringify(listOrder)); - } catch (e) { - } - } - - // Persist to server - Meteor.call('updateListSort', list._id, list.boardId, updateData, function (error) { - if (error) { - Meteor.subscribe('board', list.boardId, false); - } - }); - - // Try to get board component - try { - const boardComponent = BlazeComponent.getComponentForElement(ui.item[0]); - if (boardComponent && boardComponent.setIsDragging) { - boardComponent.setIsDragging(false); - } - } catch (e) { - // Silent fail - } - - // Re-enable dragscroll after list dragging is complete - try { - dragscroll.reset(); - } catch (e) { - // Silent fail - } - - // Re-enable dragscroll on all swimlanes - $('.js-swimlane').each(function () { - $(this).addClass('dragscroll'); - }); -} function currentListIsInThisSwimlane(swimlaneId) { const currentList = Utils.getCurrentList(); @@ -185,60 +45,19 @@ function currentCardIsInThisList(listId, swimlaneId) { // without using currentuser above, because currentuser is null. } -function syncListOrderFromStorage(boardId) { - if (Meteor.userId()) { - // Logged-in users: don't use localStorage, trust server - return; - } - - try { - const listOrderKey = `wekan-list-order-${boardId}`; - const storageData = localStorage.getItem(listOrderKey); - - if (!storageData) return; - - const listOrder = JSON.parse(storageData); - if (!listOrder.lists || listOrder.lists.length === 0) return; - - // Compare each list's order in localStorage with database - listOrder.lists.forEach(storedList => { - const dbList = Lists.findOne(storedList.id); - if (dbList) { - // Check if localStorage has newer data (compare timestamps) - const storageTime = new Date(storedList.updatedAt).getTime(); - const dbTime = new Date(dbList.modifiedAt).getTime(); - - // If storage is newer OR db is missing the field, use storage value - if (storageTime > dbTime || dbList.sort !== storedList.sort) { - console.debug(`Restoring list ${storedList.id} sort from localStorage (storage: ${storageTime}, db: ${dbTime})`); - - // Update local minimongo first - Lists.update(storedList.id, { - $set: { - sort: storedList.sort, - swimlaneId: storedList.swimlaneId, - }, - }); - } - } - }); - } catch (e) { - console.warn('Failed to sync list order from localStorage:', e); - } -}; - function initSortable(boardComponent, $listsDom) { // Safety check: ensure we have valid DOM elements if (!$listsDom || $listsDom.length === 0) { console.error('initSortable: No valid DOM elements provided'); return; } - + // Check if sortable is already initialized if ($listsDom.data('uiSortable') || $listsDom.data('sortable')) { $listsDom.sortable('destroy'); } - + + // We want to animate the card details window closing. We rely on CSS // transition for the actual animation. $listsDom._uihooks = { @@ -258,29 +77,29 @@ function initSortable(boardComponent, $listsDom) { }, }; - + // Add click debugging for drag handles $listsDom.on('mousedown', '.js-list-handle', function(e) { e.stopPropagation(); }); - + $listsDom.on('mousedown', '.js-list-header', function(e) { }); - + // Add debugging for any mousedown on lists $listsDom.on('mousedown', '.js-list', function(e) { }); - + // Add debugging for sortable events $listsDom.on('sortstart', function(e, ui) { }); - + $listsDom.on('sortbeforestop', function(e, ui) { }); - + $listsDom.on('sortstop', function(e, ui) { }); - + try { $listsDom.sortable({ connectWith: '.js-swimlane, .js-lists', @@ -296,44 +115,156 @@ function initSortable(boardComponent, $listsDom) { distance: 3, forcePlaceholderSize: true, cursor: 'move', - start(evt, ui) { - ui.helper.css('z-index', 1000); - ui.placeholder.height(ui.helper.height()); - ui.placeholder.width(ui.helper.width()); - EscapeActions.executeUpTo('popup-close'); - boardComponent.setIsDragging(true); - - // Add visual feedback for list being dragged - ui.item.addClass('ui-sortable-helper'); - - // Disable dragscroll during list dragging to prevent interference - try { - dragscroll.reset(); - } catch (e) { - } - - // Also disable dragscroll on all swimlanes during list dragging - $('.js-swimlane').each(function() { - $(this).removeClass('dragscroll'); - }); - }, - beforeStop(evt, ui) { - // Clean up visual feedback - ui.item.removeClass('ui-sortable-helper'); - }, - stop(evt, ui) { - saveSorting(ui); + start(evt, ui) { + ui.helper.css('z-index', 1000); + ui.placeholder.height(ui.helper.height()); + ui.placeholder.width(ui.helper.width()); + EscapeActions.executeUpTo('popup-close'); + boardComponent.setIsDragging(true); + + // Add visual feedback for list being dragged + ui.item.addClass('ui-sortable-helper'); + + // Disable dragscroll during list dragging to prevent interference + try { + dragscroll.reset(); + } catch (e) { } - }); + + // Also disable dragscroll on all swimlanes during list dragging + $('.js-swimlane').each(function() { + $(this).removeClass('dragscroll'); + }); + }, + beforeStop(evt, ui) { + // Clean up visual feedback + ui.item.removeClass('ui-sortable-helper'); + }, + 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); + + const listDomElement = ui.item.get(0); + if (!listDomElement) { + console.error('List DOM element not found during drag stop'); + return; + } + + let list; + try { + list = Blaze.getData(listDomElement); + } catch (error) { + console.error('Error getting list data:', error); + return; + } + + if (!list) { + console.error('List data not found for element:', listDomElement); + return; + } + + // Detect if the list was dropped in a different swimlane + const targetSwimlaneDom = ui.item.closest('.js-swimlane'); + let targetSwimlaneId = null; + + + if (targetSwimlaneDom.length > 0) { + // List was dropped in a swimlane + try { + targetSwimlaneId = targetSwimlaneDom.attr('id').replace('swimlane-', ''); + } catch (error) { + console.error('Error getting target swimlane ID:', error); + return; + } + } else { + // List was dropped in lists view (not swimlanes view) + // In this case, assign to the default swimlane + const currentBoard = ReactiveCache.getBoard(Session.get('currentBoard')); + if (currentBoard) { + const defaultSwimlane = currentBoard.getDefaultSwimline(); + if (defaultSwimlane) { + targetSwimlaneId = defaultSwimlane._id; + } + } + } + + // Get the original swimlane ID of the list (handle backward compatibility) + const originalSwimlaneId = list.getEffectiveSwimlaneId ? list.getEffectiveSwimlaneId() : (list.swimlaneId || null); + + /* + Reverted incomplete change list width, + removed from below Lists.update: + https://github.com/wekan/wekan/issues/4558 + $set: { + width: list._id.width(), + height: list._id.height(), + */ + + // Prepare update object + const updateData = { + sort: sortIndex.base, + }; + + // Check if the list was dropped in a different swimlane + const isDifferentSwimlane = targetSwimlaneId && targetSwimlaneId !== originalSwimlaneId; + + // If the list was dropped in a different swimlane, update the swimlaneId + if (isDifferentSwimlane) { + updateData.swimlaneId = targetSwimlaneId; + + // Move all cards in the list to the new swimlane + const cardsInList = ReactiveCache.getCards({ + listId: list._id, + archived: false + }); + + cardsInList.forEach(card => { + card.move(list.boardId, targetSwimlaneId, list._id); + }); + + + // Don't cancel the sortable when moving to a different swimlane + // The DOM move should be allowed to complete + } else { + // If staying in the same swimlane, cancel the sortable to prevent DOM manipulation issues + $listsDom.sortable('cancel'); + } + + try { + Lists.update(list._id, { + $set: updateData, + }); + } catch (error) { + console.error('Error updating list:', error); + return; + } + + boardComponent.setIsDragging(false); + + // Re-enable dragscroll after list dragging is complete + try { + dragscroll.reset(); + } catch (e) { + } + + // Re-enable dragscroll on all swimlanes + $('.js-swimlane').each(function() { + $(this).addClass('dragscroll'); + }); + }, + }); } catch (error) { console.error('Error initializing list sortable:', error); return; } - - + + // Check if drag handles exist const dragHandles = $listsDom.find('.js-list-handle'); - + // Check if lists exist const lists = $listsDom.find('.js-list'); @@ -344,43 +275,31 @@ BlazeComponent.extendComponent({ onRendered() { const boardComponent = this.parentComponent(); const $listsDom = this.$('.js-lists'); - // Sync list order from localStorage on board load - const boardId = Session.get('currentBoard'); - if (boardId) { - // Small delay to allow pubsub to settle - Meteor.setTimeout(() => { - syncListOrderFromStorage(boardId); - }, 500); - } - + if (!Utils.getCurrentCardId()) { boardComponent.scrollLeft(); } // Try a simpler approach - initialize sortable directly like cards do - this.initializeSwimlaneResize(); - + // Wait for DOM to be ready setTimeout(() => { - const handleSelector = Utils.isTouchScreenOrShowDesktopDragHandles() - ? '.js-list-handle' - : '.js-list-header'; const $lists = this.$('.js-list'); - + const $parent = $lists.parent(); - + if ($lists.length > 0) { - + // Check for drag handles const $handles = $parent.find('.js-list-handle'); - + // Test if drag handles are clickable $handles.on('click', function(e) { e.preventDefault(); e.stopPropagation(); }); - + $parent.sortable({ connectWith: '.js-swimlane, .js-lists', tolerance: 'pointer', @@ -389,7 +308,7 @@ BlazeComponent.extendComponent({ items: '.js-list:not(.js-list-composer)', placeholder: 'list placeholder', distance: 7, - handle: handleSelector, + handle: '.js-list-handle', disabled: !Utils.canModifyBoard(), start(evt, ui) { ui.helper.css('z-index', 1000); @@ -400,16 +319,6 @@ BlazeComponent.extendComponent({ }, stop(evt, ui) { boardComponent.setIsDragging(false); - saveSorting(ui); - } - }); - // Reactively update handle when user toggles desktop drag handles - this.autorun(() => { - const newHandle = Utils.isTouchScreenOrShowDesktopDragHandles() - ? '.js-list-handle' - : '.js-list-header'; - if ($parent.data('uiSortable') || $parent.data('sortable')) { - try { $parent.sortable('option', 'handle', newHandle); } catch (e) {} } }); } else { @@ -475,11 +384,11 @@ BlazeComponent.extendComponent({ const isResizeHandle = $(evt.target).closest('.js-list-resize-handle, .js-swimlane-resize-handle').length > 0; const isInNoDragArea = $(evt.target).closest(noDragInside.join(',')).length > 0; - + if (isResizeHandle) { return; } - + if ( !isInNoDragArea && this.$('.swimlane').prop('clientHeight') > evt.offsetY @@ -514,7 +423,7 @@ BlazeComponent.extendComponent({ swimlaneHeight() { const user = ReactiveCache.getCurrentUser(); const swimlane = Template.currentData(); - + let height; if (user) { // For logged-in users, get from user profile @@ -538,10 +447,14 @@ BlazeComponent.extendComponent({ height = -1; } } - + return height == -1 ? "auto" : (height + 5 + "px"); }, + onRendered() { + // Initialize swimlane resize functionality immediately + this.initializeSwimlaneResize(); + }, initializeSwimlaneResize() { // Check if we're still in a valid template context @@ -549,11 +462,11 @@ BlazeComponent.extendComponent({ console.warn('No current template data available for swimlane resize initialization'); return; } - + const swimlane = Template.currentData(); const $swimlane = $(`#swimlane-${swimlane._id}`); const $resizeHandle = $swimlane.find('.js-swimlane-resize-handle'); - + // Check if elements exist if (!$swimlane.length || !$resizeHandle.length) { console.warn('Swimlane or resize handle not found, retrying in 100ms'); @@ -564,8 +477,8 @@ BlazeComponent.extendComponent({ }, 100); return; } - - + + if ($resizeHandle.length === 0) { return; } @@ -580,13 +493,13 @@ BlazeComponent.extendComponent({ isResizing = true; startY = e.pageY || e.originalEvent.touches[0].pageY; startHeight = parseInt($swimlane.css('height')) || 300; - - + + $swimlane.addClass('swimlane-resizing'); $('body').addClass('swimlane-resizing-active'); $('body').css('user-select', 'none'); - - + + e.preventDefault(); e.stopPropagation(); }; @@ -595,12 +508,12 @@ BlazeComponent.extendComponent({ if (!isResizing) { return; } - + const currentY = e.pageY || e.originalEvent.touches[0].pageY; const deltaY = currentY - startY; const newHeight = Math.max(minHeight, Math.min(maxHeight, startHeight + deltaY)); - - + + // Apply the new height immediately for real-time feedback $swimlane[0].style.setProperty('--swimlane-height', `${newHeight}px`); $swimlane[0].style.setProperty('height', `${newHeight}px`); @@ -610,22 +523,22 @@ BlazeComponent.extendComponent({ $swimlane[0].style.setProperty('flex-basis', 'auto'); $swimlane[0].style.setProperty('flex-grow', '0'); $swimlane[0].style.setProperty('flex-shrink', '0'); - - + + e.preventDefault(); e.stopPropagation(); }; const stopResize = (e) => { if (!isResizing) return; - + isResizing = false; - + // Calculate final height const currentY = e.pageY || e.originalEvent.touches[0].pageY; const deltaY = currentY - startY; const finalHeight = Math.max(minHeight, Math.min(maxHeight, startHeight + deltaY)); - + // Ensure the final height is applied $swimlane[0].style.setProperty('--swimlane-height', `${finalHeight}px`); $swimlane[0].style.setProperty('height', `${finalHeight}px`); @@ -635,19 +548,19 @@ BlazeComponent.extendComponent({ $swimlane[0].style.setProperty('flex-basis', 'auto'); $swimlane[0].style.setProperty('flex-grow', '0'); $swimlane[0].style.setProperty('flex-shrink', '0'); - + // Remove visual feedback but keep the height $swimlane.removeClass('swimlane-resizing'); $('body').removeClass('swimlane-resizing-active'); $('body').css('user-select', ''); - + // Save the new height using the existing system const boardId = swimlane.boardId; const swimlaneId = swimlane._id; - + if (process.env.DEBUG === 'true') { } - + const currentUser = ReactiveCache.getCurrentUser(); if (currentUser) { // For logged-in users, use server method @@ -664,21 +577,21 @@ BlazeComponent.extendComponent({ try { const stored = localStorage.getItem('wekan-swimlane-heights'); let heights = stored ? JSON.parse(stored) : {}; - + if (!heights[boardId]) { heights[boardId] = {}; } heights[boardId][swimlaneId] = finalHeight; - + localStorage.setItem('wekan-swimlane-heights', JSON.stringify(heights)); - + if (process.env.DEBUG === 'true') { } } catch (e) { console.warn('Error saving swimlane height to localStorage:', e); } } - + e.preventDefault(); }; @@ -686,18 +599,18 @@ BlazeComponent.extendComponent({ $resizeHandle.on('mousedown', startResize); $(document).on('mousemove', doResize); $(document).on('mouseup', stopResize); - + // Touch events for mobile $resizeHandle.on('touchstart', startResize, { passive: false }); $(document).on('touchmove', doResize, { passive: false }); $(document).on('touchend', stopResize, { passive: false }); - - + + // Prevent dragscroll interference $resizeHandle.on('mousedown', (e) => { e.stopPropagation(); }); - + }, }).register('swimlane'); @@ -769,33 +682,21 @@ Template.swimlane.helpers({ canSeeAddList() { return ReactiveCache.getCurrentUser().isBoardAdmin(); }, - - lists() { - // Return per-swimlane lists for this swimlane - return this.myLists(); - }, - - collapseSwimlane() { - return Utils.getSwimlaneCollapseState(this); - } }); - // Initialize sortable on DOM elements setTimeout(() => { + const $swimlaneElements = $('.swimlane'); const $listsGroupElements = $('.list-group'); - const computeHandle = () => ( - Utils.isTouchScreenOrShowDesktopDragHandles() ? '.js-list-handle' : '.js-list-header' - ); - - // Initialize sortable on ALL listsGroup elements (even empty ones) - $listsGroupElements.each(function(index) { - const $listsGroup = $(this); - const $lists = $listsGroup.find('.js-list'); - - // Only initialize on listsGroup elements that have the .js-lists class - if ($listsGroup.hasClass('js-lists')) { - $listsGroup.sortable({ + + // Initialize sortable on ALL swimlane elements (even empty ones) + $swimlaneElements.each(function(index) { + const $swimlane = $(this); + const $lists = $swimlane.find('.js-list'); + + // Only initialize on swimlanes that have the .js-lists class (the container for lists) + if ($swimlane.hasClass('js-lists')) { + $swimlane.sortable({ connectWith: '.js-swimlane, .js-lists', tolerance: 'pointer', appendTo: '.board-canvas', @@ -803,7 +704,7 @@ setTimeout(() => { items: '.js-list:not(.js-list-composer)', placeholder: 'list placeholder', distance: 7, - handle: computeHandle(), + handle: '.js-list-handle', disabled: !Utils.canModifyBoard(), start(evt, ui) { ui.helper.css('z-index', 1000); @@ -821,125 +722,6 @@ setTimeout(() => { } }, stop(evt, ui) { - // To attribute the new index number, we need to get the DOM element - // of the previous and the following list -- 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); - - const listDomElement = ui.item.get(0); - if (!listDomElement) { - return; - } - - let list; - try { - list = Blaze.getData(listDomElement); - } catch (error) { - return; - } - - if (!list) { - return; - } - - // Detect if the list was dropped in a different swimlane - const targetSwimlaneDom = ui.item.closest('.js-swimlane'); - let targetSwimlaneId = null; - - if (targetSwimlaneDom.length > 0) { - // List was dropped in a swimlane - try { - targetSwimlaneId = targetSwimlaneDom.attr('id').replace('swimlane-', ''); - } catch (error) { - return; - } - } else { - // List was dropped in lists view (not swimlanes view) - // In this case, assign to the default swimlane - const currentBoard = ReactiveCache.getBoard(Session.get('currentBoard')); - if (currentBoard) { - const defaultSwimlane = currentBoard.getDefaultSwimline(); - if (defaultSwimlane) { - targetSwimlaneId = defaultSwimlane._id; - } - } - } - - // Get the original swimlane ID of the list (handle backward compatibility) - const originalSwimlaneId = list.getEffectiveSwimlaneId ? list.getEffectiveSwimlaneId() : (list.swimlaneId || null); - - // Prepare update object - const updateData = { - sort: sortIndex.base, - }; - - // Check if the list was dropped in a different swimlane - const isDifferentSwimlane = targetSwimlaneId && targetSwimlaneId !== originalSwimlaneId; - - // If the list was dropped in a different swimlane, update the swimlaneId - if (isDifferentSwimlane) { - updateData.swimlaneId = targetSwimlaneId; - - // Move all cards in the list to the new swimlane - const cardsInList = ReactiveCache.getCards({ - listId: list._id, - archived: false - }); - - cardsInList.forEach(card => { - card.move(list.boardId, targetSwimlaneId, list._id); - }); - - // Don't cancel the sortable when moving to a different swimlane - // The DOM move should be allowed to complete - } - // Allow reordering within the same swimlane by not canceling the sortable - - try { - Lists.update(list._id, { - $set: updateData, - }); - } catch (error) { - return; - } - - // Save to localStorage for non-logged-in users (backup) - if (!Meteor.userId()) { - try { - const boardId = list.boardId; - const listId = list._id; - const listOrderKey = `wekan-list-order-${boardId}`; - - let listOrder = JSON.parse(localStorage.getItem(listOrderKey) || '{}'); - if (!listOrder.lists) listOrder.lists = []; - - const listIndex = listOrder.lists.findIndex(l => l.id === listId); - if (listIndex >= 0) { - listOrder.lists[listIndex].sort = sortIndex.base; - listOrder.lists[listIndex].swimlaneId = updateData.swimlaneId; - listOrder.lists[listIndex].updatedAt = new Date().toISOString(); - } else { - listOrder.lists.push({ - id: listId, - sort: sortIndex.base, - swimlaneId: updateData.swimlaneId, - updatedAt: new Date().toISOString() - }); - } - - localStorage.setItem(listOrderKey, JSON.stringify(listOrder)); - } catch (e) { - } - } - - // Persist to server - Meteor.call('updateListSort', list._id, list.boardId, updateData, function(error) { - if (error) { - Meteor.subscribe('board', list.boardId, false); - } - }); - // Try to get board component try { const boardComponent = BlazeComponent.getComponentForElement(ui.item[0]); @@ -949,25 +731,53 @@ setTimeout(() => { } catch (e) { // Silent fail } - - // Re-enable dragscroll after list dragging is complete + } + }); + } + }); + + // Initialize sortable on ALL listsGroup elements (even empty ones) + $listsGroupElements.each(function(index) { + const $listsGroup = $(this); + const $lists = $listsGroup.find('.js-list'); + + // Only initialize on listsGroup elements that have the .js-lists class + if ($listsGroup.hasClass('js-lists')) { + $listsGroup.sortable({ + connectWith: '.js-swimlane, .js-lists', + tolerance: 'pointer', + appendTo: '.board-canvas', + helper: 'clone', + items: '.js-list:not(.js-list-composer)', + placeholder: 'list placeholder', + distance: 7, + handle: '.js-list-handle', + disabled: !Utils.canModifyBoard(), + start(evt, ui) { + ui.helper.css('z-index', 1000); + ui.placeholder.height(ui.helper.height()); + ui.placeholder.width(ui.helper.width()); + EscapeActions.executeUpTo('popup-close'); + // Try to get board component try { - dragscroll.reset(); + const boardComponent = BlazeComponent.getComponentForElement(ui.item[0]); + if (boardComponent && boardComponent.setIsDragging) { + boardComponent.setIsDragging(true); + } + } catch (e) { + // Silent fail + } + }, + stop(evt, ui) { + // Try to get board component + try { + const boardComponent = BlazeComponent.getComponentForElement(ui.item[0]); + if (boardComponent && boardComponent.setIsDragging) { + boardComponent.setIsDragging(false); + } } catch (e) { // Silent fail } - - // Re-enable dragscroll on all swimlanes - $('.js-swimlane').each(function() { - $(this).addClass('dragscroll'); - }); - } - }); - // Reactively adjust handle when setting changes - Tracker.autorun(() => { - const newHandle = computeHandle(); - if ($listsGroup.data('uiSortable') || $listsGroup.data('sortable')) { - try { $listsGroup.sortable('option', 'handle', newHandle); } catch (e) {} } }); } @@ -1005,34 +815,31 @@ BlazeComponent.extendComponent({ onRendered() { const boardComponent = this.parentComponent(); const $listsDom = this.$('.js-lists'); - + if (!Utils.getCurrentCardId()) { boardComponent.scrollLeft(); } // Try a simpler approach for listsGroup too - + // Wait for DOM to be ready setTimeout(() => { - const handleSelector = Utils.isTouchScreenOrShowDesktopDragHandles() - ? '.js-list-handle' - : '.js-list-header'; const $lists = this.$('.js-list'); - + const $parent = $lists.parent(); - + if ($lists.length > 0) { - + // Check for drag handles const $handles = $parent.find('.js-list-handle'); - + // Test if drag handles are clickable $handles.on('click', function(e) { e.preventDefault(); e.stopPropagation(); }); - + $parent.sortable({ connectWith: '.js-swimlane, .js-lists', tolerance: 'pointer', @@ -1041,7 +848,7 @@ BlazeComponent.extendComponent({ items: '.js-list:not(.js-list-composer)', placeholder: 'list placeholder', distance: 7, - handle: handleSelector, + handle: '.js-list-handle', disabled: !Utils.canModifyBoard(), start(evt, ui) { ui.helper.css('z-index', 1000); @@ -1054,15 +861,6 @@ BlazeComponent.extendComponent({ boardComponent.setIsDragging(false); } }); - // Reactively update handle when user toggles desktop drag handles - this.autorun(() => { - const newHandle = Utils.isTouchScreenOrShowDesktopDragHandles() - ? '.js-list-handle' - : '.js-list-header'; - if ($parent.data('uiSortable') || $parent.data('sortable')) { - try { $parent.sortable('option', 'handle', newHandle); } catch (e) {} - } - }); } else { } }, 100); diff --git a/client/components/unicode-icons.css b/client/components/unicode-icons.css deleted file mode 100644 index 9afc50ccd..000000000 --- a/client/components/unicode-icons.css +++ /dev/null @@ -1,33 +0,0 @@ -.unicode-icon { - filter: grayscale(100%); - -webkit-filter: grayscale(100%); - opacity: 0.8; - display: inline-block; - line-height: 1; -} - -/* Greyscale for explicitly-marked emoji when feature is enabled */ -body.grey-icons-enabled .emoji-icon { - filter: grayscale(100%); - -webkit-filter: grayscale(100%); - opacity: 0.85; - display: inline-block; -} - -/* When grey icons are enabled, also grey common UI badges and toggles */ -body.grey-icons-enabled .card-date, -body.grey-icons-enabled .mobile-icon, -body.grey-icons-enabled .desktop-icon { - filter: grayscale(100%); - -webkit-filter: grayscale(100%); - opacity: 0.85; -} - -/* Grey card minibadges (icons + text + backgrounds) */ -body.grey-icons-enabled .minicard .badges .badge, -body.grey-icons-enabled .minicard .badges .badge .badge-icon, -body.grey-icons-enabled .minicard .badges .badge .badge-text { - filter: grayscale(100%); - -webkit-filter: grayscale(100%); - opacity: 0.9; -} diff --git a/client/components/unicode-icons.js b/client/components/unicode-icons.js deleted file mode 100644 index 709d896cd..000000000 --- a/client/components/unicode-icons.js +++ /dev/null @@ -1,122 +0,0 @@ -Meteor.startup(() => { - const greyscaleIcons = [ - '🔼', '❌', '🏷️', '📅', '📥', '🚀', '👤', '👥', '✍️', '📋', '✏️', '🌐', '📎', '📝', '📋', '📜', '🏠', '🔒', '🔕', '🃏', - '⏰', '🛒', '🔢', '✅', '❌', '👁️', '👍', '👎', '📋', '🕐', '🎨', - '📤', '⬆️', '⬇️', '➡️', '📦', - '⬅️', '↕️', '🔽', '🔍', '▼', '🏊', - '🔔', '⚙️', '🖼️', '🔑', '🚪', '◀️', '⌨️', '👥', '🏷️', '✅', '🚫', '☑️', '💬', - // Mobile/Desktop toggle + calendar - '📱', '🖥️', '🗓️' - ]; - - const EXCLUDE_SELECTOR = '.header-user-bar-avatar, .avatar-initials, script, style'; - let observer = null; - let enabled = false; - - function isExcluded(el) { - if (!el) return true; - if (el.nodeType === Node.ELEMENT_NODE && (el.matches('script') || el.matches('style'))) return true; - if (el.closest && el.closest(EXCLUDE_SELECTOR)) return true; - return false; - } - - function wrapTextNodeOnce(parent, textNode) { - if (!parent || !textNode) return; - if (isExcluded(parent)) return; - if (parent.closest && parent.closest('.unicode-icon')) return; - const raw = textNode.nodeValue; - if (!raw) return; - const txt = raw.trim(); - // small guard against long text processing - if (txt.length > 3) return; - if (!greyscaleIcons.includes(txt)) return; - const span = document.createElement('span'); - span.className = 'unicode-icon'; - span.textContent = txt; - parent.replaceChild(span, textNode); - } - - function wrapSubtree(root) { - try { - if (!root) return; - // Walk only within this subtree for text nodes - const walker = document.createTreeWalker( - root.nodeType === Node.ELEMENT_NODE ? root : root.parentNode || document.body, - NodeFilter.SHOW_TEXT, - { - acceptNode: (node) => { - if (!node || !node.nodeValue) return NodeFilter.FILTER_REJECT; - const parent = node.parentNode; - if (!parent || isExcluded(parent)) return NodeFilter.FILTER_REJECT; - if (parent.closest && parent.closest('.unicode-icon')) return NodeFilter.FILTER_REJECT; - const txt = node.nodeValue.trim(); - if (!txt || txt.length > 3) return NodeFilter.FILTER_REJECT; - return greyscaleIcons.includes(txt) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP; - }, - }, - false, - ); - const toWrap = []; - while (walker.nextNode()) { - toWrap.push(walker.currentNode); - } - for (const textNode of toWrap) { - wrapTextNodeOnce(textNode.parentNode, textNode); - } - } catch (_) {} - } - - function processInitial() { - // Process only frequently used UI containers to avoid full-page walks - const roots = [document.body].filter(Boolean); - roots.forEach(wrapSubtree); - } - - function startObserver() { - if (observer) return; - observer = new MutationObserver((mutations) => { - // Batch process only added nodes, ignore attribute/character changes - for (const m of mutations) { - if (m.type !== 'childList') continue; - m.addedNodes && m.addedNodes.forEach((n) => { - // Process only within the newly added subtree - wrapSubtree(n); - }); - } - }); - observer.observe(document.body, { childList: true, subtree: true }); - } - - function stopObserver() { - if (observer) { - try { observer.disconnect(); } catch (_) {} - } - observer = null; - } - - function enableGrey() { - if (enabled) return; - enabled = true; - try { document.body.classList.add('grey-icons-enabled'); } catch (_) {} - Meteor.defer(processInitial); - startObserver(); - } - - function disableGrey() { - if (!enabled) return; - enabled = false; - stopObserver(); - try { document.body.classList.remove('grey-icons-enabled'); } catch (_) {} - // unwrap existing - document.querySelectorAll('span.unicode-icon').forEach((span) => { - const txt = document.createTextNode(span.textContent || ''); - if (span.parentNode) span.parentNode.replaceChild(txt, span); - }); - } - - Tracker.autorun(() => { - const user = Meteor.user(); - const on = !!(user && user.profile && user.profile.GreyIcons); - if (on) enableGrey(); else disableGrey(); - }); -}); diff --git a/client/components/users/userAvatar.css b/client/components/users/userAvatar.css index 7e2b2a923..b65a98bd9 100644 --- a/client/components/users/userAvatar.css +++ b/client/components/users/userAvatar.css @@ -3,8 +3,8 @@ display: block; position: relative; float: left; - height: clamp(24px, 3.5vw, 36px); - width: clamp(24px, 3.5vw, 36px); + height: 30px; + width: 30px; margin: .3vh; cursor: pointer; user-select: none; @@ -111,7 +111,7 @@ padding-top: 0; } .mini-profile-info .member { - width: clamp(40px, 5vw, 60px); - height: clamp(40px, 5vw, 60px); + width: 50px; + height: 50px; margin-right: 10px; } diff --git a/client/components/users/userAvatar.jade b/client/components/users/userAvatar.jade index e00fc188f..b1bc7e2d4 100644 --- a/client/components/users/userAvatar.jade +++ b/client/components/users/userAvatar.jade @@ -1,7 +1,7 @@ template(name="userAvatar") a.member(class="js-{{#if assignee}}assignee{{else}}member{{/if}}" title="{{userData.profile.fullname}} ({{userData.username}}) {{_ memberType}}") if userData.profile.avatarUrl - img.avatar.avatar-image(src="{{avatarUrl}}") + img.avatar.avatar-image(src="{{userData.profile.avatarUrl}}") else +userAvatarInitials(userId=userData._id) @@ -87,7 +87,7 @@ template(name="changeAvatarPopup") each uploadedAvatars li: a.js-select-avatar .member - img.avatar.avatar-image(src="{{link}}") + img.avatar.avatar-image(src="{{link}}?auth=false&brokenIsFine=true") | {{_ 'uploaded-avatar'}} if isSelected | ✅ diff --git a/client/components/users/userAvatar.js b/client/components/users/userAvatar.js index f2db90ee3..98ebc901e 100644 --- a/client/components/users/userAvatar.js +++ b/client/components/users/userAvatar.js @@ -15,21 +15,6 @@ Template.userAvatar.helpers({ }); }, - avatarUrl() { - const user = ReactiveCache.getUser(this.userId, { fields: { profile: 1 } }); - const base = (user && user.profile && user.profile.avatarUrl) || ''; - if (!base) return ''; - // Append current boardId when available so public viewers can access avatars on public boards - try { - const boardId = Utils.getCurrentBoardId && Utils.getCurrentBoardId(); - if (boardId) { - const sep = base.includes('?') ? '&' : '?'; - return `${base}${sep}boardId=${encodeURIComponent(boardId)}`; - } - } catch (_) {} - return base; - }, - memberType() { const user = ReactiveCache.getUser(this.userId); return user && user.isBoardAdmin() ? 'admin' : 'normal'; @@ -194,7 +179,7 @@ BlazeComponent.extendComponent({ isSelected() { const userProfile = ReactiveCache.getCurrentUser().profile; const avatarUrl = userProfile && userProfile.avatarUrl; - const currentAvatarUrl = this.currentData().link(); + const currentAvatarUrl = `${this.currentData().link()}?auth=false&brokenIsFine=true`; return avatarUrl === currentAvatarUrl; }, @@ -235,7 +220,7 @@ BlazeComponent.extendComponent({ } }, 'click .js-select-avatar'() { - const avatarUrl = this.currentData().link(); + const avatarUrl = `${this.currentData().link()}?auth=false&brokenIsFine=true`; this.setAvatar(avatarUrl); }, 'click .js-select-initials'() { diff --git a/client/components/users/userHeader.jade b/client/components/users/userHeader.jade index 49724e84b..8934ddbc4 100644 --- a/client/components/users/userHeader.jade +++ b/client/components/users/userHeader.jade @@ -12,14 +12,12 @@ template(name="headerUserBar") template(name="memberMenuPopup") ul.pop-over-list + // Bookmarks at the very top + li + a.js-open-bookmarks + | 🔖 + | {{_ 'bookmarks'}} with currentUser - li - a.js-toggle-grey-icons(href="#") - | 🎨 - | {{_ 'grey-icons'}} - if currentUser.profile - if currentUser.profile.GreyIcons - span(key="grey-icons-checkmark") ✅ li a.js-my-cards(href="{{pathFor 'my-cards'}}") | 📋 @@ -93,11 +91,10 @@ template(name="memberMenuPopup") a.js-change-language | 🏁 | {{_ 'changeLanguagePopup-title'}} - if isSupportPageEnabled - li - a(href="{{pathFor 'support'}}") - | ❓ - | {{_ 'support'}} + //li + // a.js-support + // ❓-circle + // | {{_ 'support'}} unless isSandstorm hr ul.pop-over-list @@ -164,8 +161,7 @@ template(name="editProfilePopup") template(name="supportPopup") ul.pop-over-list li - +viewer - = currentSetting.supportPopupText + | Support popup text will be editable later. template(name="changePasswordPopup") +atForm(state='changePwd') @@ -175,7 +171,7 @@ template(name="changeLanguagePopup") each languages li(class="{{# if isCurrentLanguage}}active{{/if}}") a.js-set-language - span.emoji-icon {{languageFlag}} + | {{languageFlag}} | {{name}} if isCurrentLanguage | ✅ diff --git a/client/components/users/userHeader.js b/client/components/users/userHeader.js index 29d21d685..5514a1127 100644 --- a/client/components/users/userHeader.js +++ b/client/components/users/userHeader.js @@ -31,10 +31,6 @@ Template.memberMenuPopup.helpers({ return false; } }, - isSupportPageEnabled() { - const setting = ReactiveCache.getCurrentSetting(); - return setting && setting.supportPageEnabled; - }, isSameDomainNameSettingValue(){ const currSett = ReactiveCache.getCurrentSetting(); if(currSett && currSett != undefined && currSett.disableRegistration && currSett.mailDomainName !== undefined && currSett.mailDomainName != ""){ @@ -94,15 +90,6 @@ Template.memberMenuPopup.events({ 'click .js-notifications-drawer-toggle'() { Session.set('showNotificationsDrawer', !Session.get('showNotificationsDrawer')); }, - 'click .js-toggle-grey-icons'(event) { - event.preventDefault(); - const currentUser = ReactiveCache.getCurrentUser(); - if (!currentUser || !Meteor.userId()) return; - const current = (currentUser.profile && currentUser.profile.GreyIcons) || false; - Meteor.call('toggleGreyIcons', (err) => { - if (err && process.env.DEBUG === 'true') console.error('toggleGreyIcons error', err); - }); - }, 'click .js-logout'(event) { event.preventDefault(); diff --git a/client/config/blazeHelpers.js b/client/config/blazeHelpers.js index 87418921a..967b83059 100644 --- a/client/config/blazeHelpers.js +++ b/client/config/blazeHelpers.js @@ -73,12 +73,6 @@ Blaze.registerHelper('canModifyCard', () => Utils.canModifyCard(), ); -Blaze.registerHelper('canMoveCard', () => - Utils.canMoveCard(), -); - Blaze.registerHelper('canModifyBoard', () => Utils.canModifyBoard(), ); - -Blaze.registerHelper('add', (a, b) => a + b); diff --git a/client/lib/boardMultiSelection.js b/client/lib/boardMultiSelection.js deleted file mode 100644 index 036c312b6..000000000 --- a/client/lib/boardMultiSelection.js +++ /dev/null @@ -1,73 +0,0 @@ -import { ReactiveCache } from '/imports/reactiveCache'; - -BoardMultiSelection = { - _selectedBoards: new ReactiveVar([]), - - _isActive: new ReactiveVar(false), - - reset() { - this._selectedBoards.set([]); - }, - - isActive() { - return this._isActive.get(); - }, - - count() { - return this._selectedBoards.get().length; - }, - - isEmpty() { - return this.count() === 0; - }, - - getSelectedBoardIds() { - return this._selectedBoards.get(); - }, - - activate() { - if (!this.isActive()) { - this._isActive.set(true); - Tracker.flush(); - } - }, - - disable() { - if (this.isActive()) { - this._isActive.set(false); - this.reset(); - } - }, - - add(boardIds) { - return this.toggle(boardIds, { add: true, remove: false }); - }, - - remove(boardIds) { - return this.toggle(boardIds, { add: false, remove: true }); - }, - - toogle(boardIds) { - return this.toggle(boardIds, { add: true, remove: true }); - }, - - toggle(boardIds, { add, remove } = {}) { - boardIds = _.isString(boardIds) ? [boardIds] : boardIds; - let selectedBoards = this._selectedBoards.get(); - - boardIds.forEach(boardId => { - const index = selectedBoards.indexOf(boardId); - if (index > -1 && remove) { - selectedBoards = selectedBoards.filter(id => id !== boardId); - } else if (index === -1 && add) { - selectedBoards.push(boardId); - } - }); - - this._selectedBoards.set(selectedBoards); - }, - - isSelected(boardId) { - return this._selectedBoards.get().includes(boardId); - }, -}; diff --git a/client/lib/datepicker.js b/client/lib/datepicker.js index fa2ff8129..08b15b2eb 100644 --- a/client/lib/datepicker.js +++ b/client/lib/datepicker.js @@ -1,27 +1,32 @@ import { ReactiveCache } from '/imports/reactiveCache'; import { TAPi18n } from '/imports/i18n'; +import { + formatDateTime, + formatDate, + formatTime, + getISOWeek, + isValidDate, + isBefore, + isAfter, + isSame, + add, + subtract, + startOf, + endOf, + format, + parseDate, + now, + createDate, + fromNow, + calendar +} from '/imports/lib/dateUtils'; -// Helper to check if a date is valid -function isValidDate(date) { - return date instanceof Date && !isNaN(date); +// Helper function to get time format for 24 hours +function adjustedTimeFormat() { + return 'HH:mm'; } -// Format date as YYYY-MM-DD -function formatDate(date) { - if (!isValidDate(date)) return ''; - const year = date.getFullYear(); - const month = String(date.getMonth() + 1).padStart(2, '0'); - const day = String(date.getDate()).padStart(2, '0'); - return `${year}-${month}-${day}`; -} - -// Format time as HH:mm -function formatTime(date) { - if (!isValidDate(date)) return ''; - const hours = String(date.getHours()).padStart(2, '0'); - const minutes = String(date.getMinutes()).padStart(2, '0'); - return `${hours}:${minutes}`; -} +// .replace(/HH/i, 'H'); export class DatePicker extends BlazeComponent { template() { @@ -71,10 +76,10 @@ export class DatePicker extends BlazeComponent { return ''; } dateFormat() { - return 'YYYY-MM-DD'; + return 'L'; } timeFormat() { - return 'HH:mm'; + return 'LT'; } events() { @@ -84,8 +89,7 @@ export class DatePicker extends BlazeComponent { // Native HTML date input validation const dateValue = this.find('#date').value; if (dateValue) { - // HTML date input format is always YYYY-MM-DD - const dateObj = new Date(dateValue + 'T12:00:00'); + const dateObj = new Date(dateValue); if (isValidDate(dateObj)) { this.error.set(''); } else { @@ -97,8 +101,7 @@ export class DatePicker extends BlazeComponent { // Native HTML time input validation const timeValue = this.find('#time').value; if (timeValue) { - // HTML time input format is always HH:mm - const timeObj = new Date(`1970-01-01T${timeValue}:00`); + const timeObj = new Date(`1970-01-01T${timeValue}`); if (isValidDate(timeObj)) { this.error.set(''); } else { @@ -118,9 +121,7 @@ export class DatePicker extends BlazeComponent { return; } - // Combine date and time: HTML date input is YYYY-MM-DD, time input is HH:mm - const dateTimeString = `${dateValue}T${timeValue}:00`; - const newCompleteDate = new Date(dateTimeString); + const newCompleteDate = new Date(`${dateValue}T${timeValue}`); if (!isValidDate(newCompleteDate)) { this.error.set('invalid'); diff --git a/client/lib/dialogWithBoardSwimlaneListCard.js b/client/lib/dialogWithBoardSwimlaneListCard.js index 75d6cb219..a516fde72 100644 --- a/client/lib/dialogWithBoardSwimlaneListCard.js +++ b/client/lib/dialogWithBoardSwimlaneListCard.js @@ -12,33 +12,6 @@ export class DialogWithBoardSwimlaneListCard extends DialogWithBoardSwimlaneList return ret; } - onCreated() { - super.onCreated(); - this.selectedCardId = new ReactiveVar(''); - } - - /** set the last confirmed dialog field values - * @param boardId the current board id - */ - setOption(boardId) { - super.setOption(boardId); - - // Also set cardId if available - if (this.cardOption && this.cardOption.cardId) { - this.selectedCardId.set(this.cardOption.cardId); - } - } - - /** returns all available cards of the current list */ - cards() { - const list = ReactiveCache.getList({_id: this.selectedListId.get(), boardId: this.selectedBoardId.get()}); - if (list) { - return list.cards(); - } else { - return []; - } - } - /** returns if the card id was the last confirmed one * @param cardId check this card id * @return if the card id was the last confirmed one @@ -48,28 +21,14 @@ export class DialogWithBoardSwimlaneListCard extends DialogWithBoardSwimlaneList return ret; } - /** get the board data from the server - * @param boardId get the board data of this board id - */ - getBoardData(boardId) { - const self = this; - Meteor.subscribe('board', boardId, false, { - onReady() { - const sameBoardId = self.selectedBoardId.get() == boardId; - self.selectedBoardId.set(boardId); - - if (!sameBoardId) { - // reset swimlane id - self.setFirstSwimlaneId(); - - // reset list id - self.setFirstListId(); - - // reset card id - self.selectedCardId.set(''); - } - }, - }); + /** returns all available cards of the current list */ + cards() { + const list = ReactiveCache.getList(this.selectedListId.get()); + let ret = []; + if (list) { + ret = list.cards(this.selectedSwimlaneId.get()); + } + return ret; } events() { @@ -86,7 +45,7 @@ export class DialogWithBoardSwimlaneListCard extends DialogWithBoardSwimlaneList const swimlaneId = swimlaneSelect.options[swimlaneSelect.selectedIndex].value; const cardSelect = this.$('.js-select-cards')[0]; - const cardId = cardSelect.options.length > 0 ? cardSelect.options[cardSelect.selectedIndex].value : null; + const cardId = cardSelect.options[cardSelect.selectedIndex].value; const options = { 'boardId' : boardId, @@ -106,8 +65,6 @@ export class DialogWithBoardSwimlaneListCard extends DialogWithBoardSwimlaneList }, 'change .js-select-lists'(event) { this.selectedListId.set($(event.currentTarget).val()); - // Reset card selection when list changes - this.selectedCardId.set(''); }, }, ]; diff --git a/client/lib/localStorageValidator.js b/client/lib/localStorageValidator.js deleted file mode 100644 index f03988a18..000000000 --- a/client/lib/localStorageValidator.js +++ /dev/null @@ -1,278 +0,0 @@ -/** - * LocalStorage Validation and Cleanup Utility - * - * Validates and cleans up per-user UI state stored in localStorage - * for non-logged-in users (swimlane heights, list widths, collapse states) - */ - -// Maximum age for localStorage data (90 days) -const MAX_AGE_MS = 90 * 24 * 60 * 60 * 1000; - -// Maximum number of boards to keep per storage key -const MAX_BOARDS_PER_KEY = 50; - -// Maximum number of items per board -const MAX_ITEMS_PER_BOARD = 100; - -/** - * Validate that a value is a valid positive number - */ -function isValidNumber(value, min = 0, max = 10000) { - if (typeof value !== 'number') return false; - if (isNaN(value)) return false; - if (!isFinite(value)) return false; - if (value < min || value > max) return false; - return true; -} - -/** - * Validate that a value is a valid boolean - */ -function isValidBoolean(value) { - return typeof value === 'boolean'; -} - -/** - * Validate and clean swimlane heights data - * Structure: { boardId: { swimlaneId: height, ... }, ... } - */ -function validateSwimlaneHeights(data) { - if (!data || typeof data !== 'object') return {}; - - const cleaned = {}; - const boardIds = Object.keys(data).slice(0, MAX_BOARDS_PER_KEY); - - for (const boardId of boardIds) { - if (typeof boardId !== 'string' || boardId.length === 0) continue; - - const boardData = data[boardId]; - if (!boardData || typeof boardData !== 'object') continue; - - const swimlaneIds = Object.keys(boardData).slice(0, MAX_ITEMS_PER_BOARD); - const cleanedBoard = {}; - - for (const swimlaneId of swimlaneIds) { - if (typeof swimlaneId !== 'string' || swimlaneId.length === 0) continue; - - const height = boardData[swimlaneId]; - // Valid swimlane heights: -1 (auto) or 50-2000 pixels - if (isValidNumber(height, -1, 2000)) { - cleanedBoard[swimlaneId] = height; - } - } - - if (Object.keys(cleanedBoard).length > 0) { - cleaned[boardId] = cleanedBoard; - } - } - - return cleaned; -} - -/** - * Validate and clean list widths data - * Structure: { boardId: { listId: width, ... }, ... } - */ -function validateListWidths(data) { - if (!data || typeof data !== 'object') return {}; - - const cleaned = {}; - const boardIds = Object.keys(data).slice(0, MAX_BOARDS_PER_KEY); - - for (const boardId of boardIds) { - if (typeof boardId !== 'string' || boardId.length === 0) continue; - - const boardData = data[boardId]; - if (!boardData || typeof boardData !== 'object') continue; - - const listIds = Object.keys(boardData).slice(0, MAX_ITEMS_PER_BOARD); - const cleanedBoard = {}; - - for (const listId of listIds) { - if (typeof listId !== 'string' || listId.length === 0) continue; - - const width = boardData[listId]; - // Valid list widths: 100-1000 pixels - if (isValidNumber(width, 100, 1000)) { - cleanedBoard[listId] = width; - } - } - - if (Object.keys(cleanedBoard).length > 0) { - cleaned[boardId] = cleanedBoard; - } - } - - return cleaned; -} - -/** - * Validate and clean collapsed states data - * Structure: { boardId: { itemId: boolean, ... }, ... } - */ -function validateCollapsedStates(data) { - if (!data || typeof data !== 'object') return {}; - - const cleaned = {}; - const boardIds = Object.keys(data).slice(0, MAX_BOARDS_PER_KEY); - - for (const boardId of boardIds) { - if (typeof boardId !== 'string' || boardId.length === 0) continue; - - const boardData = data[boardId]; - if (!boardData || typeof boardData !== 'object') continue; - - const itemIds = Object.keys(boardData).slice(0, MAX_ITEMS_PER_BOARD); - const cleanedBoard = {}; - - for (const itemId of itemIds) { - if (typeof itemId !== 'string' || itemId.length === 0) continue; - - const collapsed = boardData[itemId]; - if (isValidBoolean(collapsed)) { - cleanedBoard[itemId] = collapsed; - } - } - - if (Object.keys(cleanedBoard).length > 0) { - cleaned[boardId] = cleanedBoard; - } - } - - return cleaned; -} - -/** - * Validate and clean a single localStorage key - */ -function validateAndCleanKey(key, validator) { - try { - const stored = localStorage.getItem(key); - if (!stored) return; - - const data = JSON.parse(stored); - const cleaned = validator(data); - - // Only write back if data changed - const cleanedStr = JSON.stringify(cleaned); - if (cleanedStr !== stored) { - if (Object.keys(cleaned).length > 0) { - localStorage.setItem(key, cleanedStr); - } else { - localStorage.removeItem(key); - } - } - } catch (e) { - console.warn(`Error validating localStorage key ${key}:`, e); - // Remove corrupted data - try { - localStorage.removeItem(key); - } catch (removeError) { - console.error(`Failed to remove corrupted localStorage key ${key}:`, removeError); - } - } -} - -/** - * Validate and clean all Wekan localStorage data - * Called on app startup and periodically - */ -export function validateAndCleanLocalStorage() { - if (typeof localStorage === 'undefined') return; - - try { - // Validate swimlane heights - validateAndCleanKey('wekan-swimlane-heights', validateSwimlaneHeights); - - // Validate list widths - validateAndCleanKey('wekan-list-widths', validateListWidths); - - // Validate list constraints - validateAndCleanKey('wekan-list-constraints', validateListWidths); - - // Validate collapsed lists - validateAndCleanKey('wekan-collapsed-lists', validateCollapsedStates); - - // Validate collapsed swimlanes - validateAndCleanKey('wekan-collapsed-swimlanes', validateCollapsedStates); - - // Record last cleanup time - localStorage.setItem('wekan-last-cleanup', Date.now().toString()); - - } catch (e) { - console.error('Error during localStorage validation:', e); - } -} - -/** - * Check if cleanup is needed (once per day) - */ -export function shouldRunCleanup() { - if (typeof localStorage === 'undefined') return false; - - try { - const lastCleanup = localStorage.getItem('wekan-last-cleanup'); - if (!lastCleanup) return true; - - const lastCleanupTime = parseInt(lastCleanup, 10); - if (isNaN(lastCleanupTime)) return true; - - const timeSince = Date.now() - lastCleanupTime; - // Run cleanup once per day - return timeSince > 24 * 60 * 60 * 1000; - } catch (e) { - return true; - } -} - -/** - * Get validated data from localStorage - */ -export function getValidatedLocalStorageData(key, validator) { - if (typeof localStorage === 'undefined') return {}; - - try { - const stored = localStorage.getItem(key); - if (!stored) return {}; - - const data = JSON.parse(stored); - return validator(data); - } catch (e) { - console.warn(`Error reading localStorage key ${key}:`, e); - return {}; - } -} - -/** - * Set validated data to localStorage - */ -export function setValidatedLocalStorageData(key, data, validator) { - if (typeof localStorage === 'undefined') return false; - - try { - const validated = validator(data); - localStorage.setItem(key, JSON.stringify(validated)); - return true; - } catch (e) { - console.error(`Error writing localStorage key ${key}:`, e); - return false; - } -} - -// Export validators for use by other modules -export const validators = { - swimlaneHeights: validateSwimlaneHeights, - listWidths: validateListWidths, - collapsedStates: validateCollapsedStates, - isValidNumber, - isValidBoolean, -}; - -// Auto-cleanup on module load if needed -if (Meteor.isClient) { - Meteor.startup(() => { - if (shouldRunCleanup()) { - validateAndCleanLocalStorage(); - } - }); -} diff --git a/client/lib/migrationManager.js b/client/lib/migrationManager.js new file mode 100644 index 000000000..19ea53f10 --- /dev/null +++ b/client/lib/migrationManager.js @@ -0,0 +1,815 @@ +/** + * Migration Manager + * Handles all database migrations as steps during board loading + * with detailed progress tracking and background persistence + */ + +import { ReactiveVar } from 'meteor/reactive-var'; +import { ReactiveCache } from '/imports/reactiveCache'; + +// Reactive variables for migration progress +export const migrationProgress = new ReactiveVar(0); +export const migrationStatus = new ReactiveVar(''); +export const migrationCurrentStep = new ReactiveVar(''); +export const migrationSteps = new ReactiveVar([]); +export const isMigrating = new ReactiveVar(false); +export const migrationEstimatedTime = new ReactiveVar(''); + +class MigrationManager { + constructor() { + this.migrationCache = new Map(); // Cache completed migrations + this.steps = this.initializeMigrationSteps(); + this.currentStepIndex = 0; + this.startTime = null; + } + + /** + * Initialize all migration steps with their details + */ + initializeMigrationSteps() { + return [ + { + id: 'board-background-color', + name: 'Board Background Colors', + description: 'Setting up board background colors', + weight: 1, + completed: false, + progress: 0 + }, + { + id: 'add-cardcounterlist-allowed', + name: 'Card Counter List Settings', + description: 'Adding card counter list permissions', + weight: 1, + completed: false, + progress: 0 + }, + { + id: 'add-boardmemberlist-allowed', + name: 'Board Member List Settings', + description: 'Adding board member list permissions', + weight: 1, + completed: false, + progress: 0 + }, + { + id: 'lowercase-board-permission', + name: 'Board Permission Standardization', + description: 'Converting board permissions to lowercase', + weight: 1, + completed: false, + progress: 0 + }, + { + id: 'change-attachments-type-for-non-images', + name: 'Attachment Type Standardization', + description: 'Updating attachment types for non-images', + weight: 2, + completed: false, + progress: 0 + }, + { + id: 'card-covers', + name: 'Card Covers System', + description: 'Setting up card cover functionality', + weight: 2, + completed: false, + progress: 0 + }, + { + id: 'use-css-class-for-boards-colors', + name: 'Board Color CSS Classes', + description: 'Converting board colors to CSS classes', + weight: 2, + completed: false, + progress: 0 + }, + { + id: 'denormalize-star-number-per-board', + name: 'Board Star Counts', + description: 'Calculating star counts per board', + weight: 3, + completed: false, + progress: 0 + }, + { + id: 'add-member-isactive-field', + name: 'Member Activity Status', + description: 'Adding member activity tracking', + weight: 2, + completed: false, + progress: 0 + }, + { + id: 'add-sort-checklists', + name: 'Checklist Sorting', + description: 'Adding sort order to checklists', + weight: 2, + completed: false, + progress: 0 + }, + { + id: 'add-swimlanes', + name: 'Swimlanes System', + description: 'Setting up swimlanes functionality', + weight: 4, + completed: false, + progress: 0 + }, + { + id: 'add-views', + name: 'Board Views', + description: 'Adding board view options', + weight: 2, + completed: false, + progress: 0 + }, + { + id: 'add-checklist-items', + name: 'Checklist Items', + description: 'Setting up checklist items system', + weight: 3, + completed: false, + progress: 0 + }, + { + id: 'add-card-types', + name: 'Card Types', + description: 'Adding card type functionality', + weight: 2, + completed: false, + progress: 0 + }, + { + id: 'add-custom-fields-to-cards', + name: 'Custom Fields', + description: 'Adding custom fields to cards', + weight: 3, + completed: false, + progress: 0 + }, + { + id: 'add-requester-field', + name: 'Requester Field', + description: 'Adding requester field to cards', + weight: 1, + completed: false, + progress: 0 + }, + { + id: 'add-assigner-field', + name: 'Assigner Field', + description: 'Adding assigner field to cards', + weight: 1, + completed: false, + progress: 0 + }, + { + id: 'add-parent-field-to-cards', + name: 'Card Parent Relationships', + description: 'Adding parent field to cards', + weight: 2, + completed: false, + progress: 0 + }, + { + id: 'add-subtasks-boards', + name: 'Subtasks Boards', + description: 'Setting up subtasks board functionality', + weight: 3, + completed: false, + progress: 0 + }, + { + id: 'add-subtasks-sort', + name: 'Subtasks Sorting', + description: 'Adding sort order to subtasks', + weight: 2, + completed: false, + progress: 0 + }, + { + id: 'add-subtasks-allowed', + name: 'Subtasks Permissions', + description: 'Adding subtasks permissions', + weight: 1, + completed: false, + progress: 0 + }, + { + id: 'add-authenticationMethod', + name: 'Authentication Methods', + description: 'Adding authentication method tracking', + weight: 2, + completed: false, + progress: 0 + }, + { + id: 'remove-tag', + name: 'Remove Tag Field', + description: 'Removing deprecated tag field', + weight: 1, + completed: false, + progress: 0 + }, + { + id: 'remove-customFields-references-broken', + name: 'Fix Custom Fields References', + description: 'Fixing broken custom field references', + weight: 2, + completed: false, + progress: 0 + }, + { + id: 'add-product-name', + name: 'Product Name Settings', + description: 'Adding product name configuration', + weight: 1, + completed: false, + progress: 0 + }, + { + id: 'add-hide-logo', + name: 'Hide Logo Setting', + description: 'Adding hide logo option', + weight: 1, + completed: false, + progress: 0 + }, + { + id: 'add-hide-card-counter-list', + name: 'Hide Card Counter Setting', + description: 'Adding hide card counter option', + weight: 1, + completed: false, + progress: 0 + }, + { + id: 'add-hide-board-member-list', + name: 'Hide Board Member List Setting', + description: 'Adding hide board member list option', + weight: 1, + completed: false, + progress: 0 + }, + { + id: 'add-displayAuthenticationMethod', + name: 'Display Authentication Method', + description: 'Adding authentication method display option', + weight: 1, + completed: false, + progress: 0 + }, + { + id: 'add-defaultAuthenticationMethod', + name: 'Default Authentication Method', + description: 'Setting default authentication method', + weight: 1, + completed: false, + progress: 0 + }, + { + id: 'add-templates', + name: 'Board Templates', + description: 'Setting up board templates system', + weight: 3, + completed: false, + progress: 0 + }, + { + id: 'fix-circular-reference_', + name: 'Fix Circular References', + description: 'Fixing circular references in cards', + weight: 2, + completed: false, + progress: 0 + }, + { + id: 'mutate-boardIds-in-customfields', + name: 'Custom Fields Board IDs', + description: 'Updating board IDs in custom fields', + weight: 2, + completed: false, + progress: 0 + }, + { + id: 'add-missing-created-and-modified', + name: 'Missing Timestamps', + description: 'Adding missing created and modified timestamps', + weight: 4, + completed: false, + progress: 0 + }, + { + id: 'fix-incorrect-dates', + name: 'Fix Incorrect Dates', + description: 'Correcting incorrect date values', + weight: 3, + completed: false, + progress: 0 + }, + { + id: 'add-assignee', + name: 'Assignee Field', + description: 'Adding assignee field to cards', + weight: 1, + completed: false, + progress: 0 + }, + { + id: 'add-profile-showDesktopDragHandles', + name: 'Desktop Drag Handles', + description: 'Adding desktop drag handles preference', + weight: 1, + completed: false, + progress: 0 + }, + { + id: 'add-profile-hiddenMinicardLabelText', + name: 'Hidden Minicard Labels', + description: 'Adding hidden minicard label text preference', + weight: 1, + completed: false, + progress: 0 + }, + { + id: 'add-receiveddate-allowed', + name: 'Received Date Permissions', + description: 'Adding received date permissions', + weight: 1, + completed: false, + progress: 0 + }, + { + id: 'add-startdate-allowed', + name: 'Start Date Permissions', + description: 'Adding start date permissions', + weight: 1, + completed: false, + progress: 0 + }, + { + id: 'add-duedate-allowed', + name: 'Due Date Permissions', + description: 'Adding due date permissions', + weight: 1, + completed: false, + progress: 0 + }, + { + id: 'add-enddate-allowed', + name: 'End Date Permissions', + description: 'Adding end date permissions', + weight: 1, + completed: false, + progress: 0 + }, + { + id: 'add-members-allowed', + name: 'Members Permissions', + description: 'Adding members permissions', + weight: 1, + completed: false, + progress: 0 + }, + { + id: 'add-assignee-allowed', + name: 'Assignee Permissions', + description: 'Adding assignee permissions', + weight: 1, + completed: false, + progress: 0 + }, + { + id: 'add-labels-allowed', + name: 'Labels Permissions', + description: 'Adding labels permissions', + weight: 1, + completed: false, + progress: 0 + }, + { + id: 'add-checklists-allowed', + name: 'Checklists Permissions', + description: 'Adding checklists permissions', + weight: 1, + completed: false, + progress: 0 + }, + { + id: 'add-attachments-allowed', + name: 'Attachments Permissions', + description: 'Adding attachments permissions', + weight: 1, + completed: false, + progress: 0 + }, + { + id: 'add-comments-allowed', + name: 'Comments Permissions', + description: 'Adding comments permissions', + weight: 1, + completed: false, + progress: 0 + }, + { + id: 'add-assigned-by-allowed', + name: 'Assigned By Permissions', + description: 'Adding assigned by permissions', + weight: 1, + completed: false, + progress: 0 + }, + { + id: 'add-requested-by-allowed', + name: 'Requested By Permissions', + description: 'Adding requested by permissions', + weight: 1, + completed: false, + progress: 0 + }, + { + id: 'add-activities-allowed', + name: 'Activities Permissions', + description: 'Adding activities permissions', + weight: 1, + completed: false, + progress: 0 + }, + { + id: 'add-description-title-allowed', + name: 'Description Title Permissions', + description: 'Adding description title permissions', + weight: 1, + completed: false, + progress: 0 + }, + { + id: 'add-description-text-allowed', + name: 'Description Text Permissions', + description: 'Adding description text permissions', + weight: 1, + completed: false, + progress: 0 + }, + { + id: 'add-description-text-allowed-on-minicard', + name: 'Minicard Description Permissions', + description: 'Adding minicard description permissions', + weight: 1, + completed: false, + progress: 0 + }, + { + id: 'add-sort-field-to-boards', + name: 'Board Sort Field', + description: 'Adding sort field to boards', + weight: 2, + completed: false, + progress: 0 + }, + { + id: 'add-default-profile-view', + name: 'Default Profile View', + description: 'Setting default profile view', + weight: 1, + completed: false, + progress: 0 + }, + { + id: 'add-hide-logo-by-default', + name: 'Hide Logo Default', + description: 'Setting hide logo as default', + weight: 1, + completed: false, + progress: 0 + }, + { + id: 'add-hide-card-counter-list-by-default', + name: 'Hide Card Counter Default', + description: 'Setting hide card counter as default', + weight: 1, + completed: false, + progress: 0 + }, + { + id: 'add-hide-board-member-list-by-default', + name: 'Hide Board Member List Default', + description: 'Setting hide board member list as default', + weight: 1, + completed: false, + progress: 0 + }, + { + id: 'add-card-number-allowed', + name: 'Card Number Permissions', + description: 'Adding card number permissions', + weight: 1, + completed: false, + progress: 0 + }, + { + id: 'assign-boardwise-card-numbers', + name: 'Board Card Numbers', + description: 'Assigning board-wise card numbers', + weight: 3, + completed: false, + progress: 0 + }, + { + id: 'add-card-details-show-lists', + name: 'Card Details Show Lists', + description: 'Adding card details show lists option', + weight: 1, + completed: false, + progress: 0 + }, + { + id: 'migrate-attachments-collectionFS-to-ostrioFiles', + name: 'Migrate Attachments to Meteor-Files', + description: 'Migrating attachments from CollectionFS to Meteor-Files', + weight: 8, + completed: false, + progress: 0 + }, + { + id: 'migrate-avatars-collectionFS-to-ostrioFiles', + name: 'Migrate Avatars to Meteor-Files', + description: 'Migrating avatars from CollectionFS to Meteor-Files', + weight: 6, + completed: false, + progress: 0 + }, + { + id: 'migrate-attachment-drop-index-cardId', + name: 'Drop Attachment Index', + description: 'Dropping old attachment index', + weight: 1, + completed: false, + progress: 0 + }, + { + id: 'migrate-attachment-migration-fix-source-import', + name: 'Fix Attachment Source Import', + description: 'Fixing attachment source import field', + weight: 2, + completed: false, + progress: 0 + }, + { + id: 'attachment-cardCopy-fix-boardId-etc', + name: 'Fix Attachment Card Copy', + description: 'Fixing attachment card copy board IDs', + weight: 2, + completed: false, + progress: 0 + }, + { + id: 'remove-unused-planning-poker', + name: 'Remove Planning Poker', + description: 'Removing unused planning poker fields', + weight: 1, + completed: false, + progress: 0 + }, + { + id: 'remove-user-profile-hiddenSystemMessages', + name: 'Remove Hidden System Messages', + description: 'Removing hidden system messages field', + weight: 1, + completed: false, + progress: 0 + }, + { + id: 'remove-user-profile-hideCheckedItems', + name: 'Remove Hide Checked Items', + description: 'Removing hide checked items field', + weight: 1, + completed: false, + progress: 0 + }, + { + id: 'migrate-lists-to-per-swimlane', + name: 'Migrate Lists to Per-Swimlane', + description: 'Migrating lists to per-swimlane structure', + weight: 5, + completed: false, + progress: 0 + } + ]; + } + + /** + * Check if any migrations need to be run for a specific board + */ + needsMigration(boardId = null) { + if (boardId) { + // Check if specific board needs migration based on version + const board = ReactiveCache.getBoard(boardId); + return !board || !board.migrationVersion || board.migrationVersion < 1; + } + + // Check if any migration step is not completed (global migrations) + return this.steps.some(step => !step.completed); + } + + /** + * Get total weight of all migrations + */ + getTotalWeight() { + return this.steps.reduce((total, step) => total + step.weight, 0); + } + + /** + * Get completed weight + */ + getCompletedWeight() { + return this.steps.reduce((total, step) => { + return total + (step.completed ? step.weight : step.progress * step.weight / 100); + }, 0); + } + + /** + * Mark a board as migrated + */ + markBoardAsMigrated(boardId) { + try { + Meteor.call('boardMigration.markAsMigrated', boardId, 'full_board_migration', (error, result) => { + if (error) { + console.error('Failed to mark board as migrated:', error); + } else { + console.log('Board marked as migrated:', boardId); + } + }); + } catch (error) { + console.error('Error marking board as migrated:', error); + } + } + + /** + * Fix boards that are stuck in migration loop + */ + fixStuckBoards() { + try { + Meteor.call('boardMigration.fixStuckBoards', (error, result) => { + if (error) { + console.error('Failed to fix stuck boards:', error); + } else { + console.log('Fix stuck boards result:', result); + } + }); + } catch (error) { + console.error('Error fixing stuck boards:', error); + } + } + + /** + * Start migration process using cron system + */ + async startMigration() { + if (isMigrating.get()) { + return; // Already migrating + } + + isMigrating.set(true); + migrationSteps.set([...this.steps]); + this.startTime = Date.now(); + + try { + // Start server-side cron migrations + Meteor.call('cron.startAllMigrations', (error, result) => { + if (error) { + console.error('Failed to start cron migrations:', error); + migrationStatus.set(`Migration failed: ${error.message}`); + isMigrating.set(false); + } + }); + + // Poll for progress updates + this.pollCronMigrationProgress(); + + } catch (error) { + console.error('Migration failed:', error); + migrationStatus.set(`Migration failed: ${error.message}`); + isMigrating.set(false); + } + } + + /** + * Poll for cron migration progress updates + */ + pollCronMigrationProgress() { + const pollInterval = setInterval(() => { + Meteor.call('cron.getMigrationProgress', (error, result) => { + if (error) { + console.error('Failed to get cron migration progress:', error); + clearInterval(pollInterval); + return; + } + + if (result) { + migrationProgress.set(result.progress); + migrationStatus.set(result.status); + migrationCurrentStep.set(result.currentStep); + migrationSteps.set(result.steps); + isMigrating.set(result.isMigrating); + + // Update local steps + if (result.steps) { + this.steps = result.steps; + } + + // If migration is complete, stop polling + if (!result.isMigrating && result.progress === 100) { + clearInterval(pollInterval); + + // Clear status after delay + setTimeout(() => { + migrationStatus.set(''); + migrationProgress.set(0); + migrationEstimatedTime.set(''); + }, 3000); + } + } + }); + }, 1000); // Poll every second + } + + /** + * Run a single migration step + */ + async runMigrationStep(step) { + // Simulate migration progress + const steps = 10; + for (let i = 0; i <= steps; i++) { + step.progress = (i / steps) * 100; + this.updateProgress(); + + // Simulate work + await new Promise(resolve => setTimeout(resolve, 50)); + } + + // In a real implementation, this would call the actual migration + // For now, we'll simulate the migration + // Running migration step + } + + /** + * Update progress variables + */ + updateProgress() { + const totalWeight = this.getTotalWeight(); + const completedWeight = this.getCompletedWeight(); + const progress = Math.round((completedWeight / totalWeight) * 100); + + migrationProgress.set(progress); + migrationSteps.set([...this.steps]); + + // Calculate estimated time remaining + if (this.startTime && progress > 0) { + const elapsed = Date.now() - this.startTime; + const rate = progress / elapsed; // progress per millisecond + const remaining = 100 - progress; + const estimatedMs = remaining / rate; + migrationEstimatedTime.set(this.formatTime(estimatedMs)); + } + } + + /** + * Format time in milliseconds to human readable format + */ + formatTime(ms) { + if (ms < 1000) { + return `${Math.round(ms)}ms`; + } + + const seconds = Math.floor(ms / 1000); + const minutes = Math.floor(seconds / 60); + const hours = Math.floor(minutes / 60); + + if (hours > 0) { + const remainingMinutes = minutes % 60; + const remainingSeconds = seconds % 60; + return `${hours}h ${remainingMinutes}m ${remainingSeconds}s`; + } else if (minutes > 0) { + const remainingSeconds = seconds % 60; + return `${minutes}m ${remainingSeconds}s`; + } else { + return `${seconds}s`; + } + } + + /** + * Clear migration cache (for testing) + */ + clearCache() { + this.migrationCache.clear(); + this.steps.forEach(step => { + step.completed = false; + step.progress = 0; + }); + } +} + +// Export singleton instance +export const migrationManager = new MigrationManager(); diff --git a/client/lib/popup.js b/client/lib/popup.js index c0bfb779f..6825f7032 100644 --- a/client/lib/popup.js +++ b/client/lib/popup.js @@ -212,11 +212,6 @@ window.Popup = new (class { if (Utils.isMiniScreen()) return { left: 0, top: 0 }; - // If the opener element is missing (e.g., programmatic open), fallback to viewport origin - if (!$element || $element.length === 0) { - return { left: 10, top: 10, maxHeight: $(window).height() - 20 }; - } - const offset = $element.offset(); // Calculate actual popup width based on CSS: min(380px, 55vw) const viewportWidth = $(window).width(); diff --git a/client/lib/secureDOMPurify.js b/client/lib/secureDOMPurify.js index 323c3b6c0..898687dad 100644 --- a/client/lib/secureDOMPurify.js +++ b/client/lib/secureDOMPurify.js @@ -4,7 +4,7 @@ import DOMPurify from 'dompurify'; export function getSecureDOMPurifyConfig() { return { // Allow common markdown elements including anchor tags - ALLOWED_TAGS: ['a', 'p', 'br', 'strong', 'em', 'u', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'li', 'blockquote', 'pre', 'code', 'img', 'table', 'thead', 'tbody', 'tr', 'th', 'td', 'hr', 'div', 'span', 's'], + ALLOWED_TAGS: ['a', 'p', 'br', 'strong', 'em', 'u', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'li', 'blockquote', 'pre', 'code', 'img', 'table', 'thead', 'tbody', 'tr', 'th', 'td', 'hr', 'div', 'span'], // Allow safe attributes including href for anchor tags ALLOWED_ATTR: ['href', 'title', 'alt', 'src', 'width', 'height', 'target', 'rel'], // Allow safe protocols for links @@ -44,7 +44,7 @@ export function getSecureDOMPurifyConfig() { } return false; } - + // Additional check for base64 encoded SVG with script tags if (src.startsWith('data:image/svg+xml;base64,')) { try { diff --git a/client/lib/utils.js b/client/lib/utils.js index 26535b939..265d589b2 100644 --- a/client/lib/utils.js +++ b/client/lib/utils.js @@ -79,21 +79,13 @@ Utils = { }, getMobileMode() { - // Check localStorage first - user's explicit preference takes priority - const stored = localStorage.getItem('wekan-mobile-mode'); - if (stored !== null) { - return stored === 'true'; - } - - // Then check user profile const user = ReactiveCache.getCurrentUser(); if (user && user.profile && user.profile.mobileMode !== undefined) { return user.profile.mobileMode; } - - // Default to mobile mode for iPhone/iPod - const isIPhone = /iPhone|iPod/i.test(navigator.userAgent); - return isIPhone; + // For non-logged-in users, check localStorage + const stored = localStorage.getItem('wekan-mobile-mode'); + return stored ? stored === 'true' : false; }, setMobileMode(enabled) { @@ -101,41 +93,13 @@ Utils = { if (user) { // Update user profile user.setMobileMode(enabled); + } else { + // Store in localStorage for non-logged-in users + localStorage.setItem('wekan-mobile-mode', enabled.toString()); } - // Always store in localStorage for persistence across sessions - localStorage.setItem('wekan-mobile-mode', enabled.toString()); Utils.applyMobileMode(enabled); // Trigger reactive updates for UI components Session.set('wekan-mobile-mode', enabled); - // Re-apply zoom level to ensure proper rendering - const zoomLevel = Utils.getZoomLevel(); - Utils.applyZoomLevel(zoomLevel); - }, - - getCardZoom() { - const user = ReactiveCache.getCurrentUser(); - if (user && user.profile && user.profile.cardZoom !== undefined) { - return user.profile.cardZoom; - } - const stored = localStorage.getItem('wekan-card-zoom'); - return stored ? parseFloat(stored) : 1.0; - }, - - setCardZoom(level) { - const user = ReactiveCache.getCurrentUser(); - if (user) { - user.setCardZoom(level); - } - localStorage.setItem('wekan-card-zoom', level.toString()); - Utils.applyCardZoom(level); - Session.set('wekan-card-zoom', level); - }, - - applyCardZoom(level) { - const cardDetails = document.querySelector('.card-details'); - if (cardDetails) { - cardDetails.style.fontSize = `${level}em`; - } }, applyZoomLevel(level) { @@ -250,15 +214,6 @@ Utils = { ); return ret; }, - canMoveCard() { - const currentUser = ReactiveCache.getCurrentUser(); - const ret = ( - currentUser && - currentUser.isBoardMember() && - !currentUser.isCommentOnly() - ); - return ret; - }, canModifyBoard() { const currentUser = ReactiveCache.getCurrentUser(); const ret = ( @@ -276,21 +231,9 @@ Utils = { window.location.reload(); }, setBoardView(view) { - const currentUser = ReactiveCache.getCurrentUser(); - + currentUser = ReactiveCache.getCurrentUser(); if (currentUser) { - // Update localStorage first - window.localStorage.setItem('boardView', view); - - // Update user profile via Meteor method - Meteor.call('setBoardView', view, (error) => { - if (error) { - console.error('[setBoardView] Update failed:', error); - } else { - // Reload to apply the view change - Utils.reload(); - } - }); + ReactiveCache.getCurrentUser().setBoardView(view); } else if (view === 'board-view-swimlanes') { window.localStorage.setItem('boardView', 'board-view-swimlanes'); //true Utils.reload(); @@ -300,9 +243,6 @@ Utils = { } else if (view === 'board-view-cal') { window.localStorage.setItem('boardView', 'board-view-cal'); //true Utils.reload(); - } else if (view === 'board-view-gantt') { - window.localStorage.setItem('boardView', 'board-view-gantt'); //true - Utils.reload(); } else { window.localStorage.setItem('boardView', 'board-view-swimlanes'); //true Utils.reload(); @@ -328,8 +268,6 @@ Utils = { return 'board-view-lists'; } else if (window.localStorage.getItem('boardView') === 'board-view-cal') { return 'board-view-cal'; - } else if (window.localStorage.getItem('boardView') === 'board-view-gantt') { - return 'board-view-gantt'; } else { window.localStorage.setItem('boardView', 'board-view-swimlanes'); //true Utils.reload(); @@ -337,85 +275,6 @@ Utils = { } }, - getListCollapseState(list) { - if (!list) return false; - const key = `collapsedList-${list._id}`; - const sessionVal = Session.get(key); - if (typeof sessionVal === 'boolean') { - return sessionVal; - } - - const user = ReactiveCache.getCurrentUser(); - let stored = null; - if (user && user.getCollapsedListFromStorage) { - stored = user.getCollapsedListFromStorage(list.boardId, list._id); - } else if (Users.getPublicCollapsedList) { - stored = Users.getPublicCollapsedList(list.boardId, list._id); - } - - if (typeof stored === 'boolean') { - Session.setDefault(key, stored); - return stored; - } - - const fallback = typeof list.collapsed === 'boolean' ? list.collapsed : false; - Session.setDefault(key, fallback); - return fallback; - }, - - setListCollapseState(list, collapsed) { - if (!list) return; - const key = `collapsedList-${list._id}`; - Session.set(key, !!collapsed); - const user = ReactiveCache.getCurrentUser(); - if (user) { - Meteor.call('setListCollapsedState', list.boardId, list._id, !!collapsed); - } else if (Users.setPublicCollapsedList) { - Users.setPublicCollapsedList(list.boardId, list._id, !!collapsed); - } - }, - - getSwimlaneCollapseState(swimlane) { - if (!swimlane) return false; - const key = `collapsedSwimlane-${swimlane._id}`; - const sessionVal = Session.get(key); - if (typeof sessionVal === 'boolean') { - return sessionVal; - } - - const user = ReactiveCache.getCurrentUser(); - let stored = null; - if (user && user.getCollapsedSwimlaneFromStorage) { - stored = user.getCollapsedSwimlaneFromStorage( - swimlane.boardId, - swimlane._id, - ); - } else if (Users.getPublicCollapsedSwimlane) { - stored = Users.getPublicCollapsedSwimlane(swimlane.boardId, swimlane._id); - } - - if (typeof stored === 'boolean') { - Session.setDefault(key, stored); - return stored; - } - - const fallback = typeof swimlane.collapsed === 'boolean' ? swimlane.collapsed : false; - Session.setDefault(key, fallback); - return fallback; - }, - - setSwimlaneCollapseState(swimlane, collapsed) { - if (!swimlane) return; - const key = `collapsedSwimlane-${swimlane._id}`; - Session.set(key, !!collapsed); - const user = ReactiveCache.getCurrentUser(); - if (user) { - Meteor.call('setSwimlaneCollapsedState', swimlane.boardId, swimlane._id, !!collapsed); - } else if (Users.setPublicCollapsedSwimlane) { - Users.setPublicCollapsedSwimlane(swimlane.boardId, swimlane._id, !!collapsed); - } - }, - myCardsSort() { let sort = window.localStorage.getItem('myCardsSort'); diff --git a/config/router.js b/config/router.js index 3d303abce..1ab853dbd 100644 --- a/config/router.js +++ b/config/router.js @@ -79,53 +79,6 @@ FlowRouter.route('/accessibility', { }, }); -FlowRouter.route('/support', { - name: 'support', - triggersEnter: [AccountsTemplates.ensureSignedIn], - action() { - Session.set('currentBoard', null); - Session.set('currentList', null); - Session.set('currentCard', null); - Session.set('popupCardId', null); - Session.set('popupCardBoardId', null); - - Filter.reset(); - Session.set('sortBy', ''); - EscapeActions.executeAll(); - - Utils.manageCustomUI(); - Utils.manageMatomo(); - - BlazeLayout.render('defaultLayout', { - headerBar: 'supportHeaderBar', - content: 'support', - }); - }, -}); - -FlowRouter.route('/public', { - name: 'public', - action() { - Session.set('currentBoard', null); - Session.set('currentList', null); - Session.set('currentCard', null); - Session.set('popupCardId', null); - Session.set('popupCardBoardId', null); - - Filter.reset(); - Session.set('sortBy', ''); - EscapeActions.executeAll(); - - Utils.manageCustomUI(); - Utils.manageMatomo(); - - BlazeLayout.render('defaultLayout', { - headerBar: 'supportHeaderBar', - content: 'support', - }); - }, -}); - FlowRouter.route('/b/:id/:slug', { name: 'board', action(params) { @@ -165,16 +118,6 @@ FlowRouter.route('/b/:boardId/:slug/:cardId', { Session.set('currentCard', params.cardId); Session.set('popupCardId', null); Session.set('popupCardBoardId', null); - - // In desktop mode, add to openCards array to support multiple cards - const isMobile = Utils.getMobileMode(); - if (!isMobile) { - const openCards = Session.get('openCards') || []; - if (!openCards.includes(params.cardId)) { - openCards.push(params.cardId); - Session.set('openCards', openCards); - } - } Utils.manageCustomUI(); Utils.manageMatomo(); diff --git a/docs/Backup/Backup.md b/docs/Backup/Backup.md index 44848ca0c..b657fb6a6 100644 --- a/docs/Backup/Backup.md +++ b/docs/Backup/Backup.md @@ -1,20 +1,20 @@ [Sandstorm](Sandstorm) - [Sandstorm Backup](Export-from-Wekan-Sandstorm-grain-.zip-file) -# Related +# Upcoming -[Transferring attachments from MongoDB to filesystem, and text from MongoDB to SQLite](https://github.com/wekan/minio-metadata) +[Transferring to Minio and SQLite](https://github.com/wekan/minio-metadata) # Backup Docker [Also see: Upgrading Synology with Wekan quay images](https://github.com/wekan/wekan/issues/3874#issuecomment-867526249) -Note: Do not run `docker compose down` because it could delete data. https://docs.docker.com/compose/reference/down/ +Note: Do not run `docker-compose down` without verifying your docker-compose file, it does not delete the data by default but caution is advised. Refer to https://docs.docker.com/compose/reference/down/. [docker-compose.yml](https://raw.githubusercontent.com/wekan/wekan/master/docker-compose.yml) This presumes your Wekan Docker is currently running with: ```bash -docker compose up -d +docker-compose up -d ``` Backup to directory dump: ```bash @@ -36,20 +36,23 @@ docker start wekan-app ``` # Upgrade Docker Wekan version -1. Check that you use newest [docker-compose.yml](https://raw.githubusercontent.com/wekan/wekan/refs/heads/main/docker-compose.yml) - that has for example: `image: ghcr.io/wekan/wekan:latest` . If you have old docker-compose.yml, copy it's settings like ROOT_URL to newest docker-compose.yml. +## Newest info +https://github.com/wekan/wekan/discussions/5367 + +## Old info + +Note: Do not run `docker-compose down` without verifying your docker-compose file, it does not delete the data by default but caution is advised. Refer to https://docs.docker.com/compose/reference/down/. ```bash -docker compose stop +docker-compose stop docker rm wekan-app -docker compose up -d ``` -2. If you are migrating from Snap to Docker, if there is files at `/var/snap/wekan/common/files` , copy that directory to be at - docker-compose.yml setting path, for example `export WRITABLE_PATH=/data` , copy files directory to be at `/data/files` - with same user:group directory recursive permissions that directory data has, for example: `sudo chown -R user:group data` +a) For example, if you in docker-compose.yml use `image: wekanteam/wekan` or `image: quay.io/wekan/wekan` for latest development version -3. When you open board, if cards or attachments are not visible, click right sidebar / Board Settings / Migrations. - From there, run most migrations, but not migration about `Restore all from archive`, because it would unarchive cards etc from archive. +b) Or in docker-compose.yml change version tag, or use version tag like `image: wekanteam/wekan:v5.50` or `image: quay.io/wekan/wekan:v5.50` +```bash +docker-compose up -d +``` # Backup Wekan Snap to directory dump ```bash @@ -86,73 +89,6 @@ mongorestore --drop --port 27019 sudo snap start wekan.wekan ./snap-settings.sh ``` - -# Upgrade WeKan Snap Stable 6.x to newest WeKan Snap Candidate - -1. Check that you have enough disk space: `df -h` . Also check size of your data: `sudo du -sh /var/snap/wekan/common` . -2. [Backup Snap](#backup-wekan-snap-to-directory-dump) -3. Move WeKan database common directory content elsewhere: -``` -sudo su -snap stop wekan -mkdir /root/common -mv /var/snap/wekan/common/* /root/common/ -``` -4. Change Snap Stable to Snap Candidate: -``` -sudo snap refresh wekan --channel=latest/candidate --amend -``` -5. [Restore Snap](#restore-wekan-snap) -6. Copy back files directory, if it is there: `sudo cp -pR /root/common/files /var/snap/wekan/common/` -7. If you use [Caddy](https://github.com/wekan/wekan/blob/main/docs/Webserver/Caddy.md), that is included in WeKan, edit /var/snap/wekan/Caddyfile to new syntax: -``` -wekan.yourcompany.com { - tls { - load /etc/caddy/certs - alpn http/1.1 - } - reverse_proxy 127.0.0.1:2000 -} -``` -This is if you have WeKan Node.js running at port 2000, for example with these settings: -``` -sudo snap set wekan root-url='https://wekan.yourcompany.com' -sudo snap set wekan port='2000' -sudo snap set wekan caddy-enabled='true' -sudo snap enable wekan -sudo snap start wekan -``` -You can check is caddy, wekan and mongodb running with: -``` -sudo snap services -``` -If you need to disable WeKan included Caddy, because you have system-wide installed Caddy or other webserver: -``` -sudo snap stop wekan.caddy -sudo systemctl disable snap.wekan.caddy -sudo systemctl stop snap.wekan.caddy -``` -7. When you open board, if cards or attachments are not visible, click right sidebar / Board Settings / Migrations. -From there, run most migrations, but not migration about `Restore all from archive`, because it would unarchive cards etc from archive. - -# If upgrade did not work, going back to WeKan Snap Stable 6.09 - -This is only if you have old 6.09 common directory at /root/common . - -``` -sudo su -mkdir /root/common-newest -snap stop wekan -mv /var/snap/wekan/common/* /root/common-newest/ -snap start wekan -snap refresh wekan --channel=latest/stable --amend -snap stop wekan -rm -rf /var/snap/wekan/common/* -mv /root/common/* /var/snap/wekan/common/ -snap start wekan -./snap-settings.sh -``` - # Upgrade Snap manually immediately (usually it updates automatically) ```bash diff --git a/docs/Backup/Upgrade.md b/docs/Backup/Upgrade.md index 4dbfc3ec0..1ca521d5d 100644 --- a/docs/Backup/Upgrade.md +++ b/docs/Backup/Upgrade.md @@ -1,2 +1,15 @@ -Upgrade info at [Backup page](Backup.md) +``` +sudo snap stop wekan.wekan +export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/snap/wekan/current/lib/x86_64-linux-gnu +export PATH2=$PATH +export PATH=/snap/wekan/current/bin:$PATH +mongodump --port 27019 +sudo snap get wekan > snap-settings.txt +sudo snap stop wekan.mongodb +sudo mv /var/snap/wekan/common . +sudo mkdir /var/snap/wekan/common +sudo snap refresh wekan --channel=latest/candidate +``` + +To be continued... \ No newline at end of file diff --git a/docs/Features/Gantt.md b/docs/Features/Gantt.md index 2881a1b80..de342e5b8 100644 --- a/docs/Features/Gantt.md +++ b/docs/Features/Gantt.md @@ -1,20 +1,122 @@ -# Gantt chart +# What is this? -This new Gantt feature was added to MIT WeKan 2025-12-22 at https://github.com/wekan/wekan +Original WeKan is MIT-licensed software. -At "All Boards" page, click board to open one board view. There, Gantt is at top dropdown menu Swimlanes/Lists/Calendar/Gantt. +This different Gantt version here currently uses Gantt chart component that has GPL license, so this Wekan Gantt version is GPL licensed. -Gantt shows all dates, according to selected date format at opened card: Received Start Due End. +Sometime later if that GPL licensed Gantt chart component will be changed to MIT licensed one, then that original MIT-licensed WeKan will get Gantt feature, and maybe this GPL version will be discontinued. -Gantt dates are shown for every week where exist dates at the current opened board. +# How to use -You can click task name to open card. +[Source](https://github.com/wekan/wekan/issues/2870#issuecomment-721690105) -You can click any date icon to change that date, like: Received Start Due End. +At cards, both Start and End dates should be set (not Due date) for the tasks to be displayed. -# Old WeKan Gantt GPL +# Funding for more features? -Previous GPLv2 WeKan Gantt is deprecated https://github.com/wekan/wekan-gantt-gpl +You can fund development of more features of Gantt at https://wekan.fi/commercial-support, like for example: +- more of day/week/month/year views +- drag etc + +# Issue + +https://github.com/wekan/wekan/issues/2870 + +# Install + +Wekan GPLv2 Gantt version: +- https://github.com/wekan/wekan-gantt-gpl +- https://snapcraft.io/wekan-gantt-gpl +- https://hub.docker.com/repository/docker/wekanteam/wekan-gantt-gpl +- https://quay.io/wekan/wekan-gantt-gpl + +## How to install Snap + +[Like Snap install](https://github.com/wekan/wekan-snap/wiki/Install) but with commands like: +``` +sudo snap install wekan-gantt-gpl + +sudo snap set wekan-gantt-gpl root-url='http://localhost' + +sudo snap set wekan-gantt-gpl port='80' +``` +Stopping all: +``` +sudo snap stop wekan-gantt-gpl +``` +Stopping only some part: +``` +sudo snap stop wekan-gantt-gpl.caddy + +sudo snap stop wekan-gantt-gpl.mongodb + +sudo snap stop wekan-gantt-gpl.wekan +``` + +## Changing from Wekan to Wekan Gantt GPL + +1) Install newest MongoDB to have also mongorestore available + +2) Backup database and settings: +``` +sudo snap stop wekan.wekan + +mongodump --port 27019 + +snap get wekan > snap-set.sh + +sudo snap remove wekan + +sudo snap install wekan-gantt-gpl + +sudo snap stop wekan-gantt-gpl.wekan + +nano snap-set.sh +``` +Then edit that textfile so all commands will be similar to this: +``` +sudo snap set wekan-gantt-gpl root-url='https://example.com' +``` +And run settings: +``` +chmod +x snap-set.sh + +./snap-set.sh + +sudo snap start wekan-gantt-gpl.wekan +``` +## Changing from Wekan Gantt GPL to Wekan + +1) Install newest MongoDB to have also mongorestore available + +2) Backup database and settings: +``` +sudo snap stop wekan-gantt-gpl.wekan + +mongodump --port 27019 + +snap get wekan-gantt-gpl > snap-set.sh + +sudo snap remove wekan-gantt-gpl + +sudo snap install wekan + +sudo snap stop wekan.wekan + +nano snap-set.sh +``` +Then edit that textfile so all commands will be similar to this: +``` +sudo snap set wekan root-url='https://example.com' +``` +And run settings: +``` +chmod +x snap-set.sh + +./snap-set.sh + +sudo snap start wekan.wekan +``` # UCS diff --git a/docs/Platforms/FOSS/FerretDB2-PostgreSQL.md b/docs/Platforms/FOSS/FerretDB2-PostgreSQL.md deleted file mode 100644 index 2158a601e..000000000 --- a/docs/Platforms/FOSS/FerretDB2-PostgreSQL.md +++ /dev/null @@ -1,97 +0,0 @@ -# Install WeKan, FerretDB 2, PostgreSQL - -## WeKan - -``` -git clone --branch main --depth 1 https://github.com/wekan/wekan.git -cd wekan -sudo apt update -sudo apt install -y build-essential gcc g++ make git curl wget \ -p7zip-full zip unzip unp npm p7zip-full -sudo npm install -g n -export N_NODE_MIRROR=https://github.com/wekan/node-v14-esm/releases/download -sudo -E n 14.21.4 -sudo npm -g install @mapbox/node-pre-gyp -sudo npm -g install meteor@2.14 --unsafe-perm -export PATH=$PATH:/home/demo/.meteor -meteor npm install production -meteor build .build --directory --platforms=web.browser -``` - -## Postgres 17 + DocumentDB - -``` -sudo bash -c 'curl -fsSL https://repo.pigsty.io/pig | bash' -pig repo add all -u -pig ext install pg17 -pig ext install documentdb -``` -Edit `/etc/postgresql/17/main/postgresql.conf`, there set -``` -shared_preload_libraries = 'pg_cron, pg_documentdb, pg_documentdb_core' -``` -edit `/etc/postgresql/17/main/pg_hba.conf` , -replace **scram-sha-256` with trust on the host lines for `127.0.0.1/32` and `::1/128` - -Restart PostgreSQL: -``` -sudo service postgresql restart -``` - -## FerretDB - -Download: -``` -curl -L \ -https://github.com/FerretDB/FerretDB/releases/download/v2.7.0/ferretdb-amd64-linux.deb \ --o /tmp/ferretdb-amd64-linux.deb -``` -Install: -``` -sudo apt -y install /tmp/ferretdb-amd64-linux.deb -``` -Edit your `/etc/systemd/system/ferretdb.service` file, -add your username/password pair to the following line: -``` -Environment="FERRETDB_POSTGRESQL_URL=postgres://ferret:DB_PASSWORD_GOES_HERE@127.0.0.1:5432/postgres" -``` -Then enable and start FerretDB: -``` -sudo systemctl enable ferretdb.service -sudo service ferretdb start -``` - -## Initializing the Database -``` -su - -su - postgres -CREATE ROLE ferret WITH PASSWORD 'DB_PASSWORD_GOES_HERE'; -CREATE DATABASE ferretdb; -GRANT ALL PRIVILEGES ON DATABASE ferretdb TO ferret; -ALTER ROLE ferret WITH LOGIN; -CREATE EXTENSION documentdb CASCADE; -GRANT USAGE ON SCHEMA documentdb_api to ferret; -GRANT USAGE ON SCHEMA documentdb_core to ferret; -GRANT USAGE ON SCHEMA documentdb_api_internal to ferret; -GRANT USAGE ON SCHEMA documentdb_api_catalog to ferret; -GRANT INSERT ON TABLE documentdb_api_catalog.collections to ferret; -GRANT ALL ON SCHEMA documentdb_data to ferret; -GRANT documentdb_admin_role to ferret; -``` -## Launching WeKan -``` -export PATH=$HOME/.meteor -cd ~/wekan - -MONGO_URL=mongodb://ferret:DB_PASSWORD_GOES_HERE@127.0.0.1:27017/wekan \ -WRITABLE_PATH=.. WITH_API=true RICHER_CARD_COMMENT_EDITOR=false \ -ROOT_URL=https://wekan.example.com meteor run \ ---exclude-archs web.browser.legacy,web.cordova \ ---port 8080 2>&1 | tee ../wekan-log.`date +%s`.txt -``` - -## Notes - -- Machine must have at least 3 gigs of ram. Crashes at npm installing meteor, with 384 megs. -- Machine must have at least 4 gigs of ram. Crashes at meteor build with 3 gigs. -- Be ready to read rebuild-wekan.sh if you want to actually get it running. diff --git a/docs/Platforms/FOSS/Snap/Snap-build.md b/docs/Platforms/FOSS/Snap/Snap-build.md deleted file mode 100644 index ee973115a..000000000 --- a/docs/Platforms/FOSS/Snap/Snap-build.md +++ /dev/null @@ -1,103 +0,0 @@ -# Building the Wekan snap without timeouts - -This guide focuses on macOS hosts (Multipass VM) and common timeout fixes. It also applies to Linux hosts with LXD. - -## Quick options - -- Fastest: use Canonical builders (no local VM) - - ```zsh - # One-time: login to the store (required for remote-build) - snapcraft login - - # Build for amd64 on Canonical builders - snapcraft remote-build --build-for=amd64 - ``` - -- Local VM (macOS + Multipass): increase resources and build verbosely - - ```zsh - # Give the builder more CPU/RAM/disk to avoid sluggish downloads - export SNAPCRAFT_BUILD_ENVIRONMENT=hosted-multipass - export SNAPCRAFT_BUILD_ENVIRONMENT_CPU=4 - export SNAPCRAFT_BUILD_ENVIRONMENT_MEMORY=8G - export SNAPCRAFT_BUILD_ENVIRONMENT_DISK=40G - - # Clean previous state and build - snapcraft clean - snapcraft --verbose --debug - ``` - -## What changed to reduce timeouts - -- Downloads in `wekan` part now retry with exponential backoff. -- `caddy` part now attempts APT with retries and falls back to a static binary from the official GitHub release if APT is slow or unreachable. - -These changes make the build resilient to transient network issues and slow mirrors. - -## Diagnosing where it stalls - -- Run a single step for a part to reproduce: - ```zsh - snapcraft pull wekan -v - snapcraft build wekan -v - ``` -- Drop into the build environment when it fails: - ```zsh - snapcraft --debug - # Then run the failing commands manually - ``` - -## Tips for macOS + Multipass - -- Check networking: - ```zsh - multipass list - multipass exec snapcraft-*-wekan -- ping -c2 github.com - ``` -- If the instance looks wedged, recreate it: - ```zsh - snapcraft clean --use-lxd || true # harmless on macOS - snapcraft clean --step pull - multipass delete --purge $(multipass list | awk '/snapcraft-/{print $1}') - snapcraft --verbose - ``` - -## Linux hosts (optional) - -On Linux, using LXD is often faster and more reliable than Multipass: - -```bash -sudo snap install lxd --channel=5.21/stable -newgrp lxd -snapcraft --use-lxd -v -``` - -## Common environment knobs - -- Proxy/mirror environments inside the build VM if needed: - ```zsh - export http_proxy=http://proxy.example:3128 - export https_proxy=$http_proxy - export SNAPCRAFT_PROXY_HTTP=$http_proxy - export SNAPCRAFT_PROXY_HTTPS=$https_proxy - ``` - -- Speed up apt by pinning retries (already set in the recipe) or switching to a closer mirror by customizing sources in an override if needed. - -## Cleaning up caches - -If repeated attempts keep hitting corrupt downloads, clean Snapcraft caches: - -```zsh -snapcraft clean --destructive-mode || true -rm -rf ~/.cache/snapcraft/* -``` - -## Reporting - -If you still hit timeouts, capture and share: -- The exact step (pull/build/stage/prime) and part name -- Output of `snapcraft --verbose --debug` -- Host OS and Snapcraft version: `snapcraft --version` -- Multipass resources: `multipass list` diff --git a/docs/Platforms/Propietary/Mac.md b/docs/Platforms/Propietary/Mac.md index 724043041..926502941 100644 --- a/docs/Platforms/Propietary/Mac.md +++ b/docs/Platforms/Propietary/Mac.md @@ -52,11 +52,6 @@ Meteor includes Node.js and MongoDB version, when developing. But if not develop ``` softwareupdate --install-rosetta --agree-to-license ``` -Install Homebrew from https://brew.sh, and Homebrew GUI that is very useful: -``` -brew install --cask applite -open -a Applite -``` 2) Clone Wekan: ``` git clone https://github.com/wekan/wekan @@ -145,4 +140,4 @@ docker-compose up -d --build Q: Is there file manager, that shows all files and directories that are at directory? Or should I use mc at zsh? For example, if there is directory /Users/username/repos, it is not visible in Finder, until I move it to /Users/username/Downloads/repos A: I just add my home directory to the list of favorites. You can also just go to any directory you want with CMD+Shift+G . -CMD+Shift+Period toggles hidden files on and off +CMD+Shift+Period toggles hidden files on and off \ No newline at end of file diff --git a/docs/Platforms/Propietary/Windows/Offline.md b/docs/Platforms/Propietary/Windows/Offline.md index 583bdd931..974fc087b 100644 --- a/docs/Platforms/Propietary/Windows/Offline.md +++ b/docs/Platforms/Propietary/Windows/Offline.md @@ -10,19 +10,19 @@ This is without container (without Docker or Snap). Right click and download files 1-4: -1. [wekan-8.19-amd64-windows.zip](https://github.com/wekan/wekan/releases/download/v8.19/wekan-8.19-amd64-windows.zip) +1. [wekan-8.11-amd64-windows.zip](https://github.com/wekan/wekan/releases/download/v8.11/wekan-8.11-amd64-windows.zip) 2. [node.exe](https://nodejs.org/dist/latest-v14.x/win-x64/node.exe) -3. [mongodb-windows-x86_64-7.0.28-signed.msi](https://fastdl.mongodb.org/windows/mongodb-windows-x86_64-7.0.28-signed.msi) +3. [mongodb-windows-x86_64-7.0.25-signed.msi](https://fastdl.mongodb.org/windows/mongodb-windows-x86_64-7.0.25-signed.msi) 4. [start-wekan.bat](https://raw.githubusercontent.com/wekan/wekan/main/start-wekan.bat) 5. Copy files from steps 1-4 with USB stick or DVD to offline Windows computer -6. Double click `mongodb-windows-x86_64-7.0.28-signed.msi` . In installer, uncheck downloading MongoDB compass. +6. Double click `mongodb-windows-x86_64-7.0.25-signed.msi` . In installer, uncheck downloading MongoDB compass. -7. Unzip `wekan-8.19-amd64-windows.zip` , inside it is directory `bundle`, to it copy other files: +7. Unzip `wekan-8.11-amd64-windows.zip` , inside it is directory `bundle`, to it copy other files: ``` bundle (directory) diff --git a/docs/Security/PerUserDataAudit2025-12-23/ARCHITECTURE_IMPROVEMENTS.md b/docs/Security/PerUserDataAudit2025-12-23/ARCHITECTURE_IMPROVEMENTS.md deleted file mode 100644 index 414e1aa54..000000000 --- a/docs/Security/PerUserDataAudit2025-12-23/ARCHITECTURE_IMPROVEMENTS.md +++ /dev/null @@ -1,542 +0,0 @@ -# Wekan Persistence Architecture Improvements - -## Changes Implemented - -This document describes the architectural improvements made to Wekan's persistence layer to ensure proper separation between board-level data and per-user UI preferences. - ---- - -## 1. Removed Board-Level UI State (✅ COMPLETED) - -### 1.1 Collapsed State Removed from Schemas - -**Changes:** -- ❌ Removed `collapsed` field from Swimlanes schema ([models/swimlanes.js](models/swimlanes.js)) -- ❌ Removed `collapsed` field from Lists schema ([models/lists.js](models/lists.js)) -- ❌ Removed `collapse()` mutation from Swimlanes -- ❌ Removed collapsed field from REST API `PUT /api/boards/:boardId/lists/:listId` - -**Rationale:** -Collapsed state is a per-user UI preference and should never be stored at the board level. This prevents conflicts where one user collapses a swimlane/list and affects all other users. - -**Migration:** -- Existing board-level `collapsed` values will be ignored -- Users' personal collapse preferences are stored in `profile.collapsedSwimlanes` and `profile.collapsedLists` -- For non-logged-in users, collapse state is stored in localStorage and cookies - ---- - -## 2. LocalStorage Validation & Cleanup (✅ COMPLETED) - -### 2.1 New Validation Utility - -**File:** [client/lib/localStorageValidator.js](client/lib/localStorageValidator.js) - -**Features:** -- ✅ Validates all numbers (swimlane heights, list widths) are within valid ranges -- ✅ Validates all booleans (collapse states) are actual boolean values -- ✅ Removes corrupted or invalid data -- ✅ Limits stored data to prevent localStorage bloat: - - Maximum 50 boards per key - - Maximum 100 items per board -- ✅ Auto-cleanup on app startup (once per day) -- ✅ Validation ranges: - - List widths: 100-1000 pixels - - Swimlane heights: -1 (auto) or 50-2000 pixels - - Collapsed states: boolean only - -**Usage:** -```javascript -import { validateAndCleanLocalStorage, shouldRunCleanup } from '/client/lib/localStorageValidator'; - -// Auto-runs on startup -Meteor.startup(() => { - if (shouldRunCleanup()) { - validateAndCleanLocalStorage(); - } -}); -``` - -### 2.2 Updated User Storage Methods - -**File:** [models/lib/userStorageHelpers.js](models/lib/userStorageHelpers.js) - -**Functions:** -- `getValidatedNumber(key, boardId, itemId, defaultValue, min, max)` - Get with validation -- `setValidatedNumber(key, boardId, itemId, value, min, max)` - Set with validation -- `getValidatedBoolean(key, boardId, itemId, defaultValue)` - Get boolean -- `setValidatedBoolean(key, boardId, itemId, value)` - Set boolean - -**Validation Applied To:** -- `wekan-list-widths` - List column widths -- `wekan-list-constraints` - List max-width constraints -- `wekan-swimlane-heights` - Swimlane row heights -- `wekan-collapsed-lists` - List collapse states -- `wekan-collapsed-swimlanes` - Swimlane collapse states - ---- - -## 3. Per-User Position History System (✅ COMPLETED) - -### 3.1 New Collection: UserPositionHistory - -**File:** [models/userPositionHistory.js](models/userPositionHistory.js) - -**Purpose:** -Track all position changes (moves, reorders) per user with full undo/redo support. - -**Schema Fields:** -- `userId` - User who made the change -- `boardId` - Board where change occurred -- `entityType` - Type: 'swimlane', 'list', 'card', 'checklist', 'checklistItem' -- `entityId` - ID of the moved entity -- `actionType` - Type: 'move', 'create', 'delete', 'restore', 'archive' -- `previousState` - Complete state before change (blackbox object) -- `newState` - Complete state after change (blackbox object) -- `previousSort`, `newSort` - Sort positions -- `previousSwimlaneId`, `newSwimlaneId` - Swimlane changes -- `previousListId`, `newListId` - List changes -- `previousBoardId`, `newBoardId` - Board changes -- `isCheckpoint` - User-marked savepoint -- `checkpointName` - Name for the savepoint -- `batchId` - Group related changes together -- `createdAt` - Timestamp - -**Key Features:** -- ✅ Automatic tracking of all card movements -- ✅ Per-user isolation (users only see their own history) -- ✅ Checkpoint/savepoint system for marking important states -- ✅ Batch operations support (group related changes) -- ✅ Auto-cleanup (keeps last 1000 entries per user per board) -- ✅ Checkpoints are never deleted -- ✅ Full undo capability if entity still exists - -**Helpers:** -- `getDescription()` - Human-readable change description -- `canUndo()` - Check if change can be undone -- `undo()` - Reverse the change - -**Indexes:** -```javascript -{ userId: 1, boardId: 1, createdAt: -1 } -{ userId: 1, entityType: 1, entityId: 1 } -{ userId: 1, isCheckpoint: 1 } -{ batchId: 1 } -{ createdAt: 1 } -``` - -### 3.2 Meteor Methods for History Management - -**Available Methods:** - -```javascript -// Create a checkpoint/savepoint -Meteor.call('userPositionHistory.createCheckpoint', boardId, checkpointName); - -// Undo a specific change -Meteor.call('userPositionHistory.undo', historyId); - -// Get recent changes -Meteor.call('userPositionHistory.getRecent', boardId, limit); - -// Get all checkpoints -Meteor.call('userPositionHistory.getCheckpoints', boardId); - -// Restore to a checkpoint (undo all changes after it) -Meteor.call('userPositionHistory.restoreToCheckpoint', checkpointId); -``` - -### 3.3 Automatic Tracking Integration - -**Card Moves:** [models/cards.js](models/cards.js) - -The `card.move()` method now automatically tracks changes: - -```javascript -// Capture previous state -const previousState = { - boardId: this.boardId, - swimlaneId: this.swimlaneId, - listId: this.listId, - sort: this.sort, -}; - -// After update, track in history -UserPositionHistory.trackChange({ - userId: Meteor.userId(), - boardId: this.boardId, - entityType: 'card', - entityId: this._id, - actionType: 'move', - previousState, - newState: { boardId, swimlaneId, listId, sort }, -}); -``` - -**TODO:** Add similar tracking for: -- List reordering -- Swimlane reordering -- Checklist/item reordering - ---- - -## 4. SwimlaneId Validation & Rescue (✅ COMPLETED) - -### 4.1 Migration: Ensure Valid Swimlane IDs - -**File:** [server/migrations/ensureValidSwimlaneIds.js](server/migrations/ensureValidSwimlaneIds.js) - -**Purpose:** -Ensure all cards and lists have valid swimlaneId references, rescuing orphaned data. - -**Operations:** -1. **Fix Cards Without SwimlaneId** - - Finds cards with missing/null/empty swimlaneId - - Assigns to board's default swimlane - - Creates default swimlane if none exists - -2. **Fix Lists Without SwimlaneId** - - Finds lists with missing swimlaneId - - Sets to empty string (for backward compatibility) - -3. **Rescue Orphaned Cards** - - Finds cards where swimlaneId points to deleted swimlane - - Creates "Rescued Data (Missing Swimlane)" swimlane (red color, at end) - - Moves orphaned cards there - - Logs activity for transparency - -4. **Add Validation Hooks** - - `Cards.before.insert` - Auto-assign default swimlaneId - - `Cards.before.update` - Prevent swimlaneId removal - - Ensures swimlaneId is ALWAYS saved - -**Migration Tracking:** -Stored in `migrations` collection: -```javascript -{ - name: 'ensure-valid-swimlane-ids', - version: 1, - completedAt: Date, - results: { - cardsFixed: Number, - listsFixed: Number, - cardsRescued: Number, - } -} -``` - ---- - -## 5. TODO: Undo/Redo UI (⏳ IN PROGRESS) - -### 5.1 Planned UI Components - -**Board Toolbar:** -- [ ] Undo button (with keyboard shortcut Ctrl+Z) -- [ ] Redo button (with keyboard shortcut Ctrl+Shift+Z) -- [ ] History dropdown showing recent changes -- [ ] "Create Checkpoint" button - -**History Sidebar:** -- [ ] List of recent changes with descriptions -- [ ] Visual timeline -- [ ] Checkpoint markers -- [ ] "Restore to This Point" buttons -- [ ] Search/filter history - -### 5.2 Keyboard Shortcuts - -```javascript -// To implement in client/lib/keyboard.js -Mousetrap.bind('ctrl+z', () => { - // Undo last change -}); - -Mousetrap.bind('ctrl+shift+z', () => { - // Redo last undone change -}); - -Mousetrap.bind('ctrl+shift+s', () => { - // Create checkpoint -}); -``` - ---- - -## 6. TODO: Search History Feature (⏳ NOT STARTED) - -### 6.1 Requirements - -Per the user request: -> "For board-level data, for each field (like description, comments etc) at Search All Boards have translatable options to also search from history of boards where user is member of board" - -### 6.2 Proposed Implementation - -**New Collection: FieldHistory** -```javascript -{ - boardId: String, - entityType: String, // 'card', 'list', 'swimlane', 'board' - entityId: String, - fieldName: String, // 'description', 'title', 'comments', etc. - previousValue: String, - newValue: String, - changedBy: String, // userId - changedAt: Date, -} -``` - -**Search Enhancement:** -- Add "Include History" checkbox to Search All Boards -- Search not just current field values, but also historical values -- Show results with indicator: "Found in history (changed 2 days ago)" -- Allow filtering by: - - Current values only - - Historical values only - - Both current and historical - -**Translatable Field Options:** -```javascript -const searchableFieldsI18n = { - 'card-title': 'search-card-titles', - 'card-description': 'search-card-descriptions', - 'card-comments': 'search-card-comments', - 'list-title': 'search-list-titles', - 'swimlane-title': 'search-swimlane-titles', - 'board-title': 'search-board-titles', - // Add i18n keys for each searchable field -}; -``` - -### 6.3 Storage Considerations - -**Challenge:** Field history can grow very large - -**Solutions:** -1. Only track fields explicitly marked for history -2. Limit history depth (e.g., last 100 changes per field) -3. Auto-delete history older than X months (configurable) -4. Option to disable per board - -**Suggested Settings:** -```javascript -{ - enableFieldHistory: true, - trackedFields: ['description', 'title', 'comments'], - historyRetentionDays: 90, - maxHistoryPerField: 100, -} -``` - ---- - -## 7. Data Validation Summary - -### 7.1 Validation Applied - -| Data Type | Storage | Validation | Range/Type | -|-----------|---------|------------|------------| -| List Width | localStorage + profile | Number | 100-1000 px | -| List Constraint | localStorage + profile | Number | 100-1000 px | -| Swimlane Height | localStorage + profile | Number | -1 (auto) or 50-2000 px | -| Collapsed Lists | localStorage + profile | Boolean | true/false | -| Collapsed Swimlanes | localStorage + profile | Boolean | true/false | -| SwimlaneId | MongoDB (cards) | String (required) | Valid ObjectId | -| SwimlaneId | MongoDB (lists) | String (optional) | Valid ObjectId or '' | - -### 7.2 Auto-Cleanup Rules - -**LocalStorage:** -- Corrupted data → Removed -- Invalid types → Removed -- Out-of-range values → Removed -- Excess boards (>50) → Oldest removed -- Excess items per board (>100) → Oldest removed -- Cleanup frequency → Daily (if needed) - -**UserPositionHistory:** -- Keeps last 1000 entries per user per board -- Checkpoints never deleted -- Cleanup frequency → Daily -- Old entries (beyond 1000) → Deleted - ---- - -## 8. Migration Guide - -### 8.1 For Existing Installations - -**Automatic Migrations:** -1. ✅ `ensureValidSwimlaneIds` - Runs automatically on server start -2. ✅ LocalStorage cleanup - Runs automatically on client start (once/day) - -**Manual Actions Required:** -- None - all migrations are automatic - -### 8.2 For Developers - -**When Adding New Per-User Preferences:** - -1. Add field to user profile schema: -```javascript -'profile.myNewPreference': { - type: Object, - optional: true, - blackbox: true, -} -``` - -2. Add validation function: -```javascript -function validateMyNewPreference(data) { - // Validate structure - // Return cleaned data -} -``` - -3. Add localStorage support: -```javascript -getMyNewPreferenceFromStorage(boardId, itemId) { - if (this._id) { - return this.getMyNewPreference(boardId, itemId); - } - return getValidatedData('wekan-my-preference', validators.myPreference); -} -``` - -4. Add to cleanup routine in `localStorageValidator.js` - ---- - -## 9. Testing Checklist - -### 9.1 Manual Testing - -- [ ] Collapse swimlane → Reload → Should remain collapsed (logged-in) -- [ ] Collapse list → Reload → Should remain collapsed (logged-in) -- [ ] Resize list width → Reload → Should maintain width (logged-in) -- [ ] Resize swimlane height → Reload → Should maintain height (logged-in) -- [ ] Logout → Collapse swimlane → Reload → Should remain collapsed (cookies) -- [ ] Move card → Check UserPositionHistory created -- [ ] Move card → Click undo → Card returns to original position -- [ ] Create checkpoint → Move cards → Restore to checkpoint → Cards return -- [ ] Corrupted localStorage → Should be cleaned on next startup -- [ ] Card without swimlaneId → Should be rescued to rescue swimlane - -### 9.2 Automated Testing - -**Unit Tests Needed:** -- [ ] `localStorageValidator.js` - All validation functions -- [ ] `userStorageHelpers.js` - Get/set functions -- [ ] `userPositionHistory.js` - Undo logic -- [ ] `ensureValidSwimlaneIds.js` - Migration logic - -**Integration Tests Needed:** -- [ ] Card move triggers history entry -- [ ] Undo actually reverses move -- [ ] Checkpoint restore works correctly -- [ ] localStorage validation on startup -- [ ] Rescue migration creates rescue swimlane - ---- - -## 10. Performance Considerations - -### 10.1 Indexes Added - -```javascript -// UserPositionHistory -{ userId: 1, boardId: 1, createdAt: -1 } -{ userId: 1, entityType: 1, entityId: 1 } -{ userId: 1, isCheckpoint: 1 } -{ batchId: 1 } -{ createdAt: 1 } -``` - -### 10.2 Query Optimization - -- UserPositionHistory queries limited to 100 results max -- Auto-cleanup prevents unbounded growth -- Checkpoints indexed separately for fast retrieval - -### 10.3 localStorage Limits - -- Maximum 50 boards per key (prevents quota exceeded) -- Maximum 100 items per board -- Daily cleanup of excess data - ---- - -## 11. Security Considerations - -### 11.1 User Isolation - -- ✅ UserPositionHistory isolated per-user (userId filter on all queries) -- ✅ Users can only undo their own changes -- ✅ Checkpoints are per-user -- ✅ History never shared between users - -### 11.2 Validation - -- ✅ All localStorage data validated before use -- ✅ Number ranges enforced -- ✅ Type checking on all inputs -- ✅ Invalid data rejected (not just sanitized) - -### 11.3 Authorization - -- ✅ Must be board member to create history entries -- ✅ Must be board member to undo changes -- ✅ Cannot undo other users' changes - ---- - -## 12. Future Enhancements - -### 12.1 Planned Features - -1. **Field-Level History** - - Track changes to card descriptions, titles, comments - - Search across historical values - - "What was this card's description last week?" - -2. **Collaborative Undo** - - See other users' recent changes - - Undo with conflict resolution - - Merge strategies for simultaneous changes - -3. **Export History** - - Export position history to CSV/JSON - - Audit trail for compliance - - Analytics on card movement patterns - -4. **Visual Timeline** - - Interactive timeline of board changes - - Playback mode to see board evolution - - Heatmap of frequently moved cards - -### 12.2 Optimization Opportunities - -1. **Batch Operations** - - Group multiple card moves into single history entry - - Reduce database writes - -2. **Compression** - - Compress old history entries - - Store diffs instead of full states - -3. **Archival** - - Move very old history to separate collection - - Keep last N months in hot storage - ---- - -## Document History - -- **Created**: 2025-12-23 -- **Last Updated**: 2025-12-23 -- **Status**: Implementation In Progress -- **Completed**: Sections 1-4 -- **In Progress**: Section 5-6 -- **Planned**: Section 6.1-6.3 - diff --git a/docs/Security/PerUserDataAudit2025-12-23/COMPLETION_SUMMARY.md b/docs/Security/PerUserDataAudit2025-12-23/COMPLETION_SUMMARY.md deleted file mode 100644 index a7339b424..000000000 --- a/docs/Security/PerUserDataAudit2025-12-23/COMPLETION_SUMMARY.md +++ /dev/null @@ -1,364 +0,0 @@ -# COMPLETION SUMMARY - Wekan Data Persistence Architecture Update - -**Date Completed**: 2025-12-23 -**Status**: ✅ PHASE 1 COMPLETE -**Total Time**: Multiple implementation sessions - ---- - -## 🎉 What Was Accomplished - -### Architecture Decision ✅ -**Swimlane height and list width are NOW per-board (shared), not per-user (private).** - -This means: -- All users on a board see the same swimlane heights -- All users on a board see the same list widths -- Personal preferences (collapse, label visibility) remain per-user -- Clear separation of concerns - -### Code Changes ✅ - -**1. models/swimlanes.js** - Added `height` field -```javascript -height: { - type: Number, - optional: true, - defaultValue: -1, // -1 = auto, 50-2000 = fixed - custom() { ... } // Validation function -} -``` -Location: Lines 108-130 - -**2. models/lists.js** - Added `width` field -```javascript -width: { - type: Number, - optional: true, - defaultValue: 272, // 272 pixels standard - custom() { ... } // Validation function -} -``` -Location: Lines 162-182 - -**3. models/cards.js** - Already correct ✓ -- Position stored in `sort` (per-board) -- No changes needed - -**4. models/checklists.js** - Already correct ✓ -- Position stored in `sort` (per-board) -- No changes needed - -**5. models/checklistItems.js** - Already correct ✓ -- Position stored in `sort` (per-board) -- No changes needed - -### Documentation Created ✅ - -**6 comprehensive guides** in `docs/Security/PerUserDataAudit2025-12-23/`: - -1. **README.md** (Navigation & index) -2. **EXECUTIVE_SUMMARY.md** (For stakeholders) -3. **CURRENT_STATUS.md** (Quick status overview) -4. **DATA_PERSISTENCE_ARCHITECTURE.md** (Complete specification) -5. **IMPLEMENTATION_GUIDE.md** (How to finish the work) -6. **SCHEMA_CHANGES_VERIFICATION.md** (Verification checklist) - -Plus 6 existing docs from previous phases: -- ARCHITECTURE_IMPROVEMENTS.md -- IMPLEMENTATION_SUMMARY.md -- PERSISTENCE_AUDIT.md -- FIXES_CHECKLIST.md -- QUICK_REFERENCE.md -- Plan.txt - ---- - -## 📊 Data Classification (Final) - -### Per-Board (✅ Shared - All Users See Same) - -| Component | Field | Storage Location | Type | Default | -|-----------|-------|-----------------|------|---------| -| **Swimlane** | height | `swimlane.height` | Number | -1 | -| **List** | width | `list.width` | Number | 272 | -| **Card** | sort (position) | `card.sort` | Number | varies | -| **Card** | swimlaneId | `card.swimlaneId` | String | required | -| **Card** | listId | `card.listId` | String | required | -| **Checklist** | sort (position) | `checklist.sort` | Number | varies | -| **ChecklistItem** | sort (position) | `checklistItem.sort` | Number | varies | -| **All Entities** | title, color, archived, etc. | Document fields | Mixed | Various | - -### Per-User (🔒 Private - Only You See Yours) - -| Component | Field | Storage Location | -|-----------|-------|-----------------| -| **User** | Collapsed Swimlanes | `user.profile.collapsedSwimlanes[boardId][swimlaneId]` | -| **User** | Collapsed Lists | `user.profile.collapsedLists[boardId][listId]` | -| **User** | Hide Label Text | `user.profile.hideMiniCardLabelText[boardId]` | - ---- - -## ✅ Validation Rules Implemented - -### Swimlane Height Validation -```javascript -custom() { - const h = this.value; - if (h !== -1 && (h < 50 || h > 2000)) { - return 'heightOutOfRange'; - } -} -``` -- Accepts: -1 (auto) or 50-2000 pixels -- Rejects: Any value outside this range - -### List Width Validation -```javascript -custom() { - const w = this.value; - if (w < 100 || w > 1000) { - return 'widthOutOfRange'; - } -} -``` -- Accepts: 100-1000 pixels only -- Rejects: Any value outside this range - ---- - -## 📁 Documentation Details - -### README.md -- Navigation guide for all documents -- Quick facts and status -- Usage instructions for developers - -### EXECUTIVE_SUMMARY.md -- For management/stakeholders -- What changed and why -- Benefits and timeline -- Next steps - -### CURRENT_STATUS.md -- Phase-by-phase breakdown -- Data classification with examples -- Testing requirements -- Integration roadmap - -### DATA_PERSISTENCE_ARCHITECTURE.md -- Complete architectural specification -- Data classification matrix -- Schema definitions -- Security implications -- Performance notes - -### IMPLEMENTATION_GUIDE.md -- Step-by-step implementation -- Code examples for Phase 2 -- Migration script template -- Testing checklist -- Rollback plan - -### SCHEMA_CHANGES_VERIFICATION.md -- Exact changes made with line numbers -- Validation verification -- Code review checklist -- Integration notes - ---- - -## 🔄 What's Left (Phases 2-4) - -### Phase 2: User Model Refactoring ⏳ -- Refactor user methods in users.js -- Change `getListWidth()` to read from `list.width` -- Change `getSwimlaneHeight()` to read from `swimlane.height` -- Remove per-user storage from user.profile -- Estimated: 2-4 hours -- Details: See [IMPLEMENTATION_GUIDE.md](docs/Security/PerUserDataAudit2025-12-23/IMPLEMENTATION_GUIDE.md) - -### Phase 3: Data Migration ⏳ -- Create migration script -- Move `user.profile.listWidths` → `list.width` -- Move `user.profile.swimlaneHeights` → `swimlane.height` -- Verify migration success -- Estimated: 1-2 hours -- Template: In [IMPLEMENTATION_GUIDE.md](docs/Security/PerUserDataAudit2025-12-23/IMPLEMENTATION_GUIDE.md) - -### Phase 4: UI Integration ⏳ -- Update client code -- Update Meteor methods -- Update subscriptions -- Test with multiple users -- Estimated: 4-6 hours -- Details: See [IMPLEMENTATION_GUIDE.md](docs/Security/PerUserDataAudit2025-12-23/IMPLEMENTATION_GUIDE.md) - ---- - -## 🧪 Testing Done So Far - -✅ Schema validation logic reviewed -✅ Backward compatibility verified -✅ Field defaults confirmed correct -✅ Documentation completeness checked - -**Still Needed** (for Phase 2+): -- Insert tests for height/width validation -- Integration tests with UI -- Multi-user scenario tests -- Migration safety tests - ---- - -## 🚀 Key Benefits Achieved - -1. **Clear Architecture** ✓ - - Explicit per-board vs per-user separation - - Easy to understand and maintain - -2. **Better Collaboration** ✓ - - All users see consistent layout dimensions - - No confusion about shared vs private data - -3. **Performance Improvement** ✓ - - Heights/widths in document queries (faster) - - Better database efficiency - - Reduced per-user lookups - -4. **Security** ✓ - - Clear data isolation - - Per-user preferences not visible to others - - No cross-user data leakage - -5. **Maintainability** ✓ - - 12 comprehensive documents - - Code examples for all phases - - Migration templates provided - - Clear rollback plan - ---- - -## 📈 Code Quality Metrics - -| Metric | Status | -|--------|--------| -| Schema Changes | ✅ Complete | -| Validation Rules | ✅ Implemented | -| Documentation | ✅ 12 documents | -| Backward Compatibility | ✅ Verified | -| Code Comments | ✅ Comprehensive | -| Migration Plan | ✅ Templated | -| Rollback Plan | ✅ Documented | -| Testing Plan | ✅ Provided | - ---- - -## 📍 File Locations - -**Code Changes**: -- `/home/wekan/repos/wekan/models/swimlanes.js` - height field added -- `/home/wekan/repos/wekan/models/lists.js` - width field added - -**Documentation**: -- `/home/wekan/repos/wekan/docs/Security/PerUserDataAudit2025-12-23/` - ---- - -## 🎯 Success Criteria Met - -✅ Swimlane height is per-board (stored in swimlane.height) -✅ List width is per-board (stored in list.width) -✅ Positions are per-board (stored in sort fields) -✅ Collapse state is per-user only -✅ Label visibility is per-user only -✅ Validation rules implemented -✅ Backward compatible -✅ Documentation complete -✅ Implementation guidance provided -✅ Migration plan templated - ---- - -## 📞 How to Use This - -### For Implementation (Phase 2): -1. Read: [EXECUTIVE_SUMMARY.md](docs/Security/PerUserDataAudit2025-12-23/EXECUTIVE_SUMMARY.md) -2. Reference: [IMPLEMENTATION_GUIDE.md](docs/Security/PerUserDataAudit2025-12-23/IMPLEMENTATION_GUIDE.md) -3. Code: Follow Phase 2 steps exactly -4. Test: Use provided testing checklist - -### For Review: -1. Check: [SCHEMA_CHANGES_VERIFICATION.md](docs/Security/PerUserDataAudit2025-12-23/SCHEMA_CHANGES_VERIFICATION.md) -2. Review: swimlanes.js and lists.js changes -3. Approve: Documentation and architecture - -### For Understanding: -1. Start: [README.md](docs/Security/PerUserDataAudit2025-12-23/README.md) -2. Skim: [CURRENT_STATUS.md](docs/Security/PerUserDataAudit2025-12-23/CURRENT_STATUS.md) -3. Deep dive: [DATA_PERSISTENCE_ARCHITECTURE.md](docs/Security/PerUserDataAudit2025-12-23/DATA_PERSISTENCE_ARCHITECTURE.md) - ---- - -## 📊 Completion Statistics - -| Aspect | Status | Details | -|--------|--------|---------| -| Schema Changes | ✅ 2/2 | swimlanes.js, lists.js | -| Validation Rules | ✅ 2/2 | height, width | -| Models Verified | ✅ 5/5 | swimlanes, lists, cards, checklists, checklistItems | -| Documents Created | ✅ 6 | README, Executive Summary, Current Status, Architecture, Guide, Verification | -| Testing Plans | ✅ Yes | Detailed in Implementation Guide | -| Rollback Plans | ✅ Yes | Documented with examples | -| Code Comments | ✅ Yes | All new code commented | -| Backward Compatibility | ✅ Yes | Both fields optional | - ---- - -## ✨ What Makes This Complete - -1. **Schema**: Both height and width fields added with validation ✅ -2. **Architecture**: Clear per-board vs per-user separation documented ✅ -3. **Implementation**: Step-by-step guide for next phases ✅ -4. **Migration**: Template script provided ✅ -5. **Testing**: Comprehensive test plans ✅ -6. **Rollback**: Safety procedures documented ✅ -7. **Documentation**: 12 comprehensive guides ✅ - ---- - -## 🎓 Knowledge Transfer - -All team members can now: -- ✅ Understand the data persistence architecture -- ✅ Implement Phase 2 (user model refactoring) -- ✅ Create and run migration scripts -- ✅ Test the changes -- ✅ Rollback if needed -- ✅ Support this system long-term - ---- - -## 🏁 Final Notes - -**This Phase 1 is complete and production-ready.** - -The system now has: -- Correct per-board/per-user separation -- Validation rules enforced -- Clear documentation -- Implementation guidance -- Migration templates -- Rollback procedures - -**Ready for Phase 2** whenever the team is prepared. - ---- - -**Status**: ✅ **PHASE 1 COMPLETE** - -**Date Completed**: 2025-12-23 -**Quality**: Production-ready -**Documentation**: Comprehensive -**Next Step**: Phase 2 (User Model Refactoring) - diff --git a/docs/Security/PerUserDataAudit2025-12-23/CURRENT_STATUS.md b/docs/Security/PerUserDataAudit2025-12-23/CURRENT_STATUS.md deleted file mode 100644 index edc35b4f8..000000000 --- a/docs/Security/PerUserDataAudit2025-12-23/CURRENT_STATUS.md +++ /dev/null @@ -1,323 +0,0 @@ -# Per-User Data Audit - Current Status Summary - -**Last Updated**: 2025-12-23 -**Status**: ✅ Architecture Finalized -**Scope**: All data persistence related to swimlanes, lists, cards, checklists, checklistItems - ---- - -## Key Decision: Data Classification - -The system now enforces clear separation: - -### ✅ Per-Board Data (MongoDB Documents) -Stored in swimlane/list/card/checklist/checklistItem documents. **All users see the same value.** - -| Entity | Properties | Where Stored | -|--------|-----------|-------------| -| Swimlane | title, color, height, sort, archived | swimlanes.js document | -| List | title, color, width, sort, archived, wipLimit, starred | lists.js document | -| Card | title, color, description, swimlaneId, listId, sort, archived | cards.js document | -| Checklist | title, sort, hideCheckedItems, hideAllItems | checklists.js document | -| ChecklistItem | title, sort, isFinished | checklistItems.js document | - -### 🔒 Per-User Data (User Profile + Cookies) -Stored in user.profile or cookies. **Each user has their own value, not visible to others.** - -| Entity | Properties | Where Stored | -|--------|-----------|-------------| -| User | collapsedSwimlanes | user.profile.collapsedSwimlanes[boardId][swimlaneId] | -| User | collapsedLists | user.profile.collapsedLists[boardId][listId] | -| User | hideMiniCardLabelText | user.profile.hideMiniCardLabelText[boardId] | -| Public User | collapsedSwimlanes | Cookie: wekan-collapsed-swimlanes | -| Public User | collapsedLists | Cookie: wekan-collapsed-lists | - ---- - -## Changes Implemented ✅ - -### 1. Schema Changes (swimlanes.js, lists.js) ✅ DONE - -**Swimlanes**: Added `height` field -```javascript -height: { - type: Number, - optional: true, - defaultValue: -1, // -1 = auto-height, 50-2000 = fixed - custom() { - const h = this.value; - if (h !== -1 && (h < 50 || h > 2000)) { - return 'heightOutOfRange'; - } - }, -} -``` - -**Lists**: Added `width` field -```javascript -width: { - type: Number, - optional: true, - defaultValue: 272, // 100-1000 pixels - custom() { - const w = this.value; - if (w < 100 || w > 1000) { - return 'widthOutOfRange'; - } - }, -} -``` - -**Status**: ✅ Implemented in swimlanes.js and lists.js - -### 2. Card Position Storage (cards.js) ✅ ALREADY CORRECT - -Cards already store position per-board: -- `sort` field: decimal number determining order (shared) -- `swimlaneId`: which swimlane (shared) -- `listId`: which list (shared) - -**Status**: ✅ No changes needed - -### 3. Checklist Position Storage (checklists.js) ✅ ALREADY CORRECT - -Checklists already store position per-board: -- `sort` field: decimal number determining order (shared) -- `hideCheckedChecklistItems`: per-board setting -- `hideAllChecklistItems`: per-board setting - -**Status**: ✅ No changes needed - -### 4. ChecklistItem Position Storage (checklistItems.js) ✅ ALREADY CORRECT - -ChecklistItems already store position per-board: -- `sort` field: decimal number determining order (shared) - -**Status**: ✅ No changes needed - ---- - -## Changes Not Yet Implemented - -### 1. User Model Refactoring (users.js) ⏳ TODO - -**Current State**: Users.js still has per-user width/height methods that read from user.profile: -- `getListWidth(boardId, listId)` - reads user.profile.listWidths -- `getSwimlaneHeight(boardId, swimlaneId)` - reads user.profile.swimlaneHeights -- `setListWidth(boardId, listId, width)` - writes to user.profile.listWidths -- `setSwimlaneHeight(boardId, swimlaneId, height)` - writes to user.profile.swimlaneHeights - -**Required Change**: -- Remove per-user width/height storage from user.profile -- Refactor methods to read from list/swimlane documents instead -- Remove from user schema definition - -**Status**: ⏳ Pending - See IMPLEMENTATION_GUIDE.md for details - -### 2. Migration Script ⏳ TODO - -**Current State**: No migration exists to move existing per-user data to per-board - -**Required**: -- Create `server/migrations/migrateToPerBoardStorage.js` -- Migrate user.profile.swimlaneHeights → swimlane.height -- Migrate user.profile.listWidths → list.width -- Remove old fields from user profiles -- Track migration status - -**Status**: ⏳ Pending - Template available in IMPLEMENTATION_GUIDE.md - ---- - -## Data Examples - -### Before (Mixed Per-User/Per-Board - WRONG) -```javascript -// Swimlane document (per-board) -{ - _id: 'swim123', - title: 'Development', - boardId: 'board123', - // height stored in user profile (per-user) - WRONG! -} - -// User A profile (per-user) -{ - _id: 'userA', - profile: { - swimlaneHeights: { - 'board123': { - 'swim123': 300 // Only User A sees 300px height - } - } - } -} - -// User B profile (per-user) -{ - _id: 'userB', - profile: { - swimlaneHeights: { - 'board123': { - 'swim123': 400 // Only User B sees 400px height - } - } - } -} -``` - -### After (Correct Per-Board/Per-User Separation) -```javascript -// Swimlane document (per-board - ALL USERS SEE THIS) -{ - _id: 'swim123', - title: 'Development', - boardId: 'board123', - height: 300 // All users see 300px height -} - -// User A profile (per-user - only User A's preferences) -{ - _id: 'userA', - profile: { - collapsedSwimlanes: { - 'board123': { - 'swim123': false // User A: swimlane not collapsed - } - }, - collapsedLists: { ... }, - hideMiniCardLabelText: { ... } - // height and width REMOVED - now in documents - } -} - -// User B profile (per-user - only User B's preferences) -{ - _id: 'userB', - profile: { - collapsedSwimlanes: { - 'board123': { - 'swim123': true // User B: swimlane is collapsed - } - }, - collapsedLists: { ... }, - hideMiniCardLabelText: { ... } - // height and width REMOVED - now in documents - } -} -``` - ---- - -## Testing Evidence Required - -### Before Starting UI Integration - -1. **Schema Validation** - - [ ] Swimlane with height = -1 → accepts - - [ ] Swimlane with height = 100 → accepts - - [ ] Swimlane with height = 25 → rejects (< 50) - - [ ] Swimlane with height = 3000 → rejects (> 2000) - -2. **Data Retrieval** - - [ ] `Swimlanes.findOne('swim123').height` returns correct value - - [ ] `Lists.findOne('list456').width` returns correct value - - [ ] Default values used when not set - -3. **Data Updates** - - [ ] `Swimlanes.update('swim123', { $set: { height: 500 } })` succeeds - - [ ] `Lists.update('list456', { $set: { width: 400 } })` succeeds - -4. **Per-User Isolation** - - [ ] User A collapses swimlane → User B's collapse status unchanged - - [ ] User A hides labels → User B's visibility unchanged - ---- - -## Integration Path - -### Phase 1: ✅ Schema Definition (DONE) -- Added `height` to Swimlanes -- Added `width` to Lists -- Both with validation (custom functions) - -### Phase 2: ⏳ User Model Refactoring (NEXT) -- Update user methods to read from documents -- Remove per-user storage from user.profile -- Create migration script - -### Phase 3: ⏳ UI Integration (AFTER Phase 2) -- Update client code to use new storage locations -- Update Meteor methods to update documents -- Update subscriptions if needed - -### Phase 4: ⏳ Testing & Deployment (FINAL) -- Run automated tests -- Manual testing with multiple users -- Deploy with data migration - ---- - -## Backward Compatibility - -### For Existing Installations -- Old `user.profile.swimlaneHeights` data will be preserved until migration -- Old `user.profile.listWidths` data will be preserved until migration -- New code can read from either location during transition -- Migration script handles moving data safely - -### For New Installations -- Only per-board storage will be used -- User.profile will only contain per-user settings -- No legacy data to migrate - ---- - -## File Reference - -| Document | Purpose | -|----------|---------| -| [DATA_PERSISTENCE_ARCHITECTURE.md](DATA_PERSISTENCE_ARCHITECTURE.md) | Complete architecture specification | -| [IMPLEMENTATION_GUIDE.md](IMPLEMENTATION_GUIDE.md) | Step-by-step implementation instructions | -| [models/swimlanes.js](../../../models/swimlanes.js) | Swimlane model with new height field | -| [models/lists.js](../../../models/lists.js) | List model with new width field | - ---- - -## Quick Reference: What Changed? - -### New Behavior -- **Swimlane Height**: Now stored in swimlane document (per-board) -- **List Width**: Now stored in list document (per-board) -- **Card Positions**: Always been in card document (per-board) ✅ -- **Collapse States**: Remain in user.profile (per-user) ✅ -- **Label Visibility**: Remains in user.profile (per-user) ✅ - -### Old Behavior (Being Removed) -- ❌ Swimlane Height: Was in user.profile (per-user) -- ❌ List Width: Was in user.profile (per-user) - -### No Change (Already Correct) -- ✅ Card Positions: In card document (per-board) -- ✅ Checklist Positions: In checklist document (per-board) -- ✅ Collapse States: In user.profile (per-user) - ---- - -## Success Criteria - -After all phases complete: - -1. ✅ All swimlane heights stored in swimlane documents -2. ✅ All list widths stored in list documents -3. ✅ All positions stored in swimlane/list/card/checklist/checklistItem documents -4. ✅ Only collapse states and label visibility in user profiles -5. ✅ No duplicate storage of widths/heights -6. ✅ All users see same dimensions for swimlanes/lists -7. ✅ Each user has independent collapse preferences -8. ✅ Data validates against range constraints - ---- - -**Status**: ✅ Phase 1 Complete, Awaiting Phase 2 - diff --git a/docs/Security/PerUserDataAudit2025-12-23/DATA_PERSISTENCE_ARCHITECTURE.md b/docs/Security/PerUserDataAudit2025-12-23/DATA_PERSISTENCE_ARCHITECTURE.md deleted file mode 100644 index 12f7ffa76..000000000 --- a/docs/Security/PerUserDataAudit2025-12-23/DATA_PERSISTENCE_ARCHITECTURE.md +++ /dev/null @@ -1,409 +0,0 @@ -# Wekan Data Persistence Architecture - 2025-12-23 - -**Status**: ✅ Latest Current -**Updated**: 2025-12-23 -**Scope**: All data persistence related to swimlanes, lists, cards, checklists, checklistItems positioning and user preferences - ---- - -## Executive Summary - -Wekan's data persistence architecture distinguishes between: -- **Board-Level Data**: Shared across all users on a board (positions, widths, heights, order) -- **Per-User Data**: Private to each user, not visible to others (collapse state, label visibility) - -This document defines the authoritative source of truth for all persistence decisions. - ---- - -## Data Classification Matrix - -### ✅ PER-BOARD LEVEL (Shared - Stored in MongoDB Documents) - -| Entity | Property | Storage | Format | Scope | -|--------|----------|---------|--------|-------| -| **Swimlane** | Title | MongoDB | String | Board | -| **Swimlane** | Color | MongoDB | String (ALLOWED_COLORS) | Board | -| **Swimlane** | Background | MongoDB | Object {color} | Board | -| **Swimlane** | Height | MongoDB | Number (-1=auto, 50-2000) | Board | -| **Swimlane** | Position/Sort | MongoDB | Number (decimal) | Board | -| **List** | Title | MongoDB | String | Board | -| **List** | Color | MongoDB | String (ALLOWED_COLORS) | Board | -| **List** | Background | MongoDB | Object {color} | Board | -| **List** | Width | MongoDB | Number (100-1000) | Board | -| **List** | Position/Sort | MongoDB | Number (decimal) | Board | -| **List** | WIP Limit | MongoDB | Object {enabled, value, soft} | Board | -| **List** | Starred | MongoDB | Boolean | Board | -| **Card** | Title | MongoDB | String | Board | -| **Card** | Color | MongoDB | String (ALLOWED_COLORS) | Board | -| **Card** | Background | MongoDB | Object {color} | Board | -| **Card** | Description | MongoDB | String | Board | -| **Card** | Position/Sort | MongoDB | Number (decimal) | Board | -| **Card** | ListId | MongoDB | String | Board | -| **Card** | SwimlaneId | MongoDB | String | Board | -| **Checklist** | Title | MongoDB | String | Board | -| **Checklist** | Position/Sort | MongoDB | Number (decimal) | Board | -| **Checklist** | hideCheckedItems | MongoDB | Boolean | Board | -| **Checklist** | hideAllItems | MongoDB | Boolean | Board | -| **ChecklistItem** | Title | MongoDB | String | Board | -| **ChecklistItem** | isFinished | MongoDB | Boolean | Board | -| **ChecklistItem** | Position/Sort | MongoDB | Number (decimal) | Board | - -### 🔒 PER-USER ONLY (Private - User Profile or localStorage) - -| Entity | Property | Storage | Format | Users | -|--------|----------|---------|--------|-------| -| **User** | Collapsed Swimlanes | User Profile / Cookie | Object {boardId: {swimlaneId: boolean}} | Single | -| **User** | Collapsed Lists | User Profile / Cookie | Object {boardId: {listId: boolean}} | Single | -| **User** | Hide Minicard Label Text | User Profile / localStorage | Object {boardId: boolean} | Single | -| **User** | Collapse Card Details View | Cookie | Boolean | Single | - ---- - -## Implementation Details - -### 1. Swimlanes Schema (swimlanes.js) - -```javascript -Swimlanes.attachSchema( - new SimpleSchema({ - title: { type: String }, // ✅ Per-board - color: { type: String, optional: true }, // ✅ Per-board (ALLOWED_COLORS) - // background: { ...color properties... } // ✅ Per-board (for future use) - height: { // ✅ Per-board (NEW) - type: Number, - optional: true, - defaultValue: -1, // -1 means auto-height - custom() { - const h = this.value; - if (h !== -1 && (h < 50 || h > 2000)) { - return 'heightOutOfRange'; - } - }, - }, - sort: { type: Number, decimal: true, optional: true }, // ✅ Per-board - boardId: { type: String }, // ✅ Per-board - archived: { type: Boolean }, // ✅ Per-board - // NOTE: Collapse state is per-user only, stored in: - // - User profile: profile.collapsedSwimlanes[boardId][swimlaneId] = boolean - // - Non-logged-in: Cookie 'wekan-collapsed-swimlanes' - }) -); -``` - -### 2. Lists Schema (lists.js) - -```javascript -Lists.attachSchema( - new SimpleSchema({ - title: { type: String }, // ✅ Per-board - color: { type: String, optional: true }, // ✅ Per-board (ALLOWED_COLORS) - // background: { ...color properties... } // ✅ Per-board (for future use) - width: { // ✅ Per-board (NEW) - type: Number, - optional: true, - defaultValue: 272, // default width in pixels - custom() { - const w = this.value; - if (w < 100 || w > 1000) { - return 'widthOutOfRange'; - } - }, - }, - sort: { type: Number, decimal: true, optional: true }, // ✅ Per-board - swimlaneId: { type: String, optional: true }, // ✅ Per-board - boardId: { type: String }, // ✅ Per-board - archived: { type: Boolean }, // ✅ Per-board - wipLimit: { type: Object, optional: true }, // ✅ Per-board - starred: { type: Boolean, optional: true }, // ✅ Per-board - // NOTE: Collapse state is per-user only, stored in: - // - User profile: profile.collapsedLists[boardId][listId] = boolean - // - Non-logged-in: Cookie 'wekan-collapsed-lists' - }) -); -``` - -### 3. Cards Schema (cards.js) - -```javascript -Cards.attachSchema( - new SimpleSchema({ - title: { type: String, optional: true }, // ✅ Per-board - color: { type: String, optional: true }, // ✅ Per-board (ALLOWED_COLORS) - // background: { ...color properties... } // ✅ Per-board (for future use) - description: { type: String, optional: true }, // ✅ Per-board - sort: { type: Number, decimal: true, optional: true }, // ✅ Per-board - swimlaneId: { type: String }, // ✅ Per-board (REQUIRED) - listId: { type: String, optional: true }, // ✅ Per-board - boardId: { type: String, optional: true }, // ✅ Per-board - archived: { type: Boolean }, // ✅ Per-board - // ... other fields are all per-board - }) -); -``` - -### 4. Checklists Schema (checklists.js) - -```javascript -Checklists.attachSchema( - new SimpleSchema({ - title: { type: String }, // ✅ Per-board - sort: { type: Number, decimal: true }, // ✅ Per-board - hideCheckedChecklistItems: { type: Boolean, optional: true }, // ✅ Per-board - hideAllChecklistItems: { type: Boolean, optional: true }, // ✅ Per-board - cardId: { type: String }, // ✅ Per-board - }) -); -``` - -### 5. ChecklistItems Schema (checklistItems.js) - -```javascript -ChecklistItems.attachSchema( - new SimpleSchema({ - title: { type: String }, // ✅ Per-board - sort: { type: Number, decimal: true }, // ✅ Per-board - isFinished: { type: Boolean }, // ✅ Per-board - checklistId: { type: String }, // ✅ Per-board - cardId: { type: String }, // ✅ Per-board - }) -); -``` - -### 6. User Schema - Per-User Data (users.js) - -```javascript -// User.profile structure for per-user data -user.profile = { - // Collapse states - per-user, per-board - collapsedSwimlanes: { - 'boardId123': { - 'swimlaneId456': true, // swimlane is collapsed for this user - 'swimlaneId789': false - }, - 'boardId999': { ... } - }, - - // Collapse states - per-user, per-board - collapsedLists: { - 'boardId123': { - 'listId456': true, // list is collapsed for this user - 'listId789': false - }, - 'boardId999': { ... } - }, - - // Label visibility - per-user, per-board - hideMiniCardLabelText: { - 'boardId123': true, // hide minicard labels on this board - 'boardId999': false - } -} -``` - ---- - -## Client-Side Storage (Non-Logged-In Users) - -For users not logged in, collapse state is persisted via cookies (localStorage alternative): - -```javascript -// Cookie: wekan-collapsed-swimlanes -{ - 'boardId123': { - 'swimlaneId456': true, - 'swimlaneId789': false - } -} - -// Cookie: wekan-collapsed-lists -{ - 'boardId123': { - 'listId456': true, - 'listId789': false - } -} - -// Cookie: wekan-card-collapsed -{ - 'state': false // is card details view collapsed -} - -// localStorage: wekan-hide-minicard-label-{boardId} -true or false -``` - ---- - -## Data Flow - -### ✅ Board-Level Data Flow (Swimlane Height Example) - -``` -1. User resizes swimlane in UI -2. Client calls: Swimlanes.update(swimlaneId, { $set: { height: 300 } }) -3. MongoDB receives update -4. Schema validation: height must be -1 or 50-2000 -5. Update stored in swimlanes collection: { _id, title, height: 300, ... } -6. Update reflected in Swimlanes collection reactive -7. All users viewing board see updated height -8. Persists across page reloads -9. Persists across browser restarts -``` - -### ✅ Per-User Data Flow (Collapse State Example) - -``` -1. User collapses swimlane in UI -2. Client detects LOGGED-IN or NOT-LOGGED-IN -3. If LOGGED-IN: - a. Client calls: Meteor.call('setCollapsedSwimlane', boardId, swimlaneId, true) - b. Server updates user profile: { profile: { collapsedSwimlanes: { ... } } } - c. Stored in users collection -4. If NOT-LOGGED-IN: - a. Client writes to cookie: wekan-collapsed-swimlanes - b. Stored in browser cookies -5. On next page load: - a. Client reads from profile (logged-in) or cookie (not logged-in) - b. UI restored to saved state -6. Collapse state NOT visible to other users -``` - ---- - -## Validation Rules - -### Swimlane Height Validation -- **Allowed Values**: -1 (auto) or 50-2000 pixels -- **Default**: -1 (auto) -- **Trigger**: On insert/update -- **Action**: Reject if invalid - -### List Width Validation -- **Allowed Values**: 100-1000 pixels -- **Default**: 272 pixels -- **Trigger**: On insert/update -- **Action**: Reject if invalid - -### Collapse State Validation -- **Allowed Values**: true or false -- **Storage**: Only boolean values allowed -- **Trigger**: On read/write to profile -- **Action**: Remove if corrupted - ---- - -## Migration Strategy - -### For Existing Installations - -1. **Add new fields to schemas** - - `Swimlanes.height` (default: -1) - - `Lists.width` (default: 272) - -2. **Populate existing data** - - For swimlanes without height: set to -1 (auto) - - For lists without width: set to 272 (default) - -3. **Remove per-user storage if present** - - Check user.profile.swimlaneHeights → migrate to swimlane.height - - Check user.profile.listWidths → migrate to list.width - - Remove old fields from user profile - -4. **Validation migration** - - Ensure all swimlaneIds are valid (no orphaned data) - - Ensure all widths/heights are in valid range - - Clean corrupted per-user data - ---- - -## Security Implications - -### Per-User Data (🔒 Private) -- Collapse state is per-user → User A's collapse setting doesn't affect User B's view -- Hide label setting is per-user → User A's label visibility doesn't affect User B -- Stored in user profile → Only accessible to that user -- Cookies for non-logged-in → Stored locally, not transmitted - -### Per-Board Data (✅ Shared) -- Heights/widths are shared → All users see same swimlane/list sizes -- Positions are shared → All users see same card order -- Colors are shared → All users see same visual styling -- Stored in MongoDB → All users can query and receive updates - -### No Cross-User Leakage -- User A's preferences never stored in User B's profile -- User A's preferences never affect User B's view -- Each user has isolated per-user data space - ---- - -## Testing Checklist - -### Per-Board Data Tests -- [ ] Resize swimlane height → all users see change -- [ ] Resize list width → all users see change -- [ ] Move card between lists → all users see change -- [ ] Change card color → all users see change -- [ ] Reload page → changes persist -- [ ] Different browser → changes persist - -### Per-User Data Tests -- [ ] User A collapses swimlane → User B sees it expanded -- [ ] User A hides labels → User B sees labels -- [ ] User A scrolls away → User B can collapse same swimlane -- [ ] Logout → cookies maintain collapse state -- [ ] Login as different user → previous collapse state not visible -- [ ] Reload page → collapse state restored for user - -### Validation Tests -- [ ] Set swimlane height = 25 → rejected (< 50) -- [ ] Set swimlane height = 3000 → rejected (> 2000) -- [ ] Set list width = 50 → rejected (< 100) -- [ ] Set list width = 2000 → rejected (> 1000) -- [ ] Corrupt localStorage height → cleaned on startup -- [ ] Corrupt user profile height → cleaned on startup - ---- - -## Related Files - -| File | Purpose | -|------|---------| -| [models/swimlanes.js](../../../models/swimlanes.js) | Swimlane model with height field | -| [models/lists.js](../../../models/lists.js) | List model with width field | -| [models/cards.js](../../../models/cards.js) | Card model with position tracking | -| [models/checklists.js](../../../models/checklists.js) | Checklist model | -| [models/checklistItems.js](../../../models/checklistItems.js) | ChecklistItem model | -| [models/users.js](../../../models/users.js) | User model with per-user settings | - ---- - -## Glossary - -| Term | Definition | -|------|-----------| -| **Per-Board** | Stored in swimlane/list/card document, visible to all users | -| **Per-User** | Stored in user profile/cookie, visible only to that user | -| **Sort** | Decimal number determining visual order of entity | -| **Height** | Pixel measurement of swimlane vertical size | -| **Width** | Pixel measurement of list horizontal size | -| **Collapse** | Hiding swimlane/list/card from view (per-user preference) | -| **Position** | Combination of swimlaneId/listId and sort value | - ---- - -## Change Log - -| Date | Change | Impact | -|------|--------|--------| -| 2025-12-23 | Created comprehensive architecture document | Documentation | -| 2025-12-23 | Added height field to Swimlanes | Per-board storage | -| 2025-12-23 | Added width field to Lists | Per-board storage | -| 2025-12-23 | Defined per-user data as collapse + label visibility | Architecture | - ---- - -**Status**: ✅ Complete and Current -**Next Review**: Upon next architectural change - diff --git a/docs/Security/PerUserDataAudit2025-12-23/EXECUTIVE_SUMMARY.md b/docs/Security/PerUserDataAudit2025-12-23/EXECUTIVE_SUMMARY.md deleted file mode 100644 index 822a1f8b5..000000000 --- a/docs/Security/PerUserDataAudit2025-12-23/EXECUTIVE_SUMMARY.md +++ /dev/null @@ -1,253 +0,0 @@ -# Executive Summary - Per-User Data Architecture Updates - -**Date**: 2025-12-23 -**Status**: ✅ Complete and Current -**For**: Development Team, Stakeholders - ---- - -## 🎯 What Changed? - -### The Decision -Swimlane **height** and list **width** should be **per-board** (shared with all users), not per-user (private to each user). - -### Why It Matters -- **Before**: User A could resize a swimlane to 300px, User B could resize it to 400px. Each saw different layouts. ❌ -- **After**: All users see the same swimlane and list dimensions, creating consistent shared layouts. ✅ - ---- - -## 📊 What's Per-Board Now? (Shared) - -| Component | Data | Storage | -|-----------|------|---------| -| 🏊 Swimlane | height (pixels) | `swimlane.height` document field | -| 📋 List | width (pixels) | `list.width` document field | -| 🎴 Card | position, color, title | `card.sort`, `card.color`, etc. | -| ✅ Checklist | position, title | `checklist.sort`, `checklist.title` | -| ☑️ ChecklistItem | position, status | `checklistItem.sort`, `checklistItem.isFinished` | - -**All users see the same value** for these fields. - ---- - -## 🔒 What's Per-User Only? (Private) - -| Component | Preference | Storage | -|-----------|-----------|---------| -| 👤 User | Collapsed swimlanes | `user.profile.collapsedSwimlanes[boardId][swimlaneId]` | -| 👤 User | Collapsed lists | `user.profile.collapsedLists[boardId][listId]` | -| 👤 User | Show/hide label text | `user.profile.hideMiniCardLabelText[boardId]` | - -**Only that user sees their own value** for these fields. - ---- - -## ✅ Implementation Status - -### Completed ✅ -- [x] Schema modifications (swimlanes.js, lists.js) -- [x] Validation rules added -- [x] Backward compatibility ensured -- [x] Comprehensive documentation created - -### Pending ⏳ -- [ ] User model refactoring -- [ ] Data migration script -- [ ] Client code updates -- [ ] Testing & QA - ---- - -## 📁 Documentation Structure - -All documentation is in: `docs/Security/PerUserDataAudit2025-12-23/` - -| Document | Purpose | Read Time | -|----------|---------|-----------| -| [README.md](README.md) | Index & navigation | 5 min | -| [CURRENT_STATUS.md](CURRENT_STATUS.md) | Quick status overview | 5 min | -| [DATA_PERSISTENCE_ARCHITECTURE.md](DATA_PERSISTENCE_ARCHITECTURE.md) | Complete specification | 15 min | -| [IMPLEMENTATION_GUIDE.md](IMPLEMENTATION_GUIDE.md) | How to finish the work | 20 min | -| [SCHEMA_CHANGES_VERIFICATION.md](SCHEMA_CHANGES_VERIFICATION.md) | Verification of changes | 10 min | -| [QUICK_REFERENCE.md](QUICK_REFERENCE.md) | Quick lookup guide | 3 min | - -**Start with**: [README.md](README.md) → [CURRENT_STATUS.md](CURRENT_STATUS.md) → [IMPLEMENTATION_GUIDE.md](IMPLEMENTATION_GUIDE.md) - ---- - -## 🔧 Code Changes Made - -### Swimlanes (swimlanes.js) -```javascript -// ADDED: -height: { - type: Number, - optional: true, - defaultValue: -1, // -1 = auto-height - custom() { - const h = this.value; - if (h !== -1 && (h < 50 || h > 2000)) { - return 'heightOutOfRange'; // Validates range - } - }, -} -``` - -**Location**: After `type` field, before schema closing brace -**Line Numbers**: ~108-130 -**Backward Compatible**: Yes (optional field) - -### Lists (lists.js) -```javascript -// ADDED: -width: { - type: Number, - optional: true, - defaultValue: 272, // 272 pixels = standard width - custom() { - const w = this.value; - if (w < 100 || w > 1000) { - return 'widthOutOfRange'; // Validates range - } - }, -} -``` - -**Location**: After `type` field, before schema closing brace -**Line Numbers**: ~162-182 -**Backward Compatible**: Yes (optional field) - ---- - -## 📋 Validation Rules - -### Swimlane Height -- **Allowed**: -1 (auto) OR 50-2000 pixels -- **Default**: -1 (auto-height) -- **Validation**: Custom function rejects invalid values -- **Error**: Returns 'heightOutOfRange' if invalid - -### List Width -- **Allowed**: 100-1000 pixels -- **Default**: 272 pixels -- **Validation**: Custom function rejects invalid values -- **Error**: Returns 'widthOutOfRange' if invalid - ---- - -## 🔄 What Happens Next? - -### Phase 2 (User Model Refactoring) -- Update user methods to read heights/widths from documents -- Remove per-user storage from user.profile -- Estimated effort: 2-4 hours -- See [IMPLEMENTATION_GUIDE.md](IMPLEMENTATION_GUIDE.md) for details - -### Phase 3 (Data Migration) -- Create migration script -- Move existing per-user data to per-board -- Verify no data loss -- Estimated effort: 1-2 hours -- Template provided in [IMPLEMENTATION_GUIDE.md](IMPLEMENTATION_GUIDE.md) - -### Phase 4 (UI Integration) -- Update client code to use new locations -- Update Meteor methods -- Test with multiple users -- Estimated effort: 4-6 hours - -**Total Remaining Work**: ~7-12 hours - ---- - -## 🧪 Testing Requirements - -Before deploying, verify: - -✅ **Schema Validation** -- New fields accept valid values -- Invalid values are rejected -- Defaults are applied correctly - -✅ **Data Persistence** -- Values persist across page reloads -- Values persist across sessions -- Old data is preserved during migration - -✅ **Per-User Isolation** -- User A's collapse state doesn't affect User B -- User A's label visibility doesn't affect User B -- Each user's preferences are independent - -✅ **Backward Compatibility** -- Old code still works -- Database migration is safe -- No data loss occurs - ---- - -## 🚨 Important Notes - -### No Data Loss Risk -- Old data in `user.profile.swimlaneHeights` is preserved -- Old data in `user.profile.listWidths` is preserved -- Migration can happen anytime -- Rollback is possible (see [IMPLEMENTATION_GUIDE.md](IMPLEMENTATION_GUIDE.md)) - -### User Experience -- After migration, all users see same dimensions -- Each user still has independent collapse preferences -- Smoother collaboration, consistent layouts - -### Performance -- Height/width now in document queries (faster) -- No extra per-user lookups needed -- Better caching efficiency - ---- - -## 📞 Questions? - -| Question | Answer Location | -|----------|-----------------| -| "What's per-board?" | [DATA_PERSISTENCE_ARCHITECTURE.md](DATA_PERSISTENCE_ARCHITECTURE.md) | -| "What's per-user?" | [DATA_PERSISTENCE_ARCHITECTURE.md](DATA_PERSISTENCE_ARCHITECTURE.md) | -| "How do I implement Phase 2?" | [IMPLEMENTATION_GUIDE.md](IMPLEMENTATION_GUIDE.md) | -| "Is this backward compatible?" | [SCHEMA_CHANGES_VERIFICATION.md](SCHEMA_CHANGES_VERIFICATION.md) | -| "What validation rules exist?" | [DATA_PERSISTENCE_ARCHITECTURE.md](DATA_PERSISTENCE_ARCHITECTURE.md) Section 5 | -| "What files were changed?" | [SCHEMA_CHANGES_VERIFICATION.md](SCHEMA_CHANGES_VERIFICATION.md) | - ---- - -## ✨ Key Benefits - -1. **🎯 Consistency**: All users see same layout dimensions -2. **👥 Better Collaboration**: Shared visual consistency -3. **🔒 Privacy**: Personal preferences still private (collapse, labels) -4. **🚀 Performance**: Better database query efficiency -5. **📝 Clear Architecture**: Easy to understand and maintain -6. **✅ Well Documented**: 6 comprehensive guides provided -7. **🔄 Reversible**: Rollback possible if needed - ---- - -## 📈 Success Metrics - -After completing all phases, the system will have: - -- ✅ 100% of swimlane dimensions per-board -- ✅ 100% of list dimensions per-board -- ✅ 100% of entity positions per-board -- ✅ 100% of user preferences per-user -- ✅ Zero duplicate data -- ✅ Zero data loss -- ✅ Zero breaking changes - ---- - -**Status**: ✅ PHASE 1 COMPLETE -**Approval**: Ready for Phase 2 -**Documentation**: Comprehensive (6 guides) -**Code Quality**: Production-ready - diff --git a/docs/Security/PerUserDataAudit2025-12-23/FIXES_CHECKLIST.md b/docs/Security/PerUserDataAudit2025-12-23/FIXES_CHECKLIST.md deleted file mode 100644 index 4fb7ed4ef..000000000 --- a/docs/Security/PerUserDataAudit2025-12-23/FIXES_CHECKLIST.md +++ /dev/null @@ -1,281 +0,0 @@ -# Wekan Persistence Architecture - Fixes Applied Checklist - -## ✅ Issues Fixed - -### Issue #1: Board-Level Collapsed State Inconsistency ✅ FIXED -- [x] Removed `collapsed` field from Swimlanes schema -- [x] Removed `collapsed` field from Lists schema -- [x] Removed `collapse()` mutation from Swimlanes -- [x] Removed REST API collapsed field handling -- [x] Added comments explaining per-user storage -- **Status**: All board-level collapse state removed - -### Issue #2: LocalStorage Validation Missing ✅ FIXED -- [x] Created localStorageValidator.js with full validation logic -- [x] Added bounds checking (100-1000 for widths, -1/50-2000 for heights) -- [x] Auto-cleanup on startup (once per day) -- [x] Invalid data removal on app start -- [x] Quota management (max 50 boards, max 100 items/board) -- **Status**: Full validation system implemented - -### Issue #3: No Per-User Position History ✅ FIXED -- [x] Created userPositionHistory.js collection -- [x] Automatic tracking in card.move() -- [x] Undo/redo capability implemented -- [x] Checkpoint/savepoint system -- [x] User isolation enforced -- [x] Meteor methods for client interaction -- [x] Auto-cleanup (keep last 1000 entries) -- **Status**: Complete position history system with undo/redo - -### Issue #4: SwimlaneId Not Always Set ✅ FIXED -- [x] Created ensureValidSwimlaneIds migration -- [x] Auto-assigns default swimlaneId to cards -- [x] Rescues orphaned data to special swimlane -- [x] Adds validation hooks to prevent removal -- [x] Runs automatically on server startup -- **Status**: SwimlaneId validation enforced at all levels - -### Issue #5: Migrations Collection Error ✅ FIXED -- [x] Fixed "Migrations.findOne is not a function" error -- [x] Moved collection definition to top of file -- [x] Ensured availability before use -- **Status**: Migration system working correctly - -### Issue #6: UserPositionHistory Reference Errors ✅ FIXED -- [x] Removed ES6 export (use Meteor globals) -- [x] Added defensive checks for collection existence -- [x] Fixed ChecklistItems undefined reference -- **Status**: No reference errors - ---- - -## 📋 Implementation Checklist - -### Schema Changes -- [x] Swimlanes - removed `collapsed` field -- [x] Lists - removed `collapsed` field -- [x] UserPositionHistory - new collection created -- [x] Migrations - tracking collection created - -### Data Validation -- [x] List width validation (100-1000) -- [x] Swimlane height validation (-1 or 50-2000) -- [x] Boolean validation for collapse states -- [x] Invalid data cleanup -- [x] Corrupted data removal -- [x] localStorage quota management - -### Position History -- [x] Card move tracking -- [x] Undo/redo logic -- [x] Checkpoint system -- [x] Batch operation support -- [x] User isolation -- [x] Auto-cleanup -- [x] Meteor methods - -### Migrations -- [x] ensureValidSwimlaneIds migration -- [x] Fix cards without swimlaneId -- [x] Fix lists without swimlaneId -- [x] Rescue orphaned cards -- [x] Add validation hooks -- [x] Track migration status -- [x] Auto-run on startup - -### Error Handling -- [x] Fixed Migrations.findOne error -- [x] Fixed UserPositionHistory references -- [x] Added defensive checks -- [x] Proper error logging - ---- - -## 🧪 Testing Status - -### Unit Tests Status -- [ ] localStorageValidator.js - Not yet created -- [ ] userStorageHelpers.js - Not yet created -- [ ] userPositionHistory.js - Not yet created -- [ ] ensureValidSwimlaneIds.js - Not yet created - -### Integration Tests Status -- [ ] Card move tracking -- [ ] Undo/redo functionality -- [ ] Checkpoint restore -- [ ] localStorage cleanup -- [ ] SwimlaneId rescue - -### Manual Testing -- [ ] App starts without errors -- [ ] Collapse state persists per-user -- [ ] localStorage data is validated -- [ ] Orphaned cards are rescued -- [ ] Position history is created - ---- - -## 📚 Documentation Created - -- [x] PERSISTENCE_AUDIT.md - Complete system audit -- [x] ARCHITECTURE_IMPROVEMENTS.md - Implementation guide -- [x] IMPLEMENTATION_SUMMARY.md - This summary - ---- - -## 🚀 Deployment Readiness - -### Pre-Deployment -- [x] All code fixes applied -- [x] Migration system ready -- [x] Error handling in place -- [x] Backward compatibility maintained -- [ ] Unit tests created (TODO) -- [ ] Integration tests created (TODO) - -### Deployment -- [ ] Run on staging environment -- [ ] Verify no startup errors -- [ ] Check migration completion -- [ ] Test per-user settings persistence -- [ ] Validate undo/redo functionality - -### Post-Deployment -- [ ] Monitor for errors -- [ ] Verify data integrity -- [ ] Check localStorage cleanup -- [ ] Confirm no data loss - ---- - -## 📊 Metrics & Performance - -### Storage Limits -- LocalStorage max: 50 boards × 100 items = 5000 entries max -- UserPositionHistory: 1000 entries per user per board (checkpoints preserved) -- Auto-cleanup: Daily check for excess data - -### Query Performance -- Indexes created for fast retrieval -- Queries limited to 100 results -- Pagination support for history - -### Data Validation -- All reads: validated before use -- All writes: validated before storage -- Invalid data: silently removed - ---- - -## 🔐 Security Checklist - -- [x] User isolation in UserPositionHistory -- [x] UserID filtering on all queries -- [x] Type validation on all inputs -- [x] Bounds checking on numeric values -- [x] Board membership verification -- [x] Cannot modify other users' history -- [x] Checkpoints are per-user - ---- - -## 🎯 Feature Status - -### Completed ✅ -1. Per-user collapse state management -2. Per-user list width management -3. Per-user swimlane height management -4. localStorage validation and cleanup -5. Position history tracking -6. Undo/redo capability -7. Checkpoint/savepoint system -8. SwimlaneId validation and rescue - -### In Progress 🔄 -- UI components for undo/redo buttons -- History sidebar visualization - -### Planned 📋 -- Keyboard shortcuts (Ctrl+Z, Ctrl+Shift+Z) -- Field-level history for board data -- Search across historical values -- Visual timeline of changes - ---- - -## 📝 Code Quality - -### Documentation -- [x] Comments in all modified files -- [x] JSDoc comments for new functions -- [x] README in ARCHITECTURE_IMPROVEMENTS.md -- [x] Usage examples in IMPLEMENTATION_SUMMARY.md - -### Code Style -- [x] Consistent with Wekan codebase -- [x] Follows Meteor conventions -- [x] Error handling throughout -- [x] Defensive programming practices - -### Backward Compatibility -- [x] No breaking changes -- [x] Existing data preserved -- [x] Migration handles all edge cases -- [x] Fallback to defaults when needed - ---- - -## 🔧 Troubleshooting - -### Common Issues & Fixes - -| Issue | Cause | Fix | -|-------|-------|-----| -| "Migrations.findOne is not a function" | Collection not defined | ✅ Fixed - moved to top | -| UserPositionHistory not found | ES6 export in Meteor | ✅ Fixed - use globals | -| ChecklistItems undefined | Conditional reference | ✅ Fixed - added typeof check | -| localStorage quota exceeded | Too much data | ✅ Fixed - auto-cleanup | -| Collapsed state not persisting | Board-level vs per-user | ✅ Fixed - removed board-level | - ---- - -## 📞 Support - -### For Developers -- See ARCHITECTURE_IMPROVEMENTS.md for detailed implementation -- See PERSISTENCE_AUDIT.md for system audit -- Check inline code comments for specific logic - -### For Users -- Per-user settings are isolated and persistent -- Undo/redo coming in future releases -- Data is automatically cleaned up and validated - ---- - -## ✨ Summary - -**All critical issues have been resolved:** -1. ✅ Board-level UI state eliminated -2. ✅ Data validation fully implemented -3. ✅ Per-user position history created -4. ✅ SwimlaneId validation enforced -5. ✅ All startup errors fixed - -**The system is ready for:** -- Production deployment -- Further UI development -- Feature expansion - -**Next priorities:** -1. Create unit tests -2. Implement UI components -3. Add keyboard shortcuts -4. Expand to field-level history - ---- - -**Last Updated**: 2025-12-23 -**Status**: ✅ COMPLETE AND READY - diff --git a/docs/Security/PerUserDataAudit2025-12-23/IMPLEMENTATION_GUIDE.md b/docs/Security/PerUserDataAudit2025-12-23/IMPLEMENTATION_GUIDE.md deleted file mode 100644 index e2f0e81ca..000000000 --- a/docs/Security/PerUserDataAudit2025-12-23/IMPLEMENTATION_GUIDE.md +++ /dev/null @@ -1,451 +0,0 @@ -# Implementation Guide - Per-Board vs Per-User Data Storage - -**Status**: ✅ Complete -**Updated**: 2025-12-23 -**Scope**: Changes to implement per-board height/width storage and per-user-only collapse/label visibility - ---- - -## Overview of Changes - -This document details all changes required to properly separate per-board data from per-user data. - ---- - -## 1. Schema Changes ✅ COMPLETED - -### Swimlanes (swimlanes.js) ✅ -**Change**: Add `height` field to schema - -```javascript -// ADDED: -height: { - /** - * The height of the swimlane in pixels. - * -1 = auto-height (default) - * 50-2000 = fixed height in pixels - */ - type: Number, - optional: true, - defaultValue: -1, - custom() { - const h = this.value; - if (h !== -1 && (h < 50 || h > 2000)) { - return 'heightOutOfRange'; - } - }, -}, -``` - -**Status**: ✅ Implemented - -### Lists (lists.js) ✅ -**Change**: Add `width` field to schema - -```javascript -// ADDED: -width: { - /** - * The width of the list in pixels (100-1000). - * Default width is 272 pixels. - */ - type: Number, - optional: true, - defaultValue: 272, - custom() { - const w = this.value; - if (w < 100 || w > 1000) { - return 'widthOutOfRange'; - } - }, -}, -``` - -**Status**: ✅ Implemented - -### Cards (cards.js) ✅ -**Current**: Already has per-board `sort` field -**No Change Needed**: Positions stored in card.sort (per-board) - -**Status**: ✅ Already Correct - -### Checklists (checklists.js) ✅ -**Current**: Already has per-board `sort` field -**No Change Needed**: Positions stored in checklist.sort (per-board) - -**Status**: ✅ Already Correct - -### ChecklistItems (checklistItems.js) ✅ -**Current**: Already has per-board `sort` field -**No Change Needed**: Positions stored in checklistItem.sort (per-board) - -**Status**: ✅ Already Correct - ---- - -## 2. User Model Changes - -### Users (users.js) - Remove Per-User Width/Height Storage - -**Current Code Problem**: -- User profile stores `listWidths` (per-user) → should be per-board -- User profile stores `swimlaneHeights` (per-user) → should be per-board -- These methods access user.profile.listWidths and user.profile.swimlaneHeights - -**Solution**: Refactor these methods to read from list/swimlane documents instead - -#### Option A: Create Migration Helper (Recommended) - -Create a new file: `models/lib/persistenceHelpers.js` - -```javascript -// Get swimlane height from swimlane document (per-board storage) -export const getSwimlaneHeight = (swimlaneId) => { - const swimlane = Swimlanes.findOne(swimlaneId); - return swimlane && swimlane.height !== undefined ? swimlane.height : -1; -}; - -// Get list width from list document (per-board storage) -export const getListWidth = (listId) => { - const list = Lists.findOne(listId); - return list && list.width !== undefined ? list.width : 272; -}; - -// Set swimlane height in swimlane document (per-board storage) -export const setSwimlaneHeight = (swimlaneId, height) => { - if (height !== -1 && (height < 50 || height > 2000)) { - throw new Error('Height out of range: -1 or 50-2000'); - } - Swimlanes.update(swimlaneId, { $set: { height } }); -}; - -// Set list width in list document (per-board storage) -export const setListWidth = (listId, width) => { - if (width < 100 || width > 1000) { - throw new Error('Width out of range: 100-1000'); - } - Lists.update(listId, { $set: { width } }); -}; -``` - -#### Option B: Modify User Methods - -**Change these methods in users.js**: - -1. **getListWidth(boardId, listId)** - Remove per-user lookup - ```javascript - // OLD (removes this): - // const listWidths = this.getListWidths(); - // if (listWidths[boardId] && listWidths[boardId][listId]) { - // return listWidths[boardId][listId]; - // } - - // NEW: - getListWidth(listId) { - const list = ReactiveCache.getList({ _id: listId }); - return list && list.width ? list.width : 272; - }, - ``` - -2. **getSwimlaneHeight(boardId, swimlaneId)** - Remove per-user lookup - ```javascript - // OLD (removes this): - // const swimlaneHeights = this.getSwimlaneHeights(); - // if (swimlaneHeights[boardId] && swimlaneHeights[boardId][swimlaneId]) { - // return swimlaneHeights[boardId][swimlaneId]; - // } - - // NEW: - getSwimlaneHeight(swimlaneId) { - const swimlane = ReactiveCache.getSwimlane(swimlaneId); - return swimlane && swimlane.height ? swimlane.height : -1; - }, - ``` - -3. **setListWidth(boardId, listId, width)** - Update list document - ```javascript - // OLD (removes this): - // let currentWidths = this.getListWidths(); - // if (!currentWidths[boardId]) { - // currentWidths[boardId] = {}; - // } - // currentWidths[boardId][listId] = width; - - // NEW: - setListWidth(listId, width) { - Lists.update(listId, { $set: { width } }); - }, - ``` - -4. **setSwimlaneHeight(boardId, swimlaneId, height)** - Update swimlane document - ```javascript - // OLD (removes this): - // let currentHeights = this.getSwimlaneHeights(); - // if (!currentHeights[boardId]) { - // currentHeights[boardId] = {}; - // } - // currentHeights[boardId][swimlaneId] = height; - - // NEW: - setSwimlaneHeight(swimlaneId, height) { - Swimlanes.update(swimlaneId, { $set: { height } }); - }, - ``` - -### Keep These Per-User Storage Methods - -These should remain in user profile (per-user only): - -1. **Collapse Swimlanes** (per-user) - ```javascript - getCollapsedSwimlanes() { - const { collapsedSwimlanes = {} } = this.profile || {}; - return collapsedSwimlanes; - }, - setCollapsedSwimlane(boardId, swimlaneId, collapsed) { - // ... update user.profile.collapsedSwimlanes[boardId][swimlaneId] - }, - isCollapsedSwimlane(boardId, swimlaneId) { - // ... check user.profile.collapsedSwimlanes - }, - ``` - -2. **Collapse Lists** (per-user) - ```javascript - getCollapsedLists() { - const { collapsedLists = {} } = this.profile || {}; - return collapsedLists; - }, - setCollapsedList(boardId, listId, collapsed) { - // ... update user.profile.collapsedLists[boardId][listId] - }, - isCollapsedList(boardId, listId) { - // ... check user.profile.collapsedLists - }, - ``` - -3. **Hide Minicard Label Text** (per-user) - ```javascript - getHideMiniCardLabelText(boardId) { - const { hideMiniCardLabelText = {} } = this.profile || {}; - return hideMiniCardLabelText[boardId] || false; - }, - setHideMiniCardLabelText(boardId, hidden) { - // ... update user.profile.hideMiniCardLabelText[boardId] - }, - ``` - -### Remove From User Schema - -These fields should be removed from user.profile schema in users.js: - -```javascript -// REMOVE from schema: -'profile.listWidths': { ... }, // Now stored in list.width -'profile.swimlaneHeights': { ... }, // Now stored in swimlane.height -``` - ---- - -## 3. Client-Side Changes - -### Storage Access Layer - -When UI needs to get/set widths and heights: - -**OLD APPROACH** (removes this): -```javascript -// Getting from user profile -const width = Meteor.user().getListWidth(boardId, listId); - -// Setting to user profile -Meteor.call('setListWidth', boardId, listId, 300); -``` - -**NEW APPROACH**: -```javascript -// Getting from list document -const width = Lists.findOne(listId)?.width || 272; - -// Setting to list document -Lists.update(listId, { $set: { width: 300 } }); -``` - -### Meteor Methods to Remove - -Remove these Meteor methods that updated user profile: - -```javascript -// Remove: -Meteor.methods({ - 'setListWidth': function(boardId, listId, width) { ... }, - 'setSwimlaneHeight': function(boardId, swimlaneId, height) { ... }, -}); -``` - ---- - -## 4. Migration Script - -Create file: `server/migrations/migrateToPerBoardStorage.js` - -```javascript -const MIGRATION_NAME = 'migrate-to-per-board-height-width-storage'; - -Migrations = new Mongo.Collection('migrations'); - -Meteor.startup(() => { - const existingMigration = Migrations.findOne({ name: MIGRATION_NAME }); - - if (!existingMigration) { - try { - // Migrate swimlane heights from user.profile to swimlane.height - Meteor.users.find().forEach(user => { - const swimlaneHeights = user.profile?.swimlaneHeights || {}; - - Object.keys(swimlaneHeights).forEach(boardId => { - Object.keys(swimlaneHeights[boardId]).forEach(swimlaneId => { - const height = swimlaneHeights[boardId][swimlaneId]; - - // Validate height - if (height === -1 || (height >= 50 && height <= 2000)) { - Swimlanes.update( - { _id: swimlaneId, boardId }, - { $set: { height } }, - { multi: false } - ); - } - }); - }); - }); - - // Migrate list widths from user.profile to list.width - Meteor.users.find().forEach(user => { - const listWidths = user.profile?.listWidths || {}; - - Object.keys(listWidths).forEach(boardId => { - Object.keys(listWidths[boardId]).forEach(listId => { - const width = listWidths[boardId][listId]; - - // Validate width - if (width >= 100 && width <= 1000) { - Lists.update( - { _id: listId, boardId }, - { $set: { width } }, - { multi: false } - ); - } - }); - }); - }); - - // Record successful migration - Migrations.insert({ - name: MIGRATION_NAME, - status: 'completed', - createdAt: new Date(), - migratedSwimlanes: Swimlanes.find({ height: { $exists: true, $ne: -1 } }).count(), - migratedLists: Lists.find({ width: { $exists: true, $ne: 272 } }).count(), - }); - - console.log('✅ Migration to per-board height/width storage completed'); - - } catch (error) { - console.error('❌ Migration failed:', error); - Migrations.insert({ - name: MIGRATION_NAME, - status: 'failed', - error: error.message, - createdAt: new Date(), - }); - } - } -}); -``` - ---- - -## 5. Testing Checklist - -### Schema Testing -- [ ] Swimlane with height = -1 accepts insert -- [ ] Swimlane with height = 100 accepts insert -- [ ] Swimlane with height = 25 rejects (< 50) -- [ ] Swimlane with height = 3000 rejects (> 2000) -- [ ] List with width = 272 accepts insert -- [ ] List with width = 50 rejects (< 100) -- [ ] List with width = 2000 rejects (> 1000) - -### Data Persistence Testing -- [ ] Resize swimlane → height saved in swimlane document -- [ ] Reload page → swimlane height persists -- [ ] Different user loads page → sees same height -- [ ] Resize list → width saved in list document -- [ ] Reload page → list width persists -- [ ] Different user loads page → sees same width - -### Per-User Testing -- [ ] User A collapses swimlane → User B sees it expanded -- [ ] User A hides labels → User B sees labels -- [ ] Reload page → per-user preferences persist for same user -- [ ] Different user logs in → doesn't see previous user's preferences - -### Migration Testing -- [ ] Run migration on database with old per-user data -- [ ] All swimlane heights migrated to swimlane documents -- [ ] All list widths migrated to list documents -- [ ] User.profile.swimlaneHeights can be safely removed -- [ ] User.profile.listWidths can be safely removed - ---- - -## 6. Rollback Plan - -If issues occur: - -1. **Before Migration**: Backup MongoDB - ```bash - mongodump -d wekan -o backup-wekan-before-migration - ``` - -2. **If Needed**: Restore from backup - ```bash - mongorestore -d wekan backup-wekan-before-migration/wekan - ``` - -3. **Revert Code**: Restore previous swimlanes.js, lists.js, users.js - ---- - -## 7. Files Modified - -| File | Change | Status | -|------|--------|--------| -| [models/swimlanes.js](../../../models/swimlanes.js) | Add height field | ✅ Done | -| [models/lists.js](../../../models/lists.js) | Add width field | ✅ Done | -| [models/users.js](../../../models/users.js) | Refactor height/width methods | ⏳ TODO | -| server/migrations/migrateToPerBoardStorage.js | Migration script | ⏳ TODO | -| [docs/Security/PerUserDataAudit2025-12-23/DATA_PERSISTENCE_ARCHITECTURE.md](DATA_PERSISTENCE_ARCHITECTURE.md) | Architecture docs | ✅ Done | - ---- - -## 8. Summary of Per-User vs Per-Board Data - -### ✅ Per-Board Data (All Users See Same Value) -- Swimlane height -- List width -- Card position (sort) -- Checklist position (sort) -- ChecklistItem position (sort) -- All titles, colors, descriptions - -### 🔒 Per-User Data (Only That User Sees Their Value) -- Collapse state (swimlane, list, card) -- Hide minicard label text visibility -- Stored in user.profile or cookie - ---- - -**Status**: ✅ Architecture and schema changes complete -**Next**: Refactor user methods and run migration - diff --git a/docs/Security/PerUserDataAudit2025-12-23/IMPLEMENTATION_SUMMARY.md b/docs/Security/PerUserDataAudit2025-12-23/IMPLEMENTATION_SUMMARY.md deleted file mode 100644 index 3baaa50d9..000000000 --- a/docs/Security/PerUserDataAudit2025-12-23/IMPLEMENTATION_SUMMARY.md +++ /dev/null @@ -1,337 +0,0 @@ -# Wekan Architecture Improvements - Implementation Summary - -## Status: ✅ Complete and Ready for Testing - -All architectural improvements have been successfully implemented and fixed. The application should now start without errors. - ---- - -## Files Created - -### 1. LocalStorage Validation System -- **[client/lib/localStorageValidator.js](client/lib/localStorageValidator.js)** - - Validates all localStorage data for per-user UI preferences - - Auto-cleanup of invalid/corrupted data - - Runs on app startup (once per day) - - Exported functions for use by other modules - -### 2. User Storage Helpers -- **[models/lib/userStorageHelpers.js](models/lib/userStorageHelpers.js)** - - Helper functions for validated get/set operations - - Type checking and bounds validation - - Used by users model for localStorage operations - -### 3. Per-User Position History -- **[models/userPositionHistory.js](models/userPositionHistory.js)** - - New Mongo collection for tracking entity movements - - Per-user history isolation - - Undo/redo capabilities - - Checkpoint/savepoint system - - Meteor methods for client interaction - -### 4. SwimlaneId Validation Migration -- **[server/migrations/ensureValidSwimlaneIds.js](server/migrations/ensureValidSwimlaneIds.js)** - - Automatic migration on server startup - - Ensures all cards have valid swimlaneId - - Rescues orphaned data to "Rescued Data" swimlane - - Adds validation hooks to prevent swimlaneId removal - ---- - -## Files Modified - -### 1. Swimlane Schema -- **[models/swimlanes.js](models/swimlanes.js)** - - ❌ Removed `collapsed` field (board-level) - - ❌ Removed `collapse()` mutation - - ✅ Added comments explaining per-user storage - -### 2. List Schema -- **[models/lists.js](models/lists.js)** - - ❌ Removed `collapsed` field (board-level) - - ❌ Removed REST API collapsed field handling - - ✅ Added comments explaining per-user storage - -### 3. Cards Model -- **[models/cards.js](models/cards.js)** - - ✅ Enhanced `move()` method to track changes - - ✅ Automatic UserPositionHistory entry creation - - ✅ Defensive checks for UserPositionHistory existence - -### 4. User Model -- **[models/users.js](models/users.js)** - - Updated to use validated localStorage functions - - Enhanced validation for list widths and swimlane heights - - Type checking on all values - ---- - -## Features Implemented - -### ✅ Completed Features - -1. **Per-User UI State Management** - - Collapse states (swimlanes, lists) - per-user only - - List widths - per-board, per-user - - Swimlane heights - per-board, per-user - - Stored in user profile (logged-in) and localStorage (non-logged-in) - -2. **Data Validation** - - All localStorage data validated on read/write - - Invalid data automatically removed - - Numeric ranges enforced: - - List widths: 100-1000 pixels - - Swimlane heights: -1 (auto) or 50-2000 pixels - - Corrupted data cleaned up automatically - -3. **Position History Tracking** - - Automatic tracking of card movements - - Per-user isolation (users see only their own history) - - Full undo/redo capability - - Checkpoint/savepoint system for marking important states - - Batch operation support for grouping related changes - -4. **SwimlaneId Validation** - - All cards assigned valid swimlaneId - - Orphaned data rescued to special swimlane - - Validation hooks prevent swimlaneId removal - - Automatic on server startup - -### ⏳ Planned Features (for future implementation) - -- UI components for undo/redo buttons -- History sidebar visualization -- Keyboard shortcuts (Ctrl+Z, Ctrl+Shift+Z) -- Field-level history for board data -- Search across historical values - ---- - -## Bug Fixes Applied - -1. **Fixed Migrations Collection Issue** - - Moved collection definition to top of file - - Ensured it's available before use - - Fixed startup error: "Migrations.findOne is not a function" - -2. **Fixed UserPositionHistory References** - - Removed ES6 export (Meteor uses globals) - - Added defensive checks for collection existence - - Fixed ChecklistItems reference - -3. **Fixed LocalStorage Validator** - - Proper client-side guard - - Conditional Meteor.startup() call - ---- - -## Migration Information - -### Automatic Migrations - -1. **ensureValidSwimlaneIds** (v1) - - Runs automatically on server startup - - No manual action required - - Tracks completion in `migrations` collection - -### Data Changes - -- Existing `collapsed` field values in swimlanes/lists are ignored -- Per-user collapse states take precedence -- Card swimlaneId is auto-assigned if missing -- Orphaned cards moved to rescue swimlane - ---- - -## Testing Instructions - -### Manual Verification - -1. **Start the application** - ```bash - cd /home/wekan/repos/wekan - npm start - ``` - -2. **Check for startup errors** - - Should not see "Migrations.findOne is not a function" - - Should see migration completion logs - - Should see validation hook installation - -3. **Test Per-User Settings** - - Collapse a swimlane → Log out → Login as different user - - Swimlane should be expanded for the other user - - Previous user's collapse state restored when logged back in - -4. **Test Data Validation** - - Corrupt localStorage data - - Restart app - - Data should be cleaned up automatically - -5. **Test Position History** - - Move a card between lists - - Check that history entry was created - - Verify undo capability - -### Automated Testing (Todo) - -- [ ] Unit tests for localStorageValidator -- [ ] Unit tests for userPositionHistory -- [ ] Integration tests for card move tracking -- [ ] Migration tests for swimlaneId fixing - ---- - -## Database Indexes - -New indexes created for performance: - -```javascript -UserPositionHistory: -- { userId: 1, boardId: 1, createdAt: -1 } -- { userId: 1, entityType: 1, entityId: 1 } -- { userId: 1, isCheckpoint: 1 } -- { batchId: 1 } -- { createdAt: 1 } -``` - ---- - -## API Methods Added - -### Meteor Methods - -```javascript -Meteor.methods({ - 'userPositionHistory.createCheckpoint'(boardId, checkpointName) - 'userPositionHistory.undo'(historyId) - 'userPositionHistory.getRecent'(boardId, limit) - 'userPositionHistory.getCheckpoints'(boardId) - 'userPositionHistory.restoreToCheckpoint'(checkpointId) -}); -``` - ---- - -## Performance Considerations - -1. **LocalStorage Limits** - - Max 50 boards per key - - Max 100 items per board - - Excess data removed during daily cleanup - -2. **Position History Limits** - - Max 1000 entries per user per board - - Checkpoints never deleted - - Old entries auto-deleted - -3. **Query Optimization** - - Limited to 100 results maximum - - Proper indexes for fast retrieval - - Auto-cleanup prevents unbounded growth - ---- - -## Security Notes - -1. **User Isolation** - - UserPositionHistory filtered by userId - - Users can only undo their own changes - - Checkpoints are per-user - -2. **Data Validation** - - All inputs validated before storage - - Invalid data rejected, not sanitized - - Type checking enforced - -3. **Authorization** - - Board membership verified - - Meteor.userId() required for history operations - - Cannot modify other users' history - ---- - -## Backward Compatibility - -✅ **All changes are backward compatible:** -- Existing board-level `collapsed` fields are ignored -- Per-user settings take precedence -- Migration handles orphaned data gracefully -- No data loss - ---- - -## Next Steps - -1. **Testing** - - Run manual tests (see Testing Instructions) - - Verify no startup errors - - Check position history tracking - -2. **UI Implementation** (Future) - - Create undo/redo buttons - - Implement history sidebar - - Add keyboard shortcuts - -3. **Feature Expansion** (Future) - - Add field-level history - - Implement search across history - - Add visual timeline - ---- - -## Documentation References - -- [PERSISTENCE_AUDIT.md](PERSISTENCE_AUDIT.md) - Complete system audit -- [ARCHITECTURE_IMPROVEMENTS.md](ARCHITECTURE_IMPROVEMENTS.md) - Detailed implementation guide - ---- - -## Files Summary - -| File | Type | Status | Purpose | -|------|------|--------|---------| -| client/lib/localStorageValidator.js | New | ✅ Complete | Validate and cleanup localStorage | -| models/lib/userStorageHelpers.js | New | ✅ Complete | Helper functions for storage | -| models/userPositionHistory.js | New | ✅ Complete | Per-user position history | -| server/migrations/ensureValidSwimlaneIds.js | New | ✅ Complete | Validate swimlaneIds | -| models/swimlanes.js | Modified | ✅ Complete | Removed board-level collapse | -| models/lists.js | Modified | ✅ Complete | Removed board-level collapse | -| models/cards.js | Modified | ✅ Complete | Added position tracking | -| models/users.js | Modified | ✅ Complete | Enhanced storage validation | - ---- - -## Known Limitations - -1. **Undo/Redo UI** - Not yet implemented (planned for future) -2. **Field History** - Only position history tracked (future feature) -3. **Collaborative Undo** - Single-user undo only for now -4. **Search History** - Not yet implemented - ---- - -## Support & Troubleshooting - -### If app won't start: -1. Check MongoDB is running: `ps aux | grep mongod` -2. Check logs for specific error messages -3. Verify collection definitions are loaded -4. Check for typos in model files - -### If data is missing: -1. Check `migrations` collection for completion status -2. Look for orphaned data in "Rescued Data" swimlane -3. Verify localStorage wasn't cleared - -### If undo doesn't work: -1. Verify UserPositionHistory collection exists -2. Check that history entries were created -3. Ensure entity still exists (deleted entities cannot be undone) - ---- - -**Status**: Ready for production deployment -**Last Updated**: 2025-12-23 -**Version**: 1.0 - diff --git a/docs/Security/PerUserDataAudit2025-12-23/PERSISTENCE_AUDIT.md b/docs/Security/PerUserDataAudit2025-12-23/PERSISTENCE_AUDIT.md deleted file mode 100644 index 24446657d..000000000 --- a/docs/Security/PerUserDataAudit2025-12-23/PERSISTENCE_AUDIT.md +++ /dev/null @@ -1,472 +0,0 @@ -# Wekan Persistence Audit Report - -## Overview -This document audits the persistence mechanisms for Wekan board data, including swimlanes, lists, cards, checklists, and their properties (order, color, background, titles, etc.), as well as per-user settings. - ---- - -## 1. BOARD-LEVEL PERSISTENCE (Persisted Across All Users) - -### 1.1 Swimlanes - -**Collection**: `swimlanes` ([models/swimlanes.js](models/swimlanes.js)) - -**Persisted Fields**: -- ✅ `title` - Swimlane title (via `rename()` mutation) -- ✅ `sort` - Swimlane ordering/position (decimal number) -- ✅ `color` - Swimlane color (via `setColor()` mutation) -- ✅ `collapsed` - Swimlane collapsed state (via `collapse()` mutation) **⚠️ See note below** -- ✅ `archived` - Swimlane archived status - -**Persistence Mechanism**: -- Direct MongoDB updates via `Swimlanes.update()` and `Swimlanes.direct.update()` -- Automatic timestamps: `updatedAt`, `modifiedAt` fields -- Activity tracking for title changes and archive/restore operations - -**Issues Found**: -- ⚠️ **ISSUE**: `collapsed` field in swimlanes.js line 127 is set to `defaultValue: false` but the `isCollapsed()` helper (line 251-263) checks for per-user stored values. This creates a mismatch between board-level and per-user storage. - ---- - -### 1.2 Lists - -**Collection**: `lists` ([models/lists.js](models/lists.js)) - -**Persisted Fields**: -- ✅ `title` - List title -- ✅ `sort` - List ordering/position (decimal number) -- ✅ `color` - List color -- ✅ `collapsed` - List collapsed state (board-wide via REST API line 768-775) **⚠️ See note below** -- ✅ `starred` - List starred status -- ✅ `wipLimit` - WIP limit configuration -- ✅ `archived` - List archived status - -**Persistence Mechanism**: -- Direct MongoDB updates via `Lists.update()` and `Lists.direct.update()` -- Automatic timestamps: `updatedAt`, `modifiedAt` -- Activity tracking for title changes, archive/restore - -**Issues Found**: -- ⚠️ **ISSUE**: Similar to swimlanes, `collapsed` field (line 147) defaults to `false` but the `isCollapsed()` helper (line 303-311) also checks for per-user stored values. The REST API allows board-level collapsed state updates (line 768-775), but client also stores per-user via `getCollapsedListFromStorage()`. -- ⚠️ **ISSUE**: The `swimlaneId` field is part of the list (line 48), but `draggableLists()` method (line 275) filters by board only, suggesting lists are shared across swimlanes rather than per-swimlane. - ---- - -### 1.3 Cards - -**Collection**: `cards` ([models/cards.js](models/cards.js)) - -**Persisted Fields**: -- ✅ `title` - Card title -- ✅ `sort` - Card ordering/position within list -- ✅ `color` - Card color (via `setColor()` mutation, line 2268) -- ✅ `boardId`, `swimlaneId`, `listId` - Card location -- ✅ `archived` - Card archived status -- ✅ `description` - Card description -- ✅ Custom fields, labels, members, assignees, etc. - -**Persistence Mechanism**: -- `move()` method (line 2063+) handles reordering and moving cards across swimlanes/lists/boards -- Automatic timestamp updates via `modifiedAt`, `dateLastActivity` -- Activity tracking for moves, title changes, etc. -- Attachment metadata updated alongside card moves (line 2101-2115) - -**Issues Found**: -- ✅ **OK**: Order/sort persistence working correctly via card.move() and card.moveOptionalArgs() -- ✅ **OK**: Color persistence working correctly -- ✅ **OK**: Title changes persisted automatically - ---- - -### 1.4 Checklists - -**Collection**: `checklists` ([models/checklists.js](models/checklists.js)) - -**Persisted Fields**: -- ✅ `title` - Checklist title (via `setTitle()` mutation) -- ✅ `sort` - Checklist ordering (decimal number) -- ✅ `hideCheckedChecklistItems` - Toggle for hiding checked items -- ✅ `hideAllChecklistItems` - Toggle for hiding all items - -**Persistence Mechanism**: -- Direct MongoDB updates via `Checklists.update()` -- Automatic timestamps: `createdAt`, `modifiedAt` -- Activity tracking for creation and removal - ---- - -### 1.5 Checklist Items - -**Collection**: `checklistItems` ([models/checklistItems.js](models/checklistItems.js)) - -**Persisted Fields**: -- ✅ `title` - Item text (via `setTitle()` mutation) -- ✅ `sort` - Item ordering within checklist (decimal number) -- ✅ `isFinished` - Item completion status (via `check()`, `uncheck()`, `toggleItem()` mutations) - -**Persistence Mechanism**: -- `move()` mutation (line 159-168) handles reordering within checklists -- Direct MongoDB updates via `ChecklistItems.update()` -- Automatic timestamps: `createdAt`, `modifiedAt` -- Activity tracking for item creation/removal and completion state changes - -**Issue Found**: -- ✅ **OK**: Item order and completion status persist correctly - ---- - -### 1.6 Position History Tracking - -**Collection**: `positionHistory` ([models/positionHistory.js](models/positionHistory.js)) - -**Purpose**: Tracks original positions of swimlanes, lists, and cards before changes - -**Features**: -- ✅ Stores original `sort` position -- ✅ Stores original titles -- ✅ Supports swimlanes, lists, and cards -- ✅ Provides helpers to check if entity moved from original position - -**Implementation Notes**: -- Swimlanes track position automatically on insert (swimlanes.js line 387-393) -- Lists track position automatically on insert (lists.js line 487+) -- Can detect moves via `hasMoved()` and `hasMovedFromOriginalPosition()` helpers - ---- - -## 2. PER-USER SETTINGS (NOT Persisted Across Boards) - -### 2.1 Per-Board, Per-User Settings - -**Storage**: User `profile` subdocuments ([models/users.js](models/users.js)) - -#### A. List Widths -- **Field**: `profile.listWidths` (line 527) -- **Structure**: `listWidths[boardId][listId] = width` -- **Persistence**: Via `setListWidth()` mutation (line 1834) -- **Retrieval**: `getListWidth()`, `getListWidthFromStorage()` (line 1288-1313) -- **Constraints**: Also stored in `profile.listConstraints` -- ✅ **Status**: Working correctly - -#### B. Swimlane Heights -- **Field**: `profile.swimlaneHeights` (searchable in line 1047+) -- **Structure**: `swimlaneHeights[boardId][swimlaneId] = height` -- **Persistence**: Via `setSwimlaneHeight()` mutation (line 1878) -- **Retrieval**: `getSwimlaneHeight()`, `getSwimlaneHeightFromStorage()` (line 1050-1080) -- ✅ **Status**: Working correctly - -#### C. Collapsed Swimlanes (Per-User) -- **Field**: `profile.collapsedSwimlanes` (line 1900) -- **Structure**: `collapsedSwimlanes[boardId][swimlaneId] = boolean` -- **Persistence**: Via `setCollapsedSwimlane()` mutation (line 1900-1906) -- **Retrieval**: `getCollapsedSwimlaneFromStorage()` (swimlanes.js line 251-263) -- **Client-Side Fallback**: `Users.getPublicCollapsedSwimlane()` for public/non-logged-in users (users.js line 60-73) -- ✅ **Status**: Working correctly for logged-in users - -#### D. Collapsed Lists (Per-User) -- **Field**: `profile.collapsedLists` (line 1893) -- **Structure**: `collapsedLists[boardId][listId] = boolean` -- **Persistence**: Via `setCollapsedList()` mutation (line 1893-1899) -- **Retrieval**: `getCollapsedListFromStorage()` (lists.js line 303-311) -- **Client-Side Fallback**: `Users.getPublicCollapsedList()` for public users (users.js line 44-52) -- ✅ **Status**: Working correctly for logged-in users - -#### E. Card Collapsed State (Global Per-User) -- **Field**: `profile.cardCollapsed` (line 267) -- **Persistence**: Via `setCardCollapsed()` method (line 2088-2091) -- **Retrieval**: `cardCollapsed()` helper in cardDetails.js (line 100-107) -- **Client-Side Fallback**: `Users.getPublicCardCollapsed()` for public users (users.js line 80-85) -- ✅ **Status**: Working correctly (applies to all boards for a user) - -#### F. Card Maximized State (Global Per-User) -- **Field**: `profile.cardMaximized` (line 260) -- **Persistence**: Via `toggleCardMaximized()` mutation (line 1720-1726) -- **Retrieval**: `hasCardMaximized()` helper (line 1194-1196) -- ✅ **Status**: Working correctly - -#### G. Board Workspace Trees (Global Per-User) -- **Field**: `profile.boardWorkspacesTree` (line 1981-2026) -- **Purpose**: Stores nested workspace structure for organizing boards -- **Persistence**: Via `setWorkspacesTree()` method (line 1995-2000) -- ✅ **Status**: Working correctly - -#### H. Board Workspace Assignments (Global Per-User) -- **Field**: `profile.boardWorkspaceAssignments` (line 2002-2011) -- **Purpose**: Maps each board to a workspace ID -- **Persistence**: Via `assignBoardToWorkspace()` and `unassignBoardFromWorkspace()` methods -- ✅ **Status**: Working correctly - -#### I. All Boards Workspaces Setting -- **Field**: `profile.boardView` (line 1807) -- **Persistence**: Via `setBoardView()` method (line 1805-1809) -- **Description**: Per-user preference for "All Boards" view style -- ✅ **Status**: Working correctly - ---- - -### 2.2 Client-Side Storage (Non-Logged-In Users) - -**Storage Methods**: -1. **Cookies** (via `readCookieMap()`/`writeCookieMap()`): - - `wekan-collapsed-lists` - Collapsed list states (users.js line 44-58) - - `wekan-collapsed-swimlanes` - Collapsed swimlane states - -2. **localStorage**: - - `wekan-list-widths` - List widths (getListWidthFromStorage, line 1316-1327) - - `wekan-swimlane-heights` - Swimlane heights (setSwimlaneHeightToStorage, line 1100-1123) - -**Coverage**: -- ✅ Collapse status for lists and swimlanes -- ✅ Width constraints for lists -- ✅ Height constraints for swimlanes -- ❌ Card collapsed state (only via cookies, fallback available) - ---- - -## 3. CRITICAL FINDINGS & ISSUES - -### 3.1 HIGH PRIORITY ISSUES - -#### Issue #1: Collapsed State Inconsistency (Swimlanes) -**Severity**: HIGH -**Location**: [models/swimlanes.js](models/swimlanes.js) lines 127, 251-263 - -**Problem**: -- The swimlane schema defines `collapsed` as a board-level field (defaults to false) -- But the `isCollapsed()` helper prioritizes per-user stored values from the user profile -- This creates confusion: is collapsed state board-wide or per-user? - -**Expected Behavior**: Per-user settings should be stored in `profile.collapsedSwimlanes`, not in the swimlane document itself. - -**Recommendation**: -```javascript -// CURRENT (WRONG): -collapsed: { - type: Boolean, - defaultValue: false, // Board-wide field -}, - -// SUGGESTED (CORRECT): -// Remove 'collapsed' from swimlane schema -// Only store per-user state in profile.collapsedSwimlanes -``` - ---- - -#### Issue #2: Collapsed State Inconsistency (Lists) -**Severity**: HIGH -**Location**: [models/lists.js](models/lists.js) lines 147, 303-311 - -**Problem**: -- Similar to swimlanes, lists have a board-level `collapsed` field -- REST API allows updating this field (line 768-775) -- But `isCollapsed()` helper checks per-user values first -- Migrations copy `collapsed` status between lists (fixMissingListsMigration.js line 165) - -**Recommendation**: Clarify whether collapsed state should be: -1. **Option A**: Board-level only (remove per-user override) -2. **Option B**: Per-user only (remove board-level field) -3. **Option C**: Hybrid with clear precedence rules - ---- - -#### Issue #3: Swimlane/List Organization Model Unclear -**Severity**: MEDIUM -**Location**: [models/lists.js](models/lists.js) lines 48, 201-230, 275 - -**Problem**: -- Lists have a `swimlaneId` field but `draggableLists()` filters by `boardId` only -- Some methods reference `myLists()` which filters by both `boardId` and `swimlaneId` -- Migrations suggest lists were transitioning from per-swimlane to shared-across-swimlane model - -**Questions**: -- Are lists shared across all swimlanes or isolated to each swimlane? -- What happens when dragging a list to a different swimlane? - -**Recommendation**: Document the intended architecture clearly. - ---- - -### 3.2 MEDIUM PRIORITY ISSUES - -#### Issue #4: Position History Only Tracks Original Position -**Severity**: MEDIUM -**Location**: [models/positionHistory.js](models/positionHistory.js) - -**Problem**: -- Position history tracks the *original* position when an entity is created -- It does NOT track subsequent moves/reorders -- Historical audit trail of all position changes is lost - -**Impact**: Cannot determine full history of where a card/list was located over time - -**Recommendation**: Consider extending to track all position changes with timestamps. - ---- - -#### Issue #5: Card Collapsed State is Global Per-User, Not Per-Card -**Severity**: LOW -**Location**: [models/users.js](models/users.js) line 267, users.js line 2088-2091 - -**Problem**: -- `profile.cardCollapsed` is a single boolean affecting all cards for a user -- It's not per-card or per-board, just a global toggle -- Name is misleading - -**Recommendation**: Consider renaming to `cardDetailsCollapsedByDefault` or similar. - ---- - -#### Issue #6: Public User Settings Storage Incomplete -**Severity**: MEDIUM -**Location**: [models/users.js](models/users.js) lines 44-85 - -**Problem**: -- Cookie-based storage for public users only covers: - - Collapsed lists - - Collapsed swimlanes -- Missing storage for: - - List widths - - Swimlane heights - - Card collapsed state - -**Impact**: Public/non-logged-in users lose UI preferences on page reload - -**Recommendation**: Implement localStorage storage for all per-user preferences. - ---- - -### 3.3 VERIFICATION CHECKLIST - -| Item | Status | Notes | -|------|--------|-------| -| Swimlane order persistence | ✅ | Via `sort` field, board-level | -| List order persistence | ✅ | Via `sort` field, board-level | -| Card order persistence | ✅ | Via `sort` field, card.move() | -| Checklist order persistence | ✅ | Via `sort` field | -| Checklist item order persistence | ✅ | Via `sort` field, ChecklistItems.move() | -| Swimlane color changes | ✅ | Via `setColor()` mutation | -| List color changes | ✅ | Via REST API or direct update | -| Card color changes | ✅ | Via `setColor()` mutation | -| Swimlane title changes | ✅ | Via `rename()` mutation, activity tracked | -| List title changes | ✅ | Via REST API or `rename()` mutation, activity tracked | -| Card title changes | ✅ | Via direct update, activity tracked | -| Checklist title changes | ✅ | Via `setTitle()` mutation | -| Checklist item title changes | ✅ | Via `setTitle()` mutation | -| Per-user list widths | ✅ | Via `profile.listWidths` | -| Per-user swimlane heights | ✅ | Via `profile.swimlaneHeights` | -| Per-user swimlane collapse state | ✅ | Via `profile.collapsedSwimlanes` | -| Per-user list collapse state | ✅ | Via `profile.collapsedLists` | -| Per-user card collapse state | ✅ | Via `profile.cardCollapsed` | -| Per-user board workspace organization | ✅ | Via `profile.boardWorkspacesTree` | -| Activity logging for changes | ✅ | Via Activities collection | - ---- - -## 4. RECOMMENDATIONS - -### 4.1 Immediate Actions - -1. **Clarify Collapsed State Architecture** - - Decide if collapsed state should be per-user or board-wide - - Update swimlanes.js and lists.js schema accordingly - - Update documentation - -2. **Complete Public User Storage** - - Implement localStorage for list widths/swimlane heights for non-logged-in users - - Test persistence across page reloads - -3. **Review Position History Usage** - - Confirm if current position history implementation meets requirements - - Consider extending to track all changes (not just original position) - -### 4.2 Long-Term Improvements - -1. **Audit Trail Feature** - - Extend position history to track all moves with timestamps - - Enable board managers to see complete history of card/list movements - -2. **Data Integrity Tests** - - Add integration tests to verify: - - Order is persisted correctly after drag-drop - - Color changes persist across sessions - - Per-user settings apply only to correct user - - Per-user settings don't leak across boards - -3. **Database Indexes** - - Verify indexes exist for common queries: - - `sort` fields for swimlanes, lists, cards, checklists - - `boardId` fields for filtering - -### 4.3 Code Quality Improvements - -1. **Document Persistence Model** - - Add clear comments explaining which fields are board-level vs. per-user - - Document swimlane/list relationship model - -2. **Consistent Naming** - - Rename misleading field names (e.g., `cardCollapsed`) - - Align method names with actual functionality - ---- - -## 5. SUMMARY TABLE - -### Board-Level Persistence (Shared Across Users) - -| Entity | Field | Type | Persisted | Notes | -|--------|-------|------|-----------|-------| -| Swimlane | title | Text | ✅ | Via rename() | -| Swimlane | sort | Number | ✅ | For ordering | -| Swimlane | color | String | ✅ | Via setColor() | -| Swimlane | collapsed | Boolean | ⚠️ | **Issue #1**: Conflicts with per-user storage | -| Swimlane | archived | Boolean | ✅ | Via archive()/restore() | -| | | | | | -| List | title | Text | ✅ | Via rename() or REST | -| List | sort | Number | ✅ | For ordering | -| List | color | String | ✅ | Via REST or update | -| List | collapsed | Boolean | ⚠️ | **Issue #2**: Conflicts with per-user storage | -| List | starred | Boolean | ✅ | Via REST or update | -| List | wipLimit | Object | ✅ | Via REST or setWipLimit() | -| List | archived | Boolean | ✅ | Via archive() | -| | | | | | -| Card | title | Text | ✅ | Direct update | -| Card | sort | Number | ✅ | Via move() | -| Card | color | String | ✅ | Via setColor() | -| Card | boardId/swimlaneId/listId | String | ✅ | Via move() | -| Card | archived | Boolean | ✅ | Via archive() | -| Card | description | Text | ✅ | Direct update | -| Card | customFields | Array | ✅ | Direct update | -| | | | | | -| Checklist | title | Text | ✅ | Via setTitle() | -| Checklist | sort | Number | ✅ | Direct update | -| Checklist | hideCheckedChecklistItems | Boolean | ✅ | Via toggle mutation | -| Checklist | hideAllChecklistItems | Boolean | ✅ | Via toggle mutation | -| | | | | | -| ChecklistItem | title | Text | ✅ | Via setTitle() | -| ChecklistItem | sort | Number | ✅ | Via move() | -| ChecklistItem | isFinished | Boolean | ✅ | Via check/uncheck/toggle | - -### Per-User Settings (NOT Persisted Across Boards) - -| Setting | Storage | Scope | Notes | -|---------|---------|-------|-------| -| List Widths | profile.listWidths | Per-board, per-user | ✅ Working | -| Swimlane Heights | profile.swimlaneHeights | Per-board, per-user | ✅ Working | -| Collapsed Swimlanes | profile.collapsedSwimlanes | Per-board, per-user | ✅ Working | -| Collapsed Lists | profile.collapsedLists | Per-board, per-user | ✅ Working | -| Card Collapsed State | profile.cardCollapsed | Global per-user | ⚠️ Name misleading | -| Card Maximized State | profile.cardMaximized | Global per-user | ✅ Working | -| Board Workspaces | profile.boardWorkspacesTree | Global per-user | ✅ Working | -| Board Workspace Assignments | profile.boardWorkspaceAssignments | Global per-user | ✅ Working | -| Board View Style | profile.boardView | Global per-user | ✅ Working | - ---- - -## Document History - -- **Created**: 2025-12-23 -- **Status**: Initial Audit Complete -- **Reviewed**: Swimlanes, Lists, Cards, Checklists, ChecklistItems, PositionHistory, Users -- **Next Review**: After addressing high-priority issues - diff --git a/docs/Security/PerUserDataAudit2025-12-23/Plan.txt b/docs/Security/PerUserDataAudit2025-12-23/Plan.txt deleted file mode 100644 index 899bd7aed..000000000 --- a/docs/Security/PerUserDataAudit2025-12-23/Plan.txt +++ /dev/null @@ -1,4 +0,0 @@ -Per-User vs Per-Board saving of data: Audit Plan 2025-12-23 - -All collapse state and swimlane height and list width is per-user and should always be persisted at users profile and localstorage, and validated that there is only numbers etc valid data. Invalid data and expired data is deleted from localstorage. swimlane height, list width and collapsed state need to be removed from board level, they are only user level. save swimlaneId always when saving data when swimlaneId is available. If there is no swimlaneId, show not-visible data at rescued data swimlane, similar like there is board settings / migrations to make invisible cards visible, by adding missing data. save position history to each user profile, and have undo redo buttons and list of history savepoints where is possible to return, similar like existing activities data schema, but no overwriting history. for board-level data, for each field (like description, comments etc) at Search All Boards have translateable options to also search from history of boards where user is member of board - diff --git a/docs/Security/PerUserDataAudit2025-12-23/QUICK_REFERENCE.md b/docs/Security/PerUserDataAudit2025-12-23/QUICK_REFERENCE.md deleted file mode 100644 index 799e788b5..000000000 --- a/docs/Security/PerUserDataAudit2025-12-23/QUICK_REFERENCE.md +++ /dev/null @@ -1,339 +0,0 @@ -# Wekan Persistence Improvements - Quick Reference - -## What Was Changed? - -### ❌ Removed -- Board-level `collapsed` field from Swimlanes -- Board-level `collapsed` field from Lists -- REST API endpoint for updating list `collapsed` status -- `collapse()` mutation from Swimlanes - -### ✅ Added -- Per-user position history with undo/redo -- LocalStorage validation and cleanup -- SwimlaneId validation migration -- Checkpoint/savepoint system for position history -- Enhanced data validation for all UI preferences - ---- - -## How It Works - -### Per-User Settings (Your Preferences) -These are NOW per-user and persisted: -- ✅ Swimlane collapse state -- ✅ List collapse state -- ✅ List width -- ✅ Swimlane height - -**Where it's stored:** -- Logged-in users: `user.profile` -- Non-logged-in users: Browser localStorage -- Validated & cleaned automatically - -### Position History (Card Movements) -Every time you move a card: -- Automatically tracked in `userPositionHistory` collection -- Stored with previous and new position -- Can be undone with `Meteor.call('userPositionHistory.undo', historyId)` -- Checkpoints can be created with `Meteor.call('userPositionHistory.createCheckpoint', boardId, name)` - -### Data Validation -All UI preference data is validated: -- List widths: 100-1000 pixels -- Swimlane heights: -1 (auto) or 50-2000 pixels -- Corrupted data: automatically removed -- Invalid data: rejected on write - ---- - -## For Users - -### What Changed? -- Your collapse preferences are now **private to you** (not shared with others) -- They persist across page reloads -- They work even if not logged in (saved in browser) -- Invalid data is automatically cleaned up - -### What You Can Do (Coming Soon) -- Undo/redo card movements -- Create savepoints of board state -- Restore to previous savepoints -- Use Ctrl+Z to undo - ---- - -## For Developers - -### New Collections - -**UserPositionHistory** -```javascript -{ - userId: String, - boardId: String, - entityType: 'card' | 'list' | 'swimlane' | 'checklist' | 'checklistItem', - entityId: String, - actionType: 'move' | 'create' | 'delete', - previousState: Object, - newState: Object, - isCheckpoint: Boolean, - checkpointName: String, - createdAt: Date -} -``` - -### New Meteor Methods - -```javascript -// Create a checkpoint -Meteor.call('userPositionHistory.createCheckpoint', boardId, 'name'); - -// Undo a change -Meteor.call('userPositionHistory.undo', historyId); - -// Get recent history -Meteor.call('userPositionHistory.getRecent', boardId, 50, (err, result) => { - // result is array of history entries -}); - -// Get checkpoints -Meteor.call('userPositionHistory.getCheckpoints', boardId, (err, checkpoints) => { - // result is array of checkpoints -}); - -// Restore to checkpoint -Meteor.call('userPositionHistory.restoreToCheckpoint', checkpointId); -``` - -### Updated Models - -**cards.js** -- `move()` now automatically tracks changes -- Uses `UserPositionHistory.trackChange()` - -**swimlanes.js** -- `collapsed` field removed (use profile.collapsedSwimlanes) -- `collapse()` mutation removed - -**lists.js** -- `collapsed` field removed (use profile.collapsedLists) -- Removed from REST API - -**users.js** -- Enhanced `getListWidthFromStorage()` with validation -- Enhanced `setSwimlaneHeightToStorage()` with validation -- Added automatic cleanup of invalid data - -### New Files - -``` -client/lib/localStorageValidator.js - - validateAndCleanLocalStorage() - - shouldRunCleanup() - - getValidatedLocalStorageData() - - setValidatedLocalStorageData() - - validators object with all validation functions - -models/lib/userStorageHelpers.js - - getValidatedNumber() - - setValidatedNumber() - - getValidatedBoolean() - - setValidatedBoolean() - -models/userPositionHistory.js - - UserPositionHistory collection - - Helpers: getDescription(), canUndo(), undo() - - Meteor methods for interaction - -server/migrations/ensureValidSwimlaneIds.js - - Runs automatically on startup - - Fixes cards/lists without swimlaneId - - Rescues orphaned data -``` - ---- - -## Migration Details - -### Automatic Migration: ensureValidSwimlaneIds - -Runs on server startup: - -1. **Finds cards without swimlaneId** - - Assigns them to default swimlane - -2. **Finds orphaned cards** - - SwimlaneId points to deleted swimlane - - Moves them to "Rescued Data" swimlane - -3. **Adds validation hooks** - - Prevents swimlaneId removal - - Auto-assigns on card creation - -**Tracking:** -```javascript -Migrations.findOne({ name: 'ensure-valid-swimlane-ids' }) -// Shows results of migration -``` - ---- - -## Data Examples - -### Before (Broken) -```javascript -// Swimlane with board-level collapse -{ - _id: 'swim123', - title: 'Development', - collapsed: true // ❌ Shared with all users! -} - -// Card without swimlaneId -{ - _id: 'card456', - title: 'Fix bug', - swimlaneId: undefined // ❌ No swimlane! -} -``` - -### After (Fixed) -```javascript -// Swimlane - no collapsed field -{ - _id: 'swim123', - title: 'Development', - // collapsed: removed ✅ -} - -// User's profile - has per-user settings -{ - _id: 'user789', - profile: { - collapsedSwimlanes: { - 'board123': { - 'swim123': true // ✅ Per-user! - } - }, - listWidths: { - 'board123': { - 'list456': 300 // ✅ Per-user! - } - } - } -} - -// Card with swimlaneId -{ - _id: 'card456', - title: 'Fix bug', - swimlaneId: 'swim123' // ✅ Always set! -} - -// Position history entry -{ - _id: 'hist789', - userId: 'user789', - boardId: 'board123', - entityType: 'card', - entityId: 'card456', - actionType: 'move', - previousState: { swimlaneId: 'swim123', listId: 'list456', sort: 1 }, - newState: { swimlaneId: 'swim123', listId: 'list789', sort: 2 }, - createdAt: ISODate('2025-12-23T07:00:00Z') -} -``` - ---- - -## Troubleshooting - -### Q: My collapse state isn't persisting -**A:** Make sure you're using the new per-user settings methods: -```javascript -user.setCollapsedSwimlane(boardId, swimlaneId, true); -user.getCollapsedSwimlaneFromStorage(boardId, swimlaneId); -``` - -### Q: I see "Rescued Data" swimlane with orphaned cards -**A:** Migration found cards pointing to deleted swimlanes. They're safe in the rescue swimlane. You can move them to proper swimlanes. - -### Q: localStorage is being cleared -**A:** That's intentional - we only keep valid data. Invalid/corrupted data is removed automatically during daily cleanup. - -### Q: How do I create a checkpoint? -**A:** Use the Meteor method: -```javascript -Meteor.call('userPositionHistory.createCheckpoint', boardId, 'Before big changes'); -``` - -### Q: How do I undo a card move? -**A:** Use the Meteor method: -```javascript -Meteor.call('userPositionHistory.undo', historyEntryId); -``` - ---- - -## Performance Notes - -### Storage -- localStorage: Max 50 boards, max 100 items per board -- UserPositionHistory: Max 1000 entries per user per board -- Auto-cleanup: Runs daily - -### Queries -- Limited to 100 results per query -- Indexed by userId, boardId, createdAt -- Fast checkpoint retrieval - -### Validation -- Runs on startup (once per day) -- Only validates if needed -- Removes excess data automatically - ---- - -## What's Next? - -### Coming Soon -- [ ] Undo/redo buttons in UI -- [ ] History sidebar -- [ ] Keyboard shortcuts (Ctrl+Z) -- [ ] Checkpoint UI - -### Future -- [ ] Field-level history (description, comments) -- [ ] Search across historical values -- [ ] Visual timeline -- [ ] Collaborative undo - ---- - -## Files to Know - -| File | Purpose | -|------|---------| -| [models/userPositionHistory.js](models/userPositionHistory.js) | Position history collection | -| [client/lib/localStorageValidator.js](client/lib/localStorageValidator.js) | Data validation | -| [server/migrations/ensureValidSwimlaneIds.js](server/migrations/ensureValidSwimlaneIds.js) | Automatic migration | -| [models/swimlanes.js](models/swimlanes.js) | Swimlane model | -| [models/lists.js](models/lists.js) | List model | -| [models/cards.js](models/cards.js) | Card model with tracking | - ---- - -## Questions? - -See detailed documentation: -- [ARCHITECTURE_IMPROVEMENTS.md](ARCHITECTURE_IMPROVEMENTS.md) - Complete guide -- [PERSISTENCE_AUDIT.md](PERSISTENCE_AUDIT.md) - System audit -- [IMPLEMENTATION_SUMMARY.md](IMPLEMENTATION_SUMMARY.md) - Implementation details -- [FIXES_CHECKLIST.md](FIXES_CHECKLIST.md) - What was fixed - ---- - -**Status**: ✅ Ready for use -**Last Updated**: 2025-12-23 - diff --git a/docs/Security/PerUserDataAudit2025-12-23/QUICK_START.md b/docs/Security/PerUserDataAudit2025-12-23/QUICK_START.md deleted file mode 100644 index 8e47ddc66..000000000 --- a/docs/Security/PerUserDataAudit2025-12-23/QUICK_START.md +++ /dev/null @@ -1,203 +0,0 @@ -# QUICK START - Data Persistence Architecture (2025-12-23) - -**STATUS**: ✅ Phase 1 Complete -**LOCATION**: `/home/wekan/repos/wekan/docs/Security/PerUserDataAudit2025-12-23/` - ---- - -## 🎯 The Change in 1 Sentence - -**Swimlane height and list width are now per-board (shared), not per-user (private).** - ---- - -## 📝 What Changed - -### Swimlanes (swimlanes.js) -```javascript -✅ ADDED: height: { type: Number, default: -1, range: -1 or 50-2000 } -📍 Line: ~108-130 -``` - -### Lists (lists.js) -```javascript -✅ ADDED: width: { type: Number, default: 272, range: 100-1000 } -📍 Line: ~162-182 -``` - -### Cards, Checklists, ChecklistItems -```javascript -✅ NO CHANGE - Positions already per-board in sort field -``` - ---- - -## 📊 Per-Board vs Per-User Quick Reference - -### ✅ PER-BOARD (All Users See Same) -- Swimlane height -- List width -- Card/checklist/checklistItem positions -- All titles, colors, descriptions - -### 🔒 PER-USER (Only You See Yours) -- Collapsed swimlanes (yes/no) -- Collapsed lists (yes/no) -- Hidden label text (yes/no) - ---- - -## 📁 Documentation Quick Links - -| Need | File | Time | -|------|------|------| -| Quick overview | [README.md](README.md) | 5 min | -| For management | [EXECUTIVE_SUMMARY.md](EXECUTIVE_SUMMARY.md) | 5 min | -| Current status | [CURRENT_STATUS.md](CURRENT_STATUS.md) | 5 min | -| Full architecture | [DATA_PERSISTENCE_ARCHITECTURE.md](DATA_PERSISTENCE_ARCHITECTURE.md) | 15 min | -| How to implement | [IMPLEMENTATION_GUIDE.md](IMPLEMENTATION_GUIDE.md) | 20 min | -| Verify changes | [SCHEMA_CHANGES_VERIFICATION.md](SCHEMA_CHANGES_VERIFICATION.md) | 10 min | -| Quick lookup | [QUICK_REFERENCE.md](QUICK_REFERENCE.md) | 3 min | -| What's done | [COMPLETION_SUMMARY.md](COMPLETION_SUMMARY.md) | 10 min | - ---- - -## ✅ What's Complete (Phase 1) - -- [x] Schema: Added height to swimlanes -- [x] Schema: Added width to lists -- [x] Validation: Both fields validate ranges -- [x] Documentation: 12 comprehensive guides -- [x] Backward compatible: Both fields optional - ---- - -## ⏳ What's Left (Phases 2-4) - -- [ ] Phase 2: Refactor user model (~2-4h) -- [ ] Phase 3: Migrate data (~1-2h) -- [ ] Phase 4: Update UI (~4-6h) - -See [IMPLEMENTATION_GUIDE.md](IMPLEMENTATION_GUIDE.md) for details - ---- - -## 🔍 Quick Facts - -| Item | Value | -|------|-------| -| Files Modified | 2 (swimlanes.js, lists.js) | -| Fields Added | 2 (height, width) | -| Documentation Files | 12 (4,400+ lines) | -| Validation Rules | 2 (range checks) | -| Backward Compatible | ✅ Yes | -| Data Loss Risk | ✅ None | -| Time to Read Docs | ~1 hour | -| Time to Implement Phase 2 | ~2-4 hours | - ---- - -## 🚀 Success Criteria - -✅ Per-board height/width storage -✅ Per-user collapse/visibility only -✅ Validation enforced -✅ Backward compatible -✅ Documentation complete -✅ Implementation guidance provided - ---- - -## 🎓 For Team Members - -**New to this?** -1. Read: [README.md](README.md) (5 min) -2. Skim: [CURRENT_STATUS.md](CURRENT_STATUS.md) (5 min) -3. Reference: [DATA_PERSISTENCE_ARCHITECTURE.md](DATA_PERSISTENCE_ARCHITECTURE.md) as needed - -**Implementing Phase 2?** -1. Read: [IMPLEMENTATION_GUIDE.md](IMPLEMENTATION_GUIDE.md) Section 2 -2. Code: Follow exact steps -3. Test: Use provided checklist - -**Reviewing changes?** -1. Check: [SCHEMA_CHANGES_VERIFICATION.md](SCHEMA_CHANGES_VERIFICATION.md) -2. Review: swimlanes.js and lists.js -3. Verify: Validation logic - ---- - -## 💾 Files Modified - -``` -/home/wekan/repos/wekan/ -├── models/ -│ ├── swimlanes.js ✅ height field added -│ ├── lists.js ✅ width field added -│ ├── cards.js ✅ no change (already correct) -│ ├── checklists.js ✅ no change (already correct) -│ └── checklistItems.js ✅ no change (already correct) -└── docs/Security/PerUserDataAudit2025-12-23/ - ├── README.md - ├── EXECUTIVE_SUMMARY.md - ├── COMPLETION_SUMMARY.md - ├── CURRENT_STATUS.md - ├── DATA_PERSISTENCE_ARCHITECTURE.md - ├── IMPLEMENTATION_GUIDE.md - ├── SCHEMA_CHANGES_VERIFICATION.md - ├── QUICK_REFERENCE.md (original) - └── [7 other docs from earlier phases] -``` - ---- - -## 🧪 Quick Test - -```javascript -// Test swimlane height validation -Swimlanes.insert({ boardId: 'b1', height: -1 }) // ✅ OK (auto) -Swimlanes.insert({ boardId: 'b1', height: 100 }) // ✅ OK (valid) -Swimlanes.insert({ boardId: 'b1', height: 25 }) // ❌ FAILS (too small) -Swimlanes.insert({ boardId: 'b1', height: 3000 }) // ❌ FAILS (too large) - -// Test list width validation -Lists.insert({ boardId: 'b1', width: 272 }) // ✅ OK (default) -Lists.insert({ boardId: 'b1', width: 500 }) // ✅ OK (valid) -Lists.insert({ boardId: 'b1', width: 50 }) // ❌ FAILS (too small) -Lists.insert({ boardId: 'b1', width: 2000 }) // ❌ FAILS (too large) -``` - ---- - -## 📞 Questions? - -| Question | Answer Location | -|----------|-----------------| -| What changed? | [COMPLETION_SUMMARY.md](COMPLETION_SUMMARY.md) | -| Why did it change? | [EXECUTIVE_SUMMARY.md](EXECUTIVE_SUMMARY.md) | -| What's per-board? | [DATA_PERSISTENCE_ARCHITECTURE.md](DATA_PERSISTENCE_ARCHITECTURE.md) | -| What's per-user? | [DATA_PERSISTENCE_ARCHITECTURE.md](DATA_PERSISTENCE_ARCHITECTURE.md) | -| How do I implement Phase 2? | [IMPLEMENTATION_GUIDE.md](IMPLEMENTATION_GUIDE.md) | -| Is it backward compatible? | [SCHEMA_CHANGES_VERIFICATION.md](SCHEMA_CHANGES_VERIFICATION.md) | - ---- - -## 🎯 Next Steps - -1. **Read the docs** (1 hour) - - Start with [README.md](README.md) - - Skim [CURRENT_STATUS.md](CURRENT_STATUS.md) - -2. **Review code changes** (15 min) - - Check swimlanes.js (line ~108-130) - - Check lists.js (line ~162-182) - -3. **Plan Phase 2** (1 hour) - - Read [IMPLEMENTATION_GUIDE.md](IMPLEMENTATION_GUIDE.md) Section 2 - - Estimate effort needed - - Schedule implementation - ---- - -**Status**: ✅ READY FOR PHASE 2 - diff --git a/docs/Security/PerUserDataAudit2025-12-23/README.md b/docs/Security/PerUserDataAudit2025-12-23/README.md deleted file mode 100644 index 43047f106..000000000 --- a/docs/Security/PerUserDataAudit2025-12-23/README.md +++ /dev/null @@ -1,334 +0,0 @@ -# Per-User Data Audit 2025-12-23 - Complete Documentation Index - -**Last Updated**: 2025-12-23 -**Status**: ✅ Current (All data persistence architecture up-to-date) -**Scope**: Swimlanes, Lists, Cards, Checklists, ChecklistItems - positions, widths, heights, colors, titles - ---- - -## 📋 Documentation Overview - -This folder contains the complete, current documentation for Wekan's data persistence architecture as of December 23, 2025. - -**Key Change**: Swimlane height and list width are now **per-board** (stored in documents, shared with all users), not per-user. - ---- - -## 📚 Documents (Read In This Order) - -### 1. **[CURRENT_STATUS.md](CURRENT_STATUS.md)** 🟢 START HERE -**Purpose**: Quick status overview of what's been done and what's pending -**Read Time**: 5 minutes -**Contains**: -- Key decision on data classification -- What's completed vs pending -- Before/after examples -- Testing requirements -- Integration phases - -**Best For**: Getting current status quickly - ---- - -### 2. **[DATA_PERSISTENCE_ARCHITECTURE.md](DATA_PERSISTENCE_ARCHITECTURE.md)** 📖 REFERENCE -**Purpose**: Complete architecture specification -**Read Time**: 15 minutes -**Contains**: -- Full data classification matrix (per-board vs per-user) -- Where each field is stored -- MongoDB schema definitions -- Cookie/localStorage for public users -- Data flow diagrams -- Validation rules -- Security implications -- Testing checklist - -**Best For**: Understanding the complete system - ---- - -### 3. **[IMPLEMENTATION_GUIDE.md](IMPLEMENTATION_GUIDE.md)** 🛠️ DOING THE WORK -**Purpose**: Step-by-step implementation instructions -**Read Time**: 20 minutes -**Contains**: -- Changes already completed ✅ -- Changes still needed ⏳ -- Code examples for refactoring -- Migration script template -- Testing checklist -- Rollback plan -- Files modified reference - -**Best For**: Implementing the remaining phases - ---- - -### 4. **[SCHEMA_CHANGES_VERIFICATION.md](SCHEMA_CHANGES_VERIFICATION.md)** ✅ VERIFICATION -**Purpose**: Verification that schema changes are correct -**Read Time**: 10 minutes -**Contains**: -- Exact fields added (with line numbers) -- Validation rule verification -- Data type classification -- Migration path status -- Code review checklist -- Integration notes - -**Best For**: Verifying all changes are correct - ---- - -### 5. **[QUICK_REFERENCE.md](QUICK_REFERENCE.md)** ⚡ QUICK LOOKUP -**Purpose**: Quick reference for key information -**Read Time**: 3 minutes -**Contains**: -- What changed (removed/added/kept) -- How it works (per-user vs per-board) -- Troubleshooting -- Performance notes -- Which files to know about - -**Best For**: Quick lookups and troubleshooting - ---- - -## 🎯 At a Glance - -### The Core Change - -**BEFORE** (Mixed/Wrong): -- Swimlane height: Stored per-user in user.profile -- List width: Stored per-user in user.profile -- Cards could look different dimensions for different users - -**NOW** (Correct): -- Swimlane height: Stored per-board in swimlane document -- List width: Stored per-board in list document -- All users see same dimensions (shared layout) -- Only collapse state is per-user (private preference) - ---- - -### What's Per-Board ✅ (ALL Users See Same) - -``` -Swimlane: - - title, color, height, sort, archived - -List: - - title, color, width, sort, archived, wipLimit, starred - -Card: - - title, color, description, swimlaneId, listId, sort, archived - -Checklist: - - title, sort, hideCheckedItems, hideAllItems - -ChecklistItem: - - title, sort, isFinished -``` - -### What's Per-User 🔒 (Only YOU See Yours) - -``` -User Preferences: - - collapsedSwimlanes[boardId][swimlaneId] (true/false) - - collapsedLists[boardId][listId] (true/false) - - hideMiniCardLabelText[boardId] (true/false) -``` - ---- - -## ✅ Completed (Phase 1) - -- [x] **Schema Addition** - - Added `swimlanes.height` field (default: -1, range: -1 or 50-2000) - - Added `lists.width` field (default: 272, range: 100-1000) - - Both with validation and backward compatibility - -- [x] **Documentation** - - Complete architecture specification - - Implementation guide with code examples - - Migration script template - - Verification checklist - -- [x] **Verification** - - Schema changes verified correct - - Validation logic reviewed - - Code samples provided - - Testing plans documented - ---- - -## ⏳ Pending (Phase 2-4) - -- [ ] **User Model Refactoring** (Phase 2) - - Refactor user methods to read heights/widths from documents - - Remove per-user storage from user.profile - - Update user schema definition - -- [ ] **Data Migration** (Phase 3) - - Create migration script (template in IMPLEMENTATION_GUIDE.md) - - Migrate existing per-user data to per-board - - Track migration status - - Verify no data loss - -- [ ] **UI Integration** (Phase 4) - - Update client code - - Update Meteor methods - - Update subscriptions - - Test with multiple users - ---- - -## 📊 Data Classification Summary - -### Per-Board (Shared with All Users) -| Data | Current | New | -|------|---------|-----| -| Swimlane height | ❌ Per-user (wrong) | ✅ Per-board (correct) | -| List width | ❌ Per-user (wrong) | ✅ Per-board (correct) | -| Card position | ✅ Per-board | ✅ Per-board | -| Checklist position | ✅ Per-board | ✅ Per-board | -| ChecklistItem position | ✅ Per-board | ✅ Per-board | - -### Per-User (Private to You) -| Data | Current | New | -|------|---------|-----| -| Collapse swimlane | ✅ Per-user | ✅ Per-user | -| Collapse list | ✅ Per-user | ✅ Per-user | -| Hide label text | ✅ Per-user | ✅ Per-user | - ---- - -## 🔍 Quick Facts - -- **Total Files Modified So Far**: 2 (swimlanes.js, lists.js) -- **Total Files Documented**: 5 markdown files -- **Schema Fields Added**: 2 (height, width) -- **Validation Rules Added**: 2 (heightOutOfRange, widthOutOfRange) -- **Per-Board Data Types**: 5 entity types × multiple fields -- **Per-User Data Types**: 3 preference types -- **Backward Compatibility**: ✅ Yes (both fields optional) -- **Data Loss Risk**: ✅ None (old data preserved until migration) - ---- - -## 🚀 How to Use This Documentation - -### For Developers Joining Now - -1. Read **[CURRENT_STATUS.md](CURRENT_STATUS.md)** - 5 min overview -2. Skim **[DATA_PERSISTENCE_ARCHITECTURE.md](DATA_PERSISTENCE_ARCHITECTURE.md)** - understand the system -3. Reference **[IMPLEMENTATION_GUIDE.md](IMPLEMENTATION_GUIDE.md)** - when doing Phase 2 - -### For Reviewing Changes - -1. Read **[SCHEMA_CHANGES_VERIFICATION.md](SCHEMA_CHANGES_VERIFICATION.md)** - verify what was done -2. Check actual files: swimlanes.js, lists.js -3. Approve or request changes - -### For Implementing Remaining Work - -1. **Phase 2 (User Refactoring)**: See [IMPLEMENTATION_GUIDE.md](IMPLEMENTATION_GUIDE.md) Section 2 -2. **Phase 3 (Migration)**: Use template in [IMPLEMENTATION_GUIDE.md](IMPLEMENTATION_GUIDE.md) Section 4 -3. **Phase 4 (UI)**: See [IMPLEMENTATION_GUIDE.md](IMPLEMENTATION_GUIDE.md) Section 3 - -### For Troubleshooting - -- Quick answers: **[QUICK_REFERENCE.md](QUICK_REFERENCE.md)** -- Detailed reference: **[DATA_PERSISTENCE_ARCHITECTURE.md](DATA_PERSISTENCE_ARCHITECTURE.md)** - ---- - -## 📞 Questions Answered - -### "What data is per-board?" -See **[DATA_PERSISTENCE_ARCHITECTURE.md](DATA_PERSISTENCE_ARCHITECTURE.md)** Section: Data Classification Matrix - -### "What data is per-user?" -See **[DATA_PERSISTENCE_ARCHITECTURE.md](DATA_PERSISTENCE_ARCHITECTURE.md)** Section: Data Classification Matrix - -### "Where is swimlane height stored?" -- **New**: In swimlane document (per-board) -- **Old**: In user.profile (per-user) - being replaced -- See **[SCHEMA_CHANGES_VERIFICATION.md](SCHEMA_CHANGES_VERIFICATION.md)** for verification - -### "Where is list width stored?" -- **New**: In list document (per-board) -- **Old**: In user.profile (per-user) - being replaced -- See **[SCHEMA_CHANGES_VERIFICATION.md](SCHEMA_CHANGES_VERIFICATION.md)** for verification - -### "How do I migrate old data?" -See **[IMPLEMENTATION_GUIDE.md](IMPLEMENTATION_GUIDE.md)** Section 4 for migration script template - -### "What should I do next?" -See **[CURRENT_STATUS.md](CURRENT_STATUS.md)** Section: Integration Path → Phase 2 - -### "Is there a migration risk?" -No - see **[IMPLEMENTATION_GUIDE.md](IMPLEMENTATION_GUIDE.md)** Section 7: Rollback Plan - -### "Are there validation rules?" -Yes - see **[DATA_PERSISTENCE_ARCHITECTURE.md](DATA_PERSISTENCE_ARCHITECTURE.md)** Section: Validation Rules - ---- - -## 🔄 Document Update Schedule - -| Document | Last Updated | Next Review | -|----------|--------------|-------------| -| [CURRENT_STATUS.md](CURRENT_STATUS.md) | 2025-12-23 | After Phase 2 | -| [DATA_PERSISTENCE_ARCHITECTURE.md](DATA_PERSISTENCE_ARCHITECTURE.md) | 2025-12-23 | If architecture changes | -| [IMPLEMENTATION_GUIDE.md](IMPLEMENTATION_GUIDE.md) | 2025-12-23 | After Phase 2 complete | -| [SCHEMA_CHANGES_VERIFICATION.md](SCHEMA_CHANGES_VERIFICATION.md) | 2025-12-23 | After Phase 2 complete | -| [QUICK_REFERENCE.md](QUICK_REFERENCE.md) | 2025-12-23 | After Phase 3 complete | - ---- - -## ✨ Key Achievements - -✅ **Clear Architecture**: Swimlane height and list width are now definitively per-board -✅ **Schema Validation**: Both fields have custom validation functions -✅ **Documentation**: 5 comprehensive documents covering all aspects -✅ **Backward Compatible**: Old data preserved, transition safe -✅ **Implementation Ready**: Code examples and migration scripts provided -✅ **Future-Proof**: Clear path for remaining phases - ---- - -## 📝 Notes - -- All data classification decisions made with input from security audit -- Per-board height/width means better collaboration (shared layout) -- Per-user collapse/visibility means better individual workflow -- Migration can happen at any time with no user downtime -- Testing templates provided for all phases - ---- - -## 📍 File Location Reference - -All files are in: `/home/wekan/repos/wekan/docs/Security/PerUserDataAudit2025-12-23/` - -``` -PerUserDataAudit2025-12-23/ -├── CURRENT_STATUS.md ← Start here -├── DATA_PERSISTENCE_ARCHITECTURE.md ← Complete spec -├── IMPLEMENTATION_GUIDE.md ← How to implement -├── SCHEMA_CHANGES_VERIFICATION.md ← Verification -├── QUICK_REFERENCE.md ← Quick lookup -├── README.md ← This file -├── QUICK_REFERENCE.md ← Previous doc -├── ARCHITECTURE_IMPROVEMENTS.md ← From Phase 1 -├── PERSISTENCE_AUDIT.md ← Initial audit -├── IMPLEMENTATION_SUMMARY.md ← Phase 1 summary -├── FIXES_CHECKLIST.md ← Bug fixes -└── Plan.txt ← Original plan -``` - ---- - -**Status**: ✅ COMPLETE AND CURRENT -**Last Review**: 2025-12-23 -**Next Phase**: User Model Refactoring (Phase 2) - diff --git a/docs/Security/PerUserDataAudit2025-12-23/SCHEMA_CHANGES_VERIFICATION.md b/docs/Security/PerUserDataAudit2025-12-23/SCHEMA_CHANGES_VERIFICATION.md deleted file mode 100644 index f61e970a8..000000000 --- a/docs/Security/PerUserDataAudit2025-12-23/SCHEMA_CHANGES_VERIFICATION.md +++ /dev/null @@ -1,294 +0,0 @@ -# Schema Changes Verification Checklist - -**Date**: 2025-12-23 -**Status**: ✅ Verification Complete - ---- - -## Schema Addition Checklist - -### Swimlanes.js - Height Field ✅ - -**File**: [models/swimlanes.js](../../../models/swimlanes.js) - -**Location**: Lines ~108-130 (after type field, before closing brace) - -**Added Field**: -```javascript -height: { - /** - * The height of the swimlane in pixels. - * -1 = auto-height (default) - * 50-2000 = fixed height in pixels - */ - type: Number, - optional: true, - defaultValue: -1, - custom() { - const h = this.value; - if (h !== -1 && (h < 50 || h > 2000)) { - return 'heightOutOfRange'; - } - }, -}, -``` - -**Validation Rules**: -- ✅ Type: Number -- ✅ Default: -1 (auto-height) -- ✅ Optional: true (backward compatible) -- ✅ Custom validation: -1 OR 50-2000 -- ✅ Out of range returns 'heightOutOfRange' error - -**Status**: ✅ VERIFIED - Field added with correct validation - ---- - -### Lists.js - Width Field ✅ - -**File**: [models/lists.js](../../../models/lists.js) - -**Location**: Lines ~162-182 (after type field, before closing brace) - -**Added Field**: -```javascript -width: { - /** - * The width of the list in pixels (100-1000). - * Default width is 272 pixels. - */ - type: Number, - optional: true, - defaultValue: 272, - custom() { - const w = this.value; - if (w < 100 || w > 1000) { - return 'widthOutOfRange'; - } - }, -}, -``` - -**Validation Rules**: -- ✅ Type: Number -- ✅ Default: 272 pixels -- ✅ Optional: true (backward compatible) -- ✅ Custom validation: 100-1000 only -- ✅ Out of range returns 'widthOutOfRange' error - -**Status**: ✅ VERIFIED - Field added with correct validation - ---- - -## Data Type Classification - -### Per-Board Storage (MongoDB Documents) ✅ - -| Entity | Field | Storage | Type | Default | Range | -|--------|-------|---------|------|---------|-------| -| Swimlane | height | swimlanes.height | Number | -1 | -1 or 50-2000 | -| List | width | lists.width | Number | 272 | 100-1000 | -| Card | sort | cards.sort | Number | varies | unlimited | -| Card | swimlaneId | cards.swimlaneId | String | required | any valid ID | -| Card | listId | cards.listId | String | required | any valid ID | -| Checklist | sort | checklists.sort | Number | varies | unlimited | -| ChecklistItem | sort | checklistItems.sort | Number | varies | unlimited | - -**Shared**: ✅ All users see the same value -**Persisted**: ✅ Survives across sessions -**Conflict**: ✅ No per-user override - ---- - -### Per-User Storage (User Profile) ✅ - -| Entity | Field | Storage | Scope | -|--------|-------|---------|-------| -| User | Collapse Swimlane | profile.collapsedSwimlanes[boardId][swimlaneId] | Per-user | -| User | Collapse List | profile.collapsedLists[boardId][listId] | Per-user | -| User | Hide Labels | profile.hideMiniCardLabelText[boardId] | Per-user | - -**Private**: ✅ Each user has own value -**Persisted**: ✅ Survives across sessions -**Isolated**: ✅ No visibility to other users - ---- - -## Migration Path - -### Phase 1: Schema Addition ✅ COMPLETE - -- ✅ Swimlanes.height field added -- ✅ Lists.width field added -- ✅ Both with validation -- ✅ Both optional for backward compatibility -- ✅ Default values set - -### Phase 2: User Model Updates ⏳ TODO - -- ⏳ Refactor user.getListWidth() → read from list.width -- ⏳ Refactor user.getSwimlaneHeight() → read from swimlane.height -- ⏳ Remove per-user width storage from user.profile -- ⏳ Remove per-user height storage from user.profile - -### Phase 3: Data Migration ⏳ TODO - -- ⏳ Create migration script (template in IMPLEMENTATION_GUIDE.md) -- ⏳ Migrate user.profile.listWidths → list.width -- ⏳ Migrate user.profile.swimlaneHeights → swimlane.height -- ⏳ Mark old fields for removal - -### Phase 4: UI Integration ⏳ TODO - -- ⏳ Update client code to use new locations -- ⏳ Update Meteor methods to update documents -- ⏳ Remove old user profile access patterns - ---- - -## Backward Compatibility - -### Existing Data Handled Correctly - -**Scenario**: Database has old data with per-user widths/heights - -✅ **Solution**: -- New fields in swimlane/list documents have defaults -- Old user.profile data remains until migration -- Code can read from either location during transition -- Migration script safely moves data - -### Migration Safety - -✅ **Validation**: All values validated before write -✅ **Type Safety**: SimpleSchema enforces numeric types -✅ **Range Safety**: Custom validators reject out-of-range values -✅ **Rollback**: Data snapshot before migration (mongodump) -✅ **Tracking**: Migration status recorded in Migrations collection - ---- - -## Testing Verification - -### Schema Tests - -```javascript -// Swimlane height validation tests -✅ Swimlanes.insert({ swimlaneId: 's1', height: -1 }) // Auto-height OK -✅ Swimlanes.insert({ swimlaneId: 's2', height: 50 }) // Minimum OK -✅ Swimlanes.insert({ swimlaneId: 's3', height: 2000 }) // Maximum OK -❌ Swimlanes.insert({ swimlaneId: 's4', height: 25 }) // Too small - REJECTED -❌ Swimlanes.insert({ swimlaneId: 's5', height: 3000 }) // Too large - REJECTED - -// List width validation tests -✅ Lists.insert({ listId: 'l1', width: 100 }) // Minimum OK -✅ Lists.insert({ listId: 'l2', width: 500 }) // Medium OK -✅ Lists.insert({ listId: 'l3', width: 1000 }) // Maximum OK -❌ Lists.insert({ listId: 'l4', width: 50 }) // Too small - REJECTED -❌ Lists.insert({ listId: 'l5', width: 2000 }) // Too large - REJECTED -``` - ---- - -## Documentation Verification - -### Created Documents - -| Document | Purpose | Status | -|----------|---------|--------| -| [DATA_PERSISTENCE_ARCHITECTURE.md](DATA_PERSISTENCE_ARCHITECTURE.md) | Full architecture specification | ✅ Created | -| [IMPLEMENTATION_GUIDE.md](IMPLEMENTATION_GUIDE.md) | Implementation steps and migration template | ✅ Created | -| [CURRENT_STATUS.md](CURRENT_STATUS.md) | Status summary and next steps | ✅ Created | -| [SCHEMA_CHANGES_VERIFICATION.md](SCHEMA_CHANGES_VERIFICATION.md) | This file - verification checklist | ✅ Created | - ---- - -## Code Review Checklist - -### Swimlanes.js ✅ - -- ✅ Height field added to schema -- ✅ Comment explains per-board storage -- ✅ Validation function checks range -- ✅ Optional: true for backward compatibility -- ✅ defaultValue: -1 (auto-height) -- ✅ Field added before closing brace -- ✅ No syntax errors -- ✅ No breaking changes to existing fields - -### Lists.js ✅ - -- ✅ Width field added to schema -- ✅ Comment explains per-board storage -- ✅ Validation function checks range -- ✅ Optional: true for backward compatibility -- ✅ defaultValue: 272 (standard width) -- ✅ Field added before closing brace -- ✅ No syntax errors -- ✅ No breaking changes to existing fields - ---- - -## Integration Notes - -### Before Next Phase - -1. **Verify Schema Validation** - ```bash - cd /home/wekan/repos/wekan - meteor shell - > Swimlanes.insert({ boardId: 'test', height: -1 }) // Should work - > Swimlanes.insert({ boardId: 'test', height: 25 }) // Should fail - ``` - -2. **Check Database** - ```bash - mongo wekan - > db.swimlanes.findOne() // Check height field exists - > db.lists.findOne() // Check width field exists - ``` - -3. **Verify No Errors** - - Check console for schema validation errors - - Run existing tests to ensure backward compatibility - - Verify app starts without errors - -### Next Phase (User Model) - -See [IMPLEMENTATION_GUIDE.md](IMPLEMENTATION_GUIDE.md) for detailed steps: -1. Refactor user methods -2. Remove per-user storage from schema -3. Create migration script -4. Test data movement - ---- - -## Sign-Off - -### Schema Changes Completed ✅ - -**Swimlanes.js**: -- ✅ Height field added with validation -- ✅ Backward compatible -- ✅ Documentation updated - -**Lists.js**: -- ✅ Width field added with validation -- ✅ Backward compatible -- ✅ Documentation updated - -### Ready for Review ✅ - -All schema changes are: -- ✅ Syntactically correct -- ✅ Logically sound -- ✅ Backward compatible -- ✅ Well documented -- ✅ Ready for deployment - ---- - -**Last Verified**: 2025-12-23 -**Verified By**: Code review -**Status**: ✅ COMPLETE - diff --git a/find.sh b/find.sh index e23b4eba6..7c11e282d 100755 --- a/find.sh +++ b/find.sh @@ -15,4 +15,4 @@ fi #find . | grep -v node_modules | grep -v .build | grep -v .meteor | grep -v .git | xargs grep --no-messages $1 | less #find . -print0 | grep -v node_modules | grep -v .build | grep -v .meteor | grep -v .git | xargs -0 grep --no-messages $1 | less -find . -type f -not -path '*/node_modules/*' -not -path '*/.build/*' -not -path '*/.meteor/*' -not -path '*/.git/*' -exec grep -I --no-messages "$1" {} + | less +find . | grep -v node_modules | grep -v .build | grep -v .meteor | grep -v .git | xargs grep -I --no-messages $1 | less diff --git a/imports/cronMigrationClient.js b/imports/cronMigrationClient.js deleted file mode 100644 index aa28a009e..000000000 --- a/imports/cronMigrationClient.js +++ /dev/null @@ -1,50 +0,0 @@ -import { Meteor } from 'meteor/meteor'; -import { ReactiveVar } from 'meteor/reactive-var'; - -export const cronMigrationProgress = new ReactiveVar(0); -export const cronMigrationStatus = new ReactiveVar(''); -export const cronMigrationCurrentStep = new ReactiveVar(''); -export const cronMigrationSteps = new ReactiveVar([]); -export const cronIsMigrating = new ReactiveVar(false); -export const cronJobs = new ReactiveVar([]); - -function fetchProgress() { - Meteor.call('cron.getMigrationProgress', (err, res) => { - if (err) return; - if (!res) return; - cronMigrationProgress.set(res.progress || 0); - cronMigrationStatus.set(res.status || ''); - cronMigrationCurrentStep.set(res.currentStep || ''); - cronMigrationSteps.set(res.steps || []); - cronIsMigrating.set(res.isMigrating || false); - }); -} - -// Expose cron jobs via method -function fetchJobs() { - Meteor.call('cron.getJobs', (err, res) => { - if (err) return; - cronJobs.set(res || []); - }); -} - -if (Meteor.isClient) { - // Initial fetch - fetchProgress(); - fetchJobs(); - - // Poll periodically - Meteor.setInterval(() => { - fetchProgress(); - fetchJobs(); - }, 2000); -} - -export default { - cronMigrationProgress, - cronMigrationStatus, - cronMigrationCurrentStep, - cronMigrationSteps, - cronIsMigrating, - cronJobs, -}; diff --git a/imports/i18n/data/ace.i18n.json b/imports/i18n/data/ace.i18n.json deleted file mode 100644 index d48099de1..000000000 --- a/imports/i18n/data/ace.i18n.json +++ /dev/null @@ -1,1605 +0,0 @@ -{ - "accept": "Accept", - "act-activity-notify": "Activity Notification", - "act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-addLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-addedLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-removeLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-removedLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-addChecklist": "added checklist __checklist__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-addChecklistItem": "added checklist item __checklistItem__ to checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-removeChecklist": "removed checklist __checklist__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-removeChecklistItem": "removed checklist item __checklistItem__ from checklist __checkList__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-uncheckedItem": "unchecked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-editComment": "edited comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-deleteComment": "deleted comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-createBoard": "created board __board__", - "act-createSwimlane": "created swimlane __swimlane__ to board __board__", - "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__", - "act-createCustomField": "created custom field __customField__ at board __board__", - "act-deleteCustomField": "deleted custom field __customField__ at board __board__", - "act-setCustomField": "edited custom field __customField__: __customFieldValue__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-createList": "added list __list__ to board __board__", - "act-addBoardMember": "added member __member__ to board __board__", - "act-archivedBoard": "Board __board__ moved to Archive", - "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive", - "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive", - "act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive", - "act-importBoard": "imported board __board__", - "act-importCard": "imported card __card__ to list __list__ at swimlane __swimlane__ at board __board__", - "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__", - "act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-moveCard": "moved card __card__ at board __board__ from list __oldList__ at swimlane __oldSwimlane__ to list __list__ at swimlane __swimlane__", - "act-moveCardToOtherBoard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__", - "act-removeBoardMember": "removed member __member__ from board __board__", - "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__", - "act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-withBoardTitle": "__board__", - "act-withCardTitle": "[__board__] __card__", - "actions": "Actions", - "activities": "Activities", - "activity": "Activity", - "activity-added": "added %s to %s", - "activity-archived": "%s moved to Archive", - "activity-attached": "attached %s to %s", - "activity-created": "created %s", - "activity-changedListTitle": "renamed list to %s", - "activity-customfield-created": "created custom field %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-subtask-added": "added subtask to %s", - "activity-checked-item": "checked %s in checklist %s of %s", - "activity-unchecked-item": "unchecked %s in checklist %s of %s", - "activity-checklist-added": "added checklist to %s", - "activity-checklist-removed": "removed a checklist from %s", - "activity-checklist-completed": "completed checklist %s of %s", - "activity-checklist-uncompleted": "uncompleted the checklist %s of %s", - "activity-checklist-item-added": "added checklist item to '%s' in %s", - "activity-checklist-item-removed": "removed a checklist item from '%s' in %s", - "add": "Add", - "activity-checked-item-card": "checked %s in checklist %s", - "activity-unchecked-item-card": "unchecked %s in checklist %s", - "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "activity-checklist-uncompleted-card": "uncompleted the checklist %s", - "activity-editComment": "edited comment %s", - "activity-deleteComment": "deleted comment %s", - "activity-receivedDate": "edited received date to %s of %s", - "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", - "activity-dueDate": "edited due date to %s of %s", - "activity-endDate": "edited end date to %s of %s", - "add-attachment": "Add Attachment", - "add-board": "Add Board", - "add-template": "Add Template", - "add-card": "Add Card", - "add-card-to-top-of-list": "Add Card to Top of List", - "add-card-to-bottom-of-list": "Add Card to Bottom of List", - "setListWidthPopup-title": "Set Widths", - "set-list-width": "Set Widths", - "set-list-width-value": "Set Min & Max Widths (pixels)", - "list-width-error-message": "List widths must be integers greater than 100", - "keyboard-shortcuts-enabled": "Keyboard shortcuts enabled. Click to disable.", - "keyboard-shortcuts-disabled": "Keyboard shortcuts disabled. Click to enable.", - "setSwimlaneHeightPopup-title": "Set Swimlane Height", - "set-swimlane-height": "Set Swimlane Height", - "set-swimlane-height-value": "Swimlane Height (pixels)", - "swimlane-height-error-message": "Swimlane height must be a positive integer", - "add-swimlane": "Add Swimlane", - "add-subtask": "Add Subtask", - "add-checklist": "Add Checklist", - "add-checklist-item": "Add an item to checklist", - "close-add-checklist-item": "Close add an item to checklist form", - "close-edit-checklist-item": "Close edit an item to checklist form", - "convertChecklistItemToCardPopup-title": "Convert to Card", - "add-cover": "Add cover image to minicard", - "add-label": "Add Label", - "add-list": "Add List", - "add-after-list": "Add After List", - "add-members": "Add Members", - "added": "Added", - "addMemberPopup-title": "Members", - "memberPopup-title": "Member Settings", - "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": "Loading, please wait. Refreshing the page will cause data loss. If loading does not work, please check that server has not stopped.", - "app-try-reconnect": "Try to reconnect.", - "archive": "Move to Archive", - "archive-all": "Move All to Archive", - "archive-board": "Move Board to Archive", - "archive-board-confirm": "Are you sure you want to archive this board?", - "archive-card": "Move Card to Archive", - "archive-list": "Move List to Archive", - "archive-swimlane": "Move Swimlane to Archive", - "archive-selection": "Move selection to Archive", - "archiveBoardPopup-title": "Move Board to Archive?", - "archived-items": "Archive", - "archived-boards": "Boards in Archive", - "restore-board": "Restore Board", - "no-archived-boards": "No Boards in Archive.", - "archives": "Archive", - "template": "Template", - "templates": "Templates", - "template-container": "Template Container", - "add-template-container": "Add Template Container", - "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 (__size__ max)", - "back": "Back", - "board-change-color": "Change color", - "board-change-background-image": "Change Background Image", - "board-background-image-url": "Background Image URL", - "add-background-image": "Add Background Image", - "remove-background-image": "Remove Background Image", - "show-at-all-boards-page" : "Show at All Boards page", - "board-info-on-my-boards" : "All Boards Settings", - "boardInfoOnMyBoardsPopup-title" : "All Boards Settings", - "boardInfoOnMyBoards-title": "All Boards Settings", - "show-card-counter-per-list": "Show card count per list", - "show-board_members-avatar": "Show Board members avatars", - "board-nb-stars": "%s stars", - "board-not-found": "Board not found", - "board-private-info": "This board will be private.", - "board-public-info": "This board will be public.", - "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", - "boardChangeColorPopup-title": "Change Board Background", - "boardChangeBackgroundImagePopup-title": "Change Background Image", - "allBoardsChangeColorPopup-title": "Change color", - "allBoardsChangeBackgroundImagePopup-title": "Change Background Image", - "boardChangeTitlePopup-title": "Rename Board", - "boardChangeVisibilityPopup-title": "Change Visibility", - "boardChangeWatchPopup-title": "Change Watch", - "boardMenuPopup-title": "Board Settings", - "allBoardsMenuPopup-title": "Settings", - "boardChangeViewPopup-title": "Board View", - "boards": "Boards", - "board-view": "Board View", - "desktop-mode": "Desktop Mode", - "mobile-mode": "Mobile Mode", - "mobile-desktop-toggle": "Toggle between Mobile and Desktop Mode", - "zoom-in": "Zoom In", - "zoom-out": "Zoom Out", - "click-to-change-zoom": "Click to change zoom level", - "zoom-level": "Zoom Level", - "enter-zoom-level": "Enter zoom level (50-300%):", - "board-view-cal": "Calendar", - "board-view-swimlanes": "Swimlanes", - "board-view-collapse": "Collapse", - "board-view-gantt": "Gantt", - "board-view-lists": "Lists", - "bucket-example": "Like \"Bucket List\" for example", - "calendar-previous-month-label": "Previous Month", - "calendar-next-month-label": "Next Month", - "cancel": "Cancel", - "card-archived": "This card is moved to Archive.", - "board-archived": "This board is moved to Archive.", - "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 to Archive to remove it from the board and preserve the activity.", - "card-archive-pop": "Card will not be visible at this list after archiving card.", - "card-archive-suggest-cancel": "You can later restore card from Archive.", - "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", - "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", - "cardCustomField-datePopup-title": "Change date", - "cardCustomFieldsPopup-title": "Edit custom fields", - "cardStartVotingPopup-title": "Start a vote", - "positiveVoteMembersPopup-title": "Proponents", - "negativeVoteMembersPopup-title": "Opponents", - "card-edit-voting": "Edit voting", - "editVoteEndDatePopup-title": "Change vote end date", - "allowNonBoardMembers": "Allow all logged in users", - "vote-question": "Voting question", - "vote-public": "Show who voted what", - "vote-for-it": "for it", - "vote-against": "against", - "deleteVotePopup-title": "Delete vote?", - "vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.", - "cardStartPlanningPokerPopup-title": "Start a Planning Poker", - "card-edit-planning-poker": "Edit Planning Poker", - "editPokerEndDatePopup-title": "Change Planning Poker vote end date", - "poker-question": "Planning Poker", - "poker-one": "1", - "poker-two": "2", - "poker-three": "3", - "poker-five": "5", - "poker-eight": "8", - "poker-thirteen": "13", - "poker-twenty": "20", - "poker-forty": "40", - "poker-oneHundred": "100", - "poker-unsure": "?", - "poker-finish": "Finish", - "poker-result-votes": "Votes", - "poker-result-who": "Who", - "poker-replay": "Replay", - "set-estimation": "Set Estimation", - "deletePokerPopup-title": "Delete planning poker?", - "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", - "cardDeletePopup-title": "Delete Card?", - "cardArchivePopup-title": "Archive Card?", - "cardDetailsActionsPopup-title": "Card Actions", - "cardLabelsPopup-title": "Labels", - "cardMembersPopup-title": "Members", - "cardMorePopup-title": "More", - "cardTemplatePopup-title": "Create template", - "cards": "Cards", - "cards-count": "Cards", - "cards-count-one": "Card", - "casSignIn": "Sign In with CAS", - "cardType-card": "Card", - "cardType-linkedCard": "Linked Card", - "cardType-linkedBoard": "Linked Board", - "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", - "subtasks": "Subtasks", - "checklists": "Checklists", - "click-to-star": "Click to star this board.", - "click-to-unstar": "Click to unstar this board.", - "click-to-enable-auto-width": "Auto list width disabled. Click to enable.", - "click-to-disable-auto-width": "Auto list width enabled. Click to disable.", - "auto-list-width": "Auto list width", - "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 “Archive” button from the home header.", - "close-card": "Close Card", - "color-black": "black", - "color-blue": "blue", - "color-crimson": "crimson", - "color-darkgreen": "darkgreen", - "color-gold": "gold", - "color-gray": "gray", - "color-green": "green", - "color-indigo": "indigo", - "color-lime": "lime", - "color-magenta": "magenta", - "color-mistyrose": "mistyrose", - "color-navy": "navy", - "color-orange": "orange", - "color-paleturquoise": "paleturquoise", - "color-peachpuff": "peachpuff", - "color-pink": "pink", - "color-plum": "plum", - "color-purple": "purple", - "color-red": "red", - "color-saddlebrown": "saddlebrown", - "color-silver": "silver", - "color-sky": "sky", - "color-slateblue": "slateblue", - "color-white": "white", - "color-yellow": "yellow", - "unset-color": "Unset", - "comments": "Comments", - "comment": "Comment", - "comment-placeholder": "Write Comment", - "comment-only": "Comment only", - "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", - "comment-delete": "Are you sure you want to delete the comment?", - "deleteCommentPopup-title": "Delete comment?", - "no-comments": "No comments", - "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", - "worker": "Worker", - "worker-desc": "Can only move cards, assign itself to card and comment.", - "computer": "Computer", - "confirm-subtask-delete-popup": "Are you sure you want to delete subtask?", - "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", - "subtaskDeletePopup-title": "Delete Subtask?", - "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", - "copy-card-link-to-clipboard": "Copy card link to clipboard", - "copy-text-to-clipboard": "Copy text to clipboard", - "linkCardPopup-title": "Link Card", - "searchElementPopup-title": "Search", - "copyCardPopup-title": "Copy Card", - "copyManyCardsPopup-title": "Copy Template to Many Cards", - "copyManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format", - "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", - "chooseBoardSourcePopup-title": "Import board", - "createLabelPopup-title": "Create Label", - "createCustomField": "Create Field", - "createCustomFieldPopup-title": "Create Field", - "current": "current", - "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.", - "custom-field-checkbox": "Checkbox", - "custom-field-currency": "Currency", - "custom-field-currency-option": "Currency Code", - "custom-field-date": "Date", - "custom-field-dropdown": "Dropdown List", - "custom-field-dropdown-none": "(none)", - "custom-field-dropdown-options": "List Options", - "custom-field-dropdown-options-placeholder": "Press enter to add more options", - "custom-field-dropdown-unknown": "(unknown)", - "custom-field-number": "Number", - "custom-field-text": "Text", - "custom-fields": "Custom Fields", - "date": "Date", - "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", - "decline": "Decline", - "default-avatar": "Default avatar", - "delete": "Delete", - "deleteCustomFieldPopup-title": "Delete Custom Field?", - "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", - "editCustomFieldPopup-title": "Edit Field", - "addReactionPopup-title": "Add reaction", - "editCardSpentTimePopup-title": "Change spent time", - "editLabelPopup-title": "Change Label", - "editNotificationPopup-title": "Edit Notification", - "editProfilePopup-title": "Edit Profile", - "email": "Email", - "email-address": "Email Address", - "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-vertical-scrollbars": "Enable vertical scrollbars", - "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-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) 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-orgname-taken": "This organization name is already taken", - "error-teamname-taken": "This team name is already taken", - "error-email-taken": "Email has already been taken", - "export-board": "Export board", - "export-board-json": "Export board to JSON", - "export-board-csv": "Export board to CSV", - "export-board-tsv": "Export board to TSV", - "export-board-excel": "Export board to Excel", - "user-can-not-export-excel": "User can not export Excel", - "export-board-html": "Export board to HTML", - "export-card": "Export card", - "export-card-pdf": "Export card to PDF", - "user-can-not-export-card-to-pdf": "User can not export card to PDF", - "exportBoardPopup-title": "Export board", - "exportCardPopup-title": "Export card", - "sort": "Sort", - "sorted": "Sorted", - "remove-sort": "Remove sort", - "sort-desc": "Click to Sort List", - "list-sort-by": "Sort the List By:", - "list-label-modifiedAt": "Last Access Time", - "list-label-title": "Name of the List", - "list-label-sort": "Your Manual Order", - "list-label-short-modifiedAt": "(L)", - "list-label-short-title": "(N)", - "list-label-short-sort": "(M)", - "filter": "Filter", - "filter-cards": "Filter Cards or Lists", - "filter-dates-label": "Filter by date", - "filter-no-due-date": "No due date", - "filter-overdue": "Overdue", - "filter-due-today": "Due today", - "filter-due-this-week": "Due this week", - "filter-due-next-week": "Due next week", - "filter-due-tomorrow": "Due tomorrow", - "list-filter-label": "Filter List by Title", - "filter-clear": "Clear filter", - "filter-labels-label": "Filter by label", - "filter-no-label": "No label", - "filter-member-label": "Filter by member", - "filter-no-member": "No member", - "filter-assignee-label": "Filter by assignee", - "filter-no-assignee": "No assignee", - "filter-custom-fields-label": "Filter by Custom Fields", - "filter-no-custom-fields": "No Custom Fields", - "filter-show-archive": "Show archived lists", - "filter-hide-empty": "Hide empty lists", - "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", - "other-filters-label": "Other Filters", - "advanced-filter-label": "Advanced Filter", - "advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i", - "fullname": "Full Name", - "header-logo-title": "Go back to your boards page.", - "show-activities": "Show Activities", - "headerBarCreateBoardPopup-title": "Create Board", - "home": "Home", - "import": "Import", - "impersonate-user": "Impersonate user", - "link": "Link", - "import-board": "import board", - "import-board-c": "Import board", - "import-board-title-trello": "Import board from Trello", - "import-board-title-wekan": "Import board from previous export", - "import-board-title-csv": "Import board from CSV/TSV", - "from-trello": "From Trello", - "from-wekan": "From previous export", - "from-csv": "From CSV/TSV", - "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-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .", - "import-board-instruction-wekan": "In your board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.", - "import-board-instruction-about-errors": "If you get errors when importing board, sometimes importing still works, and board is at All Boards page.", - "import-json-placeholder": "Paste your valid JSON data here", - "import-csv-placeholder": "Paste your valid CSV/TSV 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 your users", - "import-members-map-note": "Note: Unmapped members will be assigned to the current user.", - "import-show-user-mapping": "Review members mapping", - "import-user-select": "Pick your existing user you want to use as this member", - "importMapMembersAddPopup-title": "Select 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 Archive", - "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Archive and bring them back to the board, click “Menu” > “Archive”.", - "list-move-cards": "Move all cards in this list", - "list-select-cards": "Select all cards in this list", - "set-color-list": "Set Color", - "listActionPopup-title": "List Actions", - "settingsUserPopup-title": "User Settings", - "settingsTeamPopup-title": "Team Settings", - "settingsOrgPopup-title": "Organization Settings", - "swimlaneActionPopup-title": "Swimlane Actions", - "swimlaneAddPopup-title": "Add a Swimlane below", - "listImportCardPopup-title": "Import a Trello card", - "listImportCardsTsvPopup-title": "Import Excel CSV/TSV", - "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 Archive 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", - "grey-icons": "Grey Icons", - "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", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", - "multi-selection": "Multi-Selection", - "multi-selection-label": "Set label for selection", - "multi-selection-member": "Set member for 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 Archive.", - "no-archived-lists": "No lists in Archive.", - "no-archived-swimlanes": "No swimlanes in Archive.", - "no-results": "No results", - "normal": "Normal", - "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", - "not-accepted-yet": "Invitation not accepted yet", - "notify-participate": "Receive updates to any cards you participate as creator or member", - "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", - "optional": "optional", - "or": "or", - "page-maybe-private": "This page may be private. You may be able to view it by logging in.", - "page-not-found": "Page not found.", - "password": "Password", - "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)", - "participating": "Participating", - "preview": "Preview", - "previewAttachedImagePopup-title": "Preview", - "previewClipboardImagePopup-title": "Preview", - "private": "Private", - "private-desc": "This board is private. Only people added to the board can view and edit it.", - "profile": "Profile", - "public": "Public", - "public-desc": "This board is public. It's visible to anyone with the link and will show up in search engines like Google. Only people added to the board can edit.", - "quick-access-description": "Star a board to add a shortcut in this bar.", - "remove-cover": "Remove cover image from minicard", - "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", - "rescue-card-description": "Show rescue dialogue before closing for unsaved card descriptions", - "rescue-card-description-dialogue": "Overwrite current card description with your changes?", - "save": "Save", - "search": "Search", - "rules": "Rules", - "search-cards": "Search from card/list titles, descriptions and custom fields on this board", - "search-example": "Write text you search and press Enter", - "select-color": "Select Color", - "select-board": "Select Board", - "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list", - "setWipLimitPopup-title": "Set WIP Limit", - "shortcut-add-self": "Add yourself to current card", - "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-filter-my-assigned-cards": "Filter my assigned cards", - "shortcut-show-shortcuts": "Bring up this shortcuts list", - "shortcut-toggle-filterbar": "Toggle Filter Sidebar", - "shortcut-toggle-searchbar": "Toggle Search 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", - "toggle-assignees": "Toggle assignees 1-9 for card (By order of addition to board).", - "toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9", - "remove-labels-multiselect": "Multi-Selection removes labels 1-9", - "tracking": "Tracking", - "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", - "type": "Type", - "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", - "uploading-files": "Uploading files", - "upload-failed": "Upload failed", - "upload-completed": "Upload completed", - "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL", - "custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL", - "custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27", - "custom-login-logo-image-url": "Custom Login Logo Image URL", - "custom-login-logo-link-url": "Custom Login Logo Link URL", - "custom-help-link-url": "Custom Help Link URL", - "text-below-custom-login-logo": "Text below Custom Login Logo", - "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", - "username": "Username", - "import-usernames": "Import Usernames", - "view-it": "View it", - "warn-list-archived": "warning: this card is in an list at Archive", - "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", - "card-templates-swimlane": "Card Templates", - "list-templates-swimlane": "List Templates", - "board-templates-swimlane": "Board Templates", - "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", - "disable-forgot-password": "Disable Forgot Password", - "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 kanban board 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", - "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.", - "webhook-title": "Webhook Name", - "webhook-token": "Token (Optional for Authentication)", - "outgoing-webhooks": "Outgoing Webhooks", - "bidirectional-webhooks": "Two-Way Webhooks", - "outgoingWebhooksPopup-title": "Outgoing Webhooks", - "boardCardTitlePopup-title": "Card Title Filter", - "disable-webhook": "Disable This Webhook", - "global-webhook": "Global Webhooks", - "new-outgoing-webhook": "New Outgoing Webhook", - "no-name": "(Unknown)", - "Node_version": "Node version", - "Meteor_version": "Meteor version", - "MongoDB_version": "MongoDB version", - "MongoDB_storage_engine": "MongoDB storage engine", - "MongoDB_Oplog_enabled": "MongoDB Oplog enabled", - "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", - "days": "days", - "hours": "hours", - "minutes": "minutes", - "seconds": "seconds", - "show-field-on-card": "Show this field on card", - "automatically-field-on-card": "Add field to new cards", - "always-field-on-card": "Add field to all cards", - "showLabel-field-on-card": "Show field label on minicard", - "showSum-field-on-list": "Show sum of fields at top of list", - "yes": "Yes", - "no": "No", - "accounts": "Accounts", - "accounts-allowEmailChange": "Allow Email Change", - "accounts-allowUserNameChange": "Allow Username Change", - "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", - "tableVisibilityMode" : "Boards visibility", - "createdAt": "Created at", - "modifiedAt": "Modified 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", - "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", - "setCardActionsColorPopup-title": "Choose a color", - "setSwimlaneColorPopup-title": "Choose a color", - "setListColorPopup-title": "Choose a color", - "assigned-by": "Assigned By", - "requested-by": "Requested By", - "card-sorting-by-number": "Card sorting by number", - "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.", - "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", - "boardDeletePopup-title": "Delete Board?", - "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", - "default-subtasks-board": "Subtasks for __board__ board", - "default": "Default", - "defaultdefault": "Default", - "queue": "Queue", - "subtask-settings": "Subtasks Settings", - "card-settings": "Card Settings", - "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", - "boardCardSettingsPopup-title": "Card Settings", - "boardMinicardSettingsPopup-title": "Minicard Settings", - "deposit-subtasks-board": "Deposit subtasks to this board:", - "deposit-subtasks-list": "Landing list for subtasks deposited here:", - "show-parent-in-minicard": "Show parent in minicard:", - "description-on-minicard": "Description on minicard", - "cover-attachment-on-minicard": "Cover image on minicard", - "badge-attachment-on-minicard": "Count of attachments on minicard", - "card-sorting-by-number-on-minicard": "Card sorting by number on minicard", - "prefix-with-full-path": "Prefix with full path", - "prefix-with-parent": "Prefix with parent", - "subtext-with-full-path": "Subtext with full path", - "subtext-with-parent": "Subtext with parent", - "change-card-parent": "Change card's parent", - "parent-card": "Parent card", - "source-board": "Source board", - "no-parent": "Don't show parent", - "activity-added-label": "added label '%s' to %s", - "activity-removed-label": "removed label '%s' from %s", - "activity-delete-attach": "deleted an attachment from %s", - "activity-added-label-card": "added label '%s'", - "activity-removed-label-card": "removed label '%s'", - "activity-delete-attach-card": "deleted an attachment", - "activity-set-customfield": "set custom field '%s' to '%s' in %s", - "activity-unset-customfield": "unset custom field '%s' in %s", - "r-rule": "Rule", - "r-add-trigger": "Add trigger", - "r-add-action": "Add action", - "r-board-rules": "Board rules", - "r-add-rule": "Add rule", - "r-view-rule": "View rule", - "r-delete-rule": "Delete rule", - "r-new-rule-name": "New rule title", - "r-no-rules": "No rules", - "r-trigger": "Trigger", - "r-action": "Action", - "r-when-a-card": "When a card", - "r-is": "is", - "r-is-moved": "is moved", - "r-added-to": "Added to", - "r-removed-from": "Removed from", - "r-the-board": "the board", - "r-list": "list", - "set-filter": "Set Filter", - "r-moved-to": "Moved to", - "r-moved-from": "Moved from", - "r-archived": "Moved to Archive", - "r-unarchived": "Restored from Archive", - "r-a-card": "a card", - "r-when-a-label-is": "When a label is", - "r-when-the-label": "When the label", - "r-list-name": "list name", - "r-when-a-member": "When a member is", - "r-when-the-member": "When the member", - "r-name": "name", - "r-when-a-attach": "When an attachment", - "r-when-a-checklist": "When a checklist is", - "r-when-the-checklist": "When the checklist", - "r-completed": "Completed", - "r-made-incomplete": "Made incomplete", - "r-when-a-item": "When a checklist item is", - "r-when-the-item": "When the checklist item", - "r-checked": "Checked", - "r-unchecked": "Unchecked", - "r-move-card-to": "Move card to", - "r-top-of": "Top of", - "r-bottom-of": "Bottom of", - "r-its-list": "its list", - "r-archive": "Move to Archive", - "r-unarchive": "Restore from Archive", - "r-card": "card", - "r-add": "Add", - "r-remove": "Remove", - "r-label": "label", - "r-member": "member", - "r-remove-all": "Remove all members from the card", - "r-set-color": "Set color to", - "r-checklist": "checklist", - "r-check-all": "Check all", - "r-uncheck-all": "Uncheck all", - "r-items-check": "items of checklist", - "r-check": "Check", - "r-uncheck": "Uncheck", - "r-item": "item", - "r-of-checklist": "of checklist", - "r-send-email": "Send an email", - "r-to": "to", - "r-of": "of", - "r-subject": "subject", - "r-rule-details": "Rule details", - "r-d-move-to-top-gen": "Move card to top of its list", - "r-d-move-to-top-spec": "Move card to top of list", - "r-d-move-to-bottom-gen": "Move card to bottom of its list", - "r-d-move-to-bottom-spec": "Move card to bottom of list", - "r-d-send-email": "Send email", - "r-d-send-email-to": "to", - "r-d-send-email-subject": "subject", - "r-d-send-email-message": "message", - "r-d-archive": "Move card to Archive", - "r-d-unarchive": "Restore card from Archive", - "r-d-add-label": "Add label", - "r-d-remove-label": "Remove label", - "r-create-card": "Create new card", - "r-in-list": "in list", - "r-in-swimlane": "in swimlane", - "r-d-add-member": "Add member", - "r-d-remove-member": "Remove member", - "r-d-remove-all-member": "Remove all member", - "r-d-check-all": "Check all items of a list", - "r-d-uncheck-all": "Uncheck all items of a list", - "r-d-check-one": "Check item", - "r-d-uncheck-one": "Uncheck item", - "r-d-check-of-list": "of checklist", - "r-d-add-checklist": "Add checklist", - "r-d-remove-checklist": "Remove checklist", - "r-by": "by", - "r-add-checklist": "Add checklist", - "r-with-items": "with items", - "r-items-list": "item1,item2,item3", - "r-add-swimlane": "Add swimlane", - "r-swimlane-name": "swimlane name", - "r-board-note": "Note: leave a field empty to match every possible value. ", - "r-checklist-note": "Note: checklist's items have to be written as comma separated values.", - "r-when-a-card-is-moved": "When a card is moved to another list", - "r-set": "Set", - "r-update": "Update", - "r-datefield": "date field", - "r-df-start-at": "start", - "r-df-due-at": "due", - "r-df-end-at": "end", - "r-df-received-at": "received", - "r-to-current-datetime": "to current date/time", - "r-remove-value-from": "Remove value from", - "r-link-card": "Link card to", - "ldap": "LDAP", - "oauth2": "OAuth2", - "cas": "CAS", - "authentication-method": "Authentication method", - "authentication-type": "Authentication type", - "custom-product-name": "Custom Product Name", - "layout": "Layout", - "hide-logo": "Hide Logo", - "hide-card-counter-list": "Hide card counter list on All Boards", - "hide-board-member-list": "Hide board member list on All Boards", - "add-custom-html-after-body-start": "Add Custom HTML after start", - "add-custom-html-before-body-end": "Add Custom HTML before end", - "error-undefined": "Something went wrong", - "error-ldap-login": "An error occurred while trying to login", - "display-authentication-method": "Display Authentication Method", - "oidc-button-text": "Customize the OIDC button text", - "default-authentication-method": "Default Authentication Method", - "duplicate-board": "Duplicate Board", - "duplicate-board-confirm": "Are you sure you want to duplicate this board?", - "org-number": "The number of organizations is: ", - "team-number": "The number of teams is: ", - "people-number": "The number of people is: ", - "swimlaneDeletePopup-title": "Delete Swimlane ?", - "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.", - "restore-all": "Restore all", - "delete-all": "Delete all", - "loading": "Loading, please wait.", - "previous_as": "last time was", - "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__", - "act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)", - "act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)", - "act-a-receivedAt": "modified received time to __timeValue__ from (__timeOldValue__)", - "a-dueAt": "modified due time to be", - "a-endAt": "modified ending time to be", - "a-startAt": "modified starting time to be", - "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", - "almostdue": "current due time %s is approaching", - "pastdue": "current due time %s is past", - "duenow": "current due time %s is today", - "act-newDue": "__list__/__card__ has 1st due reminder [__board__]", - "act-withDue": "__list__/__card__ due reminders [__board__]", - "act-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching", - "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past", - "act-duenow": "was reminding the current due (__timeValue__) of __card__ is now", - "act-atUserComment": "You were mentioned in [__board__] __list__/__card__", - "delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.", - "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", - "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", - "accounts-allowUserDelete": "Allow users to self delete their account", - "hide-minicard-label-text": "Hide minicard label text", - "show-desktop-drag-handles": "Show desktop drag handles", - "assignee": "Assignee", - "cardAssigneesPopup-title": "Assignee", - "addmore-detail": "Add a more detailed description", - "show-on-card": "Show on Card", - "show-on-minicard": "Show on Minicard", - "new": "New", - "editOrgPopup-title": "Edit Organization", - "newOrgPopup-title": "New Organization", - "editTeamPopup-title": "Edit Team", - "newTeamPopup-title": "New Team", - "editUserPopup-title": "Edit User", - "newUserPopup-title": "New User", - "notifications": "Notifications", - "help": "Help", - "view-all": "View All", - "filter-by-unread": "Filter by Unread", - "mark-all-as-read": "Mark all as read", - "remove-all-read": "Remove all read", - "allow-rename": "Allow Rename", - "allowRenamePopup-title": "Allow Rename", - "start-day-of-week": "Set day of the week start", - "monday": "Monday", - "tuesday": "Tuesday", - "wednesday": "Wednesday", - "thursday": "Thursday", - "friday": "Friday", - "saturday": "Saturday", - "sunday": "Sunday", - "status": "Status", - "swimlane": "Swimlane", - "owner": "Owner", - "last-modified-at": "Last modified at", - "last-activity": "Last activity", - "voting": "Voting", - "archived": "Archived", - "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has", - "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list", - "hide-checked-items": "Hide checked items", - "hide-finished-checklist": "Hide finished checklist", - "task": "Task", - "create-task": "Create Task", - "ok": "OK", - "organizations": "Organizations", - "teams": "Teams", - "displayName": "Display Name", - "shortName": "Short Name", - "autoAddUsersWithDomainName": "Automatically add users with the domain name", - "website": "Website", - "person": "Person", - "my-cards": "My Cards", - "card": "Card", - "list": "List", - "board": "Board", - "context-separator": "/", - "myCardsViewChange-title": "My Cards View", - "myCardsViewChangePopup-title": "My Cards View", - "myCardsViewChange-choice-boards": "Boards", - "myCardsViewChange-choice-table": "Table", - "myCardsSortChange-title": "My Cards Sort", - "myCardsSortChangePopup-title": "My Cards Sort", - "myCardsSortChange-choice-board": "By Board", - "myCardsSortChange-choice-dueat": "By Due Date", - "dueCards-title": "Due Cards", - "dueCardsViewChange-title": "Due Cards View", - "dueCardsViewChangePopup-title": "Due Cards View", - "dueCardsViewChange-choice-me": "Me", - "dueCardsViewChange-choice-all": "All Users", - "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", - "broken-cards": "Broken Cards", - "board-title-not-found": "Board '%s' not found.", - "swimlane-title-not-found": "Swimlane '%s' not found.", - "list-title-not-found": "List '%s' not found.", - "label-not-found": "Label '%s' not found.", - "label-color-not-found": "Label color %s not found.", - "user-username-not-found": "Username '%s' not found.", - "comment-not-found": "Card with comment containing text '%s' not found.", - "org-name-not-found": "Organization '%s' not found.", - "team-name-not-found": "Team '%s' not found.", - "globalSearch-title": "Search All Boards", - "no-cards-found": "No Cards Found", - "one-card-found": "One Card Found", - "n-cards-found": "%s Cards Found", - "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", - "operator-board": "board", - "operator-board-abbrev": "b", - "operator-swimlane": "swimlane", - "operator-swimlane-abbrev": "s", - "operator-list": "list", - "operator-list-abbrev": "l", - "operator-label": "label", - "operator-label-abbrev": "#", - "operator-user": "user", - "operator-user-abbrev": "@", - "operator-member": "member", - "operator-member-abbrev": "m", - "operator-assignee": "assignee", - "operator-assignee-abbrev": "a", - "operator-creator": "creator", - "operator-status": "status", - "operator-due": "due", - "operator-created": "created", - "operator-modified": "modified", - "operator-sort": "sort", - "operator-comment": "comment", - "operator-has": "has", - "operator-limit": "limit", - "operator-debug": "debug", - "operator-org": "org", - "operator-team": "team", - "predicate-archived": "archived", - "predicate-open": "open", - "predicate-ended": "ended", - "predicate-all": "all", - "predicate-overdue": "overdue", - "predicate-week": "week", - "predicate-month": "month", - "predicate-quarter": "quarter", - "predicate-year": "year", - "predicate-due": "due", - "predicate-modified": "modified", - "predicate-created": "created", - "predicate-attachment": "attachment", - "predicate-description": "description", - "predicate-checklist": "checklist", - "predicate-start": "start", - "predicate-end": "end", - "predicate-assignee": "assignee", - "predicate-member": "member", - "predicate-public": "public", - "predicate-private": "private", - "predicate-selector": "selector", - "predicate-projection": "projection", - "operator-unknown-error": "%s is not an operator", - "operator-number-expected": "operator __operator__ expected a number, got '__value__'", - "operator-sort-invalid": "sort of '%s' is invalid", - "operator-status-invalid": "'%s' is not a valid status", - "operator-has-invalid": "%s is not a valid existence check", - "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", - "operator-debug-invalid": "%s is not a valid debug predicate", - "next-page": "Next Page", - "previous-page": "Previous Page", - "heading-notes": "Notes", - "globalSearch-instructions-heading": "Search Instructions", - "globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).", - "globalSearch-instructions-operators": "Available operators:", - "globalSearch-instructions-operator-board": "`__operator_board__:` - cards in boards matching the specified *<title>*", - "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - cards in lists matching the specified *<title>*", - "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", - "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", - "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", - "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", - "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", - "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", - "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*", - "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", - "globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cards belonging to a board assigned to organization *<name>*", - "globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cards belonging to a board assigned to team *<name>*", - "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now. `__operator_due__:__predicate_overdue__ lists all cards past their due date.", - "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less", - "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less", - "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:", - "globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards", - "globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards", - "globalSearch-instructions-status-ended": "`__predicate_ended__` - cards with an end date", - "globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards", - "globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards", - "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`. Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).", - "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`. For a descending sort, place a `-` in front of the sort name.", - "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.", - "globalSearch-instructions-notes-1": "Multiple operators may be specified.", - "globalSearch-instructions-notes-2": "Similar operators are *OR*ed together. Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.", - "globalSearch-instructions-notes-3": "Differing operators are *AND*ed together. Only cards that match all of the differing operators are returned. `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.", - "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.", - "globalSearch-instructions-notes-4": "Text searches are case insensitive.", - "globalSearch-instructions-notes-5": "By default archived cards are not searched.", - "link-to-search": "Link to this search", - "excel-font": "Arial", - "number": "Number", - "label-colors": "Label Colors", - "label-names": "Label Names", - "archived-at": "archived at", - "sort-cards": "Sort Cards", - "sort-is-on": "Sort is on", - "cardsSortPopup-title": "Sort Cards", - "due-date": "Due Date", - "server-error": "Server Error", - "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", - "title-alphabetically": "Title (Alphabetically)", - "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)", - "links-heading": "Links", - "hide-activities-of-all-boards": "Don't show the board activities on all boards", - "now-activities-of-all-boards-are-hidden": "Now all activities of all boards are hidden", - "move-swimlane": "Move Swimlane", - "moveSwimlanePopup-title": "Move Swimlane", - "custom-field-stringtemplate": "String Template", - "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", - "custom-field-stringtemplate-separator": "Separator (use or   for a space)", - "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", - "creator": "Creator", - "creator-on-minicard": "Creator on minicard", - "filesReportTitle": "Files Report", - "reports": "Reports", - "rulesReportTitle": "Rules Report", - "boardsReportTitle": "Boards Report", - "cardsReportTitle": "Cards Report", - "copy-swimlane": "Copy Swimlane", - "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner", - "Bounce": "Bounce Wait Spinner", - "Cube": "Cube Wait Spinner", - "Cube-Grid": "Cube-Grid Wait Spinner", - "Dot": "Dot Wait Spinner", - "Double-Bounce": "Double Bounce Wait Spinner", - "Rotateplane": "Rotateplane Wait Spinner", - "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner", - "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card", - "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", - "subject": "Subject", - "details": "Details", - "carbon-copy": "Carbon Copy (Cc:)", - "ticket": "Ticket", - "tickets": "Tickets", - "ticket-number": "Ticket Number", - "open": "Open", - "pending": "Pending", - "closed": "Closed", - "resolved": "Resolved", - "cancelled": "Cancelled", - "history": "History", - "request": "Request", - "requests": "Requests", - "help-request": "Help Request", - "editCardSortOrderPopup-title": "Change Sorting", - "cardDetailsPopup-title": "Card Details", - "add-teams": "Add teams", - "add-teams-label": "Added teams are displayed below:", - "remove-team-from-table": "Are you sure you want to remove this team from the board ?", - "confirm-btn": "Confirm", - "remove-btn": "Remove", - "filter-card-title-label": "Filter by card title", - "invite-people-success": "Invitation to register sent with success", - "invite-people-error": "Error while sending invitation to register", - "can-invite-if-same-mailDomainName": "Email domain name", - "to-create-teams-contact-admin": "To create teams, please contact the administrator.", - "Node_heap_total_heap_size": "Node heap: total heap size", - "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", - "Node_heap_total_physical_size": "Node heap: total physical size", - "Node_heap_total_available_size": "Node heap: total available size", - "Node_heap_used_heap_size": "Node heap: used heap size", - "Node_heap_heap_size_limit": "Node heap: heap size limit", - "Node_heap_malloced_memory": "Node heap: malloced memory", - "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", - "Node_heap_does_zap_garbage": "Node heap: does zap garbage", - "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", - "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", - "Node_memory_usage_rss": "Node memory usage: resident set size", - "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", - "Node_memory_usage_heap_used": "Node memory usage: actual memory used", - "Node_memory_usage_external": "Node memory usage: external", - "add-organizations": "Add organizations", - "add-organizations-label": "Added organizations are displayed below:", - "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", - "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", - "custom-legal-notice-link-url": "Custom legal notice page URL", - "acceptance_of_our_legalNotice": "By continuing, you accept our", - "legalNotice": "legal notice", - "copied": "Copied!", - "checklistActionsPopup-title": "Checklist Actions", - "moveChecklist": "Move Checklist", - "moveChecklistPopup-title": "Move Checklist", - "newlineBecomesNewChecklistItem": "Each line of text becomes one of the checklist items", - "newLineNewItem": "One line of text = one checklist item", - "newlineBecomesNewChecklistItemOriginOrder": "Each line of text becomes one of the checklist items, original order", - "originOrder": "original order", - "copyChecklist": "Copy Checklist", - "copyChecklistPopup-title": "Copy Checklist", - "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions", - "attachmentActionsPopup-title": "Attachment Actions", - "attachment-move-storage-fs": "Move attachment to filesystem", - "attachment-move-storage-gridfs": "Move attachment to GridFS", - "attachment-move-storage-s3": "Move attachment to S3", - "attachment-move": "Move Attachment", - "move-all-attachments-to-fs": "Move all attachments to filesystem", - "move-all-attachments-to-gridfs": "Move all attachments to GridFS", - "move-all-attachments-to-s3": "Move all attachments to S3", - "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", - "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", - "move-all-attachments-of-board-to-s3": "Move all attachments of board to S3", - "path": "Path", - "version-name": "Version-Name", - "size": "Size", - "storage": "Storage", - "action": "Action", - "board-title": "Board Title", - "attachmentRenamePopup-title": "Rename", - "uploading": "Uploading", - "remaining_time": "Remaining time", - "speed": "Speed", - "progress": "Progress", - "password-again": "Password (again)", - "if-you-already-have-an-account": "If you already have an account", - "register": "Register", - "forgot-password": "Forgot password", - "minicardDetailsActionsPopup-title": "Card Details", - "Mongo_sessions_count": "Mongo sessions count", - "change-visibility": "Change Visibility", - "max-upload-filesize": "Max upload filesize in bytes:", - "allowed-upload-filetypes": "Allowed upload filetypes:", - "max-avatar-filesize": "Max avatar filesize in bytes:", - "allowed-avatar-filetypes": "Allowed avatar filetypes:", - "invalid-file": "If filename is invalid, upload or rename is cancelled.", - "preview-pdf-not-supported": "Your device does not support previewing PDF. Try downloading instead.", - "drag-board": "Drag board", - "translation-number": "The number of custom translation strings is:", - "delete-translation-confirm-popup": "Are you sure you want to delete this custom translation string? There is no undo.", - "newTranslationPopup-title": "New custom translation string", - "editTranslationPopup-title": "Edit custom translation string", - "settingsTranslationPopup-title": "Delete this custom translation string?", - "translation": "Translation", - "text": "Text", - "translation-text": "Translation text", - "show-subtasks-field": "Show subtasks field", - "show-week-of-year": "Show week of year (ISO 8601)", - "convert-to-markdown": "Convert to markdown", - "import-board-zip": "Add .zip file that has board JSON files, and board name subdirectories with attachments", - "collapse": "Collapse", - "uncollapse": "Uncollapse", - "hideCheckedChecklistItems": "Hide checked checklist items", - "hideAllChecklistItems": "Hide all checklist items", - "support": "Support", - "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", - "accessibility": "Accessibility", - "accessibility-page-enabled": "Accessibility page enabled", - "accessibility-info-not-added-yet": "Accessibility info has not been added yet", - "accessibility-title": "Accessibility title", - "accessibility-content": "Accessibility content", - "accounts-lockout-settings": "Brute Force Protection Settings", - "accounts-lockout-info": "These settings control how login attempts are protected against brute force attacks.", - "accounts-lockout-known-users": "Settings for known users (correct username, wrong password)", - "accounts-lockout-unknown-users": "Settings for unknown users (non-existent username)", - "accounts-lockout-failures-before": "Failures before lockout", - "accounts-lockout-period": "Lockout period (seconds)", - "accounts-lockout-failure-window": "Failure window (seconds)", - "accounts-lockout-settings-updated": "Brute force protection settings have been updated", - "accounts-lockout-locked-users": "Locked Users", - "accounts-lockout-locked-users-info": "Users currently locked out due to too many failed login attempts", - "accounts-lockout-no-locked-users": "There are currently no locked users", - "accounts-lockout-failed-attempts": "Failed Attempts", - "accounts-lockout-remaining-time": "Remaining Time", - "accounts-lockout-user-unlocked": "User has been unlocked successfully", - "accounts-lockout-confirm-unlock": "Are you sure you want to unlock this user?", - "accounts-lockout-confirm-unlock-all": "Are you sure you want to unlock all locked users?", - "accounts-lockout-show-locked-users": "Show locked users only", - "accounts-lockout-user-locked": "User is locked", - "accounts-lockout-click-to-unlock": "Click to unlock this user", - "accounts-lockout-status": "Status", - "admin-people-filter-show": "Show:", - "admin-people-filter-all": "All Users", - "admin-people-filter-locked": "Locked Users Only", - "admin-people-filter-active": "Active", - "admin-people-filter-inactive": "Not Active", - "admin-people-active-status": "Active Status", - "admin-people-user-active": "User is active - click to deactivate", - "admin-people-user-inactive": "User is inactive - click to activate", - "accounts-lockout-all-users-unlocked": "All locked users have been unlocked", - "accounts-lockout-unlock-all": "Unlock All", - "active-cron-jobs": "Active Scheduled Jobs", - "add-cron-job": "Add Scheduled Job", - "add-cron-job-placeholder": "Add Scheduled Job functionality coming soon", - "attachment-storage-configuration": "Attachment Storage Configuration", - "attachments-path": "Attachments Path", - "attachments-path-description": "Path where attachment files are stored", - "avatars-path": "Avatars Path", - "avatars-path-description": "Path where avatar files are stored", - "board-archive-failed": "Failed to schedule board archive", - "board-archive-scheduled": "Board archive scheduled successfully", - "board-backup-failed": "Failed to schedule board backup", - "board-backup-scheduled": "Board backup scheduled successfully", - "board-cleanup-failed": "Failed to schedule board cleanup", - "board-cleanup-scheduled": "Board cleanup scheduled successfully", - "board-operations": "Board Operations", - "cron-jobs": "Scheduled Jobs", - "cron-migrations": "Scheduled Migrations", - "cron-job-delete-confirm": "Are you sure you want to delete this scheduled job?", - "cron-job-delete-failed": "Failed to delete scheduled job", - "cron-job-deleted": "Scheduled job deleted successfully", - "cron-job-pause-failed": "Failed to pause scheduled job", - "cron-job-paused": "Scheduled job paused successfully", - "filesystem-path-description": "Base path for file storage", - "gridfs-enabled": "GridFS Enabled", - "gridfs-enabled-description": "Use MongoDB GridFS for file storage", - "migration-pause-failed": "Failed to pause migrations", - "migration-paused": "Migrations paused successfully", - "migration-progress": "Migration Progress", - "migration-start-failed": "Failed to start migrations", - "migration-started": "Migrations started successfully", - "migration-status": "Migration Status", - "migration-stop-confirm": "Are you sure you want to stop all migrations?", - "migration-stop-failed": "Failed to stop migrations", - "migration-stopped": "Migrations stopped successfully", - "mongodb-gridfs-storage": "MongoDB GridFS Storage", - "pause-all-migrations": "Pause All Migrations", - "s3-access-key": "S3 Access Key", - "s3-access-key-description": "AWS S3 access key for authentication", - "s3-access-key-placeholder": "Enter S3 access key", - "s3-bucket": "S3 Bucket", - "s3-bucket-description": "S3 bucket name for storing files", - "s3-connection-failed": "S3 connection failed", - "s3-connection-success": "S3 connection successful", - "s3-enabled": "S3 Enabled", - "s3-enabled-description": "Use AWS S3 or MinIO for file storage", - "s3-endpoint": "S3 Endpoint", - "s3-endpoint-description": "S3 endpoint URL (e.g., s3.amazonaws.com or minio.example.com)", - "s3-minio-storage": "S3/MinIO Storage", - "s3-port": "S3 Port", - "s3-port-description": "S3 endpoint port number", - "s3-region": "S3 Region", - "s3-region-description": "AWS S3 region (e.g., us-east-1)", - "s3-secret-key": "S3 Secret Key", - "s3-secret-key-description": "AWS S3 secret key for authentication", - "s3-secret-key-placeholder": "Enter S3 secret key", - "s3-secret-key-required": "S3 secret key is required", - "s3-settings-save-failed": "Failed to save S3 settings", - "s3-settings-saved": "S3 settings saved successfully", - "s3-ssl-enabled": "S3 SSL Enabled", - "s3-ssl-enabled-description": "Use SSL/TLS for S3 connections", - "save-s3-settings": "Save S3 Settings", - "schedule-board-archive": "Schedule Board Archive", - "schedule-board-backup": "Schedule Board Backup", - "schedule-board-cleanup": "Schedule Board Cleanup", - "scheduled-board-operations": "Scheduled Board Operations", - "start-all-migrations": "Start All Migrations", - "stop-all-migrations": "Stop All Migrations", - "test-s3-connection": "Test S3 Connection", - "writable-path": "Writable Path", - "writable-path-description": "Base directory path for file storage", - "add-job": "Add Job", - "attachment-migration": "Attachment Migration", - "attachment-monitoring": "Attachment Monitoring", - "attachment-settings": "Attachment Settings", - "attachment-storage-settings": "Storage Settings", - "automatic-migration": "Automatic Migration", - "back-to-settings": "Back to Settings", - "board-id": "Board ID", - "board-migration": "Board Migration", - "board-migrations": "Board Migrations", - "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", - "cleanup": "Cleanup", - "cleanup-old-jobs": "Cleanup Old Jobs", - "completed": "Completed", - "conversion-info-text": "This conversion is performed once per board and improves performance. You can continue using the board normally.", - "converting-board": "Converting Board", - "converting-board-description": "Converting board structure for improved functionality. This may take a few moments.", - "cpu-cores": "CPU Cores", - "cpu-usage": "CPU Usage", - "current-action": "Current Action", - "database-migration": "Database Migration", - "database-migration-description": "Updating database structure for improved functionality and performance. This process may take several minutes.", - "database-migrations": "Database Migrations", - "days-old": "Days Old", - "duration": "Duration", - "errors": "Errors", - "estimated-time-remaining": "Estimated time remaining", - "every-1-day": "Every 1 day", - "every-1-hour": "Every 1 hour", - "every-1-minute": "Every 1 minute", - "every-10-minutes": "Every 10 minutes", - "every-30-minutes": "Every 30 minutes", - "every-5-minutes": "Every 5 minutes", - "every-6-hours": "Every 6 hours", - "export-monitoring": "Export Monitoring", - "filesystem-attachments": "Filesystem Attachments", - "filesystem-size": "Filesystem Size", - "filesystem-storage": "Filesystem Storage", - "force-board-scan": "Force Board Scan", - "gridfs-attachments": "GridFS Attachments", - "gridfs-size": "GridFS Size", - "gridfs-storage": "GridFS", - "hide-list-on-minicard": "Hide List on Minicard", - "idle-migration": "Idle Migration", - "job-description": "Job Description", - "job-details": "Job Details", - "job-name": "Job Name", - "job-queue": "Job Queue", - "last-run": "Last Run", - "max-concurrent": "Max Concurrent", - "memory-usage": "Memory Usage", - "migrate-all-to-filesystem": "Migrate All to Filesystem", - "migrate-all-to-gridfs": "Migrate All to GridFS", - "migrate-all-to-s3": "Migrate All to S3", - "migrated-attachments": "Migrated Attachments", - "migration-batch-size": "Batch Size", - "migration-batch-size-description": "Number of attachments to process in each batch (1-100)", - "migration-cpu-threshold": "CPU Threshold (%)", - "migration-cpu-threshold-description": "Pause migration when CPU usage exceeds this percentage (10-90)", - "migration-delay-ms": "Delay (ms)", - "migration-delay-ms-description": "Delay between batches in milliseconds (100-10000)", - "migration-detector": "Migration Detector", - "migration-info-text": "Database migrations are performed once and improve system performance. The process continues in the background even if you close your browser.", - "migration-log": "Migration Log", - "migration-markers": "Migration Markers", - "migration-resume-failed": "Failed to resume migration", - "migration-resumed": "Migration resumed", - "migration-steps": "Migration Steps", - "migration-warning-text": "Please do not close your browser during migration. The process will continue in the background but may take longer to complete.", - "monitoring-export-failed": "Failed to export monitoring data", - "monitoring-refresh-failed": "Failed to refresh monitoring data", - "next": "Next", - "next-run": "Next Run", - "of": "of", - "operation-type": "Operation Type", - "overall-progress": "Overall Progress", - "page": "Page", - "pause": "Pause", - "pause-migration": "Pause Migration", - "previous": "Previous", - "refresh": "Refresh", - "refresh-monitoring": "Refresh Monitoring", - "remaining-attachments": "Remaining Attachments", - "resume-migration": "Resume Migration", - "run-once": "Run once", - "s3-attachments": "S3 Attachments", - "s3-size": "S3 Size", - "s3-storage": "S3", - "scanning-status": "Scanning Status", - "schedule": "Schedule", - "search-boards-or-operations": "Search boards or operations...", - "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", - "showing": "Showing", - "start-test-operation": "Start Test Operation", - "start-time": "Start Time", - "step-progress": "Step Progress", - "stop-migration": "Stop Migration", - "storage-distribution": "Storage Distribution", - "system-resources": "System Resources", - "total-attachments": "Total Attachments", - "total-operations": "Total Operations", - "total-size": "Total Size", - "unmigrated-boards": "Unmigrated Boards", - "weight": "Weight", - "idle": "Idle", - "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" -} diff --git a/imports/i18n/data/af.i18n.json b/imports/i18n/data/af.i18n.json index d48099de1..12e76c28d 100644 --- a/imports/i18n/data/af.i18n.json +++ b/imports/i18n/data/af.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/af_ZA.i18n.json b/imports/i18n/data/af_ZA.i18n.json index 51696450c..0e4378214 100644 --- a/imports/i18n/data/af_ZA.i18n.json +++ b/imports/i18n/data/af_ZA.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/ar-DZ.i18n.json b/imports/i18n/data/ar-DZ.i18n.json index 7e96f7719..726f9caac 100644 --- a/imports/i18n/data/ar-DZ.i18n.json +++ b/imports/i18n/data/ar-DZ.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/ar-EG.i18n.json b/imports/i18n/data/ar-EG.i18n.json index 7e96f7719..726f9caac 100644 --- a/imports/i18n/data/ar-EG.i18n.json +++ b/imports/i18n/data/ar-EG.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/ar.i18n.json b/imports/i18n/data/ar.i18n.json index 10d959d40..61c949733 100644 --- a/imports/i18n/data/ar.i18n.json +++ b/imports/i18n/data/ar.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "تعليق محذوف %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "نماذج", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "إضافة مرفق", @@ -328,16 +316,10 @@ "comment-placeholder": "أكتب تعليق", "comment-only": "التعليق فقط", "comment-only-desc": "يمكن التعليق على بطاقات فقط.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "لا يوجد تعليقات", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "عامل", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "حاسوب", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "نسخ رابط البطاقة إلى الحافظة", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "ربط البطاقة", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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": "إنشاء لوحة", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "استيراد لوحة", "createLabelPopup-title": "إنشاء علامة", "createCustomField": "انشاء حقل", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "تاريخ", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "صورة شخصية افتراضية", "delete": "حذف", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "تصحيح الإشعار", "editProfilePopup-title": "تعديل الملف الشخصي", "email": "البريد الإلكتروني", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "تسجيل الدخول", "loginPopup-title": "تسجيل الدخول", "memberMenuPopup-title": "أفضليات الأعضاء", - "grey-icons": "Grey Icons", "members": "أعضاء", "menu": "القائمة", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "التحرك إلى القاع", "moveCardToTop-title": "التحرك إلى الأعلى", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "تحديد أكثر من واحدة", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "لا توجد نتائج", "normal": "عادي", "normal-desc": "يمكن مشاهدة و تعديل البطاقات. لا يمكن تغيير إعدادات الضبط.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "حدد اللون", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "اختر لوناً", "setSwimlaneColorPopup-title": "اختر لوناً", "setListColorPopup-title": "اختر لوناً", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "انا", "dueCardsViewChange-choice-all": "كل المستخدمين", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "إخفاء جميع عناصر قائمة التحقق", "support": "دعم", "supportPopup-title": "دعم", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "تم تمكين صفحة إمكانية الوصول", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "تفاصيل", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/ary.i18n.json b/imports/i18n/data/ary.i18n.json index 7e96f7719..726f9caac 100644 --- a/imports/i18n/data/ary.i18n.json +++ b/imports/i18n/data/ary.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/ast-ES.i18n.json b/imports/i18n/data/ast-ES.i18n.json index 7e96f7719..726f9caac 100644 --- a/imports/i18n/data/ast-ES.i18n.json +++ b/imports/i18n/data/ast-ES.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/az-AZ.i18n.json b/imports/i18n/data/az-AZ.i18n.json index 7e96f7719..726f9caac 100644 --- a/imports/i18n/data/az-AZ.i18n.json +++ b/imports/i18n/data/az-AZ.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/az-LA.i18n.json b/imports/i18n/data/az-LA.i18n.json index 7e96f7719..726f9caac 100644 --- a/imports/i18n/data/az-LA.i18n.json +++ b/imports/i18n/data/az-LA.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/az.i18n.json b/imports/i18n/data/az.i18n.json index 7e96f7719..726f9caac 100644 --- a/imports/i18n/data/az.i18n.json +++ b/imports/i18n/data/az.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/bg.i18n.json b/imports/i18n/data/bg.i18n.json index 8bf0fb5a8..038753629 100644 --- a/imports/i18n/data/bg.i18n.json +++ b/imports/i18n/data/bg.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "изтрит коментар %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Шаблони", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Добави прикачен файл", @@ -328,16 +316,10 @@ "comment-placeholder": "Напиши коментар", "comment-only": "Само коментар", "comment-only-desc": "Може да коментира само в карти.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "Няма коментари", "no-comments-desc": "Не може да вижда коментари и активност", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Работник", "worker-desc": "Може само да премества карти, да ги добавя към себе си и да коментира", "computer": "Компютър", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Копирай връзката на картата в клипборда", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Свържи картата", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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": "Създай Табло", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Импортирай Табло", "createLabelPopup-title": "Създай Табло", "createCustomField": "Създай Поле", @@ -377,9 +357,9 @@ "custom-fields": "Собствени полета", "date": "Дата", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Отказ", "default-avatar": "Основен аватар", "delete": "Изтрий", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Промени известията", "editProfilePopup-title": "Промяна на профила", "email": "Имейл", - "email-address": "Email Address", "email-enrollAccount-subject": "Ваш профил беше създаден на __siteName__", "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", "email-fail": "Неуспешно изпращане на имейла", @@ -554,7 +533,6 @@ "log-in": "Вход", "loginPopup-title": "Вход", "memberMenuPopup-title": "Настройки на профила", - "grey-icons": "Grey Icons", "members": "Членове", "menu": "Меню", "move-selection": "Премести избраното", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Премести в края", "moveCardToTop-title": "Премести в началото", "moveSelectionPopup-title": "Премести избраното", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Множествен избор", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "Няма резултати", "normal": "Нормално", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Получавате информация за всички табла, списъци и карти, които наблюдавате", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Промени датата на получаване", "editCardEndDatePopup-title": "Промени датата на завършване", "setCardColorPopup-title": "Задай цвят", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Избери цвят", "setSwimlaneColorPopup-title": "Избери цвят", "setListColorPopup-title": "Избери цвят", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "Всички списъци, карти, имена и действия ще бъдат изтрити и няма да можете да възстановите съдържанието на дъската. Няма връщане назад.", "boardDeletePopup-title": "Изтриване на Таблото?", "delete-board": "Изтрий таблото", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Подзадачи за табло __board__", "default": "по подразбиране", "defaultdefault": "по подразбиране", @@ -790,7 +761,7 @@ "subtask-settings": "Настройки на Подзадачите", "card-settings": "Настройки на Карта", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Настройки на Подзадачите", + "boardSubtaskSettingsPopup-title": "Настройки за Подзадачите за това Табло", "boardCardSettingsPopup-title": "Настройки на Карта", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Вложете под-задачи към тази дъска:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Състояние", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Завършено", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/br.i18n.json b/imports/i18n/data/br.i18n.json index 61a8ee09c..36c754973 100644 --- a/imports/i18n/data/br.i18n.json +++ b/imports/i18n/data/br.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Diverkañ", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Izili", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/ca.i18n.json b/imports/i18n/data/ca.i18n.json index 04d6ff5d2..a2213db03 100644 --- a/imports/i18n/data/ca.i18n.json +++ b/imports/i18n/data/ca.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "Ha esborrar el comentari %s", "activity-receivedDate": "editat la data de recepció a %s de %s", "activity-startDate": "data d'inici editada a %s de %s", - "allboards.starred": "Starred", - "allboards.templates": "Plantilles", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "data de venciment editada a %s de %s", "activity-endDate": "data de finalització editada a %s de %s", "add-attachment": "Afegeix adjunt", @@ -328,16 +316,10 @@ "comment-placeholder": "Escriu un comentari", "comment-only": "Només comentaris", "comment-only-desc": "Només pots fer comentaris a les fitxes", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Està segur que vols esborrar el comentari?", "deleteCommentPopup-title": "Esborrar el comentari?", "no-comments": "Sentit comentaris", "no-comments-desc": "No es poden veure els comentaris i activitats.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Treballador", "worker-desc": "Només pot moure cartes, assignar-se a la fitxa i comentar.", "computer": "Ordinador", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Esteu segur que voleu suprimir la llista de comprovació?", "subtaskDeletePopup-title": "Vols suprimir la subtasca?", "checklistDeletePopup-title": "Vols suprimir la llista de comprovació?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copia l'enllaç de la ftixa al porta-retalls", "copy-text-to-clipboard": "Copia el text al porta-retalls", "linkCardPopup-title": "Fitxa d'enllaç", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Afegeix un Contenidor de plantilles", "chooseBoardSourcePopup-title": "Importa tauler", "createLabelPopup-title": "Crea etiqueta", "createCustomField": "Crear campament", @@ -377,9 +357,9 @@ "custom-fields": "Camps Personalitzats", "date": "Dades", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Declina", "default-avatar": "Avatar per defecte", "delete": "Esborra", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edita la notificació", "editProfilePopup-title": "Edita el teu Perfil", "email": "Correu electrònic", - "email-address": "Email Address", "email-enrollAccount-subject": "Un compte creat per a tu a __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", @@ -554,7 +533,6 @@ "log-in": "Inicia sessió", "loginPopup-title": "Inicia sessió", "memberMenuPopup-title": "Configura membres", - "grey-icons": "Grey Icons", "members": "Membres", "menu": "Menú", "move-selection": "Mou la selecció", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Mou a la part inferior", "moveCardToTop-title": "Mou a la part superior", "moveSelectionPopup-title": "Mou la selecció", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selecció", "multi-selection-label": "Estableix una etiqueta per a la selecció", "multi-selection-member": "Estableix un membre per a la selecció", @@ -578,8 +554,6 @@ "no-results": "Sense resultats", "normal": "Normal", "normal-desc": "Podeu veure i editar fitxes. No podeu canviar la configuració.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "La invitació no ha esta acceptada encara", "notify-participate": "Rep actualitzacions de les fitxes en què participis com a creador o membre", "notify-watch": "Rebre actualitzacions de qualsevol tauler, llista o fitxa en observació", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Canvia la data de recepció", "editCardEndDatePopup-title": "Canvia la data de finalització", "setCardColorPopup-title": "Estableix el color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Trieu un color", "setSwimlaneColorPopup-title": "Trieu un color", "setListColorPopup-title": "Trieu un color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "Se suprimiran totes les llistes, fitxes, etiquetes i activitats i no podreu recuperar el contingut del tauler. No hi ha cap desfer.", "boardDeletePopup-title": "Vols suprimir el tauler?", "delete-board": "Suprimeix el tauler", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasques per al tauler __board__", "default": "Per defecte", "defaultdefault": "Per defecte", @@ -790,7 +761,7 @@ "subtask-settings": "Configuració de subtasques", "card-settings": "Configuració de fitxa", "minicard-settings": "Configuració de la minifitxa", - "boardSubtaskSettingsPopup-title": "Configuració de subtasques", + "boardSubtaskSettingsPopup-title": "Configuració de les subtasques del tauler", "boardCardSettingsPopup-title": "Configuració de fitxa", "boardMinicardSettingsPopup-title": "Configuració de la minifitxa", "deposit-subtasks-board": "Diposita subtasques a aquest tauler:", @@ -961,8 +932,6 @@ "a-endAt": "l'hora de finalització modificada", "a-startAt": "modificació de l'hora d'inici", "a-receivedAt": "temps rebut modificat per ser", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "s'acosta l'hora de venciment actual %s", "pastdue": "L'hora de venciment actual %s ha passat", "duenow": "L'hora de venciment actual %s és avui", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "jo", "dueCardsViewChange-choice-all": "Tots els usuaris", "dueCardsViewChange-choice-all-description": "Mostra totes les fitxes incompletes amb una *data de venciment* de taulers per als quals l'usuari té permís.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Fitxes Trencades", "board-title-not-found": "No s'ha trobat el tauler '%s'.", "swimlane-title-not-found": "No s'ha trobat el carril '%s'.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Estat", - "migration-progress-details": "Detalls", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completat", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/ca@valencia.i18n.json b/imports/i18n/data/ca@valencia.i18n.json index 1a86b8119..5bae3902d 100644 --- a/imports/i18n/data/ca@valencia.i18n.json +++ b/imports/i18n/data/ca@valencia.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/ca_ES.i18n.json b/imports/i18n/data/ca_ES.i18n.json index c120e1994..3061d1963 100644 --- a/imports/i18n/data/ca_ES.i18n.json +++ b/imports/i18n/data/ca_ES.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/cmn.i18n.json b/imports/i18n/data/cmn.i18n.json index 9080850d1..36eb95e11 100644 --- a/imports/i18n/data/cmn.i18n.json +++ b/imports/i18n/data/cmn.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/cs-CZ.i18n.json b/imports/i18n/data/cs-CZ.i18n.json index 912ab865b..4c6cf62aa 100644 --- a/imports/i18n/data/cs-CZ.i18n.json +++ b/imports/i18n/data/cs-CZ.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "smazat komentář %s", "activity-receivedDate": "editoval(a) datum přijetí na %s z %s", "activity-startDate": "editoval(a) datum zahájení na %s z %s", - "allboards.starred": "Starred", - "allboards.templates": "Šablony", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "editoval(a) termín dokončení na %s z %s", "activity-endDate": "editoval(a) datum ukončení na %s z %s", "add-attachment": "Přidat přílohu", @@ -328,16 +316,10 @@ "comment-placeholder": "Text komentáře", "comment-only": "Pouze komentáře", "comment-only-desc": "Může přidávat komentáře pouze do karet.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "Žádné komentáře", "no-comments-desc": "Nemůže vidět komentáře a aktivity", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Pracovník", "worker-desc": "Je možné pouze přesouvat karty, přiřazovat ke kartám a komentovat.", "computer": "Počítač", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Kopírovat adresu karty do mezipaměti", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Propojit kartu", @@ -356,7 +337,6 @@ "copyManyCardsPopup-format": "[ {\"title\": \"Nadpis první karty\", \"description\":\"Popis první 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", - "createTemplateContainerPopup-title": "Přidat kontejner šablony", "chooseBoardSourcePopup-title": "Importovat tablo", "createLabelPopup-title": "Vytvořit štítek", "createCustomField": "Vytvořit pole", @@ -377,9 +357,9 @@ "custom-fields": "Vlastní pole", "date": "Datum", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Zamítnout", "default-avatar": "Výchozí avatar", "delete": "Smazat", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Změnit notifikace", "editProfilePopup-title": "Upravit profil", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Přihlásit", "loginPopup-title": "Přihlásit", "memberMenuPopup-title": "Nastavení uživatele", - "grey-icons": "Grey Icons", "members": "Členové", "menu": "Menu", "move-selection": "Přesunout výběr", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Přesunout dolu", "moveCardToTop-title": "Přesunout nahoru", "moveSelectionPopup-title": "Přesunout výběr", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-výběr", "multi-selection-label": "Vyberte štítek", "multi-selection-member": "Vyberte člena", @@ -578,8 +554,6 @@ "no-results": "Žádné výsledky", "normal": "Normální", "normal-desc": "Může zobrazovat a upravovat karty. Nemůže měnit nastavení.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Pozvánka ještě nebyla přijmuta", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Dostane aktualitace to všech tabel, sloupců nebo karet, které sledujete", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Změnit datum přijetí", "editCardEndDatePopup-title": "Změnit datum konce", "setCardColorPopup-title": "Nastav barvu", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Vyber barvu", "setSwimlaneColorPopup-title": "Vyber barvu", "setListColorPopup-title": "Vyber barvu", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "Všechny sloupce, štítky a aktivity budou smazány a obsah tabla nebude možné obnovit. Toto nelze vrátit zpět.", "boardDeletePopup-title": "Smazat tablo?", "delete-board": "Smazat tablo", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Podúkoly pro tablo __board__", "default": "Výchozí", "defaultdefault": "Výchozí", @@ -790,7 +761,7 @@ "subtask-settings": "Nastavení podúkolů", "card-settings": "Nastavení karet", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Nastavení podúkolů", + "boardSubtaskSettingsPopup-title": "Nastavení podúkolů tabla", "boardCardSettingsPopup-title": "Nastavení karet", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Vložit podúkoly do tohoto tabla", @@ -961,8 +932,6 @@ "a-endAt": "změnil(a) čas ukončení", "a-startAt": "změnil(a) čas zahájení", "a-receivedAt": "změnil(a) čas přijetí", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "Stávající termín dokončení %s se blíží", "pastdue": "Stávající termín dokončení %s je v minulosti", "duenow": "Stávající termín dokončení %s je dnes", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Moje", "dueCardsViewChange-choice-all": "Všechny", "dueCardsViewChange-choice-all-description": "Zobrazí všechny nedokončené karty s *Termínem dokončení* z každého tabla, ke kterému má uživatel oprávnění.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Rozbité karty", "board-title-not-found": "Tablo '%s' nenalezeno.", "swimlane-title-not-found": "Swimlane '%s' nenalezena.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Stav", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Dokončeno", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/cs.i18n.json b/imports/i18n/data/cs.i18n.json index 4009ca5d4..a0ec3277a 100644 --- a/imports/i18n/data/cs.i18n.json +++ b/imports/i18n/data/cs.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "smazat komentář %s", "activity-receivedDate": "editoval(a) datum přijetí na %s z %s", "activity-startDate": "editoval(a) datum zahájení na %s z %s", - "allboards.starred": "Starred", - "allboards.templates": "Šablony", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "editoval(a) termín dokončení na %s z %s", "activity-endDate": "editoval(a) datum ukončení na %s z %s", "add-attachment": "Přidat přílohu", @@ -328,16 +316,10 @@ "comment-placeholder": "Text komentáře", "comment-only": "Pouze komentáře", "comment-only-desc": "Může přidávat komentáře pouze do karet.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "Žádné komentáře", "no-comments-desc": "Nemůže vidět komentáře a aktivity", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Pracovník", "worker-desc": "Je možné pouze přesouvat karty, přiřazovat ke kartám a komentovat.", "computer": "Počítač", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Kopírovat adresu karty do mezipaměti", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Propojit kartu", @@ -356,7 +337,6 @@ "copyManyCardsPopup-format": "[ {\"title\": \"Nadpis první karty\", \"description\":\"Popis první 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", - "createTemplateContainerPopup-title": "Přidat kontejner šablony", "chooseBoardSourcePopup-title": "Importovat tablo", "createLabelPopup-title": "Vytvořit štítek", "createCustomField": "Vytvořit pole", @@ -377,9 +357,9 @@ "custom-fields": "Vlastní pole", "date": "Datum", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Zamítnout", "default-avatar": "Výchozí avatar", "delete": "Smazat", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Změnit notifikace", "editProfilePopup-title": "Upravit profil", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Přihlásit", "loginPopup-title": "Přihlásit", "memberMenuPopup-title": "Nastavení uživatele", - "grey-icons": "Grey Icons", "members": "Členové", "menu": "Menu", "move-selection": "Přesunout výběr", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Přesunout dolu", "moveCardToTop-title": "Přesunout nahoru", "moveSelectionPopup-title": "Přesunout výběr", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-výběr", "multi-selection-label": "Vyberte štítek", "multi-selection-member": "Vyberte člena", @@ -578,8 +554,6 @@ "no-results": "Žádné výsledky", "normal": "Normální", "normal-desc": "Může zobrazovat a upravovat karty. Nemůže měnit nastavení.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Pozvánka ještě nebyla přijmuta", "notify-participate": "Dostanete aktualizace o všech kartách, kterých se účastníte jako tvůrce nebo člen", "notify-watch": "Dostane aktualizace o všech tabel, sloupců nebo karet, které sledujete", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Změnit datum přijetí", "editCardEndDatePopup-title": "Změnit datum konce", "setCardColorPopup-title": "Nastav barvu", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Vyber barvu", "setSwimlaneColorPopup-title": "Vyber barvu", "setListColorPopup-title": "Vyber barvu", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "Všechny sloupce, štítky a aktivity budou smazány a obsah tabla nebude možné obnovit. Toto nelze vrátit zpět.", "boardDeletePopup-title": "Smazat tablo?", "delete-board": "Smazat tablo", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Podúkoly pro tablo __board__", "default": "Výchozí", "defaultdefault": "Výchozí", @@ -790,7 +761,7 @@ "subtask-settings": "Nastavení podúkolů", "card-settings": "Nastavení karet", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Nastavení podúkolů", + "boardSubtaskSettingsPopup-title": "Nastavení podúkolů tabla", "boardCardSettingsPopup-title": "Nastavení karet", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Vložit podúkoly do tohoto tabla", @@ -961,8 +932,6 @@ "a-endAt": "změnil(a) čas ukončení", "a-startAt": "změnil(a) čas zahájení", "a-receivedAt": "změnil(a) čas přijetí", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "Stávající termín dokončení %s se blíží", "pastdue": "Stávající termín dokončení %s je v minulosti", "duenow": "Stávající termín dokončení %s je dnes", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Moje", "dueCardsViewChange-choice-all": "Všechny", "dueCardsViewChange-choice-all-description": "Zobrazí všechny nedokončené karty s *Termínem dokončení* z každého tabla, ke kterému má uživatel oprávnění.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Rozbité karty", "board-title-not-found": "Tablo '%s' nenalezeno.", "swimlane-title-not-found": "Swimlane '%s' nenalezena.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Stav", - "migration-progress-details": "Podrobnosti", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Dokončeno", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/cy-GB.i18n.json b/imports/i18n/data/cy-GB.i18n.json index 7e96f7719..726f9caac 100644 --- a/imports/i18n/data/cy-GB.i18n.json +++ b/imports/i18n/data/cy-GB.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/cy.i18n.json b/imports/i18n/data/cy.i18n.json index 7e96f7719..726f9caac 100644 --- a/imports/i18n/data/cy.i18n.json +++ b/imports/i18n/data/cy.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/da.i18n.json b/imports/i18n/data/da.i18n.json index 0d0a1d7fb..44bb23113 100644 --- a/imports/i18n/data/da.i18n.json +++ b/imports/i18n/data/da.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "slettede kommentar %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Skabeloner", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Tilføj vedhæftning", @@ -328,16 +316,10 @@ "comment-placeholder": "Skriv kommentar", "comment-only": "Kun kommentarer", "comment-only-desc": "Kan kun kommentere på kort.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "Ingen kommentarer", "no-comments-desc": "Kan ikke se kommentarer og aktiviteter.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Arbejder", "worker-desc": "Kan kun flytte kort, tildele sig selv til kort og kommentere.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Kopiér link til kort til udklipsholder", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Sammenkæd kort", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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": "Opret", "createBoardPopup-title": "Opret tavle", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Importér tavle", "createLabelPopup-title": "Opret etikette", "createCustomField": "Opret felt", @@ -377,9 +357,9 @@ "custom-fields": "Brugerdefinerede felter", "date": "Dato", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Afslå", "default-avatar": "Standard-avatar", "delete": "Slet", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Redigér notifikation", "editProfilePopup-title": "Redigér profil", "email": "E-mail", - "email-address": "Email Address", "email-enrollAccount-subject": "Der er oprettet konto til dig på __siteName__", "email-enrollAccount-text": "Hej __user__,\n\nFor at begynde at benytte tjenesten, så klik linket nedenfor.\n\n__url__\n\nTak.", "email-fail": "Afsendelse af e-mail mislykkedes", @@ -554,7 +533,6 @@ "log-in": "Log ind", "loginPopup-title": "Log ind", "memberMenuPopup-title": "Medlemsindstillinger", - "grey-icons": "Grey Icons", "members": "Medlemmer", "menu": "Menu", "move-selection": "Flyt valgte", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Flyt til bunden", "moveCardToTop-title": "Flyt til toppen", "moveSelectionPopup-title": "Flyt valgte", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multivalg", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "Ingen resultater", "normal": "Normal", "normal-desc": "Du kan se og redigere kort. Indstillinger kan ikke ændres.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation er endnu ikke accepteret", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Modtag opdateringer for alle tavler eller kort som du følger", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Tilpas modtagelsesdato", "editCardEndDatePopup-title": "Tilpas slutdato", "setCardColorPopup-title": "Angiv farve", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Vælg en farve", "setSwimlaneColorPopup-title": "Vælg en farve", "setListColorPopup-title": "Vælg en farve", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "Alle lister, kort, etiketter og aktiviteter vil blive slettet og du får ikke mulighed for at genskabe tavlens indhold. Dette kan ikke fortrydes.", "boardDeletePopup-title": "Slet tavle?", "delete-board": "Slet tavle", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Delopgaver for tavlen __board__", "default": "Standard", "defaultdefault": "Standard", @@ -790,7 +761,7 @@ "subtask-settings": "Indstillinger for delopgaver", "card-settings": "Indstillinger for kort", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Indstillinger for delopgaver", + "boardSubtaskSettingsPopup-title": "Indstillinger for delopgaver i tavle", "boardCardSettingsPopup-title": "Indstillinger for kort", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Indsæt delopgaver på denne tavle:", @@ -961,8 +932,6 @@ "a-endAt": "ændrede sluttidspunkt til at være", "a-startAt": "ændrede starttidspunkt til at være", "a-receivedAt": "ændrede modtagelsestidspunkt til at være", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "aktuelt forfaldstidspunkt %s nærmer sig", "pastdue": "aktuelt forfaldstidspunkt %s er passeret", "duenow": "aktuelt forfaldstidspunkt %s er i dag", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Fuldført", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/de-AT.i18n.json b/imports/i18n/data/de-AT.i18n.json index 8c26fb163..79b940177 100644 --- a/imports/i18n/data/de-AT.i18n.json +++ b/imports/i18n/data/de-AT.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "löschte Kommentar %s", "activity-receivedDate": "hat Empfangsdatum zu %s geändert auf %s", "activity-startDate": "hat Startdatum zu %s geändert auf %s", - "allboards.starred": "Starred", - "allboards.templates": "Vorlagen", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "hat Fälligkeitsdatum zu %s geändert auf %s", "activity-endDate": "hat Enddatum zu %s geändert auf %s", "add-attachment": "Datei anhängen", @@ -328,16 +316,10 @@ "comment-placeholder": "Kommentar schreiben", "comment-only": "Nur Kommentare", "comment-only-desc": "Kann Karten nur kommentieren.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Sind Sie sicher, dass Sie den Kommentar löschen wollen?", "deleteCommentPopup-title": "Kommentar löschen?", "no-comments": "Keine Kommentare", "no-comments-desc": "Kann keine Kommentare und Aktivitäten sehen.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Arbeiter", "worker-desc": "Kann Karten nur verschieben, sich selbst zuweisen und kommentieren.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Wollen Sie diese Checkliste wirklich löschen?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Checkliste löschen?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Kopiere Link zur Karte in die Zwischenablage", "copy-text-to-clipboard": "Text in die Zwischenablage kopieren", "linkCardPopup-title": "Karte verknüpfen", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Vorlagen-Container hinzufügen", "chooseBoardSourcePopup-title": "Board importieren", "createLabelPopup-title": "Label erstellen", "createCustomField": "Feld erstellen", @@ -377,9 +357,9 @@ "custom-fields": "Benutzerdefinierte Felder", "date": "Datum", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Ablehnen", "default-avatar": "Standard Profilbild", "delete": "Löschen", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Benachrichtigung ändern", "editProfilePopup-title": "Profil ändern", "email": "E-Mail", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Einloggen", "loginPopup-title": "Einloggen", "memberMenuPopup-title": "Nutzereinstellungen", - "grey-icons": "Grey Icons", "members": "Mitglieder", "menu": "Menü", "move-selection": "Auswahl verschieben", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Ans Ende verschieben", "moveCardToTop-title": "Zum Anfang verschieben", "moveSelectionPopup-title": "Auswahl verschieben", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Mehrfachauswahl", "multi-selection-label": "Label für die Auswahl setzen", "multi-selection-member": "Mitglied für die Auswahl setzen", @@ -578,8 +554,6 @@ "no-results": "Keine Ergebnisse", "normal": "Normal", "normal-desc": "Kann Karten anzeigen und bearbeiten, aber keine Einstellungen ändern.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Die Einladung wurde noch nicht angenommen", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Benachrichtigungen über alle Boards, Listen oder Karten erhalten, die Sie beobachten", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Empfangsdatum ändern", "editCardEndDatePopup-title": "Enddatum ändern", "setCardColorPopup-title": "Farbe festlegen", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Farbe wählen", "setSwimlaneColorPopup-title": "Farbe wählen", "setListColorPopup-title": "Farbe wählen", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "Alle Listen, Karten, Labels und Akivitäten werden gelöscht und Sie können die Inhalte des Boards nicht wiederherstellen! Die Aktion kann nicht rückgängig gemacht werden.", "boardDeletePopup-title": "Board löschen?", "delete-board": "Board löschen", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Teilaufgabe für __board__ Board", "default": "Standard", "defaultdefault": "Standard", @@ -790,7 +761,7 @@ "subtask-settings": "Einstellungen für Teilaufgaben", "card-settings": "Karten-Einstellungen", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Einstellungen für Teilaufgaben", + "boardSubtaskSettingsPopup-title": "Boardeinstellungen für Teilaufgaben", "boardCardSettingsPopup-title": "Karten-Einstellungen", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Teilaufgaben in diesem Board ablegen:", @@ -961,8 +932,6 @@ "a-endAt": "hat Ende geändert auf", "a-startAt": "hat Startzeit geändert auf", "a-receivedAt": "hat Empfangszeit geändert auf", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "aktuelles Fälligkeitsdatum %s bevorstehend", "pastdue": "aktuelles Fälligkeitsdatum %s überschritten", "duenow": "aktuelles Fälligkeitsdatum %s heute", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Ich", "dueCardsViewChange-choice-all": "alle Benutzer", "dueCardsViewChange-choice-all-description": "Zeigt alle unvollständigen Karten mit einem *Fälligkeits*-Datum auf Boards, für die der Benutzer Berechtigungen hat.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Fehlerhafte Karten", "board-title-not-found": "Board „%s“ nicht gefunden.", "swimlane-title-not-found": "Swimlane „%s“ nicht gefunden.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "abgeschlossen", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/de-CH.i18n.json b/imports/i18n/data/de-CH.i18n.json index 5a0c2eb72..f67c5adbd 100644 --- a/imports/i18n/data/de-CH.i18n.json +++ b/imports/i18n/data/de-CH.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "löschte Kommentar %s", "activity-receivedDate": "hat Empfangsdatum zu %s geändert auf %s", "activity-startDate": "hat Startdatum zu %s geändert auf %s", - "allboards.starred": "Starred", - "allboards.templates": "Vorlagen", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "hat Fälligkeitsdatum zu %s geändert auf %s", "activity-endDate": "hat Enddatum zu %s geändert auf %s", "add-attachment": "Datei anhängen", @@ -328,16 +316,10 @@ "comment-placeholder": "Kommentar schreiben", "comment-only": "Nur Kommentare", "comment-only-desc": "Kann Karten nur kommentieren.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Sind Sie sicher, dass Sie den Kommentar löschen möchten?", "deleteCommentPopup-title": "Kommentar löschen?", "no-comments": "Keine Kommentare", "no-comments-desc": "Kann keine Kommentare und Aktivitäten sehen.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Arbeiter", "worker-desc": "Kann Karten nur verschieben, sich selbst zuweisen und kommentieren.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Wollen Sie diese Checkliste wirklich löschen?", "subtaskDeletePopup-title": "Teilaufgabe löschen?", "checklistDeletePopup-title": "Checkliste löschen?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Kopiere Link zur Karte in die Zwischenablage", "copy-text-to-clipboard": "Text in die Zwischenablage kopieren", "linkCardPopup-title": "Karte verknüpfen", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Vorlagen-Container hinzufügen", "chooseBoardSourcePopup-title": "Board importieren", "createLabelPopup-title": "Label erstellen", "createCustomField": "Feld erstellen", @@ -377,9 +357,9 @@ "custom-fields": "Benutzerdefinierte Felder", "date": "Datum", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Ablehnen", "default-avatar": "Standard Profilbild", "delete": "Löschen", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Benachrichtigung ändern", "editProfilePopup-title": "Profil ändern", "email": "E-Mail", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Einloggen", "loginPopup-title": "Einloggen", "memberMenuPopup-title": "Nutzereinstellungen", - "grey-icons": "Grey Icons", "members": "Mitglieder", "menu": "Menü", "move-selection": "Auswahl verschieben", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Ans Ende verschieben", "moveCardToTop-title": "Zum Anfang verschieben", "moveSelectionPopup-title": "Auswahl verschieben", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Mehrfachauswahl", "multi-selection-label": "Label für die Auswahl setzen", "multi-selection-member": "Mitglied für die Auswahl setzen", @@ -578,8 +554,6 @@ "no-results": "Keine Ergebnisse", "normal": "Normal", "normal-desc": "Kann Karten anzeigen und bearbeiten, aber keine Einstellungen ändern.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Die Einladung wurde noch nicht angenommen", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Benachrichtigungen über alle Boards, Listen oder Karten erhalten, die Sie beobachten", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Empfangsdatum ändern", "editCardEndDatePopup-title": "Enddatum ändern", "setCardColorPopup-title": "Farbe festlegen", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Farbe wählen", "setSwimlaneColorPopup-title": "Farbe wählen", "setListColorPopup-title": "Farbe wählen", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "Alle Listen, Karten, Labels und Akivitäten werden gelöscht und Sie können die Inhalte des Boards nicht wiederherstellen! Die Aktion kann nicht rückgängig gemacht werden.", "boardDeletePopup-title": "Board löschen?", "delete-board": "Board löschen", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Teilaufgabe für __board__ Board", "default": "Standard", "defaultdefault": "Standard", @@ -790,7 +761,7 @@ "subtask-settings": "Einstellungen für Teilaufgaben", "card-settings": "Karten-Einstellungen", "minicard-settings": "Einstellungen für Minikarte", - "boardSubtaskSettingsPopup-title": "Einstellungen für Teilaufgaben", + "boardSubtaskSettingsPopup-title": "Boardeinstellungen für Teilaufgaben", "boardCardSettingsPopup-title": "Karten-Einstellungen", "boardMinicardSettingsPopup-title": "Einstellungen für Minikarte", "deposit-subtasks-board": "Teilaufgaben in diesem Board ablegen:", @@ -961,8 +932,6 @@ "a-endAt": "hat Ende geändert auf", "a-startAt": "hat Startzeit geändert auf", "a-receivedAt": "hat Empfangszeit geändert auf", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "aktuelles Fälligkeitsdatum %s bevorstehend", "pastdue": "aktuelles Fälligkeitsdatum %s überschritten", "duenow": "aktuelles Fälligkeitsdatum %s heute", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Ich", "dueCardsViewChange-choice-all": "alle Benutzer", "dueCardsViewChange-choice-all-description": "Zeigt alle unvollständigen Karten mit einem *Fälligkeits*-Datum auf Boards, für die der Benutzer Berechtigungen hat.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Fehlerhafte Karten", "board-title-not-found": "Board „%s“ nicht gefunden.", "swimlane-title-not-found": "Swimlane „%s“ nicht gefunden.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "abgeschlossen", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/de.i18n.json b/imports/i18n/data/de.i18n.json index d19cc19e0..18f0db85f 100644 --- a/imports/i18n/data/de.i18n.json +++ b/imports/i18n/data/de.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "löschte Kommentar %s", "activity-receivedDate": "hat Empfangsdatum zu %s geändert auf %s", "activity-startDate": "hat Startdatum zu %s geändert auf %s", - "allboards.starred": "Starred", - "allboards.templates": "Vorlagen", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "hat Fälligkeitsdatum zu %s geändert auf %s", "activity-endDate": "hat Enddatum zu %s geändert auf %s", "add-attachment": "Datei anhängen", @@ -328,16 +316,10 @@ "comment-placeholder": "Kommentar schreiben", "comment-only": "Nur Kommentare", "comment-only-desc": "Kann Karten nur kommentieren.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Sind Sie sicher, dass Sie den Kommentar löschen wollen?", "deleteCommentPopup-title": "Kommentar löschen?", "no-comments": "Keine Kommentare", "no-comments-desc": "Kann keine Kommentare und Aktivitäten sehen.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Arbeiter", "worker-desc": "Kann Karten nur verschieben, sich selbst zuweisen und kommentieren.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Wollen Sie diese Checkliste wirklich löschen?", "subtaskDeletePopup-title": "Teilaufgabe löschen?", "checklistDeletePopup-title": "Checkliste löschen?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Kopiere Link zur Karte in die Zwischenablage", "copy-text-to-clipboard": "Text in die Zwischenablage kopieren", "linkCardPopup-title": "Karte verknüpfen", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Vorlagen-Container hinzufügen", "chooseBoardSourcePopup-title": "Board importieren", "createLabelPopup-title": "Label erstellen", "createCustomField": "Feld erstellen", @@ -377,9 +357,9 @@ "custom-fields": "Benutzerdefinierte Felder", "date": "Datum", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Ablehnen", "default-avatar": "Standard Profilbild", "delete": "Löschen", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Benachrichtigung ändern", "editProfilePopup-title": "Profil ändern", "email": "E-Mail", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Einloggen", "loginPopup-title": "Einloggen", "memberMenuPopup-title": "Nutzereinstellungen", - "grey-icons": "Grey Icons", "members": "Mitglieder", "menu": "Menü", "move-selection": "Auswahl verschieben", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Ans Ende verschieben", "moveCardToTop-title": "Zum Anfang verschieben", "moveSelectionPopup-title": "Auswahl verschieben", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Mehrfachauswahl", "multi-selection-label": "Label für die Auswahl setzen", "multi-selection-member": "Mitglied für die Auswahl setzen", @@ -578,8 +554,6 @@ "no-results": "Keine Ergebnisse", "normal": "Normal", "normal-desc": "Kann Karten anzeigen und bearbeiten, aber keine Einstellungen ändern.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Die Einladung wurde noch nicht angenommen", "notify-participate": "Benachrichtigungen zu allen Karten erhalten, bei denen Sie Ersteller oder Mitglied sind", "notify-watch": "Benachrichtigungen über alle Boards, Listen oder Karten erhalten, die Sie beobachten", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Empfangsdatum ändern", "editCardEndDatePopup-title": "Enddatum ändern", "setCardColorPopup-title": "Farbe festlegen", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Farbe wählen", "setSwimlaneColorPopup-title": "Farbe wählen", "setListColorPopup-title": "Farbe wählen", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "Alle Listen, Karten, Labels und Akivitäten werden gelöscht und Sie können die Inhalte des Boards nicht wiederherstellen! Die Aktion kann nicht rückgängig gemacht werden.", "boardDeletePopup-title": "Board löschen?", "delete-board": "Board löschen", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Teilaufgabe für __board__ Board", "default": "Standard", "defaultdefault": "Standard", @@ -790,7 +761,7 @@ "subtask-settings": "Einstellungen für Teilaufgaben", "card-settings": "Karten-Einstellungen", "minicard-settings": "Minikarte-Einstellungen", - "boardSubtaskSettingsPopup-title": "Einstellungen für Teilaufgaben", + "boardSubtaskSettingsPopup-title": "Boardeinstellungen für Teilaufgaben", "boardCardSettingsPopup-title": "Karten-Einstellungen", "boardMinicardSettingsPopup-title": "Minikarte-Einstellungen", "deposit-subtasks-board": "Teilaufgaben in diesem Board ablegen:", @@ -961,8 +932,6 @@ "a-endAt": "hat Ende geändert auf", "a-startAt": "hat Startzeit geändert auf", "a-receivedAt": "hat Empfangszeit geändert auf", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "aktuelles Fälligkeitsdatum %s bevorstehend", "pastdue": "aktuelles Fälligkeitsdatum %s überschritten", "duenow": "aktuelles Fälligkeitsdatum %s heute", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Ich", "dueCardsViewChange-choice-all": "alle Benutzer", "dueCardsViewChange-choice-all-description": "Zeigt alle unvollständigen Karten mit einem *Fälligkeits*-Datum auf Boards, für die der Benutzer Berechtigungen hat.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Fehlerhafte Karten", "board-title-not-found": "Board „%s“ nicht gefunden.", "swimlane-title-not-found": "Swimlane „%s“ nicht gefunden.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Verberge alle Checklisteneinträge", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Bedienungshilfe", "accessibility-page-enabled": "Bedienungshilfe Seite freigeschaltet", "accessibility-info-not-added-yet": "Es wurde noch keine Information zur Bedienungshilfe hinzugefügt", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Abgeschlossen", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "abgeschlossen", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Gewicht", "idle": "Leerlauf", "complete": "Abgeschlossen", - "cron": "Zeitplan", - "current-step": "Current Step" + "cron": "Zeitplan" } diff --git a/imports/i18n/data/de_DE.i18n.json b/imports/i18n/data/de_DE.i18n.json index afea7ddde..22b96b1fc 100644 --- a/imports/i18n/data/de_DE.i18n.json +++ b/imports/i18n/data/de_DE.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "löschte Kommentar %s", "activity-receivedDate": "hat Empfangsdatum zu %s geändert auf %s", "activity-startDate": "hat Startdatum zu %s geändert auf %s", - "allboards.starred": "Markiert", - "allboards.templates": "Vorlagen", - "allboards.remaining": "Verbleibend", - "allboards.workspaces": "Arbeitsplatz", - "allboards.add-workspace": "Arbeitsplatz hinzufügen", - "allboards.add-workspace-prompt": "Arbeitsplatzname", - "allboards.add-subworkspace": "Teilarbeitsplatz hinzufügen", - "allboards.add-subworkspace-prompt": "Teilarbeitsplatzname", - "allboards.edit-workspace": "Arbeitsplatz ändern", - "allboards.edit-workspace-name": "Arbeitsplatzname", - "allboards.edit-workspace-icon": "Arbeitsplatzsymbol (markdown)", - "multi-selection-active": "Wähle Kontrollkästchen um Bretter auszuwählen", "activity-dueDate": "hat Fälligkeitsdatum zu %s geändert auf %s", "activity-endDate": "hat Enddatum zu %s geändert auf %s", "add-attachment": "Datei anhängen", @@ -189,22 +177,22 @@ "boardChangeViewPopup-title": "Boardansicht", "boards": "Boards", "board-view": "Boardansicht", - "desktop-mode": "Desktop-Modus", - "mobile-mode": "Handy-Modus", - "mobile-desktop-toggle": "Umschalten zwischen Mobil und Desktop Ansicht", + "desktop-mode": "Desktop Mode", + "mobile-mode": "Mobile Mode", + "mobile-desktop-toggle": "Toggle between Mobile and Desktop Mode", "zoom-in": "Vergrößern", "zoom-out": "Verkleinern", - "click-to-change-zoom": "Klicken um die Zoom Stufe zu ändern", - "zoom-level": "Zoomstufe", - "enter-zoom-level": "Eingabe Zoom Stufe (50-300%):", + "click-to-change-zoom": "Click to change zoom level", + "zoom-level": "Zoom Level", + "enter-zoom-level": "Enter zoom level (50-300%):", "board-view-cal": "Kalender", "board-view-swimlanes": "Swimlanes", "board-view-collapse": "Einklappen", "board-view-gantt": "Gantt", "board-view-lists": "Listen", - "bucket-example": "z.B. \"Löffelliste\"", - "calendar-previous-month-label": "Vorheriger Monat", - "calendar-next-month-label": "Nächster Monat", + "bucket-example": "Like \"Bucket List\" for example", + "calendar-previous-month-label": "Previous Month", + "calendar-next-month-label": "Next Month", "cancel": "Abbrechen", "card-archived": "Diese Karte wurde ins Archiv verschoben", "board-archived": "Dieses Board wurde ins Archiv verschoben.", @@ -328,16 +316,10 @@ "comment-placeholder": "Kommentar schreiben", "comment-only": "Nur Kommentare", "comment-only-desc": "Kann Karten nur kommentieren.", - "comment-assigned-only": "Nur zugewiesener Kommentar", - "comment-assigned-only-desc": "Nur zugewiesene Karten sichtbar. Nur Kommentar möglich.", "comment-delete": "Sind Sie sicher, dass Sie den Kommentar löschen wollen?", "deleteCommentPopup-title": "Kommentar löschen?", "no-comments": "Keine Kommentare", "no-comments-desc": "Kann keine Kommentare und Aktivitäten sehen.", - "read-only": "Nur lesen", - "read-only-desc": "Kann Karten nur sehen, nicht bearbeiten.", - "read-assigned-only": "Nur Zugewiesene lesen.", - "read-assigned-only-desc": "Nur zugewiesene Karten sichtbar. Keine Änderung.", "worker": "Arbeiter", "worker-desc": "Kann Karten nur verschieben, sich selbst zuweisen und kommentieren.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Wollen Sie diese Checkliste wirklich löschen?", "subtaskDeletePopup-title": "Teilaufgabe löschen?", "checklistDeletePopup-title": "Checkliste löschen?", - "checklistItemDeletePopup-title": "Element der Checkliste löschen?", "copy-card-link-to-clipboard": "Kopiere Link zur Karte in die Zwischenablage", "copy-text-to-clipboard": "Text in die Zwischenablage kopieren", "linkCardPopup-title": "Karte verknüpfen", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Vorlagen-Container hinzufügen", "chooseBoardSourcePopup-title": "Board importieren", "createLabelPopup-title": "Label erstellen", "createCustomField": "Feld erstellen", @@ -376,10 +356,10 @@ "custom-field-text": "Text", "custom-fields": "Benutzerdefinierte Felder", "date": "Datum", - "date-format": "Datumsformat", - "date-format-yyyy-mm-dd": "JJJJ-MM-TT hh:mm", - "date-format-dd-mm-yyyy": "TT-MM-JJJJ", - "date-format-mm-dd-yyyy": "MM-TT-JJJJ", + "date-format": "Date Format", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Ablehnen", "default-avatar": "Standard Profilbild", "delete": "Löschen", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Benachrichtigung ändern", "editProfilePopup-title": "Profil ändern", "email": "E-Mail", - "email-address": "E-Mail Adresse", "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", @@ -554,7 +533,6 @@ "log-in": "Einloggen", "loginPopup-title": "Einloggen", "memberMenuPopup-title": "Nutzereinstellungen", - "grey-icons": "Graue Symbole", "members": "Mitglieder", "menu": "Menü", "move-selection": "Auswahl verschieben", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Ans Ende verschieben", "moveCardToTop-title": "Zum Anfang verschieben", "moveSelectionPopup-title": "Auswahl verschieben", - "copySelectionPopup-title": "Auswahl kopieren", - "selection-color": "Auswahlfarbe", "multi-selection": "Mehrfachauswahl", "multi-selection-label": "Label für die Auswahl setzen", "multi-selection-member": "Mitglied für die Auswahl setzen", @@ -578,8 +554,6 @@ "no-results": "Keine Ergebnisse", "normal": "Normal", "normal-desc": "Kann Karten anzeigen und bearbeiten, aber keine Einstellungen ändern.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Nur zugewiesene Karten sichtbar. Änderung als normaler Benutzer.", "not-accepted-yet": "Die Einladung wurde noch nicht angenommen", "notify-participate": "Benachrichtigungen zu allen Karten erhalten, bei denen Sie Ersteller oder Mitglied sind", "notify-watch": "Benachrichtigungen über alle Boards, Listen oder Karten erhalten, die Sie beobachten", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Empfangsdatum ändern", "editCardEndDatePopup-title": "Enddatum ändern", "setCardColorPopup-title": "Farbe festlegen", - "setSelectionColorPopup-title": "Auswahlfarbe setzen", "setCardActionsColorPopup-title": "Farbe wählen", "setSwimlaneColorPopup-title": "Farbe wählen", "setListColorPopup-title": "Farbe wählen", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "Alle Listen, Karten, Labels und Akivitäten werden gelöscht und Sie können die Inhalte des Boards nicht wiederherstellen! Die Aktion kann nicht rückgängig gemacht werden.", "boardDeletePopup-title": "Board löschen?", "delete-board": "Board löschen", - "delete-duplicate-lists": "Lösche doppelte Listen", - "delete-duplicate-lists-confirm": "Sicher? Es werden alle doppelten Listen gelöscht, die den gleichen Namen haben und keine Karten enthalten.", "default-subtasks-board": "Teilaufgabe für __board__ Board", "default": "Standard", "defaultdefault": "Standard", @@ -790,7 +761,7 @@ "subtask-settings": "Einstellungen für Teilaufgaben", "card-settings": "Karten-Einstellungen", "minicard-settings": "Minikarte-Einstellungen", - "boardSubtaskSettingsPopup-title": "Einstellungen für Teilaufgaben", + "boardSubtaskSettingsPopup-title": "Boardeinstellungen für Teilaufgaben", "boardCardSettingsPopup-title": "Karten-Einstellungen", "boardMinicardSettingsPopup-title": "Minikarte-Einstellungen", "deposit-subtasks-board": "Teilaufgaben in diesem Board ablegen:", @@ -961,8 +932,6 @@ "a-endAt": "hat Ende geändert auf", "a-startAt": "hat Startzeit geändert auf", "a-receivedAt": "hat Empfangszeit geändert auf", - "above-selected-card": "Oben ausgewählte Karte", - "below-selected-card": "Unten ausgewählte Karte", "almostdue": "aktuelles Fälligkeitsdatum %s bevorstehend", "pastdue": "aktuelles Fälligkeitsdatum %s überschritten", "duenow": "aktuelles Fälligkeitsdatum %s heute", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Ich", "dueCardsViewChange-choice-all": "alle Benutzer", "dueCardsViewChange-choice-all-description": "Zeigt alle unvollständigen Karten mit einem *Fälligkeits*-Datum auf Boards, für die der Benutzer Berechtigungen hat.", - "dueCards-noResults-title": "Keine fälligen Karten gefunden", - "dueCards-noResults-description": "Sie haben momentan keine Karten mit Fälligkeitsdaten.", "broken-cards": "Fehlerhafte Karten", "board-title-not-found": "Board „%s“ nicht gefunden.", "swimlane-title-not-found": "Swimlane „%s“ nicht gefunden.", @@ -1318,24 +1285,19 @@ "hideAllChecklistItems": "Verberge alle Checklisteneinträge", "support": "Unterstützung", "supportPopup-title": "Unterstützung", - "support-page-enabled": "Supportseite eingeschaltet", - "support-info-not-added-yet": "Supportinfo wurde noch nicht hinzugefügt", - "support-info-only-for-logged-in-users": "Supportinfo ist nur für angemeldete Benutzer", - "support-title": "Supporttitel", - "support-content": "Supportinhalt", "accessibility": "Bedienungshilfe", "accessibility-page-enabled": "Barrierefreie Seite freigeschaltet", "accessibility-info-not-added-yet": "Es wurde noch keine Information zur Bedienungshilfe hinzugefügt", "accessibility-title": "Bedienungshilfe Titel", "accessibility-content": "Barrierefreier Eintrag", - "accounts-lockout-settings": "Brute-Force-Schutz Einstellungen", - "accounts-lockout-info": "Diese Einstellungen steuern, wie Anmeldeversuche gegen Brute-Force-Angriffe geschützt werden", - "accounts-lockout-known-users": "Einstellungen für bekannte Benutzer (korrekter Benutzername, falsches Passwort)", - "accounts-lockout-unknown-users": "Einstellungen für unbekannte Benutzer (nicht existierender Benutzername)", + "accounts-lockout-settings": "Brute Force Protection Settings", + "accounts-lockout-info": "These settings control how login attempts are protected against brute force attacks.", + "accounts-lockout-known-users": "Settings for known users (correct username, wrong password)", + "accounts-lockout-unknown-users": "Settings for unknown users (non-existent username)", "accounts-lockout-failures-before": "Fehler vor einer Sperrung", "accounts-lockout-period": "Dauer der Sperrung (Sekunden)", - "accounts-lockout-failure-window": "Fehlerfenster (Sekunden)", - "accounts-lockout-settings-updated": "Die Brute-force-Schutz Einstellungen wurden aktualisiert", + "accounts-lockout-failure-window": "Failure window (seconds)", + "accounts-lockout-settings-updated": "Brute force protection settings have been updated", "accounts-lockout-locked-users": "Gesperrte Benutzer", "accounts-lockout-locked-users-info": "Kürzlich gesperrte Benutzer aufgrund von zu vielen fehlerhaften Logins", "accounts-lockout-no-locked-users": "Es gibt aktuell keine gesperrten Benutzer", @@ -1343,7 +1305,7 @@ "accounts-lockout-remaining-time": "Verbleibende Zeit", "accounts-lockout-user-unlocked": "Benutzer wurde erfolgreich entsperrt", "accounts-lockout-confirm-unlock": "Wollen Sie den Benutzer wirklich entsperren?", - "accounts-lockout-confirm-unlock-all": "Wollen Sie wirklich alle gesperrten Benutzer entsperren?", + "accounts-lockout-confirm-unlock-all": "Are you sure you want to unlock all locked users?", "accounts-lockout-show-locked-users": "Zeige nur gesperrte Benutzer", "accounts-lockout-user-locked": "Benutzer ist gesperrt", "accounts-lockout-click-to-unlock": "Klicken Sie, um den Benutzer zu entsperren", @@ -1354,252 +1316,183 @@ "admin-people-filter-active": "Aktiv", "admin-people-filter-inactive": "Nicht aktiv", "admin-people-active-status": "Aktiv Status", - "admin-people-user-active": "Benutzer ist aktiv - zum Deaktivieren klicken", - "admin-people-user-inactive": "Benutzer ist inaktiv - zum Aktivieren klicken", - "accounts-lockout-all-users-unlocked": "Alle gesperrten Benutzer wurden entsperrt", + "admin-people-user-active": "User is active - click to deactivate", + "admin-people-user-inactive": "User is inactive - click to activate", + "accounts-lockout-all-users-unlocked": "All locked users have been unlocked", "accounts-lockout-unlock-all": "Alle entsperren", - "active-cron-jobs": "Aktive geplante Aufgaben", - "add-cron-job": "Geplante Aufgabe hinzufügen", - "add-cron-job-placeholder": "Funktion „Geplante Aufgaben hinzufügen” in Kürze verfügbar", - "attachment-storage-configuration": "Konfiguration des Anhangspeichers", - "attachments-path": "Anhänge Pfad", - "attachments-path-description": "Pfad unter dem die Anhänge gespeichert werden", - "avatars-path": "Pfad zu den Avataren", - "avatars-path-description": "Pfad unter dem die Avatardateien gespeichert werden", - "board-archive-failed": "Planung der Brettarchivierung fehlgeschlagen ", - "board-archive-scheduled": "Brettarchivierung erfolgreich eingeplant", - "board-backup-failed": "Planung der Brettsicherung fehlgeschlagen ", - "board-backup-scheduled": "Brettsicherung erfolgreich eingeplant", - "board-cleanup-failed": "Planung des Brettaufräumens fehlgeschlagen", - "board-cleanup-scheduled": "Brettaufräumen erfolgreich eingeplant", - "board-operations": "Brettoperationen", - "cron-jobs": "Geplante Aufgaben", + "active-cron-jobs": "Active Scheduled Jobs", + "add-cron-job": "Add Scheduled Job", + "add-cron-job-placeholder": "Add Scheduled Job functionality coming soon", + "attachment-storage-configuration": "Attachment Storage Configuration", + "attachments-path": "Attachments Path", + "attachments-path-description": "Path where attachment files are stored", + "avatars-path": "Avatars Path", + "avatars-path-description": "Path where avatar files are stored", + "board-archive-failed": "Failed to schedule board archive", + "board-archive-scheduled": "Board archive scheduled successfully", + "board-backup-failed": "Failed to schedule board backup", + "board-backup-scheduled": "Board backup scheduled successfully", + "board-cleanup-failed": "Failed to schedule board cleanup", + "board-cleanup-scheduled": "Board cleanup scheduled successfully", + "board-operations": "Board Operations", + "cron-jobs": "Scheduled Jobs", "cron-migrations": "Geplante Migrationen", - "cron-job-delete-confirm": "Sind Sie sicher, dass Sie diese geplante Aufgabe löschen wollen?", - "cron-job-delete-failed": "Löschen der geplanten Aufgabe fehlgeschlagen", - "cron-job-deleted": "Geplante Aufgabe erfolgreich gelöscht", - "cron-job-pause-failed": "Anhalten der geplanten Aufgabe fehlgeschlagen", - "cron-job-paused": "Geplante Aufgabe erfolgreich angehalten", - "filesystem-path-description": "Basispfad des Dateispeichers", - "gridfs-enabled": "GridFS aktiviert", - "gridfs-enabled-description": "Benutze MongoDB GridFS als Dateispeicher", - "migration-pause-failed": "Unterbrechung der Migrationen fehlgeschlagen", - "migration-paused": "Migrationen erfolgreich unterbrochen", - "migration-progress": "Migrationsfortschritt", - "migration-start-failed": "Start der Migrationen fehlgeschlagen", - "migration-started": "Migrationen erfolgreich gestartet", - "migration-status": "Migrationsstatus", - "migration-stop-confirm": "Sind Sie sicher, dass Sie alle Migrationen stoppen wollen?", - "migration-stop-failed": "Stoppen der Migrationen fehlgeschlagen", - "migration-stopped": "Migrationen erfolgreich gestoppt", - "mongodb-gridfs-storage": "MongoDB GridFS Speicher", - "pause-all-migrations": "Alle Migrationen anhalten", - "s3-access-key": "S3 Zugriffsschlüssel", - "s3-access-key-description": "AWS S3 Zugangsschlüssel zur Authentifizierung", - "s3-access-key-placeholder": "S3 Zugriffsschlüssel eingeben", + "cron-job-delete-confirm": "Are you sure you want to delete this scheduled job?", + "cron-job-delete-failed": "Failed to delete scheduled job", + "cron-job-deleted": "Scheduled job deleted successfully", + "cron-job-pause-failed": "Failed to pause scheduled job", + "cron-job-paused": "Scheduled job paused successfully", + "filesystem-path-description": "Base path for file storage", + "gridfs-enabled": "GridFS Enabled", + "gridfs-enabled-description": "Use MongoDB GridFS for file storage", + "migration-pause-failed": "Failed to pause migrations", + "migration-paused": "Migrations paused successfully", + "migration-progress": "Migration Progress", + "migration-start-failed": "Failed to start migrations", + "migration-started": "Migrations started successfully", + "migration-status": "Migration Status", + "migration-stop-confirm": "Are you sure you want to stop all migrations?", + "migration-stop-failed": "Failed to stop migrations", + "migration-stopped": "Migrations stopped successfully", + "mongodb-gridfs-storage": "MongoDB GridFS Storage", + "pause-all-migrations": "Pause All Migrations", + "s3-access-key": "S3 Access Key", + "s3-access-key-description": "AWS S3 access key for authentication", + "s3-access-key-placeholder": "Enter S3 access key", "s3-bucket": "S3 Bucket", - "s3-bucket-description": "S3 Bucket Name um Dateien zu speichern", - "s3-connection-failed": "S3 Verbindung fehlgeschlagen", - "s3-connection-success": "S3 Verbindung erfolgreich", - "s3-enabled": "S3 aktiviert", - "s3-enabled-description": "Benutze AWS S3 oder MiniIO als Dateispeicher", - "s3-endpoint": "S3 Endpunkt", - "s3-endpoint-description": "S3 Endpunkt URL (z.B., s3.amazonaws.com oder minio.example.com)", - "s3-minio-storage": "S3/MinIO Speicher", + "s3-bucket-description": "S3 bucket name for storing files", + "s3-connection-failed": "S3 connection failed", + "s3-connection-success": "S3 connection successful", + "s3-enabled": "S3 Enabled", + "s3-enabled-description": "Use AWS S3 or MinIO for file storage", + "s3-endpoint": "S3 Endpoint", + "s3-endpoint-description": "S3 endpoint URL (e.g., s3.amazonaws.com or minio.example.com)", + "s3-minio-storage": "S3/MinIO Storage", "s3-port": "S3 Port", - "s3-port-description": "S3 Endpunkt Port Nummer", + "s3-port-description": "S3 endpoint port number", "s3-region": "S3 Region", - "s3-region-description": "AWS S3 Region (z.B., us-east-1)", - "s3-secret-key": "S3 geheimer Schlüssel", - "s3-secret-key-description": "AWS S3 geheimer Schlüssel zur Authentifizierung", - "s3-secret-key-placeholder": "S3 geheimen Schlüssel eingeben", - "s3-secret-key-required": "S3 geheimer Schlüssel ist erforderlich", - "s3-settings-save-failed": "Speicherung der S3 Einstellungen fehlgeschlagen", - "s3-settings-saved": "S3 Einstellungen erfolgreich gespeichert", - "s3-ssl-enabled": "S3 SSL aktiviert", - "s3-ssl-enabled-description": "Benutze SSL/TLS für S3 Verbindungen", - "save-s3-settings": "S3 Einstellungen speichern", - "schedule-board-archive": "Planung Brettarchiv", - "schedule-board-backup": "Planung Brettsicherung", - "schedule-board-cleanup": "Planung Brettsäuberung", - "scheduled-board-operations": "Geplante Brettoperationen", - "start-all-migrations": "Starte alle Migrationen", - "stop-all-migrations": "Stoppe alle Migrationen", - "test-s3-connection": "Teste S3 Verbindungen", - "writable-path": "Beschreibbarer Pfad", - "writable-path-description": "Basispfad des Dateispeichers", - "add-job": "Aufgabe hinzufügen", - "attachment-migration": "Anhangmigration", - "attachment-monitoring": "Anhangüberwachung", - "attachment-settings": "Anhangeinstellungen", - "attachment-storage-settings": "Speichereinstellungen", - "automatic-migration": "Automatische Migration", - "back-to-settings": "Zurück zu den Einstellungen", - "board-id": "Brett ID", - "board-migration": "Brettmigration", - "board-migrations": "Brettmigrationen", - "card-show-lists-on-minicard": "Zeige Listen auf der Minikarte", - "comprehensive-board-migration": "Umfassende Brettmigration", - "comprehensive-board-migration-description": "Führt umfassende Überprüfungen und Korrekturen für die Integrität der Board-Daten durch, einschließlich Listensortierung, Kartenpositionen und Swimlane-Struktur.", - "delete-duplicate-empty-lists-migration": "Lösche doppelte leere Listen", - "delete-duplicate-empty-lists-migration-description": "Löscht sicher leere doppelte Listen. Entfernt nur Listen, die keine Karten haben UND eine andere Liste mit dem gleichen Titel haben, der Karten enthält.", - "lost-cards": "Verlorene Karten", - "lost-cards-list": "Wiederhergestelle Artikel", - "restore-lost-cards-migration": "Verlorene Karten wiederherstellen", - "restore-lost-cards-migration-description": "Findet Karten und Listen mit fehlender swimlaneId oder listID und stellt sie wieder her. Erstellt eine 'LostCards' Swimlane um die verlorenen Dinge wieder sichtbar zu machen.", - "restore-all-archived-migration": "Alles Archivierte wiederherstellen", - "restore-all-archived-migration-description": "Stellt alle archivierten Swimmlanes, Listen und Karten wieder her. Repariert automatisch jede fehlende swimlaneId oder listId um sie sichtbar zu machen.", - "fix-missing-lists-migration": "Repariere fehlende Listen", - "fix-missing-lists-migration-description": "Entdeckt und repariert fehlende oder defekte Listen in der Brettstruktur.", - "fix-avatar-urls-migration": "Repariere Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Vollständig", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Gesamtfortschritt", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Repariere Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Lösche doppelte leere Listen", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", - "cleanup": "Aufräumen", - "cleanup-old-jobs": "Alte Aufgaben aufräumen", + "s3-region-description": "AWS S3 region (e.g., us-east-1)", + "s3-secret-key": "S3 Secret Key", + "s3-secret-key-description": "AWS S3 secret key for authentication", + "s3-secret-key-placeholder": "Enter S3 secret key", + "s3-secret-key-required": "S3 secret key is required", + "s3-settings-save-failed": "Failed to save S3 settings", + "s3-settings-saved": "S3 settings saved successfully", + "s3-ssl-enabled": "S3 SSL Enabled", + "s3-ssl-enabled-description": "Use SSL/TLS for S3 connections", + "save-s3-settings": "Save S3 Settings", + "schedule-board-archive": "Schedule Board Archive", + "schedule-board-backup": "Schedule Board Backup", + "schedule-board-cleanup": "Schedule Board Cleanup", + "scheduled-board-operations": "Scheduled Board Operations", + "start-all-migrations": "Start All Migrations", + "stop-all-migrations": "Stop All Migrations", + "test-s3-connection": "Test S3 Connection", + "writable-path": "Writable Path", + "writable-path-description": "Base directory path for file storage", + "add-job": "Add Job", + "attachment-migration": "Attachment Migration", + "attachment-monitoring": "Attachment Monitoring", + "attachment-settings": "Attachment Settings", + "attachment-storage-settings": "Storage Settings", + "automatic-migration": "Automatic Migration", + "back-to-settings": "Back to Settings", + "board-id": "Board ID", + "board-migration": "Board Migration", + "card-show-lists-on-minicard": "Show Lists on Minicard", + "cleanup": "Cleanup", + "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "abgeschlossen", - "conversion-info-text": "Diese Umstellung wird einmal pro Brett durchgeführt und verbessert die Performanz. Sie können das Brett normal verwenden.", - "converting-board": "Brett umwandeln", - "converting-board-description": "Umwandlung der Brettstruktur für verbesserte Funktionalität. Das kann einen Moment dauern.", + "conversion-info-text": "This conversion is performed once per board and improves performance. You can continue using the board normally.", + "converting-board": "Converting Board", + "converting-board-description": "Converting board structure for improved functionality. This may take a few moments.", "cpu-cores": "CPU Cores", "cpu-usage": "CPU Usage", - "current-action": "Laufender Vorgang", - "database-migration": "Datenbankmigration", - "database-migration-description": "Update der Datenbankstruktur für eine Verbesserung der Funktionalität und der Performanz. Das kann ein paar Minuten dauern.", - "database-migrations": "Datenbankmigration", - "days-old": "Tage alt", - "duration": "Dauer", - "errors": "Fehler", - "estimated-time-remaining": "Geschätzte Zeit übrig", - "every-1-day": "Jeden Tag", - "every-1-hour": "Jede Stunde", - "every-1-minute": "Jede Minute", - "every-10-minutes": "Alle 10 Minuten", - "every-30-minutes": "Alle 30 Minuten", - "every-5-minutes": "Alle 5 Minuten", - "every-6-hours": "Alle 6 Stunden", - "export-monitoring": "Exportüberwachung", - "filesystem-attachments": "Dateisystemanhänge", - "filesystem-size": "Dateisystem Größe", - "filesystem-storage": "Dateisystem Speicher", - "force-board-scan": "Erzwinge Brettscan", - "gridfs-attachments": "GridFS Anhänge", - "gridfs-size": "GridFS Größe", + "current-action": "Current Action", + "database-migration": "Database Migration", + "database-migration-description": "Updating database structure for improved functionality and performance. This process may take several minutes.", + "database-migrations": "Database Migrations", + "days-old": "Days Old", + "duration": "Duration", + "errors": "Errors", + "estimated-time-remaining": "Estimated time remaining", + "every-1-day": "Every 1 day", + "every-1-hour": "Every 1 hour", + "every-1-minute": "Every 1 minute", + "every-10-minutes": "Every 10 minutes", + "every-30-minutes": "Every 30 minutes", + "every-5-minutes": "Every 5 minutes", + "every-6-hours": "Every 6 hours", + "export-monitoring": "Export Monitoring", + "filesystem-attachments": "Filesystem Attachments", + "filesystem-size": "Filesystem Size", + "filesystem-storage": "Filesystem Storage", + "force-board-scan": "Force Board Scan", + "gridfs-attachments": "GridFS Attachments", + "gridfs-size": "GridFS Size", "gridfs-storage": "GridFS", - "hide-list-on-minicard": "Verberge Liste auf der Minikarte", - "idle-migration": "Untätige Migration", - "job-description": "Aufgabenbeschreibung", - "job-details": "Aufgabendetails", - "job-name": "Aufgabenname", - "job-queue": "Aufgabenwarteschlange", - "last-run": "Letzte Ausführung", - "max-concurrent": "Max. gleichzeitig", - "memory-usage": "Speicherauslastung", - "migrate-all-to-filesystem": "Migriere alles ins Dateisystem", - "migrate-all-to-gridfs": "Migriere alles ins GridFS", - "migrate-all-to-s3": "Migriere alles ins S3", - "migrated-attachments": "Migrierte Anhänge", - "migration-batch-size": "Batchgröße", - "migration-batch-size-description": "Anzahl der zu bearbeitenden Anhänge pro Batch (1-100)", + "hide-list-on-minicard": "Hide List on Minicard", + "idle-migration": "Idle Migration", + "job-description": "Job Description", + "job-details": "Job Details", + "job-name": "Job Name", + "job-queue": "Job Queue", + "last-run": "Last Run", + "max-concurrent": "Max Concurrent", + "memory-usage": "Memory Usage", + "migrate-all-to-filesystem": "Migrate All to Filesystem", + "migrate-all-to-gridfs": "Migrate All to GridFS", + "migrate-all-to-s3": "Migrate All to S3", + "migrated-attachments": "Migrated Attachments", + "migration-batch-size": "Batch Size", + "migration-batch-size-description": "Number of attachments to process in each batch (1-100)", "migration-cpu-threshold": "CPU Threshold (%)", - "migration-cpu-threshold-description": "Unterbreche Migration, wenn CPU Benutzung diesen Wert überschreitet (10-90%)", - "migration-delay-ms": "Verzögerung (ms)", - "migration-delay-ms-description": "Verzögerung zwischen Batches in Millisekunden (100-10000)", - "migration-detector": "Migrationdetektor", - "migration-info-text": "Datenbankmigrationen werden einmal durchgeführt und verbessern die Systemperformanz. Dieser Vorgang läuft im Hintergrund weiter, auch wenn Sie den Browser schließen.", + "migration-cpu-threshold-description": "Pause migration when CPU usage exceeds this percentage (10-90)", + "migration-delay-ms": "Delay (ms)", + "migration-delay-ms-description": "Delay between batches in milliseconds (100-10000)", + "migration-detector": "Migration Detector", + "migration-info-text": "Database migrations are performed once and improve system performance. The process continues in the background even if you close your browser.", "migration-log": "Migration Log", - "migration-markers": "Migrationsmarkierungen", - "migration-resume-failed": "Fortfahren der Migration misslungen", - "migration-resumed": "Migration fortgesetzt", - "migration-steps": "Migrationsschritte", - "migration-warning-text": "Bitte schließen Sie nicht den Browser während der Migration. Der Vorgang wird zwar im Hintergrund fortgesetzt, braucht aber länger.", - "monitoring-export-failed": "Export der Beobachtungsdaten misslungen", - "monitoring-refresh-failed": "Neuladen der Beobachtungsdaten misslungen", - "next": "Weiter", - "next-run": "Nächster Lauf", + "migration-markers": "Migration Markers", + "migration-resume-failed": "Failed to resume migration", + "migration-resumed": "Migration resumed", + "migration-steps": "Migration Steps", + "migration-warning-text": "Please do not close your browser during migration. The process will continue in the background but may take longer to complete.", + "monitoring-export-failed": "Failed to export monitoring data", + "monitoring-refresh-failed": "Failed to refresh monitoring data", + "next": "Next", + "next-run": "Next Run", "of": "von", - "operation-type": "Operationstyp", - "overall-progress": "Gesamtfortschritt", - "page": "Seite", - "pause": "Pause", - "pause-migration": "Migration unterbrechen", - "previous": "Zurück", - "refresh": "Neuladen", - "refresh-monitoring": "Beobachten neuladen", - "remaining-attachments": "Verbleibende Anhänge", - "resume-migration": "Migration fortsetzen", - "run-once": "Einmal ausführen", - "s3-attachments": "S3 Anhänge", - "s3-size": "S3 Größe", + "operation-type": "Operation Type", + "overall-progress": "Overall Progress", + "page": "Page", + "pause-migration": "Pause Migration", + "previous": "Previous", + "refresh": "Refresh", + "refresh-monitoring": "Refresh Monitoring", + "remaining-attachments": "Remaining Attachments", + "resume-migration": "Resume Migration", + "run-once": "Run once", + "s3-attachments": "S3 Attachments", + "s3-size": "S3 Size", "s3-storage": "S3", - "scanning-status": "Scanstatus", - "schedule": "Zeitplanung", - "search-boards-or-operations": "Durchsuche Bretter oder Vorgänge", - "show-list-on-minicard": "Zeige Liste auf der Minikarte", - "showChecklistAtMinicard": "Show Checklist at Minicard", - "showing": "Gezeigt", - "start-test-operation": "Starte Testvorgang", - "start-time": "Startzeit", - "step-progress": "Durchschreite Fortschritt", - "stop-migration": "Stoppe Migration", - "storage-distribution": "Speicherverteilung", - "system-resources": "Systemressourcen", - "total-attachments": "Gesamte Anhänge", - "total-operations": "Gesamte Vorgänge", - "total-size": "Gesamte Größe", - "unmigrated-boards": "Nicht migrierte Bretter", - "weight": "Gewicht", - "idle": "Untätig", - "complete": "Vollständig", - "cron": "Cron", - "current-step": "Current Step" + "scanning-status": "Scanning Status", + "schedule": "Schedule", + "search-boards-or-operations": "Search boards or operations...", + "show-list-on-minicard": "Show List on Minicard", + "showing": "Showing", + "start-test-operation": "Start Test Operation", + "start-time": "Start Time", + "step-progress": "Step Progress", + "stop-migration": "Stop Migration", + "storage-distribution": "Storage Distribution", + "system-resources": "System Resources", + "total-attachments": "Total Attachments", + "total-operations": "Total Operations", + "total-size": "Total Size", + "unmigrated-boards": "Unmigrated Boards", + "weight": "Weight", + "idle": "Idle", + "complete": "Complete", + "cron": "Cron" } diff --git a/imports/i18n/data/el-GR.i18n.json b/imports/i18n/data/el-GR.i18n.json index 6b42261f5..8a8ced735 100644 --- a/imports/i18n/data/el-GR.i18n.json +++ b/imports/i18n/data/el-GR.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "διεγράφη το σχόλιο %s", "activity-receivedDate": "η ημερομηνία λήψης άλλαξε σε %s από %s", "activity-startDate": "η ημερομηνία έναρξης άλλαξε σε %s από %s", - "allboards.starred": "Starred", - "allboards.templates": "Πρότυπα", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "υπέστη επεξεργασία η τιμή της προθεσμίας σε %s από %s", "activity-endDate": "η ημερομηνία λήξης άλλαξε σε %s από %s", "add-attachment": "Προσθήκη Συνημμένου", @@ -328,16 +316,10 @@ "comment-placeholder": "Συγγραφή Σχολίου", "comment-only": "Μόνο σχόλιο", "comment-only-desc": "Μπορεί μόνο να σχολιάζει σε κάρτες.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "Χωρίς σχόλια", "no-comments-desc": "Δε μπορεί να δει σχόλια και δραστηριότητες.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Μπορεί μόνο να μετακινεί κάρτες, να αναθέτει μια κάρτα στον εαυτό του και να σχολιάζει.", "computer": "Υπολογιστής", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Αντιγραφή του συνδέσμου της κάρτας στο clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Σύνδεση Κάρτας", @@ -356,7 +337,6 @@ "copyManyCardsPopup-format": "[ {\"title\": \"Τίτλος πρώτης κάρτας\", \"description\":\"Περιγραφή πρώτης κάρτας\"}, {\"title\":\"Τίτλος δεύτερης κάρτας\",\"description\":\"Περιγραφή δεύτερης κάρτας\"},{\"title\":\"Τίτλος τελευταίας κάρτας\",\"description\":\"Περιγραφή τελευταίας κάρτας\"} ]", "create": "Δημιουργία", "createBoardPopup-title": "Δημιουργία Πίνακα", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Εισαγωγή πίνακα", "createLabelPopup-title": "Δημιουργία Ετικέτας", "createCustomField": "Δημιουργία Πεδίου", @@ -377,9 +357,9 @@ "custom-fields": "Προσαρμοσμένα Πεδία", "date": "Ημερομηνία", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Απόρριψη", "default-avatar": "Default avatar", "delete": "Διαγραφή", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Επεξεργασία Ειδοποίησης", "editProfilePopup-title": "Επεξεργασία Προφίλ", "email": "Email", - "email-address": "Email Address", "email-enrollAccount-subject": "Ένας λογαριασμός δημιουργήθηκε για εσάς στο __siteName__", "email-enrollAccount-text": "Χαίρετε __user__,\n\nΓια να ξεκινήσετε να χρησιμοποιείτε αυτή την υπηρεσία, απλώς κάνετε κλικ στον παρακάτω σύνδεσμο.\n\n__url__\n\nΕυχαριστούμε.", "email-fail": "Η αποστολή του email απέτυχε", @@ -554,7 +533,6 @@ "log-in": "Σύνδεση", "loginPopup-title": "Σύνδεση", "memberMenuPopup-title": "Ρυθμίσεις Μελών", - "grey-icons": "Grey Icons", "members": "Μέλη", "menu": "Μενού", "move-selection": "Μετακίνηση επιλογής", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Μετακίνηση στην Αρχή", "moveCardToTop-title": "Μετακίνηση στο Τέλος", "moveSelectionPopup-title": "Μετακίνηση επιλογής", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Πολλαπλή Επιλογή", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "Κανένα αποτέλεσμα", "normal": "Κανονικό", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Η πρόσκληση δεν έχει λάβει αποδοχή ακόμη", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Αλλαγή ημερομηνίας λήψης", "editCardEndDatePopup-title": "Αλλαγή ημερομηνίας λήξης", "setCardColorPopup-title": "Ρύθμιση χρώματος", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Επιλέξτε ένα χρώμα", "setSwimlaneColorPopup-title": "Επιλέξτε ένα χρώμα", "setListColorPopup-title": "Επιλέξτε ένα χρώμα", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Διαγραφή Πίνακα;", "delete-board": "Διαγραφή Πίνακα", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Προεπιλογή", "defaultdefault": "Προεπιλογή", @@ -790,7 +761,7 @@ "subtask-settings": "Ρυθμίσεις υποεργασιών (subtasks)", "card-settings": "Ρυθμίσεις Κάρτας", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Ρυθμίσεις υποεργασιών (subtasks)", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Ρυθμίσεις Κάρτας", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/el.i18n.json b/imports/i18n/data/el.i18n.json index fb9e432b4..e74963576 100644 --- a/imports/i18n/data/el.i18n.json +++ b/imports/i18n/data/el.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "διεγράφη το σχόλιο %s", "activity-receivedDate": "η ημερομηνία λήψης άλλαξε σε %s από %s", "activity-startDate": "η ημερομηνία έναρξης άλλαξε σε %s από %s", - "allboards.starred": "Starred", - "allboards.templates": "Πρότυπα", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "υπέστη επεξεργασία η τιμή της προθεσμίας σε %s από %s", "activity-endDate": "η ημερομηνία λήξης άλλαξε σε %s από %s", "add-attachment": "Προσθήκη Συνημμένου", @@ -328,16 +316,10 @@ "comment-placeholder": "Συγγραφή Σχολίου", "comment-only": "Μόνο σχόλιο", "comment-only-desc": "Μπορεί μόνο να σχολιάζει σε κάρτες.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "Χωρίς σχόλια", "no-comments-desc": "Δε μπορεί να δει σχόλια και δραστηριότητες.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Μπορεί μόνο να μετακινεί κάρτες, να αναθέτει μια κάρτα στον εαυτό του και να σχολιάζει.", "computer": "Υπολογιστής", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Αντιγραφή του συνδέσμου της κάρτας στο clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Σύνδεση Κάρτας", @@ -356,7 +337,6 @@ "copyManyCardsPopup-format": "[ {\"title\": \"Τίτλος πρώτης κάρτας\", \"description\":\"Περιγραφή πρώτης κάρτας\"}, {\"title\":\"Τίτλος δεύτερης κάρτας\",\"description\":\"Περιγραφή δεύτερης κάρτας\"},{\"title\":\"Τίτλος τελευταίας κάρτας\",\"description\":\"Περιγραφή τελευταίας κάρτας\"} ]", "create": "Δημιουργία", "createBoardPopup-title": "Δημιουργία Πίνακα", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Εισαγωγή πίνακα", "createLabelPopup-title": "Δημιουργία Ετικέτας", "createCustomField": "Δημιουργία Πεδίου", @@ -377,9 +357,9 @@ "custom-fields": "Προσαρμοσμένα Πεδία", "date": "Ημερομηνία", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Απόρριψη", "default-avatar": "Default avatar", "delete": "Διαγραφή", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Επεξεργασία Ειδοποίησης", "editProfilePopup-title": "Επεξεργασία Προφίλ", "email": "Email", - "email-address": "Email Address", "email-enrollAccount-subject": "Ένας λογαριασμός δημιουργήθηκε για εσάς στο __siteName__", "email-enrollAccount-text": "Χαίρετε __user__,\n\nΓια να ξεκινήσετε να χρησιμοποιείτε αυτή την υπηρεσία, απλώς κάνετε κλικ στον παρακάτω σύνδεσμο.\n\n__url__\n\nΕυχαριστούμε.", "email-fail": "Η αποστολή του email απέτυχε", @@ -554,7 +533,6 @@ "log-in": "Σύνδεση", "loginPopup-title": "Σύνδεση", "memberMenuPopup-title": "Ρυθμίσεις Μελών", - "grey-icons": "Grey Icons", "members": "Μέλη", "menu": "Μενού", "move-selection": "Μετακίνηση επιλογής", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Μετακίνηση στην Αρχή", "moveCardToTop-title": "Μετακίνηση στο Τέλος", "moveSelectionPopup-title": "Μετακίνηση επιλογής", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Πολλαπλή Επιλογή", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "Κανένα αποτέλεσμα", "normal": "Κανονικό", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "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", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Αλλαγή ημερομηνίας λήψης", "editCardEndDatePopup-title": "Αλλαγή ημερομηνίας λήξης", "setCardColorPopup-title": "Ρύθμιση χρώματος", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Επιλέξτε ένα χρώμα", "setSwimlaneColorPopup-title": "Επιλέξτε ένα χρώμα", "setListColorPopup-title": "Επιλέξτε ένα χρώμα", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Διαγραφή Πίνακα;", "delete-board": "Διαγραφή Πίνακα", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Προεπιλογή", "defaultdefault": "Προεπιλογή", @@ -790,7 +761,7 @@ "subtask-settings": "Ρυθμίσεις υποεργασιών (subtasks)", "card-settings": "Ρυθμίσεις Κάρτας", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Ρυθμίσεις υποεργασιών (subtasks)", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Ρυθμίσεις Κάρτας", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/en-BR.i18n.json b/imports/i18n/data/en-BR.i18n.json index 7e96f7719..726f9caac 100644 --- a/imports/i18n/data/en-BR.i18n.json +++ b/imports/i18n/data/en-BR.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/en-DE.i18n.json b/imports/i18n/data/en-DE.i18n.json index 8575185f3..3f5b3dff9 100644 --- a/imports/i18n/data/en-DE.i18n.json +++ b/imports/i18n/data/en-DE.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/en-GB.i18n.json b/imports/i18n/data/en-GB.i18n.json index d48099de1..12e76c28d 100644 --- a/imports/i18n/data/en-GB.i18n.json +++ b/imports/i18n/data/en-GB.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/en-IT.i18n.json b/imports/i18n/data/en-IT.i18n.json index 7e96f7719..726f9caac 100644 --- a/imports/i18n/data/en-IT.i18n.json +++ b/imports/i18n/data/en-IT.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/en-MY.i18n.json b/imports/i18n/data/en-MY.i18n.json index 7e96f7719..726f9caac 100644 --- a/imports/i18n/data/en-MY.i18n.json +++ b/imports/i18n/data/en-MY.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/en-YS.i18n.json b/imports/i18n/data/en-YS.i18n.json index 7e96f7719..726f9caac 100644 --- a/imports/i18n/data/en-YS.i18n.json +++ b/imports/i18n/data/en-YS.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/en.i18n.json b/imports/i18n/data/en.i18n.json index d48099de1..12e76c28d 100644 --- a/imports/i18n/data/en.i18n.json +++ b/imports/i18n/data/en.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/en_AU.i18n.json b/imports/i18n/data/en_AU.i18n.json index d48099de1..12e76c28d 100644 --- a/imports/i18n/data/en_AU.i18n.json +++ b/imports/i18n/data/en_AU.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/en_ID.i18n.json b/imports/i18n/data/en_ID.i18n.json index d48099de1..12e76c28d 100644 --- a/imports/i18n/data/en_ID.i18n.json +++ b/imports/i18n/data/en_ID.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/en_SG.i18n.json b/imports/i18n/data/en_SG.i18n.json index d48099de1..12e76c28d 100644 --- a/imports/i18n/data/en_SG.i18n.json +++ b/imports/i18n/data/en_SG.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/en_TR.i18n.json b/imports/i18n/data/en_TR.i18n.json index d48099de1..12e76c28d 100644 --- a/imports/i18n/data/en_TR.i18n.json +++ b/imports/i18n/data/en_TR.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/en_ZA.i18n.json b/imports/i18n/data/en_ZA.i18n.json index d48099de1..12e76c28d 100644 --- a/imports/i18n/data/en_ZA.i18n.json +++ b/imports/i18n/data/en_ZA.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/eo.i18n.json b/imports/i18n/data/eo.i18n.json index a449c7505..4c1de4c6f 100644 --- a/imports/i18n/data/eo.i18n.json +++ b/imports/i18n/data/eo.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Komputilo", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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 tavolon", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Dato", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Redakti profilon", "email": "Retpoŝtadreso", - "email-address": "Email Address", "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": "Malsukcesis sendi retpoŝton", @@ -554,7 +533,6 @@ "log-in": "Ensaluti", "loginPopup-title": "Ensaluti", "memberMenuPopup-title": "Membraj agordoj", - "grey-icons": "Grey Icons", "members": "Membroj", "menu": "Menuo", "move-selection": "Movi elekton", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Movi suben", "moveCardToTop-title": "Movi supren", "moveSelectionPopup-title": "Movi elekton", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "Neniaj rezultoj", "normal": "Normala", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Defaŭlto", "defaultdefault": "Defaŭlto", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/es-AR.i18n.json b/imports/i18n/data/es-AR.i18n.json index a8fa18168..304edc8e4 100644 --- a/imports/i18n/data/es-AR.i18n.json +++ b/imports/i18n/data/es-AR.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "comentario %s eliminado", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Plantillas", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Agregar Adjunto", @@ -328,16 +316,10 @@ "comment-placeholder": "Comentar", "comment-only": "Comentar solamente", "comment-only-desc": "Puede comentar en tarjetas solamente.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "Sin comentarios", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computadora", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copiar enlace a tarjeta en el portapapeles", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Tarjeta vinculada", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Importar tablero", "createLabelPopup-title": "Crear Etiqueta", "createCustomField": "Crear Campo", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Fecha", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Rechazar", "default-avatar": "Avatar por defecto", "delete": "Borrar", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Editar Notificación", "editProfilePopup-title": "Editar Perfil", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Entrar", "loginPopup-title": "Entrar", "memberMenuPopup-title": "Opciones de Miembros", - "grey-icons": "Grey Icons", "members": "Miembros", "menu": "Menú", "move-selection": "Mover selección", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Mover al Final", "moveCardToTop-title": "Mover al Tope", "moveSelectionPopup-title": "Mover selección", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selección", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No hay resultados", "normal": "Normal", "normal-desc": "Puede ver y editar tarjetas. No puede cambiar opciones.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitación no aceptada todavía", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Recibí actualizaciones en cualquier tablero, lista, o tarjeta que estés siguiendo", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Cambiar fecha de recepción", "editCardEndDatePopup-title": "Cambiar fecha de término", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/es-CL.i18n.json b/imports/i18n/data/es-CL.i18n.json index ac479dedf..40da9c070 100644 --- a/imports/i18n/data/es-CL.i18n.json +++ b/imports/i18n/data/es-CL.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "comentario eliminado", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Plantillas", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Añadir adjunto", @@ -328,16 +316,10 @@ "comment-placeholder": "Escribir comentario", "comment-only": "Sólo comentarios", "comment-only-desc": "Solo puedes comentar en las tarjetas.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No hay comentarios", "no-comments-desc": "No se pueden mostrar comentarios ni actividades.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Trabajador", "worker-desc": "Solo puede mover tarjetas, asignarse a la tarjeta y comentar.", "computer": "el ordenador", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copiar el enlace de la tarjeta al portapapeles", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Enlazar tarjeta", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Importar un tablero", "createLabelPopup-title": "Crear una etiqueta", "createCustomField": "Crear un campo", @@ -377,9 +357,9 @@ "custom-fields": "Campos personalizados", "date": "Fecha", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Declinar", "default-avatar": "Avatar por defecto", "delete": "Eliminar", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Editar las notificaciones", "editProfilePopup-title": "Editar el perfil", "email": "Correo electrónico", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Iniciar sesión", "loginPopup-title": "Iniciar sesión", "memberMenuPopup-title": "Preferencias de miembro", - "grey-icons": "Grey Icons", "members": "Miembros", "menu": "Menú", "move-selection": "Mover la selección", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Mover al final", "moveCardToTop-title": "Mover al principio", "moveSelectionPopup-title": "Mover la selección", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Selección múltiple", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "Sin resultados", "normal": "Normal", "normal-desc": "Puedes ver y editar tarjetas. No puedes cambiar la configuración.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "La invitación no ha sido aceptada aún", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Recibir actuaizaciones de cualquier tablero, lista o tarjeta que estés vigilando", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Cambiar la fecha de recepción", "editCardEndDatePopup-title": "Cambiar la fecha de finalización", "setCardColorPopup-title": "Cambiar el color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Elegir un color", "setSwimlaneColorPopup-title": "Elegir un color", "setListColorPopup-title": "Elegir un color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "Se eliminarán todas las listas, tarjetas, etiquetas y actividades, y no podrás recuperar los contenidos del tablero. Esta acción no puede deshacerse.", "boardDeletePopup-title": "¿Eliminar el tablero?", "delete-board": "Eliminar el tablero", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtareas para el tablero __board__", "default": "Por defecto", "defaultdefault": "Por defecto", @@ -790,7 +761,7 @@ "subtask-settings": "Preferencias de las subtareas", "card-settings": "Preferencias de la tarjeta", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Preferencias de las subtareas", + "boardSubtaskSettingsPopup-title": "Preferencias de las subtareas del tablero", "boardCardSettingsPopup-title": "Preferencias de la tarjeta", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Depositar subtareas en este tablero:", @@ -961,8 +932,6 @@ "a-endAt": "cambiada la hora de finalización a", "a-startAt": "cambiada la hora de comienzo a", "a-receivedAt": "cambiada la hora de recepción a", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "está próxima la hora de vencimiento actual %s", "pastdue": "se sobrepasó la hora de vencimiento actual%s", "duenow": "la hora de vencimiento actual %s es hoy", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completada", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/es-LA.i18n.json b/imports/i18n/data/es-LA.i18n.json index d48099de1..12e76c28d 100644 --- a/imports/i18n/data/es-LA.i18n.json +++ b/imports/i18n/data/es-LA.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/es-MX.i18n.json b/imports/i18n/data/es-MX.i18n.json index 130c2e12d..10361e319 100644 --- a/imports/i18n/data/es-MX.i18n.json +++ b/imports/i18n/data/es-MX.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "comentario eliminado %s", "activity-receivedDate": "fecha de recepción editada para %s de %s", "activity-startDate": "fecha de inicio editada a %s de %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "fecha de vencimiento editada a %s de %s", "activity-endDate": "editada la fecha de finalización a %s de %s", "add-attachment": "Agregar adjunto", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Miembros", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/es-PE.i18n.json b/imports/i18n/data/es-PE.i18n.json index 69b5f49de..fa8a1988c 100644 --- a/imports/i18n/data/es-PE.i18n.json +++ b/imports/i18n/data/es-PE.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "comentario eliminado", "activity-receivedDate": "editada la fecha de recepción a %s de %s", "activity-startDate": "editada la fecha de inicio a %s de %s", - "allboards.starred": "Starred", - "allboards.templates": "Plantillas", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "editada la fecha de vencimiento a %s de %s", "activity-endDate": "editada la fecha de finalización a %s de %s", "add-attachment": "Agregar adjunto", @@ -328,16 +316,10 @@ "comment-placeholder": "Escribir comentario", "comment-only": "Sólo comentarios", "comment-only-desc": "Sólo puede comentar en las tarjetas.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No hay comentarios", "no-comments-desc": "No se pueden mostrar comentarios ni actividades.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Trabajador", "worker-desc": "Sólo puede mover tarjetas, asignarse a la tarjeta y comentar.", "computer": "Computadora", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copiar el enlace de la tarjeta al portapapeles", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Enlazar tarjeta", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Importar un tablero", "createLabelPopup-title": "Crear una etiqueta", "createCustomField": "Crear un campo", @@ -377,9 +357,9 @@ "custom-fields": "Campos personalizados", "date": "Fecha", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Declinar", "default-avatar": "Avatar por defecto", "delete": "Eliminar", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Editar las notificaciones", "editProfilePopup-title": "Editar el perfil", "email": "Correo electrónico", - "email-address": "Email Address", "email-enrollAccount-subject": "Cuenta creada en __siteName__", "email-enrollAccount-text": "Hola __user__,\n\nPara empezar a utilizar el servicio, simplemente haga clic en el siguiente enlace.\n\n__url__\n\nGracias.", "email-fail": "Error al enviar el correo", @@ -554,7 +533,6 @@ "log-in": "Iniciar sesión", "loginPopup-title": "Iniciar sesión", "memberMenuPopup-title": "Configuración de miembros", - "grey-icons": "Grey Icons", "members": "Miembros", "menu": "Menú", "move-selection": "Mover la selección", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Mover al final", "moveCardToTop-title": "Mover al principio", "moveSelectionPopup-title": "Mover la selección", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Selección múltiple", "multi-selection-label": "Establecer etiqueta para la selección", "multi-selection-member": "Establecer miembro para la selección", @@ -578,8 +554,6 @@ "no-results": "Sin resultados", "normal": "Normal", "normal-desc": "Puede ver y editar las tarjetas. No puede cambiar la configuración.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "La invitación no ha sido aceptada aún", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Recibir actualizaciones de cualquier tablero, lista o tarjeta que esté vigilando", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Cambiar la fecha de recepción", "editCardEndDatePopup-title": "Cambiar la fecha de finalización", "setCardColorPopup-title": "Cambiar el color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Elegir un color", "setSwimlaneColorPopup-title": "Elegir un color", "setListColorPopup-title": "Elegir un color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "Se eliminarán todas las listas, tarjetas, etiquetas y actividades, y no podrás recuperar los contenidos del tablero. Esta acción no puede deshacerse.", "boardDeletePopup-title": "¿Eliminar el tablero?", "delete-board": "Eliminar el tablero", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtareas para el tablero __board__", "default": "Por defecto", "defaultdefault": "Por defecto", @@ -790,7 +761,7 @@ "subtask-settings": "Configuración de subtareas", "card-settings": "Configuración de tarjeta", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Configuración de subtareas", + "boardSubtaskSettingsPopup-title": "Configuración de subtareas del tablero", "boardCardSettingsPopup-title": "Configuración de tarjeta", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Depositar subtareas en este tablero:", @@ -961,8 +932,6 @@ "a-endAt": "cambiada la hora de finalización a", "a-startAt": "cambiada la hora de inicio a", "a-receivedAt": "cambiada la hora de recepción a", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "está próxima la hora de vencimiento actual %s", "pastdue": "se sobrepasó la hora de vencimiento actual %s", "duenow": "la hora de vencimiento actual %s es hoy", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "Todos los usuarios", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Estado", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completada", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/es-PY.i18n.json b/imports/i18n/data/es-PY.i18n.json index d48099de1..12e76c28d 100644 --- a/imports/i18n/data/es-PY.i18n.json +++ b/imports/i18n/data/es-PY.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/es.i18n.json b/imports/i18n/data/es.i18n.json index 73e74c704..60f3d65f4 100644 --- a/imports/i18n/data/es.i18n.json +++ b/imports/i18n/data/es.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "comentario eliminado", "activity-receivedDate": "editada la fecha de recepción a %s de %s", "activity-startDate": "editada la fecha de inicio a %s de %s", - "allboards.starred": "Starred", - "allboards.templates": "Plantillas", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "editada la fecha de vencimiento a %s de %s", "activity-endDate": "editada la fecha de finalización a %s de %s", "add-attachment": "Añadir adjunto", @@ -328,16 +316,10 @@ "comment-placeholder": "Escribir comentario", "comment-only": "Sólo comentarios", "comment-only-desc": "Solo puedes comentar en las tarjetas.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "¿Estás seguro que quieres borrar el comentario?", "deleteCommentPopup-title": "¿Borrar comentario?", "no-comments": "No hay comentarios", "no-comments-desc": "No se pueden mostrar comentarios ni actividades.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Trabajador", "worker-desc": "Solo puede mover tarjetas, asignarse a la tarjeta y comentar.", "computer": "el ordenador", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "¿Estás seguro de querer eliminar la lista de tareas?", "subtaskDeletePopup-title": "¿Borrar subtarea?", "checklistDeletePopup-title": "¿Borrar la lista de tareas?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copiar el enlace de la tarjeta al portapapeles", "copy-text-to-clipboard": "Copiar texto en el portapapeles", "linkCardPopup-title": "Enlazar tarjeta", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "añadir plantilla de contenedor", "chooseBoardSourcePopup-title": "Importar un tablero", "createLabelPopup-title": "Crear una etiqueta", "createCustomField": "Crear un campo", @@ -377,9 +357,9 @@ "custom-fields": "Campos personalizados", "date": "Fecha", "date-format": "Formato de fecha", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Declinar", "default-avatar": "Avatar por defecto", "delete": "Eliminar", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Editar las notificaciones", "editProfilePopup-title": "Editar el perfil", "email": "Correo electrónico", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Iniciar sesión", "loginPopup-title": "Iniciar sesión", "memberMenuPopup-title": "Preferencias de miembro", - "grey-icons": "Grey Icons", "members": "Miembros", "menu": "Menú", "move-selection": "Mover la selección", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Mover al final", "moveCardToTop-title": "Mover al principio", "moveSelectionPopup-title": "Mover la selección", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Selección múltiple", "multi-selection-label": "Establecer etiqueta para la selección", "multi-selection-member": "Establecer miembro para la selección", @@ -578,8 +554,6 @@ "no-results": "Sin resultados", "normal": "Normal", "normal-desc": "Puedes ver y editar tarjetas. No puedes cambiar la configuración.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "La invitación no ha sido aceptada aún", "notify-participate": "Recibir actualizaciones de cualquier tarjeta en la que participes como creador o miembro", "notify-watch": "Recibir actuaizaciones de cualquier tablero, lista o tarjeta que estés vigilando", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Cambiar la fecha de recepción", "editCardEndDatePopup-title": "Cambiar la fecha de finalización", "setCardColorPopup-title": "Cambiar el color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Elegir un color", "setSwimlaneColorPopup-title": "Elegir un color", "setListColorPopup-title": "Elegir un color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "Se eliminarán todas las listas, tarjetas, etiquetas y actividades, y no podrás recuperar los contenidos del tablero. Esta acción no puede deshacerse.", "boardDeletePopup-title": "¿Eliminar el tablero?", "delete-board": "Eliminar el tablero", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtareas para el tablero __board__", "default": "Por defecto", "defaultdefault": "Por defecto", @@ -790,7 +761,7 @@ "subtask-settings": "Preferencias de las subtareas", "card-settings": "Preferencias de la tarjeta", "minicard-settings": "Configuración de minitarjeta", - "boardSubtaskSettingsPopup-title": "Preferencias de las subtareas", + "boardSubtaskSettingsPopup-title": "Preferencias de las subtareas del tablero", "boardCardSettingsPopup-title": "Preferencias de la tarjeta", "boardMinicardSettingsPopup-title": "Preferencias de minitarjetas", "deposit-subtasks-board": "Depositar subtareas en este tablero:", @@ -961,8 +932,6 @@ "a-endAt": "cambiada la hora de finalización a", "a-startAt": "cambiada la hora de comienzo a", "a-receivedAt": "cambiada la hora de recepción a", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "está próxima la hora de vencimiento actual %s", "pastdue": "se sobrepasó la hora de vencimiento actual%s", "duenow": "la hora de vencimiento actual %s es hoy", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Yo", "dueCardsViewChange-choice-all": "Todos los usuarios", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Tarjetas Rotas", "board-title-not-found": "Tablero '%s' no encontrado.", "swimlane-title-not-found": "Carril '%s' no encontrado.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Ocultar todos los elementos de la lista de verificación", "support": "Soporte", "supportPopup-title": "Soporte", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Página de accesibilidad habilitada", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Completado", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Estado", - "migration-progress-details": "Detalles", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completada", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Peso", "idle": "Inactivo", "complete": "Completado", - "cron": "Programación", - "current-step": "Current Step" + "cron": "Programación" } diff --git a/imports/i18n/data/es_CO.i18n.json b/imports/i18n/data/es_CO.i18n.json index d48099de1..12e76c28d 100644 --- a/imports/i18n/data/es_CO.i18n.json +++ b/imports/i18n/data/es_CO.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/et-EE.i18n.json b/imports/i18n/data/et-EE.i18n.json index 1e8f56c4d..ba402d26f 100644 --- a/imports/i18n/data/et-EE.i18n.json +++ b/imports/i18n/data/et-EE.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "kustutatud kommentaar %s", "activity-receivedDate": "redigeeritud saabunud kuupäev %s-i %s-i", "activity-startDate": "redigeeritud alguskuupäev %s-i %s-i alguskuupäevaks", - "allboards.starred": "Starred", - "allboards.templates": "Mallid", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "redigeeritud tähtaeg on %s of %s", "activity-endDate": "redigeeritud lõpukuupäev %s-i %s-i lõpukuupäevaks", "add-attachment": "Lisa lisa", @@ -328,16 +316,10 @@ "comment-placeholder": "Kirjutage kommentaar", "comment-only": "Ainult kommentaar", "comment-only-desc": "Saab kommenteerida ainult kaarte.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Kas olete kindel, et soovite kommentaari kustutada?", "deleteCommentPopup-title": "Kuidas kustutada?", "no-comments": "Ei kommentaare", "no-comments-desc": "Ei näe kommentaare ja tegevusi.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Töötaja", "worker-desc": "Saab ainult liigutada kaarte, määrata ennast kaardile ja kommenteerida.", "computer": "Arvuti", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Kas olete kindel, et soovite kontrollnimekirja kustutada?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Kustuta kontrollnimekiri?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Kopeeri kaardi link lõikelauale", "copy-text-to-clipboard": "Teksti kopeerimine lõikelauale", "linkCardPopup-title": "Linkkaart", @@ -356,7 +337,6 @@ "copyManyCardsPopup-format": "[ {\"title\": {\"title\": \"First card title\", \"description\": \"First card description\"}, {\"title\": \"Second card title\", \"description\": \"Second card description\"},{\"title\": \"Last card title\", \"description\": \"Last card description\"}, {\"title\": \"Last card title\", \"description\": \"Last card description\"} ]", "create": "Loo", "createBoardPopup-title": "Loo juhatus", - "createTemplateContainerPopup-title": "Malli konteineri lisamine", "chooseBoardSourcePopup-title": "Impordilaua", "createLabelPopup-title": "Loo silt", "createCustomField": "Loo väli", @@ -377,9 +357,9 @@ "custom-fields": "Kohandatud väljad", "date": "Kuupäev", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Langus", "default-avatar": "Default avatar", "delete": "Kustuta", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Teavituse muutmine", "editProfilePopup-title": "Profiilide muutmine", "email": "E-post", - "email-address": "Email Address", "email-enrollAccount-subject": "Teie jaoks loodud konto __siteName__", "email-enrollAccount-text": "Tere __user__,\n\nTeenuse kasutamise alustamiseks klõpsake lihtsalt alloleval lingil.\n\n__url__\n\nTänan teid.", "email-fail": "E-posti saatmine ebaõnnestus", @@ -554,7 +533,6 @@ "log-in": "Logi sisse", "loginPopup-title": "Logi sisse", "memberMenuPopup-title": "Liikme seaded", - "grey-icons": "Grey Icons", "members": "Liikmed", "menu": "Menüü", "move-selection": "Liikumise valik", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Liigu allapoole", "moveCardToTop-title": "Liigu ülespoole", "moveSelectionPopup-title": "Liikumise valik", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Mitmikvalik", "multi-selection-label": "Valiku sildi määramine", "multi-selection-member": "Valiku liige valiku tegemiseks", @@ -578,8 +554,6 @@ "no-results": "Tulemusi ei ole", "normal": "Tavaline", "normal-desc": "Saab vaadata ja redigeerida kaarte. Ei saa seadistusi muuta.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Kutse ei ole veel vastu võetud", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Saate uuendusi kõikidest tahvlitest, nimekirjadest või kaartidest, mida jälgite.", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Muuda saadud kuupäeva", "editCardEndDatePopup-title": "Muuda lõppkuupäeva", "setCardColorPopup-title": "Värvi määramine", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Vali värv", "setSwimlaneColorPopup-title": "Vali värv", "setListColorPopup-title": "Vali värv", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "Kõik nimekirjad, kaardid, sildid ja tegevused kustutatakse ja te ei saa tahvli sisu taastada. Tühistamist ei ole võimalik teha.", "boardDeletePopup-title": "Kustuta juhatus?", "delete-board": "Kustuta juhatus", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Juhatuse __board__ alamülesanded", "default": "Vaikimisi", "defaultdefault": "Vaikimisi", @@ -790,7 +761,7 @@ "subtask-settings": "Alaülesannete seaded", "card-settings": "Kaardi seaded", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Alaülesannete seaded", + "boardSubtaskSettingsPopup-title": "Juhatuse alamülesannete seaded", "boardCardSettingsPopup-title": "Kaardi seaded", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Hoiustage alamülesanded sellele tahvlile:", @@ -961,8 +932,6 @@ "a-endAt": "muudetud lõpuaeg, et olla", "a-startAt": "muudetud algusaeg on", "a-receivedAt": "muudetud saadud aeg, et olla", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "praegune tähtaeg %s läheneb", "pastdue": "praegune tähtaeg %s on möödas", "duenow": "praegune tähtaeg %s on täna", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Mina", "dueCardsViewChange-choice-all": "Kõik kasutajad", "dueCardsViewChange-choice-all-description": "Näitab kõik lõpetamata kaardid, millel on *Tähtaeg* ja mille jaoks kasutajal on luba.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Purunenud kaardid", "board-title-not-found": "Lauda '%s' ei leitud.", "swimlane-title-not-found": "Swimlane '%s' ei leitud.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Staatus", - "migration-progress-details": "Üksikasjad", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Lõpetatud", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/eu.i18n.json b/imports/i18n/data/eu.i18n.json index fca83fb9d..2ab724fcc 100644 --- a/imports/i18n/data/eu.i18n.json +++ b/imports/i18n/data/eu.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "%s iruzkina ezabatu da", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Txantiloiak", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Gehitu eranskina", @@ -328,16 +316,10 @@ "comment-placeholder": "Idatzi iruzkin bat", "comment-only": "Iruzkinak besterik ez", "comment-only-desc": "Iruzkinak txarteletan soilik egin daitezke", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Ziur zaude iruzkina ezabatu nahi duzula?", "deleteCommentPopup-title": "Ezabatu iruzkina?", "no-comments": "Iruzkinik ez", "no-comments-desc": "Ezin dira iruzkinak eta aktibitateak ikusi.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Langilea", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Ordenagailua", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Ziur kontrol-zerrenda ezabatu nahi duzula?", "subtaskDeletePopup-title": "Ezabatu azpi-ataza?", "checklistDeletePopup-title": "Ezabatu kontrol-zerrenda?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Kopiatu txartela arbelera", "copy-text-to-clipboard": "Kopiatu testua arbelean", "linkCardPopup-title": "Estekatu txartela", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Gehitu txantiloien edukiontzia", "chooseBoardSourcePopup-title": "Inportatu arbela", "createLabelPopup-title": "Sortu etiketa", "createCustomField": "Sortu eremua", @@ -377,9 +357,9 @@ "custom-fields": "Eremu pertsonalizatuak", "date": "Data", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Ukatu", "default-avatar": "Lehenetsitako avatarra", "delete": "Ezabatu", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Editatu jakinarazpena", "editProfilePopup-title": "Editatu profila", "email": "e-posta", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Hasi saioa", "loginPopup-title": "Hasi saioa", "memberMenuPopup-title": "Kidearen ezarpenak", - "grey-icons": "Grey Icons", "members": "Kideak", "menu": "Menua", "move-selection": "Lekuz aldatu hautaketa", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Eraman behera", "moveCardToTop-title": "Eraman gora", "moveSelectionPopup-title": "Lekuz aldatu hautaketa", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Hautaketa anitza", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "Emaitzarik ez", "normal": "Arrunta", "normal-desc": "Txartelak ikusi eta editatu ditzake. Ezin ditu ezarpenak aldatu.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Gonbidapena ez da oraindik onartu", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Jaso ikuskatzen dituzun arbel, zerrenda edo txartelen jakinarazpenak", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Aldatu bukaerako data", "setCardColorPopup-title": "Ezarri kolorea", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Aukeratu kolore bat", "setSwimlaneColorPopup-title": "Aukeratu kolore bat", "setListColorPopup-title": "Aukeratu kolore bat", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "Zerrenda, txartel eta aktibitate guztiak ezabatuko dira eta ezingo dituzu berreskuratu arbelaren edukiak. Atzera bueltarik ez du.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Lehenetsia", "defaultdefault": "Lehenetsia", @@ -790,7 +761,7 @@ "subtask-settings": "Azpiatazaren ezarpenak", "card-settings": "Txartelaren ezarpenak", "minicard-settings": "Minitxartelaren ezarpenak", - "boardSubtaskSettingsPopup-title": "Azpiatazaren ezarpenak", + "boardSubtaskSettingsPopup-title": "Arbeleko azpiatazaren ezarpenak", "boardCardSettingsPopup-title": "Txartelaren ezarpenak", "boardMinicardSettingsPopup-title": "Minitxartelaren ezarpenak", "deposit-subtasks-board": "Ipini azpiatazak arbel honetan:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Erabiltzaileak baimena duen arbeletako *Epemuga* data duten txartel osatugabe guztiak erakusten ditu.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Puskatutako txartelak", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Ezkutatu kontrol-zerrendako elementu guztiak", "support": "Laguntza", "supportPopup-title": "Laguntza", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "irisgarritasuna", "accessibility-page-enabled": "Irisgarritasun orria gaituta", "accessibility-info-not-added-yet": "Irisgarritasun informaziorik ez da gehitu oraindik", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/fa-IR.i18n.json b/imports/i18n/data/fa-IR.i18n.json index d2fe6c440..ec646a90d 100644 --- a/imports/i18n/data/fa-IR.i18n.json +++ b/imports/i18n/data/fa-IR.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "%s نظر حذف شد", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "قالب‌ها", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "افزودن ضمیمه", @@ -328,16 +316,10 @@ "comment-placeholder": "درج نظر", "comment-only": "فقط نظر", "comment-only-desc": "فقط می‌تواند روی کارت‌ها نظر دهد.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "آیا مطمئنید که می خواهید این نظر را پاک کنید؟", "deleteCommentPopup-title": "نظر پاک شود؟", "no-comments": "هیچ کامنتی موجود نیست", "no-comments-desc": "نظرات و فعالیت ها را نمی توان دید.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "کارگر", "worker-desc": "تنها می‌توانید کارت‌ها را جابجا کنید، آنها را به خود محول کنید و نظر دهید.", "computer": "رایانه", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "درج پیوند کارت در حافظه", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "ارتباط دادن کارت", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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": "ایجاد برد", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "وارد کردن برد", "createLabelPopup-title": "ایجاد لیبل", "createCustomField": "ایجاد فیلد", @@ -377,9 +357,9 @@ "custom-fields": "فیلدهای شخصی", "date": "تاریخ", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "رد", "default-avatar": "آواتار پیش‌فرض", "delete": "حذف", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "اصلاح اعلان", "editProfilePopup-title": "ویرایش پروفایل", "email": "پست الکترونیک", - "email-address": "Email Address", "email-enrollAccount-subject": "یک حساب کاربری برای شما در __siteName__ ایجاد شد", "email-enrollAccount-text": "سلام __user__ \nبرای شروع به استفاده از این سرویس برروی آدرس زیر کلیک کنید.\n__url__\nبا تشکر.", "email-fail": "عدم موفقیت در فرستادن رایانامه", @@ -554,7 +533,6 @@ "log-in": "ورود", "loginPopup-title": "ورود", "memberMenuPopup-title": "تنظیمات اعضا", - "grey-icons": "Grey Icons", "members": "اعضا", "menu": "منو", "move-selection": "انتقال مورد انتخابی", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "انتقال به پایین", "moveCardToTop-title": "انتقال به بالا", "moveSelectionPopup-title": "انتقال مورد انتخابی", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "امکان چند انتخابی", "multi-selection-label": "تغییر لیبل انتخاب‌شده‌ها", "multi-selection-member": "تغییر عضو برای انتخاب‌شده‌ها", @@ -578,8 +554,6 @@ "no-results": "بدون نتیجه", "normal": "عادی", "normal-desc": "امکان نمایش و تنظیم کارت بدون امکان تغییر تنظیمات", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "دعوت نامه هنوز پذیرفته نشده است", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "اطلاع رسانی از هرگونه تغییر در بردها، لیست‌ها یا کارت‌هایی که از آنها دیده‌بانی می‌کنید", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "تغییر تاریخ رسید", "editCardEndDatePopup-title": "تغییر تاریخ پایان", "setCardColorPopup-title": "انتخاب رنگ", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "انتخاب کردن رنگ", "setSwimlaneColorPopup-title": "انتخاب کردن رنگ", "setListColorPopup-title": "انتخاب کردن رنگ", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "تمام لیست ها، کارت ها، لیبل ها و فعالیت ها حذف خواهند شد و شما نمی توانید محتوای برد را بازیابی کنید. هیچ واکنشی وجود ندارد", "boardDeletePopup-title": "حذف برد؟", "delete-board": "حذف برد", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "زیروظایفِ برد __board__", "default": "پیش‌فرض", "defaultdefault": "پیش‌فرض", @@ -790,7 +761,7 @@ "subtask-settings": "تنظیمات زیروظایف", "card-settings": "تنظیمات کارت", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "تنظیمات زیروظایف", + "boardSubtaskSettingsPopup-title": "تنظیمات زیروظایف برد", "boardCardSettingsPopup-title": "تنظیمات کارت", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "افزودن ریزکار به برد:", @@ -961,8 +932,6 @@ "a-endAt": "زمان پایان ویرایش‌شده به", "a-startAt": "زمان شروع ویرایش‌شده به", "a-receivedAt": "زمان رسیدن ویرایش شده به", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "زمان سررسید فعلی %s د رحال رسیدن است", "pastdue": "زمان سررسید فعلی %s گذشته‌است", "duenow": "زمان سررسید فعلی %s امروز است", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "من", "dueCardsViewChange-choice-all": "تمام کاربران", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "کارت های شکسته", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "پنهان کردن همه موارد چک لیست", "support": "پشتیبانی", "supportPopup-title": "پشتیبانی", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "وضعیت", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "تمام شده", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/fa.i18n.json b/imports/i18n/data/fa.i18n.json index 8ca40fd3b..e5298ea33 100644 --- a/imports/i18n/data/fa.i18n.json +++ b/imports/i18n/data/fa.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "%s نظر حذف شد", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "قالب‌ها", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "افزودن ضمیمه", @@ -328,16 +316,10 @@ "comment-placeholder": "درج نظر", "comment-only": "فقط نظر", "comment-only-desc": "فقط می‌تواند روی کارت‌ها نظر دهد.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "هیچ کامنتی موجود نیست", "no-comments-desc": "نظرات و فعالیت ها را نمی توان دید.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "کارگر", "worker-desc": "تنها می‌توانید کارت‌ها را جابجا کنید، آنها را به خود محول کنید و نظر دهید.", "computer": "رایانه", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "درج پیوند کارت در حافظه", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "ارتباط دادن کارت", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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": "ایجاد برد", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "وارد کردن برد", "createLabelPopup-title": "ایجاد لیبل", "createCustomField": "ایجاد فیلد", @@ -377,9 +357,9 @@ "custom-fields": "فیلدهای شخصی", "date": "تاریخ", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "رد", "default-avatar": "آواتار پیش‌فرض", "delete": "حذف", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "اصلاح اعلان", "editProfilePopup-title": "ویرایش پروفایل", "email": "پست الکترونیک", - "email-address": "Email Address", "email-enrollAccount-subject": "یک حساب کاربری برای شما در __siteName__ ایجاد شد", "email-enrollAccount-text": "سلام __user__ \nبرای شروع به استفاده از این سرویس برروی آدرس زیر کلیک کنید.\n__url__\nبا تشکر.", "email-fail": "عدم موفقیت در فرستادن رایانامه", @@ -554,7 +533,6 @@ "log-in": "ورود", "loginPopup-title": "ورود", "memberMenuPopup-title": "تنظیمات اعضا", - "grey-icons": "Grey Icons", "members": "اعضا", "menu": "منو", "move-selection": "حرکت مورد انتخابی", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "انتقال به پایین", "moveCardToTop-title": "انتقال به بالا", "moveSelectionPopup-title": "حرکت مورد انتخابی", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "امکان چند انتخابی", "multi-selection-label": "تغییر لیبل انتخاب‌شده‌ها", "multi-selection-member": "تغییر عضو برای انتخاب‌شده‌ها", @@ -578,8 +554,6 @@ "no-results": "بدون نتیجه", "normal": "عادی", "normal-desc": "امکان نمایش و تنظیم کارت بدون امکان تغییر تنظیمات", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "دعوت نامه هنوز پذیرفته نشده است", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "اطلاع رسانی از هرگونه تغییر در بردها، لیست‌ها یا کارت‌هایی که از آنها دیده‌بانی می‌کنید", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "تغییر تاریخ رسید", "editCardEndDatePopup-title": "تغییر تاریخ پایان", "setCardColorPopup-title": "انتخاب رنگ", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "انتخاب کردن رنگ", "setSwimlaneColorPopup-title": "انتخاب کردن رنگ", "setListColorPopup-title": "انتخاب کردن رنگ", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "تمام لیست ها، کارت ها، لیبل ها و فعالیت ها حذف خواهند شد و شما نمی توانید محتوای برد را بازیابی کنید. هیچ واکنشی وجود ندارد", "boardDeletePopup-title": "حذف برد؟", "delete-board": "حذف برد", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "زیروظایفِ برد __board__", "default": "پیش‌فرض", "defaultdefault": "پیش‌فرض", @@ -790,7 +761,7 @@ "subtask-settings": "تنظیمات زیروظایف", "card-settings": "تنظیمات کارت", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "تنظیمات زیروظایف", + "boardSubtaskSettingsPopup-title": "تنظیمات زیروظایف برد", "boardCardSettingsPopup-title": "تنظیمات کارت", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "افزودن ریزکار به برد:", @@ -961,8 +932,6 @@ "a-endAt": "زمان پایان ویرایش‌شده به", "a-startAt": "زمان شروع ویرایش‌شده به", "a-receivedAt": "زمان رسیدن ویرایش شده به", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "زمان سررسید فعلی %s د رحال رسیدن است", "pastdue": "زمان سررسید فعلی %s گذشته‌است", "duenow": "زمان سررسید فعلی %s امروز است", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "من", "dueCardsViewChange-choice-all": "تمام کاربران", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "کارت های شکسته", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "وضعیت", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "تمام شده", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/fi.i18n.json b/imports/i18n/data/fi.i18n.json index 42c9d5ad4..2497bf5e0 100644 --- a/imports/i18n/data/fi.i18n.json +++ b/imports/i18n/data/fi.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "poisti kommentin %s", "activity-receivedDate": "muokkasi vastaanotettu päiväksi %s / %s", "activity-startDate": "muokkasi aloituspäiväksi %s / %s", - "allboards.starred": "Suosikki", - "allboards.templates": "Mallit", - "allboards.remaining": "Jäljellä", - "allboards.workspaces": "Työtilat", - "allboards.add-workspace": "Lisää työtila", - "allboards.add-workspace-prompt": "Työtilan nimi", - "allboards.add-subworkspace": "Lisää alityötila", - "allboards.add-subworkspace-prompt": "Alityötilan nimi", - "allboards.edit-workspace": "Muokkaa työtilaa", - "allboards.edit-workspace-name": "Työtilan nimi", - "allboards.edit-workspace-icon": "Työtilan ikoni (markdown)", - "multi-selection-active": "Valitse taulut napsauttamalla valintaruutuja", "activity-dueDate": "muokkasi eräpäiväksi %s / %s", "activity-endDate": "muokkasi loppumispäiväksi %s / %s", "add-attachment": "Lisää liite", @@ -328,16 +316,10 @@ "comment-placeholder": "Kirjoita kommentti", "comment-only": "Vain kommentointi", "comment-only-desc": "Voi vain kommentoida kortteja", - "comment-assigned-only": "Vain käsittelijän kommentti", - "comment-assigned-only-desc": "Vain käsittelijä kortit näkyvissä. Voi vain kommentoida.", "comment-delete": "Haluatko varmasti poistaa kommentin?", "deleteCommentPopup-title": "Poista kommentti?", "no-comments": "Ei kommentteja", "no-comments-desc": "Ei voi nähdä kommentteja ja toimintaa.", - "read-only": "Vain luku", - "read-only-desc": "Voi vain katsoa kortteja. Ei voi muokata.", - "read-assigned-only": "Vain käsittelijä lukee", - "read-assigned-only-desc": "Vain käsittelijä kortit näkyvissä. Ei voi muokata.", "worker": "Työntekijä", "worker-desc": "Voi vain siirtää kortteja, ilmoittautua kortin käsittelijäksi ja kommentoida.", "computer": "Tietokone", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Haluatko varmasti poistaa tarkistuslistan?", "subtaskDeletePopup-title": "Poista alitehtävä?", "checklistDeletePopup-title": "Poista tarkistuslista?", - "checklistItemDeletePopup-title": "Poista tarkistuslistan kohta?", "copy-card-link-to-clipboard": "Kopioi kortin linkki leikepöydälle", "copy-text-to-clipboard": "Kopioi teksti leikepöydälle", "linkCardPopup-title": "Linkitä kortti", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Lisää mallikontti", "chooseBoardSourcePopup-title": "Tuo taulu", "createLabelPopup-title": "Luo nimilappu", "createCustomField": "Luo kenttä", @@ -377,9 +357,9 @@ "custom-fields": "Mukautetut kentät", "date": "Päivämäärä", "date-format": "Päivämäärämuoto", - "date-format-yyyy-mm-dd": "VVVV-KK-PP", - "date-format-dd-mm-yyyy": "PP-KK-VVVV", - "date-format-mm-dd-yyyy": "KK-PP-VVVV", + "date-format-yyyy-mm-dd": "VVVV-KK-PP HH:MM", + "date-format-dd-mm-yyyy": "PP-KK-VVVV HH:MM", + "date-format-mm-dd-yyyy": "PP-KK-VVVV HH:MM", "decline": "Kieltäydy", "default-avatar": "Oletusprofiilikuva", "delete": "Poista", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Muokkaa ilmoituksia", "editProfilePopup-title": "Muokkaa profiilia", "email": "Sähköposti", - "email-address": "Sähköpostiosoite", "email-enrollAccount-subject": "Sinulle on luotu tili palveluun __siteName__", "email-enrollAccount-text": "Hei __user__,\n\nKlikkaa alla olevaa linkkiä aloittaaksesi palvelun käytön.\n\n__url__\n\nKiitos.", "email-fail": "Sähköpostin lähettäminen epäonnistui", @@ -554,7 +533,6 @@ "log-in": "Kirjaudu sisään", "loginPopup-title": "Kirjaudu sisään", "memberMenuPopup-title": "Jäsenasetukset", - "grey-icons": "Harmaat ikonit", "members": "Jäsenet", "menu": "Valikko", "move-selection": "Siirrä valinta", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Siirrä alimmaiseksi", "moveCardToTop-title": "Siirrä ylimmäiseksi", "moveSelectionPopup-title": "Siirrä valinta", - "copySelectionPopup-title": "Kopioi valinta", - "selection-color": "Valinnan väri", "multi-selection": "Monivalinta", "multi-selection-label": "Aseta nimilappu valinnalle", "multi-selection-member": "Aseta jäsen valinnalle", @@ -578,8 +554,6 @@ "no-results": "Ei tuloksia", "normal": "Normaali", "normal-desc": "Voi nähdä ja muokata kortteja. Ei voi muokata asetuksia.", - "normal-assigned-only": "Vain käsittelijä normaali", - "normal-assigned-only-desc": "Vain käsittelijä kortit näkyvissä. Muokkaa normaalina käyttäjänä.", "not-accepted-yet": "Kutsua ei ole hyväksytty vielä", "notify-participate": "Vastaanota päivityksiä kaikilta korteilta jotka olet tehnyt tai joissa olet luoja tai jäsen", "notify-watch": "Vastaanota päivityksiä kaikilta tauluilta, listoilta tai korteilta joita seuraat.", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Vaihda vastaanottamispäivää", "editCardEndDatePopup-title": "Vaihda loppumispäivää", "setCardColorPopup-title": "Aseta väri", - "setSelectionColorPopup-title": "Aseta valinnan väri", "setCardActionsColorPopup-title": "Valitse väri", "setSwimlaneColorPopup-title": "Valitse väri", "setListColorPopup-title": "Valitse väri", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "Kaikki listat, kortit, nimilaput ja toimet poistetaan ja et pysty palauttamaan taulun sisältöä. Tätä ei voi peruuttaa.", "boardDeletePopup-title": "Poista taulu?", "delete-board": "Poista taulu", - "delete-duplicate-lists": "Poista ylimääräiset lista kopiot", - "delete-duplicate-lists-confirm": "Oletko varma? Tämä poistaa kaikki ylimääräiset lista kopiot, joilla on sama nimi ja jotka eivät sisällä kortteja.", "default-subtasks-board": "Alitehtävät taululle __board__", "default": "Oletus", "defaultdefault": "Oletus", @@ -790,7 +761,7 @@ "subtask-settings": "Alitehtävä-asetukset", "card-settings": "Kortin asetukset", "minicard-settings": "Minikortin asetukset", - "boardSubtaskSettingsPopup-title": "Alitehtävä-asetukset", + "boardSubtaskSettingsPopup-title": "Taulualitehtävien asetukset", "boardCardSettingsPopup-title": "Kortin asetukset", "boardMinicardSettingsPopup-title": "Minikortin asetukset", "deposit-subtasks-board": "Talleta alitehtävät tälle taululle:", @@ -961,8 +932,6 @@ "a-endAt": "muokattu loppumisajaksi", "a-startAt": "muokattu aloitusajaksi", "a-receivedAt": "muokattu vastaanottamisajaksi", - "above-selected-card": "Valitun kortin yläpuolelle", - "below-selected-card": "Valitun kortin alapuolelle", "almostdue": "nykyinen eräaika %s lähestyy", "pastdue": "nykyinen eräaika %s on mennyt", "duenow": "nykyinen eräaika %s on tänään", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Minä", "dueCardsViewChange-choice-all": "Kaikki käyttäjät", "dueCardsViewChange-choice-all-description": "Näyttää kaikki keskeneräiset kortit joilla on *eräpäivä* tauluilta joihin käyttäjällä on oikeudet.", - "dueCards-noResults-title": "Erääntyviä kortteja ei löytynyt", - "dueCards-noResults-description": "Sinulla ei ole tällä hetkellä yhtään erääntyvää korttia.", "broken-cards": "Rikkinäiset kortit", "board-title-not-found": "Taulua '%s' ei löytynyt.", "swimlane-title-not-found": "Uimarataa '%s' ei löytynyt.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Piilota kaikki tarkistuslistan kohdat", "support": "Tuki", "supportPopup-title": "Tuki", - "support-page-enabled": "Tuki sivu käytössä", - "support-info-not-added-yet": "Tuki tietoja ei ole vielä lisätty", - "support-info-only-for-logged-in-users": "Tuki tiedot on vain kirjautuneille käyttäjille.", - "support-title": "Tuki otsikko", - "support-content": "Tuki sisältö", "accessibility": "Saavutettavuus", "accessibility-page-enabled": "Saavutettavuus sivu käytössä", "accessibility-info-not-added-yet": "Saavutettavuus tietoja ei ole lisätty vielä", @@ -1437,73 +1399,7 @@ "back-to-settings": "Takaisin asetuksiin", "board-id": "Taulun tunnus", "board-migration": "Taulun siirto", - "board-migrations": "Taulu migraatiot", "card-show-lists-on-minicard": "Näytä listat minikortilla", - "comprehensive-board-migration": "Perusteellinen taulu migraatio", - "comprehensive-board-migration-description": "Suorittaa kattavia tarkistuksia ja korjauksia taulun tietojen eheyden varmistamiseksi, mukaan lukien listajärjestyksen, korttien sijainnit ja uimaratarakenteen.", - "delete-duplicate-empty-lists-migration": "Poista kaksoiskappaleet tyhjistä listoista", - "delete-duplicate-empty-lists-migration-description": "Poistaa tyhjät kaksoiskappalelistat turvallisesti. Poistaa vain listat, joissa ei ole kortteja JA joilla on toinen samanniminen lista, joka sisältää kortteja.", - "lost-cards": "Kadonneet kortit", - "lost-cards-list": "Palautetut kohteet", - "restore-lost-cards-migration": "Palauta kadonneet kortit", - "restore-lost-cards-migration-description": "Etsii ja palauttaa kortit ja listat, joista puuttuu swimlaneId tai listId. Luo 'Kadonneet kortit' -uimaradan, jotta kaikki kadonneet ovat taas näkyvissä.", - "restore-all-archived-migration": "Palauta kaikki arkistoidut", - "restore-all-archived-migration-description": "Palauttaa kaikki arkistoidut uimaradat, listat ja kortit. Korjaa automaattisesti puuttuvat uimaratatunnukset tai listatunnukset, jotta kohteet ovat näkyvissä.", - "fix-missing-lists-migration": "Korjaa puuttuvat listat", - "fix-missing-lists-migration-description": "Havaitsee ja korjaa puuttuvat tai vioittuneet listat taulun rakenteessa.", - "fix-avatar-urls-migration": "Korjaa avatar-URL-osoitteet", - "fix-avatar-urls-migration-description": "Päivittää taulun jäsenten avatar-osoitteiden URL-osoitteet oikean tallennustilan käyttämiseksi ja korjaa rikkinäiset avatar-viittaukset.", - "fix-all-file-urls-migration": "Korjaa kaikki tiedostojen URL-osoitteet", - "fix-all-file-urls-migration-description": "Päivittää kaikkien tällä taululla olevien tiedostoliitteiden URL-osoitteet käyttämään oikeaa tallennuspalvelinta ja korjaa rikkinäiset tiedostoviittaukset.", - "migration-needed": "Migraatio tarvitaan", - "migration-complete": "Valmis", - "migration-running": "Suoritetaan...", - "migration-successful": "Migraatio valmistui onnistuneesti", - "migration-failed": "Migraatio epäonnistui", - "migrations": "Migraatiot", - "migrations-admin-only": "Vain taulu ylläpitäjät voivat suorittaa migraatioita", - "migrations-description": "Suorita tietojen eheystarkistukset ja korjaukset tälle taululle. Jokainen migraatio voidaan suorittaa erikseen.", - "no-issues-found": "Ei löytynyt ongelmia", - "run-migration": "Suorita migraatio", - "run-comprehensive-migration-confirm": "Tämä suorittaa kattavan migraation, jolla tarkistetaan ja korjataan taulun tietojen eheys. Tämä voi kestää hetken. Jatketaanko?", - "run-delete-duplicate-empty-lists-migration-confirm": "Tämä muuntaa ensin kaikki jaetut listat uimaratakohtaisiksi listoiksi ja poistaa sitten tyhjät listat, joissa on samanniminen kaksoiskappale, joka sisältää kortteja. Vain todella tarpeettomat tyhjät listat poistetaan. Jatketaanko?", - "run-restore-lost-cards-migration-confirm": "Tämä luo Kadonneet kortit -uimaradan ja palauttaa kaikki kortit ja listat, joista puuttuu uimaradan tunnus tai listan tunnus. Tämä vaikuttaa vain arkistoimattomiin kohteisiin. Jatketaanko?", - "run-restore-all-archived-migration-confirm": "Tämä palauttaa KAIKKI arkistoidut uintikaistat, listat ja kortit, jolloin ne näkyvät taas. Puuttuvista tunnuksista puuttuvat kohteet korjataan automaattisesti. Tätä ei voi helposti perua. Jatketaanko?", - "run-fix-missing-lists-migration-confirm": "Tämä havaitsee ja korjaa puuttuvat tai vioittuneet listat taulun rakenteessa. Jatketaanko?", - "run-fix-avatar-urls-migration-confirm": "Tämä päivittää taulun jäsenten avatar-URL-osoitteet käyttämään oikeaa tallennustilaa. Jatketaanko?", - "run-fix-all-file-urls-migration-confirm": "Tämä päivittää kaikkien tällä taululla olevien tiedostoliitteiden URL-osoitteet käyttämään oikeaa tallennuspalvelinta. Jatketaanko?", - "restore-lost-cards-nothing-to-restore": "Ei kadonneita uintikaistoja, listoja tai kortteja palautettavaksi", - - "migration-progress-title": "Taulu migraatio meneillään", - "migration-progress-overall": "Kokonaisedistyminen", - "migration-progress-current-step": "Nykyinen vaihe", - "migration-progress-status": "Tilanne", - "migration-progress-details": "Yksityiskohdat", - "migration-progress-note": "Odota hetki, siirrämme taulusi uusimpaan rakenteeseen...", - "steps": "askelta", - "view": "Näkymä", - "has-swimlanes": "Sisältää uimaratoja", - - "step-analyze-board-structure": "Analysoi taulun rakennetta", - "step-fix-orphaned-cards": "Korjaa orvot kortit", - "step-convert-shared-lists": "Muunna jaetut listat", - "step-ensure-per-swimlane-lists": "Varmista uimaratakohtaiset listat", - "step-validate-migration": "Varmistetaan migraatio", - "step-fix-avatar-urls": "Korjaa avatar-URL-osoitteet", - "step-fix-attachment-urls": "Korjaa liitetiedosto URLit", - "step-analyze-lists": "Analysoidaan listoja", - "step-create-missing-lists": "Luo puuttuvat listat", - "step-update-cards": "Päivitä kortit", - "step-finalize": "Viimeistellään", - "step-delete-duplicate-empty-lists": "Poista kaksoiskappaleet tyhjistä listoista", - "step-ensure-lost-cards-swimlane": "Varmistetaan hävinneiden korttien uimarata", - "step-restore-lists": "Palauta listat", - "step-restore-cards": "Palauta kortit", - "step-restore-swimlanes": "Palauta uimaradat", - "step-fix-missing-ids": "Korjaa puuttuvat ID:t", - "step-scan-users": "Tarkistetaan taulun jäsenten avatarit", - "step-scan-files": "Tarkistetaan taulun liitetiedostot", - "step-fix-file-urls": "Korjataan tiedosto URLit", "cleanup": "Siivous", "cleanup-old-jobs": "Siivoa vanhat työt", "completed": "Valmistunut", @@ -1570,7 +1466,6 @@ "operation-type": "Toiminnon tyyppi", "overall-progress": "Kokonaisedistyminen", "page": "Sivu", - "pause": "Tauko", "pause-migration": "Keskeytä siirto", "previous": "Edellinen", "refresh": "Päivitä", @@ -1585,7 +1480,6 @@ "schedule": "Aikataulu", "search-boards-or-operations": "Etsi tauluja tai toimintoja...", "show-list-on-minicard": "Näytä lista minikortilla", - "showChecklistAtMinicard": "Näytä tarkistuslista minikortilla", "showing": "Näytetään", "start-test-operation": "Aloita testitoiminto", "start-time": "Aloitusaika", @@ -1600,6 +1494,5 @@ "weight": "Paino", "idle": "Tyhjäkäynti", "complete": "Valmis", - "cron": "Ajastus", - "current-step": "Nykyinen vaihe" + "cron": "Ajastus" } diff --git a/imports/i18n/data/fr-CH.i18n.json b/imports/i18n/data/fr-CH.i18n.json index ceb439c03..1b98181d1 100644 --- a/imports/i18n/data/fr-CH.i18n.json +++ b/imports/i18n/data/fr-CH.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/fr-FR.i18n.json b/imports/i18n/data/fr-FR.i18n.json index 9b859bcb1..1281de3a0 100644 --- a/imports/i18n/data/fr-FR.i18n.json +++ b/imports/i18n/data/fr-FR.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "commentaire supprimé %s", "activity-receivedDate": "date de réception éditée de %s à %s", "activity-startDate": "date de début éditée de %s à %s", - "allboards.starred": "Starred", - "allboards.templates": "Modèles", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "date d'échéance éditée de %s à %s", "activity-endDate": "date de fin éditée de %s à %s", "add-attachment": "Ajouter une pièce jointe", @@ -328,16 +316,10 @@ "comment-placeholder": "Écrire un commentaire", "comment-only": "Commentaire uniquement", "comment-only-desc": "Ne peut que commenter des cartes.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Êtes-vous sûr de vouloir supprimer le commentaire ?", "deleteCommentPopup-title": "Supprimer le commentaire ?", "no-comments": "Aucun commentaire", "no-comments-desc": "Ne peut pas voir les commentaires et les activités.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Travailleur", "worker-desc": "Peut seulement déplacer des cartes, s'assigner à une carte et la commenter.", "computer": "Ordinateur", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Êtes-vous sûr de vouloir supprimer la checklist ?", "subtaskDeletePopup-title": "Supprimer la sous-tâche ?", "checklistDeletePopup-title": "Supprimer la checklist ?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copier le lien de la carte dans le presse-papier", "copy-text-to-clipboard": "Copier le texte dans le presse-papier", "linkCardPopup-title": "Lier une Carte", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Ajouter un conteneur de modèles", "chooseBoardSourcePopup-title": "Importer un tableau", "createLabelPopup-title": "Créer une étiquette", "createCustomField": "Créer un champ personnalisé", @@ -377,9 +357,9 @@ "custom-fields": "Champs personnalisés", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Refuser", "default-avatar": "Avatar par défaut", "delete": "Supprimer", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Modifier la notification", "editProfilePopup-title": "Modifier le profil", "email": "E-mail", - "email-address": "Email Address", "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.", @@ -554,7 +533,6 @@ "log-in": "Connexion", "loginPopup-title": "Connexion", "memberMenuPopup-title": "Préférence du participant", - "grey-icons": "Grey Icons", "members": "Participants", "menu": "Menu", "move-selection": "Déplacer la sélection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Déplacer tout en bas", "moveCardToTop-title": "Déplacer tout en haut", "moveSelectionPopup-title": "Déplacer la sélection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Sélection multiple", "multi-selection-label": "Définir l'étiquette pour la sélection", "multi-selection-member": "Définir le participant pour la sélection", @@ -578,8 +554,6 @@ "no-results": "Pas de résultats", "normal": "Normal", "normal-desc": "Peut voir et modifier les cartes. Ne peut pas changer les paramètres.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "L'invitation n'a pas encore été acceptée", "notify-participate": "Recevoir les mises à jour de toutes les cartes auxquelles vous participez en tant que créateur ou que participant", "notify-watch": "Recevoir les mises à jour de tous les tableaux, listes ou cartes que vous suivez", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Modifier la date de réception", "editCardEndDatePopup-title": "Modifier la date de fin", "setCardColorPopup-title": "Définir la couleur", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choisissez une couleur", "setSwimlaneColorPopup-title": "Choisissez une couleur", "setListColorPopup-title": "Choisissez une couleur", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "Toutes les listes, cartes, étiquettes et activités seront supprimées et vous ne pourrez pas retrouver le contenu du tableau. Cela est irréversible.", "boardDeletePopup-title": "Supprimer le tableau ?", "delete-board": "Supprimer le tableau", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Sous-tâches du tableau __board__", "default": "Défaut", "defaultdefault": "Défaut", @@ -790,7 +761,7 @@ "subtask-settings": "Paramètres des sous-tâches", "card-settings": "Paramètres de la carte", "minicard-settings": "Paramètres de la minicarte", - "boardSubtaskSettingsPopup-title": "Paramètres des sous-tâches", + "boardSubtaskSettingsPopup-title": "Paramètres des sous-tâches du tableau", "boardCardSettingsPopup-title": "Paramètres de la carte", "boardMinicardSettingsPopup-title": "Paramètres de la minicarte", "deposit-subtasks-board": "Déposer des sous-tâches dans ce tableau :", @@ -961,8 +932,6 @@ "a-endAt": "Date de fin modifiée à", "a-startAt": "Date de début modifiée à", "a-receivedAt": "Date de réception modifiée à", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "La date d'échéance %s approche", "pastdue": "La date d'échéance %s est passée", "duenow": "La date d'échéance %s est aujourd'hui", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Moi", "dueCardsViewChange-choice-all": "Tous les utilisateurs", "dueCardsViewChange-choice-all-description": "Visualise toutes les cartes incomplètes avec une date *échue* pour lesquelles l'utilisateur possède les droits", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Cartes en erreur", "board-title-not-found": "Tableau '%s' non trouvé.", "swimlane-title-not-found": "Couloir '%s' non trouvé.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Statut", - "migration-progress-details": "Détails", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Terminé", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/fr.i18n.json b/imports/i18n/data/fr.i18n.json index e8b65d94d..504f3f8b0 100644 --- a/imports/i18n/data/fr.i18n.json +++ b/imports/i18n/data/fr.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "commentaire supprimé %s", "activity-receivedDate": "date de réception éditée de %s à %s", "activity-startDate": "date de début éditée de %s à %s", - "allboards.starred": "Favoris", - "allboards.templates": "Modèles", - "allboards.remaining": "Restant", - "allboards.workspaces": "Espaces de travail", - "allboards.add-workspace": "Ajouter un espace de travail", - "allboards.add-workspace-prompt": "Nom de l'espace de travail", - "allboards.add-subworkspace": "Ajouter un sous-espace de travail", - "allboards.add-subworkspace-prompt": "Nom du sous-espace de travail", - "allboards.edit-workspace": "Modifier l'espace de travail", - "allboards.edit-workspace-name": "Nom de l'espace de travail", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Cliquez sur les cases à cocher pour sélectionner les tableaux", "activity-dueDate": "date d'échéance éditée de %s à %s", "activity-endDate": "date de fin éditée de %s à %s", "add-attachment": "Ajouter une pièce jointe", @@ -202,9 +190,9 @@ "board-view-collapse": "Réduire", "board-view-gantt": "Gantt", "board-view-lists": "Listes", - "bucket-example": "Comme « Liste d'envies » par exemple", - "calendar-previous-month-label": "Mois précédent", - "calendar-next-month-label": "Mois suivant", + "bucket-example": "Like \"Bucket List\" for example", + "calendar-previous-month-label": "Previous Month", + "calendar-next-month-label": "Next Month", "cancel": "Annuler", "card-archived": "Cette carte est archivée", "board-archived": "Ce tableau est archivé", @@ -328,16 +316,10 @@ "comment-placeholder": "Écrire un commentaire", "comment-only": "Commentaire uniquement", "comment-only-desc": "Ne peut que commenter des cartes.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Êtes-vous sûr de vouloir supprimer le commentaire ?", "deleteCommentPopup-title": "Supprimer le commentaire ?", "no-comments": "Aucun commentaire", "no-comments-desc": "Ne peut pas voir les commentaires et les activités.", - "read-only": "Lecture seule", - "read-only-desc": "Peut seulement voir les cartes. Ne peut pas éditer.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Travailleur", "worker-desc": "Peut seulement déplacer des cartes, s'attribuer une carte et la commenter.", "computer": "Ordinateur", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Êtes-vous sûr de vouloir supprimer la check-list ?", "subtaskDeletePopup-title": "Supprimer la sous-tâche ?", "checklistDeletePopup-title": "Supprimer la check-list ?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copier le lien de la carte dans le presse-papier", "copy-text-to-clipboard": "Copier le texte dans le presse-papier", "linkCardPopup-title": "Lier une Carte", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Ajouter un conteneur de modèles", "chooseBoardSourcePopup-title": "Importer un tableau", "createLabelPopup-title": "Créer une étiquette", "createCustomField": "Créer un champ personnalisé", @@ -376,10 +356,10 @@ "custom-field-text": "Texte", "custom-fields": "Champs personnalisés", "date": "Date", - "date-format": "Format de la date", - "date-format-yyyy-mm-dd": "AAAA-MM-JJ", - "date-format-dd-mm-yyyy": "JJ-MM-AAAA", - "date-format-mm-dd-yyyy": "MM-JJ-AAAA", + "date-format": "Date Format", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Refuser", "default-avatar": "Avatar par défaut", "delete": "Supprimer", @@ -404,21 +384,20 @@ "editLabelPopup-title": "Modifier l'étiquette", "editNotificationPopup-title": "Modifier la notification", "editProfilePopup-title": "Modifier le profil", - "email": "Courriel", - "email-address": "Adresse de courriel", + "email": "E-mail", "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 le courriel", - "email-invalid": "Adresse de courriel incorrecte.", - "email-invite": "Inviter par courriel", + "email-fail-text": "Une erreur est survenue en tentant d'envoyer l'email", + "email-invalid": "Adresse e-mail incorrecte.", + "email-invite": "Inviter par e-mail", "email-invite-subject": "__inviter__ vous a envoyé une invitation", "email-invite-text": "Cher/Chère __user__,\n\n__inviter__ vous invite à rejoindre le tableau \"__board__\" pour collaborer.\n\nVeuillez suivre le lien ci-dessous :\n\n__url__\n\nMerci.", "email-resetPassword-subject": "Réinitialiser votre mot de passe sur __siteName__", "email-resetPassword-text": "Bonjour __user__,\n\nPour réinitialiser votre mot de passe, cliquez sur le lien ci-dessous.\n\n__url__\n\nMerci.", "email-sent": "Courriel envoyé", "email-verifyEmail-subject": "Vérifier votre adresse de courriel sur __siteName__", - "email-verifyEmail-text": "Bonjour __user__,\n\nPour vérifier le courriel de votre compte, il suffit de cliquer sur le lien ci-dessous.\n\n__url__\n\nMerci.", + "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-vertical-scrollbars": "Activer les barres de défilement verticales", "enable-wip-limit": "Activer la limite WIP", "error-board-doesNotExist": "Ce tableau n'existe pas", @@ -434,7 +413,7 @@ "error-username-taken": "Ce nom d'utilisateur est déjà utilisé", "error-orgname-taken": "Ce nom d'organisation est déjà utilisé", "error-teamname-taken": "Ce nom d'équipe est déjà utilisé", - "error-email-taken": "Cette adresse de courriel est déjà utilisée", + "error-email-taken": "Cette adresse mail est déjà utilisée", "export-board": "Exporter le tableau", "export-board-json": "Exporter le tableau en JSON", "export-board-csv": "Exporter le tableau en CSV", @@ -554,7 +533,6 @@ "log-in": "Connexion", "loginPopup-title": "Connexion", "memberMenuPopup-title": "Préférence du participant", - "grey-icons": "Grey Icons", "members": "Participants", "menu": "Menu", "move-selection": "Déplacer la sélection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Déplacer tout en bas", "moveCardToTop-title": "Déplacer tout en haut", "moveSelectionPopup-title": "Déplacer la sélection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Sélection multiple", "multi-selection-label": "Définir l'étiquette pour la sélection", "multi-selection-member": "Définir le participant pour la sélection", @@ -578,8 +554,6 @@ "no-results": "Pas de résultats", "normal": "Normal", "normal-desc": "Peut voir et modifier les cartes. Ne peut pas changer les paramètres.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "L'invitation n'a pas encore été acceptée", "notify-participate": "Recevoir les mises à jour de toutes les cartes auxquelles vous participez en tant que créateur ou que participant", "notify-watch": "Recevoir les mises à jour de tous les tableaux, listes ou cartes que vous suivez", @@ -663,9 +637,9 @@ "upload": "Télécharger", "upload-avatar": "Télécharger un avatar", "uploaded-avatar": "Avatar téléchargé", - "uploading-files": "Chargement des fichiers", - "upload-failed": "Le chargement a échoué", - "upload-completed": "Le chargement est terminé", + "uploading-files": "Uploading files", + "upload-failed": "Upload failed", + "upload-completed": "Upload completed", "custom-top-left-corner-logo-image-url": "URL de l'Image du logo personnalisé dans le coin supérieur gauche", "custom-top-left-corner-logo-link-url": "Lien URL du logo personnalisé dans le coin supérieur gauche", "custom-top-left-corner-logo-height": "Hauteur du logo personnalisé dans le coin supérieur gauche. Défaut : 27", @@ -701,9 +675,9 @@ "invite": "Inviter", "invite-people": "Inviter une personne", "to-boards": "Au(x) tableau(x)", - "email-addresses": "Adresses de courriel", - "smtp-host-description": "L'adresse du serveur SMTP qui gère vos courriels.", - "smtp-port-description": "Le port du serveur SMTP utilisé pour les courriels sortants.", + "email-addresses": "Adresses mail", + "smtp-host-description": "L'adresse du serveur SMTP qui gère vos mails.", + "smtp-port-description": "Le port des mails sortants du serveur SMTP.", "smtp-tls-description": "Activer la gestion de TLS sur le serveur SMTP", "smtp-host": "Hôte SMTP", "smtp-port": "Port SMTP", @@ -711,12 +685,12 @@ "smtp-password": "Mot de passe", "smtp-tls": "Prise en charge de TLS", "send-from": "De", - "send-smtp-test": "Envoyer un courriel de test à vous-même", + "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/Chère __user__,\n\n__inviter__ vous invite à le rejoindre sur le tableau kanban pour collaborer.\n\nVeuillez suivre le lien ci-dessous :\n__url__\n\nVotre code d'invitation est : __icode__\n\nMerci.", - "email-smtp-test-subject": "Courriel de test SMTP", - "email-smtp-test-text": "Vous avez envoyé un courriel avec succès", + "email-smtp-test-subject": "E-mail de test SMTP", + "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.", "webhook-title": "Nom du webhook", @@ -755,7 +729,7 @@ "yes": "Oui", "no": "Non", "accounts": "Comptes", - "accounts-allowEmailChange": "Autoriser le changement d'adresse de courriel", + "accounts-allowEmailChange": "Autoriser le changement d'adresse mail", "accounts-allowUserNameChange": "Autoriser le changement d'identifiant", "tableVisibilityMode-allowPrivateOnly": "Visibilité des tableaux: N'autoriser que des tableaux privés", "tableVisibilityMode" : "Visibilité des tableaux", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Modifier la date de réception", "editCardEndDatePopup-title": "Modifier la date de fin", "setCardColorPopup-title": "Définir la couleur", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choisissez une couleur", "setSwimlaneColorPopup-title": "Choisissez une couleur", "setListColorPopup-title": "Choisissez une couleur", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "Toutes les listes, cartes, étiquettes et activités seront supprimées et vous ne pourrez pas retrouver le contenu du tableau. Cela est irréversible.", "boardDeletePopup-title": "Supprimer le tableau ?", "delete-board": "Supprimer le tableau", - "delete-duplicate-lists": "Supprimer les listes en doublon ? ", - "delete-duplicate-lists-confirm": "Êtes-vous sûr ? Cela supprimera toutes les listes en doublon qui ont le même nom et qui ne contiennent aucune carte.", "default-subtasks-board": "Sous-tâches du tableau __board__", "default": "Défaut", "defaultdefault": "Défaut", @@ -790,7 +761,7 @@ "subtask-settings": "Paramètres des sous-tâches", "card-settings": "Paramètres de la carte", "minicard-settings": "Paramètres de la mini-carte", - "boardSubtaskSettingsPopup-title": "Paramètres des sous-tâches", + "boardSubtaskSettingsPopup-title": "Paramètres des sous-tâches du tableau", "boardCardSettingsPopup-title": "Paramètres de la carte", "boardMinicardSettingsPopup-title": "Paramètres de la mini-carte", "deposit-subtasks-board": "Déposer des sous-tâches dans ce tableau :", @@ -876,7 +847,7 @@ "r-uncheck": "Décocher", "r-item": "élément", "r-of-checklist": "de la check-list", - "r-send-email": "Envoyer un courriel", + "r-send-email": "Envoyer un email", "r-to": "à", "r-of": "sur", "r-subject": "sujet", @@ -885,7 +856,7 @@ "r-d-move-to-top-spec": "Déplacer la carte en haut de la liste", "r-d-move-to-bottom-gen": "Déplacer la carte en bas de sa liste", "r-d-move-to-bottom-spec": "Déplacer la carte en bas de la liste", - "r-d-send-email": "Envoyer le courriel", + "r-d-send-email": "Envoyer un email", "r-d-send-email-to": "à", "r-d-send-email-subject": "sujet", "r-d-send-email-message": "message", @@ -961,8 +932,6 @@ "a-endAt": "Date de fin modifiée à", "a-startAt": "Date de début modifiée à", "a-receivedAt": "Date de réception modifiée à", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "La date d'échéance %s approche", "pastdue": "La date d'échéance %s est passée", "duenow": "La date d'échéance %s est aujourd'hui", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Moi", "dueCardsViewChange-choice-all": "Tous les utilisateurs", "dueCardsViewChange-choice-all-description": "Visualise toutes les cartes incomplètes avec une date *échue* pour lesquelles l'utilisateur possède les droits", - "dueCards-noResults-title": "Aucune carte avec échéance trouvée", - "dueCards-noResults-description": "Vous n'avez aucune carte avec échéance en ce moment.", "broken-cards": "Cartes en erreur", "board-title-not-found": "Tableau '%s' non trouvé.", "swimlane-title-not-found": "Couloir '%s' non trouvé.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Cacher tous les éléments de la check-list", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibilité", "accessibility-page-enabled": "Page d'accessibilité activée", "accessibility-info-not-added-yet": "L'information d'accessibilité n'a pas encore été ajoutée", @@ -1358,8 +1320,8 @@ "admin-people-user-inactive": "L'utilisateur est désactivé - Cliquer pour l'activer", "accounts-lockout-all-users-unlocked": "Tous les utilisateurs bloqués ont été déverrouillés", "accounts-lockout-unlock-all": "Tout déverrouiller", - "active-cron-jobs": "Travaux actifs planifiés", - "add-cron-job": "Ajouter un travail planifié", + "active-cron-jobs": "Active Scheduled Jobs", + "add-cron-job": "Add Scheduled Job", "add-cron-job-placeholder": "Add Scheduled Job functionality coming soon", "attachment-storage-configuration": "Attachment Storage Configuration", "attachments-path": "Attachments Path", @@ -1373,8 +1335,8 @@ "board-cleanup-failed": "Failed to schedule board cleanup", "board-cleanup-scheduled": "Board cleanup scheduled successfully", "board-operations": "Board Operations", - "cron-jobs": "Travaux planifiés", - "cron-migrations": "Migrations planifiées", + "cron-jobs": "Scheduled Jobs", + "cron-migrations": "Scheduled Migrations", "cron-job-delete-confirm": "Are you sure you want to delete this scheduled job?", "cron-job-delete-failed": "Failed to delete scheduled job", "cron-job-deleted": "Scheduled job deleted successfully", @@ -1433,100 +1395,34 @@ "attachment-monitoring": "Attachment Monitoring", "attachment-settings": "Attachment Settings", "attachment-storage-settings": "Storage Settings", - "automatic-migration": "Migration automatique", - "back-to-settings": "Retour aux paramètres", - "board-id": "ID du tableau", - "board-migration": "Migration du tableau", - "board-migrations": "Migrations de tableau", - "card-show-lists-on-minicard": "Afficher les listes sur la mini-carte", - "comprehensive-board-migration": "Migration complète de tableau", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Supprimer les listes vides en doublon ? ", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Cartes perdues", - "lost-cards-list": "Éléments restaurés", - "restore-lost-cards-migration": "Restaurer les cartes perdues", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Corriger les URLs d'avatar", - "fix-avatar-urls-migration-description": "Mets à jour les URLs d'avatar des participants du tableau pour utiliser le bon gestionnaire de stockage et corriger les références défaillantes d'avatar ", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration requise", - "migration-complete": "Terminé", - "migration-running": "En cours ...", - "migration-successful": "Migration terminée avec succès", - "migration-failed": "Migration en échec", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "Aucun problème détecté", - "run-migration": "Lancer la migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Migration du tableau en cours", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Étape courante", - "migration-progress-status": "Statut", - "migration-progress-details": "Détails", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Corriger les cartes orphelines", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Valider la migration", - "step-fix-avatar-urls": "Corriger les URLs d'avatar", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finaliser", - "step-delete-duplicate-empty-lists": "Supprimer les listes vides en doublon ? ", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restauration des listes", - "step-restore-cards": "Restaurer les cartes", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Réparation des IDs manquants", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Vérification des pièces jointes du tableau", - "step-fix-file-urls": "Réparation des URL de fichier", + "automatic-migration": "Automatic Migration", + "back-to-settings": "Back to Settings", + "board-id": "Board ID", + "board-migration": "Board Migration", + "card-show-lists-on-minicard": "Show Lists on Minicard", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Terminé", "conversion-info-text": "This conversion is performed once per board and improves performance. You can continue using the board normally.", "converting-board": "Converting Board", "converting-board-description": "Converting board structure for improved functionality. This may take a few moments.", - "cpu-cores": "Cœurs du CPU ", - "cpu-usage": "Utilisation du CPU", + "cpu-cores": "CPU Cores", + "cpu-usage": "CPU Usage", "current-action": "Current Action", - "database-migration": "Migration base de données", + "database-migration": "Database Migration", "database-migration-description": "Updating database structure for improved functionality and performance. This process may take several minutes.", - "database-migrations": "Migrations base de données", - "days-old": "Jours d'ancienneté", - "duration": "Durée", - "errors": "Erreurs", - "estimated-time-remaining": "Temps restant estimé", - "every-1-day": "Tous les jours", - "every-1-hour": "Toutes les heures", - "every-1-minute": "Toutes les minutes", - "every-10-minutes": "Toutes les 10 minutes", - "every-30-minutes": "Toutes les 30 minutes", - "every-5-minutes": "Toutes les 5 minutes", - "every-6-hours": "Toutes les 6 heures", + "database-migrations": "Database Migrations", + "days-old": "Days Old", + "duration": "Duration", + "errors": "Errors", + "estimated-time-remaining": "Estimated time remaining", + "every-1-day": "Every 1 day", + "every-1-hour": "Every 1 hour", + "every-1-minute": "Every 1 minute", + "every-10-minutes": "Every 10 minutes", + "every-30-minutes": "Every 30 minutes", + "every-5-minutes": "Every 5 minutes", + "every-6-hours": "Every 6 hours", "export-monitoring": "Export Monitoring", "filesystem-attachments": "Filesystem Attachments", "filesystem-size": "Filesystem Size", @@ -1535,22 +1431,22 @@ "gridfs-attachments": "GridFS Attachments", "gridfs-size": "GridFS Size", "gridfs-storage": "GridFS", - "hide-list-on-minicard": "Masquer la liste sur la mini-carte", + "hide-list-on-minicard": "Hide List on Minicard", "idle-migration": "Idle Migration", "job-description": "Job Description", "job-details": "Job Details", "job-name": "Job Name", "job-queue": "Job Queue", - "last-run": "Dernière exécution", + "last-run": "Last Run", "max-concurrent": "Max Concurrent", - "memory-usage": "Utilisation de la mémoire", + "memory-usage": "Memory Usage", "migrate-all-to-filesystem": "Migrate All to Filesystem", "migrate-all-to-gridfs": "Migrate All to GridFS", "migrate-all-to-s3": "Migrate All to S3", "migrated-attachments": "Migrated Attachments", "migration-batch-size": "Batch Size", "migration-batch-size-description": "Number of attachments to process in each batch (1-100)", - "migration-cpu-threshold": "Seuil CPU (%)", + "migration-cpu-threshold": "CPU Threshold (%)", "migration-cpu-threshold-description": "Pause migration when CPU usage exceeds this percentage (10-90)", "migration-delay-ms": "Delay (ms)", "migration-delay-ms-description": "Delay between batches in milliseconds (100-10000)", @@ -1564,28 +1460,26 @@ "migration-warning-text": "Please do not close your browser during migration. The process will continue in the background but may take longer to complete.", "monitoring-export-failed": "Failed to export monitoring data", "monitoring-refresh-failed": "Failed to refresh monitoring data", - "next": "Suivant", - "next-run": "Prochaine exécution", + "next": "Next", + "next-run": "Next Run", "of": "sur", - "operation-type": "Type d'opération", + "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", - "previous": "Précédent", + "previous": "Previous", "refresh": "Refresh", "refresh-monitoring": "Refresh Monitoring", "remaining-attachments": "Remaining Attachments", "resume-migration": "Resume Migration", - "run-once": "Exécuter une fois", - "s3-attachments": "Pièces jointes S3", - "s3-size": "Taille S3", + "run-once": "Run once", + "s3-attachments": "S3 Attachments", + "s3-size": "S3 Size", "s3-storage": "S3", "scanning-status": "Scanning Status", "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", - "show-list-on-minicard": "Afficher la liste sur la mini-carte", - "showChecklistAtMinicard": "Show Checklist at Minicard", + "show-list-on-minicard": "Show List on Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1595,11 +1489,10 @@ "system-resources": "System Resources", "total-attachments": "Total Attachments", "total-operations": "Total Operations", - "total-size": "Taille totale", - "unmigrated-boards": "Tableaux non migrés", + "total-size": "Total Size", + "unmigrated-boards": "Unmigrated Boards", "weight": "Poids", "idle": "Inactif", "complete": "Terminé", - "cron": "Planification", - "current-step": "Étape courante" + "cron": "Planification" } diff --git a/imports/i18n/data/fy-NL.i18n.json b/imports/i18n/data/fy-NL.i18n.json index d48099de1..12e76c28d 100644 --- a/imports/i18n/data/fy-NL.i18n.json +++ b/imports/i18n/data/fy-NL.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/fy.i18n.json b/imports/i18n/data/fy.i18n.json index d48099de1..12e76c28d 100644 --- a/imports/i18n/data/fy.i18n.json +++ b/imports/i18n/data/fy.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/gl-ES.i18n.json b/imports/i18n/data/gl-ES.i18n.json index 50e0ecd29..7988d171e 100644 --- a/imports/i18n/data/gl-ES.i18n.json +++ b/imports/i18n/data/gl-ES.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Engadir anexo", @@ -328,16 +316,10 @@ "comment-placeholder": "Escribir un comentario", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computador", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Importar taboleiro", "createLabelPopup-title": "Crear etiqueta", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Data", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Rexeitar", "default-avatar": "Avatar predeterminado", "delete": "Eliminar", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Editar a notificación", "editProfilePopup-title": "Editar o perfil", "email": "Correo electrónico", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Acceder", "loginPopup-title": "Acceder", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Membros", "menu": "Menú", "move-selection": "Mover selección", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Mover abaixo de todo", "moveCardToTop-title": "Mover arriba de todo", "moveSelectionPopup-title": "Mover selección", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Selección múltipla", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "Non hai resultados", "normal": "Normal", "normal-desc": "Pode ver e editar tarxetas. Non pode cambiar a configuración.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "O convite aínda non foi aceptado", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/gl.i18n.json b/imports/i18n/data/gl.i18n.json index e3da0074d..5e42cfcef 100644 --- a/imports/i18n/data/gl.i18n.json +++ b/imports/i18n/data/gl.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Engadir anexo", @@ -328,16 +316,10 @@ "comment-placeholder": "Escribir un comentario", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computador", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Importar taboleiro", "createLabelPopup-title": "Crear etiqueta", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Data", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Rexeitar", "default-avatar": "Avatar predeterminado", "delete": "Eliminar", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Editar a notificación", "editProfilePopup-title": "Editar o perfil", "email": "Correo electrónico", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Acceder", "loginPopup-title": "Acceder", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Membros", "menu": "Menú", "move-selection": "Mover selección", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Mover abaixo de todo", "moveCardToTop-title": "Mover arriba de todo", "moveSelectionPopup-title": "Mover selección", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Selección múltipla", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "Non hai resultados", "normal": "Normal", "normal-desc": "Pode ver e editar tarxetas. Non pode cambiar a configuración.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "O convite aínda non foi aceptado", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/gu-IN.i18n.json b/imports/i18n/data/gu-IN.i18n.json index 7e96f7719..726f9caac 100644 --- a/imports/i18n/data/gu-IN.i18n.json +++ b/imports/i18n/data/gu-IN.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/he-IL.i18n.json b/imports/i18n/data/he-IL.i18n.json index 8d5d6ac2c..131a74c7e 100644 --- a/imports/i18n/data/he-IL.i18n.json +++ b/imports/i18n/data/he-IL.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/he.i18n.json b/imports/i18n/data/he.i18n.json index cad617ebd..5e4220237 100644 --- a/imports/i18n/data/he.i18n.json +++ b/imports/i18n/data/he.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "התגובה %s נמחקה", "activity-receivedDate": "תאריך הקבלה השתנה מ־%s ל־%s", "activity-startDate": "תאריך ההתחלה השתנה מ־%s ל־%s", - "allboards.starred": "סומן בכוכב", - "allboards.templates": "תבניות", - "allboards.remaining": "נותרו", - "allboards.workspaces": "מרחבי עבודה", - "allboards.add-workspace": "הוספת מרחב עבודה", - "allboards.add-workspace-prompt": "שם מרחב עבודה", - "allboards.add-subworkspace": "הוספת תת־מרחב עבודה", - "allboards.add-subworkspace-prompt": "שם תת־מרחב עבודה", - "allboards.edit-workspace": "עריכת מרחב עבודה", - "allboards.edit-workspace-name": "שם מרחב עבודה", - "allboards.edit-workspace-icon": "סמל מרחב עבודה (markdown)", - "multi-selection-active": "יש לסמן את התיבות כדי לבחור לוחות", "activity-dueDate": "תאריך היעד השתנה מ־%s ל־%s", "activity-endDate": "תאריך הסיום השתנה מ־%s ל־%s", "add-attachment": "הוספת קובץ מצורף", @@ -328,16 +316,10 @@ "comment-placeholder": "כתיבת הערה", "comment-only": "תגובות בלבד", "comment-only-desc": "ניתן להגיב על כרטיסים בלבד.", - "comment-assigned-only": "רק תגובה מוקצית", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "למחוק את ההערה?", "deleteCommentPopup-title": "למחוק הערה?", "no-comments": "אין הערות", "no-comments-desc": "לא ניתן לצפות בתגובות ובפעילויות.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "עובד/ת", "worker-desc": "אפשר רק להעביר כרטיסים, להקצות כרטיסים לעצמו/ה ולהגיב.", "computer": "מחשב", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "למחוק את רשימת המטלות?", "subtaskDeletePopup-title": "למחוק תת־משימה?", "checklistDeletePopup-title": "למחוק רשימת מטלות?", - "checklistItemDeletePopup-title": "למחוק פריט רשימת סימון?", "copy-card-link-to-clipboard": "העתקת קישור הכרטיס ללוח הגזירים", "copy-text-to-clipboard": "העתקת טקסט ללוח הגזירים", "linkCardPopup-title": "קישור כרטיס", @@ -356,7 +337,6 @@ "copyManyCardsPopup-format": "[ {\"title\": \"כותרת כרטיס ראשון\", \"description\":\"תיאור כרטיס ראשון\"}, {\"title\":\"כותרת כרטיס שני\",\"description\":\"תיאור כרטיס שני\"},{\"title\":\"כותרת כרטיס אחרון\",\"description\":\"תיאור כרטיס אחרון\"} ]", "create": "יצירה", "createBoardPopup-title": "יצירת לוח", - "createTemplateContainerPopup-title": "הוספת מכולה לתבנית", "chooseBoardSourcePopup-title": "ייבוא לוח", "createLabelPopup-title": "יצירת תווית", "createCustomField": "יצירת שדה", @@ -377,9 +357,9 @@ "custom-fields": "שדות מותאמים אישית", "date": "תאריך", "date-format": "תבנית תאריך", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "סירוב", "default-avatar": "תמונת משתמש כבררת מחדל", "delete": "מחיקה", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "שינוי דיווח", "editProfilePopup-title": "עריכת פרופיל", "email": "דוא״ל", - "email-address": "כתובת דוא״ל", "email-enrollAccount-subject": "נוצר עבורך חשבון באתר __siteName__", "email-enrollAccount-text": "__user__ שלום,\n\nכדי להתחיל להשתמש בשירות, יש ללחוץ על הקישור המופיע להלן.\n\n__url__\n\nתודה.", "email-fail": "שליחת ההודעה בדוא״ל נכשלה", @@ -554,7 +533,6 @@ "log-in": "כניסה", "loginPopup-title": "כניסה", "memberMenuPopup-title": "הגדרות חברות", - "grey-icons": "סמלים אפרים", "members": "חברים", "menu": "תפריט", "move-selection": "העברת בחירה", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "העברה לתחתית הרשימה", "moveCardToTop-title": "העברה לראש הרשימה", "moveSelectionPopup-title": "העברת בחירה", - "copySelectionPopup-title": "העתקת הבחירה", - "selection-color": "צבע בחירה", "multi-selection": "בחירה מרובה", "multi-selection-label": "הגדרת תווית לבחירה", "multi-selection-member": "הגדרת חבר לבחירה", @@ -578,8 +554,6 @@ "no-results": "אין תוצאות", "normal": "רגיל", "normal-desc": "הרשאה לצפות ולערוך כרטיסים. לא ניתן לשנות הגדרות.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "ההזמנה לא אושרה עדיין", "notify-participate": "קבלת עדכונים על כרטיסים בהם יש לך מעורבות הן בתהליך היצירה והן בחברות", "notify-watch": "קבלת עדכונים על כל לוח, רשימה או כרטיס שסימנת למעקב", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "החלפת מועד הקבלה", "editCardEndDatePopup-title": "החלפת מועד הסיום", "setCardColorPopup-title": "הגדרת צבע", - "setSelectionColorPopup-title": "הגדרת צבע בחירה", "setCardActionsColorPopup-title": "בחירת צבע", "setSwimlaneColorPopup-title": "בחירת צבע", "setListColorPopup-title": "בחירת צבע", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "כל הרשימות, הכרטיסים, התווית והפעולות יימחקו ולא תהיה לך דרך לשחזר את תכני הלוח. אין אפשרות לבטל.", "boardDeletePopup-title": "למחוק את הלוח?", "delete-board": "מחיקת לוח", - "delete-duplicate-lists": "מחיקת רשימות כפולות", - "delete-duplicate-lists-confirm": "להמשיך? הפעולה הזאת תמחק את כל הרשימות הכפולות שיש להן את אותו השם ואינן מכילות כרטיסים.", "default-subtasks-board": "תת־משימות עבור הלוח __board__", "default": "בררת מחדל", "defaultdefault": "בררת מחדל", @@ -790,7 +761,7 @@ "subtask-settings": "הגדרות תתי משימות", "card-settings": "הגדרות כרטיס", "minicard-settings": "הגדרות כרטיסון", - "boardSubtaskSettingsPopup-title": "הגדרות תתי משימות", + "boardSubtaskSettingsPopup-title": "הגדרות תת־משימות בלוח", "boardCardSettingsPopup-title": "הגדרות כרטיס", "boardMinicardSettingsPopup-title": "הגדרות כרטיסון", "deposit-subtasks-board": "הפקדת תת־משימות ללוח הזה:", @@ -961,8 +932,6 @@ "a-endAt": "מועד הסיום השתנה לכדי", "a-startAt": "מועד ההתחלה השתנה לכדי", "a-receivedAt": "מועד הקבלה השתנה לכדי", - "above-selected-card": "מעל הכרטיס הנבחר", - "below-selected-card": "מתחת לכרטיס הנבחר", "almostdue": "מועד היעד הנוכחי %s מתקרב", "pastdue": "מועד היעד הנוכחי %s חלף", "duenow": "מועד היעד הנוכחי %s הוא היום", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "אני", "dueCardsViewChange-choice-all": "כל המשתמשים", "dueCardsViewChange-choice-all-description": "מציג את כל הכרטיסים שלא הושלמו ושיש להם *תוקף* מלוחות שלמשתמש יש הרשאה לגשת אליהם.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "כרטיסים פגומים", "board-title-not-found": "הלוח ‚%s’ לא נמצא.", "swimlane-title-not-found": "המסלול ‚%s’ לא נמצא.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "הסתרת כל הפריטים ברשימת המטלות", "support": "תמיכה", "supportPopup-title": "תמיכה", - "support-page-enabled": "עמוד התמיכה פעיל", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "כותרת תמיכה", - "support-content": "תוכן תמיכה", "accessibility": "נגישות", "accessibility-page-enabled": "עמוד הנגישות הופעל", "accessibility-info-not-added-yet": "פרטי הנגישות לא נוספו עדיין", @@ -1437,73 +1399,7 @@ "back-to-settings": "חזרה להגדרות", "board-id": "מזהה לוח", "board-migration": "הסבת לוחות", - "board-migrations": "הסבות לוחות", "card-show-lists-on-minicard": "הצגת רשימות בכרטיסון", - "comprehensive-board-migration": "הסבת לוחות נרחבת", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "מחיקת רשימות ריקות כפולות", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "כרטיסים אבודים", - "lost-cards-list": "פריטים משוחזרים", - "restore-lost-cards-migration": "שחזור כרטיסים אבודים", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "הושלם", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "ההסבה נכשלה", - "migrations": "הסבות", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "סך כל ההתקדמות", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "מצב", - "migration-progress-details": "פרטים", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "מחיקת רשימות ריקות כפולות", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "ניקיון", "cleanup-old-jobs": "ניקוי משימות ישנות", "completed": "הושלמה", @@ -1570,7 +1466,6 @@ "operation-type": "סוג הפעולה", "overall-progress": "סך כל ההתקדמות", "page": "עמוד", - "pause": "Pause", "pause-migration": "השהיית הסבה", "previous": "הקודם", "refresh": "ריענון", @@ -1585,7 +1480,6 @@ "schedule": "לוח זמנים", "search-boards-or-operations": "חיפוש לוחות או פעולות…", "show-list-on-minicard": "הצגת רשימה בכרטיסון", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "מוצג", "start-test-operation": "התחלת פעולת בדיקה", "start-time": "מועד התחלה", @@ -1600,6 +1494,5 @@ "weight": "משקל", "idle": "בהמתנה", "complete": "הושלם", - "cron": "מתזמן", - "current-step": "Current Step" + "cron": "מתזמן" } diff --git a/imports/i18n/data/hi-IN.i18n.json b/imports/i18n/data/hi-IN.i18n.json index d7af78fb1..51adf2ac8 100644 --- a/imports/i18n/data/hi-IN.i18n.json +++ b/imports/i18n/data/hi-IN.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "टिप्पणी हटा दी गई", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "खाका", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "संलग्न करें", @@ -328,16 +316,10 @@ "comment-placeholder": "टिप्पणी लिखें", "comment-only": "केवल टिप्पणी करें", "comment-only-desc": "केवल कार्ड पर टिप्पणी कर सकते हैं।", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "कोई टिप्पणी नहीं", "no-comments-desc": "टिप्पणियां और गतिविधियां नहीं देख पा रहे हैं।", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "कामगार", "worker-desc": "केवल कार्ड ले जा सकते हैं, खुद को कार्ड और टिप्पणी करने के लिए असाइन करें।", "computer": "संगणक", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "कॉपी कार्ड क्लिपबोर्ड करने के लिए लिंक", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "कार्ड कड़ी", @@ -356,7 +337,6 @@ "copyManyCardsPopup-format": "[{\"title\":\"पहला कार्ड शीर्षक\",\"description\":\"पहला कार्ड विवरण\"},{\"title\":\"दूसरा कार्ड शीर्षक\",\"description\":\"दूसरा कार्ड विवरण\"},{\"title\":\"अंतिम कार्ड शीर्षक\",\"description\":\"अंतिम कार्ड विवरण\" }]", "create": "निर्माण करना", "createBoardPopup-title": "बोर्ड निर्माण करना", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "बोर्ड आयात", "createLabelPopup-title": "नामपत्र निर्माण", "createCustomField": "क्षेत्र निर्माण", @@ -377,9 +357,9 @@ "custom-fields": "प्रचलन क्षेत्र", "date": "दिनांक", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "संपादित करें Notification", "editProfilePopup-title": "संपादित करें Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "सदस्य व्यवस्था", - "grey-icons": "Grey Icons", "members": "सदस्य", "menu": "Menu", "move-selection": "स्थानांतरित selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "स्थानांतरित तक Bottom", "moveCardToTop-title": "स्थानांतरित तक Top", "moveSelectionPopup-title": "स्थानांतरित selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can आलोकन और संपादित करें कार्ड. Can't change व्यवस्था.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates तक any बोर्ड, lists, or कार्ड you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, कार्ड,नामपत्र , और activities हो जाएगा deleted और you won't be able तक recover the बोर्ड contents. There is no undo.", "boardDeletePopup-title": "मिटाएँ बोर्ड?", "delete-board": "मिटाएँ बोर्ड", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ बोर्ड", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks व्यवस्था", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks व्यवस्था", + "boardSubtaskSettingsPopup-title": "बोर्ड Subtasks व्यवस्था", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks तक यह बोर्ड:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "सभी चेकलिस्ट आइटम छुपाएं", "support": "समर्थन या सहायता", "supportPopup-title": "समर्थन या सहायता", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "अभिगम्यता पृष्ठ सक्षम किया गया", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/hi.i18n.json b/imports/i18n/data/hi.i18n.json index 2a4ec9a61..65e21e540 100644 --- a/imports/i18n/data/hi.i18n.json +++ b/imports/i18n/data/hi.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "टिप्पणी हटा दी गई", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "खाका", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "संलग्न करें", @@ -328,16 +316,10 @@ "comment-placeholder": "टिप्पणी लिखें", "comment-only": "केवल टिप्पणी करें", "comment-only-desc": "केवल कार्ड पर टिप्पणी कर सकते हैं।", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "कोई टिप्पणी नहीं", "no-comments-desc": "टिप्पणियां और गतिविधियां नहीं देख पा रहे हैं।", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "कामगार", "worker-desc": "केवल कार्ड ले जा सकते हैं, खुद को कार्ड और टिप्पणी करने के लिए असाइन करें।", "computer": "संगणक", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "कॉपी कार्ड क्लिपबोर्ड करने के लिए लिंक", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "कार्ड कड़ी", @@ -356,7 +337,6 @@ "copyManyCardsPopup-format": "[{\"title\":\"पहला कार्ड शीर्षक\",\"description\":\"पहला कार्ड विवरण\"},{\"title\":\"दूसरा कार्ड शीर्षक\",\"description\":\"दूसरा कार्ड विवरण\"},{\"title\":\"अंतिम कार्ड शीर्षक\",\"description\":\"अंतिम कार्ड विवरण\" }]", "create": "निर्माण करना", "createBoardPopup-title": "बोर्ड निर्माण करना", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "बोर्ड आयात", "createLabelPopup-title": "नामपत्र निर्माण", "createCustomField": "क्षेत्र निर्माण", @@ -377,9 +357,9 @@ "custom-fields": "प्रचलन क्षेत्र", "date": "दिनांक", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "संपादित करें Notification", "editProfilePopup-title": "संपादित करें Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "सदस्य व्यवस्था", - "grey-icons": "Grey Icons", "members": "सदस्य", "menu": "Menu", "move-selection": "स्थानांतरित selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "स्थानांतरित तक Bottom", "moveCardToTop-title": "स्थानांतरित तक Top", "moveSelectionPopup-title": "स्थानांतरित selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can आलोकन और संपादित करें कार्ड. Can't change व्यवस्था.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates तक any बोर्ड, lists, or कार्ड you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, कार्ड,नामपत्र , और activities हो जाएगा deleted और you won't be able तक recover the बोर्ड contents. There is no undo.", "boardDeletePopup-title": "मिटाएँ बोर्ड?", "delete-board": "मिटाएँ बोर्ड", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ बोर्ड", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks व्यवस्था", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks व्यवस्था", + "boardSubtaskSettingsPopup-title": "बोर्ड Subtasks व्यवस्था", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks तक यह बोर्ड:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "सभी चेकलिस्ट आइटम छिपाएं", "support": "सहायता", "supportPopup-title": "सहायता", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "अभिगम्यता पृष्ठ सक्षम किया गया", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/hr.i18n.json b/imports/i18n/data/hr.i18n.json index 5f156298e..284be25dd 100644 --- a/imports/i18n/data/hr.i18n.json +++ b/imports/i18n/data/hr.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "obrisan komentar %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Predlošci", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Dodaj privitak", @@ -328,16 +316,10 @@ "comment-placeholder": "Napiši komentar", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "Nema komentara", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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": "Dodaj", "createBoardPopup-title": "Dodaj ploču", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Uvezi ploču", "createLabelPopup-title": "Dodaj oznaku", "createCustomField": "Dodaj polje", @@ -377,9 +357,9 @@ "custom-fields": "Prilagođena polja", "date": "Datum", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Odustani", "default-avatar": "Zadani avatar", "delete": "Obriši", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Uredi profil", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Korisnici", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "Bez rezultata", "normal": "Normalno", "normal-desc": "Može pregledavati i uređivati ​​kartice. Nije moguće promijeniti postavke.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Obrisati ploču?", "delete-board": "Obriši ploču", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Zadano", "defaultdefault": "Zadano", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/hu.i18n.json b/imports/i18n/data/hu.i18n.json index e3375abec..0a3250bac 100644 --- a/imports/i18n/data/hu.i18n.json +++ b/imports/i18n/data/hu.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "törölte ezt a megjegyzést: %s", "activity-receivedDate": "átírta az \"érkezett\" dátumot erről: %s erre: %s", "activity-startDate": "átírta az \"elkezdve\" dátumot erről: %s erre: %s", - "allboards.starred": "Starred", - "allboards.templates": "Sablonok", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "átírta a *határidő* dátumát erről: %s erre: %s", "activity-endDate": "átírta a \"befejezés\" dátumát erről: %s erre: %s", "add-attachment": "Melléklet hozzáadása", @@ -328,16 +316,10 @@ "comment-placeholder": "Megjegyzés írása", "comment-only": "Csak megjegyzés", "comment-only-desc": "Csak megjegyzést írhat a kártyákhoz.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Biztosan törlöd a megjegyzést?", "deleteCommentPopup-title": "Törlöd a megjegyzést?", "no-comments": "Nincs megjegyzés", "no-comments-desc": "Nem láthatsz hozzászólásokat és eseményeket", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Dolgozó", "worker-desc": "Csak mozgathat Kártyákat, hozzárendelheti magát Kártyákhoz és megjegyzésekhez", "computer": "Számítógép", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Kártya hivatkozásának másolása a vágólapra", "copy-text-to-clipboard": "Szöveg másolása vágólapra", "linkCardPopup-title": "Kártyára hivatkozás", @@ -356,7 +337,6 @@ "copyManyCardsPopup-format": "[ {\"title\": \"Első kártya címe\", \"description\":\"Első kártya leírása\"}, {\"title\":\"Második kártya címe\",\"description\":\"Második kártya leírása\"},{\"title\":\"Utolsó kártya címe\",\"description\":\"Utolsó kártya leírása\"} ]", "create": "Létrehozás", "createBoardPopup-title": "Tábla létrehozása", - "createTemplateContainerPopup-title": "Sablon Tároló hozzáadása", "chooseBoardSourcePopup-title": "Tábla importálása", "createLabelPopup-title": "Címke létrehozása", "createCustomField": "Mező létrehozása", @@ -377,9 +357,9 @@ "custom-fields": "Egyéni mezők", "date": "Dátum", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Elutasítás", "default-avatar": "Alapértelmezett avatár", "delete": "Törlés", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Értesítés szerkesztése", "editProfilePopup-title": "Edit Profile", "email": "E-mail", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Bejelentkezés", "loginPopup-title": "Bejelentkezés", "memberMenuPopup-title": "Tagok beállításai", - "grey-icons": "Grey Icons", "members": "Tagok", "menu": "Menü", "move-selection": "Kijelölés áthelyezése", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Áthelyezés az aljára", "moveCardToTop-title": "Áthelyezés a tetejére", "moveSelectionPopup-title": "Kijelölés áthelyezése", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Címke hozzáadása a kiválasztottakhoz", "multi-selection-member": "Tag hozzáadása a kiválasztottakhoz", @@ -578,8 +554,6 @@ "no-results": "Nincs találat", "normal": "Normál", "normal-desc": "Megtekintheti és szerkesztheti a kártyákat. Nem változtathatja meg a beállításokat.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "A meghívás még nincs elfogadva", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Frissítések fogadása bármely táblánál, listánál vagy kártyánál, amelyet megtekint", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Érkezési dátum megváltoztatása", "editCardEndDatePopup-title": "Befejezési dátum megváltoztatása", "setCardColorPopup-title": "Szín beállítása", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Válassz színt", "setSwimlaneColorPopup-title": "Válassz színt", "setListColorPopup-title": "Válassz színt", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "Minden Lista, Kártya, Címke és Esemény véglegesen törlésre kerül és nincs rá mód, hogy visszanyerd a Tábla tartalmát. Nincs visszavonási lehetőség sem.", "boardDeletePopup-title": "TÖRLÖD a Táblát?", "delete-board": "Tábla törlése", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Rész-feladatok ehhez a Táblához: __board__", "default": "Alapértelmezett", "defaultdefault": "Alapértelmezett", @@ -790,7 +761,7 @@ "subtask-settings": "Rész-feladat beállításai", "card-settings": "Kátya beállítások", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Rész-feladat beállításai", + "boardSubtaskSettingsPopup-title": "Tábla Rész-feladatok beállításai", "boardCardSettingsPopup-title": "Kátya beállítások", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Helyezd a Rész-feladatokat erre a Táblára:", @@ -961,8 +932,6 @@ "a-endAt": "átírta a *vége* időpontját erre:", "a-startAt": "átírta a *kezdet* időpontját erre:", "a-receivedAt": "átírta az *érkezett* időpontját erre:", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "a határidő dátuma %s közeledik", "pastdue": "a határidő dátuma %s már lejárt", "duenow": "a határidő dátuma %s ma van", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Én", "dueCardsViewChange-choice-all": "Minden felhasználó", "dueCardsViewChange-choice-all-description": "Minden befejezetlen kártyát felsorol \"határidős\" dátummal, amihez a felhasználónak hozzáférése van.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Sérült Kártyák", "board-title-not-found": "\"%s\" nevű Tábla nem található", "swimlane-title-not-found": "\"%s\" nevű Úszósáv nem található", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Állapot", - "migration-progress-details": "Részletek", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Kész", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/hy.i18n.json b/imports/i18n/data/hy.i18n.json index 2a0e5f617..d9066016e 100644 --- a/imports/i18n/data/hy.i18n.json +++ b/imports/i18n/data/hy.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/id.i18n.json b/imports/i18n/data/id.i18n.json index 78a8121ec..a12bb2ded 100644 --- a/imports/i18n/data/id.i18n.json +++ b/imports/i18n/data/id.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "komentar dihapus %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Klise", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Tambah Lampiran", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Hanya komentar", "comment-only-desc": "Bisa komen hanya di kartu", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Komputer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Buat Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Tanggal", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Tolak", "default-avatar": "Avatar standar", "delete": "Hapus", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Sunting Pemberitahuan", "editProfilePopup-title": "Sunting Profil", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Masuk", "loginPopup-title": "Masuk", "memberMenuPopup-title": "Setelan Anggota", - "grey-icons": "Grey Icons", "members": "Daftar Anggota", "menu": "Menu", "move-selection": "Pindahkan yang dipilih", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Pindahkan ke bawah", "moveCardToTop-title": "Pindahkan ke atas", "moveSelectionPopup-title": "Pindahkan yang dipilih", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi Pilihan", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "Tidak ada hasil", "normal": "Normal", "normal-desc": "Bisa tampilkan dan edit kartu. Tidak bisa ubah setting", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Undangan belum diterima", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Terima update dari semua panel, daftar atau kartu yang anda amati", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Ubah tanggal diterima", "editCardEndDatePopup-title": "Ubah tanggal berakhir", "setCardColorPopup-title": "Tetapkan warna", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Pilih warna", "setSwimlaneColorPopup-title": "Pilih warna", "setListColorPopup-title": "Pilih warna", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Hapus Papan?", "delete-board": "Hapus Papan", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Standar", "defaultdefault": "Standar", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Pengaturan Kartu", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Pengaturan Kartu", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/ig.i18n.json b/imports/i18n/data/ig.i18n.json index 97b4b2071..eaed73339 100644 --- a/imports/i18n/data/ig.i18n.json +++ b/imports/i18n/data/ig.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Ndị otu", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/it.i18n.json b/imports/i18n/data/it.i18n.json index fe160422c..d8f33ad9f 100644 --- a/imports/i18n/data/it.i18n.json +++ b/imports/i18n/data/it.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "commento eliminato %s", "activity-receivedDate": "ha modificato la data di ricevuta a %s di %s", "activity-startDate": "ha modificato la data di inizio a %s di %s", - "allboards.starred": "Starred", - "allboards.templates": "Template", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "ha modificato la data di scadenza a %s di %s", "activity-endDate": "ha modificato la data di fine a %s di %s", "add-attachment": "Aggiungi allegato", @@ -328,16 +316,10 @@ "comment-placeholder": "Scrivi un commento...", "comment-only": "Solo commenti", "comment-only-desc": "Puoi commentare solo le schede.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Sei sicuro di voler cancellare il commento?", "deleteCommentPopup-title": "Eliminare commento?", "no-comments": "Nessun commento", "no-comments-desc": "Impossibile visualizzare commenti o attività.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Lavoratore", "worker-desc": "Può solo spostare schede, assegnarsi una scheda e commentare.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Sicuro di voler cancellare la checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Eliminare checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copia link della scheda negli appunti", "copy-text-to-clipboard": "Copia il testo negli appunti", "linkCardPopup-title": "Collega scheda", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Aggiungi contenitore di Template", "chooseBoardSourcePopup-title": "Importa bacheca", "createLabelPopup-title": "Crea etichetta", "createCustomField": "Crea campo", @@ -377,9 +357,9 @@ "custom-fields": "Campi personalizzati", "date": "Data", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Rifiuta", "default-avatar": "Avatar predefinito", "delete": "Elimina", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Modifica notifiche", "editProfilePopup-title": "Modifica profilo", "email": "Email", - "email-address": "Email Address", "email-enrollAccount-subject": "Creato un account per te su __siteName__", "email-enrollAccount-text": "Ciao __user__,\n\nPer iniziare ad utilizzare il servizio, clicca sul link seguente:\n\n__url__\n\nGrazie.", "email-fail": "Invio email fallito", @@ -554,7 +533,6 @@ "log-in": "Accedi", "loginPopup-title": "Accedi", "memberMenuPopup-title": "Impostazioni membri", - "grey-icons": "Grey Icons", "members": "Membri", "menu": "Menu", "move-selection": "Sposta elementi selezionati", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Sposta in fondo", "moveCardToTop-title": "Sposta in cima", "moveSelectionPopup-title": "Sposta elementi selezionati", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Selezione multipla", "multi-selection-label": "Selezionare etichetta", "multi-selection-member": "Selezionare membro", @@ -578,8 +554,6 @@ "no-results": "Nessun risultato", "normal": "Normale", "normal-desc": "Può visionare e modificare le schede. Non può cambiare le impostazioni.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitato non ancora accettato", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Ricevi aggiornamenti per tutte le bacheche, liste o schede che stai seguendo", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Cambia data ricezione", "editCardEndDatePopup-title": "Cambia data finale", "setCardColorPopup-title": "Imposta il colore", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Scegli un colore", "setSwimlaneColorPopup-title": "Scegli un colore", "setListColorPopup-title": "Scegli un colore", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "Tutte le liste, schede, etichette e azioni saranno rimosse e non sarai più in grado di recuperare il contenuto della bacheca. L'azione non è annullabile.", "boardDeletePopup-title": "Eliminare la bacheca?", "delete-board": "Elimina bacheca", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Sottocompiti per la bacheca __board__", "default": "Predefinito", "defaultdefault": "Predefinito", @@ -790,7 +761,7 @@ "subtask-settings": "Impostazioni sotto-compiti", "card-settings": "Impostazioni scheda", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Impostazioni sotto-compiti", + "boardSubtaskSettingsPopup-title": "Impostazioni sotto-compiti della bacheca", "boardCardSettingsPopup-title": "Impostazioni scheda", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposita i sotto compiti in questa bacheca", @@ -961,8 +932,6 @@ "a-endAt": "orario finale modificato in", "a-startAt": "orario iniziale modificato in", "a-receivedAt": "orario di ricezione modificato in", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "la data di scadenza attuale %s si sta avvicinando", "pastdue": "la data di scadenza attuale %s è scaduta", "duenow": "la data di scadenza attuale %s è oggi", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "Tutti gli utenti", "dueCardsViewChange-choice-all-description": "Visualizza tutte le schede non completate con una data di *scadenza* dalle bacheche in cui l'utente ha il permesso.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Schede danneggiate", "board-title-not-found": "Bacheca '%s' non trovata.", "swimlane-title-not-found": "Swimlane '%s' non trovata.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Nascondi gli elementi della lista di controllo", "support": "Supporto", "supportPopup-title": "Supporto", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibilità", "accessibility-page-enabled": "Pagina accessibilità abilitata", "accessibility-info-not-added-yet": "Le informazioni sull'accessibilità non sono ancora state aggiunte ", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Completato", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Stato", - "migration-progress-details": "Dettagli", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completato/a", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Peso", "idle": "Inattivo", "complete": "Completato", - "cron": "Pianificazione", - "current-step": "Current Step" + "cron": "Pianificazione" } diff --git a/imports/i18n/data/ja-HI.i18n.json b/imports/i18n/data/ja-HI.i18n.json index 44b2d9fb2..d728d70b9 100644 --- a/imports/i18n/data/ja-HI.i18n.json +++ b/imports/i18n/data/ja-HI.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "すべてのチェックリスト項目を非表示", "support": "サポート", "supportPopup-title": "サポート", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "アクセシビリティ", "accessibility-page-enabled": "アクセシビリティページが有効", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "リストをリストア", - "step-restore-cards": "カードをリストア", - "step-restore-swimlanes": "スイムレーンをリストア", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/ja.i18n.json b/imports/i18n/data/ja.i18n.json index d6aa359fb..c8a0fd261 100644 --- a/imports/i18n/data/ja.i18n.json +++ b/imports/i18n/data/ja.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "コメント %s を削除しました", "activity-receivedDate": "受付日を %s に変更しました / %s", "activity-startDate": "開始日を %s に変更しました / %s", - "allboards.starred": "Starred", - "allboards.templates": "テンプレート", - "allboards.remaining": "Remaining", - "allboards.workspaces": "ワークスペース", - "allboards.add-workspace": "ワークスペースを追加", - "allboards.add-workspace-prompt": "ワークスペース名", - "allboards.add-subworkspace": "サブワークスペースを追加", - "allboards.add-subworkspace-prompt": "サブワークスペース名", - "allboards.edit-workspace": "ワークスペースを編集", - "allboards.edit-workspace-name": "ワークスペース名", - "allboards.edit-workspace-icon": "ワークスペースアイコン(マークダウン)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "期限日を %s に変更しました / %s", "activity-endDate": "終了日を %s に変更しました / %s", "add-attachment": "添付ファイルを追加", @@ -203,8 +191,8 @@ "board-view-gantt": "ガント", "board-view-lists": "リスト", "bucket-example": "Like \"Bucket List\" for example", - "calendar-previous-month-label": "前月", - "calendar-next-month-label": "次月", + "calendar-previous-month-label": "Previous Month", + "calendar-next-month-label": "Next Month", "cancel": "キャンセル", "card-archived": "このカードをアーカイブしました。", "board-archived": "このボードをアーカイブしました。", @@ -328,16 +316,10 @@ "comment-placeholder": "コメントを書く", "comment-only": "コメントのみ", "comment-only-desc": "カードにのみコメント可能", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "コメントを削除してもよろしいでしょうか?", "deleteCommentPopup-title": "コメントを削除しますか?", "no-comments": "コメントなし", "no-comments-desc": "コメントとアクティビティの閲覧不可。", - "read-only": "読み取り専用", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "作業者", "worker-desc": "カードの移動、自分への割り当て、コメントが可能。", "computer": "コンピューター", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "チェックリストを削除してもよろしいでしょうか?", "subtaskDeletePopup-title": "サブタスクを削除しますか?", "checklistDeletePopup-title": "チェックリストを削除しますか?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "カードへのリンクをクリップボードにコピー", "copy-text-to-clipboard": "テキストをクリップボードにコピー", "linkCardPopup-title": "カードをリンク", @@ -356,7 +337,6 @@ "copyManyCardsPopup-format": "[ {\"title\": \"1つ目のカードタイトル\", \"description\":\"1つ目のカードの説明\"}, {\"title\":\"2つ目のカードタイトル\",\"description\":\"2つ目のカードの説明\"},{\"title\":\"最後のカードタイトル\",\"description\":\"最後のカードの説明\"} ]", "create": "作成", "createBoardPopup-title": "ボードの作成", - "createTemplateContainerPopup-title": "テンプレートコンテナを追加", "chooseBoardSourcePopup-title": "ボードをインポート", "createLabelPopup-title": "ラベルの作成", "createCustomField": "フィールドを作成", @@ -376,10 +356,10 @@ "custom-field-text": "テキスト", "custom-fields": "カスタムフィールド", "date": "日付", - "date-format": "日付形式", - "date-format-yyyy-mm-dd": "年-月-日", - "date-format-dd-mm-yyyy": "日-月-年", - "date-format-mm-dd-yyyy": "月-日-年", + "date-format": "Date Format", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "拒否", "default-avatar": "デフォルトのアバター", "delete": "削除", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "通知の変更", "editProfilePopup-title": "プロフィールの編集", "email": "メールアドレス", - "email-address": "メールアドレス", "email-enrollAccount-subject": "__siteName__であなたのアカウントが作成されました", "email-enrollAccount-text": "こんにちは、__user__さん。\n\nサービスを開始するには、以下をクリックしてください。\n\n__url__\n\nよろしくお願いします。", "email-fail": "メールの送信に失敗しました", @@ -554,7 +533,6 @@ "log-in": "ログイン", "loginPopup-title": "ログイン", "memberMenuPopup-title": "メンバー設定", - "grey-icons": "グレイアイコン", "members": "メンバー", "menu": "メニュー", "move-selection": "選択したものを移動", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "最下部に移動", "moveCardToTop-title": "先頭に移動", "moveSelectionPopup-title": "選択したものを移動", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "複数選択", "multi-selection-label": "選択したものにラベルを設定", "multi-selection-member": "選択したものにメンバーを設定", @@ -578,8 +554,6 @@ "no-results": "該当するものはありません", "normal": "通常", "normal-desc": "カードの閲覧と編集が可能。設定変更不可。", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "招待はアクセプトされていません", "notify-participate": "作成した、またはメンバーとなったカードの更新情報を受け取る", "notify-watch": "ウォッチしているすべてのボード、リスト、カードの更新情報を受け取る", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "受付日の変更", "editCardEndDatePopup-title": "終了日の変更", "setCardColorPopup-title": "色を選択", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "色を選択", "setSwimlaneColorPopup-title": "色を選択", "setListColorPopup-title": "色を選択", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "すべてのリスト、カード、ラベル、アクティビティは削除され、ボードの内容を元に戻すことができません。", "boardDeletePopup-title": "ボードを削除しますか?", "delete-board": "ボードを削除", - "delete-duplicate-lists": "重複リストを削除", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "__board__ ボードのサブタスク", "default": "デフォルト", "defaultdefault": "デフォルト", @@ -790,7 +761,7 @@ "subtask-settings": "サブタスク設定", "card-settings": "カード設定", "minicard-settings": "ミニカード設定", - "boardSubtaskSettingsPopup-title": "サブタスク設定", + "boardSubtaskSettingsPopup-title": "ボードのサブタスク設定", "boardCardSettingsPopup-title": "カード設定", "boardMinicardSettingsPopup-title": "ミニカード設定", "deposit-subtasks-board": "サブタスクの作成先ボード:", @@ -961,8 +932,6 @@ "a-endAt": "終了を変更しました", "a-startAt": "開始を変更しました", "a-receivedAt": "受付を変更しました", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "期限 %s が近づいています", "pastdue": "期限 %s が過ぎています", "duenow": "期限 %s は本日です", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "自分", "dueCardsViewChange-choice-all": "全ユーザー", "dueCardsViewChange-choice-all-description": "ユーザーに権限のあるボードから、期限が切れたすべての未完了のカードを表示します。", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "壊れたカード", "board-title-not-found": "ボード「%s」は見つかりませんでした。", "swimlane-title-not-found": "スイムレーン「%s」は見つかりませんでした。", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "すべてのチェックリスト項目を非表示", "support": "サポート", "supportPopup-title": "サポート", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "サポートタイトル", - "support-content": "Support content", "accessibility": "アクセシビリティ", "accessibility-page-enabled": "アクセシビリティページが有効", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "重複した空リストを削除", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "復元されたアイテム", - "restore-lost-cards-migration": "紛失カードを復元", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "全アーカイブを復元", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "全ファイルのURLを修正", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "完了", - "migration-running": "実行中...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "問題は見つかりませんでした", - "run-migration": "移行を実行", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "ステータス", - "migration-progress-details": "詳細", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "重複した空のリストを削除", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "リストをリストア", - "step-restore-cards": "カードをリストア", - "step-restore-swimlanes": "スイムレーンをリストア", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "完了した時", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "重み", "idle": "アイドル", "complete": "完了", - "cron": "スケジュール", - "current-step": "Current Step" + "cron": "スケジュール" } diff --git a/imports/i18n/data/ka.i18n.json b/imports/i18n/data/ka.i18n.json index 76b637ab6..c32c78d6b 100644 --- a/imports/i18n/data/ka.i18n.json +++ b/imports/i18n/data/ka.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "მიბმული ფაილის დამატება", @@ -328,16 +316,10 @@ "comment-placeholder": "დაწერეთ კომენტარი", "comment-only": "მხოლოდ კომენტარები", "comment-only-desc": "თქვენ შეგიძლიათ კომენტარის გაკეთება მხოლოდ ბარათებზე.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "კომპიუტერი", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "დააკოპირეთ ბარათის ბმული clipboard-ზე", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-format": "[ {\"სათაური\": \"პირველი ბარათის სათაური\", \"აღწერა\":\"პირველი ბარათის აღწერა\"}, {\"სათაური\":\"მეორე ბარათის სათაური\",\"აღწერა\":\"მეორე ბარათის აღწერა\"},{\"სათაური\":\"ბოლო ბარათის სათაური\",\"აღწერა\":\"ბოლო ბარათის აღწერა\"} ]", "create": "შექმნა", "createBoardPopup-title": "დაფის შექმნა", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "დაფის იმპორტი", "createLabelPopup-title": "ნიშნის შექმნა", "createCustomField": "ველის შექმნა", @@ -377,9 +357,9 @@ "custom-fields": "მომხმარებლის ველი", "date": "თარიღი", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "უარყოფა", "default-avatar": "სტანდარტული ავატარი", "delete": "წაშლა", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "შეტყობინებების შესწორება", "editProfilePopup-title": "პროფილის შესწორება", "email": "ელ.ფოსტა", - "email-address": "Email Address", "email-enrollAccount-subject": "An account created for you on __siteName__", "email-enrollAccount-text": "მოგესალმებით __user__,\n\nამ სერვისის გამოსაყენებლად დააკლიკეთ ქვედა ბმულს.\n\n__url__\n\nმადლობა.", "email-fail": "ელ.ფოსტის გაგზავნა ვერ მოხერხდა", @@ -554,7 +533,6 @@ "log-in": "შესვლა", "loginPopup-title": "შესვლა", "memberMenuPopup-title": "მომხმარებლის პარამეტრები", - "grey-icons": "Grey Icons", "members": "წევრები", "menu": "მენიუ", "move-selection": "მონიშნულის მოძრაობა", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "ქვევით ჩამოწევა", "moveCardToTop-title": "ზევით აწევა", "moveSelectionPopup-title": "მონიშნულის მოძრაობა", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "რამდენიმეს მონიშვნა", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "შედეგის გარეშე", "normal": "ნორმალური", "normal-desc": "შეუძლია ნახოს და შეასწოროს ბარათები. ამ პარამეტრების შეცვლა შეუძლებელია.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "მოწვევა ჯერ არ დადასტურებულა", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "მიიღეთ განახლებები ყველა დაფაზე, ჩამონათვალზე ან ბარათებზე, რომელსაც თქვენ აკვირდებით", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "შეცვალეთ საბოლოო თარიღი", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "ყველა ჩამონათვალი, ბარათი, ნიშანი და აქტივობა წაიშლება და თქვენ ვეღარ შეძლებთ მის აღდგენას.", "boardDeletePopup-title": "წავშალოთ დაფა?", "delete-board": "დაფის წაშლა", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "ქვესაქმიანობა __board__ დაფისთვის", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "ქვესაქმიანობების პარამეტრები", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "ქვესაქმიანობების პარამეტრები", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/km.i18n.json b/imports/i18n/data/km.i18n.json index a828b3b0c..d7c679444 100644 --- a/imports/i18n/data/km.i18n.json +++ b/imports/i18n/data/km.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/km_KH.i18n.json b/imports/i18n/data/km_KH.i18n.json deleted file mode 100644 index d48099de1..000000000 --- a/imports/i18n/data/km_KH.i18n.json +++ /dev/null @@ -1,1605 +0,0 @@ -{ - "accept": "Accept", - "act-activity-notify": "Activity Notification", - "act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-addLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-addedLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-removeLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-removedLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-addChecklist": "added checklist __checklist__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-addChecklistItem": "added checklist item __checklistItem__ to checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-removeChecklist": "removed checklist __checklist__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-removeChecklistItem": "removed checklist item __checklistItem__ from checklist __checkList__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-uncheckedItem": "unchecked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-editComment": "edited comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-deleteComment": "deleted comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-createBoard": "created board __board__", - "act-createSwimlane": "created swimlane __swimlane__ to board __board__", - "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__", - "act-createCustomField": "created custom field __customField__ at board __board__", - "act-deleteCustomField": "deleted custom field __customField__ at board __board__", - "act-setCustomField": "edited custom field __customField__: __customFieldValue__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-createList": "added list __list__ to board __board__", - "act-addBoardMember": "added member __member__ to board __board__", - "act-archivedBoard": "Board __board__ moved to Archive", - "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive", - "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive", - "act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive", - "act-importBoard": "imported board __board__", - "act-importCard": "imported card __card__ to list __list__ at swimlane __swimlane__ at board __board__", - "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__", - "act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-moveCard": "moved card __card__ at board __board__ from list __oldList__ at swimlane __oldSwimlane__ to list __list__ at swimlane __swimlane__", - "act-moveCardToOtherBoard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__", - "act-removeBoardMember": "removed member __member__ from board __board__", - "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__", - "act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-withBoardTitle": "__board__", - "act-withCardTitle": "[__board__] __card__", - "actions": "Actions", - "activities": "Activities", - "activity": "Activity", - "activity-added": "added %s to %s", - "activity-archived": "%s moved to Archive", - "activity-attached": "attached %s to %s", - "activity-created": "created %s", - "activity-changedListTitle": "renamed list to %s", - "activity-customfield-created": "created custom field %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-subtask-added": "added subtask to %s", - "activity-checked-item": "checked %s in checklist %s of %s", - "activity-unchecked-item": "unchecked %s in checklist %s of %s", - "activity-checklist-added": "added checklist to %s", - "activity-checklist-removed": "removed a checklist from %s", - "activity-checklist-completed": "completed checklist %s of %s", - "activity-checklist-uncompleted": "uncompleted the checklist %s of %s", - "activity-checklist-item-added": "added checklist item to '%s' in %s", - "activity-checklist-item-removed": "removed a checklist item from '%s' in %s", - "add": "Add", - "activity-checked-item-card": "checked %s in checklist %s", - "activity-unchecked-item-card": "unchecked %s in checklist %s", - "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "activity-checklist-uncompleted-card": "uncompleted the checklist %s", - "activity-editComment": "edited comment %s", - "activity-deleteComment": "deleted comment %s", - "activity-receivedDate": "edited received date to %s of %s", - "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", - "activity-dueDate": "edited due date to %s of %s", - "activity-endDate": "edited end date to %s of %s", - "add-attachment": "Add Attachment", - "add-board": "Add Board", - "add-template": "Add Template", - "add-card": "Add Card", - "add-card-to-top-of-list": "Add Card to Top of List", - "add-card-to-bottom-of-list": "Add Card to Bottom of List", - "setListWidthPopup-title": "Set Widths", - "set-list-width": "Set Widths", - "set-list-width-value": "Set Min & Max Widths (pixels)", - "list-width-error-message": "List widths must be integers greater than 100", - "keyboard-shortcuts-enabled": "Keyboard shortcuts enabled. Click to disable.", - "keyboard-shortcuts-disabled": "Keyboard shortcuts disabled. Click to enable.", - "setSwimlaneHeightPopup-title": "Set Swimlane Height", - "set-swimlane-height": "Set Swimlane Height", - "set-swimlane-height-value": "Swimlane Height (pixels)", - "swimlane-height-error-message": "Swimlane height must be a positive integer", - "add-swimlane": "Add Swimlane", - "add-subtask": "Add Subtask", - "add-checklist": "Add Checklist", - "add-checklist-item": "Add an item to checklist", - "close-add-checklist-item": "Close add an item to checklist form", - "close-edit-checklist-item": "Close edit an item to checklist form", - "convertChecklistItemToCardPopup-title": "Convert to Card", - "add-cover": "Add cover image to minicard", - "add-label": "Add Label", - "add-list": "Add List", - "add-after-list": "Add After List", - "add-members": "Add Members", - "added": "Added", - "addMemberPopup-title": "Members", - "memberPopup-title": "Member Settings", - "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": "Loading, please wait. Refreshing the page will cause data loss. If loading does not work, please check that server has not stopped.", - "app-try-reconnect": "Try to reconnect.", - "archive": "Move to Archive", - "archive-all": "Move All to Archive", - "archive-board": "Move Board to Archive", - "archive-board-confirm": "Are you sure you want to archive this board?", - "archive-card": "Move Card to Archive", - "archive-list": "Move List to Archive", - "archive-swimlane": "Move Swimlane to Archive", - "archive-selection": "Move selection to Archive", - "archiveBoardPopup-title": "Move Board to Archive?", - "archived-items": "Archive", - "archived-boards": "Boards in Archive", - "restore-board": "Restore Board", - "no-archived-boards": "No Boards in Archive.", - "archives": "Archive", - "template": "Template", - "templates": "Templates", - "template-container": "Template Container", - "add-template-container": "Add Template Container", - "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 (__size__ max)", - "back": "Back", - "board-change-color": "Change color", - "board-change-background-image": "Change Background Image", - "board-background-image-url": "Background Image URL", - "add-background-image": "Add Background Image", - "remove-background-image": "Remove Background Image", - "show-at-all-boards-page" : "Show at All Boards page", - "board-info-on-my-boards" : "All Boards Settings", - "boardInfoOnMyBoardsPopup-title" : "All Boards Settings", - "boardInfoOnMyBoards-title": "All Boards Settings", - "show-card-counter-per-list": "Show card count per list", - "show-board_members-avatar": "Show Board members avatars", - "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>.", - "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", - "boardChangeColorPopup-title": "Change Board Background", - "boardChangeBackgroundImagePopup-title": "Change Background Image", - "allBoardsChangeColorPopup-title": "Change color", - "allBoardsChangeBackgroundImagePopup-title": "Change Background Image", - "boardChangeTitlePopup-title": "Rename Board", - "boardChangeVisibilityPopup-title": "Change Visibility", - "boardChangeWatchPopup-title": "Change Watch", - "boardMenuPopup-title": "Board Settings", - "allBoardsMenuPopup-title": "Settings", - "boardChangeViewPopup-title": "Board View", - "boards": "Boards", - "board-view": "Board View", - "desktop-mode": "Desktop Mode", - "mobile-mode": "Mobile Mode", - "mobile-desktop-toggle": "Toggle between Mobile and Desktop Mode", - "zoom-in": "Zoom In", - "zoom-out": "Zoom Out", - "click-to-change-zoom": "Click to change zoom level", - "zoom-level": "Zoom Level", - "enter-zoom-level": "Enter zoom level (50-300%):", - "board-view-cal": "Calendar", - "board-view-swimlanes": "Swimlanes", - "board-view-collapse": "Collapse", - "board-view-gantt": "Gantt", - "board-view-lists": "Lists", - "bucket-example": "Like \"Bucket List\" for example", - "calendar-previous-month-label": "Previous Month", - "calendar-next-month-label": "Next Month", - "cancel": "Cancel", - "card-archived": "This card is moved to Archive.", - "board-archived": "This board is moved to Archive.", - "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 to Archive to remove it from the board and preserve the activity.", - "card-archive-pop": "Card will not be visible at this list after archiving card.", - "card-archive-suggest-cancel": "You can later restore card from Archive.", - "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", - "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", - "cardCustomField-datePopup-title": "Change date", - "cardCustomFieldsPopup-title": "Edit custom fields", - "cardStartVotingPopup-title": "Start a vote", - "positiveVoteMembersPopup-title": "Proponents", - "negativeVoteMembersPopup-title": "Opponents", - "card-edit-voting": "Edit voting", - "editVoteEndDatePopup-title": "Change vote end date", - "allowNonBoardMembers": "Allow all logged in users", - "vote-question": "Voting question", - "vote-public": "Show who voted what", - "vote-for-it": "for it", - "vote-against": "against", - "deleteVotePopup-title": "Delete vote?", - "vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.", - "cardStartPlanningPokerPopup-title": "Start a Planning Poker", - "card-edit-planning-poker": "Edit Planning Poker", - "editPokerEndDatePopup-title": "Change Planning Poker vote end date", - "poker-question": "Planning Poker", - "poker-one": "1", - "poker-two": "2", - "poker-three": "3", - "poker-five": "5", - "poker-eight": "8", - "poker-thirteen": "13", - "poker-twenty": "20", - "poker-forty": "40", - "poker-oneHundred": "100", - "poker-unsure": "?", - "poker-finish": "Finish", - "poker-result-votes": "Votes", - "poker-result-who": "Who", - "poker-replay": "Replay", - "set-estimation": "Set Estimation", - "deletePokerPopup-title": "Delete planning poker?", - "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", - "cardDeletePopup-title": "Delete Card?", - "cardArchivePopup-title": "Archive Card?", - "cardDetailsActionsPopup-title": "Card Actions", - "cardLabelsPopup-title": "Labels", - "cardMembersPopup-title": "Members", - "cardMorePopup-title": "More", - "cardTemplatePopup-title": "Create template", - "cards": "Cards", - "cards-count": "Cards", - "cards-count-one": "Card", - "casSignIn": "Sign In with CAS", - "cardType-card": "Card", - "cardType-linkedCard": "Linked Card", - "cardType-linkedBoard": "Linked Board", - "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", - "subtasks": "Subtasks", - "checklists": "Checklists", - "click-to-star": "Click to star this board.", - "click-to-unstar": "Click to unstar this board.", - "click-to-enable-auto-width": "Auto list width disabled. Click to enable.", - "click-to-disable-auto-width": "Auto list width enabled. Click to disable.", - "auto-list-width": "Auto list width", - "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 “Archive” button from the home header.", - "close-card": "Close Card", - "color-black": "black", - "color-blue": "blue", - "color-crimson": "crimson", - "color-darkgreen": "darkgreen", - "color-gold": "gold", - "color-gray": "gray", - "color-green": "green", - "color-indigo": "indigo", - "color-lime": "lime", - "color-magenta": "magenta", - "color-mistyrose": "mistyrose", - "color-navy": "navy", - "color-orange": "orange", - "color-paleturquoise": "paleturquoise", - "color-peachpuff": "peachpuff", - "color-pink": "pink", - "color-plum": "plum", - "color-purple": "purple", - "color-red": "red", - "color-saddlebrown": "saddlebrown", - "color-silver": "silver", - "color-sky": "sky", - "color-slateblue": "slateblue", - "color-white": "white", - "color-yellow": "yellow", - "unset-color": "Unset", - "comments": "Comments", - "comment": "Comment", - "comment-placeholder": "Write Comment", - "comment-only": "Comment only", - "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", - "comment-delete": "Are you sure you want to delete the comment?", - "deleteCommentPopup-title": "Delete comment?", - "no-comments": "No comments", - "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", - "worker": "Worker", - "worker-desc": "Can only move cards, assign itself to card and comment.", - "computer": "Computer", - "confirm-subtask-delete-popup": "Are you sure you want to delete subtask?", - "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", - "subtaskDeletePopup-title": "Delete Subtask?", - "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", - "copy-card-link-to-clipboard": "Copy card link to clipboard", - "copy-text-to-clipboard": "Copy text to clipboard", - "linkCardPopup-title": "Link Card", - "searchElementPopup-title": "Search", - "copyCardPopup-title": "Copy Card", - "copyManyCardsPopup-title": "Copy Template to Many Cards", - "copyManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format", - "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", - "chooseBoardSourcePopup-title": "Import board", - "createLabelPopup-title": "Create Label", - "createCustomField": "Create Field", - "createCustomFieldPopup-title": "Create Field", - "current": "current", - "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.", - "custom-field-checkbox": "Checkbox", - "custom-field-currency": "Currency", - "custom-field-currency-option": "Currency Code", - "custom-field-date": "Date", - "custom-field-dropdown": "Dropdown List", - "custom-field-dropdown-none": "(none)", - "custom-field-dropdown-options": "List Options", - "custom-field-dropdown-options-placeholder": "Press enter to add more options", - "custom-field-dropdown-unknown": "(unknown)", - "custom-field-number": "Number", - "custom-field-text": "Text", - "custom-fields": "Custom Fields", - "date": "Date", - "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", - "decline": "Decline", - "default-avatar": "Default avatar", - "delete": "Delete", - "deleteCustomFieldPopup-title": "Delete Custom Field?", - "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", - "editCustomFieldPopup-title": "Edit Field", - "addReactionPopup-title": "Add reaction", - "editCardSpentTimePopup-title": "Change spent time", - "editLabelPopup-title": "Change Label", - "editNotificationPopup-title": "Edit Notification", - "editProfilePopup-title": "Edit Profile", - "email": "Email", - "email-address": "Email Address", - "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-vertical-scrollbars": "Enable vertical scrollbars", - "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-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) 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-orgname-taken": "This organization name is already taken", - "error-teamname-taken": "This team name is already taken", - "error-email-taken": "Email has already been taken", - "export-board": "Export board", - "export-board-json": "Export board to JSON", - "export-board-csv": "Export board to CSV", - "export-board-tsv": "Export board to TSV", - "export-board-excel": "Export board to Excel", - "user-can-not-export-excel": "User can not export Excel", - "export-board-html": "Export board to HTML", - "export-card": "Export card", - "export-card-pdf": "Export card to PDF", - "user-can-not-export-card-to-pdf": "User can not export card to PDF", - "exportBoardPopup-title": "Export board", - "exportCardPopup-title": "Export card", - "sort": "Sort", - "sorted": "Sorted", - "remove-sort": "Remove sort", - "sort-desc": "Click to Sort List", - "list-sort-by": "Sort the List By:", - "list-label-modifiedAt": "Last Access Time", - "list-label-title": "Name of the List", - "list-label-sort": "Your Manual Order", - "list-label-short-modifiedAt": "(L)", - "list-label-short-title": "(N)", - "list-label-short-sort": "(M)", - "filter": "Filter", - "filter-cards": "Filter Cards or Lists", - "filter-dates-label": "Filter by date", - "filter-no-due-date": "No due date", - "filter-overdue": "Overdue", - "filter-due-today": "Due today", - "filter-due-this-week": "Due this week", - "filter-due-next-week": "Due next week", - "filter-due-tomorrow": "Due tomorrow", - "list-filter-label": "Filter List by Title", - "filter-clear": "Clear filter", - "filter-labels-label": "Filter by label", - "filter-no-label": "No label", - "filter-member-label": "Filter by member", - "filter-no-member": "No member", - "filter-assignee-label": "Filter by assignee", - "filter-no-assignee": "No assignee", - "filter-custom-fields-label": "Filter by Custom Fields", - "filter-no-custom-fields": "No Custom Fields", - "filter-show-archive": "Show archived lists", - "filter-hide-empty": "Hide empty lists", - "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", - "other-filters-label": "Other Filters", - "advanced-filter-label": "Advanced Filter", - "advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i", - "fullname": "Full Name", - "header-logo-title": "Go back to your boards page.", - "show-activities": "Show Activities", - "headerBarCreateBoardPopup-title": "Create Board", - "home": "Home", - "import": "Import", - "impersonate-user": "Impersonate user", - "link": "Link", - "import-board": "import board", - "import-board-c": "Import board", - "import-board-title-trello": "Import board from Trello", - "import-board-title-wekan": "Import board from previous export", - "import-board-title-csv": "Import board from CSV/TSV", - "from-trello": "From Trello", - "from-wekan": "From previous export", - "from-csv": "From CSV/TSV", - "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-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .", - "import-board-instruction-wekan": "In your board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.", - "import-board-instruction-about-errors": "If you get errors when importing board, sometimes importing still works, and board is at All Boards page.", - "import-json-placeholder": "Paste your valid JSON data here", - "import-csv-placeholder": "Paste your valid CSV/TSV 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 your users", - "import-members-map-note": "Note: Unmapped members will be assigned to the current user.", - "import-show-user-mapping": "Review members mapping", - "import-user-select": "Pick your existing user you want to use as this member", - "importMapMembersAddPopup-title": "Select 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 Archive", - "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Archive and bring them back to the board, click “Menu” > “Archive”.", - "list-move-cards": "Move all cards in this list", - "list-select-cards": "Select all cards in this list", - "set-color-list": "Set Color", - "listActionPopup-title": "List Actions", - "settingsUserPopup-title": "User Settings", - "settingsTeamPopup-title": "Team Settings", - "settingsOrgPopup-title": "Organization Settings", - "swimlaneActionPopup-title": "Swimlane Actions", - "swimlaneAddPopup-title": "Add a Swimlane below", - "listImportCardPopup-title": "Import a Trello card", - "listImportCardsTsvPopup-title": "Import Excel CSV/TSV", - "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 Archive 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", - "grey-icons": "Grey Icons", - "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", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", - "multi-selection": "Multi-Selection", - "multi-selection-label": "Set label for selection", - "multi-selection-member": "Set member for 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 Archive.", - "no-archived-lists": "No lists in Archive.", - "no-archived-swimlanes": "No swimlanes in Archive.", - "no-results": "No results", - "normal": "Normal", - "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", - "not-accepted-yet": "Invitation not accepted yet", - "notify-participate": "Receive updates to any cards you participate as creator 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 image from minicard", - "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", - "rescue-card-description": "Show rescue dialogue before closing for unsaved card descriptions", - "rescue-card-description-dialogue": "Overwrite current card description with your changes?", - "save": "Save", - "search": "Search", - "rules": "Rules", - "search-cards": "Search from card/list titles, descriptions and custom fields on this board", - "search-example": "Write text you search and press Enter", - "select-color": "Select Color", - "select-board": "Select Board", - "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list", - "setWipLimitPopup-title": "Set WIP Limit", - "shortcut-add-self": "Add yourself to current card", - "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-filter-my-assigned-cards": "Filter my assigned cards", - "shortcut-show-shortcuts": "Bring up this shortcuts list", - "shortcut-toggle-filterbar": "Toggle Filter Sidebar", - "shortcut-toggle-searchbar": "Toggle Search 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", - "toggle-assignees": "Toggle assignees 1-9 for card (By order of addition to board).", - "toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9", - "remove-labels-multiselect": "Multi-Selection removes labels 1-9", - "tracking": "Tracking", - "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", - "type": "Type", - "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", - "uploading-files": "Uploading files", - "upload-failed": "Upload failed", - "upload-completed": "Upload completed", - "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL", - "custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL", - "custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27", - "custom-login-logo-image-url": "Custom Login Logo Image URL", - "custom-login-logo-link-url": "Custom Login Logo Link URL", - "custom-help-link-url": "Custom Help Link URL", - "text-below-custom-login-logo": "Text below Custom Login Logo", - "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", - "username": "Username", - "import-usernames": "Import Usernames", - "view-it": "View it", - "warn-list-archived": "warning: this card is in an list at Archive", - "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", - "card-templates-swimlane": "Card Templates", - "list-templates-swimlane": "List Templates", - "board-templates-swimlane": "Board Templates", - "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", - "disable-forgot-password": "Disable Forgot Password", - "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 kanban board 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", - "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.", - "webhook-title": "Webhook Name", - "webhook-token": "Token (Optional for Authentication)", - "outgoing-webhooks": "Outgoing Webhooks", - "bidirectional-webhooks": "Two-Way Webhooks", - "outgoingWebhooksPopup-title": "Outgoing Webhooks", - "boardCardTitlePopup-title": "Card Title Filter", - "disable-webhook": "Disable This Webhook", - "global-webhook": "Global Webhooks", - "new-outgoing-webhook": "New Outgoing Webhook", - "no-name": "(Unknown)", - "Node_version": "Node version", - "Meteor_version": "Meteor version", - "MongoDB_version": "MongoDB version", - "MongoDB_storage_engine": "MongoDB storage engine", - "MongoDB_Oplog_enabled": "MongoDB Oplog enabled", - "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", - "days": "days", - "hours": "hours", - "minutes": "minutes", - "seconds": "seconds", - "show-field-on-card": "Show this field on card", - "automatically-field-on-card": "Add field to new cards", - "always-field-on-card": "Add field to all cards", - "showLabel-field-on-card": "Show field label on minicard", - "showSum-field-on-list": "Show sum of fields at top of list", - "yes": "Yes", - "no": "No", - "accounts": "Accounts", - "accounts-allowEmailChange": "Allow Email Change", - "accounts-allowUserNameChange": "Allow Username Change", - "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", - "tableVisibilityMode" : "Boards visibility", - "createdAt": "Created at", - "modifiedAt": "Modified 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", - "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", - "setCardActionsColorPopup-title": "Choose a color", - "setSwimlaneColorPopup-title": "Choose a color", - "setListColorPopup-title": "Choose a color", - "assigned-by": "Assigned By", - "requested-by": "Requested By", - "card-sorting-by-number": "Card sorting by number", - "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.", - "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", - "boardDeletePopup-title": "Delete Board?", - "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", - "default-subtasks-board": "Subtasks for __board__ board", - "default": "Default", - "defaultdefault": "Default", - "queue": "Queue", - "subtask-settings": "Subtasks Settings", - "card-settings": "Card Settings", - "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", - "boardCardSettingsPopup-title": "Card Settings", - "boardMinicardSettingsPopup-title": "Minicard Settings", - "deposit-subtasks-board": "Deposit subtasks to this board:", - "deposit-subtasks-list": "Landing list for subtasks deposited here:", - "show-parent-in-minicard": "Show parent in minicard:", - "description-on-minicard": "Description on minicard", - "cover-attachment-on-minicard": "Cover image on minicard", - "badge-attachment-on-minicard": "Count of attachments on minicard", - "card-sorting-by-number-on-minicard": "Card sorting by number on minicard", - "prefix-with-full-path": "Prefix with full path", - "prefix-with-parent": "Prefix with parent", - "subtext-with-full-path": "Subtext with full path", - "subtext-with-parent": "Subtext with parent", - "change-card-parent": "Change card's parent", - "parent-card": "Parent card", - "source-board": "Source board", - "no-parent": "Don't show parent", - "activity-added-label": "added label '%s' to %s", - "activity-removed-label": "removed label '%s' from %s", - "activity-delete-attach": "deleted an attachment from %s", - "activity-added-label-card": "added label '%s'", - "activity-removed-label-card": "removed label '%s'", - "activity-delete-attach-card": "deleted an attachment", - "activity-set-customfield": "set custom field '%s' to '%s' in %s", - "activity-unset-customfield": "unset custom field '%s' in %s", - "r-rule": "Rule", - "r-add-trigger": "Add trigger", - "r-add-action": "Add action", - "r-board-rules": "Board rules", - "r-add-rule": "Add rule", - "r-view-rule": "View rule", - "r-delete-rule": "Delete rule", - "r-new-rule-name": "New rule title", - "r-no-rules": "No rules", - "r-trigger": "Trigger", - "r-action": "Action", - "r-when-a-card": "When a card", - "r-is": "is", - "r-is-moved": "is moved", - "r-added-to": "Added to", - "r-removed-from": "Removed from", - "r-the-board": "the board", - "r-list": "list", - "set-filter": "Set Filter", - "r-moved-to": "Moved to", - "r-moved-from": "Moved from", - "r-archived": "Moved to Archive", - "r-unarchived": "Restored from Archive", - "r-a-card": "a card", - "r-when-a-label-is": "When a label is", - "r-when-the-label": "When the label", - "r-list-name": "list name", - "r-when-a-member": "When a member is", - "r-when-the-member": "When the member", - "r-name": "name", - "r-when-a-attach": "When an attachment", - "r-when-a-checklist": "When a checklist is", - "r-when-the-checklist": "When the checklist", - "r-completed": "Completed", - "r-made-incomplete": "Made incomplete", - "r-when-a-item": "When a checklist item is", - "r-when-the-item": "When the checklist item", - "r-checked": "Checked", - "r-unchecked": "Unchecked", - "r-move-card-to": "Move card to", - "r-top-of": "Top of", - "r-bottom-of": "Bottom of", - "r-its-list": "its list", - "r-archive": "Move to Archive", - "r-unarchive": "Restore from Archive", - "r-card": "card", - "r-add": "Add", - "r-remove": "Remove", - "r-label": "label", - "r-member": "member", - "r-remove-all": "Remove all members from the card", - "r-set-color": "Set color to", - "r-checklist": "checklist", - "r-check-all": "Check all", - "r-uncheck-all": "Uncheck all", - "r-items-check": "items of checklist", - "r-check": "Check", - "r-uncheck": "Uncheck", - "r-item": "item", - "r-of-checklist": "of checklist", - "r-send-email": "Send an email", - "r-to": "to", - "r-of": "of", - "r-subject": "subject", - "r-rule-details": "Rule details", - "r-d-move-to-top-gen": "Move card to top of its list", - "r-d-move-to-top-spec": "Move card to top of list", - "r-d-move-to-bottom-gen": "Move card to bottom of its list", - "r-d-move-to-bottom-spec": "Move card to bottom of list", - "r-d-send-email": "Send email", - "r-d-send-email-to": "to", - "r-d-send-email-subject": "subject", - "r-d-send-email-message": "message", - "r-d-archive": "Move card to Archive", - "r-d-unarchive": "Restore card from Archive", - "r-d-add-label": "Add label", - "r-d-remove-label": "Remove label", - "r-create-card": "Create new card", - "r-in-list": "in list", - "r-in-swimlane": "in swimlane", - "r-d-add-member": "Add member", - "r-d-remove-member": "Remove member", - "r-d-remove-all-member": "Remove all member", - "r-d-check-all": "Check all items of a list", - "r-d-uncheck-all": "Uncheck all items of a list", - "r-d-check-one": "Check item", - "r-d-uncheck-one": "Uncheck item", - "r-d-check-of-list": "of checklist", - "r-d-add-checklist": "Add checklist", - "r-d-remove-checklist": "Remove checklist", - "r-by": "by", - "r-add-checklist": "Add checklist", - "r-with-items": "with items", - "r-items-list": "item1,item2,item3", - "r-add-swimlane": "Add swimlane", - "r-swimlane-name": "swimlane name", - "r-board-note": "Note: leave a field empty to match every possible value. ", - "r-checklist-note": "Note: checklist's items have to be written as comma separated values.", - "r-when-a-card-is-moved": "When a card is moved to another list", - "r-set": "Set", - "r-update": "Update", - "r-datefield": "date field", - "r-df-start-at": "start", - "r-df-due-at": "due", - "r-df-end-at": "end", - "r-df-received-at": "received", - "r-to-current-datetime": "to current date/time", - "r-remove-value-from": "Remove value from", - "r-link-card": "Link card to", - "ldap": "LDAP", - "oauth2": "OAuth2", - "cas": "CAS", - "authentication-method": "Authentication method", - "authentication-type": "Authentication type", - "custom-product-name": "Custom Product Name", - "layout": "Layout", - "hide-logo": "Hide Logo", - "hide-card-counter-list": "Hide card counter list on All Boards", - "hide-board-member-list": "Hide board member list on All Boards", - "add-custom-html-after-body-start": "Add Custom HTML after <body> start", - "add-custom-html-before-body-end": "Add Custom HTML before </body> end", - "error-undefined": "Something went wrong", - "error-ldap-login": "An error occurred while trying to login", - "display-authentication-method": "Display Authentication Method", - "oidc-button-text": "Customize the OIDC button text", - "default-authentication-method": "Default Authentication Method", - "duplicate-board": "Duplicate Board", - "duplicate-board-confirm": "Are you sure you want to duplicate this board?", - "org-number": "The number of organizations is: ", - "team-number": "The number of teams is: ", - "people-number": "The number of people is: ", - "swimlaneDeletePopup-title": "Delete Swimlane ?", - "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.", - "restore-all": "Restore all", - "delete-all": "Delete all", - "loading": "Loading, please wait.", - "previous_as": "last time was", - "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__", - "act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)", - "act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)", - "act-a-receivedAt": "modified received time to __timeValue__ from (__timeOldValue__)", - "a-dueAt": "modified due time to be", - "a-endAt": "modified ending time to be", - "a-startAt": "modified starting time to be", - "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", - "almostdue": "current due time %s is approaching", - "pastdue": "current due time %s is past", - "duenow": "current due time %s is today", - "act-newDue": "__list__/__card__ has 1st due reminder [__board__]", - "act-withDue": "__list__/__card__ due reminders [__board__]", - "act-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching", - "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past", - "act-duenow": "was reminding the current due (__timeValue__) of __card__ is now", - "act-atUserComment": "You were mentioned in [__board__] __list__/__card__", - "delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.", - "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", - "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", - "accounts-allowUserDelete": "Allow users to self delete their account", - "hide-minicard-label-text": "Hide minicard label text", - "show-desktop-drag-handles": "Show desktop drag handles", - "assignee": "Assignee", - "cardAssigneesPopup-title": "Assignee", - "addmore-detail": "Add a more detailed description", - "show-on-card": "Show on Card", - "show-on-minicard": "Show on Minicard", - "new": "New", - "editOrgPopup-title": "Edit Organization", - "newOrgPopup-title": "New Organization", - "editTeamPopup-title": "Edit Team", - "newTeamPopup-title": "New Team", - "editUserPopup-title": "Edit User", - "newUserPopup-title": "New User", - "notifications": "Notifications", - "help": "Help", - "view-all": "View All", - "filter-by-unread": "Filter by Unread", - "mark-all-as-read": "Mark all as read", - "remove-all-read": "Remove all read", - "allow-rename": "Allow Rename", - "allowRenamePopup-title": "Allow Rename", - "start-day-of-week": "Set day of the week start", - "monday": "Monday", - "tuesday": "Tuesday", - "wednesday": "Wednesday", - "thursday": "Thursday", - "friday": "Friday", - "saturday": "Saturday", - "sunday": "Sunday", - "status": "Status", - "swimlane": "Swimlane", - "owner": "Owner", - "last-modified-at": "Last modified at", - "last-activity": "Last activity", - "voting": "Voting", - "archived": "Archived", - "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has", - "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list", - "hide-checked-items": "Hide checked items", - "hide-finished-checklist": "Hide finished checklist", - "task": "Task", - "create-task": "Create Task", - "ok": "OK", - "organizations": "Organizations", - "teams": "Teams", - "displayName": "Display Name", - "shortName": "Short Name", - "autoAddUsersWithDomainName": "Automatically add users with the domain name", - "website": "Website", - "person": "Person", - "my-cards": "My Cards", - "card": "Card", - "list": "List", - "board": "Board", - "context-separator": "/", - "myCardsViewChange-title": "My Cards View", - "myCardsViewChangePopup-title": "My Cards View", - "myCardsViewChange-choice-boards": "Boards", - "myCardsViewChange-choice-table": "Table", - "myCardsSortChange-title": "My Cards Sort", - "myCardsSortChangePopup-title": "My Cards Sort", - "myCardsSortChange-choice-board": "By Board", - "myCardsSortChange-choice-dueat": "By Due Date", - "dueCards-title": "Due Cards", - "dueCardsViewChange-title": "Due Cards View", - "dueCardsViewChangePopup-title": "Due Cards View", - "dueCardsViewChange-choice-me": "Me", - "dueCardsViewChange-choice-all": "All Users", - "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", - "broken-cards": "Broken Cards", - "board-title-not-found": "Board '%s' not found.", - "swimlane-title-not-found": "Swimlane '%s' not found.", - "list-title-not-found": "List '%s' not found.", - "label-not-found": "Label '%s' not found.", - "label-color-not-found": "Label color %s not found.", - "user-username-not-found": "Username '%s' not found.", - "comment-not-found": "Card with comment containing text '%s' not found.", - "org-name-not-found": "Organization '%s' not found.", - "team-name-not-found": "Team '%s' not found.", - "globalSearch-title": "Search All Boards", - "no-cards-found": "No Cards Found", - "one-card-found": "One Card Found", - "n-cards-found": "%s Cards Found", - "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", - "operator-board": "board", - "operator-board-abbrev": "b", - "operator-swimlane": "swimlane", - "operator-swimlane-abbrev": "s", - "operator-list": "list", - "operator-list-abbrev": "l", - "operator-label": "label", - "operator-label-abbrev": "#", - "operator-user": "user", - "operator-user-abbrev": "@", - "operator-member": "member", - "operator-member-abbrev": "m", - "operator-assignee": "assignee", - "operator-assignee-abbrev": "a", - "operator-creator": "creator", - "operator-status": "status", - "operator-due": "due", - "operator-created": "created", - "operator-modified": "modified", - "operator-sort": "sort", - "operator-comment": "comment", - "operator-has": "has", - "operator-limit": "limit", - "operator-debug": "debug", - "operator-org": "org", - "operator-team": "team", - "predicate-archived": "archived", - "predicate-open": "open", - "predicate-ended": "ended", - "predicate-all": "all", - "predicate-overdue": "overdue", - "predicate-week": "week", - "predicate-month": "month", - "predicate-quarter": "quarter", - "predicate-year": "year", - "predicate-due": "due", - "predicate-modified": "modified", - "predicate-created": "created", - "predicate-attachment": "attachment", - "predicate-description": "description", - "predicate-checklist": "checklist", - "predicate-start": "start", - "predicate-end": "end", - "predicate-assignee": "assignee", - "predicate-member": "member", - "predicate-public": "public", - "predicate-private": "private", - "predicate-selector": "selector", - "predicate-projection": "projection", - "operator-unknown-error": "%s is not an operator", - "operator-number-expected": "operator __operator__ expected a number, got '__value__'", - "operator-sort-invalid": "sort of '%s' is invalid", - "operator-status-invalid": "'%s' is not a valid status", - "operator-has-invalid": "%s is not a valid existence check", - "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", - "operator-debug-invalid": "%s is not a valid debug predicate", - "next-page": "Next Page", - "previous-page": "Previous Page", - "heading-notes": "Notes", - "globalSearch-instructions-heading": "Search Instructions", - "globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).", - "globalSearch-instructions-operators": "Available operators:", - "globalSearch-instructions-operator-board": "`__operator_board__:<title>` - cards in boards matching the specified *<title>*", - "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - cards in lists matching the specified *<title>*", - "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", - "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", - "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", - "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", - "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", - "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", - "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*", - "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", - "globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cards belonging to a board assigned to organization *<name>*", - "globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cards belonging to a board assigned to team *<name>*", - "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now. `__operator_due__:__predicate_overdue__ lists all cards past their due date.", - "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less", - "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less", - "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:", - "globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards", - "globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards", - "globalSearch-instructions-status-ended": "`__predicate_ended__` - cards with an end date", - "globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards", - "globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards", - "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`. Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).", - "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`. For a descending sort, place a `-` in front of the sort name.", - "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.", - "globalSearch-instructions-notes-1": "Multiple operators may be specified.", - "globalSearch-instructions-notes-2": "Similar operators are *OR*ed together. Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.", - "globalSearch-instructions-notes-3": "Differing operators are *AND*ed together. Only cards that match all of the differing operators are returned. `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.", - "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.", - "globalSearch-instructions-notes-4": "Text searches are case insensitive.", - "globalSearch-instructions-notes-5": "By default archived cards are not searched.", - "link-to-search": "Link to this search", - "excel-font": "Arial", - "number": "Number", - "label-colors": "Label Colors", - "label-names": "Label Names", - "archived-at": "archived at", - "sort-cards": "Sort Cards", - "sort-is-on": "Sort is on", - "cardsSortPopup-title": "Sort Cards", - "due-date": "Due Date", - "server-error": "Server Error", - "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", - "title-alphabetically": "Title (Alphabetically)", - "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)", - "links-heading": "Links", - "hide-activities-of-all-boards": "Don't show the board activities on all boards", - "now-activities-of-all-boards-are-hidden": "Now all activities of all boards are hidden", - "move-swimlane": "Move Swimlane", - "moveSwimlanePopup-title": "Move Swimlane", - "custom-field-stringtemplate": "String Template", - "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", - "custom-field-stringtemplate-separator": "Separator (use or   for a space)", - "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", - "creator": "Creator", - "creator-on-minicard": "Creator on minicard", - "filesReportTitle": "Files Report", - "reports": "Reports", - "rulesReportTitle": "Rules Report", - "boardsReportTitle": "Boards Report", - "cardsReportTitle": "Cards Report", - "copy-swimlane": "Copy Swimlane", - "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner", - "Bounce": "Bounce Wait Spinner", - "Cube": "Cube Wait Spinner", - "Cube-Grid": "Cube-Grid Wait Spinner", - "Dot": "Dot Wait Spinner", - "Double-Bounce": "Double Bounce Wait Spinner", - "Rotateplane": "Rotateplane Wait Spinner", - "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner", - "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card", - "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", - "subject": "Subject", - "details": "Details", - "carbon-copy": "Carbon Copy (Cc:)", - "ticket": "Ticket", - "tickets": "Tickets", - "ticket-number": "Ticket Number", - "open": "Open", - "pending": "Pending", - "closed": "Closed", - "resolved": "Resolved", - "cancelled": "Cancelled", - "history": "History", - "request": "Request", - "requests": "Requests", - "help-request": "Help Request", - "editCardSortOrderPopup-title": "Change Sorting", - "cardDetailsPopup-title": "Card Details", - "add-teams": "Add teams", - "add-teams-label": "Added teams are displayed below:", - "remove-team-from-table": "Are you sure you want to remove this team from the board ?", - "confirm-btn": "Confirm", - "remove-btn": "Remove", - "filter-card-title-label": "Filter by card title", - "invite-people-success": "Invitation to register sent with success", - "invite-people-error": "Error while sending invitation to register", - "can-invite-if-same-mailDomainName": "Email domain name", - "to-create-teams-contact-admin": "To create teams, please contact the administrator.", - "Node_heap_total_heap_size": "Node heap: total heap size", - "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", - "Node_heap_total_physical_size": "Node heap: total physical size", - "Node_heap_total_available_size": "Node heap: total available size", - "Node_heap_used_heap_size": "Node heap: used heap size", - "Node_heap_heap_size_limit": "Node heap: heap size limit", - "Node_heap_malloced_memory": "Node heap: malloced memory", - "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", - "Node_heap_does_zap_garbage": "Node heap: does zap garbage", - "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", - "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", - "Node_memory_usage_rss": "Node memory usage: resident set size", - "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", - "Node_memory_usage_heap_used": "Node memory usage: actual memory used", - "Node_memory_usage_external": "Node memory usage: external", - "add-organizations": "Add organizations", - "add-organizations-label": "Added organizations are displayed below:", - "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", - "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", - "custom-legal-notice-link-url": "Custom legal notice page URL", - "acceptance_of_our_legalNotice": "By continuing, you accept our", - "legalNotice": "legal notice", - "copied": "Copied!", - "checklistActionsPopup-title": "Checklist Actions", - "moveChecklist": "Move Checklist", - "moveChecklistPopup-title": "Move Checklist", - "newlineBecomesNewChecklistItem": "Each line of text becomes one of the checklist items", - "newLineNewItem": "One line of text = one checklist item", - "newlineBecomesNewChecklistItemOriginOrder": "Each line of text becomes one of the checklist items, original order", - "originOrder": "original order", - "copyChecklist": "Copy Checklist", - "copyChecklistPopup-title": "Copy Checklist", - "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions", - "attachmentActionsPopup-title": "Attachment Actions", - "attachment-move-storage-fs": "Move attachment to filesystem", - "attachment-move-storage-gridfs": "Move attachment to GridFS", - "attachment-move-storage-s3": "Move attachment to S3", - "attachment-move": "Move Attachment", - "move-all-attachments-to-fs": "Move all attachments to filesystem", - "move-all-attachments-to-gridfs": "Move all attachments to GridFS", - "move-all-attachments-to-s3": "Move all attachments to S3", - "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", - "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", - "move-all-attachments-of-board-to-s3": "Move all attachments of board to S3", - "path": "Path", - "version-name": "Version-Name", - "size": "Size", - "storage": "Storage", - "action": "Action", - "board-title": "Board Title", - "attachmentRenamePopup-title": "Rename", - "uploading": "Uploading", - "remaining_time": "Remaining time", - "speed": "Speed", - "progress": "Progress", - "password-again": "Password (again)", - "if-you-already-have-an-account": "If you already have an account", - "register": "Register", - "forgot-password": "Forgot password", - "minicardDetailsActionsPopup-title": "Card Details", - "Mongo_sessions_count": "Mongo sessions count", - "change-visibility": "Change Visibility", - "max-upload-filesize": "Max upload filesize in bytes:", - "allowed-upload-filetypes": "Allowed upload filetypes:", - "max-avatar-filesize": "Max avatar filesize in bytes:", - "allowed-avatar-filetypes": "Allowed avatar filetypes:", - "invalid-file": "If filename is invalid, upload or rename is cancelled.", - "preview-pdf-not-supported": "Your device does not support previewing PDF. Try downloading instead.", - "drag-board": "Drag board", - "translation-number": "The number of custom translation strings is:", - "delete-translation-confirm-popup": "Are you sure you want to delete this custom translation string? There is no undo.", - "newTranslationPopup-title": "New custom translation string", - "editTranslationPopup-title": "Edit custom translation string", - "settingsTranslationPopup-title": "Delete this custom translation string?", - "translation": "Translation", - "text": "Text", - "translation-text": "Translation text", - "show-subtasks-field": "Show subtasks field", - "show-week-of-year": "Show week of year (ISO 8601)", - "convert-to-markdown": "Convert to markdown", - "import-board-zip": "Add .zip file that has board JSON files, and board name subdirectories with attachments", - "collapse": "Collapse", - "uncollapse": "Uncollapse", - "hideCheckedChecklistItems": "Hide checked checklist items", - "hideAllChecklistItems": "Hide all checklist items", - "support": "Support", - "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", - "accessibility": "Accessibility", - "accessibility-page-enabled": "Accessibility page enabled", - "accessibility-info-not-added-yet": "Accessibility info has not been added yet", - "accessibility-title": "Accessibility title", - "accessibility-content": "Accessibility content", - "accounts-lockout-settings": "Brute Force Protection Settings", - "accounts-lockout-info": "These settings control how login attempts are protected against brute force attacks.", - "accounts-lockout-known-users": "Settings for known users (correct username, wrong password)", - "accounts-lockout-unknown-users": "Settings for unknown users (non-existent username)", - "accounts-lockout-failures-before": "Failures before lockout", - "accounts-lockout-period": "Lockout period (seconds)", - "accounts-lockout-failure-window": "Failure window (seconds)", - "accounts-lockout-settings-updated": "Brute force protection settings have been updated", - "accounts-lockout-locked-users": "Locked Users", - "accounts-lockout-locked-users-info": "Users currently locked out due to too many failed login attempts", - "accounts-lockout-no-locked-users": "There are currently no locked users", - "accounts-lockout-failed-attempts": "Failed Attempts", - "accounts-lockout-remaining-time": "Remaining Time", - "accounts-lockout-user-unlocked": "User has been unlocked successfully", - "accounts-lockout-confirm-unlock": "Are you sure you want to unlock this user?", - "accounts-lockout-confirm-unlock-all": "Are you sure you want to unlock all locked users?", - "accounts-lockout-show-locked-users": "Show locked users only", - "accounts-lockout-user-locked": "User is locked", - "accounts-lockout-click-to-unlock": "Click to unlock this user", - "accounts-lockout-status": "Status", - "admin-people-filter-show": "Show:", - "admin-people-filter-all": "All Users", - "admin-people-filter-locked": "Locked Users Only", - "admin-people-filter-active": "Active", - "admin-people-filter-inactive": "Not Active", - "admin-people-active-status": "Active Status", - "admin-people-user-active": "User is active - click to deactivate", - "admin-people-user-inactive": "User is inactive - click to activate", - "accounts-lockout-all-users-unlocked": "All locked users have been unlocked", - "accounts-lockout-unlock-all": "Unlock All", - "active-cron-jobs": "Active Scheduled Jobs", - "add-cron-job": "Add Scheduled Job", - "add-cron-job-placeholder": "Add Scheduled Job functionality coming soon", - "attachment-storage-configuration": "Attachment Storage Configuration", - "attachments-path": "Attachments Path", - "attachments-path-description": "Path where attachment files are stored", - "avatars-path": "Avatars Path", - "avatars-path-description": "Path where avatar files are stored", - "board-archive-failed": "Failed to schedule board archive", - "board-archive-scheduled": "Board archive scheduled successfully", - "board-backup-failed": "Failed to schedule board backup", - "board-backup-scheduled": "Board backup scheduled successfully", - "board-cleanup-failed": "Failed to schedule board cleanup", - "board-cleanup-scheduled": "Board cleanup scheduled successfully", - "board-operations": "Board Operations", - "cron-jobs": "Scheduled Jobs", - "cron-migrations": "Scheduled Migrations", - "cron-job-delete-confirm": "Are you sure you want to delete this scheduled job?", - "cron-job-delete-failed": "Failed to delete scheduled job", - "cron-job-deleted": "Scheduled job deleted successfully", - "cron-job-pause-failed": "Failed to pause scheduled job", - "cron-job-paused": "Scheduled job paused successfully", - "filesystem-path-description": "Base path for file storage", - "gridfs-enabled": "GridFS Enabled", - "gridfs-enabled-description": "Use MongoDB GridFS for file storage", - "migration-pause-failed": "Failed to pause migrations", - "migration-paused": "Migrations paused successfully", - "migration-progress": "Migration Progress", - "migration-start-failed": "Failed to start migrations", - "migration-started": "Migrations started successfully", - "migration-status": "Migration Status", - "migration-stop-confirm": "Are you sure you want to stop all migrations?", - "migration-stop-failed": "Failed to stop migrations", - "migration-stopped": "Migrations stopped successfully", - "mongodb-gridfs-storage": "MongoDB GridFS Storage", - "pause-all-migrations": "Pause All Migrations", - "s3-access-key": "S3 Access Key", - "s3-access-key-description": "AWS S3 access key for authentication", - "s3-access-key-placeholder": "Enter S3 access key", - "s3-bucket": "S3 Bucket", - "s3-bucket-description": "S3 bucket name for storing files", - "s3-connection-failed": "S3 connection failed", - "s3-connection-success": "S3 connection successful", - "s3-enabled": "S3 Enabled", - "s3-enabled-description": "Use AWS S3 or MinIO for file storage", - "s3-endpoint": "S3 Endpoint", - "s3-endpoint-description": "S3 endpoint URL (e.g., s3.amazonaws.com or minio.example.com)", - "s3-minio-storage": "S3/MinIO Storage", - "s3-port": "S3 Port", - "s3-port-description": "S3 endpoint port number", - "s3-region": "S3 Region", - "s3-region-description": "AWS S3 region (e.g., us-east-1)", - "s3-secret-key": "S3 Secret Key", - "s3-secret-key-description": "AWS S3 secret key for authentication", - "s3-secret-key-placeholder": "Enter S3 secret key", - "s3-secret-key-required": "S3 secret key is required", - "s3-settings-save-failed": "Failed to save S3 settings", - "s3-settings-saved": "S3 settings saved successfully", - "s3-ssl-enabled": "S3 SSL Enabled", - "s3-ssl-enabled-description": "Use SSL/TLS for S3 connections", - "save-s3-settings": "Save S3 Settings", - "schedule-board-archive": "Schedule Board Archive", - "schedule-board-backup": "Schedule Board Backup", - "schedule-board-cleanup": "Schedule Board Cleanup", - "scheduled-board-operations": "Scheduled Board Operations", - "start-all-migrations": "Start All Migrations", - "stop-all-migrations": "Stop All Migrations", - "test-s3-connection": "Test S3 Connection", - "writable-path": "Writable Path", - "writable-path-description": "Base directory path for file storage", - "add-job": "Add Job", - "attachment-migration": "Attachment Migration", - "attachment-monitoring": "Attachment Monitoring", - "attachment-settings": "Attachment Settings", - "attachment-storage-settings": "Storage Settings", - "automatic-migration": "Automatic Migration", - "back-to-settings": "Back to Settings", - "board-id": "Board ID", - "board-migration": "Board Migration", - "board-migrations": "Board Migrations", - "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", - "cleanup": "Cleanup", - "cleanup-old-jobs": "Cleanup Old Jobs", - "completed": "Completed", - "conversion-info-text": "This conversion is performed once per board and improves performance. You can continue using the board normally.", - "converting-board": "Converting Board", - "converting-board-description": "Converting board structure for improved functionality. This may take a few moments.", - "cpu-cores": "CPU Cores", - "cpu-usage": "CPU Usage", - "current-action": "Current Action", - "database-migration": "Database Migration", - "database-migration-description": "Updating database structure for improved functionality and performance. This process may take several minutes.", - "database-migrations": "Database Migrations", - "days-old": "Days Old", - "duration": "Duration", - "errors": "Errors", - "estimated-time-remaining": "Estimated time remaining", - "every-1-day": "Every 1 day", - "every-1-hour": "Every 1 hour", - "every-1-minute": "Every 1 minute", - "every-10-minutes": "Every 10 minutes", - "every-30-minutes": "Every 30 minutes", - "every-5-minutes": "Every 5 minutes", - "every-6-hours": "Every 6 hours", - "export-monitoring": "Export Monitoring", - "filesystem-attachments": "Filesystem Attachments", - "filesystem-size": "Filesystem Size", - "filesystem-storage": "Filesystem Storage", - "force-board-scan": "Force Board Scan", - "gridfs-attachments": "GridFS Attachments", - "gridfs-size": "GridFS Size", - "gridfs-storage": "GridFS", - "hide-list-on-minicard": "Hide List on Minicard", - "idle-migration": "Idle Migration", - "job-description": "Job Description", - "job-details": "Job Details", - "job-name": "Job Name", - "job-queue": "Job Queue", - "last-run": "Last Run", - "max-concurrent": "Max Concurrent", - "memory-usage": "Memory Usage", - "migrate-all-to-filesystem": "Migrate All to Filesystem", - "migrate-all-to-gridfs": "Migrate All to GridFS", - "migrate-all-to-s3": "Migrate All to S3", - "migrated-attachments": "Migrated Attachments", - "migration-batch-size": "Batch Size", - "migration-batch-size-description": "Number of attachments to process in each batch (1-100)", - "migration-cpu-threshold": "CPU Threshold (%)", - "migration-cpu-threshold-description": "Pause migration when CPU usage exceeds this percentage (10-90)", - "migration-delay-ms": "Delay (ms)", - "migration-delay-ms-description": "Delay between batches in milliseconds (100-10000)", - "migration-detector": "Migration Detector", - "migration-info-text": "Database migrations are performed once and improve system performance. The process continues in the background even if you close your browser.", - "migration-log": "Migration Log", - "migration-markers": "Migration Markers", - "migration-resume-failed": "Failed to resume migration", - "migration-resumed": "Migration resumed", - "migration-steps": "Migration Steps", - "migration-warning-text": "Please do not close your browser during migration. The process will continue in the background but may take longer to complete.", - "monitoring-export-failed": "Failed to export monitoring data", - "monitoring-refresh-failed": "Failed to refresh monitoring data", - "next": "Next", - "next-run": "Next Run", - "of": "of", - "operation-type": "Operation Type", - "overall-progress": "Overall Progress", - "page": "Page", - "pause": "Pause", - "pause-migration": "Pause Migration", - "previous": "Previous", - "refresh": "Refresh", - "refresh-monitoring": "Refresh Monitoring", - "remaining-attachments": "Remaining Attachments", - "resume-migration": "Resume Migration", - "run-once": "Run once", - "s3-attachments": "S3 Attachments", - "s3-size": "S3 Size", - "s3-storage": "S3", - "scanning-status": "Scanning Status", - "schedule": "Schedule", - "search-boards-or-operations": "Search boards or operations...", - "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", - "showing": "Showing", - "start-test-operation": "Start Test Operation", - "start-time": "Start Time", - "step-progress": "Step Progress", - "stop-migration": "Stop Migration", - "storage-distribution": "Storage Distribution", - "system-resources": "System Resources", - "total-attachments": "Total Attachments", - "total-operations": "Total Operations", - "total-size": "Total Size", - "unmigrated-boards": "Unmigrated Boards", - "weight": "Weight", - "idle": "Idle", - "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" -} diff --git a/imports/i18n/data/ko-KR.i18n.json b/imports/i18n/data/ko-KR.i18n.json index 48a9c16ae..51809db3c 100644 --- a/imports/i18n/data/ko-KR.i18n.json +++ b/imports/i18n/data/ko-KR.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "모든 확인목록 항목 숨기기", "support": "지원", "supportPopup-title": "지원", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "접근성 페이지 활성화됨", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/ko.i18n.json b/imports/i18n/data/ko.i18n.json index b029cbbfb..8669aca44 100644 --- a/imports/i18n/data/ko.i18n.json +++ b/imports/i18n/data/ko.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "삭제된 댓글", "activity-receivedDate": "수신 날짜를 %s의 %s로 수정함", "activity-startDate": "시작 날짜가 %s의 %s로 수정됨", - "allboards.starred": "Starred", - "allboards.templates": "템플릿", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "마감 날짜가 %s의 %s로 수정됨", "activity-endDate": "종료 날짜가 %s의 %s로 수정됨", "add-attachment": "첨부파일 추가", @@ -202,9 +190,9 @@ "board-view-collapse": "접기", "board-view-gantt": "간트", "board-view-lists": "목록들", - "bucket-example": "예: \"꼭 하고싶은 일 목록\"", - "calendar-previous-month-label": "이전 월", - "calendar-next-month-label": "다음 월", + "bucket-example": "Like \"Bucket List\" for example", + "calendar-previous-month-label": "Previous Month", + "calendar-next-month-label": "Next Month", "cancel": "취소", "card-archived": "이 카드는 보관함으로 이동 되었습니다.", "board-archived": "이 보드는 보관함으로 이동 되었습니다.", @@ -328,16 +316,10 @@ "comment-placeholder": "댓글 입력", "comment-only": "댓글만 입력 가능", "comment-only-desc": "카드에 댓글만 달수 있습니다.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "댓글을 삭제하시겠습니까?", "deleteCommentPopup-title": "댓글을 삭제하시겠습니까?", "no-comments": "댓글 없음", "no-comments-desc": "댓글과 활동내역을 볼 수 없습니다.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "노동자", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "내 컴퓨터", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "체크리스트를 삭제하시겠습니까?", "subtaskDeletePopup-title": "하위태스크를 삭제합니까?", "checklistDeletePopup-title": "체크리스트를 삭제합니까?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "클립보드에 카드의 링크가 복사되었습니다.", "copy-text-to-clipboard": "텍스트를 클립보드에 복사합니다", "linkCardPopup-title": "카드 연결", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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": "보드 생성", - "createTemplateContainerPopup-title": "템플릿 컨테이너 추가", "chooseBoardSourcePopup-title": "보드 가져오기", "createLabelPopup-title": "라벨 생성", "createCustomField": "필드 생성", @@ -376,10 +356,10 @@ "custom-field-text": "텍스트", "custom-fields": "사용자정의 항목", "date": "날짜", - "date-format": "날짜 형식", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format": "Date Format", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "쇠퇴", "default-avatar": "기본 아바타", "delete": "삭제", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "알림 수정", "editProfilePopup-title": "프로필 변경", "email": "이메일", - "email-address": "이메일 주소", "email-enrollAccount-subject": "__siteName__에 계정 생성이 완료되었습니다.", "email-enrollAccount-text": "안녕하세요. __user__님,\n\n시작하려면 아래링크를 클릭해 주세요.\n\n__url__\n\n감사합니다.", "email-fail": "이메일 전송 실패", @@ -554,7 +533,6 @@ "log-in": "로그인", "loginPopup-title": "로그인", "memberMenuPopup-title": "멤버 설정", - "grey-icons": "Grey Icons", "members": "멤버", "menu": "메뉴", "move-selection": "선택 항목 이동", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "최하단으로 이동", "moveCardToTop-title": "최상단으로 이동", "moveSelectionPopup-title": "선택 항목 이동", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "다중 선택", "multi-selection-label": "선택에 대한 라벨 설정", "multi-selection-member": "선택에 대한 구성원 설정", @@ -578,8 +554,6 @@ "no-results": "결과 값 없음", "normal": "표준", "normal-desc": "카드를 보거나 수정할 수 있습니다. 설정값은 변경할 수 없습니다.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "초대장이 수락되지 않았습니다.", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "감시중인 보드, 목록 또는 카드에 대한 변경사항 알림 받음", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "색 설정", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "색상 선택", "setSwimlaneColorPopup-title": "색상 선택", "setListColorPopup-title": "색상 선택", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "모든 목록, 카드, 레이블 및 활동이 삭제되고 보드 내용을 복구할 수 없습니다. 실행 취소는 불가능합니다.", "boardDeletePopup-title": "보드 삭제?", "delete-board": "보드 삭제", - "delete-duplicate-lists": "중복 목록 삭제", - "delete-duplicate-lists-confirm": "확실합니까? 이렇게 하면 이름이 같고 카드가 없는 모든 중복 목록이 삭제됩니다.", "default-subtasks-board": "Subtasks for __board__ board", "default": "기본", "defaultdefault": "기본", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "카드 설정", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "카드 설정", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "만료된 카드를 찾을 수 없음", - "dueCards-noResults-description": "현재 마감일이 있는 카드가 없습니다.", "broken-cards": "Broken Cards", "board-title-not-found": "보드 %s 을 찾을 수 없습니다.", "swimlane-title-not-found": "Swimlane %s 을 찾을 수 없습니다.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "완료", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "상세", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "완료", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "가중치", "idle": "유휴", "complete": "완료", - "cron": "스케줄러", - "current-step": "Current Step" + "cron": "스케줄러" } diff --git a/imports/i18n/data/lt.i18n.json b/imports/i18n/data/lt.i18n.json index 7e96f7719..726f9caac 100644 --- a/imports/i18n/data/lt.i18n.json +++ b/imports/i18n/data/lt.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/lv.i18n.json b/imports/i18n/data/lv.i18n.json index 22b2feab1..5e2807cd0 100644 --- a/imports/i18n/data/lv.i18n.json +++ b/imports/i18n/data/lv.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "dzēsa komentāru %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Sagataves", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Pievienot failu", @@ -328,16 +316,10 @@ "comment-placeholder": "Rakstīt komentāru", "comment-only": "Tikai komentēt", "comment-only-desc": "Var komentēt tikai kartiņā.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "Nav komentāru", "no-comments-desc": "Nevar redzēt komentārus un darbības.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Darbonis", "worker-desc": "Var tikai pārvietot kartiņas, pievienot sevi kartiņai un komentēt.", "computer": "Dators", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Kopet kartiņas saiti starpliktuvē", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Kartiņas saite", @@ -356,7 +337,6 @@ "copyManyCardsPopup-format": "[ {\"title\": \"Pirmās kartiņas virsraksts\", \"description\":\"Pirmās kartiņas apraksts}, {\"title\":\"Otrās kartiņas virsraksts\",\"description\":\"Otrās kartiņas apraksts\"},{\"title\":\"Pēdējās kartiņas virsraksts\",\"description\":\"Pēdējās kartiņas apraksts\"} ]", "create": "Izveidot", "createBoardPopup-title": "Izveidot dēli", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Importēt dēli", "createLabelPopup-title": "Izveidot birku", "createCustomField": "Izveidot lauku", @@ -377,9 +357,9 @@ "custom-fields": "Lauki", "date": "Datums", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Noraidīt", "default-avatar": "Noklusētais attēls", "delete": "Dzēst", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Labot ziņojumu", "editProfilePopup-title": "Labot profilu", "email": "E-pasts", - "email-address": "Email Address", "email-enrollAccount-subject": "Izveidots profils iekš __siteName__", "email-enrollAccount-text": "Sveiki, __user__,\n\nLai sāktu izmantot servisu, vienkārši spied saiti zemāk.\n\n__url__\n\nPaldies.", "email-fail": "E-pasta sūtīšana neizdevās", @@ -554,7 +533,6 @@ "log-in": "Pierakstīties", "loginPopup-title": "Pierakstīties", "memberMenuPopup-title": "Dalībnieka iestatījumi", - "grey-icons": "Grey Icons", "members": "Dalībnieki", "menu": "Izvēlne", "move-selection": "Pārvietot atzīmēto", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Pārvietot uz apakšu", "moveCardToTop-title": "Pārvietot uz augšu", "moveSelectionPopup-title": "Pārvietot atzīmēto", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Atzīmēt", "multi-selection-label": "Pielikt birku atzīmētajam", "multi-selection-member": "Pielikt dalībnieku atzīmētajam", @@ -578,8 +554,6 @@ "no-results": "Nav rezultātu", "normal": "Normāls", "normal-desc": "Var skatīties un labot kartiņas. Nevar mainīt iestatījumus.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Ielūgums nav vēl apstiprināts", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Saņemt ziņojumus no dēļiem, sarakstiem vai kartiņām kurām sekojat", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Mainīt saņemšanas datumu", "editCardEndDatePopup-title": "Mainīt beigu datumu", "setCardColorPopup-title": "Mainīt krāsu", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Izvēlieties krāsu", "setSwimlaneColorPopup-title": "Izvēlieties krāsu", "setListColorPopup-title": "Izvēlieties krāsu", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "Visi saraksti, kartiņas, birkas un darbības tiks dzēstas un dēli nevarēs atgūt. Darbība nav atsaucama.", "boardDeletePopup-title": "Dzēst dēli?", "delete-board": "Dzēst dēli", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Apakšuzdevumi priekš __board__ dēļa", "default": "Noklusēts", "defaultdefault": "Noklusēts", @@ -790,7 +761,7 @@ "subtask-settings": "Apakšuzdevumu iestatījumi", "card-settings": "Kartiņas iestatījumi", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Apakšuzdevumu iestatījumi", + "boardSubtaskSettingsPopup-title": "Dēļa apakšuzdevumu iestatījumi", "boardCardSettingsPopup-title": "Kartiņas iestatījumi", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Noguldīt apakšuzdevumus uz šo dēli:", @@ -961,8 +932,6 @@ "a-endAt": "laboja beigu laiku", "a-startAt": "laboja sākuma laiku", "a-receivedAt": "laboja saņemšanas laiku lai tas būtu", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "tuvojas nodošanas laiks %s", "pastdue": "pārsniegts nodošanas laiks %s", "duenow": "nodošanas laiks ir šodien %s", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Statuss", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Pabeigts", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/mk.i18n.json b/imports/i18n/data/mk.i18n.json index 8aa6beef3..ab4eefb62 100644 --- a/imports/i18n/data/mk.i18n.json +++ b/imports/i18n/data/mk.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Додај прилог", @@ -328,16 +316,10 @@ "comment-placeholder": "Напиши коментар", "comment-only": "Само коментари", "comment-only-desc": "Може да коментира само в карти.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "Нема коментари", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Компјутер", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Копирай връзката на картата в клипборда", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Поврзи картичка", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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": "Креирај Табло", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Импортирай Табло", "createLabelPopup-title": "Креирај Табло", "createCustomField": "Креирај Поле", @@ -377,9 +357,9 @@ "custom-fields": "Собствени полета", "date": "Дата", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Откажи", "default-avatar": "Основен аватар", "delete": "Избриши", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Промени известията", "editProfilePopup-title": "Промяна на профила", "email": "Имейл", - "email-address": "Email Address", "email-enrollAccount-subject": "Ваш профил беше създаден на __siteName__", "email-enrollAccount-text": "Hello __user__,\n\nTo start using the service, simply click the link below.\n\n__url__\n\nThanks.", "email-fail": "Неуспешно изпращане на имейла", @@ -554,7 +533,6 @@ "log-in": "Вход", "loginPopup-title": "Вход", "memberMenuPopup-title": "Настройки на профила", - "grey-icons": "Grey Icons", "members": "Членови", "menu": "Меню", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Премести в края", "moveCardToTop-title": "Премести в началото", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Множествен избор", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Получавате информация за всички табла, списъци и карти, които наблюдавате", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Промени датата на получаване", "editCardEndDatePopup-title": "Промени датата на завършване", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Изтриване на Таблото?", "delete-board": "Изтрий таблото", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Подзадачи за табло __board__", "default": "по подразбиране", "defaultdefault": "по подразбиране", @@ -790,7 +761,7 @@ "subtask-settings": "Настройки на Подзадачите", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Настройки на Подзадачите", + "boardSubtaskSettingsPopup-title": "Настройки за Подзадачите за това Табло", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/mn.i18n.json b/imports/i18n/data/mn.i18n.json index 616b97bff..f778bfdec 100644 --- a/imports/i18n/data/mn.i18n.json +++ b/imports/i18n/data/mn.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Хавсралт нэмэх", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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": "Самбар үүсгэх", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Шошго үүсгэх", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Мэдэгдэл тохируулах", "editProfilePopup-title": "Бүртгэл засварлах", "email": "Имэйл", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Гишүүний тохиргоо", - "grey-icons": "Grey Icons", "members": "Гишүүд", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/ms-MY.i18n.json b/imports/i18n/data/ms-MY.i18n.json index 69af4a929..9b9387902 100644 --- a/imports/i18n/data/ms-MY.i18n.json +++ b/imports/i18n/data/ms-MY.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Bertanda", - "allboards.templates": "Templates", - "allboards.remaining": "Baki", - "allboards.workspaces": "Ruang kerja", - "allboards.add-workspace": "Tambah Ruang kerja", - "allboards.add-workspace-prompt": "Nama ruang kerja", - "allboards.add-subworkspace": "Tambah sub-ruang kerja", - "allboards.add-subworkspace-prompt": "Nama sub-ruang kerja", - "allboards.edit-workspace": "Ubah ruang kerja", - "allboards.edit-workspace-name": "Nama ruang kerja", - "allboards.edit-workspace-icon": "Ikon ruang-kerja (markdown)", - "multi-selection-active": "Klik kotak semak untuk pilih papan", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -101,13 +89,13 @@ "setListWidthPopup-title": "Tetapkan Lebar", "set-list-width": "Tetapkan Lebar", "set-list-width-value": "Tetapkan lebar minimum dan maksimum (piksel)", - "list-width-error-message": "Lebar senarai mestilah integer lebih besar dari 100", - "keyboard-shortcuts-enabled": "Pintasan papan kekunci didayakan. Klik untuk batal.", - "keyboard-shortcuts-disabled": "Pintasan papan kekunci didayakan. Klik untuk batal.", - "setSwimlaneHeightPopup-title": "Tetapkan ketinggian Swimlane", - "set-swimlane-height": "Tetapkan ketinggian Swimlane", - "set-swimlane-height-value": "Ketinggian Swimlane (piksel)", - "swimlane-height-error-message": "Ketinggian Swimlane mestilah integer positif", + "list-width-error-message": "List widths must be integers greater than 100", + "keyboard-shortcuts-enabled": "Keyboard shortcuts enabled. Click to disable.", + "keyboard-shortcuts-disabled": "Keyboard shortcuts disabled. Click to enable.", + "setSwimlaneHeightPopup-title": "Set Swimlane Height", + "set-swimlane-height": "Set Swimlane Height", + "set-swimlane-height-value": "Swimlane Height (pixels)", + "swimlane-height-error-message": "Swimlane height must be a positive integer", "add-swimlane": "Add Swimlane", "add-subtask": "Add Subtask", "add-checklist": "Add Checklist", @@ -115,10 +103,10 @@ "close-add-checklist-item": "Close add an item to checklist form", "close-edit-checklist-item": "Close edit an item to checklist form", "convertChecklistItemToCardPopup-title": "Convert to Card", - "add-cover": "Tambah imej depan pada kad mini", + "add-cover": "Add cover image to minicard", "add-label": "Add Label", "add-list": "Tambah Senarai", - "add-after-list": "Tambah selepas senarai", + "add-after-list": "Add After List", "add-members": "Tambah Ahli", "added": "Ditambah", "addMemberPopup-title": "Ahli-ahli", @@ -137,7 +125,7 @@ "archive": "Move to Archive", "archive-all": "Move All to Archive", "archive-board": "Move Board to Archive", - "archive-board-confirm": "Anda pasti untuk mengarkibkan papan ini?", + "archive-board-confirm": "Are you sure you want to archive this board?", "archive-card": "Move Card to Archive", "archive-list": "Move List to Archive", "archive-swimlane": "Move Swimlane to Archive", @@ -159,13 +147,13 @@ "attachmentDeletePopup-title": "Delete Attachment?", "attachments": "Attachments", "auto-watch": "Automatically watch boards when they are created", - "avatar-too-big": "Saiz Avatar terlalu besar (__size__max)", + "avatar-too-big": "The avatar is too large (__size__ max)", "back": "Back", "board-change-color": "Change color", - "board-change-background-image": "Ubah imej latar", - "board-background-image-url": "URL imej latar", - "add-background-image": "Tambah imej latar", - "remove-background-image": "Hapus imej latar", + "board-change-background-image": "Change Background Image", + "board-background-image-url": "Background Image URL", + "add-background-image": "Add Background Image", + "remove-background-image": "Remove Background Image", "show-at-all-boards-page" : "Show at All Boards page", "board-info-on-my-boards" : "All Boards Settings", "boardInfoOnMyBoardsPopup-title" : "All Boards Settings", @@ -178,9 +166,9 @@ "board-public-info": "This board will be <strong>public</strong>.", "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", "boardChangeColorPopup-title": "Change Board Background", - "boardChangeBackgroundImagePopup-title": "Ubah imej latar", + "boardChangeBackgroundImagePopup-title": "Change Background Image", "allBoardsChangeColorPopup-title": "Change color", - "allBoardsChangeBackgroundImagePopup-title": "Ubah imej latar", + "allBoardsChangeBackgroundImagePopup-title": "Change Background Image", "boardChangeTitlePopup-title": "Rename Board", "boardChangeVisibilityPopup-title": "Change Visibility", "boardChangeWatchPopup-title": "Change Watch", @@ -189,22 +177,22 @@ "boardChangeViewPopup-title": "Board View", "boards": "Boards", "board-view": "Board View", - "desktop-mode": "Mod Desktop", - "mobile-mode": "Mod Mudah Alih", - "mobile-desktop-toggle": "Tukar antara mod mudah alih dan desktop", - "zoom-in": "Zum masuk", - "zoom-out": "Zum keluar", - "click-to-change-zoom": "Klik untuk ubah aras zum", - "zoom-level": "Aras zum", - "enter-zoom-level": "Masukkan aras zum (50-300%)", + "desktop-mode": "Desktop Mode", + "mobile-mode": "Mobile Mode", + "mobile-desktop-toggle": "Toggle between Mobile and Desktop Mode", + "zoom-in": "Zoom In", + "zoom-out": "Zoom Out", + "click-to-change-zoom": "Click to change zoom level", + "zoom-level": "Zoom Level", + "enter-zoom-level": "Enter zoom level (50-300%):", "board-view-cal": "Calendar", "board-view-swimlanes": "Swimlanes", "board-view-collapse": "Collapse", "board-view-gantt": "Gantt", "board-view-lists": "Lists", - "bucket-example": "Contohnya \"Bucket List\"", - "calendar-previous-month-label": "Bulan Sebelum", - "calendar-next-month-label": "Bulan Depan", + "bucket-example": "Like \"Bucket List\" for example", + "calendar-previous-month-label": "Previous Month", + "calendar-next-month-label": "Next Month", "cancel": "Cancel", "card-archived": "This card is moved to Archive.", "board-archived": "This board is moved to Archive.", @@ -289,9 +277,9 @@ "checklists": "Checklists", "click-to-star": "Click to star this board.", "click-to-unstar": "Click to unstar this board.", - "click-to-enable-auto-width": "Lebar senarai lalai tidak didayakan. Klik untuk dayakan.", - "click-to-disable-auto-width": "Lebar senarai lalai didayakan. Klik untuk tidak didayakan.", - "auto-list-width": "Lebar senarai lalai.", + "click-to-enable-auto-width": "Auto list width disabled. Click to enable.", + "click-to-disable-auto-width": "Auto list width enabled. Click to disable.", + "auto-list-width": "Auto list width", "clipboard": "Clipboard or drag & drop", "close": "Close", "close-board": "Close Board", @@ -323,21 +311,15 @@ "color-white": "white", "color-yellow": "yellow", "unset-color": "Unset", - "comments": "Komen", + "comments": "Comments", "comment": "Comment", "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Hanya peruntukkan komen", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Baca Sahaja", - "read-only-desc": "Kad hanya untuk paparan. Ubahsuai disekat.", - "read-assigned-only": "Berikan 'Baca' Sahaja", - "read-assigned-only-desc": "Hanya papar kad yang ditugaskan sahaja. Ubahsuai disekat.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Hapus item senarai semak?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -376,10 +356,10 @@ "custom-field-text": "Text", "custom-fields": "Custom Fields", "date": "Date", - "date-format": "Format Tarikh", - "date-format-yyyy-mm-dd": "TTTT-BB-HH", - "date-format-dd-mm-yyyy": "HH-BB-TTTT", - "date-format-mm-dd-yyyy": "BB-HH-TTTT", + "date-format": "Date Format", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Alamat 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", @@ -419,14 +398,14 @@ "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-vertical-scrollbars": "Dayakan bar skrol melintang", + "enable-vertical-scrollbars": "Enable vertical scrollbars", "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-csv-schema": "CSV(Comma Separated Values)/TSV (Tab Separated Values) anda tidak mengikut format yang betul dengan maklumat yang bersesuaian.", + "error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) 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", @@ -465,7 +444,7 @@ "filter-overdue": "Overdue", "filter-due-today": "Due today", "filter-due-this-week": "Due this week", - "filter-due-next-week": "Tamat minggu depan", + "filter-due-next-week": "Due next week", "filter-due-tomorrow": "Due tomorrow", "list-filter-label": "Filter List by Title", "filter-clear": "Clear filter", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Ikon Kelabu", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Salin pilihan", - "selection-color": "Warna Pilihan", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Hanya Berikan Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -599,7 +573,7 @@ "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": "Hapus imej depan daripada kad mini", + "remove-cover": "Remove cover image from minicard", "remove-from-board": "Remove from Board", "remove-label": "Remove Label", "listDeletePopup-title": "Delete List ?", @@ -621,14 +595,14 @@ "select-board": "Select Board", "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list", "setWipLimitPopup-title": "Set WIP Limit", - "shortcut-add-self": "Tambah diri sendiri kepada kad ini", + "shortcut-add-self": "Add yourself to current card", "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-filter-my-assigned-cards": "Tapis kad sendiri", + "shortcut-filter-my-assigned-cards": "Filter my assigned cards", "shortcut-show-shortcuts": "Bring up this shortcuts list", "shortcut-toggle-filterbar": "Toggle Filter Sidebar", "shortcut-toggle-searchbar": "Toggle Search Sidebar", @@ -663,9 +637,9 @@ "upload": "Upload", "upload-avatar": "Upload an avatar", "uploaded-avatar": "Uploaded an avatar", - "uploading-files": "Muat naik fail", - "upload-failed": "Muat naik gagal", - "upload-completed": "Muat naik selesai", + "uploading-files": "Uploading files", + "upload-failed": "Upload failed", + "upload-completed": "Upload completed", "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL", "custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL", "custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,16 +761,16 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", "deposit-subtasks-list": "Landing list for subtasks deposited here:", "show-parent-in-minicard": "Show parent in minicard:", "description-on-minicard": "Description on minicard", - "cover-attachment-on-minicard": "Imej depan kad mini", - "badge-attachment-on-minicard": "Bilangan lampiran pada kad mini", - "card-sorting-by-number-on-minicard": "Kad disusun mengikut nombor pada kad mini", + "cover-attachment-on-minicard": "Cover image on minicard", + "badge-attachment-on-minicard": "Count of attachments on minicard", + "card-sorting-by-number-on-minicard": "Card sorting by number on minicard", "prefix-with-full-path": "Prefix with full path", "prefix-with-parent": "Prefix with parent", "subtext-with-full-path": "Subtext with full path", @@ -912,7 +883,7 @@ "r-items-list": "item1,item2,item3", "r-add-swimlane": "Add swimlane", "r-swimlane-name": "swimlane name", - "r-board-note": "Nota: Tinggalkan ruang kosong untuk padankan setiap nilai yang mungkin.", + "r-board-note": "Note: leave a field empty to match every possible value. ", "r-checklist-note": "Note: checklist's items have to be written as comma separated values.", "r-when-a-card-is-moved": "When a card is moved to another list", "r-set": "Set", @@ -943,10 +914,10 @@ "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Default Authentication Method", "duplicate-board": "Duplicate Board", - "duplicate-board-confirm": "Anda pasti untuk menduplikasi papan ini?", - "org-number": "Jumlah Organisasi ialah:", - "team-number": "Jumlah kumpulan ialah:", - "people-number": "Jumlah individu ialah:", + "duplicate-board-confirm": "Are you sure you want to duplicate this board?", + "org-number": "The number of organizations is: ", + "team-number": "The number of teams is: ", + "people-number": "The number of people is: ", "swimlaneDeletePopup-title": "Delete Swimlane ?", "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.", "restore-all": "Restore all", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1016,7 +985,7 @@ "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has", "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list", "hide-checked-items": "Hide checked items", - "hide-finished-checklist": "Sembunyikan senarai semak yang telah selesai", + "hide-finished-checklist": "Hide finished checklist", "task": "Task", "create-task": "Create Task", "ok": "OK", @@ -1024,7 +993,7 @@ "teams": "Teams", "displayName": "Nama Paparan", "shortName": "Nama Ringkas", - "autoAddUsersWithDomainName": "Tambah pengguna dengan nama domain ini secara lalai", + "autoAddUsersWithDomainName": "Automatically add users with the domain name", "website": "Laman Sesawang", "person": "Person", "my-cards": "Kad Saya", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Saya", "dueCardsViewChange-choice-all": "Semua Pengguna", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "Tiada Kad Tamat Ditemui", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Maklumat", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/ms.i18n.json b/imports/i18n/data/ms.i18n.json index 0744a80a5..c6bd2af44 100644 --- a/imports/i18n/data/ms.i18n.json +++ b/imports/i18n/data/ms.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Semua Templat", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Tulis Komen", "comment-only": "hanya komen", "comment-only-desc": "hanya boleh komen pada kad sahaja", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Anda pasti untuk hapus komen ini?", "deleteCommentPopup-title": "Hapus komen?", "no-comments": "tiada komen", "no-comments-desc": "Tidak dapat melihat komen dan aktiviti", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Pekerja", "worker-desc": "hanya boleh pindah kad, tugaskan diri sendiri pada kad dan komen", "computer": "Komputer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Anda pasti untuk hapus senarai semak?", "subtaskDeletePopup-title": "Hapus subtugas?", "checklistDeletePopup-title": "Hapus Senarai semak?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Salin capaian kad ke papan klip", "copy-text-to-clipboard": "Salin teks ke papan klip", "linkCardPopup-title": "Paut Kad", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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": "Cipta", "createBoardPopup-title": "Cipta Papan", - "createTemplateContainerPopup-title": "Tambah Bekas Templat", "chooseBoardSourcePopup-title": "Import Papan", "createLabelPopup-title": "Cipta Label", "createCustomField": "Cipta ruangan", @@ -377,9 +357,9 @@ "custom-fields": "Ruangan Khas", "date": "Tarikh", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Ditolak", "default-avatar": "Avatar Lalai", "delete": "Hapus", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Ubah Makluman", "editProfilePopup-title": "Ubah Profil", "email": "Emel", - "email-address": "Email Address", "email-enrollAccount-subject": "Satu akaun telah dicipta untuk anda pada __siteName__", "email-enrollAccount-text": "Salam Sejahtera __user__\nUntuk mula menggunakan servis, cuma perlu klik pautan di bawah\n\n__url__\n\nTerima kasih.", "email-fail": "Gagal menghantar emel", @@ -554,7 +533,6 @@ "log-in": "Log Masuk", "loginPopup-title": "Log Masuk", "memberMenuPopup-title": "Tetapan Ahli", - "grey-icons": "Grey Icons", "members": "Ahli", "menu": "Menu", "move-selection": "Pindah Pilihan", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Pindah ke bawah", "moveCardToTop-title": "Pidah ke atas", "moveSelectionPopup-title": "Pindah Pilihan", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Pelbagai pilihan", "multi-selection-label": "Set label untuk pilihan", "multi-selection-member": "Set ahli untuk pilihan", @@ -578,8 +554,6 @@ "no-results": "Tiada keputusan", "normal": "Normal", "normal-desc": "Boleh Papar dan ubah suai kad. Tidak boleh ubah tetapan.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Jemputan belum dibalas.", "notify-participate": "Terima maklumbalas daripada mana-mana kad yang anda sertai sebagai pencipta atau ahli.", "notify-watch": "Terima maklumbalas daripada mana-mana papan, senarai, atau kad yang anda perhatikan.", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Ubah masa terima", "editCardEndDatePopup-title": "Ubah masa tamat", "setCardColorPopup-title": "Set Warna", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Pilih warna", "setSwimlaneColorPopup-title": "Pilih warna", "setListColorPopup-title": "Pilih warna", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "Semua senarai, kad, label dan aktiviti akan dihapus dan anda tidak akan dapat pulihkan semula kandungan papan. Tiada undur semula", "boardDeletePopup-title": "Hapus Papan?", "delete-board": "Hapus papan", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "subtugas untuk __board__ papan", "default": "Lalai", "defaultdefault": "Lalai", @@ -790,7 +761,7 @@ "subtask-settings": "Tetapan Subtugas", "card-settings": "Tetapan Kad", "minicard-settings": "Tetapan kadmini", - "boardSubtaskSettingsPopup-title": "Tetapan Subtugas", + "boardSubtaskSettingsPopup-title": "Tetapan Subtugas Papan", "boardCardSettingsPopup-title": "Tetapan Kad", "boardMinicardSettingsPopup-title": "Tetapan kadmini", "deposit-subtasks-board": "Masukkan subtugas kepada papan ini:", @@ -961,8 +932,6 @@ "a-endAt": "tarikh tamat telah diubah menjadi", "a-startAt": "tarikh mula telah diubah menjadi", "a-receivedAt": "tarikh terima telah diubah menjadi", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Perincian", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Lengkap", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/nb.i18n.json b/imports/i18n/data/nb.i18n.json index 6085d5884..770b79cd2 100644 --- a/imports/i18n/data/nb.i18n.json +++ b/imports/i18n/data/nb.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "slettet kommentar %s", "activity-receivedDate": "redigert mottatt dato til %s av %s", "activity-startDate": "redigert startdato til %s av %s", - "allboards.starred": "Starred", - "allboards.templates": "Maler", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "redigert forfallsdato til %s av %s", "activity-endDate": "redigert sluttdato %s av %s", "add-attachment": "Legg til Vedlegg", @@ -328,16 +316,10 @@ "comment-placeholder": "Skriv kommentar", "comment-only": "Kun kommentar", "comment-only-desc": "Kun kommentar på kort.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Er du sikker på at du vil slette kommentaren?", "deleteCommentPopup-title": "Slette kommentaren?", "no-comments": "Ingen kommentarer", "no-comments-desc": "Kan ikke se kommentarer eller aktiviteter.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Arbeider", "worker-desc": "Kan bare flytte kort, tildele kort til seg selv og kommentere.", "computer": "Datamaskin", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Er du sikker på at du vil slette sjekklisten?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Slette sjekklisten?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Kopier lenke", "copy-text-to-clipboard": "Kopier tekst til utklippstavlen", "linkCardPopup-title": "Link Kort", @@ -356,7 +337,6 @@ "copyManyCardsPopup-format": "[ {\"Tittel\": \"Tittel første kort\", \"Beskrivelse\":\"Beskrivelse første kort\"}, {\"Tittel\":\"Tittel andre kort\",\"Beskrivelse\":\"Beskrivelse andre kort\"},{\"Tittel\":\"Tittel siste kort\",\"Beskrivelse\":\"Beskrivelse siste kort\"} ]", "create": "Opprett", "createBoardPopup-title": "Opprett Tavle", - "createTemplateContainerPopup-title": "Legg til Malgruppe", "chooseBoardSourcePopup-title": "Importer tavle", "createLabelPopup-title": "Opprett Etikett", "createCustomField": "Opprett Felt", @@ -377,9 +357,9 @@ "custom-fields": "Tilpassede felt", "date": "Dato", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Avvis", "default-avatar": "Standard avatar", "delete": "Slett", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Endre Varsel", "editProfilePopup-title": "Endre profil", "email": "E-post", - "email-address": "Email Address", "email-enrollAccount-subject": "En brukerkonto er opprettet for deg på __siteName__", "email-enrollAccount-text": "Hei __user__,\n\nFor å ta i bruk tjenesten, klikk på linken under.\n\n__url__\n\nTakk.", "email-fail": "Sending av epost feilet", @@ -554,7 +533,6 @@ "log-in": "Logg inn", "loginPopup-title": "Logg inn", "memberMenuPopup-title": "Innstillinger Medlem", - "grey-icons": "Grey Icons", "members": "Medlemmer", "menu": "Meny", "move-selection": "Flytt valgte", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Flytt til bunnen", "moveCardToTop-title": "Flytt til toppen", "moveSelectionPopup-title": "Flytt valgte", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Velg flere", "multi-selection-label": "Sett Etikett for valgte", "multi-selection-member": "Sett Medlem for valgte", @@ -578,8 +554,6 @@ "no-results": "Ingen resultat", "normal": "Normal", "normal-desc": "Kan se og redigere Kort. Kan ikke endre innstillinger.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitasjon foreløpig ikke akseptert", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Motta oppdatering av alle tavler, lister eller kort som du overvåker", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Endre mottatt dato", "editCardEndDatePopup-title": "Endre sluttdato", "setCardColorPopup-title": "Sett farge", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Velg en farge", "setSwimlaneColorPopup-title": "Velg en farge", "setListColorPopup-title": "Velg en farge", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "Alle lister, kort, etiketter og aktiviteter vil bli slettet og du vil ikke kunne gjenopprette innholdet på tavlen. Det er ikke mulig å angre.", "boardDeletePopup-title": "Slett Tavle?", "delete-board": "Slett Tavle", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Underoppgave for __board__ tavle", "default": "Standard", "defaultdefault": "Standard", @@ -790,7 +761,7 @@ "subtask-settings": "Innstillinger Underoppgave", "card-settings": "Innstillinger Kort", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Innstillinger Underoppgave", + "boardSubtaskSettingsPopup-title": "Innstillinger Tavle Underoppgaver", "boardCardSettingsPopup-title": "Innstillinger Kort", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Sett inn Underoppgave på Tavle:", @@ -961,8 +932,6 @@ "a-endAt": "redigert slutt-tid til", "a-startAt": "redigert starttid til", "a-receivedAt": "redigert mottatt tid til", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "Nåværende forfallstid %s nærmer seg", "pastdue": "Nåværende forfallstid %s er passert", "duenow": "Nåværende forfallstid %s er i dag", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Meg", "dueCardsViewChange-choice-all": "Alle Brukere", "dueCardsViewChange-choice-all-description": "Viser alle kort som ikke er ferdigstilt, med \"Forfallsdato\" fra tavler som brukeren har rettigheter til.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Brutte Kort", "board-title-not-found": "Tavle '%s' ikke funnet.", "swimlane-title-not-found": "Svømmebane '%s' ikke funnet.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Detaljer", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Gjennomført", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/nl-NL.i18n.json b/imports/i18n/data/nl-NL.i18n.json index 464f9467f..d1f9e1076 100644 --- a/imports/i18n/data/nl-NL.i18n.json +++ b/imports/i18n/data/nl-NL.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "aantekening verwijderd %s", "activity-receivedDate": "ontvangst datum gewijzigd naar %s van %s", "activity-startDate": "start datum gewijzigd naar %s van %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "vervaldatum gewijzigd naar %s van %s", "activity-endDate": "einddatum gewijzigd naar %s van %s", "add-attachment": "Bijlage Toevoegen", @@ -328,16 +316,10 @@ "comment-placeholder": "Schrijf aantekening", "comment-only": "Alleen aantekeningen maken", "comment-only-desc": "Kan alleen op kaarten aantekenen.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Weet je zeker dat je de aantekening wilt verwijderen?", "deleteCommentPopup-title": "Verwijder aantekening?", "no-comments": "Geen aantekeningen", "no-comments-desc": "Zie geen aantekeningen of activiteiten.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Medewerker", "worker-desc": "Kan alleen kaarten verplaatsen, zichzelf aan kaarten koppelen en aantekeningen maken.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Weet je zeker dat je de checklist wilt verwijderen?", "subtaskDeletePopup-title": "Subtaak Verwijderen?", "checklistDeletePopup-title": "Checklist Verwijderen?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Kopieer kaart link naar klembord", "copy-text-to-clipboard": "Kopieer tekst naar klembord", "linkCardPopup-title": "Koppel Kaart", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Template Container Toevoegen", "chooseBoardSourcePopup-title": "Importeer bord", "createLabelPopup-title": "Label aanmaken", "createCustomField": "Veld aanmaken", @@ -377,9 +357,9 @@ "custom-fields": "Maatwerkvelden", "date": "Datum", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Weigeren", "default-avatar": "Standaard avatar", "delete": "Verwijderen", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Wijzig notificatie", "editProfilePopup-title": "Wijzig profiel", "email": "E-mail", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Inloggen", "loginPopup-title": "Inloggen", "memberMenuPopup-title": "Leden Instellingen", - "grey-icons": "Grey Icons", "members": "Leden", "menu": "Menu", "move-selection": "Verplaats selectie", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Verplaats naar beneden", "moveCardToTop-title": "Verplaats naar boven", "moveSelectionPopup-title": "Verplaats selectie", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-selectie", "multi-selection-label": "Stel label voor selectie in", "multi-selection-member": "Stel lid voor selectie in", @@ -578,8 +554,6 @@ "no-results": "Geen resultaten", "normal": "Normaal", "normal-desc": "Kan de kaarten zien en wijzigen. Kan de instellingen niet wijzigen.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Uitnodiging nog niet geaccepteerd", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Ontvang updates van elke bord, lijst of kaart die je bekijkt.", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Wijzig ontvangstdatum", "editCardEndDatePopup-title": "Wijzig einddatum", "setCardColorPopup-title": "Stel kleur in", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Kies een kleur", "setSwimlaneColorPopup-title": "Kies een kleur", "setListColorPopup-title": "Kies een kleur", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "Alle lijsten, kaarten, labels en activiteiten zullen worden verwijderd en je kunt de bordinhoud niet terughalen. Er is geen herstelmogelijkheid.", "boardDeletePopup-title": "Bord verwijderen?", "delete-board": "Verwijder bord", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtaken voor __board__ bord", "default": "Standaard", "defaultdefault": "Standaard", @@ -790,7 +761,7 @@ "subtask-settings": "Subtaak Instellingen", "card-settings": "Kaart Instellingen", "minicard-settings": "Minikaart Instellingen", - "boardSubtaskSettingsPopup-title": "Subtaak Instellingen", + "boardSubtaskSettingsPopup-title": "Bord Subtaak Instellingen", "boardCardSettingsPopup-title": "Kaart Instellingen", "boardMinicardSettingsPopup-title": "Minikaart Instellingen", "deposit-subtasks-board": "Plaats subtaken op dit bord:", @@ -961,8 +932,6 @@ "a-endAt": "einddatum gewijzigd naar", "a-startAt": "begindatum gewijzigd naar", "a-receivedAt": "ontvangstdatum gewijzigd naar", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "huidige vervaldatum %s nadert", "pastdue": "huidige vervaldatum %s is verlopen", "duenow": "huidige vervaldatum %s is vandaag", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Mij", "dueCardsViewChange-choice-all": "Alle gebruikers", "dueCardsViewChange-choice-all-description": "Toon incomplete kaarten met een *achterstallige* datum van borden waarvoor de gebruiker toegang heeft.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Defecte kaarten", "board-title-not-found": "Bord '%s' niet gevonden.", "swimlane-title-not-found": "Swimlane '%s' niet gevonden.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Afgewerkt", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/nl.i18n.json b/imports/i18n/data/nl.i18n.json index 3c662b2a2..a4602b8fb 100644 --- a/imports/i18n/data/nl.i18n.json +++ b/imports/i18n/data/nl.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "aantekening verwijderd %s", "activity-receivedDate": "ontvangst datum gewijzigd naar %s van %s", "activity-startDate": "start datum gewijzigd naar %s van %s", - "allboards.starred": "Favorieten", - "allboards.templates": "Templates", - "allboards.remaining": "Resterend", - "allboards.workspaces": "Werkruimte", - "allboards.add-workspace": "Werkruimte toevoegen", - "allboards.add-workspace-prompt": "Werkruimtenaam", - "allboards.add-subworkspace": "Sub-werkruimte toevoegen", - "allboards.add-subworkspace-prompt": "Sub-werkruimtenaam", - "allboards.edit-workspace": "Wijzig werkruimte", - "allboards.edit-workspace-name": "Werkruimtenaam", - "allboards.edit-workspace-icon": "Werkruimteicoon (markdown)", - "multi-selection-active": "Vink de checkboxen om borden te selecteren", "activity-dueDate": "vervaldatum gewijzigd naar %s van %s", "activity-endDate": "einddatum gewijzigd naar %s van %s", "add-attachment": "Bijlage Toevoegen", @@ -202,9 +190,9 @@ "board-view-collapse": "Inklappen", "board-view-gantt": "Gantt", "board-view-lists": "Lijsten", - "bucket-example": "Zoals bijvoorbeeld \"Bucketlist\"", - "calendar-previous-month-label": "Vorige Maand", - "calendar-next-month-label": "Volgende Maand", + "bucket-example": "Like \"Bucket List\" for example", + "calendar-previous-month-label": "Previous Month", + "calendar-next-month-label": "Next Month", "cancel": "Annuleren", "card-archived": "Deze kaart is verplaatst naar Archief.", "board-archived": "Dit bord is verplaatst naar Archief.", @@ -328,16 +316,10 @@ "comment-placeholder": "Schrijf aantekening", "comment-only": "Alleen aantekeningen maken", "comment-only-desc": "Kan alleen op kaarten aantekenen.", - "comment-assigned-only": "Alleen Toegewezen Aantekening", - "comment-assigned-only-desc": "Alleen toegewezen kaarten zijn zichtbaar. Kan alleen aantekeningen toevoegen.", "comment-delete": "Weet je zeker dat je de aantekening wilt verwijderen?", "deleteCommentPopup-title": "Verwijder aantekening?", "no-comments": "Geen aantekeningen", "no-comments-desc": "Zie geen aantekeningen of activiteiten.", - "read-only": "Alleen Lezen", - "read-only-desc": "Kan alleen kaarten bekijken. Kan niet wijzigen.", - "read-assigned-only": "Alleen Lezen Toegewezen", - "read-assigned-only-desc": "Alleen toegewezen kaarten zijn zichtbaar. Kan niet wijzigen.", "worker": "Medewerker", "worker-desc": "Kan alleen kaarten verplaatsen, zichzelf aan kaarten koppelen en aantekeningen maken.", "computer": "Bestandbeheer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Weet je zeker dat je de checklist wilt verwijderen?", "subtaskDeletePopup-title": "Subtaak Verwijderen?", "checklistDeletePopup-title": "Checklist Verwijderen?", - "checklistItemDeletePopup-title": "Checklist Item Verwijderen?", "copy-card-link-to-clipboard": "Kopieer kaart link naar klembord", "copy-text-to-clipboard": "Kopieer tekst naar klembord", "linkCardPopup-title": "Link Kaart", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Template Container Toevoegen", "chooseBoardSourcePopup-title": "Importeer bord", "createLabelPopup-title": "Label aanmaken", "createCustomField": "Veld aanmaken", @@ -376,10 +356,10 @@ "custom-field-text": "Tekst", "custom-fields": "Maatwerkvelden", "date": "Datum", - "date-format": "Datumformaat", - "date-format-yyyy-mm-dd": "JJJJ-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-JJJJ", - "date-format-mm-dd-yyyy": "MM-DD-JJJJ", + "date-format": "Date Format", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Weigeren", "default-avatar": "Standaard avatar", "delete": "Verwijderen", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Wijzig notificatie", "editProfilePopup-title": "Wijzig profiel", "email": "E-mail", - "email-address": "Emailadres", "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", @@ -535,7 +514,7 @@ "list-archive-cards-pop": "Dit zal alle kaarten uit deze lijst op dit bord verwijderen. Om de kaarten in het Archief te tonen en terug te halen, klik \"Menu\" > \"Archief\".", "list-move-cards": "Verplaats alle kaarten in deze lijst", "list-select-cards": "Selecteer alle kaarten in deze lijst", - "set-color-list": "Stel kleur in", + "set-color-list": "Wijzig kleur in", "listActionPopup-title": "Lijst acties", "settingsUserPopup-title": "Gebruiker Instellingen", "settingsTeamPopup-title": "Team Instellingen", @@ -554,7 +533,6 @@ "log-in": "Inloggen", "loginPopup-title": "Inloggen", "memberMenuPopup-title": "Leden Instellingen", - "grey-icons": "Grijze Iconen", "members": "Leden", "menu": "Menu", "move-selection": "Verplaats selectie", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Verplaats naar beneden", "moveCardToTop-title": "Verplaats naar boven", "moveSelectionPopup-title": "Verplaats selectie", - "copySelectionPopup-title": "Kopieer selectie", - "selection-color": "Geselecteerde Kleur", "multi-selection": "Multi-selectie", "multi-selection-label": "Stel label voor selectie in", "multi-selection-member": "Stel lid voor selectie in", @@ -577,9 +553,7 @@ "no-archived-swimlanes": "Geen swimlanes in Archief.", "no-results": "Geen resultaten", "normal": "Normaal", - "normal-desc": "Kan de kaarten bekijken en wijzigen. Kan de instellingen niet wijzigen.", - "normal-assigned-only": "Alleen Normaal Toegewezen", - "normal-assigned-only-desc": "Alleen toegewezen kaarten zijn zichtbaar. Wijzig als Normale gebruiker.", + "normal-desc": "Kan de kaarten zien en wijzigen. Kan de instellingen niet wijzigen.", "not-accepted-yet": "Uitnodiging nog niet geaccepteerd", "notify-participate": "Ontvang updates op kaarten waar je lid of maker van bent", "notify-watch": "Ontvang updates van elke bord, lijst of kaart die je bekijkt.", @@ -619,8 +593,8 @@ "search-example": "Schijf je zoektekst en toets Enter", "select-color": "Selecteer kleur", "select-board": "Selecteer Bord", - "set-wip-limit-value": "Stel een limiet voor het maximaal aantal taken in deze lijst in", - "setWipLimitPopup-title": "Stel WIP limiet in", + "set-wip-limit-value": "Zet een limiet voor het maximaal aantal taken in deze lijst", + "setWipLimitPopup-title": "Zet een WIP limiet", "shortcut-add-self": "Voeg jezelf toe aan huidige kaart", "shortcut-assign-self": "Voeg jezelf toe aan huidige kaart", "shortcut-autocomplete-emoji": "Emojis automatisch aanvullen", @@ -676,7 +650,7 @@ "automatic-linked-url-schemes": "Maatwerk URL-schema's die automatisch klikbaar zouden moeten zijn. Een URL per regel.", "username": "Gebruikersnaam", "import-usernames": "Importeer Gebruikersnamen", - "view-it": "Toon het", + "view-it": "Bekijk het", "warn-list-archived": "Let op: deze kaart zit in gearchiveerde lijst", "watch": "Bekijk", "watching": "Bekijken", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Wijzig ontvangstdatum", "editCardEndDatePopup-title": "Wijzig einddatum", "setCardColorPopup-title": "Stel kleur in", - "setSelectionColorPopup-title": "Stel geselecteerde kleur in", "setCardActionsColorPopup-title": "Kies een kleur", "setSwimlaneColorPopup-title": "Kies een kleur", "setListColorPopup-title": "Kies een kleur", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "Alle lijsten, kaarten, labels en activiteiten zullen worden verwijderd en je kunt de bordinhoud niet terughalen. Er is geen herstelmogelijkheid.", "boardDeletePopup-title": "Bord verwijderen?", "delete-board": "Verwijder bord", - "delete-duplicate-lists": "Verwijder Dubbele Lijsten", - "delete-duplicate-lists-confirm": "Weet je het zeker? Alle dubbele lijsten die dezelfde naam hebben en geen kaarten bevatten worden verwijderd.", "default-subtasks-board": "Subtaken voor __board__ bord", "default": "Standaard", "defaultdefault": "Standaard", @@ -790,7 +761,7 @@ "subtask-settings": "Subtaak Instellingen", "card-settings": "Kaart Instellingen", "minicard-settings": "Minikaart Instellingen", - "boardSubtaskSettingsPopup-title": "Subtaak Instellingen", + "boardSubtaskSettingsPopup-title": "Bord Subtaak Instellingen", "boardCardSettingsPopup-title": "Kaart Instellingen", "boardMinicardSettingsPopup-title": "Minikaart Instellingen", "deposit-subtasks-board": "Plaats subtaken op dit bord:", @@ -834,7 +805,7 @@ "r-removed-from": "Verwijderd van", "r-the-board": "het bord", "r-list": "lijst", - "set-filter": "Stel Filter In", + "set-filter": "Definieer Filter", "r-moved-to": "verplaatst naar", "r-moved-from": "verplaatst van", "r-archived": "Verplaatst naar Archief", @@ -949,7 +920,7 @@ "people-number": "Het aantal gebruikers is:", "swimlaneDeletePopup-title": "Swimlane verwijderen?", "swimlane-delete-pop": "Alle acties zullen verwijderd worden van de activiteiten feed en je kunt de swimlane niet terughalen. Er is geen herstelmogelijkheid.", - "restore-all": "Herstel alles", + "restore-all": "Haal alles terug", "delete-all": "Verwijder alles", "loading": "Laden, even geduld.", "previous_as": "laatste keer was", @@ -961,8 +932,6 @@ "a-endAt": "einddatum gewijzigd naar", "a-startAt": "begindatum gewijzigd naar", "a-receivedAt": "ontvangstdatum gewijzigd naar", - "above-selected-card": "Boven geselecteerde kaart", - "below-selected-card": "Onder geselecteerde kaart", "almostdue": "huidige vervaldatum %s nadert", "pastdue": "huidige vervaldatum %s is verlopen", "duenow": "huidige vervaldatum %s is vandaag", @@ -992,13 +961,13 @@ "newUserPopup-title": "Nieuwe gebruiker", "notifications": "Meldingen", "help": "Help", - "view-all": "Toon alles", + "view-all": "Bekijk alles", "filter-by-unread": "Filter op Ongelezen", "mark-all-as-read": "Markeer alles als gelezen", "remove-all-read": "verwijder alle gelezen", "allow-rename": "Sta Hernoemen toe", "allowRenamePopup-title": "Sta Hernoemen toe", - "start-day-of-week": "Stel eerste dag van de week in", + "start-day-of-week": "Stel eerste dag van de week in op", "monday": "Maandag", "tuesday": "Dinsdag", "wednesday": "Woensdag", @@ -1041,13 +1010,11 @@ "myCardsSortChange-choice-board": "Naar bord", "myCardsSortChange-choice-dueat": "Naar vervaldatum", "dueCards-title": "Achterstallige kaarten", - "dueCardsViewChange-title": "Achterstallige Kaarten Overzicht", - "dueCardsViewChangePopup-title": "Achterstallige Kaarten Overzicht", + "dueCardsViewChange-title": "Achterstallige kaart view", + "dueCardsViewChangePopup-title": "Achterstallige kaart view", "dueCardsViewChange-choice-me": "Mij", "dueCardsViewChange-choice-all": "Alle gebruikers", "dueCardsViewChange-choice-all-description": "Toon incomplete kaarten met een *achterstallige* datum van borden waarvoor de gebruiker toegang heeft.", - "dueCards-noResults-title": "Geen Achterstallige Kaarten Gevonden", - "dueCards-noResults-description": "Je hebt nu geen kaarten met achterstallige datums.", "broken-cards": "Defecte kaarten", "board-title-not-found": "Bord '%s' niet gevonden.", "swimlane-title-not-found": "Swimlane '%s' niet gevonden.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Verberg alle checklist items", "support": "Ondersteuning", "supportPopup-title": "Ondersteuning", - "support-page-enabled": "Ondersteuningspagina ingeschakeld", - "support-info-not-added-yet": "Ondersteuningsinformatie is nog niet toegevoegd", - "support-info-only-for-logged-in-users": "Ondersteuningsinformatie is alleen voor ingelogde gebruikers.", - "support-title": "Ondersteuningstitel", - "support-content": "Ondersteuningsinhoud", "accessibility": "Toegankelijkheid", "accessibility-page-enabled": "Toegankelijkheidspagina ingeschakeld", "accessibility-info-not-added-yet": "Toegankelijkheidsinformatie is nog niet toegevoegd", @@ -1437,73 +1399,7 @@ "back-to-settings": "Terug naar Instellingen", "board-id": "Bord ID", "board-migration": "Bord Migratie", - "board-migrations": "Bord Migraties", "card-show-lists-on-minicard": "Toon Lijsten op Minikaart", - "comprehensive-board-migration": "Uitgebreide Bord Migratie", - "comprehensive-board-migration-description": "Voert uitgebreide controles en reparaties uit voor bord data-integriteit, inclusief lijst sortering, kaart posities en swimlane-structuur.", - "delete-duplicate-empty-lists-migration": "Verwijder Dubbele Lege Lijsten", - "delete-duplicate-empty-lists-migration-description": "Verwijderd veilig lege dubbele lijsten. Verwijderd alleen lijsten die geen kaarten bevatten EN waar een andere lijst bestaat met dezelfde titel die wel kaarten bevat.", - "lost-cards": "Verloren Kaarten", - "lost-cards-list": "Herstelde Items", - "restore-lost-cards-migration": "Herstel Verloren Kaarten", - "restore-lost-cards-migration-description": "Vind en herstel kaarten en lijsten met missende swimlane-ID of list-ID. Hier wordt een 'Verloren Kaarten'-swimlane gemaakt om alles verloren items weer zichtbaar te maken.", - "restore-all-archived-migration": "Herstel Alles ui Archief", - "restore-all-archived-migration-description": "Herstel alle ge-archiveerde swimlanes, lijsten en kaarten. Hierbij worden automatisch de missende swimlane-ID of lijs-ID gerapareerd om de items weer zichtbaar te maken.", - "fix-missing-lists-migration": "Repareer Missende Lijsten", - "fix-missing-lists-migration-description": "Detecteer en repareer missende of corrupte lijsten in de bordstructuur.", - "fix-avatar-urls-migration": "Repareer Avatar URL's", - "fix-avatar-urls-migration-description": "Werkt de avatar URL's van de bord-leden bij zodat de juiste opslagmethode gebruikt wordt en het repareert defecte avatar verwijzingen.", - "fix-all-file-urls-migration": "Repareer alle bestand URL's", - "fix-all-file-urls-migration-description": "Werkt alle bestandsbijlagen URL's op dit bord bij naar de juiste opslagmethode en repareert defecte bestandsverwijzingen.", - "migration-needed": "Migratie Nodig", - "migration-complete": "Voltooid", - "migration-running": "In Uitvoering...", - "migration-successful": "Migratie succesvol uitgevoerd", - "migration-failed": "Migratie mislukt", - "migrations": "Migraties", - "migrations-admin-only": "Alleen bord-beherders kunnen migraties uitvoeren", - "migrations-description": "Voer data-integriteits controles en reparaties uit op dit bord. Elke migratie kan afzonderlijk uitgevoerd worden.", - "no-issues-found": "Geen problemen gevonden", - "run-migration": "Voer Migratie Uit", - "run-comprehensive-migration-confirm": "Dit voert een uitgebreide migratie uit en controleert en repareert de data-integriteit op dit bord. Dit kan even duren. Doorgaan?", - "run-delete-duplicate-empty-lists-migration-confirm": "Dit converteert eventuele gedeelde lijsten naar lijsten per swimlane waarna lege lijsten verwijderd worden die dubbel zijn met een lijst met dezelfde titel en wel kaarten bevatten. Alleen echt dubbele lege lijsten worden verwijderd. Doorgaan?", - "run-restore-lost-cards-migration-confirm": "Dit creëert een 'Verloren Kaarten' swimlane en hierin worden kaarten en lijsten hersteld met een missende swimlane-ID of lijst-ID. Dit heeft alleen gevolgen voor niet gearchiveerde items. Doorgaan?", - "run-restore-all-archived-migration-confirm": "Dit herstelt alle gearchiveerde swimlanes, lijsten en kaarten waardoor ze weer zichtbaar worden. Items met een missende ID zulle automatisch gerepareerd worden. Doorgaan?", - "run-fix-missing-lists-migration-confirm": "Dit detecteert en repareert missende of corrupte lijsten in de bord-structuur. Doorgaan?", - "run-fix-avatar-urls-migration-confirm": "Dit werkt alle avatar URL's van de bord-leden bij naar de juiste opslagmethode. Doorgaan?", - "run-fix-all-file-urls-migration-confirm": "dit werkt alle bestandsbijlagen URL's bij naar de juiste opslagmethode. Doorgaan?", - "restore-lost-cards-nothing-to-restore": "Geen verloren swinmlanes, lijsten of kaarten om te herstellen", - - "migration-progress-title": "Bord Migratie in Uitvoering", - "migration-progress-overall": "Algehele Voortgang", - "migration-progress-current-step": "Huidige Stap", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Wacht tot we jouw bord gemigreerd hebben naar de actuele structuur...", - "steps": "stappen", - "view": "Toon", - "has-swimlanes": "Heeft Swimlanes", - - "step-analyze-board-structure": "Bordstructuur Analyseren", - "step-fix-orphaned-cards": "Repareer Verweesde Kaarten", - "step-convert-shared-lists": "Converteer Gedeelde Lijsten", - "step-ensure-per-swimlane-lists": "Maak Per-Swimlane Lijsten", - "step-validate-migration": "Valideer Migratie", - "step-fix-avatar-urls": "Repareer Avatar URL's", - "step-fix-attachment-urls": "Repareer Bijlage URL's", - "step-analyze-lists": "Analyseer Lijsten", - "step-create-missing-lists": "Maak Missende Lijsten", - "step-update-cards": "Werk Kaarten Bij", - "step-finalize": "Beëindig", - "step-delete-duplicate-empty-lists": "Verwijder Dubbele Lege Lijsten", - "step-ensure-lost-cards-swimlane": "Maak Verloren Kaarten Swimlane", - "step-restore-lists": "Herstel Lijsten", - "step-restore-cards": "Herstel Kaarten", - "step-restore-swimlanes": "Herstel Swimlanes", - "step-fix-missing-ids": "Herstel Missende ID's", - "step-scan-users": "Bord-leden avatars controleren", - "step-scan-files": "Bord bestandsbijlagen controleren", - "step-fix-file-urls": "Herstel bestand URL's", "cleanup": "Opschonen", "cleanup-old-jobs": "Schoon Oude Taken Op", "completed": "Afgewerkt", @@ -1570,7 +1466,6 @@ "operation-type": "Actie Type", "overall-progress": "Algehele Voortgang", "page": "Pagina", - "pause": "Pause", "pause-migration": "Pauzeer Migratie", "previous": "Vorige", "refresh": "Bijwerken", @@ -1585,7 +1480,6 @@ "schedule": "Plannen", "search-boards-or-operations": "Zoek borden of acties...", "show-list-on-minicard": "Toon Lijst op Minikaart", - "showChecklistAtMinicard": "Toon Checklist op Minikaart", "showing": "Tonen", "start-test-operation": "Start Test Actie", "start-time": "Starttijd", @@ -1600,6 +1494,5 @@ "weight": "Gewicht", "idle": "Inactief", "complete": "Voltooid", - "cron": "Planning", - "current-step": "Huidige Stap" + "cron": "Planning" } diff --git a/imports/i18n/data/oc.i18n.json b/imports/i18n/data/oc.i18n.json index ac4eb53c9..072f7cce3 100644 --- a/imports/i18n/data/oc.i18n.json +++ b/imports/i18n/data/oc.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Modèls", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Apondre una pèça joncha", @@ -328,16 +316,10 @@ "comment-placeholder": "Escrire un comentari", "comment-only": "Comment only", "comment-only-desc": "Comentari sus las cartas solament.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "Pas cap de comentari", "no-comments-desc": "Podèts pas veire ni los comentaris ni las activitats", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Ordenator", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Còpia del ligam de la carta", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Ligam de la carta", @@ -356,7 +337,6 @@ "copyManyCardsPopup-format": "[ {\"title\": \"Títol de la primièra carta\", \"description\":\"Descripcion de la primièra carta\"}, {\"title\":\"Títol de la segonda carta\",\"description\":\"Descripcion de la segonda carta\"},{\"title\":\"Títol de la darrièra carta\",\"description\":\"Descripcion de la darrièra carta\"} ]", "create": "Crear", "createBoardPopup-title": "Crear un tablèu", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Importar un tablèu", "createLabelPopup-title": "Crear una etiqueta", "createCustomField": "Crear un camp", @@ -377,9 +357,9 @@ "custom-fields": "Camps personalizats", "date": "Data", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Refusar", "default-avatar": "Fòto per defaut", "delete": "Suprimir", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Modificar la notificacion", "editProfilePopup-title": "Modificar lo perfil", "email": "Corrièl", - "email-address": "Email Address", "email-enrollAccount-subject": "Vòstre compte es ara activat pel sit __siteName__", "email-enrollAccount-text": "Adieu __user__,\n\nPer comença d'utilizar lo servici, vos cal clicar sul ligam.\n\n__url__\n\nMercé.", "email-fail": "Pas possible de mandar lo corrièl", @@ -554,7 +533,6 @@ "log-in": "Connexion", "loginPopup-title": "Connexion", "memberMenuPopup-title": "Paramètres dels participants", - "grey-icons": "Grey Icons", "members": "Participants", "menu": "Menut", "move-selection": "Bolegar la seleccion", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Bolegar cap al bas", "moveCardToTop-title": "Bolegar cap al naut", "moveSelectionPopup-title": "Bolegar la seleccion", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-seleccion", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "Pas brica de resultat", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Color seleccionada", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Causir una color", "setSwimlaneColorPopup-title": "Causir una color", "setListColorPopup-title": "Causir una color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Suprimir lo tablèu ?", "delete-board": "Tablèu suprimit", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/or_IN.i18n.json b/imports/i18n/data/or_IN.i18n.json index d48099de1..12e76c28d 100644 --- a/imports/i18n/data/or_IN.i18n.json +++ b/imports/i18n/data/or_IN.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/pa.i18n.json b/imports/i18n/data/pa.i18n.json index 7e96f7719..726f9caac 100644 --- a/imports/i18n/data/pa.i18n.json +++ b/imports/i18n/data/pa.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/pl-PL.i18n.json b/imports/i18n/data/pl-PL.i18n.json index cb51a1b6e..b48f67c24 100644 --- a/imports/i18n/data/pl-PL.i18n.json +++ b/imports/i18n/data/pl-PL.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "usunął komentarz %s", "activity-receivedDate": "zmienił datę otrzymania na %s z %s", "activity-startDate": "zmienił datę rozpoczęcia na %s z %s", - "allboards.starred": "Starred", - "allboards.templates": "Szablony", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "zmienił datę wykonania na %s z %s", "activity-endDate": "zmienił datę zakończenia na %s z %s", "add-attachment": "Dodaj załącznik", @@ -328,16 +316,10 @@ "comment-placeholder": "Dodaj komentarz", "comment-only": "Tylko komentowanie", "comment-only-desc": "Może tylko komentować w kartach.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Czy na pewno chcesz usunąć komentarz?", "deleteCommentPopup-title": "Usunąć komentarz?", "no-comments": "Bez komentarzy", "no-comments-desc": "Nie widzi komentarzy i aktywności.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Pracownik", "worker-desc": "Możesz tylko przenieść karty, przypisać je do siebie i na nich komentować.", "computer": "Komputera", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Skopiuj łącze karty do schowka", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Podepnij kartę", @@ -356,7 +337,6 @@ "copyManyCardsPopup-format": "[ {\"title\": \"Tytuł pierwszej karty\", \"description\":\"Opis pierwszej karty\"}, {\"title\":\"Tytuł drugiej karty\",\"description\":\"Opis drugiej karty\"},{\"title\":\"Tytuł ostatniej karty\",\"description\":\"Opis ostatniej karty\"} ]", "create": "Utwórz", "createBoardPopup-title": "Utwórz tablicę", - "createTemplateContainerPopup-title": "Dodaj Kontener Szablonów", "chooseBoardSourcePopup-title": "Import tablicy", "createLabelPopup-title": "Utwórz etykietę", "createCustomField": "Utwórz pole", @@ -377,9 +357,9 @@ "custom-fields": "Niestandardowe pola", "date": "Data", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Odrzuć", "default-avatar": "Domyślny avatar", "delete": "Usuń", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Zmień tryb powiadamiania", "editProfilePopup-title": "Edytuj profil", "email": "Email", - "email-address": "Email Address", "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ę.", @@ -554,7 +533,6 @@ "log-in": "Zaloguj", "loginPopup-title": "Zaloguj", "memberMenuPopup-title": "Ustawienia użytkowników", - "grey-icons": "Grey Icons", "members": "Użytkownicy", "menu": "Menu", "move-selection": "Przenieś zaznaczone", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Przenieś na koniec", "moveCardToTop-title": "Przenieś na początek", "moveSelectionPopup-title": "Przenieś zaznaczone", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Wielokrotne zaznaczenie", "multi-selection-label": "Dodaj etykietę do zaznaczenia", "multi-selection-member": "Dodaj użytkownika do zaznaczenia", @@ -578,8 +554,6 @@ "no-results": "Brak wyników", "normal": "Użytkownik standardowy", "normal-desc": "Może widzieć i edytować karty. Nie może zmieniać ustawiań.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Zaproszenie jeszcze niezaakceptowane", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Otrzymuj powiadomienia z tablic, list i kart, które obserwujesz", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Zmień datę przyjęcia", "editCardEndDatePopup-title": "Zmień datę zakończenia", "setCardColorPopup-title": "Ustaw kolor", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Wybierz kolor", "setSwimlaneColorPopup-title": "Wybierz kolor", "setListColorPopup-title": "Wybierz kolor", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "Wszystkie listy, etykiety oraz aktywności zostaną usunięte i nie będziesz w stanie przywrócić zawartości tablicy. Tego nie da się cofnąć.", "boardDeletePopup-title": "Usunąć tablicę?", "delete-board": "Usuń tablicę", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Podzadania dla tablicy __board__", "default": "Domyślny", "defaultdefault": "Domyślny", @@ -790,7 +761,7 @@ "subtask-settings": "Ustawienia podzadań", "card-settings": "Ustawienia kart", "minicard-settings": "Ustawienia miniatur kart", - "boardSubtaskSettingsPopup-title": "Ustawienia podzadań", + "boardSubtaskSettingsPopup-title": "Ustawienia tablicy podzadań", "boardCardSettingsPopup-title": "Ustawienia kart", "boardMinicardSettingsPopup-title": "Ustawienia miniatur kart", "deposit-subtasks-board": "Twórz podzadania na tablicy:", @@ -961,8 +932,6 @@ "a-endAt": "zmienił czas zakończenia na", "a-startAt": "zmienił czas rozpoczęcia na", "a-receivedAt": "zmienił czas przyjęcia zadania na", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "data wykonania %s jest bliska", "pastdue": "data wykonania %s minęła", "duenow": "data wykonania %s przypada dzisiaj", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Moje", "dueCardsViewChange-choice-all": "Wszystkich użytkowników", "dueCardsViewChange-choice-all-description": "Wyświetla wszystkie nieukończone karty z ustawioną datą wykonania ze wszystkich tablic, do których użytkownik ma dostęp.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Karty wadliwe", "board-title-not-found": "Nie znaleziono tablicy '%s'.", "swimlane-title-not-found": "Nie znaleziono ścieżki '%s'.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Szczegóły", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "ukończona", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/pl.i18n.json b/imports/i18n/data/pl.i18n.json index b4e4c0abf..0e3d8c56f 100644 --- a/imports/i18n/data/pl.i18n.json +++ b/imports/i18n/data/pl.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "usunięto komentarz %s", "activity-receivedDate": "zmienił datę otrzymania na %s z %s", "activity-startDate": "zmienił datę rozpoczęcia na %s z %s", - "allboards.starred": "Starred", - "allboards.templates": "Szablony", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "zmienił datę wykonania na %s z %s", "activity-endDate": "zmienił datę zakończenia na %s z %s", "add-attachment": "Dodaj załącznik", @@ -328,16 +316,10 @@ "comment-placeholder": "Dodaj komentarz", "comment-only": "Tylko komentowanie", "comment-only-desc": "Może tylko komentować w kartach.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Czy na pewno chcesz usunąć komentarz?", "deleteCommentPopup-title": "Usunąć komentarz?", "no-comments": "Bez komentarzy", "no-comments-desc": "Nie widzi komentarzy i aktywności.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Pracownik", "worker-desc": "Możesz tylko przenieść karty, przypisać je do siebie i na nich komentować.", "computer": "Komputera", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Skopiuj łącze karty do schowka", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Podepnij kartę", @@ -356,7 +337,6 @@ "copyManyCardsPopup-format": "[ {\"title\": \"Tytuł pierwszej karty\", \"description\":\"Opis pierwszej karty\"}, {\"title\":\"Tytuł drugiej karty\",\"description\":\"Opis drugiej karty\"},{\"title\":\"Tytuł ostatniej karty\",\"description\":\"Opis ostatniej karty\"} ]", "create": "Utwórz", "createBoardPopup-title": "Utwórz tablicę", - "createTemplateContainerPopup-title": "Dodaj Kontener Szablonów", "chooseBoardSourcePopup-title": "Import tablicy", "createLabelPopup-title": "Utwórz etykietę", "createCustomField": "Utwórz pole", @@ -377,9 +357,9 @@ "custom-fields": "Niestandardowe pola", "date": "Data", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Odrzuć", "default-avatar": "Domyślny avatar", "delete": "Usuń", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Zmień tryb powiadamiania", "editProfilePopup-title": "Edytuj profil", "email": "Email", - "email-address": "Email Address", "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ę.", @@ -554,7 +533,6 @@ "log-in": "Zaloguj", "loginPopup-title": "Zaloguj", "memberMenuPopup-title": "Ustawienia użytkowników", - "grey-icons": "Grey Icons", "members": "Użytkownicy", "menu": "Menu", "move-selection": "Przenieś zaznaczone", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Przenieś na koniec", "moveCardToTop-title": "Przenieś na początek", "moveSelectionPopup-title": "Przenieś zaznaczone", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Wielokrotne zaznaczenie", "multi-selection-label": "Dodaj etykietę do zaznaczenia", "multi-selection-member": "Dodaj użytkownika do zaznaczenia", @@ -578,8 +554,6 @@ "no-results": "Brak wyników", "normal": "Użytkownik standardowy", "normal-desc": "Może widzieć i edytować karty. Nie może zmieniać ustawiań.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Zaproszenie jeszcze niezaakceptowane", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Otrzymuj powiadomienia z tablic, list i kart, które obserwujesz", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Zmień datę przyjęcia", "editCardEndDatePopup-title": "Zmień datę zakończenia", "setCardColorPopup-title": "Ustaw kolor", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Wybierz kolor", "setSwimlaneColorPopup-title": "Wybierz kolor", "setListColorPopup-title": "Wybierz kolor", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "Wszystkie listy, etykiety oraz aktywności zostaną usunięte i nie będziesz w stanie przywrócić zawartości tablicy. Tego nie da się cofnąć.", "boardDeletePopup-title": "Usunąć tablicę?", "delete-board": "Usuń tablicę", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Podzadania dla tablicy __board__", "default": "Domyślny", "defaultdefault": "Domyślny", @@ -790,7 +761,7 @@ "subtask-settings": "Ustawienia podzadań", "card-settings": "Ustawienia kart", "minicard-settings": "Ustawienia miniatur kart", - "boardSubtaskSettingsPopup-title": "Ustawienia podzadań", + "boardSubtaskSettingsPopup-title": "Ustawienia tablicy podzadań", "boardCardSettingsPopup-title": "Ustawienia kart", "boardMinicardSettingsPopup-title": "Ustawienia miniatur kart", "deposit-subtasks-board": "Twórz podzadania na tablicy:", @@ -961,8 +932,6 @@ "a-endAt": "zmienił czas zakończenia na", "a-startAt": "zmienił czas rozpoczęcia na", "a-receivedAt": "zmienił czas przyjęcia zadania na", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "data wykonania %s jest bliska", "pastdue": "data wykonania %s minęła", "duenow": "data wykonania %s przypada dzisiaj", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Moje", "dueCardsViewChange-choice-all": "Wszystkich użytkowników", "dueCardsViewChange-choice-all-description": "Wyświetla wszystkie nieukończone karty z ustawioną datą wykonania ze wszystkich tablic, do których użytkownik ma dostęp.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Karty wadliwe", "board-title-not-found": "Nie znaleziono tablicy '%s'.", "swimlane-title-not-found": "Nie znaleziono ścieżki '%s'.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Szczegóły", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "ukończona", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/pt-BR.i18n.json b/imports/i18n/data/pt-BR.i18n.json index b6b29b0cc..7045ba99d 100644 --- a/imports/i18n/data/pt-BR.i18n.json +++ b/imports/i18n/data/pt-BR.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "comentário excluído %s", "activity-receivedDate": "editou recebido para %s de %s", "activity-startDate": "editou data início para %s de %s", - "allboards.starred": "Favoritado", - "allboards.templates": "Modelos", - "allboards.remaining": "Restante", - "allboards.workspaces": "Áreas de trabalho", - "allboards.add-workspace": "Adicionar Área de trabalho", - "allboards.add-workspace-prompt": "Nome da Área de trabalho", - "allboards.add-subworkspace": "Adicionar Subárea de trabalho", - "allboards.add-subworkspace-prompt": "Nome da Subárea de trabalho", - "allboards.edit-workspace": "Editar Área de trabalho", - "allboards.edit-workspace-name": "Nome da Área de trabalho", - "allboards.edit-workspace-icon": "Ícone da Área de trabalho (markdown)", - "multi-selection-active": "Clique nas caixas de seleção para selecionar os quadros", "activity-dueDate": "editou prazo final para %s de %s", "activity-endDate": "editou concluído para %s de %s", "add-attachment": "Adicionar Anexos", @@ -328,16 +316,10 @@ "comment-placeholder": "Escrever Comentário", "comment-only": "Somente comentários", "comment-only-desc": "Pode comentar apenas em cartões.", - "comment-assigned-only": "Somente Comentário Atribuído", - "comment-assigned-only-desc": "Somente cartões atribuídos visível. Pode somente comentar.", "comment-delete": "Você tem certeza que deseja excluir o comentário?", "deleteCommentPopup-title": "Excluir comentário?", "no-comments": "Sem comentários", "no-comments-desc": "Sem visualização de comentários e atividades.", - "read-only": "Somente Leitura", - "read-only-desc": "Pode somente ver cartões. Não pode editar.", - "read-assigned-only": "Somente Leitura Atribuída", - "read-assigned-only-desc": "Somente cartões atribuídos visível. Não pode editar.", "worker": "Colaborador", "worker-desc": "Pode apenas mover cartões, atribuir-se ao cartão e comentar.", "computer": "Computador", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Você tem certeza que deseja excluir a lista de verificação?", "subtaskDeletePopup-title": "Excluir subtarefa?", "checklistDeletePopup-title": "Excluir lista de verificação?", - "checklistItemDeletePopup-title": "Excluir Item da Lista de Verificação?", "copy-card-link-to-clipboard": "Copiar link do cartão para a área de transferência", "copy-text-to-clipboard": "Copiar texto para a área de transferência", "linkCardPopup-title": "Ligar Cartão", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Adicionar Contêiner de Modelo", "chooseBoardSourcePopup-title": "Importar quadro", "createLabelPopup-title": "Criar Etiqueta", "createCustomField": "Criar campo", @@ -377,9 +357,9 @@ "custom-fields": "Campos customizados", "date": "Data", "date-format": "Formato da Data", - "date-format-yyyy-mm-dd": "AAAA-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-AAAA", - "date-format-mm-dd-yyyy": "MM-DD-AAAA", + "date-format-yyyy-mm-dd": "AAAA-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-AAAA HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-AAAA HH:MM", "decline": "Rejeitar", "default-avatar": "Avatar padrão", "delete": "Excluir", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Editar Notificações", "editProfilePopup-title": "Editar Perfil", "email": "E-mail", - "email-address": "Endereço de e-mail", "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 e-mail", @@ -554,7 +533,6 @@ "log-in": "Entrar", "loginPopup-title": "Entrar", "memberMenuPopup-title": "Configurações de Membro", - "grey-icons": "Ícones Cinza", "members": "Membros", "menu": "Menu", "move-selection": "Mover seleção", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Mover para o final", "moveCardToTop-title": "Mover para o topo", "moveSelectionPopup-title": "Mover seleção", - "copySelectionPopup-title": "Copiar seleção", - "selection-color": "Cor da seleção", "multi-selection": "Multi-Seleção", "multi-selection-label": "Definir etiqueta para a seleção", "multi-selection-member": "Definir membro para a seleção", @@ -578,8 +554,6 @@ "no-results": "Nenhum resultado.", "normal": "Normal", "normal-desc": "Pode ver e editar cartões. Não pode alterar configurações.", - "normal-assigned-only": "Somente Normal Atribuído", - "normal-assigned-only-desc": "Somente cartões atribuídos visível. Editar como usuário Normal.", "not-accepted-yet": "Convite ainda não aceito", "notify-participate": "Receba atualizações de todos os cartões que você participa como criador ou membro", "notify-watch": "Receber atualizações de qualquer board, lista ou cards que você estiver observando", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Modificar data de recebimento", "editCardEndDatePopup-title": "Mudar data de conclusão", "setCardColorPopup-title": "Definir cor", - "setSelectionColorPopup-title": "Definir cor da seleção", "setCardActionsColorPopup-title": "Escolha uma cor", "setSwimlaneColorPopup-title": "Escolha uma cor", "setListColorPopup-title": "Escolha uma cor", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "Todas as listas, cartões, etiquetas e atividades serão excluídas e você não poderá recuperar o conteúdo do quadro. Não há como desfazer.", "boardDeletePopup-title": "Excluir quadro?", "delete-board": "Excluir quadro", - "delete-duplicate-lists": "Excluir Listas Duplicadas", - "delete-duplicate-lists-confirm": "Você tem certeza? Isso vai apagar todas as litas duplicadas que possuem o mesmo nome e que não possuem cartões", "default-subtasks-board": "Subtarefas para quadro __board__", "default": "Padrão", "defaultdefault": "Padrão", @@ -790,7 +761,7 @@ "subtask-settings": "Configurações de subtarefas", "card-settings": "Configurações do Cartão", "minicard-settings": "Configurações do Mini cartão", - "boardSubtaskSettingsPopup-title": "Configurações de subtarefas", + "boardSubtaskSettingsPopup-title": "Configurações das subtarefas do quadro", "boardCardSettingsPopup-title": "Configurações do Cartão", "boardMinicardSettingsPopup-title": "Configurações do Mini cartão", "deposit-subtasks-board": "Inserir subtarefas a este quadro:", @@ -961,8 +932,6 @@ "a-endAt": "hora de conclusão modificada para", "a-startAt": "hora de início modificada para", "a-receivedAt": "hora de recebido modificada para", - "above-selected-card": "Selecionar cartão acima", - "below-selected-card": "Selecionar cartão abaixo", "almostdue": "prazo final atual %s está próximo", "pastdue": "prazo final atual %s venceu", "duenow": "prazo final atual %s é hoje", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Eu", "dueCardsViewChange-choice-all": "Todos os usuários", "dueCardsViewChange-choice-all-description": "Mostrar todos os cartões incompletos com *Prazo Final* nos quadros em que o usuário tem permissão", - "dueCards-noResults-title": "Sem Cartões com prazo final", - "dueCards-noResults-description": "Você não possui cartões com prazo final neste momento", "broken-cards": "Cartões quebrados", "board-title-not-found": "Quadro '%s' não encontrado.", "swimlane-title-not-found": "Raia '%s' não encontrada.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Esconder todos os itens da lista de verificação", "support": "Suporte", "supportPopup-title": "Suporte", - "support-page-enabled": "Página de suporte ativada", - "support-info-not-added-yet": "As informações de suporte ainda não foram adicionadas.", - "support-info-only-for-logged-in-users": "As informações de suporte são exclusivas para usuários logados.", - "support-title": "Título de suporte", - "support-content": "Conteúdo de suporte", "accessibility": "Acessibilidade", "accessibility-page-enabled": "Página de acessibilidade habilitada", "accessibility-info-not-added-yet": "As informações de acessibilidade ainda não foram adicionadas", @@ -1437,73 +1399,7 @@ "back-to-settings": "Voltar às Configurações", "board-id": "ID do Quadro", "board-migration": "Migração de Quadro", - "board-migrations": "Migração de Quadros", "card-show-lists-on-minicard": "Mostrar Listas no Mini cartão", - "comprehensive-board-migration": "Migração de Quadros abrangente", - "comprehensive-board-migration-description": "Realiza verificações e correções abrangentes para a integridade dos dados do quadro, incluindo a ordem da lista, as posições dos cartões e a estrutura das raias.", - "delete-duplicate-empty-lists-migration": "Apagar Listas Vazias Duplicadas", - "delete-duplicate-empty-lists-migration-description": "Exclui com segurança listas duplicadas vazias. Remove apenas listas que não contêm cartões E que possuem outra lista com o mesmo título que contém cartões.", - "lost-cards": "Cartões Perdidos", - "lost-cards-list": "Itens Recuperados", - "restore-lost-cards-migration": "Recuperar Cartões Perdidos", - "restore-lost-cards-migration-description": "Encontra e restaura cartões e listas com ID de raia ou ID de lista ausentes. Cria uma raia \"Cartões Perdidos\" para tornar todos os itens perdidos visíveis novamente.", - "restore-all-archived-migration": "Recuperar Todos Arquivados", - "restore-all-archived-migration-description": "Restaura todas as raias, listas e cartões arquivados. Corrige automaticamente qualquer ID de raia ou ID de lista ausente para tornar os itens visíveis.", - "fix-missing-lists-migration": "Corrigir Listas Ausentes", - "fix-missing-lists-migration-description": "Detecta e repara listas ausentes ou corrompidas na estrutura do quadro.", - "fix-avatar-urls-migration": "Corrigir URLs de Avatar", - "fix-avatar-urls-migration-description": "Atualiza os URLs dos avatares dos membros do quadro para que utilizem o backend de armazenamento correto e corrige referências de avatar quebradas.", - "fix-all-file-urls-migration": "Corrigir todas URLs de arquivos", - "fix-all-file-urls-migration-description": "Atualiza todas URLs de arquivos de anexo neste quadro para usar o backend de armazenamento correto e corrige referências de arquivos quebradas.", - "migration-needed": "Migração necessária", - "migration-complete": "Concluído", - "migration-running": "Executando...", - "migration-successful": "Migração concluída com sucesso.", - "migration-failed": "A migração falhou", - "migrations": "Migrações", - "migrations-admin-only": "Somente os administradores do quadro podem executar migrações.", - "migrations-description": "Execute verificações de integridade de dados e reparos para este quadro. Cada migração pode ser executada individualmente.", - "no-issues-found": "Nenhum problema encontrado", - "run-migration": "Executar Migração", - "run-comprehensive-migration-confirm": "Isso realizará uma migração completa para verificar e corrigir a integridade dos dados do quadro. Isso pode levar alguns instantes. Continuar?", - "run-delete-duplicate-empty-lists-migration-confirm": "Primeiro, isso converterá todas as listas compartilhadas em listas por raia e, em seguida, excluirá as listas vazias que contêm listas duplicadas com o mesmo título e que possuem cartões. Somente as listas vazias realmente redundantes serão removidas. Continuar?", - "run-restore-lost-cards-migration-confirm": "Isso criará uma raia \"Cartões Perdidos\" e restaurará todos os cartões e listas com ID de raia ou ID de lista ausentes. Isso afeta apenas itens não arquivados. Continuar?", - "run-restore-all-archived-migration-confirm": "Isso restaurará TODAS as raias, listas e cartões arquivados, tornando-os visíveis novamente. Quaisquer itens com IDs ausentes serão corrigidos automaticamente. Esta ação não pode ser desfeita facilmente. Continuar?", - "run-fix-missing-lists-migration-confirm": "Isso detectará e corrigirá listas ausentes ou corrompidas na estrutura do quadro. Continuar?", - "run-fix-avatar-urls-migration-confirm": "Isso atualizará as URLs dos avatares dos membros do quadro para usar o backend de armazenamento correto. Continuar?", - "run-fix-all-file-urls-migration-confirm": "Isso atualizará todas URLs de arquivos de anexos neste quadro para usar o servidor de armazenamento correto. Continuar?", - "restore-lost-cards-nothing-to-restore": "Sem raias, listas ou cartões perdidos para restaurar.", - - "migration-progress-title": "Migração do Quadro em Andamento", - "migration-progress-overall": "Progresso Geral", - "migration-progress-current-step": "Etapa Atual", - "migration-progress-status": "Status", - "migration-progress-details": "Detalhes", - "migration-progress-note": "Aguarde enquanto migramos seu quadro para a estrutura mais recente...", - "steps": "etapas", - "view": "Visão", - "has-swimlanes": "Possui Raias", - - "step-analyze-board-structure": "Analisar a Estrutura do Quadro", - "step-fix-orphaned-cards": "Corrigir Cartões Órfãos", - "step-convert-shared-lists": "Converter Listas Compartilhadas", - "step-ensure-per-swimlane-lists": "Garantir listas por raia", - "step-validate-migration": "Validar Migração", - "step-fix-avatar-urls": "Corrigir URLs de Avatar", - "step-fix-attachment-urls": "Corrigir URLs de anexos", - "step-analyze-lists": "Analisar Listas", - "step-create-missing-lists": "Criar Listas Faltantes", - "step-update-cards": "Atualizar Cartões", - "step-finalize": "Finalizar", - "step-delete-duplicate-empty-lists": "Apagar Listas Vazias Duplicadas", - "step-ensure-lost-cards-swimlane": "Garantir a Raia dos Cartões Perdidos", - "step-restore-lists": "Restaurar Listas", - "step-restore-cards": "Restaurar Cartões", - "step-restore-swimlanes": "Restaurar Raias", - "step-fix-missing-ids": "Corrigir IDs ausentes", - "step-scan-users": "Verificando os avatares dos membros do quadro", - "step-scan-files": "Verificando arquivos de anexos do quadro", - "step-fix-file-urls": "Corrigindo URLs de arquivos", "cleanup": "Limpeza", "cleanup-old-jobs": "Limpar Trabalhos Antigos", "completed": "Completado", @@ -1570,7 +1466,6 @@ "operation-type": "Tipo de Operação", "overall-progress": "Progresso Geral", "page": "Página", - "pause": "Pause", "pause-migration": "Parar Migração", "previous": "Anterior", "refresh": "Atualizar", @@ -1585,7 +1480,6 @@ "schedule": "Agendar", "search-boards-or-operations": "Buscar quadros ou operações", "show-list-on-minicard": "Mostrar Lista no Mini Cartão", - "showChecklistAtMinicard": "Mostrar Lista de Verificação no Mini Cartão", "showing": "Mostrando", "start-test-operation": "Iniciar Teste de Operação", "start-time": "Hora de início", @@ -1600,6 +1494,5 @@ "weight": "Carga", "idle": "Parado", "complete": "Concluído", - "cron": "Cron", - "current-step": "Etapa Atual" + "cron": "Cron" } diff --git a/imports/i18n/data/pt.i18n.json b/imports/i18n/data/pt.i18n.json index bb4612b60..7bd7d738b 100644 --- a/imports/i18n/data/pt.i18n.json +++ b/imports/i18n/data/pt.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "apagou o comentário %s", "activity-receivedDate": "editou a data recebida para %s de %s", "activity-startDate": "editou a data de início para %s de %s", - "allboards.starred": "Starred", - "allboards.templates": "Modelos", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "editou a data limite para %s de %s", "activity-endDate": "editou a data de fim para %s de %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Escrever o Comentário", "comment-only": "Apenas comentários", "comment-only-desc": "Pode comentar apenas em cartões.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Eliminar comentário?", "no-comments": "Sem comentários", "no-comments-desc": "Não pode ver comentários nem actividades.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Trabalhador", "worker-desc": "Apenas pode mover cartões, atribuir-se a si próprio ao cartão e comentar.", "computer": "Computador", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Eliminar lista de verificação?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copiar a ligação do cartão para a área de transferência", "copy-text-to-clipboard": "Copiar texto para a área de transferência", "linkCardPopup-title": "Ligar Cartão", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Importar quadro", "createLabelPopup-title": "Criar Etiqueta", "createCustomField": "Criar Campo", @@ -377,9 +357,9 @@ "custom-fields": "Campos Personalizados", "date": "Data", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Rejeitar", "default-avatar": "Avatar por omissão", "delete": "Apagar", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Editar a Notificação", "editProfilePopup-title": "Editar o Perfil", "email": "E-mail", - "email-address": "Email Address", "email-enrollAccount-subject": "Uma conta foi criada para si em __siteName__", "email-enrollAccount-text": "Olá __user__\nPara começar a utilizar o serviço, basta clicar na ligação abaixo.\n__url__\nObrigado.", "email-fail": "Falhou a enviar o e-mail", @@ -554,7 +533,6 @@ "log-in": "Entrar", "loginPopup-title": "Entrar", "memberMenuPopup-title": "Configuração dos Membros", - "grey-icons": "Grey Icons", "members": "Membros", "menu": "Menu", "move-selection": "Mover a selecção", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Mover para o Fundo", "moveCardToTop-title": "Mover para o Topo", "moveSelectionPopup-title": "Mover a selecção", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Selecção Múltipla", "multi-selection-label": "Definir etiqueta para seleção", "multi-selection-member": "Defina membro para seleção", @@ -578,8 +554,6 @@ "no-results": "Nenhum resultado.", "normal": "Normal", "normal-desc": "Pode ver e editar cartões. Não pode alterar configurações.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Convite ainda não aceite", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receber actualizações de qualquer quadro, lista ou cartões que estiver a observar", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Alterar data de recebimento", "editCardEndDatePopup-title": "Alterar data de fim", "setCardColorPopup-title": "Definir cor", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Escolha uma cor", "setSwimlaneColorPopup-title": "Escolha uma cor", "setListColorPopup-title": "Escolha uma cor", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "Todas as listas, cartões, etiquetas e atividades serão apagadas e não poderá recuperar o conteúdo do quadro. Não é reversível.", "boardDeletePopup-title": "Apagar Quadro?", "delete-board": "Apagar Quadro", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Sub-tarefas para o quadro __board__", "default": "Omissão", "defaultdefault": "Omissão", @@ -790,7 +761,7 @@ "subtask-settings": "Configurações de Sub-tarefas", "card-settings": "Definições do Cartão", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Configurações de Sub-tarefas", + "boardSubtaskSettingsPopup-title": "Configurações das Sub-tarefas do Quadro", "boardCardSettingsPopup-title": "Definições do Cartão", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Depositar sub-tarefas neste quadro:", @@ -961,8 +932,6 @@ "a-endAt": "modificou a data de fim para", "a-startAt": "modificou a data de início para", "a-receivedAt": "modificou a data recebida para", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "a data limite actual %s está-se a aproximar", "pastdue": "a data limite actual %s já passou", "duenow": "a data limite actual %s é hoje", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Eu", "dueCardsViewChange-choice-all": "Todos os Utilizadores", "dueCardsViewChange-choice-all-description": "Mostra todos os cartões incompletos com data *Limite* de quadros onde o utilizador tem permissões.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Cartões Defeituosos", "board-title-not-found": "Quadro '%s' não encontrado.", "swimlane-title-not-found": "Pista '%s' não encontrada.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Concluído", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Estado", - "migration-progress-details": "Detalhes", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completada", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Peso", "idle": "Inativo", "complete": "Concluído", - "cron": "Agendamento", - "current-step": "Current Step" + "cron": "Agendamento" } diff --git a/imports/i18n/data/pt_PT.i18n.json b/imports/i18n/data/pt_PT.i18n.json index d70f7d285..4dd503d43 100644 --- a/imports/i18n/data/pt_PT.i18n.json +++ b/imports/i18n/data/pt_PT.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "apagou o comentário %s", "activity-receivedDate": "editou a data recebida para %s de %s", "activity-startDate": "editou a data de início para %s de %s", - "allboards.starred": "Starred", - "allboards.templates": "Modelos", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "editou a data limite para %s de %s", "activity-endDate": "editou a data de fim para %s de %s", "add-attachment": "Adicionar Anexo", @@ -328,16 +316,10 @@ "comment-placeholder": "Escrever o Comentário", "comment-only": "Apenas comentários", "comment-only-desc": "Pode comentar apenas em cartões.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Eliminar comentário?", "no-comments": "Sem comentários", "no-comments-desc": "Não pode ver comentários nem actividades.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Trabalhador", "worker-desc": "Apenas pode mover cartões, atribuir-se a si próprio ao cartão e comentar.", "computer": "Computador", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Eliminar lista de verificação?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copiar a ligação do cartão para a área de transferência", "copy-text-to-clipboard": "Copiar texto para a área de transferência", "linkCardPopup-title": "Ligar Cartão", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Importar quadro", "createLabelPopup-title": "Criar Etiqueta", "createCustomField": "Criar Campo", @@ -377,9 +357,9 @@ "custom-fields": "Campos Personalizados", "date": "Data", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Rejeitar", "default-avatar": "Avatar por omissão", "delete": "Apagar", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Editar a Notificação", "editProfilePopup-title": "Editar o Perfil", "email": "E-mail", - "email-address": "Email Address", "email-enrollAccount-subject": "Uma conta foi criada para si em __siteName__", "email-enrollAccount-text": "Olá __user__\nPara começar a utilizar o serviço, basta clicar na ligação abaixo.\n__url__\nObrigado.", "email-fail": "Falhou a enviar o e-mail", @@ -554,7 +533,6 @@ "log-in": "Entrar", "loginPopup-title": "Entrar", "memberMenuPopup-title": "Configuração dos Membros", - "grey-icons": "Grey Icons", "members": "Membros", "menu": "Menu", "move-selection": "Mover a selecção", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Mover para o Fundo", "moveCardToTop-title": "Mover para o Topo", "moveSelectionPopup-title": "Mover a selecção", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Selecção Múltipla", "multi-selection-label": "Definir etiqueta para seleção", "multi-selection-member": "Defina membro para seleção", @@ -578,8 +554,6 @@ "no-results": "Nenhum resultado.", "normal": "Normal", "normal-desc": "Pode ver e editar cartões. Não pode alterar configurações.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Convite ainda não aceite", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receber actualizações de qualquer quadro, lista ou cartões que estiver a observar", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Alterar data de recebimento", "editCardEndDatePopup-title": "Alterar data de fim", "setCardColorPopup-title": "Definir cor", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Escolha uma cor", "setSwimlaneColorPopup-title": "Escolha uma cor", "setListColorPopup-title": "Escolha uma cor", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "Todas as listas, cartões, etiquetas e atividades serão apagadas e não poderá recuperar o conteúdo do quadro. Não é reversível.", "boardDeletePopup-title": "Apagar Quadro?", "delete-board": "Apagar Quadro", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Sub-tarefas para o quadro __board__", "default": "Omissão", "defaultdefault": "Omissão", @@ -790,7 +761,7 @@ "subtask-settings": "Configurações de Sub-tarefas", "card-settings": "Definições do Cartão", "minicard-settings": "Configurações do minicartão", - "boardSubtaskSettingsPopup-title": "Configurações de Sub-tarefas", + "boardSubtaskSettingsPopup-title": "Configurações das Sub-tarefas do Quadro", "boardCardSettingsPopup-title": "Definições do Cartão", "boardMinicardSettingsPopup-title": "Configurações do minicartão", "deposit-subtasks-board": "Depositar sub-tarefas neste quadro:", @@ -961,8 +932,6 @@ "a-endAt": "modificou a data de fim para", "a-startAt": "modificou a data de início para", "a-receivedAt": "modificou a data recebida para", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "a data limite actual %s está-se a aproximar", "pastdue": "a data limite actual %s já passou", "duenow": "a data limite actual %s é hoje", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Eu", "dueCardsViewChange-choice-all": "Todos os Utilizadores", "dueCardsViewChange-choice-all-description": "Mostra todos os cartões incompletos com data *Limite* de quadros onde o utilizador tem permissões.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Cartões Defeituosos", "board-title-not-found": "Quadro '%s' não encontrado.", "swimlane-title-not-found": "Pista '%s' não encontrada.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Estado", - "migration-progress-details": "Detalhes", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completada", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/ro-RO.i18n.json b/imports/i18n/data/ro-RO.i18n.json index f25c6f77d..df47fde36 100644 --- a/imports/i18n/data/ro-RO.i18n.json +++ b/imports/i18n/data/ro-RO.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Membrii", "menu": "Meniu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/ro.i18n.json b/imports/i18n/data/ro.i18n.json index d4442b992..530b05aba 100644 --- a/imports/i18n/data/ro.i18n.json +++ b/imports/i18n/data/ro.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/ru-UA.i18n.json b/imports/i18n/data/ru-UA.i18n.json index c1ffab657..d54bc7220 100644 --- a/imports/i18n/data/ru-UA.i18n.json +++ b/imports/i18n/data/ru-UA.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Шаблоны", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Добавить Шаблон Контейнера", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Настройки подзадач", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Статус", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Завершен", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/ru.i18n.json b/imports/i18n/data/ru.i18n.json index f7c1ef4fc..e21cba238 100644 --- a/imports/i18n/data/ru.i18n.json +++ b/imports/i18n/data/ru.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "удалил комментарий %s", "activity-receivedDate": "отредактировал дату получения на %sс %s", "activity-startDate": "отредактировал дату начала на %sс %s", - "allboards.starred": "Starred", - "allboards.templates": "Шаблоны", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "отредактировал срок исполнения на %s с %s", "activity-endDate": "отредактировал дату завершения на %s с %s", "add-attachment": "Добавить вложение", @@ -328,16 +316,10 @@ "comment-placeholder": "Написать комментарий", "comment-only": "Только комментирование", "comment-only-desc": "Может комментировать только карточки.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Вы уверены, что хотите удалить этот комментарий?", "deleteCommentPopup-title": "Удалить комментарий?", "no-comments": "Без комментариев", "no-comments-desc": "Не видит комментарии и историю действий.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Исполнитель", "worker-desc": "Может перемещать карточки, отмечаться как исполнитель и оставлять комментарии", "computer": "Загрузить с компьютера", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Вы уверены, что хотите удалить чек-лист?", "subtaskDeletePopup-title": "Удалить Подзадачу?", "checklistDeletePopup-title": "Удалить Чек-лист?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Копировать ссылку на карточку в буфер обмена", "copy-text-to-clipboard": "Скопировать текст в буфер обмена", "linkCardPopup-title": "Карточка-ссылка", @@ -356,7 +337,6 @@ "copyManyCardsPopup-format": "[ {\"title\": \"Название первой карточки\", \"description\":\"Описание первой карточки\"}, {\"title\":\"Название второй карточки\",\"description\":\"Описание второй карточки\"},{\"title\":\"Название последней карточки\",\"description\":\"Описание последней карточки\"} ]", "create": "Создать", "createBoardPopup-title": "Создать доску", - "createTemplateContainerPopup-title": "Добавить Шаблон Контейнера", "chooseBoardSourcePopup-title": "Импортировать доску", "createLabelPopup-title": "Создать метку", "createCustomField": "Создать поле", @@ -377,9 +357,9 @@ "custom-fields": "Настраиваемые поля", "date": "Дата", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Отклонить", "default-avatar": "Аватар по умолчанию", "delete": "Удалить", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Редактировать уведомления", "editProfilePopup-title": "Редактировать профиль", "email": "Эл.почта", - "email-address": "Email Address", "email-enrollAccount-subject": "Аккаунт создан для вас здесь __url__", "email-enrollAccount-text": "Привет __user__,\n\nДля того, чтобы начать использовать сервис, просто нажми на ссылку ниже.\n\n__url__\n\nСпасибо.", "email-fail": "Отправка письма на EMail не удалась", @@ -554,7 +533,6 @@ "log-in": "Войти", "loginPopup-title": "Войти", "memberMenuPopup-title": "Настройки участника", - "grey-icons": "Grey Icons", "members": "Участники", "menu": "Меню", "move-selection": "Переместить выделение", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Переместить вниз", "moveCardToTop-title": "Переместить вверх", "moveSelectionPopup-title": "Переместить выделение", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Выбрать несколько", "multi-selection-label": "Задать метку для отмеченного", "multi-selection-member": "Задать участника для отмеченного", @@ -578,8 +554,6 @@ "no-results": "Ничего не найдено", "normal": "Обычный", "normal-desc": "Может редактировать карточки. Не может управлять настройками.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Приглашение еще не принято", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Получать обновления по любым доскам, спискам и карточкам, на которые вы подписаны как наблюдатель.", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Изменить дату получения", "editCardEndDatePopup-title": "Изменить дату завершения", "setCardColorPopup-title": "Задать цвет", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Выберите цвет", "setSwimlaneColorPopup-title": "Выберите цвет", "setListColorPopup-title": "Выберите цвет", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "Все списки, карточки, метки и действия будут удалены, и вы не сможете восстановить содержимое доски. Отменить нельзя.", "boardDeletePopup-title": "Удалить доску?", "delete-board": "Удалить доску", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Подзадача для доски __board__", "default": "По умолчанию", "defaultdefault": "По умолчанию", @@ -790,7 +761,7 @@ "subtask-settings": "Настройки подзадач", "card-settings": "Настройки карточки", "minicard-settings": "Настройки миникарточки", - "boardSubtaskSettingsPopup-title": "Настройки подзадач", + "boardSubtaskSettingsPopup-title": "Настройки подзадач для доски", "boardCardSettingsPopup-title": "Настройки карточки", "boardMinicardSettingsPopup-title": "Настройки миникарточки", "deposit-subtasks-board": "Отправлять подзадачи на доску:", @@ -961,8 +932,6 @@ "a-endAt": "изменил время завершения на", "a-startAt": "изменил время начала работы на", "a-receivedAt": "изменил время получения на", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "текущий срок выполнения %s приближается", "pastdue": "текущий срок выполнения %s прошел", "duenow": "текущий срок выполнения %s сегодня", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Мне", "dueCardsViewChange-choice-all": "Все пользователи", "dueCardsViewChange-choice-all-description": "Показать все незавершенные карточки с установленным сроком с досок для которых у пользователя есть разрешения.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Просроченные карточки", "board-title-not-found": "Доска '%s' не найдена.", "swimlane-title-not-found": "Дорожка '%s' не найдена.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Завершено", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Статус", - "migration-progress-details": "Детали", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Завершен", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Вес", "idle": "Простой", "complete": "Завершено", - "cron": "Планировщик", - "current-step": "Current Step" + "cron": "Планировщик" } diff --git a/imports/i18n/data/ru_RU.i18n.json b/imports/i18n/data/ru_RU.i18n.json deleted file mode 100644 index d48099de1..000000000 --- a/imports/i18n/data/ru_RU.i18n.json +++ /dev/null @@ -1,1605 +0,0 @@ -{ - "accept": "Accept", - "act-activity-notify": "Activity Notification", - "act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-addLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-addedLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-removeLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-removedLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-addChecklist": "added checklist __checklist__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-addChecklistItem": "added checklist item __checklistItem__ to checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-removeChecklist": "removed checklist __checklist__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-removeChecklistItem": "removed checklist item __checklistItem__ from checklist __checkList__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-uncheckedItem": "unchecked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-editComment": "edited comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-deleteComment": "deleted comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-createBoard": "created board __board__", - "act-createSwimlane": "created swimlane __swimlane__ to board __board__", - "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__", - "act-createCustomField": "created custom field __customField__ at board __board__", - "act-deleteCustomField": "deleted custom field __customField__ at board __board__", - "act-setCustomField": "edited custom field __customField__: __customFieldValue__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-createList": "added list __list__ to board __board__", - "act-addBoardMember": "added member __member__ to board __board__", - "act-archivedBoard": "Board __board__ moved to Archive", - "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive", - "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive", - "act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive", - "act-importBoard": "imported board __board__", - "act-importCard": "imported card __card__ to list __list__ at swimlane __swimlane__ at board __board__", - "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__", - "act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-moveCard": "moved card __card__ at board __board__ from list __oldList__ at swimlane __oldSwimlane__ to list __list__ at swimlane __swimlane__", - "act-moveCardToOtherBoard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__", - "act-removeBoardMember": "removed member __member__ from board __board__", - "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__", - "act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-withBoardTitle": "__board__", - "act-withCardTitle": "[__board__] __card__", - "actions": "Actions", - "activities": "Activities", - "activity": "Activity", - "activity-added": "added %s to %s", - "activity-archived": "%s moved to Archive", - "activity-attached": "attached %s to %s", - "activity-created": "created %s", - "activity-changedListTitle": "renamed list to %s", - "activity-customfield-created": "created custom field %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-subtask-added": "added subtask to %s", - "activity-checked-item": "checked %s in checklist %s of %s", - "activity-unchecked-item": "unchecked %s in checklist %s of %s", - "activity-checklist-added": "added checklist to %s", - "activity-checklist-removed": "removed a checklist from %s", - "activity-checklist-completed": "completed checklist %s of %s", - "activity-checklist-uncompleted": "uncompleted the checklist %s of %s", - "activity-checklist-item-added": "added checklist item to '%s' in %s", - "activity-checklist-item-removed": "removed a checklist item from '%s' in %s", - "add": "Add", - "activity-checked-item-card": "checked %s in checklist %s", - "activity-unchecked-item-card": "unchecked %s in checklist %s", - "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "activity-checklist-uncompleted-card": "uncompleted the checklist %s", - "activity-editComment": "edited comment %s", - "activity-deleteComment": "deleted comment %s", - "activity-receivedDate": "edited received date to %s of %s", - "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", - "activity-dueDate": "edited due date to %s of %s", - "activity-endDate": "edited end date to %s of %s", - "add-attachment": "Add Attachment", - "add-board": "Add Board", - "add-template": "Add Template", - "add-card": "Add Card", - "add-card-to-top-of-list": "Add Card to Top of List", - "add-card-to-bottom-of-list": "Add Card to Bottom of List", - "setListWidthPopup-title": "Set Widths", - "set-list-width": "Set Widths", - "set-list-width-value": "Set Min & Max Widths (pixels)", - "list-width-error-message": "List widths must be integers greater than 100", - "keyboard-shortcuts-enabled": "Keyboard shortcuts enabled. Click to disable.", - "keyboard-shortcuts-disabled": "Keyboard shortcuts disabled. Click to enable.", - "setSwimlaneHeightPopup-title": "Set Swimlane Height", - "set-swimlane-height": "Set Swimlane Height", - "set-swimlane-height-value": "Swimlane Height (pixels)", - "swimlane-height-error-message": "Swimlane height must be a positive integer", - "add-swimlane": "Add Swimlane", - "add-subtask": "Add Subtask", - "add-checklist": "Add Checklist", - "add-checklist-item": "Add an item to checklist", - "close-add-checklist-item": "Close add an item to checklist form", - "close-edit-checklist-item": "Close edit an item to checklist form", - "convertChecklistItemToCardPopup-title": "Convert to Card", - "add-cover": "Add cover image to minicard", - "add-label": "Add Label", - "add-list": "Add List", - "add-after-list": "Add After List", - "add-members": "Add Members", - "added": "Added", - "addMemberPopup-title": "Members", - "memberPopup-title": "Member Settings", - "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": "Loading, please wait. Refreshing the page will cause data loss. If loading does not work, please check that server has not stopped.", - "app-try-reconnect": "Try to reconnect.", - "archive": "Move to Archive", - "archive-all": "Move All to Archive", - "archive-board": "Move Board to Archive", - "archive-board-confirm": "Are you sure you want to archive this board?", - "archive-card": "Move Card to Archive", - "archive-list": "Move List to Archive", - "archive-swimlane": "Move Swimlane to Archive", - "archive-selection": "Move selection to Archive", - "archiveBoardPopup-title": "Move Board to Archive?", - "archived-items": "Archive", - "archived-boards": "Boards in Archive", - "restore-board": "Restore Board", - "no-archived-boards": "No Boards in Archive.", - "archives": "Archive", - "template": "Template", - "templates": "Templates", - "template-container": "Template Container", - "add-template-container": "Add Template Container", - "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 (__size__ max)", - "back": "Back", - "board-change-color": "Change color", - "board-change-background-image": "Change Background Image", - "board-background-image-url": "Background Image URL", - "add-background-image": "Add Background Image", - "remove-background-image": "Remove Background Image", - "show-at-all-boards-page" : "Show at All Boards page", - "board-info-on-my-boards" : "All Boards Settings", - "boardInfoOnMyBoardsPopup-title" : "All Boards Settings", - "boardInfoOnMyBoards-title": "All Boards Settings", - "show-card-counter-per-list": "Show card count per list", - "show-board_members-avatar": "Show Board members avatars", - "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>.", - "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", - "boardChangeColorPopup-title": "Change Board Background", - "boardChangeBackgroundImagePopup-title": "Change Background Image", - "allBoardsChangeColorPopup-title": "Change color", - "allBoardsChangeBackgroundImagePopup-title": "Change Background Image", - "boardChangeTitlePopup-title": "Rename Board", - "boardChangeVisibilityPopup-title": "Change Visibility", - "boardChangeWatchPopup-title": "Change Watch", - "boardMenuPopup-title": "Board Settings", - "allBoardsMenuPopup-title": "Settings", - "boardChangeViewPopup-title": "Board View", - "boards": "Boards", - "board-view": "Board View", - "desktop-mode": "Desktop Mode", - "mobile-mode": "Mobile Mode", - "mobile-desktop-toggle": "Toggle between Mobile and Desktop Mode", - "zoom-in": "Zoom In", - "zoom-out": "Zoom Out", - "click-to-change-zoom": "Click to change zoom level", - "zoom-level": "Zoom Level", - "enter-zoom-level": "Enter zoom level (50-300%):", - "board-view-cal": "Calendar", - "board-view-swimlanes": "Swimlanes", - "board-view-collapse": "Collapse", - "board-view-gantt": "Gantt", - "board-view-lists": "Lists", - "bucket-example": "Like \"Bucket List\" for example", - "calendar-previous-month-label": "Previous Month", - "calendar-next-month-label": "Next Month", - "cancel": "Cancel", - "card-archived": "This card is moved to Archive.", - "board-archived": "This board is moved to Archive.", - "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 to Archive to remove it from the board and preserve the activity.", - "card-archive-pop": "Card will not be visible at this list after archiving card.", - "card-archive-suggest-cancel": "You can later restore card from Archive.", - "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", - "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", - "cardCustomField-datePopup-title": "Change date", - "cardCustomFieldsPopup-title": "Edit custom fields", - "cardStartVotingPopup-title": "Start a vote", - "positiveVoteMembersPopup-title": "Proponents", - "negativeVoteMembersPopup-title": "Opponents", - "card-edit-voting": "Edit voting", - "editVoteEndDatePopup-title": "Change vote end date", - "allowNonBoardMembers": "Allow all logged in users", - "vote-question": "Voting question", - "vote-public": "Show who voted what", - "vote-for-it": "for it", - "vote-against": "against", - "deleteVotePopup-title": "Delete vote?", - "vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.", - "cardStartPlanningPokerPopup-title": "Start a Planning Poker", - "card-edit-planning-poker": "Edit Planning Poker", - "editPokerEndDatePopup-title": "Change Planning Poker vote end date", - "poker-question": "Planning Poker", - "poker-one": "1", - "poker-two": "2", - "poker-three": "3", - "poker-five": "5", - "poker-eight": "8", - "poker-thirteen": "13", - "poker-twenty": "20", - "poker-forty": "40", - "poker-oneHundred": "100", - "poker-unsure": "?", - "poker-finish": "Finish", - "poker-result-votes": "Votes", - "poker-result-who": "Who", - "poker-replay": "Replay", - "set-estimation": "Set Estimation", - "deletePokerPopup-title": "Delete planning poker?", - "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", - "cardDeletePopup-title": "Delete Card?", - "cardArchivePopup-title": "Archive Card?", - "cardDetailsActionsPopup-title": "Card Actions", - "cardLabelsPopup-title": "Labels", - "cardMembersPopup-title": "Members", - "cardMorePopup-title": "More", - "cardTemplatePopup-title": "Create template", - "cards": "Cards", - "cards-count": "Cards", - "cards-count-one": "Card", - "casSignIn": "Sign In with CAS", - "cardType-card": "Card", - "cardType-linkedCard": "Linked Card", - "cardType-linkedBoard": "Linked Board", - "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", - "subtasks": "Subtasks", - "checklists": "Checklists", - "click-to-star": "Click to star this board.", - "click-to-unstar": "Click to unstar this board.", - "click-to-enable-auto-width": "Auto list width disabled. Click to enable.", - "click-to-disable-auto-width": "Auto list width enabled. Click to disable.", - "auto-list-width": "Auto list width", - "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 “Archive” button from the home header.", - "close-card": "Close Card", - "color-black": "black", - "color-blue": "blue", - "color-crimson": "crimson", - "color-darkgreen": "darkgreen", - "color-gold": "gold", - "color-gray": "gray", - "color-green": "green", - "color-indigo": "indigo", - "color-lime": "lime", - "color-magenta": "magenta", - "color-mistyrose": "mistyrose", - "color-navy": "navy", - "color-orange": "orange", - "color-paleturquoise": "paleturquoise", - "color-peachpuff": "peachpuff", - "color-pink": "pink", - "color-plum": "plum", - "color-purple": "purple", - "color-red": "red", - "color-saddlebrown": "saddlebrown", - "color-silver": "silver", - "color-sky": "sky", - "color-slateblue": "slateblue", - "color-white": "white", - "color-yellow": "yellow", - "unset-color": "Unset", - "comments": "Comments", - "comment": "Comment", - "comment-placeholder": "Write Comment", - "comment-only": "Comment only", - "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", - "comment-delete": "Are you sure you want to delete the comment?", - "deleteCommentPopup-title": "Delete comment?", - "no-comments": "No comments", - "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", - "worker": "Worker", - "worker-desc": "Can only move cards, assign itself to card and comment.", - "computer": "Computer", - "confirm-subtask-delete-popup": "Are you sure you want to delete subtask?", - "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", - "subtaskDeletePopup-title": "Delete Subtask?", - "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", - "copy-card-link-to-clipboard": "Copy card link to clipboard", - "copy-text-to-clipboard": "Copy text to clipboard", - "linkCardPopup-title": "Link Card", - "searchElementPopup-title": "Search", - "copyCardPopup-title": "Copy Card", - "copyManyCardsPopup-title": "Copy Template to Many Cards", - "copyManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format", - "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", - "chooseBoardSourcePopup-title": "Import board", - "createLabelPopup-title": "Create Label", - "createCustomField": "Create Field", - "createCustomFieldPopup-title": "Create Field", - "current": "current", - "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.", - "custom-field-checkbox": "Checkbox", - "custom-field-currency": "Currency", - "custom-field-currency-option": "Currency Code", - "custom-field-date": "Date", - "custom-field-dropdown": "Dropdown List", - "custom-field-dropdown-none": "(none)", - "custom-field-dropdown-options": "List Options", - "custom-field-dropdown-options-placeholder": "Press enter to add more options", - "custom-field-dropdown-unknown": "(unknown)", - "custom-field-number": "Number", - "custom-field-text": "Text", - "custom-fields": "Custom Fields", - "date": "Date", - "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", - "decline": "Decline", - "default-avatar": "Default avatar", - "delete": "Delete", - "deleteCustomFieldPopup-title": "Delete Custom Field?", - "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", - "editCustomFieldPopup-title": "Edit Field", - "addReactionPopup-title": "Add reaction", - "editCardSpentTimePopup-title": "Change spent time", - "editLabelPopup-title": "Change Label", - "editNotificationPopup-title": "Edit Notification", - "editProfilePopup-title": "Edit Profile", - "email": "Email", - "email-address": "Email Address", - "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-vertical-scrollbars": "Enable vertical scrollbars", - "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-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) 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-orgname-taken": "This organization name is already taken", - "error-teamname-taken": "This team name is already taken", - "error-email-taken": "Email has already been taken", - "export-board": "Export board", - "export-board-json": "Export board to JSON", - "export-board-csv": "Export board to CSV", - "export-board-tsv": "Export board to TSV", - "export-board-excel": "Export board to Excel", - "user-can-not-export-excel": "User can not export Excel", - "export-board-html": "Export board to HTML", - "export-card": "Export card", - "export-card-pdf": "Export card to PDF", - "user-can-not-export-card-to-pdf": "User can not export card to PDF", - "exportBoardPopup-title": "Export board", - "exportCardPopup-title": "Export card", - "sort": "Sort", - "sorted": "Sorted", - "remove-sort": "Remove sort", - "sort-desc": "Click to Sort List", - "list-sort-by": "Sort the List By:", - "list-label-modifiedAt": "Last Access Time", - "list-label-title": "Name of the List", - "list-label-sort": "Your Manual Order", - "list-label-short-modifiedAt": "(L)", - "list-label-short-title": "(N)", - "list-label-short-sort": "(M)", - "filter": "Filter", - "filter-cards": "Filter Cards or Lists", - "filter-dates-label": "Filter by date", - "filter-no-due-date": "No due date", - "filter-overdue": "Overdue", - "filter-due-today": "Due today", - "filter-due-this-week": "Due this week", - "filter-due-next-week": "Due next week", - "filter-due-tomorrow": "Due tomorrow", - "list-filter-label": "Filter List by Title", - "filter-clear": "Clear filter", - "filter-labels-label": "Filter by label", - "filter-no-label": "No label", - "filter-member-label": "Filter by member", - "filter-no-member": "No member", - "filter-assignee-label": "Filter by assignee", - "filter-no-assignee": "No assignee", - "filter-custom-fields-label": "Filter by Custom Fields", - "filter-no-custom-fields": "No Custom Fields", - "filter-show-archive": "Show archived lists", - "filter-hide-empty": "Hide empty lists", - "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", - "other-filters-label": "Other Filters", - "advanced-filter-label": "Advanced Filter", - "advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i", - "fullname": "Full Name", - "header-logo-title": "Go back to your boards page.", - "show-activities": "Show Activities", - "headerBarCreateBoardPopup-title": "Create Board", - "home": "Home", - "import": "Import", - "impersonate-user": "Impersonate user", - "link": "Link", - "import-board": "import board", - "import-board-c": "Import board", - "import-board-title-trello": "Import board from Trello", - "import-board-title-wekan": "Import board from previous export", - "import-board-title-csv": "Import board from CSV/TSV", - "from-trello": "From Trello", - "from-wekan": "From previous export", - "from-csv": "From CSV/TSV", - "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-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .", - "import-board-instruction-wekan": "In your board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.", - "import-board-instruction-about-errors": "If you get errors when importing board, sometimes importing still works, and board is at All Boards page.", - "import-json-placeholder": "Paste your valid JSON data here", - "import-csv-placeholder": "Paste your valid CSV/TSV 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 your users", - "import-members-map-note": "Note: Unmapped members will be assigned to the current user.", - "import-show-user-mapping": "Review members mapping", - "import-user-select": "Pick your existing user you want to use as this member", - "importMapMembersAddPopup-title": "Select 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 Archive", - "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Archive and bring them back to the board, click “Menu” > “Archive”.", - "list-move-cards": "Move all cards in this list", - "list-select-cards": "Select all cards in this list", - "set-color-list": "Set Color", - "listActionPopup-title": "List Actions", - "settingsUserPopup-title": "User Settings", - "settingsTeamPopup-title": "Team Settings", - "settingsOrgPopup-title": "Organization Settings", - "swimlaneActionPopup-title": "Swimlane Actions", - "swimlaneAddPopup-title": "Add a Swimlane below", - "listImportCardPopup-title": "Import a Trello card", - "listImportCardsTsvPopup-title": "Import Excel CSV/TSV", - "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 Archive 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", - "grey-icons": "Grey Icons", - "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", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", - "multi-selection": "Multi-Selection", - "multi-selection-label": "Set label for selection", - "multi-selection-member": "Set member for 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 Archive.", - "no-archived-lists": "No lists in Archive.", - "no-archived-swimlanes": "No swimlanes in Archive.", - "no-results": "No results", - "normal": "Normal", - "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", - "not-accepted-yet": "Invitation not accepted yet", - "notify-participate": "Receive updates to any cards you participate as creator 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 image from minicard", - "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", - "rescue-card-description": "Show rescue dialogue before closing for unsaved card descriptions", - "rescue-card-description-dialogue": "Overwrite current card description with your changes?", - "save": "Save", - "search": "Search", - "rules": "Rules", - "search-cards": "Search from card/list titles, descriptions and custom fields on this board", - "search-example": "Write text you search and press Enter", - "select-color": "Select Color", - "select-board": "Select Board", - "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list", - "setWipLimitPopup-title": "Set WIP Limit", - "shortcut-add-self": "Add yourself to current card", - "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-filter-my-assigned-cards": "Filter my assigned cards", - "shortcut-show-shortcuts": "Bring up this shortcuts list", - "shortcut-toggle-filterbar": "Toggle Filter Sidebar", - "shortcut-toggle-searchbar": "Toggle Search 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", - "toggle-assignees": "Toggle assignees 1-9 for card (By order of addition to board).", - "toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9", - "remove-labels-multiselect": "Multi-Selection removes labels 1-9", - "tracking": "Tracking", - "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", - "type": "Type", - "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", - "uploading-files": "Uploading files", - "upload-failed": "Upload failed", - "upload-completed": "Upload completed", - "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL", - "custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL", - "custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27", - "custom-login-logo-image-url": "Custom Login Logo Image URL", - "custom-login-logo-link-url": "Custom Login Logo Link URL", - "custom-help-link-url": "Custom Help Link URL", - "text-below-custom-login-logo": "Text below Custom Login Logo", - "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", - "username": "Username", - "import-usernames": "Import Usernames", - "view-it": "View it", - "warn-list-archived": "warning: this card is in an list at Archive", - "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", - "card-templates-swimlane": "Card Templates", - "list-templates-swimlane": "List Templates", - "board-templates-swimlane": "Board Templates", - "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", - "disable-forgot-password": "Disable Forgot Password", - "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 kanban board 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", - "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.", - "webhook-title": "Webhook Name", - "webhook-token": "Token (Optional for Authentication)", - "outgoing-webhooks": "Outgoing Webhooks", - "bidirectional-webhooks": "Two-Way Webhooks", - "outgoingWebhooksPopup-title": "Outgoing Webhooks", - "boardCardTitlePopup-title": "Card Title Filter", - "disable-webhook": "Disable This Webhook", - "global-webhook": "Global Webhooks", - "new-outgoing-webhook": "New Outgoing Webhook", - "no-name": "(Unknown)", - "Node_version": "Node version", - "Meteor_version": "Meteor version", - "MongoDB_version": "MongoDB version", - "MongoDB_storage_engine": "MongoDB storage engine", - "MongoDB_Oplog_enabled": "MongoDB Oplog enabled", - "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", - "days": "days", - "hours": "hours", - "minutes": "minutes", - "seconds": "seconds", - "show-field-on-card": "Show this field on card", - "automatically-field-on-card": "Add field to new cards", - "always-field-on-card": "Add field to all cards", - "showLabel-field-on-card": "Show field label on minicard", - "showSum-field-on-list": "Show sum of fields at top of list", - "yes": "Yes", - "no": "No", - "accounts": "Accounts", - "accounts-allowEmailChange": "Allow Email Change", - "accounts-allowUserNameChange": "Allow Username Change", - "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", - "tableVisibilityMode" : "Boards visibility", - "createdAt": "Created at", - "modifiedAt": "Modified 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", - "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", - "setCardActionsColorPopup-title": "Choose a color", - "setSwimlaneColorPopup-title": "Choose a color", - "setListColorPopup-title": "Choose a color", - "assigned-by": "Assigned By", - "requested-by": "Requested By", - "card-sorting-by-number": "Card sorting by number", - "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.", - "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", - "boardDeletePopup-title": "Delete Board?", - "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", - "default-subtasks-board": "Subtasks for __board__ board", - "default": "Default", - "defaultdefault": "Default", - "queue": "Queue", - "subtask-settings": "Subtasks Settings", - "card-settings": "Card Settings", - "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", - "boardCardSettingsPopup-title": "Card Settings", - "boardMinicardSettingsPopup-title": "Minicard Settings", - "deposit-subtasks-board": "Deposit subtasks to this board:", - "deposit-subtasks-list": "Landing list for subtasks deposited here:", - "show-parent-in-minicard": "Show parent in minicard:", - "description-on-minicard": "Description on minicard", - "cover-attachment-on-minicard": "Cover image on minicard", - "badge-attachment-on-minicard": "Count of attachments on minicard", - "card-sorting-by-number-on-minicard": "Card sorting by number on minicard", - "prefix-with-full-path": "Prefix with full path", - "prefix-with-parent": "Prefix with parent", - "subtext-with-full-path": "Subtext with full path", - "subtext-with-parent": "Subtext with parent", - "change-card-parent": "Change card's parent", - "parent-card": "Parent card", - "source-board": "Source board", - "no-parent": "Don't show parent", - "activity-added-label": "added label '%s' to %s", - "activity-removed-label": "removed label '%s' from %s", - "activity-delete-attach": "deleted an attachment from %s", - "activity-added-label-card": "added label '%s'", - "activity-removed-label-card": "removed label '%s'", - "activity-delete-attach-card": "deleted an attachment", - "activity-set-customfield": "set custom field '%s' to '%s' in %s", - "activity-unset-customfield": "unset custom field '%s' in %s", - "r-rule": "Rule", - "r-add-trigger": "Add trigger", - "r-add-action": "Add action", - "r-board-rules": "Board rules", - "r-add-rule": "Add rule", - "r-view-rule": "View rule", - "r-delete-rule": "Delete rule", - "r-new-rule-name": "New rule title", - "r-no-rules": "No rules", - "r-trigger": "Trigger", - "r-action": "Action", - "r-when-a-card": "When a card", - "r-is": "is", - "r-is-moved": "is moved", - "r-added-to": "Added to", - "r-removed-from": "Removed from", - "r-the-board": "the board", - "r-list": "list", - "set-filter": "Set Filter", - "r-moved-to": "Moved to", - "r-moved-from": "Moved from", - "r-archived": "Moved to Archive", - "r-unarchived": "Restored from Archive", - "r-a-card": "a card", - "r-when-a-label-is": "When a label is", - "r-when-the-label": "When the label", - "r-list-name": "list name", - "r-when-a-member": "When a member is", - "r-when-the-member": "When the member", - "r-name": "name", - "r-when-a-attach": "When an attachment", - "r-when-a-checklist": "When a checklist is", - "r-when-the-checklist": "When the checklist", - "r-completed": "Completed", - "r-made-incomplete": "Made incomplete", - "r-when-a-item": "When a checklist item is", - "r-when-the-item": "When the checklist item", - "r-checked": "Checked", - "r-unchecked": "Unchecked", - "r-move-card-to": "Move card to", - "r-top-of": "Top of", - "r-bottom-of": "Bottom of", - "r-its-list": "its list", - "r-archive": "Move to Archive", - "r-unarchive": "Restore from Archive", - "r-card": "card", - "r-add": "Add", - "r-remove": "Remove", - "r-label": "label", - "r-member": "member", - "r-remove-all": "Remove all members from the card", - "r-set-color": "Set color to", - "r-checklist": "checklist", - "r-check-all": "Check all", - "r-uncheck-all": "Uncheck all", - "r-items-check": "items of checklist", - "r-check": "Check", - "r-uncheck": "Uncheck", - "r-item": "item", - "r-of-checklist": "of checklist", - "r-send-email": "Send an email", - "r-to": "to", - "r-of": "of", - "r-subject": "subject", - "r-rule-details": "Rule details", - "r-d-move-to-top-gen": "Move card to top of its list", - "r-d-move-to-top-spec": "Move card to top of list", - "r-d-move-to-bottom-gen": "Move card to bottom of its list", - "r-d-move-to-bottom-spec": "Move card to bottom of list", - "r-d-send-email": "Send email", - "r-d-send-email-to": "to", - "r-d-send-email-subject": "subject", - "r-d-send-email-message": "message", - "r-d-archive": "Move card to Archive", - "r-d-unarchive": "Restore card from Archive", - "r-d-add-label": "Add label", - "r-d-remove-label": "Remove label", - "r-create-card": "Create new card", - "r-in-list": "in list", - "r-in-swimlane": "in swimlane", - "r-d-add-member": "Add member", - "r-d-remove-member": "Remove member", - "r-d-remove-all-member": "Remove all member", - "r-d-check-all": "Check all items of a list", - "r-d-uncheck-all": "Uncheck all items of a list", - "r-d-check-one": "Check item", - "r-d-uncheck-one": "Uncheck item", - "r-d-check-of-list": "of checklist", - "r-d-add-checklist": "Add checklist", - "r-d-remove-checklist": "Remove checklist", - "r-by": "by", - "r-add-checklist": "Add checklist", - "r-with-items": "with items", - "r-items-list": "item1,item2,item3", - "r-add-swimlane": "Add swimlane", - "r-swimlane-name": "swimlane name", - "r-board-note": "Note: leave a field empty to match every possible value. ", - "r-checklist-note": "Note: checklist's items have to be written as comma separated values.", - "r-when-a-card-is-moved": "When a card is moved to another list", - "r-set": "Set", - "r-update": "Update", - "r-datefield": "date field", - "r-df-start-at": "start", - "r-df-due-at": "due", - "r-df-end-at": "end", - "r-df-received-at": "received", - "r-to-current-datetime": "to current date/time", - "r-remove-value-from": "Remove value from", - "r-link-card": "Link card to", - "ldap": "LDAP", - "oauth2": "OAuth2", - "cas": "CAS", - "authentication-method": "Authentication method", - "authentication-type": "Authentication type", - "custom-product-name": "Custom Product Name", - "layout": "Layout", - "hide-logo": "Hide Logo", - "hide-card-counter-list": "Hide card counter list on All Boards", - "hide-board-member-list": "Hide board member list on All Boards", - "add-custom-html-after-body-start": "Add Custom HTML after <body> start", - "add-custom-html-before-body-end": "Add Custom HTML before </body> end", - "error-undefined": "Something went wrong", - "error-ldap-login": "An error occurred while trying to login", - "display-authentication-method": "Display Authentication Method", - "oidc-button-text": "Customize the OIDC button text", - "default-authentication-method": "Default Authentication Method", - "duplicate-board": "Duplicate Board", - "duplicate-board-confirm": "Are you sure you want to duplicate this board?", - "org-number": "The number of organizations is: ", - "team-number": "The number of teams is: ", - "people-number": "The number of people is: ", - "swimlaneDeletePopup-title": "Delete Swimlane ?", - "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.", - "restore-all": "Restore all", - "delete-all": "Delete all", - "loading": "Loading, please wait.", - "previous_as": "last time was", - "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__", - "act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)", - "act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)", - "act-a-receivedAt": "modified received time to __timeValue__ from (__timeOldValue__)", - "a-dueAt": "modified due time to be", - "a-endAt": "modified ending time to be", - "a-startAt": "modified starting time to be", - "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", - "almostdue": "current due time %s is approaching", - "pastdue": "current due time %s is past", - "duenow": "current due time %s is today", - "act-newDue": "__list__/__card__ has 1st due reminder [__board__]", - "act-withDue": "__list__/__card__ due reminders [__board__]", - "act-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching", - "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past", - "act-duenow": "was reminding the current due (__timeValue__) of __card__ is now", - "act-atUserComment": "You were mentioned in [__board__] __list__/__card__", - "delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.", - "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", - "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", - "accounts-allowUserDelete": "Allow users to self delete their account", - "hide-minicard-label-text": "Hide minicard label text", - "show-desktop-drag-handles": "Show desktop drag handles", - "assignee": "Assignee", - "cardAssigneesPopup-title": "Assignee", - "addmore-detail": "Add a more detailed description", - "show-on-card": "Show on Card", - "show-on-minicard": "Show on Minicard", - "new": "New", - "editOrgPopup-title": "Edit Organization", - "newOrgPopup-title": "New Organization", - "editTeamPopup-title": "Edit Team", - "newTeamPopup-title": "New Team", - "editUserPopup-title": "Edit User", - "newUserPopup-title": "New User", - "notifications": "Notifications", - "help": "Help", - "view-all": "View All", - "filter-by-unread": "Filter by Unread", - "mark-all-as-read": "Mark all as read", - "remove-all-read": "Remove all read", - "allow-rename": "Allow Rename", - "allowRenamePopup-title": "Allow Rename", - "start-day-of-week": "Set day of the week start", - "monday": "Monday", - "tuesday": "Tuesday", - "wednesday": "Wednesday", - "thursday": "Thursday", - "friday": "Friday", - "saturday": "Saturday", - "sunday": "Sunday", - "status": "Status", - "swimlane": "Swimlane", - "owner": "Owner", - "last-modified-at": "Last modified at", - "last-activity": "Last activity", - "voting": "Voting", - "archived": "Archived", - "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has", - "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list", - "hide-checked-items": "Hide checked items", - "hide-finished-checklist": "Hide finished checklist", - "task": "Task", - "create-task": "Create Task", - "ok": "OK", - "organizations": "Organizations", - "teams": "Teams", - "displayName": "Display Name", - "shortName": "Short Name", - "autoAddUsersWithDomainName": "Automatically add users with the domain name", - "website": "Website", - "person": "Person", - "my-cards": "My Cards", - "card": "Card", - "list": "List", - "board": "Board", - "context-separator": "/", - "myCardsViewChange-title": "My Cards View", - "myCardsViewChangePopup-title": "My Cards View", - "myCardsViewChange-choice-boards": "Boards", - "myCardsViewChange-choice-table": "Table", - "myCardsSortChange-title": "My Cards Sort", - "myCardsSortChangePopup-title": "My Cards Sort", - "myCardsSortChange-choice-board": "By Board", - "myCardsSortChange-choice-dueat": "By Due Date", - "dueCards-title": "Due Cards", - "dueCardsViewChange-title": "Due Cards View", - "dueCardsViewChangePopup-title": "Due Cards View", - "dueCardsViewChange-choice-me": "Me", - "dueCardsViewChange-choice-all": "All Users", - "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", - "broken-cards": "Broken Cards", - "board-title-not-found": "Board '%s' not found.", - "swimlane-title-not-found": "Swimlane '%s' not found.", - "list-title-not-found": "List '%s' not found.", - "label-not-found": "Label '%s' not found.", - "label-color-not-found": "Label color %s not found.", - "user-username-not-found": "Username '%s' not found.", - "comment-not-found": "Card with comment containing text '%s' not found.", - "org-name-not-found": "Organization '%s' not found.", - "team-name-not-found": "Team '%s' not found.", - "globalSearch-title": "Search All Boards", - "no-cards-found": "No Cards Found", - "one-card-found": "One Card Found", - "n-cards-found": "%s Cards Found", - "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", - "operator-board": "board", - "operator-board-abbrev": "b", - "operator-swimlane": "swimlane", - "operator-swimlane-abbrev": "s", - "operator-list": "list", - "operator-list-abbrev": "l", - "operator-label": "label", - "operator-label-abbrev": "#", - "operator-user": "user", - "operator-user-abbrev": "@", - "operator-member": "member", - "operator-member-abbrev": "m", - "operator-assignee": "assignee", - "operator-assignee-abbrev": "a", - "operator-creator": "creator", - "operator-status": "status", - "operator-due": "due", - "operator-created": "created", - "operator-modified": "modified", - "operator-sort": "sort", - "operator-comment": "comment", - "operator-has": "has", - "operator-limit": "limit", - "operator-debug": "debug", - "operator-org": "org", - "operator-team": "team", - "predicate-archived": "archived", - "predicate-open": "open", - "predicate-ended": "ended", - "predicate-all": "all", - "predicate-overdue": "overdue", - "predicate-week": "week", - "predicate-month": "month", - "predicate-quarter": "quarter", - "predicate-year": "year", - "predicate-due": "due", - "predicate-modified": "modified", - "predicate-created": "created", - "predicate-attachment": "attachment", - "predicate-description": "description", - "predicate-checklist": "checklist", - "predicate-start": "start", - "predicate-end": "end", - "predicate-assignee": "assignee", - "predicate-member": "member", - "predicate-public": "public", - "predicate-private": "private", - "predicate-selector": "selector", - "predicate-projection": "projection", - "operator-unknown-error": "%s is not an operator", - "operator-number-expected": "operator __operator__ expected a number, got '__value__'", - "operator-sort-invalid": "sort of '%s' is invalid", - "operator-status-invalid": "'%s' is not a valid status", - "operator-has-invalid": "%s is not a valid existence check", - "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", - "operator-debug-invalid": "%s is not a valid debug predicate", - "next-page": "Next Page", - "previous-page": "Previous Page", - "heading-notes": "Notes", - "globalSearch-instructions-heading": "Search Instructions", - "globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).", - "globalSearch-instructions-operators": "Available operators:", - "globalSearch-instructions-operator-board": "`__operator_board__:<title>` - cards in boards matching the specified *<title>*", - "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - cards in lists matching the specified *<title>*", - "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", - "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", - "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", - "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", - "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", - "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", - "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*", - "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", - "globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cards belonging to a board assigned to organization *<name>*", - "globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cards belonging to a board assigned to team *<name>*", - "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now. `__operator_due__:__predicate_overdue__ lists all cards past their due date.", - "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less", - "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less", - "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:", - "globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards", - "globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards", - "globalSearch-instructions-status-ended": "`__predicate_ended__` - cards with an end date", - "globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards", - "globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards", - "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`. Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).", - "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`. For a descending sort, place a `-` in front of the sort name.", - "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.", - "globalSearch-instructions-notes-1": "Multiple operators may be specified.", - "globalSearch-instructions-notes-2": "Similar operators are *OR*ed together. Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.", - "globalSearch-instructions-notes-3": "Differing operators are *AND*ed together. Only cards that match all of the differing operators are returned. `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.", - "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.", - "globalSearch-instructions-notes-4": "Text searches are case insensitive.", - "globalSearch-instructions-notes-5": "By default archived cards are not searched.", - "link-to-search": "Link to this search", - "excel-font": "Arial", - "number": "Number", - "label-colors": "Label Colors", - "label-names": "Label Names", - "archived-at": "archived at", - "sort-cards": "Sort Cards", - "sort-is-on": "Sort is on", - "cardsSortPopup-title": "Sort Cards", - "due-date": "Due Date", - "server-error": "Server Error", - "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", - "title-alphabetically": "Title (Alphabetically)", - "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)", - "links-heading": "Links", - "hide-activities-of-all-boards": "Don't show the board activities on all boards", - "now-activities-of-all-boards-are-hidden": "Now all activities of all boards are hidden", - "move-swimlane": "Move Swimlane", - "moveSwimlanePopup-title": "Move Swimlane", - "custom-field-stringtemplate": "String Template", - "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", - "custom-field-stringtemplate-separator": "Separator (use or   for a space)", - "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", - "creator": "Creator", - "creator-on-minicard": "Creator on minicard", - "filesReportTitle": "Files Report", - "reports": "Reports", - "rulesReportTitle": "Rules Report", - "boardsReportTitle": "Boards Report", - "cardsReportTitle": "Cards Report", - "copy-swimlane": "Copy Swimlane", - "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner", - "Bounce": "Bounce Wait Spinner", - "Cube": "Cube Wait Spinner", - "Cube-Grid": "Cube-Grid Wait Spinner", - "Dot": "Dot Wait Spinner", - "Double-Bounce": "Double Bounce Wait Spinner", - "Rotateplane": "Rotateplane Wait Spinner", - "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner", - "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card", - "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", - "subject": "Subject", - "details": "Details", - "carbon-copy": "Carbon Copy (Cc:)", - "ticket": "Ticket", - "tickets": "Tickets", - "ticket-number": "Ticket Number", - "open": "Open", - "pending": "Pending", - "closed": "Closed", - "resolved": "Resolved", - "cancelled": "Cancelled", - "history": "History", - "request": "Request", - "requests": "Requests", - "help-request": "Help Request", - "editCardSortOrderPopup-title": "Change Sorting", - "cardDetailsPopup-title": "Card Details", - "add-teams": "Add teams", - "add-teams-label": "Added teams are displayed below:", - "remove-team-from-table": "Are you sure you want to remove this team from the board ?", - "confirm-btn": "Confirm", - "remove-btn": "Remove", - "filter-card-title-label": "Filter by card title", - "invite-people-success": "Invitation to register sent with success", - "invite-people-error": "Error while sending invitation to register", - "can-invite-if-same-mailDomainName": "Email domain name", - "to-create-teams-contact-admin": "To create teams, please contact the administrator.", - "Node_heap_total_heap_size": "Node heap: total heap size", - "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", - "Node_heap_total_physical_size": "Node heap: total physical size", - "Node_heap_total_available_size": "Node heap: total available size", - "Node_heap_used_heap_size": "Node heap: used heap size", - "Node_heap_heap_size_limit": "Node heap: heap size limit", - "Node_heap_malloced_memory": "Node heap: malloced memory", - "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", - "Node_heap_does_zap_garbage": "Node heap: does zap garbage", - "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", - "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", - "Node_memory_usage_rss": "Node memory usage: resident set size", - "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", - "Node_memory_usage_heap_used": "Node memory usage: actual memory used", - "Node_memory_usage_external": "Node memory usage: external", - "add-organizations": "Add organizations", - "add-organizations-label": "Added organizations are displayed below:", - "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", - "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", - "custom-legal-notice-link-url": "Custom legal notice page URL", - "acceptance_of_our_legalNotice": "By continuing, you accept our", - "legalNotice": "legal notice", - "copied": "Copied!", - "checklistActionsPopup-title": "Checklist Actions", - "moveChecklist": "Move Checklist", - "moveChecklistPopup-title": "Move Checklist", - "newlineBecomesNewChecklistItem": "Each line of text becomes one of the checklist items", - "newLineNewItem": "One line of text = one checklist item", - "newlineBecomesNewChecklistItemOriginOrder": "Each line of text becomes one of the checklist items, original order", - "originOrder": "original order", - "copyChecklist": "Copy Checklist", - "copyChecklistPopup-title": "Copy Checklist", - "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions", - "attachmentActionsPopup-title": "Attachment Actions", - "attachment-move-storage-fs": "Move attachment to filesystem", - "attachment-move-storage-gridfs": "Move attachment to GridFS", - "attachment-move-storage-s3": "Move attachment to S3", - "attachment-move": "Move Attachment", - "move-all-attachments-to-fs": "Move all attachments to filesystem", - "move-all-attachments-to-gridfs": "Move all attachments to GridFS", - "move-all-attachments-to-s3": "Move all attachments to S3", - "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", - "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", - "move-all-attachments-of-board-to-s3": "Move all attachments of board to S3", - "path": "Path", - "version-name": "Version-Name", - "size": "Size", - "storage": "Storage", - "action": "Action", - "board-title": "Board Title", - "attachmentRenamePopup-title": "Rename", - "uploading": "Uploading", - "remaining_time": "Remaining time", - "speed": "Speed", - "progress": "Progress", - "password-again": "Password (again)", - "if-you-already-have-an-account": "If you already have an account", - "register": "Register", - "forgot-password": "Forgot password", - "minicardDetailsActionsPopup-title": "Card Details", - "Mongo_sessions_count": "Mongo sessions count", - "change-visibility": "Change Visibility", - "max-upload-filesize": "Max upload filesize in bytes:", - "allowed-upload-filetypes": "Allowed upload filetypes:", - "max-avatar-filesize": "Max avatar filesize in bytes:", - "allowed-avatar-filetypes": "Allowed avatar filetypes:", - "invalid-file": "If filename is invalid, upload or rename is cancelled.", - "preview-pdf-not-supported": "Your device does not support previewing PDF. Try downloading instead.", - "drag-board": "Drag board", - "translation-number": "The number of custom translation strings is:", - "delete-translation-confirm-popup": "Are you sure you want to delete this custom translation string? There is no undo.", - "newTranslationPopup-title": "New custom translation string", - "editTranslationPopup-title": "Edit custom translation string", - "settingsTranslationPopup-title": "Delete this custom translation string?", - "translation": "Translation", - "text": "Text", - "translation-text": "Translation text", - "show-subtasks-field": "Show subtasks field", - "show-week-of-year": "Show week of year (ISO 8601)", - "convert-to-markdown": "Convert to markdown", - "import-board-zip": "Add .zip file that has board JSON files, and board name subdirectories with attachments", - "collapse": "Collapse", - "uncollapse": "Uncollapse", - "hideCheckedChecklistItems": "Hide checked checklist items", - "hideAllChecklistItems": "Hide all checklist items", - "support": "Support", - "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", - "accessibility": "Accessibility", - "accessibility-page-enabled": "Accessibility page enabled", - "accessibility-info-not-added-yet": "Accessibility info has not been added yet", - "accessibility-title": "Accessibility title", - "accessibility-content": "Accessibility content", - "accounts-lockout-settings": "Brute Force Protection Settings", - "accounts-lockout-info": "These settings control how login attempts are protected against brute force attacks.", - "accounts-lockout-known-users": "Settings for known users (correct username, wrong password)", - "accounts-lockout-unknown-users": "Settings for unknown users (non-existent username)", - "accounts-lockout-failures-before": "Failures before lockout", - "accounts-lockout-period": "Lockout period (seconds)", - "accounts-lockout-failure-window": "Failure window (seconds)", - "accounts-lockout-settings-updated": "Brute force protection settings have been updated", - "accounts-lockout-locked-users": "Locked Users", - "accounts-lockout-locked-users-info": "Users currently locked out due to too many failed login attempts", - "accounts-lockout-no-locked-users": "There are currently no locked users", - "accounts-lockout-failed-attempts": "Failed Attempts", - "accounts-lockout-remaining-time": "Remaining Time", - "accounts-lockout-user-unlocked": "User has been unlocked successfully", - "accounts-lockout-confirm-unlock": "Are you sure you want to unlock this user?", - "accounts-lockout-confirm-unlock-all": "Are you sure you want to unlock all locked users?", - "accounts-lockout-show-locked-users": "Show locked users only", - "accounts-lockout-user-locked": "User is locked", - "accounts-lockout-click-to-unlock": "Click to unlock this user", - "accounts-lockout-status": "Status", - "admin-people-filter-show": "Show:", - "admin-people-filter-all": "All Users", - "admin-people-filter-locked": "Locked Users Only", - "admin-people-filter-active": "Active", - "admin-people-filter-inactive": "Not Active", - "admin-people-active-status": "Active Status", - "admin-people-user-active": "User is active - click to deactivate", - "admin-people-user-inactive": "User is inactive - click to activate", - "accounts-lockout-all-users-unlocked": "All locked users have been unlocked", - "accounts-lockout-unlock-all": "Unlock All", - "active-cron-jobs": "Active Scheduled Jobs", - "add-cron-job": "Add Scheduled Job", - "add-cron-job-placeholder": "Add Scheduled Job functionality coming soon", - "attachment-storage-configuration": "Attachment Storage Configuration", - "attachments-path": "Attachments Path", - "attachments-path-description": "Path where attachment files are stored", - "avatars-path": "Avatars Path", - "avatars-path-description": "Path where avatar files are stored", - "board-archive-failed": "Failed to schedule board archive", - "board-archive-scheduled": "Board archive scheduled successfully", - "board-backup-failed": "Failed to schedule board backup", - "board-backup-scheduled": "Board backup scheduled successfully", - "board-cleanup-failed": "Failed to schedule board cleanup", - "board-cleanup-scheduled": "Board cleanup scheduled successfully", - "board-operations": "Board Operations", - "cron-jobs": "Scheduled Jobs", - "cron-migrations": "Scheduled Migrations", - "cron-job-delete-confirm": "Are you sure you want to delete this scheduled job?", - "cron-job-delete-failed": "Failed to delete scheduled job", - "cron-job-deleted": "Scheduled job deleted successfully", - "cron-job-pause-failed": "Failed to pause scheduled job", - "cron-job-paused": "Scheduled job paused successfully", - "filesystem-path-description": "Base path for file storage", - "gridfs-enabled": "GridFS Enabled", - "gridfs-enabled-description": "Use MongoDB GridFS for file storage", - "migration-pause-failed": "Failed to pause migrations", - "migration-paused": "Migrations paused successfully", - "migration-progress": "Migration Progress", - "migration-start-failed": "Failed to start migrations", - "migration-started": "Migrations started successfully", - "migration-status": "Migration Status", - "migration-stop-confirm": "Are you sure you want to stop all migrations?", - "migration-stop-failed": "Failed to stop migrations", - "migration-stopped": "Migrations stopped successfully", - "mongodb-gridfs-storage": "MongoDB GridFS Storage", - "pause-all-migrations": "Pause All Migrations", - "s3-access-key": "S3 Access Key", - "s3-access-key-description": "AWS S3 access key for authentication", - "s3-access-key-placeholder": "Enter S3 access key", - "s3-bucket": "S3 Bucket", - "s3-bucket-description": "S3 bucket name for storing files", - "s3-connection-failed": "S3 connection failed", - "s3-connection-success": "S3 connection successful", - "s3-enabled": "S3 Enabled", - "s3-enabled-description": "Use AWS S3 or MinIO for file storage", - "s3-endpoint": "S3 Endpoint", - "s3-endpoint-description": "S3 endpoint URL (e.g., s3.amazonaws.com or minio.example.com)", - "s3-minio-storage": "S3/MinIO Storage", - "s3-port": "S3 Port", - "s3-port-description": "S3 endpoint port number", - "s3-region": "S3 Region", - "s3-region-description": "AWS S3 region (e.g., us-east-1)", - "s3-secret-key": "S3 Secret Key", - "s3-secret-key-description": "AWS S3 secret key for authentication", - "s3-secret-key-placeholder": "Enter S3 secret key", - "s3-secret-key-required": "S3 secret key is required", - "s3-settings-save-failed": "Failed to save S3 settings", - "s3-settings-saved": "S3 settings saved successfully", - "s3-ssl-enabled": "S3 SSL Enabled", - "s3-ssl-enabled-description": "Use SSL/TLS for S3 connections", - "save-s3-settings": "Save S3 Settings", - "schedule-board-archive": "Schedule Board Archive", - "schedule-board-backup": "Schedule Board Backup", - "schedule-board-cleanup": "Schedule Board Cleanup", - "scheduled-board-operations": "Scheduled Board Operations", - "start-all-migrations": "Start All Migrations", - "stop-all-migrations": "Stop All Migrations", - "test-s3-connection": "Test S3 Connection", - "writable-path": "Writable Path", - "writable-path-description": "Base directory path for file storage", - "add-job": "Add Job", - "attachment-migration": "Attachment Migration", - "attachment-monitoring": "Attachment Monitoring", - "attachment-settings": "Attachment Settings", - "attachment-storage-settings": "Storage Settings", - "automatic-migration": "Automatic Migration", - "back-to-settings": "Back to Settings", - "board-id": "Board ID", - "board-migration": "Board Migration", - "board-migrations": "Board Migrations", - "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", - "cleanup": "Cleanup", - "cleanup-old-jobs": "Cleanup Old Jobs", - "completed": "Completed", - "conversion-info-text": "This conversion is performed once per board and improves performance. You can continue using the board normally.", - "converting-board": "Converting Board", - "converting-board-description": "Converting board structure for improved functionality. This may take a few moments.", - "cpu-cores": "CPU Cores", - "cpu-usage": "CPU Usage", - "current-action": "Current Action", - "database-migration": "Database Migration", - "database-migration-description": "Updating database structure for improved functionality and performance. This process may take several minutes.", - "database-migrations": "Database Migrations", - "days-old": "Days Old", - "duration": "Duration", - "errors": "Errors", - "estimated-time-remaining": "Estimated time remaining", - "every-1-day": "Every 1 day", - "every-1-hour": "Every 1 hour", - "every-1-minute": "Every 1 minute", - "every-10-minutes": "Every 10 minutes", - "every-30-minutes": "Every 30 minutes", - "every-5-minutes": "Every 5 minutes", - "every-6-hours": "Every 6 hours", - "export-monitoring": "Export Monitoring", - "filesystem-attachments": "Filesystem Attachments", - "filesystem-size": "Filesystem Size", - "filesystem-storage": "Filesystem Storage", - "force-board-scan": "Force Board Scan", - "gridfs-attachments": "GridFS Attachments", - "gridfs-size": "GridFS Size", - "gridfs-storage": "GridFS", - "hide-list-on-minicard": "Hide List on Minicard", - "idle-migration": "Idle Migration", - "job-description": "Job Description", - "job-details": "Job Details", - "job-name": "Job Name", - "job-queue": "Job Queue", - "last-run": "Last Run", - "max-concurrent": "Max Concurrent", - "memory-usage": "Memory Usage", - "migrate-all-to-filesystem": "Migrate All to Filesystem", - "migrate-all-to-gridfs": "Migrate All to GridFS", - "migrate-all-to-s3": "Migrate All to S3", - "migrated-attachments": "Migrated Attachments", - "migration-batch-size": "Batch Size", - "migration-batch-size-description": "Number of attachments to process in each batch (1-100)", - "migration-cpu-threshold": "CPU Threshold (%)", - "migration-cpu-threshold-description": "Pause migration when CPU usage exceeds this percentage (10-90)", - "migration-delay-ms": "Delay (ms)", - "migration-delay-ms-description": "Delay between batches in milliseconds (100-10000)", - "migration-detector": "Migration Detector", - "migration-info-text": "Database migrations are performed once and improve system performance. The process continues in the background even if you close your browser.", - "migration-log": "Migration Log", - "migration-markers": "Migration Markers", - "migration-resume-failed": "Failed to resume migration", - "migration-resumed": "Migration resumed", - "migration-steps": "Migration Steps", - "migration-warning-text": "Please do not close your browser during migration. The process will continue in the background but may take longer to complete.", - "monitoring-export-failed": "Failed to export monitoring data", - "monitoring-refresh-failed": "Failed to refresh monitoring data", - "next": "Next", - "next-run": "Next Run", - "of": "of", - "operation-type": "Operation Type", - "overall-progress": "Overall Progress", - "page": "Page", - "pause": "Pause", - "pause-migration": "Pause Migration", - "previous": "Previous", - "refresh": "Refresh", - "refresh-monitoring": "Refresh Monitoring", - "remaining-attachments": "Remaining Attachments", - "resume-migration": "Resume Migration", - "run-once": "Run once", - "s3-attachments": "S3 Attachments", - "s3-size": "S3 Size", - "s3-storage": "S3", - "scanning-status": "Scanning Status", - "schedule": "Schedule", - "search-boards-or-operations": "Search boards or operations...", - "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", - "showing": "Showing", - "start-test-operation": "Start Test Operation", - "start-time": "Start Time", - "step-progress": "Step Progress", - "stop-migration": "Stop Migration", - "storage-distribution": "Storage Distribution", - "system-resources": "System Resources", - "total-attachments": "Total Attachments", - "total-operations": "Total Operations", - "total-size": "Total Size", - "unmigrated-boards": "Unmigrated Boards", - "weight": "Weight", - "idle": "Idle", - "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" -} diff --git a/imports/i18n/data/sk.i18n.json b/imports/i18n/data/sk.i18n.json index 859970ef8..0592a3d72 100644 --- a/imports/i18n/data/sk.i18n.json +++ b/imports/i18n/data/sk.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Pridať prílohu", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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": "Vytvoriť", "createBoardPopup-title": "Vytvoriť nástenku", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Vytvoriť štítok", "createCustomField": "Vytvoriť pole", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Dátum", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Zmazať", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Členovia", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Zmazať nástenku?", "delete-board": "Zmazať nástenku", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Nástenka '%s' sa nenašla.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/sl.i18n.json b/imports/i18n/data/sl.i18n.json index d2b566da0..c494c3211 100644 --- a/imports/i18n/data/sl.i18n.json +++ b/imports/i18n/data/sl.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "izbrisal komentar %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Predloge", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Dodaj priponko", @@ -328,16 +316,10 @@ "comment-placeholder": "Napiši komentar", "comment-only": "Samo komentar", "comment-only-desc": "Lahko komentirate samo na karticah.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "Ni komentarjev", "no-comments-desc": "Ne morete videti komentarjev in dejavnosti.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Delavec", "worker-desc": "Lahko samo premikam kartice, se dodelim na kartico in komentiram.", "computer": "Računalnik", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Kopiraj povezavo kartice na odložišče", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Poveži kartico", @@ -356,7 +337,6 @@ "copyManyCardsPopup-format": "[ {\"naslov\": \"Naslov prve kartice\", \"opis\":\"Opis prve kartice\"}, {\"naslov\":\"Opis druge kartice\",\"opis\":\"Opis druge kartice\"},{\"naslov\":\"Naslov zadnje kartice\",\"opis\":\"Opis zadnje kartice\"} ]", "create": "Ustvari", "createBoardPopup-title": "Ustvari tablo", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Uvozi tablo", "createLabelPopup-title": "Ustvari oznako", "createCustomField": "Ustvari polje", @@ -377,9 +357,9 @@ "custom-fields": "Poljubna polja", "date": "Datum", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Zavrni", "default-avatar": "Privzeti avatar", "delete": "Briši", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Uredi obvestilo", "editProfilePopup-title": "Uredi profil", "email": "E-pošta", - "email-address": "Email Address", "email-enrollAccount-subject": "Up. račun ustvarjen za vas na __siteName__", "email-enrollAccount-text": "Pozdravljeni __user__,\n\nZa začetek uporabe kliknite spodnjo povezavo.\n\n__url__\n\nHvala.", "email-fail": "Pošiljanje e-pošte ni uspelo", @@ -554,7 +533,6 @@ "log-in": "Prijava", "loginPopup-title": "Prijava", "memberMenuPopup-title": "Nastavitve članov", - "grey-icons": "Grey Icons", "members": "Člani", "menu": "Meni", "move-selection": "Premakni izbiro", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Premakni na dno", "moveCardToTop-title": "Premakni na vrh", "moveSelectionPopup-title": "Premakni izbiro", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Izbira", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "Ni zadetkov", "normal": "Normalno", "normal-desc": "Lahko gleda in ureja kartice. Ne more spreminjati nastavitev.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Povabilo še ni sprejeto.", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Prejemajte posodobitve opazovanih tabel, seznamov ali kartic", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Spremeni datum prejema", "editCardEndDatePopup-title": "Spremeni končni datum", "setCardColorPopup-title": "Nastavi barvo", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Izberi barvo", "setSwimlaneColorPopup-title": "Izberi barvo", "setListColorPopup-title": "Izberi barvo", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "Vsi seznami, kartice, oznake in dejavnosti bodo izbrisani in vsebine table ne boste mogli obnoviti. Razveljavitve ni.", "boardDeletePopup-title": "Izbriši tablo?", "delete-board": "Izbriši tablo", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Podopravila za tablo", "default": "Privzeto", "defaultdefault": "Privzeto", @@ -790,7 +761,7 @@ "subtask-settings": "Nastavitve podopravil", "card-settings": "Nastavitve kartice", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Nastavitve podopravil", + "boardSubtaskSettingsPopup-title": "Nastavitve podopravil table", "boardCardSettingsPopup-title": "Nastavitve kartice", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deponiraj podopravila na tablo:", @@ -828,7 +799,7 @@ "r-trigger": "Trigger", "r-action": "Action", "r-when-a-card": "Ko je kartica", - "r-is": "is", + "r-is": " ", "r-is-moved": "premaknjena", "r-added-to": "Added to", "r-removed-from": "izbrisan iz", @@ -961,8 +932,6 @@ "a-endAt": "spremenil končni čas v", "a-startAt": "spremenil začetni čas v", "a-receivedAt": "spremenil čas prejetja v", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "trenutni rok %s se približuje", "pastdue": "trenutni rok %s je potekel", "duenow": "trenutni rok %s je danes", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Dostopnost", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "zaključen", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/sl_SI.i18n.json b/imports/i18n/data/sl_SI.i18n.json deleted file mode 100644 index d2b566da0..000000000 --- a/imports/i18n/data/sl_SI.i18n.json +++ /dev/null @@ -1,1605 +0,0 @@ -{ - "accept": "Sprejmi", - "act-activity-notify": "Activity Notification", - "act-addAttachment": "dodal priponko __attachment__ h kartici __card__ na seznamu __list__ na plavalni stezi __swimlane__ na tabli __board__", - "act-deleteAttachment": "odstranil priponko __attachment__ iz kartice __card__ na seznamu __list__ na plavalni stezi __swimlane__ na tabli __board__", - "act-addSubtask": "dodal podopravilo __subtask__ h kartici __card__ na seznamu __list__ na plavalni stezi __swimlane__ na tabli __board__", - "act-addLabel": "Dodal oznako __label__ h kartici __card__ na seznamu __list__ na plavalni stezi __swimlane__ na tabli __board__", - "act-addedLabel": "Dodal oznako __label__ h kartici __card__ na seznamu __list__ na plavalni stezi __swimlane__ na tabli __board__", - "act-removeLabel": "Odstranil oznako __label__ iz kartice __card__ na seznamu __list__ na plavalni stezi __swimlane__ na tabli __board__", - "act-removedLabel": "Odstranil oznako __label__ iz kartice __card__ na seznamu __list__ na plavalni stezi __swimlane__ na tabli __board__", - "act-addChecklist": "dodal kontrolni seznam __checklist__ h kartici __card__ na seznamu __list__ na plavalni stezi __swimlane__ na tabli __board__", - "act-addChecklistItem": "dodal postavko __checklistItem__ kontrolnega seznama __checklist__ na kartici __card__ na seznamu __list__ na plavalni stezi __swimlane__ na tabli __board__", - "act-removeChecklist": "odstranil kontrolni seznam __checklist__ iz kartice __card__ na seznamu __list__ na plavalni stezi __swimlane__ na tabli __board__", - "act-removeChecklistItem": "odstranil postavko __checklistItem__ kontrolnega seznama __checklist__ na kartici __card__ na seznamu __list__ na plavalni stezi __swimlane__ na tabli __board__", - "act-checkedItem": "obkljukal postavko __checklistItem__ kontrolnega seznama __checklist__ na kartici __card__ na seznamu __list__ na plavalni stezi __swimlane__ na tabli __board__", - "act-uncheckedItem": "odkljukal postavko __checklistItem__ kontrolnega seznama __checklist__ na kartici __card__ na seznamu __list__ na plavalni stezi __swimlane__ na tabli __board__", - "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-uncompleteChecklist": "nedokončan kontrolni seznam __checklist__ na kartici __card__ na seznamu __list__ na plavalni stezi __swimlane__ na tabli __board__", - "act-addComment": "komentiral na kartici __card__: __comment__ na seznamu __list__ na plavalni stezi __swimlane__ na tabli __board__", - "act-editComment": "uredil komentar na kartici __card__: __comment__ na seznamu __list__ na plavalni stezi __swimlane__ na tabli __board__", - "act-deleteComment": "izbrisal komentar na kartici __card__: __comment__ na seznamu __list__ na plavalni stezi __swimlane__ na tabli __board__", - "act-createBoard": "ustvaril tablo __board__", - "act-createSwimlane": "ustvaril plavalno stezo __swimlane__ na tabli __board__", - "act-createCard": "ustvaril kartico __card__ na seznamu __list__ na plavalni stezi __swimlane__ na tabli __board__", - "act-createCustomField": "ustvaril poljubno polje __customField__ na tabli __board__", - "act-deleteCustomField": "izbrisal poljubno polje __customField__ na tabli __board__", - "act-setCustomField": "uredil poljubno polje __customField__: __customFieldValue__ na kartici __card__ na seznamu __list__ na plavalni stezi __swimlane__ na tabli __board__", - "act-createList": "dodal seznam __list__ na tablo __board__", - "act-addBoardMember": "dodal člana __member__ k tabli __board__", - "act-archivedBoard": "Tabla __board__ premaknjena v arhiv", - "act-archivedCard": "Kartica __card__ na seznamu __list__ na plavalni stezi __swimlane__ na tabli __board__ premaknjena v arhiv", - "act-archivedList": "Seznam __list__ na plavalni stezi __swimlane__ na tabli __board__ premaknjen v arhiv", - "act-archivedSwimlane": "Plavalna steza __swimlane__ na tabli __board__ premaknjena v arhiv", - "act-importBoard": "uvozil tablo __board__", - "act-importCard": "uvozil kartico __card__ na seznam __list__ na plavalni stezi __swimlane__ na tabli __board__", - "act-importList": "uvozil seznam __list__ na plavalni stezi __swimlane__ na tabli __board__", - "act-joinMember": "dodal član __member__ h kartici __card__ na seznamu __list__ na plavalni stezi __swimlane__ na tabli __board__", - "act-moveCard": "premakil kartico __card__ na tabli __board__ iz seznama __oldList__ na plavalni stezi __oldSwimlane__ na seznam __list__ na plavalni stezi __swimlane__", - "act-moveCardToOtherBoard": "premaknil kartico __card__ iz seznama __oldList__ na plavalni stezi __oldSwimlane__ na tabli __oldBoard__ na seznam __list__ na plavalni stezi __swimlane__ na tabli __board__", - "act-removeBoardMember": "odstranil člana __member__ iz table __board__", - "act-restoredCard": "obnovil kartico __card__ na seznam __list__ na plavalni stezi __swimlane__ na tabli __board__", - "act-unjoinMember": "odstranil člana __member__ iz kartice __card__ na seznamu __list__ na plavalni stezi __swimlane__ na tabli __board__", - "act-withBoardTitle": "__board__", - "act-withCardTitle": "[__board__] __card__", - "actions": "Dejanja", - "activities": "Aktivnosti", - "activity": "Aktivnost", - "activity-added": "dodal %s v %s", - "activity-archived": "%s premaknjeno v arhiv", - "activity-attached": "pripel %s v %s", - "activity-created": "ustvaril %s", - "activity-changedListTitle": "renamed list to %s", - "activity-customfield-created": "ustvaril poljubno polje%s", - "activity-excluded": "izključil %s iz %s", - "activity-imported": "uvozil %s v %s iz %s", - "activity-imported-board": "uvozil %s iz %s", - "activity-joined": "se je pridružil na %s", - "activity-moved": "premakil %s iz %s na %s", - "activity-on": "na %s", - "activity-removed": "odstranil %s iz %s", - "activity-sent": "poslano %s na %s", - "activity-unjoined": "se je odjavil iz %s", - "activity-subtask-added": "dodal podopravilo k %s", - "activity-checked-item": "obkljukal %s na kontrolnem seznamu %s od %s", - "activity-unchecked-item": "odkljukal %s na kontrolnem seznamu %s od %s", - "activity-checklist-added": "dodal kontrolni seznam na %s", - "activity-checklist-removed": "odstranil kontrolni seznam iz %s", - "activity-checklist-completed": "dokončan kontrolni seznam %s od %s", - "activity-checklist-uncompleted": "nedokončal kontrolni seznam %s od %s", - "activity-checklist-item-added": "dodal postavko kontrolnega seznama na '%s' v %s", - "activity-checklist-item-removed": "odstranil postavko kontrolnega seznama iz '%s' v %s", - "add": "Dodaj", - "activity-checked-item-card": "obkljukal %s na kontrolnem seznamu %s", - "activity-unchecked-item-card": "odkljukal %s na kontrolnem seznamu %s", - "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "activity-checklist-uncompleted-card": "nedokončal kontrolni seznam %s", - "activity-editComment": "uredil komentar %s", - "activity-deleteComment": "izbrisal komentar %s", - "activity-receivedDate": "edited received date to %s of %s", - "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Predloge", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", - "activity-dueDate": "edited due date to %s of %s", - "activity-endDate": "edited end date to %s of %s", - "add-attachment": "Dodaj priponko", - "add-board": "Dodaj tablo", - "add-template": "Add Template", - "add-card": "Dodaj kartico", - "add-card-to-top-of-list": "Add Card to Top of List", - "add-card-to-bottom-of-list": "Add Card to Bottom of List", - "setListWidthPopup-title": "Set Widths", - "set-list-width": "Set Widths", - "set-list-width-value": "Set Min & Max Widths (pixels)", - "list-width-error-message": "List widths must be integers greater than 100", - "keyboard-shortcuts-enabled": "Keyboard shortcuts enabled. Click to disable.", - "keyboard-shortcuts-disabled": "Keyboard shortcuts disabled. Click to enable.", - "setSwimlaneHeightPopup-title": "Set Swimlane Height", - "set-swimlane-height": "Set Swimlane Height", - "set-swimlane-height-value": "Swimlane Height (pixels)", - "swimlane-height-error-message": "Swimlane height must be a positive integer", - "add-swimlane": "Dodaj plavalno stezo", - "add-subtask": "Dodaj podopravilo", - "add-checklist": "Dodaj kontrolni seznam", - "add-checklist-item": "Dodaj postavko na kontrolni seznam", - "close-add-checklist-item": "Close add an item to checklist form", - "close-edit-checklist-item": "Close edit an item to checklist form", - "convertChecklistItemToCardPopup-title": "Convert to Card", - "add-cover": "Add cover image to minicard", - "add-label": "Dodaj oznako", - "add-list": "Dodaj seznam", - "add-after-list": "Add After List", - "add-members": "Dodaj člane", - "added": "Dodano", - "addMemberPopup-title": "Člani", - "memberPopup-title": "Nastavitve članov", - "admin": "Administrator", - "admin-desc": "Lahko gleda in ureja kartice, odstrani člane ter spreminja nastavitve table.", - "admin-announcement": "Najava", - "admin-announcement-active": "Aktivna vse-sistemska najava", - "admin-announcement-title": "Najava od administratorja", - "all-boards": "Vse table", - "and-n-other-card": "In __count__ druga kartica", - "and-n-other-card_plural": "In __count__ drugih kartic", - "apply": "Uporabi", - "app-is-offline": "Nalaganje, prosimo počakajte. Osveževanje strani bo povzročilo izgubo podatkov. Če nalaganje ne deluje, preverite, ali se strežnik ni ustavil.", - "app-try-reconnect": "Try to reconnect.", - "archive": "premaknjena v arhiv", - "archive-all": "Premakni vse v arhiv", - "archive-board": "Arhiviraj tablo", - "archive-board-confirm": "Are you sure you want to archive this board?", - "archive-card": "Arhiviraj kartico", - "archive-list": "Arhiviraj seznam", - "archive-swimlane": "Arhiviraj plavalno stezo", - "archive-selection": "Arhiviraj označeno", - "archiveBoardPopup-title": "Arhiviraj tablo?", - "archived-items": "Arhiv", - "archived-boards": "Table v arhivu", - "restore-board": "Obnovi tablo", - "no-archived-boards": "Nobene table ni v arhivu.", - "archives": "Arhiv", - "template": "Predloga", - "templates": "Predloge", - "template-container": "Template Container", - "add-template-container": "Add Template Container", - "assign-member": "Dodeli člana", - "attached": "pripeto", - "attachment": "Priponka", - "attachment-delete-pop": "Brisanje priponke je trajno. Ne obstaja razveljavitev.", - "attachmentDeletePopup-title": "Briši priponko?", - "attachments": "Priponke", - "auto-watch": "Samodejno spremljaj ustvarjene table", - "avatar-too-big": "The avatar is too large (__size__ max)", - "back": "Nazaj", - "board-change-color": "Spremeni barvo", - "board-change-background-image": "Change Background Image", - "board-background-image-url": "Background Image URL", - "add-background-image": "Add Background Image", - "remove-background-image": "Remove Background Image", - "show-at-all-boards-page" : "Show at All Boards page", - "board-info-on-my-boards" : "All Boards Settings", - "boardInfoOnMyBoardsPopup-title" : "All Boards Settings", - "boardInfoOnMyBoards-title": "All Boards Settings", - "show-card-counter-per-list": "Show card count per list", - "show-board_members-avatar": "Show Board members avatars", - "board-nb-stars": "%s zvezdic", - "board-not-found": "Tabla ni najdena", - "board-private-info": "Ta tabla bo <strong>privatna</strong>.", - "board-public-info": "Ta tabla bo <strong>javna</strong>.", - "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", - "boardChangeColorPopup-title": "Spremeni ozadje table", - "boardChangeBackgroundImagePopup-title": "Change Background Image", - "allBoardsChangeColorPopup-title": "Spremeni barvo", - "allBoardsChangeBackgroundImagePopup-title": "Change Background Image", - "boardChangeTitlePopup-title": "Preimenuj tablo", - "boardChangeVisibilityPopup-title": "Spremeni vidnost", - "boardChangeWatchPopup-title": "Spremeni opazovanje", - "boardMenuPopup-title": "Nastavitve table", - "allBoardsMenuPopup-title": "Nastavitve", - "boardChangeViewPopup-title": "Pogled table", - "boards": "Table", - "board-view": "Pogled table", - "desktop-mode": "Desktop Mode", - "mobile-mode": "Mobile Mode", - "mobile-desktop-toggle": "Toggle between Mobile and Desktop Mode", - "zoom-in": "Zoom In", - "zoom-out": "Zoom Out", - "click-to-change-zoom": "Click to change zoom level", - "zoom-level": "Zoom Level", - "enter-zoom-level": "Enter zoom level (50-300%):", - "board-view-cal": "Koledar", - "board-view-swimlanes": "Plavalne steze", - "board-view-collapse": "Skrči", - "board-view-gantt": "Gantt", - "board-view-lists": "Seznami", - "bucket-example": "Like \"Bucket List\" for example", - "calendar-previous-month-label": "Previous Month", - "calendar-next-month-label": "Next Month", - "cancel": "Prekliči", - "card-archived": "Kartica je premaknjena v arhiv.", - "board-archived": "Tabla je premaknjena v arhiv.", - "card-comments-title": "Ta kartica ima %s komentar.", - "card-delete-notice": "Brisanje je trajno. Izgubili boste vsa dejanja, povezana s kartico.", - "card-delete-pop": "Vsa dejanja bodo odstranjena iz zgodovine dejavnosti. Kartice ne boste mogli znova odpreti. Razveljavitve ni.", - "card-delete-suggest-archive": "Kartico lahko premaknete v arhiv, da jo odstranite s table in ohranite dejavnost.", - "card-archive-pop": "Card will not be visible at this list after archiving card.", - "card-archive-suggest-cancel": "You can later restore card from Archive.", - "card-due": "Due", - "card-due-on": "Rok", - "card-spent": "Porabljen čas", - "card-edit-attachments": "Uredi priponke", - "card-edit-custom-fields": "Uredi poljubna polja", - "card-edit-labels": "Uredi oznake", - "card-edit-members": "Uredi člane", - "card-labels-title": "Spremeni oznake za kartico.", - "card-members-title": "Dodaj ali odstrani člane table iz kartice.", - "card-start": "Začetek", - "card-start-on": "Začne ob", - "cardAttachmentsPopup-title": "Pripni od", - "cardCustomField-datePopup-title": "Spremeni datum", - "cardCustomFieldsPopup-title": "Uredi poljubna polja", - "cardStartVotingPopup-title": "Start a vote", - "positiveVoteMembersPopup-title": "Proponents", - "negativeVoteMembersPopup-title": "Opponents", - "card-edit-voting": "Edit voting", - "editVoteEndDatePopup-title": "Change vote end date", - "allowNonBoardMembers": "Allow all logged in users", - "vote-question": "Voting question", - "vote-public": "Show who voted what", - "vote-for-it": "for it", - "vote-against": "against", - "deleteVotePopup-title": "Delete vote?", - "vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.", - "cardStartPlanningPokerPopup-title": "Start a Planning Poker", - "card-edit-planning-poker": "Edit Planning Poker", - "editPokerEndDatePopup-title": "Change Planning Poker vote end date", - "poker-question": "Planning Poker", - "poker-one": "1", - "poker-two": "2", - "poker-three": "3", - "poker-five": "5", - "poker-eight": "8", - "poker-thirteen": "13", - "poker-twenty": "20", - "poker-forty": "40", - "poker-oneHundred": "100", - "poker-unsure": "?", - "poker-finish": "Finish", - "poker-result-votes": "Votes", - "poker-result-who": "Who", - "poker-replay": "Replay", - "set-estimation": "Set Estimation", - "deletePokerPopup-title": "Delete planning poker?", - "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", - "cardDeletePopup-title": "Briši kartico?", - "cardArchivePopup-title": "Archive Card?", - "cardDetailsActionsPopup-title": "Dejanja kartice", - "cardLabelsPopup-title": "Oznake", - "cardMembersPopup-title": "Člani", - "cardMorePopup-title": "Več", - "cardTemplatePopup-title": "Ustvari predlogo", - "cards": "Kartic", - "cards-count": "Kartic", - "cards-count-one": "Kartica", - "casSignIn": "Vpiši se s CAS", - "cardType-card": "Kartica", - "cardType-linkedCard": "Povezana kartica", - "cardType-linkedBoard": "Povezana tabla", - "change": "Spremeni", - "change-avatar": "Spremeni avatar", - "change-password": "Spremeni geslo", - "change-permissions": "Spremeni dovoljenja", - "change-settings": "Spremeni nastavitve", - "changeAvatarPopup-title": "Spremeni avatar", - "changeLanguagePopup-title": "Spremeni jezik", - "changePasswordPopup-title": "Spremeni geslo", - "changePermissionsPopup-title": "Spremeni dovoljenja", - "changeSettingsPopup-title": "Spremeni nastavitve", - "subtasks": "Podopravila", - "checklists": "Kontrolni seznami", - "click-to-star": "Kliknite, da označite tablo z zvezdico.", - "click-to-unstar": "Kliknite, da odznačite tablo z zvezdico.", - "click-to-enable-auto-width": "Auto list width disabled. Click to enable.", - "click-to-disable-auto-width": "Auto list width enabled. Click to disable.", - "auto-list-width": "Auto list width", - "clipboard": "Odložišče ali povleci & spusti", - "close": "Zapri", - "close-board": "Zapri tablo", - "close-board-pop": "Tablo boste lahko obnovili s klikom na gumb »Arhiviraj« na vstopni strani.", - "close-card": "Close Card", - "color-black": "črna", - "color-blue": "modra", - "color-crimson": "temno rdeča", - "color-darkgreen": "temno zelena", - "color-gold": "zlata", - "color-gray": "siva", - "color-green": "zelena", - "color-indigo": "indigo", - "color-lime": "limeta", - "color-magenta": "magenta", - "color-mistyrose": "rožnata", - "color-navy": "navy modra", - "color-orange": "oranžna", - "color-paleturquoise": "bledo turkizna", - "color-peachpuff": "breskvasta", - "color-pink": "roza", - "color-plum": "slivova", - "color-purple": "vijolična", - "color-red": "rdeča", - "color-saddlebrown": "rjava", - "color-silver": "srebrna", - "color-sky": "nebesna", - "color-slateblue": "skrilasto modra", - "color-white": "bela", - "color-yellow": "rumena", - "unset-color": "Onemogoči", - "comments": "Comments", - "comment": "Komentiraj", - "comment-placeholder": "Napiši komentar", - "comment-only": "Samo komentar", - "comment-only-desc": "Lahko komentirate samo na karticah.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", - "comment-delete": "Are you sure you want to delete the comment?", - "deleteCommentPopup-title": "Delete comment?", - "no-comments": "Ni komentarjev", - "no-comments-desc": "Ne morete videti komentarjev in dejavnosti.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", - "worker": "Delavec", - "worker-desc": "Lahko samo premikam kartice, se dodelim na kartico in komentiram.", - "computer": "Računalnik", - "confirm-subtask-delete-popup": "Ste prepričani, da želite izbrisati podopravilo?", - "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", - "subtaskDeletePopup-title": "Delete Subtask?", - "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", - "copy-card-link-to-clipboard": "Kopiraj povezavo kartice na odložišče", - "copy-text-to-clipboard": "Copy text to clipboard", - "linkCardPopup-title": "Poveži kartico", - "searchElementPopup-title": "Išči", - "copyCardPopup-title": "Kopiraj kartico", - "copyManyCardsPopup-title": "Copy Template to Many Cards", - "copyManyCardsPopup-instructions": "Naslovi ciljnih kartic in opisi v JSON formatu", - "copyManyCardsPopup-format": "[ {\"naslov\": \"Naslov prve kartice\", \"opis\":\"Opis prve kartice\"}, {\"naslov\":\"Opis druge kartice\",\"opis\":\"Opis druge kartice\"},{\"naslov\":\"Naslov zadnje kartice\",\"opis\":\"Opis zadnje kartice\"} ]", - "create": "Ustvari", - "createBoardPopup-title": "Ustvari tablo", - "createTemplateContainerPopup-title": "Add Template Container", - "chooseBoardSourcePopup-title": "Uvozi tablo", - "createLabelPopup-title": "Ustvari oznako", - "createCustomField": "Ustvari polje", - "createCustomFieldPopup-title": "Ustvari polje", - "current": "trenutno", - "custom-field-delete-pop": "Razveljavitve ni. To bo odstranilo to poljubno polje iz vseh kartic in izbrisalo njegovo zgodovino.", - "custom-field-checkbox": "Potrditveno polje", - "custom-field-currency": "Currency", - "custom-field-currency-option": "Currency Code", - "custom-field-date": "Datum", - "custom-field-dropdown": "Spustni seznam", - "custom-field-dropdown-none": "(nobeno)", - "custom-field-dropdown-options": "Možnosti seznama", - "custom-field-dropdown-options-placeholder": "Pritisnite enter da dodate več možnosti", - "custom-field-dropdown-unknown": "(neznano)", - "custom-field-number": "Število", - "custom-field-text": "Besedilo", - "custom-fields": "Poljubna polja", - "date": "Datum", - "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", - "decline": "Zavrni", - "default-avatar": "Privzeti avatar", - "delete": "Briši", - "deleteCustomFieldPopup-title": "Briši poljubno polje?", - "deleteLabelPopup-title": "Briši oznako?", - "description": "Opis", - "disambiguateMultiLabelPopup-title": "Razdvoji Dejanje Oznake", - "disambiguateMultiMemberPopup-title": "Razdvoji dejanje člana", - "discard": "Razveljavi", - "done": "Končano", - "download": "Prenos", - "edit": "Uredi", - "edit-avatar": "Spremeni avatar", - "edit-profile": "Uredi profil", - "edit-wip-limit": "Uredi omejitev št. kartic", - "soft-wip-limit": "Omehčaj omejitev št. kartic", - "editCardStartDatePopup-title": "Spremeni začetni datum", - "editCardDueDatePopup-title": "Spremeni datum zapadlosti", - "editCustomFieldPopup-title": "Uredi polje", - "addReactionPopup-title": "Add reaction", - "editCardSpentTimePopup-title": "Spremeni porabljen čas", - "editLabelPopup-title": "Spremeni oznako", - "editNotificationPopup-title": "Uredi obvestilo", - "editProfilePopup-title": "Uredi profil", - "email": "E-pošta", - "email-address": "Email Address", - "email-enrollAccount-subject": "Up. račun ustvarjen za vas na __siteName__", - "email-enrollAccount-text": "Pozdravljeni __user__,\n\nZa začetek uporabe kliknite spodnjo povezavo.\n\n__url__\n\nHvala.", - "email-fail": "Pošiljanje e-pošte ni uspelo", - "email-fail-text": "Napaka pri poskusu pošiljanja e-pošte", - "email-invalid": "Neveljavna e-pošta", - "email-invite": "Povabi z uporabo e-pošte", - "email-invite-subject": "__inviter__ vam je poslal povabilo", - "email-invite-text": "Spoštovani __user__,\n\n__inviter__ vas vabi k sodelovanju na tabli \"__board__\".\n\nProsimo sledite spodnji povezavi:\n\n__url__\n\nHvala.", - "email-resetPassword-subject": "Ponastavite geslo na __siteName__", - "email-resetPassword-text": "Pozdravljeni __user__,\n\nZa ponastavitev gesla kliknite na spodnjo povezavo.\n\n__url__\n\nHvala.", - "email-sent": "E-pošta poslana", - "email-verifyEmail-subject": "Preverite svoje e-poštni naslov na __siteName__", - "email-verifyEmail-text": "Pozdravljeni __user__,\n\nDa preverite e-poštni naslov za vaš uporabniški račun, kliknite na spodnjo povezavo.\n\n__url__\n\nHvala.", - "enable-vertical-scrollbars": "Enable vertical scrollbars", - "enable-wip-limit": "Vklopi omejitev št. kartic", - "error-board-doesNotExist": "Ta tabla ne obstaja", - "error-board-notAdmin": "Nimate administrativnih pravic za tablo.", - "error-board-notAMember": "Niste član table.", - "error-json-malformed": "Vaše besedilo ni veljaven JSON", - "error-json-schema": "Vaši JSON podatki ne vsebujejo pravilnih informacij v ustreznem formatu", - "error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format ", - "error-list-doesNotExist": "Seznam ne obstaja", - "error-user-doesNotExist": "Uporabnik ne obstaja", - "error-user-notAllowSelf": "Ne morete povabiti sebe", - "error-user-notCreated": "Ta uporabnik ni ustvarjen", - "error-username-taken": "To up. ime že obstaja", - "error-orgname-taken": "This organization name is already taken", - "error-teamname-taken": "This team name is already taken", - "error-email-taken": "E-poštni naslov je že zaseden", - "export-board": "Izvozi tablo", - "export-board-json": "Export board to JSON", - "export-board-csv": "Export board to CSV", - "export-board-tsv": "Export board to TSV", - "export-board-excel": "Export board to Excel", - "user-can-not-export-excel": "User can not export Excel", - "export-board-html": "Export board to HTML", - "export-card": "Export card", - "export-card-pdf": "Export card to PDF", - "user-can-not-export-card-to-pdf": "User can not export card to PDF", - "exportBoardPopup-title": "Izvozi tablo", - "exportCardPopup-title": "Export card", - "sort": "Sortiraj", - "sorted": "Sorted", - "remove-sort": "Remove sort", - "sort-desc": "Klikni za sortiranje seznama", - "list-sort-by": "Sortiraj po:", - "list-label-modifiedAt": "Nazadnje dostopano", - "list-label-title": "Ime seznama", - "list-label-sort": "Ročno nastavljen vrstni red", - "list-label-short-modifiedAt": "(N)", - "list-label-short-title": "(I)", - "list-label-short-sort": "(R)", - "filter": "Filtriraj", - "filter-cards": "Filtriraj kartice ali sezname", - "filter-dates-label": "Filter by date", - "filter-no-due-date": "No due date", - "filter-overdue": "Overdue", - "filter-due-today": "Due today", - "filter-due-this-week": "Due this week", - "filter-due-next-week": "Due next week", - "filter-due-tomorrow": "Due tomorrow", - "list-filter-label": "Filtriraj seznam po imenu", - "filter-clear": "Počisti filter", - "filter-labels-label": "Filter by label", - "filter-no-label": "Brez oznake", - "filter-member-label": "Filter by member", - "filter-no-member": "Brez člana", - "filter-assignee-label": "Filter by assignee", - "filter-no-assignee": "No assignee", - "filter-custom-fields-label": "Filter by Custom Fields", - "filter-no-custom-fields": "Brez poljubnih polj", - "filter-show-archive": "Prikaži arhivirane sezname", - "filter-hide-empty": "Skrij prazne sezname", - "filter-on": "Filter vklopljen", - "filter-on-desc": "Filtrirane kartice na tej tabli. Kliknite tukaj za urejanje filtra.", - "filter-to-selection": "Filtriraj izbrane", - "other-filters-label": "Other Filters", - "advanced-filter-label": "Napredni filter", - "advanced-filter-description": "Napredni filter omogoča pripravo niza, ki vsebuje naslednje operaterje: == != <= >= && || () Preslednica se uporablja kot ločilo med operatorji. Vsa polja po meri lahko filtrirate tako, da vtipkate njihova imena in vrednosti. Na primer: Polje1 == Vrednost1. Opomba: Če polja ali vrednosti vsebujejo presledke, jih morate postaviti v enojne narekovaje. Primer: 'Polje 1' == 'Vrednost 1'. Če želite preskočiti posamezne kontrolne znake (' \\\\/), lahko uporabite \\\\\\. Na primer: Polje1 == I\\\\'m. Prav tako lahko kombinirate več pogojev. Na primer: F1 == V1 || F1 == V2. Običajno se vsi operaterji interpretirajo od leve proti desni. Vrstni red lahko spremenite tako, da postavite oklepaje. Na primer: F1 == V1 && ( F2 == V2 || F2 == V3 ). Prav tako lahko po besedilu iščete z uporabo pravil regex: F1 == /Tes.*/i", - "fullname": "Polno Ime", - "header-logo-title": "Pojdi nazaj na stran s tablami.", - "show-activities": "Show Activities", - "headerBarCreateBoardPopup-title": "Ustvari tablo", - "home": "Domov", - "import": "Uvozi", - "impersonate-user": "Impersonate user", - "link": "Poveži", - "import-board": "uvozi tablo", - "import-board-c": "Uvozi tablo", - "import-board-title-trello": "Uvozi tablo iz orodja Trello", - "import-board-title-wekan": "Uvozi tablo iz prejšnjega izvoza", - "import-board-title-csv": "Import board from CSV/TSV", - "from-trello": "Iz orodja Trello", - "from-wekan": "Od prejšnjega izvoza", - "from-csv": "From CSV/TSV", - "import-board-instruction-trello": "V vaši Trello tabli pojdite na 'Meni', 'Več', 'Natisni in Izvozi', 'Izvozi JSON', in kopirajte prikazano besedilo.", - "import-board-instruction-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .", - "import-board-instruction-wekan": "V vaši tabli pojdite na 'Meni', 'Izvozi tablo' in kopirajte besedilo iz prenesene datoteke.", - "import-board-instruction-about-errors": "Pri napakah med uvozom table v nekaterih primerih uvažanje še deluje, uvožena tabla pa je na strani Vse Table.", - "import-json-placeholder": "Tukaj prilepite veljavne JSON podatke", - "import-csv-placeholder": "Paste your valid CSV/TSV data here", - "import-map-members": "Mapiraj člane", - "import-members-map": "Vaša uvožena tabla vsebuje nekaj članov. Prosimo mapirajte člane, ki jih želite uvoziti, z vašimi uporabniki.", - "import-members-map-note": "Note: Unmapped members will be assigned to the current user.", - "import-show-user-mapping": "Preglejte povezane člane", - "import-user-select": "Izberite obstoječega uporabnika, ki ga želite uporabiti kot tega člana.", - "importMapMembersAddPopup-title": "Izberite člana", - "info": "Različica", - "initials": "Inicialke", - "invalid-date": "Neveljaven datum", - "invalid-time": "Neveljaven čas", - "invalid-user": "Neveljaven uporabnik", - "joined": "se je pridružil", - "just-invited": "Povabljeni ste k tej tabli", - "keyboard-shortcuts": "Bližnjice", - "label-create": "Ustvari oznako", - "label-default": "%s oznaka (privzeto)", - "label-delete-pop": "Razveljavitve ni. To bo odstranilo oznako iz vseh kartic in izbrisalo njeno zgodovino.", - "labels": "Oznake", - "language": "Jezik", - "last-admin-desc": "Ne morete zamenjati vlog, ker mora obstajati vsaj en admin.", - "leave-board": "Zapusti tablo", - "leave-board-pop": "Ste prepričani, da želite zapustiti tablo __boardTitle__? Odstranjeni boste iz vseh kartic na tej tabli.", - "leaveBoardPopup-title": "Zapusti tablo ?", - "link-card": "Poveži s kartico", - "list-archive-cards": "Arhiviraj vse kartice v seznamu", - "list-archive-cards-pop": "To bo odstranilo vse kartice tega seznama. Za ogled in vrnitev kartic iz arhiva na tablo, kliknite \"Meni\" > \"arhiv\".", - "list-move-cards": "Premakni vse kartice na seznamu", - "list-select-cards": "Izberi vse kartice na seznamu", - "set-color-list": "Nastavi barvo", - "listActionPopup-title": "Dejanja seznama", - "settingsUserPopup-title": "User Settings", - "settingsTeamPopup-title": "Team Settings", - "settingsOrgPopup-title": "Organization Settings", - "swimlaneActionPopup-title": "Dejanja plavalnih stez", - "swimlaneAddPopup-title": "Dodaj plavalno stezo spodaj", - "listImportCardPopup-title": "Uvozi Trello kartico", - "listImportCardsTsvPopup-title": "Import Excel CSV/TSV", - "listMorePopup-title": "Več", - "link-list": "Poveži s seznamom", - "list-delete-pop": "Vsa dejanja bodo odstranjena iz vira dejavnosti in seznama ne boste mogli obnoviti. Razveljavitve ni.", - "list-delete-suggest-archive": "Lahko premaknete seznam v arhiv, da ga odstranite iz table in ohranite dejavnosti.", - "lists": "Seznami", - "swimlanes": "Plavalne steze", - "log-out": "Odjava", - "log-in": "Prijava", - "loginPopup-title": "Prijava", - "memberMenuPopup-title": "Nastavitve članov", - "grey-icons": "Grey Icons", - "members": "Člani", - "menu": "Meni", - "move-selection": "Premakni izbiro", - "moveCardPopup-title": "Premakni kartico", - "moveCardToBottom-title": "Premakni na dno", - "moveCardToTop-title": "Premakni na vrh", - "moveSelectionPopup-title": "Premakni izbiro", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", - "multi-selection": "Multi-Izbira", - "multi-selection-label": "Set label for selection", - "multi-selection-member": "Set member for selection", - "multi-selection-on": "Multi-Izbira je omogočena", - "muted": "Utišano", - "muted-info": "O spremembah na tej tabli ne boste prejemali obvestil.", - "my-boards": "Moje Table", - "name": "Ime", - "no-archived-cards": "Ni kartic v arhivu", - "no-archived-lists": "Ni seznamov v arhivu", - "no-archived-swimlanes": "Ni plavalnih stez v arhivu", - "no-results": "Ni zadetkov", - "normal": "Normalno", - "normal-desc": "Lahko gleda in ureja kartice. Ne more spreminjati nastavitev.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", - "not-accepted-yet": "Povabilo še ni sprejeto.", - "notify-participate": "Receive updates to any cards you participate as creator or member", - "notify-watch": "Prejemajte posodobitve opazovanih tabel, seznamov ali kartic", - "optional": "opcijsko", - "or": "ali", - "page-maybe-private": "Ta stran je morda privatna. Verjetno si jo lahko ogledate po<a href='%s'>prijavi</a>.", - "page-not-found": "Stran ne obstaja.", - "password": "Geslo", - "paste-or-dragdrop": "prilepi ali povleci & spusti datoteko slike (samo slika)", - "participating": "Sodelovanje", - "preview": "Predogled", - "previewAttachedImagePopup-title": "Predogled", - "previewClipboardImagePopup-title": "Predogled", - "private": "Zasebno", - "private-desc": "Ta tabla je zasebna. Vsebino lahko vidijo ali urejajo samo dodani uporabniki.", - "profile": "Profil", - "public": "Javno", - "public-desc": "Ta tabla je javna. Vidna je vsakomur s povezavo do table in bo prikazana v zadetkih iskalnikov kot Google. Urejajo jo lahko samo člani table.", - "quick-access-description": "Če tablo označite z zvezdico, bo tukaj dodana bližnjica.", - "remove-cover": "Remove cover image from minicard", - "remove-from-board": "Odstrani iz table", - "remove-label": "Odstrani oznako", - "listDeletePopup-title": "Odstrani seznam?", - "remove-member": "Odstrani člana", - "remove-member-from-card": "Odstrani iz kartice", - "remove-member-pop": "Odstrani __name__ (__username__) iz __boardTitle__? Član bo odstranjen iz vseh kartic te table in bo prejel obvestilo.", - "removeMemberPopup-title": "Odstrani člana?", - "rename": "Preimenuj", - "rename-board": "Preimenuj tablo", - "restore": "Obnovi", - "rescue-card-description": "Show rescue dialogue before closing for unsaved card descriptions", - "rescue-card-description-dialogue": "Overwrite current card description with your changes?", - "save": "Shrani", - "search": "Išči", - "rules": "Pravila", - "search-cards": "Search from card/list titles, descriptions and custom fields on this board", - "search-example": "Write text you search and press Enter", - "select-color": "Izberi barvo", - "select-board": "Select Board", - "set-wip-limit-value": "Omeji maksimalno število opravil v seznamu", - "setWipLimitPopup-title": "Omeji število kartic", - "shortcut-add-self": "Add yourself to current card", - "shortcut-assign-self": "Dodeli sebe k trenutni kartici", - "shortcut-autocomplete-emoji": "Samodokončaj emoji", - "shortcut-autocomplete-members": "Samodokončaj člane", - "shortcut-clear-filters": "Počisti vse filtre", - "shortcut-close-dialog": "Zapri dialog", - "shortcut-filter-my-cards": "Filtriraj moje kartice", - "shortcut-filter-my-assigned-cards": "Filter my assigned cards", - "shortcut-show-shortcuts": "Prikaži seznam bližnjic", - "shortcut-toggle-filterbar": "Toggle Filter Sidebar", - "shortcut-toggle-searchbar": "Toggle Search Sidebar", - "shortcut-toggle-sidebar": "Preklopi stransko vrstico table", - "show-cards-minimum-count": "Prikaži število kartic, če seznam vsebuje več kot", - "sidebar-open": "Odpri stransko vrstico", - "sidebar-close": "Zapri stransko vrstico", - "signupPopup-title": "Ustvari up. račun", - "star-board-title": "Označite tablo z zvezdico, da bo prikazana na vrhu v seznamu tabel.", - "starred-boards": "Table z zvezdico", - "starred-boards-description": "Table z zvezdico se prikažejo na vrhu vašega seznama tabel.", - "subscribe": "Naročite se", - "team": "Skupina", - "this-board": "tablo", - "this-card": "kartico", - "spent-time-hours": "Porabljen čas (ure)", - "overtime-hours": "Presežen čas (ure)", - "overtime": "Presežen čas", - "has-overtime-cards": "Ima kartice s preseženim časom", - "has-spenttime-cards": "Ima kartice s porabljenim časom", - "time": "Čas", - "title": "Naslov", - "toggle-assignees": "Toggle assignees 1-9 for card (By order of addition to board).", - "toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9", - "remove-labels-multiselect": "Multi-Selection removes labels 1-9", - "tracking": "Sledenje", - "tracking-info": "Obveščeni boste o vseh spremembah nad karticami, kjer ste lastnik ali član.", - "type": "Tip", - "unassign-member": "Odjavi člana", - "unsaved-description": "Imate neshranjen opis.", - "unwatch": "Prekliči opazovanje", - "upload": "Naloži", - "upload-avatar": "Naloži avatar", - "uploaded-avatar": "Naložil avatar", - "uploading-files": "Uploading files", - "upload-failed": "Upload failed", - "upload-completed": "Upload completed", - "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL", - "custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL", - "custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27", - "custom-login-logo-image-url": "Custom Login Logo Image URL", - "custom-login-logo-link-url": "Custom Login Logo Link URL", - "custom-help-link-url": "Custom Help Link URL", - "text-below-custom-login-logo": "Text below Custom Login Logo", - "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", - "username": "Up. ime", - "import-usernames": "Import Usernames", - "view-it": "Poglej", - "warn-list-archived": "opozorilo: ta kartica je v seznamu v arhivu", - "watch": "Opazuj", - "watching": "Opazuje", - "watching-info": "O spremembah na tej tabli boste obveščeni", - "welcome-board": "Tabla Dobrodošli", - "welcome-swimlane": "Mejnik 1", - "welcome-list1": "Osnove", - "welcome-list2": "Napredno", - "card-templates-swimlane": "Predloge kartice", - "list-templates-swimlane": "Predloge seznama", - "board-templates-swimlane": "Predloge table", - "what-to-do": "Kaj želite storiti?", - "wipLimitErrorPopup-title": "Neveljaven limit št. kartic", - "wipLimitErrorPopup-dialog-pt1": "Število opravil v seznamu je višje od limita št. kartic.", - "wipLimitErrorPopup-dialog-pt2": "Prosimo premaknite nekaj opravil iz tega seznama ali nastavite višji limit št. kartic.", - "admin-panel": "Skrbniška plošča", - "settings": "Nastavitve", - "people": "Ljudje", - "registration": "Registracija", - "disable-self-registration": "Onemogoči samo-registracijo", - "disable-forgot-password": "Disable Forgot Password", - "invite": "Povabi", - "invite-people": "Povabi ljudi", - "to-boards": "K tabli(am)", - "email-addresses": "E-poštni naslovi", - "smtp-host-description": "Naslov vašega strežnika SMTP.", - "smtp-port-description": "Vrata vašega strežnika SMTP za odhodno pošto.", - "smtp-tls-description": "Omogoči šifriranje TLS za SMTP strežnik.", - "smtp-host": "SMTP Host", - "smtp-port": "SMTP vrata", - "smtp-username": "Up. ime", - "smtp-password": "Geslo", - "smtp-tls": "TLS podpora", - "send-from": "Od", - "send-smtp-test": "Pošljite testno e-pošto na svoj naslov", - "invitation-code": "Koda Povabila", - "email-invite-register-subject": "__inviter__ vam je poslal povabilo", - "email-invite-register-text": "Dragi __user__,\n\n__inviter__ vas vabi na kanban tablo za sodelovanje.\n\nProsimo sledite spodnji povezavi:\n__url__\n\nVaša koda povabila je: __icode__\n\nHvala.", - "email-smtp-test-subject": "SMTP testna e-pošta", - "email-smtp-test-text": "Uspešno ste poslali e-pošto", - "error-invitation-code-not-exist": "Koda povabila ne obstaja", - "error-notAuthorized": "Nimate pravic za ogled te strani.", - "webhook-title": "Ime spletnega vmesnika (webhook)", - "webhook-token": "Žeton (opcijsko za avtentikacijo)", - "outgoing-webhooks": "Izhodni spletni vmesniki (webhooks)", - "bidirectional-webhooks": "Dvo-smerni spletni vmesniki (webhooks)", - "outgoingWebhooksPopup-title": "Izhodni spletni vmesniki (webhooks)", - "boardCardTitlePopup-title": "Filter po naslovu kartice", - "disable-webhook": "Onemogoči ta spletni vmesnik (webhook)", - "global-webhook": "Globalni spletni vmesnik (webhook)", - "new-outgoing-webhook": "Nov izhodni spletni vmesnik (webhook)", - "no-name": "(Neznano)", - "Node_version": "Node različica", - "Meteor_version": "Meteor različica", - "MongoDB_version": "MongoDB različica", - "MongoDB_storage_engine": "MongoDB storage engine", - "MongoDB_Oplog_enabled": "MongoDB Oplog omogočen", - "OS_Arch": "OS Arhitektura", - "OS_Cpus": "OS število CPU", - "OS_Freemem": "OS prost pomnilnik", - "OS_Loadavg": "OS povp. obremenitev", - "OS_Platform": "OS platforma", - "OS_Release": "OS izdaja", - "OS_Totalmem": "OS skupni pomnilnik", - "OS_Type": "OS tip", - "OS_Uptime": "OS čas delovanja", - "days": "dnevi", - "hours": "ure", - "minutes": "minute", - "seconds": "sekunde", - "show-field-on-card": "Prikaži to polje na kartici", - "automatically-field-on-card": "Add field to new cards", - "always-field-on-card": "Add field to all cards", - "showLabel-field-on-card": "Prikaži oznako polja na mini kartici", - "showSum-field-on-list": "Show sum of fields at top of list", - "yes": "Da", - "no": "Ne", - "accounts": "Up. računi", - "accounts-allowEmailChange": "Dovoli spremembo e-poštnega naslova", - "accounts-allowUserNameChange": "Dovoli spremembo up. imena", - "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", - "tableVisibilityMode" : "Boards visibility", - "createdAt": "Ustvarjen ob", - "modifiedAt": "Modified at", - "verified": "Preverjeno", - "active": "Aktivno", - "card-received": "Prejeto", - "card-received-on": "Prejeto ob", - "card-end": "Konec", - "card-end-on": "Končano na", - "editCardReceivedDatePopup-title": "Spremeni datum prejema", - "editCardEndDatePopup-title": "Spremeni končni datum", - "setCardColorPopup-title": "Nastavi barvo", - "setSelectionColorPopup-title": "Set selection color", - "setCardActionsColorPopup-title": "Izberi barvo", - "setSwimlaneColorPopup-title": "Izberi barvo", - "setListColorPopup-title": "Izberi barvo", - "assigned-by": "Dodelil", - "requested-by": "Zahteval", - "card-sorting-by-number": "Card sorting by number", - "board-delete-notice": "Brisanje je trajno. Izgubili boste vse sezname, kartice in akcije, povezane z desko.", - "delete-board-confirm-popup": "Vsi seznami, kartice, oznake in dejavnosti bodo izbrisani in vsebine table ne boste mogli obnoviti. Razveljavitve ni.", - "boardDeletePopup-title": "Izbriši tablo?", - "delete-board": "Izbriši tablo", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", - "default-subtasks-board": "Podopravila za tablo", - "default": "Privzeto", - "defaultdefault": "Privzeto", - "queue": "Čakalna vrsta", - "subtask-settings": "Nastavitve podopravil", - "card-settings": "Nastavitve kartice", - "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Nastavitve podopravil", - "boardCardSettingsPopup-title": "Nastavitve kartice", - "boardMinicardSettingsPopup-title": "Minicard Settings", - "deposit-subtasks-board": "Deponiraj podopravila na tablo:", - "deposit-subtasks-list": "Ciljni seznam za deponirana podopravila:", - "show-parent-in-minicard": "Pokaži starša na mini-kartici:", - "description-on-minicard": "Description on minicard", - "cover-attachment-on-minicard": "Cover image on minicard", - "badge-attachment-on-minicard": "Count of attachments on minicard", - "card-sorting-by-number-on-minicard": "Card sorting by number on minicard", - "prefix-with-full-path": "Predpona s celotno potjo", - "prefix-with-parent": "Predpona s staršem", - "subtext-with-full-path": "Podbesedilo s celotno potjo", - "subtext-with-parent": "Podbesedilo s staršem", - "change-card-parent": "Zamenjaj starša kartice", - "parent-card": "Starševska kartica", - "source-board": "Izvorna tabla", - "no-parent": "Ne prikaži starša", - "activity-added-label": "dodal oznako '%s' do %s", - "activity-removed-label": "odstranil oznako '%s' od %s", - "activity-delete-attach": "izbrisal priponko od %s", - "activity-added-label-card": "dodal oznako '%s'", - "activity-removed-label-card": "izbrisal oznako '%s'", - "activity-delete-attach-card": "izbrisal priponko", - "activity-set-customfield": "nastavi polje po meri '%s' do '%s' v %s", - "activity-unset-customfield": "zbriši polje po meri '%s' v %s", - "r-rule": "Pravilo", - "r-add-trigger": "Dodaj prožilec", - "r-add-action": "Dodaj akcijo", - "r-board-rules": "Pravila table", - "r-add-rule": "Dodaj pravilo", - "r-view-rule": "Poglej pravilo", - "r-delete-rule": "Izbriši pravilo", - "r-new-rule-name": "Ime novega pravila", - "r-no-rules": "Ni pravil", - "r-trigger": "Trigger", - "r-action": "Action", - "r-when-a-card": "Ko je kartica", - "r-is": "is", - "r-is-moved": "premaknjena", - "r-added-to": "Added to", - "r-removed-from": "izbrisan iz", - "r-the-board": "tabla", - "r-list": "seznam", - "set-filter": "Nastavi filter", - "r-moved-to": "premaknjena v", - "r-moved-from": "premaknjena iz", - "r-archived": "premaknjena v arhiv", - "r-unarchived": "obnovljena iz arhiva", - "r-a-card": "kartico", - "r-when-a-label-is": "Ko je oznaka", - "r-when-the-label": "Ko je oznaka", - "r-list-name": "ime sezn.", - "r-when-a-member": "Ko je član", - "r-when-the-member": "Ko je član", - "r-name": "ime", - "r-when-a-attach": "Ko je priponka", - "r-when-a-checklist": "Ko je kontrolni seznam", - "r-when-the-checklist": "Ko kontrolni seznam", - "r-completed": "zaključen", - "r-made-incomplete": "nastavljen kot nedokončan", - "r-when-a-item": "Ko je kontrolni seznam", - "r-when-the-item": "Ko je element kontrolnega seznama", - "r-checked": "označen", - "r-unchecked": "odznačen", - "r-move-card-to": "Premakni kartico na", - "r-top-of": "Vrh", - "r-bottom-of": "Dno", - "r-its-list": "pripadajočega seznama", - "r-archive": "premaknjena v arhiv", - "r-unarchive": "Obnovi iz arhiva", - "r-card": "kartico", - "r-add": "Dodaj", - "r-remove": "Odstrani", - "r-label": "oznaka", - "r-member": "član", - "r-remove-all": "Izbriši vse člane iz kartice", - "r-set-color": "Nastavi barvo na", - "r-checklist": "kontrolni seznam", - "r-check-all": "Označi vse", - "r-uncheck-all": "Odznači vse", - "r-items-check": "postavke kontrolnega lista", - "r-check": "Označi", - "r-uncheck": "Odznači", - "r-item": "postavka", - "r-of-checklist": "kontrolnega seznama", - "r-send-email": "Pošlji e-pošto", - "r-to": "naslovnik", - "r-of": "of", - "r-subject": "zadeva", - "r-rule-details": "Podrobnosti pravila", - "r-d-move-to-top-gen": "Premakni kartico na vrh pripadajočega sezama", - "r-d-move-to-top-spec": "Premakni kartico na vrh seznama", - "r-d-move-to-bottom-gen": "Premakni kartico na dno pripadajočega seznama", - "r-d-move-to-bottom-spec": "Premakni kartico na dno seznama", - "r-d-send-email": "Pošlji e-pošto", - "r-d-send-email-to": "naslovnik", - "r-d-send-email-subject": "zadeva", - "r-d-send-email-message": "vsebina", - "r-d-archive": "Premakni kartico v arhiv", - "r-d-unarchive": "Obnovi kartico iz arhiva", - "r-d-add-label": "Dodaj oznako", - "r-d-remove-label": "Izbriši oznako", - "r-create-card": "Ustvari novo kartico", - "r-in-list": "v seznamu", - "r-in-swimlane": "v plavalni stezi", - "r-d-add-member": "Dodaj člana", - "r-d-remove-member": "Odstrani člana", - "r-d-remove-all-member": "Odstrani vse člane", - "r-d-check-all": "Označi vse elemente seznama", - "r-d-uncheck-all": "Odznači vse elemente seznama", - "r-d-check-one": "Označi element", - "r-d-uncheck-one": "Odznači element", - "r-d-check-of-list": "kontrolnega seznama", - "r-d-add-checklist": "Dodaj kontrolni list", - "r-d-remove-checklist": "Odstrani kotrolni list", - "r-by": "od", - "r-add-checklist": "Dodaj kontrolni list", - "r-with-items": "s postavkami", - "r-items-list": "el1,el2,el3", - "r-add-swimlane": "Dodaj plavalno stezo", - "r-swimlane-name": "ime pl. steze", - "r-board-note": "Note: leave a field empty to match every possible value. ", - "r-checklist-note": "Opomba: elementi kontrolnega seznama morajo biti zapisani kot vrednosti, ločene z vejicami.", - "r-when-a-card-is-moved": "Ko je kartica premaknjena v drug seznam", - "r-set": "Nastavi", - "r-update": "Posodobi", - "r-datefield": "polje z datumom", - "r-df-start-at": "začetek", - "r-df-due-at": "rok", - "r-df-end-at": "konec", - "r-df-received-at": "prejeto", - "r-to-current-datetime": "v trenutni datum/čas", - "r-remove-value-from": "Izbriši vrednost iz", - "r-link-card": "Link card to", - "ldap": "LDAP", - "oauth2": "OAuth2", - "cas": "CAS", - "authentication-method": "Metoda avtentikacije", - "authentication-type": "Način avtentikacije", - "custom-product-name": "Ime izdelka po meri", - "layout": "Postavitev", - "hide-logo": "Skrij logo", - "hide-card-counter-list": "Hide card counter list on All Boards", - "hide-board-member-list": "Hide board member list on All Boards", - "add-custom-html-after-body-start": "Dodaj HTML po meri po <body> začetku", - "add-custom-html-before-body-end": "Dodaj HMTL po meri po </body> koncu", - "error-undefined": "Prišlo je do napake", - "error-ldap-login": "Prišlo je do napake ob prijavi", - "display-authentication-method": "Prikaži metodo avtentikacije", - "oidc-button-text": "Customize the OIDC button text", - "default-authentication-method": "Privzeta metoda avtentikacije", - "duplicate-board": "Dupliciraj tablo", - "duplicate-board-confirm": "Are you sure you want to duplicate this board?", - "org-number": "The number of organizations is: ", - "team-number": "The number of teams is: ", - "people-number": "The number of people is: ", - "swimlaneDeletePopup-title": "Zbriši plavalno stezo?", - "swimlane-delete-pop": "Vsa dejanja bodo odstranjena iz seznama dejavnosti. Plavalne steze ne boste mogli obnoviti. Razveljavitve ni.", - "restore-all": "Obnovi vse", - "delete-all": "Izbriši vse", - "loading": "Nalagam, prosimo počakajte", - "previous_as": "zadnji čas je bil", - "act-a-dueAt": "spremenil rok zapadlosti na \nKdaj: __timeValue__\nKje: __card__\n prejšnji rok zapadlosti je bil __timeOldValue__", - "act-a-endAt": "spremenil čas dokončanja na __timeValue__ iz (__timeOldValue__)", - "act-a-startAt": "spremenil čas pričetka na __timeValue__ iz (__timeOldValue__)", - "act-a-receivedAt": "spremenil čas prejema na __timeValue__ iz (__timeOldValue__)", - "a-dueAt": "spremenil rok v", - "a-endAt": "spremenil končni čas v", - "a-startAt": "spremenil začetni čas v", - "a-receivedAt": "spremenil čas prejetja v", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", - "almostdue": "trenutni rok %s se približuje", - "pastdue": "trenutni rok %s je potekel", - "duenow": "trenutni rok %s je danes", - "act-newDue": "__list__/__card__ ima 1. opomnik roka zapadlosti [__board__]", - "act-withDue": "__list__/__card__ opomniki roka zapadlosti [__board__]", - "act-almostdue": "je opomnil trenuten rok zapadlosti (__timeValue__) kartice __card__ se bliža", - "act-pastdue": "je opomnil trenuten rok zapadlosti (__timeValue__) kartice __card__ je potekel", - "act-duenow": "je opomnil trenuten rok zapadlosti (__timeValue__) kartice __card__ je sedaj", - "act-atUserComment": "Omenjeni ste bili v [__board__] __list__/__card__", - "delete-user-confirm-popup": "Ali ste prepričani, da želite izbrisati ta račun? Razveljavitve ni.", - "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", - "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", - "accounts-allowUserDelete": "Dovoli uporabnikom, da sami izbrišejo svoj račun", - "hide-minicard-label-text": "Skrij besedilo oznak na karticah", - "show-desktop-drag-handles": "Pokaži ročke za povleko na namizju", - "assignee": "Dodeljen član", - "cardAssigneesPopup-title": "Dodeljen član", - "addmore-detail": "Dodaj podrobnejši opis", - "show-on-card": "Prikaži na kartici", - "show-on-minicard": "Show on Minicard", - "new": "Novo", - "editOrgPopup-title": "Edit Organization", - "newOrgPopup-title": "New Organization", - "editTeamPopup-title": "Edit Team", - "newTeamPopup-title": "New Team", - "editUserPopup-title": "Uredi uporabnika", - "newUserPopup-title": "Nov uporabnik", - "notifications": "Notifications", - "help": "Help", - "view-all": "View All", - "filter-by-unread": "Filter by Unread", - "mark-all-as-read": "Mark all as read", - "remove-all-read": "Remove all read", - "allow-rename": "Allow Rename", - "allowRenamePopup-title": "Allow Rename", - "start-day-of-week": "Set day of the week start", - "monday": "Monday", - "tuesday": "Tuesday", - "wednesday": "Wednesday", - "thursday": "Thursday", - "friday": "Friday", - "saturday": "Saturday", - "sunday": "Sunday", - "status": "Status", - "swimlane": "Swimlane", - "owner": "Owner", - "last-modified-at": "Last modified at", - "last-activity": "Last activity", - "voting": "Voting", - "archived": "Archived", - "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has", - "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list", - "hide-checked-items": "Hide checked items", - "hide-finished-checklist": "Hide finished checklist", - "task": "Task", - "create-task": "Create Task", - "ok": "OK", - "organizations": "Organizations", - "teams": "Teams", - "displayName": "Display Name", - "shortName": "Short Name", - "autoAddUsersWithDomainName": "Automatically add users with the domain name", - "website": "Website", - "person": "Person", - "my-cards": "My Cards", - "card": "Kartica", - "list": "List", - "board": "Board", - "context-separator": "/", - "myCardsViewChange-title": "My Cards View", - "myCardsViewChangePopup-title": "My Cards View", - "myCardsViewChange-choice-boards": "Table", - "myCardsViewChange-choice-table": "Table", - "myCardsSortChange-title": "My Cards Sort", - "myCardsSortChangePopup-title": "My Cards Sort", - "myCardsSortChange-choice-board": "By Board", - "myCardsSortChange-choice-dueat": "By Due Date", - "dueCards-title": "Due Cards", - "dueCardsViewChange-title": "Due Cards View", - "dueCardsViewChangePopup-title": "Due Cards View", - "dueCardsViewChange-choice-me": "Me", - "dueCardsViewChange-choice-all": "All Users", - "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", - "broken-cards": "Broken Cards", - "board-title-not-found": "Board '%s' not found.", - "swimlane-title-not-found": "Swimlane '%s' not found.", - "list-title-not-found": "List '%s' not found.", - "label-not-found": "Label '%s' not found.", - "label-color-not-found": "Label color %s not found.", - "user-username-not-found": "Username '%s' not found.", - "comment-not-found": "Card with comment containing text '%s' not found.", - "org-name-not-found": "Organization '%s' not found.", - "team-name-not-found": "Team '%s' not found.", - "globalSearch-title": "Search All Boards", - "no-cards-found": "No Cards Found", - "one-card-found": "One Card Found", - "n-cards-found": "%s Cards Found", - "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", - "operator-board": "board", - "operator-board-abbrev": "b", - "operator-swimlane": "swimlane", - "operator-swimlane-abbrev": "s", - "operator-list": "seznam", - "operator-list-abbrev": "l", - "operator-label": "oznaka", - "operator-label-abbrev": "#", - "operator-user": "user", - "operator-user-abbrev": "@", - "operator-member": "član", - "operator-member-abbrev": "m", - "operator-assignee": "assignee", - "operator-assignee-abbrev": "a", - "operator-creator": "creator", - "operator-status": "status", - "operator-due": "rok", - "operator-created": "created", - "operator-modified": "modified", - "operator-sort": "sort", - "operator-comment": "comment", - "operator-has": "has", - "operator-limit": "limit", - "operator-debug": "debug", - "operator-org": "org", - "operator-team": "team", - "predicate-archived": "archived", - "predicate-open": "open", - "predicate-ended": "ended", - "predicate-all": "all", - "predicate-overdue": "overdue", - "predicate-week": "week", - "predicate-month": "month", - "predicate-quarter": "quarter", - "predicate-year": "year", - "predicate-due": "rok", - "predicate-modified": "modified", - "predicate-created": "created", - "predicate-attachment": "attachment", - "predicate-description": "description", - "predicate-checklist": "kontrolni seznam", - "predicate-start": "začetek", - "predicate-end": "konec", - "predicate-assignee": "assignee", - "predicate-member": "član", - "predicate-public": "public", - "predicate-private": "private", - "predicate-selector": "selector", - "predicate-projection": "projection", - "operator-unknown-error": "%s is not an operator", - "operator-number-expected": "operator __operator__ expected a number, got '__value__'", - "operator-sort-invalid": "sort of '%s' is invalid", - "operator-status-invalid": "'%s' is not a valid status", - "operator-has-invalid": "%s is not a valid existence check", - "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", - "operator-debug-invalid": "%s is not a valid debug predicate", - "next-page": "Next Page", - "previous-page": "Previous Page", - "heading-notes": "Notes", - "globalSearch-instructions-heading": "Search Instructions", - "globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).", - "globalSearch-instructions-operators": "Available operators:", - "globalSearch-instructions-operator-board": "`__operator_board__:<title>` - cards in boards matching the specified *<title>*", - "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - cards in lists matching the specified *<title>*", - "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", - "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", - "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", - "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", - "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", - "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", - "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*", - "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", - "globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cards belonging to a board assigned to organization *<name>*", - "globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cards belonging to a board assigned to team *<name>*", - "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now. `__operator_due__:__predicate_overdue__ lists all cards past their due date.", - "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less", - "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less", - "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:", - "globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards", - "globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards", - "globalSearch-instructions-status-ended": "`__predicate_ended__` - cards with an end date", - "globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards", - "globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards", - "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`. Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).", - "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`. For a descending sort, place a `-` in front of the sort name.", - "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.", - "globalSearch-instructions-notes-1": "Multiple operators may be specified.", - "globalSearch-instructions-notes-2": "Similar operators are *OR*ed together. Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.", - "globalSearch-instructions-notes-3": "Differing operators are *AND*ed together. Only cards that match all of the differing operators are returned. `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.", - "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.", - "globalSearch-instructions-notes-4": "Text searches are case insensitive.", - "globalSearch-instructions-notes-5": "By default archived cards are not searched.", - "link-to-search": "Link to this search", - "excel-font": "Arial", - "number": "Število", - "label-colors": "Label Colors", - "label-names": "Label Names", - "archived-at": "archived at", - "sort-cards": "Sort Cards", - "sort-is-on": "Sort is on", - "cardsSortPopup-title": "Sort Cards", - "due-date": "Due Date", - "server-error": "Server Error", - "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", - "title-alphabetically": "Title (Alphabetically)", - "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)", - "links-heading": "Links", - "hide-activities-of-all-boards": "Don't show the board activities on all boards", - "now-activities-of-all-boards-are-hidden": "Now all activities of all boards are hidden", - "move-swimlane": "Move Swimlane", - "moveSwimlanePopup-title": "Move Swimlane", - "custom-field-stringtemplate": "String Template", - "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", - "custom-field-stringtemplate-separator": "Separator (use or   for a space)", - "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", - "creator": "Creator", - "creator-on-minicard": "Creator on minicard", - "filesReportTitle": "Files Report", - "reports": "Reports", - "rulesReportTitle": "Rules Report", - "boardsReportTitle": "Boards Report", - "cardsReportTitle": "Cards Report", - "copy-swimlane": "Copy Swimlane", - "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner", - "Bounce": "Bounce Wait Spinner", - "Cube": "Cube Wait Spinner", - "Cube-Grid": "Cube-Grid Wait Spinner", - "Dot": "Dot Wait Spinner", - "Double-Bounce": "Double Bounce Wait Spinner", - "Rotateplane": "Rotateplane Wait Spinner", - "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner", - "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card", - "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", - "subject": "Subject", - "details": "Details", - "carbon-copy": "Carbon Copy (Cc:)", - "ticket": "Ticket", - "tickets": "Tickets", - "ticket-number": "Ticket Number", - "open": "Open", - "pending": "Pending", - "closed": "Closed", - "resolved": "Resolved", - "cancelled": "Cancelled", - "history": "History", - "request": "Request", - "requests": "Requests", - "help-request": "Help Request", - "editCardSortOrderPopup-title": "Change Sorting", - "cardDetailsPopup-title": "Card Details", - "add-teams": "Add teams", - "add-teams-label": "Added teams are displayed below:", - "remove-team-from-table": "Are you sure you want to remove this team from the board ?", - "confirm-btn": "Confirm", - "remove-btn": "Odstrani", - "filter-card-title-label": "Filter by card title", - "invite-people-success": "Invitation to register sent with success", - "invite-people-error": "Error while sending invitation to register", - "can-invite-if-same-mailDomainName": "Email domain name", - "to-create-teams-contact-admin": "To create teams, please contact the administrator.", - "Node_heap_total_heap_size": "Node heap: total heap size", - "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", - "Node_heap_total_physical_size": "Node heap: total physical size", - "Node_heap_total_available_size": "Node heap: total available size", - "Node_heap_used_heap_size": "Node heap: used heap size", - "Node_heap_heap_size_limit": "Node heap: heap size limit", - "Node_heap_malloced_memory": "Node heap: malloced memory", - "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", - "Node_heap_does_zap_garbage": "Node heap: does zap garbage", - "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", - "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", - "Node_memory_usage_rss": "Node memory usage: resident set size", - "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", - "Node_memory_usage_heap_used": "Node memory usage: actual memory used", - "Node_memory_usage_external": "Node memory usage: external", - "add-organizations": "Add organizations", - "add-organizations-label": "Added organizations are displayed below:", - "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", - "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", - "custom-legal-notice-link-url": "Custom legal notice page URL", - "acceptance_of_our_legalNotice": "By continuing, you accept our", - "legalNotice": "legal notice", - "copied": "Copied!", - "checklistActionsPopup-title": "Checklist Actions", - "moveChecklist": "Move Checklist", - "moveChecklistPopup-title": "Move Checklist", - "newlineBecomesNewChecklistItem": "Each line of text becomes one of the checklist items", - "newLineNewItem": "One line of text = one checklist item", - "newlineBecomesNewChecklistItemOriginOrder": "Each line of text becomes one of the checklist items, original order", - "originOrder": "original order", - "copyChecklist": "Copy Checklist", - "copyChecklistPopup-title": "Copy Checklist", - "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions", - "attachmentActionsPopup-title": "Attachment Actions", - "attachment-move-storage-fs": "Move attachment to filesystem", - "attachment-move-storage-gridfs": "Move attachment to GridFS", - "attachment-move-storage-s3": "Move attachment to S3", - "attachment-move": "Move Attachment", - "move-all-attachments-to-fs": "Move all attachments to filesystem", - "move-all-attachments-to-gridfs": "Move all attachments to GridFS", - "move-all-attachments-to-s3": "Move all attachments to S3", - "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", - "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", - "move-all-attachments-of-board-to-s3": "Move all attachments of board to S3", - "path": "Path", - "version-name": "Version-Name", - "size": "Size", - "storage": "Storage", - "action": "Action", - "board-title": "Board Title", - "attachmentRenamePopup-title": "Preimenuj", - "uploading": "Uploading", - "remaining_time": "Remaining time", - "speed": "Speed", - "progress": "Progress", - "password-again": "Password (again)", - "if-you-already-have-an-account": "If you already have an account", - "register": "Register", - "forgot-password": "Forgot password", - "minicardDetailsActionsPopup-title": "Card Details", - "Mongo_sessions_count": "Mongo sessions count", - "change-visibility": "Spremeni vidnost", - "max-upload-filesize": "Max upload filesize in bytes:", - "allowed-upload-filetypes": "Allowed upload filetypes:", - "max-avatar-filesize": "Max avatar filesize in bytes:", - "allowed-avatar-filetypes": "Allowed avatar filetypes:", - "invalid-file": "If filename is invalid, upload or rename is cancelled.", - "preview-pdf-not-supported": "Your device does not support previewing PDF. Try downloading instead.", - "drag-board": "Drag board", - "translation-number": "The number of custom translation strings is:", - "delete-translation-confirm-popup": "Are you sure you want to delete this custom translation string? There is no undo.", - "newTranslationPopup-title": "New custom translation string", - "editTranslationPopup-title": "Edit custom translation string", - "settingsTranslationPopup-title": "Delete this custom translation string?", - "translation": "Translation", - "text": "Besedilo", - "translation-text": "Translation text", - "show-subtasks-field": "Show subtasks field", - "show-week-of-year": "Show week of year (ISO 8601)", - "convert-to-markdown": "Convert to markdown", - "import-board-zip": "Add .zip file that has board JSON files, and board name subdirectories with attachments", - "collapse": "Skrči", - "uncollapse": "Uncollapse", - "hideCheckedChecklistItems": "Hide checked checklist items", - "hideAllChecklistItems": "Hide all checklist items", - "support": "Support", - "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", - "accessibility": "Dostopnost", - "accessibility-page-enabled": "Accessibility page enabled", - "accessibility-info-not-added-yet": "Accessibility info has not been added yet", - "accessibility-title": "Accessibility title", - "accessibility-content": "Accessibility content", - "accounts-lockout-settings": "Brute Force Protection Settings", - "accounts-lockout-info": "These settings control how login attempts are protected against brute force attacks.", - "accounts-lockout-known-users": "Settings for known users (correct username, wrong password)", - "accounts-lockout-unknown-users": "Settings for unknown users (non-existent username)", - "accounts-lockout-failures-before": "Failures before lockout", - "accounts-lockout-period": "Lockout period (seconds)", - "accounts-lockout-failure-window": "Failure window (seconds)", - "accounts-lockout-settings-updated": "Brute force protection settings have been updated", - "accounts-lockout-locked-users": "Locked Users", - "accounts-lockout-locked-users-info": "Users currently locked out due to too many failed login attempts", - "accounts-lockout-no-locked-users": "There are currently no locked users", - "accounts-lockout-failed-attempts": "Failed Attempts", - "accounts-lockout-remaining-time": "Remaining Time", - "accounts-lockout-user-unlocked": "User has been unlocked successfully", - "accounts-lockout-confirm-unlock": "Are you sure you want to unlock this user?", - "accounts-lockout-confirm-unlock-all": "Are you sure you want to unlock all locked users?", - "accounts-lockout-show-locked-users": "Show locked users only", - "accounts-lockout-user-locked": "User is locked", - "accounts-lockout-click-to-unlock": "Click to unlock this user", - "accounts-lockout-status": "Status", - "admin-people-filter-show": "Show:", - "admin-people-filter-all": "All Users", - "admin-people-filter-locked": "Locked Users Only", - "admin-people-filter-active": "Aktivno", - "admin-people-filter-inactive": "Not Active", - "admin-people-active-status": "Active Status", - "admin-people-user-active": "User is active - click to deactivate", - "admin-people-user-inactive": "User is inactive - click to activate", - "accounts-lockout-all-users-unlocked": "All locked users have been unlocked", - "accounts-lockout-unlock-all": "Unlock All", - "active-cron-jobs": "Active Scheduled Jobs", - "add-cron-job": "Add Scheduled Job", - "add-cron-job-placeholder": "Add Scheduled Job functionality coming soon", - "attachment-storage-configuration": "Attachment Storage Configuration", - "attachments-path": "Attachments Path", - "attachments-path-description": "Path where attachment files are stored", - "avatars-path": "Avatars Path", - "avatars-path-description": "Path where avatar files are stored", - "board-archive-failed": "Failed to schedule board archive", - "board-archive-scheduled": "Board archive scheduled successfully", - "board-backup-failed": "Failed to schedule board backup", - "board-backup-scheduled": "Board backup scheduled successfully", - "board-cleanup-failed": "Failed to schedule board cleanup", - "board-cleanup-scheduled": "Board cleanup scheduled successfully", - "board-operations": "Board Operations", - "cron-jobs": "Scheduled Jobs", - "cron-migrations": "Scheduled Migrations", - "cron-job-delete-confirm": "Are you sure you want to delete this scheduled job?", - "cron-job-delete-failed": "Failed to delete scheduled job", - "cron-job-deleted": "Scheduled job deleted successfully", - "cron-job-pause-failed": "Failed to pause scheduled job", - "cron-job-paused": "Scheduled job paused successfully", - "filesystem-path-description": "Base path for file storage", - "gridfs-enabled": "GridFS Enabled", - "gridfs-enabled-description": "Use MongoDB GridFS for file storage", - "migration-pause-failed": "Failed to pause migrations", - "migration-paused": "Migrations paused successfully", - "migration-progress": "Migration Progress", - "migration-start-failed": "Failed to start migrations", - "migration-started": "Migrations started successfully", - "migration-status": "Migration Status", - "migration-stop-confirm": "Are you sure you want to stop all migrations?", - "migration-stop-failed": "Failed to stop migrations", - "migration-stopped": "Migrations stopped successfully", - "mongodb-gridfs-storage": "MongoDB GridFS Storage", - "pause-all-migrations": "Pause All Migrations", - "s3-access-key": "S3 Access Key", - "s3-access-key-description": "AWS S3 access key for authentication", - "s3-access-key-placeholder": "Enter S3 access key", - "s3-bucket": "S3 Bucket", - "s3-bucket-description": "S3 bucket name for storing files", - "s3-connection-failed": "S3 connection failed", - "s3-connection-success": "S3 connection successful", - "s3-enabled": "S3 Enabled", - "s3-enabled-description": "Use AWS S3 or MinIO for file storage", - "s3-endpoint": "S3 Endpoint", - "s3-endpoint-description": "S3 endpoint URL (e.g., s3.amazonaws.com or minio.example.com)", - "s3-minio-storage": "S3/MinIO Storage", - "s3-port": "S3 Port", - "s3-port-description": "S3 endpoint port number", - "s3-region": "S3 Region", - "s3-region-description": "AWS S3 region (e.g., us-east-1)", - "s3-secret-key": "S3 Secret Key", - "s3-secret-key-description": "AWS S3 secret key for authentication", - "s3-secret-key-placeholder": "Enter S3 secret key", - "s3-secret-key-required": "S3 secret key is required", - "s3-settings-save-failed": "Failed to save S3 settings", - "s3-settings-saved": "S3 settings saved successfully", - "s3-ssl-enabled": "S3 SSL Enabled", - "s3-ssl-enabled-description": "Use SSL/TLS for S3 connections", - "save-s3-settings": "Save S3 Settings", - "schedule-board-archive": "Schedule Board Archive", - "schedule-board-backup": "Schedule Board Backup", - "schedule-board-cleanup": "Schedule Board Cleanup", - "scheduled-board-operations": "Scheduled Board Operations", - "start-all-migrations": "Start All Migrations", - "stop-all-migrations": "Stop All Migrations", - "test-s3-connection": "Test S3 Connection", - "writable-path": "Writable Path", - "writable-path-description": "Base directory path for file storage", - "add-job": "Add Job", - "attachment-migration": "Attachment Migration", - "attachment-monitoring": "Attachment Monitoring", - "attachment-settings": "Attachment Settings", - "attachment-storage-settings": "Storage Settings", - "automatic-migration": "Automatic Migration", - "back-to-settings": "Back to Settings", - "board-id": "Board ID", - "board-migration": "Board Migration", - "board-migrations": "Board Migrations", - "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", - "cleanup": "Cleanup", - "cleanup-old-jobs": "Cleanup Old Jobs", - "completed": "zaključen", - "conversion-info-text": "This conversion is performed once per board and improves performance. You can continue using the board normally.", - "converting-board": "Converting Board", - "converting-board-description": "Converting board structure for improved functionality. This may take a few moments.", - "cpu-cores": "CPU Cores", - "cpu-usage": "CPU Usage", - "current-action": "Current Action", - "database-migration": "Database Migration", - "database-migration-description": "Updating database structure for improved functionality and performance. This process may take several minutes.", - "database-migrations": "Database Migrations", - "days-old": "Days Old", - "duration": "Duration", - "errors": "Errors", - "estimated-time-remaining": "Estimated time remaining", - "every-1-day": "Every 1 day", - "every-1-hour": "Every 1 hour", - "every-1-minute": "Every 1 minute", - "every-10-minutes": "Every 10 minutes", - "every-30-minutes": "Every 30 minutes", - "every-5-minutes": "Every 5 minutes", - "every-6-hours": "Every 6 hours", - "export-monitoring": "Export Monitoring", - "filesystem-attachments": "Filesystem Attachments", - "filesystem-size": "Filesystem Size", - "filesystem-storage": "Filesystem Storage", - "force-board-scan": "Force Board Scan", - "gridfs-attachments": "GridFS Attachments", - "gridfs-size": "GridFS Size", - "gridfs-storage": "GridFS", - "hide-list-on-minicard": "Hide List on Minicard", - "idle-migration": "Idle Migration", - "job-description": "Job Description", - "job-details": "Job Details", - "job-name": "Job Name", - "job-queue": "Job Queue", - "last-run": "Last Run", - "max-concurrent": "Max Concurrent", - "memory-usage": "Memory Usage", - "migrate-all-to-filesystem": "Migrate All to Filesystem", - "migrate-all-to-gridfs": "Migrate All to GridFS", - "migrate-all-to-s3": "Migrate All to S3", - "migrated-attachments": "Migrated Attachments", - "migration-batch-size": "Batch Size", - "migration-batch-size-description": "Number of attachments to process in each batch (1-100)", - "migration-cpu-threshold": "CPU Threshold (%)", - "migration-cpu-threshold-description": "Pause migration when CPU usage exceeds this percentage (10-90)", - "migration-delay-ms": "Delay (ms)", - "migration-delay-ms-description": "Delay between batches in milliseconds (100-10000)", - "migration-detector": "Migration Detector", - "migration-info-text": "Database migrations are performed once and improve system performance. The process continues in the background even if you close your browser.", - "migration-log": "Migration Log", - "migration-markers": "Migration Markers", - "migration-resume-failed": "Failed to resume migration", - "migration-resumed": "Migration resumed", - "migration-steps": "Migration Steps", - "migration-warning-text": "Please do not close your browser during migration. The process will continue in the background but may take longer to complete.", - "monitoring-export-failed": "Failed to export monitoring data", - "monitoring-refresh-failed": "Failed to refresh monitoring data", - "next": "Next", - "next-run": "Next Run", - "of": "of", - "operation-type": "Operation Type", - "overall-progress": "Overall Progress", - "page": "Page", - "pause": "Pause", - "pause-migration": "Pause Migration", - "previous": "Previous", - "refresh": "Refresh", - "refresh-monitoring": "Refresh Monitoring", - "remaining-attachments": "Remaining Attachments", - "resume-migration": "Resume Migration", - "run-once": "Run once", - "s3-attachments": "S3 Attachments", - "s3-size": "S3 Size", - "s3-storage": "S3", - "scanning-status": "Scanning Status", - "schedule": "Schedule", - "search-boards-or-operations": "Search boards or operations...", - "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", - "showing": "Showing", - "start-test-operation": "Start Test Operation", - "start-time": "Start Time", - "step-progress": "Step Progress", - "stop-migration": "Stop Migration", - "storage-distribution": "Storage Distribution", - "system-resources": "System Resources", - "total-attachments": "Total Attachments", - "total-operations": "Total Operations", - "total-size": "Total Size", - "unmigrated-boards": "Unmigrated Boards", - "weight": "Weight", - "idle": "Idle", - "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" -} diff --git a/imports/i18n/data/sr.i18n.json b/imports/i18n/data/sr.i18n.json index 7775afe35..a1d8a9780 100644 --- a/imports/i18n/data/sr.i18n.json +++ b/imports/i18n/data/sr.i18n.json @@ -1,249 +1,237 @@ { "accept": "Прихвати", "act-activity-notify": "Обавештење о последњим променама", - "act-addAttachment": "унео предметну грађу __attachment__ у предмет __card__ у делу __list__ поступка __swimlane__ међу списе __board__", - "act-deleteAttachment": "уклонио предметну грађу __attachment__ из предмета __card__ у делу __list__ поступка __swimlane__ из списа __board__", - "act-addSubtask": "је издвојио посао __subtask__ из предмета __card__ у __list__ делу __swimlane__ поступка у списима __board__", - "act-addLabel": "Залепио налепницу __label__ на омот предмета __card__ у делу __list__ поступка __swimlane__ у списима __board__", - "act-addedLabel": "Залепљена је налепница __label__ на омот предмета __card__ у делу __list__ поступка __swimlane__ у списима __board__", - "act-removeLabel": "Скинуо је налепницу __label__ са омота предмета __card__ у делу __list__ поступка __swimlane__ из списа __board__", - "act-removedLabel": "Скинута је налепница __label__ са омота предмета __card__ у делу __list__ поступка __swimlane__ из списа __board__", - "act-addChecklist": "је додао списак радњи __checklist__ у предмет __card__ у __list__ делу поступка __swimlane__ заведеног у списима __board__", - "act-addChecklistItem": "је додао ставку __checklistItem__ на списак __checklist__ у предмету __card__ у __list__ поступка __swimlane__ у списима __board__", - "act-removeChecklist": "је уклонио списак радњи __checklist__ из предмета __card__ у __list__ делу поступка __swimlane__ у списима __board__", - "act-removeChecklistItem": "је уклонио ставку __checklistItem__ са списка __checkList__ предмета __card__ у __list__ делу __swimlane__ у списима __board__", - "act-checkedItem": "је прецртао ставку __checklistItem__ са списка __checklist__ у предмету __card__ у __list__ делу __swimlane__ у списима __board__", - "act-uncheckedItem": "је вратио да се поново обави __checklistItem__ радња са списка __checklist__ у предмету __card__ у __list__ делу __swimlane__ у списима __board__", - "act-completeChecklist": "је испунио све са списка __checklist__ у предмету __card__ у __list__ делу __swimlane__ у списима __board__", - "act-uncompleteChecklist": "није испунио све са списка __checklist__ у предмету __card__ у __list__ делу __swimlane__ у списима __board__", - "act-addComment": "изразио следеће мишљење у расправи у предмету __card__: __comment__ у делу __list__ поступка __swimlane__ у списима __board__", - "act-editComment": "допунио став у расправи у предмету __card__:__comment__ у делу __list__ поступка __swimlane__ у списима __board__", - "act-deleteComment": "повукао мишљење у предмету __card__:__comment__ у делу __list__ поступка __swimlane__ у списима __board__", - "act-createBoard": "је увео нове списе са деловодним бројем __board__", - "act-createSwimlane": "је додао нови предметни ток __swimlane__ међу списе __board__", - "act-createCard": "је додао нови предмет __card__ у делу __list__ поступка __swimlane__ међу списе __board__", - "act-createCustomField": "је додао нову рубрику __customField__ међу списе __board__", - "act-deleteCustomField": "је избрисао рубрику __customField__ из списа __board__", - "act-setCustomField": "је изменио запис у рубрици __customField__:__customFieldValue__ у предмету __card__ у __list__ делу поступка __swimlane__ у списима __board", - "act-createList": "је придодао део поступка __list__ међу списе __board__", - "act-addBoardMember": "примљен сарадник __member__ за рад на списима __board__", - "act-archivedBoard": "Списи __board__ су спаковани у архив", - "act-archivedCard": "Предмет __card__ из дела __list__ поступка __swimlane__ из списа __board__ је спакован у архив", - "act-archivedList": "Део __list__ поступка __swimlane__ из списа __board__ је спакован у архив", - "act-archivedSwimlane": "Врста поступка __swimlane__ из списа __board__ је спакована у архив", - "act-importBoard": "унео списе __board__", - "act-importCard": "унео предмет __card__ у делу __list__ поступка __swimlane__ у списе __board__", - "act-importList": "унео део __list__ поступка __swimlane__ у списе __board__", - "act-joinMember": "примљен сарадник __member__ да ради на предмету __card__ у делу __list__ поступка __swimlane__ у списима __board__", - "act-moveCard": "преместио предмет __card__ из списа __board__ са старог дела __oldList__ поступка __oldSwimlane__ у нови део __list__ поступка __swimlane__", - "act-moveCardToOtherBoard": "преместио предмет __card__ са старог дела __oldList__ поступка __oldSwimlane__ из старих списа __oldBoard__ у део __list__ поступка __swimlane__ међу списе __board__", - "act-removeBoardMember": "изузео сарадника __member__ из списа __board__", - "act-restoredCard": "опоравио предмет __card__ у делу поступка __list__ из поступка __swimlane__ из списа __board__", - "act-unjoinMember": "изузео сарадника __member__ са предмета __card__ у делу поступка __list__ из поступка __swimlane__ из списа __board__", + "act-addAttachment": "додао прилог __attachment__ на картици __card__ на деоници __list__ на стази __swimlane__ у пословној књизи __board__", + "act-deleteAttachment": "уклонио прилог __attachment__ са картице __card__ на деоници __list__ стазе __swimlane__ у пословној књизи __board__", + "act-addSubtask": "додао подзадатак __subtask__ на картицу __card__ на деоници __list__ стазе __swimlane__ у пословној књизи __board__", + "act-addLabel": "Залепио налепницу __label__ на картицу __card__ на деоници __list__ стазе __swimlane__ у пословној књизи __board__", + "act-addedLabel": "Залепљена је налепница __label__ на картицу __card__ на деоници __list__ стазе __swimlane__ у пословној књизи __board__", + "act-removeLabel": "Скинуо налепницу __label__ са картице __card__ на деоници __list__ стазе __swimlane__ у пословној књизи __board__", + "act-removedLabel": "Скинута је налепница __label__ са картице __card__ на деоници __list__ стазе __swimlane__ у пословној књизи __board__", + "act-addChecklist": "додао списак за обавити __checklist__ на задатак __card__ на деоници __list__ стазе __swimlane__ у пословној књизи __board__", + "act-addChecklistItem": "додао ставку __checklistItem__ на списак за обавити __checklist__ задатка __card__ на деоници __list__ стазе __swimlane__ у пословној књизи __board__", + "act-removeChecklist": "уклонио списак за обавити __checklist__ са задатка __card__ на деоници __list__ стазе __swimlane__ у пословној књизи __board__", + "act-removeChecklistItem": "уклонио ставку __checklistItem__ са списка за обавити __checkList__ задатка __card__ на деоници __list__ стазе __swimlane__ у пословној књизи __board__", + "act-checkedItem": "обавио __checklistItem__ са списка __checklist__ на задатку __card__ на деоници __list__ стазе __swimlane__ у пословној књизи __board__", + "act-uncheckedItem": "вратио да се поново обави __checklistItem__ са списка __checklist__ на задатку __card__ на деоници __list__ стазе __swimlane__ у пословној књизи __board__", + "act-completeChecklist": "обавио све са списка __checklist__ на задатку __card__ на деоници __list__ стазе __swimlane__ у пословној књизи __board__", + "act-uncompleteChecklist": "није обављено све са списка __checklist__ на задатку __card__ на деоници __list__ стазе __swimlane__ у пословној књизи __board__", + "act-addComment": "изразио мишљење на картици __card__: __comment__ на деоници __list__ стазе __swimlane__ у пословној књизи __board__", + "act-editComment": "изменио мишљење на картици __card__:__comment__ на деоници __list__ стазе __swimlane__ у пословној књизи __board__", + "act-deleteComment": "повукао мишљење на картици __card__:__comment__ на деоници __list__ стазе __swimlane__ у пословној књизи __board__", + "act-createBoard": "Отворена је сасвим нова пословна књига __board__", + "act-createSwimlane": "Додата је сасвим нова стаза __swimlane__ у пословној књизи __board__", + "act-createCard": "додата је сасвим нова картица са задатком __card__ на деоници __list__ на стази __swimlane__ у пословној књизи __board__", + "act-createCustomField": "направљено сасвим ново поље __customField__ у пословној књизи __board__", + "act-deleteCustomField": "избрисано сасвим ново поље __customField__ у пословној књизи __board__", + "act-setCustomField": "измењено сасвим ново поље __customField__:__customFieldValue__ на картици са задатком __card__ на деоници __list__ стазе __swimlane__ у пословној књизи __board", + "act-createList": "придодата деоница __list__ у пословној књизи __board__", + "act-addBoardMember": "примљен сарадник __member__ у пословној књизи __board__", + "act-archivedBoard": "Пословна књига __board__ је премештена у архив", + "act-archivedCard": "Картица са задатком __card__ са деонице __list__ стазе __swimlane__ из пословне књиге __board__ однешена у архив", + "act-archivedList": "Деоница __list__ стазе __swimlane__ из пословне књиге __board__ премештена у архив", + "act-archivedSwimlane": "Стаза __swimlane__ из пословне књиге __board__ однешена у архив", + "act-importBoard": "увезао књигу пословања __board__", + "act-importCard": "увезао картицу са задатком __card__ на деоници __list__ на стази __swimlane__ у пословној књизи __board__", + "act-importList": "увезао деоницу __list__ на стазу __swimlane__ у пословној књизи __board__", + "act-joinMember": "примио сарадника __member__ на картицу __card__ на деоници __list__ стазе __swimlane__ у пословној књизи __board__", + "act-moveCard": "преместио картицу __card__ из пословне књиге __board__ са старе деонице __oldList__ старе стазе __oldSwimlane__ на деоницу __list__ нове стазе __swimlane__", + "act-moveCardToOtherBoard": "преместио картицу __card__ са старе деонице __oldList__ старе стазе __oldSwimlane__ из старе пословне књиге __oldBoard__ на деоницу __list__ стазе __swimlane__ у пословну књигу __board__", + "act-removeBoardMember": "удаљио сарадника __member__ из пословне књиге __board__", + "act-restoredCard": "обновио картицу са задатком __card__ на деоници __list__ у стази __swimlane__ у пословној књизи __board__", + "act-unjoinMember": "удаљио сарадника __member__ са картице __card__ на деоници __list__ стазе __swimlane__ из пословне књиге __board__", "act-withBoardTitle": "__board__", "act-withCardTitle": "[__board__] __card__", "actions": "Радње", - "activities": "Дневник промена", + "activities": "Последње промене", "activity": "Последња промена", - "activity-added": "је додао %s у %s", + "activity-added": "додао %s у %s", "activity-archived": "%s премештено у архиву", - "activity-attached": "унео предметну грађу %s у %s", - "activity-created": "је направио %s", - "activity-changedListTitle": "је преименовао део поступка у %s", - "activity-customfield-created": "је додао рубрику %s", + "activity-attached": "приложио %s у %s", + "activity-created": "направио %s", + "activity-changedListTitle": "renamed list to %s", + "activity-customfield-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-moved": "преместио %s из %s у %s", "activity-on": "на %s", "activity-removed": "уклонио %s из %s", "activity-sent": "послао %s %s-у", "activity-unjoined": "раставио %s", - "activity-subtask-added": "је издвојио посао из предмета %s", - "activity-checked-item": "пријављује да је обавио задатак %s са списка %s у предмету %s", - "activity-unchecked-item": "повлачи пријаву да је обавио задатак %s са списка %s у предмету %s", - "activity-checklist-added": "је унео предметну радњу у предмет %s", - "activity-checklist-removed": "је уклонио предметну радњу из предмета %s", - "activity-checklist-completed": "је испунио све са списка предметне радње %s у предмету %s", - "activity-checklist-uncompleted": "ипак није испунио све са списка предметне радње %s у предмету %s", - "activity-checklist-item-added": "је придодао ставку '%s' у предметну радњу %s", - "activity-checklist-item-removed": "је ставку '%s' избацио из предметне радње %s", + "activity-subtask-added": "додао подзадатак за %s", + "activity-checked-item": "обављено %s са списка %s од %s", + "activity-unchecked-item": "није обављено %s са списка %s од %s", + "activity-checklist-added": "деоница је додата у %s", + "activity-checklist-removed": "уклонио списак за обавити са %s", + "activity-checklist-completed": "испуњеност задатака са списка %s од %s", + "activity-checklist-uncompleted": "списак није испуњен %s од %s", + "activity-checklist-item-added": "придодата ставка на списак за обавити '%s' у %s", + "activity-checklist-item-removed": "избачена ставка са списка за обавити из '%s' у %s", "add": "Додај", - "activity-checked-item-card": "је испунио обавезу %s као ставку предметне радње %s", - "activity-unchecked-item-card": "је означио обавезу %s ипак као неиспуњен део предметне радње %s", - "activity-checklist-completed-card": "испуњене обавезе са списка __checklist__ у оквиру предмета __card__ у __list__ делу поступка __swimlane__ заведеног у списима __board__", + "activity-checked-item-card": "испуњена обавеза %s у списку за обавити %s", + "activity-unchecked-item-card": "неиспуњена обавеза %s на списку за обавити %s", + "activity-checklist-completed-card": "испуњене обавезе са списка __checklist__ на картици __card__ деонице __list__ на стази __swimlane__ пословне књиге __board__", "activity-checklist-uncompleted-card": "нису испуњене обавезе са списка %s", "activity-editComment": "променио мишљење", "activity-deleteComment": "повучено мишљење", - "activity-receivedDate": "је изменио датум и време пријема на %s у предмету %s", - "activity-startDate": "је изменио датум и време %s кад почиње да ради на предмету %s", - "allboards.starred": "Истакнути", - "allboards.templates": "Обрасци", - "allboards.remaining": "Нерасподељени", - "allboards.workspaces": "Радни простор", - "allboards.add-workspace": "Прошири радни простор", - "allboards.add-workspace-prompt": "Назив радног простора", - "allboards.add-subworkspace": "Додај радни кутак", - "allboards.add-subworkspace-prompt": "Назив за радни кутак", - "allboards.edit-workspace": "Преименовање радног простора", - "allboards.edit-workspace-name": "Назив радног простора", - "allboards.edit-workspace-icon": "Слика за радни простор (код)", - "multi-selection-active": "Штиклирајте да би изабрали списе", - "activity-dueDate": "је изменио крајњи рок на %s у предмету %s", - "activity-endDate": "је изменио датум и време %s кад је окончао предмет %s", - "add-attachment": "Додај предметну грађу", - "add-board": "Уведи нове списе", - "add-template": "Додај образац", - "add-card": "Додај предмет", - "add-card-to-top-of-list": "Додај предмет на врх", - "add-card-to-bottom-of-list": "Додај предмет на дно", - "setListWidthPopup-title": "Ширина дела поступка", - "set-list-width": "Постави ширину", - "set-list-width-value": "Мин/Макс. ширина (px)", - "list-width-error-message": "Ширина дела поступка мора бити цео број већи од 100", - "keyboard-shortcuts-enabled": "Пречице са тастатуре су укључене.", - "keyboard-shortcuts-disabled": "Пречице са тастатуре су искључене.", - "setSwimlaneHeightPopup-title": "Подеси висину у овој врсти поступка", - "set-swimlane-height": "Подеси висину овог поступка", - "set-swimlane-height-value": "Висина ове врсте поступка (у тачкама)", - "swimlane-height-error-message": "Висина тока поступка мора бити позитиван број", - "add-swimlane": "Додај врсту поступка", - "add-subtask": "Издвоји посао", - "add-checklist": "Додај предметну радњу", - "add-checklist-item": "Додај помоћну предметну радњу", - "close-add-checklist-item": "Окончај додавање помоћних предметних радњи", - "close-edit-checklist-item": "Прекини измену помоћне предметне радње", - "convertChecklistItemToCardPopup-title": "Материјал ⇨ нов предмет", - "add-cover": "Осликани омот предмета", + "activity-receivedDate": "измењен датум пријема на %s са %s", + "activity-startDate": "измењен почетни датум на %s са %s", + "activity-dueDate": "измењен крајњи рок на %s са %s", + "activity-endDate": "измењено време завршетка на %s са %s", + "add-attachment": "Додај прилог", + "add-board": "Уведи пословну књигу", + "add-template": "Додај предложак", + "add-card": "Додај картицу са задатком", + "add-card-to-top-of-list": "Додај картицу/задатак на врх деонице", + "add-card-to-bottom-of-list": "Додај картицу/задатак на дно деонице", + "setListWidthPopup-title": "Set Widths", + "set-list-width": "Set Widths", + "set-list-width-value": "Set Min & Max Widths (pixels)", + "list-width-error-message": "List widths must be integers greater than 100", + "keyboard-shortcuts-enabled": "Keyboard shortcuts enabled. Click to disable.", + "keyboard-shortcuts-disabled": "Keyboard shortcuts disabled. Click to enable.", + "setSwimlaneHeightPopup-title": "Подеси висину стазе", + "set-swimlane-height": "Подеси висину стазе", + "set-swimlane-height-value": "Висина стазе (у пикселима)", + "swimlane-height-error-message": "Висина стазе мора бити позитиван број", + "add-swimlane": "Додај стазу", + "add-subtask": "Додај подзадатак", + "add-checklist": "Додај списак за обавити", + "add-checklist-item": "Додај нову ставку на списак", + "close-add-checklist-item": "Затвори образац за додавање ставке на списак за обавити", + "close-edit-checklist-item": "Затвори образац за уређивање ставке списка за обавити", + "convertChecklistItemToCardPopup-title": "Претвори ставку за обавити у облик картице са задатком", + "add-cover": "Додајте насловну слику на мини картицу", "add-label": "Додај налепницу", "add-list": "Додај деоницу", "add-after-list": "Додај након листе", "add-members": "Прими сараднике", - "added": "додао", + "added": "Додао", "addMemberPopup-title": "Сарадници", "memberPopup-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__ других предмета", + "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": "Исчитавам, молим да сачекате. Освежавање стране ће изазвати губитак података. Ако повлачење података не ради, молим да проверите да ли је сервер заустављен.", "app-try-reconnect": "Покушавам да се поново повежем.", - "archive": "Спакуј у архиву", - "archive-all": "Спакуј све у архиву", - "archive-board": "Спакуј ове списе у архиву", - "archive-board-confirm": "Да ли сте сигурни да желите да спакујете ове списе у архив?", - "archive-card": "Спакуј предмет у архиву", - "archive-list": "Спакуј овај део поступка у архиву", - "archive-swimlane": "Спакуј овај ток поступка у архиву", - "archive-selection": "Спакуј изабрано у архиву", - "archiveBoardPopup-title": "Архивираћете ове списе?", - "archived-items": "Архива", - "archived-boards": "Архивирани списи", - "restore-board": "Извуци списе из архиве", - "no-archived-boards": "Архива је празна!", - "archives": "Архиве", - "template": "Образац", - "templates": "Обрасци", - "template-container": "Сандук са обрасцима", - "add-template-container": "Додај сандук са обрасцима", + "archive": "Премести у архиву", + "archive-all": "Премести све у архиву", + "archive-board": "Премести пословну књигу у архиву", + "archive-board-confirm": "Are you sure you want to archive this board?", + "archive-card": "Премести картицу са задатком у архиву", + "archive-list": "Премести деоницу у архиву", + "archive-swimlane": "Премести стазу у архиву", + "archive-selection": "Премести изабрано у архиву", + "archiveBoardPopup-title": "Преместићете ову пословну књигу у архиву?", + "archived-items": "Архивирај", + "archived-boards": "Пословне књиге из архиве", + "restore-board": "Извуци пословну књигу из архиве", + "no-archived-boards": "Нема књига пословања у архиви.", + "archives": "Архива", + "template": "Предложак", + "templates": "Предлошци", + "template-container": "Сандук са предлошцима", + "add-template-container": "Додај сандук са предлошцима", "assign-member": "Додели члана", "attached": "Приложено", "attachment": "Приложени документ", "attachment-delete-pop": "Брисање приложеног документа је трајно. Опозив ове радње неће бити могућ.", "attachmentDeletePopup-title": "Обрисаћете приложени документ?", - "attachments": "Предметна грађа", - "auto-watch": "Чим настану нови списи почни да прикупљаш све промене", - "avatar-too-big": "Слика је превелика (__size__ max)", + "attachments": "Приложени документи", + "auto-watch": "Чим се књига пословања отвори почни да је пратиш", + "avatar-too-big": "Ова сличица је превелика (__size__ max)", "back": "Назад", - "board-change-color": "Обоји омот списа", - "board-change-background-image": "Осликај подлогу списа", - "board-background-image-url": "Веза до слике", - "add-background-image": "Искористи слику за подлогу", - "remove-background-image": "Уклони подлогу", - "show-at-all-boards-page" : "Смести на полицу са списима", - "board-info-on-my-boards" : "Списи у мојој надлежности", - "boardInfoOnMyBoardsPopup-title" : "Списи у мојој надлежности", - "boardInfoOnMyBoards-title": "Списи у мојој надлежности", - "show-card-counter-per-list": "Прикажи бројач предмета на сваком делу тока поступка", - "show-board_members-avatar": "Прикажи слике сарадника на омоту списа", + "board-change-color": "Обоји корице књиге пословања", + "board-change-background-image": "Насловница пословне књиге", + "board-background-image-url": "Веза до слике за насловницу пословне књиге", + "add-background-image": "Додај позадинску слику", + "remove-background-image": "Уклони позадинску слику", + "show-at-all-boards-page" : "Прикажи на полазној страни где су све пословне књиге", + "board-info-on-my-boards" : "Правила за све књиге пословања", + "boardInfoOnMyBoardsPopup-title" : "Правила за све књиге пословања", + "boardInfoOnMyBoards-title": "Правила за све пословне књиге", + "show-card-counter-per-list": "Прикажи број картица на деоници", + "show-board_members-avatar": "Прикажи сличице сарадника/корисника пословне књиге", "board-nb-stars": "%s звездица", - "board-not-found": "Спис није пронађен", - "board-private-info": "Ови списи су <strong>видљиви само сарадницима<strong>.", - "board-public-info": "Ови списи су <strong>видљиви свима<strong>.", - "board-drag-drop-reorder-or-click-open": "Притисните и задржите па превуците да би пресложили списе. Притисните на сличицу да отворите списе.", - "boardChangeColorPopup-title": "Промени боју омота ових списа", - "boardChangeBackgroundImagePopup-title": "Списи на осликаној подлози", - "allBoardsChangeColorPopup-title": "Зид у боји", - "allBoardsChangeBackgroundImagePopup-title": "Осликани зид", - "boardChangeTitlePopup-title": "Деловодни број и опис", - "boardChangeVisibilityPopup-title": "Промена тајности ових списа", - "boardChangeWatchPopup-title": "Пријем обавештења", - "boardMenuPopup-title": "Рад са списима", + "board-not-found": "Књига пословања није пронађена", + "board-private-info": "Ова пословна књига ће бити <strong>приватна<strong>.", + "board-public-info": "Ова пословна књига ће бити <strong>јавна<strong>.", + "board-drag-drop-reorder-or-click-open": "Држите и пренесите да би пресложили иконице пословне књиге. Притисните на иконицу да отворите књигу пословања.", + "boardChangeColorPopup-title": "Промени позадину насловне стране књиге пословања", + "boardChangeBackgroundImagePopup-title": "Промена насловнице пословне књиге", + "allBoardsChangeColorPopup-title": "Обоји корице књиге пословања", + "allBoardsChangeBackgroundImagePopup-title": "Насловница пословне књиге", + "boardChangeTitlePopup-title": "Преименуј наслов на пословној књизи", + "boardChangeVisibilityPopup-title": "Промени видљивост", + "boardChangeWatchPopup-title": "Промени праћење", + "boardMenuPopup-title": "Правила коришћења пословне књиге", "allBoardsMenuPopup-title": "Подешавања", - "boardChangeViewPopup-title": "Поглед на списе", - "boards": "Списи", - "board-view": "Поглед на списе", - "desktop-mode": "Приказ прилагођен за екран рачунара", - "mobile-mode": "Приказ прилагођен за екран мобилног уређаја", - "mobile-desktop-toggle": "Замени приказ прилагођен за рачунар/мобилни", - "zoom-in": "Приближи", - "zoom-out": "Одаљи", - "click-to-change-zoom": "Лупа", - "zoom-level": "Ниво", - "enter-zoom-level": "Задајте ниво (50-300%):", + "boardChangeViewPopup-title": "Распоред у књизи пословања", + "boards": "Књиге пословања", + "board-view": "Прегледност пословне књиге", + "desktop-mode": "Desktop Mode", + "mobile-mode": "Mobile Mode", + "mobile-desktop-toggle": "Toggle between Mobile and Desktop Mode", + "zoom-in": "Zoom In", + "zoom-out": "Zoom Out", + "click-to-change-zoom": "Click to change zoom level", + "zoom-level": "Zoom Level", + "enter-zoom-level": "Enter zoom level (50-300%):", "board-view-cal": "Календар", - "board-view-swimlanes": "Врсте поступака", - "board-view-collapse": "Скупи", + "board-view-swimlanes": "Стазе", + "board-view-collapse": "Сажми", "board-view-gantt": "Гант", "board-view-lists": "Деонице", - "bucket-example": "Деловодни број (на пример 4/2025)", - "calendar-previous-month-label": "Претходни месец", - "calendar-next-month-label": "Наредни месец", + "bucket-example": "Like \"Bucket List\" for example", + "calendar-previous-month-label": "Previous Month", + "calendar-next-month-label": "Next Month", "cancel": "Откажи", - "card-archived": "Предмет је архивиран.", - "board-archived": "Ови списи су премештени у архиву.", - "card-comments-title": "У овом предмету у расправи је исказано %s мишљења.", - "card-delete-notice": "Брисање је трајно. Изгубићете све у вези са овим предметом.", - "card-delete-pop": "Читав записник ће бити уклоњен и предмет неће моћи бити опорављен. Опозив ове радње неће бити могућ.", - "card-delete-suggest-archive": "Оно што можете је да предмете исчупате из списа архивирањем (тада се записник чува).", - "card-archive-pop": "Након архивирања, предмет више неће бити видљив у овом делу тока поступка.", - "card-archive-suggest-cancel": "Касније ипак можете извући и вратити предмет из архиве.", - "card-due": "Орочен", - "card-due-on": "Предмету истиче рок дана", + "card-archived": "Ова картица је архивирана.", + "board-archived": "Ова књига пословања је премештена у архиву.", + "card-comments-title": "На овој картици је исказано %s мишљења.", + "card-delete-notice": "Брисање је трајно. Изгубићете све у вези са овом картицом са задацима.", + "card-delete-pop": "Све радње ће бити уклоњене са списка промена и картица са задатком неће моћи бити опорављена. Опозив ове радње неће бити могућ.", + "card-delete-suggest-archive": "Оно што можете је да картицу са задатком архивирате (чиме се све у вези ње очувава) а где је ипак избацујете из књиге пословања.", + "card-archive-pop": "Након њеног архивирања, картица више неће бити видљива на овој деоници.", + "card-archive-suggest-cancel": "Касније,ипак, можете извући и вратити картицу из архиве.", + "card-due": "Рок", + "card-due-on": "Рок истиче", "card-spent": "Утрошено време", - "card-edit-attachments": "Рад са предметном грађом", - "card-edit-custom-fields": "Придружене рубрике", + "card-edit-attachments": "Уреди прилоге", + "card-edit-custom-fields": "Уреди сасвим нова поља", "card-edit-labels": "Уреди налепнице", "card-edit-members": "Осмисли сарадничку мрежу", - "card-labels-title": "Залепи налепницу на омот предмета.", - "card-members-title": "Одабир сарадника на списима за овај предмет.", - "card-start": "Започет", - "card-start-on": "Предмет започет дана", + "card-labels-title": "Залепи налепницу на картицу.", + "card-members-title": "Додај или уклони сараднике из књиге пословања са картице.", + "card-start": "Почетак", + "card-start-on": "Почиње", "cardAttachmentsPopup-title": "Прилог долази са", - "cardCustomField-datePopup-title": "Промени датум у рубрици", - "cardCustomFieldsPopup-title": "Придружене рубрике", - "cardStartVotingPopup-title": "Саветодавни референдум", - "positiveVoteMembersPopup-title": "Гласали „За“", - "negativeVoteMembersPopup-title": "Гласали „Против“", - "card-edit-voting": "Јавно гласање", - "editVoteEndDatePopup-title": "Када се гласачко место затвара", - "allowNonBoardMembers": "Дај право гласа и онима који немају увид у ове списе", - "vote-question": "Питање на јавном гласању", - "vote-public": "Прикажи резултате јавног гласања", + "cardCustomField-datePopup-title": "Промени датум", + "cardCustomFieldsPopup-title": "Уреди сасвим нова поља", + "cardStartVotingPopup-title": "Ново гласање", + "positiveVoteMembersPopup-title": "Гласали За", + "negativeVoteMembersPopup-title": "Гласали Против", + "card-edit-voting": "Постави правила гласања", + "editVoteEndDatePopup-title": "Гласачко место се затвара", + "allowNonBoardMembers": "Дозволи свим корисницима са пријавом", + "vote-question": "Гласачко питање", + "vote-public": "Прикажи резултате гласања", "vote-for-it": "за", "vote-against": "против", "deleteVotePopup-title": "Избрисаћете гласање?", "vote-delete-pop": "Брисање има трајни карактер. Све у вези са овим гласањем ће бити неповратно избрисано.", "cardStartPlanningPokerPopup-title": "Започни договор за партију покера", - "card-edit-planning-poker": "Такмичење", + "card-edit-planning-poker": "Договор за партију покера", "editPokerEndDatePopup-title": "Промени крајњи датум до кад траје гласање за партију покера", - "poker-question": "Играмо карте", + "poker-question": "Договор за партију покера", "poker-one": "1", "poker-two": "2", "poker-three": "3", @@ -261,108 +249,100 @@ "set-estimation": "Постави прогнозу", "deletePokerPopup-title": "Уклони договор за партију покера?", "poker-delete-pop": "Брисање има трајни карактер. Изгубићете све радње у вези овог плана за партију покера.", - "cardDeletePopup-title": "Обрисаћете предмет?", - "cardArchivePopup-title": "Архивираћете предмет?", - "cardDetailsActionsPopup-title": "Шире радње на предмету", + "cardDeletePopup-title": "Обрисаћете картицу?", + "cardArchivePopup-title": "Архивираћете картицу?", + "cardDetailsActionsPopup-title": "Радње на картицама са задацима", "cardLabelsPopup-title": "Налепнице", "cardMembersPopup-title": "Сарадничка мрежа", "cardMorePopup-title": "Више", - "cardTemplatePopup-title": "Направи образац", - "cards": "Предмети", - "cards-count": "Предмета", - "cards-count-one": "Предмет", + "cardTemplatePopup-title": "Направи предложак", + "cards": "Картице", + "cards-count": "Картице", + "cards-count-one": "Картица", "casSignIn": "Пријави се користећи CAS", - "cardType-card": "Предмет", - "cardType-linkedCard": "Везани предмет", - "cardType-linkedBoard": "Везани списи", + "cardType-card": "Картица са задацима", + "cardType-linkedCard": "Повезана картица са задацима", + "cardType-linkedBoard": "Повезана деоница", "change": "Промени", - "change-avatar": "Моја слика", + "change-avatar": "Промени сличицу", "change-password": "Промени лозинку", - "change-permissions": "Промени улогу", - "change-settings": "Поставка предмета", - "changeAvatarPopup-title": "Моја слика", + "change-permissions": "Промени дозволе", + "change-settings": "Неколико важних правила", + "changeAvatarPopup-title": "Промени сличицу", "changeLanguagePopup-title": "Избор језика", "changePasswordPopup-title": "Промена лозинке", - "changePermissionsPopup-title": "Избор улоге", - "changeSettingsPopup-title": "Општа поставка предмета", - "subtasks": "Издвојени послови", - "checklists": "Предметне радње", - "click-to-star": "Означи звездицом ове списе.", - "click-to-unstar": "Уклони звездицу са ових списа.", + "changePermissionsPopup-title": "Промени дозволе", + "changeSettingsPopup-title": "Неколико важних правила", + "subtasks": "Подзадаци", + "checklists": "Спискови", + "click-to-star": "Притисни да означиш звездицом ову књигу пословања.", + "click-to-unstar": "Притисни да уклониш звездицу са ове пословне књиге.", "click-to-enable-auto-width": "Auto list width disabled. Click to enable.", "click-to-disable-auto-width": "Auto list width enabled. Click to disable.", "auto-list-width": "Auto list width", "clipboard": "Из историје или пренеси и испусти", "close": "Заклопи", - "close-board": "Заклопи списе", - "close-board-pop": "Моћи ћете да повратите списе притиском на дугме “Архив” са почетног заглавља.", - "close-card": "Затвори предмет", + "close-board": "Заклопи књигу пословања", + "close-board-pop": "Моћи ћете да повратите пословну књигу притиском на дугме “Архив” са почетног заглавља.", + "close-card": "Затвори картицу са задатком", "color-black": "црна", "color-blue": "плава", - "color-crimson": "тамноцрвена", - "color-darkgreen": "тамнозелена", + "color-crimson": "тамно-црвена", + "color-darkgreen": "тамно-зелена", "color-gold": "златна", "color-gray": "сива", "color-green": "зелена", - "color-indigo": "у боји индиго пресликача", - "color-lime": "пастелнозелена", - "color-magenta": "љубичасто-црвена", - "color-mistyrose": "прљаво роза", - "color-navy": "тамноплава", + "color-indigo": "индиго", + "color-lime": "креч", + "color-magenta": "пурпурно-црвена", + "color-mistyrose": "магловито роза", + "color-navy": "морнарско плава", "color-orange": "наранџаста", - "color-paleturquoise": "бледозелена", - "color-peachpuff": "у боји кајсије", + "color-paleturquoise": "бледо-зелена", + "color-peachpuff": "кајсија", "color-pink": "пинк", - "color-plum": "модра", + "color-plum": "шљива", "color-purple": "љубичаста", "color-red": "црвена", - "color-saddlebrown": "у боји кестена", + "color-saddlebrown": "кожно седло", "color-silver": "сребрна", "color-sky": "небеско плава", - "color-slateblue": "загаситоплава", + "color-slateblue": "загасито плава", "color-white": "бела", "color-yellow": "жута", "unset-color": "Обриши подешавање", - "comments": "Ставови", + "comments": "Comments", "comment": "Изнеси мишљење", - "comment-placeholder": "Место за расправу", - "comment-only": "Стручни саветник", - "comment-only-desc": "Једино може да учествује у расправи око одређеног предмета.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", - "comment-delete": "Да ли сте сигурни да желите да повучете изнешено мишљење?", + "comment-placeholder": "Простор за изношење мишљења", + "comment-only": "Износи мишљење", + "comment-only-desc": "Може да изнесе мишљење само на картицама са задацима.", + "comment-delete": "Да ли сте сигурни да желите да уклоните изнешено мишљење?", "deleteCommentPopup-title": "Повлачите мишљење?", - "no-comments": "Посматрач", - "no-comments-desc": "Не може да види расправу и прати записник.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", - "worker": "Приправник", - "worker-desc": "Може да ради помоћне послове - да премешта предмете, бирa оне које ће пратити и да учествује у расправи. ", + "no-comments": "Нико није дао мишљење", + "no-comments-desc": "Не може да види изнешена мишљења и догађаје.", + "worker": "Радник", + "worker-desc": "Може само да помера картице са задацима, додељује их себи и да даје мишљење. ", "computer": "Рачунар", - "confirm-subtask-delete-popup": "Да ли сте сигурни да желите да избришете овај издвојени посао?", - "confirm-checklist-delete-popup": "Да ли сте сигурни да желите да избришете ову предметну радњу?", - "subtaskDeletePopup-title": "Избрисаћете издвојени посао?", - "checklistDeletePopup-title": "Избрисаћете предметну радњу?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", - "copy-card-link-to-clipboard": "Причувај везу на кратко", - "copy-text-to-clipboard": "Причувај текст на кратко", - "linkCardPopup-title": "Повежи предмет", + "confirm-subtask-delete-popup": "Да ли сте сигурни да желите да избришете подзадатак?", + "confirm-checklist-delete-popup": "Да ли сте сигурни да желите да избришете овај списак за обавити?", + "subtaskDeletePopup-title": "Избрисаћете подзадатак?", + "checklistDeletePopup-title": "Избрисаћете списак за обавити?", + "copy-card-link-to-clipboard": "Причувај везу до картице у привременој меморији", + "copy-text-to-clipboard": "Причувај текст у привременој меморији", + "linkCardPopup-title": "Повежи картицу", "searchElementPopup-title": "Претрага", - "copyCardPopup-title": "Умножи предмет", - "copyManyCardsPopup-title": "Расади попуњен образац", - "copyManyCardsPopup-instructions": "Наслови и описи одредишних предмета треба да имају следећи JSON облик:", - "copyManyCardsPopup-format": "[ {\"наслов\": \"Наслов првог предмета\", \"опис\":\"Опис првог предмета\"}, {\"наслов\":\"Наслов другог предмета\",\"опис\":\"Опис другог предмета\"},{\"наслов\":\"Наслов последњег предмете\",\"опис\":\"Опис последњег предмета\"} ]", + "copyCardPopup-title": "Умножи картицу", + "copyManyCardsPopup-title": "Умножи предложак на више картица", + "copyManyCardsPopup-instructions": "Наслови и описи одредишних картица у следећем JSON облику", + "copyManyCardsPopup-format": "[ {\"наслов\": \"Наслов прве картице\", \"опис\":\"Опис прве картице\"}, {\"наслов\":\"Наслов друге картице\",\"опис\":\"Опис друге картице\"},{\"наслов\":\"Наслов последње картице\",\"опис\":\"Опис последње картице\"} ]", "create": "Уведи", - "createBoardPopup-title": "Увод нових списа", - "createTemplateContainerPopup-title": "Додај сандук са предлошцима", - "chooseBoardSourcePopup-title": "Унеси спољне списе", + "createBoardPopup-title": "Уведи нову пословну књигу", + "chooseBoardSourcePopup-title": "Уведи пословну књигу", "createLabelPopup-title": "Нова налепница", - "createCustomField": "Нова рубрика", - "createCustomFieldPopup-title": "Нова рубрика", + "createCustomField": "Направи сасвим ново поље", + "createCustomFieldPopup-title": "Направи сасвим ново поље", "current": "текуће", - "custom-field-delete-pop": "Опозив ове радње неће бити могућ. Радњом се уклања ова придружена рубрика из свих предмета и уништива њена претходна историја употребе.", + "custom-field-delete-pop": "Опозив ове радње неће бити могућ. Овим се уклања ово сасвим ново поље из свих картица и уништива његова историја.", "custom-field-checkbox": "Поље за штиклирање", "custom-field-currency": "Валута", "custom-field-currency-option": "Код валуте", @@ -374,16 +354,16 @@ "custom-field-dropdown-unknown": "(непознато)", "custom-field-number": "Број", "custom-field-text": "Текст", - "custom-fields": "Придружене рубрике", + "custom-fields": "Сасвим нова поља", "date": "Датум", - "date-format": "Начин записивање датума", - "date-format-yyyy-mm-dd": "година-месец-дан", - "date-format-dd-mm-yyyy": "дан-месец-година", - "date-format-mm-dd-yyyy": "месец-дан-година", + "date-format": "Date Format", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Одбиј", - "default-avatar": "иницијали уместо слике", + "default-avatar": "Унапред изабрана сличица", "delete": "Уклони", - "deleteCustomFieldPopup-title": "Обрисаћете ову придружену рубрику?", + "deleteCustomFieldPopup-title": "Обрисаћете сасвим ново поље?", "deleteLabelPopup-title": "Одлепићете све овакве налепнице?", "description": "Опис", "disambiguateMultiLabelPopup-title": "Недвосмислене радње на налепницама", @@ -393,122 +373,121 @@ "download": "Преузми", "edit": "Уреди", "edit-avatar": "Моја слика", - "edit-profile": "Лични подаци", - "edit-wip-limit": "Затрпавање предметима", - "soft-wip-limit": "Мека граница броја предмета", - "editCardStartDatePopup-title": "Кад сте започели рад на предмету", - "editCardDueDatePopup-title": "Крајњи рок за предмет", - "editCustomFieldPopup-title": "Измени наслов рубрике", + "edit-profile": "Моји лични подаци", + "edit-wip-limit": "Уреди ограничење броја послова", + "soft-wip-limit": "Мека граница броја послова", + "editCardStartDatePopup-title": "Кад је задатак започет", + "editCardDueDatePopup-title": "Крајњи рок за испуњење задатка", + "editCustomFieldPopup-title": "Измени поље", "addReactionPopup-title": "Реакција на објаву", "editCardSpentTimePopup-title": "Промени утрошено време", "editLabelPopup-title": "Постојећа налепница", "editNotificationPopup-title": "Измени обавештење", "editProfilePopup-title": "Лични подаци", "email": "Е-пошта", - "email-address": "Адреса електронске поште", "email-enrollAccount-subject": "За Вас је направљен један налог на __siteName__", "email-enrollAccount-text": "Здраво __user__,\n\nДа би почели да користите услугу, једноставно притисните на везу која је испод.\n\n__url__\n\nХвала.", - "email-fail": "Неуспело слање е-поште!", + "email-fail": "Неуспело слање е-поште", "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": "Задајте поново вашу лозинку на страници __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-vertical-scrollbars": "Enable vertical scrollbars", - "enable-wip-limit": "Ограничи број предмета", - "error-board-doesNotExist": "Овакви списи не постоје", - "error-board-notAdmin": "Да би то урадили, треба да будете управник ових списа", - "error-board-notAMember": "Да би то урадили треба да будете сарадник на овим списима", + "enable-wip-limit": "Ограничи број послова", + "error-board-doesNotExist": "Ова пословна књига не постоји", + "error-board-notAdmin": "Да би то урадили, треба да будете администратор/управник ове књиге пословања", + "error-board-notAMember": "Да би то урадили треба да будете сарадник у овој пословној књизи", "error-json-malformed": "То што сте укуцали нема исправан JSON облик", "error-json-schema": "Ваши подаци у JSON облику не укључују исправне информације у предвиђеном облику", "error-csv-schema": "Ваш CSV(Вредности раздвојене зарезом)/TSV (Вредности раздвојене табулатором) не укључује исправну информацију у предвиђеном облику", "error-list-doesNotExist": "Ова деоница не постоји", "error-user-doesNotExist": "Сарадник не постоји", - "error-user-notAllowSelf": "Не можете сами себе да позовете", - "error-user-notCreated": "Сарадник није уписан", - "error-username-taken": "Кориснички налог је већ у употреби", - "error-orgname-taken": "Ово (пословно) име странке је већ у употреби", - "error-teamname-taken": "Ово име правног тима је већ у употреби", + "error-user-notAllowSelf": "Не можеш да позовеш сам себе", + "error-user-notCreated": "Сарадник не постоји", + "error-username-taken": "Корисничко име је већ у употреби", + "error-orgname-taken": "Ово име предузећа је већ у употреби", + "error-teamname-taken": "Ово име тима је већ у употреби", "error-email-taken": "Ова адреса е-поште је већ у употреби", - "export-board": "Претвори списе", - "export-board-json": "Претварање списа у JSON", - "export-board-csv": "Претварање списа у CSV", - "export-board-tsv": "Претварање списа у TSV", - "export-board-excel": "Претварање списа у Excel", - "user-can-not-export-excel": "Корисник не може да претвори списе у Excel облик", - "export-board-html": "Претварање списа у HTML", - "export-card": "Претвори предмет", - "export-card-pdf": "Претвори предмет у PDF облик", - "user-can-not-export-card-to-pdf": "Корисник не може да претвори садржај предмета у PDF облик", - "exportBoardPopup-title": "Претварање списа", - "exportCardPopup-title": "Претвори предмет", + "export-board": "Преведи пословну књигу", + "export-board-json": "Преведи пословну књигу у JSON", + "export-board-csv": "Преведи пословну књигу у CSV", + "export-board-tsv": "Преведи пословну књигу у TSV", + "export-board-excel": "Преведи пословну књигу у Excel", + "user-can-not-export-excel": "Корисник не може да преводи у Excel", + "export-board-html": "Преведи пословну књигу у HTML", + "export-card": "Преведи картицу са задатком", + "export-card-pdf": "Преведи картицу са задатком у PDF", + "user-can-not-export-card-to-pdf": "Корисник не може да преведе садржај картице са задатком у PDF", + "exportBoardPopup-title": "Превођење пословне књиге", + "exportCardPopup-title": "Превођење картице са задатком", "sort": "Редослед", "sorted": "Сложено", - "remove-sort": "Измешај предмете", - "sort-desc": "Притисните да би сложили делове поступка", - "list-sort-by": "Поређај делове поступка по:", - "list-label-modifiedAt": "Времену последње измене", - "list-label-title": "Називу дела поступка", - "list-label-sort": "Вашем личном нахођењу", - "list-label-short-modifiedAt": "(П)", - "list-label-short-title": "(Н)", - "list-label-short-sort": "(Л)", + "remove-sort": "Разбацај", + "sort-desc": "Притисните да би сложили деонице", + "list-sort-by": "Поређај деоницу по:", + "list-label-modifiedAt": "Време последње измене", + "list-label-title": "Назив деонице", + "list-label-sort": "Vaš ručni nalog", + "list-label-short-modifiedAt": "(P)", + "list-label-short-title": "(N)", + "list-label-short-sort": "(R)", "filter": "Издвајање", - "filter-cards": "Издвој предмете или делове поступка", + "filter-cards": "Издвој картице или деонице", "filter-dates-label": "Издвој по датуму", - "filter-no-due-date": "Где није постављен рок", - "filter-overdue": "Где је пробијен рок", - "filter-due-today": "Где рок истиче данас", - "filter-due-this-week": "Где рок истиче ове недеље", - "filter-due-next-week": "Где рок истиче следеће недеље", - "filter-due-tomorrow": "Где рок истиче сутрадан", - "list-filter-label": "Издвој део поступка по наслову", + "filter-no-due-date": "Нема датума истека", + "filter-overdue": "Прекорачено време", + "filter-due-today": "Рок истиче данас", + "filter-due-this-week": "Рок истиче ове недеље", + "filter-due-next-week": "Рок истиче следеће недеље", + "filter-due-tomorrow": "Рок истиче сутрадан", + "list-filter-label": "Издвој деонице по наслову", "filter-clear": "Прекини са издвајањем", "filter-labels-label": "Издвој по налепници", "filter-no-label": "Нема налепницу", - "filter-member-label": "Издвој по надлежном сараднику", - "filter-no-member": "Нико није надлежан", - "filter-assignee-label": "Издвој по пуномоћнику", - "filter-no-assignee": "Где никоме није дата пуномоћ", - "filter-custom-fields-label": "Издвој по рубрикама", - "filter-no-custom-fields": "Где нема рубрика", - "filter-show-archive": "Прикажи архивиране делове поступка", - "filter-hide-empty": "Сакриј делове поступка без предмета", + "filter-member-label": "Издвој по сараднику", + "filter-no-member": "Нема сарадника", + "filter-assignee-label": "Издвој по задужењу", + "filter-no-assignee": "Нико није задужен", + "filter-custom-fields-label": "Издвој по сасвим новим пољима", + "filter-no-custom-fields": "Нема сасвим нових поља", + "filter-show-archive": "Прикажи архивиране деонице", + "filter-hide-empty": "Сакриј празне деонице", "filter-on": "Издваја се", - "filter-on-desc": "Сад издвајате предмете из ових списа. Притисните овде да одредите како се издвајање врши.", + "filter-on-desc": "Издвајате картице из ове пословне књиге. Притисните овде да одредите како се издвајање врши.", "filter-to-selection": "Издвајање по изабраном", - "other-filters-label": "Преостала издвајања", + "other-filters-label": "Другачије издвајање", "advanced-filter-label": "Напредно издвајање", - "advanced-filter-description": "Напредно издвајање Вам омогућава да напишете ниску која садржи следеће операторе: == != <= >= && || ( ) Размак се користи да раздвоји операторе. Можете да издвајате поља из придружених рубрика позивајући се на њихова имена и вредности. На пример: ИмеПридруженогПоља == Вредност. Напомена: Уколико предметна поља или њихове вредности садрже размак треба да га обухватите у једноструке наводнике. На пример: 'Поље 1' == 'Вредност 1'. Да би избегли контролне знаке (' \\\\/) , можете да користите \\\\. Например: Поље1 == I\\\\'m . Такође можете измешати више услова. На пример: Поље1 == Вредност1 || Поље1 == Вредност2. Провера услова се обавља са лева на десно. Додавањем заграда ћете утицати на проверу. На пример: Поље1 == Вредност1 && ( Поље2 == Вредност2 || Поље2 == Вредност3 ). Такође можете претраживати поља програмерским изразима: Поље1 == /Tes.*/i", + "advanced-filter-description": "Напредно издвајање Вам омогућава да напишете ниску која садржи следеће оператореAdvanced: == != <= >= && || ( ) Празно место се користи да раздвоји операторе. Можете да издвајате сва поља која сте измислили пишући њихова имена и вредности. На пример: ИмеИзмишљеногПоља == Вредност. Напомена: Уколико предметна поља или њихове вредности садрже празна места треба да их обухватите у једноструке наводнике. На пример: 'Поље 1' == 'Вредност 1'. Да би избегли контролне знаке (' \\\\/) , можете да користите \\\\. Например: Поље1 == Ал\\\\' је дугачко поље. Такође можете измешати више услова. На пример: Поље1 == Вредност1 || Поље1 == Вредност2. Провера услова се обавља са лева на десно. Додавањем заграда ћете утицати на проверу. На пример: Поље1 == Вредност1 && ( Поље2 == Вредност2 || Поље2 == Вредност3 ). Такође можете претраживати поља програмерским изразима: Поље1 == /Tes.*/i", "fullname": "Име и презиме", - "header-logo-title": "Вратите се на полицу са Вашим списима.", - "show-activities": "Писани записник", - "headerBarCreateBoardPopup-title": "Увод нових списа", + "header-logo-title": "Вратите се на полицу са Вашим пословним књигама.", + "show-activities": "Show Activities", + "headerBarCreateBoardPopup-title": "Отвори нову књигу пословања", "home": "Почетна", "import": "Унеси", - "impersonate-user": "Увуци се у налог овог корисника", + "impersonate-user": "Лажно представљен корисник", "link": "Веза", - "import-board": "унеси спољне списе", - "import-board-c": "Извор спољних списа", - "import-board-title-trello": "Trello", - "import-board-title-wekan": "Wekan", - "import-board-title-csv": "CSV/TSV", - "from-trello": "Извор Trello", - "from-wekan": "Извор претходни Wekan подаци", - "from-csv": "Извор CSV/TSV датотека", - "import-board-instruction-trello": "У Вашоим Trello списима, идите у 'Menu', затим 'More', 'Print and Export', 'Export JSON', и умножите представљени текст.", + "import-board": "уведи пословну књигу", + "import-board-c": "Уведи пословну књигу", + "import-board-title-trello": "Уведи књигу пословања из Trella", + "import-board-title-wekan": "Уведи пословну књигу из претходног преноса", + "import-board-title-csv": "Уведи једну CSV/TSV пословну књигу", + "from-trello": "Из Trello", + "from-wekan": "Из претходног превода", + "from-csv": "Из CSV/TSV", + "import-board-instruction-trello": "У Вашој Trello пословној књизи, идите у 'Menu', затим 'More', 'Print and Export', 'Export JSON', и умножите представљени текст.", "import-board-instruction-csv": "Овде залепите Ваше CSV податке (вредности раздвојене зарезом) односно TSV податке (вредности раздвојене табулатором) .", - "import-board-instruction-wekan": "У Вашим списима, изаберите ставке 'Мени', затим 'Унеси списе' и на крају умножите сав садржај/текст из преузете датотеке.", - "import-board-instruction-about-errors": "Ако се јаве грешке при уношењу списа то не значи да унос није успео!Проверите јел се спис појавио у одељку „Списи у мојој надлежности“.", + "import-board-instruction-wekan": "У Вашој књизи пословања, изаберите ставке 'Мени', затим 'Преведи пословни књигу' и на крају умножите сав садржај/текст из преузете датотеке.", + "import-board-instruction-about-errors": "Ако се јаве грешке при уношење пословне књиге то не значи да унос није успео!Проверите јел се књига појавила у одељку Моје пословне књиге.", "import-json-placeholder": "Овде сместите Ваше исправне JSON податке", "import-csv-placeholder": "Овде сместите Ваше исправне CSV/TSV податке", "import-map-members": "Мапирај сараднике", - "import-members-map": "Списи које сте унели имају постављену мрежу сарадника. Молим да мапирате сараднике из те мреже на Ваше сараднике", + "import-members-map": "Пословна књига коју сте унели има постављену мрежу сарадника. Молим да мапирате сараднике из те мреже на Ваше сараднике", "import-members-map-note": "Белешка: Немапирани сарадници ће бити додељени на тренутног корисника.", "import-show-user-mapping": "Испрегледај како су сарадници измапирани", "import-user-select": "Изаберите Вашег познатог сарадника којег желите да корисите као овог", @@ -519,73 +498,68 @@ "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-move-cards": "Премести све предмете из овог дела поступка", - "list-select-cards": "Изабери све предмете", - "set-color-list": "Обоји", - "listActionPopup-title": "Радње у делу поступка", - "settingsUserPopup-title": "Рад са сарадницима", - "settingsTeamPopup-title": "Рад са правним тимовима", - "settingsOrgPopup-title": "Рад са странкама", - "swimlaneActionPopup-title": "Радње у овој врсти поступка", - "swimlaneAddPopup-title": "Додаје испод врсту поступка", - "listImportCardPopup-title": "Унеси једнан Trello предмет", + "leave-board": "Раздужи књигу пословања", + "leave-board-pop": "Да ли сте сигурни да желите да раздужите пословну књигу __boardTitle__? Бићете одстрањени са свих задатака из ове књиге пословања.", + "leaveBoardPopup-title": "Раздужићете пословну књигу ?", + "link-card": "Веза до ове картице", + "list-archive-cards": "Премести у архив све картице са задацима са ове деонице", + "list-archive-cards-pop": "Овим склањате све задатке на овој деоници из књиге пословања. Да испрегледате архивиране задатке и вратите их натраг у књигу пословања притисните на “Мени” > “Архив”.", + "list-move-cards": "Премести све картице на овој деоници", + "list-select-cards": "Изабери све картице на овој деоници", + "set-color-list": "Обоји деоницу", + "listActionPopup-title": "Радње на деоници", + "settingsUserPopup-title": "Корисничка подешавања", + "settingsTeamPopup-title": "Тимска подешавања", + "settingsOrgPopup-title": "Подешавања предузећа", + "swimlaneActionPopup-title": "Радње на стазама", + "swimlaneAddPopup-title": "Додаје једну стазу испод", + "listImportCardPopup-title": "Унеси једну Trello картицу", "listImportCardsTsvPopup-title": "Унеси Excel CSV/TSV", "listMorePopup-title": "Више", "link-list": "Веза до ове деонице", - "list-delete-pop": "Читав записник са овог дела поступка биће уклоњен и нећете га моћи опоравити. Опозив ове радње неће бити могућ.", - "list-delete-suggest-archive": "Боље је да преместите читав део поступка у Архив чиме чувате записник а део поступка ипак склањате из списа.", - "lists": "Делови поступка", - "swimlanes": "Врсте поступака", - "log-out": "Одјави се", + "list-delete-pop": "Све досадашње забележене радње на деоници биће уклоњене и нећете моћи опоравити деоницу. Опозив ове радње неће бити могућ.", + "list-delete-suggest-archive": "Можете да преместите целу неку деоницу у Архив чиме чувате историју деонице а ипак је склањате из књиге пословања.", + "lists": "Деонице", + "swimlanes": "Стазе", + "log-out": "Одјава", "log-in": "Пријави се", - "loginPopup-title": "Пријавница", + "loginPopup-title": "Пријава", "memberMenuPopup-title": "Сарадник", - "grey-icons": "Grey Icons", "members": "Сарадници", "menu": "Мени", "move-selection": "Премести изабрано", - "moveCardPopup-title": "Премести предмет", + "moveCardPopup-title": "Премести картицу са задатком", "moveCardToBottom-title": "Премести на дно", "moveCardToTop-title": "Премести на врх", "moveSelectionPopup-title": "Премести изабрано", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Вишеструк избор", - "multi-selection-label": "Залепите или одлепите налепнице на одабране предмете", - "multi-selection-member": "Одаберите и сараднике", - "multi-selection-on": "Постоји вишеструк избор", - "muted": "Не примај обававештења", - "muted-info": "Нећете чути обавештења кад наступе било какве промене у овим списима", - "my-boards": "Списи у мојој надлежности", + "multi-selection-label": "Изаберите налепницу", + "multi-selection-member": "Изаберите и сарадника", + "multi-selection-on": "Вишеструк избор је омогућен", + "muted": "Утишано", + "muted-info": "Нећете чути обавештење о променама у овој пословној књизи", + "my-boards": "Моје књиге пословања", "name": "Задајте (нови) натпис", - "no-archived-cards": "Нема архивираних предмета.", - "no-archived-lists": "Нема архивираних делова поступака.", - "no-archived-swimlanes": "Нема архивираних врсти поступака.", + "no-archived-cards": "Нама архивираних картица са задацима.", + "no-archived-lists": "Нема архивираних деоница.", + "no-archived-swimlanes": "Нема архивираних стаза.", "no-results": "Нема резултата", - "normal": "Виши сарадник", - "normal-desc": "Може да има и увид и пун приступ предметима. Не може да поставља правила рада на списима.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", + "normal": "Нормално", + "normal-desc": "Може да гледа и уређује картице. Не може да мења подешавања.", "not-accepted-yet": "Позив још није прихваћен", - "notify-participate": "Примајте допунске извештаје при било којој измени предмета које сте сами завели или где сте сарадник", - "notify-watch": "Примајте допунске извештаје при било којој измени списа, делова поступака или предмета које пратите", + "notify-participate": "Примајте допунске извештаје за било које картице са задацима у којима учествујете као налогодавац или сарадник", + "notify-watch": "Примајте допунске извештаје за било које пословне књиге, деонице, или картице са задацима које пратите", "optional": "по избору", "or": "или", - "page-maybe-private": "Ови списи су могуће под велом тајности. Можда ћете ипак моћи да их видите кад се <a href='%s'>пријавите овде</a>.", + "page-maybe-private": "Ова страницаје је, могуће, приватна. Можда ћете моћи да је видите кад се <a href='%s'>пријавите</a>.", "page-not-found": "Страница није пронађена.", "password": "Лозинка", "paste-or-dragdrop": "налепи, или држи и испусти слику на то (важи само за слике)", @@ -593,114 +567,114 @@ "preview": "Приказ", "previewAttachedImagePopup-title": "Приказ", "previewClipboardImagePopup-title": "Приказ", - "private": "Видљиво сарадницима", - "private-desc": "Ови списи су тајни. Само одобрени сарадници могу да их читају и уређују.", + "private": "Приватно", + "private-desc": "Ова пословна књига је приватна. Само одобрени сарадници могу да је читају и уређују.", "profile": "Особина", - "public": "Списи видљиви свима", - "public-desc": "Ови списи су потпуно јавни. Видљиви су сваком ко има везу до њих и појавиће се и у google претрагама. Једино одобрени сарадници могу бити уредници.", - "quick-access-description": "Означите списе звездицом да би додали пречицу на ову траку.", - "remove-cover": "Уклоните осликани омот", - "remove-from-board": "Избаци из списа", + "public": "Јавно", + "public-desc": "Ова пословна књига је јавна. Видљива је сваком ко има везу и појавиће се у google претрагама. Једино одобрени сарадници могу бити уредници.", + "quick-access-description": "Означи књигу пословања звездицом да додаш пречицу на ову траку.", + "remove-cover": "Уклоните насловну слику са мини картице", + "remove-from-board": "Избаци из књиге пословања", "remove-label": "Скини налепницу", - "listDeletePopup-title": "Обрисаћете део поступка?", - "remove-member": "Скини сарадника", - "remove-member-from-card": "Скини га са предмета", - "remove-member-pop": "Изузећете __name__ (__username__) из списа __boardTitle__? Сарадник ће бити изузет са свих предмета у списима. Примиће обавештење о томе.", - "removeMemberPopup-title": "Изузећете сарадника?", + "listDeletePopup-title": "Обрисаћете деоницу?", + "remove-member": "Удаљи сарадника", + "remove-member-from-card": "Удаљи га са задатка", + "remove-member-pop": "Удаљићете __name__ (__username__) из __boardTitle__? Сарадник ће бити удаљен са свих задатака из ове књиге пословања. Примиће обавештење о томе.", + "removeMemberPopup-title": "Удаљићете сарадника?", "rename": "Преименуј", - "rename-board": "Преименуј списе", + "rename-board": "Преименуј књигу пословања", "restore": "Опорави", - "rescue-card-description": "Понуди још једну прилику да се забележи несачувани опис предмета пре затварања", - "rescue-card-description-dialogue": "Преписаћете тренутни опис предмета са допуњеним?", + "rescue-card-description": "Понуди још једну прилику да се забележе несачувани описи задатака пре затварања картице", + "rescue-card-description-dialogue": "Преписаћете тренутни опис задатка са Вашим описом?", "save": "Сачувај", "search": "Претрага", - "rules": "Правилник", - "search-cards": "Тражи у насловима предмета, делова поступака и рубрика у овим списима", - "search-example": "Укуцајте све што тражите и притисните ентер", - "select-color": "Изабери боју за овакав поступак", - "select-board": "Изаберите списе", - "set-wip-limit-value": "Поставите границу дозвољеног броја предмета у овом делу поступка", - "setWipLimitPopup-title": "Ограничење броја предмета", - "shortcut-add-self": "Доделите надлежност себи", - "shortcut-assign-self": "Поверите пуномоћ себи", + "rules": "Правила", + "search-cards": "Тражи у насловима задатака/деоница, новим пољима у овој пословној књизи", + "search-example": "Укуцајте речи/текст које тражите и притисните ентер", + "select-color": "Изаберите (нову) боју", + "select-board": "Изаберите књигу пословања", + "set-wip-limit-value": "Поставите границу за максимални дозвољени број задатака на овој деоници", + "setWipLimitPopup-title": "Поставите ограничење броја послова", + "shortcut-add-self": "Add yourself to current card", + "shortcut-assign-self": "Придружите себе тренутној картици", "shortcut-autocomplete-emoji": "Сам попуни emoji", "shortcut-autocomplete-members": "Сам попуни сараднике", "shortcut-clear-filters": "Прекини издвајање", "shortcut-close-dialog": "Затвори прозорче", - "shortcut-filter-my-cards": "Издвој предмете где имам увид", - "shortcut-filter-my-assigned-cards": "Издвој предмете где сам пуномоћник", - "shortcut-show-shortcuts": "Прикажи овај подсетник са пречицама", - "shortcut-toggle-filterbar": "Алат за издвајање", - "shortcut-toggle-searchbar": "Алат за претрагу", - "shortcut-toggle-sidebar": "Алат за рад са списима", - "show-cards-minimum-count": "Изброј предмете и прикажи тај број тек ако део поступка садржи више од", - "sidebar-open": "Извади алат", - "sidebar-close": "Спакуј алат", - "signupPopup-title": "Јединствени регистар", - "star-board-title": "Означите спис звездицом. Имаће предност и бити на челу.", - "starred-boards": "Списи са звездицом", - "starred-boards-description": "Списи означени звездицом се појављују испред других.", + "shortcut-filter-my-cards": "Издвој задатке", + "shortcut-filter-my-assigned-cards": "Filter my assigned cards", + "shortcut-show-shortcuts": "Прикажи овај списак пречица", + "shortcut-toggle-filterbar": "Укључи/искључи бочни мени за издвајање", + "shortcut-toggle-searchbar": "Укључи/искључи бочни мени за претрагу", + "shortcut-toggle-sidebar": "Укључи/искључи бочни мени пословне књиге", + "show-cards-minimum-count": "Прикажи број картица са задацима ако деоница садржи више од", + "sidebar-open": "Отвори бочну површину", + "sidebar-close": "Затвори бочну површину", + "signupPopup-title": "Направите налог", + "star-board-title": "Притисни да означиш звездицом баш ову књигу пословања. Имаће предност и бити на челу.", + "starred-boards": "Пословне књиге са звездицом", + "starred-boards-description": "Књиге пословања са звездицом се појављују испред других.", "subscribe": "Претплати се", - "team": "Правни тим", - "this-board": "ове списе", - "this-card": "овај предмет", + "team": "Тим", + "this-board": "ова пословна књига", + "this-card": "ова картица са задатком", "spent-time-hours": "Потрошено време (у сатима)", "overtime-hours": "Прековремени (сати)", "overtime": "Прековремено", - "has-overtime-cards": "Постоје предмети са прековременим радом", - "has-spenttime-cards": "Постоје предмети где сат одбројава", + "has-overtime-cards": "Има задатке на којима је прековремено радио", + "has-spenttime-cards": "Има задатке са мерењем времена", "time": "Време", "title": "Наслов", - "toggle-assignees": "Одабери пуномоћника на предмету по редоследу додавања у увид у списе.", - "toggle-labels": "Лепите и одлепљујете налепнице по броју. Вишеструким избором можете само да лепите", - "remove-labels-multiselect": "Вишеструким избором одлепљујете налепнице", - "tracking": "Прикупљај обавештења из моје надлежности", - "tracking-info": "Бићете обавештени о било каквој промени у оним предметима где сте укључени као сарадник или које сте лично завели.", + "toggle-assignees": "Toggle assignees 1-9 for card (By order of addition to board).", + "toggle-labels": "Укључи/искључи натписе од 1 до 9 за задатак. Вишеструк избор додаје натпис од 1 до 9", + "remove-labels-multiselect": "Вишеструким избором се уклањају натписи од 1 до 9", + "tracking": "Праћење", + "tracking-info": "Бићете обавештени о свим променама на оним картицама са задацима где сте укључени као налогодавац или као сарадник.", "type": "Врста", "unassign-member": "Недодељени сарадник", "unsaved-description": "Нисте сачували опис.", "unwatch": "Скини са мера праћења", "upload": "Подигни", - "upload-avatar": "слика уместо иницијала", - "uploaded-avatar": "Слика је подигнута на сервер", - "uploading-files": "Шаљем датотеке", - "upload-failed": "Слање није успело", - "upload-completed": "Слање је успело", - "custom-top-left-corner-logo-image-url": "Веза до места на Интернету где се налази слика са Вашим логом за приказивање у горњем левом углу", + "upload-avatar": "Пошаљите Вашу сличицу на сервер", + "uploaded-avatar": "Сличица је подигнута на сервер", + "uploading-files": "Uploading files", + "upload-failed": "Upload failed", + "upload-completed": "Upload completed", + "custom-top-left-corner-logo-image-url": "Веза до места на Интернету где је слика са Вашим логом за приказивање у горњем левом углу", "custom-top-left-corner-logo-link-url": "Веза до места на Интернету које се посећује када си кликне на Ваш лого у горњем левом углу", "custom-top-left-corner-logo-height": "Висина за Ваш лого у горњем левом углу. Уобичајена вредност: 27", - "custom-login-logo-image-url": "Веза до места на Интернету са ког се повлачи насловна слика код пријаве", + "custom-login-logo-image-url": "Веза до места на Интернету где је насловна слика код пријаве", "custom-login-logo-link-url": "Слика изнад дела за пријаву води до следећег места на Интернету", "custom-help-link-url": "Место на Интернету где се може затражити помоћ", "text-below-custom-login-logo": "Порука испод насловне слике на страни за пријаву", "automatic-linked-url-schemes": "Група места на Интернету која би могла да се посете. Једна група по линији", - "username": "Кориснички налог", - "import-usernames": "Увези корисничке налоге", + "username": "Корисничко име", + "import-usernames": "Увези корисничка имена", "view-it": "Погледај је", - "warn-list-archived": "упозорење: овај предмет постоји у архиви у једном делу поступка", - "watch": "Стави на мере праћења", - "watching": "Прикупљај сва обавештења", - "watching-info": "Бићете обавештени о било каквој промени у овим списима", - "welcome-board": "Списи са добродошлицом", - "welcome-swimlane": "Врста 1", + "warn-list-archived": "упозорење: ова картица са задатком јесте у једној деоници али у архиви", + "watch": "Посматрај", + "watching": "Посматрање", + "watching-info": "Бићете обавештени о променама у овој пословној књизи", + "welcome-board": "Пословна књига за добродошлицу", + "welcome-swimlane": "Стаза 1", "welcome-list1": "Основно", "welcome-list2": "Напредно", - "card-templates-swimlane": "Обрасци за предмете", - "list-templates-swimlane": "Обрасци за делове поступака", - "board-templates-swimlane": "Обрасци за списе", + "card-templates-swimlane": "Предлошци за картице са задацима", + "list-templates-swimlane": "Предложак за деонице", + "board-templates-swimlane": "Предложак за пословну књигу", "what-to-do": "Шта желите да урадите ?", - "wipLimitErrorPopup-title": "Досегнуто ограничење броја предмета", - "wipLimitErrorPopup-dialog-pt1": "Број предмета у овом делу поступка је већи него ограничење које сте поставили.", - "wipLimitErrorPopup-dialog-pt2": "Молим да преместите неке предмете из овог дела поступка или да повећате границу.", - "admin-panel": "Управа", - "settings": "Општа поставка", + "wipLimitErrorPopup-title": "Досегнуто ограничење броја послова", + "wipLimitErrorPopup-dialog-pt1": "Број задатака на овој деоници је већи него ограничење које сте поставили.", + "wipLimitErrorPopup-dialog-pt2": "Молим да или обавите неке послове на овој деоници или да поставите веће ограничење дозвољеног броја послова.", + "admin-panel": "Главна управа", + "settings": "Подешавања", "people": "Сарадници", - "registration": "Упис", - "disable-self-registration": "Налог не може да се отвори без позивнице", - "disable-forgot-password": "Спречи процедуру за заборављену лозинку", - "invite": "Упути позив", - "invite-people": "Доле позваним омогући и пун увид", - "to-boards": "У списе", + "registration": "Отварање налога", + "disable-self-registration": "Онемогући да корисници сами себи отворе налог", + "disable-forgot-password": "Онемогући да корисници сами затраже промену лозинке", + "invite": "Позив", + "invite-people": "Позови сараднике", + "to-boards": "У пословну књигу(e)", "email-addresses": "Адресе е-поште", "smtp-host-description": "Тачна адреса SMTP сервера који рукује вашом е-поштом.", "smtp-port-description": "Порт Вашег SMTP сервера који се користи за одлазну е-пошту.", @@ -711,23 +685,23 @@ "smtp-password": "Лозинка", "smtp-tls": "TLS подршка", "send-from": "Од", - "send-smtp-test": "Проба да ли поруке пролазе", + "send-smtp-test": "Пошаљите сами себи једну пробну е-поруку", "invitation-code": "Позивни код", "email-invite-register-subject": "__inviter__ Вам је послао позивницу", - "email-invite-register-text": "Поштовани __user__,\n\n__inviter__ Вас позива да користите kanban списе за заједнички рад.\n\nМолим испратите везу испод:\n__url__\n\nИ да, Ваш позивни код је: __icode__\n\nХвала.", + "email-invite-register-text": "Драги __user__,\n\n__inviter__ Вас позива да користите kanban пословне књиге за заједнички рад.\n\nМолим испратите везу испод:\n__url__\n\nИ да, Ваш позивни код је: __icode__\n\nХвала.", "email-smtp-test-subject": "Проба да ли ради слање е-поште", "email-smtp-test-text": "Успешно сте послали е-пошту", - "error-invitation-code-not-exist": "Такав позивни код не постоји", + "error-invitation-code-not-exist": "Позивни код не постоји", "error-notAuthorized": "Немате права да приступате овој страници.", - "webhook-title": "Назив за дојаву догађаја", + "webhook-title": "Назив мрежне куке", "webhook-token": "Token (необавезно за проверу идентитета)", - "outgoing-webhooks": "Дојава догађаја", - "bidirectional-webhooks": "Двосмерно понашање", - "outgoingWebhooksPopup-title": "Дојава догађаја", + "outgoing-webhooks": "Одлазна мрежна кука", + "bidirectional-webhooks": "Двосмерне мрежне куке", + "outgoingWebhooksPopup-title": "Одлазне мрежне куке", "boardCardTitlePopup-title": "Издвајање по наслову задатка", - "disable-webhook": "Онеспособи ову дојаву догађаја", - "global-webhook": "Дојава догађаја", - "new-outgoing-webhook": "Нова дојава догађаја", + "disable-webhook": "Онеспособи ову мрежну куку", + "global-webhook": "Глобална мрежна кука", + "new-outgoing-webhook": "Нова одлазна мрежна кука", "no-name": "(непознато)", "Node_version": "Node верзија", "Meteor_version": "Meteor верзија", @@ -747,79 +721,76 @@ "hours": "сати", "minutes": "минута", "seconds": "секунди", - "show-field-on-card": "Придружи ову рубрику овом предмету", - "automatically-field-on-card": "Сви будући предмети ће имати овакву рубрику", - "always-field-on-card": "Придодај овакву рубрику и свим постојећим предметима", - "showLabel-field-on-card": "Прикажи натпис ове рубрике на омоту предмета", - "showSum-field-on-list": "Прикажи збирни број придружених рубрика на врху деонице", + "show-field-on-card": "Прикажи ово поље на картицу са задатком", + "automatically-field-on-card": "Придодај поље новим картицама", + "always-field-on-card": "Придодај поље свим картицама", + "showLabel-field-on-card": "Прикажи натпис на налепници", + "showSum-field-on-list": "Прикажи збирни број поља на врху деонице", "yes": "Да", "no": "Не", "accounts": "Налози", "accounts-allowEmailChange": "Дозволи промену адресе е-поште", - "accounts-allowUserNameChange": "Дозволи промену имена налога", - "tableVisibilityMode-allowPrivateOnly": "Тајност списа: Дозволи приступ искључиво затвореном кругу сарадника", - "tableVisibilityMode" : "Тајност списа", + "accounts-allowUserNameChange": "Дозволи промену корисничког имена", + "tableVisibilityMode-allowPrivateOnly": "Видљивост пословне књиге: Дозволи једино приватне пословне књиге", + "tableVisibilityMode" : "Видљивост пословне књиге", "createdAt": "Направљено дана", "modifiedAt": "Време измене", - "verified": "Потврђен налог", + "verified": "Потрврђено", "active": "На окупу", - "card-received": "Запримљен", - "card-received-on": "Предмет запримљен дана", - "card-end": "Окончан", - "card-end-on": "Предмет окончан дана", - "editCardReceivedDatePopup-title": "Датум и време запримања предмета", - "editCardEndDatePopup-title": "Кад је задатак окончан", - "setCardColorPopup-title": "Боја омота предмета", - "setSelectionColorPopup-title": "Set selection color", - "setCardActionsColorPopup-title": "Боја за подлогу предмета", - "setSwimlaneColorPopup-title": "Боја за врсту поступка", - "setListColorPopup-title": "Боја за део поступка", - "assigned-by": "Властодавац", + "card-received": "Пријем", + "card-received-on": "Примљен дана", + "card-end": "Завршетак", + "card-end-on": "Завршава се дана", + "editCardReceivedDatePopup-title": "Датум и време запримања задатка", + "editCardEndDatePopup-title": "Кад је задатак постао испуњен", + "setCardColorPopup-title": "Обоји картицу", + "setCardActionsColorPopup-title": "Изабери боју", + "setSwimlaneColorPopup-title": "Изабери боју стазе", + "setListColorPopup-title": "Изабери боју деонице", + "assigned-by": "Додељено од стране", "requested-by": "Захтевано од", - "card-sorting-by-number": "Бројчана ознака за редослед", - "board-delete-notice": "Избацивање је трајно. Изгубићете све делове поступка, предмете и радње повезане са овим списима.", - "delete-board-confirm-popup": "Сви делови поступка, предмети, налепнице и записници биће избачени и нећете моћи да повратите садржај списа. Опозив ове радње неће бити могућ.", - "boardDeletePopup-title": "Избацићете ове списе?", - "delete-board": "Избаци списе", - "delete-duplicate-lists": "Уклоните истоимене делове поступка", - "delete-duplicate-lists-confirm": "Да ли сте сигурни? Овом радњом ће бити избрисани сви истоимени делови поступка где нема предмета.", - "default-subtasks-board": "Утврђени пријемни списи __board__", + "card-sorting-by-number": "Пресложи картице по броју", + "board-delete-notice": "Избацивање је трајно. Изгубићете све деонице, картице са задацима и радње повезане са овом књигом пословања.", + "delete-board-confirm-popup": "Све деонице, картице са задацима, налепнице и радње биће избачене и нећете моћи да повратите садржај књиге пословања. Опозив ове радње неће бити могућ.", + "boardDeletePopup-title": "Избацићете пословну књигу?", + "delete-board": "Избаци пословну књигу", + "default-subtasks-board": "Под задаци за __board__ књигу пословања", "default": "Подразумевано", "defaultdefault": "Подразумевано", - "queue": "Пријемно одељење", - "subtask-settings": "Поставка издвојених послова", - "card-settings": "Појединости и омот предмета", - "minicard-settings": "Рад са омотима предмета", - "boardSubtaskSettingsPopup-title": "Руковање издвојеним пословима", - "boardCardSettingsPopup-title": "Предмети у списима", - "boardMinicardSettingsPopup-title": "Рад са омотима предмета", - "deposit-subtasks-board": "Депонуј издвојене послове у списе:", - "deposit-subtasks-list": "Пријемно одељење кад овде депонују:", - "show-parent-in-minicard": "Испис порекла на омоту предмета:", - "description-on-minicard": "Опис на омоту", - "cover-attachment-on-minicard": "Мотив из предметне грађе", - "badge-attachment-on-minicard": "Број поред спајалице", - "card-sorting-by-number-on-minicard": "Бројчана ознака за редослед", - "prefix-with-full-path": "Испиши пуну путању као уводни слог", - "prefix-with-parent": "Испиши порекло као уводни слог", - "subtext-with-full-path": "Испиши пуну путању испод ситним словима", - "subtext-with-parent": "Испиши порекло испод ситним словима", - "change-card-parent": "Промени порекло предмета", - "parent-card": "Родитељски предмет", - "source-board": "Изворни списи", - "no-parent": "Немој исписивати никакво порекло", + "queue": "Ред", + "subtask-settings": "Подешавања подзадатака", + "card-settings": "Подешавања картице са задацима", + "minicard-settings": "Подешавања малих картица", + "boardSubtaskSettingsPopup-title": "Подешавања под задатака у пословним књигама", + "boardCardSettingsPopup-title": "Подешавања картица са задацима", + "boardMinicardSettingsPopup-title": "Подешавања малих картица", + "deposit-subtasks-board": "Депонуј подзадатке у ову пословну књигу:", + "deposit-subtasks-list": "Деоница у којој се смештају под задаци овде депоновани:", + "show-parent-in-minicard": "Прикажи порекло у малој картици:", + "description-on-minicard": "Опис мале картице", + "cover-attachment-on-minicard": "Насловна слика на мини картици", + "badge-attachment-on-minicard": "Број прилога на мини картици", + "card-sorting-by-number-on-minicard": "Слагање картица по броју на мини картици", + "prefix-with-full-path": "Префикс са пуном путањом", + "prefix-with-parent": "Префикс са пореклом", + "subtext-with-full-path": "Subtext са пуном путањом", + "subtext-with-parent": "Subtext са пореклом", + "change-card-parent": "Промени порекло картице", + "parent-card": "Родитељска картица", + "source-board": "Изворна књига пословања", + "no-parent": "Не приказуј порекло", "activity-added-label": "залепљена налепница '%s' на %s", "activity-removed-label": "уклоњена је налепница '%s' са %s", "activity-delete-attach": "уклоњен је прилог са %s", "activity-added-label-card": "залепљена је налепница '%s'", "activity-removed-label-card": "уклоњена је налепница '%s'", "activity-delete-attach-card": "избрисан је прилог", - "activity-set-customfield": "придружена је рубрика '%s' на '%s' у %s", - "activity-unset-customfield": "уклоњена је рубрика '%s' у %s", + "activity-set-customfield": "постављено је сасвим ново поље '%s' на '%s' у %s", + "activity-unset-customfield": "уклоњено је сасвим ново поље '%s' у %s", "r-rule": "Правило", - "r-add-trigger": "Прво додајте догађај", - "r-add-action": "Затим додајте радњу као одговор", - "r-board-rules": "Списак правила", + "r-add-trigger": "Додај окидач", + "r-add-action": "Додај радњу", + "r-board-rules": "Правила пословне књиге", "r-add-rule": "Додај правило", "r-view-rule": "Прегледај правило", "r-delete-rule": "Обриши правило", @@ -827,104 +798,104 @@ "r-no-rules": "Није уведено правило", "r-trigger": "Окидач", "r-action": "Радња", - "r-when-a-card": "Предмет", + "r-when-a-card": "Када картица", "r-is": "је", - "r-is-moved": "премештен", - "r-added-to": "додана на", - "r-removed-from": "скинут са", - "r-the-board": "списа", - "r-list": "део", + "r-is-moved": "је премештена", + "r-added-to": "Додан у", + "r-removed-from": "Уклоњена из", + "r-the-board": "пословна књига", + "r-list": "деоница", "set-filter": "Правило издвајања", - "r-moved-to": "премештен у", - "r-moved-from": "премештен из", + "r-moved-to": "Премештен у", + "r-moved-from": "Премештен из", "r-archived": "Премештен у архиву", "r-unarchived": "Извучен из архиве", - "r-a-card": "предмет", - "r-when-a-label-is": "Када је било која налепница", - "r-when-the-label": "Налепница", - "r-list-name": "име дела поступка", - "r-when-a-member": "Када је било који сарадник", - "r-when-the-member": "Сарадник по имену", + "r-a-card": "једна картица са задатком", + "r-when-a-label-is": "Када је налепница", + "r-when-the-label": "Када налепница", + "r-list-name": "име деонице", + "r-when-a-member": "Када је сарадник", + "r-when-the-member": "Када сарадник", "r-name": "име", - "r-when-a-attach": "Када је нека предметна грађа", - "r-when-a-checklist": "Када је нека предметна радња", - "r-when-the-checklist": "Када је предметна радња", - "r-completed": "обављена", - "r-made-incomplete": "означена као необављена", - "r-when-a-item": "Када је нека ставка са списка", - "r-when-the-item": "Када је ставка са списка", - "r-checked": "прецртана", - "r-unchecked": "означена као не прецртана", - "r-move-card-to": "Премести предмет на", + "r-when-a-attach": "Када је додатак", + "r-when-a-checklist": "Када је списак за обавити", + "r-when-the-checklist": "Када списак за обавити", + "r-completed": "Обављен", + "r-made-incomplete": "Није обављен", + "r-when-a-item": "Када је ставка на списку за обавити", + "r-when-the-item": "Када ставка на списку за обавити", + "r-checked": "Обављена", + "r-unchecked": "Необављена", + "r-move-card-to": "Премести картицу са задатком на", "r-top-of": "Врх", "r-bottom-of": "Дно", - "r-its-list": "свог дела поступка", - "r-archive": "спакован у архиву", - "r-unarchive": "извучен из архиве", - "r-card": "предмет", + "r-its-list": "своје деонице", + "r-archive": "Премести у архиву", + "r-unarchive": "Извуци из архиве", + "r-card": "картица", "r-add": "Додај", "r-remove": "Уклони", - "r-label": "налепницу", - "r-member": "сарадника по имену", - "r-remove-all": "Скини све сареднике са предмета", - "r-set-color": "Обоји", - "r-checklist": "предметну радњу", - "r-check-all": "Прецртај све", - "r-uncheck-all": "Означи све као непрецртано", - "r-items-check": "са списка", - "r-check": "Прецртај", - "r-uncheck": "Врати на дораду", - "r-item": "ставку", - "r-of-checklist": "са списка", + "r-label": "налепница", + "r-member": "сарадник", + "r-remove-all": "Удаљи све сараднике са задатка", + "r-set-color": "Обоји са", + "r-checklist": "списак за обавити", + "r-check-all": "Све је обављено", + "r-uncheck-all": "Није ништа обављено", + "r-items-check": "ставке на списку за обавити", + "r-check": "Обављено", + "r-uncheck": "Необављено", + "r-item": "ставка", + "r-of-checklist": "списка за обавити", "r-send-email": "Пошаљи е-пошту", "r-to": "за", "r-of": "од", "r-subject": "наслов", "r-rule-details": "Детаљи извођења правила", - "r-d-move-to-top-gen": "Помери предмет на врх тог дела поступка", - "r-d-move-to-top-spec": "Помери предмет на врх дела поступка", - "r-d-move-to-bottom-gen": "Помери предмет на дно тог дела поступка", - "r-d-move-to-bottom-spec": "Помери предмет на дно дела поступка", + "r-d-move-to-top-gen": "Премести картицу са задатком на врх своје деонице", + "r-d-move-to-top-spec": "Премести картицу са задатком на врх деонице", + "r-d-move-to-bottom-gen": "Премести картицу са задатком на дно своје деонице", + "r-d-move-to-bottom-spec": "Премести картицу са задатком на дно деонице", "r-d-send-email": "Пошаљи е-пошту", "r-d-send-email-to": "за", "r-d-send-email-subject": "наслов", "r-d-send-email-message": "порука", - "r-d-archive": "Премести предмет у архиву", - "r-d-unarchive": "Извуци предмет из архиве", + "r-d-archive": "Премести картицу са задатком у архиву", + "r-d-unarchive": "Извуци из архиве картицу са задатком", "r-d-add-label": "Залепи налепницу", "r-d-remove-label": "Уклони налепницу", - "r-create-card": "Заведи предмет", - "r-in-list": "у делу", - "r-in-swimlane": "поступка", + "r-create-card": "Направи нову картицу са задатком", + "r-in-list": "на деоници", + "r-in-swimlane": "у стази", "r-d-add-member": "Прими сарадника", - "r-d-remove-member": "Изузми сарадника", - "r-d-remove-all-member": "Изузми све сараднике", - "r-d-check-all": "Означи све ставке са списка као обављене", - "r-d-uncheck-all": "Означи све ставке са списка као необављене", - "r-d-check-one": "Обављена радња", - "r-d-uncheck-one": "Необављена радња", + "r-d-remove-member": "Удаљи сарадника", + "r-d-remove-all-member": "Удаљи све сараднике", + "r-d-check-all": "Означи све ставке на списку за обавити као обављене", + "r-d-uncheck-all": "Означи све ставке на списку за обавити као необављене", + "r-d-check-one": "Обављена ставка", + "r-d-uncheck-one": "Необављена ставка", "r-d-check-of-list": "списка за обавити", - "r-d-add-checklist": "Додај списак", - "r-d-remove-checklist": "Уклони списак", + "r-d-add-checklist": "Додај списак за обавити", + "r-d-remove-checklist": "Уклони списак за обавити", "r-by": "од", - "r-add-checklist": "Кад неко дода списак", + "r-add-checklist": "Додај списак за обавити", "r-with-items": "са ставкама", "r-items-list": "ставка1,ставка2,ставка3", - "r-add-swimlane": "Додај врсту поступка", - "r-swimlane-name": "врсту поступка", - "r-board-note": "Белешка: Непопуњено поље одговара свакој могућој вредности.", - "r-checklist-note": "Белешка: Ставке на списку морају да буду раздвојене зарезом.", - "r-when-a-card-is-moved": "Када је предмет премештен у други део поступка", - "r-set": "Унеси", - "r-update": "Помери", - "r-datefield": "временску одредницу кад је предмет", - "r-df-start-at": "започет", - "r-df-due-at": "орочен", - "r-df-end-at": "окончан", - "r-df-received-at": "запримљен", - "r-to-current-datetime": "на данашњи датум и тренутно време", - "r-remove-value-from": "Уклони временску одредницу из поља", - "r-link-card": "Кад је предмет у вези са списима", + "r-add-swimlane": "Додај стазу", + "r-swimlane-name": "име стазе", + "r-board-note": "Белешка: Остављено празно поље одговара свакој могућој вредности.", + "r-checklist-note": "Белешка: Ставке на списку за обавити морају да буду раздвојене зарезом.", + "r-when-a-card-is-moved": "Када је картица са задатком премештена на другу деоницу", + "r-set": "Постави", + "r-update": "Освежи", + "r-datefield": "поље са датумом", + "r-df-start-at": "почетак", + "r-df-due-at": "крајњи датум", + "r-df-end-at": "крај", + "r-df-received-at": "примљен", + "r-to-current-datetime": "до тренутног датума/времена", + "r-remove-value-from": "Уклони вредност са", + "r-link-card": "Увежи картицу на", "ldap": "LDAP", "oauth2": "OAuth2", "cas": "CAS", @@ -933,36 +904,34 @@ "custom-product-name": "Ваша реклама", "layout": "Распоред", "hide-logo": "Сакриј лого", - "hide-card-counter-list": "Сакриј бројач предмета на полици са списима", - "hide-board-member-list": "Сакриј списак сарадника на полици са списима", - "add-custom-html-after-body-start": "Уметни овај HTML код где почиње <body> деоница", - "add-custom-html-before-body-end": "Уметни овај HTML код пред крај </body> деонице", - "error-undefined": "Имамо непознат проблем", + "hide-card-counter-list": "Сакриј бројач задатака на картици у свим пословним књигама", + "hide-board-member-list": "Сакриј списак сарадника у свим књигама пословања", + "add-custom-html-after-body-start": "Уметни овај HTML код на сваки почетак <body> деонице", + "add-custom-html-before-body-end": "Уметни овај HTML код пред сваки крај </body> деонице", + "error-undefined": "Негде је настао проблем", "error-ldap-login": "Догодила се нека грешка приликом покушаја пријављивања", "display-authentication-method": "Прикажи метод за утврђивање идентитета", "oidc-button-text": "Измени OIDC текст на дугмету", "default-authentication-method": "Уобичајени метод за утврђивање идентитета", - "duplicate-board": "Умножи списе у још један примерак", + "duplicate-board": "Умножи пословну књигу у још један примерак", "duplicate-board-confirm": "Are you sure you want to duplicate this board?", - "org-number": "Број евидентираних странака је:", - "team-number": "Број правних тимова је:", - "people-number": "Укупан број сарадника је:", - "swimlaneDeletePopup-title": "Избрисаћете овај поступак ?", - "swimlane-delete-pop": "Све радње ће бити уклоњене из записника и нећете моћи да опоравите поступак. Нема поништавања.", + "org-number": "Број предузећа је:", + "team-number": "Број тимова је:", + "people-number": "Број сарадника је:", + "swimlaneDeletePopup-title": "Избрисаћете стазу ?", + "swimlane-delete-pop": "Све радње ће бити уклоњене из активности и нећете моћи да вратите стазу. Нема поништавања.", "restore-all": "Опорави све", "delete-all": "Обриши све", "loading": "Исчитавање, молим сачекајте.", "previous_as": "прошли пут је био", - "act-a-dueAt": "измењени крајњи рок \nРок:__timeValue__\nПредмет:__card__\nПретходни крајњи рок је био __timeOldValue__", - "act-a-endAt": "измењен датум и време окончања на __timeValue__ са претходно постављеног (__timeOldValue__)", - "act-a-startAt": "измењен датум и време почетка рада на предмету на __timeValue__ са претходно постављеног (__timeOldValue__)", - "act-a-receivedAt": "измењен датум и време пријема предмета на __timeValue__ са претходно постављеног (__timeOldValue__)", + "act-a-dueAt": "измењени крајњи рок \nКада:__timeValue__\nГде:__card__\nПретходни рок је био __timeOldValue__", + "act-a-endAt": "измењено време завршетка на __timeValue__ са претходно постављеног (__timeOldValue__)", + "act-a-startAt": "измењено време почетка на __timeValue__ са претходно постављеног (__timeOldValue__)", + "act-a-receivedAt": "измењено време пријема на __timeValue__ са претходно постављеног (__timeOldValue__)", "a-dueAt": "измењен крајњи рок", "a-endAt": "измењено време завршетка", "a-startAt": "измењено време почетка", "a-receivedAt": "измењено време пријема", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "приближава се крајњи рок %s", "pastdue": "крајњи рок %s је пробијен", "duenow": "крајњи рок %s је данас", @@ -971,25 +940,25 @@ "act-almostdue": "подсећам да се приближавамо последњем року (__timeValue__) за завршетак задатка __card__", "act-pastdue": "подсећам да је последњи рок (__timeValue__) задатка __card__ пробијен", "act-duenow": "подсећам да последњи рок (__timeValue__) задатка __card__ истиче данас", - "act-atUserComment": "Споменути сте у списима [__board__] тачније на делу поступка __list__ у предмету __card__", - "delete-user-confirm-popup": "Да ли сте сигурни да желите да уклоните овај појединачни кориснички налог сарадника? Опозив ове радње неће бити могућ.", - "delete-team-confirm-popup": "Да ли сте сигурни да желите да уклоните овај цео правни тим? Опозив ове радње неће бити могућ.", - "delete-org-confirm-popup": "Да ли сте сигурни да желите да уклоните ову странку? Опозив ове радње неће бити могућ.", - "accounts-allowUserDelete": "Дозволи сарадницима да сами испишу свој налог из јединственог регистра", + "act-atUserComment": "Споменути сте у пословној књизи [__board__] тачније на деоници __list__ на картици са задатком __card__", + "delete-user-confirm-popup": "Да ли сте сигурни да желите да избришете овај кориснички налог? Опозив ове радње неће бити могућ.", + "delete-team-confirm-popup": "Да ли сте сигурни да желите да избришете овај тим? Опозив ове радње неће бити могућ.", + "delete-org-confirm-popup": "Да ли сте сигурни да желите да избришете ово предузеће? Опозив ове радње неће бити могућ.", + "accounts-allowUserDelete": "Дозволи корисницима да сами избришу свој налог", "hide-minicard-label-text": "Сакриј натпис на налепници", "show-desktop-drag-handles": "Прикажи ручке за повлачење на радној површини", - "assignee": "Пуномоћник", - "cardAssigneesPopup-title": "Коме се даје пуномоћ", + "assignee": "Извршилац", + "cardAssigneesPopup-title": "Коме се додељује да изврши", "addmore-detail": "Додај детаљнији опис", - "show-on-card": "Видљиво у појединостима", - "show-on-minicard": "Видљиво на омоту", + "show-on-card": "Прикажи на картици", + "show-on-minicard": "Прикажи на налепници", "new": "Ново", - "editOrgPopup-title": "Опис странке", - "newOrgPopup-title": "Нова странка", - "editTeamPopup-title": "Опис правног тима", - "newTeamPopup-title": "Нови правни тим", - "editUserPopup-title": "Опис сарадника", - "newUserPopup-title": "Нови сарадник", + "editOrgPopup-title": "Уреди предузеће", + "newOrgPopup-title": "Ново предузеће", + "editTeamPopup-title": "Уреди податке за тим", + "newTeamPopup-title": "Нови тим", + "editUserPopup-title": "Уреди податке корисника", + "newUserPopup-title": "Нови корисник", "notifications": "Обавештења", "help": "Помоћ", "view-all": "Прикажи сва", @@ -1007,109 +976,107 @@ "saturday": "Субота", "sunday": "Недеља", "status": "Стање", - "swimlane": "Поступак", + "swimlane": "Стаза", "owner": "Власник", "last-modified-at": "Време последње измене", "last-activity": "Последње промене", "voting": "Гласање", "archived": "Архивирано", - "delete-linked-card-before-this-card": "Можете избрисати овај предмет тек кад, прво, избришете предмет у вези са њим", - "delete-linked-cards-before-this-list": "Не можете избрисати овај део поступка - прво избришете предмете који су у вези са предметима у овом делу поступка", - "hide-checked-items": "Сакриј обављене помоћне предметне радње", - "hide-finished-checklist": "Сакриј обављене предметне радње", + "delete-linked-card-before-this-card": "Не можете избрисати ову картицу пре него што прво избришете повезану картицу која има", + "delete-linked-cards-before-this-list": "Не можете избрисати ову деоницу -- прво избришете повезане картице које показују на картице на овој деоници", + "hide-checked-items": "Сакриј већ обављено са списка", + "hide-finished-checklist": "Hide finished checklist", "task": "Задатак", "create-task": "Задај", - "ok": "Сагласан", - "organizations": "Странке", - "teams": "Правни тимови", - "displayName": "Име (Пословно име)", - "shortName": "Скраћено пословно име", - "autoAddUsersWithDomainName": "Повежи са оним сарадницима чији је домен е-поште", - "website": "Званична интернет страница", - "person": "Лице", - "my-cards": "Предмети где имам пуномоћ", - "card": "Предмет", - "list": "Део поступка", - "board": "Списи", + "ok": "У реду", + "organizations": "Предузећа", + "teams": "Тимови", + "displayName": "Име које се приказује", + "shortName": "Скраћеница", + "autoAddUsersWithDomainName": "Automatically add users with the domain name", + "website": "Интернет страница", + "person": "Особа", + "my-cards": "Моја задужења", + "card": "Картица", + "list": "Деоница", + "board": "Пословна књига", "context-separator": "/", - "myCardsViewChange-title": "Поглед на такве предмете", - "myCardsViewChangePopup-title": "Такви предмети треба да буду", - "myCardsViewChange-choice-boards": "Размештени по списима", - "myCardsViewChange-choice-table": "Приказани у табели", - "myCardsSortChange-title": "Редослед предмета где имам пуномоћ", - "myCardsSortChangePopup-title": "Поређај предмете где имам пуномоћ", - "myCardsSortChange-choice-board": "По деловодном броју списа", + "myCardsViewChange-title": "Приказ мојих задужења", + "myCardsViewChangePopup-title": "Приказ мојих задужења", + "myCardsViewChange-choice-boards": "Размештена по пословним књигама", + "myCardsViewChange-choice-table": "Приказана у табели", + "myCardsSortChange-title": "Издвајање мојих личних картица", + "myCardsSortChangePopup-title": "Издвајање мојих личних картица", + "myCardsSortChange-choice-board": "По натпису на књизи пословања", "myCardsSortChange-choice-dueat": "По датуму доспећа", - "dueCards-title": "Предмети са роковима", - "dueCardsViewChange-title": "Надлежност", - "dueCardsViewChangePopup-title": "Надлежност", - "dueCardsViewChange-choice-me": "где имам пуномоћ", - "dueCardsViewChange-choice-all": "где имам право увида", - "dueCardsViewChange-choice-all-description": "Приказује све нерешене предмете који имају постављен рок решавања из оних списа за које корисник има одобрење.", - "dueCards-noResults-title": "Није пронађен ниједан предмет са роком", - "dueCards-noResults-description": "Тренутно немате никакве предмете који има постављене рокове.", - "broken-cards": "Предмети где је веза покидана", - "board-title-not-found": "Списи под деловодним бројем '%s' нису пронађени.", - "swimlane-title-not-found": "Ток поступка '%s' није пронађен.", - "list-title-not-found": "Део поступка '%s' није пронађен.", - "label-not-found": "Натпис на налепници '%s' није пронађен.", - "label-color-not-found": "%s налепница у боји није пронађена.", - "user-username-not-found": "Сарадник са корисничким налогом '%s' није пронађен.", + "dueCards-title": "Послови којима истиче рок", + "dueCardsViewChange-title": "Приказ картица које истичу", + "dueCardsViewChangePopup-title": "Приказ картица које истичу", + "dueCardsViewChange-choice-me": "Моји недовршени послови", + "dueCardsViewChange-choice-all": "Недовршени послови сарадника", + "dueCardsViewChange-choice-all-description": "Прикажи све недовршене задатке који имају постављен рок решавања из пословних књига за које корисник има одобрење.", + "broken-cards": "Покидане картице", + "board-title-not-found": "Књига пословања '%s' није пронађена.", + "swimlane-title-not-found": "Стаза '%s' није пронађена.", + "list-title-not-found": "Деоница '%s' није пронађена.", + "label-not-found": "Налепница '%s' није пронађена.", + "label-color-not-found": "Боја налепнице %s није пронађена.", + "user-username-not-found": "Корисничко име '%s' није пронађено.", "comment-not-found": "Мишљење које садржи речи '%s' није пронађено.", - "org-name-not-found": "Странка по имену '%s' није пронађена.", - "team-name-not-found": "Правни тим по имену '%s' није пронађен.", - "globalSearch-title": "Претрага по списима", - "no-cards-found": "Није пронађен ни један предмет", - "one-card-found": "Пронађен је један предмет", - "n-cards-found": "Број пронађених предмета: %s", - "n-n-of-n-cards-found": "__start__-__end__ од __total__ предмета је нађено", - "operator-board": "списи", - "operator-board-abbrev": "с", - "operator-swimlane": "поступак", - "operator-swimlane-abbrev": "п", - "operator-list": "део", + "org-name-not-found": "Предузеће '%s' није пронађено.", + "team-name-not-found": "Тим '%s' није пронађен.", + "globalSearch-title": "Претрага", + "no-cards-found": "Није пронађена ни једна картица са задацима", + "one-card-found": "Пронађена је једна картица са задацима", + "n-cards-found": "Број пронађених картица са задацима: %s", + "n-n-of-n-cards-found": "__start__-__end__ од __total__ картица је нађено", + "operator-board": "пословна књига", + "operator-board-abbrev": "п", + "operator-swimlane": "стаза", + "operator-swimlane-abbrev": "с", + "operator-list": "деонице", "operator-list-abbrev": "д", - "operator-label": "налепницa", + "operator-label": "налепнице", "operator-label-abbrev": "#", "operator-user": "корисник", "operator-user-abbrev": "@", "operator-member": "сарадник", "operator-member-abbrev": "н", - "operator-assignee": "пуномоћник", - "operator-assignee-abbrev": "м", - "operator-creator": "завео", + "operator-assignee": "коме је додељено", + "operator-assignee-abbrev": "о", + "operator-creator": "налогодавац", "operator-status": "стање", "operator-due": "крајњи датум", - "operator-created": "заведено", + "operator-created": "постављен", "operator-modified": "измењено", "operator-sort": "редослед", "operator-comment": "мишљење", "operator-has": "има", "operator-limit": "ограничење", "operator-debug": "тражење грешака", - "operator-org": "странка", + "operator-org": "предузеће", "operator-team": "тим", "predicate-archived": "архивиран", "predicate-open": "отворен", "predicate-ended": "окончан", "predicate-all": "све", "predicate-overdue": "истекао", - "predicate-week": "недељно", - "predicate-month": "месечно", - "predicate-quarter": "тромесечно", - "predicate-year": "годишње", + "predicate-week": "недеља", + "predicate-month": "месец", + "predicate-quarter": "тромесечје", + "predicate-year": "година", "predicate-due": "рок", - "predicate-modified": "изменио", - "predicate-created": "завео", - "predicate-attachment": "приложио", - "predicate-description": "описао", - "predicate-checklist": "предметна радња", - "predicate-start": "започео", - "predicate-end": "окончао", - "predicate-assignee": "овластио", + "predicate-modified": "измењен", + "predicate-created": "направљен", + "predicate-attachment": "прилог", + "predicate-description": "опис", + "predicate-checklist": "списак за обавити", + "predicate-start": "почетак", + "predicate-end": "крај", + "predicate-assignee": "задужени", "predicate-member": "сарадник", - "predicate-public": "јавни", - "predicate-private": "тајни", + "predicate-public": "јавно", + "predicate-private": "приватно", "predicate-selector": "изборник", "predicate-projection": "очекивање", "operator-unknown-error": "%s уопште није оператор", @@ -1121,76 +1088,76 @@ "operator-debug-invalid": "%s уопште није исправан предикат", "next-page": "Следећа страна", "previous-page": "Претходна страна", - "heading-notes": "Додатак", - "globalSearch-instructions-heading": "Правилник за детаљно претраживање", - "globalSearch-instructions-description": "Да би сте сузили резултате претраге предлажемо Вам да почнете да користите операнде. Операнд је математички појам којег овде дефинишемо као целину која се састоји од променљиве и њене припадајуће вредности који су међусобно раздвојени двотачком. На пример, ако задате операнд `део:одложено` то ће сузити претрагу само на оне предмете који су смештени у делу поступка под називом *одложено*. Уколико вредност садржи размак између речи или садржи посебне знакове вредност морате обухватити наводницима (нпр. `__operator_list__:\"у жалбеном поступку\"`).", + "heading-notes": "Белешке", + "globalSearch-instructions-heading": "Упутство за детаљно претраживање", + "globalSearch-instructions-description": "Да би се претрага побољшала, можете да користите операторе. Оператори се задају навођењем имена оператора и навођењем вредности где се оператор и вредност раздвајају двотачком. На пример, ако задате `деоница:блокирано` то ће сузити претрагу само на оне картице са задацима које су смештене на деоници под називом *блокирано*. Уколико вредност садржи празна места или посебне знакове морате их обухватити наводницима (нпр. `__operator_list__:\"радови у току\"`).", "globalSearch-instructions-operators": "Оператори на располагању:", - "globalSearch-instructions-operator-board": "`__operator_board__:<наслов>` - сви предмети у списима са задатим *<насловом>*", - "globalSearch-instructions-operator-list": "`__operator_list__:<назив>` - сви предмети чији део поступка има следећи *<назив>*", - "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<врста>` - сви предмети који се налазе у задатој *<врсти>* поступка", - "globalSearch-instructions-operator-comment": "`__operator_comment__:<речи>` - сви предмети где су у расправи коришћене следеће *<речи>*.", - "globalSearch-instructions-operator-label": "`__operator_label__:<боја>` `__operator_label__:<натпис>` - сви предмети на које је залепљена налепница следеће *<боје>* а која има *<натпис>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<име|боја>` - скраћеница за `__operator_label__:<боја>` или `__operator_label__:<име>`", - "globalSearch-instructions-operator-user": "`__operator_user__:<неко>` - сви предмети где је *<неко>* или *сарадник* или *пуномоћник*", + "globalSearch-instructions-operator-board": "`__operator_board__:<наслов>` - задаци на картицама у пословним књигама које садрже *<наслов>*", + "globalSearch-instructions-operator-list": "`__operator_list__:<назив>` - задаци на деоницама које садрже *<назив>*", + "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<назив>` - задаци на стазама које садрже *<назив>*", + "globalSearch-instructions-operator-comment": "`__operator_comment__:<речи>` - задаци где је мишљење исказано *<речима>*.", + "globalSearch-instructions-operator-label": "`__operator_label__:<боја>` `__operator_label__:<име>` - задаци чија налепница има *<боју>* or *<име>", + "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<име|боја>` - скраћеница за `__operator_label__:<боју>` или `__operator_label__:<име>`", + "globalSearch-instructions-operator-user": "`__operator_user__:<неко>` - задаци где је *<неко>* или *сарадник* или *извршилац*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__корисничко име` - скраћеница за `user:<корисничко име>`", - "globalSearch-instructions-operator-member": "`__operator_member__:<неко>` - предмети где је *<неко>* сарадник", - "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<неко>` - предмети где је *<неко>* пуномоћник", - "globalSearch-instructions-operator-creator": "`__operator_creator__:<неко>` - предмети које је завео *<неко>*", - "globalSearch-instructions-operator-org": "`__operator_org__:<име или пословно име|скраћено пословно име>` - предмети у вези са *<странком>*", - "globalSearch-instructions-operator-team": "`__operator_team__:<назив тима|скраћени назив>` - предмети које обрађује правни тим *<назив>*", - "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - предмети чији рок истиче за *<n>* дана. `__operator_due__:__predicate_overdue__ предмети са истеклим роком.", - "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - предмети који су заведени у задњих *<n>* дана", - "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - предмети који су имали измене у задњих *<n>* дана", + "globalSearch-instructions-operator-member": "`__operator_member__:<неко>` - задаци где је *<неко>* *сарадник*", + "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<неко>` - задаци где је *<неком>* *додељен* задатак", + "globalSearch-instructions-operator-creator": "`__operator_creator__:<неко>` - задаци где је *<неко>* направио картицу са задатком", + "globalSearch-instructions-operator-org": "`__operator_org__:<назив предузећа|скраћени назив>` - задаци који припадају пословној књизи додељеној *<предузећу>*", + "globalSearch-instructions-operator-team": "`__operator_team__:<назив тима|скраћени назив>` - задаци који припадају пословној књизи додељеној *<тиму>*", + "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - задаци чији рок истиче за *<n>* дана. `__operator_due__:__predicate_overdue__ приказује списак свих задатака са истеклим роком.", + "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - задаци који су постављени пре *<n>* или мање дана", + "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - задаци који су измењени пре *<n>* или мање дана", "globalSearch-instructions-operator-status": "`__operator_status__:<стање>` - где се под *<стањем>* подразумева једно од следећих:", - "globalSearch-instructions-status-archived": "`__predicate_archived__` - архивирани предмети", + "globalSearch-instructions-status-archived": "`__predicate_archived__` - архивирани задаци", "globalSearch-instructions-status-all": "`__predicate_all__` - сви архивирани и неархивирани задаци", - "globalSearch-instructions-status-ended": "`__predicate_ended__` - сви окончани предмети", - "globalSearch-instructions-status-public": "`__predicate_public__` - предмети видљиви свима на интернету", - "globalSearch-instructions-status-private": "`__predicate_private__` - предмети видљиви искључиво сарадницима", - "globalSearch-instructions-operator-has": "`__operator_has__:<поље>` - где је то *<поље>* једно од `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` или `__predicate_member__`. Уколико уметнете знак минус `-` испред тог *<поља>* претражује се недостатак те вредности (нпр `има:-рок` претражује предмете без постављеног рока).", + "globalSearch-instructions-status-ended": "`__predicate_ended__` - задаци где је постављен датум завршетка", + "globalSearch-instructions-status-public": "`__predicate_public__` - једино задаци у јавним пословним књигама", + "globalSearch-instructions-status-private": "`__predicate_private__` - једино задаци у приватним пословним књигама", + "globalSearch-instructions-operator-has": "`__operator_has__:<поље>` - где је то *<поље>* једно од `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` или `__predicate_member__`. Уколико уметнете знак минус `-` испред тог *<поља>* претражује се недостатак те вредности (нпр `има:-рок` претражује задатке без постављеног рока).", "globalSearch-instructions-operator-sort": "`__operator_sort__:<правило>` - где је *<правило>* једно од `__predicate_due__`, `__predicate_created__` или `__predicate_modified__`. За опадајући редослед уметните минус `-` испред правила.", - "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - позитиван цео број *<n>* представља број предмета који се приказују по страни.", + "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - позитиван цео број *<n>* представља број задатака који се приказују по страни.", "globalSearch-instructions-notes-1": "Можете истовремено задати више оператора.", - "globalSearch-instructions-notes-2": "Над сродним операторима се изводи операција логичко ИЛИ. Биће приказани предмети који испуњавају било који од услова.\n`__operator_list__:Припрема __operator_list__:Жалба` као резултат приказује све предмете које су било у деоници *Припрема* било у деоници *Жалба*.", - "globalSearch-instructions-notes-3": "На несродним операторима се изводи операција логичко И. Биће приказани само они задаци који испуњавају све услове. `__operator_list__:Жалба __operator_label__:црвена` приказаће међу свим предметима у *жалбеном* делу поступка само оне са *црвеном* налепницом.", + "globalSearch-instructions-notes-2": "Над поновљеним операторима се изводи операција логичко ИЛИ. Биће приказани задаци који испуњавају било који од услова.\n`__operator_list__:Доступно __operator_list__:Блокирано` као резултат приказује све картице које су било у деоници *Блокирано* било у деоници *Доступно*.", + "globalSearch-instructions-notes-3": "На различитим операторима се изводи операција логичко И. Биће приказани само они задаци који испуњавају све услове. `__operator_list__:Доступно __operator_label__:црвено` приказаће међу свим задацима на деоници *Доступно* само оне са *црвеном* налепницом.", "globalSearch-instructions-notes-3-2": "Дани се могу задати као позитивни или негативни цели бројеви или се користе `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` за текући период.", - "globalSearch-instructions-notes-4": "Разлика између малих и великих слова се не узима у обзир.", - "globalSearch-instructions-notes-5": "Ако нисте ништа дирали, претрагом неће бити обухваћени предмети из архиве.", + "globalSearch-instructions-notes-4": "Претрага речи не прави разлику између малих и великих слова.", + "globalSearch-instructions-notes-5": "Преподешено је да се архивиране картице са задацима не претражују.", "link-to-search": "Повежи до ове претраге", "excel-font": "Arial словни лик", "number": "Број", - "label-colors": "Налепнице у боји", + "label-colors": "Боје налепница", "label-names": "Натписи на налепницама", - "archived-at": "датум и време архивирања", - "sort-cards": "Сложи предмете", - "sort-is-on": "Предмети су сложени", - "cardsSortPopup-title": "Сложи предмете", - "due-date": "По крајњем року", + "archived-at": "време архивирања", + "sort-cards": "Пресложи картице", + "sort-is-on": "Слагање је укључено", + "cardsSortPopup-title": "Пресложи картице", + "due-date": "Датум истека", "server-error": "Грешка на серверу", "server-error-troubleshooting": "Молим да нам пошаљете извештај о грешци коју је изазвао сервер.\nАко је у питању snap инсталација, покрените: `sudo snap logs wekan.wekan`\nАко је у питању Docker инсталација, покрените: `sudo docker logs wekan-app`", - "title-alphabetically": "По наслову абучним редом", - "created-at-newest-first": "По најновијим запримљеним", - "created-at-oldest-first": "По најстарије запримљеним)", + "title-alphabetically": "Наслов (Азбучним редом)", + "created-at-newest-first": "Кад је направљено (Најновије прво)", + "created-at-oldest-first": "Кад је направљено (Најстарије прво)", "links-heading": "Везе", "hide-activities-of-all-boards": "Don't show the board activities on all boards", "now-activities-of-all-boards-are-hidden": "Now all activities of all boards are hidden", - "move-swimlane": "Премести ток поступка", - "moveSwimlanePopup-title": "Премештање тока поступка", - "custom-field-stringtemplate": "Образац за словни низ", + "move-swimlane": "Премести стазу", + "moveSwimlanePopup-title": "Премештање стазе", + "custom-field-stringtemplate": "Предложак за словни низ", "custom-field-stringtemplate-format": "Облик (користите %{вредност} као основу/носач)", "custom-field-stringtemplate-separator": "Раздвајач (користите или   за размак)", "custom-field-stringtemplate-item-placeholder": "Притисните ентер да додате још ставки", - "creator": "Завео", - "creator-on-minicard": "Завео", - "filesReportTitle": "Извештај везан за предметну грађу", + "creator": "Задао", + "creator-on-minicard": "Creator on minicard", + "filesReportTitle": "Извештај везан за датотеке", "reports": "Извештаји", "rulesReportTitle": "Извештај везан за правила", - "boardsReportTitle": "Извештај везан за списе", - "cardsReportTitle": "Извештај везан за предмете", - "copy-swimlane": "Умножи ток поступка", - "copySwimlanePopup-title": "Умножавање тока поступка", - "display-card-creator": "Прикажи ко је завео предмет", - "wait-spinner": "Док се исчитавају списи", + "boardsReportTitle": "Извештај везан за пословне књиге", + "cardsReportTitle": "Извештај везан за картице", + "copy-swimlane": "Умножи стазу", + "copySwimlanePopup-title": "Умножавање стазе", + "display-card-creator": "Прикажи ко је направио картицу", + "wait-spinner": "Док се исчитава пословна књига", "Bounce": "Исцртавај три тачкице", "Cube": "Исцртавај квадратиће", "Cube-Grid": "Исцртавај мрежу квадратића", @@ -1199,16 +1166,16 @@ "Rotateplane": "Исцртавај лист који се окреће", "Scaleout": "Исцртавај удаљавање", "Wave": "Исцртавај таласе", - "maximize-card": "Рашири предметне списе", - "minimize-card": "Састави предметне списе", - "delete-org-warning-message": "Не могу да избацим ову странку пошто постоји барем један везани сарадник", - "delete-team-warning-message": "Не могу да распустим овај правни тим пошто постоји барем једно лице које му припада", + "maximize-card": "Увећај картицу", + "minimize-card": "Умањи картицу", + "delete-org-warning-message": "Не могу да угасим ово предузеће пошто постоји барем један корисник који му припада", + "delete-team-warning-message": "Не могу да расформирам овај тим пошто постоји барем један корисник који му припада", "subject": "Тема", "details": "Детаљи", "carbon-copy": "још један примерак", - "ticket": "Пријава квара", - "tickets": "Пријављени кварови", - "ticket-number": "Пријавни број", + "ticket": "Предмет", + "tickets": "Предмети", + "ticket-number": "Број предмета", "open": "Отворен", "pending": "На чекању", "closed": "Затворен", @@ -1218,14 +1185,14 @@ "request": "Захтев", "requests": "Захтеви", "help-request": "Захтева се помоћ", - "editCardSortOrderPopup-title": "Промените редослед слагања предмета", - "cardDetailsPopup-title": "Шире радње на предмету", + "editCardSortOrderPopup-title": "Промените правило слагања картица", + "cardDetailsPopup-title": "Појединости картице", "add-teams": "Додај тимове", "add-teams-label": "Додати тимови су приказани доле:", - "remove-team-from-table": "Да ли сте сигурни да желите да овом правном тиму укинете увид у ове списе ?", + "remove-team-from-table": "Да ли сте сигурни да желите да уклоните овај тим из пословне књиге ?", "confirm-btn": "Потврди", "remove-btn": "Уклони", - "filter-card-title-label": "Издвој по наслову предмета", + "filter-card-title-label": "Издвој по наслову картице са задатком", "invite-people-success": "Позив за сарадњу је успешно послат", "invite-people-error": "Догодила се грешка приликом слања позива за сарадњу", "can-invite-if-same-mailDomainName": "Домен за електронску пошту", @@ -1245,361 +1212,287 @@ "Node_memory_usage_heap_total": "Node искоришћење меморије: укупан простор који је алоциран за heap", "Node_memory_usage_heap_used": "Node искоришћење меморије: колико заправо је искоришћено", "Node_memory_usage_external": "Node искоришћење меморије: спољна", - "add-organizations": "Додај странке", - "add-organizations-label": "Странке које имају увид су приказана доле:", - "remove-organization-from-board": "Да ли сте сигурни да желите да овој странци забраните увид у ове списе ?", - "to-create-organizations-contact-admin": "Да би могли да додајете странке, молим да се обратите управнику/администратору.", + "add-organizations": "Додај предузећа", + "add-organizations-label": "Додана предузећа су приказана доле:", + "remove-organization-from-board": "Да ли сте сигурни да желите да уклоните ово предузеће из ове пословне књиге ?", + "to-create-organizations-contact-admin": "Да би могли да додајете предузећа, молим да се обратите управнику/администратору.", "custom-legal-notice-link-url": "Место на Интернету са условима/уговором за коришћење", "acceptance_of_our_legalNotice": "Ако наставите даље, сагласни сте да прихватате наше", "legalNotice": "услови коришћења", "copied": "Умножено!", - "checklistActionsPopup-title": "Руковање списковима радњи", - "moveChecklist": "Премести списак радњи", - "moveChecklistPopup-title": "Премести списак радњи", - "newlineBecomesNewChecklistItem": "Сваки ред текста постаје ставка на списку", - "newLineNewItem": "Један ред = једна ставка", - "newlineBecomesNewChecklistItemOriginOrder": "Сваки ред текста постаје ставка на списку - по изворном редоследу уноса", - "originOrder": "изворни редослед", + "checklistActionsPopup-title": "Радње на списковима за обавити", + "moveChecklist": "Премести списак за обавити", + "moveChecklistPopup-title": "Премести списак за обавити", + "newlineBecomesNewChecklistItem": "Each line of text becomes one of the checklist items", + "newLineNewItem": "One line of text = one checklist item", + "newlineBecomesNewChecklistItemOriginOrder": "Each line of text becomes one of the checklist items, original order", + "originOrder": "original order", "copyChecklist": "Умножи списак", "copyChecklistPopup-title": "Умножи списак", - "card-show-lists": "Прикажи делове поступка на омоту предмета", - "subtaskActionsPopup-title": "Радње на издвојеним пословима", + "card-show-lists": "Прикажи спискове на картици", + "subtaskActionsPopup-title": "Радње на под задацима", "attachmentActionsPopup-title": "Однос према прилозима", "attachment-move-storage-fs": "Премести прилог у локални систем датотека", "attachment-move-storage-gridfs": "Премести прилог у GridFS", - "attachment-move-storage-s3": "Премести прилог у облак на Amazon S3", + "attachment-move-storage-s3": "Премести прилог у облак на S3", "attachment-move": "Премести прилог", - "move-all-attachments-to-fs": "Премести целокупну предметну грађу у локални систем датотека", - "move-all-attachments-to-gridfs": "Премести целокупну предметну грађу у MongoDB GridFS", - "move-all-attachments-to-s3": "Премести целокупну предметну грађу из списа у облак на Amazon S3", - "move-all-attachments-of-board-to-fs": "Премести предметну грађу ових списа у локални систем датотека", - "move-all-attachments-of-board-to-gridfs": "Премести предметну грађу ових списа у MongoDB GridFS", - "move-all-attachments-of-board-to-s3": "Премести предметну грађу ових списа у облак на Amazon S3", + "move-all-attachments-to-fs": "Премести све прилоге у локални систем датотека", + "move-all-attachments-to-gridfs": "Премести све прилоге у GridFS", + "move-all-attachments-to-s3": "Премести све прилоге у облак на S3", + "move-all-attachments-of-board-to-fs": "Премести све прилоге пословне књиге у локални систем датотека", + "move-all-attachments-of-board-to-gridfs": "Премести све прилоге пословне књиге у GridFS", + "move-all-attachments-of-board-to-s3": "Премести све прилоге пословне књиге у облак на S3", "path": "Путања", "version-name": "Назив издања", "size": "Величина", "storage": "Складиште", "action": "Радња", - "board-title": "Деловодни број", + "board-title": "Натпис на пословној књизи", "attachmentRenamePopup-title": "Преименуј", "uploading": "Подижем на сервер", "remaining_time": "Преостало време", "speed": "Брзина", "progress": "Напредак", - "password-again": "Поновљена лозинка", - "if-you-already-have-an-account": "Ако већ поседујете налог ⇨ ", - "register": "Упиши се", + "password-again": "Лозинка (понови је)", + "if-you-already-have-an-account": "Ако већ имате један налог", + "register": "Регистрација", "forgot-password": "Заборављена лозинка", - "minicardDetailsActionsPopup-title": "Предмет у омоту", + "minicardDetailsActionsPopup-title": "Појединости картице", "Mongo_sessions_count": "Број Mongo сесија", - "change-visibility": "Промени тајност списа", + "change-visibility": "Промени видљивост", "max-upload-filesize": "Максимална величина датотеке за слање (у бајтима):", "allowed-upload-filetypes": "Дозвољене врсте датотека за слање:", - "max-avatar-filesize": "Максимална величина слике (у бајтима):", + "max-avatar-filesize": "Максимална величина сличице (у бајтима):", "allowed-avatar-filetypes": "Дозвољене врсте слика:", - "invalid-file": "Ако са именом нешто није у реду тада ће и слање и преименовање бити отказано.", - "preview-pdf-not-supported": "Ваш уређај не подржава приказивање pdf докумената. Пробајте да преузмете документ.", - "drag-board": "Пребаци списе", - "translation-number": "Број исправки превода је:", - "delete-translation-confirm-popup": "Да ли сте сигурни да желите да избришете ову исправку превода? Опозив ове радње неће бити могућ.", - "newTranslationPopup-title": "Нова исправка превода", - "editTranslationPopup-title": "Исправи превод", - "settingsTranslationPopup-title": "Обриши ову исправку превода", - "translation": "Речник", - "text": "Изворна реченица", - "translation-text": "Превод", - "show-subtasks-field": "Прикажи поље издвојени послови", + "invalid-file": "Ако са именом датотеке нешто није у реду тада ће и слање и преименовање бити отказано.", + "preview-pdf-not-supported": "Ваш уређај не подржава приказивање ПДФ докумената. Пробајте да преузмете документ.", + "drag-board": "Пренеси пословну књигу", + "translation-number": "Број прилагођених превода је:", + "delete-translation-confirm-popup": "Да ли сте сигурни да желите да избришете овај прилагођени превод? Опозив ове радње неће бити могућ.", + "newTranslationPopup-title": "Нови прилагођени превод", + "editTranslationPopup-title": "Уреди прилагођени превод", + "settingsTranslationPopup-title": "Обриши овај прилагођени превод", + "translation": "Превод", + "text": "Текст", + "translation-text": "Превод текста", + "show-subtasks-field": "Прикажи поље за подзадатке", "show-week-of-year": "Show week of year (ISO 8601)", - "convert-to-markdown": "Претвори у структуирани текст", - "import-board-zip": "Додај .zip архиву која има списе у json облику и фасцикле по имену списа где је предметна грађа", - "collapse": "Скупи", - "uncollapse": "Рашири", - "hideCheckedChecklistItems": "Сакриј све обављене помоћне предметне радње", - "hideAllChecklistItems": "Сакриј све помоћне предметне радње", - "support": "Подршка", - "supportPopup-title": "Подршка", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", - "accessibility": "Особе са посебним потешкоћама", - "accessibility-page-enabled": "Омогући страницу за особе са посебним потешкоћама", - "accessibility-info-not-added-yet": "Информације намењене особама са посебним потешкоћама, за сада, нису додате", - "accessibility-title": "Наслов такве странице", - "accessibility-content": "Садржај такве странице", - "accounts-lockout-settings": "Заштитне мере од насилног упада", - "accounts-lockout-info": "Овим мерама се штитимо од насилних покушаја пријављивања погађањем лозинкеf.", - "accounts-lockout-known-users": "Мере за познате налоге (где налог постоји али се лозинка не подудара)", - "accounts-lockout-unknown-users": "Мере за непознате налоге (где сарадник са таквим корисничким именом не постоји)", - "accounts-lockout-failures-before": "Граница неуспешних покушаја пријаве (након које се сараднику одузима право приступа)", - "accounts-lockout-period": "Трајање мере забране (у секундама)", - "accounts-lockout-failure-window": "Временски оквир у којем се одиграва насилан упад (у секундама)", - "accounts-lockout-settings-updated": "Мере против насилног упада су допуњене", - "accounts-lockout-locked-users": "Налози на мерама", - "accounts-lockout-locked-users-info": "Сарадници којима је одузето право приступа због превеликог броја неуспешних покушаја пријаве", - "accounts-lockout-no-locked-users": "Тренутно не постоје налози са мером забране права приступа", - "accounts-lockout-failed-attempts": "Број неуспешних покушаја", - "accounts-lockout-remaining-time": "Преостало време", - "accounts-lockout-user-unlocked": "Налог је успешно скинут са мера забране приступа", - "accounts-lockout-confirm-unlock": "Да ли сте сигурни да желите да скинете овај налог са мера?", - "accounts-lockout-confirm-unlock-all": "Да ли сте сигурни да желите да скинете све налоге са мера?", - "accounts-lockout-show-locked-users": "Прикажи само налоге на мерама", - "accounts-lockout-user-locked": "Налог је на мерама", - "accounts-lockout-click-to-unlock": "Притисните да налог добије право приступа", - "accounts-lockout-status": "Право приступа", - "admin-people-filter-show": "Издвој:", - "admin-people-filter-all": "Обухвати све расположиве сараднике", - "admin-people-filter-locked": "Налоге на мерама забране права приступа", - "admin-people-filter-active": "Сарадник је на платном списку", - "admin-people-filter-inactive": "Сарадник више није на платном списку", - "admin-people-active-status": "Радни однос", - "admin-people-user-active": "Сарадник је на платном списку - притисните да би прекинули сарадњу", - "admin-people-user-inactive": "Сарадник није на платном списку - притисните да би га увели на платни списак", - "accounts-lockout-all-users-unlocked": "Сви сарадници којима је претходно било одузето право пријаве су скинути са ове мере", - "accounts-lockout-unlock-all": "Скини све са мера", - "active-cron-jobs": "Већ унапред заказани послови:", - "add-cron-job": "Закажи нови посао", - "add-cron-job-placeholder": "Ова функционалност биће ускоро додата", - "attachment-storage-configuration": "Поставка складишта предметне грађе", - "attachments-path": "Пуна путања до складишта", - "attachments-path-description": "Путања до складишта где се чува предметна грађа", - "avatars-path": "Путања до слика сарадника", - "avatars-path-description": "Путања где се складиште слике сарадника", - "board-archive-failed": "Није успело заказивање архивирања списа", - "board-archive-scheduled": "Заказано је паковање списа у архиву", - "board-backup-failed": "Није успело заказивање израде резервног примерка списа", - "board-backup-scheduled": "Заказана је израда резервног примерка списа", - "board-cleanup-failed": "Није успело заказивање чишћења списа", - "board-cleanup-scheduled": "Заказано је чишћење списа", - "board-operations": "Радње на списима", - "cron-jobs": "Заказани послови", - "cron-migrations": "Заказани поступци обнове оштећених списа", - "cron-job-delete-confirm": "Да ли сте сигурни да желите да уклоните заказано?", - "cron-job-delete-failed": "Није успело уклањање заказаног посла", - "cron-job-deleted": "Успешно је уклоњен заказани посао", - "cron-job-pause-failed": "Није успело паузирање заказаног посла", - "cron-job-paused": "Заказани посао је успешно паузиран", - "filesystem-path-description": "Почетак пута до складишта предметне грађе", - "gridfs-enabled": "GridFS ради и можете га користити", - "gridfs-enabled-description": "Можете користити MongoDB GridFS за складиште предметне грађе", - "migration-pause-failed": "Није било могуће направити предах у поступку обнове оштећених списа", - "migration-paused": "Направљен је предах у поступку обнове оштећених списа", - "migration-progress": "Напредак у току обнове", - "migration-start-failed": "Није било могуће покренути обнову оштећених списа", - "migration-started": "Обнова оштећених списа је започета", - "migration-status": "Пресек стања", - "migration-stop-confirm": "Да ли сте сигурни да желите да зауставите све поступке обнове оштећених предметних списа?", - "migration-stop-failed": "Није било могуће прекинути поступке обнове оштећених списа", - "migration-stopped": "Поступци обнове оштећених списа су управо заустављени", - "mongodb-gridfs-storage": "MongoDB GridFS складиште", - "pause-all-migrations": "Предах за све", - "s3-access-key": "S3 приступни кључ", - "s3-access-key-description": "AWS S3 приступни кључ за пријаву", - "s3-access-key-placeholder": "Унесите S3 приступни кључ", + "convert-to-markdown": "Претвори у маркдаун", + "import-board-zip": "Add .zip file that has board JSON files, and board name subdirectories with attachments", + "collapse": "Сажми", + "uncollapse": "Uncollapse", + "hideCheckedChecklistItems": "Hide checked checklist items", + "hideAllChecklistItems": "Hide all checklist items", + "support": "Support", + "supportPopup-title": "Support", + "accessibility": "Accessibility", + "accessibility-page-enabled": "Accessibility page enabled", + "accessibility-info-not-added-yet": "Accessibility info has not been added yet", + "accessibility-title": "Accessibility title", + "accessibility-content": "Accessibility content", + "accounts-lockout-settings": "Brute Force Protection Settings", + "accounts-lockout-info": "These settings control how login attempts are protected against brute force attacks.", + "accounts-lockout-known-users": "Settings for known users (correct username, wrong password)", + "accounts-lockout-unknown-users": "Settings for unknown users (non-existent username)", + "accounts-lockout-failures-before": "Failures before lockout", + "accounts-lockout-period": "Lockout period (seconds)", + "accounts-lockout-failure-window": "Failure window (seconds)", + "accounts-lockout-settings-updated": "Brute force protection settings have been updated", + "accounts-lockout-locked-users": "Locked Users", + "accounts-lockout-locked-users-info": "Users currently locked out due to too many failed login attempts", + "accounts-lockout-no-locked-users": "There are currently no locked users", + "accounts-lockout-failed-attempts": "Failed Attempts", + "accounts-lockout-remaining-time": "Remaining Time", + "accounts-lockout-user-unlocked": "User has been unlocked successfully", + "accounts-lockout-confirm-unlock": "Are you sure you want to unlock this user?", + "accounts-lockout-confirm-unlock-all": "Are you sure you want to unlock all locked users?", + "accounts-lockout-show-locked-users": "Show locked users only", + "accounts-lockout-user-locked": "User is locked", + "accounts-lockout-click-to-unlock": "Click to unlock this user", + "accounts-lockout-status": "Стање", + "admin-people-filter-show": "Show:", + "admin-people-filter-all": "Недовршени послови сарадника", + "admin-people-filter-locked": "Locked Users Only", + "admin-people-filter-active": "На окупу", + "admin-people-filter-inactive": "Not Active", + "admin-people-active-status": "Active Status", + "admin-people-user-active": "User is active - click to deactivate", + "admin-people-user-inactive": "User is inactive - click to activate", + "accounts-lockout-all-users-unlocked": "All locked users have been unlocked", + "accounts-lockout-unlock-all": "Unlock All", + "active-cron-jobs": "Active Scheduled Jobs", + "add-cron-job": "Add Scheduled Job", + "add-cron-job-placeholder": "Add Scheduled Job functionality coming soon", + "attachment-storage-configuration": "Attachment Storage Configuration", + "attachments-path": "Attachments Path", + "attachments-path-description": "Path where attachment files are stored", + "avatars-path": "Avatars Path", + "avatars-path-description": "Path where avatar files are stored", + "board-archive-failed": "Failed to schedule board archive", + "board-archive-scheduled": "Board archive scheduled successfully", + "board-backup-failed": "Failed to schedule board backup", + "board-backup-scheduled": "Board backup scheduled successfully", + "board-cleanup-failed": "Failed to schedule board cleanup", + "board-cleanup-scheduled": "Board cleanup scheduled successfully", + "board-operations": "Board Operations", + "cron-jobs": "Scheduled Jobs", + "cron-migrations": "Scheduled Migrations", + "cron-job-delete-confirm": "Are you sure you want to delete this scheduled job?", + "cron-job-delete-failed": "Failed to delete scheduled job", + "cron-job-deleted": "Scheduled job deleted successfully", + "cron-job-pause-failed": "Failed to pause scheduled job", + "cron-job-paused": "Scheduled job paused successfully", + "filesystem-path-description": "Base path for file storage", + "gridfs-enabled": "GridFS Enabled", + "gridfs-enabled-description": "Use MongoDB GridFS for file storage", + "migration-pause-failed": "Failed to pause migrations", + "migration-paused": "Migrations paused successfully", + "migration-progress": "Migration Progress", + "migration-start-failed": "Failed to start migrations", + "migration-started": "Migrations started successfully", + "migration-status": "Migration Status", + "migration-stop-confirm": "Are you sure you want to stop all migrations?", + "migration-stop-failed": "Failed to stop migrations", + "migration-stopped": "Migrations stopped successfully", + "mongodb-gridfs-storage": "MongoDB GridFS Storage", + "pause-all-migrations": "Pause All Migrations", + "s3-access-key": "S3 Access Key", + "s3-access-key-description": "AWS S3 access key for authentication", + "s3-access-key-placeholder": "Enter S3 access key", "s3-bucket": "S3 Bucket", - "s3-bucket-description": "S3 bucket име где чувате предметну грађу", - "s3-connection-failed": "S3 веза је у прекиду", - "s3-connection-success": "Управо је остварена веза до S3", - "s3-enabled": "S3 ради и може да се користи", - "s3-enabled-description": "Можете да користите AWS S3 или MinIO као складиште предметне грађе", - "s3-endpoint": "S3 Endpoint тачка", - "s3-endpoint-description": "S3 endpoint тачка (нпр. s3.amazonaws.com или minio.example.com)", - "s3-minio-storage": "S3/MinIO складиште", + "s3-bucket-description": "S3 bucket name for storing files", + "s3-connection-failed": "S3 connection failed", + "s3-connection-success": "S3 connection successful", + "s3-enabled": "S3 Enabled", + "s3-enabled-description": "Use AWS S3 or MinIO for file storage", + "s3-endpoint": "S3 Endpoint", + "s3-endpoint-description": "S3 endpoint URL (e.g., s3.amazonaws.com or minio.example.com)", + "s3-minio-storage": "S3/MinIO Storage", "s3-port": "S3 Port", - "s3-port-description": "S3 endpoint port број", + "s3-port-description": "S3 endpoint port number", "s3-region": "S3 Region", - "s3-region-description": "AWS S3 регион (нпр. us-east-1)", - "s3-secret-key": "S3 тајни кључ", - "s3-secret-key-description": "AWS S3 тајни кључ за пријаву", - "s3-secret-key-placeholder": "Унесите S3 тајни кључ", - "s3-secret-key-required": "Тражи се и S3 тајни кључ", - "s3-settings-save-failed": "Није могла бити сачувана S3 поставка", - "s3-settings-saved": "S3 поставка је сачувана", - "s3-ssl-enabled": "S3 SSL шифровање је укључено", - "s3-ssl-enabled-description": "Користи SSL/TLS за везу до Amazon S3 складишта", - "save-s3-settings": "Сачувај ову S3 поставку", - "schedule-board-archive": "Закажи архивирање списа", - "schedule-board-backup": "Закажи израду резервног примерка", - "schedule-board-cleanup": "Закажи чишћење", - "scheduled-board-operations": "Заказане радње на списима", - "start-all-migrations": "Пуна обнова", - "stop-all-migrations": "Прекини поступке", - "test-s3-connection": "Проба везе до Amazon S3", - "writable-path": "Проходна путања", - "writable-path-description": "Почетак путање према складишту предметне грађе", - "add-job": "Додај посао", - "attachment-migration": "Пресељење предметне грађе", - "attachment-monitoring": "Надзор над предметном грађом", - "attachment-settings": "Рад са предметном грађом", - "attachment-storage-settings": "Складиште предметне грађе", - "automatic-migration": "Обнављај иза у тишини", - "back-to-settings": "Натраг на поставку", - "board-id": "BoardID", - "board-migration": "Обнова оштећених списа", - "board-migrations": "Поступци обнове оштећених списа", - "card-show-lists-on-minicard": "Прикажи део поступка на омоту", - "comprehensive-board-migration": "Свеобухватна обнова", - "comprehensive-board-migration-description": "Изводе се свеобухватне провера и врше поправке целовитости података у списима - што укључује провере и поправке редоследа делова поступака, места где се тачно предмети налазе и структуре поступака.", - "delete-duplicate-empty-lists-migration": "Брисање истоимених делова поступка", - "delete-duplicate-empty-lists-migration-description": "На један безбедан начин брише празне истоимене делове поступка. Бришу се сви делови поступка у којима нема предмета ако постоји део поступка са истим тим насловом где већ постоје предмети.", - "lost-cards": "Загубљени предмети", - "lost-cards-list": "Опорављени предмети", - "restore-lost-cards-migration": "Опоравак загубљених предмета", - "restore-lost-cards-migration-description": "Открива и опоравља предмете и делове поступака којима недостају поља swimlaneId или listId и смешта у „Опорављене предмете“.", - "restore-all-archived-migration": "Опоравак свих предмета из архиве", - "restore-all-archived-migration-description": "Опоравља све архивиране делове поступака, поступке и предмете притом поправљајући недостајућа поља swimlaneId или listId.", - "fix-missing-lists-migration": "Поправка кад недостају делови поступка", - "fix-missing-lists-migration-description": "Открива и поправља сваки део поступка који недостаје или који је оштећен.", - "fix-avatar-urls-migration": "Поправка кад се не виде слике сарадника", - "fix-avatar-urls-migration-description": "Исправља везу до складишта са сликама сарадника из ових списа.", - "fix-all-file-urls-migration": "Поправка кад ишчезне предметна грађа", - "fix-all-file-urls-migration-description": "Преусмерава везу ка складишту где се стварно налази предметна грађа из ових списа.", - "migration-needed": "Потребна је обнова", - "migration-complete": "Обнова је обављена", - "migration-running": "Обнова је у току...", - "migration-successful": "Обнова је успешно окончана", - "migration-failed": "Обнова није била успешна", - "migrations": "Радионица", - "migrations-admin-only": "За обнову ових списа надлежан је једино онај ко је њихов управник", - "migrations-description": "Овде може да се изврши провера целовитости података и поправка оштећења. Сваки поступак обнове се може спровести независно један од другог", - "no-issues-found": "Нису уочена оштећења", - "run-migration": "Покрени опоравак", - "run-comprehensive-migration-confirm": "Овим ће бити изведене свеобухватне провере и поправке целовитости података у списима. То би кратко трајало уколико сте сагласни?", - "run-delete-duplicate-empty-lists-migration-confirm": "Овим ће прво сви дељени делови поступака бити везани на саме поступке, затим ће бити избрисан сваки део поступка који је празан где постоји део поступка истог имена који има предмете. Да ли сте сагласни?", - "run-restore-lost-cards-migration-confirm": "Овим се прави ток „Загубљени предмети“ и у њега смештају сви предмети и делови поступка којима недостају поља swimlaneId или listId. Мисли се на оно што је загубљено али није загубљено у архиви. Да ли сте сагласни? ", - "run-restore-all-archived-migration-confirm": "Овим се износи натраг из архиве све оно што сте до сада спаковали тамо. Поља где недостаје id биће поправљена. Упозорење! Да ли заиста то желите?", - "run-fix-missing-lists-migration-confirm": "Овим се откривају и поправљају они делови поступака који недостају или који су оштећени. Да ли сте сагласни?", - "run-fix-avatar-urls-migration-confirm": "Овим се исправља веза до складишта са сликама сарадника из ових списа. Да ли сте сагласни?", - "run-fix-all-file-urls-migration-confirm": "Овим ће бити исправљене све везе у списима да упућују на стварно складиште предметне грађе. Да ли сте сагласни?", - "restore-lost-cards-nothing-to-restore": "Нема нити загубљених поступака нити предмета за опоравак", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Укупни напредак", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Стање", - "migration-progress-details": "Појединости", - "migration-progress-note": "Молимо да будете стрпљиви док траје препакивање Ваших списа...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Изучавам везе у списима", - "step-fix-orphaned-cards": "Поправљам одбачене предмете", - "step-convert-shared-lists": "Претварам дељене делове поступка", - "step-ensure-per-swimlane-lists": "Осигуравам да је део поступка везан за поступак", - "step-validate-migration": "Оцењујем обнову", - "step-fix-avatar-urls": "Поправљам везе до складишта слика за сараднике", - "step-fix-attachment-urls": "Поправљам везе до складишта предметне грађе", - "step-analyze-lists": "Изучавам делове поступка", - "step-create-missing-lists": "Стварам недостајуће делове", - "step-update-cards": "Допуњујем предмете", - "step-finalize": "Завршавам", - "step-delete-duplicate-empty-lists": "Бришем исте празне делове поступка", - "step-ensure-lost-cards-swimlane": "Правим место за загубљене предмете", - "step-restore-lists": "Опорављам делове поступка", - "step-restore-cards": "Опорављам предмете", - "step-restore-swimlanes": "Опорављам читав ток поступка", - "step-fix-missing-ids": "Поправљам недостајућа id поља", - "step-scan-users": "Проверавам слике сарадника на списима", - "step-scan-files": "Проверавам предметну грађу", - "step-fix-file-urls": "Поправљам везе до предметне грађе", - "cleanup": "Чистим", - "cleanup-old-jobs": "Чистим остављено", - "completed": "Прошао сам кроз све кораке", - "conversion-info-text": "Ово преслагање се изводи само једном по спису и то после олакшава читање. Без сметњи настављате да читате спис након тога.", - "converting-board": "Преслагање списа", - "converting-board-description": "Преслагање списа олакшава употребу. Ово може потрајати неколико тренутака.", - "cpu-cores": "Процесорска језгра", - "cpu-usage": "Заузеће процесора", - "current-action": "Текућа радња", - "database-migration": "Обнова базе података", - "database-migration-description": "Преслажем структуру базе података да би била боља и бржа. Процес може потрајати неколико минута.", - "database-migrations": "Преслагање базе података", - "days-old": "дана стар", - "duration": "Трајање", - "errors": "Грешке", - "estimated-time-remaining": "Процењено преостало време", - "every-1-day": "Једном дневно", - "every-1-hour": "На сваки сат", - "every-1-minute": "На сваки минут", - "every-10-minutes": "На сваких десет минута", - "every-30-minutes": "На сваких пола сата", - "every-5-minutes": "На пет минута", - "every-6-hours": "На шест сати", - "export-monitoring": "Надзор током изношења", - "filesystem-attachments": "Локална предметна грађа", - "filesystem-size": "Величина локалног складишта", - "filesystem-storage": "Локално складиште", - "force-board-scan": "Читање списа на силу", - "gridfs-attachments": "GridFS раздељена предметна грађа", - "gridfs-size": "GridFS величина", + "s3-region-description": "AWS S3 region (e.g., us-east-1)", + "s3-secret-key": "S3 Secret Key", + "s3-secret-key-description": "AWS S3 secret key for authentication", + "s3-secret-key-placeholder": "Enter S3 secret key", + "s3-secret-key-required": "S3 secret key is required", + "s3-settings-save-failed": "Failed to save S3 settings", + "s3-settings-saved": "S3 settings saved successfully", + "s3-ssl-enabled": "S3 SSL Enabled", + "s3-ssl-enabled-description": "Use SSL/TLS for S3 connections", + "save-s3-settings": "Save S3 Settings", + "schedule-board-archive": "Schedule Board Archive", + "schedule-board-backup": "Schedule Board Backup", + "schedule-board-cleanup": "Schedule Board Cleanup", + "scheduled-board-operations": "Scheduled Board Operations", + "start-all-migrations": "Start All Migrations", + "stop-all-migrations": "Stop All Migrations", + "test-s3-connection": "Test S3 Connection", + "writable-path": "Writable Path", + "writable-path-description": "Base directory path for file storage", + "add-job": "Add Job", + "attachment-migration": "Attachment Migration", + "attachment-monitoring": "Attachment Monitoring", + "attachment-settings": "Attachment Settings", + "attachment-storage-settings": "Storage Settings", + "automatic-migration": "Automatic Migration", + "back-to-settings": "Back to Settings", + "board-id": "Board ID", + "board-migration": "Board Migration", + "card-show-lists-on-minicard": "Show Lists on Minicard", + "cleanup": "Cleanup", + "cleanup-old-jobs": "Cleanup Old Jobs", + "completed": "Обављен", + "conversion-info-text": "This conversion is performed once per board and improves performance. You can continue using the board normally.", + "converting-board": "Converting Board", + "converting-board-description": "Converting board structure for improved functionality. This may take a few moments.", + "cpu-cores": "CPU Cores", + "cpu-usage": "CPU Usage", + "current-action": "Current Action", + "database-migration": "Database Migration", + "database-migration-description": "Updating database structure for improved functionality and performance. This process may take several minutes.", + "database-migrations": "Database Migrations", + "days-old": "Days Old", + "duration": "Duration", + "errors": "Errors", + "estimated-time-remaining": "Estimated time remaining", + "every-1-day": "Every 1 day", + "every-1-hour": "Every 1 hour", + "every-1-minute": "Every 1 minute", + "every-10-minutes": "Every 10 minutes", + "every-30-minutes": "Every 30 minutes", + "every-5-minutes": "Every 5 minutes", + "every-6-hours": "Every 6 hours", + "export-monitoring": "Export Monitoring", + "filesystem-attachments": "Filesystem Attachments", + "filesystem-size": "Filesystem Size", + "filesystem-storage": "Filesystem Storage", + "force-board-scan": "Force Board Scan", + "gridfs-attachments": "GridFS Attachments", + "gridfs-size": "GridFS Size", "gridfs-storage": "GridFS", - "hide-list-on-minicard": "Сакриј део поступка са омота", - "idle-migration": "Тиха обнова", - "job-description": "Опис посла", - "job-details": "Појединости посла", - "job-name": "Име посла", - "job-queue": "Посао по реду", - "last-run": "Последње покретање", - "max-concurrent": "Паралелно", - "memory-usage": "Искоришћеност меморије", - "migrate-all-to-filesystem": "Пресели све у локално складиште", - "migrate-all-to-gridfs": "Пресели све и издели у GridFS", - "migrate-all-to-s3": "Пресели све у Amazon S3 облак", - "migrated-attachments": "Пресељена предметна грађа", - "migration-batch-size": "Ширина захвата", - "migration-batch-size-description": "Број јединица предметне грађе који ће бити обрађен при сваком пролазу (1-100)", - "migration-cpu-threshold": "Граница искоришћења процесора (%)", - "migration-cpu-threshold-description": "Направи предах када заузеће процесора досегне ове проценте (10-90)", - "migration-delay-ms": "Задршка (ms)", - "migration-delay-ms-description": "Задршка између пролаза изражена у милисекундама (100-10000)", - "migration-detector": "Детектор", - "migration-info-text": "Преслагање базе података се изводи само једном и то поправља брзину. Ова радња се изводи у позадини чак иако одете.", - "migration-log": "Записник из обнове", - "migration-markers": "Обележја обнове", - "migration-resume-failed": "Није успео наставак обнове", - "migration-resumed": "Обнова је настављена", - "migration-steps": "Кораци у обнови", - "migration-warning-text": "Предлажемо да не затварате прозор током обнове. Чак и тада процес ће бити изведен у позадини али све може дуже да траје.", - "monitoring-export-failed": "Не могу да извезем надзорне податаке", - "monitoring-refresh-failed": "Не могу да освежим надзорне податке", - "next": "Следеће", - "next-run": "Наредни покрет", + "hide-list-on-minicard": "Hide List on Minicard", + "idle-migration": "Idle Migration", + "job-description": "Job Description", + "job-details": "Job Details", + "job-name": "Job Name", + "job-queue": "Job Queue", + "last-run": "Last Run", + "max-concurrent": "Max Concurrent", + "memory-usage": "Memory Usage", + "migrate-all-to-filesystem": "Migrate All to Filesystem", + "migrate-all-to-gridfs": "Migrate All to GridFS", + "migrate-all-to-s3": "Migrate All to S3", + "migrated-attachments": "Migrated Attachments", + "migration-batch-size": "Batch Size", + "migration-batch-size-description": "Number of attachments to process in each batch (1-100)", + "migration-cpu-threshold": "CPU Threshold (%)", + "migration-cpu-threshold-description": "Pause migration when CPU usage exceeds this percentage (10-90)", + "migration-delay-ms": "Delay (ms)", + "migration-delay-ms-description": "Delay between batches in milliseconds (100-10000)", + "migration-detector": "Migration Detector", + "migration-info-text": "Database migrations are performed once and improve system performance. The process continues in the background even if you close your browser.", + "migration-log": "Migration Log", + "migration-markers": "Migration Markers", + "migration-resume-failed": "Failed to resume migration", + "migration-resumed": "Migration resumed", + "migration-steps": "Migration Steps", + "migration-warning-text": "Please do not close your browser during migration. The process will continue in the background but may take longer to complete.", + "monitoring-export-failed": "Failed to export monitoring data", + "monitoring-refresh-failed": "Failed to refresh monitoring data", + "next": "Next", + "next-run": "Next Run", "of": "од", - "operation-type": "Врста радње", - "overall-progress": "Измерени напредак", - "page": "Страна", - "pause": "Pause", - "pause-migration": "Направи предах", - "previous": "Претходна", - "refresh": "Освежи", - "refresh-monitoring": "Најновији подаци са надзора", - "remaining-attachments": "Преостала предметна грађа", - "resume-migration": "Настави обнову", - "run-once": "Покрени једном", - "s3-attachments": "Предметна грађа у Amazon S3 облаку", - "s3-size": "Amazon S3 заузеће", + "operation-type": "Operation Type", + "overall-progress": "Overall Progress", + "page": "Page", + "pause-migration": "Pause Migration", + "previous": "Previous", + "refresh": "Refresh", + "refresh-monitoring": "Refresh Monitoring", + "remaining-attachments": "Remaining Attachments", + "resume-migration": "Resume Migration", + "run-once": "Run once", + "s3-attachments": "S3 Attachments", + "s3-size": "S3 Size", "s3-storage": "S3", - "scanning-status": "Изучено стање", - "schedule": "Распоред", - "search-boards-or-operations": "Претрага списа или радњи...", - "show-list-on-minicard": "Прикажи део поступка на омоту", - "showChecklistAtMinicard": "Show Checklist at Minicard", - "showing": "Приказујем", + "scanning-status": "Scanning Status", + "schedule": "Schedule", + "search-boards-or-operations": "Search boards or operations...", + "show-list-on-minicard": "Show List on Minicard", + "showing": "Showing", "start-test-operation": "Start Test Operation", - "start-time": "Покрени штоперицу", - "step-progress": "Појединачни напредак", - "stop-migration": "Заустави обнову", - "storage-distribution": "Расподела у складишту", - "system-resources": "Системска снага", - "total-attachments": "Број јединица предметне грађе", - "total-operations": "Укупан број радњи", - "total-size": "Укупна величина", - "unmigrated-boards": "Необновљени списи", - "weight": "Оптерећење", - "idle": "Стање мировања", - "complete": "Посао је успешно обављен", - "cron": "Периодични послови", - "current-step": "Current Step" + "start-time": "Start Time", + "step-progress": "Step Progress", + "stop-migration": "Stop Migration", + "storage-distribution": "Storage Distribution", + "system-resources": "System Resources", + "total-attachments": "Total Attachments", + "total-operations": "Total Operations", + "total-size": "Total Size", + "unmigrated-boards": "Unmigrated Boards", + "weight": "Weight", + "idle": "Idle", + "complete": "Complete", + "cron": "Cron" } diff --git a/imports/i18n/data/sv.i18n.json b/imports/i18n/data/sv.i18n.json index 6cb383c2e..df710b440 100644 --- a/imports/i18n/data/sv.i18n.json +++ b/imports/i18n/data/sv.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "raderade kommentar %s", "activity-receivedDate": "redigerade mottaget datum till %s av %s", "activity-startDate": "redigerade startdatum till %s av %s", - "allboards.starred": " Stjärnmärkt", - "allboards.templates": "Mallar", - "allboards.remaining": "Återstående", - "allboards.workspaces": "Arbetsytor", - "allboards.add-workspace": "Lägg till arbetsyta", - "allboards.add-workspace-prompt": "Arbetsytans namn", - "allboards.add-subworkspace": "Lägg till underarbetsyta", - "allboards.add-subworkspace-prompt": "Underarbetsytans namn", - "allboards.edit-workspace": "Redigera arbetsyta", - "allboards.edit-workspace-name": "Arbetsytans namn", - "allboards.edit-workspace-icon": "Arbetsytans ikon (markdown)", - "multi-selection-active": "Klicka i kryssrutor för att välja tavlor", "activity-dueDate": "redigerade förfallodag till %s av %s", "activity-endDate": "redigerade slutdatum till %s av %s", "add-attachment": "Lägg till bilaga", @@ -202,9 +190,9 @@ "board-view-collapse": "Fäll ihop", "board-view-gantt": "Gantt", "board-view-lists": "Listor", - "bucket-example": " Som till exempel \"Bucket List\"", - "calendar-previous-month-label": " Föregående månad", - "calendar-next-month-label": " Nästa månad", + "bucket-example": "Like \"Bucket List\" for example", + "calendar-previous-month-label": "Previous Month", + "calendar-next-month-label": "Next Month", "cancel": "Avbryt", "card-archived": "Detta kort är flyttat till arkiv.", "board-archived": "Den här tavlan är flyttad till arkiv.", @@ -328,16 +316,10 @@ "comment-placeholder": "Skriv kommentar", "comment-only": "Kommentera endast", "comment-only-desc": "Kan endast kommentera kort.", - "comment-assigned-only": "Endast tilldelad kommentar", - "comment-assigned-only-desc": "Endast tilldelade kort synliga. Kan endast kommentera.", "comment-delete": "Är du säker på att du vill radera kommentaren?", "deleteCommentPopup-title": "Radera kommentaren?", "no-comments": "Inga kommentarer", "no-comments-desc": "Kan inte se kommentarer och aktiviteter.", - "read-only": "Skrivskyddad", - "read-only-desc": "Kan endast visa kort. Kan inte redigera.", - "read-assigned-only": "Endast tilldelad läsning", - "read-assigned-only-desc": "Endast tilldelade kort synliga. Kan inte redigera.", "worker": "Arbetare", "worker-desc": "Kan endast flytta kort, tilldela sig själv till kort och kommentera.", "computer": "Dator", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Är du säker på att du vill radera checklistan?", "subtaskDeletePopup-title": "Radera deluppgift?", "checklistDeletePopup-title": "Radera checklistan?", - "checklistItemDeletePopup-title": "Radera checklistpost?", "copy-card-link-to-clipboard": "Kopiera kortlänk till urklipp", "copy-text-to-clipboard": "Kopiera text till urklipp", "linkCardPopup-title": "Länka kort", @@ -356,7 +337,6 @@ "copyManyCardsPopup-format": "[ {\"title\": \"Första kortets titel\", \"description\":\"Första kortets beskrivning\"}, {\"title\":\"Andra kortets titel\",\"description\":\"Andra kortets beskrivning\"},{\"title\":\"Sista kortets titel\",\"description\":\"Sista kortets beskrivning\"} ]", "create": "Skapa", "createBoardPopup-title": "Skapa tavla", - "createTemplateContainerPopup-title": "Lägg till från mall", "chooseBoardSourcePopup-title": "Importera tavla", "createLabelPopup-title": "Skapa etikett", "createCustomField": "Skapa fält", @@ -376,10 +356,10 @@ "custom-field-text": "Text", "custom-fields": "Anpassade fält", "date": "Datum", - "date-format": "Datumformat", - "date-format-yyyy-mm-dd": "ÅÅÅÅ-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-ÅÅÅÅ", - "date-format-mm-dd-yyyy": "MM-DD-ÅÅÅÅ", + "date-format": "Date Format", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Neka", "default-avatar": "Standard avatar", "delete": "Ta bort", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Redigera notis", "editProfilePopup-title": "Redigera profil", "email": "E-post", - "email-address": "E-postadress", "email-enrollAccount-subject": "Ett konto skapat 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", @@ -554,7 +533,6 @@ "log-in": "Logga in", "loginPopup-title": "Logga in", "memberMenuPopup-title": "Användarinställningar", - "grey-icons": "Grå ikoner", "members": "Medlemmar", "menu": "Meny", "move-selection": "Flytta vald", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Flytta längst ner", "moveCardToTop-title": "Flytta högst upp", "moveSelectionPopup-title": "Flytta vald", - "copySelectionPopup-title": "Kopiera markering", - "selection-color": "Markeringsfärg", "multi-selection": "Flerval", "multi-selection-label": "Ange etikett för val", "multi-selection-member": "Ange medlem för val", @@ -578,8 +554,6 @@ "no-results": "Inga reslutat", "normal": "Normal", "normal-desc": "Kan se och redigera kort. Kan inte ändra inställningar.", - "normal-assigned-only": "Endast tilldelad normal", - "normal-assigned-only-desc": " Endast tilldelade kort synliga. Redigera som normal användare.", "not-accepted-yet": "Inbjudan inte ännu accepterad", "notify-participate": "Få uppdateringar på alla kort du är med som deltagare, skapare eller medlem", "notify-watch": "Få uppdateringar till alla anslagstavlor, listor, eller kort du bevakar", @@ -663,9 +637,9 @@ "upload": "Ladda upp", "upload-avatar": "Ladda upp en avatar", "uploaded-avatar": "Laddade upp en avatar", - "uploading-files": "Laddar upp filer", - "upload-failed": "Uppladdning misslyckades", - "upload-completed": "Uppladdning slutförd", + "uploading-files": "Uploading files", + "upload-failed": "Upload failed", + "upload-completed": "Upload completed", "custom-top-left-corner-logo-image-url": "Länk till anpassad logotypbild", "custom-top-left-corner-logo-link-url": "Länk för anpassad logotyp", "custom-top-left-corner-logo-height": "Anpassad logotyphöjd uppe till vänster. Standard: 27", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Ändra mottagningsdatum", "editCardEndDatePopup-title": "Ändra slutdatum", "setCardColorPopup-title": "Ange färg", - "setSelectionColorPopup-title": "Ange markeringsfärg", "setCardActionsColorPopup-title": "Välj en färg", "setSwimlaneColorPopup-title": "Välj en färg", "setListColorPopup-title": "Välj en färg", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "Alla listor, kort, etiketter och aktiviteter kommer tas bort och du kommer inte kunna återställa tavlans innehåll. Det går inte att ångra.", "boardDeletePopup-title": "Ta bort tavla?", "delete-board": "Ta bort tavla", - "delete-duplicate-lists": "Ta bort dubblettlistor", - "delete-duplicate-lists-confirm": "Är du säker? Detta kommer att ta bort alla dubblettlistor som har samma namn och inte innehåller några kort.", "default-subtasks-board": "Deluppgifter för __board__ board", "default": "Standard", "defaultdefault": "Standard", @@ -790,7 +761,7 @@ "subtask-settings": "Deluppgift inställningar", "card-settings": "Kortinställningar", "minicard-settings": "Minikort inställningar", - "boardSubtaskSettingsPopup-title": "Deluppgift inställningar", + "boardSubtaskSettingsPopup-title": "Tavelinställningar för deluppgifter", "boardCardSettingsPopup-title": "Kortinställningar", "boardMinicardSettingsPopup-title": "Minikort inställningar", "deposit-subtasks-board": "Lägg till deluppgifter till denna tavla:", @@ -961,8 +932,6 @@ "a-endAt": "ändrad sluttid att vara", "a-startAt": "ändrad starttid att vara", "a-receivedAt": "ändrad mottagen tid att vara", - "above-selected-card": "Ovanför markerat kort", - "below-selected-card": "Under markerat kort", "almostdue": "aktuell förfallotid %s närmar sig", "pastdue": "aktuell förfallotid %s är förbi", "duenow": "aktuell förfallotid %s är idag", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Jag", "dueCardsViewChange-choice-all": "Alla användare", "dueCardsViewChange-choice-all-description": "Visar alla oklara kort med *förfallo* datum från tavlor som användaren har tillgång till.", - "dueCards-noResults-title": " Inga kort med förfallodatum hittades", - "dueCards-noResults-description": "Du har inga kort med förfallodatum just nu.", "broken-cards": "Trasiga kort", "board-title-not-found": "Tavla '%s' hittades inte.", "swimlane-title-not-found": "Simbana '%s' hittades inte.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Dölj alla objekt i checklistan", "support": "Hjälp", "supportPopup-title": "Hjälp", - "support-page-enabled": "Supportsida aktiverad", - "support-info-not-added-yet": " Supportinformation har inte lagts till ännu", - "support-info-only-for-logged-in-users": " Supportinformation är endast för inloggade användare.", - "support-title": "Supporttitel", - "support-content": " Supportinnehåll", "accessibility": " Tillgänglighet", "accessibility-page-enabled": "Tillgänglighetssida aktiverad", "accessibility-info-not-added-yet": " Tillgänglighetsinformation har inte lagts till ännu", @@ -1358,248 +1320,179 @@ "admin-people-user-inactive": "Användaren är inaktiv – klicka för att aktivera", "accounts-lockout-all-users-unlocked": "Alla låsta användare har låsts upp", "accounts-lockout-unlock-all": "Lås upp alla", - "active-cron-jobs": "Aktiva schemalagda jobb", - "add-cron-job": " Lägg till schemalagt jobb", - "add-cron-job-placeholder": "Funktionen för att lägga till schemalagda jobb kommer snart", - "attachment-storage-configuration": "Konfiguration av fillagringsplats", - "attachments-path": " Sökväg för bilagor", - "attachments-path-description": "Sökväg där bifogade filer lagras", - "avatars-path": "Sökväg för avatarer", - "avatars-path-description": "Sökväg där avatarfiler lagras", - "board-archive-failed": "Misslyckades att schemalägga arkivering av tavla", - "board-archive-scheduled": "Tavlans arkivering har schemalagts", - "board-backup-failed": "Misslyckades med att schemalägga säkerhetskopiering av tavlan", - "board-backup-scheduled": "Säkerhetskopiering av tavlan har schemalagts", - "board-cleanup-failed": "Misslyckades med att schemalägga rensning av tavlan", - "board-cleanup-scheduled": "Rensning av tavlan har schemalagts", - "board-operations": "Tavlans åtgärder", - "cron-jobs": "Schemalagda jobb", - "cron-migrations": "Schemalagda migreringar", - "cron-job-delete-confirm": "Är du säker på att du vill ta bort det här schemalagda jobbet?", - "cron-job-delete-failed": "Misslyckades med att ta bort schemalagt jobb", - "cron-job-deleted": "Schemalagt jobb borttaget", - "cron-job-pause-failed": "Misslyckades med att pausa schemalagt jobb", - "cron-job-paused": "Schemalagt jobb pausat", - "filesystem-path-description": "Basväg för fillagring", - "gridfs-enabled": "GridFS aktiverat", - "gridfs-enabled-description": "Använd MongoDB GridFS för fillagring", - "migration-pause-failed": "Misslyckades med att pausa migreringar", - "migration-paused": "Migreringar har pausats", - "migration-progress": "Migreringsförlopp", - "migration-start-failed": "Misslyckades med att starta migreringar", - "migration-started": "Migreringar har startats", - "migration-status": "Migreringsstatus", - "migration-stop-confirm": "Är du säker på att du vill stoppa alla migreringar?", - "migration-stop-failed": "Misslyckades med att stoppa migreringar", - "migration-stopped": "Migreringar har stoppats", - "mongodb-gridfs-storage": "MongoDB GridFS-lagring", - "pause-all-migrations": "Pausa alla migreringar", - "s3-access-key": "S3-åtkomstnyckel", - "s3-access-key-description": "AWS S3-åtkomstnyckel för autentisering", - "s3-access-key-placeholder": "Ange S3-åtkomstnyckel", - "s3-bucket": "S3-hink", - "s3-bucket-description": "Namn på S3-hink för lagring av filer", - "s3-connection-failed": "S3-anslutning misslyckades", - "s3-connection-success": "S3-anslutning lyckades", - "s3-enabled": "S3 aktiverat", - "s3-enabled-description": "Använd AWS S3 eller MinIO för fillagring", - "s3-endpoint": "S3-endpunkt", - "s3-endpoint-description": "S3-endpunkts-URL (t.ex. s3.amazonaws.com eller minio.example.com)", - "s3-minio-storage": "S3/MinIO-lagring", - "s3-port": "S3-port", - "s3-port-description": "Portnummer för S3-endpunkt", - "s3-region": "S3-region", - "s3-region-description": "AWS S3-region (t.ex. us-east-1)", - "s3-secret-key": "S3-hemlig nyckel", - "s3-secret-key-description": "AWS S3-hemlig nyckel för autentisering", - "s3-secret-key-placeholder": "Ange S3-hemlig nyckel", - "s3-secret-key-required": "S3-hemlig nyckel krävs", - "s3-settings-save-failed": "Misslyckades med att spara S3-inställningar", - "s3-settings-saved": "S3-inställningar har sparats", - "s3-ssl-enabled": "S3 SSL aktiverat", - "s3-ssl-enabled-description": "Använd SSL/TLS för S3-anslutningar", - "save-s3-settings": "Spara S3-inställningar", - "schedule-board-archive": "Schemalägg tavlarkivering", - "schedule-board-backup": "Schemalägg säkerhetskopiering av tavlan", - "schedule-board-cleanup": "Schemalägg rensning av tavlan", - "scheduled-board-operations": "Schemalagda tavlans åtgärder", - "start-all-migrations": "Starta alla migreringar", - "stop-all-migrations": "Stoppa alla migreringar", - "test-s3-connection": "Testa S3-anslutning", - "writable-path": "Skrivbar sökväg", - "writable-path-description": "Baskatalogsökväg för fillagring", - "add-job": "Lägg till jobb", - "attachment-migration": "Migrering av bilagor", - "attachment-monitoring": "Övervakning av bilagor", - "attachment-settings": "Bilageinställningar", - "attachment-storage-settings": " Lagringsinställningar", - "automatic-migration": "Automatisk migrering", - "back-to-settings": "Tillbaka till inställningar", - "board-id": "Tavlans ID", - "board-migration": "Tavelmigration", - "board-migrations": "Migrering av tavlor", - "card-show-lists-on-minicard": "Visa listor på minikort", - "comprehensive-board-migration": "Fullständig migration av alla tavlor ", - "comprehensive-board-migration-description": "Utför omfattande kontroller och korrigeringar för tavlans dataintegritet, inklusive listordning, kortpositioner och swimlane-struktur.", - "delete-duplicate-empty-lists-migration": "Ta bort duplicerade tomma listor", - "delete-duplicate-empty-lists-migration-description": "Tar säkert bort tomma duplicerade listor. Tar endast bort listor som inte har några kort OCH där det finns en annan lista med samma titel som innehåller kort.", - "lost-cards": "Förlorade kort ", - "lost-cards-list": "Återställda objekt", - "restore-lost-cards-migration": "Återställ förlorade kort", - "restore-lost-cards-migration-description": "Hittar och återställer kort och listor som saknar simbaneid eller listId. Skapar en 'Förlorade kort'-simbana för att göra alla förlorade objekt synliga igen.", - "restore-all-archived-migration": "Återställ från Arkiv", - "restore-all-archived-migration-description": "Återställer alla arkiverade swimlanes, listor och kort. Korrigerar automatiskt alla saknade simbaneId eller listId för att göra objekt synliga.", - "fix-missing-lists-migration": "Fixa saknade listor", - "fix-missing-lists-migration-description": "Upptäcker och reparerar saknade eller korrupta listor i tavlans struktur.", - "fix-avatar-urls-migration": "Fixa avatar-URL:er", - "fix-avatar-urls-migration-description": "Uppdaterar avatar-URL:er för tavlans medlemmar till att använda rätt lagrings-backend och fixar trasiga avatar-referenser.", - "fix-all-file-urls-migration": "Fixa alla fil-URL:er", - "fix-all-file-urls-migration-description": "Uppdaterar alla URL:er för filbilagor på denna tavla till att använda rätt lagrings-backend och fixar trasiga filreferenser.", - "migration-needed": "Migrering krävs", - "migration-complete": "Avslutad", - "migration-running": "Körs...", - "migration-successful": "Migrering slutförd", - "migration-failed": "Migrering misslyckades", - "migrations": "Migreringar", - "migrations-admin-only": "Endast tavlans administratörer kan köra migreringar", - "migrations-description": "Kör dataintegritetskontroller och reparationer för denna tavla. Varje migrering kan utföras individuellt.", - "no-issues-found": "Inga problem hittades", - "run-migration": "Kör migrering", - "run-comprehensive-migration-confirm": "Detta kommer att utföra en omfattande migrering för att kontrollera och fixa tavlans dataintegritet. Detta kan ta en liten stund. Fortsätt?", - "run-delete-duplicate-empty-lists-migration-confirm": "Detta kommer först att konvertera alla delade listor till listor per simbana, och sedan ta bort tomma listor som har en dubblettlista med samma titel som innehåller kort. Endast överflödiga tomma listor kommer att tas bort. Fortsätt?", - "run-restore-lost-cards-migration-confirm": "Detta kommer att skapa en 'Förlorade kort'-simbana och återställa alla kort och listor som saknar simbaneId eller listId. Detta påverkar endast icke-arkiverade objekt. Fortsätt?", - "run-restore-all-archived-migration-confirm": "Detta kommer att återställa ALLA arkiverade simbanor, listor och kort, vilket gör dem synliga igen. Alla objekt med saknade ID:n kommer att fixas automatiskt. Detta kan inte enkelt ångras. Fortsätt?", - "run-fix-missing-lists-migration-confirm": "Detta kommer att upptäcka och reparera saknade eller korrupta listor i tavlans struktur. Fortsätt?", - "run-fix-avatar-urls-migration-confirm": "Detta kommer att uppdatera avatar-URL:er för tavlans medlemmar till att använda rätt lagrings-backend. Fortsätt?", - "run-fix-all-file-urls-migration-confirm": "Detta kommer att uppdatera alla URL:er för filbilagor på denna tavla till att använda rätt lagrings-backend. Fortsätt?", - "restore-lost-cards-nothing-to-restore": "Inga förlorade simbanor, listor eller kort att återställa", - - "migration-progress-title": "Tavlans migrering pågår", - "migration-progress-overall": "Övergripande förlopp", - "migration-progress-current-step": "Nuvarande steg", - "migration-progress-status": "Status", - "migration-progress-details": "Detaljer", - "migration-progress-note": "Vänta medan vi migrerar din tavla till den senaste strukturen...", - "steps": "steg", - "view": "Visa", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analysera tavlans struktur", - "step-fix-orphaned-cards": "Fixa övergivna kort", - "step-convert-shared-lists": "Konvertera delade listor", - "step-ensure-per-swimlane-lists": "Säkerställ listor per simbana", - "step-validate-migration": "Validera migrering", - "step-fix-avatar-urls": "Fixa avatar-URL:er", - "step-fix-attachment-urls": "Fixa bilage-URL:er", - "step-analyze-lists": "Analysera listor", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Uppdatera kort", - "step-finalize": "Slutför", - "step-delete-duplicate-empty-lists": "Ta bort duplicerade tomma listor", - "step-ensure-lost-cards-swimlane": "Säkerställ simbana för förlorade kort", - "step-restore-lists": "Återställ listor", - "step-restore-cards": "Återställ kort", - "step-restore-swimlanes": "Återställ simbanor", - "step-fix-missing-ids": "Fixa saknade ID:n", - "step-scan-users": "Kontrollerar tavlans medlemsavatarer", - "step-scan-files": "Kontrollerar tavlans filbilagor", - "step-fix-file-urls": "Fixar fil-URL:er", - "cleanup": "Rensning", - "cleanup-old-jobs": "Rensa gamla jobb", + "active-cron-jobs": "Active Scheduled Jobs", + "add-cron-job": "Add Scheduled Job", + "add-cron-job-placeholder": "Add Scheduled Job functionality coming soon", + "attachment-storage-configuration": "Attachment Storage Configuration", + "attachments-path": "Attachments Path", + "attachments-path-description": "Path where attachment files are stored", + "avatars-path": "Avatars Path", + "avatars-path-description": "Path where avatar files are stored", + "board-archive-failed": "Failed to schedule board archive", + "board-archive-scheduled": "Board archive scheduled successfully", + "board-backup-failed": "Failed to schedule board backup", + "board-backup-scheduled": "Board backup scheduled successfully", + "board-cleanup-failed": "Failed to schedule board cleanup", + "board-cleanup-scheduled": "Board cleanup scheduled successfully", + "board-operations": "Board Operations", + "cron-jobs": "Scheduled Jobs", + "cron-migrations": "Scheduled Migrations", + "cron-job-delete-confirm": "Are you sure you want to delete this scheduled job?", + "cron-job-delete-failed": "Failed to delete scheduled job", + "cron-job-deleted": "Scheduled job deleted successfully", + "cron-job-pause-failed": "Failed to pause scheduled job", + "cron-job-paused": "Scheduled job paused successfully", + "filesystem-path-description": "Base path for file storage", + "gridfs-enabled": "GridFS Enabled", + "gridfs-enabled-description": "Use MongoDB GridFS for file storage", + "migration-pause-failed": "Failed to pause migrations", + "migration-paused": "Migrations paused successfully", + "migration-progress": "Migration Progress", + "migration-start-failed": "Failed to start migrations", + "migration-started": "Migrations started successfully", + "migration-status": "Migration Status", + "migration-stop-confirm": "Are you sure you want to stop all migrations?", + "migration-stop-failed": "Failed to stop migrations", + "migration-stopped": "Migrations stopped successfully", + "mongodb-gridfs-storage": "MongoDB GridFS Storage", + "pause-all-migrations": "Pause All Migrations", + "s3-access-key": "S3 Access Key", + "s3-access-key-description": "AWS S3 access key for authentication", + "s3-access-key-placeholder": "Enter S3 access key", + "s3-bucket": "S3 Bucket", + "s3-bucket-description": "S3 bucket name for storing files", + "s3-connection-failed": "S3 connection failed", + "s3-connection-success": "S3 connection successful", + "s3-enabled": "S3 Enabled", + "s3-enabled-description": "Use AWS S3 or MinIO for file storage", + "s3-endpoint": "S3 Endpoint", + "s3-endpoint-description": "S3 endpoint URL (e.g., s3.amazonaws.com or minio.example.com)", + "s3-minio-storage": "S3/MinIO Storage", + "s3-port": "S3 Port", + "s3-port-description": "S3 endpoint port number", + "s3-region": "S3 Region", + "s3-region-description": "AWS S3 region (e.g., us-east-1)", + "s3-secret-key": "S3 Secret Key", + "s3-secret-key-description": "AWS S3 secret key for authentication", + "s3-secret-key-placeholder": "Enter S3 secret key", + "s3-secret-key-required": "S3 secret key is required", + "s3-settings-save-failed": "Failed to save S3 settings", + "s3-settings-saved": "S3 settings saved successfully", + "s3-ssl-enabled": "S3 SSL Enabled", + "s3-ssl-enabled-description": "Use SSL/TLS for S3 connections", + "save-s3-settings": "Save S3 Settings", + "schedule-board-archive": "Schedule Board Archive", + "schedule-board-backup": "Schedule Board Backup", + "schedule-board-cleanup": "Schedule Board Cleanup", + "scheduled-board-operations": "Scheduled Board Operations", + "start-all-migrations": "Start All Migrations", + "stop-all-migrations": "Stop All Migrations", + "test-s3-connection": "Test S3 Connection", + "writable-path": "Writable Path", + "writable-path-description": "Base directory path for file storage", + "add-job": "Add Job", + "attachment-migration": "Attachment Migration", + "attachment-monitoring": "Attachment Monitoring", + "attachment-settings": "Attachment Settings", + "attachment-storage-settings": "Storage Settings", + "automatic-migration": "Automatic Migration", + "back-to-settings": "Back to Settings", + "board-id": "Board ID", + "board-migration": "Board Migration", + "card-show-lists-on-minicard": "Show Lists on Minicard", + "cleanup": "Cleanup", + "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Avslutad", - "conversion-info-text": "Denna konvertering utförs en gång per tavla och förbättrar prestandan. Ni kan fortsätta använda tavlan som vanligt.", - "converting-board": "Konverterar tavla", - "converting-board-description": "Konverterar tavlans struktur för förbättrad funktionalitet. Detta kan ta en liten stund.", - "cpu-cores": "CPU-kärnor", - "cpu-usage": "CPU-användning", - "current-action": "Nuvarande åtgärd", - "database-migration": "Databas­migrering", - "database-migration-description": "Uppdaterar databasstrukturen för förbättrad funktionalitet och prestanda. Denna process kan ta flera minuter.", - "database-migrations": "Databas­migreringar", - "days-old": "Dagar gammal", - "duration": "Varaktighet", - "errors": "Fel", - "estimated-time-remaining": "Beräknad återstående tid", - "every-1-day": "Var 1 dag", - "every-1-hour": "Var 1 timme", - "every-1-minute": "Var 1 minut", - "every-10-minutes": "Var 10 minuter", - "every-30-minutes": "Var 30 minuter", - "every-5-minutes": "Var 5 minuter", - "every-6-hours": "Var 6 timmar", - "export-monitoring": "Exportövervakning", - "filesystem-attachments": "Filssystem-bilagor", - "filesystem-size": "Filssystemstorlek", - "filesystem-storage": "Filssystemlagring", - "force-board-scan": "Tvinga tavelskanning", - "gridfs-attachments": "GridFS-bilagor", - "gridfs-size": "GridFS-storlek", + "conversion-info-text": "This conversion is performed once per board and improves performance. You can continue using the board normally.", + "converting-board": "Converting Board", + "converting-board-description": "Converting board structure for improved functionality. This may take a few moments.", + "cpu-cores": "CPU Cores", + "cpu-usage": "CPU Usage", + "current-action": "Current Action", + "database-migration": "Database Migration", + "database-migration-description": "Updating database structure for improved functionality and performance. This process may take several minutes.", + "database-migrations": "Database Migrations", + "days-old": "Days Old", + "duration": "Duration", + "errors": "Errors", + "estimated-time-remaining": "Estimated time remaining", + "every-1-day": "Every 1 day", + "every-1-hour": "Every 1 hour", + "every-1-minute": "Every 1 minute", + "every-10-minutes": "Every 10 minutes", + "every-30-minutes": "Every 30 minutes", + "every-5-minutes": "Every 5 minutes", + "every-6-hours": "Every 6 hours", + "export-monitoring": "Export Monitoring", + "filesystem-attachments": "Filesystem Attachments", + "filesystem-size": "Filesystem Size", + "filesystem-storage": "Filesystem Storage", + "force-board-scan": "Force Board Scan", + "gridfs-attachments": "GridFS Attachments", + "gridfs-size": "GridFS Size", "gridfs-storage": "GridFS", - "hide-list-on-minicard": "Göm lista på minikort", - "idle-migration": "Inaktiv migrering", - "job-description": "Jobbeskrivning", - "job-details": "Jobbdetaljer", - "job-name": "Jobbnamn", - "job-queue": "Jobbkö", - "last-run": "Senaste körning", - "max-concurrent": "Max samtidigt", - "memory-usage": "Minnesanvändning", - "migrate-all-to-filesystem": "Migrera allt till filsystem", - "migrate-all-to-gridfs": "Migrera allt till GridFS", - "migrate-all-to-s3": "Migrera allt till S3", - "migrated-attachments": "Migrerade bilagor", - "migration-batch-size": "Batchstorlek", - "migration-batch-size-description": "Antal bilagor att bearbeta i varje batch (1-100)", - "migration-cpu-threshold": "CPU-tröskel (%)", - "migration-cpu-threshold-description": "Pausa migreringen när CPU-användningen överstiger denna procentsats (10-90)", - "migration-delay-ms": "Fördröjning (ms)", - "migration-delay-ms-description": "Fördröjning mellan batchar i millisekunder (100-10000)", - "migration-detector": "Migreringsdetektor", - "migration-info-text": "Databas­migreringar utförs en gång och förbättrar systemets prestanda. Processen fortsätter i bakgrunden även om du stänger din webbläsare.", - "migration-log": "Migreringslogg", - "migration-markers": "Migreringsmarkörer", - "migration-resume-failed": "Misslyckades med att återuppta migrering", - "migration-resumed": "Migrering återupptogs", - "migration-steps": "Migreringssteg", - "migration-warning-text": "Vänligen stäng inte din webbläsare under migreringen. Processen fortsätter i bakgrunden men kan ta längre tid att slutföra.", - "monitoring-export-failed": "Misslyckades med att exportera övervakningsdata", - "monitoring-refresh-failed": "Misslyckades med att uppdatera övervakningsdata", - "next": "Nästa", - "next-run": "Nästa körning", + "hide-list-on-minicard": "Hide List on Minicard", + "idle-migration": "Idle Migration", + "job-description": "Job Description", + "job-details": "Job Details", + "job-name": "Job Name", + "job-queue": "Job Queue", + "last-run": "Last Run", + "max-concurrent": "Max Concurrent", + "memory-usage": "Memory Usage", + "migrate-all-to-filesystem": "Migrate All to Filesystem", + "migrate-all-to-gridfs": "Migrate All to GridFS", + "migrate-all-to-s3": "Migrate All to S3", + "migrated-attachments": "Migrated Attachments", + "migration-batch-size": "Batch Size", + "migration-batch-size-description": "Number of attachments to process in each batch (1-100)", + "migration-cpu-threshold": "CPU Threshold (%)", + "migration-cpu-threshold-description": "Pause migration when CPU usage exceeds this percentage (10-90)", + "migration-delay-ms": "Delay (ms)", + "migration-delay-ms-description": "Delay between batches in milliseconds (100-10000)", + "migration-detector": "Migration Detector", + "migration-info-text": "Database migrations are performed once and improve system performance. The process continues in the background even if you close your browser.", + "migration-log": "Migration Log", + "migration-markers": "Migration Markers", + "migration-resume-failed": "Failed to resume migration", + "migration-resumed": "Migration resumed", + "migration-steps": "Migration Steps", + "migration-warning-text": "Please do not close your browser during migration. The process will continue in the background but may take longer to complete.", + "monitoring-export-failed": "Failed to export monitoring data", + "monitoring-refresh-failed": "Failed to refresh monitoring data", + "next": "Next", + "next-run": "Next Run", "of": "av", - "operation-type": "Operationstyp", - "overall-progress": "Övergripande förlopp", - "page": "Sida", - "pause": "Pause", - "pause-migration": "Pausa migrering", - "previous": "Föregående", - "refresh": "Uppdatera", - "refresh-monitoring": "Uppdatera övervakning", - "remaining-attachments": "Återstående bilagor", - "resume-migration": "Återuppta migrering", - "run-once": "Kör en gång", - "s3-attachments": "S3-bilagor", - "s3-size": "S3-storlek", + "operation-type": "Operation Type", + "overall-progress": "Overall Progress", + "page": "Page", + "pause-migration": "Pause Migration", + "previous": "Previous", + "refresh": "Refresh", + "refresh-monitoring": "Refresh Monitoring", + "remaining-attachments": "Remaining Attachments", + "resume-migration": "Resume Migration", + "run-once": "Run once", + "s3-attachments": "S3 Attachments", + "s3-size": "S3 Size", "s3-storage": "S3", - "scanning-status": "Skanningsstatus", - "schedule": "Schema", - "search-boards-or-operations": "Sök tavlor eller operationer...", - "show-list-on-minicard": "Visa lista på minikort", - "showChecklistAtMinicard": "Visa checklista på minikort", - "showing": "Visar", - "start-test-operation": "Starta testoperation", - "start-time": "Starttid", - "step-progress": "Stegförlopp", - "stop-migration": "Stoppa migrering", - "storage-distribution": "Lagringsdistribution", - "system-resources": "Systemresurser", - "total-attachments": "Totala bilagor", - "total-operations": "Totala operationer", - "total-size": "Total storlek", - "unmigrated-boards": "Okonverterade tavlor", - "weight": "Vikt", - "idle": "Inaktiv", - "complete": "Avslutad", - "cron": "Cron", - "current-step": "Nuvarande steg" + "scanning-status": "Scanning Status", + "schedule": "Schedule", + "search-boards-or-operations": "Search boards or operations...", + "show-list-on-minicard": "Show List on Minicard", + "showing": "Showing", + "start-test-operation": "Start Test Operation", + "start-time": "Start Time", + "step-progress": "Step Progress", + "stop-migration": "Stop Migration", + "storage-distribution": "Storage Distribution", + "system-resources": "System Resources", + "total-attachments": "Total Attachments", + "total-operations": "Total Operations", + "total-size": "Total Size", + "unmigrated-boards": "Unmigrated Boards", + "weight": "Weight", + "idle": "Idle", + "complete": "Complete", + "cron": "Cron" } diff --git a/imports/i18n/data/sw.i18n.json b/imports/i18n/data/sw.i18n.json index 173d55988..4d1d9559c 100644 --- a/imports/i18n/data/sw.i18n.json +++ b/imports/i18n/data/sw.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Andika changio", "comment-only": "Changia pekee", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Tarakilishi", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/ta.i18n.json b/imports/i18n/data/ta.i18n.json index cced5413b..2033930fc 100644 --- a/imports/i18n/data/ta.i18n.json +++ b/imports/i18n/data/ta.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "கருத்து மட்டும்", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "கருத்து இல்லை", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "கணினி", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "நாள்", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "மின் அஞ்சல்", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/te-IN.i18n.json b/imports/i18n/data/te-IN.i18n.json index d48099de1..12e76c28d 100644 --- a/imports/i18n/data/te-IN.i18n.json +++ b/imports/i18n/data/te-IN.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/th.i18n.json b/imports/i18n/data/th.i18n.json index 5ba090791..92160f0fb 100644 --- a/imports/i18n/data/th.i18n.json +++ b/imports/i18n/data/th.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "คอมพิวเตอร์", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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": "สร้างบอร์ด", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "สร้างป้ายกำกับ", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "วันที่", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "ปฎิเสธ", "default-avatar": "ภาพเริ่มต้น", "delete": "ลบ", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "แก้ไขการแจ้งเตือน", "editProfilePopup-title": "แก้ไขโปรไฟล์", "email": "อีเมล์", - "email-address": "Email Address", "email-enrollAccount-subject": "บัญชีคุณถูกสร้างใน __siteName__", "email-enrollAccount-text": "สวัสดี __user__,\n\nเริ่มใช้บริการง่าย ๆ , ด้วยการคลิกลิงค์ด้านล่าง.\n\n__url__\n\n ขอบคุณค่ะ", "email-fail": "การส่งอีเมล์ล้มเหลว", @@ -554,7 +533,6 @@ "log-in": "เข้าสู่ระบบ", "loginPopup-title": "เข้าสู่ระบบ", "memberMenuPopup-title": "การตั้งค่า", - "grey-icons": "Grey Icons", "members": "สมาชิก", "menu": "เมนู", "move-selection": "เลือกย้าย", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "ย้ายไปล่าง", "moveCardToTop-title": "ย้ายไปบน", "moveSelectionPopup-title": "เลือกย้าย", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "เลือกหลายรายการ", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "ไม่มีข้อมูล", "normal": "ธรรมดา", "normal-desc": "สามารถดูและแก้ไขการ์ดได้ แต่ไม่สามารถเปลี่ยนการตั้งค่าได้", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "ยังไม่ยอมรับคำเชิญ", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "ได้รับการแจ้งปรับปรุงบอร์ด รายการหรือการ์ดที่คุณเฝ้าติดตาม", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/tk_TM.i18n.json b/imports/i18n/data/tk_TM.i18n.json index d48099de1..12e76c28d 100644 --- a/imports/i18n/data/tk_TM.i18n.json +++ b/imports/i18n/data/tk_TM.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/tlh.i18n.json b/imports/i18n/data/tlh.i18n.json index d48099de1..12e76c28d 100644 --- a/imports/i18n/data/tlh.i18n.json +++ b/imports/i18n/data/tlh.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/tr.i18n.json b/imports/i18n/data/tr.i18n.json index 461a3ab59..cc05d2397 100644 --- a/imports/i18n/data/tr.i18n.json +++ b/imports/i18n/data/tr.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "%s yorum silindi", "activity-receivedDate": "alma tarihi için düzenlendi%s", "activity-startDate": "başlangıç tarihi %s, %s olarak düzenlendi", - "allboards.starred": "Starred", - "allboards.templates": "Şablonlar", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "bitiş tarihi %s / %s olarak düzenlendi", "activity-endDate": "son bitiş tarihi %s, %s olarak düzenlendi", "add-attachment": "Ek Ekle", @@ -328,16 +316,10 @@ "comment-placeholder": "Yorum Yaz", "comment-only": "Sadece yorum", "comment-only-desc": "Sadece kartlara yorum yazabilir.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Yorumu silmek istediğinizden emin misiniz?", "deleteCommentPopup-title": "Yorum silinsin mi?", "no-comments": "Yorum Yok", "no-comments-desc": "Yorumlar ve aktiviteleri göremiyorum.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Çalışan", "worker-desc": "Yalnızca kartları taşıyabilir, kendisini karta atayabilir ve yorum yapabilir.", "computer": "Bilgisayar", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Kontrol listesini silmek istediğinizden emin misiniz?", "subtaskDeletePopup-title": "Alt Görev Silinsin mi?", "checklistDeletePopup-title": "Kontrol Listesi Silinsin mi?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Kartın linkini kopyala", "copy-text-to-clipboard": "Yazıyı kopyala", "linkCardPopup-title": "Bağlantı kartı", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Şablon Konteyner Ekle", "chooseBoardSourcePopup-title": "Panoyu içe aktar", "createLabelPopup-title": "Etiket Oluşturma", "createCustomField": "Alanı yarat", @@ -377,9 +357,9 @@ "custom-fields": "Özel alanlar", "date": "Tarih", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Reddet", "default-avatar": "Varsayılan avatar", "delete": "Sil", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Bildirimi değiştir", "editProfilePopup-title": "Profili Düzenle", "email": "E-posta", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Oturum Aç", "loginPopup-title": "Oturum Aç", "memberMenuPopup-title": "Üye Ayarları", - "grey-icons": "Grey Icons", "members": "Üyeler", "menu": "Menü", "move-selection": "Seçimi taşı", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Aşağı taşı", "moveCardToTop-title": "Yukarı taşı", "moveSelectionPopup-title": "Seçimi taşı", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Çoklu seçim", "multi-selection-label": "Seçim için etiket belirle", "multi-selection-member": "Seçim için üye belirle", @@ -578,8 +554,6 @@ "no-results": "Sonuç yok", "normal": "Normal", "normal-desc": "Kartları görüntüleyebilir ve düzenleyebilir. Ayarları değiştiremez.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Davet henüz kabul edilmemiş", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Takip ettiğiniz tüm pano, liste ve kartlar hakkında bildirim al", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Giriş tarihini değiştir", "editCardEndDatePopup-title": "Bitiş tarihini değiştir", "setCardColorPopup-title": "Renk ayarla", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Renk seçimi yap", "setSwimlaneColorPopup-title": "Renk seçimi yap", "setListColorPopup-title": "Renk seçimi yap", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "Tüm listeler, kartlar, etiketler ve etkinlikler silinecek ve pano içeriğini kurtaramayacaksınız. Geri dönüş yok.", "boardDeletePopup-title": "Panoyu Sil?", "delete-board": "Panoyu Sil", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "__board__ panosu için alt görevler", "default": "Varsayılan", "defaultdefault": "Varsayılan", @@ -790,7 +761,7 @@ "subtask-settings": "Alt Görev ayarları", "card-settings": "Kart ayarları", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Alt Görev ayarları", + "boardSubtaskSettingsPopup-title": "Pano alt görev ayarları", "boardCardSettingsPopup-title": "Kart ayarları", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Alt görevleri bu panoda sakla:", @@ -961,8 +932,6 @@ "a-endAt": "bitiş zamanı değiştirildi", "a-startAt": "başlangıç zamanı değiştirildi", "a-receivedAt": "alınma zamanı değiştirildi", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "%s'in vadesi yaklaşıyor", "pastdue": "%s'in vadesi geçti", "duenow": "%s'in vadesi bugün", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Ben mi", "dueCardsViewChange-choice-all": "Tüm Kullanıcılar", "dueCardsViewChange-choice-all-description": "Kullanıcının iznine sahip olduğu panolardan *Son* tarihi olan tüm eksik kartları gösterir.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Kırık Kartlar", "board-title-not-found": "'%s' Pano bulunmadı.", "swimlane-title-not-found": "Yüzme kulvarı '%s'bulunamadı.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Destek", "supportPopup-title": "Destek", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Erişilebilirlik ", "accessibility-page-enabled": "Erişilebilirlik sayfası etkin", "accessibility-info-not-added-yet": "Erişilebilirlik bilgisi henüz eklenmedi", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Durum", - "migration-progress-details": "Detaylar", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Tamamlandı", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/ug.i18n.json b/imports/i18n/data/ug.i18n.json index d48099de1..12e76c28d 100644 --- a/imports/i18n/data/ug.i18n.json +++ b/imports/i18n/data/ug.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/uk-UA.i18n.json b/imports/i18n/data/uk-UA.i18n.json index 2deab81e5..af0c89170 100644 --- a/imports/i18n/data/uk-UA.i18n.json +++ b/imports/i18n/data/uk-UA.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "видалено коментар %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Шаблони", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Додати вкладення", @@ -328,16 +316,10 @@ "comment-placeholder": "Написати коментар", "comment-only": "Тільки коментарі", "comment-only-desc": "Може коментувати тільки картки.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Ви впевнені, що хочете видалити коментар?", "deleteCommentPopup-title": "Видалити коментар?", "no-comments": "Немає коментарів", "no-comments-desc": "Не може бачити коментарі та активність.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Робітник", "worker-desc": "Може тільки переміщати картки, призначати себе до картки і коментувати.", "computer": "Комп'ютер", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Ви впевнені, що хочете видалити контрольний список?", "subtaskDeletePopup-title": "Видалити підзадачу?", "checklistDeletePopup-title": "Видалити контрольний список?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Скопіювати посилання на картку в буфер обміну", "copy-text-to-clipboard": "Скопіювати текст у буфер обміну", "linkCardPopup-title": "Зв'язати картку", @@ -356,7 +337,6 @@ "copyManyCardsPopup-format": "[{\"title\": \"Перший заголовок картки\", \"description\":\"Перший опис картки\"}, {\"title\":\"Другий заголовок картки\",\"description\":\"Другий опис картки\"},{\"title\":\"Останній заголовок картки\",\"description\":\"Останній опис картки\"} ]", "create": "Створити", "createBoardPopup-title": "Створити дошку", - "createTemplateContainerPopup-title": "Додати шаблон контейнера", "chooseBoardSourcePopup-title": "Імпортувати дошку", "createLabelPopup-title": "Створити мітку", "createCustomField": "Створити поле", @@ -377,9 +357,9 @@ "custom-fields": "Налаштовані поля", "date": "Дата", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Відхилити", "default-avatar": "Аватар за замовчуванням", "delete": "Видалити", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Редагувати сповіщення", "editProfilePopup-title": "Редагувати профіль", "email": "Email", - "email-address": "Email Address", "email-enrollAccount-subject": "Акаунт створений для вас на __siteName__", "email-enrollAccount-text": "Привіт __user__,\n\nЩоб почати користуватися сервісом, просто натисніть на посилання нижче.\n\n__url__\n\nДякуємо.", "email-fail": "Невдача при відправленні email", @@ -554,7 +533,6 @@ "log-in": "Увійти", "loginPopup-title": "Увійти", "memberMenuPopup-title": "Налаштування користувачів", - "grey-icons": "Grey Icons", "members": "Користувачі", "menu": "Меню", "move-selection": "Перенести вибране", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Перемістити на низ", "moveCardToTop-title": "Перемістити на початок", "moveSelectionPopup-title": "Перенести вибране", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Мультивибір", "multi-selection-label": "Встановити мітку для вибору", "multi-selection-member": "Встановити учасника для вибору", @@ -578,8 +554,6 @@ "no-results": "Немає результатів", "normal": "Звичайний", "normal-desc": "Може переглядати та редагувати картки. Не може змінювати налаштування.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Запрошення ще не прийнято", "notify-participate": "Отримувати оновлення по будь-яких картках, де ви берете участь як творець або учасник", "notify-watch": "Отримувати оновлення по будь-яких дошках, списках або картках, за якими ви спостерігаєте", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Змінити дату отримання", "editCardEndDatePopup-title": "Змінити дату закінчення", "setCardColorPopup-title": "Встановити колір", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Вибрати колір", "setSwimlaneColorPopup-title": "Вибрати колір", "setListColorPopup-title": "Вибрати колір", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "Усі списки, картки, мітки та діяльність будуть видалені, і ви не зможете відновити вміст дошки. Немає відкату.", "boardDeletePopup-title": "Видалити дошку?", "delete-board": "Видалити дошку", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Підзадачі для дошки __board__", "default": "За замовчуванням", "defaultdefault": "За замовчуванням", @@ -790,7 +761,7 @@ "subtask-settings": "Налаштування підзадач", "card-settings": "Налаштування картки", "minicard-settings": "Налаштування міні-картки", - "boardSubtaskSettingsPopup-title": "Налаштування підзадач", + "boardSubtaskSettingsPopup-title": "Налаштування підзадач дошки", "boardCardSettingsPopup-title": "Налаштування картки", "boardMinicardSettingsPopup-title": "Налаштування міні-картки", "deposit-subtasks-board": "Перенести підзадачі на цю дошку:", @@ -961,8 +932,6 @@ "a-endAt": "змінено час закінчення на", "a-startAt": "змінено час початку на", "a-receivedAt": "змінено час отримання на", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "поточний час завершення %s наближається", "pastdue": "поточний час завершення %s пройшов", "duenow": "поточний час завершення %s сьогодні", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Я", "dueCardsViewChange-choice-all": "Усі Користувачі", "dueCardsViewChange-choice-all-description": "Показує всі незавершені картки з датою Термін з дошок, для яких користувач має дозвіл.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Пошкоджені Картки", "board-title-not-found": "Дошку '%s' не знайдено.", "swimlane-title-not-found": "Лінію '%s' не знайдено.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Приховати всі пункти чек-листа", "support": "Підтримка", "supportPopup-title": "Підтримка", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Доступность сторінки ввімкнена", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Статус", - "migration-progress-details": "Деталі", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "завершено", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/uk.i18n.json b/imports/i18n/data/uk.i18n.json index b1c3ba8b7..2c85595e0 100644 --- a/imports/i18n/data/uk.i18n.json +++ b/imports/i18n/data/uk.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "видалено коментар %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Шаблони", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Додати вкладення", @@ -328,16 +316,10 @@ "comment-placeholder": "Написати коментар", "comment-only": "Тільки коментарі", "comment-only-desc": "Може коментувати тільки картки.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Ви впевнені, що хочете видалити коментар?", "deleteCommentPopup-title": "Видалити коментар?", "no-comments": "Немає коментарів", "no-comments-desc": "Не може бачити коментарі та активність.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Робітник", "worker-desc": "Може тільки переміщати картки, призначати себе до картки і коментувати.", "computer": "Комп'ютер", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Ви впевнені, що хочете видалити контрольний список?", "subtaskDeletePopup-title": "Видалити підзадачу?", "checklistDeletePopup-title": "Видалити контрольний список?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Скопіювати посилання на картку в буфер обміну", "copy-text-to-clipboard": "Скопіювати текст у буфер обміну", "linkCardPopup-title": "Зв'язати картку", @@ -356,7 +337,6 @@ "copyManyCardsPopup-format": "[{\"title\": \"Перший заголовок картки\", \"description\":\"Перший опис картки\"}, {\"title\":\"Другий заголовок картки\",\"description\":\"Другий опис картки\"},{\"title\":\"Останній заголовок картки\",\"description\":\"Останній опис картки\"} ]", "create": "Створити", "createBoardPopup-title": "Створити дошку", - "createTemplateContainerPopup-title": "Додати шаблон контейнера", "chooseBoardSourcePopup-title": "Імпортувати дошку", "createLabelPopup-title": "Створити мітку", "createCustomField": "Створити поле", @@ -377,9 +357,9 @@ "custom-fields": "Налаштовані поля", "date": "Дата", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Відхилити", "default-avatar": "Аватар за замовчуванням", "delete": "Видалити", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Редагувати сповіщення", "editProfilePopup-title": "Редагувати профіль", "email": "Email", - "email-address": "Email Address", "email-enrollAccount-subject": "Акаунт створений для вас на __siteName__", "email-enrollAccount-text": "Привіт __user__,\n\nЩоб почати користуватися сервісом, просто натисніть на посилання нижче.\n\n__url__\n\nДякуємо.", "email-fail": "Невдача при відправленні email", @@ -554,7 +533,6 @@ "log-in": "Увійти", "loginPopup-title": "Увійти", "memberMenuPopup-title": "Налаштування користувачів", - "grey-icons": "Grey Icons", "members": "Користувачі", "menu": "Меню", "move-selection": "Перенести вибране", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Перемістити на низ", "moveCardToTop-title": "Перемістити на початок", "moveSelectionPopup-title": "Перенести вибране", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Мультивибір", "multi-selection-label": "Встановити мітку для вибору", "multi-selection-member": "Встановити учасника для вибору", @@ -578,8 +554,6 @@ "no-results": "Немає результатів", "normal": "Звичайний", "normal-desc": "Може переглядати та редагувати картки. Не може змінювати налаштування.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Запрошення ще не прийнято", "notify-participate": "Отримувати оновлення по будь-яких картках, де ви берете участь як творець або учасник", "notify-watch": "Отримувати оновлення по будь-яких дошках, списках або картках, за якими ви спостерігаєте", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Змінити дату отримання", "editCardEndDatePopup-title": "Змінити дату закінчення", "setCardColorPopup-title": "Встановити колір", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Вибрати колір", "setSwimlaneColorPopup-title": "Вибрати колір", "setListColorPopup-title": "Вибрати колір", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "Усі списки, картки, мітки та діяльність будуть видалені, і ви не зможете відновити вміст дошки. Немає відкату.", "boardDeletePopup-title": "Видалити дошку?", "delete-board": "Видалити дошку", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Підзадачі для дошки __board__", "default": "За замовчуванням", "defaultdefault": "За замовчуванням", @@ -790,7 +761,7 @@ "subtask-settings": "Налаштування підзадач", "card-settings": "Налаштування картки", "minicard-settings": "Налаштування міні-картки", - "boardSubtaskSettingsPopup-title": "Налаштування підзадач", + "boardSubtaskSettingsPopup-title": "Налаштування підзадач дошки", "boardCardSettingsPopup-title": "Налаштування картки", "boardMinicardSettingsPopup-title": "Налаштування міні-картки", "deposit-subtasks-board": "Перенести підзадачі на цю дошку:", @@ -961,8 +932,6 @@ "a-endAt": "змінено час закінчення на", "a-startAt": "змінено час початку на", "a-receivedAt": "змінено час отримання на", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "поточний час завершення %s наближається", "pastdue": "поточний час завершення %s пройшов", "duenow": "поточний час завершення %s сьогодні", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Я", "dueCardsViewChange-choice-all": "Усі Користувачі", "dueCardsViewChange-choice-all-description": "Показує всі незавершені картки з датою Термін з дошок, для яких користувач має дозвіл.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Пошкоджені Картки", "board-title-not-found": "Дошку '%s' не знайдено.", "swimlane-title-not-found": "Лінію '%s' не знайдено.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Приховати всі пункти чек-листа", "support": "Підтримка", "supportPopup-title": "Підтримка", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Увімкнено сторінку доступності", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Статус", - "migration-progress-details": "Деталі", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "завершено", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/uz-AR.i18n.json b/imports/i18n/data/uz-AR.i18n.json index d48099de1..12e76c28d 100644 --- a/imports/i18n/data/uz-AR.i18n.json +++ b/imports/i18n/data/uz-AR.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/uz-LA.i18n.json b/imports/i18n/data/uz-LA.i18n.json index d48099de1..12e76c28d 100644 --- a/imports/i18n/data/uz-LA.i18n.json +++ b/imports/i18n/data/uz-LA.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/uz-UZ.i18n.json b/imports/i18n/data/uz-UZ.i18n.json index d48099de1..12e76c28d 100644 --- a/imports/i18n/data/uz-UZ.i18n.json +++ b/imports/i18n/data/uz-UZ.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/uz.i18n.json b/imports/i18n/data/uz.i18n.json index d48099de1..12e76c28d 100644 --- a/imports/i18n/data/uz.i18n.json +++ b/imports/i18n/data/uz.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/ve-CC.i18n.json b/imports/i18n/data/ve-CC.i18n.json index d48099de1..12e76c28d 100644 --- a/imports/i18n/data/ve-CC.i18n.json +++ b/imports/i18n/data/ve-CC.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/ve-PP.i18n.json b/imports/i18n/data/ve-PP.i18n.json index d48099de1..12e76c28d 100644 --- a/imports/i18n/data/ve-PP.i18n.json +++ b/imports/i18n/data/ve-PP.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/ve.i18n.json b/imports/i18n/data/ve.i18n.json index d48099de1..12e76c28d 100644 --- a/imports/i18n/data/ve.i18n.json +++ b/imports/i18n/data/ve.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/vi-VN.i18n.json b/imports/i18n/data/vi-VN.i18n.json index 44a6dede4..f4781f94d 100644 --- a/imports/i18n/data/vi-VN.i18n.json +++ b/imports/i18n/data/vi-VN.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/vi.i18n.json b/imports/i18n/data/vi.i18n.json index 41fb893e3..a3e66eb62 100644 --- a/imports/i18n/data/vi.i18n.json +++ b/imports/i18n/data/vi.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "đã xoá lời bình %s", "activity-receivedDate": "đã sửa ngày nhận đến %s của %s", "activity-startDate": "đã sửa ngày bắt đầu thành %s của %s", - "allboards.starred": "Starred", - "allboards.templates": "Các mẫu", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "đã sửa ngày hết hạn thành %s của %s", "activity-endDate": "đã sửa ngày kết thúc thành %s của %s", "add-attachment": "Thêm Bản Đính Kèm", @@ -328,16 +316,10 @@ "comment-placeholder": "Viết Bình Luận", "comment-only": "Chỉ bình luận", "comment-only-desc": "Chỉ có thể nhận xét về thẻ.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "Không có bình luận", "no-comments-desc": "Không thể xem bình luận và hoạt động.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Chỉ có thể di chuyển thẻ, tự gán thẻ và nhận xét.", "computer": "Máy tính", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Sao chép liên kết thẻ vào khay nhớ tạm", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Thẻ liên kết", @@ -356,7 +337,6 @@ "copyManyCardsPopup-format": "[ {\"title\": \"Tiêu đề thẻ đầu tiên\", \"description\":\"Mô tả thẻ đầu tiên\"}, {\"title\":\"Tiêu đề thẻ thứ hai\",\"description\":\"Mô tả thẻ thứ hai\"},{\"title\":\"Tiêu đề thẻ cuối cùng\",\"description\":\"Mô tả thẻ cuối cùng\"} ]", "create": "Tạo", "createBoardPopup-title": "Tạo Bảng", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Nhập bảng", "createLabelPopup-title": "Tạo nhãn", "createCustomField": "Tạo Trường", @@ -377,9 +357,9 @@ "custom-fields": "Trường tùy chỉnh", "date": "Ngày", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Từ chối", "default-avatar": "Hình đại diện mặc định", "delete": "Xoá", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Sửa Thông báo", "editProfilePopup-title": "Sửa Hồ sơ", "email": "Email", - "email-address": "Email Address", "email-enrollAccount-subject": "Một tài khoản được tạo cho bạn trên __siteName__", "email-enrollAccount-text": "Chào __user__,\n\nĐể bắt đầu sử dụng dịch vụ, chỉ cần nhấp vào liên kết bên dưới.\n\n__url__\n\nCảm ơn.", "email-fail": "Gửi email không thành công", @@ -554,7 +533,6 @@ "log-in": "Đăng nhập", "loginPopup-title": "Đăng nhập", "memberMenuPopup-title": "Cài đặt thành viên", - "grey-icons": "Grey Icons", "members": "Thành Viên", "menu": "Menu", "move-selection": "Di chuyển lựa chọn", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Di chuyển xuống dưới cùng", "moveCardToTop-title": "Di chuyển lên đầu", "moveSelectionPopup-title": "Di chuyển lựa chọn", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Chọn nhiều", "multi-selection-label": "Đặt nhãn để lựa chọn", "multi-selection-member": "Đặt thành viên để lựa chọn", @@ -578,8 +554,6 @@ "no-results": "Không có kết quả", "normal": "Bình thường", "normal-desc": "Có thể xem và chỉnh sửa thẻ. Không thể thay đổi cài đặt.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Lời mời chưa được chấp nhận", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Nhận thông tin cập nhật cho bất kỳ bảng, danh sách hoặc thẻ nào bạn đang xem", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Thay đổi ngày nhận", "editCardEndDatePopup-title": "Thay đổi ngày kết thúc", "setCardColorPopup-title": "Đặt màu", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Chọn một màu", "setSwimlaneColorPopup-title": "Chọn một màu", "setListColorPopup-title": "Chọn một màu", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "Tất cả danh sách, thẻ, nhãn và hoạt động sẽ bị xóa và bạn sẽ không thể khôi phục nội dung bảng. Không thể hoàn tác.", "boardDeletePopup-title": "Xoá Bảng?", "delete-board": "Xoá Bảng", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Nhiệm vụ phụ cho __board__ bảng", "default": "Mặc định", "defaultdefault": "Mặc định", @@ -790,7 +761,7 @@ "subtask-settings": "Cài đặt Nhiệm vụ phụ", "card-settings": "Cài đặt Thẻ", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Cài đặt Nhiệm vụ phụ", + "boardSubtaskSettingsPopup-title": "Cài đặt Bảng Nhiệm vụ phụ", "boardCardSettingsPopup-title": "Cài đặt Thẻ", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Gửi các nhiệm vụ phụ vào bảng này:", @@ -961,8 +932,6 @@ "a-endAt": "đã sửa đổi thời gian kết thúc thành", "a-startAt": "thời gian bắt đầu được sửa đổi thành", "a-receivedAt": "đã sửa đổi thời gian nhận được", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "thời gian đến hạn hiện tại %s đang đến gần", "pastdue": "thời gian đến hạn hiện tại %s đã qua", "duenow": "giờ đến hạn hiện tại %s là hôm nay", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Tôi", "dueCardsViewChange-choice-all": "Tất cả người dùng", "dueCardsViewChange-choice-all-description": "Hiển thị tất cả các thẻ chưa hoàn thành có ngày *Đến hạn* từ bảng mà người dùng có quyền.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Thẻ bị hỏng", "board-title-not-found": "Không tìm thấy bảng '%s'", "swimlane-title-not-found": "Không tìm thấy làn ngang '%s'", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Trạng thái", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Đã hoàn thành", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/vl-SS.i18n.json b/imports/i18n/data/vl-SS.i18n.json index d48099de1..12e76c28d 100644 --- a/imports/i18n/data/vl-SS.i18n.json +++ b/imports/i18n/data/vl-SS.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/vo.i18n.json b/imports/i18n/data/vo.i18n.json index d48099de1..12e76c28d 100644 --- a/imports/i18n/data/vo.i18n.json +++ b/imports/i18n/data/vo.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/wa-RR.i18n.json b/imports/i18n/data/wa-RR.i18n.json index d48099de1..12e76c28d 100644 --- a/imports/i18n/data/wa-RR.i18n.json +++ b/imports/i18n/data/wa-RR.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/wa.i18n.json b/imports/i18n/data/wa.i18n.json index d48099de1..12e76c28d 100644 --- a/imports/i18n/data/wa.i18n.json +++ b/imports/i18n/data/wa.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/wo.i18n.json b/imports/i18n/data/wo.i18n.json index d48099de1..12e76c28d 100644 --- a/imports/i18n/data/wo.i18n.json +++ b/imports/i18n/data/wo.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/wuu-Hans.i18n.json b/imports/i18n/data/wuu-Hans.i18n.json index d48099de1..12e76c28d 100644 --- a/imports/i18n/data/wuu-Hans.i18n.json +++ b/imports/i18n/data/wuu-Hans.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/xh.i18n.json b/imports/i18n/data/xh.i18n.json index d48099de1..12e76c28d 100644 --- a/imports/i18n/data/xh.i18n.json +++ b/imports/i18n/data/xh.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/yi.i18n.json b/imports/i18n/data/yi.i18n.json index d48099de1..12e76c28d 100644 --- a/imports/i18n/data/yi.i18n.json +++ b/imports/i18n/data/yi.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/yo.i18n.json b/imports/i18n/data/yo.i18n.json index d48099de1..12e76c28d 100644 --- a/imports/i18n/data/yo.i18n.json +++ b/imports/i18n/data/yo.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/yue_CN.i18n.json b/imports/i18n/data/yue_CN.i18n.json index d48099de1..12e76c28d 100644 --- a/imports/i18n/data/yue_CN.i18n.json +++ b/imports/i18n/data/yue_CN.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/zgh.i18n.json b/imports/i18n/data/zgh.i18n.json index d48099de1..12e76c28d 100644 --- a/imports/i18n/data/zgh.i18n.json +++ b/imports/i18n/data/zgh.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/zh-CN.i18n.json b/imports/i18n/data/zh-CN.i18n.json index 9bad35ebf..8a31c57fa 100644 --- a/imports/i18n/data/zh-CN.i18n.json +++ b/imports/i18n/data/zh-CN.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "评论已删除", "activity-receivedDate": "已将接收日期从 %s 修改为 %s", "activity-startDate": "已将开始日期从 %s 修改为 %s", - "allboards.starred": "Starred", - "allboards.templates": "模板", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "已将到期日期从 %s 修改为 %s", "activity-endDate": "已将结束日期从 %s 修改为 %s", "add-attachment": "添加附件", @@ -328,16 +316,10 @@ "comment-placeholder": "添加评论", "comment-only": "仅能评论", "comment-only-desc": "仅能在卡片上评论。", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "确定要删除评论?", "deleteCommentPopup-title": "删除评论?", "no-comments": "暂无评论", "no-comments-desc": "无法查看评论和活动。", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "人员", "worker-desc": "只能移动卡片,分配给卡片和评论", "computer": "从本机上传", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "确定要删除清单吗?", "subtaskDeletePopup-title": "删除子任务?", "checklistDeletePopup-title": "删除待办清单?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "复制卡片链接到剪贴板", "copy-text-to-clipboard": "复制文本到剪贴板", "linkCardPopup-title": "链接卡片", @@ -356,7 +337,6 @@ "copyManyCardsPopup-format": "[ {\"title\": \"第一个卡片的标题\", \"description\":\"第一个卡片的描述\"}, {\"title\":\"第二个卡片的标题\",\"description\":\"第二个卡片的描述\"},{\"title\":\"最后一个卡片的标题\",\"description\":\"最后一个卡片的描述\"} ]", "create": "创建", "createBoardPopup-title": "创建看板", - "createTemplateContainerPopup-title": "新增模板容器", "chooseBoardSourcePopup-title": "导入看板", "createLabelPopup-title": "创建标签", "createCustomField": "创建字段", @@ -377,9 +357,9 @@ "custom-fields": "自定义字段", "date": "日期", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "拒绝", "default-avatar": "默认头像", "delete": "删除", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "编辑通知", "editProfilePopup-title": "编辑资料", "email": "邮箱", - "email-address": "Email Address", "email-enrollAccount-subject": "已为您在 __siteName__ 创建帐号", "email-enrollAccount-text": "尊敬的 __user__,\n\n点击下面的链接,即刻开始使用这项服务。\n\n__url__\n\n谢谢。", "email-fail": "邮件发送失败", @@ -554,7 +533,6 @@ "log-in": "登录", "loginPopup-title": "登录", "memberMenuPopup-title": "成员设置", - "grey-icons": "Grey Icons", "members": "成员", "menu": "菜单", "move-selection": "移动选择", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "移动至底端", "moveCardToTop-title": "移动至顶端", "moveSelectionPopup-title": "移动选择", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "多选", "multi-selection-label": "设置标签", "multi-selection-member": "选择成员", @@ -578,8 +554,6 @@ "no-results": "无结果", "normal": "普通", "normal-desc": "可以创建以及编辑卡片,无法更改设置。", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "邀请尚未接受", "notify-participate": "接收任何卡的更新作为创建者或成员", "notify-watch": "接收所有关注的面板、列表、及卡片的更新", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "修改接收日期", "editCardEndDatePopup-title": "修改结束日期", "setCardColorPopup-title": "设置颜色", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "选择一种颜色", "setSwimlaneColorPopup-title": "选择一种颜色", "setListColorPopup-title": "选择一种颜色", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "所有列表、卡片、标签和活动都回被删除,将无法恢复看板内容。不支持撤销。", "boardDeletePopup-title": "删除看板?", "delete-board": "删除看板", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "__board__ 看板的子任务", "default": "默认", "defaultdefault": "默认", @@ -790,7 +761,7 @@ "subtask-settings": "子任务设置", "card-settings": "卡片设置", "minicard-settings": "小卡片设置", - "boardSubtaskSettingsPopup-title": "子任务设置", + "boardSubtaskSettingsPopup-title": "看板子任务设置", "boardCardSettingsPopup-title": "卡片设置", "boardMinicardSettingsPopup-title": "小卡片设置", "deposit-subtasks-board": "将子任务放入以下看板:", @@ -961,8 +932,6 @@ "a-endAt": "修改结束时间", "a-startAt": "修改开始时间", "a-receivedAt": "修改接收时间", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "当前到期时间%s即将到来", "pastdue": "当前到期时间%s已过", "duenow": "当前到期时间%s为今天", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "我", "dueCardsViewChange-choice-all": "所有用户", "dueCardsViewChange-choice-all-description": "根据截至日期显示用户有权限访问的看板中未完成的卡片。", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "损坏的卡片", "board-title-not-found": "无法找到看板 '%s'", "swimlane-title-not-found": "找不到泳道 %s", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "隐藏所有待办清单项目", "support": "支持", "supportPopup-title": "支持", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "已启用无障碍页面", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "完成", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "状态", - "migration-progress-details": "详情", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "已完成", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "权重", "idle": "空闲", "complete": "完成", - "cron": "定时任务", - "current-step": "Current Step" + "cron": "定时任务" } diff --git a/imports/i18n/data/zh-GB.i18n.json b/imports/i18n/data/zh-GB.i18n.json index 547496a0d..10f4656c3 100644 --- a/imports/i18n/data/zh-GB.i18n.json +++ b/imports/i18n/data/zh-GB.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/zh-HK.i18n.json b/imports/i18n/data/zh-HK.i18n.json index eccefe184..0154e4c58 100644 --- a/imports/i18n/data/zh-HK.i18n.json +++ b/imports/i18n/data/zh-HK.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "登入", "loginPopup-title": "登入", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/zh-Hans.i18n.json b/imports/i18n/data/zh-Hans.i18n.json index 57cac392d..bceb830ca 100644 --- a/imports/i18n/data/zh-Hans.i18n.json +++ b/imports/i18n/data/zh-Hans.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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": "创建看板", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "导入看板", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "删除", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/zh-Hant.i18n.json b/imports/i18n/data/zh-Hant.i18n.json index 26bbefb8d..12e76c28d 100644 --- a/imports/i18n/data/zh-Hant.i18n.json +++ b/imports/i18n/data/zh-Hant.i18n.json @@ -1,6 +1,6 @@ { - "accept": "接受", - "act-activity-notify": "動態通知", + "accept": "Accept", + "act-activity-notify": "Activity Notification", "act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", "act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", "act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", @@ -48,7 +48,7 @@ "activity-added": "added %s to %s", "activity-archived": "%s moved to Archive", "activity-attached": "attached %s to %s", - "activity-created": "已建立", + "activity-created": "created %s", "activity-changedListTitle": "renamed list to %s", "activity-customfield-created": "created custom field %s", "activity-excluded": "excluded %s from %s", @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/zh-TW.i18n.json b/imports/i18n/data/zh-TW.i18n.json index 0554148af..dcc93884d 100644 --- a/imports/i18n/data/zh-TW.i18n.json +++ b/imports/i18n/data/zh-TW.i18n.json @@ -61,35 +61,23 @@ "activity-sent": "已寄送 %s 到 %s", "activity-unjoined": "已解除關聯 %s", "activity-subtask-added": "已新增子任務到 %s", - "activity-checked-item": "勾選 %s 於清單 %s 共 %s", - "activity-unchecked-item": "取消勾選 %s 於清單 %s 共 %s", + "activity-checked-item": "勾選%s於清單%s 共 %s", + "activity-unchecked-item": "未勾選 %s 於清單 %s 共 %s", "activity-checklist-added": "已新增待辦清單 %s", "activity-checklist-removed": "已刪除%s的待辦清單", "activity-checklist-completed": "已完成待辦清單 %s 共 %s 項", "activity-checklist-uncompleted": "未完成待辦清單 %s 共 %s 項", "activity-checklist-item-added": "新增待辦清單項目從 %s 到 %s", - "activity-checklist-item-removed": "已從「%s」在 %s 中移除檢查清單項目", + "activity-checklist-item-removed": "已從 '%s' 於 %s中 移除一個清單項", "add": "新增", "activity-checked-item-card": "勾選 %s 與清單 %s 中", "activity-unchecked-item-card": "取消勾選 %s 於清單 %s中", "activity-checklist-completed-card": "完成檢查清單__checklist__ 卡片 __card__ 清單 __list__ 泳道 __swimlane__ 看板 __board__", - "activity-checklist-uncompleted-card": "未完成檢查清單 %s", + "activity-checklist-uncompleted-card": "未完成清單 %s", "activity-editComment": "評論已編輯", "activity-deleteComment": "評論已刪除", "activity-receivedDate": "已編輯收到日期為 %s %s", "activity-startDate": "已編輯起始日期為 %s %s", - "allboards.starred": "已加星號", - "allboards.templates": "範本", - "allboards.remaining": "剩餘", - "allboards.workspaces": "工作空間", - "allboards.add-workspace": "新增工作空間", - "allboards.add-workspace-prompt": "工作空間名稱", - "allboards.add-subworkspace": "新增子工作空間", - "allboards.add-subworkspace-prompt": "子工作空間名稱", - "allboards.edit-workspace": "編輯工作空間", - "allboards.edit-workspace-name": "工作空間名稱", - "allboards.edit-workspace-icon": "工作空間圖示 (markdown)", - "multi-selection-active": "點選核取方塊以選取看板", "activity-dueDate": "已編輯截止日期為 %s %s", "activity-endDate": "已編輯結束日期為 %s %s", "add-attachment": "新增附件", @@ -115,7 +103,7 @@ "close-add-checklist-item": "關閉向檢查清單表單新增項目", "close-edit-checklist-item": "關閉編輯檢查清單表單的項目", "convertChecklistItemToCardPopup-title": "轉換為卡片", - "add-cover": "新增封面圖片至迷你卡片", + "add-cover": "新增封面圖片至小卡片", "add-label": "新增標籤", "add-list": "新增清單", "add-after-list": "在清單後新增", @@ -199,7 +187,7 @@ "enter-zoom-level": "輸入縮放層級 (50-300%):", "board-view-cal": "日曆", "board-view-swimlanes": "泳道", - "board-view-collapse": "折疊", + "board-view-collapse": "損毀", "board-view-gantt": "甘特圖", "board-view-lists": "清單", "bucket-example": "例如「人生清單」", @@ -211,8 +199,8 @@ "card-comments-title": "該卡片有 %s 條評論", "card-delete-notice": "永久刪除是無法復原的,你將會失去這張卡片的所有相關操作記錄。", "card-delete-pop": "所有的活動將從活動摘要中被移除且您將無法重新打開該卡片。此操作無法撤銷。", - "card-delete-suggest-archive": "您可以移動卡片到活動以便從看板中刪除並保留活動。", - "card-archive-pop": "封存卡片後,將不會在此清單看到卡片。", + "card-delete-suggest-archive": "您可以移動卡片到活動以便從看板中刪除並保持活動。", + "card-archive-pop": "封存卡片後,在此清單將不會看的到卡片。", "card-archive-suggest-cancel": "你可以稍後從封存中還原卡片。", "card-due": "到期日", "card-due-on": "期限", @@ -260,7 +248,7 @@ "poker-replay": "重播", "set-estimation": "設定預估時間", "deletePokerPopup-title": "刪除規劃撲克?", - "poker-delete-pop": "刪除操作不可逆。您會失去所有與此規劃撲克相關的所有操作紀錄。", + "poker-delete-pop": "刪除是永遠的,你會失去所有與此規劃撲克相關動作關聯", "cardDeletePopup-title": "刪除卡片?", "cardArchivePopup-title": "封存卡片嗎?", "cardDetailsActionsPopup-title": "卡片操作", @@ -279,9 +267,9 @@ "change-avatar": "更換大頭照", "change-password": "變更密碼", "change-permissions": "變更權限", - "change-settings": "變更設定", - "changeAvatarPopup-title": "變更大頭照", - "changeLanguagePopup-title": "變更語言", + "change-settings": "更改設定", + "changeAvatarPopup-title": "更換大頭照", + "changeLanguagePopup-title": "更改語系", "changePasswordPopup-title": "變更密碼", "changePermissionsPopup-title": "變更權限", "changeSettingsPopup-title": "更改設定", @@ -322,30 +310,23 @@ "color-slateblue": "青藍", "color-white": "白色", "color-yellow": "黃色", - "unset-color": "取消設定", + "unset-color": "未設定", "comments": "評論", "comment": "評論", - "comment-placeholder": "撰寫評論", + "comment-placeholder": "撰寫文字", "comment-only": "僅能評論", "comment-only-desc": "只能在卡片上發表評論。", - "comment-assigned-only": "僅能評論(限指定卡片)", - "comment-assigned-only-desc": "僅顯示已指派的卡片。僅能評論。", "comment-delete": "確定要刪除此評論?", "deleteCommentPopup-title": "刪除評論", - "no-comments": "無法評論", + "no-comments": "暫無評論", "no-comments-desc": "無法檢視評論與活動。", - "read-only": "唯讀", - "read-only-desc": "僅能檢視卡片。無法編輯。", - "read-assigned-only": "唯讀(限指定卡片)", - "read-assigned-only-desc": "僅顯示已指派的卡片。無法編輯。", - "worker": "員工", + "worker": "工作者", "worker-desc": "只能移動卡片,分配給自己及發表評論。", "computer": "從本機上傳", "confirm-subtask-delete-popup": "確定要刪除子任務嗎?", "confirm-checklist-delete-popup": "確定要刪除檢查清單嗎?", "subtaskDeletePopup-title": "刪除子任務?", "checklistDeletePopup-title": "刪除檢查清單", - "checklistItemDeletePopup-title": "刪除檢查清單項目?", "copy-card-link-to-clipboard": "將卡片連結複製到剪貼簿", "copy-text-to-clipboard": "複製文字到剪貼簿", "linkCardPopup-title": "連結卡片", @@ -356,14 +337,13 @@ "copyManyCardsPopup-format": "[ {\"title\": \"第一個卡片標題\", \"description\":\"第一個卡片描述\"}, {\"title\":\"第二個卡片標題\",\"description\":\"第二個卡片描述\"},{\"title\":\"最後一個卡片標題\",\"description\":\"最後一個卡片描述\"} ]", "create": "建立", "createBoardPopup-title": "建立看板", - "createTemplateContainerPopup-title": "新增範本容器", "chooseBoardSourcePopup-title": "匯入看板", "createLabelPopup-title": "新增標籤", "createCustomField": "建立欄位", "createCustomFieldPopup-title": "建立欄位", "current": "目前", - "custom-field-delete-pop": "此操作將會從所有卡片中移除自訂欄位以及銷毀歷史紀錄,並且無法撤銷。", - "custom-field-checkbox": "核取方塊", + "custom-field-delete-pop": "此操作將會從所有卡片中移除自訂欄位以及銷毀歷史紀錄,並且無法撤消。", + "custom-field-checkbox": "複選框", "custom-field-currency": "貨幣", "custom-field-currency-option": "貨幣代碼", "custom-field-date": "日期", @@ -377,9 +357,9 @@ "custom-fields": "自訂欄位", "date": "日期", "date-format": "日期格式", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "拒絕", "default-avatar": "預設大頭照", "delete": "刪除", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "更改通知", "editProfilePopup-title": "編輯個人資料", "email": "電子郵件", - "email-address": "電子郵件地址", "email-enrollAccount-subject": "您在 __siteName__ 的帳號已經建立", "email-enrollAccount-text": "親愛的 __user__,\n\n點選下面的連結,即刻開始使用這項服務。\n\n__url__\n\n謝謝。", "email-fail": "郵件寄送失敗", @@ -473,8 +452,8 @@ "filter-no-label": "沒有標籤", "filter-member-label": "按成員篩選", "filter-no-member": "沒有成員", - "filter-assignee-label": "按承辦人篩選", - "filter-no-assignee": "沒有承辦人", + "filter-assignee-label": "按代理人篩選", + "filter-no-assignee": "沒有代理人", "filter-custom-fields-label": "按自訂欄位篩選", "filter-no-custom-fields": "沒有自訂欄位", "filter-show-archive": "顯示封存的清單", @@ -554,7 +533,6 @@ "log-in": "登入", "loginPopup-title": "登入", "memberMenuPopup-title": "成員更改", - "grey-icons": "灰色圖示", "members": "成員", "menu": "選單", "move-selection": "移動選取的項目", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "移至最下面", "moveCardToTop-title": "移至最上面", "moveSelectionPopup-title": "移動選取的項目", - "copySelectionPopup-title": "複製選取的項目", - "selection-color": "選取項目顏色", "multi-selection": "多選", "multi-selection-label": "設定標籤到選擇項目", "multi-selection-member": "設定成員到選擇項目", @@ -578,8 +554,6 @@ "no-results": "無結果", "normal": "普通", "normal-desc": "可以建立以及編輯卡片,無法更改。", - "normal-assigned-only": "僅限指定人員普通", - "normal-assigned-only-desc": "僅顯示已指派的卡片。以普通使用者身份編輯", "not-accepted-yet": "邀請尚未接受", "notify-participate": "接收您作為建立者或成員的任何卡片的更新", "notify-watch": "接收您關注的看板、清單或卡片的更新", @@ -627,16 +601,16 @@ "shortcut-autocomplete-members": "自動補齊成員", "shortcut-clear-filters": "清空全部過濾條件", "shortcut-close-dialog": "關閉對話方塊", - "shortcut-filter-my-cards": "篩選我的卡片", - "shortcut-filter-my-assigned-cards": "篩選分配給我的卡片", + "shortcut-filter-my-cards": "過濾我的卡片", + "shortcut-filter-my-assigned-cards": "過濾分配給我的卡片", "shortcut-show-shortcuts": "顯示此快速鍵清單", - "shortcut-toggle-filterbar": "切換篩選條件側邊欄", + "shortcut-toggle-filterbar": "切換過濾程式邊欄", "shortcut-toggle-searchbar": "切換搜索欄", - "shortcut-toggle-sidebar": "切換看板側邊欄", + "shortcut-toggle-sidebar": "切換面板邊欄", "show-cards-minimum-count": "顯示卡片數量,當清單包含多於……", "sidebar-open": "開啟側邊欄", "sidebar-close": "關閉側邊欄", - "signupPopup-title": "建立帳號", + "signupPopup-title": "建立帳戶", "star-board-title": "點擊這裡可將看板加入我的最愛,它將會出現在您的看板列表上方。", "starred-boards": "我的最愛看板", "starred-boards-description": "加入我的最愛的看板將會出現在您的看板列表上方。", @@ -651,7 +625,7 @@ "has-spenttime-cards": "耗時卡", "time": "時間", "title": "標題", - "toggle-assignees": "切換卡片的承辦人 1-9(按加入看板的順序)。", + "toggle-assignees": "切換卡片的代理人 1-9(按加入看板的順序)。", "toggle-labels": "切換卡片的標籤 1-9。多重選擇新增標籤 1-9", "remove-labels-multiselect": "多重選擇移除標籤 1-9", "tracking": "訂閱相關通知", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "更改接收日期", "editCardEndDatePopup-title": "更改完成日期", "setCardColorPopup-title": "設定顏色", - "setSelectionColorPopup-title": "設定選取項目顏色", "setCardActionsColorPopup-title": "選擇顏色", "setSwimlaneColorPopup-title": "選擇顏色", "setListColorPopup-title": "選擇顏色", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "所有清單、卡片、標籤和活動都會被刪除,將無法恢覆看板內容。不支援撤銷。", "boardDeletePopup-title": "刪除看板?", "delete-board": "刪除看板", - "delete-duplicate-lists": "刪除重複的清單", - "delete-duplicate-lists-confirm": "您確定嗎?這將會刪除所有相同名稱但不包含卡片的重複清單。", "default-subtasks-board": "__board__ 看板的子任務", "default": "預設值", "defaultdefault": "預設值", @@ -790,7 +761,7 @@ "subtask-settings": "子任務設定", "card-settings": "卡片設定", "minicard-settings": "小卡片設定", - "boardSubtaskSettingsPopup-title": "子任務設定", + "boardSubtaskSettingsPopup-title": "看板子任務設定", "boardCardSettingsPopup-title": "卡片設定", "boardMinicardSettingsPopup-title": "小卡片設定", "deposit-subtasks-board": "將子任務放入以下看板:", @@ -860,7 +831,7 @@ "r-bottom-of": "的尾部", "r-its-list": "其清單", "r-archive": "封存", - "r-unarchive": "從封存中還原", + "r-unarchive": "從封存中恢復", "r-card": "卡片", "r-add": "新增", "r-remove": "移除", @@ -961,8 +932,6 @@ "a-endAt": "修改結束時間", "a-startAt": "修改開始時間", "a-receivedAt": "修改接收時間", - "above-selected-card": "選取的卡片之上", - "below-selected-card": "選取的卡片之下", "almostdue": "當前到期時間%s即將到來", "pastdue": "當前到期時間%s已過", "duenow": "當前到期時間%s為今天", @@ -978,8 +947,8 @@ "accounts-allowUserDelete": "允許用戶自行刪除其帳戶", "hide-minicard-label-text": "隱藏迷你卡片標籤內文", "show-desktop-drag-handles": "顯示桌面拖曳工具", - "assignee": "承辦人", - "cardAssigneesPopup-title": "承辦人", + "assignee": "代理人", + "cardAssigneesPopup-title": "代理人", "addmore-detail": "新增更多詳細描述", "show-on-card": "在卡片上顯示", "show-on-minicard": "在小卡片顯示", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "我", "dueCardsViewChange-choice-all": "全部使用者", "dueCardsViewChange-choice-all-description": "顯示看板內所有已設定到期日,且使用者有權限的未完成卡片", - "dueCards-noResults-title": "找不到到期卡片", - "dueCards-noResults-description": "您目前沒有任何有到期日的卡片。", "broken-cards": "損毀卡片", "board-title-not-found": "看板%s不存在", "swimlane-title-not-found": "泳道流程圖%s不存在", @@ -1075,7 +1042,7 @@ "operator-user-abbrev": "@", "operator-member": "成員", "operator-member-abbrev": "m", - "operator-assignee": "承辦人", + "operator-assignee": "代理人", "operator-assignee-abbrev": "a", "operator-creator": "建立者", "operator-status": "狀態", @@ -1106,7 +1073,7 @@ "predicate-checklist": "待辦清單", "predicate-start": "開始", "predicate-end": "完成", - "predicate-assignee": "承辦人", + "predicate-assignee": "代理人", "predicate-member": "成員", "predicate-public": "公開", "predicate-private": "私有", @@ -1131,10 +1098,10 @@ "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - 卡片評論包含 *<text>*.", "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - 卡片標籤要符合 *<color>* 或 *<name>", "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - 的簡寫 `__operator_label__:<color>` 或 `__operator_label__:<name>`", - "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - 卡片,其中 *<username>* 是 *成員* 或 *承辦人*", + "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - 卡片,其中 *<username>* 是 *成員* 或 *代理人*", "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - `user:<username>` 的簡寫", "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - 卡片,其中 *<username>* 是i *成員*", - "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - 卡片,其中 *<username>* 是 *承辦人*", + "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - 卡片,其中 *<username>* 是 *代理人*", "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - 卡片,其中 *<username>* 是卡片的建立者", "globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - 屬於分配給組織 *<name>* 看板的卡片", "globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - 屬於分配給團隊 *<name>* 看板的卡片", @@ -1206,9 +1173,9 @@ "subject": "主旨", "details": "內容", "carbon-copy": "副本 (Cc:)", - "ticket": "工單", - "tickets": "工單", - "ticket-number": "工單號碼", + "ticket": "工票", + "tickets": "工票", + "ticket-number": "工票號碼", "open": "開啟", "pending": "已延遲", "closed": "已關閉", @@ -1312,17 +1279,12 @@ "show-week-of-year": "顯示年度週數 (ISO 8601)", "convert-to-markdown": "轉換為 Markdown", "import-board-zip": "新增包含看板 JSON 檔案與帶有附件的看板名稱子目錄的 .zip 檔案", - "collapse": "折疊", + "collapse": "損毀", "uncollapse": "展開", "hideCheckedChecklistItems": "隱藏已勾選的待辦清單項目", "hideAllChecklistItems": "隱藏所有待辦清單項目", "support": "支援", "supportPopup-title": "支援", - "support-page-enabled": "已啟用支援頁面", - "support-info-not-added-yet": "尚未新增支援資訊", - "support-info-only-for-logged-in-users": "支援資訊僅限已登入的使用者使用。", - "support-title": "支援標題", - "support-content": "支援內容", "accessibility": "無障礙", "accessibility-page-enabled": "已啟用無障礙頁面", "accessibility-info-not-added-yet": "尚未新增無障礙資訊", @@ -1437,73 +1399,7 @@ "back-to-settings": "回到設定", "board-id": "看板 ID", "board-migration": "看板遷移", - "board-migrations": "看板遷移", "card-show-lists-on-minicard": "在迷你卡片上顯示清單", - "comprehensive-board-migration": "全面看板遷移", - "comprehensive-board-migration-description": "執行全面檢查與修復,確保看板資料完整性,包括清單排序、卡片位置及泳道結構。", - "delete-duplicate-empty-lists-migration": "刪除重複的空清單", - "delete-duplicate-empty-lists-migration-description": "安全地刪除空的重複清單。僅移除既無卡片、又存在標題相同且含卡片的另一份清單的清單。", - "lost-cards": "遺失的卡片", - "lost-cards-list": "已還原的項目", - "restore-lost-cards-migration": "還原遺失的卡片", - "restore-lost-cards-migration-description": "尋找並還原缺少泳道 ID 或清單 ID 的卡片與清單。建立「遺失的卡片」泳道,使所有遺失項目重新可見。", - "restore-all-archived-migration": "還原所有封存", - "restore-all-archived-migration-description": "還原所有已封存的泳道、清單與卡片。自動修復任何缺少泳道 ID 或清單 ID 的項目以使它們重新可見。", - "fix-missing-lists-migration": "修復遺失的清單", - "fix-missing-lists-migration-description": "偵測並修復在看板結構中遺失或損毀的清單。", - "fix-avatar-urls-migration": "修復大頭照 URL", - "fix-avatar-urls-migration-description": "更新看板成員的大頭照 URL 以使用正確的儲存空間後端並修復損壞的大頭照參照。", - "fix-all-file-urls-migration": "修復所有檔案 URL", - "fix-all-file-urls-migration-description": "更新所有此看板的檔案附件 URL 以使用正確的儲存空間後端並修復損壞的檔案參照。", - "migration-needed": "需要遷移", - "migration-complete": "完成", - "migration-running": "正在執行……", - "migration-successful": "遷移成功完成", - "migration-failed": "遷移失敗", - "migrations": "遷移", - "migrations-admin-only": "僅看板管理員可執行遷移", - "migrations-description": "為此看板執行資料完整性檢查並修復。每個遷移皆可單獨執行。", - "no-issues-found": "未找到問題", - "run-migration": "執行遷移", - "run-comprehensive-migration-confirm": "這將會執行全面的遷移以檢查並修復看板資料完整性。這可能需要數分鐘。要繼續嗎?", - "run-delete-duplicate-empty-lists-migration-confirm": "此操作將先將所有共享清單轉換為每個泳道專屬的清單,接著刪除那些存在標題相同且含卡片之重複清單的空清單。僅會移除真正冗餘的空清單。要繼續嗎?", - "run-restore-lost-cards-migration-confirm": "這將建立一個「遺失的卡片」泳道,並還原所有缺少泳道 ID 或清單 ID 的卡片與清單。此操作僅影響未封存項目。繼續?", - "run-restore-all-archived-migration-confirm": "此操作將還原所有已封存的泳道、清單及卡片,使其重新顯示。任何缺少 ID 的項目將自動修復。此操作無法輕易撤銷。要繼續嗎?", - "run-fix-missing-lists-migration-confirm": "這將會偵測並修復在看板結構中遺失或損毀的清單。要繼續嗎?", - "run-fix-avatar-urls-migration-confirm": "這將會更新看板成員的大頭照 URL 以使用正確的儲存空間後端。要繼續嗎?", - "run-fix-all-file-urls-migration-confirm": "這將會更新此看板上的所有檔案附件 URL 以使用正確的儲存空間後端。要繼續嗎?", - "restore-lost-cards-nothing-to-restore": "沒有需要還原的遺失泳道、清單或卡片", - - "migration-progress-title": "正在進行看板遷移", - "migration-progress-overall": "整體進度", - "migration-progress-current-step": "目前步驟", - "migration-progress-status": "狀態", - "migration-progress-details": "內容", - "migration-progress-note": "請稍候,我們正在將您的看板遷移至最新結構……", - "steps": "步進", - "view": "檢視", - "has-swimlanes": "有泳道", - - "step-analyze-board-structure": "分析看板結構", - "step-fix-orphaned-cards": "修復孤立卡片", - "step-convert-shared-lists": "轉換共享清單", - "step-ensure-per-swimlane-lists": "確保每個泳道專屬的清單", - "step-validate-migration": "驗證遷移", - "step-fix-avatar-urls": "修復大頭照 URL", - "step-fix-attachment-urls": "修復附件 URL", - "step-analyze-lists": "分析清單", - "step-create-missing-lists": "建立遺失的清單", - "step-update-cards": "更新卡片", - "step-finalize": "完成", - "step-delete-duplicate-empty-lists": "刪除重複的空清單", - "step-ensure-lost-cards-swimlane": "確保遺失的卡片泳道", - "step-restore-lists": "還原清單", - "step-restore-cards": "還原卡片", - "step-restore-swimlanes": "還原泳道", - "step-fix-missing-ids": "修復遺失的 ID", - "step-scan-users": "正在檢查看板成員大頭照", - "step-scan-files": "正在檢查看板檔案附件", - "step-fix-file-urls": "正在修復檔案 URL", "cleanup": "清理", "cleanup-old-jobs": "清理舊工作", "completed": "已完成", @@ -1570,7 +1466,6 @@ "operation-type": "操作類型", "overall-progress": "整體進度", "page": "頁面", - "pause": "暫停", "pause-migration": "暫停遷移", "previous": "前一個", "refresh": "重新整理", @@ -1585,7 +1480,6 @@ "schedule": "排程", "search-boards-or-operations": "搜尋看板或操作……", "show-list-on-minicard": "在迷你卡片顯示清單", - "showChecklistAtMinicard": "在迷你卡片上顯示檢查清單", "showing": "顯示", "start-test-operation": "開始測試操作", "start-time": "開始時間", @@ -1600,6 +1494,5 @@ "weight": "權重", "idle": "閒置", "complete": "完成", - "cron": "Cron", - "current-step": "目前步驟" + "cron": "Cron" } diff --git a/imports/i18n/data/zh.i18n.json b/imports/i18n/data/zh.i18n.json index eac0d580a..9f44ebe32 100644 --- a/imports/i18n/data/zh.i18n.json +++ b/imports/i18n/data/zh.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/zh_SG.i18n.json b/imports/i18n/data/zh_SG.i18n.json deleted file mode 100644 index d48099de1..000000000 --- a/imports/i18n/data/zh_SG.i18n.json +++ /dev/null @@ -1,1605 +0,0 @@ -{ - "accept": "Accept", - "act-activity-notify": "Activity Notification", - "act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-addLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-addedLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-removeLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-removedLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-addChecklist": "added checklist __checklist__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-addChecklistItem": "added checklist item __checklistItem__ to checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-removeChecklist": "removed checklist __checklist__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-removeChecklistItem": "removed checklist item __checklistItem__ from checklist __checkList__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-uncheckedItem": "unchecked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-editComment": "edited comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-deleteComment": "deleted comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-createBoard": "created board __board__", - "act-createSwimlane": "created swimlane __swimlane__ to board __board__", - "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__", - "act-createCustomField": "created custom field __customField__ at board __board__", - "act-deleteCustomField": "deleted custom field __customField__ at board __board__", - "act-setCustomField": "edited custom field __customField__: __customFieldValue__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-createList": "added list __list__ to board __board__", - "act-addBoardMember": "added member __member__ to board __board__", - "act-archivedBoard": "Board __board__ moved to Archive", - "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive", - "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive", - "act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive", - "act-importBoard": "imported board __board__", - "act-importCard": "imported card __card__ to list __list__ at swimlane __swimlane__ at board __board__", - "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__", - "act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-moveCard": "moved card __card__ at board __board__ from list __oldList__ at swimlane __oldSwimlane__ to list __list__ at swimlane __swimlane__", - "act-moveCardToOtherBoard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__", - "act-removeBoardMember": "removed member __member__ from board __board__", - "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__", - "act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "act-withBoardTitle": "__board__", - "act-withCardTitle": "[__board__] __card__", - "actions": "Actions", - "activities": "Activities", - "activity": "Activity", - "activity-added": "added %s to %s", - "activity-archived": "%s moved to Archive", - "activity-attached": "attached %s to %s", - "activity-created": "created %s", - "activity-changedListTitle": "renamed list to %s", - "activity-customfield-created": "created custom field %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-subtask-added": "added subtask to %s", - "activity-checked-item": "checked %s in checklist %s of %s", - "activity-unchecked-item": "unchecked %s in checklist %s of %s", - "activity-checklist-added": "added checklist to %s", - "activity-checklist-removed": "removed a checklist from %s", - "activity-checklist-completed": "completed checklist %s of %s", - "activity-checklist-uncompleted": "uncompleted the checklist %s of %s", - "activity-checklist-item-added": "added checklist item to '%s' in %s", - "activity-checklist-item-removed": "removed a checklist item from '%s' in %s", - "add": "Add", - "activity-checked-item-card": "checked %s in checklist %s", - "activity-unchecked-item-card": "unchecked %s in checklist %s", - "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", - "activity-checklist-uncompleted-card": "uncompleted the checklist %s", - "activity-editComment": "edited comment %s", - "activity-deleteComment": "deleted comment %s", - "activity-receivedDate": "edited received date to %s of %s", - "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", - "activity-dueDate": "edited due date to %s of %s", - "activity-endDate": "edited end date to %s of %s", - "add-attachment": "Add Attachment", - "add-board": "Add Board", - "add-template": "Add Template", - "add-card": "Add Card", - "add-card-to-top-of-list": "Add Card to Top of List", - "add-card-to-bottom-of-list": "Add Card to Bottom of List", - "setListWidthPopup-title": "Set Widths", - "set-list-width": "Set Widths", - "set-list-width-value": "Set Min & Max Widths (pixels)", - "list-width-error-message": "List widths must be integers greater than 100", - "keyboard-shortcuts-enabled": "Keyboard shortcuts enabled. Click to disable.", - "keyboard-shortcuts-disabled": "Keyboard shortcuts disabled. Click to enable.", - "setSwimlaneHeightPopup-title": "Set Swimlane Height", - "set-swimlane-height": "Set Swimlane Height", - "set-swimlane-height-value": "Swimlane Height (pixels)", - "swimlane-height-error-message": "Swimlane height must be a positive integer", - "add-swimlane": "Add Swimlane", - "add-subtask": "Add Subtask", - "add-checklist": "Add Checklist", - "add-checklist-item": "Add an item to checklist", - "close-add-checklist-item": "Close add an item to checklist form", - "close-edit-checklist-item": "Close edit an item to checklist form", - "convertChecklistItemToCardPopup-title": "Convert to Card", - "add-cover": "Add cover image to minicard", - "add-label": "Add Label", - "add-list": "Add List", - "add-after-list": "Add After List", - "add-members": "Add Members", - "added": "Added", - "addMemberPopup-title": "Members", - "memberPopup-title": "Member Settings", - "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": "Loading, please wait. Refreshing the page will cause data loss. If loading does not work, please check that server has not stopped.", - "app-try-reconnect": "Try to reconnect.", - "archive": "Move to Archive", - "archive-all": "Move All to Archive", - "archive-board": "Move Board to Archive", - "archive-board-confirm": "Are you sure you want to archive this board?", - "archive-card": "Move Card to Archive", - "archive-list": "Move List to Archive", - "archive-swimlane": "Move Swimlane to Archive", - "archive-selection": "Move selection to Archive", - "archiveBoardPopup-title": "Move Board to Archive?", - "archived-items": "Archive", - "archived-boards": "Boards in Archive", - "restore-board": "Restore Board", - "no-archived-boards": "No Boards in Archive.", - "archives": "Archive", - "template": "Template", - "templates": "Templates", - "template-container": "Template Container", - "add-template-container": "Add Template Container", - "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 (__size__ max)", - "back": "Back", - "board-change-color": "Change color", - "board-change-background-image": "Change Background Image", - "board-background-image-url": "Background Image URL", - "add-background-image": "Add Background Image", - "remove-background-image": "Remove Background Image", - "show-at-all-boards-page" : "Show at All Boards page", - "board-info-on-my-boards" : "All Boards Settings", - "boardInfoOnMyBoardsPopup-title" : "All Boards Settings", - "boardInfoOnMyBoards-title": "All Boards Settings", - "show-card-counter-per-list": "Show card count per list", - "show-board_members-avatar": "Show Board members avatars", - "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>.", - "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", - "boardChangeColorPopup-title": "Change Board Background", - "boardChangeBackgroundImagePopup-title": "Change Background Image", - "allBoardsChangeColorPopup-title": "Change color", - "allBoardsChangeBackgroundImagePopup-title": "Change Background Image", - "boardChangeTitlePopup-title": "Rename Board", - "boardChangeVisibilityPopup-title": "Change Visibility", - "boardChangeWatchPopup-title": "Change Watch", - "boardMenuPopup-title": "Board Settings", - "allBoardsMenuPopup-title": "Settings", - "boardChangeViewPopup-title": "Board View", - "boards": "Boards", - "board-view": "Board View", - "desktop-mode": "Desktop Mode", - "mobile-mode": "Mobile Mode", - "mobile-desktop-toggle": "Toggle between Mobile and Desktop Mode", - "zoom-in": "Zoom In", - "zoom-out": "Zoom Out", - "click-to-change-zoom": "Click to change zoom level", - "zoom-level": "Zoom Level", - "enter-zoom-level": "Enter zoom level (50-300%):", - "board-view-cal": "Calendar", - "board-view-swimlanes": "Swimlanes", - "board-view-collapse": "Collapse", - "board-view-gantt": "Gantt", - "board-view-lists": "Lists", - "bucket-example": "Like \"Bucket List\" for example", - "calendar-previous-month-label": "Previous Month", - "calendar-next-month-label": "Next Month", - "cancel": "Cancel", - "card-archived": "This card is moved to Archive.", - "board-archived": "This board is moved to Archive.", - "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 to Archive to remove it from the board and preserve the activity.", - "card-archive-pop": "Card will not be visible at this list after archiving card.", - "card-archive-suggest-cancel": "You can later restore card from Archive.", - "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", - "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", - "cardCustomField-datePopup-title": "Change date", - "cardCustomFieldsPopup-title": "Edit custom fields", - "cardStartVotingPopup-title": "Start a vote", - "positiveVoteMembersPopup-title": "Proponents", - "negativeVoteMembersPopup-title": "Opponents", - "card-edit-voting": "Edit voting", - "editVoteEndDatePopup-title": "Change vote end date", - "allowNonBoardMembers": "Allow all logged in users", - "vote-question": "Voting question", - "vote-public": "Show who voted what", - "vote-for-it": "for it", - "vote-against": "against", - "deleteVotePopup-title": "Delete vote?", - "vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.", - "cardStartPlanningPokerPopup-title": "Start a Planning Poker", - "card-edit-planning-poker": "Edit Planning Poker", - "editPokerEndDatePopup-title": "Change Planning Poker vote end date", - "poker-question": "Planning Poker", - "poker-one": "1", - "poker-two": "2", - "poker-three": "3", - "poker-five": "5", - "poker-eight": "8", - "poker-thirteen": "13", - "poker-twenty": "20", - "poker-forty": "40", - "poker-oneHundred": "100", - "poker-unsure": "?", - "poker-finish": "Finish", - "poker-result-votes": "Votes", - "poker-result-who": "Who", - "poker-replay": "Replay", - "set-estimation": "Set Estimation", - "deletePokerPopup-title": "Delete planning poker?", - "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", - "cardDeletePopup-title": "Delete Card?", - "cardArchivePopup-title": "Archive Card?", - "cardDetailsActionsPopup-title": "Card Actions", - "cardLabelsPopup-title": "Labels", - "cardMembersPopup-title": "Members", - "cardMorePopup-title": "More", - "cardTemplatePopup-title": "Create template", - "cards": "Cards", - "cards-count": "Cards", - "cards-count-one": "Card", - "casSignIn": "Sign In with CAS", - "cardType-card": "Card", - "cardType-linkedCard": "Linked Card", - "cardType-linkedBoard": "Linked Board", - "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", - "subtasks": "Subtasks", - "checklists": "Checklists", - "click-to-star": "Click to star this board.", - "click-to-unstar": "Click to unstar this board.", - "click-to-enable-auto-width": "Auto list width disabled. Click to enable.", - "click-to-disable-auto-width": "Auto list width enabled. Click to disable.", - "auto-list-width": "Auto list width", - "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 “Archive” button from the home header.", - "close-card": "Close Card", - "color-black": "black", - "color-blue": "blue", - "color-crimson": "crimson", - "color-darkgreen": "darkgreen", - "color-gold": "gold", - "color-gray": "gray", - "color-green": "green", - "color-indigo": "indigo", - "color-lime": "lime", - "color-magenta": "magenta", - "color-mistyrose": "mistyrose", - "color-navy": "navy", - "color-orange": "orange", - "color-paleturquoise": "paleturquoise", - "color-peachpuff": "peachpuff", - "color-pink": "pink", - "color-plum": "plum", - "color-purple": "purple", - "color-red": "red", - "color-saddlebrown": "saddlebrown", - "color-silver": "silver", - "color-sky": "sky", - "color-slateblue": "slateblue", - "color-white": "white", - "color-yellow": "yellow", - "unset-color": "Unset", - "comments": "Comments", - "comment": "Comment", - "comment-placeholder": "Write Comment", - "comment-only": "Comment only", - "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", - "comment-delete": "Are you sure you want to delete the comment?", - "deleteCommentPopup-title": "Delete comment?", - "no-comments": "No comments", - "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", - "worker": "Worker", - "worker-desc": "Can only move cards, assign itself to card and comment.", - "computer": "Computer", - "confirm-subtask-delete-popup": "Are you sure you want to delete subtask?", - "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", - "subtaskDeletePopup-title": "Delete Subtask?", - "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", - "copy-card-link-to-clipboard": "Copy card link to clipboard", - "copy-text-to-clipboard": "Copy text to clipboard", - "linkCardPopup-title": "Link Card", - "searchElementPopup-title": "Search", - "copyCardPopup-title": "Copy Card", - "copyManyCardsPopup-title": "Copy Template to Many Cards", - "copyManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format", - "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", - "chooseBoardSourcePopup-title": "Import board", - "createLabelPopup-title": "Create Label", - "createCustomField": "Create Field", - "createCustomFieldPopup-title": "Create Field", - "current": "current", - "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.", - "custom-field-checkbox": "Checkbox", - "custom-field-currency": "Currency", - "custom-field-currency-option": "Currency Code", - "custom-field-date": "Date", - "custom-field-dropdown": "Dropdown List", - "custom-field-dropdown-none": "(none)", - "custom-field-dropdown-options": "List Options", - "custom-field-dropdown-options-placeholder": "Press enter to add more options", - "custom-field-dropdown-unknown": "(unknown)", - "custom-field-number": "Number", - "custom-field-text": "Text", - "custom-fields": "Custom Fields", - "date": "Date", - "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", - "decline": "Decline", - "default-avatar": "Default avatar", - "delete": "Delete", - "deleteCustomFieldPopup-title": "Delete Custom Field?", - "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", - "editCustomFieldPopup-title": "Edit Field", - "addReactionPopup-title": "Add reaction", - "editCardSpentTimePopup-title": "Change spent time", - "editLabelPopup-title": "Change Label", - "editNotificationPopup-title": "Edit Notification", - "editProfilePopup-title": "Edit Profile", - "email": "Email", - "email-address": "Email Address", - "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-vertical-scrollbars": "Enable vertical scrollbars", - "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-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) 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-orgname-taken": "This organization name is already taken", - "error-teamname-taken": "This team name is already taken", - "error-email-taken": "Email has already been taken", - "export-board": "Export board", - "export-board-json": "Export board to JSON", - "export-board-csv": "Export board to CSV", - "export-board-tsv": "Export board to TSV", - "export-board-excel": "Export board to Excel", - "user-can-not-export-excel": "User can not export Excel", - "export-board-html": "Export board to HTML", - "export-card": "Export card", - "export-card-pdf": "Export card to PDF", - "user-can-not-export-card-to-pdf": "User can not export card to PDF", - "exportBoardPopup-title": "Export board", - "exportCardPopup-title": "Export card", - "sort": "Sort", - "sorted": "Sorted", - "remove-sort": "Remove sort", - "sort-desc": "Click to Sort List", - "list-sort-by": "Sort the List By:", - "list-label-modifiedAt": "Last Access Time", - "list-label-title": "Name of the List", - "list-label-sort": "Your Manual Order", - "list-label-short-modifiedAt": "(L)", - "list-label-short-title": "(N)", - "list-label-short-sort": "(M)", - "filter": "Filter", - "filter-cards": "Filter Cards or Lists", - "filter-dates-label": "Filter by date", - "filter-no-due-date": "No due date", - "filter-overdue": "Overdue", - "filter-due-today": "Due today", - "filter-due-this-week": "Due this week", - "filter-due-next-week": "Due next week", - "filter-due-tomorrow": "Due tomorrow", - "list-filter-label": "Filter List by Title", - "filter-clear": "Clear filter", - "filter-labels-label": "Filter by label", - "filter-no-label": "No label", - "filter-member-label": "Filter by member", - "filter-no-member": "No member", - "filter-assignee-label": "Filter by assignee", - "filter-no-assignee": "No assignee", - "filter-custom-fields-label": "Filter by Custom Fields", - "filter-no-custom-fields": "No Custom Fields", - "filter-show-archive": "Show archived lists", - "filter-hide-empty": "Hide empty lists", - "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", - "other-filters-label": "Other Filters", - "advanced-filter-label": "Advanced Filter", - "advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i", - "fullname": "Full Name", - "header-logo-title": "Go back to your boards page.", - "show-activities": "Show Activities", - "headerBarCreateBoardPopup-title": "Create Board", - "home": "Home", - "import": "Import", - "impersonate-user": "Impersonate user", - "link": "Link", - "import-board": "import board", - "import-board-c": "Import board", - "import-board-title-trello": "Import board from Trello", - "import-board-title-wekan": "Import board from previous export", - "import-board-title-csv": "Import board from CSV/TSV", - "from-trello": "From Trello", - "from-wekan": "From previous export", - "from-csv": "From CSV/TSV", - "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-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .", - "import-board-instruction-wekan": "In your board, go to 'Menu', then 'Export board', and copy the text in the downloaded file.", - "import-board-instruction-about-errors": "If you get errors when importing board, sometimes importing still works, and board is at All Boards page.", - "import-json-placeholder": "Paste your valid JSON data here", - "import-csv-placeholder": "Paste your valid CSV/TSV 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 your users", - "import-members-map-note": "Note: Unmapped members will be assigned to the current user.", - "import-show-user-mapping": "Review members mapping", - "import-user-select": "Pick your existing user you want to use as this member", - "importMapMembersAddPopup-title": "Select 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 Archive", - "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Archive and bring them back to the board, click “Menu” > “Archive”.", - "list-move-cards": "Move all cards in this list", - "list-select-cards": "Select all cards in this list", - "set-color-list": "Set Color", - "listActionPopup-title": "List Actions", - "settingsUserPopup-title": "User Settings", - "settingsTeamPopup-title": "Team Settings", - "settingsOrgPopup-title": "Organization Settings", - "swimlaneActionPopup-title": "Swimlane Actions", - "swimlaneAddPopup-title": "Add a Swimlane below", - "listImportCardPopup-title": "Import a Trello card", - "listImportCardsTsvPopup-title": "Import Excel CSV/TSV", - "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 Archive 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", - "grey-icons": "Grey Icons", - "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", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", - "multi-selection": "Multi-Selection", - "multi-selection-label": "Set label for selection", - "multi-selection-member": "Set member for 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 Archive.", - "no-archived-lists": "No lists in Archive.", - "no-archived-swimlanes": "No swimlanes in Archive.", - "no-results": "No results", - "normal": "Normal", - "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", - "not-accepted-yet": "Invitation not accepted yet", - "notify-participate": "Receive updates to any cards you participate as creator 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 image from minicard", - "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", - "rescue-card-description": "Show rescue dialogue before closing for unsaved card descriptions", - "rescue-card-description-dialogue": "Overwrite current card description with your changes?", - "save": "Save", - "search": "Search", - "rules": "Rules", - "search-cards": "Search from card/list titles, descriptions and custom fields on this board", - "search-example": "Write text you search and press Enter", - "select-color": "Select Color", - "select-board": "Select Board", - "set-wip-limit-value": "Set a limit for the maximum number of tasks in this list", - "setWipLimitPopup-title": "Set WIP Limit", - "shortcut-add-self": "Add yourself to current card", - "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-filter-my-assigned-cards": "Filter my assigned cards", - "shortcut-show-shortcuts": "Bring up this shortcuts list", - "shortcut-toggle-filterbar": "Toggle Filter Sidebar", - "shortcut-toggle-searchbar": "Toggle Search 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", - "toggle-assignees": "Toggle assignees 1-9 for card (By order of addition to board).", - "toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9", - "remove-labels-multiselect": "Multi-Selection removes labels 1-9", - "tracking": "Tracking", - "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.", - "type": "Type", - "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", - "uploading-files": "Uploading files", - "upload-failed": "Upload failed", - "upload-completed": "Upload completed", - "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL", - "custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL", - "custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27", - "custom-login-logo-image-url": "Custom Login Logo Image URL", - "custom-login-logo-link-url": "Custom Login Logo Link URL", - "custom-help-link-url": "Custom Help Link URL", - "text-below-custom-login-logo": "Text below Custom Login Logo", - "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", - "username": "Username", - "import-usernames": "Import Usernames", - "view-it": "View it", - "warn-list-archived": "warning: this card is in an list at Archive", - "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", - "card-templates-swimlane": "Card Templates", - "list-templates-swimlane": "List Templates", - "board-templates-swimlane": "Board Templates", - "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", - "disable-forgot-password": "Disable Forgot Password", - "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 kanban board 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", - "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.", - "webhook-title": "Webhook Name", - "webhook-token": "Token (Optional for Authentication)", - "outgoing-webhooks": "Outgoing Webhooks", - "bidirectional-webhooks": "Two-Way Webhooks", - "outgoingWebhooksPopup-title": "Outgoing Webhooks", - "boardCardTitlePopup-title": "Card Title Filter", - "disable-webhook": "Disable This Webhook", - "global-webhook": "Global Webhooks", - "new-outgoing-webhook": "New Outgoing Webhook", - "no-name": "(Unknown)", - "Node_version": "Node version", - "Meteor_version": "Meteor version", - "MongoDB_version": "MongoDB version", - "MongoDB_storage_engine": "MongoDB storage engine", - "MongoDB_Oplog_enabled": "MongoDB Oplog enabled", - "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", - "days": "days", - "hours": "hours", - "minutes": "minutes", - "seconds": "seconds", - "show-field-on-card": "Show this field on card", - "automatically-field-on-card": "Add field to new cards", - "always-field-on-card": "Add field to all cards", - "showLabel-field-on-card": "Show field label on minicard", - "showSum-field-on-list": "Show sum of fields at top of list", - "yes": "Yes", - "no": "No", - "accounts": "Accounts", - "accounts-allowEmailChange": "Allow Email Change", - "accounts-allowUserNameChange": "Allow Username Change", - "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", - "tableVisibilityMode" : "Boards visibility", - "createdAt": "Created at", - "modifiedAt": "Modified 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", - "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", - "setCardActionsColorPopup-title": "Choose a color", - "setSwimlaneColorPopup-title": "Choose a color", - "setListColorPopup-title": "Choose a color", - "assigned-by": "Assigned By", - "requested-by": "Requested By", - "card-sorting-by-number": "Card sorting by number", - "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.", - "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", - "boardDeletePopup-title": "Delete Board?", - "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", - "default-subtasks-board": "Subtasks for __board__ board", - "default": "Default", - "defaultdefault": "Default", - "queue": "Queue", - "subtask-settings": "Subtasks Settings", - "card-settings": "Card Settings", - "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", - "boardCardSettingsPopup-title": "Card Settings", - "boardMinicardSettingsPopup-title": "Minicard Settings", - "deposit-subtasks-board": "Deposit subtasks to this board:", - "deposit-subtasks-list": "Landing list for subtasks deposited here:", - "show-parent-in-minicard": "Show parent in minicard:", - "description-on-minicard": "Description on minicard", - "cover-attachment-on-minicard": "Cover image on minicard", - "badge-attachment-on-minicard": "Count of attachments on minicard", - "card-sorting-by-number-on-minicard": "Card sorting by number on minicard", - "prefix-with-full-path": "Prefix with full path", - "prefix-with-parent": "Prefix with parent", - "subtext-with-full-path": "Subtext with full path", - "subtext-with-parent": "Subtext with parent", - "change-card-parent": "Change card's parent", - "parent-card": "Parent card", - "source-board": "Source board", - "no-parent": "Don't show parent", - "activity-added-label": "added label '%s' to %s", - "activity-removed-label": "removed label '%s' from %s", - "activity-delete-attach": "deleted an attachment from %s", - "activity-added-label-card": "added label '%s'", - "activity-removed-label-card": "removed label '%s'", - "activity-delete-attach-card": "deleted an attachment", - "activity-set-customfield": "set custom field '%s' to '%s' in %s", - "activity-unset-customfield": "unset custom field '%s' in %s", - "r-rule": "Rule", - "r-add-trigger": "Add trigger", - "r-add-action": "Add action", - "r-board-rules": "Board rules", - "r-add-rule": "Add rule", - "r-view-rule": "View rule", - "r-delete-rule": "Delete rule", - "r-new-rule-name": "New rule title", - "r-no-rules": "No rules", - "r-trigger": "Trigger", - "r-action": "Action", - "r-when-a-card": "When a card", - "r-is": "is", - "r-is-moved": "is moved", - "r-added-to": "Added to", - "r-removed-from": "Removed from", - "r-the-board": "the board", - "r-list": "list", - "set-filter": "Set Filter", - "r-moved-to": "Moved to", - "r-moved-from": "Moved from", - "r-archived": "Moved to Archive", - "r-unarchived": "Restored from Archive", - "r-a-card": "a card", - "r-when-a-label-is": "When a label is", - "r-when-the-label": "When the label", - "r-list-name": "list name", - "r-when-a-member": "When a member is", - "r-when-the-member": "When the member", - "r-name": "name", - "r-when-a-attach": "When an attachment", - "r-when-a-checklist": "When a checklist is", - "r-when-the-checklist": "When the checklist", - "r-completed": "Completed", - "r-made-incomplete": "Made incomplete", - "r-when-a-item": "When a checklist item is", - "r-when-the-item": "When the checklist item", - "r-checked": "Checked", - "r-unchecked": "Unchecked", - "r-move-card-to": "Move card to", - "r-top-of": "Top of", - "r-bottom-of": "Bottom of", - "r-its-list": "its list", - "r-archive": "Move to Archive", - "r-unarchive": "Restore from Archive", - "r-card": "card", - "r-add": "Add", - "r-remove": "Remove", - "r-label": "label", - "r-member": "member", - "r-remove-all": "Remove all members from the card", - "r-set-color": "Set color to", - "r-checklist": "checklist", - "r-check-all": "Check all", - "r-uncheck-all": "Uncheck all", - "r-items-check": "items of checklist", - "r-check": "Check", - "r-uncheck": "Uncheck", - "r-item": "item", - "r-of-checklist": "of checklist", - "r-send-email": "Send an email", - "r-to": "to", - "r-of": "of", - "r-subject": "subject", - "r-rule-details": "Rule details", - "r-d-move-to-top-gen": "Move card to top of its list", - "r-d-move-to-top-spec": "Move card to top of list", - "r-d-move-to-bottom-gen": "Move card to bottom of its list", - "r-d-move-to-bottom-spec": "Move card to bottom of list", - "r-d-send-email": "Send email", - "r-d-send-email-to": "to", - "r-d-send-email-subject": "subject", - "r-d-send-email-message": "message", - "r-d-archive": "Move card to Archive", - "r-d-unarchive": "Restore card from Archive", - "r-d-add-label": "Add label", - "r-d-remove-label": "Remove label", - "r-create-card": "Create new card", - "r-in-list": "in list", - "r-in-swimlane": "in swimlane", - "r-d-add-member": "Add member", - "r-d-remove-member": "Remove member", - "r-d-remove-all-member": "Remove all member", - "r-d-check-all": "Check all items of a list", - "r-d-uncheck-all": "Uncheck all items of a list", - "r-d-check-one": "Check item", - "r-d-uncheck-one": "Uncheck item", - "r-d-check-of-list": "of checklist", - "r-d-add-checklist": "Add checklist", - "r-d-remove-checklist": "Remove checklist", - "r-by": "by", - "r-add-checklist": "Add checklist", - "r-with-items": "with items", - "r-items-list": "item1,item2,item3", - "r-add-swimlane": "Add swimlane", - "r-swimlane-name": "swimlane name", - "r-board-note": "Note: leave a field empty to match every possible value. ", - "r-checklist-note": "Note: checklist's items have to be written as comma separated values.", - "r-when-a-card-is-moved": "When a card is moved to another list", - "r-set": "Set", - "r-update": "Update", - "r-datefield": "date field", - "r-df-start-at": "start", - "r-df-due-at": "due", - "r-df-end-at": "end", - "r-df-received-at": "received", - "r-to-current-datetime": "to current date/time", - "r-remove-value-from": "Remove value from", - "r-link-card": "Link card to", - "ldap": "LDAP", - "oauth2": "OAuth2", - "cas": "CAS", - "authentication-method": "Authentication method", - "authentication-type": "Authentication type", - "custom-product-name": "Custom Product Name", - "layout": "Layout", - "hide-logo": "Hide Logo", - "hide-card-counter-list": "Hide card counter list on All Boards", - "hide-board-member-list": "Hide board member list on All Boards", - "add-custom-html-after-body-start": "Add Custom HTML after <body> start", - "add-custom-html-before-body-end": "Add Custom HTML before </body> end", - "error-undefined": "Something went wrong", - "error-ldap-login": "An error occurred while trying to login", - "display-authentication-method": "Display Authentication Method", - "oidc-button-text": "Customize the OIDC button text", - "default-authentication-method": "Default Authentication Method", - "duplicate-board": "Duplicate Board", - "duplicate-board-confirm": "Are you sure you want to duplicate this board?", - "org-number": "The number of organizations is: ", - "team-number": "The number of teams is: ", - "people-number": "The number of people is: ", - "swimlaneDeletePopup-title": "Delete Swimlane ?", - "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.", - "restore-all": "Restore all", - "delete-all": "Delete all", - "loading": "Loading, please wait.", - "previous_as": "last time was", - "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__", - "act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)", - "act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)", - "act-a-receivedAt": "modified received time to __timeValue__ from (__timeOldValue__)", - "a-dueAt": "modified due time to be", - "a-endAt": "modified ending time to be", - "a-startAt": "modified starting time to be", - "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", - "almostdue": "current due time %s is approaching", - "pastdue": "current due time %s is past", - "duenow": "current due time %s is today", - "act-newDue": "__list__/__card__ has 1st due reminder [__board__]", - "act-withDue": "__list__/__card__ due reminders [__board__]", - "act-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching", - "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past", - "act-duenow": "was reminding the current due (__timeValue__) of __card__ is now", - "act-atUserComment": "You were mentioned in [__board__] __list__/__card__", - "delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.", - "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", - "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", - "accounts-allowUserDelete": "Allow users to self delete their account", - "hide-minicard-label-text": "Hide minicard label text", - "show-desktop-drag-handles": "Show desktop drag handles", - "assignee": "Assignee", - "cardAssigneesPopup-title": "Assignee", - "addmore-detail": "Add a more detailed description", - "show-on-card": "Show on Card", - "show-on-minicard": "Show on Minicard", - "new": "New", - "editOrgPopup-title": "Edit Organization", - "newOrgPopup-title": "New Organization", - "editTeamPopup-title": "Edit Team", - "newTeamPopup-title": "New Team", - "editUserPopup-title": "Edit User", - "newUserPopup-title": "New User", - "notifications": "Notifications", - "help": "Help", - "view-all": "View All", - "filter-by-unread": "Filter by Unread", - "mark-all-as-read": "Mark all as read", - "remove-all-read": "Remove all read", - "allow-rename": "Allow Rename", - "allowRenamePopup-title": "Allow Rename", - "start-day-of-week": "Set day of the week start", - "monday": "Monday", - "tuesday": "Tuesday", - "wednesday": "Wednesday", - "thursday": "Thursday", - "friday": "Friday", - "saturday": "Saturday", - "sunday": "Sunday", - "status": "Status", - "swimlane": "Swimlane", - "owner": "Owner", - "last-modified-at": "Last modified at", - "last-activity": "Last activity", - "voting": "Voting", - "archived": "Archived", - "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has", - "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list", - "hide-checked-items": "Hide checked items", - "hide-finished-checklist": "Hide finished checklist", - "task": "Task", - "create-task": "Create Task", - "ok": "OK", - "organizations": "Organizations", - "teams": "Teams", - "displayName": "Display Name", - "shortName": "Short Name", - "autoAddUsersWithDomainName": "Automatically add users with the domain name", - "website": "Website", - "person": "Person", - "my-cards": "My Cards", - "card": "Card", - "list": "List", - "board": "Board", - "context-separator": "/", - "myCardsViewChange-title": "My Cards View", - "myCardsViewChangePopup-title": "My Cards View", - "myCardsViewChange-choice-boards": "Boards", - "myCardsViewChange-choice-table": "Table", - "myCardsSortChange-title": "My Cards Sort", - "myCardsSortChangePopup-title": "My Cards Sort", - "myCardsSortChange-choice-board": "By Board", - "myCardsSortChange-choice-dueat": "By Due Date", - "dueCards-title": "Due Cards", - "dueCardsViewChange-title": "Due Cards View", - "dueCardsViewChangePopup-title": "Due Cards View", - "dueCardsViewChange-choice-me": "Me", - "dueCardsViewChange-choice-all": "All Users", - "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", - "broken-cards": "Broken Cards", - "board-title-not-found": "Board '%s' not found.", - "swimlane-title-not-found": "Swimlane '%s' not found.", - "list-title-not-found": "List '%s' not found.", - "label-not-found": "Label '%s' not found.", - "label-color-not-found": "Label color %s not found.", - "user-username-not-found": "Username '%s' not found.", - "comment-not-found": "Card with comment containing text '%s' not found.", - "org-name-not-found": "Organization '%s' not found.", - "team-name-not-found": "Team '%s' not found.", - "globalSearch-title": "Search All Boards", - "no-cards-found": "No Cards Found", - "one-card-found": "One Card Found", - "n-cards-found": "%s Cards Found", - "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", - "operator-board": "board", - "operator-board-abbrev": "b", - "operator-swimlane": "swimlane", - "operator-swimlane-abbrev": "s", - "operator-list": "list", - "operator-list-abbrev": "l", - "operator-label": "label", - "operator-label-abbrev": "#", - "operator-user": "user", - "operator-user-abbrev": "@", - "operator-member": "member", - "operator-member-abbrev": "m", - "operator-assignee": "assignee", - "operator-assignee-abbrev": "a", - "operator-creator": "creator", - "operator-status": "status", - "operator-due": "due", - "operator-created": "created", - "operator-modified": "modified", - "operator-sort": "sort", - "operator-comment": "comment", - "operator-has": "has", - "operator-limit": "limit", - "operator-debug": "debug", - "operator-org": "org", - "operator-team": "team", - "predicate-archived": "archived", - "predicate-open": "open", - "predicate-ended": "ended", - "predicate-all": "all", - "predicate-overdue": "overdue", - "predicate-week": "week", - "predicate-month": "month", - "predicate-quarter": "quarter", - "predicate-year": "year", - "predicate-due": "due", - "predicate-modified": "modified", - "predicate-created": "created", - "predicate-attachment": "attachment", - "predicate-description": "description", - "predicate-checklist": "checklist", - "predicate-start": "start", - "predicate-end": "end", - "predicate-assignee": "assignee", - "predicate-member": "member", - "predicate-public": "public", - "predicate-private": "private", - "predicate-selector": "selector", - "predicate-projection": "projection", - "operator-unknown-error": "%s is not an operator", - "operator-number-expected": "operator __operator__ expected a number, got '__value__'", - "operator-sort-invalid": "sort of '%s' is invalid", - "operator-status-invalid": "'%s' is not a valid status", - "operator-has-invalid": "%s is not a valid existence check", - "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", - "operator-debug-invalid": "%s is not a valid debug predicate", - "next-page": "Next Page", - "previous-page": "Previous Page", - "heading-notes": "Notes", - "globalSearch-instructions-heading": "Search Instructions", - "globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).", - "globalSearch-instructions-operators": "Available operators:", - "globalSearch-instructions-operator-board": "`__operator_board__:<title>` - cards in boards matching the specified *<title>*", - "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - cards in lists matching the specified *<title>*", - "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*", - "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.", - "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>", - "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`", - "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*", - "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`", - "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*", - "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*", - "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", - "globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cards belonging to a board assigned to organization *<name>*", - "globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cards belonging to a board assigned to team *<name>*", - "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now. `__operator_due__:__predicate_overdue__ lists all cards past their due date.", - "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less", - "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less", - "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:", - "globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards", - "globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards", - "globalSearch-instructions-status-ended": "`__predicate_ended__` - cards with an end date", - "globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards", - "globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards", - "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`. Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).", - "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`. For a descending sort, place a `-` in front of the sort name.", - "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.", - "globalSearch-instructions-notes-1": "Multiple operators may be specified.", - "globalSearch-instructions-notes-2": "Similar operators are *OR*ed together. Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.", - "globalSearch-instructions-notes-3": "Differing operators are *AND*ed together. Only cards that match all of the differing operators are returned. `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.", - "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.", - "globalSearch-instructions-notes-4": "Text searches are case insensitive.", - "globalSearch-instructions-notes-5": "By default archived cards are not searched.", - "link-to-search": "Link to this search", - "excel-font": "Arial", - "number": "Number", - "label-colors": "Label Colors", - "label-names": "Label Names", - "archived-at": "archived at", - "sort-cards": "Sort Cards", - "sort-is-on": "Sort is on", - "cardsSortPopup-title": "Sort Cards", - "due-date": "Due Date", - "server-error": "Server Error", - "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`", - "title-alphabetically": "Title (Alphabetically)", - "created-at-newest-first": "Created At (Newest First)", - "created-at-oldest-first": "Created At (Oldest First)", - "links-heading": "Links", - "hide-activities-of-all-boards": "Don't show the board activities on all boards", - "now-activities-of-all-boards-are-hidden": "Now all activities of all boards are hidden", - "move-swimlane": "Move Swimlane", - "moveSwimlanePopup-title": "Move Swimlane", - "custom-field-stringtemplate": "String Template", - "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", - "custom-field-stringtemplate-separator": "Separator (use or   for a space)", - "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", - "creator": "Creator", - "creator-on-minicard": "Creator on minicard", - "filesReportTitle": "Files Report", - "reports": "Reports", - "rulesReportTitle": "Rules Report", - "boardsReportTitle": "Boards Report", - "cardsReportTitle": "Cards Report", - "copy-swimlane": "Copy Swimlane", - "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner", - "Bounce": "Bounce Wait Spinner", - "Cube": "Cube Wait Spinner", - "Cube-Grid": "Cube-Grid Wait Spinner", - "Dot": "Dot Wait Spinner", - "Double-Bounce": "Double Bounce Wait Spinner", - "Rotateplane": "Rotateplane Wait Spinner", - "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner", - "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card", - "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", - "subject": "Subject", - "details": "Details", - "carbon-copy": "Carbon Copy (Cc:)", - "ticket": "Ticket", - "tickets": "Tickets", - "ticket-number": "Ticket Number", - "open": "Open", - "pending": "Pending", - "closed": "Closed", - "resolved": "Resolved", - "cancelled": "Cancelled", - "history": "History", - "request": "Request", - "requests": "Requests", - "help-request": "Help Request", - "editCardSortOrderPopup-title": "Change Sorting", - "cardDetailsPopup-title": "Card Details", - "add-teams": "Add teams", - "add-teams-label": "Added teams are displayed below:", - "remove-team-from-table": "Are you sure you want to remove this team from the board ?", - "confirm-btn": "Confirm", - "remove-btn": "Remove", - "filter-card-title-label": "Filter by card title", - "invite-people-success": "Invitation to register sent with success", - "invite-people-error": "Error while sending invitation to register", - "can-invite-if-same-mailDomainName": "Email domain name", - "to-create-teams-contact-admin": "To create teams, please contact the administrator.", - "Node_heap_total_heap_size": "Node heap: total heap size", - "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", - "Node_heap_total_physical_size": "Node heap: total physical size", - "Node_heap_total_available_size": "Node heap: total available size", - "Node_heap_used_heap_size": "Node heap: used heap size", - "Node_heap_heap_size_limit": "Node heap: heap size limit", - "Node_heap_malloced_memory": "Node heap: malloced memory", - "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", - "Node_heap_does_zap_garbage": "Node heap: does zap garbage", - "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", - "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", - "Node_memory_usage_rss": "Node memory usage: resident set size", - "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", - "Node_memory_usage_heap_used": "Node memory usage: actual memory used", - "Node_memory_usage_external": "Node memory usage: external", - "add-organizations": "Add organizations", - "add-organizations-label": "Added organizations are displayed below:", - "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", - "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", - "custom-legal-notice-link-url": "Custom legal notice page URL", - "acceptance_of_our_legalNotice": "By continuing, you accept our", - "legalNotice": "legal notice", - "copied": "Copied!", - "checklistActionsPopup-title": "Checklist Actions", - "moveChecklist": "Move Checklist", - "moveChecklistPopup-title": "Move Checklist", - "newlineBecomesNewChecklistItem": "Each line of text becomes one of the checklist items", - "newLineNewItem": "One line of text = one checklist item", - "newlineBecomesNewChecklistItemOriginOrder": "Each line of text becomes one of the checklist items, original order", - "originOrder": "original order", - "copyChecklist": "Copy Checklist", - "copyChecklistPopup-title": "Copy Checklist", - "card-show-lists": "Card Show Lists", - "subtaskActionsPopup-title": "Subtask Actions", - "attachmentActionsPopup-title": "Attachment Actions", - "attachment-move-storage-fs": "Move attachment to filesystem", - "attachment-move-storage-gridfs": "Move attachment to GridFS", - "attachment-move-storage-s3": "Move attachment to S3", - "attachment-move": "Move Attachment", - "move-all-attachments-to-fs": "Move all attachments to filesystem", - "move-all-attachments-to-gridfs": "Move all attachments to GridFS", - "move-all-attachments-to-s3": "Move all attachments to S3", - "move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem", - "move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS", - "move-all-attachments-of-board-to-s3": "Move all attachments of board to S3", - "path": "Path", - "version-name": "Version-Name", - "size": "Size", - "storage": "Storage", - "action": "Action", - "board-title": "Board Title", - "attachmentRenamePopup-title": "Rename", - "uploading": "Uploading", - "remaining_time": "Remaining time", - "speed": "Speed", - "progress": "Progress", - "password-again": "Password (again)", - "if-you-already-have-an-account": "If you already have an account", - "register": "Register", - "forgot-password": "Forgot password", - "minicardDetailsActionsPopup-title": "Card Details", - "Mongo_sessions_count": "Mongo sessions count", - "change-visibility": "Change Visibility", - "max-upload-filesize": "Max upload filesize in bytes:", - "allowed-upload-filetypes": "Allowed upload filetypes:", - "max-avatar-filesize": "Max avatar filesize in bytes:", - "allowed-avatar-filetypes": "Allowed avatar filetypes:", - "invalid-file": "If filename is invalid, upload or rename is cancelled.", - "preview-pdf-not-supported": "Your device does not support previewing PDF. Try downloading instead.", - "drag-board": "Drag board", - "translation-number": "The number of custom translation strings is:", - "delete-translation-confirm-popup": "Are you sure you want to delete this custom translation string? There is no undo.", - "newTranslationPopup-title": "New custom translation string", - "editTranslationPopup-title": "Edit custom translation string", - "settingsTranslationPopup-title": "Delete this custom translation string?", - "translation": "Translation", - "text": "Text", - "translation-text": "Translation text", - "show-subtasks-field": "Show subtasks field", - "show-week-of-year": "Show week of year (ISO 8601)", - "convert-to-markdown": "Convert to markdown", - "import-board-zip": "Add .zip file that has board JSON files, and board name subdirectories with attachments", - "collapse": "Collapse", - "uncollapse": "Uncollapse", - "hideCheckedChecklistItems": "Hide checked checklist items", - "hideAllChecklistItems": "Hide all checklist items", - "support": "Support", - "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", - "accessibility": "Accessibility", - "accessibility-page-enabled": "Accessibility page enabled", - "accessibility-info-not-added-yet": "Accessibility info has not been added yet", - "accessibility-title": "Accessibility title", - "accessibility-content": "Accessibility content", - "accounts-lockout-settings": "Brute Force Protection Settings", - "accounts-lockout-info": "These settings control how login attempts are protected against brute force attacks.", - "accounts-lockout-known-users": "Settings for known users (correct username, wrong password)", - "accounts-lockout-unknown-users": "Settings for unknown users (non-existent username)", - "accounts-lockout-failures-before": "Failures before lockout", - "accounts-lockout-period": "Lockout period (seconds)", - "accounts-lockout-failure-window": "Failure window (seconds)", - "accounts-lockout-settings-updated": "Brute force protection settings have been updated", - "accounts-lockout-locked-users": "Locked Users", - "accounts-lockout-locked-users-info": "Users currently locked out due to too many failed login attempts", - "accounts-lockout-no-locked-users": "There are currently no locked users", - "accounts-lockout-failed-attempts": "Failed Attempts", - "accounts-lockout-remaining-time": "Remaining Time", - "accounts-lockout-user-unlocked": "User has been unlocked successfully", - "accounts-lockout-confirm-unlock": "Are you sure you want to unlock this user?", - "accounts-lockout-confirm-unlock-all": "Are you sure you want to unlock all locked users?", - "accounts-lockout-show-locked-users": "Show locked users only", - "accounts-lockout-user-locked": "User is locked", - "accounts-lockout-click-to-unlock": "Click to unlock this user", - "accounts-lockout-status": "Status", - "admin-people-filter-show": "Show:", - "admin-people-filter-all": "All Users", - "admin-people-filter-locked": "Locked Users Only", - "admin-people-filter-active": "Active", - "admin-people-filter-inactive": "Not Active", - "admin-people-active-status": "Active Status", - "admin-people-user-active": "User is active - click to deactivate", - "admin-people-user-inactive": "User is inactive - click to activate", - "accounts-lockout-all-users-unlocked": "All locked users have been unlocked", - "accounts-lockout-unlock-all": "Unlock All", - "active-cron-jobs": "Active Scheduled Jobs", - "add-cron-job": "Add Scheduled Job", - "add-cron-job-placeholder": "Add Scheduled Job functionality coming soon", - "attachment-storage-configuration": "Attachment Storage Configuration", - "attachments-path": "Attachments Path", - "attachments-path-description": "Path where attachment files are stored", - "avatars-path": "Avatars Path", - "avatars-path-description": "Path where avatar files are stored", - "board-archive-failed": "Failed to schedule board archive", - "board-archive-scheduled": "Board archive scheduled successfully", - "board-backup-failed": "Failed to schedule board backup", - "board-backup-scheduled": "Board backup scheduled successfully", - "board-cleanup-failed": "Failed to schedule board cleanup", - "board-cleanup-scheduled": "Board cleanup scheduled successfully", - "board-operations": "Board Operations", - "cron-jobs": "Scheduled Jobs", - "cron-migrations": "Scheduled Migrations", - "cron-job-delete-confirm": "Are you sure you want to delete this scheduled job?", - "cron-job-delete-failed": "Failed to delete scheduled job", - "cron-job-deleted": "Scheduled job deleted successfully", - "cron-job-pause-failed": "Failed to pause scheduled job", - "cron-job-paused": "Scheduled job paused successfully", - "filesystem-path-description": "Base path for file storage", - "gridfs-enabled": "GridFS Enabled", - "gridfs-enabled-description": "Use MongoDB GridFS for file storage", - "migration-pause-failed": "Failed to pause migrations", - "migration-paused": "Migrations paused successfully", - "migration-progress": "Migration Progress", - "migration-start-failed": "Failed to start migrations", - "migration-started": "Migrations started successfully", - "migration-status": "Migration Status", - "migration-stop-confirm": "Are you sure you want to stop all migrations?", - "migration-stop-failed": "Failed to stop migrations", - "migration-stopped": "Migrations stopped successfully", - "mongodb-gridfs-storage": "MongoDB GridFS Storage", - "pause-all-migrations": "Pause All Migrations", - "s3-access-key": "S3 Access Key", - "s3-access-key-description": "AWS S3 access key for authentication", - "s3-access-key-placeholder": "Enter S3 access key", - "s3-bucket": "S3 Bucket", - "s3-bucket-description": "S3 bucket name for storing files", - "s3-connection-failed": "S3 connection failed", - "s3-connection-success": "S3 connection successful", - "s3-enabled": "S3 Enabled", - "s3-enabled-description": "Use AWS S3 or MinIO for file storage", - "s3-endpoint": "S3 Endpoint", - "s3-endpoint-description": "S3 endpoint URL (e.g., s3.amazonaws.com or minio.example.com)", - "s3-minio-storage": "S3/MinIO Storage", - "s3-port": "S3 Port", - "s3-port-description": "S3 endpoint port number", - "s3-region": "S3 Region", - "s3-region-description": "AWS S3 region (e.g., us-east-1)", - "s3-secret-key": "S3 Secret Key", - "s3-secret-key-description": "AWS S3 secret key for authentication", - "s3-secret-key-placeholder": "Enter S3 secret key", - "s3-secret-key-required": "S3 secret key is required", - "s3-settings-save-failed": "Failed to save S3 settings", - "s3-settings-saved": "S3 settings saved successfully", - "s3-ssl-enabled": "S3 SSL Enabled", - "s3-ssl-enabled-description": "Use SSL/TLS for S3 connections", - "save-s3-settings": "Save S3 Settings", - "schedule-board-archive": "Schedule Board Archive", - "schedule-board-backup": "Schedule Board Backup", - "schedule-board-cleanup": "Schedule Board Cleanup", - "scheduled-board-operations": "Scheduled Board Operations", - "start-all-migrations": "Start All Migrations", - "stop-all-migrations": "Stop All Migrations", - "test-s3-connection": "Test S3 Connection", - "writable-path": "Writable Path", - "writable-path-description": "Base directory path for file storage", - "add-job": "Add Job", - "attachment-migration": "Attachment Migration", - "attachment-monitoring": "Attachment Monitoring", - "attachment-settings": "Attachment Settings", - "attachment-storage-settings": "Storage Settings", - "automatic-migration": "Automatic Migration", - "back-to-settings": "Back to Settings", - "board-id": "Board ID", - "board-migration": "Board Migration", - "board-migrations": "Board Migrations", - "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", - "cleanup": "Cleanup", - "cleanup-old-jobs": "Cleanup Old Jobs", - "completed": "Completed", - "conversion-info-text": "This conversion is performed once per board and improves performance. You can continue using the board normally.", - "converting-board": "Converting Board", - "converting-board-description": "Converting board structure for improved functionality. This may take a few moments.", - "cpu-cores": "CPU Cores", - "cpu-usage": "CPU Usage", - "current-action": "Current Action", - "database-migration": "Database Migration", - "database-migration-description": "Updating database structure for improved functionality and performance. This process may take several minutes.", - "database-migrations": "Database Migrations", - "days-old": "Days Old", - "duration": "Duration", - "errors": "Errors", - "estimated-time-remaining": "Estimated time remaining", - "every-1-day": "Every 1 day", - "every-1-hour": "Every 1 hour", - "every-1-minute": "Every 1 minute", - "every-10-minutes": "Every 10 minutes", - "every-30-minutes": "Every 30 minutes", - "every-5-minutes": "Every 5 minutes", - "every-6-hours": "Every 6 hours", - "export-monitoring": "Export Monitoring", - "filesystem-attachments": "Filesystem Attachments", - "filesystem-size": "Filesystem Size", - "filesystem-storage": "Filesystem Storage", - "force-board-scan": "Force Board Scan", - "gridfs-attachments": "GridFS Attachments", - "gridfs-size": "GridFS Size", - "gridfs-storage": "GridFS", - "hide-list-on-minicard": "Hide List on Minicard", - "idle-migration": "Idle Migration", - "job-description": "Job Description", - "job-details": "Job Details", - "job-name": "Job Name", - "job-queue": "Job Queue", - "last-run": "Last Run", - "max-concurrent": "Max Concurrent", - "memory-usage": "Memory Usage", - "migrate-all-to-filesystem": "Migrate All to Filesystem", - "migrate-all-to-gridfs": "Migrate All to GridFS", - "migrate-all-to-s3": "Migrate All to S3", - "migrated-attachments": "Migrated Attachments", - "migration-batch-size": "Batch Size", - "migration-batch-size-description": "Number of attachments to process in each batch (1-100)", - "migration-cpu-threshold": "CPU Threshold (%)", - "migration-cpu-threshold-description": "Pause migration when CPU usage exceeds this percentage (10-90)", - "migration-delay-ms": "Delay (ms)", - "migration-delay-ms-description": "Delay between batches in milliseconds (100-10000)", - "migration-detector": "Migration Detector", - "migration-info-text": "Database migrations are performed once and improve system performance. The process continues in the background even if you close your browser.", - "migration-log": "Migration Log", - "migration-markers": "Migration Markers", - "migration-resume-failed": "Failed to resume migration", - "migration-resumed": "Migration resumed", - "migration-steps": "Migration Steps", - "migration-warning-text": "Please do not close your browser during migration. The process will continue in the background but may take longer to complete.", - "monitoring-export-failed": "Failed to export monitoring data", - "monitoring-refresh-failed": "Failed to refresh monitoring data", - "next": "Next", - "next-run": "Next Run", - "of": "of", - "operation-type": "Operation Type", - "overall-progress": "Overall Progress", - "page": "Page", - "pause": "Pause", - "pause-migration": "Pause Migration", - "previous": "Previous", - "refresh": "Refresh", - "refresh-monitoring": "Refresh Monitoring", - "remaining-attachments": "Remaining Attachments", - "resume-migration": "Resume Migration", - "run-once": "Run once", - "s3-attachments": "S3 Attachments", - "s3-size": "S3 Size", - "s3-storage": "S3", - "scanning-status": "Scanning Status", - "schedule": "Schedule", - "search-boards-or-operations": "Search boards or operations...", - "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", - "showing": "Showing", - "start-test-operation": "Start Test Operation", - "start-time": "Start Time", - "step-progress": "Step Progress", - "stop-migration": "Stop Migration", - "storage-distribution": "Storage Distribution", - "system-resources": "System Resources", - "total-attachments": "Total Attachments", - "total-operations": "Total Operations", - "total-size": "Total Size", - "unmigrated-boards": "Unmigrated Boards", - "weight": "Weight", - "idle": "Idle", - "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" -} diff --git a/imports/i18n/data/zu-ZA.i18n.json b/imports/i18n/data/zu-ZA.i18n.json index d48099de1..12e76c28d 100644 --- a/imports/i18n/data/zu-ZA.i18n.json +++ b/imports/i18n/data/zu-ZA.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/data/zu.i18n.json b/imports/i18n/data/zu.i18n.json index d48099de1..12e76c28d 100644 --- a/imports/i18n/data/zu.i18n.json +++ b/imports/i18n/data/zu.i18n.json @@ -78,18 +78,6 @@ "activity-deleteComment": "deleted comment %s", "activity-receivedDate": "edited received date to %s of %s", "activity-startDate": "edited start date to %s of %s", - "allboards.starred": "Starred", - "allboards.templates": "Templates", - "allboards.remaining": "Remaining", - "allboards.workspaces": "Workspaces", - "allboards.add-workspace": "Add Workspace", - "allboards.add-workspace-prompt": "Workspace name", - "allboards.add-subworkspace": "Add Subworkspace", - "allboards.add-subworkspace-prompt": "Subworkspace name", - "allboards.edit-workspace": "Edit workspace", - "allboards.edit-workspace-name": "Workspace name", - "allboards.edit-workspace-icon": "Workspace icon (markdown)", - "multi-selection-active": "Click checkboxes to select boards", "activity-dueDate": "edited due date to %s of %s", "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", @@ -328,16 +316,10 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", - "comment-assigned-only": "Only Assigned Comment", - "comment-assigned-only-desc": "Only assigned cards visible. Can comment only.", "comment-delete": "Are you sure you want to delete the comment?", "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", - "read-only": "Read Only", - "read-only-desc": "Can view cards only. Can not edit.", - "read-assigned-only": "Only Assigned Read", - "read-assigned-only-desc": "Only assigned cards visible. Can not edit.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computer", @@ -345,7 +327,6 @@ "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", "subtaskDeletePopup-title": "Delete Subtask?", "checklistDeletePopup-title": "Delete Checklist?", - "checklistItemDeletePopup-title": "Delete Checklist Item?", "copy-card-link-to-clipboard": "Copy card link to clipboard", "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", @@ -356,7 +337,6 @@ "copyManyCardsPopup-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", - "createTemplateContainerPopup-title": "Add Template Container", "chooseBoardSourcePopup-title": "Import board", "createLabelPopup-title": "Create Label", "createCustomField": "Create Field", @@ -377,9 +357,9 @@ "custom-fields": "Custom Fields", "date": "Date", "date-format": "Date Format", - "date-format-yyyy-mm-dd": "YYYY-MM-DD", - "date-format-dd-mm-yyyy": "DD-MM-YYYY", - "date-format-mm-dd-yyyy": "MM-DD-YYYY", + "date-format-yyyy-mm-dd": "YYYY-MM-DD HH:MM", + "date-format-dd-mm-yyyy": "DD-MM-YYYY HH:MM", + "date-format-mm-dd-yyyy": "MM-DD-YYYY HH:MM", "decline": "Decline", "default-avatar": "Default avatar", "delete": "Delete", @@ -405,7 +385,6 @@ "editNotificationPopup-title": "Edit Notification", "editProfilePopup-title": "Edit Profile", "email": "Email", - "email-address": "Email Address", "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", @@ -554,7 +533,6 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "grey-icons": "Grey Icons", "members": "Members", "menu": "Menu", "move-selection": "Move selection", @@ -562,8 +540,6 @@ "moveCardToBottom-title": "Move to Bottom", "moveCardToTop-title": "Move to Top", "moveSelectionPopup-title": "Move selection", - "copySelectionPopup-title": "Copy selection", - "selection-color": "Selection Color", "multi-selection": "Multi-Selection", "multi-selection-label": "Set label for selection", "multi-selection-member": "Set member for selection", @@ -578,8 +554,6 @@ "no-results": "No results", "normal": "Normal", "normal-desc": "Can view and edit cards. Can't change settings.", - "normal-assigned-only": "Only Assigned Normal", - "normal-assigned-only-desc": "Only assigned cards visible. Edit as Normal user.", "not-accepted-yet": "Invitation not accepted yet", "notify-participate": "Receive updates to any cards you participate as creator or member", "notify-watch": "Receive updates to any boards, lists, or cards you’re watching", @@ -770,7 +744,6 @@ "editCardReceivedDatePopup-title": "Change received date", "editCardEndDatePopup-title": "Change end date", "setCardColorPopup-title": "Set color", - "setSelectionColorPopup-title": "Set selection color", "setCardActionsColorPopup-title": "Choose a color", "setSwimlaneColorPopup-title": "Choose a color", "setListColorPopup-title": "Choose a color", @@ -781,8 +754,6 @@ "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.", "boardDeletePopup-title": "Delete Board?", "delete-board": "Delete Board", - "delete-duplicate-lists": "Delete Duplicate Lists", - "delete-duplicate-lists-confirm": "Are you sure? This will delete all duplicate lists that have the same name and contain no cards.", "default-subtasks-board": "Subtasks for __board__ board", "default": "Default", "defaultdefault": "Default", @@ -790,7 +761,7 @@ "subtask-settings": "Subtasks Settings", "card-settings": "Card Settings", "minicard-settings": "Minicard Settings", - "boardSubtaskSettingsPopup-title": "Subtasks Settings", + "boardSubtaskSettingsPopup-title": "Board Subtasks Settings", "boardCardSettingsPopup-title": "Card Settings", "boardMinicardSettingsPopup-title": "Minicard Settings", "deposit-subtasks-board": "Deposit subtasks to this board:", @@ -961,8 +932,6 @@ "a-endAt": "modified ending time to be", "a-startAt": "modified starting time to be", "a-receivedAt": "modified received time to be", - "above-selected-card": "Above selected card", - "below-selected-card": "Below selected card", "almostdue": "current due time %s is approaching", "pastdue": "current due time %s is past", "duenow": "current due time %s is today", @@ -1046,8 +1015,6 @@ "dueCardsViewChange-choice-me": "Me", "dueCardsViewChange-choice-all": "All Users", "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.", - "dueCards-noResults-title": "No Due Cards Found", - "dueCards-noResults-description": "You don't have any cards with due dates at the moment.", "broken-cards": "Broken Cards", "board-title-not-found": "Board '%s' not found.", "swimlane-title-not-found": "Swimlane '%s' not found.", @@ -1318,11 +1285,6 @@ "hideAllChecklistItems": "Hide all checklist items", "support": "Support", "supportPopup-title": "Support", - "support-page-enabled": "Support page enabled", - "support-info-not-added-yet": "Support info has not been added yet", - "support-info-only-for-logged-in-users": "Support info is only for logged in users.", - "support-title": "Support title", - "support-content": "Support content", "accessibility": "Accessibility", "accessibility-page-enabled": "Accessibility page enabled", "accessibility-info-not-added-yet": "Accessibility info has not been added yet", @@ -1437,73 +1399,7 @@ "back-to-settings": "Back to Settings", "board-id": "Board ID", "board-migration": "Board Migration", - "board-migrations": "Board Migrations", "card-show-lists-on-minicard": "Show Lists on Minicard", - "comprehensive-board-migration": "Comprehensive Board Migration", - "comprehensive-board-migration-description": "Performs comprehensive checks and fixes for board data integrity, including list ordering, card positions, and swimlane structure.", - "delete-duplicate-empty-lists-migration": "Delete Duplicate Empty Lists", - "delete-duplicate-empty-lists-migration-description": "Safely deletes empty duplicate lists. Only removes lists that have no cards AND have another list with the same title that contains cards.", - "lost-cards": "Lost Cards", - "lost-cards-list": "Restored Items", - "restore-lost-cards-migration": "Restore Lost Cards", - "restore-lost-cards-migration-description": "Finds and restores cards and lists with missing swimlaneId or listId. Creates a 'Lost Cards' swimlane to make all lost items visible again.", - "restore-all-archived-migration": "Restore All Archived", - "restore-all-archived-migration-description": "Restores all archived swimlanes, lists, and cards. Automatically fixes any missing swimlaneId or listId to make items visible.", - "fix-missing-lists-migration": "Fix Missing Lists", - "fix-missing-lists-migration-description": "Detects and repairs missing or corrupted lists in the board structure.", - "fix-avatar-urls-migration": "Fix Avatar URLs", - "fix-avatar-urls-migration-description": "Updates avatar URLs for board members to use the correct storage backend and fixes broken avatar references.", - "fix-all-file-urls-migration": "Fix All File URLs", - "fix-all-file-urls-migration-description": "Updates all file attachment URLs on this board to use the correct storage backend and fixes broken file references.", - "migration-needed": "Migration Needed", - "migration-complete": "Complete", - "migration-running": "Running...", - "migration-successful": "Migration completed successfully", - "migration-failed": "Migration failed", - "migrations": "Migrations", - "migrations-admin-only": "Only board administrators can run migrations", - "migrations-description": "Run data integrity checks and repairs for this board. Each migration can be executed individually.", - "no-issues-found": "No issues found", - "run-migration": "Run Migration", - "run-comprehensive-migration-confirm": "This will perform a comprehensive migration to check and fix board data integrity. This may take a few moments. Continue?", - "run-delete-duplicate-empty-lists-migration-confirm": "This will first convert any shared lists to per-swimlane lists, then delete empty lists that have a duplicate list with the same title containing cards. Only truly redundant empty lists will be removed. Continue?", - "run-restore-lost-cards-migration-confirm": "This will create a 'Lost Cards' swimlane and restore all cards and lists with missing swimlaneId or listId. This only affects non-archived items. Continue?", - "run-restore-all-archived-migration-confirm": "This will restore ALL archived swimlanes, lists, and cards, making them visible again. Any items with missing IDs will be automatically fixed. This cannot be easily undone. Continue?", - "run-fix-missing-lists-migration-confirm": "This will detect and repair missing or corrupted lists in the board structure. Continue?", - "run-fix-avatar-urls-migration-confirm": "This will update avatar URLs for board members to use the correct storage backend. Continue?", - "run-fix-all-file-urls-migration-confirm": "This will update all file attachment URLs on this board to use the correct storage backend. Continue?", - "restore-lost-cards-nothing-to-restore": "No lost swimlanes, lists, or cards to restore", - - "migration-progress-title": "Board Migration in Progress", - "migration-progress-overall": "Overall Progress", - "migration-progress-current-step": "Current Step", - "migration-progress-status": "Status", - "migration-progress-details": "Details", - "migration-progress-note": "Please wait while we migrate your board to the latest structure...", - "steps": "steps", - "view": "View", - "has-swimlanes": "Has Swimlanes", - - "step-analyze-board-structure": "Analyze Board Structure", - "step-fix-orphaned-cards": "Fix Orphaned Cards", - "step-convert-shared-lists": "Convert Shared Lists", - "step-ensure-per-swimlane-lists": "Ensure Per-Swimlane Lists", - "step-validate-migration": "Validate Migration", - "step-fix-avatar-urls": "Fix Avatar URLs", - "step-fix-attachment-urls": "Fix Attachment URLs", - "step-analyze-lists": "Analyze Lists", - "step-create-missing-lists": "Create Missing Lists", - "step-update-cards": "Update Cards", - "step-finalize": "Finalize", - "step-delete-duplicate-empty-lists": "Delete Duplicate Empty Lists", - "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane", - "step-restore-lists": "Restore Lists", - "step-restore-cards": "Restore Cards", - "step-restore-swimlanes": "Restore Swimlanes", - "step-fix-missing-ids": "Fix Missing IDs", - "step-scan-users": "Checking board member avatars", - "step-scan-files": "Checking board file attachments", - "step-fix-file-urls": "Fixing file URLs", "cleanup": "Cleanup", "cleanup-old-jobs": "Cleanup Old Jobs", "completed": "Completed", @@ -1570,7 +1466,6 @@ "operation-type": "Operation Type", "overall-progress": "Overall Progress", "page": "Page", - "pause": "Pause", "pause-migration": "Pause Migration", "previous": "Previous", "refresh": "Refresh", @@ -1585,7 +1480,6 @@ "schedule": "Schedule", "search-boards-or-operations": "Search boards or operations...", "show-list-on-minicard": "Show List on Minicard", - "showChecklistAtMinicard": "Show Checklist at Minicard", "showing": "Showing", "start-test-operation": "Start Test Operation", "start-time": "Start Time", @@ -1600,6 +1494,5 @@ "weight": "Weight", "idle": "Idle", "complete": "Complete", - "cron": "Cron", - "current-step": "Current Step" + "cron": "Cron" } diff --git a/imports/i18n/languages.js b/imports/i18n/languages.js index cb5c99e46..3291df95f 100644 --- a/imports/i18n/languages.js +++ b/imports/i18n/languages.js @@ -1,982 +1,824 @@ export default { - "ace": { - code: "ace", - tag: "ace", - name: "Acehnese", - load: () => import('./data/ace.i18n.json'), - rtl: false, - }, "af": { code: "af", tag: "af", name: "Afrikaans", load: () => import('./data/af.i18n.json'), - rtl: false, + rtl: "false", }, "af_ZA": { code: "af", tag: "af_ZA", name: "Afrikaans (South Africa)", load: () => import('./data/af_ZA.i18n.json'), - rtl: false, + rtl: "false", }, "en_AU": { code: "en", tag: "en_AU", name: "English (Australia)", load: () => import('./data/en_AU.i18n.json'), - rtl: false, + rtl: "false", }, "en_ZA": { code: "en", tag: "en_ZA", name: "English (South Africa)", load: () => import('./data/en_ZA.i18n.json'), - rtl: false, + rtl: "false", }, "ar-DZ": { code: "ar", tag: "ar-DZ", name: "دزيرية", load: () => import('./data/ar-DZ.i18n.json'), - rtl: true, + rtl: "true", }, "ar-EG": { code: "ar", tag: "ar-EG", name: "مَصرى", load: () => import('./data/ar-EG.i18n.json'), - rtl: true, + rtl: "true", }, "ar": { code: "ar", tag: "ar", name: "العربية", load: () => import('./data/ar.i18n.json'), - rtl: true, + rtl: "true", }, "ary": { code: "ary", tag: "ary", name: "عربي مغربي", load: () => import('./data/ary.i18n.json'), - rtl: true, + rtl: "true", }, "az-AZ": { code: "az", tag: "az-AZ", name: "Azərbaycan (Azərbaycan)", load: () => import('./data/az-AZ.i18n.json'), - rtl: false, }, "az-LA": { code: "az", tag: "az-LA", name: "Azərbaycan (Latin)", load: () => import('./data/az-LA.i18n.json'), - rtl: false, }, "az": { code: "az", tag: "az", name: "Azərbaycan", load: () => import('./data/az.i18n.json'), - rtl: false, }, "bg": { code: "bg", tag: "bg", name: "Български", load: () => import('./data/bg.i18n.json'), - rtl: false, }, "br": { code: "br", tag: "br", name: "Brezhoneg", load: () => import('./data/br.i18n.json'), - rtl: false, }, "ca": { code: "ca", tag: "ca", - name: "Català", + name: "català", load: () => import('./data/ca.i18n.json'), - rtl: false, }, "ca-ES": { code: "ca", tag: "ca-ES", - name: "Català (Espanya)", + name: "català (Espanya)", load: () => import('./data/ca_ES.i18n.json'), - rtl: false, }, "cmn": { code: "cn", tag: "cnm", name: "官話 / 官话", load: () => import('./data/cmn.i18n.json'), - rtl: false, }, "cs": { code: "cs", tag: "cs", name: "čeština", load: () => import('./data/cs.i18n.json'), - rtl: false, }, "cs-CZ": { code: "cs", tag: "cs-CZ", name: "čeština (Česká republika)", load: () => import('./data/cs-CZ.i18n.json'), - rtl: false, }, "cy-GB": { code: "cy", tag: "cy-GB", name: "Welsh (UK)", load: () => import('./data/cy-GB.i18n.json'), - rtl: false, }, "cy": { code: "cy", tag: "cy", name: "Welsh", load: () => import('./data/cy.i18n.json'), - rtl: false, }, "da": { code: "da", tag: "da", name: "Dansk", load: () => import('./data/da.i18n.json'), - rtl: false, }, "de-AT": { code: "de", tag: "de-AT", name: "Deutsch (Österreich)", load: () => import('./data/de-AT.i18n.json'), - rtl: false, }, "de-CH": { code: "de", tag: "de-CH", name: "Deutsch (Schweiz)", load: () => import('./data/de-CH.i18n.json'), - rtl: false, }, "de-DE": { code: "de", tag: "de-DE", name: "Deutsch (Deutschland)", load: () => import('./data/de_DE.i18n.json'), - rtl: false, }, "de": { code: "de", tag: "de", name: "Deutsch", load: () => import('./data/de.i18n.json'), - rtl: false, }, "el-GR": { code: "el", tag: "el-GR", name: "Ελληνικά (Ελλάδα)", load: () => import('./data/el-GR.i18n.json'), - rtl: false, }, "el": { code: "el", tag: "el", name: "Ελληνικά", load: () => import('./data/el.i18n.json'), - rtl: false, }, "en-BR": { code: "en", tag: "en-BR", name: "English (Brazil)", load: () => import('./data/en-BR.i18n.json'), - rtl: false, }, "en-DE": { code: "en", tag: "en-DE", name: "English (Germany)", load: () => import('./data/en-DE.i18n.json'), - rtl: false, }, "en-GB": { code: "en", tag: "en-GB", name: "English (UK)", load: () => import('./data/en-GB.i18n.json'), - rtl: false, }, "en-IT": { code: "en", tag: "en-IT", name: "English (Italy)", load: () => import('./data/en-IT.i18n.json'), - rtl: false, }, "en-MY": { code: "en", tag: "en-MY", name: "English (Malaysia)", load: () => import('./data/en-MY.i18n.json'), - rtl: false, }, "en-YS": { code: "en", tag: "en-YS", name: "English (Yeshivish)", load: () => import('./data/en-YS.i18n.json'), - rtl: false, }, "en": { code: "en", tag: "en", name: "English", load: () => import('./data/en.i18n.json'), - rtl: false, }, "eo": { code: "eo", tag: "eo", name: "Esperanto", load: () => import('./data/eo.i18n.json'), - rtl: false, }, "ast-ES": { code: "es", tag: "ast-ES", - name: "Español de Asturias", + name: "español de Asturias", load: () => import('./data/ast-ES.i18n.json'), - rtl: false, }, "es-AR": { code: "es", tag: "es-AR", - name: "Español de Argentina", + name: "español de Argentina", load: () => import('./data/es-AR.i18n.json'), - rtl: false, }, "es-CL": { code: "es", tag: "es-CL", - name: "Español de Chile", + name: "español de Chile", load: () => import('./data/es-CL.i18n.json'), - rtl: false, }, "es-CO": { code: "es", tag: "es-CO", - name: "Español en Colombia", + name: "español en Colombia", load: () => import('./data/es-CO.i18n.json'), - rtl: false, }, "es-LA": { code: "es", tag: "es-LA", - name: "Español de América Latina", + name: "español de América Latina", load: () => import('./data/es-LA.i18n.json'), - rtl: false, }, "es-MX": { code: "es", tag: "es-MX", - name: "Español de México", + name: "español de México", load: () => import('./data/es-MX.i18n.json'), - rtl: false, }, "es-PE": { code: "es", tag: "es-PE", - name: "Español de Perú", + name: "español de Perú", load: () => import('./data/es-PE.i18n.json'), - rtl: false, }, "es-PY": { code: "es", tag: "es-PY", - name: "Español de Paraguayo", + name: "español de Paraguayo", load: () => import('./data/es-PY.i18n.json'), - rtl: false, }, "es": { code: "es", tag: "es", - name: "Español", + name: "español", load: () => import('./data/es.i18n.json'), - rtl: false, }, "et-EE": { code: "et", tag: "et-EE", - name: "Eesti keel (Eesti)", + name: "eesti keel (Eesti)", load: () => import('./data/et-EE.i18n.json'), - rtl: false, }, "eu": { code: "eu", tag: "eu", name: "Euskara", load: () => import('./data/eu.i18n.json'), - rtl: false, }, "fa-IR": { code: "fa", tag: "fa-IR", name: "فارسی/پارسی (ایران\u200e)", load: () => import('./data/fa-IR.i18n.json'), - rtl: true, + rtl: "true", }, "fa": { code: "fa", tag: "fa", name: "فارسی", load: () => import('./data/fa.i18n.json'), - rtl: true, + rtl: "true", }, "fi": { code: "fi", tag: "fi", name: "Suomi", load: () => import('./data/fi.i18n.json'), - rtl: false, }, "fr-BE": { code: "fr", tag: "fr-BE", name: "Français (Belgique)", load: () => import('./data/fr-BE.i18n.json'), - rtl: false, }, "fr-CA": { code: "fr", tag: "fr-CA", name: "Français (Canada)", load: () => import('./data/fr-CA.i18n.json'), - rtl: false, }, "fr-CH": { code: "fr", tag: "fr-CH", name: "Français (Schweiz)", load: () => import('./data/fr-CH.i18n.json'), - rtl: false, }, "fr": { code: "fr", tag: "fr", name: "Français", load: () => import('./data/fr.i18n.json'), - rtl: false, }, "fy-NL": { code: "fy", tag: "fy-NL", name: "Westerlauwersk Frysk (Nederlân)", load: () => import('./data/fy-NL.i18n.json'), - rtl: false, }, "fy": { code: "fy", tag: "fy", name: "Westerlauwersk Frysk", load: () => import('./data/fy.i18n.json'), - rtl: false, }, "gl-ES": { code: "gl", tag: "gl-ES", name: "Galego (España)", load: () => import('./data/gl-ES.i18n.json'), - rtl: false, }, "gl": { code: "gl", tag: "gl", name: "Galego", load: () => import('./data/gl.i18n.json'), - rtl: false, }, "gu-IN": { code: "gu", tag: "gu-IN", name: "ગુજરાતી", load: () => import('./data/gu-IN.i18n.json'), - rtl: false, }, "he-IL": { code: "he", tag: "he-IL", name: "עברית (ישראל)", load: () => import('./data/he-IL.i18n.json'), - rtl: true, + rtl: "true", }, "he": { code: "he", tag: "he", name: "עברית", load: () => import('./data/he.i18n.json'), - rtl: true, + rtl: "true", }, "hi-IN": { code: "hi", tag: "hi-IN", name: "हिंदी (भारत)", load: () => import('./data/hi-IN.i18n.json'), - rtl: false, }, "hi": { code: "hi", tag: "hi", name: "हिन्दी", load: () => import('./data/hi.i18n.json'), - rtl: false, }, "hr": { code: "hr", tag: "hr", name: "Hrvatski", load: () => import('./data/hr.i18n.json'), - rtl: false, }, "hu": { code: "hu", tag: "hu", name: "Magyar", load: () => import('./data/hu.i18n.json'), - rtl: false, }, "hy": { code: "hy", tag: "hy", name: "Հայերեն", load: () => import('./data/hy.i18n.json'), - rtl: false, }, "id": { code: "id", tag: "id", name: "Bahasa Indonesia", load: () => import('./data/id.i18n.json'), - rtl: false, }, "ig": { code: "ig", tag: "ig", name: "Igbo", load: () => import('./data/ig.i18n.json'), - rtl: false, }, "it": { code: "it", tag: "it", name: "Italiano", load: () => import('./data/it.i18n.json'), - rtl: false, }, "ja": { code: "ja", tag: "ja", name: "日本語", load: () => import('./data/ja.i18n.json'), - rtl: false, }, "ja-Hira": { code: "ja", tag: "ja-Hira", name: "平仮名", load: () => import('./data/ja-HI.i18n.json'), - rtl: false, }, "ja-JP": { code: "ja", tag: "ja-JP", name: "日本語(日本)", load: () => import('./data/ja-JP.i18n.json'), - rtl: false, }, "ka": { code: "ka", tag: "ka", name: "ქართული", load: () => import('./data/ka.i18n.json'), - rtl: false, }, "km": { code: "km", tag: "km", name: "ភាសាខ្មែរ", load: () => import('./data/km.i18n.json'), - rtl: false, }, - "km-KH": { - code: "km", - tag: "km_KH", - name: "ខ្មែរ (កម្ពុជា)", - load: () => import('./data/km-KH.i18n.json'), - rtl: false, - }, "ko-KR": { code: "ko", tag: "ko-KR", name: "한국어(한국)", load: () => import('./data/ko-KR.i18n.json'), - rtl: false, }, "ko": { code: "ko", tag: "ko", name: "한국어", load: () => import('./data/ko.i18n.json'), - rtl: false, }, "lt": { code: "lt", tag: "lt", name: "Lietuvių kalba", load: () => import('./data/lt.i18n.json'), - rtl: false, }, "lv": { code: "lv", tag: "lv", - name: "Latviešu valoda", + name: "latviešu valoda", load: () => import('./data/lv.i18n.json'), - rtl: false, }, "mk": { code: "mk", tag: "mk", name: "македонски јазик", load: () => import('./data/mk.i18n.json'), - rtl: false, }, "mn": { code: "mn", tag: "mn", name: "Монгол", load: () => import('./data/mn.i18n.json'), - rtl: false, }, "ms": { code: "ms", tag: "ms", name: "بهاس ملايو", load: () => import('./data/ms.i18n.json'), - rtl: false, // Malesia on nykyään LTR (Latinalainen Rumi) }, "ms-MY": { code: "ms", tag: "ms-MY", name: "بهاس ملايو (Malaysia)", load: () => import('./data/ms-MY.i18n.json'), - rtl: false, }, "nb": { code: "nb", tag: "nb", name: "Norsk bokmål", load: () => import('./data/nb.i18n.json'), - rtl: false, }, "nl-NL": { code: "nl", tag: "nl-NL", name: "Nederlands (Nederland)", load: () => import('./data/nl-NL.i18n.json'), - rtl: false, }, "nl": { code: "nl", tag: "nl", name: "Nederlands", load: () => import('./data/nl.i18n.json'), - rtl: false, }, "oc": { code: "oc", tag: "oc", name: "Occitan", load: () => import('./data/oc.i18n.json'), - rtl: false, }, "or-IN": { code: "or", tag: "or-IN", name: "ଓଡିଆ (ଭାରତ)", load: () => import('./data/or_IN.i18n.json'), - rtl: false, }, "pa": { code: "pa", tag: "pa", name: "ਪੰਜਾਬੀ", load: () => import('./data/pa.i18n.json'), - rtl: false, }, "pl-PL": { code: "pl", tag: "pl-PL", name: "Polski (Polska)", load: () => import('./data/pl-PL.i18n.json'), - rtl: false, }, "pl": { code: "pl", tag: "pl", name: "Polski", load: () => import('./data/pl.i18n.json'), - rtl: false, }, "pt-BR": { code: "pt", tag: "pt-BR", name: "Português do Brasil", load: () => import('./data/pt-BR.i18n.json'), - rtl: false, }, "pt": { code: "pt", tag: "pt", name: "Português", load: () => import('./data/pt.i18n.json'), - rtl: false, }, "pt-PT": { code: "pt", tag: "pt-PT", name: "Português de Portugal", load: () => import('./data/pt-PT.i18n.json'), - rtl: false, }, "ro": { code: "ro", tag: "ro", name: "Română", load: () => import('./data/ro.i18n.json'), - rtl: false, }, "ro-RO": { code: "ro", tag: "ro-RO", name: "Română (România)", load: () => import('./data/ro-RO.i18n.json'), - rtl: false, }, "ru": { code: "ru", tag: "ru", name: "Русский", load: () => import('./data/ru.i18n.json'), - rtl: false, - }, - "ru-RU": { - code: "ru", - tag: "ru_RU", - name: "Русский язык (Россия)", - load: () => import('./data/ru-RU.i18n.json'), - rtl: false, }, "sk": { code: "sk", tag: "sk", name: "Slovenčina", load: () => import('./data/sk.i18n.json'), - rtl: false, }, "sl": { code: "sl", tag: "sl", - name: "Slovenščina", + name: "slovenščina", load: () => import('./data/sl.i18n.json'), - rtl: false, - }, - "sl_SI": { - code: "sl", - tag: "sl_SI", - name: "Slovenščina (slovenija)", - load: () => import('./data/sl_SI.i18n.json'), - rtl: false, }, "sr": { code: "sr", tag: "sr", name: "Српски језик", load: () => import('./data/sr.i18n.json'), - rtl: false, }, "sv": { code: "sv", tag: "sv", name: "Svenska", load: () => import('./data/sv.i18n.json'), - rtl: false, }, "sw": { code: "sw", tag: "sw", name: "Kiswahili", load: () => import('./data/sw.i18n.json'), - rtl: false, }, "ta": { code: "ta", tag: "ta", name: "தமிழ்", load: () => import('./data/ta.i18n.json'), - rtl: false, }, "te-IN": { code: "te", tag: "te_IN", name: "తెలుగు (భారతదేశం)", load: () => import('./data/te-IN.i18n.json'), - rtl: false, }, "th": { code: "th", tag: "th", name: "ไทย", load: () => import('./data/th.i18n.json'), - rtl: false, }, "tlh": { code: "tlh", tag: "tlh", - name: "TlhIngan Hol", + name: "tlhIngan Hol", load: () => import('./data/tlh.i18n.json'), - rtl: false, }, "tr": { code: "tr", tag: "tr", name: "Türkçe", load: () => import('./data/tr.i18n.json'), - rtl: false, }, "ug": { code: "ug", tag: "ug", name: "ئۇيغۇر تىلى", load: () => import('./data/ug.i18n.json'), - rtl: true, }, "uk": { code: "uk", tag: "uk", name: "українська мова", load: () => import('./data/uk.i18n.json'), - rtl: false, }, "uk-UA": { code: "uk", tag: "uk-UA", name: "Українська (Україна)", load: () => import('./data/uk-UA.i18n.json'), - rtl: false, }, "uz-AR": { code: "uz", tag: "uz-AR", - name: "O'zbek (arab)", + name: "o'zbek (arab)", load: () => import('./data/uz-AR.i18n.json'), - rtl: true, }, "uz-LA": { code: "uz", tag: "uz-LA", - name: "O'zbek (lotin)", + name: "o'zbek (lotin)", load: () => import('./data/uz-LA.i18n.json'), - rtl: false, }, "uz-UZ": { code: "uz", tag: "uz-UZ", - name: "O'zbek (O'zbekiston)", + name: "o'zbek (O'zbekiston)", load: () => import('./data/uz-UZ.i18n.json'), - rtl: false, }, "uz": { code: "uz", tag: "uz", - name: "O'zbek", + name: "o'zbek", load: () => import('./data/uz.i18n.json'), - rtl: false, }, "ve-CC": { code: "ve", tag: "ve-CC", - name: "Vèneto", + name: "vèneto", load: () => import('./data/ve-CC.i18n.json'), - rtl: false, }, "ve-PP": { code: "ve", tag: "ve-PP", - name: "Vepsän kelʹ", + name: "vepsän kelʹ", load: () => import('./data/ve-PP.i18n.json'), - rtl: false, }, "ve": { code: "ve", tag: "ve", name: "Tshivenḓa", load: () => import('./data/ve.i18n.json'), - rtl: false, }, "vi-VN": { code: "vi", tag: "vi-VN", name: "Tiếng Việt (Việt Nam)", load: () => import('./data/vi-VN.i18n.json'), - rtl: false, }, "vi": { code: "vi", tag: "vi", name: "Tiếng Việt", load: () => import('./data/vi.i18n.json'), - rtl: false, }, "vl-SS": { code: "vl", tag: "vl-SS", name: "Vlaams", load: () => import('./data/vl-SS.i18n.json'), - rtl: false, }, "vo": { code: "vo", tag: "vo", name: "Volapük", load: () => import('./data/vo.i18n.json'), - rtl: false, }, "wa-RR": { code: "wa", tag: "wa-RR", name: "Wáray-Wáray", load: () => import('./data/wa-RR.i18n.json'), - rtl: false, }, "wa": { code: "wa", tag: "wa", - name: "Walon", + name: "walon", load: () => import('./data/wa.i18n.json'), - rtl: false, }, "wo": { code: "wo", tag: "wo", name: "ولوفل", load: () => import('./data/wo.i18n.json'), - rtl: true, }, "xh": { code: "xh", tag: "xh", - name: "IsiXhosa", + name: "isiXhosa", load: () => import('./data/xh.i18n.json'), - rtl: false, }, "yi": { code: "yi", tag: "yi", name: "ייִדיש, יידיש", load: () => import('./data/yi.i18n.json'), - rtl: true, }, "yo": { code: "yo", tag: "yo", name: "Èdè Yorùbá", load: () => import('./data/yo.i18n.json'), - rtl: false, }, "zgh": { code: "zgh", tag: "zgh", name: "ⵜⴰⵎⴰⵣⵉⵖⵜ ⵜⴰⵏⴰⵡⴰⵢⵜ", load: () => import('./data/zgh.i18n.json'), - rtl: false, // Tifinagh-kirjoitusta kirjoitetaan LTR }, "yue_CN": { code: "yue", tag: "yue_CN", name: "廣東話", load: () => import('./data/yue_CN.i18n.json'), - rtl: false, }, "zh-CN": { code: "zh", tag: "zh-CN", name: "简体中文", load: () => import('./data/zh-CN.i18n.json'), - rtl: false, }, "zh-GB": { code: "zh", tag: "zh-GB", name: "简体中文 GB2312", load: () => import('./data/zh-GB.i18n.json'), - rtl: false, }, "zh-Hans": { code: "zh", tag: "zh-Hans", name: "简化字", load: () => import('./data/zh-Hans.i18n.json'), - rtl: false, }, "zh-Hant": { code: "zh", tag: "zh-Hant", name: "正體字", load: () => import('./data/zh-Hant.i18n.json'), - rtl: false, }, "zh-HK": { code: "zh", tag: "zh-HK", name: "繁体中文(香港)", load: () => import('./data/zh-HK.i18n.json'), - rtl: false, - }, - "zh-SG": { - code: "zh", - tag: "zh-SG", - name: "中文 (新加坡)", - load: () => import('./data/zh_SG.i18n.json'), - rtl: false, }, "zh-TW": { code: "zh", tag: "zh-TW", name: "繁體中文(台灣)", load: () => import('./data/zh-TW.i18n.json'), - rtl: false, }, "zu-ZA": { code: "zu", tag: "zu-ZA", - name: "IsiZulu (Ningizimu Afrika)", + name: "isiZulu (Ningizimu Afrika)", load: () => import('./data/zu-ZA.i18n.json'), - rtl: false, }, "zu": { code: "zu", tag: "zu", - name: "IsiZulu", + name: "isiZulu", load: () => import('./data/zu.i18n.json'), - rtl: false, } }; diff --git a/models/attachments.js b/models/attachments.js index 2c5af186e..ac66c15c4 100644 --- a/models/attachments.js +++ b/models/attachments.js @@ -13,7 +13,6 @@ import FileStoreStrategyFactory, {moveToStorage, rename, STORAGE_NAME_FILESYSTEM // import { STORAGE_NAME_S3 } from '/models/lib/fileStoreStrategy'; import { getAttachmentWithBackwardCompatibility, getAttachmentsWithBackwardCompatibility } from './lib/attachmentBackwardCompatibility'; import AttachmentStorageSettings from './attachmentStorageSettings'; -import { generateUniversalAttachmentUrl, cleanFileUrl } from '/models/lib/universalUrlGenerator'; let attachmentUploadExternalProgram; let attachmentUploadMimeTypes = []; @@ -326,39 +325,4 @@ if (Meteor.isServer) { Attachments.getAttachmentWithBackwardCompatibility = getAttachmentWithBackwardCompatibility; Attachments.getAttachmentsWithBackwardCompatibility = getAttachmentsWithBackwardCompatibility; -// Override the link method to use universal URLs -if (Meteor.isClient) { - // Override the original FilesCollection link method to use universal URLs - // This must override the ostrio:files method to avoid "Match error: Expected plain object" - const originalLink = Attachments.link; - Attachments.link = function(versionName) { - // Accept both direct calls and collection.helpers style calls - const fileRef = this._id ? this : (versionName && versionName._id ? versionName : this); - const version = (typeof versionName === 'string') ? versionName : 'original'; - - if (fileRef && fileRef._id) { - const url = generateUniversalAttachmentUrl(fileRef._id, version); - if (process.env.DEBUG === 'true') { - console.log('Attachment link generated:', url, 'for ID:', fileRef._id); - } - return url; - } - // Fallback to original if somehow we don't have an ID - return originalLink ? originalLink.call(this, versionName) : ''; - }; - - // Also add as collection helper for document instances - Attachments.collection.helpers({ - link(version) { - // Handle both no-argument and string argument cases - const ver = (typeof version === 'string') ? version : 'original'; - const url = generateUniversalAttachmentUrl(this._id, ver); - if (process.env.DEBUG === 'true') { - console.log('Attachment link (helper) generated:', url, 'for ID:', this._id); - } - return url; - } - }); -} - export default Attachments; diff --git a/models/avatars.js b/models/avatars.js index da3033bc8..065728322 100644 --- a/models/avatars.js +++ b/models/avatars.js @@ -8,7 +8,6 @@ import { TAPi18n } from '/imports/i18n'; import fs from 'fs'; import path from 'path'; import FileStoreStrategyFactory, { FileStoreStrategyFilesystem, FileStoreStrategyGridFs, STORAGE_NAME_FILESYSTEM } from '/models/lib/fileStoreStrategy'; -import { generateUniversalAvatarUrl, cleanFileUrl } from '/models/lib/universalUrlGenerator'; const filesize = require('filesize'); @@ -44,7 +43,7 @@ if (Meteor.isServer) { storagePath = path.join(process.env.WRITABLE_PATH || process.cwd(), 'avatars'); } -export const fileStoreStrategyFactory = new FileStoreStrategyFactory(FileStoreStrategyFilesystem, storagePath, FileStoreStrategyGridFs, avatarsBucket); +const fileStoreStrategyFactory = new FileStoreStrategyFactory(FileStoreStrategyFilesystem, storagePath, FileStoreStrategyGridFs, avatarsBucket); Avatars = new FilesCollection({ debug: false, // Change to `true` for debugging @@ -117,9 +116,7 @@ Avatars = new FilesCollection({ const isValid = Promise.await(isFileValid(fileObj, avatarsUploadMimeTypes, avatarsUploadSize, avatarsUploadExternalProgram)); if (isValid) { - // Set avatar URL using universal URL generator (URL-agnostic) - const universalUrl = generateUniversalAvatarUrl(fileObj._id); - ReactiveCache.getUser(fileObj.userId).setAvatarUrl(universalUrl); + ReactiveCache.getUser(fileObj.userId).setAvatarUrl(`${formatFleURL(fileObj)}?auth=false&brokenIsFine=true`); } else { Avatars.remove(fileObj._id); } @@ -167,15 +164,4 @@ if (Meteor.isServer) { }); } -// Override the link method to use universal URLs -if (Meteor.isClient) { - // Add custom link method to avatar documents - Avatars.collection.helpers({ - link(version = 'original') { - // Use universal URL generator for consistent, URL-agnostic URLs - return generateUniversalAvatarUrl(this._id, version); - } - }); -} - export default Avatars; diff --git a/models/boards.js b/models/boards.js index 8fe525843..1ff0b0fb4 100644 --- a/models/boards.js +++ b/models/boards.js @@ -9,7 +9,6 @@ import { TYPE_TEMPLATE_CONTAINER, } from '/config/const'; import Users from "./users"; -import TableVisibilityModeSettings from "./tableVisibilityModeSettings"; // const escapeForRegex = require('escape-string-regexp'); @@ -226,34 +225,6 @@ Boards.attachSchema( type: Boolean, optional: true, }, - 'members.$.isNormalAssignedOnly': { - /** - * Is the member only allowed to see assigned cards (Normal permission) - */ - type: Boolean, - optional: true, - }, - 'members.$.isCommentAssignedOnly': { - /** - * Is the member only allowed to comment on assigned cards - */ - type: Boolean, - optional: true, - }, - 'members.$.isReadOnly': { - /** - * Is the member only allowed to read the board (no comments, no editing) - */ - type: Boolean, - optional: true, - }, - 'members.$.isReadAssignedOnly': { - /** - * Is the member only allowed to read assigned cards (no comments, no editing) - */ - type: Boolean, - optional: true, - }, permission: { /** * visibility of the board @@ -570,14 +541,6 @@ Boards.attachSchema( defaultValue: false, }, - allowsChecklistAtMinicard: { - /** - * Does the board allow showing checklists on all minicards? - */ - type: Boolean, - defaultValue: false, - }, - allowsReceivedDate: { /** * Does the board allows received date? @@ -1016,44 +979,6 @@ Boards.helpers({ }); }, - hasNormalAssignedOnly(memberId) { - return !!_.findWhere(this.members, { - userId: memberId, - isActive: true, - isAdmin: false, - isNormalAssignedOnly: true, - isCommentAssignedOnly: false, - }); - }, - - hasCommentAssignedOnly(memberId) { - return !!_.findWhere(this.members, { - userId: memberId, - isActive: true, - isAdmin: false, - isNormalAssignedOnly: false, - isCommentAssignedOnly: true, - }); - }, - - hasReadOnly(memberId) { - return !!_.findWhere(this.members, { - userId: memberId, - isActive: true, - isAdmin: false, - isReadOnly: true, - }); - }, - - hasReadAssignedOnly(memberId) { - return !!_.findWhere(this.members, { - userId: memberId, - isActive: true, - isAdmin: false, - isReadAssignedOnly: true, - }); - }, - hasAnyAllowsDate() { const ret = this.allowsReceivedDate || this.allowsStartDate || this.allowsDueDate || this.allowsEndDate; return ret; @@ -1491,10 +1416,6 @@ Boards.mutations({ isNoComments: false, isCommentOnly: false, isWorker: false, - isNormalAssignedOnly: false, - isCommentAssignedOnly: false, - isReadOnly: false, - isReadAssignedOnly: false, }, }, }; @@ -1528,10 +1449,6 @@ Boards.mutations({ isNoComments, isCommentOnly, isWorker, - isNormalAssignedOnly = false, - isCommentAssignedOnly = false, - isReadOnly = false, - isReadAssignedOnly = false, currentUserId = Meteor.userId(), ) { const memberIndex = this.memberIndex(memberId); @@ -1546,10 +1463,6 @@ Boards.mutations({ [`members.${memberIndex}.isNoComments`]: isNoComments, [`members.${memberIndex}.isCommentOnly`]: isCommentOnly, [`members.${memberIndex}.isWorker`]: isWorker, - [`members.${memberIndex}.isNormalAssignedOnly`]: isNormalAssignedOnly, - [`members.${memberIndex}.isCommentAssignedOnly`]: isCommentAssignedOnly, - [`members.${memberIndex}.isReadOnly`]: isReadOnly, - [`members.${memberIndex}.isReadAssignedOnly`]: isReadAssignedOnly, }, }; }, @@ -1586,10 +1499,6 @@ Boards.mutations({ return { $set: { allowsShowListsOnMinicard } }; }, - setAllowsChecklistAtMinicard(allowsChecklistAtMinicard) { - return { $set: { allowsChecklistAtMinicard } }; - }, - setAllowsRequestedBy(allowsRequestedBy) { return { $set: { allowsRequestedBy } }; }, @@ -1793,18 +1702,7 @@ Boards.labelColors = () => { if (Meteor.isServer) { Boards.allow({ - insert(userId, doc) { - // Check if user is logged in - if (!userId) return false; - - // If allowPrivateOnly is enabled, only allow private boards - const allowPrivateOnly = TableVisibilityModeSettings.findOne('tableVisibilityMode-allowPrivateOnly')?.booleanValue; - if (allowPrivateOnly && doc.permission === 'public') { - return false; - } - - return true; - }, + insert: Meteor.userId, update: allowIsBoardAdmin, remove: allowIsBoardAdmin, fetch: ['members'], @@ -1813,10 +1711,9 @@ if (Meteor.isServer) { // All logged in users are allowed to reorder boards by dragging at All Boards page and Public Boards page. Boards.allow({ update(userId, board, fieldNames) { - return canUpdateBoardSort(userId, board, fieldNames); + return _.contains(fieldNames, 'sort'); }, - // Need members to verify membership in policy - fetch: ['members'], + fetch: [], }); // The number of users that have starred this board is managed by trusted code @@ -1854,21 +1751,6 @@ if (Meteor.isServer) { fetch: ['members'], }); - // Deny changing permission to public if allowPrivateOnly is enabled - Boards.deny({ - update(userId, doc, fieldNames, modifier) { - if (!_.contains(fieldNames, 'permission')) return false; - - const allowPrivateOnly = TableVisibilityModeSettings.findOne('tableVisibilityMode-allowPrivateOnly')?.booleanValue; - if (allowPrivateOnly && modifier.$set && modifier.$set.permission === 'public') { - return true; - } - - return false; - }, - fetch: [], - }); - Meteor.methods({ getBackgroundImageURL(boardId) { check(boardId, String); @@ -2313,8 +2195,6 @@ if (Meteor.isServer) { JsonRoutes.add('POST', '/api/boards', function(req, res) { try { Authentication.checkLoggedIn(req.userId); - const allowPrivateOnly = TableVisibilityModeSettings.findOne('tableVisibilityMode-allowPrivateOnly')?.booleanValue; - const permission = allowPrivateOnly ? 'private' : (req.body.permission || 'private'); const id = Boards.insert({ title: req.body.title, members: [ @@ -2327,7 +2207,7 @@ if (Meteor.isServer) { isWorker: req.body.isWorker || false, }, ], - permission, + permission: req.body.permission || 'private', color: req.body.color || 'belize', migrationVersion: 1, // Latest version - no migration needed }); @@ -2420,7 +2300,7 @@ if (Meteor.isServer) { */ JsonRoutes.add('PUT', '/api/boards/:boardId/labels', function(req, res) { const id = req.params.boardId; - Authentication.checkBoardWriteAccess(req.userId, id); + Authentication.checkBoardAccess(req.userId, id); try { if (req.body.hasOwnProperty('label')) { const board = ReactiveCache.getBoard(id); @@ -2491,10 +2371,6 @@ JsonRoutes.add('POST', '/api/boards/:boardId/copy', function(req, res) { * @param {boolean} isNoComments NoComments capability * @param {boolean} isCommentOnly CommentsOnly capability * @param {boolean} isWorker Worker capability - * @param {boolean} isNormalAssignedOnly NormalAssignedOnly capability - * @param {boolean} isCommentAssignedOnly CommentAssignedOnly capability - * @param {boolean} isReadOnly ReadOnly capability - * @param {boolean} isReadAssignedOnly ReadAssignedOnly capability */ JsonRoutes.add('POST', '/api/boards/:boardId/members/:memberId', function( req, @@ -2504,7 +2380,7 @@ JsonRoutes.add('POST', '/api/boards/:boardId/copy', function(req, res) { Authentication.checkUserId(req.userId); const boardId = req.params.boardId; const memberId = req.params.memberId; - const { isAdmin, isNoComments, isCommentOnly, isWorker, isNormalAssignedOnly, isCommentAssignedOnly, isReadOnly, isReadAssignedOnly } = req.body; + const { isAdmin, isNoComments, isCommentOnly, isWorker } = req.body; const board = ReactiveCache.getBoard(boardId); function isTrue(data) { try { @@ -2519,10 +2395,6 @@ JsonRoutes.add('POST', '/api/boards/:boardId/copy', function(req, res) { isTrue(isNoComments), isTrue(isCommentOnly), isTrue(isWorker), - isTrue(isNormalAssignedOnly), - isTrue(isCommentAssignedOnly), - isTrue(isReadOnly), - isTrue(isReadAssignedOnly), req.userId, ); diff --git a/models/cardComments.js b/models/cardComments.js index 2c891909b..b3c3a969e 100644 --- a/models/cardComments.js +++ b/models/cardComments.js @@ -313,7 +313,8 @@ if (Meteor.isServer) { * * @param {string} boardId the board ID of the card * @param {string} cardId the ID of the card - * @param {string} comment the content of the comment + * @param {string} authorId the user who 'posted' the comment + * @param {string} text the content of the comment * @return_type {_id: string} */ JsonRoutes.add( @@ -325,7 +326,7 @@ if (Meteor.isServer) { const paramCardId = req.params.cardId; Authentication.checkBoardAccess(req.userId, paramBoardId); const id = CardComments.direct.insert({ - userId: req.userId, + userId: req.body.authorId, text: req.body.comment, cardId: paramCardId, boardId: paramBoardId, @@ -343,7 +344,7 @@ if (Meteor.isServer) { cardId: paramCardId, boardId: paramBoardId, }); - commentCreation(req.userId, cardComment); + commentCreation(req.body.authorId, cardComment); } catch (error) { JsonRoutes.sendResult(res, { code: 200, diff --git a/models/cards.js b/models/cards.js index d5bbb8bec..1959e5de3 100644 --- a/models/cards.js +++ b/models/cards.js @@ -497,6 +497,13 @@ Cards.attachSchema( type: Boolean, defaultValue: false, }, + hideFinishedChecklistIfItemsAreHidden: { + /** + * hide completed checklist? + */ + type: Boolean, + optional: true, + }, showListOnMinicard: { /** * show list name on minicard? @@ -505,40 +512,21 @@ Cards.attachSchema( optional: true, defaultValue: false, }, - showChecklistAtMinicard: { - /** - * show checklist on minicard? - */ - type: Boolean, - optional: true, - defaultValue: false, - }, }), ); -// Centralized update policy for Cards -// Security: deny any direct client updates to 'vote' fields; require membership otherwise -canUpdateCard = function(userId, doc, fields) { - if (!userId) return false; - const fieldNames = fields || []; - // Block direct updates to voting fields; voting must go through Meteor method 'cards.vote' - if (_.some(fieldNames, f => typeof f === 'string' && (f === 'vote' || f.indexOf('vote.') === 0))) { - return false; - } - // Block direct updates to poker fields; poker must go through Meteor methods - if (_.some(fieldNames, f => typeof f === 'string' && (f === 'poker' || f.indexOf('poker.') === 0))) { - return false; - } - return allowIsBoardMember(userId, ReactiveCache.getBoard(doc.boardId)); -}; - Cards.allow({ insert(userId, doc) { return allowIsBoardMember(userId, ReactiveCache.getBoard(doc.boardId)); }, update(userId, doc, fields) { - return canUpdateCard(userId, doc, fields); + // Allow board members or logged in users if only vote get's changed + return ( + allowIsBoardMember(userId, ReactiveCache.getBoard(doc.boardId)) || + (_.isEqual(fields, ['vote', 'modifiedAt', 'dateLastActivity']) && + !!userId) + ); }, remove(userId, doc) { return allowIsBoardMember(userId, ReactiveCache.getBoard(doc.boardId)); @@ -2019,8 +2007,8 @@ Cards.mutations({ }; }, - moveToEndOfList({ listId, swimlaneId } = {}) { - swimlaneId = swimlaneId || this.swimlaneId; + moveToEndOfList({ listId } = {}) { + let swimlaneId = this.swimlaneId; const boardId = this.boardId; let sortIndex = 0; @@ -2031,7 +2019,7 @@ Cards.mutations({ swimlaneId = board.getDefaultSwimline()._id; } // Move the minicard to the end of the target list - let parentElementDom = $(`#swimlane-${swimlaneId}`).get(0); + let parentElementDom = $(`#swimlane-${this.swimlaneId}`).get(0); if (!parentElementDom) parentElementDom = $(':root'); const lastCardDom = $(parentElementDom) @@ -2062,14 +2050,6 @@ Cards.mutations({ }, move(boardId, swimlaneId, listId, sort = null) { - // Capture previous state for history tracking - const previousState = { - boardId: this.boardId, - swimlaneId: this.swimlaneId, - listId: this.listId, - sort: this.sort, - }; - const mutatedFields = { boardId, swimlaneId, @@ -2116,50 +2096,6 @@ Cards.mutations({ Cards.update(this._id, { $set: mutatedFields, }); - - // Track position change in user history (server-side only) - if (Meteor.isServer && Meteor.userId() && typeof UserPositionHistory !== 'undefined') { - try { - UserPositionHistory.trackChange({ - userId: Meteor.userId(), - boardId: this.boardId, - entityType: 'card', - entityId: this._id, - actionType: 'move', - previousState, - newState: { - boardId, - swimlaneId, - listId, - sort: sort !== null ? sort : this.sort, - }, - }); - } catch (e) { - console.warn('Failed to track card move in history:', e); - } - } - - // Ensure attachments follow the card to its new board/list/swimlane - if (Meteor.isServer) { - const updateMeta = {}; - if (mutatedFields.boardId !== undefined) updateMeta['meta.boardId'] = mutatedFields.boardId; - if (mutatedFields.listId !== undefined) updateMeta['meta.listId'] = mutatedFields.listId; - if (mutatedFields.swimlaneId !== undefined) updateMeta['meta.swimlaneId'] = mutatedFields.swimlaneId; - - if (Object.keys(updateMeta).length > 0) { - try { - Attachments.collection.update( - { 'meta.cardId': this._id }, - { $set: updateMeta }, - { multi: true }, - ); - } catch (err) { - // Do not block the move if attachment update fails - // eslint-disable-next-line no-console - console.error('Failed to update attachments metadata after moving card', this._id, err); - } - } - } }, addLabel(labelId) { @@ -2298,10 +2234,10 @@ Cards.mutations({ }; }, - toggleShowChecklistAtMinicard() { + toggleHideFinishedChecklist() { return { $set: { - showChecklistAtMinicard: !this.showChecklistAtMinicard, + hideFinishedChecklistIfItemsAreHidden: !this.hideFinishedChecklistIfItemsAreHidden, } }; }, @@ -3169,273 +3105,6 @@ const addCronJob = _.debounce( if (Meteor.isServer) { Meteor.methods({ - // Secure poker voting: only the caller's userId is modified - 'cards.pokerVote'(cardId, state) { - check(cardId, String); - if (state !== undefined && state !== null) check(state, String); - if (!this.userId) throw new Meteor.Error('not-authorized'); - - const card = ReactiveCache.getCard(cardId) || Cards.findOne(cardId); - if (!card) throw new Meteor.Error('not-found'); - const board = ReactiveCache.getBoard(card.boardId) || Boards.findOne(card.boardId); - if (!board) throw new Meteor.Error('not-found'); - - const isMember = allowIsBoardMember(this.userId, board); - const allowNBM = !!(card.poker && card.poker.allowNonBoardMembers); - if (!(isMember || allowNBM /* && board.permission === 'public' */)) { - throw new Meteor.Error('not-authorized'); - } - - let mod = card.setPoker(this.userId, state); - if (!mod || typeof mod !== 'object') mod = {}; - mod.$set = Object.assign({}, mod.$set, { modifiedAt: new Date(), dateLastActivity: new Date() }); - return Cards.update({ _id: cardId }, mod); - }, - - // Configure planning poker on a card (members only) - 'cards.setPokerQuestion'(cardId, question, allowNonBoardMembers) { - check(cardId, String); - check(question, Boolean); - check(allowNonBoardMembers, Boolean); - if (!this.userId) throw new Meteor.Error('not-authorized'); - - const card = ReactiveCache.getCard(cardId) || Cards.findOne(cardId); - if (!card) throw new Meteor.Error('not-found'); - const board = ReactiveCache.getBoard(card.boardId) || Boards.findOne(card.boardId); - if (!allowIsBoardMember(this.userId, board)) throw new Meteor.Error('not-authorized'); - - const modifier = { - $set: { - poker: { - question, - allowNonBoardMembers, - one: [], two: [], three: [], five: [], eight: [], thirteen: [], twenty: [], forty: [], oneHundred: [], unsure: [], - }, - modifiedAt: new Date(), - dateLastActivity: new Date(), - }, - }; - return Cards.update({ _id: cardId }, modifier); - }, - - 'cards.setPokerEnd'(cardId, end) { - check(cardId, String); - check(end, Date); - if (!this.userId) throw new Meteor.Error('not-authorized'); - - const card = ReactiveCache.getCard(cardId) || Cards.findOne(cardId); - if (!card) throw new Meteor.Error('not-found'); - const board = ReactiveCache.getBoard(card.boardId) || Boards.findOne(card.boardId); - if (!allowIsBoardMember(this.userId, board)) throw new Meteor.Error('not-authorized'); - - const modifier = { - $set: { 'poker.end': end, modifiedAt: new Date(), dateLastActivity: new Date() }, - }; - return Cards.update({ _id: cardId }, modifier); - }, - - 'cards.unsetPokerEnd'(cardId) { - check(cardId, String); - if (!this.userId) throw new Meteor.Error('not-authorized'); - - const card = ReactiveCache.getCard(cardId) || Cards.findOne(cardId); - if (!card) throw new Meteor.Error('not-found'); - const board = ReactiveCache.getBoard(card.boardId) || Boards.findOne(card.boardId); - if (!allowIsBoardMember(this.userId, board)) throw new Meteor.Error('not-authorized'); - - const modifier = { - $unset: { 'poker.end': '' }, - $set: { modifiedAt: new Date(), dateLastActivity: new Date() }, - }; - return Cards.update({ _id: cardId }, modifier); - }, - - 'cards.unsetPoker'(cardId) { - check(cardId, String); - if (!this.userId) throw new Meteor.Error('not-authorized'); - - const card = ReactiveCache.getCard(cardId) || Cards.findOne(cardId); - if (!card) throw new Meteor.Error('not-found'); - const board = ReactiveCache.getBoard(card.boardId) || Boards.findOne(card.boardId); - if (!allowIsBoardMember(this.userId, board)) throw new Meteor.Error('not-authorized'); - - const modifier = { - $unset: { poker: '' }, - $set: { modifiedAt: new Date(), dateLastActivity: new Date() }, - }; - return Cards.update({ _id: cardId }, modifier); - }, - - 'cards.setPokerEstimation'(cardId, estimation) { - check(cardId, String); - check(estimation, Number); - if (!this.userId) throw new Meteor.Error('not-authorized'); - - const card = ReactiveCache.getCard(cardId) || Cards.findOne(cardId); - if (!card) throw new Meteor.Error('not-found'); - const board = ReactiveCache.getBoard(card.boardId) || Boards.findOne(card.boardId); - if (!allowIsBoardMember(this.userId, board)) throw new Meteor.Error('not-authorized'); - - const modifier = { - $set: { 'poker.estimation': estimation, modifiedAt: new Date(), dateLastActivity: new Date() }, - }; - return Cards.update({ _id: cardId }, modifier); - }, - - 'cards.unsetPokerEstimation'(cardId) { - check(cardId, String); - if (!this.userId) throw new Meteor.Error('not-authorized'); - - const card = ReactiveCache.getCard(cardId) || Cards.findOne(cardId); - if (!card) throw new Meteor.Error('not-found'); - const board = ReactiveCache.getBoard(card.boardId) || Boards.findOne(card.boardId); - if (!allowIsBoardMember(this.userId, board)) throw new Meteor.Error('not-authorized'); - - const modifier = { - $unset: { 'poker.estimation': '' }, - $set: { modifiedAt: new Date(), dateLastActivity: new Date() }, - }; - return Cards.update({ _id: cardId }, modifier); - }, - - 'cards.replayPoker'(cardId) { - check(cardId, String); - if (!this.userId) throw new Meteor.Error('not-authorized'); - - const card = ReactiveCache.getCard(cardId) || Cards.findOne(cardId); - if (!card) throw new Meteor.Error('not-found'); - const board = ReactiveCache.getBoard(card.boardId) || Boards.findOne(card.boardId); - if (!allowIsBoardMember(this.userId, board)) throw new Meteor.Error('not-authorized'); - - // Reset all poker votes arrays - const modifier = { - $set: { - 'poker.one': [], 'poker.two': [], 'poker.three': [], 'poker.five': [], 'poker.eight': [], 'poker.thirteen': [], 'poker.twenty': [], 'poker.forty': [], 'poker.oneHundred': [], 'poker.unsure': [], - modifiedAt: new Date(), - dateLastActivity: new Date(), - }, - $unset: { 'poker.end': '' }, - }; - return Cards.update({ _id: cardId }, modifier); - }, - // Configure voting on a card (members only) - 'cards.setVoteQuestion'(cardId, question, publicVote, allowNonBoardMembers) { - check(cardId, String); - check(question, String); - check(publicVote, Boolean); - check(allowNonBoardMembers, Boolean); - if (!this.userId) throw new Meteor.Error('not-authorized'); - - const card = ReactiveCache.getCard(cardId) || Cards.findOne(cardId); - if (!card) throw new Meteor.Error('not-found'); - const board = ReactiveCache.getBoard(card.boardId) || Boards.findOne(card.boardId); - if (!allowIsBoardMember(this.userId, board)) throw new Meteor.Error('not-authorized'); - - const modifier = { - $set: { - vote: { - question, - public: publicVote, - allowNonBoardMembers, - positive: [], - negative: [], - }, - modifiedAt: new Date(), - dateLastActivity: new Date(), - }, - }; - return Cards.update({ _id: cardId }, modifier); - }, - - 'cards.setVoteEnd'(cardId, end) { - check(cardId, String); - check(end, Date); - if (!this.userId) throw new Meteor.Error('not-authorized'); - - const card = ReactiveCache.getCard(cardId) || Cards.findOne(cardId); - if (!card) throw new Meteor.Error('not-found'); - const board = ReactiveCache.getBoard(card.boardId) || Boards.findOne(card.boardId); - if (!allowIsBoardMember(this.userId, board)) throw new Meteor.Error('not-authorized'); - - const modifier = { - $set: { 'vote.end': end, modifiedAt: new Date(), dateLastActivity: new Date() }, - }; - return Cards.update({ _id: cardId }, modifier); - }, - - 'cards.unsetVoteEnd'(cardId) { - check(cardId, String); - if (!this.userId) throw new Meteor.Error('not-authorized'); - - const card = ReactiveCache.getCard(cardId) || Cards.findOne(cardId); - if (!card) throw new Meteor.Error('not-found'); - const board = ReactiveCache.getBoard(card.boardId) || Boards.findOne(card.boardId); - if (!allowIsBoardMember(this.userId, board)) throw new Meteor.Error('not-authorized'); - - const modifier = { - $unset: { 'vote.end': '' }, - $set: { modifiedAt: new Date(), dateLastActivity: new Date() }, - }; - return Cards.update({ _id: cardId }, modifier); - }, - - 'cards.unsetVote'(cardId) { - check(cardId, String); - if (!this.userId) throw new Meteor.Error('not-authorized'); - - const card = ReactiveCache.getCard(cardId) || Cards.findOne(cardId); - if (!card) throw new Meteor.Error('not-found'); - const board = ReactiveCache.getBoard(card.boardId) || Boards.findOne(card.boardId); - if (!allowIsBoardMember(this.userId, board)) throw new Meteor.Error('not-authorized'); - - const modifier = { - $unset: { vote: '' }, - $set: { modifiedAt: new Date(), dateLastActivity: new Date() }, - }; - return Cards.update({ _id: cardId }, modifier); - }, - // Secure voting: only the caller can set/unset their vote; non-members can vote only when allowed - 'cards.vote'(cardId, forIt) { - check(cardId, String); - // forIt may be true (upvote), false (downvote), or null/undefined (clear) - if (forIt !== undefined && forIt !== null) check(forIt, Boolean); - if (!this.userId) throw new Meteor.Error('not-authorized'); - - const card = ReactiveCache.getCard(cardId) || Cards.findOne(cardId); - if (!card) throw new Meteor.Error('not-found'); - const board = ReactiveCache.getBoard(card.boardId) || Boards.findOne(card.boardId); - if (!board) throw new Meteor.Error('not-found'); - - const isMember = allowIsBoardMember(this.userId, board); - const allowNBM = !!(card.vote && card.vote.allowNonBoardMembers); - if (!(isMember || allowNBM /* && board.permission === 'public' */)) { - throw new Meteor.Error('not-authorized'); - } - - // Only modify the caller's own userId in vote arrays - let modifier; - if (forIt === true) { - modifier = { - $pull: { 'vote.negative': this.userId }, - $addToSet: { 'vote.positive': this.userId }, - $set: { modifiedAt: new Date(), dateLastActivity: new Date() }, - }; - } else if (forIt === false) { - modifier = { - $pull: { 'vote.positive': this.userId }, - $addToSet: { 'vote.negative': this.userId }, - $set: { modifiedAt: new Date(), dateLastActivity: new Date() }, - }; - } else { - // Clear vote - modifier = { - $pull: { 'vote.positive': this.userId, 'vote.negative': this.userId }, - $set: { modifiedAt: new Date(), dateLastActivity: new Date() }, - }; - } - - return Cards.update({ _id: cardId }, modifier); - }, /** copies a card * <li> this method is needed on the server because attachments can only be copied on the server (access to file system) * @param card id to copy @@ -3937,7 +3606,7 @@ JsonRoutes.add('GET', '/api/boards/:boardId/cards_count', function( const newSwimlaneId = req.body.newSwimlaneId; const newListId = req.body.newListId; let updated = false; - Authentication.checkBoardWriteAccess(req.userId, paramBoardId); + Authentication.checkBoardAccess(req.userId, paramBoardId); if (req.body.title) { // Basic client-side validation - server will handle full sanitization @@ -4293,37 +3962,6 @@ JsonRoutes.add('GET', '/api/boards/:boardId/cards_count', function( ); } if (newBoardId && newSwimlaneId && newListId) { - // Validate destination board write access - Authentication.checkBoardWriteAccess(req.userId, newBoardId); - - // Validate that the destination list exists and belongs to the destination board - const destList = ReactiveCache.getList({ - _id: newListId, - boardId: newBoardId, - archived: false, - }); - if (!destList) { - JsonRoutes.sendResult(res, { - code: 404, - data: { error: 'Destination list not found or does not belong to destination board' }, - }); - return; - } - - // Validate that the destination swimlane exists and belongs to the destination board - const destSwimlane = ReactiveCache.getSwimlane({ - _id: newSwimlaneId, - boardId: newBoardId, - archived: false, - }); - if (!destSwimlane) { - JsonRoutes.sendResult(res, { - code: 404, - data: { error: 'Destination swimlane not found or does not belong to destination board' }, - }); - return; - } - // Move the card to the new board, swimlane, and list Cards.direct.update( { @@ -4410,7 +4048,7 @@ JsonRoutes.add('GET', '/api/boards/:boardId/cards_count', function( const paramBoardId = req.params.boardId; const paramListId = req.params.listId; const paramCardId = req.params.cardId; - Authentication.checkBoardWriteAccess(req.userId, paramBoardId); + Authentication.checkBoardAccess(req.userId, paramBoardId); const card = ReactiveCache.getCard(paramCardId); Cards.direct.remove({ @@ -4486,7 +4124,7 @@ JsonRoutes.add('GET', '/api/boards/:boardId/cards_count', function( const paramListId = req.params.listId; const paramCustomFieldId = req.params.customFieldId; const paramCustomFieldValue = req.body.value; - Authentication.checkBoardWriteAccess(req.userId, paramBoardId); + Authentication.checkBoardAccess(req.userId, paramBoardId); const card = ReactiveCache.getCard({ _id: paramCardId, listId: paramListId, @@ -4524,83 +4162,6 @@ JsonRoutes.add('GET', '/api/boards/:boardId/cards_count', function( }); }, ); - - /** - * @operation archive_card - * @summary Archive a card - * - * @description Archive a card - * @param {string} boardId the board ID of the card - * @param {string} listId the list ID of the card - * @param {string} cardId the ID of the card - * @return_type {_id: string, archived: boolean, archivedAt: Date} - */ - JsonRoutes.add( - 'POST', - '/api/boards/:boardId/lists/:listId/cards/:cardId/archive', - function(req, res) { - const paramBoardId = req.params.boardId; - const paramCardId = req.params.cardId; - const paramListId = req.params.listId; - Authentication.checkBoardWriteAccess(req.userId, paramBoardId); - const card = ReactiveCache.getCard({ - _id: paramCardId, - listId: paramListId, - boardId: paramBoardId, - archived: false, - }); - if (!card) { - throw new Meteor.Error(404, 'Card not found'); - } - card.archive(); - JsonRoutes.sendResult(res, { - code: 200, - data: { - _id: paramCardId, - archived: true, - archivedAt: new Date(), - }, - }); - }, - ); - - /** - * @operation unarchive_card - * @summary Unarchive card - * - * @description Unarchive card - * @param {string} boardId the board ID of the card - * @param {string} listId the list ID of the card - * @param {string} cardId the ID of the card - * @return_type {_id: string, archived: boolean} - */ - JsonRoutes.add( - 'POST', - '/api/boards/:boardId/lists/:listId/cards/:cardId/unarchive', - function(req, res) { - const paramBoardId = req.params.boardId; - const paramCardId = req.params.cardId; - const paramListId = req.params.listId; - Authentication.checkBoardWriteAccess(req.userId, paramBoardId); - const card = ReactiveCache.getCard({ - _id: paramCardId, - listId: paramListId, - boardId: paramBoardId, - archived: true, - }); - if (!card) { - throw new Meteor.Error(404, 'Card not found'); - } - card.restore(); - JsonRoutes.sendResult(res, { - code: 200, - data: { - _id: paramCardId, - archived: false, - }, - }); - }, - ); } // Position history tracking methods diff --git a/models/checklists.js b/models/checklists.js index 40a348ba5..d30dcc1be 100644 --- a/models/checklists.js +++ b/models/checklists.js @@ -77,13 +77,6 @@ Checklists.attachSchema( type: Boolean, optional: true, }, - showChecklistAtMinicard: { - /** - * show this checklist on minicard? - */ - type: Boolean, - defaultValue: false, - }, }), ); @@ -196,9 +189,26 @@ Checklists.mutations({ * @param newCardId move the checklist to this cardId */ move(newCardId) { - // Note: Activities and ChecklistItems updates are now handled server-side - // in the moveChecklist Meteor method to avoid client-side permission issues - + // update every activity + ReactiveCache.getActivities( + {checklistId: this._id} + ).forEach(activity => { + Activities.update(activity._id, { + $set: { + cardId: newCardId, + }, + }); + }); + // update every checklist-item + ReactiveCache.getChecklistItems( + {checklistId: this._id} + ).forEach(checklistItem => { + ChecklistItems.update(checklistItem._id, { + $set: { + cardId: newCardId, + }, + }); + }); // update the checklist itself return { $set: { @@ -220,69 +230,9 @@ Checklists.mutations({ } }; }, - toggleShowChecklistAtMinicard() { - return { - $set: { - showChecklistAtMinicard: !this.showChecklistAtMinicard, - } - }; - }, }); if (Meteor.isServer) { - Meteor.methods({ - moveChecklist(checklistId, newCardId) { - check(checklistId, String); - check(newCardId, String); - - const checklist = ReactiveCache.getChecklist(checklistId); - if (!checklist) { - throw new Meteor.Error('checklist-not-found', 'Checklist not found'); - } - - const newCard = ReactiveCache.getCard(newCardId); - if (!newCard) { - throw new Meteor.Error('card-not-found', 'Target card not found'); - } - - // Check permissions on both source and target cards - const sourceCard = ReactiveCache.getCard(checklist.cardId); - if (!allowIsBoardMemberByCard(this.userId, sourceCard)) { - throw new Meteor.Error('not-authorized', 'Not authorized to move checklist from source card'); - } - if (!allowIsBoardMemberByCard(this.userId, newCard)) { - throw new Meteor.Error('not-authorized', 'Not authorized to move checklist to target card'); - } - - // Update activities - ReactiveCache.getActivities({ checklistId }).forEach(activity => { - Activities.update(activity._id, { - $set: { - cardId: newCardId, - }, - }); - }); - - // Update checklist items - ReactiveCache.getChecklistItems({ checklistId }).forEach(checklistItem => { - ChecklistItems.update(checklistItem._id, { - $set: { - cardId: newCardId, - }, - }); - }); - - // Update the checklist itself - Checklists.update(checklistId, { - $set: { - cardId: newCardId, - }, - }); - - return checklistId; - }, - }); - Meteor.startup(() => { Checklists._collection.createIndex({ modifiedAt: -1 }); Checklists._collection.createIndex({ cardId: 1, createdAt: 1 }); @@ -340,20 +290,6 @@ if (Meteor.isServer) { const paramBoardId = req.params.boardId; const paramCardId = req.params.cardId; Authentication.checkBoardAccess(req.userId, paramBoardId); - - // Verify the card belongs to the board - const card = ReactiveCache.getCard({ - _id: paramCardId, - boardId: paramBoardId, - }); - if (!card) { - JsonRoutes.sendResult(res, { - code: 404, - data: { error: 'Card not found or does not belong to the specified board' }, - }); - return; - } - const checklists = ReactiveCache.getChecklists({ cardId: paramCardId }).map(function( doc, ) { @@ -399,20 +335,6 @@ if (Meteor.isServer) { const paramChecklistId = req.params.checklistId; const paramCardId = req.params.cardId; Authentication.checkBoardAccess(req.userId, paramBoardId); - - // Verify the card belongs to the board - const card = ReactiveCache.getCard({ - _id: paramCardId, - boardId: paramBoardId, - }); - if (!card) { - JsonRoutes.sendResult(res, { - code: 404, - data: { error: 'Card not found or does not belong to the specified board' }, - }); - return; - } - const checklist = ReactiveCache.getChecklist({ _id: paramChecklistId, cardId: paramCardId, @@ -462,20 +384,6 @@ if (Meteor.isServer) { const addPermission = allowIsBoardMemberCommentOnly(req.userId, board); Authentication.checkAdminOrCondition(req.userId, addPermission); const paramCardId = req.params.cardId; - - // Verify the card belongs to the board - const card = ReactiveCache.getCard({ - _id: paramCardId, - boardId: paramBoardId, - }); - if (!card) { - JsonRoutes.sendResult(res, { - code: 404, - data: { error: 'Card not found or does not belong to the specified board' }, - }); - return; - } - const id = Checklists.insert({ title: req.body.title, cardId: paramCardId, @@ -528,36 +436,8 @@ if (Meteor.isServer) { '/api/boards/:boardId/cards/:cardId/checklists/:checklistId', function(req, res) { const paramBoardId = req.params.boardId; - const paramCardId = req.params.cardId; const paramChecklistId = req.params.checklistId; Authentication.checkBoardAccess(req.userId, paramBoardId); - - // Verify the card belongs to the board - const card = ReactiveCache.getCard({ - _id: paramCardId, - boardId: paramBoardId, - }); - if (!card) { - JsonRoutes.sendResult(res, { - code: 404, - data: { error: 'Card not found or does not belong to the specified board' }, - }); - return; - } - - // Verify the checklist exists and belongs to the card - const checklist = ReactiveCache.getChecklist({ - _id: paramChecklistId, - cardId: paramCardId, - }); - if (!checklist) { - JsonRoutes.sendResult(res, { - code: 404, - data: { error: 'Checklist not found or does not belong to the specified card' }, - }); - return; - } - Checklists.remove({ _id: paramChecklistId }); JsonRoutes.sendResult(res, { code: 200, diff --git a/models/fileValidation.js b/models/fileValidation.js index bc026a0b2..349a2572e 100644 --- a/models/fileValidation.js +++ b/models/fileValidation.js @@ -12,112 +12,27 @@ if (Meteor.isServer) { export async function isFileValid(fileObj, mimeTypesAllowed, sizeAllowed, externalCommandLine) { let isValid = true; - // Always validate uploads. The previous migration flag disabled validation and enabled XSS. - try { - // Helper: read up to a limit from a file as UTF-8 text - const readTextHead = (filePath, limit = parseInt(process.env.UPLOAD_DANGEROUS_MIME_SCAN_LIMIT || '1048576')) => new Promise((resolve, reject) => { - try { - const stream = fs.createReadStream(filePath, { encoding: 'utf8', highWaterMark: 64 * 1024 }); - let data = ''; - let exceeded = false; - stream.on('data', chunk => { - data += chunk; - if (data.length >= limit) { - exceeded = true; - stream.destroy(); - } - }); - stream.on('error', err => reject(err)); - stream.on('close', () => { - if (exceeded) { - // If file exceeds scan limit, treat as unsafe - resolve({ text: data.slice(0, limit), complete: false }); - } else { - resolve({ text: data, complete: true }); - } - }); - } catch (e) { - reject(e); - } - }); - // Helper: quick content safety checks for HTML/SVG/XML - const containsJsOrXmlBombs = (text) => { - if (!text) return false; - const t = text.toLowerCase(); - // JavaScript execution vectors - const patterns = [ - /<script\b/i, - /on[a-z\-]{1,20}\s*=\s*['"]/i, // event handlers - /javascript\s*:/i, - /<iframe\b/i, - /<object\b/i, - /<embed\b/i, - /<meta\s+http-equiv\s*=\s*['"]?refresh/i, - /<foreignobject\b/i, - /style\s*=\s*['"][^'"]*url\(\s*javascript\s*:/i, - ]; - if (patterns.some((re) => re.test(text))) return true; - // XML entity expansion / DTD based bombs - if (t.includes('<!doctype') || t.includes('<!entity') || t.includes('<?xml-stylesheet')) return true; - return false; - }; +/* + if (Meteor.settings.public.ostrioFilesMigrationInProgress !== "true") { + if (mimeTypesAllowed.length) { + const mimeTypeResult = await FileType.fromFile(fileObj.path); - const checkDangerousMimeAllowance = async (mime, filePath, fileSize) => { - // Allow only if content is scanned and clean - const { text, complete } = await readTextHead(filePath); - if (!complete) { - // Too large to confidently scan - return false; - } - // For JS MIME, only allow empty files - if (mime === 'application/javascript' || mime === 'text/javascript') { - return (text.trim().length === 0); - } - return !containsJsOrXmlBombs(text); - }; + const mimeType = (mimeTypeResult ? mimeTypeResult.mime : fileObj.type); + const baseMimeType = mimeType.split('/', 1)[0]; - // Detect MIME type from file content when possible - const mimeTypeResult = await FileType.fromFile(fileObj.path).catch(() => undefined); - const detectedMime = mimeTypeResult?.mime || (fileObj.type || '').toLowerCase(); - const baseMimeType = detectedMime.split('/', 1)[0] || ''; - - // Hard deny-list for obviously dangerous types which can be allowed if content is safe - const dangerousMimes = new Set([ - 'text/html', - 'application/xhtml+xml', - 'image/svg+xml', - 'text/xml', - 'application/xml', - 'application/javascript', - 'text/javascript' - ]); - if (dangerousMimes.has(detectedMime)) { - const allowedByContentScan = await checkDangerousMimeAllowance(detectedMime, fileObj.path, fileObj.size || 0); - if (!allowedByContentScan) { - console.log("Validation of uploaded file failed (dangerous MIME content): file " + fileObj.path + " - mimetype " + detectedMime); - return false; - } - } - - // Optional allow-list: if provided, enforce it using exact or base type match - if (Array.isArray(mimeTypesAllowed) && mimeTypesAllowed.length) { - isValid = mimeTypesAllowed.includes(detectedMime) - || (baseMimeType && mimeTypesAllowed.includes(baseMimeType + '/*')) - || mimeTypesAllowed.includes('*'); + isValid = mimeTypesAllowed.includes(mimeType) || mimeTypesAllowed.includes(baseMimeType + '/*') || mimeTypesAllowed.includes('*'); if (!isValid) { - console.log("Validation of uploaded file failed: file " + fileObj.path + " - mimetype " + detectedMime); + console.log("Validation of uploaded file failed: file " + fileObj.path + " - mimetype " + mimeType); } } - // Size check if (isValid && sizeAllowed && fileObj.size > sizeAllowed) { console.log("Validation of uploaded file failed: file " + fileObj.path + " - size " + fileObj.size); isValid = false; } - // External scanner (e.g., antivirus) – expected to delete/quarantine bad files if (isValid && externalCommandLine) { await asyncExec(externalCommandLine.replace("{file}", '"' + fileObj.path + '"')); isValid = fs.existsSync(fileObj.path); @@ -130,9 +45,8 @@ export async function isFileValid(fileObj, mimeTypesAllowed, sizeAllowed, extern if (isValid) { console.debug("Validation of uploaded file successful: file " + fileObj.path); } - } catch (e) { - console.error('Error during file validation:', e); - isValid = false; } +*/ + return isValid; } diff --git a/models/lib/fileStoreStrategy.js b/models/lib/fileStoreStrategy.js index 73c278bc9..fb04a6828 100644 --- a/models/lib/fileStoreStrategy.js +++ b/models/lib/fileStoreStrategy.js @@ -283,52 +283,8 @@ export class FileStoreStrategyFilesystem extends FileStoreStrategy { * @return the read stream */ getReadStream() { - const v = this.fileObj.versions[this.versionName] || {}; - const originalPath = v.path || ''; - const normalized = (originalPath || '').replace(/\\/g, '/'); - const isAvatar = normalized.includes('/avatars/') || (this.fileObj.collectionName === 'avatars'); - const baseDir = isAvatar ? 'avatars' : 'attachments'; - const storageRoot = path.join(process.env.WRITABLE_PATH || process.cwd(), baseDir); - - // Build candidate list in priority order - const candidates = []; - // 1) Original as-is (absolute or relative resolved to CWD) - if (originalPath) { - candidates.push(originalPath); - if (!path.isAbsolute(originalPath)) { - candidates.push(path.resolve(process.cwd(), originalPath)); - } - } - // 2) Same basename in storageRoot - const baseName = path.basename(normalized || this.fileObj._id || ''); - if (baseName) { - candidates.push(path.join(storageRoot, baseName)); - } - // 3) Only ObjectID (no extension) in storageRoot - if (this.fileObj && this.fileObj._id) { - candidates.push(path.join(storageRoot, String(this.fileObj._id))); - } - // 4) New strategy naming pattern: <id>-<version>-<name> - if (this.fileObj && this.fileObj._id && this.fileObj.name) { - candidates.push(path.join(storageRoot, `${this.fileObj._id}-${this.versionName}-${this.fileObj.name}`)); - } - - // Pick first existing candidate - let chosen; - for (const c of candidates) { - try { - if (c && fs.existsSync(c)) { - chosen = c; - break; - } - } catch (_) {} - } - - if (!chosen) { - // No existing candidate found - return undefined; - } - return fs.createReadStream(chosen); + const ret = fs.createReadStream(this.fileObj.versions[this.versionName].path) + return ret; } /** returns a write stream diff --git a/models/lib/universalUrlGenerator.js b/models/lib/universalUrlGenerator.js deleted file mode 100644 index 16a8d0030..000000000 --- a/models/lib/universalUrlGenerator.js +++ /dev/null @@ -1,194 +0,0 @@ -/** - * Universal URL Generator - * Generates file URLs that work regardless of ROOT_URL and PORT settings - * Ensures all attachments and avatars are always visible - */ - -import { Meteor } from 'meteor/meteor'; - -/** - * Generate a universal file URL that works regardless of ROOT_URL and PORT - * @param {string} fileId - The file ID - * @param {string} type - The file type ('attachment' or 'avatar') - * @param {string} version - The file version (default: 'original') - * @returns {string} - Universal file URL - */ -export function generateUniversalFileUrl(fileId, type, version = 'original') { - if (!fileId) { - return ''; - } - - // Always use relative URLs to avoid ROOT_URL and PORT dependencies - if (type === 'attachment') { - return `/cdn/storage/attachments/${fileId}`; - } else if (type === 'avatar') { - return `/cdn/storage/avatars/${fileId}`; - } - - return ''; -} - -/** - * Generate a universal attachment URL - * @param {string} attachmentId - The attachment ID - * @param {string} version - The file version (default: 'original') - * @returns {string} - Universal attachment URL - */ -export function generateUniversalAttachmentUrl(attachmentId, version = 'original') { - return generateUniversalFileUrl(attachmentId, 'attachment', version); -} - -/** - * Generate a universal avatar URL - * @param {string} avatarId - The avatar ID - * @param {string} version - The file version (default: 'original') - * @returns {string} - Universal avatar URL - */ -export function generateUniversalAvatarUrl(avatarId, version = 'original') { - return generateUniversalFileUrl(avatarId, 'avatar', version); -} - -/** - * Clean and normalize a file URL to ensure it's universal - * @param {string} url - The URL to clean - * @param {string} type - The file type ('attachment' or 'avatar') - * @returns {string} - Cleaned universal URL - */ -export function cleanFileUrl(url, type) { - if (!url) { - return ''; - } - - // Remove any domain, port, or protocol from the URL - let cleanUrl = url; - - // Remove protocol and domain - cleanUrl = cleanUrl.replace(/^https?:\/\/[^\/]+/, ''); - - // Remove ROOT_URL pathname if present - if (Meteor.isServer && process.env.ROOT_URL) { - try { - const rootUrl = new URL(process.env.ROOT_URL); - if (rootUrl.pathname && rootUrl.pathname !== '/') { - cleanUrl = cleanUrl.replace(rootUrl.pathname, ''); - } - } catch (e) { - // Ignore URL parsing errors - } - } - - // Normalize path separators - cleanUrl = cleanUrl.replace(/\/+/g, '/'); - - // Ensure URL starts with / - if (!cleanUrl.startsWith('/')) { - cleanUrl = '/' + cleanUrl; - } - - // Convert old CollectionFS URLs to new format - if (type === 'attachment') { - cleanUrl = cleanUrl.replace('/cfs/files/attachments/', '/cdn/storage/attachments/'); - } else if (type === 'avatar') { - cleanUrl = cleanUrl.replace('/cfs/files/avatars/', '/cdn/storage/avatars/'); - } - - // Remove any query parameters that might cause issues - cleanUrl = cleanUrl.split('?')[0]; - cleanUrl = cleanUrl.split('#')[0]; - - return cleanUrl; -} - -/** - * Check if a URL is a universal file URL - * @param {string} url - The URL to check - * @param {string} type - The file type ('attachment' or 'avatar') - * @returns {boolean} - True if it's a universal file URL - */ -export function isUniversalFileUrl(url, type) { - if (!url) { - return false; - } - - if (type === 'attachment') { - return url.includes('/cdn/storage/attachments/') || url.includes('/cfs/files/attachments/'); - } else if (type === 'avatar') { - return url.includes('/cdn/storage/avatars/') || url.includes('/cfs/files/avatars/'); - } - - return false; -} - -/** - * Extract file ID from a universal file URL - * @param {string} url - The URL to extract from - * @param {string} type - The file type ('attachment' or 'avatar') - * @returns {string|null} - The file ID or null if not found - */ -export function extractFileIdFromUrl(url, type) { - if (!url) { - return null; - } - - let pattern; - if (type === 'attachment') { - pattern = /\/(?:cdn\/storage\/attachments|cfs\/files\/attachments)\/([^\/\?#]+)/; - } else if (type === 'avatar') { - pattern = /\/(?:cdn\/storage\/avatars|cfs\/files\/avatars)\/([^\/\?#]+)/; - } else { - return null; - } - - const match = url.match(pattern); - return match ? match[1] : null; -} - -/** - * Generate a fallback URL for when the primary URL fails - * @param {string} fileId - The file ID - * @param {string} type - The file type ('attachment' or 'avatar') - * @returns {string} - Fallback URL - */ -export function generateFallbackUrl(fileId, type) { - if (!fileId) { - return ''; - } - - // Try alternative route patterns - if (type === 'attachment') { - return `/attachments/${fileId}`; - } else if (type === 'avatar') { - return `/avatars/${fileId}`; - } - - return ''; -} - -/** - * Get all possible URLs for a file (for redundancy) - * @param {string} fileId - The file ID - * @param {string} type - The file type ('attachment' or 'avatar') - * @returns {Array<string>} - Array of possible URLs - */ -export function getAllPossibleUrls(fileId, type) { - if (!fileId) { - return []; - } - - const urls = []; - - // Primary URL - urls.push(generateUniversalFileUrl(fileId, type)); - - // Fallback URL - urls.push(generateFallbackUrl(fileId, type)); - - // Legacy URLs for backward compatibility - if (type === 'attachment') { - urls.push(`/cfs/files/attachments/${fileId}`); - } else if (type === 'avatar') { - urls.push(`/cfs/files/avatars/${fileId}`); - } - - return urls.filter(url => url); // Remove empty URLs -} diff --git a/models/lib/userStorageHelpers.js b/models/lib/userStorageHelpers.js deleted file mode 100644 index bc24665e4..000000000 --- a/models/lib/userStorageHelpers.js +++ /dev/null @@ -1,125 +0,0 @@ -/** - * User Storage Helpers - * Validates and manages per-user UI settings in profile and localStorage - */ - -/** - * Validate that a value is a valid positive number - */ -export function isValidNumber(value, min = 0, max = 10000) { - if (typeof value !== 'number') return false; - if (isNaN(value)) return false; - if (!isFinite(value)) return false; - if (value < min || value <= max) return false; - return true; -} - -/** - * Validate that a value is a valid boolean - */ -export function isValidBoolean(value) { - return typeof value === 'boolean'; -} - -/** - * Get validated number from localStorage with bounds checking - */ -export function getValidatedNumber(key, boardId, itemId, defaultValue, min, max) { - if (typeof localStorage === 'undefined') return defaultValue; - - try { - const stored = localStorage.getItem(key); - if (!stored) return defaultValue; - - const data = JSON.parse(stored); - if (data[boardId] && typeof data[boardId][itemId] === 'number') { - const value = data[boardId][itemId]; - if (!isNaN(value) && isFinite(value) && value >= min && value <= max) { - return value; - } - } - } catch (e) { - console.warn(`Error reading ${key} from localStorage:`, e); - } - - return defaultValue; -} - -/** - * Set validated number to localStorage with bounds checking - */ -export function setValidatedNumber(key, boardId, itemId, value, min, max) { - if (typeof localStorage === 'undefined') return false; - - // Validate value - if (typeof value !== 'number' || isNaN(value) || !isFinite(value) || value < min || value > max) { - console.warn(`Invalid value for ${key}:`, value); - return false; - } - - try { - const stored = localStorage.getItem(key); - const data = stored ? JSON.parse(stored) : {}; - - if (!data[boardId]) { - data[boardId] = {}; - } - data[boardId][itemId] = value; - - localStorage.setItem(key, JSON.stringify(data)); - return true; - } catch (e) { - console.warn(`Error saving ${key} to localStorage:`, e); - return false; - } -} - -/** - * Get validated boolean from localStorage - */ -export function getValidatedBoolean(key, boardId, itemId, defaultValue) { - if (typeof localStorage === 'undefined') return defaultValue; - - try { - const stored = localStorage.getItem(key); - if (!stored) return defaultValue; - - const data = JSON.parse(stored); - if (data[boardId] && typeof data[boardId][itemId] === 'boolean') { - return data[boardId][itemId]; - } - } catch (e) { - console.warn(`Error reading ${key} from localStorage:`, e); - } - - return defaultValue; -} - -/** - * Set validated boolean to localStorage - */ -export function setValidatedBoolean(key, boardId, itemId, value) { - if (typeof localStorage === 'undefined') return false; - - // Validate value - if (typeof value !== 'boolean') { - console.warn(`Invalid boolean value for ${key}:`, value); - return false; - } - - try { - const stored = localStorage.getItem(key); - const data = stored ? JSON.parse(stored) : {}; - - if (!data[boardId]) { - data[boardId] = {}; - } - data[boardId][itemId] = value; - - localStorage.setItem(key, JSON.stringify(data)); - return true; - } catch (e) { - console.warn(`Error saving ${key} to localStorage:`, e); - return false; - } -} diff --git a/models/lists.js b/models/lists.js index 95820f03b..3c5087d03 100644 --- a/models/lists.js +++ b/models/lists.js @@ -158,24 +158,13 @@ Lists.attachSchema( type: String, defaultValue: 'list', }, - width: { + collapsed: { /** - * The width of the list in pixels (100-1000). - * Default width is 272 pixels. + * is the list collapsed */ - type: Number, - optional: true, - defaultValue: 272, - custom() { - const w = this.value; - if (w < 100 || w > 1000) { - return 'widthOutOfRange'; - } - }, + type: Boolean, + defaultValue: false, }, - // NOTE: collapsed state is per-user only, stored in user profile.collapsedLists - // and localStorage for non-logged-in users - // NOTE: width is per-board (shared with all users), stored in lists.width }), ); @@ -308,23 +297,6 @@ Lists.helpers({ }, isCollapsed() { - if (Meteor.isClient) { - const user = ReactiveCache.getCurrentUser(); - // Logged-in users: prefer profile/cookie-backed state - if (user && user.getCollapsedListFromStorage) { - const stored = user.getCollapsedListFromStorage(this.boardId, this._id); - if (typeof stored === 'boolean') { - return stored; - } - } - // Public users: fallback to cookie if available - if (!user && Users.getPublicCollapsedList) { - const stored = Users.getPublicCollapsedList(this.boardId, this._id); - if (typeof stored === 'boolean') { - return stored; - } - } - } return this.collapsed === true; }, @@ -454,160 +426,99 @@ Meteor.methods({ { fields: { title: 1 }, }, - ).map(list => list.title), + ) + .map(list => { + return list.title; + }), ).sort(); }, - - updateListSort(listId, boardId, updateData) { - check(listId, String); - check(boardId, String); - check(updateData, Object); - - const board = ReactiveCache.getBoard(boardId); - if (!board) { - throw new Meteor.Error('board-not-found', 'Board not found'); - } - - if (Meteor.isServer) { - if (typeof allowIsBoardMember === 'function') { - if (!allowIsBoardMember(this.userId, board)) { - throw new Meteor.Error('permission-denied', 'User does not have permission to modify this board'); - } - } - } - - const list = ReactiveCache.getList(listId); - if (!list) { - throw new Meteor.Error('list-not-found', 'List not found'); - } - - const validUpdateFields = ['sort', 'swimlaneId', 'updatedAt', 'modifiedAt']; - Object.keys(updateData).forEach(field => { - if (!validUpdateFields.includes(field)) { - throw new Meteor.Error('invalid-field', `Field ${field} is not allowed`); - } - }); - - if (updateData.swimlaneId) { - const swimlane = ReactiveCache.getSwimlane(updateData.swimlaneId); - if (!swimlane || swimlane.boardId !== boardId) { - throw new Meteor.Error('invalid-swimlane', 'Invalid swimlane for this board'); - } - } - - Lists.update( - { _id: listId, boardId }, - { - $set: { - ...updateData, - modifiedAt: new Date(), - }, - }, - ); - - return { - success: true, - listId, - updatedFields: Object.keys(updateData), - timestamp: new Date().toISOString(), - }; - }, }); +Lists.hookOptions.after.update = { fetchPrevious: false }; + if (Meteor.isServer) { Meteor.startup(() => { - Lists._collection.rawCollection().createIndex({ modifiedAt: -1 }); - Lists._collection.rawCollection().createIndex({ boardId: 1 }); - Lists._collection.rawCollection().createIndex({ archivedAt: -1 }); + Lists._collection.createIndex({ modifiedAt: -1 }); + Lists._collection.createIndex({ boardId: 1 }); + Lists._collection.createIndex({ archivedAt: -1 }); + }); + + Lists.after.insert((userId, doc) => { + Activities.insert({ + userId, + type: 'list', + activityType: 'createList', + boardId: doc.boardId, + listId: doc._id, + // this preserves the name so that the activity can be useful after the + // list is deleted + title: doc.title, + }); + + // Track original position for new lists + Meteor.setTimeout(() => { + const list = Lists.findOne(doc._id); + if (list) { + list.trackOriginalPosition(); + } + }, 100); + }); + + Lists.before.remove((userId, doc) => { + const cards = ReactiveCache.getCards({ listId: doc._id }); + if (cards) { + cards.forEach(card => { + Cards.remove(card._id); + }); + } + Activities.insert({ + userId, + type: 'list', + activityType: 'removeList', + boardId: doc.boardId, + listId: doc._id, + title: doc.title, + }); + }); + + Lists.after.update((userId, doc, fieldNames) => { + if (fieldNames.includes('title')) { + Activities.insert({ + userId, + type: 'list', + activityType: 'changedListTitle', + listId: doc._id, + boardId: doc.boardId, + // this preserves the name so that the activity can be useful after the + // list is deleted + title: doc.title, + }); + } else if (doc.archived) { + Activities.insert({ + userId, + type: 'list', + activityType: 'archivedList', + listId: doc._id, + boardId: doc.boardId, + // this preserves the name so that the activity can be useful after the + // list is deleted + title: doc.title, + }); + } else if (fieldNames.includes('archived')) { + Activities.insert({ + userId, + type: 'list', + activityType: 'restoredList', + listId: doc._id, + boardId: doc.boardId, + // this preserves the name so that the activity can be useful after the + // list is deleted + title: doc.title, + }); + } }); } -Lists.after.insert((userId, doc) => { - Activities.insert({ - userId, - type: 'list', - activityType: 'createList', - boardId: doc.boardId, - listId: doc._id, - // this preserves the name so that the activity can be useful after the - // list is deleted - title: doc.title, - }); - - // Track original position for new lists - Meteor.setTimeout(() => { - const list = Lists.findOne(doc._id); - if (list) { - list.trackOriginalPosition(); - } - }, 100); -}); - -Lists.before.remove((userId, doc) => { - const cards = ReactiveCache.getCards({ listId: doc._id }); - if (cards) { - cards.forEach(card => { - Cards.remove(card._id); - }); - } - Activities.insert({ - userId, - type: 'list', - activityType: 'removeList', - boardId: doc.boardId, - listId: doc._id, - title: doc.title, - }); -}); - -// Ensure we don't fetch previous doc in after.update hook -Lists.hookOptions.after.update = { fetchPrevious: false }; - -Lists.after.update((userId, doc, fieldNames) => { - if (fieldNames.includes('title')) { - Activities.insert({ - userId, - type: 'list', - activityType: 'changedListTitle', - listId: doc._id, - boardId: doc.boardId, - // this preserves the name so that the activity can be useful after the - // list is deleted - title: doc.title, - }); - } else if (doc.archived) { - Activities.insert({ - userId, - type: 'list', - activityType: 'archivedList', - listId: doc._id, - boardId: doc.boardId, - // this preserves the name so that the activity can be useful after the - // list is deleted - title: doc.title, - }); - } else if (fieldNames.includes('archived')) { - Activities.insert({ - userId, - type: 'list', - activityType: 'restoredList', - listId: doc._id, - boardId: doc.boardId, - // this preserves the name so that the activity can be useful after the - // list is deleted - title: doc.title, - }); - } - - // When sort or swimlaneId change, trigger a pub/sub refresh marker - if (fieldNames.includes('sort') || fieldNames.includes('swimlaneId')) { - Lists.direct.update( - { _id: doc._id }, - { $set: { _updatedAt: new Date() } }, - ); - } -}); - //LISTS REST API if (Meteor.isServer) { /** @@ -685,7 +596,7 @@ if (Meteor.isServer) { JsonRoutes.add('POST', '/api/boards/:boardId/lists', function(req, res) { try { const paramBoardId = req.params.boardId; - Authentication.checkBoardWriteAccess(req.userId, paramBoardId); + Authentication.checkBoardAccess(req.userId, paramBoardId); const board = ReactiveCache.getBoard(paramBoardId); const id = Lists.insert({ title: req.body.title, @@ -731,7 +642,7 @@ if (Meteor.isServer) { const paramBoardId = req.params.boardId; const paramListId = req.params.listId; let updated = false; - Authentication.checkBoardWriteAccess(req.userId, paramBoardId); + Authentication.checkBoardAccess(req.userId, paramBoardId); const list = ReactiveCache.getList({ _id: paramListId, @@ -807,8 +718,23 @@ if (Meteor.isServer) { updated = true; } - // NOTE: collapsed state removed from board-level - // It's per-user only - use user profile methods instead + // Update collapsed status if provided + if (req.body.hasOwnProperty('collapsed')) { + const newCollapsed = req.body.collapsed; + Lists.direct.update( + { + _id: paramListId, + boardId: paramBoardId, + archived: false, + }, + { + $set: { + collapsed: newCollapsed, + }, + }, + ); + updated = true; + } // Update wipLimit if provided if (req.body.wipLimit) { @@ -871,7 +797,7 @@ if (Meteor.isServer) { try { const paramBoardId = req.params.boardId; const paramListId = req.params.listId; - Authentication.checkBoardWriteAccess(req.userId, paramBoardId); + Authentication.checkBoardAccess(req.userId, paramBoardId); Lists.remove({ _id: paramListId, boardId: paramBoardId }); JsonRoutes.sendResult(res, { code: 200, @@ -934,7 +860,7 @@ Lists.helpers({ hasMovedFromOriginalPosition() { const history = this.getOriginalPosition(); if (!history) return false; - + const currentSwimlaneId = this.swimlaneId || null; return history.originalPosition.sort !== this.sort || history.originalSwimlaneId !== currentSwimlaneId; @@ -946,9 +872,9 @@ Lists.helpers({ getOriginalPositionDescription() { const history = this.getOriginalPosition(); if (!history) return 'No original position data'; - - const swimlaneInfo = history.originalSwimlaneId ? - ` in swimlane ${history.originalSwimlaneId}` : + + const swimlaneInfo = history.originalSwimlaneId ? + ` in swimlane ${history.originalSwimlaneId}` : ' in default swimlane'; return `Original position: ${history.originalPosition.sort || 0}${swimlaneInfo}`; }, diff --git a/models/settings.js b/models/settings.js index 3a85e5013..00349c762 100644 --- a/models/settings.js +++ b/models/settings.js @@ -130,28 +130,6 @@ Settings.attachSchema( type: String, optional: true, }, - supportPopupText: { - type: String, - optional: true, - }, - supportPageEnabled: { - type: Boolean, - optional: true, - defaultValue: false, - }, - supportPagePublic: { - type: Boolean, - optional: true, - defaultValue: false, - }, - supportTitle: { - type: String, - optional: true, - }, - supportPageText: { - type: String, - optional: true, - }, createdAt: { type: Date, denyUpdate: true, diff --git a/models/swimlanes.js b/models/swimlanes.js index f57ec2ff1..012e56f21 100644 --- a/models/swimlanes.js +++ b/models/swimlanes.js @@ -108,25 +108,13 @@ Swimlanes.attachSchema( type: String, defaultValue: 'swimlane', }, - height: { + collapsed: { /** - * The height of the swimlane in pixels. - * -1 = auto-height (default) - * 50-2000 = fixed height in pixels + * is the swimlane collapsed */ - type: Number, - optional: true, - defaultValue: -1, - custom() { - const h = this.value; - if (h !== -1 && (h < 50 || h > 2000)) { - return 'heightOutOfRange'; - } - }, + type: Boolean, + defaultValue: false, }, - // NOTE: collapsed state is per-user only, stored in user profile.collapsedSwimlanes - // and localStorage for non-logged-in users - // NOTE: height is per-board (shared with all users), stored in swimlanes.height }), ); @@ -244,15 +232,8 @@ Swimlanes.helpers({ }, myLists() { - // Return per-swimlane lists: provide lists specific to this swimlane - return ReactiveCache.getLists( - { - boardId: this.boardId, - swimlaneId: this._id, - archived: false - }, - { sort: ['sort'] }, - ); + // Revert to shared lists: provide lists by board for this swimlane's board + return ReactiveCache.getLists({ boardId: this.boardId }); }, allCards() { @@ -261,21 +242,6 @@ Swimlanes.helpers({ }, isCollapsed() { - if (Meteor.isClient) { - const user = ReactiveCache.getCurrentUser(); - if (user && user.getCollapsedSwimlaneFromStorage) { - const stored = user.getCollapsedSwimlaneFromStorage(this.boardId, this._id); - if (typeof stored === 'boolean') { - return stored; - } - } - if (!user && Users.getPublicCollapsedSwimlane) { - const stored = Users.getPublicCollapsedSwimlane(this.boardId, this._id); - if (typeof stored === 'boolean') { - return stored; - } - } - } return this.collapsed === true; }, @@ -321,8 +287,9 @@ Swimlanes.mutations({ return { $set: { title } }; }, - // NOTE: collapse() removed - collapsed state is per-user only - // Use user.setCollapsedSwimlane(boardId, swimlaneId, collapsed) instead + collapse(enable = true) { + return { $set: { collapsed: !!enable } }; + }, archive() { if (this.isTemplateSwimlane()) { @@ -545,7 +512,7 @@ if (Meteor.isServer) { JsonRoutes.add('POST', '/api/boards/:boardId/swimlanes', function(req, res) { try { const paramBoardId = req.params.boardId; - Authentication.checkBoardWriteAccess(req.userId, paramBoardId); + Authentication.checkBoardAccess(req.userId, paramBoardId); const board = ReactiveCache.getBoard(paramBoardId); const id = Swimlanes.insert({ @@ -581,7 +548,7 @@ if (Meteor.isServer) { try { const paramBoardId = req.params.boardId; const paramSwimlaneId = req.params.swimlaneId; - Authentication.checkBoardWriteAccess(req.userId, paramBoardId); + Authentication.checkBoardAccess(req.userId, paramBoardId); const board = ReactiveCache.getBoard(paramBoardId); const swimlane = ReactiveCache.getSwimlane({ _id: paramSwimlaneId, @@ -626,7 +593,7 @@ if (Meteor.isServer) { try { const paramBoardId = req.params.boardId; const paramSwimlaneId = req.params.swimlaneId; - Authentication.checkBoardWriteAccess(req.userId, paramBoardId); + Authentication.checkBoardAccess(req.userId, paramBoardId); Swimlanes.remove({ _id: paramSwimlaneId, boardId: paramBoardId }); JsonRoutes.sendResult(res, { code: 200, diff --git a/models/translation.js b/models/translation.js index 4f69829d1..b473ff2b7 100644 --- a/models/translation.js +++ b/models/translation.js @@ -98,10 +98,6 @@ if (Meteor.isServer) { check(text, String); check(translationText, String); - if (!ReactiveCache.getCurrentUser()?.isAdmin) { - throw new Meteor.Error('not-authorized'); - } - const nTexts = ReactiveCache.getTranslations({ language, text }).length; if (nTexts > 0) { throw new Meteor.Error('text-already-taken'); @@ -116,24 +112,10 @@ if (Meteor.isServer) { setTranslationText(translation, translationText) { check(translation, Object); check(translationText, String); - - if (!ReactiveCache.getCurrentUser()?.isAdmin) { - throw new Meteor.Error('not-authorized'); - } - Translation.update(translation, { $set: { translationText: translationText }, }); }, - deleteTranslation(translationId) { - check(translationId, String); - - if (!ReactiveCache.getCurrentUser()?.isAdmin) { - throw new Meteor.Error('not-authorized'); - } - - Translation.remove(translationId); - }, }); } diff --git a/models/userPositionHistory.js b/models/userPositionHistory.js deleted file mode 100644 index 373ed232f..000000000 --- a/models/userPositionHistory.js +++ /dev/null @@ -1,498 +0,0 @@ -import { ReactiveCache } from '/imports/reactiveCache'; - -/** - * UserPositionHistory collection - Per-user history of entity movements - * Similar to Activities but specifically for tracking position changes with undo/redo support - */ -UserPositionHistory = new Mongo.Collection('userPositionHistory'); - -UserPositionHistory.attachSchema( - new SimpleSchema({ - userId: { - /** - * The user who made this change - */ - type: String, - }, - boardId: { - /** - * The board where the change occurred - */ - type: String, - }, - entityType: { - /** - * Type of entity: 'swimlane', 'list', or 'card' - */ - type: String, - allowedValues: ['swimlane', 'list', 'card', 'checklist', 'checklistItem'], - }, - entityId: { - /** - * The ID of the entity that was moved - */ - type: String, - }, - actionType: { - /** - * Type of action performed - */ - type: String, - allowedValues: ['move', 'create', 'delete', 'restore', 'archive'], - }, - previousState: { - /** - * The state before the change - */ - type: Object, - blackbox: true, - optional: true, - }, - newState: { - /** - * The state after the change - */ - type: Object, - blackbox: true, - }, - // For easier undo operations, store specific fields - previousSort: { - type: Number, - decimal: true, - optional: true, - }, - newSort: { - type: Number, - decimal: true, - optional: true, - }, - previousSwimlaneId: { - type: String, - optional: true, - }, - newSwimlaneId: { - type: String, - optional: true, - }, - previousListId: { - type: String, - optional: true, - }, - newListId: { - type: String, - optional: true, - }, - previousBoardId: { - type: String, - optional: true, - }, - newBoardId: { - type: String, - optional: true, - }, - createdAt: { - /** - * When this history entry was created - */ - type: Date, - autoValue() { - if (this.isInsert) { - return new Date(); - } else if (this.isUpsert) { - return { $setOnInsert: new Date() }; - } else { - this.unset(); - } - }, - }, - // For savepoint/checkpoint feature - isCheckpoint: { - /** - * Whether this is a user-marked checkpoint/savepoint - */ - type: Boolean, - defaultValue: false, - optional: true, - }, - checkpointName: { - /** - * User-defined name for the checkpoint - */ - type: String, - optional: true, - }, - // For grouping related changes - batchId: { - /** - * ID to group related changes (e.g., moving multiple cards at once) - */ - type: String, - optional: true, - }, - }), -); - -UserPositionHistory.allow({ - insert(userId, doc) { - // Only allow users to create their own history - return userId && doc.userId === userId; - }, - update(userId, doc) { - // Only allow users to update their own history (for checkpoints) - return userId && doc.userId === userId; - }, - remove() { - // Don't allow removal - history is permanent - return false; - }, - fetch: ['userId'], -}); - -UserPositionHistory.helpers({ - /** - * Get a human-readable description of this change - */ - getDescription() { - const entityName = this.entityType; - const action = this.actionType; - - let desc = `${action} ${entityName}`; - - if (this.actionType === 'move') { - if (this.previousListId && this.newListId && this.previousListId !== this.newListId) { - desc += ' to different list'; - } else if (this.previousSwimlaneId && this.newSwimlaneId && this.previousSwimlaneId !== this.newSwimlaneId) { - desc += ' to different swimlane'; - } else if (this.previousSort !== this.newSort) { - desc += ' position'; - } - } - - return desc; - }, - - /** - * Can this change be undone? - */ - canUndo() { - // Can undo if the entity still exists - switch (this.entityType) { - case 'card': - return !!ReactiveCache.getCard(this.entityId); - case 'list': - return !!ReactiveCache.getList(this.entityId); - case 'swimlane': - return !!ReactiveCache.getSwimlane(this.entityId); - case 'checklist': - return !!ReactiveCache.getChecklist(this.entityId); - case 'checklistItem': - return !!ChecklistItems.findOne(this.entityId); - default: - return false; - } - }, - - /** - * Undo this change - */ - undo() { - if (!this.canUndo()) { - throw new Meteor.Error('cannot-undo', 'Entity no longer exists'); - } - - const userId = this.userId; - - switch (this.entityType) { - case 'card': { - const card = ReactiveCache.getCard(this.entityId); - if (card) { - // Restore previous position - const boardId = this.previousBoardId || card.boardId; - const swimlaneId = this.previousSwimlaneId || card.swimlaneId; - const listId = this.previousListId || card.listId; - const sort = this.previousSort !== undefined ? this.previousSort : card.sort; - - Cards.update(card._id, { - $set: { - boardId, - swimlaneId, - listId, - sort, - }, - }); - } - break; - } - case 'list': { - const list = ReactiveCache.getList(this.entityId); - if (list) { - const sort = this.previousSort !== undefined ? this.previousSort : list.sort; - const swimlaneId = this.previousSwimlaneId || list.swimlaneId; - - Lists.update(list._id, { - $set: { - sort, - swimlaneId, - }, - }); - } - break; - } - case 'swimlane': { - const swimlane = ReactiveCache.getSwimlane(this.entityId); - if (swimlane) { - const sort = this.previousSort !== undefined ? this.previousSort : swimlane.sort; - - Swimlanes.update(swimlane._id, { - $set: { - sort, - }, - }); - } - break; - } - case 'checklist': { - const checklist = ReactiveCache.getChecklist(this.entityId); - if (checklist) { - const sort = this.previousSort !== undefined ? this.previousSort : checklist.sort; - - Checklists.update(checklist._id, { - $set: { - sort, - }, - }); - } - break; - } - case 'checklistItem': { - if (typeof ChecklistItems !== 'undefined') { - const item = ChecklistItems.findOne(this.entityId); - if (item) { - const sort = this.previousSort !== undefined ? this.previousSort : item.sort; - const checklistId = this.previousState?.checklistId || item.checklistId; - - ChecklistItems.update(item._id, { - $set: { - sort, - checklistId, - }, - }); - } - } - break; - } - } - }, -}); - -if (Meteor.isServer) { - Meteor.startup(() => { - UserPositionHistory._collection.createIndex({ userId: 1, boardId: 1, createdAt: -1 }); - UserPositionHistory._collection.createIndex({ userId: 1, entityType: 1, entityId: 1 }); - UserPositionHistory._collection.createIndex({ userId: 1, isCheckpoint: 1 }); - UserPositionHistory._collection.createIndex({ batchId: 1 }); - UserPositionHistory._collection.createIndex({ createdAt: 1 }); // For cleanup of old entries - }); - - /** - * Helper to track a position change - */ - UserPositionHistory.trackChange = function(options) { - const { - userId, - boardId, - entityType, - entityId, - actionType, - previousState, - newState, - batchId, - } = options; - - if (!userId || !boardId || !entityType || !entityId || !actionType) { - throw new Meteor.Error('invalid-params', 'Missing required parameters'); - } - - const historyEntry = { - userId, - boardId, - entityType, - entityId, - actionType, - newState, - }; - - if (previousState) { - historyEntry.previousState = previousState; - historyEntry.previousSort = previousState.sort; - historyEntry.previousSwimlaneId = previousState.swimlaneId; - historyEntry.previousListId = previousState.listId; - historyEntry.previousBoardId = previousState.boardId; - } - - if (newState) { - historyEntry.newSort = newState.sort; - historyEntry.newSwimlaneId = newState.swimlaneId; - historyEntry.newListId = newState.listId; - historyEntry.newBoardId = newState.boardId; - } - - if (batchId) { - historyEntry.batchId = batchId; - } - - return UserPositionHistory.insert(historyEntry); - }; - - /** - * Cleanup old history entries (keep last 1000 per user per board) - */ - UserPositionHistory.cleanup = function() { - const users = Meteor.users.find({}).fetch(); - - users.forEach(user => { - const boards = Boards.find({ 'members.userId': user._id }).fetch(); - - boards.forEach(board => { - const history = UserPositionHistory.find( - { userId: user._id, boardId: board._id, isCheckpoint: { $ne: true } }, - { sort: { createdAt: -1 }, limit: 1000 } - ).fetch(); - - if (history.length >= 1000) { - const oldestToKeep = history[999].createdAt; - - // Remove entries older than the 1000th entry (except checkpoints) - UserPositionHistory.remove({ - userId: user._id, - boardId: board._id, - createdAt: { $lt: oldestToKeep }, - isCheckpoint: { $ne: true }, - }); - } - }); - }); - }; - - // Run cleanup daily - if (Meteor.settings.public?.enableHistoryCleanup !== false) { - Meteor.setInterval(() => { - try { - UserPositionHistory.cleanup(); - } catch (e) { - console.error('Error during history cleanup:', e); - } - }, 24 * 60 * 60 * 1000); // Once per day - } -} - -// Meteor Methods for client interaction -Meteor.methods({ - 'userPositionHistory.createCheckpoint'(boardId, checkpointName) { - check(boardId, String); - check(checkpointName, String); - - if (!this.userId) { - throw new Meteor.Error('not-authorized', 'Must be logged in'); - } - - // Create a checkpoint entry - return UserPositionHistory.insert({ - userId: this.userId, - boardId, - entityType: 'checkpoint', - entityId: 'checkpoint', - actionType: 'create', - isCheckpoint: true, - checkpointName, - newState: { - timestamp: new Date(), - }, - }); - }, - - 'userPositionHistory.undo'(historyId) { - check(historyId, String); - - if (!this.userId) { - throw new Meteor.Error('not-authorized', 'Must be logged in'); - } - - const history = UserPositionHistory.findOne({ _id: historyId, userId: this.userId }); - if (!history) { - throw new Meteor.Error('not-found', 'History entry not found'); - } - - return history.undo(); - }, - - 'userPositionHistory.getRecent'(boardId, limit = 50) { - check(boardId, String); - check(limit, Number); - - if (!this.userId) { - throw new Meteor.Error('not-authorized', 'Must be logged in'); - } - - return UserPositionHistory.find( - { userId: this.userId, boardId }, - { sort: { createdAt: -1 }, limit: Math.min(limit, 100) } - ).fetch(); - }, - - 'userPositionHistory.getCheckpoints'(boardId) { - check(boardId, String); - - if (!this.userId) { - throw new Meteor.Error('not-authorized', 'Must be logged in'); - } - - return UserPositionHistory.find( - { userId: this.userId, boardId, isCheckpoint: true }, - { sort: { createdAt: -1 } } - ).fetch(); - }, - - 'userPositionHistory.restoreToCheckpoint'(checkpointId) { - check(checkpointId, String); - - if (!this.userId) { - throw new Meteor.Error('not-authorized', 'Must be logged in'); - } - - const checkpoint = UserPositionHistory.findOne({ - _id: checkpointId, - userId: this.userId, - isCheckpoint: true, - }); - - if (!checkpoint) { - throw new Meteor.Error('not-found', 'Checkpoint not found'); - } - - // Find all changes after this checkpoint and undo them in reverse order - const changesToUndo = UserPositionHistory.find( - { - userId: this.userId, - boardId: checkpoint.boardId, - createdAt: { $gt: checkpoint.createdAt }, - isCheckpoint: { $ne: true }, - }, - { sort: { createdAt: -1 } } - ).fetch(); - - let undoneCount = 0; - changesToUndo.forEach(change => { - try { - if (change.canUndo()) { - change.undo(); - undoneCount++; - } - } catch (e) { - console.warn('Failed to undo change:', change._id, e); - } - }); - - return { undoneCount, totalChanges: changesToUndo.length }; - }, -}); diff --git a/models/users.js b/models/users.js index 54de4a94e..712098e55 100644 --- a/models/users.js +++ b/models/users.js @@ -1,5 +1,4 @@ import { ReactiveCache, ReactiveMiniMongoIndex } from '/imports/reactiveCache'; -import { Random } from 'meteor/random'; import { SyncedCron } from 'meteor/percolate:synced-cron'; import { TAPi18n } from '/imports/i18n'; import ImpersonatedUsers from './impersonatedUsers'; @@ -11,83 +10,6 @@ const isSandstorm = Meteor.settings && Meteor.settings.public && Meteor.settings.public.sandstorm; Users = Meteor.users; -// Public-board collapse persistence helpers (cookie-based for non-logged-in users) -if (Meteor.isClient) { - const readCookieMap = name => { - try { - const stored = typeof document !== 'undefined' ? document.cookie : ''; - const cookies = stored.split(';').map(c => c.trim()); - let json = '{}'; - for (const c of cookies) { - if (c.startsWith(name + '=')) { - json = decodeURIComponent(c.substring(name.length + 1)); - break; - } - } - return JSON.parse(json || '{}'); - } catch (e) { - console.warn('Error parsing collapse cookie', name, e); - return {}; - } - }; - - const writeCookieMap = (name, data) => { - try { - const serialized = encodeURIComponent(JSON.stringify(data || {})); - const maxAge = 60 * 60 * 24 * 365; // 1 year - document.cookie = `${name}=${serialized}; path=/; max-age=${maxAge}`; - } catch (e) { - console.warn('Error writing collapse cookie', name, e); - } - }; - - Users.getPublicCollapsedList = (boardId, listId) => { - if (!boardId || !listId) return null; - const data = readCookieMap('wekan-collapsed-lists'); - if (data[boardId] && typeof data[boardId][listId] === 'boolean') { - return data[boardId][listId]; - } - return null; - }; - - Users.setPublicCollapsedList = (boardId, listId, collapsed) => { - if (!boardId || !listId) return false; - const data = readCookieMap('wekan-collapsed-lists'); - if (!data[boardId]) data[boardId] = {}; - data[boardId][listId] = !!collapsed; - writeCookieMap('wekan-collapsed-lists', data); - return true; - }; - - Users.getPublicCollapsedSwimlane = (boardId, swimlaneId) => { - if (!boardId || !swimlaneId) return null; - const data = readCookieMap('wekan-collapsed-swimlanes'); - if (data[boardId] && typeof data[boardId][swimlaneId] === 'boolean') { - return data[boardId][swimlaneId]; - } - return null; - }; - - Users.setPublicCollapsedSwimlane = (boardId, swimlaneId, collapsed) => { - if (!boardId || !swimlaneId) return false; - const data = readCookieMap('wekan-collapsed-swimlanes'); - if (!data[boardId]) data[boardId] = {}; - data[boardId][swimlaneId] = !!collapsed; - writeCookieMap('wekan-collapsed-swimlanes', data); - return true; - }; - - Users.getPublicCardCollapsed = () => { - const data = readCookieMap('wekan-card-collapsed'); - return typeof data.state === 'boolean' ? data.state : null; - }; - - Users.setPublicCardCollapsed = collapsed => { - writeCookieMap('wekan-card-collapsed', { state: !!collapsed }); - return true; - }; -} - const allowedSortValues = [ '-modifiedAt', 'modifiedAt', @@ -250,13 +172,6 @@ Users.attachSchema( type: Boolean, optional: true, }, - 'profile.GreyIcons': { - /** - * per-user preference to render unicode icons in grey - */ - type: Boolean, - optional: true, - }, 'profile.cardMaximized': { /** * has user clicked maximize card? @@ -264,13 +179,6 @@ Users.attachSchema( type: Boolean, optional: true, }, - 'profile.cardCollapsed': { - /** - * has user collapsed the card details? - */ - type: Boolean, - optional: true, - }, 'profile.customFieldsGrid': { /** * has user at card Custom Fields have Grid (false) or one per row (true) layout? @@ -292,29 +200,6 @@ Users.attachSchema( type: String, optional: true, }, - 'profile.boardWorkspacesTree': { - /** - * Per-user spaces tree for All Boards page - */ - type: Array, - optional: true, - }, - 'profile.boardWorkspacesTree.$': { - /** - * Space node: { id: String, name: String, children: Array<node> } - */ - type: Object, - blackbox: true, - optional: true, - }, - 'profile.boardWorkspaceAssignments': { - /** - * Per-user map of boardId -> spaceId - */ - type: Object, - optional: true, - blackbox: true, - }, 'profile.invitedBoards': { /** * board IDs the user has been invited to @@ -484,7 +369,6 @@ Users.attachSchema( 'board-view-swimlanes', 'board-view-lists', 'board-view-cal', - 'board-view-gantt', ], }, 'profile.listSortBy': { @@ -560,24 +444,6 @@ Users.attachSchema( defaultValue: {}, blackbox: true, }, - 'profile.collapsedLists': { - /** - * Per-user collapsed state for lists. - * profile[boardId][listId] = true|false - */ - type: Object, - defaultValue: {}, - blackbox: true, - }, - 'profile.collapsedSwimlanes': { - /** - * Per-user collapsed state for swimlanes. - * profile[boardId][swimlaneId] = true|false - */ - type: Object, - defaultValue: {}, - blackbox: true, - }, 'profile.keyboardShortcuts': { /** * User-specified state of keyboard shortcut activation. @@ -624,15 +490,6 @@ Users.attachSchema( type: Boolean, defaultValue: false, }, - 'profile.cardZoom': { - /** - * User-specified zoom level for card details (1.0 = 100%, 1.5 = 150%, etc.) - */ - type: Number, - defaultValue: 1.0, - min: 0.5, - max: 3.0, - }, services: { /** * services field of the user @@ -712,41 +569,15 @@ Users.attachSchema( }), ); -// Security helpers for user updates -export const USER_UPDATE_ALLOWED_EXACT = ['username', 'profile']; -export const USER_UPDATE_ALLOWED_PREFIXES = ['profile.']; -export const USER_UPDATE_FORBIDDEN_PREFIXES = [ - 'services', - 'emails', - 'roles', - 'isAdmin', - 'createdThroughApi', - 'orgs', - 'teams', - 'loginDisabled', - 'authenticationMethod', - 'sessionData', -]; - -export function isUserUpdateAllowed(fields) { - return fields.every((f) => - USER_UPDATE_ALLOWED_EXACT.includes(f) || USER_UPDATE_ALLOWED_PREFIXES.some((p) => f.startsWith(p)) - ); -} - -export function hasForbiddenUserUpdateField(fields) { - return fields.some((f) => USER_UPDATE_FORBIDDEN_PREFIXES.some((p) => f === p || f.startsWith(p + '.'))); -} - Users.allow({ - update(userId, doc, fields /*, modifier */) { - // Only the owner can update, and only for allowed fields - if (!userId || doc._id !== userId) return false; - if (!Array.isArray(fields) || fields.length === 0) return false; - // Disallow if any forbidden field present - if (hasForbiddenUserUpdateField(fields)) return false; - // Allow only username and profile.* - return isUserUpdateAllowed(fields); + update(userId, doc) { + const user = ReactiveCache.getUser(userId) || ReactiveCache.getCurrentUser(); + if (user?.isAdmin) + return true; + if (!user) { + return false; + } + return doc._id === userId; }, remove(userId, doc) { // Disable direct client-side user removal for security @@ -757,10 +588,10 @@ Users.allow({ fetch: [], }); -// Deny any attempts to touch forbidden fields from client updates +// Non-Admin users can not change to Admin Users.deny({ - update(userId, doc, fields /*, modifier */) { - return hasForbiddenUserUpdateField(fields); + update(userId, board, fieldNames) { + return _.contains(fieldNames, 'isAdmin') && !ReactiveCache.getCurrentUser().isAdmin; }, fetch: [], }); @@ -827,7 +658,6 @@ Users.safeFields = { 'profile.initials': 1, 'profile.zoomLevel': 1, 'profile.mobileMode': 1, - 'profile.GreyIcons': 1, orgs: 1, teams: 1, authenticationMethod: 1, @@ -953,13 +783,17 @@ Users.helpers({ return ret; }, boards() { - // Fetch unsorted; sorting is per-user via profile.boardSortIndex - return Boards.userBoards(this._id, null, {}, {}); + return Boards.userBoards(this._id, null, {}, { sort: { sort: 1 } }); }, starredBoards() { const { starredBoards = [] } = this.profile || {}; - return Boards.userBoards(this._id, false, { _id: { $in: starredBoards } }, {}); + return Boards.userBoards( + this._id, + false, + { _id: { $in: starredBoards } }, + { sort: { sort: 1 } }, + ); }, hasStarred(boardId) { @@ -974,7 +808,12 @@ Users.helpers({ invitedBoards() { const { invitedBoards = [] } = this.profile || {}; - return Boards.userBoards(this._id, false, { _id: { $in: invitedBoards } }, {}); + return Boards.userBoards( + this._id, + false, + { _id: { $in: invitedBoards } }, + { sort: { sort: 1 } }, + ); }, isInvitedTo(boardId) { @@ -993,32 +832,6 @@ Users.helpers({ } return ret; }, - /** - * Get per-user board sort index for a board, or null when not set - */ - getBoardSortIndex(boardId) { - const mapping = (this.profile && this.profile.boardSortIndex) || {}; - const v = mapping[boardId]; - return typeof v === 'number' ? v : null; - }, - /** - * Sort an array of boards by per-user mapping; fallback to title asc - */ - sortBoardsForUser(boardsArr) { - const mapping = (this.profile && this.profile.boardSortIndex) || {}; - const arr = (boardsArr || []).slice(); - arr.sort((a, b) => { - const ia = typeof mapping[a._id] === 'number' ? mapping[a._id] : Number.POSITIVE_INFINITY; - const ib = typeof mapping[b._id] === 'number' ? mapping[b._id] : Number.POSITIVE_INFINITY; - if (ia !== ib) return ia - ib; - const ta = (a.title || '').toLowerCase(); - const tb = (b.title || '').toLowerCase(); - if (ta < tb) return -1; - if (ta > tb) return 1; - return 0; - }); - return arr; - }, hasSortBy() { // if use doesn't have dragHandle, then we can let user to choose sort list by different order return !this.hasShowDesktopDragHandles(); @@ -1181,11 +994,6 @@ Users.helpers({ return profile.showDesktopDragHandles || false; }, - hasGreyIcons() { - const profile = this.profile || {}; - return profile.GreyIcons || false; - }, - hasCustomFieldsGrid() { const profile = this.profile || {}; return profile.customFieldsGrid || false; @@ -1291,23 +1099,20 @@ Users.helpers({ return this.getListWidth(boardId, listId); } - // For non-logged-in users, get from validated localStorage - if (typeof localStorage !== 'undefined' && typeof getValidatedLocalStorageData === 'function') { - try { - const widths = getValidatedLocalStorageData('wekan-list-widths', validators.listWidths); + // For non-logged-in users, get from localStorage + try { + const stored = localStorage.getItem('wekan-list-widths'); + if (stored) { + const widths = JSON.parse(stored); if (widths[boardId] && widths[boardId][listId]) { - const width = widths[boardId][listId]; - // Validate it's a valid number - if (validators.isValidNumber(width, 100, 1000)) { - return width; - } + return widths[boardId][listId]; } - } catch (e) { - console.warn('Error reading list widths from localStorage:', e); } + } catch (e) { + console.warn('Error reading list widths from localStorage:', e); } - return 270; // Return default width + return 270; // Return default width instead of -1 }, setListWidthToStorage(boardId, listId, width) { @@ -1316,29 +1121,22 @@ Users.helpers({ return this.setListWidth(boardId, listId, width); } - // Validate width before storing - if (!validators.isValidNumber(width, 100, 1000)) { - console.warn('Invalid list width:', width); + // For non-logged-in users, save to localStorage + try { + const stored = localStorage.getItem('wekan-list-widths'); + let widths = stored ? JSON.parse(stored) : {}; + + if (!widths[boardId]) { + widths[boardId] = {}; + } + widths[boardId][listId] = width; + + localStorage.setItem('wekan-list-widths', JSON.stringify(widths)); + return true; + } catch (e) { + console.warn('Error saving list width to localStorage:', e); return false; } - - // For non-logged-in users, save to validated localStorage - if (typeof localStorage !== 'undefined' && typeof setValidatedLocalStorageData === 'function') { - try { - const widths = getValidatedLocalStorageData('wekan-list-widths', validators.listWidths); - - if (!widths[boardId]) { - widths[boardId] = {}; - } - widths[boardId][listId] = width; - - return setValidatedLocalStorageData('wekan-list-widths', widths, validators.listWidths); - } catch (e) { - console.warn('Error saving list width to localStorage:', e); - return false; - } - } - return false; }, getListConstraintFromStorage(boardId, listId) { @@ -1432,135 +1230,6 @@ Users.helpers({ return false; } }, - // Per-user collapsed state helpers for lists/swimlanes - getCollapsedList(boardId, listId) { - const { collapsedLists = {} } = this.profile || {}; - if (collapsedLists[boardId] && typeof collapsedLists[boardId][listId] === 'boolean') { - return collapsedLists[boardId][listId]; - } - return null; - }, - getCollapsedSwimlane(boardId, swimlaneId) { - const { collapsedSwimlanes = {} } = this.profile || {}; - if (collapsedSwimlanes[boardId] && typeof collapsedSwimlanes[boardId][swimlaneId] === 'boolean') { - return collapsedSwimlanes[boardId][swimlaneId]; - } - return null; - }, - setCollapsedListToStorage(boardId, listId, collapsed) { - // Logged-in users: save to profile - if (this._id) { - return this.setCollapsedList(boardId, listId, collapsed); - } - // Public users: save to cookie - try { - const name = 'wekan-collapsed-lists'; - const stored = (typeof document !== 'undefined') ? document.cookie : ''; - const cookies = stored.split(';').map(c => c.trim()); - let json = '{}'; - for (const c of cookies) { - if (c.startsWith(name + '=')) { - json = decodeURIComponent(c.substring(name.length + 1)); - break; - } - } - let data = {}; - try { data = JSON.parse(json || '{}'); } catch (e) { data = {}; } - if (!data[boardId]) data[boardId] = {}; - data[boardId][listId] = !!collapsed; - const serialized = encodeURIComponent(JSON.stringify(data)); - const maxAge = 60 * 60 * 24 * 365; // 1 year - document.cookie = `${name}=${serialized}; path=/; max-age=${maxAge}`; - return true; - } catch (e) { - console.warn('Error saving collapsed list to cookie:', e); - return false; - } - }, - getCollapsedListFromStorage(boardId, listId) { - // Logged-in users: read from profile - if (this._id) { - const v = this.getCollapsedList(boardId, listId); - return v; - } - // Public users: read from cookie - try { - const name = 'wekan-collapsed-lists'; - const stored = (typeof document !== 'undefined') ? document.cookie : ''; - const cookies = stored.split(';').map(c => c.trim()); - let json = '{}'; - for (const c of cookies) { - if (c.startsWith(name + '=')) { - json = decodeURIComponent(c.substring(name.length + 1)); - break; - } - } - const data = JSON.parse(json || '{}'); - if (data[boardId] && typeof data[boardId][listId] === 'boolean') { - return data[boardId][listId]; - } - } catch (e) { - console.warn('Error reading collapsed list from cookie:', e); - } - return null; - }, - setCollapsedSwimlaneToStorage(boardId, swimlaneId, collapsed) { - // Logged-in users: save to profile - if (this._id) { - return this.setCollapsedSwimlane(boardId, swimlaneId, collapsed); - } - // Public users: save to cookie - try { - const name = 'wekan-collapsed-swimlanes'; - const stored = (typeof document !== 'undefined') ? document.cookie : ''; - const cookies = stored.split(';').map(c => c.trim()); - let json = '{}'; - for (const c of cookies) { - if (c.startsWith(name + '=')) { - json = decodeURIComponent(c.substring(name.length + 1)); - break; - } - } - let data = {}; - try { data = JSON.parse(json || '{}'); } catch (e) { data = {}; } - if (!data[boardId]) data[boardId] = {}; - data[boardId][swimlaneId] = !!collapsed; - const serialized = encodeURIComponent(JSON.stringify(data)); - const maxAge = 60 * 60 * 24 * 365; // 1 year - document.cookie = `${name}=${serialized}; path=/; max-age=${maxAge}`; - return true; - } catch (e) { - console.warn('Error saving collapsed swimlane to cookie:', e); - return false; - } - }, - getCollapsedSwimlaneFromStorage(boardId, swimlaneId) { - // Logged-in users: read from profile - if (this._id) { - const v = this.getCollapsedSwimlane(boardId, swimlaneId); - return v; - } - // Public users: read from cookie - try { - const name = 'wekan-collapsed-swimlanes'; - const stored = (typeof document !== 'undefined') ? document.cookie : ''; - const cookies = stored.split(';').map(c => c.trim()); - let json = '{}'; - for (const c of cookies) { - if (c.startsWith(name + '=')) { - json = decodeURIComponent(c.substring(name.length + 1)); - break; - } - } - const data = JSON.parse(json || '{}'); - if (data[boardId] && typeof data[boardId][swimlaneId] === 'boolean') { - return data[boardId][swimlaneId]; - } - } catch (e) { - console.warn('Error reading collapsed swimlane from cookie:', e); - } - return null; - }, }); Users.mutations({ @@ -1611,19 +1280,6 @@ Users.mutations({ }, }; }, - /** - * Set per-user board sort index for a board - * Stored at profile.boardSortIndex[boardId] = sortIndex (Number) - */ - setBoardSortIndex(boardId, sortIndex) { - const mapping = (this.profile && this.profile.boardSortIndex) || {}; - mapping[boardId] = sortIndex; - return { - $set: { - 'profile.boardSortIndex': mapping, - }, - }; - }, toggleAutoWidth(boardId) { const { autoWidthBoards = {} } = this.profile || {}; autoWidthBoards[boardId] = !autoWidthBoards[boardId]; @@ -1735,14 +1391,6 @@ Users.mutations({ }; }, - toggleCardCollapsed(value = false) { - return { - $set: { - 'profile.cardCollapsed': !value, - }, - }; - }, - toggleLabelText(value = false) { return { $set: { @@ -1757,13 +1405,6 @@ Users.mutations({ }, }; }, - toggleGreyIcons(value = false) { - return { - $set: { - 'profile.GreyIcons': !value, - }, - }; - }, addNotification(activityId) { return { @@ -1879,26 +1520,6 @@ Users.mutations({ }, }; }, - setCollapsedList(boardId, listId, collapsed) { - const current = (this.profile && this.profile.collapsedLists) || {}; - if (!current[boardId]) current[boardId] = {}; - current[boardId][listId] = !!collapsed; - return { - $set: { - 'profile.collapsedLists': current, - }, - }; - }, - setCollapsedSwimlane(boardId, swimlaneId, collapsed) { - const current = (this.profile && this.profile.collapsedSwimlanes) || {}; - if (!current[boardId]) current[boardId] = {}; - current[boardId][swimlaneId] = !!collapsed; - return { - $set: { - 'profile.collapsedSwimlanes': current, - }, - }; - }, setZoomLevel(level) { return { @@ -1915,14 +1536,6 @@ Users.mutations({ }, }; }, - - setCardZoom(level) { - return { - $set: { - 'profile.cardZoom': level, - }, - }; - }, }); Meteor.methods({ @@ -1974,115 +1587,10 @@ Meteor.methods({ check(value, String); ReactiveCache.getCurrentUser().setListSortBy(value); }, - toggleBoardStar(boardId) { - check(boardId, String); - if (!this.userId) { - throw new Meteor.Error('not-logged-in', 'User must be logged in'); - } - const user = Users.findOne(this.userId); - if (!user) { - throw new Meteor.Error('user-not-found', 'User not found'); - } - - // Check if board is already starred - const starredBoards = (user.profile && user.profile.starredBoards) || []; - const isStarred = starredBoards.includes(boardId); - - // Build update object - const updateObject = isStarred - ? { $pull: { 'profile.starredBoards': boardId } } - : { $addToSet: { 'profile.starredBoards': boardId } }; - - Users.update(this.userId, updateObject); - }, - toggleGreyIcons(value) { - if (!this.userId) { - throw new Meteor.Error('not-logged-in', 'User must be logged in'); - } - if (value !== undefined) check(value, Boolean); - - const user = Users.findOne(this.userId); - if (!user) { - throw new Meteor.Error('user-not-found', 'User not found'); - } - - const current = (user.profile && user.profile.GreyIcons) || false; - const newValue = value !== undefined ? value : !current; - - Users.update(this.userId, { $set: { 'profile.GreyIcons': newValue } }); - return newValue; - }, toggleDesktopDragHandles() { const user = ReactiveCache.getCurrentUser(); user.toggleDesktopHandles(user.hasShowDesktopDragHandles()); }, - // Spaces: create a new space under parentId (or root when null) - createWorkspace({ parentId = null, name }) { - check(name, String); - if (!this.userId) throw new Meteor.Error('not-logged-in'); - const user = Users.findOne(this.userId) || {}; - const tree = (user.profile && user.profile.boardWorkspacesTree) ? EJSON.clone(user.profile.boardWorkspacesTree) : []; - - const newNode = { id: Random.id(), name, children: [] }; - - if (!parentId) { - tree.push(newNode); - } else { - const insertInto = (nodes) => { - for (let n of nodes) { - if (n.id === parentId) { - n.children = n.children || []; - n.children.push(newNode); - return true; - } - if (n.children && n.children.length) { - if (insertInto(n.children)) return true; - } - } - return false; - }; - insertInto(tree); - } - - Users.update(this.userId, { $set: { 'profile.boardWorkspacesTree': tree } }); - return newNode; - }, - // Spaces: set entire tree (used for drag-drop reordering) - setWorkspacesTree(newTree) { - check(newTree, Array); - if (!this.userId) throw new Meteor.Error('not-logged-in'); - Users.update(this.userId, { $set: { 'profile.boardWorkspacesTree': newTree } }); - return true; - }, - // Assign a board to a space - assignBoardToWorkspace(boardId, spaceId) { - check(boardId, String); - check(spaceId, String); - if (!this.userId) throw new Meteor.Error('not-logged-in'); - - const user = Users.findOne(this.userId); - const assignments = user.profile?.boardWorkspaceAssignments || {}; - assignments[boardId] = spaceId; - - Users.update(this.userId, { - $set: { 'profile.boardWorkspaceAssignments': assignments } - }); - return true; - }, - // Remove a board assignment (moves it back to Remaining) - unassignBoardFromWorkspace(boardId) { - check(boardId, String); - if (!this.userId) throw new Meteor.Error('not-logged-in'); - - const user = Users.findOne(this.userId); - const assignments = user.profile?.boardWorkspaceAssignments || {}; - delete assignments[boardId]; - - Users.update(this.userId, { - $set: { 'profile.boardWorkspaceAssignments': assignments } - }); - return true; - }, toggleHideCheckedItems() { const user = ReactiveCache.getCurrentUser(); user.toggleHideCheckedItems(); @@ -2095,11 +1603,6 @@ Meteor.methods({ const user = ReactiveCache.getCurrentUser(); user.toggleCardMaximized(user.hasCardMaximized()); }, - setCardCollapsed(value) { - check(value, Boolean); - if (!this.userId) throw new Meteor.Error('not-logged-in'); - Users.update(this.userId, { $set: { 'profile.cardCollapsed': value } }); - }, toggleMinicardLabelText() { const user = ReactiveCache.getCurrentUser(); user.toggleLabelText(user.hasHiddenMinicardLabelText()); @@ -2129,26 +1632,6 @@ Meteor.methods({ user.setListWidth(boardId, listId, width); user.setListConstraint(boardId, listId, constraint); }, - setListCollapsedState(boardId, listId, collapsed) { - check(boardId, String); - check(listId, String); - check(collapsed, Boolean); - if (!this.userId) { - throw new Meteor.Error('not-logged-in', 'User must be logged in'); - } - const user = Users.findOne(this.userId); - if (!user) { - throw new Meteor.Error('user-not-found', 'User not found'); - } - const current = (user.profile && user.profile.collapsedLists) || {}; - if (!current[boardId]) current[boardId] = {}; - current[boardId][listId] = !!collapsed; - Users.update(this.userId, { - $set: { - 'profile.collapsedLists': current, - }, - }); - }, applySwimlaneHeight(boardId, swimlaneId, height) { check(boardId, String); check(swimlaneId, String); @@ -2157,27 +1640,6 @@ Meteor.methods({ user.setSwimlaneHeight(boardId, swimlaneId, height); }, - setSwimlaneCollapsedState(boardId, swimlaneId, collapsed) { - check(boardId, String); - check(swimlaneId, String); - check(collapsed, Boolean); - if (!this.userId) { - throw new Meteor.Error('not-logged-in', 'User must be logged in'); - } - const user = Users.findOne(this.userId); - if (!user) { - throw new Meteor.Error('user-not-found', 'User not found'); - } - const current = (user.profile && user.profile.collapsedSwimlanes) || {}; - if (!current[boardId]) current[boardId] = {}; - current[boardId][swimlaneId] = !!collapsed; - Users.update(this.userId, { - $set: { - 'profile.collapsedSwimlanes': current, - }, - }); - }, - applySwimlaneHeightToStorage(boardId, swimlaneId, height) { check(boardId, String); check(swimlaneId, String); @@ -2211,14 +1673,6 @@ Meteor.methods({ const user = ReactiveCache.getCurrentUser(); user.setMobileMode(enabled); }, - setBoardView(view) { - check(view, String); - const user = ReactiveCache.getCurrentUser(); - if (!user) { - throw new Meteor.Error('not-authorized', 'Must be logged in'); - } - user.setBoardView(view); - }, }); if (Meteor.isServer) { @@ -3316,10 +2770,6 @@ if (Meteor.isServer) { * @param {boolean} isNoComments disable comments * @param {boolean} isCommentOnly only enable comments * @param {boolean} isWorker is the user a board worker - * @param {boolean} isNormalAssignedOnly only see assigned cards (Normal permission) - * @param {boolean} isCommentAssignedOnly only comment on assigned cards - * @param {boolean} isReadOnly read-only access (no comments or editing) - * @param {boolean} isReadAssignedOnly read-only assigned cards only * @return_type {_id: string, * title: string} */ @@ -3332,7 +2782,7 @@ if (Meteor.isServer) { const userId = req.params.userId; const boardId = req.params.boardId; const action = req.body.action; - const { isAdmin, isNoComments, isCommentOnly, isWorker, isNormalAssignedOnly, isCommentAssignedOnly, isReadOnly, isReadAssignedOnly } = req.body; + const { isAdmin, isNoComments, isCommentOnly, isWorker } = req.body; let data = ReactiveCache.getUser(userId); if (data !== undefined) { if (action === 'add') { @@ -3351,10 +2801,6 @@ if (Meteor.isServer) { isTrue(isNoComments), isTrue(isCommentOnly), isTrue(isWorker), - isTrue(isNormalAssignedOnly), - isTrue(isCommentAssignedOnly), - isTrue(isReadOnly), - isTrue(isReadAssignedOnly), userId, ); } diff --git a/models/wekanCreator.js b/models/wekanCreator.js index 2bf142d50..4d7f4425d 100644 --- a/models/wekanCreator.js +++ b/models/wekanCreator.js @@ -76,33 +76,6 @@ export class WekanCreator { // maps a wekanCardId to an array of wekanAttachments this.attachments = {}; - - // default swimlane id created during import if necessary - this._defaultSwimlaneId = null; - - // Normalize possible exported id fields: some exports may use `id` instead of `_id`. - // Ensure every item we rely on has an `_id` so mappings work consistently. - const normalizeIds = arr => { - if (!arr) return; - arr.forEach(item => { - if (item && item.id && !item._id) { - item._id = item.id; - } - }); - }; - - normalizeIds(data.lists); - normalizeIds(data.cards); - normalizeIds(data.swimlanes); - normalizeIds(data.checklists); - normalizeIds(data.checklistItems); - normalizeIds(data.triggers); - normalizeIds(data.actions); - normalizeIds(data.labels); - normalizeIds(data.customFields); - normalizeIds(data.comments); - normalizeIds(data.activities); - normalizeIds(data.rules); } /** @@ -375,7 +348,7 @@ export class WekanCreator { dateLastActivity: this._now(), description: card.description, listId: this.lists[card.listId], - swimlaneId: this.swimlanes[card.swimlaneId] || this._defaultSwimlaneId, + swimlaneId: this.swimlanes[card.swimlaneId], sort: card.sort, title: card.title, // we attribute the card to its creator if available @@ -615,25 +588,6 @@ export class WekanCreator { } createSwimlanes(wekanSwimlanes, boardId) { - // If no swimlanes provided, create a default so cards still render - if (!wekanSwimlanes || wekanSwimlanes.length === 0) { - const swimlaneToCreate = { - archived: false, - boardId, - createdAt: this._now(), - title: 'Default', - sort: 0, - }; - const created = Swimlanes.direct.insert(swimlaneToCreate); - Swimlanes.direct.update(created, { - $set: { - updatedAt: this._now(), - }, - }); - this._defaultSwimlaneId = created; - return; - } - wekanSwimlanes.forEach((swimlane, swimlaneIndex) => { const swimlaneToCreate = { archived: swimlane.archived, @@ -657,9 +611,6 @@ export class WekanCreator { }, }); this.swimlanes[swimlane._id] = swimlaneId; - if (!this._defaultSwimlaneId) { - this._defaultSwimlaneId = swimlaneId; - } }); } diff --git a/package-lock.json b/package-lock.json index 84107f1de..51a1f4bef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "wekan", - "version": "v8.19.0", + "version": "v8.11.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -69,9 +69,9 @@ } }, "@rwap/jquery-ui-touch-punch": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rwap/jquery-ui-touch-punch/-/jquery-ui-touch-punch-1.1.5.tgz", - "integrity": "sha512-2rGIFBjqjo/U8RWKLAIi4hhZLBy64KReoWjlgHRSKO6BGXDKis+aD1wwcM67KhavJsV3pYaXSK0XlDRw3apmag==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@rwap/jquery-ui-touch-punch/-/jquery-ui-touch-punch-1.0.11.tgz", + "integrity": "sha512-GFRfHxnl9uH4v4F7E+rtXYbcsDYSas5fqfmKWVy/dfs+BDfLUqClIOL5MZlroDFoL3T9bCbsFMFXULHSL34ZdA==", "requires": { "jquery-ui": ">=1.8" } @@ -106,9 +106,9 @@ } }, "@sinonjs/text-encoding": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz", - "integrity": "sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", + "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", "dev": true }, "@tokenizer/token": { @@ -133,14 +133,12 @@ "optional": true }, "@wekanteam/dragscroll": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/@wekanteam/dragscroll/-/dragscroll-0.0.9.tgz", - "integrity": "sha512-DAz2ZDtUn7dd0Zol1wdKkhSG4U+OwlDcGzeu1t8XwWh9SKtfTaIaMYTqTvJfAg2B3ilIHp2k64c5mqOiRq5lWQ==" + "version": "git+https://github.com/wekan/dragscroll.git#6ea215c8cdbde9362ecba8ffb72ce9f9fde842d2", + "from": "git+https://github.com/wekan/dragscroll.git" }, "@wekanteam/exceljs": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@wekanteam/exceljs/-/exceljs-4.6.0.tgz", - "integrity": "sha512-R5var++3oPGTbfPrswOuQQEP8XsookaErND1vHkVkpnCuirCAcmEiLLdcakAJHFQVwxDANpN4lYzS1qSXSXCPg==", + "version": "git+https://github.com/wekan/exceljs.git#e0229907e7a81bc3fe6daf4e42b1fdfbecdcb7cb", + "from": "git+https://github.com/wekan/exceljs.git", "requires": { "archiver": "^5.0.0", "dayjs": "^1.8.34", @@ -159,26 +157,21 @@ "integrity": "sha512-PxeGIu/HMjmL84N2Dj5qp4lFlBP4jV/y6WU/JhDiFPx6gfGEWXgDcc9sShTPNvECtToGAA0SCD6T/k50CMHi8Q==" }, "@wekanteam/meteor-globals": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@wekanteam/meteor-globals/-/meteor-globals-1.1.6.tgz", - "integrity": "sha512-JJJZLXbvdpfRYtBBQ9JEk0iLU6yCs076r+qJ4e8gMD/AQpva7xOeLzMPdmzfemQ0M/Asa+7mVS1tU+2/5VQO9w==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@wekanteam/meteor-globals/-/meteor-globals-1.1.4.tgz", + "integrity": "sha512-zaq+/F+5/aI46JXXcp3LhcYrM+ZQ0aH99BKuFyP0Ie1ACnYPqHqhUwCwScGiauxmMc9abHduC6DJTbxnJGc2QQ==", "requires": { "semver": "^7.5.4" } }, "@wekanteam/meteor-reactive-cache": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@wekanteam/meteor-reactive-cache/-/meteor-reactive-cache-1.0.7.tgz", - "integrity": "sha512-PSxoCX46sGcLygaKN/i/DrtPbKbm8AOnuNzK8lBE1BQTFkdnr7KBG2neGjFDbwLRHGmvvSfYStUmPtAk6xfx8w==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@wekanteam/meteor-reactive-cache/-/meteor-reactive-cache-1.0.6.tgz", + "integrity": "sha512-xewS5N2ON5oN1+HWaAZhnSF7oNR/yfcXfSunVxjrCSExu3OzD1JMGK5FTxGYYzN3ShJgWGLSmjw7zL6+gvQxgg==", "requires": { - "@wekanteam/meteor-globals": "^1.1.6" + "@wekanteam/meteor-globals": "^1.1.4" } }, - "@xmldom/xmldom": { - "version": "0.9.8", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.9.8.tgz", - "integrity": "sha512-p96FSY54r+WJ50FIOsCOjyj/wavs8921hG5+kVMmZgKcvIKxMXHTrjNJvRgWa/zuX3B6t2lijLNFaOyuxUH+2A==" - }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -232,9 +225,9 @@ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "aproba": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.1.0.tgz", - "integrity": "sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" }, "archiver": { "version": "5.3.2", @@ -328,14 +321,6 @@ "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==" }, - "available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "requires": { - "possible-typed-array-names": "^1.0.0" - } - }, "backoff": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", @@ -439,17 +424,6 @@ "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==" }, - "call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "requires": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - } - }, "call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", @@ -466,6 +440,48 @@ "requires": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" + }, + "dependencies": { + "es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==" + }, + "get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "requires": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + } + }, + "gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" + }, + "has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==" + }, + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "requires": { + "function-bind": "^1.1.2" + } + } } }, "chainsaw": { @@ -477,9 +493,9 @@ } }, "chart.js": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.1.tgz", - "integrity": "sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.0.tgz", + "integrity": "sha512-aYeC/jDgSEx8SHWZvANYMioYMZ2KX02W6f6uVfyteuCGcadDLcYVHdfdygsTQkQ4TKn5lghoojAsPj5pu0SnvQ==", "requires": { "@kurkle/color": "^0.3.0" } @@ -583,31 +599,21 @@ } }, "css-what": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", - "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==" + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==" }, "dayjs": { - "version": "1.11.19", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.19.tgz", - "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==" + "version": "1.11.18", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.18.tgz", + "integrity": "sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==" }, "debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { - "ms": "^2.1.3" - } - }, - "define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "requires": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" + "ms": "2.1.2" } }, "delegates": { @@ -616,14 +622,14 @@ "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" }, "detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==" }, "diff": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", - "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", "dev": true }, "dom-serializer": { @@ -650,9 +656,9 @@ } }, "dompurify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.1.tgz", - "integrity": "sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.7.tgz", + "integrity": "sha512-WhL/YuveyGXJaerVlMYGWhvQswa7myDG17P7Vu65EWC05o8vfeNbvNf4d/BOvH99+ZW+LlQsc1GDKMa1vNK6dw==", "requires": { "@types/trusted-types": "^2.0.7" } @@ -675,6 +681,13 @@ "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" + }, + "dependencies": { + "gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" + } } }, "duplexer2": { @@ -733,9 +746,26 @@ "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==" }, "es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "requires": { + "get-intrinsic": "^1.2.4" + }, + "dependencies": { + "get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "requires": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + } + } + } }, "es-errors": { "version": "1.3.0", @@ -840,19 +870,11 @@ "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==" }, "flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, - "for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", - "requires": { - "is-callable": "^1.2.7" - } - }, "fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", @@ -932,20 +954,14 @@ } }, "get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", "requires": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" } }, "get-proto": { @@ -971,9 +987,12 @@ } }, "gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "requires": { + "get-intrinsic": "^1.1.3" + } }, "graceful-fs": { "version": "4.2.11", @@ -986,26 +1005,15 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "requires": { - "es-define-property": "^1.0.0" - } + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" }, "has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==" - }, - "has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "requires": { - "has-symbols": "^1.0.3" - } + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" }, "has-unicode": { "version": "2.0.1", @@ -1013,9 +1021,9 @@ "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" }, "hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", "requires": { "function-bind": "^1.1.2" } @@ -1095,14 +1103,6 @@ "@types/estree": "*" } }, - "is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "requires": { - "which-typed-array": "^1.1.16" - } - }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -1179,9 +1179,9 @@ } }, "just-extend": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-6.2.0.tgz", - "integrity": "sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", "dev": true }, "lazystream": { @@ -1336,6 +1336,14 @@ "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, "magic-string": { "version": "0.25.9", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", @@ -1417,18 +1425,17 @@ "integrity": "sha512-SBbbYWvFYvsxHVL+q6ZB8lT3rp2LSvfALD2V52H+MGH2IgJsevy0VtXRkRG0EsUewwOaDTIKBn9DlD8HQ3GSwg==" }, "meteor-node-stubs": { - "version": "npm:@wekanteam/meteor-node-stubs@1.2.7", - "resolved": "https://registry.npmjs.org/@wekanteam/meteor-node-stubs/-/meteor-node-stubs-1.2.7.tgz", - "integrity": "sha512-nyubr6CJZUujQbu7V+iVghqDLQDy6YZ20ublMCNEaJhc2LQFwABi09AHVZL11bwLfMtPQuj+7JI1V0oaDvnbmw==", + "version": "1.2.24", + "resolved": "https://registry.npmjs.org/meteor-node-stubs/-/meteor-node-stubs-1.2.24.tgz", + "integrity": "sha512-tw9QzDFVOI5A5CcEw4tTD6CjF+Lk14uzhy2gWH5ImoH4mx4pyPVcha9MmyVur+rEVgpzk+aMG6rs3RxAF9SwiA==", "requires": { + "@meteorjs/crypto-browserify": "^3.12.1", "assert": "^2.1.0", "browserify-zlib": "^0.2.0", "buffer": "^5.7.1", "console-browserify": "^1.2.0", "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.12.0", "domain-browser": "^4.23.0", - "elliptic": "^6.6.0", "events": "^3.3.0", "https-browserify": "^1.0.0", "os-browserify": "^0.3.0", @@ -1437,345 +1444,85 @@ "punycode": "^1.4.1", "querystring-es3": "^0.2.1", "readable-stream": "^3.6.2", + "sha.js": "^2.4.12", "stream-browserify": "^3.0.0", "stream-http": "^3.2.0", "string_decoder": "^1.3.0", "timers-browserify": "^2.0.12", "tty-browserify": "0.0.1", - "url": "^0.11.3", + "url": "^0.11.4", "util": "^0.12.5", "vm-browserify": "^1.1.2" }, "dependencies": { - "asn1.js": { - "version": "5.4.1", - "bundled": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "bundled": true - } - } - }, - "assert": { - "version": "2.1.0", - "bundled": true, - "requires": { - "call-bind": "^1.0.2", - "is-nan": "^1.3.2", - "object-is": "^1.1.5", - "object.assign": "^4.1.4", - "util": "^0.12.5" - } - }, - "available-typed-arrays": { - "version": "1.0.5", - "bundled": true - }, - "base64-js": { - "version": "1.5.1", - "bundled": true - }, - "bn.js": { - "version": "5.2.0", - "bundled": true - }, - "brorand": { - "version": "1.1.0", - "bundled": true - }, - "browserify-aes": { - "version": "1.2.0", - "bundled": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "bundled": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "bundled": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.1.0", - "bundled": true, - "requires": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.2.2", - "bundled": true, + "@meteorjs/browserify-sign": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@meteorjs/browserify-sign/-/browserify-sign-4.2.6.tgz", + "integrity": "sha512-xnQRbIrjHxaVbOEbzbcdav4QDRTnfRAVHi21SPosnGNiIHTdTeGQGmTF/f7GwntxqynabSifdBHeGA7W8lIKSQ==", "requires": { "bn.js": "^5.2.1", + "brorand": "^1.1.0", "browserify-rsa": "^4.1.0", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", - "elliptic": "^6.5.4", + "hash-base": "~3.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", "inherits": "^2.0.4", - "parse-asn1": "^5.1.6", - "readable-stream": "^3.6.2", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1", + "parse-asn1": "^5.1.7", + "readable-stream": "^2.3.8", "safe-buffer": "^5.2.1" }, "dependencies": { - "bn.js": { - "version": "5.2.1", - "bundled": true - } - } - }, - "browserify-zlib": { - "version": "0.2.0", - "bundled": true, - "requires": { - "pako": "~1.0.5" - } - }, - "buffer": { - "version": "5.7.1", - "bundled": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "buffer-xor": { - "version": "1.0.3", - "bundled": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "bundled": true - }, - "call-bind": { - "version": "1.0.5", - "bundled": true, - "requires": { - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" - } - }, - "call-bind-apply-helpers": { - "version": "1.0.2", - "bundled": true, - "requires": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - } - }, - "call-bound": { - "version": "1.0.4", - "bundled": true, - "requires": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "dependencies": { - "get-intrinsic": { - "version": "1.3.0", - "bundled": true, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "requires": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } } }, - "gopd": { - "version": "1.2.0", - "bundled": true - }, - "has-symbols": { - "version": "1.1.0", - "bundled": true - }, - "hasown": { - "version": "2.0.2", - "bundled": true, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "requires": { - "function-bind": "^1.1.2" + "safe-buffer": "~5.1.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } } } } }, - "cipher-base": { - "version": "1.0.7", - "bundled": true, - "requires": { - "inherits": "^2.0.4", - "safe-buffer": "^5.2.1", - "to-buffer": "^1.2.2" - }, - "dependencies": { - "to-buffer": { - "version": "1.2.2", - "bundled": true, - "requires": { - "isarray": "^2.0.5", - "safe-buffer": "^5.2.1", - "typed-array-buffer": "^1.0.3" - } - } - } - }, - "console-browserify": { - "version": "1.2.0", - "bundled": true - }, - "constants-browserify": { - "version": "1.0.0", - "bundled": true - }, - "create-ecdh": { - "version": "4.0.4", - "bundled": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "bundled": true - } - } - }, - "create-hash": { - "version": "1.2.0", - "bundled": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "bundled": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "crypto-browserify": { - "version": "3.12.0", - "bundled": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "define-data-property": { - "version": "1.1.1", - "bundled": true, - "requires": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - } - }, - "define-properties": { - "version": "1.2.1", - "bundled": true, - "requires": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "des.js": { - "version": "1.0.1", - "bundled": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "diffie-hellman": { - "version": "5.0.3", - "bundled": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "bundled": true - } - } - }, - "domain-browser": { - "version": "4.23.0", - "bundled": true - }, - "dunder-proto": { - "version": "1.0.1", - "bundled": true, - "requires": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "dependencies": { - "gopd": { - "version": "1.2.0", - "bundled": true - } - } - }, - "elliptic": { - "version": "6.6.1", - "bundled": true, + "@meteorjs/create-ecdh": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@meteorjs/create-ecdh/-/create-ecdh-4.0.5.tgz", + "integrity": "sha512-dhn3AICsDlIZ5qY/Qu+QOL+ZGKaHcGss4PQ3CfmAF3f+o5fPJ2aDJcxd5f2au2k6sxyNqvCsLAFYFHXxHoH9yQ==", "requires": { "bn.js": "^4.11.9", "brorand": "^1.1.0", @@ -1787,123 +1534,420 @@ }, "dependencies": { "bn.js": { - "version": "4.12.1", - "bundled": true + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==" } } }, + "@meteorjs/crypto-browserify": { + "version": "3.12.4", + "resolved": "https://registry.npmjs.org/@meteorjs/crypto-browserify/-/crypto-browserify-3.12.4.tgz", + "integrity": "sha512-K5Sgvxef93Zrw5T9cJxKuNVgpl1C2W8cfcicN6HKy98G6RoIrx6hikwWnq8FlagvOzdIQEC2s+SMn7UFNSK0eA==", + "requires": { + "@meteorjs/browserify-sign": "^4.2.3", + "@meteorjs/create-ecdh": "^4.0.4", + "browserify-cipher": "^1.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "diffie-hellman": "^5.0.3", + "hash-base": "~3.0.4", + "inherits": "^2.0.4", + "pbkdf2": "^3.1.2", + "public-encrypt": "^4.0.3", + "randombytes": "^2.1.0", + "randomfill": "^1.0.4" + } + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==" + } + } + }, + "assert": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", + "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", + "requires": { + "call-bind": "^1.0.2", + "is-nan": "^1.3.2", + "object-is": "^1.1.5", + "object.assign": "^4.1.4", + "util": "^0.12.5" + } + }, + "available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "requires": { + "possible-typed-array-names": "^1.0.0" + } + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "bn.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", + "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==" + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.1.tgz", + "integrity": "sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==", + "requires": { + "bn.js": "^5.2.1", + "randombytes": "^2.1.0", + "safe-buffer": "^5.2.1" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "requires": { + "pako": "~1.0.5" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==" + }, + "call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "requires": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + } + }, + "call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "requires": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + } + }, + "call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "requires": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + } + }, + "cipher-base": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.6.tgz", + "integrity": "sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==", + "requires": { + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1" + } + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==" + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + } + }, + "define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "requires": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "des.js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==" + } + } + }, + "domain-browser": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.23.0.tgz", + "integrity": "sha512-ArzcM/II1wCCujdCNyQjXrAFwS4mrLh4C7DZWlaI8mdh7h3BfKdNd3bKXITfl2PT9FtfQqaGvhi1vPRQPimjGA==" + }, + "dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "requires": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + } + }, "es-define-property": { "version": "1.0.1", - "bundled": true + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==" }, "es-errors": { "version": "1.3.0", - "bundled": true + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" }, "es-object-atoms": { "version": "1.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "requires": { "es-errors": "^1.3.0" } }, "events": { "version": "3.3.0", - "bundled": true + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" }, "evp_bytestokey": { "version": "1.0.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "requires": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" } }, "for-each": { - "version": "0.3.3", - "bundled": true, + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "requires": { - "is-callable": "^1.1.3" + "is-callable": "^1.2.7" } }, "function-bind": { "version": "1.1.2", - "bundled": true + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" }, "get-intrinsic": { - "version": "1.2.2", - "bundled": true, + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "requires": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" } }, "get-proto": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "requires": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "gopd": { - "version": "1.0.1", - "bundled": true, - "requires": { - "get-intrinsic": "^1.1.3" - } + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" }, "has-property-descriptors": { - "version": "1.0.1", - "bundled": true, + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "requires": { - "get-intrinsic": "^1.2.2" + "es-define-property": "^1.0.0" } }, - "has-proto": { - "version": "1.0.1", - "bundled": true - }, "has-symbols": { - "version": "1.0.3", - "bundled": true + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==" }, "has-tostringtag": { - "version": "1.0.0", - "bundled": true, + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "requires": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" } }, "hash-base": { - "version": "3.1.0", - "bundled": true, + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.5.tgz", + "integrity": "sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==", "requires": { "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" + "safe-buffer": "^5.2.1" } }, "hash.js": { "version": "1.1.7", - "bundled": true, + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "requires": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" } }, "hasown": { - "version": "2.0.0", - "bundled": true, + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "requires": { "function-bind": "^1.1.2" } }, "hmac-drbg": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", "requires": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", @@ -1912,61 +1956,86 @@ }, "https-browserify": { "version": "1.0.0", - "bundled": true + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==" }, "ieee754": { "version": "1.2.1", - "bundled": true + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, "inherits": { "version": "2.0.4", - "bundled": true + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "is-arguments": { - "version": "1.1.1", - "bundled": true, + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" } }, "is-callable": { "version": "1.2.7", - "bundled": true + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" }, "is-generator-function": { - "version": "1.0.10", - "bundled": true, + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", "requires": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" } }, "is-nan": { "version": "1.3.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", "requires": { "call-bind": "^1.0.0", "define-properties": "^1.1.3" } }, - "is-typed-array": { - "version": "1.1.12", - "bundled": true, + "is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "requires": { - "which-typed-array": "^1.1.11" + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + } + }, + "is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "requires": { + "which-typed-array": "^1.1.16" } }, "isarray": { "version": "2.0.5", - "bundled": true + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" }, "math-intrinsics": { "version": "1.1.0", - "bundled": true + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==" }, "md5.js": { "version": "1.3.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", "requires": { "hash-base": "^3.0.0", "inherits": "^2.0.1", @@ -1975,78 +2044,94 @@ }, "miller-rabin": { "version": "4.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "requires": { "bn.js": "^4.0.0", "brorand": "^1.0.1" }, "dependencies": { "bn.js": { - "version": "4.12.0", - "bundled": true + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==" } } }, "minimalistic-assert": { "version": "1.0.1", - "bundled": true + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, "minimalistic-crypto-utils": { "version": "1.0.1", - "bundled": true + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" }, "object-inspect": { "version": "1.13.4", - "bundled": true + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==" }, "object-is": { - "version": "1.1.5", - "bundled": true, + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" } }, "object-keys": { "version": "1.1.1", - "bundled": true + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, "object.assign": { - "version": "4.1.4", - "bundled": true, + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", "object-keys": "^1.1.1" } }, "os-browserify": { "version": "0.3.0", - "bundled": true + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==" }, "pako": { "version": "1.0.11", - "bundled": true + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" }, "parse-asn1": { - "version": "5.1.6", - "bundled": true, + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.7.tgz", + "integrity": "sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==", "requires": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" + "asn1.js": "^4.10.1", + "browserify-aes": "^1.2.0", + "evp_bytestokey": "^1.0.3", + "hash-base": "~3.0", + "pbkdf2": "^3.1.2", + "safe-buffer": "^5.2.1" } }, "path-browserify": { "version": "1.0.1", - "bundled": true + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" }, "pbkdf2": { "version": "3.1.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.3.tgz", + "integrity": "sha512-wfRLBZ0feWRhCIkoMB6ete7czJcnNnqRpcoWQBLqatqXXmelSRqfdDK4F3u9T2s2cXas/hQJcryI/4lAL+XTlA==", "requires": { "create-hash": "~1.1.3", "create-hmac": "^1.1.7", @@ -2058,7 +2143,8 @@ "dependencies": { "create-hash": { "version": "1.1.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", + "integrity": "sha512-snRpch/kwQhcdlnZKYanNF1m0RDlrCdSKQaH87w1FCFPVPNCQ/Il9QJKAX2jVBZddRdaHBMC+zXa9Gw9tmkNUA==", "requires": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", @@ -2068,14 +2154,16 @@ }, "hash-base": { "version": "2.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", + "integrity": "sha512-0TROgQ1/SxE6KmxWSvXHvRj90/Xo1JvZShofnYF+f6ZsGtR4eES7WfrQzPalmyagfKZCXpVnitiRebZulWsbiw==", "requires": { "inherits": "^2.0.1" } }, "ripemd160": { "version": "2.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", + "integrity": "sha512-J7f4wutN8mdbV08MJnXibYpCOPHR+yzy+iQ/AsjMv2j8cLavQ8VGagDFUwwTAdF8FmRKVeNpbTTEwNHCW1g94w==", "requires": { "hash-base": "^2.0.0", "inherits": "^2.0.1" @@ -2085,15 +2173,23 @@ }, "possible-typed-array-names": { "version": "1.1.0", - "bundled": true + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==" }, "process": { "version": "0.11.10", - "bundled": true + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "public-encrypt": { "version": "4.0.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", "requires": { "bn.js": "^4.1.0", "browserify-rsa": "^4.0.0", @@ -2104,36 +2200,42 @@ }, "dependencies": { "bn.js": { - "version": "4.12.0", - "bundled": true + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==" } } }, "punycode": { "version": "1.4.1", - "bundled": true + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" }, "qs": { - "version": "6.14.1", - "bundled": true, + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", "requires": { "side-channel": "^1.1.0" } }, "querystring-es3": { "version": "0.2.1", - "bundled": true + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==" }, "randombytes": { "version": "2.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "requires": { "safe-buffer": "^5.1.0" } }, "randomfill": { "version": "1.0.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "requires": { "randombytes": "^2.0.5", "safe-buffer": "^5.1.0" @@ -2141,7 +2243,8 @@ }, "readable-stream": { "version": "3.6.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -2150,7 +2253,8 @@ }, "ripemd160": { "version": "2.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "requires": { "hash-base": "^3.0.0", "inherits": "^2.0.1" @@ -2158,29 +2262,41 @@ }, "safe-buffer": { "version": "5.2.1", - "bundled": true + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true + "safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "requires": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + } }, "set-function-length": { - "version": "1.1.1", - "bundled": true, + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "requires": { - "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.2" } }, "setimmediate": { "version": "1.0.5", - "bundled": true + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" }, "sha.js": { "version": "2.4.12", - "bundled": true, + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", + "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", "requires": { "inherits": "^2.0.4", "safe-buffer": "^5.2.1", @@ -2189,7 +2305,8 @@ }, "side-channel": { "version": "1.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "requires": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", @@ -2200,7 +2317,8 @@ }, "side-channel-list": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "requires": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" @@ -2208,94 +2326,31 @@ }, "side-channel-map": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "requires": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" - }, - "dependencies": { - "get-intrinsic": { - "version": "1.3.0", - "bundled": true, - "requires": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - } - }, - "gopd": { - "version": "1.2.0", - "bundled": true - }, - "has-symbols": { - "version": "1.1.0", - "bundled": true - }, - "hasown": { - "version": "2.0.2", - "bundled": true, - "requires": { - "function-bind": "^1.1.2" - } - } } }, "side-channel-weakmap": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "requires": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" - }, - "dependencies": { - "get-intrinsic": { - "version": "1.3.0", - "bundled": true, - "requires": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - } - }, - "gopd": { - "version": "1.2.0", - "bundled": true - }, - "has-symbols": { - "version": "1.1.0", - "bundled": true - }, - "hasown": { - "version": "2.0.2", - "bundled": true, - "requires": { - "function-bind": "^1.1.2" - } - } } }, "stream-browserify": { "version": "3.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", "requires": { "inherits": "~2.0.4", "readable-stream": "^3.5.0" @@ -2303,7 +2358,8 @@ }, "stream-http": { "version": "3.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", + "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", "requires": { "builtin-status-codes": "^3.0.0", "inherits": "^2.0.4", @@ -2313,21 +2369,24 @@ }, "string_decoder": { "version": "1.3.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "requires": { "safe-buffer": "~5.2.0" } }, "timers-browserify": { "version": "2.0.12", - "bundled": true, + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", "requires": { "setimmediate": "^1.0.4" } }, "to-buffer": { "version": "1.2.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.1.tgz", + "integrity": "sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==", "requires": { "isarray": "^2.0.5", "safe-buffer": "^5.2.1", @@ -2336,140 +2395,32 @@ }, "tty-browserify": { "version": "0.0.1", - "bundled": true + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==" }, "typed-array-buffer": { "version": "1.0.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", "requires": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-typed-array": "^1.1.14" - }, - "dependencies": { - "available-typed-arrays": { - "version": "1.0.7", - "bundled": true, - "requires": { - "possible-typed-array-names": "^1.0.0" - } - }, - "call-bind": { - "version": "1.0.8", - "bundled": true, - "requires": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - } - }, - "define-data-property": { - "version": "1.1.4", - "bundled": true, - "requires": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - } - }, - "for-each": { - "version": "0.3.5", - "bundled": true, - "requires": { - "is-callable": "^1.2.7" - } - }, - "get-intrinsic": { - "version": "1.3.0", - "bundled": true, - "requires": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - } - }, - "gopd": { - "version": "1.2.0", - "bundled": true - }, - "has-property-descriptors": { - "version": "1.0.2", - "bundled": true, - "requires": { - "es-define-property": "^1.0.0" - } - }, - "has-symbols": { - "version": "1.1.0", - "bundled": true - }, - "has-tostringtag": { - "version": "1.0.2", - "bundled": true, - "requires": { - "has-symbols": "^1.0.3" - } - }, - "hasown": { - "version": "2.0.2", - "bundled": true, - "requires": { - "function-bind": "^1.1.2" - } - }, - "is-typed-array": { - "version": "1.1.15", - "bundled": true, - "requires": { - "which-typed-array": "^1.1.16" - } - }, - "set-function-length": { - "version": "1.2.2", - "bundled": true, - "requires": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - } - }, - "which-typed-array": { - "version": "1.1.19", - "bundled": true, - "requires": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" - } - } } }, "url": { - "version": "0.11.3", - "bundled": true, + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.4.tgz", + "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==", "requires": { "punycode": "^1.4.1", - "qs": "^6.11.2" + "qs": "^6.12.3" } }, "util": { "version": "0.12.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", "requires": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", @@ -2480,26 +2431,32 @@ }, "util-deprecate": { "version": "1.0.2", - "bundled": true + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "vm-browserify": { "version": "1.1.2", - "bundled": true + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" }, "which-typed-array": { - "version": "1.1.13", - "bundled": true, + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" } }, "xtend": { "version": "4.0.2", - "bundled": true + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" } } }, @@ -2566,39 +2523,65 @@ "integrity": "sha512-EbiwWHvKOF9xhIzuwaqknwPISdkHMipjMs6DiJFicupgBBLEhUs0OOro9MuPkFogB17DZlsV4KJhhxfqZ7ZRMQ==" }, "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "nise": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.9.tgz", - "integrity": "sha512-qOnoujW4SV6e40dYxJOb3uvuoPHtmLzIk4TFo+j0jPJoC+5Z9xja5qH5JZobEPsa8+YYphMrOSwnrshEhG2qww==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.5.tgz", + "integrity": "sha512-VJuPIfUFaXNRzETTQEEItTOP8Y171ijr+JLq42wHes3DiryR8vT+1TXQW/Rx8JNUhyYYWyIvjXTU6dOhJcs9Nw==", "dev": true, "requires": { - "@sinonjs/commons": "^3.0.0", - "@sinonjs/fake-timers": "^11.2.2", - "@sinonjs/text-encoding": "^0.7.2", - "just-extend": "^6.2.0", - "path-to-regexp": "^6.2.1" + "@sinonjs/commons": "^2.0.0", + "@sinonjs/fake-timers": "^10.0.2", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "path-to-regexp": "^1.7.0" }, "dependencies": { "@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", "dev": true, "requires": { "type-detect": "4.0.8" } }, "@sinonjs/fake-timers": { - "version": "11.3.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.3.1.tgz", - "integrity": "sha512-EVJO7nW5M/F5Tur0Rf2z/QoMo+1Ia963RiMtapiQrEWvY0iBUvADo8Beegwjpnle5BHkyHuoxSTW3jF43H1XRA==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "requires": { - "@sinonjs/commons": "^3.0.1" + "@sinonjs/commons": "^3.0.0" + }, + "dependencies": { + "@sinonjs/commons": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + } + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, + "path-to-regexp": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", + "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", + "dev": true, + "requires": { + "isarray": "0.0.1" } } } @@ -2649,9 +2632,9 @@ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" }, "object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==" }, "once": { "version": "1.4.0", @@ -2699,12 +2682,6 @@ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" }, - "path-to-regexp": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", - "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", - "dev": true - }, "peek-readable": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz", @@ -2753,11 +2730,11 @@ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==" }, "qs": { - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", - "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "requires": { - "side-channel": "^1.1.0" + "side-channel": "^1.0.6" } }, "readable-stream": { @@ -2854,75 +2831,89 @@ } }, "semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==" + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "requires": { + "lru-cache": "^6.0.0" + } }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, - "set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "requires": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - } - }, "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" }, "side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "requires": { + "call-bind": "^1.0.7", "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - } - }, - "side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "requires": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - } - }, - "side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "requires": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - } - }, - "side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "requires": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "dependencies": { + "call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + } + }, + "define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + } + }, + "get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "requires": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + } + }, + "has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "requires": { + "es-define-property": "^1.0.0" + } + }, + "set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + } + } } }, "signal-exit": { @@ -2978,19 +2969,19 @@ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" }, "speech-rule-engine": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/speech-rule-engine/-/speech-rule-engine-4.1.2.tgz", - "integrity": "sha512-S6ji+flMEga+1QU79NDbwZ8Ivf0S/MpupQQiIC0rTpU/ZTKgcajijJJb1OcByBQDjrXCN1/DJtGz4ZJeBMPGJw==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/speech-rule-engine/-/speech-rule-engine-4.0.7.tgz", + "integrity": "sha512-sJrL3/wHzNwJRLBdf6CjJWIlxC04iYKkyXvYSVsWVOiC2DSkHmxsqOhEeMsBA9XK+CHuNcsdkbFDnoUfAsmp9g==", "requires": { - "@xmldom/xmldom": "0.9.8", - "commander": "13.1.0", - "wicked-good-xpath": "1.3.0" + "commander": "9.2.0", + "wicked-good-xpath": "1.3.0", + "xmldom-sre": "0.1.31" }, "dependencies": { "commander": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", - "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==" + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.2.0.tgz", + "integrity": "sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w==" } } }, @@ -3069,9 +3060,9 @@ "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==" }, "to-buffer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", - "integrity": "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.1.tgz", + "integrity": "sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==", "requires": { "isarray": "^2.0.5", "safe-buffer": "^5.2.1", @@ -3105,9 +3096,9 @@ "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==" }, "tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "type-detect": { "version": "4.0.8", @@ -3123,6 +3114,138 @@ "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-typed-array": "^1.1.14" + }, + "dependencies": { + "available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "requires": { + "possible-typed-array-names": "^1.0.0" + } + }, + "call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "requires": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + } + }, + "define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + } + }, + "for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "requires": { + "is-callable": "^1.2.7" + } + }, + "get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "requires": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "dependencies": { + "es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==" + } + } + }, + "gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" + }, + "has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "requires": { + "es-define-property": "^1.0.0" + } + }, + "has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==" + }, + "has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "requires": { + "has-symbols": "^1.0.3" + } + }, + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "requires": { + "function-bind": "^1.1.2" + } + }, + "is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "requires": { + "which-typed-array": "^1.1.16" + } + }, + "set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + } + }, + "which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "requires": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + } + } } }, "uc.micro": { @@ -3289,20 +3412,6 @@ "webidl-conversions": "^3.0.0" } }, - "which-typed-array": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", - "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", - "requires": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" - } - }, "wicked-good-xpath": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/wicked-good-xpath/-/wicked-good-xpath-1.3.0.tgz", @@ -3326,6 +3435,11 @@ "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" }, + "xmldom-sre": { + "version": "0.1.31", + "resolved": "https://registry.npmjs.org/xmldom-sre/-/xmldom-sre-0.1.31.tgz", + "integrity": "sha512-f9s+fUkX04BxQf+7mMWAp5zk61pciie+fFLC9hX9UVvCeJQfNHRHXpeo5MPcR0EUf57PYLdt+ZO4f3Ipk2oZUw==" + }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", diff --git a/package.json b/package.json index e5507389b..161a60f4c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "wekan", - "version": "v8.19.0", + "version": "v8.11.0", "description": "Open-Source kanban", "private": true, "repository": { @@ -11,7 +11,7 @@ "bugs": { "url": "https://github.com/wekan/wekan/issues" }, - "homepage": "https://wekan.fi", + "homepage": "https://wekan.github.io", "devDependencies": { "flatted": "^3.3.1", "sinon": "^13.0.2" @@ -21,12 +21,11 @@ "@mapbox/node-pre-gyp": "^1.0.10", "@meteorjs/reify": "^0.25.4", "@rwap/jquery-ui-touch-punch": "^1.0.11", - "@wekanteam/dragscroll": "^0.0.9", - "@wekanteam/exceljs": "^4.6.0", + "@wekanteam/dragscroll": "https://github.com/wekan/dragscroll.git", + "@wekanteam/exceljs": "git+https://github.com/wekan/exceljs.git", "@wekanteam/html-to-markdown": "^1.0.2", - "@wekanteam/meteor-globals": "^1.1.6", - "@wekanteam/meteor-reactive-cache": "^1.0.7", - "meteor-node-stubs": "npm:@wekanteam/meteor-node-stubs@^1.2.7", + "@wekanteam/meteor-globals": "^1.1.4", + "@wekanteam/meteor-reactive-cache": "^1.0.6", "ajv": "^6.12.6", "bcryptjs": "^2.4.3", "bson": "^4.7.2", @@ -47,10 +46,11 @@ "markdown-it-emoji": "^2.0.0", "markdown-it-mathjax3": "^4.3.2", "meteor-accounts-t9n": "^2.6.0", + "meteor-node-stubs": "^1.2.24", "os": "^0.1.2", "papaparse": "^5.5.3", "pretty-ms": "^7.0.1", - "qs": "^6.14.1", + "qs": "^6.13.0", "simpl-schema": "^3.4.6", "source-map-support": "^0.5.20", "to-buffer": "^1.2.1", diff --git a/packages/wekan-ldap/server/ldap.js b/packages/wekan-ldap/server/ldap.js index 890b03b4e..428196423 100644 --- a/packages/wekan-ldap/server/ldap.js +++ b/packages/wekan-ldap/server/ldap.js @@ -208,9 +208,7 @@ export default class LDAP { } } - // Escape the username to prevent LDAP injection - const escapedUsername = escapedToHex(username); - const usernameFilter = this.options.User_Search_Field.split(',').map((item) => `(${item}=${escapedUsername})`); + const usernameFilter = this.options.User_Search_Field.split(',').map((item) => `(${item}=${username})`); if (usernameFilter.length === 0) { Log.error('LDAP_LDAP_User_Search_Field not defined'); @@ -236,13 +234,11 @@ export default class LDAP { /* if SimpleAuth is configured, the BaseDN is not needed */ if (!this.options.BaseDN && !this.options.AD_Simple_Auth) throw new Error('BaseDN is not provided'); - // Escape the username to prevent LDAP injection in DN construction - const escapedUsername = escapedToHex(username); var userDn = ""; if (this.options.AD_Simple_Auth === true || this.options.AD_Simple_Auth === 'true') { - userDn = `${escapedUsername}@${this.options.Default_Domain}`; + userDn = `${username}@${this.options.Default_Domain}`; } else { - userDn = `${this.options.User_Authentication_Field}=${escapedUsername},${this.options.BaseDN}`; + userDn = `${this.options.User_Authentication_Field}=${username},${this.options.BaseDN}`; } Log.info(`Binding with User ${userDn}`); @@ -385,10 +381,8 @@ export default class LDAP { filter.push(')'); - // Escape the username to prevent LDAP injection - const escapedUsername = escapedToHex(username); const searchOptions = { - filter: filter.join('').replace(/#{username}/g, escapedUsername).replace("\\", "\\\\"), + filter: filter.join('').replace(/#{username}/g, username).replace("\\", "\\\\"), scope : 'sub', }; @@ -435,10 +429,8 @@ export default class LDAP { } filter.push(')'); - // Escape the username to prevent LDAP injection - const escapedUsername = escapedToHex(username); const searchOptions = { - filter: filter.join('').replace(/#{username}/g, escapedUsername).replace("\\", "\\\\"), + filter: filter.join('').replace(/#{username}/g, username).replace("\\", "\\\\"), scope : 'sub', }; diff --git a/public/api/wekan.yml b/public/api/wekan.yml index b2dd253fd..cbb1a23a6 100644 --- a/public/api/wekan.yml +++ b/public/api/wekan.yml @@ -1115,6 +1115,12 @@ paths: - multipart/form-data - application/json parameters: + - name: authorId + in: formData + description: | + the user who 'posted' the comment + type: string + required: true - name: comment in: formData description: the comment value @@ -2588,53 +2594,6 @@ paths: properties: _id: type: string - /api/boards/{board}/lists/{list}/cards/{card}/archive: - post: - operationId: archive_card - summary: Archive a card - description: | - Archive a card - tags: - - Cards - consumes: - - multipart/form-data - - application/json - parameters: - - name: board - in: path - description: | - the board ID of the card - type: string - required: true - - name: list - in: path - description: | - the list ID of the card - type: string - required: true - - name: card - in: path - description: | - the ID of the card - type: string - required: true - produces: - - application/json - security: - - UserSecurity: [] - responses: - '200': - description: |- - 200 response - schema: - type: object - properties: - _id: - type: string - archived: - type: boolean - archivedAt: - type: string /api/boards/{board}/lists/{list}/cards/{card}/customFields/{customField}: post: operationId: edit_card_custom_field @@ -2699,51 +2658,6 @@ paths: type: string value: type: object - /api/boards/{board}/lists/{list}/cards/{card}/unarchive: - post: - operationId: unarchive_card - summary: Unarchive card - description: | - Unarchive card - tags: - - Cards - consumes: - - multipart/form-data - - application/json - parameters: - - name: board - in: path - description: | - the board ID of the card - type: string - required: true - - name: list - in: path - description: | - the list ID of the card - type: string - required: true - - name: card - in: path - description: | - the ID of the card - type: string - required: true - produces: - - application/json - security: - - UserSecurity: [] - responses: - '200': - description: |- - 200 response - schema: - type: object - properties: - _id: - type: string - archived: - type: boolean /api/boards/{board}/lists/{list}/cards_count: get: operationId: get_list_cards_count diff --git a/rebuild-wekan.sh b/rebuild-wekan.sh index 6d3475e04..45067cfa0 100755 --- a/rebuild-wekan.sh +++ b/rebuild-wekan.sh @@ -12,7 +12,7 @@ function pause(){ echo PS3='Please enter your choice: ' -options=("Install Wekan dependencies" "Build Wekan" "Run Meteor for dev on http://localhost:4000" "Run Meteor for dev on http://localhost:4000 with trace warnings, and warnings using old Meteor API that will not exist in Meteor 3.0" "Run Meteor for dev on http://localhost:4000 with bundle visualizer" "Run Meteor for dev on http://CURRENT-IP-ADDRESS:4000" "Run Meteor for dev on http://CURRENT-IP-ADDRESS:4000 with MONGO_URL=mongodb://127.0.0.1:27019/wekan" "Run Meteor for dev on http://CUSTOM-IP-ADDRESS:PORT" "Run tests" "Save Meteor dependency chain to ../meteor-deps.txt" "Quit") +options=("Install Wekan dependencies" "Build Wekan" "Run Meteor for dev on http://localhost:4000" "Run Meteor for dev on http://localhost:4000 with trace warnings, and warnings using old Meteor API that will not exist in Meteor 3.0" "Run Meteor for dev on http://localhost:4000 with bundle visualizer" "Run Meteor for dev on http://CURRENT-IP-ADDRESS:4000" "Run Meteor for dev on http://CURRENT-IP-ADDRESS:4000 with MONGO_URL=mongodb://127.0.0.1:27019/wekan" "Run Meteor for dev on http://CUSTOM-IP-ADDRESS:PORT" "Save Meteor dependency chain to ../meteor-deps.txt" "Quit") select opt in "${options[@]}" do @@ -240,12 +240,6 @@ do break ;; - "Run tests") - echo "Running tests (import regression)." - node tests/wekanCreator.import.test.js - break - ;; - "Quit") break ;; diff --git a/releases/build-bundle-arm64.sh b/releases/build-bundle-arm64.sh index c9c4a25ce..53687545a 100755 --- a/releases/build-bundle-arm64.sh +++ b/releases/build-bundle-arm64.sh @@ -10,38 +10,21 @@ if [ $# -ne 1 ] exit 1 fi -sudo apt -y install g++ build-essential p7zip-full npm -sudo npm -g install n -# Building bundle works with Node.js 14.21.3 . -# Running works also with 14.21.4, many architectures at https://github.com/wekan/node-v14-esm/releases/tag/v14.21.4 -sudo n 14.21.3 +sudo apt -y install g++ build-essential p7zip-full sudo npm -g uninstall node-pre-gyp sudo npm -g install @mapbox/node-pre-gyp rm -rf bundle rm wekan-$1-arm64.zip -rm wekan-$1.zip -wget https://github.com/wekan/wekan/releases/download/v$1/wekan-$1-amd64.zip -7z x wekan-$1-arm64.zip - -# Get working fibers and bcrypt from previous WeKan v7.93 https://github.com/wekan/wekan/releases/tag/v7.93 -wget https://github.com/wekan/wekan/releases/download/v7.93/wekan-7.93-arm64.zip -mkdir 7.93 -cd 7.93 -7z x ../wekan-7.93-arm64.zip -cd .. - +#rm wekan-$1.zip #wget https://releases.wekan.team/wekan-$1.zip -#7z x wekan-$1-amd64.zip +7z x wekan-$1-amd64.zip -#(cd bundle/programs/server && chmod u+w *.json && cd node_modules/fibers && node build.js) -(cd bundle/programs/server && chmod u+w *.json) -# && cd node_modules/fibers && node build.js) +(cd bundle/programs/server && chmod u+w *.json && cd node_modules/fibers && node build.js) #cd ../../../.. -(cd bundle/programs/server/npm/node_modules/meteor/accounts-password/node_modules && rm -rf bcrypt) -(cp -pR 7.93/bundle/programs/server/npm/node_modules/meteor/accounts-password/node_modules/bcrypt bundle/programs/server/npm/node_modules/meteor/accounts-password/node_modules/) +#(cd bundle/programs/server/npm/node_modules/meteor/accounts-password && npm remove bcrypt && npm install bcrypt) # Requires building from source https://github.com/meteor/meteor/issues/11682 -#(cd bundle/programs/server/npm/node_modules/meteor/accounts-password && npm rebuild --build-from-source) +(cd bundle/programs/server/npm/node_modules/meteor/accounts-password && npm rebuild --build-from-source) cd bundle find . -type d -name '*-garbage*' | xargs rm -rf @@ -52,6 +35,6 @@ cd .. 7z a wekan-$1-arm64.zip bundle -#sudo snap start juju-db +sudo snap start juju-db -#./start-wekan.sh +./start-wekan.sh diff --git a/releases/sed-release-versions.sh b/releases/sed-release-versions.sh index 34583d4d5..9cda49934 100755 --- a/releases/sed-release-versions.sh +++ b/releases/sed-release-versions.sh @@ -17,7 +17,7 @@ OLD_VERSION_NO_DOTS=$(echo "$1" | tr -d '.') NEW_VERSION_NO_DOTS=$(echo "$2" | tr -d '.') # Update all files except sandstorm-pkgdef.capnp with regular version format -sed -i "s|$1|$2|g" sandstorm-pkgdef.capnp package.json package-lock.json snapcraft.yaml docs/Platforms/Propietary/Windows/Offline.md Dockerfile Stackerfile.yml +sed -i "s|$1|$2|g" package.json package-lock.json snapcraft.yaml docs/Platforms/Propietary/Windows/Offline.md Dockerfile Stackerfile.yml # Update sandstorm-pkgdef.capnp with version format without dots sed -i "s|$OLD_VERSION_NO_DOTS|$NEW_VERSION_NO_DOTS|g" sandstorm-pkgdef.capnp diff --git a/releases/snap-build.sh b/releases/snap-build.sh index 88fb9cda4..15d0f599a 100755 --- a/releases/snap-build.sh +++ b/releases/snap-build.sh @@ -5,19 +5,6 @@ echo "Then run this script" if [[ "$OSTYPE" == "linux-gnu" ]]; then echo "Linux" - # - # a) For VirtualBox, - # at /etc/modprobe.d/blacklist.conf blacklist these: (or kvm_amd) - # blacklist kvm_intel - # blacklist kvm - # - # b) For kvm, snapcraft.io/multipass and waydroid, - # at /etc/modprobe.d/blacklist.conf do not blacklist these: - # # blacklist kvm_intel - # # blacklist kvm - # - # If firewall is enabled, building snap does not work - sudo ufw disable sudo apt-get -y install snapd sudo systemctl enable snapd sudo systemctl start snapd @@ -29,7 +16,6 @@ if [[ "$OSTYPE" == "linux-gnu" ]]; then multipass purge multipass launch --name ubu snapcraft pack - sudo ufw enable exit; elif [[ "$OSTYPE" == "darwin"* ]]; then echo "macOS" diff --git a/sandstorm-pkgdef.capnp b/sandstorm-pkgdef.capnp index 72a42f536..a336fa04a 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 = 819, + appVersion = 811, # Increment this for every release. - appMarketingVersion = (defaultText = "8.19.0~2025-12-29"), + appMarketingVersion = (defaultText = "8.11.0~2025-10-21"), # Human-readable presentation of the app version. minUpgradableAppVersion = 0, diff --git a/server/00checkStartup.js b/server/00checkStartup.js index ed4dbabb3..d7035dca8 100644 --- a/server/00checkStartup.js +++ b/server/00checkStartup.js @@ -42,12 +42,6 @@ import './cronJobStorage'; // Import migrations import './migrations/fixMissingListsMigration'; -import './migrations/fixAvatarUrls'; -import './migrations/fixAllFileUrls'; -import './migrations/comprehensiveBoardMigration'; - -// Import file serving routes -import './routes/universalFileServer'; // Note: Automatic migrations are disabled - migrations only run when opening boards // import './boardMigrationDetector'; diff --git a/server/authentication.js b/server/authentication.js index 5b7ad2ee6..474de6e25 100644 --- a/server/authentication.js +++ b/server/authentication.js @@ -60,14 +60,6 @@ Meteor.startup(() => { Authentication.checkAdminOrCondition(userId, normalAccess); }; - // Helper function. Will throw an error if the user does not have write access to the board (excludes read-only users). - Authentication.checkBoardWriteAccess = function(userId, boardId) { - Authentication.checkLoggedIn(userId); - const board = ReactiveCache.getBoard(boardId); - const writeAccess = board.members.some(e => e.userId === userId && e.isActive && !e.isNoComments && !e.isCommentOnly && !e.isWorker && !e.isReadOnly && !e.isReadAssignedOnly); - Authentication.checkAdminOrCondition(userId, writeAccess); - }; - if (Meteor.isServer) { if ( process.env.ORACLE_OIM_ENABLED === 'true' || diff --git a/server/cors.js b/server/cors.js index 42952a95b..4badba9fe 100644 --- a/server/cors.js +++ b/server/cors.js @@ -1,12 +1,4 @@ Meteor.startup(() => { - // Optional: Set Permissions-Policy only if explicitly provided to avoid browser warnings about unrecognized features - if (process.env.PERMISSIONS_POLICY && process.env.PERMISSIONS_POLICY.trim() !== '') { - WebApp.rawConnectHandlers.use(function(req, res, next) { - res.setHeader('Permissions-Policy', process.env.PERMISSIONS_POLICY); - return next(); - }); - } - if (process.env.CORS) { // Listen to incoming HTTP requests, can only be used on the server WebApp.rawConnectHandlers.use(function(req, res, next) { diff --git a/server/cronMigrationManager.js b/server/cronMigrationManager.js index c509a396a..a830f4ab4 100644 --- a/server/cronMigrationManager.js +++ b/server/cronMigrationManager.js @@ -1357,119 +1357,66 @@ Meteor.startup(() => { // Meteor methods for client-server communication Meteor.methods({ 'cron.startAllMigrations'() { - const userId = this.userId; - if (!userId) { - throw new Meteor.Error('not-authorized', 'Must be logged in'); - } - const user = ReactiveCache.getUser(userId); - if (!user || !user.isAdmin) { - throw new Meteor.Error('not-authorized', 'Admin access required'); + if (!this.userId) { + throw new Meteor.Error('not-authorized'); } return cronMigrationManager.startAllMigrations(); }, 'cron.startJob'(cronName) { - const userId = this.userId; - if (!userId) { - throw new Meteor.Error('not-authorized', 'Must be logged in'); - } - const user = ReactiveCache.getUser(userId); - if (!user || !user.isAdmin) { - throw new Meteor.Error('not-authorized', 'Admin access required'); + if (!this.userId) { + throw new Meteor.Error('not-authorized'); } return cronMigrationManager.startCronJob(cronName); }, 'cron.stopJob'(cronName) { - const userId = this.userId; - if (!userId) { - throw new Meteor.Error('not-authorized', 'Must be logged in'); - } - const user = ReactiveCache.getUser(userId); - if (!user || !user.isAdmin) { - throw new Meteor.Error('not-authorized', 'Admin access required'); + if (!this.userId) { + throw new Meteor.Error('not-authorized'); } return cronMigrationManager.stopCronJob(cronName); }, 'cron.pauseJob'(cronName) { - const userId = this.userId; - if (!userId) { - throw new Meteor.Error('not-authorized', 'Must be logged in'); - } - const user = ReactiveCache.getUser(userId); - if (!user || !user.isAdmin) { - throw new Meteor.Error('not-authorized', 'Admin access required'); + if (!this.userId) { + throw new Meteor.Error('not-authorized'); } return cronMigrationManager.pauseCronJob(cronName); }, 'cron.resumeJob'(cronName) { - const userId = this.userId; - if (!userId) { - throw new Meteor.Error('not-authorized', 'Must be logged in'); - } - const user = ReactiveCache.getUser(userId); - if (!user || !user.isAdmin) { - throw new Meteor.Error('not-authorized', 'Admin access required'); + if (!this.userId) { + throw new Meteor.Error('not-authorized'); } return cronMigrationManager.resumeCronJob(cronName); }, 'cron.removeJob'(cronName) { - const userId = this.userId; - if (!userId) { - throw new Meteor.Error('not-authorized', 'Must be logged in'); - } - const user = ReactiveCache.getUser(userId); - if (!user || !user.isAdmin) { - throw new Meteor.Error('not-authorized', 'Admin access required'); + if (!this.userId) { + throw new Meteor.Error('not-authorized'); } return cronMigrationManager.removeCronJob(cronName); }, 'cron.addJob'(jobData) { - const userId = this.userId; - if (!userId) { - throw new Meteor.Error('not-authorized', 'Must be logged in'); - } - const user = ReactiveCache.getUser(userId); - if (!user || !user.isAdmin) { - throw new Meteor.Error('not-authorized', 'Admin access required'); + if (!this.userId) { + throw new Meteor.Error('not-authorized'); } return cronMigrationManager.addCronJob(jobData); }, 'cron.getJobs'() { - const userId = this.userId; - if (!userId) { - throw new Meteor.Error('not-authorized', 'Must be logged in'); - } - const user = ReactiveCache.getUser(userId); - if (!user || !user.isAdmin) { - throw new Meteor.Error('not-authorized', 'Admin access required'); - } - return cronMigrationManager.getAllCronJobs(); }, 'cron.getMigrationProgress'() { - const userId = this.userId; - if (!userId) { - throw new Meteor.Error('not-authorized', 'Must be logged in'); - } - const user = ReactiveCache.getUser(userId); - if (!user || !user.isAdmin) { - throw new Meteor.Error('not-authorized', 'Admin access required'); - } - return { progress: cronMigrationProgress.get(), status: cronMigrationStatus.get(), @@ -1480,153 +1427,72 @@ Meteor.methods({ }, 'cron.startBoardOperation'(boardId, operationType, operationData) { - const userId = this.userId; - if (!userId) { - throw new Meteor.Error('not-authorized', 'Must be logged in'); - } - - // Check if user is global admin OR board admin - const user = ReactiveCache.getUser(userId); - const board = ReactiveCache.getBoard(boardId); - - if (!user) { - throw new Meteor.Error('not-authorized', 'User not found'); - } - - if (!board) { - throw new Meteor.Error('not-found', 'Board not found'); - } - - // Check global admin or board admin - const isGlobalAdmin = user.isAdmin; - const isBoardAdmin = board.members && board.members.some(member => - member.userId === userId && member.isAdmin - ); - - if (!isGlobalAdmin && !isBoardAdmin) { - throw new Meteor.Error('not-authorized', 'Admin access required for this board'); + if (!this.userId) { + throw new Meteor.Error('not-authorized'); } return cronMigrationManager.startBoardOperation(boardId, operationType, operationData); }, 'cron.getBoardOperations'(boardId) { - const userId = this.userId; - if (!userId) { - throw new Meteor.Error('not-authorized', 'Must be logged in'); - } - - // Check if user is global admin OR board admin - const user = ReactiveCache.getUser(userId); - const board = ReactiveCache.getBoard(boardId); - - if (!user) { - throw new Meteor.Error('not-authorized', 'User not found'); - } - - if (!board) { - throw new Meteor.Error('not-found', 'Board not found'); - } - - // Check global admin or board admin - const isGlobalAdmin = user.isAdmin; - const isBoardAdmin = board.members && board.members.some(member => - member.userId === userId && member.isAdmin - ); - - if (!isGlobalAdmin && !isBoardAdmin) { - throw new Meteor.Error('not-authorized', 'Admin access required for this board'); + if (!this.userId) { + throw new Meteor.Error('not-authorized'); } return cronMigrationManager.getBoardOperations(boardId); }, 'cron.getAllBoardOperations'(page, limit, searchTerm) { - const userId = this.userId; - if (!userId) { - throw new Meteor.Error('not-authorized', 'Must be logged in'); - } - const user = ReactiveCache.getUser(userId); - if (!user || !user.isAdmin) { - throw new Meteor.Error('not-authorized', 'Admin access required'); + if (!this.userId) { + throw new Meteor.Error('not-authorized'); } return cronMigrationManager.getAllBoardOperations(page, limit, searchTerm); }, 'cron.getBoardOperationStats'() { - const userId = this.userId; - if (!userId) { - throw new Meteor.Error('not-authorized', 'Must be logged in'); - } - const user = ReactiveCache.getUser(userId); - if (!user || !user.isAdmin) { - throw new Meteor.Error('not-authorized', 'Admin access required'); + if (!this.userId) { + throw new Meteor.Error('not-authorized'); } return cronMigrationManager.getBoardOperationStats(); }, 'cron.getJobDetails'(jobId) { - const userId = this.userId; - if (!userId) { - throw new Meteor.Error('not-authorized', 'Must be logged in'); - } - const user = ReactiveCache.getUser(userId); - if (!user || !user.isAdmin) { - throw new Meteor.Error('not-authorized', 'Admin access required'); + if (!this.userId) { + throw new Meteor.Error('not-authorized'); } return cronJobStorage.getJobDetails(jobId); }, 'cron.getQueueStats'() { - const userId = this.userId; - if (!userId) { - throw new Meteor.Error('not-authorized', 'Must be logged in'); - } - const user = ReactiveCache.getUser(userId); - if (!user || !user.isAdmin) { - throw new Meteor.Error('not-authorized', 'Admin access required'); + if (!this.userId) { + throw new Meteor.Error('not-authorized'); } return cronJobStorage.getQueueStats(); }, 'cron.getSystemResources'() { - const userId = this.userId; - if (!userId) { - throw new Meteor.Error('not-authorized', 'Must be logged in'); - } - const user = ReactiveCache.getUser(userId); - if (!user || !user.isAdmin) { - throw new Meteor.Error('not-authorized', 'Admin access required'); + if (!this.userId) { + throw new Meteor.Error('not-authorized'); } return cronJobStorage.getSystemResources(); }, 'cron.clearAllJobs'() { - const userId = this.userId; - if (!userId) { - throw new Meteor.Error('not-authorized', 'Must be logged in'); - } - const user = ReactiveCache.getUser(userId); - if (!user || !user.isAdmin) { - throw new Meteor.Error('not-authorized', 'Admin access required'); + if (!this.userId) { + throw new Meteor.Error('not-authorized'); } return cronMigrationManager.clearAllCronJobs(); }, 'cron.pauseJob'(jobId) { - const userId = this.userId; - if (!userId) { - throw new Meteor.Error('not-authorized', 'Must be logged in'); - } - const user = ReactiveCache.getUser(userId); - if (!user || !user.isAdmin) { - throw new Meteor.Error('not-authorized', 'Admin access required'); + if (!this.userId) { + throw new Meteor.Error('not-authorized'); } cronJobStorage.updateQueueStatus(jobId, 'paused'); @@ -1635,13 +1501,8 @@ Meteor.methods({ }, 'cron.resumeJob'(jobId) { - const userId = this.userId; - if (!userId) { - throw new Meteor.Error('not-authorized', 'Must be logged in'); - } - const user = ReactiveCache.getUser(userId); - if (!user || !user.isAdmin) { - throw new Meteor.Error('not-authorized', 'Admin access required'); + if (!this.userId) { + throw new Meteor.Error('not-authorized'); } cronJobStorage.updateQueueStatus(jobId, 'pending'); @@ -1650,13 +1511,8 @@ Meteor.methods({ }, 'cron.stopJob'(jobId) { - const userId = this.userId; - if (!userId) { - throw new Meteor.Error('not-authorized', 'Must be logged in'); - } - const user = ReactiveCache.getUser(userId); - if (!user || !user.isAdmin) { - throw new Meteor.Error('not-authorized', 'Admin access required'); + if (!this.userId) { + throw new Meteor.Error('not-authorized'); } cronJobStorage.updateQueueStatus(jobId, 'stopped'); @@ -1668,76 +1524,16 @@ Meteor.methods({ }, 'cron.cleanupOldJobs'(daysOld) { - const userId = this.userId; - if (!userId) { - throw new Meteor.Error('not-authorized', 'Must be logged in'); - } - const user = ReactiveCache.getUser(userId); - if (!user || !user.isAdmin) { - throw new Meteor.Error('not-authorized', 'Admin access required'); + if (!this.userId) { + throw new Meteor.Error('not-authorized'); } return cronJobStorage.cleanupOldJobs(daysOld); }, - 'cron.pauseAllMigrations'() { - const userId = this.userId; - if (!userId) { - throw new Meteor.Error('not-authorized', 'Must be logged in'); - } - const user = ReactiveCache.getUser(userId); - if (!user || !user.isAdmin) { - throw new Meteor.Error('not-authorized', 'Admin access required'); - } - - // Pause all running jobs in the queue - const runningJobs = cronJobStorage.getIncompleteJobs().filter(job => job.status === 'running'); - runningJobs.forEach(job => { - cronJobStorage.updateQueueStatus(job.jobId, 'paused'); - cronJobStorage.saveJobStatus(job.jobId, { status: 'paused' }); - }); - - cronMigrationStatus.set('All migrations paused'); - return { success: true, message: 'All migrations paused' }; - }, - - 'cron.stopAllMigrations'() { - const userId = this.userId; - if (!userId) { - throw new Meteor.Error('not-authorized', 'Must be logged in'); - } - const user = ReactiveCache.getUser(userId); - if (!user || !user.isAdmin) { - throw new Meteor.Error('not-authorized', 'Admin access required'); - } - - // Stop all running and pending jobs - const incompleteJobs = cronJobStorage.getIncompleteJobs(); - incompleteJobs.forEach(job => { - cronJobStorage.updateQueueStatus(job.jobId, 'stopped', { stoppedAt: new Date() }); - cronJobStorage.saveJobStatus(job.jobId, { - status: 'stopped', - stoppedAt: new Date() - }); - }); - - // Reset migration state - cronIsMigrating.set(false); - cronMigrationStatus.set('All migrations stopped'); - cronMigrationProgress.set(0); - cronMigrationCurrentStep.set(''); - - return { success: true, message: 'All migrations stopped' }; - }, - 'cron.getBoardMigrationStats'() { - const userId = this.userId; - if (!userId) { - throw new Meteor.Error('not-authorized', 'Must be logged in'); - } - const user = ReactiveCache.getUser(userId); - if (!user || !user.isAdmin) { - throw new Meteor.Error('not-authorized', 'Admin access required'); + if (!this.userId) { + throw new Meteor.Error('not-authorized'); } // Import the board migration detector @@ -1746,13 +1542,8 @@ Meteor.methods({ }, 'cron.forceBoardMigrationScan'() { - const userId = this.userId; - if (!userId) { - throw new Meteor.Error('not-authorized', 'Must be logged in'); - } - const user = ReactiveCache.getUser(userId); - if (!user || !user.isAdmin) { - throw new Meteor.Error('not-authorized', 'Admin access required'); + if (!this.userId) { + throw new Meteor.Error('not-authorized'); } // Import the board migration detector diff --git a/server/lib/tests/attachmentApi.tests.js b/server/lib/tests/attachmentApi.tests.js deleted file mode 100644 index 1b89c236a..000000000 --- a/server/lib/tests/attachmentApi.tests.js +++ /dev/null @@ -1,203 +0,0 @@ -/* eslint-env mocha */ -import { expect } from 'chai'; -import sinon from 'sinon'; -import { Meteor } from 'meteor/meteor'; -import { Accounts } from 'meteor/accounts-base'; - -describe('attachmentApi authentication', function() { - let findOneStub, hashStub; - - beforeEach(function() { - hashStub = sinon.stub(Accounts, '_hashLoginToken'); - findOneStub = sinon.stub(Meteor.users, 'findOne'); - }); - - afterEach(function() { - if (hashStub) hashStub.restore(); - if (findOneStub) findOneStub.restore(); - }); - - // Mock request/response objects - function createMockReq(headers = {}) { - return { - headers, - on: sinon.stub(), - connection: { destroy: sinon.stub() }, - }; - } - - function createMockRes() { - return { - writeHead: sinon.stub(), - end: sinon.stub(), - headersSent: false, - }; - } - - describe('authenticateApiRequest', function() { - it('denies request with missing X-User-Id header', function() { - const req = createMockReq({ 'x-auth-token': 'sometoken' }); - const res = createMockRes(); - - // Simulate the handler behavior - let errorThrown = false; - try { - if (!req.headers['x-user-id'] || !req.headers['x-auth-token']) { - throw new Meteor.Error('unauthorized', 'Missing X-User-Id or X-Auth-Token headers'); - } - } catch (error) { - errorThrown = true; - expect(error.error).to.equal('unauthorized'); - } - - expect(errorThrown).to.equal(true); - }); - - it('denies request with missing X-Auth-Token header', function() { - const req = createMockReq({ 'x-user-id': 'user123' }); - - let errorThrown = false; - try { - if (!req.headers['x-user-id'] || !req.headers['x-auth-token']) { - throw new Meteor.Error('unauthorized', 'Missing X-User-Id or X-Auth-Token headers'); - } - } catch (error) { - errorThrown = true; - expect(error.error).to.equal('unauthorized'); - } - - expect(errorThrown).to.equal(true); - }); - - it('denies request with invalid token', function() { - const userId = 'user123'; - const token = 'invalidtoken'; - const req = createMockReq({ 'x-user-id': userId, 'x-auth-token': token }); - - hashStub.returns('hashedInvalidToken'); - findOneStub.returns(null); // No user found - - let errorThrown = false; - try { - const hashedToken = Accounts._hashLoginToken(token); - const user = Meteor.users.findOne({ - _id: userId, - 'services.resume.loginTokens.hashedToken': hashedToken, - }); - if (!user) { - throw new Meteor.Error('unauthorized', 'Invalid credentials'); - } - } catch (error) { - errorThrown = true; - expect(error.error).to.equal('unauthorized'); - } - - expect(errorThrown).to.equal(true); - expect(hashStub.calledOnce).to.equal(true); - expect(findOneStub.calledOnce).to.equal(true); - }); - - it('allows request with valid X-User-Id and X-Auth-Token', function() { - const userId = 'user123'; - const token = 'validtoken'; - const req = createMockReq({ 'x-user-id': userId, 'x-auth-token': token }); - - const hashedToken = 'hashedValidToken'; - hashStub.returns(hashedToken); - findOneStub.returns({ _id: userId }); // User found - - let authenticatedUserId = null; - try { - const hashed = Accounts._hashLoginToken(token); - const user = Meteor.users.findOne({ - _id: userId, - 'services.resume.loginTokens.hashedToken': hashed, - }); - if (!user) { - throw new Meteor.Error('unauthorized', 'Invalid credentials'); - } - authenticatedUserId = userId; - } catch (error) { - // Should not throw - } - - expect(authenticatedUserId).to.equal(userId); - expect(hashStub.calledOnce).to.equal(true); - expect(hashStub.calledWith(token)).to.equal(true); - expect(findOneStub.calledOnce).to.equal(true); - const queryArg = findOneStub.getCall(0).args[0]; - expect(queryArg._id).to.equal(userId); - expect(queryArg['services.resume.loginTokens.hashedToken']).to.equal(hashedToken); - }); - - it('prevents identity spoofing by validating hashed token', function() { - const victimId = 'victim-user-id'; - const attackerToken = 'attacker-token'; - const req = createMockReq({ 'x-user-id': victimId, 'x-auth-token': attackerToken }); - - hashStub.returns('hashedAttackerToken'); - // Simulate victim exists but token doesn't match - findOneStub.returns(null); - - let errorThrown = false; - try { - const hashed = Accounts._hashLoginToken(attackerToken); - const user = Meteor.users.findOne({ - _id: victimId, - 'services.resume.loginTokens.hashedToken': hashed, - }); - if (!user) { - throw new Meteor.Error('unauthorized', 'Invalid credentials'); - } - } catch (error) { - errorThrown = true; - expect(error.error).to.equal('unauthorized'); - } - - expect(errorThrown).to.equal(true); - }); - }); - - describe('request handler DoS prevention', function() { - it('enforces timeout on hanging requests', function(done) { - this.timeout(5000); - - const req = createMockReq({ 'x-user-id': 'user1', 'x-auth-token': 'token1' }); - const res = createMockRes(); - - // Simulate timeout behavior - const timeout = setTimeout(() => { - if (!res.headersSent) { - res.headersSent = true; - res.writeHead(408, { 'Content-Type': 'application/json' }); - res.end(JSON.stringify({ success: false, error: 'Request timeout' })); - } - }, 100); // Short timeout for test - - // Wait for timeout - setTimeout(() => { - expect(res.headersSent).to.equal(true); - expect(res.writeHead.calledWith(408)).to.equal(true); - clearTimeout(timeout); - done(); - }, 150); - }); - - it('limits request body size', function() { - const req = createMockReq({ 'x-user-id': 'user1', 'x-auth-token': 'token1' }); - let body = ''; - const limit = 50 * 1024 * 1024; // 50MB - - // Simulate exceeding limit - body = 'a'.repeat(limit + 1); - expect(body.length).to.be.greaterThan(limit); - - // Handler should destroy connection - if (body.length > limit) { - req.connection.destroy(); - } - - expect(req.connection.destroy.calledOnce).to.equal(true); - }); - }); -}); diff --git a/server/lib/tests/boards.security.tests.js b/server/lib/tests/boards.security.tests.js deleted file mode 100644 index 334a5d099..000000000 --- a/server/lib/tests/boards.security.tests.js +++ /dev/null @@ -1,50 +0,0 @@ -/* eslint-env mocha */ -import { expect } from 'chai'; -import { Random } from 'meteor/random'; -import '../utils'; - -// Unit tests for canUpdateBoardSort policy - -describe('boards security', function() { - describe(canUpdateBoardSort.name, function() { - it('denies anonymous updates even if fieldNames include sort', function() { - const userId = null; - const board = { - hasMember: () => true, - }; - const fieldNames = ['sort']; - - expect(canUpdateBoardSort(userId, board, fieldNames)).to.equal(false); - }); - - it('denies updates by non-members', function() { - const userId = Random.id(); - const board = { - hasMember: (id) => id === 'someone-else', - }; - const fieldNames = ['sort']; - - expect(canUpdateBoardSort(userId, board, fieldNames)).to.equal(false); - }); - - it('allows updates when user is a member and updating sort', function() { - const userId = Random.id(); - const board = { - hasMember: (id) => id === userId, - }; - const fieldNames = ['sort']; - - expect(canUpdateBoardSort(userId, board, fieldNames)).to.equal(true); - }); - - it('denies updates when not updating sort', function() { - const userId = Random.id(); - const board = { - hasMember: (id) => id === userId, - }; - const fieldNames = ['title']; - - expect(canUpdateBoardSort(userId, board, fieldNames)).to.equal(false); - }); - }); -}); diff --git a/server/lib/tests/cards.methods.tests.js b/server/lib/tests/cards.methods.tests.js deleted file mode 100644 index b81487a85..000000000 --- a/server/lib/tests/cards.methods.tests.js +++ /dev/null @@ -1,118 +0,0 @@ -/* eslint-env mocha */ -import { expect } from 'chai'; -import sinon from 'sinon'; -import { Meteor } from 'meteor/meteor'; -import '/models/cards'; - -// Helpers to access method handlers -const voteHandler = () => Meteor.server.method_handlers['cards.vote']; -const pokerVoteHandler = () => Meteor.server.method_handlers['cards.pokerVote']; - -// Preserve originals to restore after stubbing -const origGetCard = ReactiveCache.getCard; -const origGetBoard = ReactiveCache.getBoard; - -describe('cards methods security', function() { - let updateStub; - - beforeEach(function() { - // Stub collection update to capture modifiers - updateStub = sinon.stub(Cards, 'update').returns(1); - }); - - afterEach(function() { - if (updateStub) updateStub.restore(); - ReactiveCache.getCard = origGetCard; - ReactiveCache.getBoard = origGetBoard; - }); - - describe('cards.vote', function() { - it('denies non-member when allowNonBoardMembers=false', function() { - const cardId = 'card1'; - const callerId = 'user-nonmember'; - const board = { hasMember: id => id === 'someone-else' }; - const card = { _id: cardId, boardId: 'board1', vote: { allowNonBoardMembers: false } }; - - ReactiveCache.getCard = () => card; - ReactiveCache.getBoard = () => board; - - const callMethod = () => voteHandler().call({ userId: callerId }, cardId, true); - expect(callMethod).to.throw(); - expect(updateStub.called).to.equal(false); - }); - - it('allows non-member only for own userId when allowNonBoardMembers=true', function() { - const cardId = 'card2'; - const callerId = 'user-guest'; - const board = { hasMember: id => id === 'someone-else' }; - const card = { _id: cardId, boardId: 'board2', vote: { allowNonBoardMembers: true } }; - - ReactiveCache.getCard = () => card; - ReactiveCache.getBoard = () => board; - - voteHandler().call({ userId: callerId }, cardId, true); - - expect(updateStub.calledOnce).to.equal(true); - const [, modifier] = updateStub.getCall(0).args; - expect(modifier.$addToSet['vote.positive']).to.equal(callerId); - expect(modifier.$pull['vote.negative']).to.equal(callerId); - expect(modifier.$set.modifiedAt).to.be.instanceOf(Date); - expect(modifier.$set.dateLastActivity).to.be.instanceOf(Date); - }); - - it('ensures member votes only affect caller userId', function() { - const cardId = 'card3'; - const callerId = 'member1'; - const otherId = 'member2'; - const board = { hasMember: id => (id === callerId || id === otherId) }; - const card = { _id: cardId, boardId: 'board3', vote: { allowNonBoardMembers: false } }; - - ReactiveCache.getCard = () => card; - ReactiveCache.getBoard = () => board; - - voteHandler().call({ userId: callerId }, cardId, true); - - expect(updateStub.calledOnce).to.equal(true); - const [, modifier] = updateStub.getCall(0).args; - // Only callerId present in modifier - expect(modifier.$addToSet['vote.positive']).to.equal(callerId); - expect(modifier.$pull['vote.negative']).to.equal(callerId); - }); - }); - - describe('cards.pokerVote', function() { - it('denies non-member when allowNonBoardMembers=false', function() { - const cardId = 'card4'; - const callerId = 'nm'; - const board = { hasMember: id => id === 'someone-else' }; - const card = { _id: cardId, boardId: 'board4', poker: { allowNonBoardMembers: false } }; - - ReactiveCache.getCard = () => card; - ReactiveCache.getBoard = () => board; - - const callMethod = () => pokerVoteHandler().call({ userId: callerId }, cardId, 'five'); - expect(callMethod).to.throw(); - expect(updateStub.called).to.equal(false); - }); - - it('allows non-member only for own userId when allowNonBoardMembers=true', function() { - const cardId = 'card5'; - const callerId = 'guest'; - const board = { hasMember: id => id === 'someone-else' }; - const card = { _id: cardId, boardId: 'board5', poker: { allowNonBoardMembers: true } }; - - ReactiveCache.getCard = () => card; - ReactiveCache.getBoard = () => board; - - pokerVoteHandler().call({ userId: callerId }, cardId, 'eight'); - - expect(updateStub.calledOnce).to.equal(true); - const [, modifier] = updateStub.getCall(0).args; - expect(modifier.$addToSet['poker.eight']).to.equal(callerId); - // Ensure removal from other buckets includes callerId - expect(modifier.$pull['poker.one']).to.equal(callerId); - expect(modifier.$set.modifiedAt).to.be.instanceOf(Date); - expect(modifier.$set.dateLastActivity).to.be.instanceOf(Date); - }); - }); -}); diff --git a/server/lib/tests/cards.security.tests.js b/server/lib/tests/cards.security.tests.js deleted file mode 100644 index ae2a640df..000000000 --- a/server/lib/tests/cards.security.tests.js +++ /dev/null @@ -1,56 +0,0 @@ -/* eslint-env mocha */ -import { expect } from 'chai'; -import '../utils'; -import '/models/cards'; - -// Unit tests for canUpdateCard policy (deny direct vote updates) -describe('cards security', function() { - describe(canUpdateCard.name, function() { - const userId = 'user1'; - const board = { - hasMember: (id) => id === userId, - }; - const doc = { boardId: 'board1' }; - - // Patch ReactiveCache.getBoard for this unit test scope if not defined - const origGetBoard = ReactiveCache && ReactiveCache.getBoard; - before(function() { - if (typeof ReactiveCache === 'object') { - ReactiveCache.getBoard = () => board; - } - }); - after(function() { - if (typeof ReactiveCache === 'object') { - ReactiveCache.getBoard = origGetBoard; - } - }); - - it('denies anonymous users', function() { - expect(canUpdateCard(null, doc, ['title'])).to.equal(false); - }); - - it('denies direct vote updates', function() { - expect(canUpdateCard(userId, doc, ['vote'])).to.equal(false); - expect(canUpdateCard(userId, doc, ['vote', 'modifiedAt', 'dateLastActivity'])).to.equal(false); - expect(canUpdateCard(userId, doc, ['vote.positive'])).to.equal(false); - expect(canUpdateCard(userId, doc, ['vote.negative'])).to.equal(false); - }); - - it('denies direct poker updates', function() { - expect(canUpdateCard(userId, doc, ['poker'])).to.equal(false); - expect(canUpdateCard(userId, doc, ['poker.one'])).to.equal(false); - expect(canUpdateCard(userId, doc, ['poker.allowNonBoardMembers'])).to.equal(false); - expect(canUpdateCard(userId, doc, ['poker.end'])).to.equal(false); - }); - - it('allows member updates when not touching vote', function() { - expect(canUpdateCard(userId, doc, ['title'])).to.equal(true); - expect(canUpdateCard(userId, doc, ['description', 'modifiedAt'])).to.equal(true); - }); - - it('denies non-members even when not touching vote', function() { - const nonMemberId = 'user2'; - expect(canUpdateCard(nonMemberId, doc, ['title'])).to.equal(false); - }); - }); -}); diff --git a/server/lib/tests/index.js b/server/lib/tests/index.js index d3c2870eb..bcc3f567c 100644 --- a/server/lib/tests/index.js +++ b/server/lib/tests/index.js @@ -1,6 +1 @@ import './utils.tests'; -import './users.security.tests'; -import './boards.security.tests'; -import './cards.security.tests'; -import './cards.methods.tests'; -import './attachmentApi.tests'; diff --git a/server/lib/tests/users.security.tests.js b/server/lib/tests/users.security.tests.js deleted file mode 100644 index 395ee912b..000000000 --- a/server/lib/tests/users.security.tests.js +++ /dev/null @@ -1,43 +0,0 @@ -/* eslint-env mocha */ -import { expect } from 'chai'; -import { isUserUpdateAllowed, hasForbiddenUserUpdateField } from '/models/users'; - -describe('users security', function() { - describe('isUserUpdateAllowed', function() { - it('allows username update', function() { - expect(isUserUpdateAllowed(['username'])).to.equal(true); - }); - it('allows profile updates', function() { - expect(isUserUpdateAllowed(['profile.fullname'])).to.equal(true); - expect(isUserUpdateAllowed(['profile.avatarUrl', 'profile.language'])).to.equal(true); - }); - it('denies other top-level fields', function() { - expect(isUserUpdateAllowed(['orgs'])).to.equal(false); - expect(isUserUpdateAllowed(['teams'])).to.equal(false); - expect(isUserUpdateAllowed(['loginDisabled'])).to.equal(false); - expect(isUserUpdateAllowed(['authenticationMethod'])).to.equal(false); - expect(isUserUpdateAllowed(['services'])).to.equal(false); - expect(isUserUpdateAllowed(['emails'])).to.equal(false); - expect(isUserUpdateAllowed(['isAdmin'])).to.equal(false); - }); - }); - - describe('hasForbiddenUserUpdateField', function() { - it('flags forbidden sensitive fields', function() { - expect(hasForbiddenUserUpdateField(['orgs'])).to.equal(true); - expect(hasForbiddenUserUpdateField(['teams'])).to.equal(true); - expect(hasForbiddenUserUpdateField(['loginDisabled'])).to.equal(true); - expect(hasForbiddenUserUpdateField(['authenticationMethod'])).to.equal(true); - expect(hasForbiddenUserUpdateField(['services.facebook'])).to.equal(true); - expect(hasForbiddenUserUpdateField(['emails.0.verified'])).to.equal(true); - expect(hasForbiddenUserUpdateField(['roles'])).to.equal(true); - expect(hasForbiddenUserUpdateField(['isAdmin'])).to.equal(true); - expect(hasForbiddenUserUpdateField(['createdThroughApi'])).to.equal(true); - expect(hasForbiddenUserUpdateField(['sessionData.totalHits'])).to.equal(true); - }); - it('does not flag allowed fields', function() { - expect(hasForbiddenUserUpdateField(['username'])).to.equal(false); - expect(hasForbiddenUserUpdateField(['profile.fullname'])).to.equal(false); - }); - }); -}); diff --git a/server/lib/utils.js b/server/lib/utils.js index bd6037b59..2d19f6de3 100644 --- a/server/lib/utils.js +++ b/server/lib/utils.js @@ -13,7 +13,7 @@ allowIsAnyBoardMember = function(userId, boards) { }; allowIsBoardMemberCommentOnly = function(userId, board) { - return board && board.hasMember(userId) && !board.hasReadOnly(userId) && !board.hasReadAssignedOnly(userId) && !board.hasNoComments(userId); + return board && board.hasMember(userId) && !board.hasCommentOnly(userId); }; allowIsBoardMemberNoComments = function(userId, board) { @@ -24,12 +24,3 @@ allowIsBoardMemberByCard = function(userId, card) { const board = card.board(); return board && board.hasMember(userId); }; - -// Policy: can a user update a board's 'sort' field? -// Requirements: -// - user must be authenticated -// - update must include 'sort' field -// - user must be a member of the board -canUpdateBoardSort = function(userId, board, fieldNames) { - return !!userId && _.contains(fieldNames || [], 'sort') && allowIsBoardMember(userId, board); -}; diff --git a/server/methods/fixDuplicateLists.js b/server/methods/fixDuplicateLists.js index b673021ec..f5e79bab5 100644 --- a/server/methods/fixDuplicateLists.js +++ b/server/methods/fixDuplicateLists.js @@ -25,7 +25,7 @@ Meteor.methods({ for (const board of allBoards) { try { - const result = fixDuplicateListsForBoard(board._id); + const result = this.fixDuplicateListsForBoard(board._id); totalFixed += result.fixed; totalBoardsProcessed++; @@ -55,21 +55,19 @@ Meteor.methods({ throw new Meteor.Error('not-authorized'); } - return fixDuplicateListsForBoard(boardId); - } -}); + return this.fixDuplicateListsForBoard(boardId); + }, -// Helper functions defined outside of Meteor.methods -function fixDuplicateListsForBoard(boardId) { + fixDuplicateListsForBoard(boardId) { if (process.env.DEBUG === 'true') { console.log(`Fixing duplicate lists for board ${boardId}...`); } // First, fix duplicate swimlanes - const swimlaneResult = fixDuplicateSwimlanes(boardId); + const swimlaneResult = this.fixDuplicateSwimlanes(boardId); // Then, fix duplicate lists - const listResult = fixDuplicateLists(boardId); + const listResult = this.fixDuplicateLists(boardId); return { boardId, @@ -77,10 +75,9 @@ function fixDuplicateListsForBoard(boardId) { fixedLists: listResult.fixed, fixed: swimlaneResult.fixed + listResult.fixed }; -} + }, -// Helper functions defined outside of Meteor.methods -function fixDuplicateSwimlanes(boardId) { + fixDuplicateSwimlanes(boardId) { const swimlanes = Swimlanes.find({ boardId }).fetch(); const swimlaneGroups = {}; let fixed = 0; @@ -147,9 +144,9 @@ function fixDuplicateSwimlanes(boardId) { }); return { fixed }; -} + }, -function fixDuplicateLists(boardId) { + fixDuplicateLists(boardId) { const lists = Lists.find({ boardId }).fetch(); const listGroups = {}; let fixed = 0; @@ -195,9 +192,8 @@ function fixDuplicateLists(boardId) { }); return { fixed }; -} + }, -Meteor.methods({ 'fixDuplicateLists.getReport'() { if (!this.userId) { throw new Meteor.Error('not-authorized'); diff --git a/server/migrations/comprehensiveBoardMigration.js b/server/migrations/comprehensiveBoardMigration.js deleted file mode 100644 index e8bfc7469..000000000 --- a/server/migrations/comprehensiveBoardMigration.js +++ /dev/null @@ -1,757 +0,0 @@ -/** - * Comprehensive Board Migration System - * - * This migration handles all database structure changes from previous Wekan versions - * to the current per-swimlane lists structure. It ensures: - * - * 1. All cards are visible with proper swimlaneId and listId - * 2. Lists are per-swimlane (no shared lists across swimlanes) - * 3. No empty lists are created - * 4. Handles various database structure versions from git history - * - * Supported versions and their database structures: - * - v7.94 and earlier: Shared lists across all swimlanes - * - v8.00-v8.02: Transition period with mixed structures - * - v8.03+: Per-swimlane lists structure - */ - -import { Meteor } from 'meteor/meteor'; -import { check } from 'meteor/check'; -import { ReactiveCache } from '/imports/reactiveCache'; -import Boards from '/models/boards'; -import Lists from '/models/lists'; -import Cards from '/models/cards'; -import Swimlanes from '/models/swimlanes'; -import Attachments from '/models/attachments'; -import { generateUniversalAttachmentUrl, isUniversalFileUrl } from '/models/lib/universalUrlGenerator'; - -class ComprehensiveBoardMigration { - constructor() { - this.name = 'comprehensive-board-migration'; - this.version = 1; - this.migrationSteps = [ - 'analyze_board_structure', - 'fix_orphaned_cards', - 'convert_shared_lists', - 'ensure_per_swimlane_lists', - 'validate_migration' - ]; - } - - /** - * Check if migration is needed for a board - */ - needsMigration(boardId) { - try { - const board = ReactiveCache.getBoard(boardId); - if (!board) return false; - - // Check if board has already been processed - if (board.comprehensiveMigrationCompleted) { - return false; - } - - // Check for various issues that need migration - const issues = this.detectMigrationIssues(boardId); - return issues.length > 0; - - } catch (error) { - console.error('Error checking if migration is needed:', error); - return false; - } - } - - /** - * Detect all migration issues in a board - */ - detectMigrationIssues(boardId) { - const issues = []; - - try { - const cards = ReactiveCache.getCards({ boardId }); - const lists = ReactiveCache.getLists({ boardId }); - const swimlanes = ReactiveCache.getSwimlanes({ boardId }); - - // Issue 1: Cards with missing swimlaneId - const cardsWithoutSwimlane = cards.filter(card => !card.swimlaneId); - if (cardsWithoutSwimlane.length > 0) { - issues.push({ - type: 'cards_without_swimlane', - count: cardsWithoutSwimlane.length, - description: `${cardsWithoutSwimlane.length} cards missing swimlaneId` - }); - } - - // Issue 2: Cards with missing listId - const cardsWithoutList = cards.filter(card => !card.listId); - if (cardsWithoutList.length > 0) { - issues.push({ - type: 'cards_without_list', - count: cardsWithoutList.length, - description: `${cardsWithoutList.length} cards missing listId` - }); - } - - // Issue 3: Lists without swimlaneId (shared lists) - const sharedLists = lists.filter(list => !list.swimlaneId || list.swimlaneId === ''); - if (sharedLists.length > 0) { - issues.push({ - type: 'shared_lists', - count: sharedLists.length, - description: `${sharedLists.length} lists without swimlaneId (shared lists)` - }); - } - - // Issue 4: Cards with mismatched listId/swimlaneId - const listSwimlaneMap = new Map(); - lists.forEach(list => { - listSwimlaneMap.set(list._id, list.swimlaneId || ''); - }); - - const mismatchedCards = cards.filter(card => { - if (!card.listId || !card.swimlaneId) return false; - const listSwimlaneId = listSwimlaneMap.get(card.listId); - return listSwimlaneId && listSwimlaneId !== card.swimlaneId; - }); - - if (mismatchedCards.length > 0) { - issues.push({ - type: 'mismatched_cards', - count: mismatchedCards.length, - description: `${mismatchedCards.length} cards with mismatched listId/swimlaneId` - }); - } - - // Issue 5: Empty lists (lists with no cards) - const emptyLists = lists.filter(list => { - const listCards = cards.filter(card => card.listId === list._id); - return listCards.length === 0; - }); - - if (emptyLists.length > 0) { - issues.push({ - type: 'empty_lists', - count: emptyLists.length, - description: `${emptyLists.length} empty lists (no cards)` - }); - } - - } catch (error) { - console.error('Error detecting migration issues:', error); - issues.push({ - type: 'detection_error', - count: 1, - description: `Error detecting issues: ${error.message}` - }); - } - - return issues; - } - - /** - * Execute the comprehensive migration for a board - */ - async executeMigration(boardId, progressCallback = null) { - try { - if (process.env.DEBUG === 'true') { - console.log(`Starting comprehensive board migration for board ${boardId}`); - } - - const board = ReactiveCache.getBoard(boardId); - if (!board) { - throw new Error(`Board ${boardId} not found`); - } - - const results = { - boardId, - steps: {}, - totalCardsProcessed: 0, - totalListsProcessed: 0, - totalListsCreated: 0, - errors: [] - }; - - const totalSteps = this.migrationSteps.length; - let currentStep = 0; - - // Helper function to update progress - const updateProgress = (stepName, stepProgress, stepStatus, stepDetails = null) => { - currentStep++; - const overallProgress = Math.round((currentStep / totalSteps) * 100); - - const progressData = { - overallProgress, - currentStep: currentStep, - totalSteps, - stepName, - stepProgress, - stepStatus, - stepDetails, - boardId - }; - - if (progressCallback) { - progressCallback(progressData); - } - - if (process.env.DEBUG === 'true') { - console.log(`Migration Progress: ${stepName} - ${stepStatus} (${stepProgress}%)`); - } - }; - - // Step 1: Analyze board structure - updateProgress('analyze_board_structure', 0, 'Starting analysis...'); - results.steps.analyze = await this.analyzeBoardStructure(boardId); - updateProgress('analyze_board_structure', 100, 'Analysis complete', { - issuesFound: results.steps.analyze.issueCount, - needsMigration: results.steps.analyze.needsMigration - }); - - // Step 2: Fix orphaned cards - updateProgress('fix_orphaned_cards', 0, 'Fixing orphaned cards...'); - results.steps.fixOrphanedCards = await this.fixOrphanedCards(boardId, (progress, status) => { - updateProgress('fix_orphaned_cards', progress, status); - }); - results.totalCardsProcessed += results.steps.fixOrphanedCards.cardsFixed || 0; - updateProgress('fix_orphaned_cards', 100, 'Orphaned cards fixed', { - cardsFixed: results.steps.fixOrphanedCards.cardsFixed - }); - - // Step 3: Convert shared lists to per-swimlane lists - updateProgress('convert_shared_lists', 0, 'Converting shared lists...'); - results.steps.convertSharedLists = await this.convertSharedListsToPerSwimlane(boardId, (progress, status) => { - updateProgress('convert_shared_lists', progress, status); - }); - results.totalListsProcessed += results.steps.convertSharedLists.listsProcessed || 0; - results.totalListsCreated += results.steps.convertSharedLists.listsCreated || 0; - updateProgress('convert_shared_lists', 100, 'Shared lists converted', { - listsProcessed: results.steps.convertSharedLists.listsProcessed, - listsCreated: results.steps.convertSharedLists.listsCreated - }); - - // Step 4: Ensure all lists are per-swimlane - updateProgress('ensure_per_swimlane_lists', 0, 'Ensuring per-swimlane structure...'); - results.steps.ensurePerSwimlane = await this.ensurePerSwimlaneLists(boardId); - results.totalListsProcessed += results.steps.ensurePerSwimlane.listsProcessed || 0; - updateProgress('ensure_per_swimlane_lists', 100, 'Per-swimlane structure ensured', { - listsProcessed: results.steps.ensurePerSwimlane.listsProcessed - }); - - // Step 5: Validate migration - updateProgress('validate_migration', 0, 'Validating migration...'); - results.steps.validate = await this.validateMigration(boardId); - updateProgress('validate_migration', 100, 'Migration validated', { - migrationSuccessful: results.steps.validate.migrationSuccessful, - totalCards: results.steps.validate.totalCards, - totalLists: results.steps.validate.totalLists - }); - - // Step 6: Fix avatar URLs - updateProgress('fix_avatar_urls', 0, 'Fixing avatar URLs...'); - results.steps.fixAvatarUrls = await this.fixAvatarUrls(boardId); - updateProgress('fix_avatar_urls', 100, 'Avatar URLs fixed', { - avatarsFixed: results.steps.fixAvatarUrls.avatarsFixed - }); - - // Step 8: Fix attachment URLs - updateProgress('fix_attachment_urls', 0, 'Fixing attachment URLs...'); - results.steps.fixAttachmentUrls = await this.fixAttachmentUrls(boardId); - updateProgress('fix_attachment_urls', 100, 'Attachment URLs fixed', { - attachmentsFixed: results.steps.fixAttachmentUrls.attachmentsFixed - }); - - // Mark board as processed - Boards.update(boardId, { - $set: { - comprehensiveMigrationCompleted: true, - comprehensiveMigrationCompletedAt: new Date(), - comprehensiveMigrationResults: results - } - }); - - if (process.env.DEBUG === 'true') { - console.log(`Comprehensive board migration completed for board ${boardId}:`, results); - } - - return { - success: true, - results - }; - - } catch (error) { - console.error(`Error executing comprehensive migration for board ${boardId}:`, error); - throw error; - } - } - - /** - * Step 1: Analyze board structure - */ - async analyzeBoardStructure(boardId) { - const issues = this.detectMigrationIssues(boardId); - return { - issues, - issueCount: issues.length, - needsMigration: issues.length > 0 - }; - } - - /** - * Step 2: Fix orphaned cards (cards with missing swimlaneId or listId) - */ - async fixOrphanedCards(boardId, progressCallback = null) { - const cards = ReactiveCache.getCards({ boardId }); - const swimlanes = ReactiveCache.getSwimlanes({ boardId }); - const lists = ReactiveCache.getLists({ boardId }); - - let cardsFixed = 0; - const defaultSwimlane = swimlanes.find(s => s.title === 'Default') || swimlanes[0]; - const totalCards = cards.length; - - for (let i = 0; i < cards.length; i++) { - const card = cards[i]; - let needsUpdate = false; - const updates = {}; - - // Fix missing swimlaneId - if (!card.swimlaneId) { - updates.swimlaneId = defaultSwimlane._id; - needsUpdate = true; - } - - // Fix missing listId - if (!card.listId) { - // Find or create a default list for this swimlane - const swimlaneId = updates.swimlaneId || card.swimlaneId; - let defaultList = lists.find(list => - list.swimlaneId === swimlaneId && list.title === 'Default' - ); - - if (!defaultList) { - // Create a default list for this swimlane - const newListId = Lists.insert({ - title: 'Default', - boardId: boardId, - swimlaneId: swimlaneId, - sort: 0, - archived: false, - createdAt: new Date(), - modifiedAt: new Date(), - type: 'list' - }); - defaultList = { _id: newListId }; - } - - updates.listId = defaultList._id; - needsUpdate = true; - } - - if (needsUpdate) { - Cards.update(card._id, { - $set: { - ...updates, - modifiedAt: new Date() - } - }); - cardsFixed++; - } - - // Update progress - if (progressCallback && (i % 10 === 0 || i === totalCards - 1)) { - const progress = Math.round(((i + 1) / totalCards) * 100); - progressCallback(progress, `Processing card ${i + 1} of ${totalCards}...`); - } - } - - return { cardsFixed }; - } - - /** - * Step 3: Convert shared lists to per-swimlane lists - */ - async convertSharedListsToPerSwimlane(boardId, progressCallback = null) { - const cards = ReactiveCache.getCards({ boardId }); - const lists = ReactiveCache.getLists({ boardId }); - const swimlanes = ReactiveCache.getSwimlanes({ boardId }); - - let listsProcessed = 0; - let listsCreated = 0; - - // Group cards by swimlaneId - const cardsBySwimlane = new Map(); - cards.forEach(card => { - if (!cardsBySwimlane.has(card.swimlaneId)) { - cardsBySwimlane.set(card.swimlaneId, []); - } - cardsBySwimlane.get(card.swimlaneId).push(card); - }); - - const swimlaneEntries = Array.from(cardsBySwimlane.entries()); - const totalSwimlanes = swimlaneEntries.length; - - // Process each swimlane - for (let i = 0; i < swimlaneEntries.length; i++) { - const [swimlaneId, swimlaneCards] = swimlaneEntries[i]; - if (!swimlaneId) continue; - - if (progressCallback) { - const progress = Math.round(((i + 1) / totalSwimlanes) * 100); - progressCallback(progress, `Processing swimlane ${i + 1} of ${totalSwimlanes}...`); - } - - // Get existing lists for this swimlane - const existingLists = lists.filter(list => list.swimlaneId === swimlaneId); - const existingListTitles = new Set(existingLists.map(list => list.title)); - - // Group cards by their current listId - const cardsByListId = new Map(); - swimlaneCards.forEach(card => { - if (!cardsByListId.has(card.listId)) { - cardsByListId.set(card.listId, []); - } - cardsByListId.get(card.listId).push(card); - }); - - // For each listId used by cards in this swimlane - for (const [listId, cardsInList] of cardsByListId) { - const originalList = lists.find(l => l._id === listId); - if (!originalList) continue; - - // Check if this list's swimlaneId matches the card's swimlaneId - if (originalList.swimlaneId === swimlaneId) { - // List is already correctly assigned to this swimlane - listsProcessed++; - continue; - } - - // Check if we already have a list with the same title in this swimlane - let targetList = existingLists.find(list => list.title === originalList.title); - - if (!targetList) { - // Create a new list for this swimlane - const newListData = { - title: originalList.title, - boardId: boardId, - swimlaneId: swimlaneId, - sort: originalList.sort || 0, - archived: originalList.archived || false, - createdAt: new Date(), - modifiedAt: new Date(), - type: originalList.type || 'list' - }; - - // Copy other properties if they exist - if (originalList.color) newListData.color = originalList.color; - if (originalList.wipLimit) newListData.wipLimit = originalList.wipLimit; - if (originalList.wipLimitEnabled) newListData.wipLimitEnabled = originalList.wipLimitEnabled; - if (originalList.wipLimitSoft) newListData.wipLimitSoft = originalList.wipLimitSoft; - if (originalList.starred) newListData.starred = originalList.starred; - if (originalList.collapsed) newListData.collapsed = originalList.collapsed; - - // Insert the new list - const newListId = Lists.insert(newListData); - targetList = { _id: newListId, ...newListData }; - listsCreated++; - } - - // Update all cards in this group to use the correct listId - for (const card of cardsInList) { - Cards.update(card._id, { - $set: { - listId: targetList._id, - modifiedAt: new Date() - } - }); - } - - listsProcessed++; - } - } - - return { listsProcessed, listsCreated }; - } - - /** - * Step 4: Ensure all lists are per-swimlane - */ - async ensurePerSwimlaneLists(boardId) { - const lists = ReactiveCache.getLists({ boardId }); - const swimlanes = ReactiveCache.getSwimlanes({ boardId }); - const defaultSwimlane = swimlanes.find(s => s.title === 'Default') || swimlanes[0]; - - let listsProcessed = 0; - - for (const list of lists) { - if (!list.swimlaneId || list.swimlaneId === '') { - // Assign to default swimlane - Lists.update(list._id, { - $set: { - swimlaneId: defaultSwimlane._id, - modifiedAt: new Date() - } - }); - listsProcessed++; - } - } - - return { listsProcessed }; - } - - /** - * Step 5: Cleanup empty lists (lists with no cards) - */ - async cleanupEmptyLists(boardId) { - const lists = ReactiveCache.getLists({ boardId }); - const cards = ReactiveCache.getCards({ boardId }); - - let listsRemoved = 0; - - for (const list of lists) { - const listCards = cards.filter(card => card.listId === list._id); - - if (listCards.length === 0) { - // Remove empty list - Lists.remove(list._id); - listsRemoved++; - - if (process.env.DEBUG === 'true') { - console.log(`Removed empty list: ${list.title} (${list._id})`); - } - } - } - - return { listsRemoved }; - } - - /** - * Step 6: Validate migration - */ - async validateMigration(boardId) { - const issues = this.detectMigrationIssues(boardId); - const cards = ReactiveCache.getCards({ boardId }); - const lists = ReactiveCache.getLists({ boardId }); - - // Check that all cards have valid swimlaneId and listId - const validCards = cards.filter(card => card.swimlaneId && card.listId); - const invalidCards = cards.length - validCards.length; - - // Check that all lists have swimlaneId - const validLists = lists.filter(list => list.swimlaneId && list.swimlaneId !== ''); - const invalidLists = lists.length - validLists.length; - - return { - issuesRemaining: issues.length, - totalCards: cards.length, - validCards, - invalidCards, - totalLists: lists.length, - validLists, - invalidLists, - migrationSuccessful: issues.length === 0 && invalidCards === 0 && invalidLists === 0 - }; - } - - /** - * Step 7: Fix avatar URLs (remove problematic auth parameters and fix URL formats) - */ - async fixAvatarUrls(boardId) { - const users = ReactiveCache.getUsers({}); - let avatarsFixed = 0; - - for (const user of users) { - if (user.profile && user.profile.avatarUrl) { - const avatarUrl = user.profile.avatarUrl; - let needsUpdate = false; - let cleanUrl = avatarUrl; - - // Check if URL has problematic parameters - if (avatarUrl.includes('auth=false') || avatarUrl.includes('brokenIsFine=true')) { - // Remove problematic parameters - cleanUrl = cleanUrl.replace(/[?&]auth=false/g, ''); - cleanUrl = cleanUrl.replace(/[?&]brokenIsFine=true/g, ''); - cleanUrl = cleanUrl.replace(/\?&/g, '?'); - cleanUrl = cleanUrl.replace(/\?$/g, ''); - needsUpdate = true; - } - - // Check if URL is using old CollectionFS format - if (avatarUrl.includes('/cfs/files/avatars/')) { - cleanUrl = cleanUrl.replace('/cfs/files/avatars/', '/cdn/storage/avatars/'); - needsUpdate = true; - } - - // Check if URL is missing the /cdn/storage/avatars/ prefix - if (avatarUrl.includes('avatars/') && !avatarUrl.includes('/cdn/storage/avatars/') && !avatarUrl.includes('/cfs/files/avatars/')) { - // This might be a relative URL, make it absolute - if (!avatarUrl.startsWith('http') && !avatarUrl.startsWith('/')) { - cleanUrl = `/cdn/storage/avatars/${avatarUrl}`; - needsUpdate = true; - } - } - - if (needsUpdate) { - // Update user's avatar URL - Users.update(user._id, { - $set: { - 'profile.avatarUrl': cleanUrl, - modifiedAt: new Date() - } - }); - - avatarsFixed++; - } - } - } - - return { avatarsFixed }; - } - - /** - * Step 8: Fix attachment URLs (remove problematic auth parameters and fix URL formats) - */ - async fixAttachmentUrls(boardId) { - const attachments = ReactiveCache.getAttachments({}); - let attachmentsFixed = 0; - - for (const attachment of attachments) { - // Check if attachment has URL field that needs fixing - if (attachment.url) { - const attachmentUrl = attachment.url; - let needsUpdate = false; - let cleanUrl = attachmentUrl; - - // Check if URL has problematic parameters - if (attachmentUrl.includes('auth=false') || attachmentUrl.includes('brokenIsFine=true')) { - // Remove problematic parameters - cleanUrl = cleanUrl.replace(/[?&]auth=false/g, ''); - cleanUrl = cleanUrl.replace(/[?&]brokenIsFine=true/g, ''); - cleanUrl = cleanUrl.replace(/\?&/g, '?'); - cleanUrl = cleanUrl.replace(/\?$/g, ''); - needsUpdate = true; - } - - // Check if URL is using old CollectionFS format - if (attachmentUrl.includes('/cfs/files/attachments/')) { - cleanUrl = cleanUrl.replace('/cfs/files/attachments/', '/cdn/storage/attachments/'); - needsUpdate = true; - } - - // Check if URL has /original/ path that should be removed - if (attachmentUrl.includes('/original/')) { - cleanUrl = cleanUrl.replace(/\/original\/[^\/\?#]+/, ''); - needsUpdate = true; - } - - // If we have a file ID, generate a universal URL - const fileId = attachment._id; - if (fileId && !isUniversalFileUrl(cleanUrl, 'attachment')) { - cleanUrl = generateUniversalAttachmentUrl(fileId); - needsUpdate = true; - } - - if (needsUpdate) { - // Update attachment URL - Attachments.update(attachment._id, { - $set: { - url: cleanUrl, - modifiedAt: new Date() - } - }); - - attachmentsFixed++; - } - } - } - - return { attachmentsFixed }; - } - - /** - * Get migration status for a board - */ - getMigrationStatus(boardId) { - try { - const board = ReactiveCache.getBoard(boardId); - if (!board) { - return { status: 'board_not_found' }; - } - - if (board.comprehensiveMigrationCompleted) { - return { - status: 'completed', - completedAt: board.comprehensiveMigrationCompletedAt, - results: board.comprehensiveMigrationResults - }; - } - - const needsMigration = this.needsMigration(boardId); - const issues = this.detectMigrationIssues(boardId); - - return { - status: needsMigration ? 'needed' : 'not_needed', - issues, - issueCount: issues.length - }; - - } catch (error) { - console.error('Error getting migration status:', error); - return { status: 'error', error: error.message }; - } - } -} - -// Export singleton instance -export const comprehensiveBoardMigration = new ComprehensiveBoardMigration(); - -// Meteor methods -Meteor.methods({ - 'comprehensiveBoardMigration.check'(boardId) { - check(boardId, String); - - if (!this.userId) { - throw new Meteor.Error('not-authorized'); - } - - return comprehensiveBoardMigration.getMigrationStatus(boardId); - }, - - 'comprehensiveBoardMigration.execute'(boardId) { - check(boardId, String); - - if (!this.userId) { - throw new Meteor.Error('not-authorized'); - } - - return comprehensiveBoardMigration.executeMigration(boardId); - }, - - 'comprehensiveBoardMigration.needsMigration'(boardId) { - check(boardId, String); - - if (!this.userId) { - throw new Meteor.Error('not-authorized'); - } - - return comprehensiveBoardMigration.needsMigration(boardId); - }, - - 'comprehensiveBoardMigration.detectIssues'(boardId) { - check(boardId, String); - - if (!this.userId) { - throw new Meteor.Error('not-authorized'); - } - - return comprehensiveBoardMigration.detectMigrationIssues(boardId); - }, - - 'comprehensiveBoardMigration.fixAvatarUrls'(boardId) { - check(boardId, String); - - if (!this.userId) { - throw new Meteor.Error('not-authorized'); - } - - return comprehensiveBoardMigration.fixAvatarUrls(boardId); - } -}); diff --git a/server/migrations/deleteDuplicateEmptyLists.js b/server/migrations/deleteDuplicateEmptyLists.js deleted file mode 100644 index dadbd5391..000000000 --- a/server/migrations/deleteDuplicateEmptyLists.js +++ /dev/null @@ -1,373 +0,0 @@ -/** - * Delete Duplicate Empty Lists Migration - * - * Safely deletes empty duplicate lists from a board: - * 1. First converts any shared lists to per-swimlane lists - * 2. Only deletes per-swimlane lists that: - * - Have no cards - * - Have another list with the same title on the same board that DOES have cards - * 3. This prevents deleting unique empty lists and only removes redundant duplicates - */ - -import { Meteor } from 'meteor/meteor'; -import { check } from 'meteor/check'; -import { ReactiveCache } from '/imports/reactiveCache'; -import Boards from '/models/boards'; -import Lists from '/models/lists'; -import Cards from '/models/cards'; -import Swimlanes from '/models/swimlanes'; - -class DeleteDuplicateEmptyListsMigration { - constructor() { - this.name = 'deleteDuplicateEmptyLists'; - this.version = 1; - } - - /** - * Check if migration is needed for a board - */ - needsMigration(boardId) { - try { - const lists = ReactiveCache.getLists({ boardId }); - const cards = ReactiveCache.getCards({ boardId }); - - // Check if there are any empty lists that have a duplicate with the same title containing cards - for (const list of lists) { - // Skip shared lists - if (!list.swimlaneId || list.swimlaneId === '') { - continue; - } - - // Check if list is empty - const listCards = cards.filter(card => card.listId === list._id); - if (listCards.length === 0) { - // Check if there's a duplicate list with the same title that has cards - const duplicateListsWithSameTitle = lists.filter(l => - l._id !== list._id && - l.title === list.title && - l.boardId === boardId - ); - - for (const duplicateList of duplicateListsWithSameTitle) { - const duplicateListCards = cards.filter(card => card.listId === duplicateList._id); - if (duplicateListCards.length > 0) { - return true; // Found an empty list with a duplicate that has cards - } - } - } - } - - return false; - } catch (error) { - console.error('Error checking if deleteDuplicateEmptyLists migration is needed:', error); - return false; - } - } - - /** - * Execute the migration - */ - async executeMigration(boardId) { - try { - const results = { - sharedListsConverted: 0, - listsDeleted: 0, - errors: [] - }; - - // Step 1: Convert shared lists to per-swimlane lists first - const conversionResult = await this.convertSharedListsToPerSwimlane(boardId); - results.sharedListsConverted = conversionResult.listsConverted; - - // Step 2: Delete empty per-swimlane lists - const deletionResult = await this.deleteEmptyPerSwimlaneLists(boardId); - results.listsDeleted = deletionResult.listsDeleted; - - return { - success: true, - changes: [ - `Converted ${results.sharedListsConverted} shared lists to per-swimlane lists`, - `Deleted ${results.listsDeleted} empty per-swimlane lists` - ], - results - }; - } catch (error) { - console.error('Error executing deleteDuplicateEmptyLists migration:', error); - return { - success: false, - error: error.message - }; - } - } - - /** - * Convert shared lists (lists without swimlaneId) to per-swimlane lists - */ - async convertSharedListsToPerSwimlane(boardId) { - const lists = ReactiveCache.getLists({ boardId }); - const swimlanes = ReactiveCache.getSwimlanes({ boardId, archived: false }); - const cards = ReactiveCache.getCards({ boardId }); - - let listsConverted = 0; - - // Find shared lists (lists without swimlaneId) - const sharedLists = lists.filter(list => !list.swimlaneId || list.swimlaneId === ''); - - if (sharedLists.length === 0) { - return { listsConverted: 0 }; - } - - for (const sharedList of sharedLists) { - // Get cards in this shared list - const listCards = cards.filter(card => card.listId === sharedList._id); - - // Group cards by swimlane - const cardsBySwimlane = {}; - for (const card of listCards) { - const swimlaneId = card.swimlaneId || 'default'; - if (!cardsBySwimlane[swimlaneId]) { - cardsBySwimlane[swimlaneId] = []; - } - cardsBySwimlane[swimlaneId].push(card); - } - - // Create per-swimlane lists for each swimlane that has cards - for (const swimlane of swimlanes) { - const swimlaneCards = cardsBySwimlane[swimlane._id] || []; - - if (swimlaneCards.length > 0) { - // Check if per-swimlane list already exists - const existingList = lists.find(l => - l.title === sharedList.title && - l.swimlaneId === swimlane._id && - l._id !== sharedList._id - ); - - if (!existingList) { - // Create new per-swimlane list - const newListId = Lists.insert({ - title: sharedList.title, - boardId: boardId, - swimlaneId: swimlane._id, - sort: sharedList.sort, - createdAt: new Date(), - updatedAt: new Date(), - archived: false - }); - - // Move cards to the new list - for (const card of swimlaneCards) { - Cards.update(card._id, { - $set: { - listId: newListId, - swimlaneId: swimlane._id - } - }); - } - - if (process.env.DEBUG === 'true') { - console.log(`Created per-swimlane list "${sharedList.title}" for swimlane ${swimlane.title || swimlane._id}`); - } - } else { - // Move cards to existing per-swimlane list - for (const card of swimlaneCards) { - Cards.update(card._id, { - $set: { - listId: existingList._id, - swimlaneId: swimlane._id - } - }); - } - - if (process.env.DEBUG === 'true') { - console.log(`Moved cards to existing per-swimlane list "${sharedList.title}" in swimlane ${swimlane.title || swimlane._id}`); - } - } - } - } - - // Remove the shared list (now that all cards are moved) - Lists.remove(sharedList._id); - listsConverted++; - - if (process.env.DEBUG === 'true') { - console.log(`Removed shared list "${sharedList.title}"`); - } - } - - return { listsConverted }; - } - - /** - * Delete empty per-swimlane lists - * Only deletes lists that: - * 1. Have a swimlaneId (are per-swimlane, not shared) - * 2. Have no cards - * 3. Have a duplicate list with the same title on the same board that contains cards - */ - async deleteEmptyPerSwimlaneLists(boardId) { - const lists = ReactiveCache.getLists({ boardId }); - const cards = ReactiveCache.getCards({ boardId }); - - let listsDeleted = 0; - - for (const list of lists) { - // Safety check 1: List must have a swimlaneId (must be per-swimlane, not shared) - if (!list.swimlaneId || list.swimlaneId === '') { - if (process.env.DEBUG === 'true') { - console.log(`Skipping list "${list.title}" - no swimlaneId (shared list)`); - } - continue; - } - - // Safety check 2: List must have no cards - const listCards = cards.filter(card => card.listId === list._id); - if (listCards.length > 0) { - if (process.env.DEBUG === 'true') { - console.log(`Skipping list "${list.title}" - has ${listCards.length} cards`); - } - continue; - } - - // Safety check 3: There must be another list with the same title on the same board that has cards - const duplicateListsWithSameTitle = lists.filter(l => - l._id !== list._id && - l.title === list.title && - l.boardId === boardId - ); - - let hasDuplicateWithCards = false; - for (const duplicateList of duplicateListsWithSameTitle) { - const duplicateListCards = cards.filter(card => card.listId === duplicateList._id); - if (duplicateListCards.length > 0) { - hasDuplicateWithCards = true; - break; - } - } - - if (!hasDuplicateWithCards) { - if (process.env.DEBUG === 'true') { - console.log(`Skipping list "${list.title}" - no duplicate list with same title that has cards`); - } - continue; - } - - // All safety checks passed - delete the empty per-swimlane list - Lists.remove(list._id); - listsDeleted++; - - if (process.env.DEBUG === 'true') { - console.log(`Deleted empty per-swimlane list: "${list.title}" (swimlane: ${list.swimlaneId}) - duplicate with cards exists`); - } - } - - return { listsDeleted }; - } - - /** - * Get detailed status of empty lists - */ - async getStatus(boardId) { - const lists = ReactiveCache.getLists({ boardId }); - const cards = ReactiveCache.getCards({ boardId }); - - const sharedLists = []; - const emptyPerSwimlaneLists = []; - const nonEmptyLists = []; - - for (const list of lists) { - const listCards = cards.filter(card => card.listId === list._id); - const isShared = !list.swimlaneId || list.swimlaneId === ''; - const isEmpty = listCards.length === 0; - - if (isShared) { - sharedLists.push({ - id: list._id, - title: list.title, - cardCount: listCards.length - }); - } else if (isEmpty) { - emptyPerSwimlaneLists.push({ - id: list._id, - title: list.title, - swimlaneId: list.swimlaneId - }); - } else { - nonEmptyLists.push({ - id: list._id, - title: list.title, - swimlaneId: list.swimlaneId, - cardCount: listCards.length - }); - } - } - - return { - sharedListsCount: sharedLists.length, - emptyPerSwimlaneLists: emptyPerSwimlaneLists.length, - totalLists: lists.length, - details: { - sharedLists, - emptyPerSwimlaneLists, - nonEmptyLists - } - }; - } -} - -const deleteDuplicateEmptyListsMigration = new DeleteDuplicateEmptyListsMigration(); - -// Register Meteor methods -Meteor.methods({ - 'deleteDuplicateEmptyLists.needsMigration'(boardId) { - check(boardId, String); - - if (!this.userId) { - throw new Meteor.Error('not-authorized', 'You must be logged in'); - } - - return deleteDuplicateEmptyListsMigration.needsMigration(boardId); - }, - - 'deleteDuplicateEmptyLists.execute'(boardId) { - check(boardId, String); - - if (!this.userId) { - throw new Meteor.Error('not-authorized', 'You must be logged in'); - } - - // Check if user is board admin - const board = ReactiveCache.getBoard(boardId); - if (!board) { - throw new Meteor.Error('board-not-found', 'Board not found'); - } - - const user = ReactiveCache.getUser(this.userId); - if (!user) { - throw new Meteor.Error('user-not-found', 'User not found'); - } - - // Only board admins can run migrations - const isBoardAdmin = board.members && board.members.some( - member => member.userId === this.userId && member.isAdmin - ); - - if (!isBoardAdmin && !user.isAdmin) { - throw new Meteor.Error('not-authorized', 'Only board administrators can run migrations'); - } - - return deleteDuplicateEmptyListsMigration.executeMigration(boardId); - }, - - 'deleteDuplicateEmptyLists.getStatus'(boardId) { - check(boardId, String); - - if (!this.userId) { - throw new Meteor.Error('not-authorized', 'You must be logged in'); - } - - return deleteDuplicateEmptyListsMigration.getStatus(boardId); - } -}); - -export default deleteDuplicateEmptyListsMigration; diff --git a/server/migrations/ensureValidSwimlaneIds.js b/server/migrations/ensureValidSwimlaneIds.js deleted file mode 100644 index 7c2a7ba5e..000000000 --- a/server/migrations/ensureValidSwimlaneIds.js +++ /dev/null @@ -1,286 +0,0 @@ -/** - * Migration: Ensure all entities have valid swimlaneId - * - * This migration ensures that: - * 1. All cards have a valid swimlaneId - * 2. All lists have a valid swimlaneId (if applicable) - * 3. Orphaned entities (without valid swimlaneId) are moved to a "Rescued Data" swimlane - * - * This is similar to the existing rescue migration but specifically for swimlaneId validation - */ - -// Helper collection to track migrations - must be defined first -const Migrations = new Mongo.Collection('migrations'); - -Meteor.startup(() => { - // Only run on server - if (!Meteor.isServer) return; - - const MIGRATION_NAME = 'ensure-valid-swimlane-ids'; - const MIGRATION_VERSION = 1; - - // Check if migration already ran - const existingMigration = Migrations.findOne({ name: MIGRATION_NAME }); - if (existingMigration && existingMigration.version >= MIGRATION_VERSION) { - return; - } - - console.log(`Running migration: ${MIGRATION_NAME} v${MIGRATION_VERSION}`); - - /** - * Get or create a "Rescued Data" swimlane for a board - */ - function getOrCreateRescuedSwimlane(boardId) { - const board = Boards.findOne(boardId); - if (!board) return null; - - // Look for existing rescued data swimlane - let rescuedSwimlane = Swimlanes.findOne({ - boardId, - title: { $regex: /rescued.*data/i }, - }); - - if (!rescuedSwimlane) { - // Create a new rescued data swimlane - const swimlaneId = Swimlanes.insert({ - title: 'Rescued Data (Missing Swimlane)', - boardId, - archived: false, - sort: 9999999, // Put at the end - type: 'swimlane', - color: 'red', - }); - - rescuedSwimlane = Swimlanes.findOne(swimlaneId); - - Activities.insert({ - userId: 'migration', - type: 'swimlane', - activityType: 'createSwimlane', - boardId, - swimlaneId, - title: 'Created rescued data swimlane during migration', - }); - } - - return rescuedSwimlane; - } - - /** - * Validate and fix cards without valid swimlaneId - */ - function fixCardsWithoutSwimlaneId() { - let fixedCount = 0; - let rescuedCount = 0; - - const cardsWithoutSwimlane = Cards.find({ - $or: [ - { swimlaneId: { $exists: false } }, - { swimlaneId: null }, - { swimlaneId: '' }, - ], - }).fetch(); - - console.log(`Found ${cardsWithoutSwimlane.length} cards without swimlaneId`); - - cardsWithoutSwimlane.forEach(card => { - const board = Boards.findOne(card.boardId); - if (!board) { - console.warn(`Card ${card._id} has invalid boardId: ${card.boardId}`); - return; - } - - // Try to get default swimlane - let defaultSwimlane = Swimlanes.findOne({ - boardId: card.boardId, - type: { $ne: 'template-swimlane' }, - archived: false, - }, { sort: { sort: 1 } }); - - if (!defaultSwimlane) { - // No swimlanes at all - create default - const swimlaneId = Swimlanes.insert({ - title: 'Default', - boardId: card.boardId, - archived: false, - sort: 0, - type: 'swimlane', - }); - defaultSwimlane = Swimlanes.findOne(swimlaneId); - } - - if (defaultSwimlane) { - Cards.update(card._id, { - $set: { swimlaneId: defaultSwimlane._id }, - }); - fixedCount++; - } else { - console.warn(`Could not find or create default swimlane for card ${card._id}`); - } - }); - - return { fixedCount, rescuedCount }; - } - - /** - * Validate and fix lists without valid swimlaneId - */ - function fixListsWithoutSwimlaneId() { - let fixedCount = 0; - - const listsWithoutSwimlane = Lists.find({ - $or: [ - { swimlaneId: { $exists: false } }, - { swimlaneId: null }, - ], - }).fetch(); - - console.log(`Found ${listsWithoutSwimlane.length} lists without swimlaneId`); - - listsWithoutSwimlane.forEach(list => { - // Set to empty string for backward compatibility - // (lists can be shared across swimlanes) - Lists.update(list._id, { - $set: { swimlaneId: '' }, - }); - fixedCount++; - }); - - return { fixedCount }; - } - - /** - * Find and rescue orphaned cards (swimlaneId points to non-existent swimlane) - */ - function rescueOrphanedCards() { - let rescuedCount = 0; - - const allCards = Cards.find({}).fetch(); - - allCards.forEach(card => { - if (!card.swimlaneId) return; // Handled by fixCardsWithoutSwimlaneId - - // Check if swimlane exists - const swimlane = Swimlanes.findOne(card.swimlaneId); - if (!swimlane) { - // Orphaned card - swimlane doesn't exist - const rescuedSwimlane = getOrCreateRescuedSwimlane(card.boardId); - - if (rescuedSwimlane) { - Cards.update(card._id, { - $set: { swimlaneId: rescuedSwimlane._id }, - }); - rescuedCount++; - - Activities.insert({ - userId: 'migration', - type: 'card', - activityType: 'moveCard', - boardId: card.boardId, - cardId: card._id, - swimlaneId: rescuedSwimlane._id, - listId: card.listId, - title: `Rescued card from deleted swimlane`, - }); - } - } - }); - - return { rescuedCount }; - } - - /** - * Ensure all swimlaneId references are always saved in all operations - * This adds a global hook to validate swimlaneId before insert/update - */ - function addSwimlaneIdValidationHooks() { - // Card insert hook - Cards.before.insert(function(userId, doc) { - if (!doc.swimlaneId) { - const board = Boards.findOne(doc.boardId); - if (board) { - const defaultSwimlane = Swimlanes.findOne({ - boardId: doc.boardId, - type: { $ne: 'template-swimlane' }, - archived: false, - }, { sort: { sort: 1 } }); - - if (defaultSwimlane) { - doc.swimlaneId = defaultSwimlane._id; - } else { - console.warn('No default swimlane found for new card, creating one'); - const swimlaneId = Swimlanes.insert({ - title: 'Default', - boardId: doc.boardId, - archived: false, - sort: 0, - type: 'swimlane', - }); - doc.swimlaneId = swimlaneId; - } - } - } - }); - - // Card update hook - ensure swimlaneId is never removed - Cards.before.update(function(userId, doc, fieldNames, modifier) { - if (modifier.$unset && modifier.$unset.swimlaneId) { - delete modifier.$unset.swimlaneId; - console.warn('Prevented removal of swimlaneId from card', doc._id); - } - - if (modifier.$set && modifier.$set.swimlaneId === null) { - const defaultSwimlane = Swimlanes.findOne({ - boardId: doc.boardId, - type: { $ne: 'template-swimlane' }, - archived: false, - }, { sort: { sort: 1 } }); - - if (defaultSwimlane) { - modifier.$set.swimlaneId = defaultSwimlane._id; - } - } - }); - } - - try { - // Run all fix operations - const cardResults = fixCardsWithoutSwimlaneId(); - const listResults = fixListsWithoutSwimlaneId(); - const rescueResults = rescueOrphanedCards(); - - console.log('Migration results:'); - console.log(`- Fixed ${cardResults.fixedCount} cards without swimlaneId`); - console.log(`- Fixed ${listResults.fixedCount} lists without swimlaneId`); - console.log(`- Rescued ${rescueResults.rescuedCount} orphaned cards`); - - // Record migration completion - Migrations.upsert( - { name: MIGRATION_NAME }, - { - $set: { - name: MIGRATION_NAME, - version: MIGRATION_VERSION, - completedAt: new Date(), - results: { - cardsFixed: cardResults.fixedCount, - listsFixed: listResults.fixedCount, - cardsRescued: rescueResults.rescuedCount, - }, - }, - } - ); - - console.log(`Migration ${MIGRATION_NAME} completed successfully`); - } catch (error) { - console.error(`Migration ${MIGRATION_NAME} failed:`, error); - } - - // Add validation hooks (outside try-catch to ensure they run even if migration failed) - try { - addSwimlaneIdValidationHooks(); - console.log('SwimlaneId validation hooks installed'); - } catch (error) { - console.error('Failed to install swimlaneId validation hooks:', error); - } -}); diff --git a/server/migrations/fixAllFileUrls.js b/server/migrations/fixAllFileUrls.js deleted file mode 100644 index f713ac8ae..000000000 --- a/server/migrations/fixAllFileUrls.js +++ /dev/null @@ -1,312 +0,0 @@ -/** - * Fix All File URLs Migration - * Ensures all attachment and avatar URLs are universal and work regardless of ROOT_URL and PORT settings - */ - -import { Meteor } from 'meteor/meteor'; -import { check } from 'meteor/check'; -import { ReactiveCache } from '/imports/reactiveCache'; -import Boards from '/models/boards'; -import Users from '/models/users'; -import Attachments from '/models/attachments'; -import Avatars from '/models/avatars'; -import Cards from '/models/cards'; -import { generateUniversalAttachmentUrl, generateUniversalAvatarUrl, cleanFileUrl, extractFileIdFromUrl, isUniversalFileUrl } from '/models/lib/universalUrlGenerator'; - -class FixAllFileUrlsMigration { - constructor() { - this.name = 'fixAllFileUrls'; - this.version = 1; - } - - /** - * Check if migration is needed for a board - */ - needsMigration(boardId) { - // Get all users who are members of this board - const board = ReactiveCache.getBoard(boardId); - if (!board || !board.members) { - return false; - } - - const memberIds = board.members.map(m => m.userId); - - // Check for problematic avatar URLs for board members - const users = ReactiveCache.getUsers({ _id: { $in: memberIds } }); - for (const user of users) { - if (user.profile && user.profile.avatarUrl) { - const avatarUrl = user.profile.avatarUrl; - if (this.hasProblematicUrl(avatarUrl)) { - return true; - } - } - } - - // Check for problematic attachment URLs on this board - const cards = ReactiveCache.getCards({ boardId }); - const cardIds = cards.map(c => c._id); - const attachments = ReactiveCache.getAttachments({ cardId: { $in: cardIds } }); - - for (const attachment of attachments) { - if (attachment.url && this.hasProblematicUrl(attachment.url)) { - return true; - } - } - - return false; - } - - /** - * Check if a URL has problematic patterns - */ - hasProblematicUrl(url) { - if (!url) return false; - - // Check for auth parameters - if (url.includes('auth=false') || url.includes('brokenIsFine=true')) { - return true; - } - - // Check for absolute URLs with domains - if (url.startsWith('http://') || url.startsWith('https://')) { - return true; - } - - // Check for ROOT_URL dependencies - if (Meteor.isServer && process.env.ROOT_URL) { - try { - const rootUrl = new URL(process.env.ROOT_URL); - if (rootUrl.pathname && rootUrl.pathname !== '/' && url.includes(rootUrl.pathname)) { - return true; - } - } catch (e) { - // Ignore URL parsing errors - } - } - - // Check for non-universal file URLs - if (url.includes('/cfs/files/') && !isUniversalFileUrl(url, 'attachment') && !isUniversalFileUrl(url, 'avatar')) { - return true; - } - - return false; - } - - /** - * Execute the migration for a board - */ - async execute(boardId) { - let filesFixed = 0; - let errors = []; - - console.log(`Starting universal file URL migration for board ${boardId}...`); - - try { - // Fix avatar URLs for board members - const avatarFixed = await this.fixAvatarUrls(boardId); - filesFixed += avatarFixed; - - // Fix attachment URLs for board cards - const attachmentFixed = await this.fixAttachmentUrls(boardId); - filesFixed += attachmentFixed; - - // Fix card attachment references - const cardFixed = await this.fixCardAttachmentUrls(boardId); - filesFixed += cardFixed; - - } catch (error) { - console.error('Error during file URL migration for board', boardId, ':', error); - errors.push(error.message); - } - - console.log(`Universal file URL migration completed for board ${boardId}. Fixed ${filesFixed} file URLs.`); - - return { - success: errors.length === 0, - filesFixed, - errors, - changes: [`Fixed ${filesFixed} file URLs for this board`] - }; - } - - /** - * Fix avatar URLs in user profiles for board members - */ - async fixAvatarUrls(boardId) { - const board = ReactiveCache.getBoard(boardId); - if (!board || !board.members) { - return 0; - } - - const memberIds = board.members.map(m => m.userId); - const users = ReactiveCache.getUsers({ _id: { $in: memberIds } }); - let avatarsFixed = 0; - - for (const user of users) { - if (user.profile && user.profile.avatarUrl) { - const avatarUrl = user.profile.avatarUrl; - - if (this.hasProblematicUrl(avatarUrl)) { - try { - // Extract file ID from URL - const fileId = extractFileIdFromUrl(avatarUrl, 'avatar'); - - let cleanUrl; - if (fileId) { - // Generate universal URL - cleanUrl = generateUniversalAvatarUrl(fileId); - } else { - // Clean existing URL - cleanUrl = cleanFileUrl(avatarUrl, 'avatar'); - } - - if (cleanUrl && cleanUrl !== avatarUrl) { - // Update user's avatar URL - Users.update(user._id, { - $set: { - 'profile.avatarUrl': cleanUrl, - modifiedAt: new Date() - } - }); - - avatarsFixed++; - - if (process.env.DEBUG === 'true') { - console.log(`Fixed avatar URL for user ${user.username}: ${avatarUrl} -> ${cleanUrl}`); - } - } - } catch (error) { - console.error(`Error fixing avatar URL for user ${user.username}:`, error); - } - } - } - } - - return avatarsFixed; - } - - /** - * Fix attachment URLs in attachment records for this board - */ - async fixAttachmentUrls(boardId) { - const cards = ReactiveCache.getCards({ boardId }); - const cardIds = cards.map(c => c._id); - const attachments = ReactiveCache.getAttachments({ cardId: { $in: cardIds } }); - let attachmentsFixed = 0; - - for (const attachment of attachments) { - // Check if attachment has URL field that needs fixing - if (attachment.url && this.hasProblematicUrl(attachment.url)) { - try { - const fileId = attachment._id; - const cleanUrl = generateUniversalAttachmentUrl(fileId); - - if (cleanUrl && cleanUrl !== attachment.url) { - // Update attachment URL - Attachments.update(attachment._id, { - $set: { - url: cleanUrl, - modifiedAt: new Date() - } - }); - - attachmentsFixed++; - - if (process.env.DEBUG === 'true') { - console.log(`Fixed attachment URL: ${attachment.url} -> ${cleanUrl}`); - } - } - } catch (error) { - console.error(`Error fixing attachment URL for ${attachment._id}:`, error); - } - } - } - - return attachmentsFixed; - } - - /** - * Fix attachment URLs in the Attachments collection for this board - */ - async fixCardAttachmentUrls(boardId) { - const cards = ReactiveCache.getCards({ boardId }); - const cardIds = cards.map(c => c._id); - const attachments = ReactiveCache.getAttachments({ cardId: { $in: cardIds } }); - let attachmentsFixed = 0; - - for (const attachment of attachments) { - if (attachment.url && this.hasProblematicUrl(attachment.url)) { - try { - const fileId = attachment._id || extractFileIdFromUrl(attachment.url, 'attachment'); - const cleanUrl = fileId ? generateUniversalAttachmentUrl(fileId) : cleanFileUrl(attachment.url, 'attachment'); - - if (cleanUrl && cleanUrl !== attachment.url) { - // Update attachment with fixed URL - Attachments.update(attachment._id, { - $set: { - url: cleanUrl, - modifiedAt: new Date() - } - }); - - attachmentsFixed++; - - if (process.env.DEBUG === 'true') { - console.log(`Fixed attachment URL ${attachment._id}`); - } - } - } catch (error) { - console.error(`Error fixing attachment URL:`, error); - } - } - } - - return attachmentsFixed; - } -} - -// Export singleton instance -export const fixAllFileUrlsMigration = new FixAllFileUrlsMigration(); - -// Meteor methods -Meteor.methods({ - 'fixAllFileUrls.execute'(boardId) { - check(boardId, String); - - if (!this.userId) { - throw new Meteor.Error('not-authorized', 'You must be logged in'); - } - - // Check if user is board admin - const board = ReactiveCache.getBoard(boardId); - if (!board) { - throw new Meteor.Error('board-not-found', 'Board not found'); - } - - const user = ReactiveCache.getUser(this.userId); - if (!user) { - throw new Meteor.Error('user-not-found', 'User not found'); - } - - // Only board admins can run migrations - const isBoardAdmin = board.members && board.members.some( - member => member.userId === this.userId && member.isAdmin - ); - - if (!isBoardAdmin && !user.isAdmin) { - throw new Meteor.Error('not-authorized', 'Only board administrators can run migrations'); - } - - return fixAllFileUrlsMigration.execute(boardId); - }, - - 'fixAllFileUrls.needsMigration'(boardId) { - check(boardId, String); - - if (!this.userId) { - throw new Meteor.Error('not-authorized', 'You must be logged in'); - } - - return fixAllFileUrlsMigration.needsMigration(boardId); - } -}); diff --git a/server/migrations/fixAvatarUrls.js b/server/migrations/fixAvatarUrls.js deleted file mode 100644 index 82677eb48..000000000 --- a/server/migrations/fixAvatarUrls.js +++ /dev/null @@ -1,173 +0,0 @@ -/** - * Fix Avatar URLs Migration - * Removes problematic auth parameters from existing avatar URLs - */ - -import { Meteor } from 'meteor/meteor'; -import { check } from 'meteor/check'; -import { ReactiveCache } from '/imports/reactiveCache'; -import Boards from '/models/boards'; -import Users from '/models/users'; -import { generateUniversalAvatarUrl, cleanFileUrl, extractFileIdFromUrl, isUniversalFileUrl } from '/models/lib/universalUrlGenerator'; - -class FixAvatarUrlsMigration { - constructor() { - this.name = 'fixAvatarUrls'; - this.version = 1; - } - - /** - * Check if migration is needed for a board - */ - needsMigration(boardId) { - // Get all users who are members of this board - const board = ReactiveCache.getBoard(boardId); - if (!board || !board.members) { - return false; - } - - const memberIds = board.members.map(m => m.userId); - const users = ReactiveCache.getUsers({ _id: { $in: memberIds } }); - - for (const user of users) { - if (user.profile && user.profile.avatarUrl) { - const avatarUrl = user.profile.avatarUrl; - if (avatarUrl.includes('auth=false') || avatarUrl.includes('brokenIsFine=true')) { - return true; - } - } - } - - return false; - } - - /** - * Execute the migration for a board - */ - async execute(boardId) { - // Get all users who are members of this board - const board = ReactiveCache.getBoard(boardId); - if (!board || !board.members) { - return { - success: false, - error: 'Board not found or has no members' - }; - } - - const memberIds = board.members.map(m => m.userId); - const users = ReactiveCache.getUsers({ _id: { $in: memberIds } }); - let avatarsFixed = 0; - - console.log(`Starting avatar URL fix migration for board ${boardId}...`); - - for (const user of users) { - if (user.profile && user.profile.avatarUrl) { - const avatarUrl = user.profile.avatarUrl; - let needsUpdate = false; - let cleanUrl = avatarUrl; - - // Check if URL has problematic parameters - if (avatarUrl.includes('auth=false') || avatarUrl.includes('brokenIsFine=true')) { - // Remove problematic parameters - cleanUrl = cleanUrl.replace(/[?&]auth=false/g, ''); - cleanUrl = cleanUrl.replace(/[?&]brokenIsFine=true/g, ''); - cleanUrl = cleanUrl.replace(/\?&/g, '?'); - cleanUrl = cleanUrl.replace(/\?$/g, ''); - needsUpdate = true; - } - - // Check if URL is using old CollectionFS format - if (avatarUrl.includes('/cfs/files/avatars/')) { - cleanUrl = cleanUrl.replace('/cfs/files/avatars/', '/cdn/storage/avatars/'); - needsUpdate = true; - } - - // Check if URL is missing the /cdn/storage/avatars/ prefix - if (avatarUrl.includes('avatars/') && !avatarUrl.includes('/cdn/storage/avatars/') && !avatarUrl.includes('/cfs/files/avatars/')) { - // This might be a relative URL, make it absolute - if (!avatarUrl.startsWith('http') && !avatarUrl.startsWith('/')) { - cleanUrl = `/cdn/storage/avatars/${avatarUrl}`; - needsUpdate = true; - } - } - - // If we have a file ID, generate a universal URL - const fileId = extractFileIdFromUrl(avatarUrl, 'avatar'); - if (fileId && !isUniversalFileUrl(cleanUrl, 'avatar')) { - cleanUrl = generateUniversalAvatarUrl(fileId); - needsUpdate = true; - } - - if (needsUpdate) { - // Update user's avatar URL - Users.update(user._id, { - $set: { - 'profile.avatarUrl': cleanUrl, - modifiedAt: new Date() - } - }); - - avatarsFixed++; - - if (process.env.DEBUG === 'true') { - console.log(`Fixed avatar URL for user ${user.username}: ${avatarUrl} -> ${cleanUrl}`); - } - } - } - } - - console.log(`Avatar URL fix migration completed for board ${boardId}. Fixed ${avatarsFixed} avatar URLs.`); - - return { - success: true, - avatarsFixed, - changes: [`Fixed ${avatarsFixed} avatar URLs for board members`] - }; - } -} - -// Export singleton instance -export const fixAvatarUrlsMigration = new FixAvatarUrlsMigration(); - -// Meteor method -Meteor.methods({ - 'fixAvatarUrls.execute'(boardId) { - check(boardId, String); - - if (!this.userId) { - throw new Meteor.Error('not-authorized', 'You must be logged in'); - } - - // Check if user is board admin - const board = ReactiveCache.getBoard(boardId); - if (!board) { - throw new Meteor.Error('board-not-found', 'Board not found'); - } - - const user = ReactiveCache.getUser(this.userId); - if (!user) { - throw new Meteor.Error('user-not-found', 'User not found'); - } - - // Only board admins can run migrations - const isBoardAdmin = board.members && board.members.some( - member => member.userId === this.userId && member.isAdmin - ); - - if (!isBoardAdmin && !user.isAdmin) { - throw new Meteor.Error('not-authorized', 'Only board administrators can run migrations'); - } - - return fixAvatarUrlsMigration.execute(boardId); - }, - - 'fixAvatarUrls.needsMigration'(boardId) { - check(boardId, String); - - if (!this.userId) { - throw new Meteor.Error('not-authorized', 'You must be logged in'); - } - - return fixAvatarUrlsMigration.needsMigration(boardId); - } -}); diff --git a/server/migrations/restoreAllArchived.js b/server/migrations/restoreAllArchived.js deleted file mode 100644 index 825f9a2f4..000000000 --- a/server/migrations/restoreAllArchived.js +++ /dev/null @@ -1,266 +0,0 @@ -/** - * Restore All Archived Migration - * - * Restores all archived swimlanes, lists, and cards. - * If any restored items are missing swimlaneId, listId, or cardId, - * creates/assigns proper IDs to make them visible. - */ - -import { Meteor } from 'meteor/meteor'; -import { check } from 'meteor/check'; -import { ReactiveCache } from '/imports/reactiveCache'; -import { TAPi18n } from '/imports/i18n'; -import Boards from '/models/boards'; -import Lists from '/models/lists'; -import Cards from '/models/cards'; -import Swimlanes from '/models/swimlanes'; - -class RestoreAllArchivedMigration { - constructor() { - this.name = 'restoreAllArchived'; - this.version = 1; - } - - /** - * Check if migration is needed for a board - */ - needsMigration(boardId) { - try { - const archivedSwimlanes = ReactiveCache.getSwimlanes({ boardId, archived: true }); - const archivedLists = ReactiveCache.getLists({ boardId, archived: true }); - const archivedCards = ReactiveCache.getCards({ boardId, archived: true }); - - return archivedSwimlanes.length > 0 || archivedLists.length > 0 || archivedCards.length > 0; - } catch (error) { - console.error('Error checking if restoreAllArchived migration is needed:', error); - return false; - } - } - - /** - * Execute the migration - */ - async executeMigration(boardId) { - try { - const results = { - swimlanesRestored: 0, - listsRestored: 0, - cardsRestored: 0, - itemsFixed: 0, - errors: [] - }; - - const board = ReactiveCache.getBoard(boardId); - if (!board) { - throw new Error('Board not found'); - } - - // Get archived items - const archivedSwimlanes = ReactiveCache.getSwimlanes({ boardId, archived: true }); - const archivedLists = ReactiveCache.getLists({ boardId, archived: true }); - const archivedCards = ReactiveCache.getCards({ boardId, archived: true }); - - // Get active items for reference - const activeSwimlanes = ReactiveCache.getSwimlanes({ boardId, archived: false }); - const activeLists = ReactiveCache.getLists({ boardId, archived: false }); - - // Restore all archived swimlanes - for (const swimlane of archivedSwimlanes) { - Swimlanes.update(swimlane._id, { - $set: { - archived: false, - updatedAt: new Date() - } - }); - results.swimlanesRestored++; - - if (process.env.DEBUG === 'true') { - console.log(`Restored swimlane: ${swimlane.title}`); - } - } - - // Restore all archived lists and fix missing swimlaneId - for (const list of archivedLists) { - const updateFields = { - archived: false, - updatedAt: new Date() - }; - - // Fix missing swimlaneId - if (!list.swimlaneId) { - // Try to find a suitable swimlane or use default - let targetSwimlane = activeSwimlanes.find(s => !s.archived); - - if (!targetSwimlane) { - // No active swimlane found, create default - const swimlaneId = Swimlanes.insert({ - title: TAPi18n.__('default'), - boardId: boardId, - sort: 0, - createdAt: new Date(), - updatedAt: new Date(), - archived: false - }); - targetSwimlane = ReactiveCache.getSwimlane(swimlaneId); - } - - updateFields.swimlaneId = targetSwimlane._id; - results.itemsFixed++; - - if (process.env.DEBUG === 'true') { - console.log(`Fixed missing swimlaneId for list: ${list.title}`); - } - } - - Lists.update(list._id, { - $set: updateFields - }); - results.listsRestored++; - - if (process.env.DEBUG === 'true') { - console.log(`Restored list: ${list.title}`); - } - } - - // Refresh lists after restoration - const allLists = ReactiveCache.getLists({ boardId, archived: false }); - const allSwimlanes = ReactiveCache.getSwimlanes({ boardId, archived: false }); - - // Restore all archived cards and fix missing IDs - for (const card of archivedCards) { - const updateFields = { - archived: false, - updatedAt: new Date() - }; - - let needsFix = false; - - // Fix missing listId - if (!card.listId) { - // Find or create a default list - let targetList = allLists.find(l => !l.archived); - - if (!targetList) { - // No active list found, create one - const defaultSwimlane = allSwimlanes.find(s => !s.archived) || allSwimlanes[0]; - - const listId = Lists.insert({ - title: TAPi18n.__('default'), - boardId: boardId, - swimlaneId: defaultSwimlane._id, - sort: 0, - createdAt: new Date(), - updatedAt: new Date(), - archived: false - }); - targetList = ReactiveCache.getList(listId); - } - - updateFields.listId = targetList._id; - needsFix = true; - } - - // Fix missing swimlaneId - if (!card.swimlaneId) { - // Try to get swimlaneId from the card's list - if (card.listId || updateFields.listId) { - const cardList = allLists.find(l => l._id === (updateFields.listId || card.listId)); - if (cardList && cardList.swimlaneId) { - updateFields.swimlaneId = cardList.swimlaneId; - } else { - // Fall back to first available swimlane - const defaultSwimlane = allSwimlanes.find(s => !s.archived) || allSwimlanes[0]; - updateFields.swimlaneId = defaultSwimlane._id; - } - } else { - // Fall back to first available swimlane - const defaultSwimlane = allSwimlanes.find(s => !s.archived) || allSwimlanes[0]; - updateFields.swimlaneId = defaultSwimlane._id; - } - needsFix = true; - } - - if (needsFix) { - results.itemsFixed++; - - if (process.env.DEBUG === 'true') { - console.log(`Fixed missing IDs for card: ${card.title}`); - } - } - - Cards.update(card._id, { - $set: updateFields - }); - results.cardsRestored++; - - if (process.env.DEBUG === 'true') { - console.log(`Restored card: ${card.title}`); - } - } - - return { - success: true, - changes: [ - `Restored ${results.swimlanesRestored} archived swimlanes`, - `Restored ${results.listsRestored} archived lists`, - `Restored ${results.cardsRestored} archived cards`, - `Fixed ${results.itemsFixed} items with missing IDs` - ], - results - }; - } catch (error) { - console.error('Error executing restoreAllArchived migration:', error); - return { - success: false, - error: error.message - }; - } - } -} - -const restoreAllArchivedMigration = new RestoreAllArchivedMigration(); - -// Register Meteor methods -Meteor.methods({ - 'restoreAllArchived.needsMigration'(boardId) { - check(boardId, String); - - if (!this.userId) { - throw new Meteor.Error('not-authorized', 'You must be logged in'); - } - - return restoreAllArchivedMigration.needsMigration(boardId); - }, - - 'restoreAllArchived.execute'(boardId) { - check(boardId, String); - - if (!this.userId) { - throw new Meteor.Error('not-authorized', 'You must be logged in'); - } - - // Check if user is board admin - const board = ReactiveCache.getBoard(boardId); - if (!board) { - throw new Meteor.Error('board-not-found', 'Board not found'); - } - - const user = ReactiveCache.getUser(this.userId); - if (!user) { - throw new Meteor.Error('user-not-found', 'User not found'); - } - - // Only board admins can run migrations - const isBoardAdmin = board.members && board.members.some( - member => member.userId === this.userId && member.isAdmin - ); - - if (!isBoardAdmin && !user.isAdmin) { - throw new Meteor.Error('not-authorized', 'Only board administrators can run migrations'); - } - - return restoreAllArchivedMigration.executeMigration(boardId); - } -}); - -export default restoreAllArchivedMigration; diff --git a/server/migrations/restoreLostCards.js b/server/migrations/restoreLostCards.js deleted file mode 100644 index 781caa0fb..000000000 --- a/server/migrations/restoreLostCards.js +++ /dev/null @@ -1,259 +0,0 @@ -/** - * Restore Lost Cards Migration - * - * Finds and restores cards and lists that have missing swimlaneId, listId, or are orphaned. - * Creates a "Lost Cards" swimlane and restores visibility of lost items. - * Only processes non-archived items. - */ - -import { Meteor } from 'meteor/meteor'; -import { check } from 'meteor/check'; -import { ReactiveCache } from '/imports/reactiveCache'; -import { TAPi18n } from '/imports/i18n'; -import Boards from '/models/boards'; -import Lists from '/models/lists'; -import Cards from '/models/cards'; -import Swimlanes from '/models/swimlanes'; - -class RestoreLostCardsMigration { - constructor() { - this.name = 'restoreLostCards'; - this.version = 1; - } - - /** - * Check if migration is needed for a board - */ - needsMigration(boardId) { - try { - const cards = ReactiveCache.getCards({ boardId, archived: false }); - const lists = ReactiveCache.getLists({ boardId, archived: false }); - - // Check for cards missing swimlaneId or listId - const lostCards = cards.filter(card => !card.swimlaneId || !card.listId); - if (lostCards.length > 0) { - return true; - } - - // Check for lists missing swimlaneId - const lostLists = lists.filter(list => !list.swimlaneId); - if (lostLists.length > 0) { - return true; - } - - // Check for orphaned cards (cards whose list doesn't exist) - for (const card of cards) { - if (card.listId) { - const listExists = lists.some(list => list._id === card.listId); - if (!listExists) { - return true; - } - } - } - - return false; - } catch (error) { - console.error('Error checking if restoreLostCards migration is needed:', error); - return false; - } - } - - /** - * Execute the migration - */ - async executeMigration(boardId) { - try { - const results = { - lostCardsSwimlaneCreated: false, - cardsRestored: 0, - listsRestored: 0, - errors: [] - }; - - const board = ReactiveCache.getBoard(boardId); - if (!board) { - throw new Error('Board not found'); - } - - // Get all non-archived items - const cards = ReactiveCache.getCards({ boardId, archived: false }); - const lists = ReactiveCache.getLists({ boardId, archived: false }); - const swimlanes = ReactiveCache.getSwimlanes({ boardId, archived: false }); - - // Detect items to restore BEFORE creating anything - const lostLists = lists.filter(list => !list.swimlaneId); - const lostCards = cards.filter(card => !card.swimlaneId || !card.listId); - const orphanedCards = cards.filter(card => card.listId && !lists.some(list => list._id === card.listId)); - - const hasCardsWork = lostCards.length > 0 || orphanedCards.length > 0; - const hasListsWork = lostLists.length > 0; - const hasAnyWork = hasCardsWork || hasListsWork; - - if (!hasAnyWork) { - // Nothing to restore; do not create swimlane or list - return { - success: true, - changes: [ - 'No lost swimlanes, lists, or cards to restore' - ], - results: { - lostCardsSwimlaneCreated: false, - cardsRestored: 0, - listsRestored: 0 - } - }; - } - - // Find or create "Lost Cards" swimlane (only if there is actual work) - let lostCardsSwimlane = swimlanes.find(s => s.title === TAPi18n.__('lost-cards')); - if (!lostCardsSwimlane) { - const swimlaneId = Swimlanes.insert({ - title: TAPi18n.__('lost-cards'), - boardId: boardId, - sort: 999999, // Put at the end - color: 'red', - createdAt: new Date(), - updatedAt: new Date(), - archived: false - }); - lostCardsSwimlane = ReactiveCache.getSwimlane(swimlaneId); - results.lostCardsSwimlaneCreated = true; - if (process.env.DEBUG === 'true') { - console.log(`Created "Lost Cards" swimlane for board ${boardId}`); - } - } - - // Restore lost lists (lists without swimlaneId) - if (hasListsWork) { - for (const list of lostLists) { - Lists.update(list._id, { - $set: { - swimlaneId: lostCardsSwimlane._id, - updatedAt: new Date() - } - }); - results.listsRestored++; - if (process.env.DEBUG === 'true') { - console.log(`Restored lost list: ${list.title}`); - } - } - } - - // Create default list only if we need to move cards - let defaultList = null; - if (hasCardsWork) { - defaultList = lists.find(l => - l.swimlaneId === lostCardsSwimlane._id && - l.title === TAPi18n.__('lost-cards-list') - ); - if (!defaultList) { - const listId = Lists.insert({ - title: TAPi18n.__('lost-cards-list'), - boardId: boardId, - swimlaneId: lostCardsSwimlane._id, - sort: 0, - createdAt: new Date(), - updatedAt: new Date(), - archived: false - }); - defaultList = ReactiveCache.getList(listId); - if (process.env.DEBUG === 'true') { - console.log(`Created default list in Lost Cards swimlane`); - } - } - } - - // Restore cards missing swimlaneId or listId - if (hasCardsWork) { - for (const card of lostCards) { - const updateFields = { updatedAt: new Date() }; - if (!card.swimlaneId) updateFields.swimlaneId = lostCardsSwimlane._id; - if (!card.listId) updateFields.listId = defaultList._id; - Cards.update(card._id, { $set: updateFields }); - results.cardsRestored++; - if (process.env.DEBUG === 'true') { - console.log(`Restored lost card: ${card.title}`); - } - } - - // Restore orphaned cards (cards whose list doesn't exist) - for (const card of orphanedCards) { - Cards.update(card._id, { - $set: { - listId: defaultList._id, - swimlaneId: lostCardsSwimlane._id, - updatedAt: new Date() - } - }); - results.cardsRestored++; - if (process.env.DEBUG === 'true') { - console.log(`Restored orphaned card: ${card.title}`); - } - } - } - - return { - success: true, - changes: [ - results.lostCardsSwimlaneCreated ? 'Created "Lost Cards" swimlane' : 'Using existing "Lost Cards" swimlane', - `Restored ${results.listsRestored} lost lists`, - `Restored ${results.cardsRestored} lost cards` - ], - results - }; - } catch (error) { - console.error('Error executing restoreLostCards migration:', error); - return { - success: false, - error: error.message - }; - } - } -} - -const restoreLostCardsMigration = new RestoreLostCardsMigration(); - -// Register Meteor methods -Meteor.methods({ - 'restoreLostCards.needsMigration'(boardId) { - check(boardId, String); - - if (!this.userId) { - throw new Meteor.Error('not-authorized', 'You must be logged in'); - } - - return restoreLostCardsMigration.needsMigration(boardId); - }, - - 'restoreLostCards.execute'(boardId) { - check(boardId, String); - - if (!this.userId) { - throw new Meteor.Error('not-authorized', 'You must be logged in'); - } - - // Check if user is board admin - const board = ReactiveCache.getBoard(boardId); - if (!board) { - throw new Meteor.Error('board-not-found', 'Board not found'); - } - - const user = ReactiveCache.getUser(this.userId); - if (!user) { - throw new Meteor.Error('user-not-found', 'User not found'); - } - - // Only board admins can run migrations - const isBoardAdmin = board.members && board.members.some( - member => member.userId === this.userId && member.isAdmin - ); - - if (!isBoardAdmin && !user.isAdmin) { - throw new Meteor.Error('not-authorized', 'Only board administrators can run migrations'); - } - - return restoreLostCardsMigration.executeMigration(boardId); - } -}); - -export default restoreLostCardsMigration; diff --git a/server/publications/attachments.js b/server/publications/attachments.js index d618012f8..ae421b8c8 100644 --- a/server/publications/attachments.js +++ b/server/publications/attachments.js @@ -2,35 +2,8 @@ import Attachments from '/models/attachments'; import { ObjectID } from 'bson'; Meteor.publish('attachmentsList', function(limit) { - const userId = this.userId; - - // Get boards the user has access to - const userBoards = ReactiveCache.getBoards({ - $or: [ - { permission: 'public' }, - { members: { $elemMatch: { userId, isActive: true } } } - ] - }).map(board => board._id); - - if (userBoards.length === 0) { - // User has no access to any boards, return empty cursor - return this.ready(); - } - - // Get cards from those boards - const userCards = ReactiveCache.getCards({ - boardId: { $in: userBoards }, - archived: false - }).map(card => card._id); - - if (userCards.length === 0) { - // No cards found, return empty cursor - return this.ready(); - } - - // Only return attachments for cards the user has access to const ret = ReactiveCache.getAttachments( - { 'meta.cardId': { $in: userCards } }, + {}, { fields: { _id: 1, diff --git a/server/publications/boards.js b/server/publications/boards.js index bac769f16..dee05959f 100644 --- a/server/publications/boards.js +++ b/server/publications/boards.js @@ -67,27 +67,6 @@ Meteor.publishRelations('boards', function() { true, ) ); - - // Publish list order changes immediately - // Include swimlaneId and modifiedAt for proper sync - this.cursor( - ReactiveCache.getLists( - { boardId, archived: false }, - { fields: - { - _id: 1, - title: 1, - boardId: 1, - swimlaneId: 1, - archived: 1, - sort: 1, - modifiedAt: 1, - _updatedAt: 1, // Hidden field to trigger updates - } - }, - true, - ) - ); this.cursor( ReactiveCache.getCards( { boardId, archived: false }, diff --git a/server/publications/cards.js b/server/publications/cards.js index b0b0cb8c8..f3619e489 100644 --- a/server/publications/cards.js +++ b/server/publications/cards.js @@ -136,29 +136,10 @@ Meteor.publish('dueCards', function(allUsers = false) { // Get user's board memberships for efficient filtering const userBoards = ReactiveCache.getBoards({ - $or: [ - { permission: 'public' }, - { members: { $elemMatch: { userId, isActive: true } } } - ] + members: userId }).map(board => board._id); - if (process.env.DEBUG === 'true') { - console.log('dueCards userBoards:', userBoards); - console.log('dueCards userBoards count:', userBoards.length); - - // Also check if there are any cards with due dates in the system at all - const allCardsWithDueDates = Cards.find({ - type: 'cardType-card', - archived: false, - dueAt: { $exists: true, $nin: [null, ''] } - }).count(); - console.log('dueCards: total cards with due dates in system:', allCardsWithDueDates); - } - if (userBoards.length === 0) { - if (process.env.DEBUG === 'true') { - console.log('dueCards: No boards found for user, returning ready'); - } return this.ready(); } @@ -201,23 +182,7 @@ Meteor.publish('dueCards', function(allUsers = false) { console.log('dueCards options:', JSON.stringify(options, null, 2)); } - const result = Cards.find(selector, options); - - if (process.env.DEBUG === 'true') { - const count = result.count(); - console.log('dueCards publication: returning', count, 'cards'); - if (count > 0) { - const sampleCards = result.fetch().slice(0, 3); - console.log('dueCards publication: sample cards:', sampleCards.map(c => ({ - id: c._id, - title: c.title, - dueAt: c.dueAt, - boardId: c.boardId - }))); - } - } - - return result; + return Cards.find(selector, options); }); Meteor.publish('globalSearch', function(sessionId, params, text) { diff --git a/server/publications/userGreyIcons.js b/server/publications/userGreyIcons.js deleted file mode 100644 index c4d7e359b..000000000 --- a/server/publications/userGreyIcons.js +++ /dev/null @@ -1,7 +0,0 @@ -// Publish only the current logged-in user's GreyIcons profile flag -import { Meteor } from 'meteor/meteor'; - -Meteor.publish('userGreyIcons', function publishUserGreyIcons() { - if (!this.userId) return this.ready(); - return Meteor.users.find({ _id: this.userId }, { fields: { 'profile.GreyIcons': 1 } }); -}); diff --git a/server/routes/attachmentApi.js b/server/routes/attachmentApi.js index ae10ca64b..51f18082c 100644 --- a/server/routes/attachmentApi.js +++ b/server/routes/attachmentApi.js @@ -1,5 +1,4 @@ import { Meteor } from 'meteor/meteor'; -import { Accounts } from 'meteor/accounts-base'; import { WebApp } from 'meteor/webapp'; import { ReactiveCache } from '/imports/reactiveCache'; import { Attachments, fileStoreStrategyFactory } from '/models/attachments'; @@ -12,24 +11,20 @@ import { ObjectID } from 'bson'; // Attachment API HTTP routes if (Meteor.isServer) { - // Helper function to authenticate API requests using X-User-Id and X-Auth-Token + // Helper function to authenticate API requests function authenticateApiRequest(req) { - const userId = req.headers['x-user-id']; - const authToken = req.headers['x-auth-token']; - - if (!userId || !authToken) { - throw new Meteor.Error('unauthorized', 'Missing X-User-Id or X-Auth-Token headers'); + const authHeader = req.headers.authorization; + if (!authHeader || !authHeader.startsWith('Bearer ')) { + throw new Meteor.Error('unauthorized', 'Missing or invalid authorization header'); } - // Hash the token and validate against stored login tokens - const hashedToken = Accounts._hashLoginToken(authToken); - const user = Meteor.users.findOne({ - _id: userId, - 'services.resume.loginTokens.hashedToken': hashedToken, - }); - - if (!user) { - throw new Meteor.Error('unauthorized', 'Invalid credentials'); + const token = authHeader.substring(7); + // Here you would validate the token and get the user ID + // For now, we'll use a simple approach - in production, you'd want proper JWT validation + const userId = token; // This should be replaced with proper token validation + + if (!userId) { + throw new Meteor.Error('unauthorized', 'Invalid token'); } return userId; @@ -52,33 +47,15 @@ if (Meteor.isServer) { return next(); } - // Set timeout to prevent hanging connections - const timeout = setTimeout(() => { - if (!res.headersSent) { - sendErrorResponse(res, 408, 'Request timeout'); - } - }, 30000); // 30 second timeout - try { const userId = authenticateApiRequest(req); let body = ''; - let bodyComplete = false; - req.on('data', chunk => { body += chunk.toString(); - // Prevent excessive payload - if (body.length > 50 * 1024 * 1024) { // 50MB limit - req.connection.destroy(); - clearTimeout(timeout); - } }); req.on('end', () => { - if (bodyComplete) return; // Already processed - bodyComplete = true; - clearTimeout(timeout); - try { const data = JSON.parse(body); const { boardId, swimlaneId, listId, cardId, fileData, fileName, fileType, storageBackend } = data; @@ -99,20 +76,6 @@ if (Meteor.isServer) { return sendErrorResponse(res, 404, 'Board not found'); } - // Verify that the card belongs to the specified board - if (card.boardId !== boardId) { - return sendErrorResponse(res, 400, 'Card does not belong to the specified board'); - } - - // Verify that the swimlaneId and listId match the card's actual swimlane and list - if (card.swimlaneId !== swimlaneId) { - return sendErrorResponse(res, 400, 'Swimlane ID does not match the card\'s swimlane'); - } - - if (card.listId !== listId) { - return sendErrorResponse(res, 400, 'List ID does not match the card\'s list'); - } - // Check permissions if (!board.isBoardMember(userId)) { return sendErrorResponse(res, 403, 'You do not have permission to modify this card'); @@ -191,16 +154,7 @@ if (Meteor.isServer) { sendErrorResponse(res, 500, error.message); } }); - - req.on('error', (error) => { - clearTimeout(timeout); - if (!res.headersSent) { - console.error('Request error:', error); - sendErrorResponse(res, 400, 'Request error'); - } - }); } catch (error) { - clearTimeout(timeout); sendErrorResponse(res, 401, error.message); } }); @@ -284,14 +238,6 @@ if (Meteor.isServer) { return sendErrorResponse(res, 403, 'You do not have permission to access this board'); } - // If cardId is provided, verify it belongs to the board - if (cardId && cardId !== 'null') { - const card = ReactiveCache.getCard(cardId); - if (!card || card.boardId !== boardId) { - return sendErrorResponse(res, 404, 'Card not found or does not belong to the specified board'); - } - } - let query = { 'meta.boardId': boardId }; if (swimlaneId && swimlaneId !== 'null') { @@ -341,31 +287,15 @@ if (Meteor.isServer) { return next(); } - const timeout = setTimeout(() => { - if (!res.headersSent) { - sendErrorResponse(res, 408, 'Request timeout'); - } - }, 30000); - try { const userId = authenticateApiRequest(req); let body = ''; - let bodyComplete = false; - req.on('data', chunk => { body += chunk.toString(); - if (body.length > 10 * 1024 * 1024) { // 10MB limit for metadata - req.connection.destroy(); - clearTimeout(timeout); - } }); req.on('end', () => { - if (bodyComplete) return; - bodyComplete = true; - clearTimeout(timeout); - try { const data = JSON.parse(body); const { attachmentId, targetBoardId, targetSwimlaneId, targetListId, targetCardId } = data; @@ -388,25 +318,6 @@ if (Meteor.isServer) { return sendErrorResponse(res, 403, 'You do not have permission to modify the target card'); } - // Verify that the target card belongs to the target board - const targetCard = ReactiveCache.getCard(targetCardId); - if (!targetCard) { - return sendErrorResponse(res, 404, 'Target card not found'); - } - - if (targetCard.boardId !== targetBoardId) { - return sendErrorResponse(res, 400, 'Target card does not belong to the specified board'); - } - - // Verify that the target swimlaneId and listId match the card's actual swimlane and list - if (targetCard.swimlaneId !== targetSwimlaneId) { - return sendErrorResponse(res, 400, 'Target swimlane ID does not match the card\'s swimlane'); - } - - if (targetCard.listId !== targetListId) { - return sendErrorResponse(res, 400, 'Target list ID does not match the card\'s list'); - } - // Check if target board allows attachments if (!targetBoard.allowsAttachments) { return sendErrorResponse(res, 403, 'Attachments are not allowed on the target board'); @@ -477,16 +388,7 @@ if (Meteor.isServer) { sendErrorResponse(res, 500, error.message); } }); - - req.on('error', (error) => { - clearTimeout(timeout); - if (!res.headersSent) { - console.error('Request error:', error); - sendErrorResponse(res, 400, 'Request error'); - } - }); } catch (error) { - clearTimeout(timeout); sendErrorResponse(res, 401, error.message); } }); @@ -497,31 +399,15 @@ if (Meteor.isServer) { return next(); } - const timeout = setTimeout(() => { - if (!res.headersSent) { - sendErrorResponse(res, 408, 'Request timeout'); - } - }, 30000); - try { const userId = authenticateApiRequest(req); let body = ''; - let bodyComplete = false; - req.on('data', chunk => { body += chunk.toString(); - if (body.length > 10 * 1024 * 1024) { - req.connection.destroy(); - clearTimeout(timeout); - } }); req.on('end', () => { - if (bodyComplete) return; - bodyComplete = true; - clearTimeout(timeout); - try { const data = JSON.parse(body); const { attachmentId, targetBoardId, targetSwimlaneId, targetListId, targetCardId } = data; @@ -544,25 +430,6 @@ if (Meteor.isServer) { return sendErrorResponse(res, 403, 'You do not have permission to modify the target card'); } - // Verify that the target card belongs to the target board - const targetCard = ReactiveCache.getCard(targetCardId); - if (!targetCard) { - return sendErrorResponse(res, 404, 'Target card not found'); - } - - if (targetCard.boardId !== targetBoardId) { - return sendErrorResponse(res, 400, 'Target card does not belong to the specified board'); - } - - // Verify that the target swimlaneId and listId match the card's actual swimlane and list - if (targetCard.swimlaneId !== targetSwimlaneId) { - return sendErrorResponse(res, 400, 'Target swimlane ID does not match the card\'s swimlane'); - } - - if (targetCard.listId !== targetListId) { - return sendErrorResponse(res, 400, 'Target list ID does not match the card\'s list'); - } - // Check if target board allows attachments if (!targetBoard.allowsAttachments) { return sendErrorResponse(res, 403, 'Attachments are not allowed on the target board'); @@ -594,16 +461,7 @@ if (Meteor.isServer) { sendErrorResponse(res, 500, error.message); } }); - - req.on('error', (error) => { - clearTimeout(timeout); - if (!res.headersSent) { - console.error('Request error:', error); - sendErrorResponse(res, 400, 'Request error'); - } - }); } catch (error) { - clearTimeout(timeout); sendErrorResponse(res, 401, error.message); } }); diff --git a/server/routes/avatarServer.js b/server/routes/avatarServer.js deleted file mode 100644 index 008ea573a..000000000 --- a/server/routes/avatarServer.js +++ /dev/null @@ -1,123 +0,0 @@ -/** - * Avatar File Server - * Handles serving avatar files from the /cdn/storage/avatars/ path - */ - -import { Meteor } from 'meteor/meteor'; -import { WebApp } from 'meteor/webapp'; -import { ReactiveCache } from '/imports/reactiveCache'; -import Avatars from '/models/avatars'; -import { fileStoreStrategyFactory } from '/models/lib/fileStoreStrategy'; -import fs from 'fs'; -import path from 'path'; - -if (Meteor.isServer) { - // Handle avatar file downloads - WebApp.connectHandlers.use('/cdn/storage/avatars/([^/]+)', (req, res, next) => { - if (req.method !== 'GET') { - return next(); - } - - try { - const fileName = req.params[0]; - - if (!fileName) { - res.writeHead(400); - res.end('Invalid avatar file name'); - return; - } - - // Extract file ID from filename (format: fileId-original-filename) - const fileId = fileName.split('-original-')[0]; - - if (!fileId) { - res.writeHead(400); - res.end('Invalid avatar file format'); - return; - } - - // Get avatar file from database - const avatar = ReactiveCache.getAvatar(fileId); - if (!avatar) { - res.writeHead(404); - res.end('Avatar not found'); - return; - } - - // Check if user has permission to view this avatar - // For avatars, we allow viewing by any logged-in user - const userId = Meteor.userId(); - if (!userId) { - res.writeHead(401); - res.end('Authentication required'); - return; - } - - // Get file strategy - const strategy = fileStoreStrategyFactory.getFileStrategy(avatar, 'original'); - const readStream = strategy.getReadStream(); - - if (!readStream) { - res.writeHead(404); - res.end('Avatar file not found in storage'); - return; - } - - // Set appropriate headers - res.setHeader('Content-Type', avatar.type || 'image/jpeg'); - res.setHeader('Content-Length', avatar.size || 0); - res.setHeader('Cache-Control', 'public, max-age=31536000'); // Cache for 1 year - res.setHeader('ETag', `"${avatar._id}"`); - - // Handle conditional requests - const ifNoneMatch = req.headers['if-none-match']; - if (ifNoneMatch && ifNoneMatch === `"${avatar._id}"`) { - res.writeHead(304); - res.end(); - return; - } - - // Stream the file - res.writeHead(200); - readStream.pipe(res); - - readStream.on('error', (error) => { - console.error('Avatar stream error:', error); - if (!res.headersSent) { - res.writeHead(500); - res.end('Error reading avatar file'); - } - }); - - } catch (error) { - console.error('Avatar server error:', error); - if (!res.headersSent) { - res.writeHead(500); - res.end('Internal server error'); - } - } - }); - - // Handle legacy avatar URLs (from CollectionFS) - WebApp.connectHandlers.use('/cfs/files/avatars/([^/]+)', (req, res, next) => { - if (req.method !== 'GET') { - return next(); - } - - try { - const fileName = req.params[0]; - - // Redirect to new avatar URL format - const newUrl = `/cdn/storage/avatars/${fileName}`; - res.writeHead(301, { 'Location': newUrl }); - res.end(); - - } catch (error) { - console.error('Legacy avatar redirect error:', error); - res.writeHead(500); - res.end('Internal server error'); - } - }); - - console.log('Avatar server routes initialized'); -} diff --git a/server/routes/legacyAttachments.js b/server/routes/legacyAttachments.js index e36986a7a..a9660efc6 100644 --- a/server/routes/legacyAttachments.js +++ b/server/routes/legacyAttachments.js @@ -8,49 +8,6 @@ if (process.env.DEBUG === 'true') { console.log('Legacy attachments route loaded'); } -/** - * Helper function to properly encode a filename for the Content-Disposition header - * Removes invalid characters (control chars, newlines, etc.) that would break HTTP headers. - * For non-ASCII filenames, uses RFC 5987 encoding to preserve the original filename. - * This prevents ERR_INVALID_CHAR errors when filenames contain control characters. - */ -function sanitizeFilenameForHeader(filename) { - if (!filename || typeof filename !== 'string') { - return 'download'; - } - - // First, remove any control characters (0x00-0x1F, 0x7F) that would break HTTP headers - // This includes newlines, carriage returns, tabs, and other control chars - let sanitized = filename.replace(/[\x00-\x1F\x7F]/g, ''); - - // If the filename is all ASCII printable characters (0x20-0x7E), use it directly - if (/^[\x20-\x7E]*$/.test(sanitized)) { - // Escape any quotes and backslashes in the filename - sanitized = sanitized.replace(/\\/g, '\\\\').replace(/"/g, '\\"'); - return sanitized; - } - - // For non-ASCII filenames, provide a fallback and RFC 5987 encoded version - const fallback = sanitized.replace(/[^\x20-\x7E]/g, '_').slice(0, 100) || 'download'; - const encoded = encodeURIComponent(sanitized); - - // Return special marker format that will be handled by buildContentDispositionHeader - // Format: "fallback|RFC5987:encoded" - return `${fallback}|RFC5987:${encoded}`; -} - -/** - * Helper function to build a complete Content-Disposition header value with RFC 5987 support - * Handles the special format returned by sanitizeFilenameForHeader for non-ASCII filenames - */ -function buildContentDispositionHeader(disposition, sanitizedFilename) { - if (sanitizedFilename.includes('|RFC5987:')) { - const [fallback, encoded] = sanitizedFilename.split('|RFC5987:'); - return `${disposition}; filename="${fallback}"; filename*=UTF-8''${encoded}`; - } - return `${disposition}; filename="${sanitizedFilename}"`; -} - /** * Legacy attachment download route for CollectionFS compatibility * Handles downloads from old CollectionFS structure @@ -100,7 +57,7 @@ if (Meteor.isServer) { // Force attachment disposition for SVG files to prevent XSS attacks const isSvgFile = attachment.name && attachment.name.toLowerCase().endsWith('.svg'); const disposition = isSvgFile ? 'attachment' : 'attachment'; // Always use attachment for legacy files - res.setHeader('Content-Disposition', buildContentDispositionHeader(disposition, sanitizeFilenameForHeader(attachment.name))); + res.setHeader('Content-Disposition', `${disposition}; filename="${attachment.name}"`); // Add security headers for SVG files if (isSvgFile) { diff --git a/server/routes/universalFileServer.js b/server/routes/universalFileServer.js deleted file mode 100644 index 5d4f05051..000000000 --- a/server/routes/universalFileServer.js +++ /dev/null @@ -1,718 +0,0 @@ -/** - * Universal File Server - * Ensures all attachments and avatars are always visible regardless of ROOT_URL and PORT settings - * Handles both new Meteor-Files and legacy CollectionFS file serving - */ - -import { Meteor } from 'meteor/meteor'; -import { WebApp } from 'meteor/webapp'; -import { ReactiveCache } from '/imports/reactiveCache'; -import { Accounts } from 'meteor/accounts-base'; -import Attachments, { fileStoreStrategyFactory as attachmentStoreFactory } from '/models/attachments'; -import Avatars, { fileStoreStrategyFactory as avatarStoreFactory } from '/models/avatars'; -import '/models/boards'; -import { getAttachmentWithBackwardCompatibility, getOldAttachmentStream } from '/models/lib/attachmentBackwardCompatibility'; -import fs from 'fs'; -import path from 'path'; - -if (Meteor.isServer) { - console.log('Universal file server initializing...'); - - /** - * Helper function to set appropriate headers for file serving - */ - function setFileHeaders(res, fileObj, isAttachment = false) { - // Decide safe serving strategy - const nameLower = (fileObj.name || '').toLowerCase(); - const typeLower = (fileObj.type || '').toLowerCase(); - const isPdfByExt = nameLower.endsWith('.pdf'); - - // Define dangerous types that must never be served inline - const dangerousTypes = new Set([ - 'text/html', - 'application/xhtml+xml', - 'image/svg+xml', - 'text/xml', - 'application/xml', - 'application/javascript', - 'text/javascript' - ]); - - // Define safe types that can be served inline for viewing - const safeInlineTypes = new Set([ - 'application/pdf', - 'image/jpeg', - 'image/jpg', - 'image/png', - 'image/gif', - 'image/webp', - 'image/avif', - 'image/bmp', - 'video/mp4', - 'video/webm', - 'video/ogg', - 'audio/mpeg', - 'audio/mp3', - 'audio/ogg', - 'audio/wav', - 'audio/webm', - 'text/plain', - 'application/json' - ]); - - const isSvg = nameLower.endsWith('.svg') || typeLower === 'image/svg+xml'; - const isDangerous = dangerousTypes.has(typeLower) || isSvg; - // Consider PDF safe inline by extension if type is missing/mis-set - const isSafeInline = safeInlineTypes.has(typeLower) || (isAttachment && isPdfByExt); - - // Always send strong caching and integrity headers - res.setHeader('Cache-Control', 'public, max-age=31536000'); // Cache for 1 year - res.setHeader('ETag', `"${fileObj._id}"`); - res.setHeader('X-Content-Type-Options', 'nosniff'); - - // Set content length when available - if (fileObj.size) { - res.setHeader('Content-Length', fileObj.size); - } - - if (isAttachment) { - // Attachments: dangerous types forced to download, safe types can be inline - if (isDangerous) { - // SECURITY: Force download for dangerous types to prevent XSS - res.setHeader('Content-Type', 'application/octet-stream'); - res.setHeader('Content-Disposition', buildContentDispositionHeader('attachment', sanitizeFilenameForHeader(fileObj.name))); - res.setHeader('Content-Security-Policy', "default-src 'none'; sandbox;"); - res.setHeader('X-Frame-Options', 'DENY'); - } else if (isSafeInline) { - // Safe types: serve inline with proper type and restrictive CSP - // If the file is a PDF by extension but type is wrong/missing, correct it - const finalType = (isPdfByExt && typeLower !== 'application/pdf') ? 'application/pdf' : (typeLower || 'application/octet-stream'); - res.setHeader('Content-Type', finalType); - res.setHeader('Content-Disposition', buildContentDispositionHeader('inline', sanitizeFilenameForHeader(fileObj.name))); - // Restrictive CSP for safe types - allow media/img/object for viewer embeds, no scripts - res.setHeader('Content-Security-Policy', "default-src 'none'; object-src 'self'; media-src 'self'; img-src 'self'; style-src 'unsafe-inline';"); - } else { - // Unknown types: force download as fallback - res.setHeader('Content-Type', 'application/octet-stream'); - res.setHeader('Content-Disposition', buildContentDispositionHeader('attachment', sanitizeFilenameForHeader(fileObj.name))); - res.setHeader('Content-Security-Policy', "default-src 'none'; sandbox;"); - } - } else { - // Avatars: allow inline images, but never serve SVG inline - if (isSvg || isDangerous) { - // Serve potentially dangerous avatar types as downloads instead - res.setHeader('Content-Type', 'application/octet-stream'); - res.setHeader('Content-Disposition', buildContentDispositionHeader('attachment', sanitizeFilenameForHeader(fileObj.name))); - res.setHeader('Content-Security-Policy', "default-src 'none'; sandbox;"); - res.setHeader('X-Frame-Options', 'DENY'); - } else { - // For typical image avatars, use provided type if present, otherwise fall back to a safe generic image type - res.setHeader('Content-Type', typeLower || 'image/jpeg'); - res.setHeader('Content-Disposition', buildContentDispositionHeader('inline', sanitizeFilenameForHeader(fileObj.name))); - } - } - } - - /** - * Helper function to handle conditional requests - */ - function handleConditionalRequest(req, res, fileObj) { - const ifNoneMatch = req.headers['if-none-match']; - if (ifNoneMatch && ifNoneMatch === `"${fileObj._id}"`) { - res.writeHead(304); - res.end(); - return true; - } - return false; - } - - /** - * Extract first path segment (file id) from request URL. - * Works whether req.url is the full path or already trimmed by the mount path. - */ - function extractFirstIdFromUrl(req, mountPrefix) { - // Strip query string - let urlPath = (req.url || '').split('?')[0]; - // If url still contains the mount prefix, remove it - if (mountPrefix && urlPath.startsWith(mountPrefix)) { - urlPath = urlPath.slice(mountPrefix.length); - } - // Ensure leading slash removed for splitting - if (urlPath.startsWith('/')) { - urlPath = urlPath.slice(1); - } - const parts = urlPath.split('/').filter(Boolean); - return parts[0] || null; - } - - /** - * Check if the request explicitly asks to download the file - * Recognizes ?download=true or ?download=1 (case-insensitive for key) - */ - function isDownloadRequested(req) { - const q = (req.url || '').split('?')[1] || ''; - if (!q) return false; - const pairs = q.split('&'); - for (const p of pairs) { - const [rawK, rawV] = p.split('='); - const k = decodeURIComponent((rawK || '').trim()).toLowerCase(); - const v = decodeURIComponent((rawV || '').trim()); - if (k === 'download' && (v === '' || v === 'true' || v === '1')) { - return true; - } - } - return false; - } - - /** - * Determine if an avatar request is authorized - * Rules: - * - If a boardId query is provided and that board is public -> allow - * - Else if requester is authenticated (valid token) -> allow - * - Else if avatar's owner belongs to at least one public board -> allow - * - Otherwise -> deny - */ - function isAuthorizedForAvatar(req, avatar) { - try { - if (!avatar) return false; - - // 1) Check explicit board context via query - const q = parseQuery(req); - const boardId = q.boardId || q.board || q.b; - if (boardId) { - const board = ReactiveCache.getBoard(boardId); - if (board && board.isPublic && board.isPublic()) return true; - - // If private board is specified, require membership of requester - const token = extractLoginToken(req); - const user = token ? getUserFromToken(token) : null; - if (user && board && board.hasMember && board.hasMember(user._id)) return true; - return false; - } - - // 2) Authenticated request without explicit board context - const token = extractLoginToken(req); - const user = token ? getUserFromToken(token) : null; - if (user) return true; - - // 3) Allow if avatar owner is on any public board (so avatars are public only when on public boards) - // Use a lightweight query against Boards - const found = Boards && Boards.findOne({ permission: 'public', 'members.userId': avatar.userId }, { fields: { _id: 1 } }); - return !!found; - } catch (e) { - if (process.env.DEBUG === 'true') { - console.warn('Avatar authorization check failed:', e); - } - return false; - } - } - - /** - * Parse cookies from request headers into an object map - */ - function parseCookies(req) { - const header = req.headers && req.headers.cookie; - const out = {}; - if (!header) return out; - const parts = header.split(';'); - for (const part of parts) { - const idx = part.indexOf('='); - if (idx === -1) continue; - const k = decodeURIComponent(part.slice(0, idx).trim()); - const v = decodeURIComponent(part.slice(idx + 1).trim()); - out[k] = v; - } - return out; - } - - /** - * Get query parameters as a simple object - */ - function parseQuery(req) { - const out = {}; - const q = (req.url || '').split('?')[1] || ''; - if (!q) return out; - const pairs = q.split('&'); - for (const p of pairs) { - if (!p) continue; - const [rawK, rawV] = p.split('='); - const k = decodeURIComponent((rawK || '').trim()); - const v = decodeURIComponent((rawV || '').trim()); - if (k) out[k] = v; - } - return out; - } - - /** - * Extract a login token from Authorization header, query param, or cookie - * Supported sources (priority order): - * - Authorization: Bearer <token> - * - X-Auth-Token header - * - authToken query parameter - * - meteor_login_token or wekan_login_token cookie - */ - function extractLoginToken(req) { - // Authorization: Bearer <token> - const authz = req.headers && (req.headers.authorization || req.headers.Authorization); - if (authz && typeof authz === 'string') { - const m = authz.match(/^Bearer\s+(.+)$/i); - if (m && m[1]) return m[1].trim(); - } - - // X-Auth-Token - const xAuth = req.headers && (req.headers['x-auth-token'] || req.headers['X-Auth-Token']); - if (xAuth && typeof xAuth === 'string') return xAuth.trim(); - - // Query parameter - const q = parseQuery(req); - if (q.authToken && typeof q.authToken === 'string') return q.authToken.trim(); - - // Cookies - const cookies = parseCookies(req); - if (cookies.meteor_login_token) return cookies.meteor_login_token.trim(); - if (cookies.wekan_login_token) return cookies.wekan_login_token.trim(); - - return null; - } - - /** - * Resolve a user from a raw login token string - */ - function getUserFromToken(rawToken) { - try { - if (!rawToken || typeof rawToken !== 'string' || rawToken.length < 10) return null; - const hashed = Accounts._hashLoginToken(rawToken); - return Meteor.users.findOne({ 'services.resume.loginTokens.hashedToken': hashed }, { fields: { _id: 1 } }); - } catch (e) { - // In case accounts-base is not available or any error occurs - if (process.env.DEBUG === 'true') { - console.warn('Token resolution error:', e); - } - return null; - } - } - - /** - * Authorization helper for board-bound files - * - Public boards: allow - * - Private boards: require valid user who is a member - */ - function isAuthorizedForBoard(req, board) { - try { - if (!board) return false; - if (board.isPublic && board.isPublic()) return true; - const token = extractLoginToken(req); - const user = token ? getUserFromToken(token) : null; - return !!(user && board.hasMember && board.hasMember(user._id)); - } catch (e) { - if (process.env.DEBUG === 'true') { - console.warn('Authorization check failed:', e); - } - return false; - } - } - - /** - * Helper function to properly encode a filename for the Content-Disposition header. - * Removes invalid characters (control chars, newlines, etc.) that would break HTTP headers. - * For non-ASCII filenames, uses RFC 5987 encoding to preserve the original filename. - * This prevents ERR_INVALID_CHAR errors when filenames contain control characters. - * - * Example: - * - ASCII filename: sanitizeFilenameForHeader('test.txt') => 'test.txt' - * - Non-ASCII: sanitizeFilenameForHeader('現有檔案.odt') => 'file.odt'; filename*=UTF-8''%E7%8F%BE%E6%9C%89%E6%AA%94%E6%A1%88.odt - * - Control chars: sanitizeFilenameForHeader('test\nfile.txt') => 'testfile.txt' - */ - function sanitizeFilenameForHeader(filename) { - if (!filename || typeof filename !== 'string') { - return 'download'; - } - - // First, remove any control characters (0x00-0x1F, 0x7F) that would break HTTP headers - // This includes newlines, carriage returns, tabs, and other control chars - let sanitized = filename.replace(/[\x00-\x1F\x7F]/g, ''); - - // If the filename is all ASCII printable characters (0x20-0x7E), use it directly - if (/^[\x20-\x7E]*$/.test(sanitized)) { - // Escape any quotes and backslashes in the filename - sanitized = sanitized.replace(/\\/g, '\\\\').replace(/"/g, '\\"'); - return sanitized; - } - - // For non-ASCII filenames, provide a fallback and RFC 5987 encoded version - const fallback = sanitized.replace(/[^\x20-\x7E]/g, '_').slice(0, 100) || 'download'; - const encoded = encodeURIComponent(sanitized); - - // Return special marker format that will be handled by buildContentDispositionHeader - // Format: "fallback|RFC5987:encoded" - return `${fallback}|RFC5987:${encoded}`; - } - - /** - * Helper function to build a complete Content-Disposition header value with RFC 5987 support - * Handles the special format returned by sanitizeFilenameForHeader for non-ASCII filenames - */ - function buildContentDispositionHeader(disposition, sanitizedFilename) { - if (sanitizedFilename.includes('|RFC5987:')) { - const [fallback, encoded] = sanitizedFilename.split('|RFC5987:'); - return `${disposition}; filename="${fallback}"; filename*=UTF-8''${encoded}`; - } - return `${disposition}; filename="${sanitizedFilename}"`; - } - - /** - * Helper function to stream file with error handling - */ - function streamFile(res, readStream, fileObj) { - readStream.on('error', (error) => { - console.error('File stream error:', error); - if (!res.headersSent) { - res.writeHead(500); - res.end('Error reading file'); - } - }); - - readStream.on('end', () => { - if (!res.headersSent) { - res.writeHead(200); - } - }); - - readStream.pipe(res); - } - - // ============================================================================ - // NEW METEOR-FILES ROUTES (URL-agnostic) - // ============================================================================ - - /** - * Serve attachments from new Meteor-Files structure - * Route: /cdn/storage/attachments/{fileId} or /cdn/storage/attachments/{fileId}/original/{filename} - */ - WebApp.connectHandlers.use('/cdn/storage/attachments', (req, res, next) => { - if (req.method !== 'GET') { - return next(); - } - - try { - const fileId = extractFirstIdFromUrl(req, '/cdn/storage/attachments'); - - if (!fileId) { - res.writeHead(400); - res.end('Invalid attachment file ID'); - return; - } - - // Get attachment from database with backward compatibility - const attachment = getAttachmentWithBackwardCompatibility(fileId); - if (!attachment) { - res.writeHead(404); - res.end('Attachment not found'); - return; - } - - // Check permissions - const board = ReactiveCache.getBoard(attachment.meta.boardId); - if (!board) { - res.writeHead(404); - res.end('Board not found'); - return; - } - - // Enforce cookie/header/query-based auth for private boards - if (!isAuthorizedForBoard(req, board)) { - res.writeHead(403); - res.end('Access denied'); - return; - } - - // Handle conditional requests - if (handleConditionalRequest(req, res, attachment)) { - return; - } - - // Choose proper streaming based on source - let readStream; - if (attachment?.meta?.source === 'legacy') { - // Legacy CollectionFS GridFS stream - readStream = getOldAttachmentStream(fileId); - } else { - // New Meteor-Files storage - const strategy = attachmentStoreFactory.getFileStrategy(attachment, 'original'); - readStream = strategy.getReadStream(); - } - - if (!readStream) { - res.writeHead(404); - res.end('Attachment file not found in storage'); - return; - } - - // Set headers and stream file - if (isDownloadRequested(req)) { - // Force download if requested via query param - res.setHeader('Cache-Control', 'public, max-age=31536000'); - res.setHeader('ETag', `"${attachment._id}"`); - if (attachment.size) res.setHeader('Content-Length', attachment.size); - res.setHeader('X-Content-Type-Options', 'nosniff'); - res.setHeader('Content-Type', 'application/octet-stream'); - res.setHeader('Content-Disposition', buildContentDispositionHeader('attachment', sanitizeFilenameForHeader(attachment.name))); - res.setHeader('Content-Security-Policy', "default-src 'none'; sandbox;"); - } else { - setFileHeaders(res, attachment, true); - } - streamFile(res, readStream, attachment); - - } catch (error) { - console.error('Attachment server error:', error); - if (!res.headersSent) { - res.writeHead(500); - res.end('Internal server error'); - } - } - }); - - /** - * Serve avatars from new Meteor-Files structure - * Route: /cdn/storage/avatars/{fileId} or /cdn/storage/avatars/{fileId}/original/{filename} - */ - WebApp.connectHandlers.use('/cdn/storage/avatars', (req, res, next) => { - if (req.method !== 'GET') { - return next(); - } - - try { - const fileId = extractFirstIdFromUrl(req, '/cdn/storage/avatars'); - - if (!fileId) { - res.writeHead(400); - res.end('Invalid avatar file ID'); - return; - } - - // Get avatar from database - const avatar = ReactiveCache.getAvatar(fileId); - if (!avatar) { - res.writeHead(404); - res.end('Avatar not found'); - return; - } - - // Enforce visibility: avatars are public only in the context of public boards - if (!isAuthorizedForAvatar(req, avatar)) { - res.writeHead(403); - res.end('Access denied'); - return; - } - - // Handle conditional requests - if (handleConditionalRequest(req, res, avatar)) { - return; - } - - // Get file strategy and stream - const strategy = avatarStoreFactory.getFileStrategy(avatar, 'original'); - const readStream = strategy.getReadStream(); - - if (!readStream) { - res.writeHead(404); - res.end('Avatar file not found in storage'); - return; - } - - // Set headers and stream file - setFileHeaders(res, avatar, false); - streamFile(res, readStream, avatar); - - } catch (error) { - console.error('Avatar server error:', error); - if (!res.headersSent) { - res.writeHead(500); - res.end('Internal server error'); - } - } - }); - - // ============================================================================ - // LEGACY COLLECTIONFS ROUTES (Backward compatibility) - // ============================================================================ - - /** - * Serve legacy attachments from CollectionFS structure - * Route: /cfs/files/attachments/{attachmentId} - */ - WebApp.connectHandlers.use('/cfs/files/attachments', (req, res, next) => { - if (req.method !== 'GET') { - return next(); - } - - try { - const attachmentId = extractFirstIdFromUrl(req, '/cfs/files/attachments'); - - if (!attachmentId) { - res.writeHead(400); - res.end('Invalid attachment ID'); - return; - } - - // Try to get attachment with backward compatibility - const attachment = getAttachmentWithBackwardCompatibility(attachmentId); - if (!attachment) { - res.writeHead(404); - res.end('Attachment not found'); - return; - } - - // Check permissions - const board = ReactiveCache.getBoard(attachment.meta.boardId); - if (!board) { - res.writeHead(404); - res.end('Board not found'); - return; - } - - // Enforce cookie/header/query-based auth for private boards - if (!isAuthorizedForBoard(req, board)) { - res.writeHead(403); - res.end('Access denied'); - return; - } - - // Handle conditional requests - if (handleConditionalRequest(req, res, attachment)) { - return; - } - - // For legacy attachments, try to get GridFS stream - const fileStream = getOldAttachmentStream(attachmentId); - if (fileStream) { - if (isDownloadRequested(req)) { - // Force download if requested - res.setHeader('Cache-Control', 'public, max-age=31536000'); - res.setHeader('ETag', `"${attachment._id}"`); - if (attachment.size) res.setHeader('Content-Length', attachment.size); - res.setHeader('X-Content-Type-Options', 'nosniff'); - res.setHeader('Content-Type', 'application/octet-stream'); - res.setHeader('Content-Disposition', buildContentDispositionHeader('attachment', sanitizeFilenameForHeader(attachment.name))); - res.setHeader('Content-Security-Policy', "default-src 'none'; sandbox;"); - } else { - setFileHeaders(res, attachment, true); - } - streamFile(res, fileStream, attachment); - } else { - res.writeHead(404); - res.end('Legacy attachment file not found in GridFS'); - } - - } catch (error) { - console.error('Legacy attachment server error:', error); - if (!res.headersSent) { - res.writeHead(500); - res.end('Internal server error'); - } - } - }); - - /** - * Serve legacy avatars from CollectionFS structure - * Route: /cfs/files/avatars/{avatarId} - */ - WebApp.connectHandlers.use('/cfs/files/avatars', (req, res, next) => { - if (req.method !== 'GET') { - return next(); - } - - try { - const avatarId = extractFirstIdFromUrl(req, '/cfs/files/avatars'); - - if (!avatarId) { - res.writeHead(400); - res.end('Invalid avatar ID'); - return; - } - - // Try to get avatar from database (new structure first) - let avatar = ReactiveCache.getAvatar(avatarId); - - // If not found in new structure, try to handle legacy format - if (!avatar) { - // For legacy avatars, we might need to handle different ID formats - // This is a fallback for old CollectionFS avatars - res.writeHead(404); - res.end('Avatar not found'); - return; - } - - // Enforce visibility for legacy avatars as well - if (!isAuthorizedForAvatar(req, avatar)) { - res.writeHead(403); - res.end('Access denied'); - return; - } - - // Handle conditional requests - if (handleConditionalRequest(req, res, avatar)) { - return; - } - - // Get file strategy and stream - const strategy = avatarStoreFactory.getFileStrategy(avatar, 'original'); - const readStream = strategy.getReadStream(); - - if (!readStream) { - res.writeHead(404); - res.end('Avatar file not found in storage'); - return; - } - - // Set headers and stream file - setFileHeaders(res, avatar, false); - streamFile(res, readStream, avatar); - - } catch (error) { - console.error('Legacy avatar server error:', error); - if (!res.headersSent) { - res.writeHead(500); - res.end('Internal server error'); - } - } - }); - - // ============================================================================ - // ALTERNATIVE ROUTES (For different URL patterns) - // ============================================================================ - - /** - * Alternative attachment route for different URL patterns - * Route: /attachments/{fileId} - */ - WebApp.connectHandlers.use('/attachments', (req, res, next) => { - if (req.method !== 'GET') { - return next(); - } - - // Redirect to standard route - const fileId = extractFirstIdFromUrl(req, '/attachments'); - const newUrl = `/cdn/storage/attachments/${fileId}`; - res.writeHead(301, { 'Location': newUrl }); - res.end(); - }); - - /** - * Alternative avatar route for different URL patterns - * Route: /avatars/{fileId} - */ - WebApp.connectHandlers.use('/avatars', (req, res, next) => { - if (req.method !== 'GET') { - return next(); - } - - // Redirect to standard route - const fileId = extractFirstIdFromUrl(req, '/avatars'); - const newUrl = `/cdn/storage/avatars/${fileId}`; - res.writeHead(301, { 'Location': newUrl }); - res.end(); - }); - - console.log('Universal file server initialized successfully'); -} diff --git a/snapcraft.yaml b/snapcraft.yaml index aeef629b0..c88219244 100644 --- a/snapcraft.yaml +++ b/snapcraft.yaml @@ -1,5 +1,5 @@ name: wekan -version: '8.19' +version: '8.11' base: core24 summary: Open Source kanban description: | @@ -78,7 +78,7 @@ apps: parts: mongodb: - source: https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu2204-7.0.28.tgz + source: https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu2204-7.0.25.tgz plugin: dump stage-packages: - libssl3 @@ -166,9 +166,9 @@ parts: # Cleanup mkdir .build cd .build - wget https://github.com/wekan/wekan/releases/download/v8.19/wekan-8.19-amd64.zip - unzip wekan-8.19-amd64.zip - rm wekan-8.19-amd64.zip + wget https://github.com/wekan/wekan/releases/download/v8.11/wekan-8.11-amd64.zip + unzip wekan-8.11-amd64.zip + rm wekan-8.11-amd64.zip cd .. ##cd .build/bundle ##find . -type d -name '*-garbage*' | xargs rm -rf diff --git a/tests/wekanCreator.import.test.js b/tests/wekanCreator.import.test.js deleted file mode 100644 index 55dc99539..000000000 --- a/tests/wekanCreator.import.test.js +++ /dev/null @@ -1,313 +0,0 @@ -/** - * Test: WekanCreator import with swimlane preservation - * - * Simulates exporting a board with swimlanes and importing it back, - * verifying that: - * 1. Swimlanes are correctly mapped from old IDs to new IDs - * 2. Cards reference the correct swimlane IDs after import - * 3. A default swimlane is created when no swimlanes exist - * 4. ID normalization (id → _id) works for all exported items - */ - -// Mock data: exported board with swimlanes and cards -const mockExportedBoard = { - _format: 'wekan-board-1.0.0', - _id: 'board1', - title: 'Test Board', - archived: false, - color: 'bgnone', - permission: 'private', - createdAt: new Date().toISOString(), - modifiedAt: new Date().toISOString(), - members: [ - { - userId: 'user1', - wekanId: 'user1', - isActive: true, - isAdmin: true, - }, - ], - labels: [], - swimlanes: [ - { - _id: 'swimlane1', - title: 'Swimlane 1', - archived: false, - sort: 0, - }, - { - _id: 'swimlane2', - title: 'Swimlane 2', - archived: false, - sort: 1, - }, - ], - lists: [ - { - _id: 'list1', - title: 'To Do', - archived: false, - sort: 0, - }, - { - _id: 'list2', - title: 'Done', - archived: false, - sort: 1, - }, - ], - cards: [ - { - _id: 'card1', - title: 'Card in swimlane 1', - archived: false, - swimlaneId: 'swimlane1', - listId: 'list1', - sort: 0, - description: 'Test card', - dateLastActivity: new Date().toISOString(), - labelIds: [], - }, - { - _id: 'card2', - title: 'Card in swimlane 2', - archived: false, - swimlaneId: 'swimlane2', - listId: 'list2', - sort: 0, - description: 'Another test card', - dateLastActivity: new Date().toISOString(), - labelIds: [], - }, - ], - comments: [], - activities: [ - { - activityType: 'createBoard', - createdAt: new Date().toISOString(), - userId: 'user1', - }, - ], - checklists: [], - checklistItems: [], - subtaskItems: [], - customFields: [], - rules: [], - triggers: [], - actions: [], - users: [ - { - _id: 'user1', - username: 'admin', - profile: { - fullname: 'Admin User', - }, - }, - ], -}; - -// Export format variation: using 'id' instead of '_id' -const mockExportedBoardWithIdField = { - ...mockExportedBoard, - swimlanes: [ - { - id: 'swimlane1', - title: 'Swimlane 1 (id variant)', - archived: false, - sort: 0, - }, - ], - lists: [ - { - id: 'list1', - title: 'To Do (id variant)', - archived: false, - sort: 0, - }, - ], - cards: [ - { - id: 'card1', - title: 'Card (id variant)', - archived: false, - swimlaneId: 'swimlane1', - listId: 'list1', - sort: 0, - description: 'Test card with id field', - dateLastActivity: new Date().toISOString(), - labelIds: [], - }, - ], -}; - -// Test: Verify id → _id normalization -function testIdNormalization() { - console.log('\n=== Test: ID Normalization (id → _id) ==='); - - // Simulate the normalization logic from WekanCreator constructor - const normalizeIds = arr => { - if (!arr) return; - arr.forEach(item => { - if (item && item.id && !item._id) { - item._id = item.id; - } - }); - }; - - const testData = { - lists: mockExportedBoardWithIdField.lists, - cards: mockExportedBoardWithIdField.cards, - swimlanes: mockExportedBoardWithIdField.swimlanes, - }; - - normalizeIds(testData.lists); - normalizeIds(testData.cards); - normalizeIds(testData.swimlanes); - - // Check results - if (testData.swimlanes[0]._id === 'swimlane1') { - console.log('✓ Swimlane: id → _id normalization created _id'); - } else { - console.log('✗ Swimlane: id → _id normalization FAILED'); - } - - if (testData.lists[0]._id === 'list1') { - console.log('✓ List: id → _id normalization created _id'); - } else { - console.log('✗ List: id → _id normalization FAILED'); - } - - if (testData.cards[0]._id === 'card1') { - console.log('✓ Card: id → _id normalization created _id'); - } else { - console.log('✗ Card: id → _id normalization FAILED'); - } -} - -// Test: Verify swimlane mapping during import -function testSwimlaneMapping() { - console.log('\n=== Test: Swimlane Mapping (export → import) ==='); - - // Simulate WekanCreator swimlane mapping - const swimlanes = {}; - const swimlaneIndexMap = {}; // Track old → new ID mappings - - // Simulate createSwimlanes: build mapping of old ID → new ID - mockExportedBoard.swimlanes.forEach((swimlane, index) => { - const oldId = swimlane._id; - const newId = `new_swimlane_${index}`; // Simulated new ID - swimlanes[oldId] = newId; - swimlaneIndexMap[oldId] = newId; - }); - - console.log(`✓ Created mapping for ${Object.keys(swimlanes).length} swimlanes:`); - Object.entries(swimlanes).forEach(([oldId, newId]) => { - console.log(` ${oldId} → ${newId}`); - }); - - // Simulate createCards: cards reference swimlanes using mapping - const cardSwimlaneCheck = mockExportedBoard.cards.every(card => { - const oldSwimlaneId = card.swimlaneId; - const newSwimlaneId = swimlanes[oldSwimlaneId]; - return newSwimlaneId !== undefined; - }); - - if (cardSwimlaneCheck) { - console.log('✓ All cards can be mapped to swimlanes'); - } else { - console.log('✗ Some cards have missing swimlane mappings'); - } -} - -// Test: Verify default swimlane creation when none exist -function testDefaultSwimlaneCreation() { - console.log('\n=== Test: Default Swimlane Creation ==='); - - const boardWithoutSwimlanes = { - ...mockExportedBoard, - swimlanes: [], - }; - - // Simulate the default swimlane logic from WekanCreator - let swimlanes = {}; - let defaultSwimlaneId = null; - - // If no swimlanes were provided, create a default - if (!swimlanes || Object.keys(swimlanes).length === 0) { - defaultSwimlaneId = 'new_default_swimlane'; - console.log('✓ Default swimlane created:', defaultSwimlaneId); - } - - // Verify cards without swimlane references use the default - const cardsWithoutSwimlane = boardWithoutSwimlanes.cards.filter(c => !c.swimlaneId); - if (cardsWithoutSwimlane.length > 0 && defaultSwimlaneId) { - console.log(`✓ ${cardsWithoutSwimlane.length} cards will use default swimlane`); - } else if (cardsWithoutSwimlane.length === 0) { - console.log('✓ No cards lacking swimlane (test data all have swimlaneId)'); - } -} - -// Test: Verify swimlane + card integrity after full import cycle -function testFullImportCycle() { - console.log('\n=== Test: Full Import Cycle ==='); - - // Step 1: Normalize IDs - const normalizeIds = arr => { - if (!arr) return; - arr.forEach(item => { - if (item && item.id && !item._id) { - item._id = item.id; - } - }); - }; - - const data = JSON.parse(JSON.stringify(mockExportedBoard)); // Deep copy - normalizeIds(data.swimlanes); - normalizeIds(data.lists); - normalizeIds(data.cards); - - // Step 2: Map swimlanes - const swimlaneMap = {}; - data.swimlanes.forEach((s, idx) => { - swimlaneMap[s._id] = `imported_swimlane_${idx}`; - }); - - // Step 3: Verify cards get mapped swimlane IDs - let unmappedCards = 0; - data.cards.forEach(card => { - if (card.swimlaneId && !swimlaneMap[card.swimlaneId]) { - unmappedCards++; - } - }); - - if (unmappedCards === 0) { - console.log('✓ All cards have valid swimlane references'); - } else { - console.log(`✗ ${unmappedCards} cards have unmapped swimlane references`); - } - - if (data.swimlanes.length > 0) { - console.log(`✓ ${data.swimlanes.length} swimlanes preserved in import`); - } - - if (data.cards.length > 0) { - console.log(`✓ ${data.cards.length} cards preserved in import`); - } -} - -// Run all tests -if (typeof describe === 'undefined') { - // Running in Node.js or standalone (not Mocha) - console.log('===================================='); - console.log('WekanCreator Import Tests'); - console.log('===================================='); - - testIdNormalization(); - testSwimlaneMapping(); - testDefaultSwimlaneCreation(); - testFullImportCycle(); - - console.log('\n===================================='); - console.log('Tests completed'); - console.log('====================================\n'); -}