diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
index 5b621fac0..2392f33c6 100644
--- a/.github/FUNDING.yml
+++ b/.github/FUNDING.yml
@@ -1,3 +1,4 @@
# 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 8461b453c..ae5ae5989 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@v5
+ uses: actions/checkout@v6
- name: 'Dependency Review'
uses: actions/dependency-review-action@v4
diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml
index 54af974ce..febfde53f 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@v5
+ uses: actions/checkout@v6
# 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@c1e51972afc2121e065aed6d45c65596fe445f3f
+ uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
diff --git a/.github/workflows/dockerimage.yml b/.github/workflows/dockerimage.yml
index 14f8dfe01..0f85c0d96 100644
--- a/.github/workflows/dockerimage.yml
+++ b/.github/workflows/dockerimage.yml
@@ -15,6 +15,6 @@ jobs:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v6
- 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 9d93b7588..0c05c85e6 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@v5
+ uses: actions/checkout@v6
with:
fetch-depth: 0
diff --git a/.github/workflows/test_suite.yml b/.github/workflows/test_suite.yml
index b3498f613..1b3effdac 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@v5
+# uses: actions/checkout@v6
#
# - name: setup node
# uses: actions/setup-node@v1
@@ -42,7 +42,7 @@ jobs:
# needs: [lintcode]
# steps:
# - name: checkout
-# uses: actions/checkout@v5
+# uses: actions/checkout@v6
#
# - name: setup node
# uses: actions/setup-node@v1
@@ -65,7 +65,7 @@ jobs:
# needs: [lintcode,lintstyle]
# steps:
# - name: checkout
-# uses: actions/checkout@v5
+# uses: actions/checkout@v6
#
# - name: setup node
# uses: actions/setup-node@v1
@@ -90,12 +90,12 @@ jobs:
# CHECKOUTS
- name: Checkout
- uses: actions/checkout@v5
+ uses: actions/checkout@v6
# CACHING
- name: Install Meteor
id: cache-meteor-install
- uses: actions/cache@v4
+ uses: actions/cache@v5
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@v4
+ uses: actions/cache@v5
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@v4
+ uses: actions/cache@v5
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@v4
+ uses: actions/upload-artifact@v6
with:
name: coverage-folder
path: .coverage/
@@ -147,10 +147,10 @@ jobs:
needs: [tests]
steps:
- name: Checkout
- uses: actions/checkout@v5
+ uses: actions/checkout@v6
- name: Download coverage
- uses: actions/download-artifact@v5
+ uses: actions/download-artifact@v7
with:
name: coverage-folder
path: .coverage/
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3d6585803..8b27c474d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -22,6 +22,168 @@ 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 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.
+
+and fixes the following bugs:
+
+- [Fix Broken Strikethroughs in Markdown to HTML conversion](https://github.com/wekan/wekan/pull/6009).
+ Thanks to brlin-tw.
+
+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 SpaceBleed that is the following CRITICAL SECURITY ISSUES:
+
+- [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:
+
+- [Fix due dates to use colors: red = overdue, amber = due soon, no shade = not due yet](https://github.com/wekan/wekan/commit/1aa0d849775fbd0dfc83fa8e4cdca84d22a15042).
+ Thanks to xet7.
+- [Fix My Due Cards to be sorted by due date, oldest first](https://github.com/wekan/wekan/commit/a540b12895520f398bce10bd244f733d221975d4).
+ Thanks to xet7.
+- [Verify that due background colors are correct also at My Due Cards](https://github.com/wekan/wekan/commit/665c9b5e522e73115a1515ced066037110db84e1).
+ Thanks to xet7.
+- [Fix Regression - due date taking a while to load all cards v8.06](https://github.com/wekan/wekan/commit/347fa9e5cd89d064ebb8ab544e20a41f52206db6).
+ Thanks to xet7.
+- Fix duplicated lists.
+ [Part 1](https://github.com/wekan/wekan/commit/b6e7b258e0e8caecafc553dceb5771985992a0f9),
+ [Part 2](https://github.com/wekan/wekan/commit/b7ca2310b2cdec7db204229b2d5b9f95b6da8c7d),
+ [Part 3](https://github.com/wekan/wekan/commit/58df525b4915a99d0f603cc2536fd1fad1d20b29).
+ Thanks to xet7.
+
+Thanks to above GitHub users for their contributions and translators for their translations.
+
+# v8.10 2025-10-21 WeKan ® release
+
+This release fixes the following bugs:
+
+- [Prevent opened board re-migrating and reloading every 5 seconds](https://github.com/wekan/wekan/commit/4987a95d8e35fc4cd30010fd17722ee94037d7f2).
+ Thanks to xet7.
+
+Thanks to above GitHub users for their contributions and translators for their translations.
+
+# v8.09 2025-10-21 WeKan ® release
+
+This release fixes the following bugs:
+
+- [Fix Admin Panel / People editing and layout](https://github.com/wekan/wekan/commit/7a585a3dfb080af51f88669ea5928f715779cee4).
+ Thanks to xet7.
+- [Fix upgrade to 8.08 duplicates lists](https://github.com/wekan/wekan/commit/c3a405222782a4a91eb8725faaa8309f0926dcc4).
+ Thanks to xet7.
+
+Thanks to above GitHub users for their contributions and translators for their translations.
+
# v8.08 2025-10-21 WeKan ® release
This release fixes the following bugs:
diff --git a/Dockerfile b/Dockerfile
index 22c747aea..aedb88c5b 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.08/wekan-8.08-amd64.zip"
-unzip wekan-8.08-amd64.zip
-rm wekan-8.08-amd64.zip
+wget "https://github.com/wekan/wekan/releases/download/v8.17/wekan-8.17-amd64.zip"
+unzip wekan-8.17-amd64.zip
+rm wekan-8.17-amd64.zip
mv /home/wekan/app/bundle /build
# Put back the original tar
diff --git a/SECURITY.md b/SECURITY.md
index aadecbf6e..5cde5926b 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -1,12 +1,20 @@
-About money, see [CONTRIBUTING.md](CONTRIBUTING.md)
-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.
+## Responsible Security Disclosure
-We thank you with a place at our hall of fame page, that is at https://wekan.fi/hall-of-fame
+- 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
## How should reports be formatted?
@@ -26,7 +34,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.
+added to the WeKan Hall of Fame https://wekan.fi/hall-of-fame/
## Which domains are in scope?
@@ -63,11 +71,6 @@ 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
@@ -172,6 +175,57 @@ 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
@@ -218,9 +272,4 @@ 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.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).
+We welcome all fixes to improve security by email to security@wekan.fi
diff --git a/Stackerfile.yml b/Stackerfile.yml
index afdef16ce..e0529f92f 100644
--- a/Stackerfile.yml
+++ b/Stackerfile.yml
@@ -1,5 +1,5 @@
appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928
-appVersion: "v8.08.0"
+appVersion: "v8.17.0"
files:
userUploads:
- README.md
diff --git a/client/00-startup.js b/client/00-startup.js
index a6f049322..52a1c536c 100644
--- a/client/00-startup.js
+++ b/client/00-startup.js
@@ -15,3 +15,50 @@ 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();
+ }
+ });
+});
diff --git a/client/components/boards/boardBody.css b/client/components/boards/boardBody.css
index 05fa8fc58..f65cbaffc 100644
--- a/client/components/boards/boardBody.css
+++ b/client/components/boards/boardBody.css
@@ -269,57 +269,71 @@
}
/* Mobile view styles - applied when isMiniScreen is true (iPhone, etc.) */
.board-wrapper.mobile-view {
- width: 100% !important;
- min-width: 100% !important;
+ width: 100vw !important;
+ max-width: 100vw !important;
+ min-width: 100vw !important;
left: 0 !important;
right: 0 !important;
+ overflow-x: hidden !important;
+ overflow-y: auto !important;
}
.board-wrapper.mobile-view .board-canvas {
- width: 100% !important;
- min-width: 100% !important;
+ width: 100vw !important;
+ max-width: 100vw !important;
+ min-width: 100vw !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: flex;
+ display: block !important;
flex-direction: column;
margin: 0;
padding: 0;
- overflow-x: hidden;
+ overflow-x: hidden !important;
overflow-y: auto;
- width: 100%;
- min-width: 100%;
+ width: 100vw !important;
+ max-width: 100vw !important;
+ min-width: 100vw !important;
}
@media screen and (max-width: 800px),
screen and (max-device-width: 932px) and (-webkit-min-device-pixel-ratio: 3) {
.board-wrapper {
- width: 100% !important;
- min-width: 100% !important;
+ width: 100vw !important;
+ max-width: 100vw !important;
+ min-width: 100vw !important;
left: 0 !important;
right: 0 !important;
+ overflow-x: hidden !important;
+ overflow-y: auto !important;
}
.board-wrapper .board-canvas {
- width: 100% !important;
- min-width: 100% !important;
+ width: 100vw !important;
+ max-width: 100vw !important;
+ min-width: 100vw !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: flex;
+ display: block !important;
flex-direction: column;
margin: 0;
padding: 0;
- overflow-x: hidden;
+ overflow-x: hidden !important;
overflow-y: auto;
- width: 100%;
- min-width: 100%;
+ width: 100vw !important;
+ max-width: 100vw !important;
+ min-width: 100vw !important;
}
}
.calendar-event-green {
diff --git a/client/components/boards/boardBody.js b/client/components/boards/boardBody.js
index 630a5fa8c..b0af16e43 100644
--- a/client/components/boards/boardBody.js
+++ b/client/components/boards/boardBody.js
@@ -4,6 +4,7 @@ import dragscroll from '@wekanteam/dragscroll';
import { boardConverter } from '/client/lib/boardConverter';
import { migrationManager } from '/client/lib/migrationManager';
import { attachmentMigrationManager } from '/client/lib/attachmentMigrationManager';
+import { migrationProgressManager } from '/client/components/migrationProgress';
import Swimlanes from '/models/swimlanes';
import Lists from '/models/lists';
@@ -17,6 +18,8 @@ BlazeComponent.extendComponent({
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
@@ -28,21 +31,33 @@ BlazeComponent.extendComponent({
const handle = subManager.subscribe('board', currentBoardId, false);
- Tracker.nonreactive(() => {
- Tracker.autorun(() => {
- if (handle.ready()) {
+ // Use a separate autorun for subscription ready state to avoid reactive loops
+ this.subscriptionReadyAutorun = Tracker.autorun(() => {
+ if (handle.ready()) {
+ // Only run conversion/migration logic once per board
+ if (!this._boardProcessed || this._lastProcessedBoardId !== currentBoardId) {
+ this._boardProcessed = true;
+ this._lastProcessedBoardId = currentBoardId;
+
// 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)) {
@@ -56,10 +71,17 @@ BlazeComponent.extendComponent({
const swimlanes = board.swimlanes();
if (swimlanes.length === 0) {
- const swimlaneId = Swimlanes.insert({
- title: 'Default',
- boardId: boardId,
- });
+ // Check if any swimlane exists in the database to avoid race conditions
+ const existingSwimlanes = ReactiveCache.getSwimlanes({ boardId });
+ if (existingSwimlanes.length === 0) {
+ const swimlaneId = Swimlanes.insert({
+ title: 'Default',
+ boardId: boardId,
+ });
+ if (process.env.DEBUG === 'true') {
+ console.log(`Created default swimlane ${swimlaneId} for board ${boardId}`);
+ }
+ }
this._swimlaneCreated.add(boardId);
} else {
this._swimlaneCreated.add(boardId);
@@ -77,49 +99,10 @@ BlazeComponent.extendComponent({
return;
}
- // 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);
- }
+ // Automatic migration disabled - migrations must be run manually from sidebar
+ // Board admins can run migrations from the sidebar Migrations menu
+ this.isBoardReady.set(true);
- // 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);
-
- // Start attachment migration in background if needed
- this.startAttachmentMigrationIfNeeded(boardId);
} catch (error) {
console.error('Error during board conversion check:', error);
this.isConverting.set(false);
@@ -128,6 +111,136 @@ BlazeComponent.extendComponent({
}
},
+ /**
+ * Check if board needs comprehensive migration
+ */
+ async checkComprehensiveMigration(boardId) {
+ try {
+ return new Promise((resolve, reject) => {
+ Meteor.call('comprehensiveBoardMigration.needsMigration', boardId, (error, result) => {
+ if (error) {
+ console.error('Error checking comprehensive migration:', error);
+ reject(error);
+ } else {
+ resolve(result);
+ }
+ });
+ });
+ } catch (error) {
+ console.error('Error checking comprehensive migration:', error);
+ return false;
+ }
+ },
+
+ /**
+ * Execute comprehensive migration for a board
+ */
+ async executeComprehensiveMigration(boardId) {
+ try {
+ // Start progress tracking
+ migrationProgressManager.startMigration();
+
+ // Simulate progress updates since we can't easily pass callbacks through Meteor methods
+ const progressSteps = [
+ { step: 'analyze_board_structure', name: 'Analyze Board Structure', duration: 1000 },
+ { step: 'fix_orphaned_cards', name: 'Fix Orphaned Cards', duration: 2000 },
+ { step: 'convert_shared_lists', name: 'Convert Shared Lists', duration: 3000 },
+ { step: 'ensure_per_swimlane_lists', name: 'Ensure Per-Swimlane Lists', duration: 1500 },
+ { step: 'validate_migration', name: 'Validate Migration', duration: 1000 },
+ { step: 'fix_avatar_urls', name: 'Fix Avatar URLs', duration: 1000 },
+ { step: 'fix_attachment_urls', name: 'Fix Attachment URLs', duration: 1000 }
+ ];
+
+ // Start the actual migration
+ const migrationPromise = new Promise((resolve, reject) => {
+ Meteor.call('comprehensiveBoardMigration.execute', boardId, (error, result) => {
+ if (error) {
+ console.error('Error executing comprehensive migration:', error);
+ migrationProgressManager.failMigration(error);
+ reject(error);
+ } else {
+ if (process.env.DEBUG === 'true') {
+ console.log('Comprehensive migration completed for board:', boardId, result);
+ }
+ resolve(result.success);
+ }
+ });
+ });
+
+ // Simulate progress updates
+ const progressPromise = this.simulateMigrationProgress(progressSteps);
+
+ // Wait for both to complete
+ const [migrationResult] = await Promise.all([migrationPromise, progressPromise]);
+
+ migrationProgressManager.completeMigration();
+ return migrationResult;
+
+ } catch (error) {
+ console.error('Error executing comprehensive migration:', error);
+ migrationProgressManager.failMigration(error);
+ return false;
+ }
+ },
+
+ /**
+ * Simulate migration progress updates
+ */
+ async simulateMigrationProgress(progressSteps) {
+ const totalSteps = progressSteps.length;
+
+ for (let i = 0; i < progressSteps.length; i++) {
+ const step = progressSteps[i];
+ const stepProgress = Math.round(((i + 1) / totalSteps) * 100);
+
+ // Update progress for this step
+ migrationProgressManager.updateProgress({
+ overallProgress: stepProgress,
+ currentStep: i + 1,
+ totalSteps,
+ stepName: step.step,
+ stepProgress: 0,
+ stepStatus: `Starting ${step.name}...`,
+ stepDetails: null,
+ boardId: Session.get('currentBoard')
+ });
+
+ // Simulate step progress
+ const stepDuration = step.duration;
+ const updateInterval = 100; // Update every 100ms
+ const totalUpdates = stepDuration / updateInterval;
+
+ for (let j = 0; j < totalUpdates; j++) {
+ const stepStepProgress = Math.round(((j + 1) / totalUpdates) * 100);
+
+ migrationProgressManager.updateProgress({
+ overallProgress: stepProgress,
+ currentStep: i + 1,
+ totalSteps,
+ stepName: step.step,
+ stepProgress: stepStepProgress,
+ stepStatus: `Processing ${step.name}...`,
+ stepDetails: { progress: `${stepStepProgress}%` },
+ boardId: Session.get('currentBoard')
+ });
+
+ await new Promise(resolve => setTimeout(resolve, updateInterval));
+ }
+
+ // Complete the step
+ migrationProgressManager.updateProgress({
+ overallProgress: stepProgress,
+ currentStep: i + 1,
+ totalSteps,
+ stepName: step.step,
+ stepProgress: 100,
+ stepStatus: `${step.name} completed`,
+ stepDetails: { status: 'completed' },
+ boardId: Session.get('currentBoard')
+ });
+ }
+ },
+
async startBackgroundMigration(boardId) {
try {
// Start background migration using the cron system
@@ -177,7 +290,7 @@ BlazeComponent.extendComponent({
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 } });
+ Boards.update(boardId, { $set: { hasSharedListsConverted: true } });
return;
}
@@ -197,38 +310,59 @@ BlazeComponent.extendComponent({
});
if (!existingList) {
- // Create a new list in this swimlane
- const newListData = {
- title: sharedList.title,
+ // Double-check to avoid race conditions
+ const doubleCheckList = ReactiveCache.getList({
boardId: boardId,
swimlaneId: swimlane._id,
- sort: sharedList.sort || 0,
- archived: sharedList.archived || false,
- createdAt: new Date(),
- modifiedAt: new Date()
- };
+ title: sharedList.title
+ });
- // 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;
+ 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()
+ };
- Lists.insert(newListData);
+ // 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`);
+ }
}
}
- // Archive or remove the original shared list
- Lists.update(sharedList._id, {
- $set: {
- archived: true,
- modifiedAt: new Date()
- }
- });
+ // 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 } });
+ 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}`);
@@ -286,7 +420,9 @@ BlazeComponent.extendComponent({
});
if (result && result.success) {
- console.log(`Successfully fixed missing lists for board ${boardId}: created ${result.createdLists} lists, updated ${result.updatedCards} cards`);
+ if (process.env.DEBUG === 'true') {
+ console.log(`Successfully fixed missing lists for board ${boardId}: created ${result.createdLists} lists, updated ${result.updatedCards} cards`);
+ }
}
} catch (error) {
@@ -294,6 +430,55 @@ BlazeComponent.extendComponent({
}
},
+ 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
+ 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
+ Boards.update(boardId, { $set: { fixDuplicateListsCompleted: true } });
+ } else {
+ // Still mark as processed to avoid repeated checks
+ 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
@@ -359,39 +544,50 @@ 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 nullSortSwimlanes = currentBoardData.nullSortSwimlanes();
- if (nullSortSwimlanes.length > 0) {
- const swimlanes = currentBoardData.swimlanes();
- let count = 0;
- swimlanes.forEach(s => {
- Swimlanes.update(s._id, {
- $set: {
- sort: count,
- },
+ 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;
});
- count += 1;
- });
+ }
+ this._sortFieldsFixed.add(`swimlanes-${boardId}`);
}
}
// fix lists sort field if there are null values
if (currentBoardData && Lists) {
- 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,
- },
+ 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;
});
- count += 1;
- });
+ }
+ this._sortFieldsFixed.add(`lists-${boardId}`);
}
}
},
@@ -1175,9 +1371,13 @@ BlazeComponent.extendComponent({
const firstSwimlane = currentBoard.swimlanes()[0];
Meteor.call('createCardWithDueDate', currentBoard._id, firstList._id, myTitle, startDate.toDate(), firstSwimlane._id, function(error, result) {
if (error) {
- console.log(error);
+ if (process.env.DEBUG === 'true') {
+ console.log(error);
+ }
} else {
- console.log("Card Created", result);
+ if (process.env.DEBUG === 'true') {
+ console.log("Card Created", result);
+ }
}
});
closeModal();
diff --git a/client/components/boards/boardHeader.css b/client/components/boards/boardHeader.css
index f3cb652e7..faf20e2f5 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: 100% !important;
- max-width: 100% !important;
- min-width: 100% !important;
+ width: 100vw !important;
+ max-width: 100vw !important;
+ min-width: 100vw !important;
overflow-x: hidden !important;
overflow-y: auto !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 {
+ 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 .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 .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 .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 .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 .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 {
+ 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:first-child {
margin-left: 0 !important;
@@ -667,9 +667,9 @@
flex-wrap: nowrap !important;
align-items: stretch !important;
justify-content: flex-start !important;
- width: 100% !important;
- max-width: 100% !important;
- min-width: 100% !important;
+ width: 100vw !important;
+ max-width: 100vw !important;
+ min-width: 100vw !important;
overflow-x: hidden !important;
overflow-y: auto !important;
}
diff --git a/client/components/boards/boardHeader.jade b/client/components/boards/boardHeader.jade
index 013cb3619..bac4216ed 100644
--- a/client/components/boards/boardHeader.jade
+++ b/client/components/boards/boardHeader.jade
@@ -16,13 +16,6 @@ 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}}")
@@ -38,6 +31,13 @@ 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,10 +61,6 @@ 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}}")
@@ -78,6 +74,11 @@ 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
@@ -266,6 +267,36 @@ 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 72271f44a..c84b593c6 100644
--- a/client/components/boards/boardHeader.js
+++ b/client/components/boards/boardHeader.js
@@ -72,7 +72,10 @@ BlazeComponent.extendComponent({
{
'click .js-edit-board-title': Popup.open('boardChangeTitle'),
'click .js-star-board'() {
- ReactiveCache.getCurrentUser().toggleBoardStar(Session.get('currentBoard'));
+ const boardId = Session.get('currentBoard');
+ if (boardId) {
+ Meteor.call('toggleBoardStar', boardId);
+ }
},
'click .js-open-board-menu': Popup.open('boardMenu'),
'click .js-change-visibility': Popup.open('boardChangeVisibility'),
@@ -82,18 +85,26 @@ BlazeComponent.extendComponent({
},
'click .js-toggle-board-view': Popup.open('boardChangeView'),
'click .js-toggle-sidebar'() {
- console.log('Hamburger menu clicked');
+ if (process.env.DEBUG === 'true') {
+ console.log('Hamburger menu clicked');
+ }
// Use the same approach as keyboard shortcuts
if (typeof Sidebar !== 'undefined' && Sidebar && typeof Sidebar.toggle === 'function') {
- console.log('Using Sidebar.toggle()');
+ if (process.env.DEBUG === 'true') {
+ console.log('Using Sidebar.toggle()');
+ }
Sidebar.toggle();
} else {
- console.warn('Sidebar not available, trying alternative approach');
+ if (process.env.DEBUG === 'true') {
+ console.warn('Sidebar not available, trying alternative approach');
+ }
// Try to trigger the sidebar through the global Blaze helper
if (typeof Blaze !== 'undefined' && Blaze._globalHelpers && Blaze._globalHelpers.Sidebar) {
const sidebar = Blaze._globalHelpers.Sidebar();
if (sidebar && typeof sidebar.toggle === 'function') {
- console.log('Using Blaze helper Sidebar.toggle()');
+ if (process.env.DEBUG === 'true') {
+ console.log('Using Blaze helper Sidebar.toggle()');
+ }
sidebar.toggle();
}
}
@@ -283,6 +294,15 @@ 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 {
@@ -301,6 +321,15 @@ 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());
}
},
@@ -322,6 +351,13 @@ 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 f834af830..dc7efdd66 100644
--- a/client/components/boards/boardsList.css
+++ b/client/components/boards/boardsList.css
@@ -8,6 +8,273 @@
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;
@@ -106,23 +373,35 @@
.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: #999;
+ background-color: inherit; /* Inherit board color from parent li.js-board */
color: #f6f6f6;
min-height: 100px;
font-size: 16px;
line-height: 22px;
- border-radius: 3px;
+ border-radius: 0; /* No border-radius - parent .js-board has it */
display: block;
font-weight: 700;
- padding: 8px;
- margin: 8px;
+ padding: 36px 8px 32px 8px; /* Top padding for drag handle, bottom for checkbox */
+ margin: 0; /* No margin - moved to parent .js-board */
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;
}
@@ -150,13 +429,20 @@
.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 :hover {
- background-color: #939393;
+.board-list .js-add-board .label:hover {
+ background-color: #808080; /* Even darker on hover */
}
.board-list .is-star-active,
.board-list .is-not-star-active {
- bottom: 0;
+ top: 0;
font-size: 14px;
height: 18px;
line-height: 18px;
@@ -164,7 +450,6 @@
padding: 9px 9px;
position: absolute;
right: 0;
- top: 0;
transition-duration: 0.15s;
transition-property: color, font-size, background;
}
@@ -238,6 +523,95 @@
.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: #2196F3;
+ border-color: #2196F3;
+ box-shadow: 0 2px 8px rgba(33, 150, 243, 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;
+}
+
+.board-list.is-multiselection-active .js-board.is-checked {
+ outline: 4px solid #2196F3;
+ outline-offset: -4px;
+ box-shadow: 0 4px 12px rgba(33, 150, 243, 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;
@@ -739,9 +1113,62 @@
#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 3d01c19c9..5cf488c55 100644
--- a/client/components/boards/boardsList.jade
+++ b/client/components/boards/boardsList.jade
@@ -2,151 +2,160 @@ template(name="boardList")
.wrapper
.board-list-header
- ul.AllBoardTeamsOrgs
- li.AllBoardTeams
- if userHasTeams
- select.js-AllBoardTeams#jsAllBoardTeams("multiple")
- option(value="-1") {{_ 'teams'}} :
- each teamsDatas
- option(value="{{teamId}}") {{_ teamDisplayName}}
+ .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 ⭐ {{_ '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 📋 {{_ '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 📂 {{_ 'allboards.remaining'}}
+ span.menu-count {{menuItemCount 'remaining'}}
+ .workspaces-header
+ span 🗂️ {{_ 'allboards.workspaces'}}
+ a.js-add-workspace(title="{{_ 'allboards.add-workspace'}}") +
+ // Workspaces tree
+ +workspaceTree(nodes=workspacesTree selectedWorkspaceId=selectedWorkspaceId)
- li.AllBoardOrgs
- if userHasOrgs
- select.js-AllBoardOrgs#jsAllBoardOrgs("multiple")
- option(value="-1") {{_ 'organizations'}} :
- each orgsDatas
- option(value="{{orgId}}") {{orgDisplayName}}
+ // 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.AllBoardTemplates
- // if userHasTemplates
- // select.js-AllBoardTemplates#jsAllBoardTemplates("multiple")
- // option(value="-1") {{_ 'templates'}} :
- // each templatesDatas
- // option(value="{{templateId}}") {{_ templateDisplayName}}
+ li.AllBoardOrgs
+ if userHasOrgs
+ select.js-AllBoardOrgs#jsAllBoardOrgs("multiple")
+ option(value="-1") {{_ 'organizations'}} :
+ each orgsDatas
+ option(value="{{orgId}}") {{orgDisplayName}}
- li.AllBoardBtns
- div.AllBoardButtonsContainer
- if userHasOrgsOrTeams
- i.fa.fa-filter
- input#filterBtn(type="button" value="{{_ 'filter'}}")
- input#resetBtn(type="button" value="{{_ 'filter-clear'}}")
+ li.AllBoardBtns
+ div.AllBoardButtonsContainer
+ if userHasOrgsOrTeams
+ span 🔍
+ input#filterBtn(type="button" value="{{_ 'filter'}}")
+ button#resetBtn.filter-reset-btn
+ span.reset-icon ❌
+ span {{_ 'filter-clear'}}
- 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'}}")
+ // Right boards grid
+ .boards-right-grid
+ .boards-path-header
+ .path-left
+ span.path-icon {{currentMenuPath.icon}}
+ span.path-text {{currentMenuPath.text}}
+ if BoardMultiSelection.isActive
+ span.multiselection-hint 📌 {{_ 'multi-selection-active'}}
+ .path-right
+ if canModifyBoards
+ if hasBoardsSelected
+ button.js-archive-selected-boards.board-header-btn
+ span 📦
+ span {{_ 'archive-board'}}
+ button.js-duplicate-selected-boards.board-header-btn
+ span 📋
+ 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}}")
+ | ☑️
+ if BoardMultiSelection.isActive
+ a.board-header-btn-close.js-multiselection-reset(title="{{_ 'filter-clear'}}")
+ | ✖
+ 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'}}")
+ | ➕ {{_ 'add-template-container'}}
else
- 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'}}")
- | 📦
+ a.board-list-item.label(title="{{_ 'add-board'}}")
+ | ➕ {{_ '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'}}")
+ | {{#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'}}") ↕️
+ 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.js-star-board(
+ class="{{#if isStarred}}is-star-active{{else}}is-not-star-active{{/if}}"
+ title="{{_ 'star-board-title'}}")
+ | {{#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'}}") ↕️
+ 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}}")
+ | ⏱️
+ a.js-star-board(
+ class="{{#if isStarred}}is-star-active{{else}}is-not-star-active{{/if}}"
+ title="{{_ 'star-board-title'}}")
+ | {{#if isStarred}}⭐{{else}}☆{{/if}}
template(name="boardListHeaderBar")
h1 {{_ title }}
@@ -157,3 +166,25 @@ 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 ↕️
+ a.js-select-workspace(data-id="{{id}}")
+ span.workspace-icon
+ if icon
+ +viewer
+ = icon
+ else
+ | 📁
+ span.workspace-name= name
+ a.js-edit-workspace(data-id="{{id}}" title="{{_ 'allboards.edit-workspace'}}") ✏️
+ 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 1d655fd11..bb1d258d0 100644
--- a/client/components/boards/boardsList.js
+++ b/client/components/boards/boardsList.js
@@ -14,6 +14,9 @@ Template.boardList.helpers({
return Utils.isMiniScreen() && Session.get('currentBoard'); */
return true;
},
+ BoardMultiSelection() {
+ return BoardMultiSelection;
+ },
})
Template.boardListHeaderBar.events({
@@ -45,6 +48,9 @@ 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) {
@@ -53,9 +59,72 @@ 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');
@@ -73,27 +142,20 @@ 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 nextBoardBom = ui.item.next('.js-board').get(0);
- const sortIndex = Utils.calculateIndex(prevBoardDom, nextBoardBom, 1);
+ const nextBoardDom = ui.item.next('.js-board').get(0);
+ const sortIndex = Utils.calculateIndex(prevBoardDom, nextBoardDom, 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');
- board.move(sortIndex.base);
+ const currentUser = ReactiveCache.getCurrentUser();
+ if (currentUser && typeof currentUser.setBoardSortIndex === 'function') {
+ currentUser.setBoardSortIndex(board._id, 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({
@@ -101,6 +163,7 @@ BlazeComponent.extendComponent({
});
}
});
+ */
},
userHasTeams() {
if (ReactiveCache.getCurrentUser()?.teams?.length > 0)
@@ -132,6 +195,41 @@ 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' },
@@ -184,10 +282,33 @@ BlazeComponent.extendComponent({
};
}
- const ret = ReactiveCache.getBoards(query, {
- sort: { sort: 1 /* boards default sorting */ },
- });
- return ret;
+ 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 || ''));
},
boardLists(boardId) {
/* Bug Board icons random dance https://github.com/wekan/wekan/issues/4214
@@ -235,11 +356,65 @@ BlazeComponent.extendComponent({
events() {
return [
{
- 'click .js-add-board': Popup.open('createBoard'),
- 'click .js-star-board'(evt) {
- const boardId = this.currentData()._id;
- ReactiveCache.getCurrentUser().toggleBoardStar(boardId);
+ '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-star-board'(evt) {
+ 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'))) {
@@ -290,6 +465,58 @@ 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;
@@ -356,7 +583,260 @@ 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/cards/cardDate.css b/client/components/cards/cardDate.css
index ba0b52b0f..4a873e485 100644
--- a/client/components/cards/cardDate.css
+++ b/client/components/cards/cardDate.css
@@ -8,39 +8,72 @@
.card-date.is-active {
background-color: #b3b3b3;
}
-.card-date.current,
-.card-date.almost-due,
-.card-date.due,
-.card-date.long-overdue {
+/* Date status colors - red = overdue, amber = due soon, no shade = not due */
+.card-date.overdue {
+ background-color: #ff4444; /* Red for overdue */
color: #fff;
}
+.card-date.overdue:hover,
+.card-date.overdue.is-active {
+ background-color: #cc3333;
+}
+
+.card-date.due-soon {
+ background-color: #ffaa00; /* Amber for due soon */
+ color: #000;
+}
+.card-date.due-soon:hover,
+.card-date.due-soon.is-active {
+ background-color: #e69900;
+}
+
+.card-date.not-due {
+ /* No special background - uses default date type colors */
+}
+
.card-date.current {
- background-color: #5ba639;
+ background-color: #5ba639; /* Green for current/active */
+ color: #fff;
}
.card-date.current:hover,
.card-date.current.is-active {
background-color: #46802c;
}
-.card-date.almost-due {
- background-color: #edc909;
+
+.card-date.completed {
+ background-color: #90ee90; /* Light green for completed */
+ color: #000;
}
-.card-date.almost-due:hover,
-.card-date.almost-due.is-active {
- background-color: #bc9f07;
+.card-date.completed:hover,
+.card-date.completed.is-active {
+ background-color: #7dd87d;
}
-.card-date.due {
- background-color: #fa3f00;
+
+.card-date.completed-early {
+ background-color: #4caf50; /* Green for completed early */
+ color: #fff;
}
-.card-date.due:hover,
-.card-date.due.is-active {
- background-color: #c73200;
+.card-date.completed-early:hover,
+.card-date.completed-early.is-active {
+ background-color: #45a049;
}
-.card-date.long-overdue {
- background-color: #fd5d47;
+
+.card-date.completed-late {
+ background-color: #ff9800; /* Orange for completed late */
+ color: #fff;
}
-.card-date.long-overdue:hover,
-.card-date.long-overdue.is-active {
- background-color: #fd3e24;
+.card-date.completed-late:hover,
+.card-date.completed-late.is-active {
+ background-color: #f57c00;
+}
+
+.card-date.completed-on-time {
+ background-color: #2196f3; /* Blue for completed on time */
+ color: #fff;
+}
+.card-date.completed-on-time:hover,
+.card-date.completed-on-time.is-active {
+ background-color: #1976d2;
}
/* Date type specific colors */
diff --git a/client/components/cards/cardDate.jade b/client/components/cards/cardDate.jade
index e387112bc..c8c6f45a3 100644
--- a/client/components/cards/cardDate.jade
+++ b/client/components/cards/cardDate.jade
@@ -97,6 +97,12 @@ 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
@@ -106,6 +112,11 @@ 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
@@ -115,6 +126,11 @@ 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
@@ -124,6 +140,11 @@ 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 d5649fae1..a470bbba4 100644
--- a/client/components/cards/cardDate.js
+++ b/client/components/cards/cardDate.js
@@ -50,6 +50,17 @@ 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) {
@@ -157,14 +168,18 @@ class CardReceivedDate extends CardDate {
const endAt = this.data().getEnd();
const startAt = this.data().getStart();
const theDate = this.date.get();
- // if dueAt, endAt and startAt exist & are > receivedAt, receivedAt doesn't need to be flagged
+ const now = this.now.get();
+
+ // Received date logic: if received date is after start, due, or end dates, it's overdue
if (
(startAt && isAfter(theDate, startAt)) ||
(endAt && isAfter(theDate, endAt)) ||
(dueAt && isAfter(theDate, dueAt))
- )
- classes += 'long-overdue';
- else classes += 'current';
+ ) {
+ classes += 'overdue';
+ } else {
+ classes += 'not-due';
+ }
return classes;
}
@@ -193,16 +208,22 @@ class CardStartDate extends CardDate {
}
classes() {
- let classes = 'start-date' + ' ';
+ let classes = 'start-date ';
const dueAt = this.data().getDue();
const endAt = this.data().getEnd();
const theDate = this.date.get();
const now = this.now.get();
- // if dueAt or endAt exist & are > startAt, startAt doesn't need to be flagged
- if ((endAt && isAfter(theDate, endAt)) || (dueAt && isAfter(theDate, dueAt)))
- classes += 'long-overdue';
- else if (isAfter(theDate, now)) classes += '';
- else classes += 'current';
+
+ // Start date logic: if start date is after due or end dates, it's overdue
+ if ((endAt && isAfter(theDate, endAt)) || (dueAt && isAfter(theDate, dueAt))) {
+ classes += 'overdue';
+ } else if (isAfter(theDate, now)) {
+ // Start date is in the future - not due yet
+ classes += 'not-due';
+ } else {
+ // Start date is today or in the past - current/active
+ classes += 'current';
+ }
return classes;
}
@@ -231,17 +252,35 @@ class CardDueDate extends CardDate {
}
classes() {
- let classes = 'due-date' + ' ';
+ let classes = 'due-date ';
const endAt = this.data().getEnd();
const theDate = this.date.get();
const now = this.now.get();
- // if the due date is after the end date, green - done early
- if (endAt && isAfter(theDate, endAt)) classes += 'current';
- // if there is an end date, don't need to flag the due date
- else if (endAt) classes += '';
- else if (diff(now, theDate, 'days') >= 2) classes += 'long-overdue';
- else if (diff(now, theDate, 'minute') >= 0) classes += 'due';
- else if (diff(now, theDate, 'days') >= -1) classes += 'almost-due';
+
+ // If there's an end date and it's before the due date, task is completed early
+ if (endAt && isBefore(endAt, theDate)) {
+ classes += 'completed-early';
+ }
+ // If there's an end date, don't show due date status since task is completed
+ else if (endAt) {
+ classes += 'completed';
+ }
+ // Due date logic based on current time
+ else {
+ const daysDiff = diff(theDate, now, 'days');
+
+ if (daysDiff < 0) {
+ // Due date is in the past - overdue
+ classes += 'overdue';
+ } else if (daysDiff <= 1) {
+ // Due today or tomorrow - due soon
+ classes += 'due-soon';
+ } else {
+ // Due date is more than 1 day away - not due yet
+ classes += 'not-due';
+ }
+ }
+
return classes;
}
@@ -270,12 +309,23 @@ class CardEndDate extends CardDate {
}
classes() {
- let classes = 'end-date' + ' ';
+ let classes = 'end-date ';
const dueAt = this.data().getDue();
const theDate = this.date.get();
- if (!dueAt) classes += '';
- else if (isBefore(theDate, dueAt)) classes += 'current';
- else if (isAfter(theDate, dueAt)) classes += 'due';
+
+ if (!dueAt) {
+ // No due date set - just show as completed
+ classes += 'completed';
+ } else if (isBefore(theDate, dueAt)) {
+ // End date is before due date - completed early
+ classes += 'completed-early';
+ } else if (isAfter(theDate, dueAt)) {
+ // End date is after due date - completed late
+ classes += 'completed-late';
+ } else {
+ // End date equals due date - completed on time
+ classes += 'completed-on-time';
+ }
return classes;
}
diff --git a/client/components/cards/cardDetails.jade b/client/components/cards/cardDetails.jade
index 90b3fef31..cf810b38a 100644
--- a/client/components/cards/cardDetails.jade
+++ b/client/components/cards/cardDetails.jade
@@ -191,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)
@@ -242,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
diff --git a/client/components/cards/cardDetails.js b/client/components/cards/cardDetails.js
index bbbd49a73..43ee28473 100644
--- a/client/components/cards/cardDetails.js
+++ b/client/components/cards/cardDetails.js
@@ -430,56 +430,57 @@ BlazeComponent.extendComponent({
) {
newState = forIt;
}
- this.data().setVote(Meteor.userId(), newState);
+ // Use secure server method; direct client updates to vote are blocked
+ Meteor.call('cards.vote', this.data()._id, newState);
},
'click .js-poker'(e) {
let newState = null;
if ($(e.target).hasClass('js-poker-vote-one')) {
newState = 'one';
- this.data().setPoker(Meteor.userId(), newState);
+ Meteor.call('cards.pokerVote', this.data()._id, newState);
}
if ($(e.target).hasClass('js-poker-vote-two')) {
newState = 'two';
- this.data().setPoker(Meteor.userId(), newState);
+ Meteor.call('cards.pokerVote', this.data()._id, newState);
}
if ($(e.target).hasClass('js-poker-vote-three')) {
newState = 'three';
- this.data().setPoker(Meteor.userId(), newState);
+ Meteor.call('cards.pokerVote', this.data()._id, newState);
}
if ($(e.target).hasClass('js-poker-vote-five')) {
newState = 'five';
- this.data().setPoker(Meteor.userId(), newState);
+ Meteor.call('cards.pokerVote', this.data()._id, newState);
}
if ($(e.target).hasClass('js-poker-vote-eight')) {
newState = 'eight';
- this.data().setPoker(Meteor.userId(), newState);
+ Meteor.call('cards.pokerVote', this.data()._id, newState);
}
if ($(e.target).hasClass('js-poker-vote-thirteen')) {
newState = 'thirteen';
- this.data().setPoker(Meteor.userId(), newState);
+ Meteor.call('cards.pokerVote', this.data()._id, newState);
}
if ($(e.target).hasClass('js-poker-vote-twenty')) {
newState = 'twenty';
- this.data().setPoker(Meteor.userId(), newState);
+ Meteor.call('cards.pokerVote', this.data()._id, newState);
}
if ($(e.target).hasClass('js-poker-vote-forty')) {
newState = 'forty';
- this.data().setPoker(Meteor.userId(), newState);
+ Meteor.call('cards.pokerVote', this.data()._id, newState);
}
if ($(e.target).hasClass('js-poker-vote-one-hundred')) {
newState = 'oneHundred';
- this.data().setPoker(Meteor.userId(), newState);
+ Meteor.call('cards.pokerVote', this.data()._id, newState);
}
if ($(e.target).hasClass('js-poker-vote-unsure')) {
newState = 'unsure';
- this.data().setPoker(Meteor.userId(), newState);
+ Meteor.call('cards.pokerVote', this.data()._id, newState);
}
},
'click .js-poker-finish'(e) {
if ($(e.target).hasClass('js-poker-finish')) {
e.preventDefault();
- const now = formatDateTime(new Date());
- this.data().setPokerEnd(now);
+ const now = new Date();
+ Meteor.call('cards.setPokerEnd', this.data()._id, now);
}
},
@@ -487,9 +488,9 @@ BlazeComponent.extendComponent({
if ($(e.target).hasClass('js-poker-replay')) {
e.preventDefault();
this.currentCard = this.currentData();
- this.currentCard.replayPoker();
- this.data().unsetPokerEnd();
- this.data().unsetPokerEstimation();
+ Meteor.call('cards.replayPoker', this.currentCard._id);
+ Meteor.call('cards.unsetPokerEnd', this.currentCard._id);
+ Meteor.call('cards.unsetPokerEstimation', this.currentCard._id);
}
},
'click .js-poker-estimation'(event) {
@@ -500,9 +501,9 @@ BlazeComponent.extendComponent({
this.find('#pokerEstimation').value = '';
if (ruleTitle) {
- this.data().setPokerEstimation(parseInt(ruleTitle, 10));
+ Meteor.call('cards.setPokerEstimation', this.data()._id, parseInt(ruleTitle, 10));
} else {
- this.data().setPokerEstimation('');
+ Meteor.call('cards.unsetPokerEstimation', this.data()._id);
}
}
},
@@ -1105,20 +1106,15 @@ BlazeComponent.extendComponent({
'is-checked',
);
const endString = this.currentCard.getVoteEnd();
-
- this.currentCard.setVoteQuestion(
- voteQuestion,
- publicVote,
- allowNonBoardMembers,
- );
+ Meteor.call('cards.setVoteQuestion', this.currentCard._id, voteQuestion, publicVote, allowNonBoardMembers);
if (endString) {
- this.currentCard.setVoteEnd(endString);
+ Meteor.call('cards.setVoteEnd', this.currentCard._id, endString);
}
Popup.back();
},
'click .js-remove-vote': Popup.afterConfirm('deleteVote', () => {
event.preventDefault();
- this.currentCard.unsetVote();
+ Meteor.call('cards.unsetVote', this.currentCard._id);
Popup.back();
}),
'click a.js-toggle-vote-public'(event) {
@@ -1317,10 +1313,10 @@ BlazeComponent.extendComponent({
];
}
_storeDate(newDate) {
- this.card.setVoteEnd(newDate);
+ Meteor.call('cards.setVoteEnd', this.card._id, newDate);
}
_deleteDate() {
- this.card.unsetVoteEnd();
+ Meteor.call('cards.unsetVoteEnd', this.card._id);
}
}.register('editVoteEndDatePopup'));
@@ -1342,17 +1338,14 @@ BlazeComponent.extendComponent({
);
const endString = this.currentCard.getPokerEnd();
- this.currentCard.setPokerQuestion(
- pokerQuestion,
- allowNonBoardMembers,
- );
+ Meteor.call('cards.setPokerQuestion', this.currentCard._id, pokerQuestion, allowNonBoardMembers);
if (endString) {
- this.currentCard.setPokerEnd(endString);
+ Meteor.call('cards.setPokerEnd', this.currentCard._id, new Date(endString));
}
Popup.back();
},
'click .js-remove-poker': Popup.afterConfirm('deletePoker', (event) => {
- this.currentCard.unsetPoker();
+ Meteor.call('cards.unsetPoker', this.currentCard._id);
Popup.back();
}),
'click a.js-toggle-poker-allow-non-members'(event) {
@@ -1573,10 +1566,10 @@ BlazeComponent.extendComponent({
];
}
_storeDate(newDate) {
- this.card.setPokerEnd(newDate);
+ Meteor.call('cards.setPokerEnd', this.card._id, newDate);
}
_deleteDate() {
- this.card.unsetPokerEnd();
+ Meteor.call('cards.unsetPokerEnd', this.card._id);
}
}.register('editPokerEndDatePopup'));
diff --git a/client/components/cards/checklists.css b/client/components/cards/checklists.css
index 6b8c7e8f9..566df27f0 100644
--- a/client/components/cards/checklists.css
+++ b/client/components/cards/checklists.css
@@ -72,6 +72,10 @@ textarea.js-edit-checklist-item {
padding-top: 3px;
float: left;
}
+.checklist-title span.fa.checklist-handle.fa-arrows::before {
+ content: "↕️" !important;
+ font-family: inherit !important;
+}
#card-details-overlay {
top: 0;
bottom: -600px;
@@ -148,6 +152,10 @@ textarea.js-edit-checklist-item {
padding-top: 2px;
padding-right: 10px;
}
+.checklist-item span.fa.checklistitem-handle.fa-arrows::before {
+ content: "↕️" !important;
+ font-family: inherit !important;
+}
.js-delete-checklist-item,
.js-convert-checklist-item-to-card {
margin: 0 0 0.5em 1.33em;
diff --git a/client/components/cards/checklists.jade b/client/components/cards/checklists.jade
index 82e4a1a6e..39ed211b1 100644
--- a/client/components/cards/checklists.jade
+++ b/client/components/cards/checklists.jade
@@ -69,6 +69,7 @@ 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")
@@ -91,6 +92,7 @@ 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
a.js-delete-checklist-item {{_ "delete"}}...
diff --git a/client/components/cards/minicard.css b/client/components/cards/minicard.css
index 58745e39f..8e6158826 100644
--- a/client/components/cards/minicard.css
+++ b/client/components/cards/minicard.css
@@ -229,6 +229,74 @@
background-color: #ff9999;
}
+/* Date status colors for minicards - matching cardDate.css */
+.minicard .card-date.overdue {
+ background-color: #ff4444 !important; /* Red for overdue */
+ color: #fff !important;
+}
+.minicard .card-date.overdue:hover,
+.minicard .card-date.overdue.is-active {
+ background-color: #cc3333 !important;
+}
+
+.minicard .card-date.due-soon {
+ background-color: #ffaa00 !important; /* Amber for due soon */
+ color: #000 !important;
+}
+.minicard .card-date.due-soon:hover,
+.minicard .card-date.due-soon.is-active {
+ background-color: #e69900 !important;
+}
+
+.minicard .card-date.not-due {
+ /* No special background - uses default date type colors */
+}
+
+.minicard .card-date.current {
+ background-color: #5ba639 !important; /* Green for current/active */
+ color: #fff !important;
+}
+.minicard .card-date.current:hover,
+.minicard .card-date.current.is-active {
+ background-color: #46802c !important;
+}
+
+.minicard .card-date.completed {
+ background-color: #90ee90 !important; /* Light green for completed */
+ color: #000 !important;
+}
+.minicard .card-date.completed:hover,
+.minicard .card-date.completed.is-active {
+ background-color: #7dd87d !important;
+}
+
+.minicard .card-date.completed-early {
+ background-color: #4caf50 !important; /* Green for completed early */
+ color: #fff !important;
+}
+.minicard .card-date.completed-early:hover,
+.minicard .card-date.completed-early.is-active {
+ background-color: #45a049 !important;
+}
+
+.minicard .card-date.completed-late {
+ background-color: #ff9800 !important; /* Orange for completed late */
+ color: #fff !important;
+}
+.minicard .card-date.completed-late:hover,
+.minicard .card-date.completed-late.is-active {
+ background-color: #f57c00 !important;
+}
+
+.minicard .card-date.completed-on-time {
+ background-color: #2196f3 !important; /* Blue for completed on time */
+ color: #fff !important;
+}
+.minicard .card-date.completed-on-time:hover,
+.minicard .card-date.completed-on-time.is-active {
+ background-color: #1976d2 !important;
+}
+
/* Font Awesome icons in minicard dates */
.minicard .card-date i.fa {
margin-right: 0.3vw;
diff --git a/client/components/cards/minicard.jade b/client/components/cards/minicard.jade
index 43c8db9bd..b36af1ceb 100644
--- a/client/components/cards/minicard.jade
+++ b/client/components/cards/minicard.jade
@@ -5,6 +5,7 @@ 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
@@ -141,7 +142,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
@@ -149,36 +150,36 @@ 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-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 currentBoard.allowsDescriptionTextOnMinicard
if getDescription
diff --git a/client/components/import/import.jade b/client/components/import/import.jade
index 7b55dadbd..ed42fe44b 100644
--- a/client/components/import/import.jade
+++ b/client/components/import/import.jade
@@ -56,17 +56,17 @@ template(name="importMapMembersAddPopup")
p
| {{_ 'import-user-select'}}
.js-map-member
- +EasySearch.Input(index=searchIndex)
+ input.js-search-member-input(type="text" placeholder="{{_ 'search-users'}}")
ul.pop-over-list
- +EasySearch.Each(index=searchIndex)
+ each searchResults
li.item.js-member-item
- a.name.js-select-import(title="{{profile.fullname}} ({{username}})" data-id="{{__originalId}}")
- +userAvatar(userId=__originalId)
+ a.name.js-select-import(title="{{profile.fullname}} ({{username}})" data-id="{{_id}}")
+ +userAvatar(userId=_id)
span.full-name
= profile.fullname
| ({{username}})
- +EasySearch.IfSearching(index=searchIndex)
+ if searching.get
+spinner
- +EasySearch.IfNoResults(index=searchIndex)
+ if noResults.get
.manage-member-section
p.quiet {{_ 'no-results'}}
diff --git a/client/components/import/import.js b/client/components/import/import.js
index 4d4ba7fa7..757b55e41 100644
--- a/client/components/import/import.js
+++ b/client/components/import/import.js
@@ -311,6 +311,73 @@ 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({
- searchIndex: () => UserSearchIndex,
+ searchResults() {
+ return importMemberPopupState.searchResults.get();
+ },
+ searching() {
+ return importMemberPopupState.searching;
+ },
+ noResults() {
+ return importMemberPopupState.noResults;
+ }
})
diff --git a/client/components/lists/list.css b/client/components/lists/list.css
index 7c238efcd..77e78de29 100644
--- a/client/components/lists/list.css
+++ b/client/components/lists/list.css
@@ -378,9 +378,6 @@ 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;
@@ -644,17 +641,22 @@ body.list-resizing-active * {
.mini-list.mobile-view {
flex: 0 0 60px;
height: auto;
- width: 100%;
- min-width: 100%;
+ width: 100vw;
+ max-width: 100vw;
+ min-width: 100vw;
border-left: 0px !important;
border-bottom: 1px solid #ccc;
+ display: block !important;
}
.list.mobile-view {
- display: contents;
+ display: block !important;
flex-basis: auto;
- width: 100%;
- min-width: 100%;
+ width: 100vw;
+ max-width: 100vw;
+ min-width: 100vw;
border-left: 0px !important;
+ margin: 0 !important;
+ padding: 0 !important;
}
.list.mobile-view:first-child {
margin-left: 0px;
@@ -662,9 +664,11 @@ body.list-resizing-active * {
.list.mobile-view.ui-sortable-helper {
flex: 0 0 60px;
height: 60px;
- width: 100%;
+ width: 100vw;
+ max-width: 100vw;
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;
@@ -672,14 +676,17 @@ body.list-resizing-active * {
.list.mobile-view.placeholder {
flex: 0 0 60px;
height: 60px;
- width: 100%;
+ width: 100vw;
+ max-width: 100vw;
border-left: 0px !important;
border-bottom: 1px solid #ccc;
+ display: block !important;
}
.list.mobile-view .list-body {
padding: 15px 19px;
- width: 100%;
- min-width: 100%;
+ width: 100vw;
+ max-width: 100vw;
+ min-width: 100vw;
}
.list.mobile-view .list-header {
/*Updated padding values for mobile devices, this should fix text grouping issue*/
@@ -688,8 +695,9 @@ body.list-resizing-active * {
min-height: 30px;
margin-top: 10px;
align-items: center;
- width: 100%;
- min-width: 100%;
+ width: 100vw;
+ max-width: 100vw;
+ min-width: 100vw;
/* Force grid layout for iPhone */
display: grid !important;
grid-template-columns: 30px 1fr auto auto !important;
@@ -770,17 +778,22 @@ body.list-resizing-active * {
.mini-list {
flex: 0 0 60px;
height: auto;
- width: 100%;
- min-width: 100%;
+ width: 100vw;
+ max-width: 100vw;
+ min-width: 100vw;
border-left: 0px !important;
border-bottom: 1px solid #ccc;
+ display: block !important;
}
.list {
- display: contents;
+ display: block !important;
flex-basis: auto;
- width: 100%;
- min-width: 100%;
+ width: 100vw;
+ max-width: 100vw;
+ min-width: 100vw;
border-left: 0px !important;
+ margin: 0 !important;
+ padding: 0 !important;
}
.list:first-child {
margin-left: 0px;
@@ -788,9 +801,11 @@ body.list-resizing-active * {
.list.ui-sortable-helper {
flex: 0 0 60px;
height: 60px;
- width: 100%;
+ width: 100vw;
+ max-width: 100vw;
border-left: 0px !important;
border-bottom: 1px solid #ccc;
+ display: block !important;
}
.list.ui-sortable-helper .list-header.ui-sortable-handle {
cursor: grabbing;
@@ -798,14 +813,17 @@ body.list-resizing-active * {
.list.placeholder {
flex: 0 0 60px;
height: 60px;
- width: 100%;
+ width: 100vw;
+ max-width: 100vw;
border-left: 0px !important;
border-bottom: 1px solid #ccc;
+ display: block !important;
}
.list-body {
padding: 15px 19px;
- width: 100%;
- min-width: 100%;
+ width: 100vw;
+ max-width: 100vw;
+ min-width: 100vw;
}
.list-header {
/*Updated padding values for mobile devices, this should fix text grouping issue*/
@@ -814,8 +832,9 @@ body.list-resizing-active * {
min-height: 30px;
margin-top: 10px;
align-items: center;
- width: 100%;
- min-width: 100%;
+ width: 100vw;
+ max-width: 100vw;
+ min-width: 100vw;
}
.list-header .list-header-left-icon {
padding: 7px;
diff --git a/client/components/lists/listHeader.jade b/client/components/lists/listHeader.jade
index df3c31f51..160be7b11 100644
--- a/client/components/lists/listHeader.jade
+++ b/client/components/lists/listHeader.jade
@@ -55,7 +55,8 @@ template(name="listHeader")
a.js-open-list-menu(title="{{_ 'listActionPopup-title'}}") ☰
else
a.list-header-menu-icon.js-select-list ▶️
- a.list-header-handle.handle.js-list-handle ↕️
+ unless currentUser.isWorker
+ a.list-header-handle.handle.js-list-handle ↕️
else if currentUser.isBoardMember
if isWatching
i.list-header-watch-icon | 👁️
@@ -72,7 +73,8 @@ template(name="listHeader")
a.js-open-list-menu(title="{{_ 'listActionPopup-title'}}") ☰
if currentUser.isBoardMember
unless currentUser.isCommentOnly
- a.list-header-handle.handle.js-list-handle ↕️
+ unless currentUser.isWorker
+ a.list-header-handle.handle.js-list-handle ↕️
template(name="editListTitleForm")
.list-composer
diff --git a/client/components/main/dueCards.jade b/client/components/main/dueCards.jade
index 09480be23..f482c9233 100644
--- a/client/components/main/dueCards.jade
+++ b/client/components/main/dueCards.jade
@@ -32,7 +32,16 @@ template(name="dueCards")
span.global-search-error-messages
= msg
else
- +resultsPaged(this)
+ .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 9909b5f97..f17bc9a74 100644
--- a/client/components/main/dueCards.js
+++ b/client/components/main/dueCards.js
@@ -1,13 +1,6 @@
import { ReactiveCache } from '/imports/reactiveCache';
-import { CardSearchPagedComponent } from '../../lib/cardSearch';
-import {
- OPERATOR_HAS,
- OPERATOR_SORT,
- OPERATOR_USER,
- ORDER_ASCENDING,
- PREDICATE_DUE_AT,
-} from '../../../config/search-const';
-import { QueryParams } from '../../../config/query-classes';
+import { BlazeComponent } from 'meteor/peerlibrary:blaze-components';
+import { TAPi18n } from '/imports/i18n';
// const subManager = new SubsManager();
@@ -31,6 +24,47 @@ Template.dueCards.helpers({
userId() {
return Meteor.userId();
},
+ dueCardsList() {
+ const component = BlazeComponent.getComponentForElement(this.firstNode);
+ if (component && component.dueCardsList) {
+ return component.dueCardsList();
+ }
+ return [];
+ },
+ hasResults() {
+ const component = BlazeComponent.getComponentForElement(this.firstNode);
+ if (component && component.hasResults) {
+ return component.hasResults.get();
+ }
+ return false;
+ },
+ searching() {
+ const component = BlazeComponent.getComponentForElement(this.firstNode);
+ if (component && component.isLoading) {
+ return component.isLoading.get();
+ }
+ return true; // Show loading by default
+ },
+ hasQueryErrors() {
+ return false; // No longer using search, so always false
+ },
+ 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({
@@ -55,71 +89,50 @@ BlazeComponent.extendComponent({
},
}).register('dueCardsViewChangePopup');
-class DueCardsComponent extends CardSearchPagedComponent {
+class DueCardsComponent extends BlazeComponent {
onCreated() {
super.onCreated();
- // Add a small delay to ensure ReactiveCache is ready
- this.searchRetryCount = 0;
- this.maxRetries = 3;
+ this._cachedCards = null;
+ this._cachedTimestamp = null;
+ this.subscriptionHandle = null;
+ this.isLoading = new ReactiveVar(true);
+ this.hasResults = new ReactiveVar(false);
+ this.searching = new ReactiveVar(false);
- // Use a timeout to ensure the search runs after the component is fully initialized
- Meteor.setTimeout(() => {
- this.performSearch();
- }, 100);
- }
-
- performSearch() {
- if (process.env.DEBUG === 'true') {
- console.log('Performing due cards search, attempt:', this.searchRetryCount + 1);
- }
-
- // Check if user is authenticated
- const currentUser = ReactiveCache.getCurrentUser();
- if (!currentUser) {
- if (process.env.DEBUG === 'true') {
- console.log('User not authenticated, waiting...');
+ // Subscribe to the optimized due cards publication
+ this.autorun(() => {
+ const allUsers = this.dueCardsView() === 'all';
+ if (this.subscriptionHandle) {
+ this.subscriptionHandle.stop();
}
- Meteor.setTimeout(() => {
- this.performSearch();
- }, 1000);
- return;
- }
-
- if (process.env.DEBUG === 'true') {
- console.log('User authenticated:', currentUser.username);
- }
-
- const queryParams = new QueryParams();
- queryParams.addPredicate(OPERATOR_HAS, {
- field: PREDICATE_DUE_AT,
- exists: true,
- });
- // queryParams[OPERATOR_LIMIT] = 5;
- queryParams.addPredicate(OPERATOR_SORT, {
- name: PREDICATE_DUE_AT,
- order: ORDER_ASCENDING,
+ 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);
+ }
+ });
});
+ }
- // Note: User filtering is handled server-side based on board membership
- // The OPERATOR_USER filter is too restrictive as it only shows cards where
- // the user is assigned or a member of the card, not the board
- // if (Utils && Utils.dueCardsView && Utils.dueCardsView() !== 'all') {
- // const currentUser = ReactiveCache.getCurrentUser();
- // if (currentUser && currentUser.username) {
- // queryParams.addPredicate(OPERATOR_USER, currentUser.username);
- // }
- // }
-
- // Debug: Log the query parameters
- if (process.env.DEBUG === 'true') {
- console.log('Due cards query params:', queryParams.params);
- console.log('Due cards query text:', queryParams.text);
- console.log('Due cards has predicates:', queryParams.getPredicates('has'));
- console.log('Due cards sort predicates:', queryParams.getPredicates('sort'));
+ onDestroyed() {
+ super.onDestroyed();
+ if (this.subscriptionHandle) {
+ this.subscriptionHandle.stop();
}
-
- this.runGlobalSearch(queryParams);
}
dueCardsView() {
@@ -132,29 +145,106 @@ class DueCardsComponent extends CardSearchPagedComponent {
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() {
- const results = this.getResults();
- console.log('results:', results);
- const cards = [];
- if (results) {
- results.forEach(card => {
- cards.push(card);
+ // 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;
+ }
+
+ // Get cards directly from the subscription (already sorted by the publication)
+ const cards = ReactiveCache.getCards({
+ type: 'cardType-card',
+ archived: false,
+ 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;
});
}
- cards.sort((a, b) => {
- const x = a.dueAt === null ? new Date('2100-12-31') : a.dueAt;
- const y = b.dueAt === null ? new Date('2100-12-31') : b.dueAt;
+ if (process.env.DEBUG === 'true') {
+ console.log('dueCards client: filtered to', filteredCards.length, 'cards');
+ }
- if (x > y) return 1;
- else if (x < y) return -1;
+ // Cache the results for 5 seconds to avoid re-filtering on every render
+ this._cachedCards = filteredCards;
+ this._cachedTimestamp = Date.now();
- return 0;
- });
+ // Update reactive variables
+ this.hasResults.set(filteredCards && filteredCards.length > 0);
+ this.isLoading.set(false);
- // eslint-disable-next-line no-console
- console.log('cards:', cards);
- return cards;
+ return filteredCards;
}
}
diff --git a/client/components/main/header.jade b/client/components/main/header.jade
index b7e870dc2..1ac11f189 100644
--- a/client/components/main/header.jade
+++ b/client/components/main/header.jade
@@ -83,10 +83,6 @@ 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
diff --git a/client/components/main/popup.css b/client/components/main/popup.css
index 889c1eb4c..dafbd2576 100644
--- a/client/components/main/popup.css
+++ b/client/components/main/popup.css
@@ -93,6 +93,29 @@
max-height: inherit;
}
+/* Admin edit popups: use full height */
+.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="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="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;
+}
+
/* Ensure language popup list can scroll properly */
.pop-over .pop-over-list {
max-height: none;
@@ -270,6 +293,8 @@
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,
@@ -364,9 +389,6 @@
margin: 0;
visibility: hidden;
}
-.pop-over .quiet {
-/* padding: 6px 6px 4px;*/
-}
.pop-over.search-over {
background: #f0f0f0;
min-height: 14vh;
diff --git a/client/components/migrationProgress.css b/client/components/migrationProgress.css
index d44f4eda8..f3b9a45d4 100644
--- a/client/components/migrationProgress.css
+++ b/client/components/migrationProgress.css
@@ -1,38 +1,33 @@
/* Migration Progress Styles */
-.migration-overlay {
+.migration-progress-overlay {
position: fixed;
top: 0;
left: 0;
- width: 100%;
- height: 100%;
- background-color: rgba(0, 0, 0, 0.8);
- z-index: 10000;
- display: none;
+ right: 0;
+ bottom: 0;
+ background: rgba(0, 0, 0, 0.7);
+ z-index: 9999;
+ display: flex;
align-items: center;
justify-content: center;
- overflow-y: auto;
+ backdrop-filter: blur(2px);
}
-.migration-overlay.active {
- display: flex;
-}
-
-.migration-modal {
+.migration-progress-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;
+ 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: slideInScale 0.4s ease-out;
- margin: 20px;
+ animation: migrationModalSlideIn 0.3s ease-out;
}
-@keyframes slideInScale {
+@keyframes migrationModalSlideIn {
from {
opacity: 0;
- transform: translateY(-30px) scale(0.95);
+ transform: translateY(-20px) scale(0.95);
}
to {
opacity: 1;
@@ -40,333 +35,235 @@
}
}
-.migration-header {
- padding: 24px 32px 20px;
- border-bottom: 2px solid #e0e0e0;
- text-align: center;
+.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-header h3 {
- margin: 0 0 8px 0;
- font-size: 24px;
+.migration-progress-title {
+ margin: 0;
+ font-size: 18px;
font-weight: 600;
}
-.migration-header h3 i {
- margin-right: 12px;
- color: #FFD700;
-}
-
-.migration-header p {
- margin: 0;
+.migration-progress-close {
+ cursor: pointer;
font-size: 16px;
- opacity: 0.9;
+ opacity: 0.8;
+ transition: opacity 0.2s ease;
}
-.migration-content {
- padding: 24px 32px;
- max-height: 60vh;
- overflow-y: auto;
+.migration-progress-close:hover {
+ opacity: 1;
}
-.migration-overview {
- margin-bottom: 32px;
- padding: 20px;
- background: #f8f9fa;
- border-radius: 8px;
- border-left: 4px solid #667eea;
+.migration-progress-content {
+ padding: 30px;
}
-.overall-progress {
- margin-bottom: 20px;
+.migration-progress-overall {
+ margin-bottom: 25px;
}
-.progress-bar {
- width: 100%;
- height: 12px;
- background-color: #e0e0e0;
- border-radius: 6px;
- overflow: hidden;
+.migration-progress-overall-label {
+ font-weight: 600;
+ color: #333;
margin-bottom: 8px;
- position: relative;
+ font-size: 14px;
}
-.progress-fill {
+.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%;
- background: linear-gradient(90deg, #667eea, #764ba2);
- border-radius: 6px;
+ border-radius: 10px;
transition: width 0.3s ease;
position: relative;
}
-.progress-fill::after {
+.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.4),
- transparent
- );
- animation: shimmer 2s infinite;
+ background: linear-gradient(90deg, transparent, rgba(255,255,255,0.3), transparent);
+ animation: migrationProgressShimmer 2s infinite;
}
-@keyframes shimmer {
- 0% {
- transform: translateX(-100%);
- }
- 100% {
- transform: translateX(100%);
- }
+@keyframes migrationProgressShimmer {
+ 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 {
+.migration-progress-overall-percentage {
text-align: right;
- min-width: 40px;
-}
-
-.step-progress .progress-text {
font-size: 12px;
+ color: #666;
font-weight: 600;
}
-.step-progress-bar {
- width: 100%;
- height: 4px;
- background-color: #e0e0e0;
- border-radius: 2px;
- overflow: hidden;
- margin-top: 8px;
+.migration-progress-current-step {
+ margin-bottom: 25px;
}
-.step-progress-bar .progress-fill {
+.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%;
- background: linear-gradient(90deg, #667eea, #764ba2);
- border-radius: 2px;
+ border-radius: 8px;
transition: width 0.3s ease;
}
-.migration-status {
- text-align: center;
- color: #333;
- font-size: 16px;
- background-color: #e3f2fd;
- padding: 12px 16px;
+.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: 1px solid #bbdefb;
- margin-bottom: 16px;
+ border-left: 4px solid #007bff;
}
-.migration-status i {
- margin-right: 8px;
- color: #2196f3;
+.migration-progress-status-label {
+ font-weight: 600;
+ color: #333;
+ margin-bottom: 5px;
+ font-size: 13px;
}
-.migration-footer {
- padding: 16px 32px 24px;
- border-top: 1px solid #e0e0e0;
- background-color: #f8f9fa;
+.migration-progress-status-text {
+ color: #555;
+ font-size: 14px;
+ line-height: 1.4;
}
-.migration-info {
+.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;
- 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;
+ font-style: italic;
}
/* Responsive design */
-@media (max-width: 768px) {
- .migration-modal {
- width: 98%;
- margin: 10px;
+@media (max-width: 600px) {
+ .migration-progress-modal {
+ width: 95%;
+ margin: 20px;
}
- .migration-header,
- .migration-content,
- .migration-footer {
- padding-left: 16px;
- padding-right: 16px;
+ .migration-progress-content {
+ padding: 20px;
}
- .migration-header h3 {
- font-size: 20px;
+ .migration-progress-header {
+ padding: 15px;
}
- .step-header {
- flex-direction: column;
- align-items: flex-start;
- }
-
- .step-progress {
- text-align: left;
- margin-top: 8px;
- }
-
- .steps-list {
- max-height: 200px;
+ .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;
+ }
+}
\ No newline at end of file
diff --git a/client/components/migrationProgress.jade b/client/components/migrationProgress.jade
index 274ea4621..250e20920 100644
--- a/client/components/migrationProgress.jade
+++ b/client/components/migrationProgress.jade
@@ -1,63 +1,43 @@
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}}
+ if isMigrating
+ .migration-progress-overlay
+ .migration-progress-modal
+ .migration-progress-header
+ h3.migration-progress-title
+ | 🔄 Board Migration in Progress
+ .migration-progress-close.js-close-migration-progress
+ | ❌
- .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-progress-content
+ .migration-progress-overall
+ .migration-progress-overall-label
+ | Overall Progress: {{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
+ | 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
+ | Status:
+ .migration-progress-status-text
+ | {{stepStatus}}
+
+ if stepDetailsFormatted
+ .migration-progress-details
+ .migration-progress-details-label
+ | Details:
+ .migration-progress-details-text
+ | {{stepDetailsFormatted}}
- .migration-status
- | ℹ️
- | {{migrationStatus}}
-
- .migration-footer
- .migration-info
- | 💡
- | {{_ 'migration-info-text'}}
- .migration-warning
- | ⚠️
- | {{_ 'migration-warning-text'}}
+ .migration-progress-footer
+ .migration-progress-note
+ | Please wait while we migrate your board to the latest structure...
\ No newline at end of file
diff --git a/client/components/migrationProgress.js b/client/components/migrationProgress.js
index 83a05ea36..7c4064d39 100644
--- a/client/components/migrationProgress.js
+++ b/client/components/migrationProgress.js
@@ -1,54 +1,212 @@
-import { Template } from 'meteor/templating';
-import {
- migrationManager,
- isMigrating,
- migrationProgress,
- migrationStatus,
- migrationCurrentStep,
- migrationEstimatedTime,
- migrationSteps
-} from '/client/lib/migrationManager';
+/**
+ * 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();
},
-
- migrationProgress() {
+
+ overallProgress() {
return migrationProgress.get();
},
-
- migrationStatus() {
+
+ overallStatus() {
return migrationStatus.get();
},
-
- migrationCurrentStep() {
+
+ currentStep() {
return migrationCurrentStep.get();
},
-
- migrationEstimatedTime() {
- return migrationEstimatedTime.get();
+
+ totalSteps() {
+ return migrationTotalSteps.get();
},
-
- migrationSteps() {
- const steps = migrationSteps.get();
- const currentStep = migrationCurrentStep.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 '';
- return steps.map(step => ({
- ...step,
- isCurrentStep: step.name === currentStep
- }));
+ // 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.migrationProgress.onCreated(function() {
- // Subscribe to migration state changes
- this.autorun(() => {
- isMigrating.get();
- migrationProgress.get();
- migrationStatus.get();
- migrationCurrentStep.get();
- migrationEstimatedTime.get();
- migrationSteps.get();
- });
-});
+// 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.css b/client/components/settings/peopleBody.css
index 5bbd70e96..bb529b2d2 100644
--- a/client/components/settings/peopleBody.css
+++ b/client/components/settings/peopleBody.css
@@ -71,6 +71,13 @@ table tr:nth-child(even) {
left: 0 !important;
display: block !important;
}
+
+/* Make checkbox column fit content */
+table th:first-child,
+table td:first-child {
+ width: auto;
+ min-width: auto;
+}
#divAddOrRemoveTeam {
background: #008000;
display: none;
@@ -141,7 +148,7 @@ table tr:nth-child(even) {
}
.account-active-status {
- width: 20px;
+ width: auto;
text-align: center;
}
@@ -170,7 +177,7 @@ table tr:nth-child(even) {
}
.account-status {
- width: 20px;
+ width: auto;
text-align: center;
}
diff --git a/client/components/settings/peopleBody.jade b/client/components/settings/peopleBody.jade
index bd5641067..0aa9a4dba 100644
--- a/client/components/settings/peopleBody.jade
+++ b/client/components/settings/peopleBody.jade
@@ -46,6 +46,7 @@ template(name="people")
option(value="locked") {{_ 'admin-people-filter-locked'}}
option(value="active") {{_ 'admin-people-filter-active'}}
option(value="inactive") {{_ 'admin-people-filter-inactive'}}
+ option(value="admin") Admin
button#unlockAllUsers.unlock-all-btn
| 🔓
| {{_ 'accounts-lockout-unlock-all'}}
@@ -57,7 +58,7 @@ template(name="people")
| {{_ 'add'}} / {{_ 'delete'}} {{_ 'teams'}}
else if lockedUsersSetting.get
span
- | 🔒.text-red
+ span.text-red 🔒
unless isMiniScreen
| {{_ 'accounts-lockout-locked-users'}}
@@ -78,7 +79,7 @@ template(name="people")
| {{_ 'people'}}
li
a.js-locked-users-menu(data-id="locked-users-setting")
- | 🔒.text-red
+ span.text-red 🔒
| {{_ 'accounts-lockout-locked-users'}}
.main-body
if loading.get
@@ -100,7 +101,6 @@ template(name="orgGeneral")
th {{_ 'displayName'}}
th {{_ 'description'}}
th {{_ 'shortName'}}
- th {{_ 'autoAddUsersWithDomainName'}}
th {{_ 'website'}}
th {{_ 'createdAt'}}
th {{_ 'active'}}
@@ -140,16 +140,9 @@ template(name="peopleGeneral")
th {{_ 'admin-people-active-status'}}
th {{_ 'username'}}
th {{_ 'fullname'}}
- th {{_ 'initials'}}
th {{_ 'admin'}}
th {{_ 'email'}}
- th {{_ 'verified'}}
th {{_ 'createdAt'}}
- th {{_ 'active'}}
- th {{_ 'authentication-method'}}
- th {{_ 'import-usernames'}}
- th {{_ 'organizations'}}
- th {{_ 'teams'}}
th
+newUserRow
tbody
@@ -190,10 +183,6 @@ template(name="orgRow")
td {{ orgData.orgShortName }}
else
td {{ orgData.orgShortName }}
- if orgData.orgIsActive
- td {{ orgData.orgAutoAddUsersWithDomainName }}
- else
- td {{ orgData.orgAutoAddUsersWithDomainName }}
if orgData.orgIsActive
td {{ orgData.orgWebsite }}
else
@@ -258,14 +247,14 @@ template(name="peopleRow")
input.selectUserChkBox(type="checkbox", id="{{userData._id}}")
td.account-status
if isUserLocked
- | 🔒.text-red.js-toggle-lock-status(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
- | 🔓.text-green.js-toggle-lock-status(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
- | 🚫.text-red.js-toggle-active-status(data-user-id=userData._id, data-is-active="false", title="{{_ 'admin-people-user-inactive'}}")
+ span.text-red.js-toggle-active-status(data-user-id=userData._id, data-is-active="false", title="{{_ 'admin-people-user-inactive'}}") 🚫
else
- | ✅.text-green.js-toggle-active-status(data-user-id=userData._id, data-is-active="true", title="{{_ 'admin-people-user-active'}}")
+ span.text-green.js-toggle-active-status(data-user-id=userData._id, data-is-active="true", title="{{_ 'admin-people-user-active'}}") ✅
if userData.loginDisabled
td.username {{ userData.username }}
else if isUserLocked
@@ -276,10 +265,6 @@ template(name="peopleRow")
td {{ userData.profile.fullname }}
else
td {{ userData.profile.fullname }}
- if userData.loginDisabled
- td {{ userData.profile.initials }}
- else
- td {{ userData.profile.initials }}
if userData.loginDisabled
td
if userData.isAdmin
@@ -296,43 +281,10 @@ template(name="peopleRow")
td {{ userData.emails.[0].address }}
else
td {{ userData.emails.[0].address }}
- if userData.loginDisabled
- td
- if userData.emails.[0].verified
- | {{_ 'yes'}}
- else
- | {{_ 'no'}}
- else
- td
- if userData.emails.[0].verified
- | {{_ 'yes'}}
- else
- | {{_ 'no'}}
if userData.loginDisabled
td {{ moment userData.createdAt 'LLL' }}
else
td {{ moment userData.createdAt 'LLL' }}
- td
- if userData.loginDisabled
- | {{_ 'no'}}
- else
- | {{_ 'yes'}}
- if userData.loginDisabled
- td {{_ userData.authenticationMethod }}
- else
- td {{_ userData.authenticationMethod }}
- if userData.loginDisabled
- td {{ userData.importUsernamesString }}
- else
- td {{ userData.importUsernamesString }}
- if userData.loginDisabled
- td {{ userData.orgsUserBelongs }}
- else
- td {{ userData.orgsUserBelongs }}
- if userData.loginDisabled
- td {{ userData.teamsUserBelongs }}
- else
- td {{ userData.teamsUserBelongs }}
td
a.edit-user
| ✏️
@@ -448,8 +400,8 @@ template(name="editUserPopup")
option(value="{{value}}") {{_ value}}
label
| {{_ 'organizations'}}
- | ➕#addUserOrg
- | ➖#removeUserOrg
+ span#addUserOrg ➕
+ span#removeUserOrg ➖
select.js-orgs#jsOrgs
option(value="-1") {{_ 'organizations'}} :
each value in orgsDatas
@@ -458,8 +410,8 @@ template(name="editUserPopup")
input#jsUserOrgIdsInPut.js-userOrgIds.hide(type="hidden" value=user.orgIdsUserBelongs)
label
| {{_ 'teams'}}
- | ➕#addUserTeam
- | ➖#removeUserTeam
+ span#addUserTeam ➕
+ span#removeUserTeam ➖
select.js-teams#jsTeams
option(value="-1") {{_ 'teams'}} :
each value in teamsDatas
@@ -591,8 +543,8 @@ template(name="newUserPopup")
option(value="{{value}}") {{_ value}}
label
| {{_ 'organizations'}}
- | ➕#addUserOrgNewUser
- | ➖#removeUserOrgNewUser
+ span#addUserOrgNewUser ➕
+ span#removeUserOrgNewUser ➖
select.js-orgsNewUser#jsOrgsNewUser
option(value="-1") {{_ 'organizations'}} :
each value in orgsDatas
@@ -601,8 +553,8 @@ template(name="newUserPopup")
input#jsUserOrgIdsInPutNewUser.js-userOrgIdsNewUser.hide(type="text" value=user.orgIdsUserBelongs)
label
| {{_ 'teams'}}
- | ➕#addUserTeamNewUser
- | ➖#removeUserTeamNewUser
+ span#addUserTeamNewUser ➕
+ span#removeUserTeamNewUser ➖
select.js-teamsNewUser#jsTeamsNewUser
option(value="-1") {{_ 'teams'}} :
each value in teamsDatas
diff --git a/client/components/settings/peopleBody.js b/client/components/settings/peopleBody.js
index 622155d61..9abaf7ff3 100644
--- a/client/components/settings/peopleBody.js
+++ b/client/components/settings/peopleBody.js
@@ -172,6 +172,10 @@ BlazeComponent.extendComponent({
// Show only inactive users (loginDisabled is true)
query['loginDisabled'] = true;
break;
+ case 'admin':
+ // Show only admin users (isAdmin is true)
+ query['isAdmin'] = true;
+ break;
case 'all':
default:
// Show all users, no additional filter
diff --git a/client/components/sidebar/sidebar.css b/client/components/sidebar/sidebar.css
index 831719f36..7867aec6d 100644
--- a/client/components/sidebar/sidebar.css
+++ b/client/components/sidebar/sidebar.css
@@ -48,6 +48,59 @@
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;
+}
+
+/* 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;
diff --git a/client/components/sidebar/sidebar.jade b/client/components/sidebar/sidebar.jade
index d63ea9d98..e5e90e1a5 100644
--- a/client/components/sidebar/sidebar.jade
+++ b/client/components/sidebar/sidebar.jade
@@ -34,32 +34,26 @@ 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'}}
- .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")
+ a.flex.js-toggle-show-activities(title="{{_ 'show-activities'}}")
+ span {{#if showActivities}}✅{{else}}⬜{{/if}}
+ span {{_ 'show-activities'}}
+activities(mode="board")
template(name="membersWidget")
@@ -185,165 +179,282 @@ template(name="boardInfoOnMyBoardsPopup")
unless currentSetting.hideCardCounterList
div.check-div
a.flex.js-field-has-cardcounterlist(class="{{#if allowsCardCounterList}}is-checked{{/if}}")
- .materialCheckBox(class="{{#if allowsCardCounterList}}is-checked{{/if}}")
+ span {{#if allowsCardCounterList}}✅{{else}}⬜{{/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}}")
- .materialCheckBox(class="{{#if allowsBoardMemberList}}is-checked{{/if}}")
+ span {{#if allowsBoardMemberList}}✅{{else}}⬜{{/if}}
span
| ⏳
| {{_ 'show-board_members-avatar'}}
template(name="boardCardSettingsPopup")
form.board-card-settings
- 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}}")
+ .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
span
| 🚪
| {{_ 'card-received'}}
- div.check-div
- a.flex.js-field-has-startdate(class="{{#if allowsStartDate}}is-checked{{/if}}")
- .materialCheckBox(class="{{#if allowsStartDate}}is-checked{{/if}}")
+ .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
span
| ⏳
| {{_ 'card-start'}}
- div.check-div
- a.flex.js-field-has-duedate(class="{{#if allowsDueDate}}is-checked{{/if}}")
- .materialCheckBox(class="{{#if allowsDueDate}}is-checked{{/if}}")
+ .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
span
| 🚪
| {{_ 'card-due'}}
- div.check-div
- a.flex.js-field-has-enddate(class="{{#if allowsEndDate}}is-checked{{/if}}")
- .materialCheckBox(class="{{#if allowsEndDate}}is-checked{{/if}}")
+ .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
span
| ⏰
| {{_ 'card-end'}}
- div.check-div
- a.flex.js-field-has-members(class="{{#if allowsMembers}}is-checked{{/if}}")
- .materialCheckBox(class="{{#if allowsMembers}}is-checked{{/if}}")
+ .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
span
| 👥
| {{_ 'members'}}
- div.check-div
- a.flex.js-field-has-creator(class="{{#if allowsCreator}}is-checked{{/if}}")
- .materialCheckBox(class="{{#if allowsCreator}}is-checked{{/if}}")
+ .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
span
| 👤
| {{_ 'creator'}}
- div.check-div
- a.flex.js-field-has-creator-on-minicard(class="{{#if allowsCreatorOnMinicard}}is-checked{{/if}}")
- .materialCheckBox(class="{{#if allowsCreatorOnMinicard}}is-checked{{/if}}")
+ .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
span
| 👤
| {{_ 'creator-on-minicard'}}
- div.check-div
- a.flex.js-field-has-assignee(class="{{#if allowsAssignee}}is-checked{{/if}}")
- .materialCheckBox(class="{{#if allowsAssignee}}is-checked{{/if}}")
+ .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
span
| 👤
| {{_ 'assignee'}}
- div.check-div
- a.flex.js-field-has-assigned-by(class="{{#if allowsAssignedBy}}is-checked{{/if}}")
- .materialCheckBox(class="{{#if allowsAssignedBy}}is-checked{{/if}}")
+ .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
span
| 🛒
| {{_ 'assigned-by'}}
- div.check-div
- a.flex.js-field-has-requested-by(class="{{#if allowsRequestedBy}}is-checked{{/if}}")
- .materialCheckBox(class="{{#if allowsRequestedBy}}is-checked{{/if}}")
+ .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
span
| 👤➕
| {{_ 'requested-by'}}
- 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}}")
+ .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
span
| 🔢
| {{_ 'card-sorting-by-number'}}
- 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}}")
+ .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
span
| 🔢
| {{_ 'card-sorting-by-number-on-minicard'}}
- div.check-div
- a.flex.js-field-has-card-show-lists(class="{{#if allowsShowLists}}is-checked{{/if}}")
- .materialCheckBox(class="{{#if allowsShowLists}}is-checked{{/if}}")
+ .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
span
| 📋
| {{_ 'card-show-lists'}}
- div.check-div
- a.flex.js-field-has-labels(class="{{#if allowsLabels}}is-checked{{/if}}")
- .materialCheckBox(class="{{#if allowsLabels}}is-checked{{/if}}")
+ .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
span
| 🏷️
| {{_ 'labels'}}
- 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}}")
+ .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
span
| 📋
| {{_ 'card-show-lists-on-minicard'}}
- div.check-div
- a.flex.js-field-has-card-number(class="{{#if allowsCardNumber}}is-checked{{/if}}")
- .materialCheckBox(class="{{#if allowsCardNumber}}is-checked{{/if}}")
+ .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
span
| #️⃣
| {{_ 'card'}}
| {{_ 'number'}}
- div.check-div
- a.flex.js-field-has-description-title(class="{{#if allowsDescriptionTitle}}is-checked{{/if}}")
- .materialCheckBox(class="{{#if allowsDescriptionTitle}}is-checked{{/if}}")
+ .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
span
| 📝
| {{_ 'description'}}
| {{_ 'title'}}
- div.check-div
- a.flex.js-field-has-description-text(class="{{#if allowsDescriptionText}}is-checked{{/if}}")
- .materialCheckBox(class="{{#if allowsDescriptionText}}is-checked{{/if}}")
+ .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
span
| 📝
| {{_ 'description'}}
| {{_ 'custom-field-text'}}
- 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}}")
+ .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
span
| 📝
| {{_ 'description-on-minicard'}}
- div.check-div
- a.flex.js-field-has-checklists(class="{{#if allowsChecklists}}is-checked{{/if}}")
- .materialCheckBox(class="{{#if allowsChecklists}}is-checked{{/if}}")
+ .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
span
| ✅
| {{_ 'checklists'}}
- div.check-div
- a.flex.js-field-has-subtasks(class="{{#if allowsSubtasks}}is-checked{{/if}}")
- .materialCheckBox(class="{{#if allowsSubtasks}}is-checked{{/if}}")
+ .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
span
| 🌐
| {{_ 'subtasks'}}
- div.check-div
- a.flex.js-field-has-attachments(class="{{#if allowsAttachments}}is-checked{{/if}}")
- .materialCheckBox(class="{{#if allowsAttachments}}is-checked{{/if}}")
+ .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
span
| 📎
| {{_ 'attachments'}}
- 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}}")
+ .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
span
| 📎
| {{_ 'badge-attachment-on-minicard'}}
- 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}}")
+ .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
span
| 📖
| 🖼️
@@ -364,27 +475,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(class="{{#if $eq presentParentTask 'prefix-with-full-path'}}is-checked{{/if}}")
- .materialCheckBox(class="{{#if $eq presentParentTask 'prefix-with-full-path'}}is-checked{{/if}}")
+ 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}}
span {{_ 'prefix-with-full-path'}}
- 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}}")
+ 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}}
span {{_ 'prefix-with-parent'}}
- 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}}")
+ 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}}
span {{_ 'subtext-with-full-path'}}
- 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}}")
+ 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}}
span {{_ 'subtext-with-parent'}}
- 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}}")
+ 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}}
span {{_ 'no-parent'}}
div
hr
div.check-div
- a.flex.js-field-has-subtasks(class="{{#if allowsSubtasks}}is-checked{{/if}}")
- .materialCheckBox(class="{{#if allowsSubtasks}}is-checked{{/if}}")
+ a.flex.js-field-has-subtasks(title="{{_ 'show-subtasks-field'}}" class="{{#if allowsSubtasks}}is-checked{{/if}}")
+ span {{#if allowsSubtasks}}✅{{else}}⬜{{/if}}
span {{_ 'show-subtasks-field'}}
label
@@ -426,13 +537,18 @@ 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")
@@ -471,6 +587,10 @@ template(name="boardMenuPopup")
| 📦
| {{_ 'archived-items'}}
if currentUser.isBoardAdmin
+ li
+ a.js-open-migrations
+ | 🔧
+ | {{_ 'migrations'}}
li
a.js-change-board-color
| 🎨
@@ -511,6 +631,10 @@ 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
| ➡️📦
@@ -631,7 +755,7 @@ template(name="removeBoardTeamPopup")
template(name="addMemberPopup")
.js-search-member
- +EasySearch.Input(index=searchIndex)
+ input.js-search-member-input(type="text" placeholder="{{_ 'email-address'}}")
if loading.get
+spinner
@@ -639,25 +763,38 @@ template(name="addMemberPopup")
.warning {{_ error.get}}
else
ul.pop-over-list
- +EasySearch.Each(index=searchIndex)
+ each searchResults
li.item.js-member-item(class="{{#if isBoardMember}}disabled{{/if}}")
a.name.js-select-member(title="{{profile.fullname}} ({{username}})")
- +userAvatar(userId=__originalId)
+ +userAvatar(userId=_id)
span.full-name
= profile.fullname
| ({{username}})
if isBoardMember
.quiet ({{_ 'joined'}})
- +EasySearch.IfSearching(index=searchIndex)
+ if searching.get
+spinner
- +EasySearch.IfNoResults(index=searchIndex)
+ if noResults.get
.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
diff --git a/client/components/sidebar/sidebar.js b/client/components/sidebar/sidebar.js
index 9f1d9c5c1..5831e601a 100644
--- a/client/components/sidebar/sidebar.js
+++ b/client/components/sidebar/sidebar.js
@@ -13,6 +13,7 @@ const viewTitles = {
multiselection: 'multi-selection',
customFields: 'custom-fields',
archives: 'archives',
+ migrations: 'migrations',
};
BlazeComponent.extendComponent({
@@ -195,7 +196,7 @@ BlazeComponent.extendComponent({
events() {
return [
{
- 'click #toggleShowActivitiesBoard'() {
+ 'click .js-toggle-show-activities'() {
Utils.getCurrentBoard().toggleShowActivities();
},
},
@@ -271,10 +272,53 @@ Template.boardMenuPopup.events({
Sidebar.setView('archives');
Popup.back();
},
+ 'click .js-open-migrations'() {
+ Sidebar.setView('migrations');
+ Popup.back();
+ },
'click .js-change-board-color': Popup.open('boardChangeColor'),
'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();
@@ -822,7 +866,11 @@ BlazeComponent.extendComponent({
},
allowsSubtasks() {
- return this.currentBoard.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;
},
allowsReceivedDate() {
@@ -874,7 +922,11 @@ BlazeComponent.extendComponent({
},
presentParentTask() {
- let result = this.currentBoard.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;
if (result === null || result === undefined) {
result = 'no-parent';
}
@@ -886,19 +938,11 @@ BlazeComponent.extendComponent({
{
'click .js-field-has-subtasks'(evt) {
evt.preventDefault();
- 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,
- );
+ const newValue = !this.currentBoard.allowsSubtasks;
+ Boards.update(this.currentBoard._id, { $set: { allowsSubtasks: newValue } });
$('.js-field-deposit-board').prop(
'disabled',
- !this.currentBoard.allowsSubtasks,
+ !newValue,
);
},
'change .js-field-deposit-board'(evt) {
@@ -914,28 +958,13 @@ BlazeComponent.extendComponent({
evt.preventDefault();
},
'click .js-field-show-parent-in-minicard'(evt) {
- 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);
+ // 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 } });
+ }
evt.preventDefault();
},
},
@@ -949,115 +978,168 @@ BlazeComponent.extendComponent({
},
allowsReceivedDate() {
- return this.currentBoard.allowsReceivedDate;
+ const boardId = Session.get('currentBoard');
+ const currentBoard = ReactiveCache.getBoard(boardId);
+ return currentBoard ? currentBoard.allowsReceivedDate : false;
},
allowsStartDate() {
- return this.currentBoard.allowsStartDate;
+ const boardId = Session.get('currentBoard');
+ const currentBoard = ReactiveCache.getBoard(boardId);
+ return currentBoard ? currentBoard.allowsStartDate : false;
},
allowsDueDate() {
- return this.currentBoard.allowsDueDate;
+ const boardId = Session.get('currentBoard');
+ const currentBoard = ReactiveCache.getBoard(boardId);
+ return currentBoard ? currentBoard.allowsDueDate : false;
},
allowsEndDate() {
- return this.currentBoard.allowsEndDate;
+ const boardId = Session.get('currentBoard');
+ const currentBoard = ReactiveCache.getBoard(boardId);
+ return currentBoard ? currentBoard.allowsEndDate : false;
},
allowsSubtasks() {
- return this.currentBoard.allowsSubtasks;
+ const boardId = Session.get('currentBoard');
+ const currentBoard = ReactiveCache.getBoard(boardId);
+ return currentBoard ? currentBoard.allowsSubtasks : false;
},
allowsCreator() {
- return this.currentBoard.allowsCreator ?? false;
+ const boardId = Session.get('currentBoard');
+ const currentBoard = ReactiveCache.getBoard(boardId);
+ return currentBoard ? (currentBoard.allowsCreator ?? false) : false;
},
allowsCreatorOnMinicard() {
- return this.currentBoard.allowsCreatorOnMinicard ?? false;
+ const boardId = Session.get('currentBoard');
+ const currentBoard = ReactiveCache.getBoard(boardId);
+ return currentBoard ? (currentBoard.allowsCreatorOnMinicard ?? false) : false;
},
allowsMembers() {
- return this.currentBoard.allowsMembers;
+ const boardId = Session.get('currentBoard');
+ const currentBoard = ReactiveCache.getBoard(boardId);
+ return currentBoard ? currentBoard.allowsMembers : false;
},
allowsAssignee() {
- return this.currentBoard.allowsAssignee;
+ const boardId = Session.get('currentBoard');
+ const currentBoard = ReactiveCache.getBoard(boardId);
+ return currentBoard ? currentBoard.allowsAssignee : false;
},
allowsAssignedBy() {
- return this.currentBoard.allowsAssignedBy;
+ const boardId = Session.get('currentBoard');
+ const currentBoard = ReactiveCache.getBoard(boardId);
+ return currentBoard ? currentBoard.allowsAssignedBy : false;
},
allowsRequestedBy() {
- return this.currentBoard.allowsRequestedBy;
+ const boardId = Session.get('currentBoard');
+ const currentBoard = ReactiveCache.getBoard(boardId);
+ return currentBoard ? currentBoard.allowsRequestedBy : false;
},
allowsCardSortingByNumber() {
- return this.currentBoard.allowsCardSortingByNumber;
+ const boardId = Session.get('currentBoard');
+ const currentBoard = ReactiveCache.getBoard(boardId);
+ return currentBoard ? currentBoard.allowsCardSortingByNumber : false;
},
allowsShowLists() {
- return this.currentBoard.allowsShowLists;
+ const boardId = Session.get('currentBoard');
+ const currentBoard = ReactiveCache.getBoard(boardId);
+ return currentBoard ? currentBoard.allowsShowLists : false;
},
-
allowsLabels() {
- return this.currentBoard.allowsLabels;
+ const boardId = Session.get('currentBoard');
+ const currentBoard = ReactiveCache.getBoard(boardId);
+ return currentBoard ? currentBoard.allowsLabels : false;
},
allowsShowListsOnMinicard() {
- return this.currentBoard.allowsShowListsOnMinicard;
+ const boardId = Session.get('currentBoard');
+ const currentBoard = ReactiveCache.getBoard(boardId);
+ return currentBoard ? currentBoard.allowsShowListsOnMinicard : false;
},
allowsChecklists() {
- return this.currentBoard.allowsChecklists;
+ const boardId = Session.get('currentBoard');
+ const currentBoard = ReactiveCache.getBoard(boardId);
+ return currentBoard ? currentBoard.allowsChecklists : false;
},
allowsAttachments() {
- return this.currentBoard.allowsAttachments;
+ const boardId = Session.get('currentBoard');
+ const currentBoard = ReactiveCache.getBoard(boardId);
+ return currentBoard ? currentBoard.allowsAttachments : false;
},
allowsComments() {
- return this.currentBoard.allowsComments;
+ const boardId = Session.get('currentBoard');
+ const currentBoard = ReactiveCache.getBoard(boardId);
+ return currentBoard ? currentBoard.allowsComments : false;
},
allowsCardNumber() {
- return this.currentBoard.allowsCardNumber;
+ const boardId = Session.get('currentBoard');
+ const currentBoard = ReactiveCache.getBoard(boardId);
+ return currentBoard ? currentBoard.allowsCardNumber : false;
},
allowsDescriptionTitle() {
- return this.currentBoard.allowsDescriptionTitle;
+ const boardId = Session.get('currentBoard');
+ const currentBoard = ReactiveCache.getBoard(boardId);
+ return currentBoard ? currentBoard.allowsDescriptionTitle : false;
},
allowsDescriptionText() {
- return this.currentBoard.allowsDescriptionText;
+ const boardId = Session.get('currentBoard');
+ const currentBoard = ReactiveCache.getBoard(boardId);
+ return currentBoard ? currentBoard.allowsDescriptionText : false;
},
isBoardSelected() {
- return this.currentBoard.dateSettingsDefaultBoardID;
+ const boardId = Session.get('currentBoard');
+ const currentBoard = ReactiveCache.getBoard(boardId);
+ return currentBoard ? currentBoard.dateSettingsDefaultBoardID : false;
},
isNullBoardSelected() {
- return (
- this.currentBoard.dateSettingsDefaultBoardId === null ||
- this.currentBoard.dateSettingsDefaultBoardId === undefined
- );
+ const boardId = Session.get('currentBoard');
+ const currentBoard = ReactiveCache.getBoard(boardId);
+ return currentBoard ? (
+ currentBoard.dateSettingsDefaultBoardId === null ||
+ currentBoard.dateSettingsDefaultBoardId === undefined
+ ) : true;
},
allowsDescriptionTextOnMinicard() {
- return this.currentBoard.allowsDescriptionTextOnMinicard;
+ const boardId = Session.get('currentBoard');
+ const currentBoard = ReactiveCache.getBoard(boardId);
+ return currentBoard ? currentBoard.allowsDescriptionTextOnMinicard : false;
},
allowsCoverAttachmentOnMinicard() {
- return this.currentBoard.allowsCoverAttachmentOnMinicard;
+ const boardId = Session.get('currentBoard');
+ const currentBoard = ReactiveCache.getBoard(boardId);
+ return currentBoard ? currentBoard.allowsCoverAttachmentOnMinicard : false;
},
allowsBadgeAttachmentOnMinicard() {
- return this.currentBoard.allowsBadgeAttachmentOnMinicard;
+ const boardId = Session.get('currentBoard');
+ const currentBoard = ReactiveCache.getBoard(boardId);
+ return currentBoard ? currentBoard.allowsBadgeAttachmentOnMinicard : false;
},
allowsCardSortingByNumberOnMinicard() {
- return this.currentBoard.allowsCardSortingByNumberOnMinicard;
+ const boardId = Session.get('currentBoard');
+ const currentBoard = ReactiveCache.getBoard(boardId);
+ return currentBoard ? currentBoard.allowsCardSortingByNumberOnMinicard : false;
},
boards() {
@@ -1100,203 +1182,73 @@ BlazeComponent.extendComponent({
{
'click .js-field-has-receiveddate'(evt) {
evt.preventDefault();
- 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,
- );
+ const newValue = !this.currentBoard.allowsReceivedDate;
+ Boards.update(this.currentBoard._id, { $set: { allowsReceivedDate: newValue } });
},
'click .js-field-has-startdate'(evt) {
evt.preventDefault();
- 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,
- );
+ const newValue = !this.currentBoard.allowsStartDate;
+ Boards.update(this.currentBoard._id, { $set: { allowsStartDate: newValue } });
},
'click .js-field-has-enddate'(evt) {
evt.preventDefault();
- 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,
- );
+ const newValue = !this.currentBoard.allowsEndDate;
+ Boards.update(this.currentBoard._id, { $set: { allowsEndDate: newValue } });
},
'click .js-field-has-duedate'(evt) {
evt.preventDefault();
- 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,
- );
+ const newValue = !this.currentBoard.allowsDueDate;
+ Boards.update(this.currentBoard._id, { $set: { allowsDueDate: newValue } });
},
'click .js-field-has-subtasks'(evt) {
evt.preventDefault();
- 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,
- );
+ const newValue = !this.currentBoard.allowsSubtasks;
+ Boards.update(this.currentBoard._id, { $set: { allowsSubtasks: newValue } });
},
'click .js-field-has-creator'(evt) {
evt.preventDefault();
- 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,
- );
+ const newValue = !this.currentBoard.allowsCreator;
+ Boards.update(this.currentBoard._id, { $set: { allowsCreator: newValue } });
},
'click .js-field-has-creator-on-minicard'(evt) {
evt.preventDefault();
- 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,
- );
+ const newValue = !this.currentBoard.allowsCreatorOnMinicard;
+ Boards.update(this.currentBoard._id, { $set: { allowsCreatorOnMinicard: newValue } });
},
'click .js-field-has-members'(evt) {
evt.preventDefault();
- 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,
- );
+ const newValue = !this.currentBoard.allowsMembers;
+ Boards.update(this.currentBoard._id, { $set: { allowsMembers: newValue } });
},
'click .js-field-has-assignee'(evt) {
evt.preventDefault();
- 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,
- );
+ const newValue = !this.currentBoard.allowsAssignee;
+ Boards.update(this.currentBoard._id, { $set: { allowsAssignee: newValue } });
},
'click .js-field-has-assigned-by'(evt) {
evt.preventDefault();
- 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,
- );
+ const newValue = !this.currentBoard.allowsAssignedBy;
+ Boards.update(this.currentBoard._id, { $set: { allowsAssignedBy: newValue } });
},
'click .js-field-has-requested-by'(evt) {
evt.preventDefault();
- 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,
- );
+ const newValue = !this.currentBoard.allowsRequestedBy;
+ Boards.update(this.currentBoard._id, { $set: { allowsRequestedBy: newValue } });
},
'click .js-field-has-card-sorting-by-number'(evt) {
evt.preventDefault();
- 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,
- );
+ const newValue = !this.currentBoard.allowsCardSortingByNumber;
+ Boards.update(this.currentBoard._id, { $set: { allowsCardSortingByNumber: newValue } });
},
'click .js-field-has-card-show-lists'(evt) {
evt.preventDefault();
- 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,
- );
+ const newValue = !this.currentBoard.allowsShowLists;
+ Boards.update(this.currentBoard._id, { $set: { allowsShowLists: newValue } });
},
'click .js-field-has-labels'(evt) {
evt.preventDefault();
- 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,
- );
+ const newValue = !this.currentBoard.allowsLabels;
+ Boards.update(this.currentBoard._id, { $set: { allowsLabels: newValue } });
},
'click .js-field-has-card-show-lists-on-minicard'(evt) {
evt.preventDefault();
@@ -1492,19 +1444,27 @@ 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() {
- this.error = new ReactiveVar('');
- this.loading = new ReactiveVar(false);
+ // Use Session variables
+ this.searchTimeout = null;
},
onRendered() {
- this.find('.js-search-member input').focus();
+ this.find('.js-search-member-input').focus();
this.setLoading(false);
},
isBoardMember() {
- const userId = this.currentData().__originalId;
+ const userId = this.currentData()._id;
const user = ReactiveCache.getUser(userId);
return user && user.isBoardMember();
},
@@ -1514,15 +1474,35 @@ BlazeComponent.extendComponent({
},
setError(error) {
- this.error.set(error);
+ Session.set('addMemberPopup.error', error);
},
setLoading(w) {
- this.loading.set(w);
+ Session.set('addMemberPopup.loading', w);
},
isLoading() {
- return this.loading.get();
+ 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);
+ }
},
inviteUser(idNameEmail) {
@@ -1540,18 +1520,30 @@ BlazeComponent.extendComponent({
events() {
return [
{
- 'keyup input'() {
+ 'keyup .js-search-member-input'(event) {
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().__originalId;
+ const userId = this.currentData()._id;
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,7 +1554,35 @@ BlazeComponent.extendComponent({
}).register('addMemberPopup');
Template.addMemberPopup.helpers({
- searchIndex: () => UserSearchIndex,
+ 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') || [];
+ }
})
BlazeComponent.extendComponent({
diff --git a/client/components/sidebar/sidebarCustomFields.jade b/client/components/sidebar/sidebarCustomFields.jade
index 1cc270681..0d16559f8 100644
--- a/client/components/sidebar/sidebarCustomFields.jade
+++ b/client/components/sidebar/sidebarCustomFields.jade
@@ -95,3 +95,7 @@ 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/sidebarMigrations.jade b/client/components/sidebar/sidebarMigrations.jade
new file mode 100644
index 000000000..f5f7f08f8
--- /dev/null
+++ b/client/components/sidebar/sidebarMigrations.jade
@@ -0,0 +1,109 @@
+template(name='migrationsSidebar')
+ if currentUser.isBoardAdmin
+ .sidebar-migrations
+ h3
+ | 🔧
+ | {{_ 'migrations'}}
+ p.quiet {{_ 'migrations-description'}}
+
+ .migrations-list
+ h4 {{_ 'board-migrations'}}
+ .migration-item
+ a.js-run-migration(data-migration="comprehensive")
+ .migration-name
+ | {{_ 'comprehensive-board-migration'}}
+ .migration-status
+ if comprehensiveMigrationNeeded
+ span.badge.badge-warning {{_ 'migration-needed'}}
+ else
+ span.badge.badge-success {{_ 'migration-complete'}}
+
+ .migration-item
+ a.js-run-migration(data-migration="fixMissingLists")
+ .migration-name
+ | {{_ 'fix-missing-lists-migration'}}
+ .migration-status
+ if fixMissingListsNeeded
+ span.badge.badge-warning {{_ 'migration-needed'}}
+ else
+ span.badge.badge-success {{_ 'migration-complete'}}
+
+ .migration-item
+ a.js-run-migration(data-migration="deleteDuplicateEmptyLists")
+ .migration-name
+ | {{_ 'delete-duplicate-empty-lists-migration'}}
+ .migration-status
+ if deleteDuplicateEmptyListsNeeded
+ span.badge.badge-warning {{_ 'migration-needed'}}
+ else
+ span.badge.badge-success {{_ 'migration-complete'}}
+
+ .migration-item
+ a.js-run-migration(data-migration="restoreLostCards")
+ .migration-name
+ | {{_ 'restore-lost-cards-migration'}}
+ .migration-status
+ if restoreLostCardsNeeded
+ span.badge.badge-warning {{_ 'migration-needed'}}
+ else
+ span.badge.badge-success {{_ 'migration-complete'}}
+
+ .migration-item
+ a.js-run-migration(data-migration="restoreAllArchived")
+ .migration-name
+ | {{_ 'restore-all-archived-migration'}}
+ .migration-status
+ if restoreAllArchivedNeeded
+ span.badge.badge-warning {{_ 'migration-needed'}}
+ else
+ span.badge.badge-success {{_ 'migration-complete'}}
+
+ .migration-item
+ a.js-run-migration(data-migration="fixAvatarUrls")
+ .migration-name
+ | {{_ 'fix-avatar-urls-migration'}}
+ .migration-status
+ if fixAvatarUrlsNeeded
+ span.badge.badge-warning {{_ 'migration-needed'}}
+ else
+ span.badge.badge-success {{_ 'migration-complete'}}
+
+ .migration-item
+ a.js-run-migration(data-migration="fixAllFileUrls")
+ .migration-name
+ | {{_ 'fix-all-file-urls-migration'}}
+ .migration-status
+ if fixAllFileUrlsNeeded
+ span.badge.badge-warning {{_ 'migration-needed'}}
+ else
+ span.badge.badge-success {{_ 'migration-complete'}}
+ else
+ p.quiet {{_ 'migrations-admin-only'}}
+
+template(name='runComprehensiveMigrationPopup')
+ p {{_ 'run-comprehensive-migration-confirm'}}
+ button.js-confirm.primary.full(type="submit") {{_ 'run-migration'}}
+
+template(name='runFixMissingListsMigrationPopup')
+ p {{_ 'run-fix-missing-lists-migration-confirm'}}
+ button.js-confirm.primary.full(type="submit") {{_ 'run-migration'}}
+
+template(name='runDeleteDuplicateEmptyListsMigrationPopup')
+ p {{_ 'run-delete-duplicate-empty-lists-migration-confirm'}}
+ button.js-confirm.primary.full(type="submit") {{_ 'run-migration'}}
+
+template(name='runRestoreLostCardsMigrationPopup')
+ p {{_ 'run-restore-lost-cards-migration-confirm'}}
+ button.js-confirm.primary.full(type="submit") {{_ 'run-migration'}}
+
+template(name='runRestoreAllArchivedMigrationPopup')
+ p {{_ 'run-restore-all-archived-migration-confirm'}}
+ button.js-confirm.primary.full(type="submit") {{_ 'run-migration'}}
+
+template(name='runFixAvatarUrlsMigrationPopup')
+ p {{_ 'run-fix-avatar-urls-migration-confirm'}}
+ button.js-confirm.primary.full(type="submit") {{_ 'run-migration'}}
+
+template(name='runFixAllFileUrlsMigrationPopup')
+ p {{_ 'run-fix-all-file-urls-migration-confirm'}}
+ button.js-confirm.primary.full(type="submit") {{_ 'run-migration'}}
diff --git a/client/components/sidebar/sidebarMigrations.js b/client/components/sidebar/sidebarMigrations.js
new file mode 100644
index 000000000..89d3343ec
--- /dev/null
+++ b/client/components/sidebar/sidebarMigrations.js
@@ -0,0 +1,341 @@
+import { ReactiveCache } from '/imports/reactiveCache';
+import { TAPi18n } from '/imports/i18n';
+import { migrationProgressManager } from '/client/components/migrationProgress';
+
+BlazeComponent.extendComponent({
+ onCreated() {
+ this.migrationStatuses = new ReactiveVar({});
+ this.loadMigrationStatuses();
+ },
+
+ loadMigrationStatuses() {
+ const boardId = Session.get('currentBoard');
+ if (!boardId) return;
+
+ // Check comprehensive migration
+ Meteor.call('comprehensiveBoardMigration.needsMigration', boardId, (err, res) => {
+ if (!err) {
+ const statuses = this.migrationStatuses.get();
+ statuses.comprehensive = res;
+ this.migrationStatuses.set(statuses);
+ }
+ });
+
+ // Check fix missing lists migration
+ Meteor.call('fixMissingListsMigration.needsMigration', boardId, (err, res) => {
+ if (!err) {
+ const statuses = this.migrationStatuses.get();
+ statuses.fixMissingLists = res;
+ this.migrationStatuses.set(statuses);
+ }
+ });
+
+ // Check delete duplicate empty lists migration
+ Meteor.call('deleteDuplicateEmptyLists.needsMigration', boardId, (err, res) => {
+ if (!err) {
+ const statuses = this.migrationStatuses.get();
+ statuses.deleteDuplicateEmptyLists = res;
+ this.migrationStatuses.set(statuses);
+ }
+ });
+
+ // Check restore lost cards migration
+ Meteor.call('restoreLostCards.needsMigration', boardId, (err, res) => {
+ if (!err) {
+ const statuses = this.migrationStatuses.get();
+ statuses.restoreLostCards = res;
+ this.migrationStatuses.set(statuses);
+ }
+ });
+
+ // Check restore all archived migration
+ Meteor.call('restoreAllArchived.needsMigration', boardId, (err, res) => {
+ if (!err) {
+ const statuses = this.migrationStatuses.get();
+ statuses.restoreAllArchived = res;
+ this.migrationStatuses.set(statuses);
+ }
+ });
+
+ // Check fix avatar URLs migration (board-specific)
+ Meteor.call('fixAvatarUrls.needsMigration', boardId, (err, res) => {
+ if (!err) {
+ const statuses = this.migrationStatuses.get();
+ statuses.fixAvatarUrls = res;
+ this.migrationStatuses.set(statuses);
+ }
+ });
+
+ // Check fix all file URLs migration (board-specific)
+ Meteor.call('fixAllFileUrls.needsMigration', boardId, (err, res) => {
+ if (!err) {
+ const statuses = this.migrationStatuses.get();
+ statuses.fixAllFileUrls = res;
+ this.migrationStatuses.set(statuses);
+ }
+ });
+ },
+
+ comprehensiveMigrationNeeded() {
+ return this.migrationStatuses.get().comprehensive === true;
+ },
+
+ fixMissingListsNeeded() {
+ return this.migrationStatuses.get().fixMissingLists === true;
+ },
+
+ deleteDuplicateEmptyListsNeeded() {
+ return this.migrationStatuses.get().deleteDuplicateEmptyLists === true;
+ },
+
+ restoreLostCardsNeeded() {
+ return this.migrationStatuses.get().restoreLostCards === true;
+ },
+
+ restoreAllArchivedNeeded() {
+ return this.migrationStatuses.get().restoreAllArchived === true;
+ },
+
+ fixAvatarUrlsNeeded() {
+ return this.migrationStatuses.get().fixAvatarUrls === true;
+ },
+
+ fixAllFileUrlsNeeded() {
+ return this.migrationStatuses.get().fixAllFileUrls === true;
+ },
+
+ // Simulate migration progress updates using the global progress popup
+ async simulateMigrationProgress(progressSteps) {
+ const totalSteps = progressSteps.length;
+ for (let i = 0; i < progressSteps.length; i++) {
+ const step = progressSteps[i];
+ const overall = Math.round(((i + 1) / totalSteps) * 100);
+
+ // Start step
+ migrationProgressManager.updateProgress({
+ overallProgress: overall,
+ currentStep: i + 1,
+ totalSteps,
+ stepName: step.step,
+ stepProgress: 0,
+ stepStatus: `Starting ${step.name}...`,
+ stepDetails: null,
+ boardId: Session.get('currentBoard'),
+ });
+
+ const stepDuration = step.duration;
+ const updateInterval = 100;
+ const totalUpdates = Math.max(1, Math.floor(stepDuration / updateInterval));
+ for (let j = 0; j < totalUpdates; j++) {
+ const per = Math.round(((j + 1) / totalUpdates) * 100);
+ migrationProgressManager.updateProgress({
+ overallProgress: overall,
+ currentStep: i + 1,
+ totalSteps,
+ stepName: step.step,
+ stepProgress: per,
+ stepStatus: `Processing ${step.name}...`,
+ stepDetails: { progress: `${per}%` },
+ boardId: Session.get('currentBoard'),
+ });
+ // eslint-disable-next-line no-await-in-loop
+ await new Promise((r) => setTimeout(r, updateInterval));
+ }
+
+ // Complete step
+ migrationProgressManager.updateProgress({
+ overallProgress: overall,
+ currentStep: i + 1,
+ totalSteps,
+ stepName: step.step,
+ stepProgress: 100,
+ stepStatus: `${step.name} completed`,
+ stepDetails: { status: 'completed' },
+ boardId: Session.get('currentBoard'),
+ });
+ }
+ },
+
+ runMigration(migrationType) {
+ const boardId = Session.get('currentBoard');
+
+ let methodName;
+ let methodArgs = [];
+
+ switch (migrationType) {
+ case 'comprehensive':
+ methodName = 'comprehensiveBoardMigration.execute';
+ methodArgs = [boardId];
+ break;
+
+ case 'fixMissingLists':
+ methodName = 'fixMissingListsMigration.execute';
+ methodArgs = [boardId];
+ break;
+
+ case 'deleteDuplicateEmptyLists':
+ methodName = 'deleteDuplicateEmptyLists.execute';
+ methodArgs = [boardId];
+ break;
+
+ case 'restoreLostCards':
+ methodName = 'restoreLostCards.execute';
+ methodArgs = [boardId];
+ break;
+
+ case 'restoreAllArchived':
+ methodName = 'restoreAllArchived.execute';
+ methodArgs = [boardId];
+ break;
+
+ case 'fixAvatarUrls':
+ methodName = 'fixAvatarUrls.execute';
+ methodArgs = [boardId];
+ break;
+
+ case 'fixAllFileUrls':
+ methodName = 'fixAllFileUrls.execute';
+ methodArgs = [boardId];
+ break;
+ }
+
+ if (methodName) {
+ // Define simulated steps per migration type
+ const stepsByType = {
+ comprehensive: [
+ { step: 'analyze_board_structure', name: 'Analyze Board Structure', duration: 800 },
+ { step: 'fix_orphaned_cards', name: 'Fix Orphaned Cards', duration: 1200 },
+ { step: 'convert_shared_lists', name: 'Convert Shared Lists', duration: 1000 },
+ { step: 'ensure_per_swimlane_lists', name: 'Ensure Per-Swimlane Lists', duration: 800 },
+ { step: 'validate_migration', name: 'Validate Migration', duration: 800 },
+ { step: 'fix_avatar_urls', name: 'Fix Avatar URLs', duration: 600 },
+ { step: 'fix_attachment_urls', name: 'Fix Attachment URLs', duration: 600 },
+ ],
+ fixMissingLists: [
+ { step: 'analyze_lists', name: 'Analyze Lists', duration: 600 },
+ { step: 'create_missing_lists', name: 'Create Missing Lists', duration: 900 },
+ { step: 'update_cards', name: 'Update Cards', duration: 900 },
+ { step: 'finalize', name: 'Finalize', duration: 400 },
+ ],
+ deleteDuplicateEmptyLists: [
+ { step: 'convert_shared_lists', name: 'Convert Shared Lists', duration: 700 },
+ { step: 'delete_duplicate_empty_lists', name: 'Delete Duplicate Empty Lists', duration: 800 },
+ ],
+ restoreLostCards: [
+ { step: 'ensure_lost_cards_swimlane', name: 'Ensure Lost Cards Swimlane', duration: 600 },
+ { step: 'restore_lists', name: 'Restore Lists', duration: 800 },
+ { step: 'restore_cards', name: 'Restore Cards', duration: 1000 },
+ ],
+ restoreAllArchived: [
+ { step: 'restore_swimlanes', name: 'Restore Swimlanes', duration: 800 },
+ { step: 'restore_lists', name: 'Restore Lists', duration: 900 },
+ { step: 'restore_cards', name: 'Restore Cards', duration: 1000 },
+ { step: 'fix_missing_ids', name: 'Fix Missing IDs', duration: 600 },
+ ],
+ fixAvatarUrls: [
+ { step: 'scan_users', name: 'Checking board member avatars', duration: 500 },
+ { step: 'fix_urls', name: 'Fixing avatar URLs', duration: 900 },
+ ],
+ fixAllFileUrls: [
+ { step: 'scan_files', name: 'Checking board file attachments', duration: 600 },
+ { step: 'fix_urls', name: 'Fixing file URLs', duration: 1000 },
+ ],
+ };
+
+ const steps = stepsByType[migrationType] || [
+ { step: 'running', name: 'Running Migration', duration: 1000 },
+ ];
+
+ // Kick off popup and simulated progress
+ migrationProgressManager.startMigration();
+ const progressPromise = this.simulateMigrationProgress(steps);
+
+ // Start migration call
+ const callPromise = new Promise((resolve, reject) => {
+ Meteor.call(methodName, ...methodArgs, (err, result) => {
+ if (err) return reject(err);
+ return resolve(result);
+ });
+ });
+
+ Promise.allSettled([callPromise, progressPromise]).then(([callRes]) => {
+ if (callRes.status === 'rejected') {
+ migrationProgressManager.failMigration(callRes.reason);
+ } else {
+ const result = callRes.value;
+ // Summarize result details in the popup
+ let summary = {};
+ if (result && result.results) {
+ // Comprehensive returns {success, results}
+ const r = result.results;
+ summary = {
+ totalCardsProcessed: r.totalCardsProcessed,
+ totalListsProcessed: r.totalListsProcessed,
+ totalListsCreated: r.totalListsCreated,
+ };
+ } else if (result && result.changes) {
+ // Many migrations return a changes string array
+ summary = { changes: result.changes.join(' | ') };
+ } else if (result && typeof result === 'object') {
+ summary = result;
+ }
+
+ migrationProgressManager.updateProgress({
+ overallProgress: 100,
+ currentStep: steps.length,
+ totalSteps: steps.length,
+ stepName: 'completed',
+ stepProgress: 100,
+ stepStatus: 'Migration completed',
+ stepDetails: summary,
+ boardId: Session.get('currentBoard'),
+ });
+
+ migrationProgressManager.completeMigration();
+
+ // Refresh status badges slightly after
+ Meteor.setTimeout(() => {
+ this.loadMigrationStatuses();
+ }, 1000);
+ }
+ });
+ }
+ },
+
+ events() {
+ const self = this; // Capture component reference
+
+ return [
+ {
+ 'click .js-run-migration[data-migration="comprehensive"]': Popup.afterConfirm('runComprehensiveMigration', function() {
+ self.runMigration('comprehensive');
+ Popup.back();
+ }),
+ 'click .js-run-migration[data-migration="fixMissingLists"]': Popup.afterConfirm('runFixMissingListsMigration', function() {
+ self.runMigration('fixMissingLists');
+ Popup.back();
+ }),
+ 'click .js-run-migration[data-migration="deleteDuplicateEmptyLists"]': Popup.afterConfirm('runDeleteDuplicateEmptyListsMigration', function() {
+ self.runMigration('deleteDuplicateEmptyLists');
+ Popup.back();
+ }),
+ 'click .js-run-migration[data-migration="restoreLostCards"]': Popup.afterConfirm('runRestoreLostCardsMigration', function() {
+ self.runMigration('restoreLostCards');
+ Popup.back();
+ }),
+ 'click .js-run-migration[data-migration="restoreAllArchived"]': Popup.afterConfirm('runRestoreAllArchivedMigration', function() {
+ self.runMigration('restoreAllArchived');
+ Popup.back();
+ }),
+ 'click .js-run-migration[data-migration="fixAvatarUrls"]': Popup.afterConfirm('runFixAvatarUrlsMigration', function() {
+ self.runMigration('fixAvatarUrls');
+ Popup.back();
+ }),
+ 'click .js-run-migration[data-migration="fixAllFileUrls"]': Popup.afterConfirm('runFixAllFileUrlsMigration', function() {
+ self.runMigration('fixAllFileUrls');
+ Popup.back();
+ }),
+ },
+ ];
+ },
+}).register('migrationsSidebar');
diff --git a/client/components/swimlanes/swimlaneHeader.jade b/client/components/swimlanes/swimlaneHeader.jade
index 04548ffa6..a0a44eb7f 100644
--- a/client/components/swimlanes/swimlaneHeader.jade
+++ b/client/components/swimlanes/swimlaneHeader.jade
@@ -25,25 +25,26 @@ template(name="swimlaneFixedHeader")
.swimlane-header-menu
if currentUser
unless currentUser.isCommentOnly
- 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
- | ↕️
+ unless currentUser.isWorker
+ 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 17988f454..c0ef35453 100644
--- a/client/components/swimlanes/swimlaneHeader.js
+++ b/client/components/swimlanes/swimlaneHeader.js
@@ -178,6 +178,11 @@ 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 4c20cb0f4..83540549f 100644
--- a/client/components/swimlanes/swimlanes.css
+++ b/client/components/swimlanes/swimlanes.css
@@ -112,7 +112,7 @@
padding: 7px;
top: 50%;
transform: translateY(-50%);
- left: 87vw;
+ right: 10px;
font-size: 24px;
cursor: move;
z-index: 15;
diff --git a/client/components/swimlanes/swimlanes.js b/client/components/swimlanes/swimlanes.js
index cb0eb4c9d..e0dd896d5 100644
--- a/client/components/swimlanes/swimlanes.js
+++ b/client/components/swimlanes/swimlanes.js
@@ -228,10 +228,8 @@ function initSortable(boardComponent, $listsDom) {
// 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');
}
+ // Allow reordering within the same swimlane by not canceling the sortable
try {
Lists.update(list._id, {
@@ -682,6 +680,11 @@ Template.swimlane.helpers({
canSeeAddList() {
return ReactiveCache.getCurrentUser().isBoardAdmin();
},
+
+ lists() {
+ // Return per-swimlane lists for this swimlane
+ return this.myLists();
+ }
});
// Initialize sortable on DOM elements
@@ -722,6 +725,89 @@ 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;
+ }
+
// Try to get board component
try {
const boardComponent = BlazeComponent.getComponentForElement(ui.item[0]);
@@ -731,6 +817,18 @@ setTimeout(() => {
} 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');
+ });
}
});
}
@@ -769,6 +867,89 @@ 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;
+ }
+
// Try to get board component
try {
const boardComponent = BlazeComponent.getComponentForElement(ui.item[0]);
@@ -778,6 +959,18 @@ setTimeout(() => {
} 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');
+ });
}
});
}
diff --git a/client/components/users/userAvatar.jade b/client/components/users/userAvatar.jade
index b1bc7e2d4..e00fc188f 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="{{userData.profile.avatarUrl}}")
+ img.avatar.avatar-image(src="{{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}}?auth=false&brokenIsFine=true")
+ img.avatar.avatar-image(src="{{link}}")
| {{_ 'uploaded-avatar'}}
if isSelected
| ✅
diff --git a/client/components/users/userAvatar.js b/client/components/users/userAvatar.js
index 98ebc901e..f2db90ee3 100644
--- a/client/components/users/userAvatar.js
+++ b/client/components/users/userAvatar.js
@@ -15,6 +15,21 @@ 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';
@@ -179,7 +194,7 @@ BlazeComponent.extendComponent({
isSelected() {
const userProfile = ReactiveCache.getCurrentUser().profile;
const avatarUrl = userProfile && userProfile.avatarUrl;
- const currentAvatarUrl = `${this.currentData().link()}?auth=false&brokenIsFine=true`;
+ const currentAvatarUrl = this.currentData().link();
return avatarUrl === currentAvatarUrl;
},
@@ -220,7 +235,7 @@ BlazeComponent.extendComponent({
}
},
'click .js-select-avatar'() {
- const avatarUrl = `${this.currentData().link()}?auth=false&brokenIsFine=true`;
+ const avatarUrl = this.currentData().link();
this.setAvatar(avatarUrl);
},
'click .js-select-initials'() {
diff --git a/client/components/users/userHeader.jade b/client/components/users/userHeader.jade
index 8934ddbc4..7ee64d138 100644
--- a/client/components/users/userHeader.jade
+++ b/client/components/users/userHeader.jade
@@ -12,11 +12,6 @@ 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-my-cards(href="{{pathFor 'my-cards'}}")
@@ -32,6 +27,7 @@ template(name="memberMenuPopup")
| {{_ 'globalSearch-title'}}
li
a(href="{{pathFor 'home'}}")
+ | 🏠
| 🏠
| {{_ 'all-boards'}}
li
diff --git a/client/config/blazeHelpers.js b/client/config/blazeHelpers.js
index 967b83059..333913dfc 100644
--- a/client/config/blazeHelpers.js
+++ b/client/config/blazeHelpers.js
@@ -73,6 +73,10 @@ Blaze.registerHelper('canModifyCard', () =>
Utils.canModifyCard(),
);
+Blaze.registerHelper('canMoveCard', () =>
+ Utils.canMoveCard(),
+);
+
Blaze.registerHelper('canModifyBoard', () =>
Utils.canModifyBoard(),
);
diff --git a/client/lib/boardMultiSelection.js b/client/lib/boardMultiSelection.js
new file mode 100644
index 000000000..036c312b6
--- /dev/null
+++ b/client/lib/boardMultiSelection.js
@@ -0,0 +1,73 @@
+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/cardSearch.js b/client/lib/cardSearch.js
index 4b9c14ccd..a143965cf 100644
--- a/client/lib/cardSearch.js
+++ b/client/lib/cardSearch.js
@@ -179,11 +179,16 @@ export class CardSearchPagedComponent extends BlazeComponent {
console.log('getResults - no sessionData or no cards array, trying direct card search');
}
// Fallback: try to get cards directly from the client-side collection
+ // Use a more efficient query with limit and sort
const selector = {
type: 'cardType-card',
dueAt: { $exists: true, $nin: [null, ''] }
};
- const allCards = Cards.find(selector).fetch();
+ const options = {
+ sort: { dueAt: 1 }, // Sort by due date ascending (oldest first)
+ limit: 100 // Limit to 100 cards for performance
+ };
+ const allCards = Cards.find(selector, options).fetch();
if (process.env.DEBUG === 'true') {
console.log('getResults - direct card search found:', allCards ? allCards.length : 0, 'cards');
}
@@ -191,9 +196,6 @@ export class CardSearchPagedComponent extends BlazeComponent {
if (allCards && allCards.length > 0) {
allCards.forEach(card => {
if (card && card._id) {
- if (process.env.DEBUG === 'true') {
- console.log('getResults - direct card:', card._id, card.title);
- }
cards.push(card);
}
});
diff --git a/client/lib/datepicker.js b/client/lib/datepicker.js
index 08b15b2eb..fa2ff8129 100644
--- a/client/lib/datepicker.js
+++ b/client/lib/datepicker.js
@@ -1,32 +1,27 @@
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 function to get time format for 24 hours
-function adjustedTimeFormat() {
- return 'HH:mm';
+// Helper to check if a date is valid
+function isValidDate(date) {
+ return date instanceof Date && !isNaN(date);
}
-// .replace(/HH/i, 'H');
+// 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}`;
+}
export class DatePicker extends BlazeComponent {
template() {
@@ -76,10 +71,10 @@ export class DatePicker extends BlazeComponent {
return '';
}
dateFormat() {
- return 'L';
+ return 'YYYY-MM-DD';
}
timeFormat() {
- return 'LT';
+ return 'HH:mm';
}
events() {
@@ -89,7 +84,8 @@ export class DatePicker extends BlazeComponent {
// Native HTML date input validation
const dateValue = this.find('#date').value;
if (dateValue) {
- const dateObj = new Date(dateValue);
+ // HTML date input format is always YYYY-MM-DD
+ const dateObj = new Date(dateValue + 'T12:00:00');
if (isValidDate(dateObj)) {
this.error.set('');
} else {
@@ -101,7 +97,8 @@ export class DatePicker extends BlazeComponent {
// Native HTML time input validation
const timeValue = this.find('#time').value;
if (timeValue) {
- const timeObj = new Date(`1970-01-01T${timeValue}`);
+ // HTML time input format is always HH:mm
+ const timeObj = new Date(`1970-01-01T${timeValue}:00`);
if (isValidDate(timeObj)) {
this.error.set('');
} else {
@@ -121,7 +118,9 @@ export class DatePicker extends BlazeComponent {
return;
}
- const newCompleteDate = new Date(`${dateValue}T${timeValue}`);
+ // 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);
if (!isValidDate(newCompleteDate)) {
this.error.set('invalid');
diff --git a/client/lib/fixDuplicateLists.js b/client/lib/fixDuplicateLists.js
new file mode 100644
index 000000000..06faefbdc
--- /dev/null
+++ b/client/lib/fixDuplicateLists.js
@@ -0,0 +1,94 @@
+import { Meteor } from 'meteor/meteor';
+
+/**
+ * Client-side interface for fixing duplicate lists
+ */
+export const fixDuplicateLists = {
+
+ /**
+ * Get a report of all boards with duplicate lists/swimlanes
+ */
+ async getReport() {
+ try {
+ const result = await Meteor.callAsync('fixDuplicateLists.getReport');
+ return result;
+ } catch (error) {
+ console.error('Error getting duplicate lists report:', error);
+ throw error;
+ }
+ },
+
+ /**
+ * Fix duplicate lists for a specific board
+ */
+ async fixBoard(boardId) {
+ try {
+ const result = await Meteor.callAsync('fixDuplicateLists.fixBoard', boardId);
+ console.log(`Fixed duplicate lists for board ${boardId}:`, result);
+ return result;
+ } catch (error) {
+ console.error(`Error fixing board ${boardId}:`, error);
+ throw error;
+ }
+ },
+
+ /**
+ * Fix duplicate lists for all boards
+ */
+ async fixAllBoards() {
+ try {
+ console.log('Starting fix for all boards...');
+ const result = await Meteor.callAsync('fixDuplicateLists.fixAllBoards');
+ console.log('Fix completed:', result);
+ return result;
+ } catch (error) {
+ console.error('Error fixing all boards:', error);
+ throw error;
+ }
+ },
+
+ /**
+ * Interactive fix with user confirmation
+ */
+ async interactiveFix() {
+ try {
+ // Get report first
+ console.log('Getting duplicate lists report...');
+ const report = await this.getReport();
+
+ if (report.boardsWithDuplicates === 0) {
+ console.log('No duplicate lists found!');
+ return { message: 'No duplicate lists found!' };
+ }
+
+ console.log(`Found ${report.boardsWithDuplicates} boards with duplicate lists:`);
+ report.report.forEach(board => {
+ console.log(`- Board "${board.boardTitle}" (${board.boardId}): ${board.duplicateSwimlanes} duplicate swimlanes, ${board.duplicateLists} duplicate lists`);
+ });
+
+ // Ask for confirmation
+ const confirmed = confirm(
+ `Found ${report.boardsWithDuplicates} boards with duplicate lists. ` +
+ `This will fix ${report.report.reduce((sum, board) => sum + board.duplicateSwimlanes + board.duplicateLists, 0)} duplicates. ` +
+ 'Continue?'
+ );
+
+ if (!confirmed) {
+ return { message: 'Fix cancelled by user' };
+ }
+
+ // Perform the fix
+ const result = await this.fixAllBoards();
+ return result;
+ } catch (error) {
+ console.error('Error in interactive fix:', error);
+ throw error;
+ }
+ }
+};
+
+// Make it available globally for console access
+if (typeof window !== 'undefined') {
+ window.fixDuplicateLists = fixDuplicateLists;
+}
+
diff --git a/client/lib/migrationManager.js b/client/lib/migrationManager.js
index c178b69e7..19ea53f10 100644
--- a/client/lib/migrationManager.js
+++ b/client/lib/migrationManager.js
@@ -646,6 +646,23 @@ class MigrationManager {
}
}
+ /**
+ * 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
*/
diff --git a/client/lib/popup.js b/client/lib/popup.js
index 5c0c7a6c9..6825f7032 100644
--- a/client/lib/popup.js
+++ b/client/lib/popup.js
@@ -218,6 +218,22 @@ window.Popup = new (class {
const viewportHeight = $(window).height();
const popupWidth = Math.min(380, viewportWidth * 0.55) + 15; // Add 15px for margin
+ // Check if this is an admin panel edit popup
+ const isAdminEditPopup = $element.hasClass('edit-user') ||
+ $element.hasClass('edit-org') ||
+ $element.hasClass('edit-team');
+
+ if (isAdminEditPopup) {
+ // Center the popup horizontally and use full height
+ const centeredLeft = (viewportWidth - popupWidth) / 2;
+
+ return {
+ left: Math.max(10, centeredLeft), // Ensure popup doesn't go off screen
+ top: 10, // Start from top with small margin
+ maxHeight: viewportHeight - 20, // Use full height minus small margins
+ };
+ }
+
// Calculate available height for popup
const popupTop = offset.top + $element.outerHeight();
diff --git a/client/lib/secureDOMPurify.js b/client/lib/secureDOMPurify.js
index 898687dad..323c3b6c0 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'],
+ 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'],
// 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 265d589b2..078dfe967 100644
--- a/client/lib/utils.js
+++ b/client/lib/utils.js
@@ -214,6 +214,15 @@ Utils = {
);
return ret;
},
+ canMoveCard() {
+ const currentUser = ReactiveCache.getCurrentUser();
+ const ret = (
+ currentUser &&
+ currentUser.isBoardMember() &&
+ !currentUser.isCommentOnly()
+ );
+ return ret;
+ },
canModifyBoard() {
const currentUser = ReactiveCache.getCurrentUser();
const ret = (
@@ -231,9 +240,21 @@ Utils = {
window.location.reload();
},
setBoardView(view) {
- currentUser = ReactiveCache.getCurrentUser();
+ const currentUser = ReactiveCache.getCurrentUser();
+
if (currentUser) {
- ReactiveCache.getCurrentUser().setBoardView(view);
+ // 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();
+ }
+ });
} else if (view === 'board-view-swimlanes') {
window.localStorage.setItem('boardView', 'board-view-swimlanes'); //true
Utils.reload();
diff --git a/docs/Platforms/FOSS/Snap/Snap-build.md b/docs/Platforms/FOSS/Snap/Snap-build.md
new file mode 100644
index 000000000..ee973115a
--- /dev/null
+++ b/docs/Platforms/FOSS/Snap/Snap-build.md
@@ -0,0 +1,103 @@
+# 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/Windows/Offline.md b/docs/Platforms/Propietary/Windows/Offline.md
index 85691e30f..4da341fd1 100644
--- a/docs/Platforms/Propietary/Windows/Offline.md
+++ b/docs/Platforms/Propietary/Windows/Offline.md
@@ -10,7 +10,7 @@ This is without container (without Docker or Snap).
Right click and download files 1-4:
-1. [wekan-8.08-amd64-windows.zip](https://github.com/wekan/wekan/releases/download/v8.08/wekan-8.08-amd64-windows.zip)
+1. [wekan-8.17-amd64-windows.zip](https://github.com/wekan/wekan/releases/download/v8.17/wekan-8.17-amd64-windows.zip)
2. [node.exe](https://nodejs.org/dist/latest-v14.x/win-x64/node.exe)
@@ -22,7 +22,7 @@ Right click and download files 1-4:
6. Double click `mongodb-windows-x86_64-7.0.25-signed.msi` . In installer, uncheck downloading MongoDB compass.
-7. Unzip `wekan-8.08-amd64-windows.zip` , inside it is directory `bundle`, to it copy other files:
+7. Unzip `wekan-8.17-amd64-windows.zip` , inside it is directory `bundle`, to it copy other files:
```
bundle (directory)
diff --git a/imports/i18n/data/af.i18n.json b/imports/i18n/data/af.i18n.json
index 12e76c28d..acf3c6934 100644
--- a/imports/i18n/data/af.i18n.json
+++ b/imports/i18n/data/af.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Date",
"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",
+ "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",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/af_ZA.i18n.json b/imports/i18n/data/af_ZA.i18n.json
index 0e4378214..d397f5944 100644
--- a/imports/i18n/data/af_ZA.i18n.json
+++ b/imports/i18n/data/af_ZA.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Date",
"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",
+ "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",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/ar-DZ.i18n.json b/imports/i18n/data/ar-DZ.i18n.json
index 726f9caac..b6aac02e5 100644
--- a/imports/i18n/data/ar-DZ.i18n.json
+++ b/imports/i18n/data/ar-DZ.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Date",
"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",
+ "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",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/ar-EG.i18n.json b/imports/i18n/data/ar-EG.i18n.json
index 726f9caac..b6aac02e5 100644
--- a/imports/i18n/data/ar-EG.i18n.json
+++ b/imports/i18n/data/ar-EG.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Date",
"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",
+ "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",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/ar.i18n.json b/imports/i18n/data/ar.i18n.json
index 61c949733..5ba52f954 100644
--- a/imports/i18n/data/ar.i18n.json
+++ b/imports/i18n/data/ar.i18n.json
@@ -78,6 +78,18 @@
"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": "إضافة مرفق",
@@ -337,6 +349,7 @@
"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": "انشاء حقل",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "تاريخ",
"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",
+ "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": "صورة شخصية افتراضية",
"delete": "حذف",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/ary.i18n.json b/imports/i18n/data/ary.i18n.json
index 726f9caac..b6aac02e5 100644
--- a/imports/i18n/data/ary.i18n.json
+++ b/imports/i18n/data/ary.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Date",
"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",
+ "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",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/ast-ES.i18n.json b/imports/i18n/data/ast-ES.i18n.json
index 726f9caac..b6aac02e5 100644
--- a/imports/i18n/data/ast-ES.i18n.json
+++ b/imports/i18n/data/ast-ES.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Date",
"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",
+ "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",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/az-AZ.i18n.json b/imports/i18n/data/az-AZ.i18n.json
index 726f9caac..b6aac02e5 100644
--- a/imports/i18n/data/az-AZ.i18n.json
+++ b/imports/i18n/data/az-AZ.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Date",
"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",
+ "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",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/az-LA.i18n.json b/imports/i18n/data/az-LA.i18n.json
index 726f9caac..b6aac02e5 100644
--- a/imports/i18n/data/az-LA.i18n.json
+++ b/imports/i18n/data/az-LA.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Date",
"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",
+ "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",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/az.i18n.json b/imports/i18n/data/az.i18n.json
index 726f9caac..b6aac02e5 100644
--- a/imports/i18n/data/az.i18n.json
+++ b/imports/i18n/data/az.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Date",
"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",
+ "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",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/bg.i18n.json b/imports/i18n/data/bg.i18n.json
index 038753629..f78534731 100644
--- a/imports/i18n/data/bg.i18n.json
+++ b/imports/i18n/data/bg.i18n.json
@@ -78,6 +78,18 @@
"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": "Добави прикачен файл",
@@ -337,6 +349,7 @@
"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": "Създай Поле",
@@ -357,9 +370,9 @@
"custom-fields": "Собствени полета",
"date": "Дата",
"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",
+ "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": "Отказ",
"default-avatar": "Основен аватар",
"delete": "Изтрий",
@@ -385,6 +398,7 @@
"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": "Неуспешно изпращане на имейла",
@@ -754,6 +768,8 @@
"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": "по подразбиране",
@@ -761,7 +777,7 @@
"subtask-settings": "Настройки на Подзадачите",
"card-settings": "Настройки на Карта",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Настройки за Подзадачите за това Табло",
+ "boardSubtaskSettingsPopup-title": "Настройки на Подзадачите",
"boardCardSettingsPopup-title": "Настройки на Карта",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Вложете под-задачи към тази дъска:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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": "Завършено",
diff --git a/imports/i18n/data/br.i18n.json b/imports/i18n/data/br.i18n.json
index 36c754973..6cbe2a70b 100644
--- a/imports/i18n/data/br.i18n.json
+++ b/imports/i18n/data/br.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Date",
"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",
+ "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": "Diverkañ",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/ca.i18n.json b/imports/i18n/data/ca.i18n.json
index a2213db03..349a3e4b0 100644
--- a/imports/i18n/data/ca.i18n.json
+++ b/imports/i18n/data/ca.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Camps Personalitzats",
"date": "Dades",
"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",
+ "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": "Declina",
"default-avatar": "Avatar per defecte",
"delete": "Esborra",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Configuració de subtasques",
"card-settings": "Configuració de fitxa",
"minicard-settings": "Configuració de la minifitxa",
- "boardSubtaskSettingsPopup-title": "Configuració de les subtasques del tauler",
+ "boardSubtaskSettingsPopup-title": "Configuració de subtasques",
"boardCardSettingsPopup-title": "Configuració de fitxa",
"boardMinicardSettingsPopup-title": "Configuració de la minifitxa",
"deposit-subtasks-board": "Diposita subtasques a aquest tauler:",
@@ -1015,6 +1031,8 @@
"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'.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/ca@valencia.i18n.json b/imports/i18n/data/ca@valencia.i18n.json
index 5bae3902d..e8d3a8b09 100644
--- a/imports/i18n/data/ca@valencia.i18n.json
+++ b/imports/i18n/data/ca@valencia.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Date",
"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",
+ "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",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/ca_ES.i18n.json b/imports/i18n/data/ca_ES.i18n.json
index 3061d1963..5cecaa279 100644
--- a/imports/i18n/data/ca_ES.i18n.json
+++ b/imports/i18n/data/ca_ES.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Date",
"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",
+ "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",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/cmn.i18n.json b/imports/i18n/data/cmn.i18n.json
index 36eb95e11..45bc58d1b 100644
--- a/imports/i18n/data/cmn.i18n.json
+++ b/imports/i18n/data/cmn.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Date",
"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",
+ "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",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/cs-CZ.i18n.json b/imports/i18n/data/cs-CZ.i18n.json
index 4c6cf62aa..e330e3f2a 100644
--- a/imports/i18n/data/cs-CZ.i18n.json
+++ b/imports/i18n/data/cs-CZ.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Vlastní pole",
"date": "Datum",
"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",
+ "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": "Zamítnout",
"default-avatar": "Výchozí avatar",
"delete": "Smazat",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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í",
@@ -761,7 +777,7 @@
"subtask-settings": "Nastavení podúkolů",
"card-settings": "Nastavení karet",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Nastavení podúkolů tabla",
+ "boardSubtaskSettingsPopup-title": "Nastavení podúkolů",
"boardCardSettingsPopup-title": "Nastavení karet",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Vložit podúkoly do tohoto tabla",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/cs.i18n.json b/imports/i18n/data/cs.i18n.json
index a0ec3277a..84cc45b7e 100644
--- a/imports/i18n/data/cs.i18n.json
+++ b/imports/i18n/data/cs.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Vlastní pole",
"date": "Datum",
"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",
+ "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": "Zamítnout",
"default-avatar": "Výchozí avatar",
"delete": "Smazat",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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í",
@@ -761,7 +777,7 @@
"subtask-settings": "Nastavení podúkolů",
"card-settings": "Nastavení karet",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Nastavení podúkolů tabla",
+ "boardSubtaskSettingsPopup-title": "Nastavení podúkolů",
"boardCardSettingsPopup-title": "Nastavení karet",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Vložit podúkoly do tohoto tabla",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/cy-GB.i18n.json b/imports/i18n/data/cy-GB.i18n.json
index 726f9caac..b6aac02e5 100644
--- a/imports/i18n/data/cy-GB.i18n.json
+++ b/imports/i18n/data/cy-GB.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Date",
"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",
+ "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",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/cy.i18n.json b/imports/i18n/data/cy.i18n.json
index 726f9caac..b6aac02e5 100644
--- a/imports/i18n/data/cy.i18n.json
+++ b/imports/i18n/data/cy.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Date",
"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",
+ "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",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/da.i18n.json b/imports/i18n/data/da.i18n.json
index 44bb23113..4edbf48bc 100644
--- a/imports/i18n/data/da.i18n.json
+++ b/imports/i18n/data/da.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Brugerdefinerede felter",
"date": "Dato",
"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",
+ "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": "Afslå",
"default-avatar": "Standard-avatar",
"delete": "Slet",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Indstillinger for delopgaver",
"card-settings": "Indstillinger for kort",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Indstillinger for delopgaver i tavle",
+ "boardSubtaskSettingsPopup-title": "Indstillinger for delopgaver",
"boardCardSettingsPopup-title": "Indstillinger for kort",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Indsæt delopgaver på denne tavle:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/de-AT.i18n.json b/imports/i18n/data/de-AT.i18n.json
index 79b940177..eeac5f73b 100644
--- a/imports/i18n/data/de-AT.i18n.json
+++ b/imports/i18n/data/de-AT.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Benutzerdefinierte Felder",
"date": "Datum",
"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",
+ "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": "Ablehnen",
"default-avatar": "Standard Profilbild",
"delete": "Löschen",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Einstellungen für Teilaufgaben",
"card-settings": "Karten-Einstellungen",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Boardeinstellungen für Teilaufgaben",
+ "boardSubtaskSettingsPopup-title": "Einstellungen für Teilaufgaben",
"boardCardSettingsPopup-title": "Karten-Einstellungen",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Teilaufgaben in diesem Board ablegen:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/de-CH.i18n.json b/imports/i18n/data/de-CH.i18n.json
index f67c5adbd..afdea98f1 100644
--- a/imports/i18n/data/de-CH.i18n.json
+++ b/imports/i18n/data/de-CH.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Benutzerdefinierte Felder",
"date": "Datum",
"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",
+ "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": "Ablehnen",
"default-avatar": "Standard Profilbild",
"delete": "Löschen",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Einstellungen für Teilaufgaben",
"card-settings": "Karten-Einstellungen",
"minicard-settings": "Einstellungen für Minikarte",
- "boardSubtaskSettingsPopup-title": "Boardeinstellungen für Teilaufgaben",
+ "boardSubtaskSettingsPopup-title": "Einstellungen für Teilaufgaben",
"boardCardSettingsPopup-title": "Karten-Einstellungen",
"boardMinicardSettingsPopup-title": "Einstellungen für Minikarte",
"deposit-subtasks-board": "Teilaufgaben in diesem Board ablegen:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/de.i18n.json b/imports/i18n/data/de.i18n.json
index 18f0db85f..cfb4ea635 100644
--- a/imports/i18n/data/de.i18n.json
+++ b/imports/i18n/data/de.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Benutzerdefinierte Felder",
"date": "Datum",
"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",
+ "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": "Ablehnen",
"default-avatar": "Standard Profilbild",
"delete": "Löschen",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Einstellungen für Teilaufgaben",
"card-settings": "Karten-Einstellungen",
"minicard-settings": "Minikarte-Einstellungen",
- "boardSubtaskSettingsPopup-title": "Boardeinstellungen für Teilaufgaben",
+ "boardSubtaskSettingsPopup-title": "Einstellungen für Teilaufgaben",
"boardCardSettingsPopup-title": "Karten-Einstellungen",
"boardMinicardSettingsPopup-title": "Minikarte-Einstellungen",
"deposit-subtasks-board": "Teilaufgaben in diesem Board ablegen:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/de_DE.i18n.json b/imports/i18n/data/de_DE.i18n.json
index 22b96b1fc..792d13633 100644
--- a/imports/i18n/data/de_DE.i18n.json
+++ b/imports/i18n/data/de_DE.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -177,22 +189,22 @@
"boardChangeViewPopup-title": "Boardansicht",
"boards": "Boards",
"board-view": "Boardansicht",
- "desktop-mode": "Desktop Mode",
- "mobile-mode": "Mobile Mode",
- "mobile-desktop-toggle": "Toggle between Mobile and Desktop Mode",
+ "desktop-mode": "Desktop-Modus",
+ "mobile-mode": "Handy-Modus",
+ "mobile-desktop-toggle": "Umschalten zwischen Mobil und Desktop Ansicht",
"zoom-in": "Vergrößern",
"zoom-out": "Verkleinern",
- "click-to-change-zoom": "Click to change zoom level",
- "zoom-level": "Zoom Level",
- "enter-zoom-level": "Enter zoom level (50-300%):",
+ "click-to-change-zoom": "Klicken um die Zoom Stufe zu ändern",
+ "zoom-level": "Zoomstufe",
+ "enter-zoom-level": "Eingabe Zoom Stufe (50-300%):",
"board-view-cal": "Kalender",
"board-view-swimlanes": "Swimlanes",
"board-view-collapse": "Einklappen",
"board-view-gantt": "Gantt",
"board-view-lists": "Listen",
- "bucket-example": "Like \"Bucket List\" for example",
- "calendar-previous-month-label": "Previous Month",
- "calendar-next-month-label": "Next Month",
+ "bucket-example": "z.B. \"Löffelliste\"",
+ "calendar-previous-month-label": "Vorheriger Monat",
+ "calendar-next-month-label": "Nächster Monat",
"cancel": "Abbrechen",
"card-archived": "Diese Karte wurde ins Archiv verschoben",
"board-archived": "Dieses Board wurde ins Archiv verschoben.",
@@ -337,6 +349,7 @@
"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",
@@ -356,10 +369,10 @@
"custom-field-text": "Text",
"custom-fields": "Benutzerdefinierte Felder",
"date": "Datum",
- "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",
+ "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",
"decline": "Ablehnen",
"default-avatar": "Standard Profilbild",
"delete": "Löschen",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Einstellungen für Teilaufgaben",
"card-settings": "Karten-Einstellungen",
"minicard-settings": "Minikarte-Einstellungen",
- "boardSubtaskSettingsPopup-title": "Boardeinstellungen für Teilaufgaben",
+ "boardSubtaskSettingsPopup-title": "Einstellungen für Teilaufgaben",
"boardCardSettingsPopup-title": "Karten-Einstellungen",
"boardMinicardSettingsPopup-title": "Minikarte-Einstellungen",
"deposit-subtasks-board": "Teilaufgaben in diesem Board ablegen:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1290,14 +1308,14 @@
"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 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-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-failures-before": "Fehler vor einer Sperrung",
"accounts-lockout-period": "Dauer der Sperrung (Sekunden)",
- "accounts-lockout-failure-window": "Failure window (seconds)",
- "accounts-lockout-settings-updated": "Brute force protection settings have been updated",
+ "accounts-lockout-failure-window": "Fehlerfenster (Sekunden)",
+ "accounts-lockout-settings-updated": "Die Brute-force-Schutz Einstellungen wurden aktualisiert",
"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",
@@ -1305,7 +1323,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": "Are you sure you want to unlock all locked users?",
+ "accounts-lockout-confirm-unlock-all": "Wollen Sie wirklich alle gesperrten Benutzer entsperren?",
"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",
@@ -1316,183 +1334,246 @@
"admin-people-filter-active": "Aktiv",
"admin-people-filter-inactive": "Nicht aktiv",
"admin-people-active-status": "Aktiv 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",
+ "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",
"accounts-lockout-unlock-all": "Alle entsperren",
- "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",
+ "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",
"cron-migrations": "Geplante Migrationen",
- "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",
+ "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",
"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-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-port": "S3 Port",
- "s3-port-description": "S3 endpoint port number",
+ "s3-port-description": "S3 Endpunkt Port Nummer",
"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",
+ "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": "Board Migrations",
+ "card-show-lists-on-minicard": "Zeige Listen auf der Minikarte",
+ "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": "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...",
+
+ "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": "Aufräumen",
+ "cleanup-old-jobs": "Alte Aufgaben aufräumen",
"completed": "abgeschlossen",
- "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.",
+ "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.",
"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",
+ "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",
"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)",
+ "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)",
"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-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-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",
+ "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",
"of": "von",
- "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",
+ "operation-type": "Operationstyp",
+ "overall-progress": "Gesamtfortschritt",
+ "page": "Seite",
+ "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",
"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",
- "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",
+ "scanning-status": "Scanstatus",
+ "schedule": "Zeitplanung",
+ "search-boards-or-operations": "Durchsuche Bretter oder Vorgänge",
+ "show-list-on-minicard": "Zeige Liste auf der Minikarte",
+ "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"
}
diff --git a/imports/i18n/data/el-GR.i18n.json b/imports/i18n/data/el-GR.i18n.json
index 8a8ced735..efd48c486 100644
--- a/imports/i18n/data/el-GR.i18n.json
+++ b/imports/i18n/data/el-GR.i18n.json
@@ -78,6 +78,18 @@
"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": "Προσθήκη Συνημμένου",
@@ -337,6 +349,7 @@
"copyManyCardsPopup-format": "[ {\"title\": \"Τίτλος πρώτης κάρτας\", \"description\":\"Περιγραφή πρώτης κάρτας\"}, {\"title\":\"Τίτλος δεύτερης κάρτας\",\"description\":\"Περιγραφή δεύτερης κάρτας\"},{\"title\":\"Τίτλος τελευταίας κάρτας\",\"description\":\"Περιγραφή τελευταίας κάρτας\"} ]",
"create": "Δημιουργία",
"createBoardPopup-title": "Δημιουργία Πίνακα",
+ "createTemplateContainerPopup-title": "Add Template Container",
"chooseBoardSourcePopup-title": "Εισαγωγή πίνακα",
"createLabelPopup-title": "Δημιουργία Ετικέτας",
"createCustomField": "Δημιουργία Πεδίου",
@@ -357,9 +370,9 @@
"custom-fields": "Προσαρμοσμένα Πεδία",
"date": "Ημερομηνία",
"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",
+ "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": "Απόρριψη",
"default-avatar": "Default avatar",
"delete": "Διαγραφή",
@@ -385,6 +398,7 @@
"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 απέτυχε",
@@ -754,6 +768,8 @@
"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": "Προεπιλογή",
@@ -761,7 +777,7 @@
"subtask-settings": "Ρυθμίσεις υποεργασιών (subtasks)",
"card-settings": "Ρυθμίσεις Κάρτας",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Ρυθμίσεις υποεργασιών (subtasks)",
"boardCardSettingsPopup-title": "Ρυθμίσεις Κάρτας",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/el.i18n.json b/imports/i18n/data/el.i18n.json
index e74963576..0ce0024ac 100644
--- a/imports/i18n/data/el.i18n.json
+++ b/imports/i18n/data/el.i18n.json
@@ -78,6 +78,18 @@
"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": "Προσθήκη Συνημμένου",
@@ -337,6 +349,7 @@
"copyManyCardsPopup-format": "[ {\"title\": \"Τίτλος πρώτης κάρτας\", \"description\":\"Περιγραφή πρώτης κάρτας\"}, {\"title\":\"Τίτλος δεύτερης κάρτας\",\"description\":\"Περιγραφή δεύτερης κάρτας\"},{\"title\":\"Τίτλος τελευταίας κάρτας\",\"description\":\"Περιγραφή τελευταίας κάρτας\"} ]",
"create": "Δημιουργία",
"createBoardPopup-title": "Δημιουργία Πίνακα",
+ "createTemplateContainerPopup-title": "Add Template Container",
"chooseBoardSourcePopup-title": "Εισαγωγή πίνακα",
"createLabelPopup-title": "Δημιουργία Ετικέτας",
"createCustomField": "Δημιουργία Πεδίου",
@@ -357,9 +370,9 @@
"custom-fields": "Προσαρμοσμένα Πεδία",
"date": "Ημερομηνία",
"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",
+ "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": "Απόρριψη",
"default-avatar": "Default avatar",
"delete": "Διαγραφή",
@@ -385,6 +398,7 @@
"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 απέτυχε",
@@ -754,6 +768,8 @@
"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": "Προεπιλογή",
@@ -761,7 +777,7 @@
"subtask-settings": "Ρυθμίσεις υποεργασιών (subtasks)",
"card-settings": "Ρυθμίσεις Κάρτας",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Ρυθμίσεις υποεργασιών (subtasks)",
"boardCardSettingsPopup-title": "Ρυθμίσεις Κάρτας",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/en-BR.i18n.json b/imports/i18n/data/en-BR.i18n.json
index 726f9caac..b6aac02e5 100644
--- a/imports/i18n/data/en-BR.i18n.json
+++ b/imports/i18n/data/en-BR.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Date",
"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",
+ "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",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/en-DE.i18n.json b/imports/i18n/data/en-DE.i18n.json
index 3f5b3dff9..7a135972e 100644
--- a/imports/i18n/data/en-DE.i18n.json
+++ b/imports/i18n/data/en-DE.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Date",
"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",
+ "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",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/en-GB.i18n.json b/imports/i18n/data/en-GB.i18n.json
index 12e76c28d..acf3c6934 100644
--- a/imports/i18n/data/en-GB.i18n.json
+++ b/imports/i18n/data/en-GB.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Date",
"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",
+ "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",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/en-IT.i18n.json b/imports/i18n/data/en-IT.i18n.json
index 726f9caac..b6aac02e5 100644
--- a/imports/i18n/data/en-IT.i18n.json
+++ b/imports/i18n/data/en-IT.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Date",
"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",
+ "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",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/en-MY.i18n.json b/imports/i18n/data/en-MY.i18n.json
index 726f9caac..b6aac02e5 100644
--- a/imports/i18n/data/en-MY.i18n.json
+++ b/imports/i18n/data/en-MY.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Date",
"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",
+ "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",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/en-YS.i18n.json b/imports/i18n/data/en-YS.i18n.json
index 726f9caac..b6aac02e5 100644
--- a/imports/i18n/data/en-YS.i18n.json
+++ b/imports/i18n/data/en-YS.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Date",
"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",
+ "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",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/en.i18n.json b/imports/i18n/data/en.i18n.json
index 12e76c28d..acf3c6934 100644
--- a/imports/i18n/data/en.i18n.json
+++ b/imports/i18n/data/en.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Date",
"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",
+ "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",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/en_AU.i18n.json b/imports/i18n/data/en_AU.i18n.json
index 12e76c28d..acf3c6934 100644
--- a/imports/i18n/data/en_AU.i18n.json
+++ b/imports/i18n/data/en_AU.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Date",
"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",
+ "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",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/en_ID.i18n.json b/imports/i18n/data/en_ID.i18n.json
index 12e76c28d..acf3c6934 100644
--- a/imports/i18n/data/en_ID.i18n.json
+++ b/imports/i18n/data/en_ID.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Date",
"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",
+ "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",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/en_SG.i18n.json b/imports/i18n/data/en_SG.i18n.json
index 12e76c28d..acf3c6934 100644
--- a/imports/i18n/data/en_SG.i18n.json
+++ b/imports/i18n/data/en_SG.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Date",
"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",
+ "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",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/en_TR.i18n.json b/imports/i18n/data/en_TR.i18n.json
index 12e76c28d..acf3c6934 100644
--- a/imports/i18n/data/en_TR.i18n.json
+++ b/imports/i18n/data/en_TR.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Date",
"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",
+ "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",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/en_ZA.i18n.json b/imports/i18n/data/en_ZA.i18n.json
index 12e76c28d..acf3c6934 100644
--- a/imports/i18n/data/en_ZA.i18n.json
+++ b/imports/i18n/data/en_ZA.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Date",
"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",
+ "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",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/eo.i18n.json b/imports/i18n/data/eo.i18n.json
index 4c1de4c6f..edd730ca6 100644
--- a/imports/i18n/data/eo.i18n.json
+++ b/imports/i18n/data/eo.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Dato",
"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",
+ "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",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/es-AR.i18n.json b/imports/i18n/data/es-AR.i18n.json
index 304edc8e4..2965baf43 100644
--- a/imports/i18n/data/es-AR.i18n.json
+++ b/imports/i18n/data/es-AR.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Fecha",
"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",
+ "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": "Rechazar",
"default-avatar": "Avatar por defecto",
"delete": "Borrar",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/es-CL.i18n.json b/imports/i18n/data/es-CL.i18n.json
index 40da9c070..8b2a335e9 100644
--- a/imports/i18n/data/es-CL.i18n.json
+++ b/imports/i18n/data/es-CL.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Campos personalizados",
"date": "Fecha",
"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",
+ "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": "Declinar",
"default-avatar": "Avatar por defecto",
"delete": "Eliminar",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Preferencias de las subtareas",
"card-settings": "Preferencias de la tarjeta",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Preferencias de las subtareas del tablero",
+ "boardSubtaskSettingsPopup-title": "Preferencias de las subtareas",
"boardCardSettingsPopup-title": "Preferencias de la tarjeta",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Depositar subtareas en este tablero:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/es-LA.i18n.json b/imports/i18n/data/es-LA.i18n.json
index 12e76c28d..acf3c6934 100644
--- a/imports/i18n/data/es-LA.i18n.json
+++ b/imports/i18n/data/es-LA.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Date",
"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",
+ "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",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/es-MX.i18n.json b/imports/i18n/data/es-MX.i18n.json
index 10361e319..b2039e95e 100644
--- a/imports/i18n/data/es-MX.i18n.json
+++ b/imports/i18n/data/es-MX.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Date",
"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",
+ "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",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/es-PE.i18n.json b/imports/i18n/data/es-PE.i18n.json
index fa8a1988c..8d0e4c283 100644
--- a/imports/i18n/data/es-PE.i18n.json
+++ b/imports/i18n/data/es-PE.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Campos personalizados",
"date": "Fecha",
"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",
+ "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": "Declinar",
"default-avatar": "Avatar por defecto",
"delete": "Eliminar",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Configuración de subtareas",
"card-settings": "Configuración de tarjeta",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Configuración de subtareas del tablero",
+ "boardSubtaskSettingsPopup-title": "Configuración de subtareas",
"boardCardSettingsPopup-title": "Configuración de tarjeta",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Depositar subtareas en este tablero:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/es-PY.i18n.json b/imports/i18n/data/es-PY.i18n.json
index 12e76c28d..acf3c6934 100644
--- a/imports/i18n/data/es-PY.i18n.json
+++ b/imports/i18n/data/es-PY.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Date",
"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",
+ "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",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/es.i18n.json b/imports/i18n/data/es.i18n.json
index 60f3d65f4..27be64c0c 100644
--- a/imports/i18n/data/es.i18n.json
+++ b/imports/i18n/data/es.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Campos personalizados",
"date": "Fecha",
"date-format": "Formato de fecha",
- "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",
+ "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": "Declinar",
"default-avatar": "Avatar por defecto",
"delete": "Eliminar",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,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 del tablero",
+ "boardSubtaskSettingsPopup-title": "Preferencias de las subtareas",
"boardCardSettingsPopup-title": "Preferencias de la tarjeta",
"boardMinicardSettingsPopup-title": "Preferencias de minitarjetas",
"deposit-subtasks-board": "Depositar subtareas en este tablero:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/es_CO.i18n.json b/imports/i18n/data/es_CO.i18n.json
index 12e76c28d..acf3c6934 100644
--- a/imports/i18n/data/es_CO.i18n.json
+++ b/imports/i18n/data/es_CO.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Date",
"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",
+ "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",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/et-EE.i18n.json b/imports/i18n/data/et-EE.i18n.json
index ba402d26f..d16e2a033 100644
--- a/imports/i18n/data/et-EE.i18n.json
+++ b/imports/i18n/data/et-EE.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Kohandatud väljad",
"date": "Kuupäev",
"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",
+ "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": "Langus",
"default-avatar": "Default avatar",
"delete": "Kustuta",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Alaülesannete seaded",
"card-settings": "Kaardi seaded",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Juhatuse alamülesannete seaded",
+ "boardSubtaskSettingsPopup-title": "Alaülesannete seaded",
"boardCardSettingsPopup-title": "Kaardi seaded",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Hoiustage alamülesanded sellele tahvlile:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/eu.i18n.json b/imports/i18n/data/eu.i18n.json
index 2ab724fcc..228365b30 100644
--- a/imports/i18n/data/eu.i18n.json
+++ b/imports/i18n/data/eu.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Eremu pertsonalizatuak",
"date": "Data",
"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",
+ "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": "Ukatu",
"default-avatar": "Lehenetsitako avatarra",
"delete": "Ezabatu",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Azpiatazaren ezarpenak",
"card-settings": "Txartelaren ezarpenak",
"minicard-settings": "Minitxartelaren ezarpenak",
- "boardSubtaskSettingsPopup-title": "Arbeleko azpiatazaren ezarpenak",
+ "boardSubtaskSettingsPopup-title": "Azpiatazaren ezarpenak",
"boardCardSettingsPopup-title": "Txartelaren ezarpenak",
"boardMinicardSettingsPopup-title": "Minitxartelaren ezarpenak",
"deposit-subtasks-board": "Ipini azpiatazak arbel honetan:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/fa-IR.i18n.json b/imports/i18n/data/fa-IR.i18n.json
index ec646a90d..049e398af 100644
--- a/imports/i18n/data/fa-IR.i18n.json
+++ b/imports/i18n/data/fa-IR.i18n.json
@@ -78,6 +78,18 @@
"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": "افزودن ضمیمه",
@@ -337,6 +349,7 @@
"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": "ایجاد فیلد",
@@ -357,9 +370,9 @@
"custom-fields": "فیلدهای شخصی",
"date": "تاریخ",
"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",
+ "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": "رد",
"default-avatar": "آواتار پیشفرض",
"delete": "حذف",
@@ -385,6 +398,7 @@
"editNotificationPopup-title": "اصلاح اعلان",
"editProfilePopup-title": "ویرایش پروفایل",
"email": "پست الکترونیک",
+ "email-address": "Email Address",
"email-enrollAccount-subject": "یک حساب کاربری برای شما در __siteName__ ایجاد شد",
"email-enrollAccount-text": "سلام __user__ \nبرای شروع به استفاده از این سرویس برروی آدرس زیر کلیک کنید.\n__url__\nبا تشکر.",
"email-fail": "عدم موفقیت در فرستادن رایانامه",
@@ -754,6 +768,8 @@
"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": "پیشفرض",
@@ -761,7 +777,7 @@
"subtask-settings": "تنظیمات زیروظایف",
"card-settings": "تنظیمات کارت",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "تنظیمات زیروظایف برد",
+ "boardSubtaskSettingsPopup-title": "تنظیمات زیروظایف",
"boardCardSettingsPopup-title": "تنظیمات کارت",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "افزودن ریزکار به برد:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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": "تمام شده",
diff --git a/imports/i18n/data/fa.i18n.json b/imports/i18n/data/fa.i18n.json
index e5298ea33..0d48e1299 100644
--- a/imports/i18n/data/fa.i18n.json
+++ b/imports/i18n/data/fa.i18n.json
@@ -78,6 +78,18 @@
"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": "افزودن ضمیمه",
@@ -337,6 +349,7 @@
"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": "ایجاد فیلد",
@@ -357,9 +370,9 @@
"custom-fields": "فیلدهای شخصی",
"date": "تاریخ",
"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",
+ "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": "رد",
"default-avatar": "آواتار پیشفرض",
"delete": "حذف",
@@ -385,6 +398,7 @@
"editNotificationPopup-title": "اصلاح اعلان",
"editProfilePopup-title": "ویرایش پروفایل",
"email": "پست الکترونیک",
+ "email-address": "Email Address",
"email-enrollAccount-subject": "یک حساب کاربری برای شما در __siteName__ ایجاد شد",
"email-enrollAccount-text": "سلام __user__ \nبرای شروع به استفاده از این سرویس برروی آدرس زیر کلیک کنید.\n__url__\nبا تشکر.",
"email-fail": "عدم موفقیت در فرستادن رایانامه",
@@ -754,6 +768,8 @@
"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": "پیشفرض",
@@ -761,7 +777,7 @@
"subtask-settings": "تنظیمات زیروظایف",
"card-settings": "تنظیمات کارت",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "تنظیمات زیروظایف برد",
+ "boardSubtaskSettingsPopup-title": "تنظیمات زیروظایف",
"boardCardSettingsPopup-title": "تنظیمات کارت",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "افزودن ریزکار به برد:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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": "تمام شده",
diff --git a/imports/i18n/data/fi.i18n.json b/imports/i18n/data/fi.i18n.json
index 2497bf5e0..6a4c693e1 100644
--- a/imports/i18n/data/fi.i18n.json
+++ b/imports/i18n/data/fi.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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ä",
@@ -357,9 +370,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 HH:MM",
- "date-format-dd-mm-yyyy": "PP-KK-VVVV HH:MM",
- "date-format-mm-dd-yyyy": "PP-KK-VVVV HH:MM",
+ "date-format-yyyy-mm-dd": "VVVV-KK-PP",
+ "date-format-dd-mm-yyyy": "PP-KK-VVVV",
+ "date-format-mm-dd-yyyy": "KK-PP-VVVV",
"decline": "Kieltäydy",
"default-avatar": "Oletusprofiilikuva",
"delete": "Poista",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Alitehtävä-asetukset",
"card-settings": "Kortin asetukset",
"minicard-settings": "Minikortin asetukset",
- "boardSubtaskSettingsPopup-title": "Taulualitehtävien asetukset",
+ "boardSubtaskSettingsPopup-title": "Alitehtävä-asetukset",
"boardCardSettingsPopup-title": "Kortin asetukset",
"boardMinicardSettingsPopup-title": "Minikortin asetukset",
"deposit-subtasks-board": "Talleta alitehtävät tälle taululle:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/fr-CH.i18n.json b/imports/i18n/data/fr-CH.i18n.json
index 1b98181d1..5fa3fa719 100644
--- a/imports/i18n/data/fr-CH.i18n.json
+++ b/imports/i18n/data/fr-CH.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Date",
"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",
+ "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",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/fr-FR.i18n.json b/imports/i18n/data/fr-FR.i18n.json
index 1281de3a0..54b4536c1 100644
--- a/imports/i18n/data/fr-FR.i18n.json
+++ b/imports/i18n/data/fr-FR.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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é",
@@ -357,9 +370,9 @@
"custom-fields": "Champs personnalisés",
"date": "Date",
"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",
+ "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": "Refuser",
"default-avatar": "Avatar par défaut",
"delete": "Supprimer",
@@ -385,6 +398,7 @@
"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.",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,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 du tableau",
+ "boardSubtaskSettingsPopup-title": "Paramètres des sous-tâches",
"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 :",
@@ -1015,6 +1031,8 @@
"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é.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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é",
diff --git a/imports/i18n/data/fr.i18n.json b/imports/i18n/data/fr.i18n.json
index 504f3f8b0..d7f615886 100644
--- a/imports/i18n/data/fr.i18n.json
+++ b/imports/i18n/data/fr.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -190,9 +202,9 @@
"board-view-collapse": "Réduire",
"board-view-gantt": "Gantt",
"board-view-lists": "Listes",
- "bucket-example": "Like \"Bucket List\" for example",
- "calendar-previous-month-label": "Previous Month",
- "calendar-next-month-label": "Next Month",
+ "bucket-example": "Comme « Liste d'envies » par exemple",
+ "calendar-previous-month-label": "Mois précédent",
+ "calendar-next-month-label": "Mois suivant",
"cancel": "Annuler",
"card-archived": "Cette carte est archivée",
"board-archived": "Ce tableau est archivé",
@@ -337,6 +349,7 @@
"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é",
@@ -356,10 +369,10 @@
"custom-field-text": "Texte",
"custom-fields": "Champs personnalisés",
"date": "Date",
- "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",
+ "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",
"decline": "Refuser",
"default-avatar": "Avatar par défaut",
"delete": "Supprimer",
@@ -384,20 +397,21 @@
"editLabelPopup-title": "Modifier l'étiquette",
"editNotificationPopup-title": "Modifier la notification",
"editProfilePopup-title": "Modifier le profil",
- "email": "E-mail",
+ "email": "Courriel",
+ "email-address": "Adresse de courriel",
"email-enrollAccount-subject": "Un compte a été créé pour vous sur __siteName__",
"email-enrollAccount-text": "Bonjour __user__,\n\nPour commencer à utiliser ce service, il suffit de cliquer sur le lien ci-dessous.\n\n__url__\n\nMerci.",
"email-fail": "Échec de l'envoi du courriel.",
- "email-fail-text": "Une erreur est survenue en tentant d'envoyer l'email",
- "email-invalid": "Adresse e-mail incorrecte.",
- "email-invite": "Inviter par e-mail",
+ "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-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 votre compte courriel, il suffit de cliquer sur le lien ci-dessous.\n\n__url__\n\nMerci.",
+ "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.",
"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",
@@ -413,7 +427,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 mail est déjà utilisée",
+ "error-email-taken": "Cette adresse de courriel 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",
@@ -637,9 +651,9 @@
"upload": "Télécharger",
"upload-avatar": "Télécharger un avatar",
"uploaded-avatar": "Avatar téléchargé",
- "uploading-files": "Uploading files",
- "upload-failed": "Upload failed",
- "upload-completed": "Upload completed",
+ "uploading-files": "Chargement des fichiers",
+ "upload-failed": "Le chargement a échoué",
+ "upload-completed": "Le chargement est terminé",
"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",
@@ -675,9 +689,9 @@
"invite": "Inviter",
"invite-people": "Inviter une personne",
"to-boards": "Au(x) tableau(x)",
- "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.",
+ "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.",
"smtp-tls-description": "Activer la gestion de TLS sur le serveur SMTP",
"smtp-host": "Hôte SMTP",
"smtp-port": "Port SMTP",
@@ -685,12 +699,12 @@
"smtp-password": "Mot de passe",
"smtp-tls": "Prise en charge de TLS",
"send-from": "De",
- "send-smtp-test": "Envoyer un mail de test à vous-même",
+ "send-smtp-test": "Envoyer un courriel 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": "E-mail de test SMTP",
- "email-smtp-test-text": "Vous avez envoyé un mail avec succès",
+ "email-smtp-test-subject": "Courriel de test SMTP",
+ "email-smtp-test-text": "Vous avez envoyé un courriel 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",
@@ -729,7 +743,7 @@
"yes": "Oui",
"no": "Non",
"accounts": "Comptes",
- "accounts-allowEmailChange": "Autoriser le changement d'adresse mail",
+ "accounts-allowEmailChange": "Autoriser le changement d'adresse de courriel",
"accounts-allowUserNameChange": "Autoriser le changement d'identifiant",
"tableVisibilityMode-allowPrivateOnly": "Visibilité des tableaux: N'autoriser que des tableaux privés",
"tableVisibilityMode" : "Visibilité des tableaux",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,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 du tableau",
+ "boardSubtaskSettingsPopup-title": "Paramètres des sous-tâches",
"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 :",
@@ -847,7 +863,7 @@
"r-uncheck": "Décocher",
"r-item": "élément",
"r-of-checklist": "de la check-list",
- "r-send-email": "Envoyer un email",
+ "r-send-email": "Envoyer un courriel",
"r-to": "à",
"r-of": "sur",
"r-subject": "sujet",
@@ -856,7 +872,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 un email",
+ "r-d-send-email": "Envoyer le courriel",
"r-d-send-email-to": "à",
"r-d-send-email-subject": "sujet",
"r-d-send-email-message": "message",
@@ -1015,6 +1031,8 @@
"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é.",
@@ -1320,8 +1338,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": "Active Scheduled Jobs",
- "add-cron-job": "Add Scheduled Job",
+ "active-cron-jobs": "Travaux actifs planifiés",
+ "add-cron-job": "Ajouter un travail planifié",
"add-cron-job-placeholder": "Add Scheduled Job functionality coming soon",
"attachment-storage-configuration": "Attachment Storage Configuration",
"attachments-path": "Attachments Path",
@@ -1335,8 +1353,8 @@
"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-jobs": "Travaux planifiés",
+ "cron-migrations": "Migrations planifiées",
"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",
@@ -1395,34 +1413,97 @@
"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",
+ "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...",
+
+ "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": "Finalize",
+ "step-delete-duplicate-empty-lists": "Supprimer les listes vides en doublon ? ",
+ "step-ensure-lost-cards-swimlane": "Ensure Lost Cards Swimlane",
+ "step-restore-lists": "Restore Lists",
+ "step-restore-cards": "Restaurer les cartes",
+ "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é",
"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",
+ "cpu-cores": "Cœurs du CPU ",
+ "cpu-usage": "Utilisation du CPU",
"current-action": "Current Action",
- "database-migration": "Database Migration",
+ "database-migration": "Migration base de données",
"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",
+ "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",
"export-monitoring": "Export Monitoring",
"filesystem-attachments": "Filesystem Attachments",
"filesystem-size": "Filesystem Size",
@@ -1431,22 +1512,22 @@
"gridfs-attachments": "GridFS Attachments",
"gridfs-size": "GridFS Size",
"gridfs-storage": "GridFS",
- "hide-list-on-minicard": "Hide List on Minicard",
+ "hide-list-on-minicard": "Masquer la liste sur la mini-carte",
"idle-migration": "Idle Migration",
"job-description": "Job Description",
"job-details": "Job Details",
"job-name": "Job Name",
"job-queue": "Job Queue",
- "last-run": "Last Run",
+ "last-run": "Dernière exécution",
"max-concurrent": "Max Concurrent",
- "memory-usage": "Memory Usage",
+ "memory-usage": "Utilisation de la mémoire",
"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": "Seuil CPU (%)",
"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)",
@@ -1460,26 +1541,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": "Next",
- "next-run": "Next Run",
+ "next": "Suivant",
+ "next-run": "Prochaine exécution",
"of": "sur",
- "operation-type": "Operation Type",
+ "operation-type": "Type d'opération",
"overall-progress": "Overall Progress",
"page": "Page",
"pause-migration": "Pause Migration",
- "previous": "Previous",
+ "previous": "Précédent",
"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",
+ "run-once": "Exécuter une fois",
+ "s3-attachments": "Pièces jointes S3",
+ "s3-size": "Taille S3",
"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",
+ "show-list-on-minicard": "Afficher la liste sur la mini-carte",
"showing": "Showing",
"start-test-operation": "Start Test Operation",
"start-time": "Start Time",
@@ -1489,8 +1570,8 @@
"system-resources": "System Resources",
"total-attachments": "Total Attachments",
"total-operations": "Total Operations",
- "total-size": "Total Size",
- "unmigrated-boards": "Unmigrated Boards",
+ "total-size": "Taille totale",
+ "unmigrated-boards": "Tableaux non migrés",
"weight": "Poids",
"idle": "Inactif",
"complete": "Terminé",
diff --git a/imports/i18n/data/fy-NL.i18n.json b/imports/i18n/data/fy-NL.i18n.json
index 12e76c28d..acf3c6934 100644
--- a/imports/i18n/data/fy-NL.i18n.json
+++ b/imports/i18n/data/fy-NL.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Date",
"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",
+ "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",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/fy.i18n.json b/imports/i18n/data/fy.i18n.json
index 12e76c28d..acf3c6934 100644
--- a/imports/i18n/data/fy.i18n.json
+++ b/imports/i18n/data/fy.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Date",
"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",
+ "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",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/gl-ES.i18n.json b/imports/i18n/data/gl-ES.i18n.json
index 7988d171e..ab6c97129 100644
--- a/imports/i18n/data/gl-ES.i18n.json
+++ b/imports/i18n/data/gl-ES.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Data",
"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",
+ "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": "Rexeitar",
"default-avatar": "Avatar predeterminado",
"delete": "Eliminar",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/gl.i18n.json b/imports/i18n/data/gl.i18n.json
index 5e42cfcef..088d60d69 100644
--- a/imports/i18n/data/gl.i18n.json
+++ b/imports/i18n/data/gl.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Data",
"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",
+ "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": "Rexeitar",
"default-avatar": "Avatar predeterminado",
"delete": "Eliminar",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/gu-IN.i18n.json b/imports/i18n/data/gu-IN.i18n.json
index 726f9caac..b6aac02e5 100644
--- a/imports/i18n/data/gu-IN.i18n.json
+++ b/imports/i18n/data/gu-IN.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Date",
"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",
+ "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",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/he-IL.i18n.json b/imports/i18n/data/he-IL.i18n.json
index 131a74c7e..0484f7b10 100644
--- a/imports/i18n/data/he-IL.i18n.json
+++ b/imports/i18n/data/he-IL.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Date",
"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",
+ "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",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/he.i18n.json b/imports/i18n/data/he.i18n.json
index 5e4220237..69afb7d25 100644
--- a/imports/i18n/data/he.i18n.json
+++ b/imports/i18n/data/he.i18n.json
@@ -78,6 +78,18 @@
"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": "הוספת קובץ מצורף",
@@ -337,6 +349,7 @@
"copyManyCardsPopup-format": "[ {\"title\": \"כותרת כרטיס ראשון\", \"description\":\"תיאור כרטיס ראשון\"}, {\"title\":\"כותרת כרטיס שני\",\"description\":\"תיאור כרטיס שני\"},{\"title\":\"כותרת כרטיס אחרון\",\"description\":\"תיאור כרטיס אחרון\"} ]",
"create": "יצירה",
"createBoardPopup-title": "יצירת לוח",
+ "createTemplateContainerPopup-title": "הוספת מכולה לתבנית",
"chooseBoardSourcePopup-title": "ייבוא לוח",
"createLabelPopup-title": "יצירת תווית",
"createCustomField": "יצירת שדה",
@@ -357,9 +370,9 @@
"custom-fields": "שדות מותאמים אישית",
"date": "תאריך",
"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",
+ "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": "סירוב",
"default-avatar": "תמונת משתמש כבררת מחדל",
"delete": "מחיקה",
@@ -385,6 +398,7 @@
"editNotificationPopup-title": "שינוי דיווח",
"editProfilePopup-title": "עריכת פרופיל",
"email": "דוא״ל",
+ "email-address": "כתובת דוא״ל",
"email-enrollAccount-subject": "נוצר עבורך חשבון באתר __siteName__",
"email-enrollAccount-text": "__user__ שלום,\n\nכדי להתחיל להשתמש בשירות, יש ללחוץ על הקישור המופיע להלן.\n\n__url__\n\nתודה.",
"email-fail": "שליחת ההודעה בדוא״ל נכשלה",
@@ -754,6 +768,8 @@
"delete-board-confirm-popup": "כל הרשימות, הכרטיסים, התווית והפעולות יימחקו ולא תהיה לך דרך לשחזר את תכני הלוח. אין אפשרות לבטל.",
"boardDeletePopup-title": "למחוק את הלוח?",
"delete-board": "מחיקת לוח",
+ "delete-duplicate-lists": "מחיקת רשימות כפולות",
+ "delete-duplicate-lists-confirm": "להמשיך? הפעולה הזאת תמחק את כל הרשימות הכפולות שיש להן את אותו השם ואינן מכילות כרטיסים.",
"default-subtasks-board": "תת־משימות עבור הלוח __board__",
"default": "בררת מחדל",
"defaultdefault": "בררת מחדל",
@@ -761,7 +777,7 @@
"subtask-settings": "הגדרות תתי משימות",
"card-settings": "הגדרות כרטיס",
"minicard-settings": "הגדרות כרטיסון",
- "boardSubtaskSettingsPopup-title": "הגדרות תת־משימות בלוח",
+ "boardSubtaskSettingsPopup-title": "הגדרות תתי משימות",
"boardCardSettingsPopup-title": "הגדרות כרטיס",
"boardMinicardSettingsPopup-title": "הגדרות כרטיסון",
"deposit-subtasks-board": "הפקדת תת־משימות ללוח הזה:",
@@ -1015,6 +1031,8 @@
"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’ לא נמצא.",
@@ -1399,7 +1417,70 @@
"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",
+ "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...",
+
+ "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-old-jobs": "ניקוי משימות ישנות",
"completed": "הושלמה",
diff --git a/imports/i18n/data/hi-IN.i18n.json b/imports/i18n/data/hi-IN.i18n.json
index 51adf2ac8..727186475 100644
--- a/imports/i18n/data/hi-IN.i18n.json
+++ b/imports/i18n/data/hi-IN.i18n.json
@@ -78,6 +78,18 @@
"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": "संलग्न करें",
@@ -337,6 +349,7 @@
"copyManyCardsPopup-format": "[{\"title\":\"पहला कार्ड शीर्षक\",\"description\":\"पहला कार्ड विवरण\"},{\"title\":\"दूसरा कार्ड शीर्षक\",\"description\":\"दूसरा कार्ड विवरण\"},{\"title\":\"अंतिम कार्ड शीर्षक\",\"description\":\"अंतिम कार्ड विवरण\" }]",
"create": "निर्माण करना",
"createBoardPopup-title": "बोर्ड निर्माण करना",
+ "createTemplateContainerPopup-title": "Add Template Container",
"chooseBoardSourcePopup-title": "बोर्ड आयात",
"createLabelPopup-title": "नामपत्र निर्माण",
"createCustomField": "क्षेत्र निर्माण",
@@ -357,9 +370,9 @@
"custom-fields": "प्रचलन क्षेत्र",
"date": "दिनांक",
"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",
+ "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",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,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 तक यह बोर्ड:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/hi.i18n.json b/imports/i18n/data/hi.i18n.json
index 65e21e540..854bfc00d 100644
--- a/imports/i18n/data/hi.i18n.json
+++ b/imports/i18n/data/hi.i18n.json
@@ -78,6 +78,18 @@
"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": "संलग्न करें",
@@ -337,6 +349,7 @@
"copyManyCardsPopup-format": "[{\"title\":\"पहला कार्ड शीर्षक\",\"description\":\"पहला कार्ड विवरण\"},{\"title\":\"दूसरा कार्ड शीर्षक\",\"description\":\"दूसरा कार्ड विवरण\"},{\"title\":\"अंतिम कार्ड शीर्षक\",\"description\":\"अंतिम कार्ड विवरण\" }]",
"create": "निर्माण करना",
"createBoardPopup-title": "बोर्ड निर्माण करना",
+ "createTemplateContainerPopup-title": "Add Template Container",
"chooseBoardSourcePopup-title": "बोर्ड आयात",
"createLabelPopup-title": "नामपत्र निर्माण",
"createCustomField": "क्षेत्र निर्माण",
@@ -357,9 +370,9 @@
"custom-fields": "प्रचलन क्षेत्र",
"date": "दिनांक",
"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",
+ "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",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,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 तक यह बोर्ड:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/hr.i18n.json b/imports/i18n/data/hr.i18n.json
index 284be25dd..475e99049 100644
--- a/imports/i18n/data/hr.i18n.json
+++ b/imports/i18n/data/hr.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Prilagođena polja",
"date": "Datum",
"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",
+ "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": "Odustani",
"default-avatar": "Zadani avatar",
"delete": "Obriši",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/hu.i18n.json b/imports/i18n/data/hu.i18n.json
index 0a3250bac..1f2e257be 100644
--- a/imports/i18n/data/hu.i18n.json
+++ b/imports/i18n/data/hu.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Egyéni mezők",
"date": "Dátum",
"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",
+ "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": "Elutasítás",
"default-avatar": "Alapértelmezett avatár",
"delete": "Törlés",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Rész-feladat beállításai",
"card-settings": "Kátya beállítások",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Tábla Rész-feladatok beállításai",
+ "boardSubtaskSettingsPopup-title": "Rész-feladat 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:",
@@ -1015,6 +1031,8 @@
"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ó",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/hy.i18n.json b/imports/i18n/data/hy.i18n.json
index d9066016e..c16f6a92f 100644
--- a/imports/i18n/data/hy.i18n.json
+++ b/imports/i18n/data/hy.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Date",
"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",
+ "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",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/id.i18n.json b/imports/i18n/data/id.i18n.json
index a12bb2ded..ce83f1f26 100644
--- a/imports/i18n/data/id.i18n.json
+++ b/imports/i18n/data/id.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Tanggal",
"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",
+ "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": "Tolak",
"default-avatar": "Avatar standar",
"delete": "Hapus",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Pengaturan Kartu",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Pengaturan Kartu",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/ig.i18n.json b/imports/i18n/data/ig.i18n.json
index eaed73339..580fbb197 100644
--- a/imports/i18n/data/ig.i18n.json
+++ b/imports/i18n/data/ig.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Date",
"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",
+ "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",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/it.i18n.json b/imports/i18n/data/it.i18n.json
index d8f33ad9f..e82709ca0 100644
--- a/imports/i18n/data/it.i18n.json
+++ b/imports/i18n/data/it.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Campi personalizzati",
"date": "Data",
"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",
+ "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": "Rifiuta",
"default-avatar": "Avatar predefinito",
"delete": "Elimina",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Impostazioni sotto-compiti",
"card-settings": "Impostazioni scheda",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Impostazioni sotto-compiti della bacheca",
+ "boardSubtaskSettingsPopup-title": "Impostazioni sotto-compiti",
"boardCardSettingsPopup-title": "Impostazioni scheda",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposita i sotto compiti in questa bacheca",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/ja-HI.i18n.json b/imports/i18n/data/ja-HI.i18n.json
index d728d70b9..ef8a053d6 100644
--- a/imports/i18n/data/ja-HI.i18n.json
+++ b/imports/i18n/data/ja-HI.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Date",
"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",
+ "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",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/ja.i18n.json b/imports/i18n/data/ja.i18n.json
index c8a0fd261..5403ebdcc 100644
--- a/imports/i18n/data/ja.i18n.json
+++ b/imports/i18n/data/ja.i18n.json
@@ -78,6 +78,18 @@
"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": "添付ファイルを追加",
@@ -337,6 +349,7 @@
"copyManyCardsPopup-format": "[ {\"title\": \"1つ目のカードタイトル\", \"description\":\"1つ目のカードの説明\"}, {\"title\":\"2つ目のカードタイトル\",\"description\":\"2つ目のカードの説明\"},{\"title\":\"最後のカードタイトル\",\"description\":\"最後のカードの説明\"} ]",
"create": "作成",
"createBoardPopup-title": "ボードの作成",
+ "createTemplateContainerPopup-title": "テンプレートコンテナを追加",
"chooseBoardSourcePopup-title": "ボードをインポート",
"createLabelPopup-title": "ラベルの作成",
"createCustomField": "フィールドを作成",
@@ -357,9 +370,9 @@
"custom-fields": "カスタムフィールド",
"date": "日付",
"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",
+ "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": "拒否",
"default-avatar": "デフォルトのアバター",
"delete": "削除",
@@ -385,6 +398,7 @@
"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": "メールの送信に失敗しました",
@@ -754,6 +768,8 @@
"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": "デフォルト",
@@ -761,7 +777,7 @@
"subtask-settings": "サブタスク設定",
"card-settings": "カード設定",
"minicard-settings": "ミニカード設定",
- "boardSubtaskSettingsPopup-title": "ボードのサブタスク設定",
+ "boardSubtaskSettingsPopup-title": "サブタスク設定",
"boardCardSettingsPopup-title": "カード設定",
"boardMinicardSettingsPopup-title": "ミニカード設定",
"deposit-subtasks-board": "サブタスクの作成先ボード:",
@@ -1015,6 +1031,8 @@
"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」は見つかりませんでした。",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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": "完了した時",
diff --git a/imports/i18n/data/ka.i18n.json b/imports/i18n/data/ka.i18n.json
index c32c78d6b..2c6c8ebfa 100644
--- a/imports/i18n/data/ka.i18n.json
+++ b/imports/i18n/data/ka.i18n.json
@@ -78,6 +78,18 @@
"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": "მიბმული ფაილის დამატება",
@@ -337,6 +349,7 @@
"copyManyCardsPopup-format": "[ {\"სათაური\": \"პირველი ბარათის სათაური\", \"აღწერა\":\"პირველი ბარათის აღწერა\"}, {\"სათაური\":\"მეორე ბარათის სათაური\",\"აღწერა\":\"მეორე ბარათის აღწერა\"},{\"სათაური\":\"ბოლო ბარათის სათაური\",\"აღწერა\":\"ბოლო ბარათის აღწერა\"} ]",
"create": "შექმნა",
"createBoardPopup-title": "დაფის შექმნა",
+ "createTemplateContainerPopup-title": "Add Template Container",
"chooseBoardSourcePopup-title": "დაფის იმპორტი",
"createLabelPopup-title": "ნიშნის შექმნა",
"createCustomField": "ველის შექმნა",
@@ -357,9 +370,9 @@
"custom-fields": "მომხმარებლის ველი",
"date": "თარიღი",
"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",
+ "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": "უარყოფა",
"default-avatar": "სტანდარტული ავატარი",
"delete": "წაშლა",
@@ -385,6 +398,7 @@
"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": "ელ.ფოსტის გაგზავნა ვერ მოხერხდა",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "ქვესაქმიანობების პარამეტრები",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "ქვესაქმიანობების პარამეტრები",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/km.i18n.json b/imports/i18n/data/km.i18n.json
index d7c679444..a88c7f2c1 100644
--- a/imports/i18n/data/km.i18n.json
+++ b/imports/i18n/data/km.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Date",
"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",
+ "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",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/ko-KR.i18n.json b/imports/i18n/data/ko-KR.i18n.json
index 51809db3c..c0dbd8074 100644
--- a/imports/i18n/data/ko-KR.i18n.json
+++ b/imports/i18n/data/ko-KR.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Date",
"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",
+ "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",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/ko.i18n.json b/imports/i18n/data/ko.i18n.json
index 8669aca44..0dea02432 100644
--- a/imports/i18n/data/ko.i18n.json
+++ b/imports/i18n/data/ko.i18n.json
@@ -78,6 +78,18 @@
"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": "첨부파일 추가",
@@ -190,9 +202,9 @@
"board-view-collapse": "접기",
"board-view-gantt": "간트",
"board-view-lists": "목록들",
- "bucket-example": "Like \"Bucket List\" for example",
- "calendar-previous-month-label": "Previous Month",
- "calendar-next-month-label": "Next Month",
+ "bucket-example": "예: \"꼭 하고싶은 일 목록\"",
+ "calendar-previous-month-label": "이전 월",
+ "calendar-next-month-label": "다음 월",
"cancel": "취소",
"card-archived": "이 카드는 보관함으로 이동 되었습니다.",
"board-archived": "이 보드는 보관함으로 이동 되었습니다.",
@@ -337,6 +349,7 @@
"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": "필드 생성",
@@ -356,10 +369,10 @@
"custom-field-text": "텍스트",
"custom-fields": "사용자정의 항목",
"date": "날짜",
- "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",
+ "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": "쇠퇴",
"default-avatar": "기본 아바타",
"delete": "삭제",
@@ -385,6 +398,7 @@
"editNotificationPopup-title": "알림 수정",
"editProfilePopup-title": "프로필 변경",
"email": "이메일",
+ "email-address": "이메일 주소",
"email-enrollAccount-subject": "__siteName__에 계정 생성이 완료되었습니다.",
"email-enrollAccount-text": "안녕하세요. __user__님,\n\n시작하려면 아래링크를 클릭해 주세요.\n\n__url__\n\n감사합니다.",
"email-fail": "이메일 전송 실패",
@@ -754,6 +768,8 @@
"delete-board-confirm-popup": "모든 목록, 카드, 레이블 및 활동이 삭제되고 보드 내용을 복구할 수 없습니다. 실행 취소는 불가능합니다.",
"boardDeletePopup-title": "보드 삭제?",
"delete-board": "보드 삭제",
+ "delete-duplicate-lists": "중복 목록 삭제",
+ "delete-duplicate-lists-confirm": "확실합니까? 이렇게 하면 이름이 같고 카드가 없는 모든 중복 목록이 삭제됩니다.",
"default-subtasks-board": "Subtasks for __board__ board",
"default": "기본",
"defaultdefault": "기본",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "카드 설정",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "카드 설정",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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 을 찾을 수 없습니다.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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": "완료",
diff --git a/imports/i18n/data/lt.i18n.json b/imports/i18n/data/lt.i18n.json
index 726f9caac..b6aac02e5 100644
--- a/imports/i18n/data/lt.i18n.json
+++ b/imports/i18n/data/lt.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Date",
"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",
+ "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",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/lv.i18n.json b/imports/i18n/data/lv.i18n.json
index 5e2807cd0..b68d6e47f 100644
--- a/imports/i18n/data/lv.i18n.json
+++ b/imports/i18n/data/lv.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Lauki",
"date": "Datums",
"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",
+ "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": "Noraidīt",
"default-avatar": "Noklusētais attēls",
"delete": "Dzēst",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Apakšuzdevumu iestatījumi",
"card-settings": "Kartiņas iestatījumi",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Dēļa apakšuzdevumu iestatījumi",
+ "boardSubtaskSettingsPopup-title": "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:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/mk.i18n.json b/imports/i18n/data/mk.i18n.json
index ab4eefb62..5ac7384f0 100644
--- a/imports/i18n/data/mk.i18n.json
+++ b/imports/i18n/data/mk.i18n.json
@@ -78,6 +78,18 @@
"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": "Додај прилог",
@@ -337,6 +349,7 @@
"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": "Креирај Поле",
@@ -357,9 +370,9 @@
"custom-fields": "Собствени полета",
"date": "Дата",
"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",
+ "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": "Откажи",
"default-avatar": "Основен аватар",
"delete": "Избриши",
@@ -385,6 +398,7 @@
"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": "Неуспешно изпращане на имейла",
@@ -754,6 +768,8 @@
"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": "по подразбиране",
@@ -761,7 +777,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:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/mn.i18n.json b/imports/i18n/data/mn.i18n.json
index f778bfdec..eb1dbc66d 100644
--- a/imports/i18n/data/mn.i18n.json
+++ b/imports/i18n/data/mn.i18n.json
@@ -78,6 +78,18 @@
"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": "Хавсралт нэмэх",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Date",
"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",
+ "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",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/ms-MY.i18n.json b/imports/i18n/data/ms-MY.i18n.json
index 9b9387902..7c102b2ef 100644
--- a/imports/i18n/data/ms-MY.i18n.json
+++ b/imports/i18n/data/ms-MY.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -89,13 +101,13 @@
"setListWidthPopup-title": "Tetapkan Lebar",
"set-list-width": "Tetapkan Lebar",
"set-list-width-value": "Tetapkan lebar minimum dan maksimum (piksel)",
- "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",
+ "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",
"add-swimlane": "Add Swimlane",
"add-subtask": "Add Subtask",
"add-checklist": "Add Checklist",
@@ -103,10 +115,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": "Add cover image to minicard",
+ "add-cover": "Tambah imej depan pada kad mini",
"add-label": "Add Label",
"add-list": "Tambah Senarai",
- "add-after-list": "Add After List",
+ "add-after-list": "Tambah selepas senarai",
"add-members": "Tambah Ahli",
"added": "Ditambah",
"addMemberPopup-title": "Ahli-ahli",
@@ -125,7 +137,7 @@
"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-board-confirm": "Anda pasti untuk mengarkibkan papan ini?",
"archive-card": "Move Card to Archive",
"archive-list": "Move List to Archive",
"archive-swimlane": "Move Swimlane to Archive",
@@ -147,13 +159,13 @@
"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)",
+ "avatar-too-big": "Saiz Avatar terlalu besar (__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",
+ "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",
"show-at-all-boards-page" : "Show at All Boards page",
"board-info-on-my-boards" : "All Boards Settings",
"boardInfoOnMyBoardsPopup-title" : "All Boards Settings",
@@ -166,9 +178,9 @@
"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",
+ "boardChangeBackgroundImagePopup-title": "Ubah imej latar",
"allBoardsChangeColorPopup-title": "Change color",
- "allBoardsChangeBackgroundImagePopup-title": "Change Background Image",
+ "allBoardsChangeBackgroundImagePopup-title": "Ubah imej latar",
"boardChangeTitlePopup-title": "Rename Board",
"boardChangeVisibilityPopup-title": "Change Visibility",
"boardChangeWatchPopup-title": "Change Watch",
@@ -177,22 +189,22 @@
"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%):",
+ "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%)",
"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",
+ "bucket-example": "Contohnya \"Bucket List\"",
+ "calendar-previous-month-label": "Bulan Sebelum",
+ "calendar-next-month-label": "Bulan Depan",
"cancel": "Cancel",
"card-archived": "This card is moved to Archive.",
"board-archived": "This board is moved to Archive.",
@@ -277,9 +289,9 @@
"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",
+ "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.",
"clipboard": "Clipboard or drag & drop",
"close": "Close",
"close-board": "Close Board",
@@ -311,7 +323,7 @@
"color-white": "white",
"color-yellow": "yellow",
"unset-color": "Unset",
- "comments": "Comments",
+ "comments": "Komen",
"comment": "Comment",
"comment-placeholder": "Write Comment",
"comment-only": "Comment only",
@@ -337,6 +349,7 @@
"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",
@@ -356,10 +369,10 @@
"custom-field-text": "Text",
"custom-fields": "Custom Fields",
"date": "Date",
- "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",
+ "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",
"decline": "Decline",
"default-avatar": "Default avatar",
"delete": "Delete",
@@ -385,6 +398,7 @@
"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",
@@ -398,14 +412,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": "Enable vertical scrollbars",
+ "enable-vertical-scrollbars": "Dayakan bar skrol melintang",
"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-csv-schema": "CSV(Comma Separated Values)/TSV (Tab Separated Values) anda tidak mengikut format yang betul dengan maklumat yang bersesuaian.",
"error-list-doesNotExist": "This list does not exist",
"error-user-doesNotExist": "This user does not exist",
"error-user-notAllowSelf": "You can not invite yourself",
@@ -444,7 +458,7 @@
"filter-overdue": "Overdue",
"filter-due-today": "Due today",
"filter-due-this-week": "Due this week",
- "filter-due-next-week": "Due next week",
+ "filter-due-next-week": "Tamat minggu depan",
"filter-due-tomorrow": "Due tomorrow",
"list-filter-label": "Filter List by Title",
"filter-clear": "Clear filter",
@@ -573,7 +587,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": "Remove cover image from minicard",
+ "remove-cover": "Hapus imej depan daripada kad mini",
"remove-from-board": "Remove from Board",
"remove-label": "Remove Label",
"listDeletePopup-title": "Delete List ?",
@@ -595,14 +609,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": "Add yourself to current card",
+ "shortcut-add-self": "Tambah diri sendiri kepada kad ini",
"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-filter-my-assigned-cards": "Tapis kad sendiri",
"shortcut-show-shortcuts": "Bring up this shortcuts list",
"shortcut-toggle-filterbar": "Toggle Filter Sidebar",
"shortcut-toggle-searchbar": "Toggle Search Sidebar",
@@ -637,9 +651,9 @@
"upload": "Upload",
"upload-avatar": "Upload an avatar",
"uploaded-avatar": "Uploaded an avatar",
- "uploading-files": "Uploading files",
- "upload-failed": "Upload failed",
- "upload-completed": "Upload completed",
+ "uploading-files": "Muat naik fail",
+ "upload-failed": "Muat naik gagal",
+ "upload-completed": "Muat naik selesai",
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,16 +777,16 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks 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",
+ "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",
"prefix-with-full-path": "Prefix with full path",
"prefix-with-parent": "Prefix with parent",
"subtext-with-full-path": "Subtext with full path",
@@ -883,7 +899,7 @@
"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-board-note": "Nota: Tinggalkan ruang kosong untuk padankan setiap nilai yang mungkin.",
"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",
@@ -914,10 +930,10 @@
"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: ",
+ "duplicate-board-confirm": "Anda pasti untuk menduplikasi papan ini?",
+ "org-number": "Jumlah Organisasi ialah:",
+ "team-number": "Jumlah kumpulan ialah:",
+ "people-number": "Jumlah individu ialah:",
"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",
@@ -985,7 +1001,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": "Hide finished checklist",
+ "hide-finished-checklist": "Sembunyikan senarai semak yang telah selesai",
"task": "Task",
"create-task": "Create Task",
"ok": "OK",
@@ -993,7 +1009,7 @@
"teams": "Teams",
"displayName": "Nama Paparan",
"shortName": "Nama Ringkas",
- "autoAddUsersWithDomainName": "Automatically add users with the domain name",
+ "autoAddUsersWithDomainName": "Tambah pengguna dengan nama domain ini secara lalai",
"website": "Laman Sesawang",
"person": "Person",
"my-cards": "Kad Saya",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/ms.i18n.json b/imports/i18n/data/ms.i18n.json
index c6bd2af44..966475e88 100644
--- a/imports/i18n/data/ms.i18n.json
+++ b/imports/i18n/data/ms.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Ruangan Khas",
"date": "Tarikh",
"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",
+ "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": "Ditolak",
"default-avatar": "Avatar Lalai",
"delete": "Hapus",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Tetapan Subtugas",
"card-settings": "Tetapan Kad",
"minicard-settings": "Tetapan kadmini",
- "boardSubtaskSettingsPopup-title": "Tetapan Subtugas Papan",
+ "boardSubtaskSettingsPopup-title": "Tetapan Subtugas",
"boardCardSettingsPopup-title": "Tetapan Kad",
"boardMinicardSettingsPopup-title": "Tetapan kadmini",
"deposit-subtasks-board": "Masukkan subtugas kepada papan ini:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/nb.i18n.json b/imports/i18n/data/nb.i18n.json
index 770b79cd2..4557e6542 100644
--- a/imports/i18n/data/nb.i18n.json
+++ b/imports/i18n/data/nb.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Tilpassede felt",
"date": "Dato",
"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",
+ "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": "Avvis",
"default-avatar": "Standard avatar",
"delete": "Slett",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Innstillinger Underoppgave",
"card-settings": "Innstillinger Kort",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Innstillinger Tavle Underoppgaver",
+ "boardSubtaskSettingsPopup-title": "Innstillinger Underoppgave",
"boardCardSettingsPopup-title": "Innstillinger Kort",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Sett inn Underoppgave på Tavle:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/nl-NL.i18n.json b/imports/i18n/data/nl-NL.i18n.json
index d1f9e1076..46eb730b3 100644
--- a/imports/i18n/data/nl-NL.i18n.json
+++ b/imports/i18n/data/nl-NL.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Maatwerkvelden",
"date": "Datum",
"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",
+ "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": "Weigeren",
"default-avatar": "Standaard avatar",
"delete": "Verwijderen",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtaak Instellingen",
"card-settings": "Kaart Instellingen",
"minicard-settings": "Minikaart Instellingen",
- "boardSubtaskSettingsPopup-title": "Bord Subtaak Instellingen",
+ "boardSubtaskSettingsPopup-title": "Subtaak Instellingen",
"boardCardSettingsPopup-title": "Kaart Instellingen",
"boardMinicardSettingsPopup-title": "Minikaart Instellingen",
"deposit-subtasks-board": "Plaats subtaken op dit bord:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/nl.i18n.json b/imports/i18n/data/nl.i18n.json
index a4602b8fb..79b9a4b75 100644
--- a/imports/i18n/data/nl.i18n.json
+++ b/imports/i18n/data/nl.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -190,9 +202,9 @@
"board-view-collapse": "Inklappen",
"board-view-gantt": "Gantt",
"board-view-lists": "Lijsten",
- "bucket-example": "Like \"Bucket List\" for example",
- "calendar-previous-month-label": "Previous Month",
- "calendar-next-month-label": "Next Month",
+ "bucket-example": "Zoals bijvoorbeeld \"Bucketlist\"",
+ "calendar-previous-month-label": "Vorige Maand",
+ "calendar-next-month-label": "Volgende Maand",
"cancel": "Annuleren",
"card-archived": "Deze kaart is verplaatst naar Archief.",
"board-archived": "Dit bord is verplaatst naar Archief.",
@@ -337,6 +349,7 @@
"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",
@@ -356,10 +369,10 @@
"custom-field-text": "Tekst",
"custom-fields": "Maatwerkvelden",
"date": "Datum",
- "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",
+ "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",
"decline": "Weigeren",
"default-avatar": "Standaard avatar",
"delete": "Verwijderen",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtaak Instellingen",
"card-settings": "Kaart Instellingen",
"minicard-settings": "Minikaart Instellingen",
- "boardSubtaskSettingsPopup-title": "Bord Subtaak Instellingen",
+ "boardSubtaskSettingsPopup-title": "Subtaak Instellingen",
"boardCardSettingsPopup-title": "Kaart Instellingen",
"boardMinicardSettingsPopup-title": "Minikaart Instellingen",
"deposit-subtasks-board": "Plaats subtaken op dit bord:",
@@ -920,7 +936,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": "Haal alles terug",
+ "restore-all": "Herstel alles",
"delete-all": "Verwijder alles",
"loading": "Laden, even geduld.",
"previous_as": "laatste keer was",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/oc.i18n.json b/imports/i18n/data/oc.i18n.json
index 072f7cce3..9c3543796 100644
--- a/imports/i18n/data/oc.i18n.json
+++ b/imports/i18n/data/oc.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Camps personalizats",
"date": "Data",
"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",
+ "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": "Refusar",
"default-avatar": "Fòto per defaut",
"delete": "Suprimir",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/or_IN.i18n.json b/imports/i18n/data/or_IN.i18n.json
index 12e76c28d..acf3c6934 100644
--- a/imports/i18n/data/or_IN.i18n.json
+++ b/imports/i18n/data/or_IN.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Date",
"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",
+ "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",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/pa.i18n.json b/imports/i18n/data/pa.i18n.json
index 726f9caac..b6aac02e5 100644
--- a/imports/i18n/data/pa.i18n.json
+++ b/imports/i18n/data/pa.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Date",
"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",
+ "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",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/pl-PL.i18n.json b/imports/i18n/data/pl-PL.i18n.json
index b48f67c24..c7ea811a7 100644
--- a/imports/i18n/data/pl-PL.i18n.json
+++ b/imports/i18n/data/pl-PL.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Niestandardowe pola",
"date": "Data",
"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",
+ "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": "Odrzuć",
"default-avatar": "Domyślny avatar",
"delete": "Usuń",
@@ -385,6 +398,7 @@
"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ę.",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Ustawienia podzadań",
"card-settings": "Ustawienia kart",
"minicard-settings": "Ustawienia miniatur kart",
- "boardSubtaskSettingsPopup-title": "Ustawienia tablicy podzadań",
+ "boardSubtaskSettingsPopup-title": "Ustawienia podzadań",
"boardCardSettingsPopup-title": "Ustawienia kart",
"boardMinicardSettingsPopup-title": "Ustawienia miniatur kart",
"deposit-subtasks-board": "Twórz podzadania na tablicy:",
@@ -1015,6 +1031,8 @@
"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'.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/pl.i18n.json b/imports/i18n/data/pl.i18n.json
index 0e3d8c56f..c01e9746d 100644
--- a/imports/i18n/data/pl.i18n.json
+++ b/imports/i18n/data/pl.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Niestandardowe pola",
"date": "Data",
"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",
+ "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": "Odrzuć",
"default-avatar": "Domyślny avatar",
"delete": "Usuń",
@@ -385,6 +398,7 @@
"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ę.",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Ustawienia podzadań",
"card-settings": "Ustawienia kart",
"minicard-settings": "Ustawienia miniatur kart",
- "boardSubtaskSettingsPopup-title": "Ustawienia tablicy podzadań",
+ "boardSubtaskSettingsPopup-title": "Ustawienia podzadań",
"boardCardSettingsPopup-title": "Ustawienia kart",
"boardMinicardSettingsPopup-title": "Ustawienia miniatur kart",
"deposit-subtasks-board": "Twórz podzadania na tablicy:",
@@ -1015,6 +1031,8 @@
"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'.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/pt-BR.i18n.json b/imports/i18n/data/pt-BR.i18n.json
index 7045ba99d..1a44664bb 100644
--- a/imports/i18n/data/pt-BR.i18n.json
+++ b/imports/i18n/data/pt-BR.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Campos customizados",
"date": "Data",
"date-format": "Formato da Data",
- "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",
+ "date-format-yyyy-mm-dd": "AAAA-MM-DD",
+ "date-format-dd-mm-yyyy": "DD-MM-AAAA",
+ "date-format-mm-dd-yyyy": "MM-DD-AAAA",
"decline": "Rejeitar",
"default-avatar": "Avatar padrão",
"delete": "Excluir",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,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 das subtarefas do quadro",
+ "boardSubtaskSettingsPopup-title": "Configurações de subtarefas",
"boardCardSettingsPopup-title": "Configurações do Cartão",
"boardMinicardSettingsPopup-title": "Configurações do Mini cartão",
"deposit-subtasks-board": "Inserir subtarefas a este quadro:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/pt.i18n.json b/imports/i18n/data/pt.i18n.json
index 7bd7d738b..2aef98106 100644
--- a/imports/i18n/data/pt.i18n.json
+++ b/imports/i18n/data/pt.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Campos Personalizados",
"date": "Data",
"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",
+ "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": "Rejeitar",
"default-avatar": "Avatar por omissão",
"delete": "Apagar",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Configurações de Sub-tarefas",
"card-settings": "Definições do Cartão",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Configurações das Sub-tarefas do Quadro",
+ "boardSubtaskSettingsPopup-title": "Configurações de Sub-tarefas",
"boardCardSettingsPopup-title": "Definições do Cartão",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Depositar sub-tarefas neste quadro:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/pt_PT.i18n.json b/imports/i18n/data/pt_PT.i18n.json
index 4dd503d43..f355d4cb7 100644
--- a/imports/i18n/data/pt_PT.i18n.json
+++ b/imports/i18n/data/pt_PT.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Campos Personalizados",
"date": "Data",
"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",
+ "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": "Rejeitar",
"default-avatar": "Avatar por omissão",
"delete": "Apagar",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,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 das Sub-tarefas do Quadro",
+ "boardSubtaskSettingsPopup-title": "Configurações de Sub-tarefas",
"boardCardSettingsPopup-title": "Definições do Cartão",
"boardMinicardSettingsPopup-title": "Configurações do minicartão",
"deposit-subtasks-board": "Depositar sub-tarefas neste quadro:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/ro-RO.i18n.json b/imports/i18n/data/ro-RO.i18n.json
index df47fde36..4558b375a 100644
--- a/imports/i18n/data/ro-RO.i18n.json
+++ b/imports/i18n/data/ro-RO.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Date",
"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",
+ "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",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/ro.i18n.json b/imports/i18n/data/ro.i18n.json
index 530b05aba..289a3a45e 100644
--- a/imports/i18n/data/ro.i18n.json
+++ b/imports/i18n/data/ro.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Date",
"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",
+ "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",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/ru-UA.i18n.json b/imports/i18n/data/ru-UA.i18n.json
index d54bc7220..ad237aa07 100644
--- a/imports/i18n/data/ru-UA.i18n.json
+++ b/imports/i18n/data/ru-UA.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Date",
"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",
+ "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",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Настройки подзадач",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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": "Завершен",
diff --git a/imports/i18n/data/ru.i18n.json b/imports/i18n/data/ru.i18n.json
index e21cba238..04a83c4c7 100644
--- a/imports/i18n/data/ru.i18n.json
+++ b/imports/i18n/data/ru.i18n.json
@@ -78,6 +78,18 @@
"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": "Добавить вложение",
@@ -337,6 +349,7 @@
"copyManyCardsPopup-format": "[ {\"title\": \"Название первой карточки\", \"description\":\"Описание первой карточки\"}, {\"title\":\"Название второй карточки\",\"description\":\"Описание второй карточки\"},{\"title\":\"Название последней карточки\",\"description\":\"Описание последней карточки\"} ]",
"create": "Создать",
"createBoardPopup-title": "Создать доску",
+ "createTemplateContainerPopup-title": "Добавить Шаблон Контейнера",
"chooseBoardSourcePopup-title": "Импортировать доску",
"createLabelPopup-title": "Создать метку",
"createCustomField": "Создать поле",
@@ -357,9 +370,9 @@
"custom-fields": "Настраиваемые поля",
"date": "Дата",
"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",
+ "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": "Отклонить",
"default-avatar": "Аватар по умолчанию",
"delete": "Удалить",
@@ -385,6 +398,7 @@
"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 не удалась",
@@ -754,6 +768,8 @@
"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": "По умолчанию",
@@ -761,7 +777,7 @@
"subtask-settings": "Настройки подзадач",
"card-settings": "Настройки карточки",
"minicard-settings": "Настройки миникарточки",
- "boardSubtaskSettingsPopup-title": "Настройки подзадач для доски",
+ "boardSubtaskSettingsPopup-title": "Настройки подзадач",
"boardCardSettingsPopup-title": "Настройки карточки",
"boardMinicardSettingsPopup-title": "Настройки миникарточки",
"deposit-subtasks-board": "Отправлять подзадачи на доску:",
@@ -1015,6 +1031,8 @@
"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' не найдена.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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": "Завершен",
diff --git a/imports/i18n/data/sk.i18n.json b/imports/i18n/data/sk.i18n.json
index 0592a3d72..8dc0e0b52 100644
--- a/imports/i18n/data/sk.i18n.json
+++ b/imports/i18n/data/sk.i18n.json
@@ -78,6 +78,18 @@
"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",
@@ -337,6 +349,7 @@
"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",
@@ -357,9 +370,9 @@
"custom-fields": "Custom Fields",
"date": "Dátum",
"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",
+ "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": "Zmazať",
@@ -385,6 +398,7 @@
"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",
@@ -754,6 +768,8 @@
"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",
@@ -761,7 +777,7 @@
"subtask-settings": "Subtasks Settings",
"card-settings": "Card Settings",
"minicard-settings": "Minicard Settings",
- "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
"boardCardSettingsPopup-title": "Card Settings",
"boardMinicardSettingsPopup-title": "Minicard Settings",
"deposit-subtasks-board": "Deposit subtasks to this board:",
@@ -1015,6 +1031,8 @@
"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.",
@@ -1399,7 +1417,70 @@
"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...",
+
+ "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",
diff --git a/imports/i18n/data/sl.i18n.json b/imports/i18n/data/sl.i18n.json
index c494c3211..acf3c6934 100644
--- a/imports/i18n/data/sl.i18n.json
+++ b/imports/i18n/data/sl.i18n.json
@@ -1,89 +1,101 @@
{
- "accept": "Sprejmi",
+ "accept": "Accept",
"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-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": "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-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": "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",
+ "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": "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-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": "nedokončal kontrolni seznam %s",
- "activity-editComment": "uredil komentar %s",
- "activity-deleteComment": "izbrisal komentar %s",
+ "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": "Dodaj priponko",
- "add-board": "Dodaj tablo",
+ "add-attachment": "Add Attachment",
+ "add-board": "Add Board",
"add-template": "Add Template",
- "add-card": "Dodaj kartico",
+ "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",
@@ -96,60 +108,60 @@
"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",
+ "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": "Dodaj oznako",
- "add-list": "Dodaj seznam",
+ "add-label": "Add Label",
+ "add-list": "Add List",
"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.",
+ "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": "premaknjena v arhiv",
- "archive-all": "Premakni vse v arhiv",
- "archive-board": "Arhiviraj tablo",
+ "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": "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",
+ "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": "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",
+ "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": "Nazaj",
- "board-change-color": "Spremeni barvo",
+ "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",
@@ -160,23 +172,23 @@
"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 privatna.",
- "board-public-info": "Ta tabla bo javna.",
+ "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": "Spremeni ozadje table",
+ "boardChangeColorPopup-title": "Change Board Background",
"boardChangeBackgroundImagePopup-title": "Change Background Image",
- "allBoardsChangeColorPopup-title": "Spremeni barvo",
+ "allBoardsChangeColorPopup-title": "Change color",
"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",
+ "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",
@@ -185,37 +197,37 @@
"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-cal": "Calendar",
+ "board-view-swimlanes": "Swimlanes",
+ "board-view-collapse": "Collapse",
"board-view-gantt": "Gantt",
- "board-view-lists": "Seznami",
+ "board-view-lists": "Lists",
"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.",
+ "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": "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",
+ "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",
@@ -249,172 +261,174 @@
"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?",
+ "cardDeletePopup-title": "Delete Card?",
"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.",
+ "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": "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.",
+ "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": "črna",
- "color-blue": "modra",
- "color-crimson": "temno rdeča",
- "color-darkgreen": "temno zelena",
- "color-gold": "zlata",
- "color-gray": "siva",
- "color-green": "zelena",
+ "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": "limeta",
+ "color-lime": "lime",
"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",
+ "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": "Komentiraj",
- "comment-placeholder": "Napiši komentar",
- "comment-only": "Samo komentar",
- "comment-only-desc": "Lahko komentirate samo na karticah.",
+ "comment": "Comment",
+ "comment-placeholder": "Write Comment",
+ "comment-only": "Comment only",
+ "comment-only-desc": "Can comment on cards 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.",
- "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?",
+ "no-comments": "No comments",
+ "no-comments-desc": "Can not see comments and activities.",
+ "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?",
- "copy-card-link-to-clipboard": "Kopiraj povezavo kartice na odložišče",
+ "copy-card-link-to-clipboard": "Copy card link to clipboard",
"copy-text-to-clipboard": "Copy text to clipboard",
- "linkCardPopup-title": "Poveži kartico",
- "searchElementPopup-title": "Išči",
- "copyCardPopup-title": "Kopiraj kartico",
+ "linkCardPopup-title": "Link Card",
+ "searchElementPopup-title": "Search",
+ "copyCardPopup-title": "Copy Card",
"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",
- "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",
+ "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": "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",
+ "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 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",
- "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",
+ "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": "Spremeni porabljen čas",
- "editLabelPopup-title": "Spremeni oznako",
- "editNotificationPopup-title": "Uredi obvestilo",
- "editProfilePopup-title": "Uredi profil",
- "email": "E-pošta",
- "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.",
+ "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": "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",
+ "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": "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-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": "E-poštni naslov je že zaseden",
- "export-board": "Izvozi tablo",
+ "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",
@@ -424,21 +438,21 @@
"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",
+ "exportBoardPopup-title": "Export board",
"exportCardPopup-title": "Export card",
- "sort": "Sortiraj",
+ "sort": "Sort",
"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",
+ "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",
@@ -446,197 +460,197 @@
"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",
+ "list-filter-label": "Filter List by Title",
+ "filter-clear": "Clear filter",
"filter-labels-label": "Filter by label",
- "filter-no-label": "Brez oznake",
+ "filter-no-label": "No label",
"filter-member-label": "Filter by member",
- "filter-no-member": "Brez člana",
+ "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": "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",
+ "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": "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.",
+ "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": "Ustvari tablo",
- "home": "Domov",
- "import": "Uvozi",
+ "headerBarCreateBoardPopup-title": "Create Board",
+ "home": "Home",
+ "import": "Import",
"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",
+ "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": "Iz orodja Trello",
- "from-wekan": "Od prejšnjega izvoza",
+ "from-trello": "From Trello",
+ "from-wekan": "From previous export",
"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-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": "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-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": "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-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": "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",
+ "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": "Dejanja plavalnih stez",
- "swimlaneAddPopup-title": "Dodaj plavalno stezo spodaj",
- "listImportCardPopup-title": "Uvozi Trello kartico",
+ "swimlaneActionPopup-title": "Swimlane Actions",
+ "swimlaneAddPopup-title": "Add a Swimlane below",
+ "listImportCardPopup-title": "Import a Trello card",
"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",
- "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",
- "multi-selection": "Multi-Izbira",
+ "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",
+ "members": "Members",
+ "menu": "Menu",
+ "move-selection": "Move selection",
+ "moveCardPopup-title": "Move Card",
+ "moveCardToBottom-title": "Move to Bottom",
+ "moveCardToTop-title": "Move to Top",
+ "moveSelectionPopup-title": "Move selection",
+ "multi-selection": "Multi-Selection",
"multi-selection-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.",
- "not-accepted-yet": "Povabilo še ni sprejeto.",
+ "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.",
+ "not-accepted-yet": "Invitation not accepted yet",
"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 poprijavi.",
- "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.",
+ "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": "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",
+ "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": "Shrani",
- "search": "Išči",
- "rules": "Pravila",
+ "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": "Izberi barvo",
+ "select-color": "Select Color",
"select-board": "Select Board",
- "set-wip-limit-value": "Omeji maksimalno število opravil v seznamu",
- "setWipLimitPopup-title": "Omeji število kartic",
+ "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": "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-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": "Prikaži seznam bližnjic",
+ "shortcut-show-shortcuts": "Bring up this shortcuts list",
"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",
+ "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": "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",
+ "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",
@@ -648,317 +662,319 @@
"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",
+ "username": "Username",
"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",
+ "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": "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.",
+ "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 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",
+ "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 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",
+ "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": "Prikaži oznako polja na mini kartici",
+ "showLabel-field-on-card": "Show field label on minicard",
"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",
+ "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": "Ustvarjen ob",
+ "createdAt": "Created at",
"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",
- "setCardActionsColorPopup-title": "Izberi barvo",
- "setSwimlaneColorPopup-title": "Izberi barvo",
- "setListColorPopup-title": "Izberi barvo",
- "assigned-by": "Dodelil",
- "requested-by": "Zahteval",
+ "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",
+ "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": "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",
- "default-subtasks-board": "Podopravila za tablo",
- "default": "Privzeto",
- "defaultdefault": "Privzeto",
- "queue": "Čakalna vrsta",
- "subtask-settings": "Nastavitve podopravil",
- "card-settings": "Nastavitve kartice",
+ "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": "Nastavitve podopravil table",
- "boardCardSettingsPopup-title": "Nastavitve kartice",
+ "boardSubtaskSettingsPopup-title": "Subtasks Settings",
+ "boardCardSettingsPopup-title": "Card Settings",
"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:",
+ "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": "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",
+ "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": "Ko je kartica",
- "r-is": " ",
- "r-is-moved": "premaknjena",
+ "r-when-a-card": "When a card",
+ "r-is": "is",
+ "r-is-moved": "is moved",
"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-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": "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-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": "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-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": "Metoda avtentikacije",
- "authentication-type": "Način avtentikacije",
- "custom-product-name": "Ime izdelka po meri",
- "layout": "Postavitev",
- "hide-logo": "Skrij logo",
+ "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": "Dodaj HTML po meri po