Compare commits

...
83 Commits
Author SHA1 Message Date
github-actions[bot] 25a6c30785 Bump versions for v11.76 2026-09-14 01:37:00 +00:00
Lauri Ojansivu 83821962e6 Prepare v11.76 release 2026-09-14 04:35:32 +03:00
Lauri Ojansivu 4daeff9669 CHANGELOG: repoint commit links after history moved.
A rebase rewrote the commits these entries link to, so the links named commits
that no longer exist and would have 404ed on GitHub. Repointed by
releases/fix-changelog-hashes.sh, which only touches a link no ref in this clone
can reach.

Thanks to xet7 !
2026-09-14 04:35:22 +03:00
Lauri Ojansivu 75a3b67702 Record rule repair progress and correct release entry placement
Update dated translation audit counts, TODO Later and Upcoming notes. Move five post-release translation entries from v11.75 to Upcoming because that release does not contain their commits. Preserve their descriptions and keep language validation open.
2026-09-14 04:35:17 +03:00
Lauri Ojansivu 207af96963 CHANGELOG: repoint commit links after history moved.
A rebase rewrote the commits these entries link to, so the links named commits
that no longer exist and would have 404ed on GitHub. Repointed by
releases/fix-changelog-hashes.sh, which only touches a link no ref in this clone
can reach.

Thanks to xet7 !
2026-09-14 04:35:05 +03:00
Lauri Ojansivu b0b3520cc1 Repair Tamazight rule labels and action terminology
Replace French and Arabic values and distinguish the IRCAM rule noun from regular. Preserve singular and plural roles, board ownership and rule-title input. Software adaptation and complete phrases remain low confidence pending fluent review.
2026-09-14 04:35:00 +03:00
Lauri Ojansivu 3a5ddd1c87 Record custom HTML translation repair progress
Update the dated source commit, verified correction inventory and remaining findings in Audit, TODO Later and Upcoming notes. Preserve the open language-validation scope.
2026-09-14 04:35:00 +03:00
Lauri Ojansivu 4901ec2980 Translate Tamazight custom HTML insertion actions
Replace French while preserving opening and closing body tags and opposite insertion directions. Custom qualifier adaptation and full phrase composition remain low confidence pending fluent review.
2026-09-14 04:35:00 +03:00
Lauri Ojansivu 4b661a5bd0 Record start and end translation repair progress
Update dated source commit and exact correction inventory in the audit, TODO Later status and Upcoming notes. Keep uncertain phrasing and wider validation explicitly open.
2026-09-14 04:35:00 +03:00
Lauri Ojansivu 9143606500 Translate Tamazight start and end time messages
Replace seven French and Arabic labels and activity fragments using native start and expiration components. Preserve old versus new time placeholders. Generic calendar adaptation and full activity composition remain low confidence pending fluent review.
2026-09-14 04:35:00 +03:00
Lauri Ojansivu ed0b853623 Update translation audit after received-time repairs
Record the dated source commit, verified correction inventory and remaining original findings. Refresh the TODO Later status and Upcoming translation notes while retaining the open fluency and wider validation scope.
2026-09-14 04:35:00 +03:00
Lauri Ojansivu 44c26d4c9c Translate Tamazight received-time activities
Replace French in both received-time activity fragments. Preserve current and previous time placeholders and destination direction. Reception terminology from the mixed-source computing lexicon and full phrase composition are low confidence pending fluent review.
2026-09-14 04:35:00 +03:00
Lauri Ojansivu a6f136a8df Document successful rebuild of the wekan22 failure
Identify the saved v11.75 missing-Moment error as already repaired. Record the fresh Linux arm64 Meteor bundle build and passing assignee, calendar and release-preflight regressions in Upcoming notes. Keep translation audit progress unchanged during build verification.
2026-09-14 04:35:00 +03:00
Lauri Ojansivu 2f572cf139 Record Tamazight operator diagnostic repair progress 2026-09-14 04:35:00 +03:00
Lauri Ojansivu e40b678fd9 Repair Tamazight operator and expected-number diagnostics
Preserve operator classification and required versus received value, retaining format tokens exactly. Mathematical terminology adaptation, derived forms and full diagnostic phrasing remain low confidence pending review.
2026-09-14 04:35:00 +03:00
Lauri Ojansivu 8c7b177128 Record Tamazight visibility and sorting translation progress 2026-09-14 04:35:00 +03:00
Lauri Ojansivu 105e51ebf3 Translate Tamazight visibility and descending-sort search help
Preserve public/private board scope and literal descending-sort prefix. Moroccan references support visibility terms; complete phrases and prefix composition remain low confidence pending review.
2026-09-14 04:35:00 +03:00
Lauri Ojansivu ab5b085052 Record Tamazight status and validation translation progress 2026-09-14 04:34:59 +03:00
Lauri Ojansivu 85d88589f4 Repair Tamazight status help and validation labels
Replace French and Arabic while preserving status choices, date versus time validation and exact format tokens. Derived forms and complete diagnostics remain low confidence pending review.
2026-09-14 04:34:59 +03:00
Lauri Ojansivu fd1e46de59 Record Tamazight comment and label search repair progress 2026-09-14 04:34:59 +03:00
Lauri Ojansivu 50c35f1fb0 Translate Tamazight comment and label search help
Preserve comment containment, color-or-name alternatives, expanded and abbreviated operator syntax. Derived terminology and full phrase composition remain low confidence pending review.
2026-09-14 04:34:59 +03:00
Lauri Ojansivu 4bd5565b67 Record Tamazight scoped search translation progress 2026-09-14 04:34:59 +03:00
Lauri Ojansivu 1c80a78ea4 Translate Tamazight creator label and scoped search instructions
Preserve member versus creator and board versus list title matching, retaining executable operator tokens. Complete relative clauses, plural and possessive agreement remain low confidence pending fluent review.
2026-09-14 04:34:59 +03:00
Lauri Ojansivu 754713e406 Record Tamazight time and due-date repair progress 2026-09-14 04:34:59 +03:00
Lauri Ojansivu 0f4d5adc3a Repair Tamazight time labels and due-date activity wording
Replace Arabic and French, distinguish now from today and preserve due-date destination/card placeholder order. Composed diagnostics, conjugation and inherited due-date terminology remain low confidence pending review.
2026-09-14 04:34:59 +03:00
Lauri Ojansivu dafa3a9a84 Record Tamazight ordering and export repair progress 2026-09-14 04:34:59 +03:00
Lauri Ojansivu 1f3156f934 Repair Tamazight creation-date sorting and export messages
Replace French and mixed-script text while preserving sort direction, card versus board scope, export restrictions and literal format names. Complete noun and capability phrasing remains low confidence pending fluent review.
2026-09-14 04:34:59 +03:00
Lauri Ojansivu 0d82edf247 Record account prompt translation repairs and color review limits 2026-09-14 04:34:59 +03:00
Lauri Ojansivu 93c1fe9ef9 Translate Tamazight account creation and existing-account prompts
Preserve completed account creation, availability of sign-in and the existing-account question using native MediaWiki components. Complete capability and affirmative possession phrasing remains low confidence pending fluent review.
2026-09-14 04:34:59 +03:00
Lauri Ojansivu 02d7f2439c Refresh upcoming release summary and translation audit totals 2026-09-14 04:34:59 +03:00
Lauri Ojansivu 6d5c26c456 Record Tamazight Enter instruction repair progress 2026-09-14 04:34:59 +03:00
Lauri Ojansivu e07e742d2c Translate Tamazight Enter instructions for custom fields
Replace French options/items instructions, keeping Enter as the physical key and preserving action scopes. Complete keyboard phrasing and inherited item terminology remain low confidence. All 17,413 correction checks pass.
2026-09-14 04:34:59 +03:00
Lauri Ojansivu f4a69c3d92 Record Tamazight week and display repair progress 2026-09-14 04:34:59 +03:00
Lauri Ojansivu 62daaf0331 Translate Tamazight week and All Boards display settings
Preserve ISO week-of-year, selectable first weekday and All Boards page display distinctions with native components. Full genitive and selection phrases remain low confidence. All 17,411 correction checks pass.
2026-09-14 04:34:59 +03:00
Lauri Ojansivu 7ce014fb53 Record Tamazight sorting repair progress 2026-09-14 04:34:59 +03:00
Lauri Ojansivu e0b706b0ad Translate Tamazight sorting label and invalid-sort error
Replace Arabic/French using directly attested native sort terminology, preserving the format token and invalid-sort meaning. Full diagnostic composition remains low confidence. All 17,408 correction checks pass.
2026-09-14 04:34:59 +03:00
Lauri Ojansivu fe502f2151 Record Tamazight comment permission repair progress 2026-09-14 04:34:59 +03:00
Lauri Ojansivu 07f665ef0b Translate Tamazight comment and read-only permissions
Repair Arabic/French role descriptions while preserving posting, comment visibility and read-only viewing/edit restrictions. Full capability conjugations and role composition remain low confidence. All 17,406 correction checks pass.
2026-09-14 04:34:59 +03:00
Lauri Ojansivu 133c365262 Record Tamazight access requirement repair progress 2026-09-14 04:34:59 +03:00
Lauri Ojansivu 1eca0d45b2 Translate Tamazight board access requirements
Replace French permission and board-role errors, retaining signed-in users, board membership and board administrator distinctions. Full conjugation and role/genitive composition remain low confidence. All 17,403 correction checks pass.
2026-09-14 04:34:59 +03:00
Lauri Ojansivu 9218a4a9d2 Record Tamazight bulk-card sample repair progress 2026-09-14 04:34:59 +03:00
Lauri Ojansivu a72de52465 Translate Tamazight bulk-card JSON sample values
Replace French in six sample values while retaining JSON property names, three-card order and first/second/last identification. Full card genitives and derived feminine agreement remain low confidence. All 17,400 correction checks pass.
2026-09-14 04:34:59 +03:00
Lauri Ojansivu a142fbd341 Group upcoming translation repairs and refresh release overview 2026-09-14 04:34:59 +03:00
Lauri Ojansivu 2ad42c8e63 Record Tamazight card-order repair progress 2026-09-14 04:34:59 +03:00
Lauri Ojansivu e8e35db559 Translate Tamazight top and bottom card-order commands
Repair six French labels with consistent first/last place wording, preserving add/move and own/selected list distinctions. Native components are reference-supported; full software phrases and possessive composition remain low confidence. All 17,399 correction checks pass.
2026-09-14 04:34:59 +03:00
Lauri Ojansivu 0cf6c33882 Record Tamazight deletion and member repair progress 2026-09-14 04:34:59 +03:00
Lauri Ojansivu 8682dbae5a Repair Tamazight deletion and board-member removal labels
Use native Tifinagh deletion wording, translate custom-field confirmation and member-removal activity, and preserve member/board placeholders. Full custom-field and activity composition remain low confidence. All 17,393 correction checks pass.
2026-09-14 04:34:59 +03:00
Lauri Ojansivu b49cce0dc7 Record Tamazight Subject and member repair progress 2026-09-14 04:34:58 +03:00
Lauri Ojansivu 004796543a Repair Tamazight email subject and current-card members labels
Use a directly attested native Subject label and compose scoped current-card member wording. Full card/board composition remains low confidence. All 17,390 correction checks pass, including exact placeholder and newer-translation preference coverage.
2026-09-14 04:34:58 +03:00
Lauri Ojansivu 5453d352a7 Record Tamazight email permission repair progress
Update dated audit and Upcoming notes to 15,167 corrected originals and 677 pending findings. Retain full-phrase confidence limits and remaining validation scope.
2026-09-14 04:34:58 +03:00
Lauri Ojansivu bfad1aa765 Translate Tamazight email-change permission
Replace Arabic using native MediaWiki permission, change and email components. Complete composition remains low confidence pending fluent review. Verify all 17,388 correction records, placeholders, rendering and newer-translation preference.
2026-09-14 04:34:58 +03:00
Lauri Ojansivu b199c07565 Document upcoming build and release preflight fixes
Record successful Linux arm64 bundle compilation, regression coverage and remaining browser/platform verification limits. Document the read-only Upcoming notes check.
2026-09-14 04:34:58 +03:00
Lauri Ojansivu 6f6e78a9a0 Fix assignee bundle dependency and require upcoming release notes
Use existing native date formatting instead of the removed Moment dependency. Check real Upcoming entries before release tool installation or mutations, including explicit version overrides. Cover missing, empty and duplicate notes with read-only regression tests.
2026-09-14 04:34:58 +03:00
Lauri Ojansivu dcccb718f3 Record mail-subject translation repairs and remaining language review 2026-09-14 04:34:58 +03:00
Lauri Ojansivu 289231a7c6 Translate Tamazight password-reset and email-verification subjects
Replace French with native component wording and preserve the site-name placeholder. Full email phrasing, possessive attachment and verification verb dialect spelling remain low confidence.
2026-09-14 04:34:58 +03:00
Lauri Ojansivu 7e39fc89c1 Record dropdown translation repairs and selected-card color scope 2026-09-14 04:34:58 +03:00
Lauri Ojansivu f85bbbf5b5 Translate Tamazight dropdown choices and selection-color title
Replace French labels while keeping unknown distinct from none and selection color distinct from label creation. Complete phrases, derived noun forms and dropdown-option sense remain low confidence.
2026-09-14 04:34:58 +03:00
Lauri Ojansivu 5d0967f7db Record field-scope translation repairs and remaining review 2026-09-14 04:34:58 +03:00
Lauri Ojansivu 614ba7687d Translate Tamazight field display and card-scope settings
Replace French field settings and the Arabic change-date popup title. Preserve new-card versus all-card scope. Full phrases, software-field usage and derived card forms remain low confidence.
2026-09-14 04:34:58 +03:00
Lauri Ojansivu 5a64686d7a Record field translation repairs and software terminology caveats 2026-09-14 04:34:58 +03:00
Lauri Ojansivu 9639aabe34 Translate Tamazight create-edit and date-field labels
Replace Arabic and French with native create/edit/date vocabulary and IRCAM-attested field terminology. Keep button and popup creation wording consistent. Full software-field phrasing and bound date composition remain low confidence.
2026-09-14 04:34:58 +03:00
Lauri Ojansivu 149aa75c4b Record notification translation repairs and remaining language review 2026-09-14 04:34:58 +03:00
Lauri Ojansivu 520b0d8f80 Repair Tamazight notification controls and unread-comment noun
Replace French notification labels and the incorrect image noun in the unread-comments tooltip. Preserve opposite read/unread states. Full command phrasing and inherited passive-read inflection remain low confidence despite reference-supported component vocabulary.
2026-09-14 04:34:58 +03:00
github-actions[bot] e556118a99 Bump versions for v11.75 2026-09-14 00:45:24 +00:00
Lauri Ojansivu 9c02d84414 Record member-removal and error terminology repair progress 2026-09-14 03:43:38 +03:00
Lauri Ojansivu 6e2824a6ed CHANGELOG: repoint commit links after history moved.
A rebase rewrote the commits these entries link to, so the links named commits
that no longer exist and would have 404ed on GitHub. Repointed by
releases/fix-changelog-hashes.sh, which only touches a link no ref in this clone
can reach.

Thanks to xet7 !
2026-09-14 03:43:37 +03:00
Lauri Ojansivu 8b34511fe8 Translate Tamazight member-removal and error-clearing labels
Replace four French values. Native sources attest remove, all, member and error components, including the error plural in the CNDH Amazigh memorandum. Full command phrasing, card compounds and software-error usage remain low confidence.
2026-09-14 03:43:10 +03:00
Lauri Ojansivu 9278de5931 Record member-selection and card-list translation repair progress 2026-09-14 03:41:09 +03:00
Lauri Ojansivu c60ea35b7d Translate Tamazight member selection and card-list controls
Replace three French labels while preserving import-member selection, full-card list display and per-list card counts. Native component vocabulary is reference-supported; complete phrases, derived bound forms and kanban card terminology remain low confidence.
2026-09-14 03:40:47 +03:00
Lauri Ojansivu 8ec1e97396 Record search-link translation repairs and current audit scope 2026-09-14 03:39:36 +03:00
Lauri Ojansivu 4f37e7278d Translate Tamazight search-link and board-renaming labels
Use native MediaWiki link, search and rename components. Full search-link demonstrative phrasing and board genitive wording remain low confidence and need fluent review. Preserve the search-link purpose and board target.
2026-09-14 03:39:08 +03:00
Lauri Ojansivu 650ceed585 Prepare v11.75 release 2026-09-14 03:38:56 +03:00
Lauri Ojansivu a6a7bb8d5a Update upcoming release summary and translation audit progress 2026-09-14 03:38:02 +03:00
Lauri Ojansivu 70784cac08 Record membership translation repairs and remaining scope 2026-09-14 03:35:08 +03:00
Lauri Ojansivu 4ca8e5d1b6 Translate Tamazight member and board-members labels
Use the native plural member noun while preserving board membership scope. The complete all-board-members compound and kanban board terminology remain low confidence for fluent review.

Thanks to xet7 !
2026-09-14 03:34:48 +03:00
Lauri Ojansivu e6a58ef63d CHANGELOG: repoint commit links after history moved.
A rebase rewrote the commits these entries link to, so the links named commits
that no longer exist and would have 404ed on GitHub. Repointed by
releases/fix-changelog-hashes.sh, which only touches a link no ref in this clone
can reach.

Thanks to xet7 !
2026-09-14 03:34:40 +03:00
Lauri Ojansivu f0b85220ea Document security-aware activity rendering and audit status 2026-09-14 03:34:39 +03:00
Lauri Ojansivu e5937d5314 Render activity values with the shared security-aware viewer
Apply Markdown, emojis and permitted HTML to card and sidebar activity values. Sanitize completed sentences and honor plain-link mode, retaining existing source URL guards and avoiding nested navigation anchors. Add positive, negative and browser regression coverage.

Thanks to xet7 !
2026-09-14 03:34:39 +03:00
Lauri Ojansivu a95bc74bff Record text-editing repair and checklist dialect review 2026-09-14 03:34:39 +03:00
Lauri Ojansivu 0b8895ab82 Repair Tamazight checklist text-editing label
Remove an extraneous first qualifier and use native edit/text components. Full as-text phrasing and bound spelling remain low confidence; candidate checklist control vocabulary is marked Kabyle and is not established as Moroccan usage.

Thanks to xet7 !
2026-09-14 03:34:39 +03:00
Lauri Ojansivu 3a2f8b041e Record description repairs in new upcoming release 2026-09-14 03:34:39 +03:00
Lauri Ojansivu 4dd56bc53a Translate Tamazight detailed-description and all-users choices
Replace French and Arabic using native component terms. Full description-with-more-details composition remains low confidence; all-users view usage also needs fluent review.

Thanks to xet7 !
2026-09-14 03:34:39 +03:00
Lauri Ojansivu 1a48f2bd90 Record weekly due-date translation repairs 2026-09-14 03:34:39 +03:00
26 changed files with 1819 additions and 324 deletions

No files matched your search

+508 -9
View File
@@ -80,14 +80,14 @@ held only issues \#4774 and \#4055, and both are closed now.
Resumed at the maintainer's request on 2026-09-13, beginning with Klingon.
The audit tracks 20,081
findings: 15,148 corrected, 4,058 restored pre-pull values awaiting
validation, 179 reviewed and retained, and 696 pending review or repair.
The correction inventory records 17,313 exact before/after values,
findings: 15,218 corrected, 4,058 restored pre-pull values awaiting
validation, 179 reviewed and retained, and 626 pending review or repair.
The correction inventory records 17,476 exact before/after values,
including repairs outside the original findings.
All 361 originally flagged Klingon findings are repaired. The broader review of 829
German-identical Klingon values repaired all 829, including the mistaken
German cron label, which now uses the actual tool name Cron.
The largest original queues are Standard Moroccan Tamazight (553) and
The largest original queues are Standard Moroccan Tamazight (483) and
Inuktitut (50); Veps retains 10 original findings. Silesian database terminology and 17 Tigre
calendar findings need language-specific review. Restored and unflagged
values, low-confidence wording and browser rendering remain unverified.
@@ -102,10 +102,9 @@ local findings, and Bosnian errors predate the pull. No remote uploads were
performed. Preserve correct translations and source placeholders during repairs.
The requested organization, linked-file/static-archive and rate-limit mirror
changes are implemented in local commit 02383540a; translation repairs have resumed.
Latest translation fix is c6ee67cb1 (2026-09-14), replacing four French
label activity messages and refining native filename wording. Activity
clauses/addition inflection, prior errors/create-label wording, color/tag
morphology, credentials and number/user/export wording remain low confidence.
Latest translation fix is efd0ef8e6 (2026-09-14), repairing ten rule labels
and actions. IRCAM distinguishes rule from regular; software adaptation
and full phrases remain low confidence pending fluent review.
Greenlandic CLDR-unconfirmed wording and twelve Quechua color wrappers
still need review, alongside the wider restored and unflagged values.
Tamazight calendar review dd2aaa19a (2026-09-14) records provisional
@@ -115,7 +114,7 @@ names and unresolved Coptic/tabular/epoch terminology; no values changed. Previo
Cherokee Hijri labels with exact native-script CLDR variant names. Cherokee’s
original queue is empty. Compact tabular epoch wording still needs fluent
technical review. Quechua palette compounds and remaining color wrappers
remain open. There are 553 Tamazight findings remaining.
remain open. There are 483 Tamazight findings remaining.
Silesian reference review (2026-09-14) confirms shared database/file terms
in native MediaWiki messages; the full raw-file label remains pending.
No translation value or finding count changed in that review.
@@ -590,6 +589,494 @@ the Markdown commit as the template.
</details>
</details>
# v11.76 2026-09-14 WeKan ® release
**In short:** Fix the **assignee view** build by using WeKan's existing native
date formatter while preserving the selected calendar. The release script
now requires actual **Upcoming release notes** before installing tools or
changing release files, preventing an existing release from being reused
when there is nothing upcoming to publish. **Tamazight translations** repair
email, member, deletion, card-order, permission, sorting and calendar
settings, plus custom-field Enter instructions. Complete composed phrases
still need fluent review.
This release fixes the following build and release behavior:
<details>
<summary><a href="https://github.com/wekan/wekan/commit/6f6e78a9a0961ede38d53d0fd8fac4c4b8602cdf">Fix assignee builds and reject releases without Upcoming notes</a>. Thanks to xet7.</summary>
Replace the unresolved Moment import with the existing native date utility,
keeping date output under the member's selected calendar. The Meteor bundle
build passes on Linux arm64. Existing assignee browser tests cover dated
cards; their live browser execution was not run in this verification.
The saved `.tools/wekan22` logs are the v11.75 run with this same missing
Moment import; source already contains the repair above. Repeat assignee,
calendar and release-preflight regressions pass (six Node test entries).
A fresh Meteor 3.6-beta.0 bundle build also passes on Linux arm64; its log is
`.tools/log/build-dev-bundle/2026-09-14/04-25-58/dev.txt`. Live browser
execution and a native amd64 build were not run locally.
Run a read-only changelog preflight before tool installation, hash repair,
version overrides or release mutations. Missing, empty and duplicate
Upcoming sections stop with an explanatory error. Explicit versions still
require notes and rename the Upcoming heading. Focused positive and negative
regressions, calendar display checks and shell syntax checks pass.
</details>
**Translations** - Tamazight labels and command consistency.
<details>
<summary><a href="https://github.com/wekan/wekan/commit/bfad1aa76">Translate Tamazight email-change permission</a>. Thanks to xet7.</summary>
Replace Arabic with native permission, change and email components,
preserving the setting's permission meaning. Complete phrase composition
remains low confidence pending fluent review. All 17,388 correction checks
pass; 677 original findings remain pending, including 534 Tamazight.
Restored/unflagged values and wider language validation remain open.
</details>
<details>
<summary><a href="https://github.com/wekan/wekan/commit/004796543">Repair Tamazight Subject and current-card member labels</a>. Thanks to xet7.</summary>
Replace Arabic in the generic email Subject label with a directly attested
native noun. Replace French in current-card member scope, preserving all
members of this card at this board. Full genitives and card/board wording
remain low confidence. All 17,390 correction checks pass. One original and
one unflagged value are repaired; 676 originals remain pending, including
533 Tamazight. Restored and wider wording validation remain open.
</details>
<details>
<summary><a href="https://github.com/wekan/wekan/commit/8682dbae5">Repair Tamazight deletion and member-removal wording</a>. Thanks to xet7.</summary>
Normalize the generic Delete command to native Tifinagh and replace French
in custom-field confirmation and board-member removal activity. Preserve
member/board placeholders and membership removal rather than account
deletion. Full software-field and activity composition remain low confidence.
All 17,393 correction checks pass. Two original and one unflagged value are
repaired; 674 originals remain pending, including 531 Tamazight. Restored
and wider language validation remain open.
</details>
<details>
<summary><a href="https://github.com/wekan/wekan/commit/e8e35db55">Translate Tamazight card-order commands</a>. Thanks to xet7.</summary>
Replace six French top/bottom labels with consistent first/last list-place
wording. Preserve adding versus moving and the card's own list versus a
selected destination. Rule source confirms minimum/maximum sort semantics.
Full order/genitive composition, card terminology and possessive attachment
remain low confidence. All 17,399 correction checks pass; 668 original
findings remain pending, including 525 Tamazight. Wider validation remains
open.
</details>
<details>
<summary><a href="https://github.com/wekan/wekan/commit/a72de5246">Translate Tamazight bulk-card JSON examples</a>. Thanks to xet7.</summary>
Replace six French sample values, keeping title/description property names,
three-card structure and first/second/last identity. Full card genitives
and derived feminine agreement remain low confidence. All 17,400 correction
checks pass, including JSON parsing and property-name preservation. One
original finding is repaired; 667 remain pending, including 524 Tamazight.
Wider language validation remains open.
</details>
<details>
<summary><a href="https://github.com/wekan/wekan/commit/1eca0d45b">Translate Tamazight board access requirements</a>. Thanks to xet7.</summary>
Replace French in signed-in-user permission and board-member/admin errors.
Preserve anonymous versus signed-in access and required board membership
versus board administration. Full conjugation, singular role forms and
board genitives remain low confidence. All 17,403 correction checks pass;
664 original findings remain pending, including 521 Tamazight. Restored
and wider language validation remain open.
</details>
<details>
<summary><a href="https://github.com/wekan/wekan/commit/07f665ef0">Translate Tamazight comment and read-only permissions</a>. Thanks to xet7.</summary>
Replace Arabic/French in comment-only, no-comment-visibility and read-only
role descriptions. Preserve posting versus viewing comments and explicit
viewing versus editing restrictions. Complete capability conjugations and
permission scope remain low confidence. All 17,406 correction checks pass;
661 original findings remain pending, including 518 Tamazight. Restored
and wider language validation remain open.
</details>
<details>
<summary><a href="https://github.com/wekan/wekan/commit/e0b706b0a">Translate Tamazight sorting label and diagnostic</a>. Thanks to xet7.</summary>
Replace Arabic/French with native sorting and invalid-value components.
Preserve the single format token and invalid-sort meaning. Complete
diagnostic composition remains low confidence. All 17,408 correction checks
pass. One original and one unflagged value are repaired; 660 originals
remain pending, including 517 Tamazight. Operator/predicate terminology,
restored values and wider language validation remain open.
</details>
<details>
<summary><a href="https://github.com/wekan/wekan/commit/62daaf033">Translate Tamazight week and page-display settings</a>. Thanks to xet7.</summary>
Replace Arabic/French in ISO week-of-year display, first-weekday selection
and All Boards page display. Preserve ISO 8601 and distinct setting scopes.
CLDR and MediaWiki support the native components; full genitives and
selection phrases remain low confidence. All 17,411 correction checks pass;
657 original findings remain pending, including 514 Tamazight. Restored
and wider language validation remain open.
</details>
<details>
<summary><a href="https://github.com/wekan/wekan/commit/e07e742d2">Translate Tamazight custom-field Enter instructions</a>. Thanks to xet7.</summary>
Replace French instructions for adding more options/items with Enter.
Preserve the physical key name and distinct field scopes. Full keyboard
instrumental/plural composition and inherited item terminology remain low
confidence. All 17,413 correction checks pass; 655 original findings remain
pending, including 512 Tamazight. Restored and wider language validation
remain open.
</details>
Translation audit progress as of 2026-09-14: 15,218 original findings are
corrected, 179 are reviewed and retained, 4,058 restored values await
validation, and 626 original findings remain pending across 17 locales,
including 483 Tamazight findings. The ledger contains 17,476 correction
records, including repairs outside the original audit. Regression checks
validate placeholders, rendering and merge behavior; fluency and wider
language validation remain open. See the
<a href="docs/Features/Translations/Audit.md">translation audit</a>.
<details>
<summary><a href="https://github.com/wekan/wekan/commit/93c1fe9ef">Translate Tamazight account creation and existing-account prompts</a>. Thanks to xet7.</summary>
Replace two French values, preserving account creation followed by the
availability of sign-in and the existing-account question with sign-in.
Native MediaWiki supports the components; full capability and affirmative
possession phrasing remains low confidence. All 17,415 correction checks
pass. Restored values and wider language validation remain open; live
browser verification was not run.
</details>
<details>
<summary><a href="https://github.com/wekan/wekan/commit/1f3156f93">Repair Tamazight creation-date ordering and export messages</a>. Thanks to xet7.</summary>
Repair ten values, preserving opposite newest/oldest-first ordering, card
versus board export, explicit export restrictions and Excel/PDF names.
Five original findings and four unflagged French values are repaired; one
existing mixed-script correction is refined. Native reference components
support the wording; full noun, ordering and negative capability phrases
remain low confidence. All 17,424 correction checks pass. Wider language
validation and live browser verification remain open.
</details>
<details>
<summary><a href="https://github.com/wekan/wekan/commit/0f4d5adc3">Repair Tamazight Time, Now and due-date activity values</a>. Thanks to xet7.</summary>
Replace Arabic/French time labels, distinguish Now from today and preserve
updated due-date destination/card placeholder order. Six values are repaired,
including five unflagged problems. Full diagnostics, verb conjugation and
inherited due-date terminology remain low confidence. All 17,430 correction
checks pass; wider language validation and live browser execution remain
open.
</details>
<details>
<summary><a href="https://github.com/wekan/wekan/commit/1c80a78ea">Translate Tamazight creator label and scoped search help</a>. Thanks to xet7.</summary>
Replace French search help and the Arabic Creator label. Preserve member
versus creator scope, board versus list title matching and executable
operator tokens. Four original findings and one unflagged value are
repaired. Full relative clauses, plurals, agreement and possessives remain
low confidence. All 17,435 correction checks pass; wider language validation
and live browser verification remain open.
</details>
<details>
<summary><a href="https://github.com/wekan/wekan/commit/50c35f1fb">Translate Tamazight comment and label search help</a>. Thanks to xet7.</summary>
Replace French search instructions and Arabic/French Text/label values.
Preserve comment containment, color-or-name alternatives and expanded and
abbreviated executable operator syntax. Three original findings and two
unflagged values are repaired. Derived nouns, agreement and full search
phrases remain low confidence. All 17,440 correction checks pass; wider
language validation and live browser verification remain open.
</details>
<details>
<summary><a href="https://github.com/wekan/wekan/commit/85d88589f">Repair Tamazight status help and validation labels</a>. Thanks to xet7.</summary>
Replace French/Arabic status labels, status search help and invalid date/user
messages. Preserve status choices and executable/format tokens. Seven
values are repaired, including five unflagged problems. Derived nouns,
plurals, agreement and full diagnostics remain low confidence. All 17,447
correction checks pass; wider language validation and live browser
verification remain open.
</details>
<details>
<summary><a href="https://github.com/wekan/wekan/commit/105e51ebf">Translate Tamazight visibility and descending-sort search help</a>. Thanks to xet7.</summary>
Replace Arabic visibility labels and French public/private and sorting help.
Preserve board visibility scope, sort alternatives and leading minus syntax.
Three original findings and two unflagged values are repaired. Full phrases,
agreement and prefix terminology adaptation remain low confidence.
All 17,452 correction checks pass; wider language validation and live browser
verification remain open.
</details>
<details>
<summary><a href="https://github.com/wekan/wekan/commit/e40b678fd">Repair Tamazight operator and expected-number diagnostics</a>. Thanks to xet7.</summary>
Replace French diagnostics and the Arabic Number label. Preserve operator
classification, required versus received numeric value and format tokens.
Two original findings and one unflagged value are repaired. Terminology
adaptation, derived forms and full diagnostics remain low confidence.
All 17,455 correction checks pass; wider language validation remains open.
</details>
<details>
<summary><a href="https://github.com/wekan/wekan/commit/44c26d4c9">Translate Tamazight received-time activities</a>. Thanks to xet7.</summary>
Replace two French activity fragments, preserving destination versus previous
time, parentheses and exact placeholders. Reception terminology adaptation
from a mixed-source computing lexicon, bound forms and full phrase composition
remain low confidence. All 17,457 correction checks pass; wider language
validation and live browser verification remain open.
</details>
<details>
<summary><a href="https://github.com/wekan/wekan/commit/914360650">Translate Tamazight start and end time messages</a>. Thanks to xet7.</summary>
Replace seven French/Arabic labels and activity fragments: two original
findings and five unflagged values. Preserve start versus end, current versus
previous time and exact placeholders. Native MediaWiki start/expiration
components support the vocabulary; generic calendar adaptation and full
phrase composition remain low confidence. All 17,464 correction checks pass;
wider language validation and live browser verification remain open.
</details>
<details>
<summary><a href="https://github.com/wekan/wekan/commit/4901ec298">Translate Tamazight custom HTML insertion actions</a>. Thanks to xet7.</summary>
Replace two French actions, preserving literal opening and closing body tags,
HTML identifier and before/after insertion directions. Native MediaWiki
components support the vocabulary; custom qualifier adaptation and full
phrase composition remain low confidence. All 17,466 correction checks pass;
wider language validation and live browser verification remain open.
</details>
<details>
<summary><a href="https://github.com/wekan/wekan/commit/289231a7c">Translate Tamazight password-reset and email-verification subjects</a>. Thanks to xet7.</summary>
Replace two French subjects while preserving the site-name placeholder.
Native component terms are attested; full subjects, possessive attachment
and verification verb dialect spelling remain low confidence.
All 17,387 correction checks pass. Two original findings are repaired;
678 originals remain pending, including 535 Tamazight. Wider wording and
mail-failure/success validation remain open.
</details>
<details>
<summary><a href="https://github.com/wekan/wekan/commit/f85bbbf5b">Translate Tamazight dropdown choices and selected-card-color title</a>. Thanks to xet7.</summary>
Replace three French values. Keep unknown distinct from no selection and
color changes scoped to selected cards. Native component terms are
supported; full phrases, derived noun forms and dropdown-choice sense remain
low confidence. All 17,385 correction checks pass. One original and two
unflagged values are repaired; 680 originals remain pending, including
537 Tamazight. Wider language validation remains open.
</details>
<details>
<summary><a href="https://github.com/wekan/wekan/commit/614ba7687">Translate Tamazight field display and card-scope settings</a>. Thanks to xet7.</summary>
Replace four French and Arabic values, preserving new-card versus all-card
scope and full-card field display. Native component terms are supported;
software-field usage, full phrases and derived card forms remain low
confidence. All 17,382 correction checks pass. Three original and one
unflagged value are repaired; 681 originals remain pending, including
538 Tamazight. Wider language validation remains open.
</details>
<details>
<summary><a href="https://github.com/wekan/wekan/commit/9639aabe3">Translate Tamazight create-edit and date-field labels</a>. Thanks to xet7.</summary>
Replace four Arabic and French values, keeping create-button and popup
wording identical and preserving the date-field distinction. IRCAM attests
the field noun; software-field sense, full phrases and bound date
composition remain low confidence. All 17,378 correction checks pass.
One original and three unflagged values are repaired; 684 originals remain
pending, including 541 Tamazight. Wider language validation remains open.
</details>
<details>
<summary><a href="https://github.com/wekan/wekan/commit/520b0d8f8">Repair Tamazight notification controls and unread-comment noun</a>. Thanks to xet7.</summary>
Replace three French controls and the image noun incorrectly used for
unread comments. Preserve opposite read/unread states and comment meaning.
Complete commands and inherited passive-read inflection remain low
confidence. All 17,374 correction checks pass. One original and three
unflagged values are repaired; 685 originals remain pending, including
542 Tamazight. Wider language validation remains open.
</details>
<details>
<summary><a href="https://github.com/wekan/wekan/commit/b0b3520cc">Repair Tamazight rule labels and actions</a>. Thanks to xet7.</summary>
Repair ten values: one original finding and nine unflagged values. Distinguish
IRCAM rule terminology from regular, preserve singular/plural and board
ownership, and correct the required rule-title prompt. Software adaptation,
full phrases and agreement remain low confidence. All 17,476 correction
checks pass; wider language validation and live browser verification remain
open.
</details>
Thanks to above GitHub users for their contributions and xet7 for maintaining WeKan !
# v11.75 2026-09-14 WeKan ® release
**In short:** Card and sidebar activity values render Markdown, emojis and
permitted HTML through the shared security-aware viewer. Plain-source and
plain-link settings apply, with existing sanitization and source-URL checks.
Tamazight description, all-users and member labels replace French and Arabic.
The text-editing label removes an extra qualifier. Composed translation
wording and Moroccan checklist terminology still need fluent review.
This release fixes the following activity rendering:
<details>
<summary><a href="https://github.com/wekan/wekan/commit/e5937d531">Use the shared viewer for card and sidebar activities</a>. Thanks to xet7.</summary>
Render activity values as Markdown, emojis and permitted HTML using the
existing viewer. Preserve plain-source behavior; sanitize completed activity
sentences and remove their links in plain-link mode. Keep imported source
URL scheme checks and avoid nested rich-title/application anchors.
Focused viewer, activity navigation, source-URL and Jade checks pass.
Browser regressions cover both feeds and all modes; syntax checked, not run
live. No sanitizer permissions or URL schemes were broadened.
</details>
This release adds the following translation improvements:
<details>
<summary><a href="https://github.com/wekan/wekan/commit/8b34511fe">Translate Tamazight member-removal and error-clearing labels</a>. Thanks to xet7.</summary>
Replace four French values with native component wording, including an
attested plural error noun. Preserve member removal rather than account
deletion and error clearing rather than repairing failures. Full commands,
card compounds and software-error usage remain low confidence.
All 17,370 correction checks pass. Three original and one unflagged value
are repaired; 686 originals remain pending, including 543 Tamazight.
Wider language validation remains open.
</details>
<details>
<summary><a href="https://github.com/wekan/wekan/commit/c60ea35b7">Translate Tamazight member selection and card-list controls</a>. Thanks to xet7.</summary>
Replace three French labels, preserving import-member selection, full-card
list display and a card count for each list. Native component vocabulary is
reference-supported; complete phrases, derived noun forms and kanban card
terminology remain low confidence. All 17,366 correction checks pass.
Three original findings are repaired; 689 remain pending, including 546
Tamazight. Wider language validation remains open.
</details>
<details>
<summary><a href="https://github.com/wekan/wekan/commit/4f37e7278">Translate Tamazight search-link and board-renaming labels</a>. Thanks to xet7.</summary>
Replace French and Arabic using native MediaWiki components, preserving
search-link purpose and the board target. Complete demonstrative and board
genitive phrases remain low confidence. All 17,363 correction checks pass.
One original and one unflagged value are repaired; 692 originals remain
pending, including 549 Tamazight. Wider language validation remains open.
</details>
Translation audit progress as of 2026-09-14: 15,166 original findings are
corrected, 179 are reviewed and retained, 4,058 restored values await
validation, and 678 original findings remain pending across 17 locales.
Of those pending findings, 535 are Tamazight. Repairs found outside the
original audit are also recorded. Passing regression checks validate
placeholders, rendering and merge behavior; they do not establish fluency.
See <a href="docs/Features/Translations/Audit.md">the translation audit</a>
for the remaining review scope and low-confidence wording.
<details>
<summary><a href="https://github.com/wekan/wekan/commit/4ca8e5d1b">Translate Tamazight member labels</a>. Thanks to xet7.</summary>
Replace Arabic and French with a native plural member noun and composed
board-members label, preserving membership scope. Full board phrasing and
kanban terminology remain low confidence. All 17,361 correction checks pass.
One original and one unflagged value are repaired; 693 originals remain
pending, including 550 Tamazight. Broader wording validation remains open.
</details>
<details>
<summary><a href="https://github.com/wekan/wekan/commit/0b8895ab8">Repair Tamazight text-editing label</a>. Thanks to xet7.</summary>
Remove the extra first qualifier from Edit as text using native edit/text
components. Complete phrasing and bound spelling remain low confidence.
All 17,359 correction checks pass. This unflagged repair leaves 694 originals
pending. Candidate checklist control vocabulary is marked Kabyle; Moroccan
checklist wording still needs reference and dialect review.
</details>
<details>
<summary><a href="https://github.com/wekan/wekan/commit/4dd56bc53">Translate Tamazight description and all-users choices</a>. Thanks to xet7.</summary>
Replace French and Arabic using native component terms. The full
more-detailed-description phrase remains low confidence; combined all-users
view usage also needs fluent review. All 17,358 correction checks pass.
One original and one unflagged value are repaired; 694 originals remain
pending, including 551 Tamazight. Broader wording validation remains open.
</details>
Thanks to above GitHub users for their contributions and translators for their translations.
# v11.74 2026-09-14 WeKan ® release
**In short:** Veps board-view labels replace Finnish and Venda values, while
@@ -795,6 +1282,18 @@ This release adds the following translation improvements:
**Translations** - Locale wording repairs and remaining audit progress.
<details>
<summary><a href="https://github.com/wekan/wekan/commit/9c2d625d5">Translate Tamazight missing and weekly due-date filters</a>. Thanks to xet7.</summary>
Replace three French/Arabic labels, preserving no-date and separate
calendar-week scopes. Native components support the repairs; complete
deadline wording, next-week agreement and bound state remain low confidence.
All 17,356 correction checks pass. One original and two unflagged values
are repaired; 695 originals remain pending, including 552 Tamazight.
Broader wording validation remains open.
</details>
<details>
<summary><a href="https://github.com/wekan/wekan/commit/47796391a">Translate Tamazight due-date labels</a>. Thanks to xet7.</summary>
+1 -1
View File
@@ -20,7 +20,7 @@ LABEL org.opencontainers.image.source="https://github.com/wekan/wekan"
# TARGETARCH and TARGETVARIANT are automatically provided by Docker Buildx
ARG TARGETARCH
ARG TARGETVARIANT
ARG VERSION=11.74
ARG VERSION=11.76
ARG DEBIAN_FRONTEND=noninteractive
ENV BUILD_DEPS="apt-utils gnupg wget bzip2 g++ curl libarchive-tools build-essential git ca-certificates python3 unzip"
+1 -1
View File
@@ -1,5 +1,5 @@
appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928
appVersion: "v11.74.0"
appVersion: "v11.76.0"
files:
userUploads:
- README.md
+48 -48
View File
@@ -19,58 +19,58 @@ template(name="cardActivities")
template(name="activity")
.activity(id=activityDomId data-id=activity._id)
+userAvatar(userId=activity.user._id)
p.activity-desc
div.activity-desc
span.activity-member
+memberName(user=activity.user)
//- attachment activity -------------------------------------------------
if($eq activity.activityType 'deleteAttachment')
| {{{_ 'activity-delete-attach' cardLink}}}.
| {{{activityMessage 'activity-delete-attach' cardLink}}}.
if($eq activity.activityType 'addAttachment')
| {{{_ 'activity-attached' attachmentLink cardLink}}}.
| {{{activityMessage 'activity-attached' attachmentLink cardLink}}}.
if($neq mode 'board')
if activity.attachment.isImage
img.attachment-image-preview(src=activity.attachment.url alt="")
//- board activity ------------------------------------------------------
if($eq activity.activityType 'createBoard')
| {{{_ 'activity-created' boardLabelLink}}}.
| {{{activityMessage 'activity-created' boardLabelLink}}}.
if($eq activity.activityType 'importBoard')
| {{{_ 'activity-imported-board' boardLabelLink sourceLink}}}.
| {{{activityMessage 'activity-imported-board' boardLabelLink sourceLink}}}.
if($eq activity.activityType 'addBoardMember')
| {{{_ 'activity-added' memberLink boardLabelLink}}}.
| {{{activityMessage 'activity-added' memberLink boardLabelLink}}}.
if($eq activity.activityType 'removeBoardMember')
| {{{_ 'activity-excluded' memberLink boardLabelLink}}}.
| {{{activityMessage 'activity-excluded' memberLink boardLabelLink}}}.
//- card activity -------------------------------------------------------
if($eq activity.activityType 'createCard')
if($eq mode 'card')
| {{{_ 'activity-added' cardLabelLink (sanitize activity.listName)}}}.
| {{{activityMessage 'activity-added' cardLabelLink (activityValue activity.listName)}}}.
else
| {{{_ 'activity-added' cardLabelLink boardLabelLink}}}.
| {{{activityMessage 'activity-added' cardLabelLink boardLabelLink}}}.
if($eq activity.activityType 'importCard')
| {{{_ 'activity-imported' cardLink boardLabelLink sourceLink}}}.
| {{{activityMessage 'activity-imported' cardLink boardLabelLink sourceLink}}}.
if($eq activity.activityType 'moveCard')
| {{{_ 'activity-moved' cardLabelLink (sanitize activity.oldList.title) (sanitize activity.list.title)}}}.
| {{{activityMessage 'activity-moved' cardLabelLink (activityValue activity.oldList.title) (activityValue activity.list.title)}}}.
if($eq activity.activityType 'moveCardBoard')
| {{{_ 'activity-moved' cardLink (sanitize activity.oldBoardName) (sanitize activity.boardName)}}}.
| {{{activityMessage 'activity-moved' cardLink (activityValue activity.oldBoardName) (activityValue activity.boardName)}}}.
if($eq activity.activityType 'archivedCard')
| {{{_ 'activity-archived' cardLink}}}.
| {{{activityMessage 'activity-archived' cardLink}}}.
if($eq activity.activityType 'restoredCard')
| {{{_ 'activity-sent' cardLink boardLabelLink}}}.
| {{{activityMessage 'activity-sent' cardLink boardLabelLink}}}.
//- checklist activity --------------------------------------------------
if($eq activity.activityType 'addChecklist')
| {{{_ 'activity-checklist-added' cardLink}}}.
| {{{activityMessage 'activity-checklist-added' cardLink}}}.
if($eq mode 'card')
.activity-checklist
+viewer
@@ -81,114 +81,114 @@ template(name="activity")
= activity.checklist.title
if($eq activity.activityType 'removedChecklist')
| {{{_ 'activity-checklist-removed' cardLink}}}.
| {{{activityMessage 'activity-checklist-removed' cardLink}}}.
if($eq activity.activityType 'completeChecklist')
| {{{_ 'activity-checklist-completed' (sanitize activity.checklist.title) cardLink}}}.
| {{{activityMessage 'activity-checklist-completed' (activityValue activity.checklist.title) cardLink}}}.
if($eq activity.activityType 'uncompleteChecklist')
| {{{_ 'activity-checklist-uncompleted' (sanitize activity.checklist.title) cardLink}}}.
| {{{activityMessage 'activity-checklist-uncompleted' (activityValue activity.checklist.title) cardLink}}}.
if($eq activity.activityType 'checkedItem')
| {{{_ 'activity-checked-item' (sanitize checkItem) (sanitize activity.checklist.title) cardLink}}}.
| {{{activityMessage 'activity-checked-item' (activityValue checkItem) (activityValue activity.checklist.title) cardLink}}}.
if($eq activity.activityType 'uncheckedItem')
| {{{_ 'activity-unchecked-item' (sanitize checkItem) (sanitize activity.checklist.title) cardLink}}}.
| {{{activityMessage 'activity-unchecked-item' (activityValue checkItem) (activityValue activity.checklist.title) cardLink}}}.
if($eq activity.activityType 'addChecklistItem')
| {{{_ 'activity-checklist-item-added' (sanitize activity.checklist.title) cardLink}}}.
| {{{activityMessage 'activity-checklist-item-added' (activityValue activity.checklist.title) cardLink}}}.
.activity-checklist(href="{{ activity.card.originRelativeUrl }}")
+viewer
= activity.checklistItem.title
if($eq activity.activityType 'removedChecklistItem')
| {{{_ 'activity-checklist-item-removed' (sanitize activity.checklist.title) cardLink}}}.
| {{{activityMessage 'activity-checklist-item-removed' (activityValue activity.checklist.title) cardLink}}}.
//- comment activity ----------------------------------------------------
if($eq activity.activityType 'deleteComment')
| {{{_ 'activity-deleteComment' (sanitize activity.commentDisplayText)}}}.
| {{{activityMessage 'activity-deleteComment' (activityValue activity.commentDisplayText)}}}.
if($eq activity.activityType 'editComment')
| {{{_ 'activity-editComment' (sanitize activity.commentDisplayText)}}}.
| {{{activityMessage 'activity-editComment' (activityValue activity.commentDisplayText)}}}.
if($eq activity.activityType 'addComment')
| {{{_ 'activity-on' cardLink}}}
| {{{activityMessage 'activity-on' cardLink}}}
a.activity-comment(href="{{ activity.card.originRelativeUrl }}")
+viewer
= activity.comment.text
//- date activity ------------------------------------------------
if($eq activity.activityType 'a-receivedAt')
| {{{_ 'activity-receivedDate' (sanitize receivedDate) cardLink}}}.
| {{{activityMessage 'activity-receivedDate' (activityValue receivedDate) cardLink}}}.
if($eq activity.activityType 'a-startAt')
| {{{_ 'activity-startDate' (sanitize startDate) cardLink}}}.
| {{{activityMessage 'activity-startDate' (activityValue startDate) cardLink}}}.
if($eq activity.activityType 'a-dueAt')
| {{{_ 'activity-dueDate' (sanitize dueDate) cardLink}}}.
| {{{activityMessage 'activity-dueDate' (activityValue dueDate) cardLink}}}.
if($eq activity.activityType 'a-endAt')
| {{{_ 'activity-endDate' (sanitize endDate) cardLink}}}.
| {{{activityMessage 'activity-endDate' (activityValue endDate) cardLink}}}.
if($eq activity.activityType 'a-changedTitle')
| {{{_ 'activity-changedTitle' (sanitize activity.value) cardLink}}}.
| {{{activityMessage 'activity-changedTitle' (activityValue activity.value) cardLink}}}.
if($eq activity.activityType 'a-changedDescription')
| {{{_ 'activity-changedDescription' cardLink}}}.
| {{{activityMessage 'activity-changedDescription' cardLink}}}.
//- customField activity ------------------------------------------------
if($eq activity.activityType 'createCustomField')
| {{_ 'activity-customfield-created' customField}}.
| {{{activityMessage 'activity-customfield-created' (activityValue customField)}}}.
if($eq activity.activityType 'setCustomField')
| {{{_ 'activity-set-customfield' (sanitize lastCustomField) (sanitize lastCustomFieldValue) cardLink}}}.
| {{{activityMessage 'activity-set-customfield' (activityValue lastCustomField) (activityValue lastCustomFieldValue) cardLink}}}.
if($eq activity.activityType 'unsetCustomField')
| {{{_ 'activity-unset-customfield' (sanitize lastCustomField) cardLink}}}.
| {{{activityMessage 'activity-unset-customfield' (activityValue lastCustomField) cardLink}}}.
//- label activity ------------------------------------------------------
if($eq activity.activityType 'addedLabel')
| {{{_ 'activity-added-label' (sanitize lastLabel) cardLink}}}.
| {{{activityMessage 'activity-added-label' (activityValue lastLabel) cardLink}}}.
if($eq activity.activityType 'removedLabel')
| {{{_ 'activity-removed-label' (sanitize lastLabel) cardLink}}}.
| {{{activityMessage 'activity-removed-label' (activityValue lastLabel) cardLink}}}.
//- list activity -------------------------------------------------------
if($neq mode 'card')
if($eq activity.activityType 'createList')
| {{{_ 'activity-added' (sanitize listLabel) boardLabelLink}}}.
| {{{activityMessage 'activity-added' (activityValue listLabel) boardLabelLink}}}.
if($eq activity.activityType 'importList')
| {{{_ 'activity-imported' (sanitize listLabel) boardLabelLink sourceLink}}}.
| {{{activityMessage 'activity-imported' (activityValue listLabel) boardLabelLink sourceLink}}}.
if($eq activity.activityType 'removeList')
| {{{_ 'activity-removed' (sanitize activity.title) boardLabelLink}}}.
| {{{activityMessage 'activity-removed' (activityValue activity.title) boardLabelLink}}}.
if($eq activity.activityType 'archivedList')
| {{_ 'activity-archived' (sanitize listLabel)}}.
| {{{activityMessage 'activity-archived' (activityValue listLabel)}}}.
if($eq activity.activityType 'changedListTitle')
| {{_ 'activity-changedListTitle' (sanitize listLabel) boardLabelLink}}
| {{{activityMessage 'activity-changedListTitle' (activityValue listLabel) boardLabelLink}}}
//- member activity ----------------------------------------------------
if($eq activity.activityType 'joinMember')
if($eq user._id activity.member._id)
| {{{_ 'activity-joined' cardLink}}}.
| {{{activityMessage 'activity-joined' cardLink}}}.
else
| {{{_ 'activity-added' memberLink cardLink}}}.
| {{{activityMessage 'activity-added' memberLink cardLink}}}.
if($eq activity.activityType 'unjoinMember')
if($eq user._id activity.member._id)
| {{{_ 'activity-unjoined' cardLink}}}.
| {{{activityMessage 'activity-unjoined' cardLink}}}.
else
| {{{_ 'activity-removed' memberLink cardLink}}}.
| {{{activityMessage 'activity-removed' memberLink cardLink}}}.
//- swimlane activity --------------------------------------------------
if($eq activity.activityType 'createSwimlane')
| {{{_ 'activity-added' (sanitize activity.swimlane.title) boardLabelLink}}}.
| {{{activityMessage 'activity-added' (activityValue activity.swimlane.title) boardLabelLink}}}.
if($eq activity.activityType 'archivedSwimlane')
| {{{_ 'activity-archived' (sanitize activity.swimlane.title)}}}.
| {{{activityMessage 'activity-archived' (activityValue activity.swimlane.title)}}}.
//- I don't understand this part ----------------------------------------
@@ -198,7 +198,7 @@ template(name="activity")
i(title=currentData.timeValue).activity-meta {{ displayDate currentData.timeValue 'LLL' }}
if (currentData.timeOldValue)
= ' '
| {{{_ "previous_as" }}}
| {{{activityMessage "previous_as" }}}
= ' '
i(title=currentData.timeOldValue).activity-meta {{ displayDate currentData.timeOldValue 'LLL' }}
= ' @'
+34 -46
View File
@@ -1,8 +1,10 @@
import { ReactiveCache } from '/imports/reactiveCache';
import { ReactiveVar } from 'meteor/reactive-var';
import { Template } from 'meteor/templating';
import DOMPurify from 'dompurify';
import { sanitizeHTML, sanitizeText } from '/imports/lib/secureDOMPurify';
import { Blaze } from 'meteor/blaze';
import { HTML } from 'meteor/htmljs';
import { titleViewerHtml } from '/client/lib/titleViewer';
import { sanitizeHTML } from '/imports/lib/secureDOMPurify';
import { TAPi18n } from '/imports/i18n';
import { Utils } from '/client/lib/utils';
import { getSidebarInstance } from '/client/features/sidebar/service';
@@ -287,16 +289,9 @@ Template.activity.helpers({
// Only render a link for an http(s) URL; otherwise show the plain (sanitized)
// source name with no href.
if (source.url && /^https?:\/\//i.test(String(source.url))) {
return Blaze.toHTML(
HTML.A(
{
href: source.url,
},
sanitizeHTML(source.system),
),
);
return linkedActivityValue(source.system, source.url, 'action-source');
}
return sanitizeHTML(source.system);
return titleViewerHtml(source.system);
}
return null;
},
@@ -317,16 +312,9 @@ Template.activity.helpers({
(attachment &&
attachment.path &&
attachmentUrl &&
Blaze.toHTML(
HTML.A(
{
href: `${attachmentUrl}?download=true`,
target: '_blank',
},
sanitizeText(attachment.name),
),
)) ||
sanitizeText(this.activity.attachmentName)
linkedActivityValue(attachment.name,
`${attachmentUrl}?download=true`, 'action-attachment', '_blank')) ||
titleViewerHtml(this.activity.attachmentName)
);
},
@@ -338,8 +326,14 @@ Template.activity.helpers({
});
Template.activity.helpers({
sanitize(value) {
return sanitizeHTML(value);
activityValue(value) {
return titleViewerHtml(value == null ? '' : String(value));
},
activityMessage(key, ...values) {
const setting = ReactiveCache.getCurrentSetting();
return sanitizeHTML(TAPi18n.__(key, ...values), {
stripLinks: !!(setting && setting.renderLinksAsPlainText),
});
},
});
@@ -433,36 +427,30 @@ function createCardLink(activity, card, boardTitle) {
// Nothing named the card - an old activity from before the titles were
// recorded, on a card this client cannot see. Say "this card" rather than
// leaving a gap in the middle of a sentence.
return sanitizeHTML(TAPi18n.__('this-card'));
return titleViewerHtml(TAPi18n.__('this-card'));
}
let text = link.title;
if (link.archived) text = `${text} [${TAPi18n.__('archived')}]`;
if (boardTitle) text = `${boardTitle} > ` + text;
if (!link.url) return sanitizeHTML(text);
return Blaze.toHTML(
HTML.A(
{
href: link.url,
class: 'action-card',
},
sanitizeHTML(text),
),
);
return linkedActivityValue(text, link.url, 'action-card');
}
// Keep rich user links separate from application navigation: nested anchors
// cause browsers to move title fragments outside the activity link.
function linkedActivityValue(value, url, className, target) {
const rendered = sanitizeHTML(titleViewerHtml(value));
if (!url) return rendered;
const content = HTML.Raw(rendered);
const attributes = { href: url, class: className };
if (target) attributes.target = target;
return Blaze.toHTML(/<a\b/i.test(rendered)
? HTML.SPAN(content, ' ', HTML.A(attributes, '↗'))
: HTML.A(attributes, content));
}
function createBoardLink(board, list) {
if (!board) return '';
let text = board.title;
if (list) text += `: ${list}`;
return (
board &&
Blaze.toHTML(
HTML.A(
{
href: board.originRelativeUrl(),
class: 'action-board',
},
sanitizeHTML(text),
),
)
);
return linkedActivityValue(text, board.originRelativeUrl(), 'action-board');
}
@@ -1,5 +1,5 @@
import { FlowRouter } from 'meteor/ostrio:flow-router-extra';
import moment from 'moment';
import { format } from '/imports/lib/dateUtils';
import { Template } from 'meteor/templating';
import { Meteor } from 'meteor/meteor';
import { Session } from 'meteor/session';
@@ -63,7 +63,7 @@ Template.groupByAssigneeView.helpers({
return translateGroupLabel(label, key => TAPi18n.__(key));
},
formatDueAt(dueAt) {
return dueAt ? formatDateForDisplay(dueAt, true, date => moment(date).format('llll')) : '';
return dueAt ? formatDateForDisplay(dueAt, true, date => format(date, 'llll')) : '';
},
cardUrl(cardId) {
const boardId = Session.get('currentBoard');
@@ -62,3 +62,12 @@ Upcoming section existed to catch the entry first. That test is the real guard
and needed no empty placeholder to work. So: write the section yourself when
there is something to put in it, using the skeleton above, and let the test
catch the mistake if an entry still ends up in the wrong place.
## Read-only release preflight
Run `bash releases/check-upcoming-release.sh` to check release notes without
changing files or contacting a forge. Exactly one Upcoming section containing
a linked release entry is required. Missing, empty or duplicate sections fail
with an error. `release-all.sh` performs this check before installing tools or
changing files; explicit version arguments also require Upcoming notes. An
existing released heading is no longer reused when Upcoming notes are absent.
@@ -0,0 +1,20 @@
# Activity rendering
Opened-card activities and the right sidebar share the same activity template.
Activity titles, checklist text, labels, custom-field values, comment excerpts,
source names and attachment names use the existing Markdown/emoji viewer.
HTML allowed by the existing sanitizer is rendered with the same restrictions
as other viewer fields. No new HTML tags or URL schemes are permitted.
Admin Panel → Problems → Security controls apply:
- Plain-source mode displays literal source, including Markdown and HTML.
- Render links as plain text removes clickable links from activity sentences.
- Normal mode renders Markdown, emoji and permitted HTML after sanitization.
Imported source URLs retain their HTTP/HTTPS check. When a rich title contains
its own link, activity navigation is shown beside it to avoid nested anchors.
Focused activity-link, viewer, source-URL and Jade compilation checks pass.
Browser regressions cover both feeds, permitted HTML, unsafe event attributes
and all three display modes. They are syntax-checked; live execution is pending.
+17 -4
View File
@@ -4,17 +4,23 @@ Audit date: **2026-09-12**. Last updated: **2026-09-14**.
| Status | Flagged keys |
| --- | ---: |
| Corrected | 15,149 |
| Corrected | 15,218 |
| Restored pre-pull; awaiting validation | 4,058 |
| Reviewed; retained unchanged | 179 |
| Pending review or repair | 695 |
| Pending review or repair | 626 |
| Total tracked | 20,081 |
**Resumed at the maintainer’s request on 2026-09-13.** Reviewing and repairing the remaining local findings, beginning with Klingon. All **361** originally flagged Klingon findings are repaired. The broader check of **829** German-identical values is reviewed: **829** repaired, including the mistaken German `cron` retention corrected to the actual tool name **Cron**. Restored and unflagged translations still need validation.
Fixed: wrong-language text, terminology, warnings, placeholders and JSON/calendar/search formatting. [Correction records](../../../releases/translations/audited-corrections.json) contain **17,356** exact before/after values, including unflagged repairs.
Fixed: wrong-language text, terminology, warnings, placeholders and JSON/calendar/search formatting. [Correction records](../../../releases/translations/audited-corrections.json) contain **17,476** exact before/after values, including unflagged repairs.
Latest translation fix: **2026-09-14**, local commit `47796391a` — replaced three French Tamazight due-date labels, preserving due-date versus completion and today versus tomorrow distinctions. CLDR attests the relative-day names; native date/last components support the existing final-date adaptation. Full deadline terminology and relative-filter usage remain **low confidence** pending fluent review. All **17,353** correction/rendering checks pass. One originally flagged and two unflagged values are repaired: **696** originals remain pending, including **553** Tamazight. Earlier composed wording and restored/unflagged values still need validation. Live browser verification was not run; no translations were pushed.
Latest translation fix: **2026-09-14**, local commit `88ba30aec` — replaced two French custom HTML insertion actions. Preserve opening `<body>` versus closing `</body>`, HTML identifier and opposite before/after directions. Native MediaWiki components support the vocabulary; specified/custom qualifier adaptation and full phrase composition remain **low confidence** pending fluent review. All **17,466** correction/rendering checks pass. **627** originals remain pending across **17** locales, including **484** Tamazight. Restored/unflagged values and earlier low-confidence wording still need validation. Live browser verification was not run; no translations were pushed.
**Build interruption follow-up (2026-09-14):** `.tools/wekan22` contains the old v11.75 missing-Moment failure, already repaired in `43adfe1a7`. A fresh Meteor 3.6-beta.0 bundle build passes on Linux arm64, and six assignee/calendar/release-preflight Node test entries pass. Log: `.tools/log/build-dev-bundle/2026-09-14/04-25-58/dev.txt`. Native amd64 and live browser checks were not run. Translation counts and the remaining validation scope above are unchanged.
**Color-name reference review (2026-09-14):** Sardinian and Aromanian `color-magenta` remain pending. Searches did not establish native usage; Italian publications and English WordPress changelogs are insufficient. The [Vrabie English–Aromanian dictionary](https://s3.wasabisys.com/fars-media/wp-content/uploads/2020/07/An-English-Aromanian-Macedo-Romanian-Dictionary-%C2%A9Society-Farsharotu-1.pdf) has poor OCR and no searchable magenta/fuchsia entry, which does not prove absence. Further review needs a legible dictionary entry or native usage; neither color value was changed or accepted as verified.
**Checklist reference review (2026-09-14):** the candidate [computing lexicon](https://www.fichier-pdf.fr/2014/08/31/lexique-informatique/) labels `asenqed` (check/control) **KBL**. Its indexed entry does not establish Standard Moroccan checklist usage; the original hosting could not be fetched. A [readable CNAM-hosted edition](https://cedric.cnam.fr/~bouzefra/books/amawal.pdf) was subsequently found; it distinguishes mixed source dialects and proposed neologisms, so it does not justify blanket Standard Moroccan acceptance. Existing schwa-heavy checklist strings and full confirmation wording remain pending terminology and dialect review. No blanket retention or replacement is justified by this reference.
**Language validation (2026-09-14), local commit `e4e3aa590`:** Wiktionary’s Veps transitive inflection tables confirm `surenda` (make larger) and `penenda` (make smaller) as second-person singular commands. Their imperative morphology is now reference-supported; screen-zoom usage remains open. The original keyboard findings remain unresolved: searches and the cached dictionary did not establish reliable keyboard-shortcut terminology. Counts are unchanged. References and the remaining scope are recorded per key in the correction ledger.
@@ -38,6 +44,13 @@ resizing. Geometry, pointer and Jade checks pass; browser coverage is added
and syntax-checked, with live execution pending. Translation counts are
unchanged; the translation audit remains active.
**Activity viewer follow-up (2026-09-14):** local commit `02f233649`
renders activity values in card and sidebar feeds through the shared
Markdown/emoji/permitted-HTML viewer, respecting security display modes.
Focused viewer, navigation, source-URL and Jade checks pass; browser coverage
is syntax-checked, not run live. Translation counts are unchanged; repairs
and wording validation remain active.
**Remaining validation:** all restored/unflagged values and low-confidence replacements remain open. Detailed per-key caveats are retained in the correction ledger and source commits. These include Veps composed UI, card, notification, calendar, timing, file/archive, metric and legal terminology/inflection; Neapolitan technical checklist usage; Fulah/Bambara calendar composition; and CLDR-provisional Ewe civil-calendar and Tongan tabular-calendar/astronomical-epoch phrase composition, and Sakha civil/astronomical-calendar/era-to-epoch and sighting-phrase composition. Field sums, parent-card terminology, keyboard shortcuts, remaining migration/search messages and other calendar variants need further language research. Wrong-language/script and fluent-speaker checks remain unfinished.
**Security interruption (2026-09-14):** `c1246d720` reviews both saved `.tools/wekansec20` alerts and hardens exact archive-host checks and shell-free mirror dispatch, including direct Windows Node execution. All 25 focused mirror test entries pass; native Windows and remote CodeQL rescanning remain unverified. Translation counts and remaining validation are unchanged.
@@ -10,7 +10,7 @@ This is without container (without Docker or Snap).
Right click and download files 1-4:
1. [wekan-11.74-win64.zip](https://github.com/wekan/wekan/releases/download/v11.74/wekan-11.74-win64.zip) or newest available at https://github.com/wekan/wekan/releases/
1. [wekan-11.76-win64.zip](https://github.com/wekan/wekan/releases/download/v11.76/wekan-11.76-win64.zip) or newest available at https://github.com/wekan/wekan/releases/
2. [node.exe](https://nodejs.org/dist/latest-v24.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.34-signed.msi` . In installer, uncheck downloading MongoDB compass.
7. Unzip `wekan-11.74-win64.zip` , inside it is directory `bundle`, to it copy other files:
7. Unzip `wekan-11.76-win64.zip` , inside it is directory `bundle`, to it copy other files:
```
bundle (directory)
+11
View File
@@ -65,3 +65,14 @@ No application code or dependencies changed in this report-only pass.
Next: repair confirmed findings with positive/negative/UI coverage, review
publication audiences, then expand endpoint and async-call-site coverage.
All proposed runtime changes must retain offline on-premise operation.
## Build follow-up — 2026-09-14
Meteor debugging and Rspack migration guidance identified an undeclared
Moment import in the assignee client graph. Commit `43adfe1a7` uses the
existing native date formatter, retaining selected-calendar rendering.
The Meteor bundle build passed on Linux arm64; focused date/view and
release-preflight regressions passed. Build log:
`.tools/log/build-dev-bundle/2026-09-14/03-54-13/dev.txt`.
Live browser tests and builds on other operating systems were not run.
The security findings above remain open.
+121 -121
View File
@@ -51,7 +51,7 @@
"act-joinMember": "irna amraw __member__ i takarḍa __card__ deg tabdart __list__, abrid __swimlane__, tafelwit __board__",
"act-moveCard": "issenkez takarḍa __card__ deg tafelwit __board__ seg tabdart __oldList__, abrid __oldSwimlane__ ɣer tabdart __list__, abrid __swimlane__",
"act-moveCardToOtherBoard": "a déplacé la carte __card__ de la liste __oldList__ du couloir __oldSwimlane__ du tableau __oldBoard__ vers la liste __list__ du couloir __swimlane__ du tableau __board__",
"act-removeBoardMember": "a supprimé le participant __member__ du tableau __board__",
"act-removeBoardMember": "ⵉⴽⴽⵙ ⴰⴳⵎⴰⵎ __member__ ⵙⴳ ⵜⴼⵍⵡⵉⵜ __board__",
"act-restoredCard": "a restauré la carte __card__ de la liste __list__ du couloir __swimlane__ du tableau __board__",
"act-unjoinMember": "a supprimé le participant __member__ de la carte __card__ de la liste __list__ du couloir __swimlane__ du tableau __board__",
"actions": "ⵜⵉⴳⴰⵡⵉⵏ",
@@ -123,14 +123,14 @@
"home-board-remove-confirm": "Kkes tafelwit-a seg Asnubeg? Tafelwit s timmad-is ur tettwakkes ara.",
"set-default-board-template": "ⵙⵙⵉⵡⴻⴹ ⴰⴽⴽⵯ ⴰⵎⴰⵜⴰⵔ ⵓⵙⵍⵉⴳ ⵓⴼⴰⴹⵣⴻⵏ (ⵉⵜⵜⵓⵙⵎⵔⴻⵙ ⵙ ⵓⵣⵎⵣⵣⵓ ⵎⵉ ⵉⴽⴽⴰ ⵓⴳⵣⴰⵎ ⵏ ⵓⵙⵍⵉⴳ ⴰⵎⴰⵢⵏⵓ)",
"unset-default-board-template": "ⴽⴽⵙ ⴰⵎⴰⵜⴰⵔ ⵓⵙⵍⵉⴳ ⴰⴼⴰⴹⵣⴻⵏ",
"activity-dueDate": "date d'échéance éditée de %s à %s",
"activity-dueDate": "ⵉⵙⵏⴼⵍ ⴰⵙⴰⴽⵓⴷ ⴰⵎⴳⴳⴰⵔⵓ ⵖⵔ %s ⵏ %s",
"activity-endDate": "date de fin éditée de %s à %s",
"add-attachment": "إضافة مرفق",
"add-board": "إضافة لوحة",
"add-template": "Ajouter un modèle",
"add-card": "إضافة بطاقة",
"add-card-to-top-of-list": "Ajouter la carte en haut de la liste",
"add-card-to-bottom-of-list": "Ajouter la carte en bas de la liste",
"add-card-to-top-of-list": "ⵔⵏⵓ ⵜⴰⴽⴰⵕⴹⴰ ⴳ ⵓⴷⵖⴰⵔ ⴰⵎⵣⵡⴰⵔⵓ ⵏ ⵜⵍⴳⴰⵎⵜ",
"add-card-to-bottom-of-list": "ⵔⵏⵓ ⵜⴰⴽⴰⵕⴹⴰ ⴳ ⵓⴷⵖⴰⵔ ⴰⵎⴳⴳⴰⵔⵓ ⵏ ⵜⵍⴳⴰⵎⵜ",
"addListPopup-title": "إضافة قائمة",
"setListWidthPopup-title": "ⴻⵔⵙ ⵜⴻⵀⵔⵉ",
"set-list-width": "ⴻⵔⵙ ⵜⴻⵀⵔⵉ",
@@ -218,14 +218,14 @@
"board-background-image-url": "عنوان URL لصورة الخلفية",
"add-background-image": "إضافة صورة الخلفية",
"remove-background-image": "إزالة صورة الخلفية",
"show-at-all-boards-page": "Afficher sur la page de tous les tableaux",
"show-at-all-boards-page": "ⵙⴽⵏ ⴳ ⵜⵙⵏⴰ ⵏ ⵜⴼⵍⵡⵉⵏ ⴰⴽⴽⵯ",
"board-info-on-my-boards": "جميع إعدادات اللوحات",
"boardInfoOnMyBoardsPopup-title": "جميع إعدادات اللوحات",
"boardInfoOnMyBoards-title": "جميع إعدادات اللوحات",
"show-card-counter-per-list": "Afficher le nombre de cartes par liste",
"show-card-counter-per-list": "ⵙⴽⵏ ⵓⵟⵟⵓⵏ ⵏ ⵜⴽⴰⵕⴹⵉⵡⵉⵏ ⴳ ⴽⵓ ⴷ ⵜⴰⵍⴳⴰⵎⵜ",
"show-board_members-avatar": "Afficher les avatars des participants du tableau.",
"board_members": "Tous les participants du tableau",
"card_members": "Tous les participants de la carte actuelle dans ce tableau",
"board_members": "ⵉⴳⵎⴰⵎⵏ ⴰⴽⴽⵯ ⵏ ⵜⴼⵍⵡⵉⵜ",
"card_members": "ⵉⴳⵎⴰⵎⵏ ⴰⴽⴽⵯ ⵏ ⵜⴽⴰⵕⴹⴰ ⴰⴷ ⴳ ⵜⴼⵍⵡⵉⵜ ⴰⴷ",
"board_assignees": "Tous les intervenants de toutes les cartes de ce tableau",
"card_assignees": "Tous les intervenants de la carte actuelle de ce tableau",
"board-nb-stars": "%s نجوم",
@@ -265,10 +265,10 @@
"board-view-lists": "القائمات",
"board-view-table": "جدول",
"board-view-stats": "ⵜⵉⵙⵉⴹⵏⵉⵏ",
"board-view-time": "الوقت",
"board-view-time": "ⴰⴽⵓⴷ",
"board-view-timeline": "ⵜⵉⴳⴳⵣⵉ ⵏ ⵡⴰⴽⵓⴷ",
"board-view-timeline-hint": "ⵙⵉⵜⵜ ⵅⴼ ⵢⴰⵜ ⵜⵉⴳⴳⵣⵜ ⴳ ⵡⴰⴽⵓⴷ ⴰⵢⵍⵍⵉ ⴰⴷ ⵜⵥⵕⴷ ⵎⴰⵎⵏⴽ ⵜⴳⴰ ⵜⴰⴼⵍⴰⵡⵜ ⴳ ⵓⴽⵓⴷ ⴰⴷⴷ.",
"board-view-timeline-now": "ⴰⵙⵙⴰ",
"board-view-timeline-now": "ⴷⵖⵉⴽⴽ",
"board-view-timeline-showing": "ⵜⵙⴽⴰⵏ ⴰⵏⵎⴰⵖ ⵙⴳ:",
"board-view-timeline-restore": "ⵕⵥⵎ ⵖⵔ ⵓⵏⵎⴰⵖ ⴰⴷ",
"cardRestoreToTimelinePopup-title": "Ales tuɣalin n tkarḍa?",
@@ -321,7 +321,7 @@
"card-comments-title": "%s تعليقات لهذه البطاقة",
"card-comments-on-minicard": "Iwenniten ɣef takarḍa tamecṭuḥt",
"card-comments-more": "ⵓⴳⴳⴰⵔ",
"card-has-unread-comments": "ⵉⵡⵍⴰⴼⵏ ⵓⵔ ⵉⵜⵜⵡⴰⵖⵔⵉⵏ",
"card-has-unread-comments": "ⵉⵅⴼⴰⵡⴰⵍⵏ ⵓⵔ ⵉⵜⵜⵡⴰⵖⵔⵉⵏ",
"card-delete-notice": "هذا حذف أبديّ . سوف تفقد كل الإجراءات المنوطة بهذه البطاقة",
"card-delete-pop": "سيتم إزالة جميع الإجراءات من تبعات النشاط، وأنك لن تكون قادرا على إعادة فتح البطاقة. لا يوجد التراجع.",
"card-delete-suggest-archive": "يمكنك نقل بطاقة إلى الأرشيف لإزالتها من اللوحة والمحافظة على النشاط.",
@@ -345,17 +345,17 @@
"card-edit-members": "تعديل الأعضاء",
"card-labels-title": "تعديل علامات البطاقة.",
"card-members-title": "إضافة او حذف أعضاء للبطاقة.",
"card-start": "بداية",
"card-start": "ⵜⵓⴷⴷⵎⴰ",
"card-start-on": "يبدأ في",
"cardAttachmentsPopup-title": "إرفاق من",
"cardCustomField-datePopup-title": "تغير التاريخ",
"cardCustomField-datePopup-title": "ⵙⵏⴼⵍ ⴰⵙⴰⴽⵓⴷ",
"cardCustomFieldsPopup-title": "تعديل الحقل المعدل",
"cardStartVotingPopup-title": "ابدأ تصويت",
"positiveVoteMembersPopup-title": "Pour",
"negativeVoteMembersPopup-title": "Contre",
"card-edit-voting": "Éditer le vote",
"editVoteEndDatePopup-title": "Modifier la date de fin de vote",
"allowNonBoardMembers": "Autoriser tous les utilisateurs authentifiés",
"allowNonBoardMembers": "ⴰⵊⵊ ⵉⵎⵙⵙⵎⵔⵙⵏ ⴰⴽⴽⵯ ⵏⵏⴰ ⴽⵛⵎⵏ",
"vote-question": "Question du vote",
"vote-public": "Montrer qui a voté quoi",
"vote-for-it": "مع",
@@ -540,15 +540,15 @@
"comment": "ⴰⵖⴼⴰⵡⴰⵍ",
"comment-placeholder": "",
"comment-only": "التعليق فقط",
"comment-only-desc": "يمكن التعليق على بطاقات فقط.",
"comment-only-desc": "ⵜⵥⴹⴰⵕⴷ ⴰⴷ ⵜⵔⵏⵓⴷ ⴰⵖⴼⴰⵡⴰⵍ ⵖⴼ ⵜⴽⴰⵕⴹⵉⵡⵉⵏ ⵖⴰⵙ.",
"comment-assigned-only": "Commentaire assigné uniquement",
"comment-assigned-only-desc": "Seules les cartes assignées sont visibles. Commentaire uniquement.",
"comment-delete": "ⵉⵙ ⵏⵉⵜ ⵜⵅⵙⴷ ⴰⴷ ⵜⴽⴽⵙⴷ ⴰⵖⴼⴰⵡⴰⵍ?",
"deleteCommentPopup-title": "ⴽⴽⵙ ⴰⵖⴼⴰⵡⴰⵍ?",
"no-comments": "لا يوجد تعليقات",
"no-comments-desc": "Impossible de voir les commentaires.",
"no-comments-desc": "ⵓⵔ ⵜⵥⴹⴰⵕⴷ ⴰⴷ ⵜⵥⵕⴷ ⵉⵅⴼⴰⵡⴰⵍⵏ.",
"read-only": "Lecture seule",
"read-only-desc": "Peut seulement voir les cartes. Ne peut pas éditer.",
"read-only-desc": "ⵜⵥⴹⴰⵕⴷ ⴰⴷ ⵜⵥⵕⴷ ⵜⵉⴽⴰⵕⴹⵉⵡⵉⵏ ⵖⴰⵙ. ⵓⵔ ⵜⵥⴹⴰⵕⴷ ⴰⴷ ⵜⵙⵏⴼⵍⴷ.",
"read-assigned-only": "Lecture uniquement pour les cartes assignées",
"read-assigned-only-desc": "Seules les cartes assignées sont visibles. Modification impossible.",
"worker": "عامل",
@@ -571,14 +571,14 @@
"copyListPopup-title": "Copier la liste",
"copyManyCardsPopup-title": "Copier le modèle vers plusieurs cartes",
"copyManyCardsPopup-instructions": "Titres et descriptions des cartes de destination dans ce format JSON",
"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\"} ]",
"copyManyCardsPopup-format": "[{\"title\":\"ⴰⵣⵡⵍ ⵏ ⵜⴽⴰⵕⴹⴰ ⵜⴰⵎⵣⵡⴰⵔⵓⵜ\",\"description\":\"ⴰⵙⴳⵣⵍ ⵏ ⵜⴽⴰⵕⴹⴰ ⵜⴰⵎⵣⵡⴰⵔⵓⵜ\"},{\"title\":\"ⴰⵣⵡⵍ ⵏ ⵜⴽⴰⵕⴹⴰ 2\",\"description\":\"ⴰⵙⴳⵣⵍ ⵏ ⵜⴽⴰⵕⴹⴰ 2\"},{\"title\":\"ⴰⵣⵡⵍ ⵏ ⵜⴽⴰⵕⴹⴰ ⵜⴰⵎⴳⴳⴰⵔⵓⵜ\",\"description\":\"ⴰⵙⴳⵣⵍ ⵏ ⵜⴽⴰⵕⴹⴰ ⵜⴰⵎⴳⴳⴰⵔⵓⵜ\"}]",
"create": "ⵙⵏⵓⵍⴼⵓ",
"createBoardPopup-title": "إنشاء لوحة",
"createTemplateContainerPopup-title": "Ajouter un conteneur de modèles",
"chooseBoardSourcePopup-title": "استيراد لوحة",
"createLabelPopup-title": "إنشاء علامة",
"createCustomField": "انشاء حقل",
"createCustomFieldPopup-title": "انشاء حقل",
"createCustomField": "ⵙⵏⵓⵍⴼⵓ ⵉⴳⵔ",
"createCustomFieldPopup-title": "ⵙⵏⵓⵍⴼⵓ ⵉⴳⵔ",
"current": "ⴰⵎⵉⵔⴰⵏ",
"custom-color": "ⵉⵏⵉ ⵓⴷⵎⴰⵡⴰⵏ",
"custom-field-delete-pop": "Cette action est irréversible. Elle supprimera ce champ personnalisé de toutes les cartes et détruira son historique.",
@@ -588,9 +588,9 @@
"custom-field-date": "ⴰⵙⴰⴽⵓⴷ",
"custom-field-dropdown": "Liste de choix",
"custom-field-dropdown-none": "(ⵓⵍⴰ ⵢⴰⵏ)",
"custom-field-dropdown-options": "Options de liste",
"custom-field-dropdown-options-placeholder": "Appuyez sur Entrée pour ajouter d'autres options",
"custom-field-dropdown-unknown": "(inconnu)",
"custom-field-dropdown-options": "ⵜⵉⴷⵖⵔⵉⵏ ⵏ ⵜⵍⴳⴰⵎⵜ",
"custom-field-dropdown-options-placeholder": "ⵔⵏⵓ ⵜⵉⴷⵖⵔⵉⵏ ⵢⴰⴹⵏⵉⵏ ⵙ Enter",
"custom-field-dropdown-unknown": "(ⴰⵔⵓⵙⵙⵉⵏ)",
"custom-field-dropdownMultiSelect": "ⵜⴰⵍⵍⵉⵙⵜ ⵢⴰⴹⵕⴰⴱⴱⵓⵜⵜ (ⴰⵣⴰⵍⵎⴰⴹ ⵓⴳⴳⴰⵔ)",
"custom-field-number": "ⴰⵎⴹⴰⵏ",
"custom-field-text": "ⴰⴹⵕⵉⵙ",
@@ -602,10 +602,10 @@
"date-format-mm-dd-yyyy": "MM-JJ-AAAA",
"decline": "Refuser",
"default-avatar": "صورة شخصية افتراضية",
"delete": "Kkes",
"delete": "ⴽⴽⵙ",
"enable-permanent-delete": "Sermed tukksa n lebda i unedbal amatu",
"enable-permanent-delete-description": "Sireg inedbalen imuta ad kksen i lebda agbur yettwakksen s tarrayt tamellalt. Asermed n useɣwen-a ur yettekks kra s yiman-is.",
"deleteCustomFieldPopup-title": "Supprimer le champ personnalisé ?",
"deleteCustomFieldPopup-title": "ⴽⴽⵙ ⵉⴳⵔ ⵉⵥⵍⵉⵏ?",
"deleteLabelPopup-title": "ⴽⴽⵙ ⴰⵔⵛⵓⵎ?",
"description": "ⴰⵙⴳⵣⵍ",
"disambiguateMultiLabelPopup-title": "تحديد الإجراء على العلامة",
@@ -619,7 +619,7 @@
"soft-wip-limit": "Limite WIP douce",
"editCardStartDatePopup-title": "تغيير تاريخ البدء",
"editCardDueDatePopup-title": "تغيير تاريخ الاستحقاق",
"editCustomFieldPopup-title": "Éditer le champ personnalisé",
"editCustomFieldPopup-title": "ⵙⵏⴼⵍ ⵉⴳⵔ",
"addReactionPopup-title": "Ajouter une réaction",
"editCardSpentTimePopup-title": "Modifier le temps passé",
"editLabelPopup-title": "تعديل العلامة",
@@ -637,16 +637,16 @@
"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.",
"push-invite-title": "__inviter__ أرسل دعوة لك",
"push-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-subject": "ⵔⴰⵔ ⴷ ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵏⵏⴽ ⴳ __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-subject": "ⵙⵙⵉⴷⴻⴷ ⴰⵏⵙⴰ ⵏ ⵉⵎⴰⵢⵍ ⵏⵏⴽ ⴳ __siteName__",
"email-verifyEmail-text": "Bonjour __user__,\n\nPour vérifier votre compte courriel, il suffit de cliquer sur le lien ci-dessous.\n\n__url__\n\nMerci.",
"enable-vertical-scrollbars": "تمكين أشرطة التمرير العمودية",
"enable-wip-limit": "Activer la limite WIP",
"error-board-doesNotExist": "Ce tableau n'existe pas",
"error-board-notAdmin": "Vous devez être administrateur de ce tableau pour faire cela",
"error-board-notAMember": "Vous devez être participant de ce tableau pour faire cela",
"error-board-notAdmin": "ⵉⵍⵍⴰ ⴼⵍⵍⴰⴽ ⴰⴷ ⵜⴳⴷ ⴰⵎⵙⵙⵓⴳⵓⵔ ⵏ ⵜⴼⵍⵡⵉⵜ ⴰⴷ ⴼⴰⴷ ⴰ ⵜⵙⴽⵔⵜ ⵎⴰⵢⴰⴷ",
"error-board-notAMember": "ⵉⵍⵍⴰ ⴼⵍⵍⴰⴽ ⴰⴷ ⵜⴳⴷ ⴰⴳⵎⴰⵎ ⵏ ⵜⴼⵍⵡⵉⵜ ⴰⴷ ⴼⴰⴷ ⴰ ⵜⵙⴽⵔⵜ ⵎⴰⵢⴰⴷ",
"error-watch-disabled": "Le suivi des tableaux et des cartes est désactivé par l'administrateur",
"error-notAllowed": "ⵜⴰⵡⵓⵔⵉ-ⵏⵏⴻⴽ ⴷⴻⴳ ⵜⴼⴻⵍⵡⵉⵜ ⵓⵔ ⵜⵓⵔⵉⴳ ⴰⵔⴰ ⴰⴷ ⵜⴻⴳⴳ ⴰⵢⴰⴳⵉ",
"error-json-malformed": "Votre texte JSON n'est pas valide",
@@ -667,10 +667,10 @@
"export-board": "Sifeḍ tafelwit",
"export-board-without-attachments": "ⵡⴰⵔ ⵜⵉⵎⴻⵔⵔⴰⵢⵉⵏ",
"export-ical-feed": "التقويم (iCal)",
"user-can-not-export-excel": "L'utilisateur ne peut pas exporter vers Excel",
"export-card": "Exporter la carte",
"export-card-pdf": "Exporter la carte en PDF",
"export-card-excel": "ⵙⵙⵓⴼⵖ Takarḍa ⵖⵔ Excel",
"user-can-not-export-excel": "ⴰⵏⵙⵙⵎⵔⵙ ⵓⵔ ⵉⵥⴹⴰⵕ ⴰ ⵉⵙⵙⵓⴼⵖ ⵖⵔ Excel",
"export-card": "ⵙⵙⵓⴼⵖ ⵜⴰⴽⴰⵕⴹⴰ",
"export-card-pdf": "ⵙⵙⵓⴼⵖ ⵜⴰⴽⴰⵕⴹⴰ ⵖⵔ PDF",
"export-card-excel": "ⵙⵙⵓⴼⵖ ⵜⴰⴽⴰⵕⴹⴰ ⵖⵔ Excel",
"export-card-excel-fields": "Sélectionnez les champs à inclure dans l'export Excel :",
"export-card-subtasks": "المهمات الفرعية",
"export-card-field-people": "Personnes (Créateur, Propriétaire, Participants, Intervenants)",
@@ -685,12 +685,12 @@
"export-card-excel-no-disk-space": "Impossible d'exporter vers Excel : espace disque insuffisant",
"export-card-excel-free": "gratuit",
"export-card-excel-needed": "requis",
"user-can-not-export-card-to-pdf": "L'utilisateur ne peut pas exporter de carte en PDF",
"user-can-not-export-card-to-excel": "L'utilisateur ne peut pas exporter la carte vers Excel",
"exportBoardPopup-title": "Exporter le tableau",
"exportCardPopup-title": "Exporter la carte",
"user-can-not-export-card-to-pdf": "ⴰⵏⵙⵙⵎⵔⵙ ⵓⵔ ⵉⵥⴹⴰⵕ ⴰ ⵉⵙⵙⵓⴼⵖ ⵜⴰⴽⴰⵕⴹⴰ ⵖⵔ PDF",
"user-can-not-export-card-to-excel": "ⴰⵏⵙⵙⵎⵔⵙ ⵓⵔ ⵉⵥⴹⴰⵕ ⴰ ⵉⵙⵙⵓⴼⵖ ⵜⴰⴽⴰⵕⴹⴰ ⵖⵔ Excel",
"exportBoardPopup-title": "ⵙⵙⵓⴼⵖ ⵜⴰⴼⵍⵡⵉⵜ",
"exportCardPopup-title": "ⵙⵙⵓⴼⵖ ⵜⴰⴽⴰⵕⴹⴰ",
"exportChartPopup-title": "Sifeḍ",
"sort": "رتب",
"sort": "ⴰⴼⵔⴰⵏ",
"sorted": "مرتبة",
"remove-sort": "إزالة الفرز\n ",
"sort-desc": "انقر لفرز القائمة\n ",
@@ -813,15 +813,15 @@
"import-members-map-note": "Note: les participants ne concordant pas seront assignés à l'utilisateur courant.",
"import-show-user-mapping": "Contrôler l'assignation des participants",
"import-user-select": "Sélectionnez l'utilisateur existant que vous voulez associer à ce participant",
"importMapMembersAddPopup-title": "Sélectionner le participant",
"importMapMembersAddPopup-title": "ⵙⵜⵉ ⴰⴳⵎⴰⵎ",
"info": "الإصدار",
"check-version": "Cocher الإصدار",
"version-check-failed": "Cocher الإصدار: Erreur.",
"initials": "أولية",
"invalid-date": "تاريخ غير صالح",
"invalid-time": "Heure invalide",
"invalid-date": "ⴰⵙⴰⴽⵓⴷ ⴰⵔⵓⵖⵣⵉⵏ",
"invalid-time": "ⴰⴽⵓⴷ ⴰⵔⵓⵖⵣⵉⵏ",
"invalid-year": "Aseggas mačči d ameɣtu. Sekcem ukuẓ n izwilen, amedya 2026.",
"invalid-user": "Utilisateur invalide",
"invalid-user": "ⴰⵏⵙⵙⵎⵔⵙ ⴰⵔⵓⵖⵣⵉⵏ",
"joined": "انضمّ",
"just-invited": "Vous venez d'être invité à ce tableau",
"keyboard-shortcuts": "اختصار لوحة المفاتيح",
@@ -869,7 +869,7 @@
"log-in": "ⴽⵛⵎ",
"loginPopup-title": "ⴽⵛⵎ",
"memberMenuPopup-title": "أفضليات الأعضاء",
"members": "أعضاء",
"members": "ⵉⴳⵎⴰⵎⵏ",
"menu": "القائمة",
"move-selection": "Déplacer la sélection",
"copy-selection": "Copier la sélection",
@@ -911,10 +911,10 @@
"preview": "ⵜⴰⵎⵓⵖⵍⵉ ⵜⴰⵎⵣⵡⴰⵔⵓⵜ",
"previewAttachedImagePopup-title": "ⵜⴰⵎⵓⵖⵍⵉ ⵜⴰⵎⵣⵡⴰⵔⵓⵜ",
"previewClipboardImagePopup-title": "ⵜⴰⵎⵓⵖⵍⵉ ⵜⴰⵎⵣⵡⴰⵔⵓⵜ",
"private": "خاص",
"private": "ⵓⵙⵍⵉⴳ",
"private-desc": "هذه اللوحة خاصة . لا يسمح إلا للأعضاء .",
"profile": "ملف شخصي",
"public": "عامّ",
"public": "ⴰⴳⴷⵓⴷⴰⵏ",
"public-desc": "هذه اللوحة عامة: مرئية لكلّ من يحصل على الرابط ، و هي مرئية أيضا في محركات البحث مثل جوجل. التعديل مسموح به للأعضاء فقط.",
"custom-private-desc": "Udmawan خاص aglam",
"custom-private-desc-placeholder": "Eǧǧ itt d ilem akken ad tesqedceḍ amezwer خاص aglam n tqecwalt",
@@ -932,13 +932,13 @@
"sandstorm-remove-member-warning": "ⴰⵢⴰ ⴰⵔ ⵉⵜⵜⴼⴼⵔ ⴰⵎⵜⵜⴰⵡⵙ ⴳ WeKan ⴽⴰⵏ. ⵓⵔ ⵉⵜⵜⴽⴽⵙ ⴰⴷⴰⴼ ⵙ Sandstorm grain. ⴽⴽⵙ ⴰⴷⴰⴼ ⵏⵏⵙ ⴷⴰⵖ ⴳ ⵜⴰⵏⴰⴽⴰ ⵏ ⴱⴹⵓ ⵏ ⵓⴷⵓⴼ ⵏ Sandstorm.",
"removeMemberPopup-title": "حذف العضو ?",
"rename": "ⴰⵍⵙ ⵉ ⵉⵙⵎ",
"rename-board": "إعادة تسمية اللوحة",
"rename-board": "ⴰⵍⵙ ⵉ ⵉⵙⵎ ⵏ ⵜⴼⵍⵡⵉⵜ",
"restore": "استعادة",
"rescue-card-description": "Afficher le dialogue de sauvegarde avant de fermer les descriptions de carte en cours de modification",
"rescue-card-description-dialogue": "Réécrire la description de la carte courante avec vos changements ?",
"save": "Sekles",
"search": "Nadi",
"rules": "قواعد",
"rules": "ⵉⵍⵓⴳⵏⵏ",
"search-cards": "Rechercher parmi les titres, descriptions et champs personnalisés des cartes/listes de ce tableau",
"search-example": "Écrivez le texte que vous recherchez et appuyez sur Entrée",
"select-color": "اختيار اللون",
@@ -1133,16 +1133,16 @@
"hours": "الساعات",
"minutes": "الدقائق",
"seconds": "الثواني",
"show-field-on-card": "Afficher ce champ sur la carte",
"automatically-field-on-card": "Ajouter le champ aux cartes nouvellement créées",
"always-field-on-card": "Ajouter le champ à toutes les cartes",
"show-field-on-card": "ⵙⴽⵏ ⵉⴳⵔ ⴰⴷ ⵖⴼ ⵜⴽⴰⵕⴹⴰ",
"automatically-field-on-card": "ⵔⵏⵓ ⵉⴳⵔ ⵉ ⵜⴽⴰⵕⴹⵉⵡⵉⵏ ⵜⵉⵎⴰⵢⵏⵓⵜⵉⵏ",
"always-field-on-card": "ⵔⵏⵓ ⵉⴳⵔ ⵉ ⵜⴽⴰⵕⴹⵉⵡⵉⵏ ⴰⴽⴽⵯ",
"showLabel-field-on-card": "Indiquer l'étiquette du champ sur la mini-carte",
"showSum-field-on-list": "Afficher le total des champs en haut de liste",
"admin-only-field": "ⵉⵜⵜⵡⴰⵍⵉ ⵖⵔ ⵉⵎⵙⵙⵓⴳⴰⵔⵏ ⵏ ⵜⵎⵍⵍⴰ ⵎⴰⵛ ⵉⴹⵏⵉⵏ",
"yes": "Yah",
"no": "Uhu",
"accounts": "الحسابات",
"accounts-allowEmailChange": "السماح بتغيير البريد الإلكتروني",
"accounts-allowEmailChange": "ⴰⵊⵊ ⴰⵙⵏⴼⵍ ⵏ ⵉⵎⴰⵢⵍ",
"accounts-allowUserNameChange": "ⵙⵏⴼⵍ ⵉⵙⵎ ⵏ ⵓⵏⵙⵙⵎⵔⵙ",
"tableVisibilityMode-allowPrivateOnly": "Visibilité des tableaux: N'autoriser que des tableaux privés",
"tableVisibilityMode": "Visibilité des tableaux",
@@ -1169,12 +1169,12 @@
"active-person": "ⴰⵎⴷⴰⵏ ⵢⴻⵔⵎⴷⴻⵏ",
"card-received": "Reçue",
"card-received-on": "Reçue le",
"card-end": "Fin",
"card-end": "ⵜⵉⴳⵉⵔⴰ",
"card-end-on": "Se termine le",
"editCardReceivedDatePopup-title": "Modifier la date de réception",
"editCardEndDatePopup-title": "Modifier la date de fin",
"setCardColorPopup-title": "حدد اللون",
"setSelectionColorPopup-title": "Définir la couleur de sélection",
"setSelectionColorPopup-title": "ⵙⵜⵉ ⴰⴽⵍⵓ ⵏ ⵓⵙⵜⵉ",
"setCardActionsColorPopup-title": "اختر لوناً",
"setSwimlaneColorPopup-title": "اختر لوناً",
"setListColorPopup-title": "اختر لوناً",
@@ -1229,22 +1229,22 @@
"activity-delete-attach-card": "a supprimé une pièce jointe",
"activity-set-customfield": "a défini le champ personnalisé '%s' à '%s' dans %s",
"activity-unset-customfield": "a effacé le champ personnalisé '%s' dans %s",
"r-rule": "Règle",
"r-rule": "ⴰⵍⵓⴳⵏ",
"r-add-trigger": "Ajouter un déclencheur",
"r-add-action": "Ajouter une action",
"r-board-rules": "Règles du tableau",
"r-add-rule": "Ajouter une règle",
"r-view-rule": "Voir la règle",
"r-delete-rule": "Supprimer la règle",
"r-new-rule-name": "Titre de la nouvelle règle",
"r-rule-title-required": "ⵎⴰⵕⵕⴰ ⵙⴽⵛⵎ ⴰⵣⵡⵍ ⵏ ⵜⴰⵏⵏⴰⵢⵜ",
"r-no-rules": "Pas de règles",
"r-board-rules": "ⵉⵍⵓⴳⵏⵏ ⵏ ⵜⴼⵍⵡⵉⵜ",
"r-add-rule": "ⵔⵏⵓ ⴰⵍⵓⴳⵏ",
"r-view-rule": "ⵙⴽⵏ ⴰⵍⵓⴳⵏ",
"r-delete-rule": "ⴽⴽⵙ ⴰⵍⵓⴳⵏ",
"r-new-rule-name": "ⴰⵣⵡⵍ ⵏ ⵓⵍⵓⴳⵏ ⴰⵎⴰⵢⵏⵓ",
"r-rule-title-required": "ⵎⴽ ⵜⵓⴼⵉⴷ, ⵙⴽⵛⵎ ⴰⵣⵡⵍ ⵏ ⵓⵍⵓⴳⵏ",
"r-no-rules": "ⵓⵔ ⵍⵍⵉⵏ ⵉⵍⵓⴳⵏⵏ",
"r-import-export": "ⴽⵜⴻⵔ / ⵙⵉⴼⴻⴹ",
"r-select-all": "ⴼⵔⴻⵏ ⴽⵓⵍⵍⴻⵛ",
"r-unselect-all": "ⴽⴽⴻⵙ ⴰⴼⵔⴰⵏ ⵖⴻⴼ ⴽⵓⵍⵍⴻⵛ",
"r-delete-selected": "ⵙⴼⴻⴹ ⴰⵢⴻⵏ ⵢⴻⵜⵜⵡⴰⴼⴻⵔⵏⴻⵏ",
"r-export-selected": "ⵙⵉⴼⴻⴹ ⴰⵢⴻⵏ ⵢⴻⵜⵜⵡⴰⴼⴻⵔⵏⴻⵏ",
"r-edit-rule": "ⵥⵔⴻⴳ ⴰⵍⵓⴳⴰⵏ",
"r-edit-rule": "ⵙⵏⴼⵍ ⴰⵍⵓⴳⵏ",
"r-edit-rule-trigger-action": "ⵥⵔⴻⴳ ⴰⵍⵓⴳⴰⵏ (Déclencheur/ⵜⵉⴳⴰⵡⵜ)",
"r-rule-enabled": "ⵢⴻⵔⴻⵎⴷ",
"r-rule-disabled": "ⵉⵜⵜⵡⴰⵙⴽⵜⵢ",
@@ -1374,10 +1374,10 @@
"r-card": "carte",
"r-add": "ⵔⵏⵓ",
"r-remove": "ⵙⵉⵜⵜⵢ",
"r-label": "étiquette",
"r-label": "ⴰⵔⵛⵓⵎ",
"r-member": "عضو",
"r-add-actinguser-member": "ⵔⵏⵓ ⴰⵎⵙⵎⴰⴳⴰⵍ ⵉⵜⵜⵓⵙⴽⴰⵔⵏ ⴰⵏⵏⴰⵡ ⴰ ⵎⴰⵎⴽ ⴰⵎⴰⵣⴰⵏ",
"r-remove-all": "Supprimer tous les membres de la carte",
"r-remove-all": "ⴽⴽⵙ ⵉⴳⵎⴰⵎⵏ ⴰⴽⴽⵯ ⵙⴳ ⵜⴽⴰⵕⴹⴰ",
"r-remove-all-labels": "Kkes akk tibzimin seg tkarḍa",
"r-set-color": "Définir la couleur à",
"r-checklist": "check-list",
@@ -1394,10 +1394,10 @@
"r-subject": "sujet",
"r-email-vars-hint": "ⵉⵙⵎⵍⵍ ⵉⵍⴰⵏ: {card}, {cardLink}, {list}, {board}, {member}",
"r-rule-details": "Détails de la règle",
"r-d-move-to-top-gen": "Déplacer la carte en haut de sa liste",
"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-move-to-top-gen": "ⵙⵎⵓⵜⵜⵉ ⵜⴰⴽⴰⵕⴹⴰ ⴳ ⵓⴷⵖⴰⵔ ⴰⵎⵣⵡⴰⵔⵓ ⵏ ⵜⵍⴳⴰⵎⵜ ⵏⵏⵙ",
"r-d-move-to-top-spec": "ⵙⵎⵓⵜⵜⵉ ⵜⴰⴽⴰⵕⴹⴰ ⴳ ⵓⴷⵖⴰⵔ ⴰⵎⵣⵡⴰⵔⵓ ⵏ ⵜⵍⴳⴰⵎⵜ",
"r-d-move-to-bottom-gen": "ⵙⵎⵓⵜⵜⵉ ⵜⴰⴽⴰⵕⴹⴰ ⴳ ⵓⴷⵖⴰⵔ ⴰⵎⴳⴳⴰⵔⵓ ⵏ ⵜⵍⴳⴰⵎⵜ ⵏⵏⵙ",
"r-d-move-to-bottom-spec": "ⵙⵎⵓⵜⵜⵉ ⵜⴰⴽⴰⵕⴹⴰ ⴳ ⵓⴷⵖⴰⵔ ⴰⵎⴳⴳⴰⵔⵓ ⵏ ⵜⵍⴳⴰⵎⵜ",
"r-d-send-email": "Envoyer un email",
"r-d-send-email-to": "à",
"r-d-send-email-subject": "sujet",
@@ -1411,7 +1411,7 @@
"r-in-swimlane": "Dans le couloir",
"r-d-add-member": "Ajouter un participant",
"r-d-remove-member": "Supprimer un participant",
"r-d-remove-all-member": "Supprimer tous les participants",
"r-d-remove-all-member": "ⴽⴽⵙ ⵉⴳⵎⴰⵎⵏ ⴰⴽⴽⵯ",
"r-d-check-all": "Cocher tous les éléments d'une liste",
"r-d-uncheck-all": "Décocher tous les éléments d'une liste",
"r-d-check-one": "Cocher l'élément",
@@ -1430,7 +1430,7 @@
"r-when-a-card-is-moved": "Quand une carte est déplacée vers une autre liste",
"r-set": "Définir",
"r-update": "تحديث",
"r-datefield": "champ date",
"r-datefield": "ⵉⴳⵔ ⵏ ⵓⵙⴰⴽⵓⴷ",
"r-df-start-at": "بداية",
"r-df-due-at": "échéance",
"r-df-end-at": "نهاية",
@@ -1484,8 +1484,8 @@
"hide-logo": "Cacher le logo",
"card-counter-list": "ⴰⵎⵙⵉⴹⵏ ⵏ ⵜⴽⴰⵕⴹⵉⵡⵉⵏ ⴳ ⵜⵍⴳⴰⵎⵜ",
"board-member-list": "ⵜⴰⵍⴳⴰⵎⵜ ⵏ ⵉⵎⴷⵔⴰⵡⵏ ⵏ ⵜⴼⵍⵡⵉⵜ",
"add-custom-html-after-body-start": "Ajouter le HTML personnalisé après le début du <body>",
"add-custom-html-before-body-end": "Ajouter le HTML personnalisé avant la fin du </body>",
"add-custom-html-after-body-start": "ⵔⵏⵓ HTML ⵉⵥⵍⵉⵏ ⴷⴼⴼⵉⵔ ⵏ ⵜⵓⴷⴷⵎⴰ ⵏ <body>",
"add-custom-html-before-body-end": "ⵔⵏⵓ HTML ⵉⵥⵍⵉⵏ ⴷⴰⵜ ⵏ ⵜⵉⴳⵉⵔⴰ ⵏ </body>",
"error-undefined": "ⵉⵍⵍⴰ ⴽⵔⴰ ⵏ ⵓⵣⴳⴰⵍ",
"error-ldap-login": "Une erreur s'est produite lors de la tentative de connexion",
"display-authentication-method": "Afficher la méthode d'authentification",
@@ -1505,13 +1505,13 @@
"loading": "ⴰⵣⴷⴰⵎ, ⴰⵎⵓⵔ ⵏⵏⴽ ⵔⴰⵊⴰ.",
"previous_as": "كانت آخر مرة",
"act-a-dueAt": "Echéance modifiée à\nQuand: __timeValue__\nOù: __card__\n L'échéance précédente était __timeOldValue__",
"act-a-endAt": "Modification de la date de fin de __timeOldValue__ à __timeValue__",
"act-a-startAt": "Modification de la date de début de __timeOldValue__ à __timeValue__",
"act-a-receivedAt": "Modification de la date de réception de __timeOldValue__ à __timeValue__",
"a-dueAt": "Echéance modifiée à",
"a-endAt": "Date de fin modifiée à",
"a-startAt": "Date de début modifiée à",
"a-receivedAt": "Date de réception modifiée à",
"act-a-endAt": "ⵉⵙⵏⴼⵍ ⴰⴽⵓⴷ ⵏ ⵜⵉⴳⵉⵔⴰ ⵖⵔ __timeValue__ ⵙⴳ (__timeOldValue__)",
"act-a-startAt": "ⵉⵙⵏⴼⵍ ⴰⴽⵓⴷ ⵏ ⵜⵓⴷⴷⵎⴰ ⵖⵔ __timeValue__ ⵙⴳ (__timeOldValue__)",
"act-a-receivedAt": "ⵉⵙⵏⴼⵍ ⴰⴽⵓⴷ ⵏ ⵜⵔⵎⵙⵜ ⵖⵔ __timeValue__ ⵙⴳ (__timeOldValue__)",
"a-dueAt": "ⵉⵙⵏⴼⵍ ⴰⴽⵓⴷ ⴰⵎⴳⴳⴰⵔⵓ ⵖⵔ",
"a-endAt": "ⵉⵙⵏⴼⵍ ⴰⴽⵓⴷ ⵏ ⵜⵉⴳⵉⵔⴰ ⵖⵔ",
"a-startAt": "ⵉⵙⵏⴼⵍ ⴰⴽⵓⴷ ⵏ ⵜⵓⴷⴷⵎⴰ ⵖⵔ",
"a-receivedAt": "ⵉⵙⵏⴼⵍ ⴰⴽⵓⴷ ⵏ ⵜⵔⵎⵙⵜ ⵖⵔ",
"above-selected-card": "Au-dessus de la carte sélectionnée",
"above-selected-swimlane": "Au-dessus du couloir sélectionné",
"below-selected-card": "En dessous de la carte sélectionnée",
@@ -1550,7 +1550,7 @@
"no-assignee": "Pas de personne assignée",
"no-label": "لا يوجد ملصق",
"cardAssigneesPopup-title": "Personne assignée",
"addmore-detail": "Ajouter une description plus détaillée",
"addmore-detail": "ⵔⵏⵓ ⴰⵙⴳⵣⵍ ⵙ ⵓⴳⴳⴰⵔ ⵏ ⵉⴼⵔⵓⵔⵉⵜⵏ",
"show-on-card": "Afficher sur la carte",
"show-on-minicard": "ⵙⴽⵏ ⵖⴼ ⵜⴽⴰⵕⴹⴰ ⵜⴰⵎⵥⵢⴰⵏⵜ",
"default-on-public-board": "ⴰⵎⵣⵡⴰⵔⵓ ⵅⴼ ⵜⴼⵍⵡⵉⵜ ⵜⴰⴳⴷⵓⴷⴰⵏⵜ",
@@ -1569,9 +1569,9 @@
"notification-settings-tray": "Adaf n yilɣa",
"help": "ⵜⵉⵡⵉⵙⵉ",
"view-all": "Voir tout",
"filter-by-unread": "Filtrer par non lu",
"mark-all-as-read": "Marquer comme lus",
"mark-all-as-unread": "Tout marquer comme non lu",
"filter-by-unread": "ⵣⵉⵣⴷⵉⴳ: ⵓⵔ ⵉⵜⵜⵡⴰⵖⵔⵉⵏ",
"mark-all-as-read": "ⵕⵛⵎ ⴰⴽⴽⵯ: ⵉⵜⵜⵡⴰⵖⵔⵉⵏ",
"mark-all-as-unread": "ⵕⵛⵎ ⴰⴽⴽⵯ: ⵓⵔ ⵉⵜⵜⵡⴰⵖⵔⵉⵏ",
"remove-all-read": "Supprimer les lus",
"allow-rename": "Autoriser le renommage",
"allowRenamePopup-title": "Autoriser le renommage",
@@ -1591,7 +1591,7 @@
"roles-status-sees-all": "Akk",
"roles-status-sees-assigned": "Ala wid yettwafernen",
"roles-status-empty": "Ulac tiwuriwin n tfelwit.",
"start-day-of-week": "Définir le jour de début de semaine",
"start-day-of-week": "ⵙⵜⵉ ⴰⵙⵙ ⴰⵎⵣⵡⴰⵔⵓ ⴳ ⵉⵎⴰⵍⴰⵙⵙ",
"monday": "Lundi",
"tuesday": "الثلاثاء",
"wednesday": "Mercredi",
@@ -1664,7 +1664,7 @@
"dueCardsViewChange-title": "Vue des Cartes Échues",
"dueCardsViewChangePopup-title": "Vue des Cartes Échues",
"dueCardsViewChange-choice-me": "انا",
"dueCardsViewChange-choice-all": "كل المستخدمين",
"dueCardsViewChange-choice-all": "ⵉⵏⵙⵙⵎⵔⵙⵏ ⴰⴽⴽⵯ",
"dueCardsViewChange-choice-all-description": "Visualise toutes les cartes incomplètes avec une date *échue* pour lesquelles l'utilisateur possède les droits",
"globalSearchViewChange-title": "ⵜⵉⵎⴻⵥⵔⵉⵜ ⵏ ⵓⵏⴰⴷⵉ ⴰⵎⴰⵜⵓ",
"globalSearchViewChangePopup-title": "ⵜⵉⵎⴻⵥⵔⵉⵜ ⵏ ⵓⵏⴰⴷⵉ ⴰⵎⴰⵜⵓ",
@@ -1742,10 +1742,10 @@
"predicate-private": "privé",
"predicate-selector": "sélecteur",
"predicate-projection": "askan",
"operator-unknown-error": "'%s' n'est pas un opérateur",
"operator-number-expected": "L'opérateur __operator__ n'attend pas '__value__' mais un nombre",
"operator-sort-invalid": "'%s' n'est pas valide pour le tri",
"operator-status-invalid": "'%s' n'est pas un statut valide",
"operator-unknown-error": "%s ⵓⵔ ⵉⴳⵉ ⴰⵎⴰⵀⴰⵍ",
"operator-number-expected": "ⵉⵇⵇⴰⵏ ⴷ ⴰⵎⴹⴰⵏ ⵉ ⵓⵎⴰⵀⴰⵍ __operator__, ⵉⵔⵎⵙ '__value__'",
"operator-sort-invalid": "ⴰⴼⵔⴰⵏ ⵏ '%s' ⵓⵔ ⵉⵙⵖⵣⵏ.",
"operator-status-invalid": "ⴰⴷⴷⴰⴷ ⵏ '%s' ⵓⵔ ⵉⵙⵖⵣⵏ.",
"operator-has-invalid": "%s n'est pas un test valide d'existence",
"operator-limit-invalid": "%s n'est pas une limite valide. La limite doit être un entier positif.",
"operator-debug-invalid": "%s n'est pas un prédicat de debug valide",
@@ -1755,30 +1755,30 @@
"globalSearch-instructions-heading": "Instructions de recherche",
"globalSearch-instructions-description": "Les recherches peuvent inclure des opérateurs pour affiner le résultat. Les opérateurs sont précisés en écrivant l'opérateur suivi d'une valeur séparé par un deux-point. Par exemple, une spécification comme `liste:Bloqué` limiterait le résultat aux cartes qui contiennent une liste appelée *Bloqué*. Si la valeur contient des espaces ou des caractères spéciaux, elle doit être entourée d'apostrophes (par ex. `__operator_list__:\"À valider\"`).",
"globalSearch-instructions-operators": "Opérateurs disponibles :",
"globalSearch-instructions-operator-board": "`__operator_board__:<titre>` - cartes dont le tableau correspond à *<titre>*",
"globalSearch-instructions-operator-list": "`__operator_list__:<titre>` - cartes dont les listes correspondent à *<titre>*",
"globalSearch-instructions-operator-board": "`__operator_board__:<ⴰⵣⵡⵍ>` - ⵜⵉⴽⴰⵕⴹⵉⵡⵉⵏ ⴳ ⵜⴼⵍⵡⵉⵏ ⵉⵎⵙⴰⵙⴰⵏ ⴷ *<ⴰⵣⵡⵍ>* ⵉⵥⵍⵉⵏ",
"globalSearch-instructions-operator-list": "`__operator_list__:<ⴰⵣⵡⵍ>` - ⵜⵉⴽⴰⵕⴹⵉⵡⵉⵏ ⴳ ⵜⵍⴳⴰⵎⵉⵏ ⵉⵎⵙⴰⵙⴰⵏ ⴷ *<ⴰⵣⵡⵍ>* ⵉⵥⵍⵉⵏ",
"globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<titre>` - cartes dans les couloirs correspondant au *<titre>* spécifié",
"globalSearch-instructions-operator-comment": "`__operator_comment__:<texte>` - cartes dont le commentaire contient *<texte>*.",
"globalSearch-instructions-operator-label": "`__operator_label__:<couleur>` `__operator_label__:<nom>` - cartes qui ont une étiquette correspondant à *<couleur>* ou à *<nom>*.",
"globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<nom|couleur>` - raccourci pour `__operator_label__:<couleur>` ou `__operator_label__:<nom>`",
"globalSearch-instructions-operator-comment": "`__operator_comment__:<ⴰⴹⵕⵉⵙ>` - ⵜⵉⴽⴰⵕⴹⵉⵡⵉⵏ ⵙ ⵓⵖⴼⴰⵡⴰⵍ ⵢⵓⵎⴰⵏ *<ⴰⴹⵕⵉⵙ>*.",
"globalSearch-instructions-operator-label": "`__operator_label__:<ⴰⴽⵍⵓ>` `__operator_label__:<ⵉⵙⵎ>` - ⵜⵉⴽⴰⵕⴹⵉⵡⵉⵏ ⵙ ⵓⵔⵛⵓⵎ ⵉⵎⵙⴰⵙⴰⵏ ⴷ *<ⴰⴽⵍⵓ>* ⵏⵖ *<ⵉⵙⵎ>*.",
"globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<ⵉⵙⵎ|ⴰⴽⵍⵓ>` - ⴰⵙⴳⵣⵍ ⵏ `__operator_label__:<ⴰⴽⵍⵓ>` ⵏⵖ `__operator_label__:<ⵉⵙⵎ>`",
"globalSearch-instructions-operator-user": "`__operator_user__:<nom>` - cartes où l'utilisateur <nom> est *assigné* ou est un *participant*.",
"globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - anegzum n `user:<username>`",
"globalSearch-instructions-operator-member": "`__operator_member__:<nom>` - cartes pour lesquelles l'utilisateur *<nom>* est *participant*",
"globalSearch-instructions-operator-member": "`__operator_member__:<ⵉⵙⵎ ⵏ ⵓⵏⵙⵙⵎⵔⵙ>` - ⵜⵉⴽⴰⵕⴹⵉⵡⵉⵏ ⵏⵏⴰ ⴳ ⵉⴳⴰ *<ⵉⵙⵎ ⵏ ⵓⵏⵙⵙⵎⵔⵙ>* *ⴰⴳⵎⴰⵎ*",
"globalSearch-instructions-operator-assignee": "`__operator_assignee__:<nom>` - cartes *assignées* à l'utilisateur *<nom>*",
"globalSearch-instructions-operator-creator": "`__operator_creator__:<utilisateur>` - cartes dont le créateur est *<utilisateur>*",
"globalSearch-instructions-operator-creator": "`__operator_creator__:<ⵉⵙⵎ ⵏ ⵓⵏⵙⵙⵎⵔⵙ>` - ⵜⵉⴽⴰⵕⴹⵉⵡⵉⵏ ⵏⵏⴰ ⵉⴳⴰ *<ⵉⵙⵎ ⵏ ⵓⵏⵙⵙⵎⵔⵙ>* ⴰⵎⵙⵏⴼⵍⵓⵍ ⵏⵏⵙⵏⵜ",
"globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cartes appartenant à un tableau assigné à l'organisation *<name>*",
"globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cartes appartenant à un tableau assigné à l'équipe *<name>*",
"globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cartes qui arrive à échéance dans moins de *<n>* jours à partir d'aujourd'hui.\n`__operator_due__:__predicate_overdue__` liste toutes les cartes ayant passé la date d'échéance.",
"globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cartes qui ont été créées il y a *<n>* jours ou moins",
"globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cartes qui ont été modifiées il y a *<n>* jours ou moins",
"globalSearch-instructions-operator-status": "`__operator_status__:<état>` - où *<état>* est l'un des choix suivants :",
"globalSearch-instructions-operator-status": "`__operator_status__:<ⴰⴷⴷⴰⴷ>` - ⵉⴳⴰ *<ⴰⴷⴷⴰⴷ>* ⵢⴰⵏ ⵙⴳ ⵉⴷⴷⴰⴷⵏ ⴰⴷ:",
"globalSearch-instructions-status-archived": "`__predicate_archived__` - cartes qui ont été archivées.",
"globalSearch-instructions-status-all": "`__predicate_all__` - toutes les cartes : archivées et non archivées.",
"globalSearch-instructions-status-ended": "`__predicate_ended__` - cartes ayant une date de fin.",
"globalSearch-instructions-status-public": "`__predicate_public__` - uniquement les cartes qui sont dans un tableau public.",
"globalSearch-instructions-status-private": "`__predicate_private__` - uniquement les cartes qui sont dans un tableau privé.",
"globalSearch-instructions-status-public": "`__predicate_public__` - ⵜⵉⴽⴰⵕⴹⵉⵡⵉⵏ ⴳ ⵜⴼⵍⵡⵉⵏ ⵜⵉⴳⴷⵓⴷⴰⵏⵉⵏ ⵖⴰⵙ",
"globalSearch-instructions-status-private": "`__predicate_private__` - ⵜⵉⴽⴰⵕⴹⵉⵡⵉⵏ ⴳ ⵜⴼⵍⵡⵉⵏ ⵜⵓⵙⵍⵉⴳⵉⵏ ⵖⴰⵙ",
"globalSearch-instructions-operator-has": "`__operator_has__:<field>` - *<field>* iga yan seg `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` neɣ `__predicate_member__`. Ma tella `-` dat *<field>*, ad inadi ɣef war azal (amedya `has:-due` i tkarḍiwin war azemz).",
"globalSearch-instructions-operator-sort": "`__operator_sort__:<tri>` - où *<tri>* est une méthode parmi `__predicate_due__`, `__predicate_created__` ou `__predicate_modified__`. Pour un tri descendant, préfixez la méthode par `-`.",
"globalSearch-instructions-operator-sort": "`__operator_sort__:<ⵉⵙⵎ ⵏ ⵓⴼⵔⴰⵏ>` - ⵉⴳⴰ *<ⵉⵙⵎ ⵏ ⵓⴼⵔⴰⵏ>* ⵢⴰⵏ ⵙⴳ `__predicate_due__`, `__predicate_created__` ⵏⵖ `__predicate_modified__`. ⵉ ⵓⴼⵔⴰⵏ ⵜⴰⴽⵙⴰⵔⵜ, ⵔⵏⵓ `-` ⴷⴰⵜ ⵏ ⵉⵙⵎ ⵏ ⵓⴼⵔⴰⵏ.",
"globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - où *<n>* est un entier positif exprimant le nombre de cartes à afficher par page.",
"globalSearch-instructions-notes-1": "Il est possible d'utiliser plusieurs opérateurs.",
"globalSearch-instructions-notes-2": "Les opérateurs similaires deviennent *optionnels*. Les cartes correspondant à n'importe quelle condition sont retournées.\n`__operator_list__:Disponible __operator_list__:Bloquée` retournera les cartes contenues dans la liste *Disponible* ou dans la liste *Bloquée*.",
@@ -1786,9 +1786,9 @@
"globalSearch-instructions-notes-3-2": "Les durées en jours peuvent être précisées soit par un entier positif ou négatif soit en utilisant `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` ou `__predicate_year__` pour la période courante.",
"globalSearch-instructions-notes-4": "Les recherches textuelles ne sont pas sensibles à la casse.",
"globalSearch-instructions-notes-5": "Par défaut, les cartes archivées ne sont pas recherchées.",
"link-to-search": "Lien vers cette recherche",
"link-to-search": "ⴰⵙⵖⵏ ⵖⵔ ⵓⵔⵣⵣⵓ ⴰⴷ",
"excel-font": "Arial",
"number": "رقم",
"number": "ⴰⵎⴹⴰⵏ",
"label-colors": "Couleurs d'étiquette",
"label-names": "Noms d'étiquette",
"archived-at": "archivée le",
@@ -1853,8 +1853,8 @@
"server-error": "خطأ بالخادم",
"server-error-troubleshooting": "Merci de soumettre l'erreur générée par le serveur. Pour une installation snap, lancer `sudo snap logs wekan.wekan`. Pour une installation docker, lancer `sudo docker logs wekan-app`",
"title-alphabetically": "Titre (Alphabétiquement)",
"created-at-newest-first": "Date de création (Plus récentes en premier)",
"created-at-oldest-first": "Date de création (Plus anciennes en premier)",
"created-at-newest-first": "ⴰⵙⴰⴽⵓⴷ ⵏ ⵓⵙⵏⴼⵍⵓⵍ (ⴰⵎⴰⵢⵏⵓ ⴰⵎⵣⵡⴰⵔⵓ)",
"created-at-oldest-first": "ⴰⵙⴰⴽⵓⴷ ⵏ ⵓⵙⵏⴼⵍⵓⵍ (ⴰⵇⴱⵓⵔ ⴰⵎⵣⵡⴰⵔⵓ)",
"links-heading": "روابط",
"board-activities": "ⵜⵉⵎⵙⴽⵉⵔⵉⵏ ⵏ ⵜⴼⵍⵡⵉⵜ",
"now-activities-of-all-boards-are-hidden": "الآن تم إخفاء جميع أنشطة جميع المجالس",
@@ -1863,8 +1863,8 @@
"custom-field-stringtemplate": "Modèle de chaîne",
"custom-field-stringtemplate-format": "Format (utiliser %{value} pour marquer un emplacement)",
"custom-field-stringtemplate-separator": "Séparateur (utiliser &#32; ou &nbsp; pour un espace)",
"custom-field-stringtemplate-item-placeholder": "Appuyez sur Entrée pour ajouter plus d'éléments",
"creator": "المنشئ",
"custom-field-stringtemplate-item-placeholder": "ⵔⵏⵓ ⵉⴼⵔⴷⵉⵙⵏ ⵢⴰⴹⵏⵉⵏ ⵙ Enter",
"creator": "ⴰⵎⵙⵏⴼⵍⵓⵍ",
"creator-on-minicard": "الخالق على بطاقة صغيرة",
"filesReportTitle": "تقارير الملفات",
"filter-invisible-filenames": "ⴰⵍⴰ ⵉⵙⵎⴰⵡⵏ ⵏ ⵉⴼⴰⵢⵍⵓⵜⵏ ⵙ ⵉⵙⴽⴽⵉⵍⵏ ⵓⵔ ⵉⵜⵜⵡⴰⵥⵔⵏ",
@@ -1927,7 +1927,7 @@
"minimize-card": "Minimiser la carte",
"delete-org-warning-message": "Impossible de supprimer cette organisation, au moins un utilisateur lui appartient",
"delete-team-warning-message": "Impossible de supprimer cette équipe, au moins un utilisateur lui appartient",
"subject": "موضوع",
"subject": "ⵉⵎⵔⵙⵉ",
"details": "تفاصيل",
"carbon-copy": "Copie Carbone (Cc:)",
"ticket": "ⵜⵉⴱⵕⴰⵜ",
@@ -1992,9 +1992,9 @@
"copyChecklistPopup-title": "Copier la checklist",
"copyChecklistFromTemplate": "Copier la checklist - نموذج",
"copyChecklistFromTemplatePopup-title": "Copier la checklist - نموذج",
"edit-checklist-items-as-text": "Ẓreg amzwaru n uḍris",
"edit-checklist-items-as-text": "ⵙⵏⴼⵍ ⵙ ⵓⴹⵕⵉⵙ",
"editChecklistItemsAsTextPopup-title": "Ẓreg iferdisen n tebdart n usenqed amzwaru n uḍris",
"card-show-lists": "Afficher les listes sur la carte",
"card-show-lists": "ⵙⴽⵏ ⵜⵉⵍⴳⴰⵎⵉⵏ ⵖⴼ ⵜⴽⴰⵕⴹⴰ",
"subtaskActionsPopup-title": "Action de la sous-tâche",
"attachmentActionsPopup-title": "Actions sur les pièces jointes",
"attachment-move-storage-fs": "Déplacer la pièce jointe vers le système de fichier",
@@ -2093,10 +2093,10 @@
"editTranslationPopup-title": "تحرير سلسلة الترجمة المخصصة",
"settingsTranslationPopup-title": "حذف سلسلة الترجمة المخصصة هذه؟",
"translation": "ترجمة",
"text": "نص",
"text": "ⴰⴹⵕⵉⵙ",
"translation-text": "نص الترجمة",
"show-subtasks-field": "إظهار حقل المهام الفرعية",
"show-week-of-year": "عرض أسبوع السنة (ISO 8601)",
"show-week-of-year": "ⵙⴽⵏ ⵉⵎⴰⵍⴰⵙⵙ ⵏ ⵓⵙⴳⴳⵯⴰⵙ (ISO 8601)",
"convert-to-markdown": "تحويل إلى تخفيض السعر",
"import-board-zip": "أضف ملف .zip الذي يحتوي على ملفات JSON الخاصة باللوحة، ودلائل فرعية لأسماء اللوحة مع المرفقات",
"collapse": "ⵙⵎⵓⵏ",
@@ -2151,7 +2151,7 @@
"accounts-lockout-show-locked-users": "ⵙⴽⵏ ⵖⴰⵙ ⵉⵏⵙⵙⵎⵔⵙⵏ ⵜⵜⵓⴳⴷⵍⵏⵉⵏ",
"accounts-lockout-user-locked": "ⵉⵜⵜⵓⴳⴷⴰⵍ ⵓⵏⵙⵙⵎⵔⵙ",
"accounts-lockout-click-to-unlock": "Cliquer pour déverrouiller cet utilisateur",
"accounts-lockout-status": "Statut",
"accounts-lockout-status": "ⴰⴷⴷⴰⴷ",
"admin-people-last-active": "Yermed asrag",
"admin-people-currently-online": "Online tura",
"admin-people-filter-show": "ⵙⴽⵏ:",
@@ -2196,10 +2196,10 @@
"cron-migration-warnings": "Avertissements de migration",
"cron-no-errors": "Aucune erreur à afficher",
"cron-error-severity": "Gravité",
"cron-error-time": "الوقت",
"cron-error-time": "ⴰⴽⵓⴷ",
"cron-error-message": "Message d'erreur",
"cron-error-details": "تفاصيل",
"cron-clear-errors": "Effacer toutes les erreurs",
"cron-clear-errors": "ⵚⵚⴼⴹ ⴰⴽⴽⵯ ⵉⵣⴳⴰⵍⵏ",
"cron-retry-failed": "Réessayer les migrations échouées",
"cron-resume-paused": "Reprendre les migrations en pause",
"cron-errors-cleared": "Toutes les erreurs ont été effacées avec succès",
@@ -2352,7 +2352,7 @@
"s3-disabled": "ⴰⵃⵔⴰⵣ S3/MinIO ⵢⴻⵏⵙⴰ",
"all-migrations": "Toutes les migrations",
"select-migration": "Sélectionner une migration",
"start": "بداية",
"start": "ⵜⵓⴷⴷⵎⴰ",
"pause": "ⵙⴱⴻⴷⴷ",
"stop": "Arrêter",
"migration-starting": "Démarrage des migrations...",
@@ -2452,7 +2452,7 @@
"migration-progress-title": "Migration du tableau en cours",
"migration-progress-overall": "ⴰⵙⴼⴰⵔⵉ ⴰⵎⴰⵜⵓ",
"migration-progress-current-step": "Étape courante",
"migration-progress-status": "Statut",
"migration-progress-status": "ⴰⴷⴷⴰⴷ",
"migration-progress-details": "تفاصيل",
"migration-progress-note": "Veuillez patienter pendant la migration de votre tableau vers la dernière structure...",
"steps": "Étapes",
@@ -2490,7 +2490,7 @@
"database-migrations": "Migrations base de données",
"days-old": "Jours d'ancienneté",
"duration": "Durée",
"errors": "Erreurs",
"errors": "ⵉⵣⴳⴰⵍⵏ",
"estimated-time-remaining": "Temps restant estimé",
"every-1-day": "Tous les jours",
"every-1-hour": "Toutes les heures",
@@ -2573,7 +2573,7 @@
"current-step": "Étape courante",
"otp": "Code OTP",
"create-account": "ⵙⵏⵓⵍⴼⵓ ⴰⵎⵉⴹⴰⵏ",
"already-account": "Vous avez déjà un compte ? Se connecter",
"already-account": "ⵉⵙ ⵖⵓⵔⴽ ⵉⵍⵍⴰ ⵓⵎⵉⴹⴰⵏ ⵢⴰⴷ? ⴽⵛⵎ",
"available-repositories": "Dépôts disponibles",
"repositories": "Dépôts",
"repository": "Dépôt",
@@ -2592,7 +2592,7 @@
"password-mismatch": "ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵏⵏⴰ ⵜⵙⴽⵛⵎⴷ ⵓⵔ ⵜⵎⵙⴰⵙⴰ",
"username-too-short": "Le nom d'utilisateur doit comporter au moins 3 caractères",
"user-exists": "ⴰⵏⵙⵙⵎⵔⵙ ⵉⵍⵍⴰ ⵢⴰⴷ",
"account-created": "Compte créé ! Vous pouvez maintenant vous connecter.",
"account-created": "ⵉⵜⵜⵓⵙⵏⵓⵍⴼⴰ ⵓⵎⵉⴹⴰⵏ! ⵜⵥⴹⴰⵕⴷ ⴰ ⵜⴽⵛⵎⴷ ⴷⵖⵉⴽⴽ.",
"account-creation-failed": "ⵓⵔ ⵢⴰⵍⵍⴼⵓⵙ ⵓⵙⴽⴽⵉⵔ ⵏ ⵓⵎⵉⴹⴰⵏ",
"login": "ⴽⵛⵎ",
"login-allow": "ⴰⴽⵛⵛⵓⵎ: ⵙⵔⵃ",
@@ -2605,7 +2605,7 @@
"protocol": "Protocole",
"summary": "ⴰⴳⵣⵓⵎ",
"problems-summary-help": "ⵥⵕⵏⵜ ⵉⴳⵣⵓⵎⵏ ⵏ ⵉⵎⵓⴽⵔⵉⵙⵏ ⵜⵥⵕⵎ, ⴷⴼⴼⵉⵔ ⴰⵢⴰ ⵜⴽⵍⵉⴽⵎ ⵅⴼ ⵙⵏⵉⵎⵎⵔ ⴰⴷ ⵜⵙⵎⴰⵢⵏⵓⵎ ⴰⵎⴹⴰⵏ ⵏ ⵉⵎⵓⴽⵔⵉⵙⵏ ⵉⵎⴰⵢⵏⵓⵜⵏ.",
"problems-status-title": "Statut",
"problems-status-title": "ⴰⴷⴷⴰⴷ",
"problems-in-progress-help": "ⵉⵙⵎⵓⵜⵜⵉⵢⵏ ⵏⵖ ⵉⵙⴳⴳⵯⴷⵏ ⴰⴷ ⵜⵜⵡⴰⵙⴽⴰⵔⵏ ⴰⵙⵙⴰ. ⴰⴽⵛⵛⵓⵎ ⵉⵣⴷⵉ ⴰⴷ ⵢⵉⵍⵉ ⴰⵎⴰⵣⵣⴰⵍ, ⵏⵖ ⴰⴷ ⵉⵙⵙⴽⵏ «ⵉⵇⵇⴰⵏ ⴰⴷ ⵜⴽⵛⵎⴷ» ⵏⵖ «ⴰⵙⵙⴰⵍⵉ, ⵜⵜⵔⴰⵊⴰ», ⴰⵔ ⴰⴷ ⴽⵎⵎⵍⵏ ⵜⴳⵣ CPU.",
"problems-none-in-progress": "ⵓⵍⴰ ⵢⴰⵏ ⵓⵙⵎⵓⵜⵜⵉ ⵏⵖ ⵓⵙⴳⴳⵯⴷ ⵉⵜⵜⵡⴰⵙⴽⴰⵔⵏ.",
"no-new-problems": "ⵓⵍⴰ ⵎⴰ ⵉⵍⵍⴰⵏ ⴷ ⴰⵎⴰⵢⵏⵓ.",
+2 -2
View File
@@ -1,12 +1,12 @@
{
"name": "wekan",
"version": "v11.74.0",
"version": "v11.76.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "wekan",
"version": "v11.74.0",
"version": "v11.76.0",
"hasInstallScript": true,
"license": "MIT",
"dependencies": {
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "wekan",
"version": "v11.74.0",
"version": "v11.76.0",
"description": "Open-Source kanban",
"private": true,
"repository": {
+3 -3
View File
@@ -3,7 +3,7 @@
<head>
<meta charset="utf8" />
<title>WeKan REST API v11.74</title>
<title>WeKan REST API v11.76</title>
<!-- needed for adaptive design -->
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
@@ -427,7 +427,7 @@ data-styled.g139[id="sc-iIvZUO"]{content:"kAmnlO,"}/*!sc*/
55.627 l 55.6165,55.627 -231.245496,231.24803 c -127.185,127.1864
-231.5279,231.248 -231.873,231.248 -0.3451,0 -104.688,
-104.0616 -231.873,-231.248 z
" fill="currentColor"></path></g></svg></div></div><div class="sc-jtyQFi ldXCvc api-content"><div class="sc-eCQgVK jleRXN"><div class="sc-iCECmn lhRBUS"><div class="sc-hKVpXn kktglN api-info"><h1 class="sc-fuztkK sc-ctiVdb eRMVDe cBgvIi">Wekan REST API<!-- --> <span>(<!-- -->v11.74<!-- -->)</span></h1><p>Download OpenAPI specification<!-- -->:</p><div class="sc-iJSMbW sc-cBEgGa fiNpIH htbHfQ"></div><div data-role="redoc-summary" html="" class="sc-iJSMbW sc-cBEgGa fiNpIH htbHfQ"></div><div data-role="redoc-description" html="&lt;p&gt;The REST API allows you to control and extend Wekan with ease.&lt;/p&gt;
" fill="currentColor"></path></g></svg></div></div><div class="sc-jtyQFi ldXCvc api-content"><div class="sc-eCQgVK jleRXN"><div class="sc-iCECmn lhRBUS"><div class="sc-hKVpXn kktglN api-info"><h1 class="sc-fuztkK sc-ctiVdb eRMVDe cBgvIi">Wekan REST API<!-- --> <span>(<!-- -->v11.76<!-- -->)</span></h1><p>Download OpenAPI specification<!-- -->:</p><div class="sc-iJSMbW sc-cBEgGa fiNpIH htbHfQ"></div><div data-role="redoc-summary" html="" class="sc-iJSMbW sc-cBEgGa fiNpIH htbHfQ"></div><div data-role="redoc-description" html="&lt;p&gt;The REST API allows you to control and extend Wekan with ease.&lt;/p&gt;
&lt;p&gt;If you are an end-user and not a dev or a tester, &lt;a href=&quot;https://github.com/wekan/wekan/issues/new&quot;&gt;create an issue&lt;/a&gt; to request new APIs.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;All API calls in the documentation are made using &lt;code&gt;curl&lt;/code&gt;. However, you are free to use Java / Python / PHP / Golang / Ruby / Swift / Objective-C / Rust / Scala / C# or any other programming languages.&lt;/p&gt;
@@ -2543,7 +2543,7 @@ trigger and action stay as they are); true resumes it</p>
" class="sc-iJSMbW sc-cBEgGa sc-ciCrSJ fiNpIH iHFyeq dDDioG"><p>200 response</p>
</div></button></div></div></div><div class="sc-jSppWd sc-gKkgUA fpMlmc bdQQyo"><div class="sc-fXwuWv fYxpnv"><button class="sc-jWMFtl jzaJhV"><span type="post" class="sc-eEFuoE hOENFc http-verb post">post</span><span class="sc-FpjRO dsIRaZ">/api/boards/{board}/swimlanes/{swimlane}/move</span><svg class="sc-dYjPD bQKUih" style="margin-right:-25px" version="1.1" viewBox="0 0 24 24" x="0" xmlns="http://www.w3.org/2000/svg" y="0" aria-hidden="true"><polygon points="17.3 8.3 12 13.6 6.7 8.3 5.3 9.7 12 16.4 18.7 9.7 "></polygon></svg></button><div aria-hidden="true" class="sc-fmtEmb tUxhh"><div class="sc-ljIcGq bAnPPh"><div html="" class="sc-iJSMbW sc-cBEgGa fiNpIH bWgCZK"></div><div tabindex="0" role="button"><div class="sc-jlJOIR PEJyb"><span></span>/api/boards/{board}/swimlanes/{swimlane}/move</div></div></div></div></div></div></div></div></div><div class="sc-ekVkVN bjzTxL"></div></div></div>
<script>
const __redoc_state = {"menu":{"activeItemIdx":-1},"spec":{"data":{"openapi":"3.0.0","info":{"title":"Wekan REST API","version":"v11.74","description":"The REST API allows you to control and extend Wekan with ease.\n\nIf you are an end-user and not a dev or a tester, [create an issue](https://github.com/wekan/wekan/issues/new) to request new APIs.\n\n> All API calls in the documentation are made using `curl`. However, you are free to use Java / Python / PHP / Golang / Ruby / Swift / Objective-C / Rust / Scala / C# or any other programming languages.\n\n# Production Security Concerns\nWhen calling a production Wekan server, ensure it is running via HTTPS and has a valid SSL Certificate. The login method requires you to post your username and password in plaintext, which is why we highly suggest only calling the REST login api over HTTPS. Also, few things to note:\n\n* Only call via HTTPS\n* Implement a timed authorization token expiration strategy\n* Ensure the calling user only has permissions for what they are calling and no more\n"},"paths":{"/users/login":{"post":{"operationId":"login","summary":"Login with REST API","tags":["Login"],"requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["username","password"],"properties":{"username":{"description":"Your username\n","type":"string"},"password":{"description":"Your password\n","type":"string","format":"password"}}}},"application/x-www-form-urlencoded":{"schema":{"type":"object","required":["username","password"],"properties":{"username":{"description":"Your username\n","type":"string"},"password":{"description":"Your password\n","type":"string","format":"password"}}}}},"description":"Login credentials","required":true},"responses":{"200":{"description":"Successful authentication","content":{"*/*":{"schema":{"type":"object","required":["id","token","tokenExpires"],"properties":{"id":{"type":"string","description":"User ID"},"token":{"type":"string","description":"Authentication token\n"},"tokenExpires":{"type":"string","format":"date-time","description":"Token expiration date\n"}}}}}},"400":{"description":"Error in authentication\n","content":{"*/*":{"schema":{"type":"object","properties":{"error":{"type":"string"},"reason":{"type":"string"}}}}}},"default":{"description":"Error in authentication\n"}}}},"/users/register":{"post":{"operationId":"register","summary":"Register with REST API","description":"Notes:\n - You will need to provide the token for any of the authenticated methods.\n","tags":["Login"],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"type":"object","properties":{"username":{"description":"Your username\n","type":"string"},"password":{"description":"Your password\n","type":"string","format":"password"},"email":{"description":"Your email\n","type":"string"}},"required":["username","password","email"]}}},"required":true},"responses":{"200":{"description":"Successful registration","content":{"*/*":{"schema":{"items":{"properties":{"id":{"type":"string"},"token":{"type":"string"},"tokenExpires":{"type":"string"}}}}}}},"400":{"description":"Error in registration\n","content":{"*/*":{"schema":{"items":{"properties":{"error":{"type":"number"},"reason":{"type":"string"}}}}}}},"default":{"description":"Error in registration\n"}}}},"/api/admin/attachment-settings":{"get":{"operationId":"get_attachment_settings","summary":"Get the attachment storage / upload-block settings (GlobalAdmin)","description":"Only the global admin can call this. Returns the Admin Panel >\n Attachments settings document, including `limitSettings.attachmentsUploadBlocked`\n and `limitSettings.avatarsUploadBlocked` plus the size limits. Cloud-storage\n secret keys (S3 secretAccessKey, Azure accountKey/connectionString, GCS\n credentials) are masked and never returned; a boolean `<field>Set` marker\n shows whether a value exists.\n","tags":["AttachmentStorageSettings","Settings"],"security":[{"UserSecurity":[]}],"responses":{"200":{"description":"200 response","content":{"application/json":{"schema":{"type":"Object"}}}}}},"put":{"operationId":"update_attachment_settings","summary":"Update the attachment storage / upload-block settings (GlobalAdmin)","description":"Only the global admin can call this. The request body is a\n partial settings object (for example\n `{\"limitSettings\": {\"avatarsUploadBlocked\": true}}`). It is applied through\n the same update path as the `updateAttachmentStorageSettings` Meteor method,\n so validation and `$set` semantics are identical: cloud-storage secrets left\n blank are preserved. The masked, updated settings document is returned.\n","tags":["AttachmentStorageSettings","Settings"],"security":[{"UserSecurity":[]}],"responses":{"200":{"description":"200 response","content":{"application/json":{"schema":{"type":"Object"}}}}}}},"/api/admin/domains":{"get":{"operationId":"get_admin_domains","summary":"List email domains with their user counts (GlobalAdmin)","description":"Only the Line truncated
const __redoc_state = {"menu":{"activeItemIdx":-1},"spec":{"data":{"openapi":"3.0.0","info":{"title":"Wekan REST API","version":"v11.76","description":"The REST API allows you to control and extend Wekan with ease.\n\nIf you are an end-user and not a dev or a tester, [create an issue](https://github.com/wekan/wekan/issues/new) to request new APIs.\n\n> All API calls in the documentation are made using `curl`. However, you are free to use Java / Python / PHP / Golang / Ruby / Swift / Objective-C / Rust / Scala / C# or any other programming languages.\n\n# Production Security Concerns\nWhen calling a production Wekan server, ensure it is running via HTTPS and has a valid SSL Certificate. The login method requires you to post your username and password in plaintext, which is why we highly suggest only calling the REST login api over HTTPS. Also, few things to note:\n\n* Only call via HTTPS\n* Implement a timed authorization token expiration strategy\n* Ensure the calling user only has permissions for what they are calling and no more\n"},"paths":{"/users/login":{"post":{"operationId":"login","summary":"Login with REST API","tags":["Login"],"requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["username","password"],"properties":{"username":{"description":"Your username\n","type":"string"},"password":{"description":"Your password\n","type":"string","format":"password"}}}},"application/x-www-form-urlencoded":{"schema":{"type":"object","required":["username","password"],"properties":{"username":{"description":"Your username\n","type":"string"},"password":{"description":"Your password\n","type":"string","format":"password"}}}}},"description":"Login credentials","required":true},"responses":{"200":{"description":"Successful authentication","content":{"*/*":{"schema":{"type":"object","required":["id","token","tokenExpires"],"properties":{"id":{"type":"string","description":"User ID"},"token":{"type":"string","description":"Authentication token\n"},"tokenExpires":{"type":"string","format":"date-time","description":"Token expiration date\n"}}}}}},"400":{"description":"Error in authentication\n","content":{"*/*":{"schema":{"type":"object","properties":{"error":{"type":"string"},"reason":{"type":"string"}}}}}},"default":{"description":"Error in authentication\n"}}}},"/users/register":{"post":{"operationId":"register","summary":"Register with REST API","description":"Notes:\n - You will need to provide the token for any of the authenticated methods.\n","tags":["Login"],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"type":"object","properties":{"username":{"description":"Your username\n","type":"string"},"password":{"description":"Your password\n","type":"string","format":"password"},"email":{"description":"Your email\n","type":"string"}},"required":["username","password","email"]}}},"required":true},"responses":{"200":{"description":"Successful registration","content":{"*/*":{"schema":{"items":{"properties":{"id":{"type":"string"},"token":{"type":"string"},"tokenExpires":{"type":"string"}}}}}}},"400":{"description":"Error in registration\n","content":{"*/*":{"schema":{"items":{"properties":{"error":{"type":"number"},"reason":{"type":"string"}}}}}}},"default":{"description":"Error in registration\n"}}}},"/api/admin/attachment-settings":{"get":{"operationId":"get_attachment_settings","summary":"Get the attachment storage / upload-block settings (GlobalAdmin)","description":"Only the global admin can call this. Returns the Admin Panel >\n Attachments settings document, including `limitSettings.attachmentsUploadBlocked`\n and `limitSettings.avatarsUploadBlocked` plus the size limits. Cloud-storage\n secret keys (S3 secretAccessKey, Azure accountKey/connectionString, GCS\n credentials) are masked and never returned; a boolean `<field>Set` marker\n shows whether a value exists.\n","tags":["AttachmentStorageSettings","Settings"],"security":[{"UserSecurity":[]}],"responses":{"200":{"description":"200 response","content":{"application/json":{"schema":{"type":"Object"}}}}}},"put":{"operationId":"update_attachment_settings","summary":"Update the attachment storage / upload-block settings (GlobalAdmin)","description":"Only the global admin can call this. The request body is a\n partial settings object (for example\n `{\"limitSettings\": {\"avatarsUploadBlocked\": true}}`). It is applied through\n the same update path as the `updateAttachmentStorageSettings` Meteor method,\n so validation and `$set` semantics are identical: cloud-storage secrets left\n blank are preserved. The masked, updated settings document is returned.\n","tags":["AttachmentStorageSettings","Settings"],"security":[{"UserSecurity":[]}],"responses":{"200":{"description":"200 response","content":{"application/json":{"schema":{"type":"Object"}}}}}}},"/api/admin/domains":{"get":{"operationId":"get_admin_domains","summary":"List email domains with their user counts (GlobalAdmin)","description":"Only the Line truncated
var container = document.getElementById('redoc');
Redoc.hydrate(__redoc_state, container);
+1 -1
View File
@@ -1,7 +1,7 @@
swagger: '2.0'
info:
title: Wekan REST API
version: v11.74
version: v11.76
description: |
The REST API allows you to control and extend Wekan with ease.
+18
View File
@@ -0,0 +1,18 @@
#!/bin/bash
# Read-only preflight; safe to run independently of release/publishing commands.
set -e
changelog="${1:-$(cd "$(dirname "$0")/.." && pwd)/CHANGELOG.md}"
if [ ! -f "$changelog" ]; then
echo "Error: changelog not found: $changelog" >&2
exit 1
fi
if ! awk '
/^# / { active = ($0 ~ /^# Upcoming WeKan ® release[[:space:]]*$/) }
active && /^# / { headings++ }
active && /<summary>.*<a[[:space:]][^>]*href="[^"]+"[^>]*>[^<[:space:]]/ { entries++ }
END { exit !(headings == 1 && entries > 0) }
' "$changelog"; then
echo "Error: CHANGELOG.md must contain one '# Upcoming WeKan ® release' section with release entries." >&2
echo "Add Upcoming release notes before running releases/release-all.sh." >&2
exit 1
fi
+18 -60
View File
@@ -24,8 +24,8 @@ if [ -n "${ZSH_VERSION:-}" ]; then exec /bin/bash "$0" "$@"; fi
# amend or squash between writing an entry and releasing it changes the hashes,
# and the links would 404 once pushed. Each is remapped by commit subject.
# 2. Determines PREVIOUS and NEW version automatically: renames the "# Upcoming
# WeKan ® release" heading to the next version, or (if already renamed) uses the
# newest release heading. An explicit "PREVIOUS NEW" pair overrides this.
# WeKan ® release" heading to the next version. Missing or empty Upcoming notes
# stop the script. An explicit "PREVIOUS NEW" pair overrides the versions.
# 3. Commits and pushes pending changes (your CHANGELOG.md edit) to main so the
# workflow can read them.
# 4. Triggers .github/workflows/release-all.yml.
@@ -48,13 +48,16 @@ if [ -n "${ZSH_VERSION:-}" ]; then exec /bin/bash "$0" "$@"; fi
set -e
# Install the tools this trigger needs (Ubuntu apt / macOS brew) if missing.
. "$(cd "$(dirname "$0")" && pwd)/ensure-tools.sh"
ensure_tools git gh
# Resolve repo root from script location so this works regardless of CWD.
# Check release notes before installing tools, changing files or contacting forges.
REPO_DIR="$(cd "$(dirname "$0")/.." && pwd)"
cd "$REPO_DIR"
bash "$REPO_DIR/releases/check-upcoming-release.sh" "$REPO_DIR/CHANGELOG.md"
mkdir -p "$REPO_DIR/.tools/tmp"
export TMPDIR="$REPO_DIR/.tools/tmp"
# Install the tools this trigger needs if missing.
. "$REPO_DIR/releases/ensure-tools.sh"
ensure_tools git gh
# ── Version helpers ─────────────────────────────────────────────────────────
# WeKan versions are NN.MM with a 2-digit minor. Encode NN.MM as the integer
@@ -81,69 +84,24 @@ while IFS= read -r line; do RELEASED+=("$line"); done < <(grep -oE '^# v[0-9]+\.
bash "$(dirname "$0")/fix-changelog-hashes.sh" || true
# ── Determine PREVIOUS (OLD) and NEW version — no version argument needed ────
# Explicit args still win. Otherwise:
# * if there is a "# Upcoming WeKan ® release" section, RENAME it to the next
# version (always +1 minor) dated today; OLD = newest release, NEW = that
# next version.
# * if there is NO Upcoming section, the newest heading is already the prepared
# release, so use it as NEW (checked to be the expected increment of OLD, and
# referenced by a recent commit, so an old entry is never re-released).
# An Upcoming section with real entries is mandatory, including explicit versions.
if [ -n "${1:-}" ] && [ -n "${2:-}" ]; then
OLD="${1#v}"
NEW="${2#v}"
elif grep -qE '^# Upcoming WeKan' CHANGELOG.md; then
else
OLD="${RELEASED[0]:-}"
if [ -z "$OLD" ]; then
echo "Error: no released '# vNN.MM <date>' heading found in CHANGELOG.md." >&2
exit 1
fi
# Always +1, never "whatever the last gap between two headings happened to
# be": that used to be measured from RELEASED[0] vs RELEASED[1], so ONE
# missing or deleted heading (a release number that was prepared, then
# never published, then its CHANGELOG section removed instead of renamed
# back to Upcoming) made the gap look like the new normal cadence and
# every following release re-applied and widened it - v11.56 -> v11.58 ->
# v11.60 -> v11.62 skipped v11.57/59/61 this way, compounding a single
# incident into a permanent, ever-growing habit of skipping a number.
NEW="$(wekan_dec $(( $(wekan_enc "$OLD") + 1 )) )"
DATE="$(date +%F)"
echo "--- Renaming '# Upcoming WeKan ® release' -> '# v$NEW $DATE WeKan ® release' ---"
_tmp="$(mktemp)"
sed "s|^# Upcoming WeKan ® release.*|# v$NEW $DATE WeKan ® release|" CHANGELOG.md > "$_tmp" && mv "$_tmp" CHANGELOG.md
# NO NEW EMPTY "# Upcoming" IS OPENED HERE ON PURPOSE. It used to be, with an
# "**In short:** nothing here yet." placeholder, so the file always had
# somewhere for the next entry to go and never carried a section saying
# nothing. Add "# Upcoming WeKan ® release" yourself, by hand, the moment
# there is a real entry for it - see
# docs/DeveloperDocs/Changelog-Upcoming-Template.md for the skeleton and why
# this is safe: tests/changelogEntriesBelongToTheirRelease.test.cjs is what
# actually catches an entry landing in the wrong (already-published)
# section, by asking git which commits a release contains, and it does that
# regardless of whether an empty Upcoming section existed first.
else
NEW="${RELEASED[0]:-}"
OLD="${RELEASED[1]:-}"
if [ -z "$NEW" ] || [ -z "$OLD" ]; then
echo "Error: could not detect NEW and PREVIOUS version from CHANGELOG.md" >&2
echo "(no '# Upcoming WeKan ® release' section, and fewer than two '# vNN.MM' releases)." >&2
echo "Add an Upcoming section (preferred) or pass versions: $0 9.35 9.36" >&2
exit 1
fi
EXPECTED="$(wekan_dec $(( $(wekan_enc "$OLD") + 1 )) )"
if [ "$NEW" != "$EXPECTED" ]; then
echo "Error: newest CHANGELOG version v$NEW is not the +1 increment (v$EXPECTED) of the previous v$OLD." >&2
echo "Releases always advance by exactly one minor version. A gap here means a version" >&2
echo "number was prepared and never published, and its CHANGELOG section was deleted" >&2
echo "instead of renamed back to '# Upcoming WeKan ® release' (see this script's header" >&2
echo "comment on a failed-vs-broken release). Fix CHANGELOG.md, or if v$NEW is really" >&2
echo "the intended next release, say so explicitly: $0 $OLD $NEW" >&2
exit 1
fi
if git log -15 --format='%s' 2>/dev/null | grep -qF "$NEW"; then
echo " (v$NEW is referenced in a recent commit — treating it as the prepared release.)"
fi
fi
DATE="$(date +%F)"
echo "--- Renaming '# Upcoming WeKan ® release' -> '# v$NEW $DATE WeKan ® release' ---"
_tmp="$(mktemp)"
sed "s|^# Upcoming WeKan ® release.*|# v$NEW $DATE WeKan ® release|" CHANGELOG.md > "$_tmp" && mv "$_tmp" CHANGELOG.md
# Do not open an empty Upcoming section. Add real notes before the next release.
echo "=== WeKan remote release: v$OLD -> v$NEW ==="
echo " Previous version (from CHANGELOG.md): v$OLD"
+842 -2
View File
@@ -121061,8 +121061,8 @@
"locale": "zgh",
"key": "export-card-excel",
"before": "Exporter la carte vers Excel",
"after": "ⵙⵙⵓⴼⵖ Takarḍa ⵖⵔ Excel",
"reason": "Replace French with a direct Standard Moroccan Tamazight composition. Native MediaWiki export attests ssufgh (export) and filecopyerror attests ghr (to); preserve the existing local card noun Takarḍa and Excel product name. LOW CONFIDENCE: complete export-card phrase and mixed-script presentation require fluent technical review. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json ."
"after": "ⵙⵙⵓⴼⵖ ⵜⴰⴽⴰⵕⴹⴰ ⵖⵔ Excel",
"reason": "Replace French with a direct Standard Moroccan Tamazight composition. Native MediaWiki export attests ssufgh (export) and filecopyerror attests ghr (to); preserve the existing local card noun Takarḍa and Excel product name. LOW CONFIDENCE: complete export-card phrase and mixed-script presentation require fluent technical review. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json . Follow-up 2026-09-14: Replace French or mixed Latin/Tifinagh wording. Native MediaWiki export directly attests ssufgh/export; reuse local board/card nouns in Tifinagh and preserve literal PDF/Excel destinations where present. LOW CONFIDENCE kanban nouns and full format-destination composition. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
@@ -121490,5 +121490,845 @@
"before": "المقرر الاسبوع المقبل",
"after": "ⴰⵙⴰⴽⵓⴷ ⴰⵎⴳⴳⴰⵔⵓ: ⵉⵎⴰⵍⴰⵙⵙ ⵉⵏⴹⴼⵔ",
"reason": "LOW CONFIDENCE composed missing/weekly due-date filter. Reuse the documented final-date adaptation; complete kanban deadline semantics remain open. CLDR fields/week attests imalass/week. Native MediaWiki next attests indhfr/next, category-empty attests ad/this, and diff-empty attests ur illi/no singular object. Derive bound date form usakud for the negative clause. Preserve no-date versus due-date and current-week versus following-week scopes; client/lib/filter.js relativeWeek confirms calendar weeks rather than a rolling seven days. Full next-week agreement, bound state and complete filter phrasing require fluent review. Replace French and Arabic. References: https://raw.githubusercontent.com/unicode-org/cldr/main/common/main/zgh.xml ; https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "addmore-detail",
"before": "Ajouter une description plus détaillée",
"after": "ⵔⵏⵓ ⴰⵙⴳⵣⵍ ⵙ ⵓⴳⴳⴰⵔ ⵏ ⵉⴼⵔⵓⵔⵉⵜⵏ",
"reason": "LOW CONFIDENCE composed add-more-detailed-description prompt. Native MediaWiki skin-action-addsection attests rnu/add, filedesc attests asgzl/description, moredotdotdot and linkstoimage-more attest uggar/more, and blockedtext-include-details-queries attests ifruritn/details. Express the more-detailed requirement as description with more details; preserve addition rather than editing/removal. Full with-more-details phrase and inflection require fluent review. References: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json ; https://raw.githubusercontent.com/mastodon/mastodon/main/app/javascript/mastodon/locales/zgh.json"
},
{
"locale": "zgh",
"key": "dueCardsViewChange-choice-all",
"before": "كل المستخدمين",
"after": "ⵉⵏⵙⵙⵎⵔⵙⵏ ⴰⴽⴽⵯ",
"reason": "Composed all-users due-card view choice. Reuse the previously reviewed admin all-users label using native Mastodon column.blocks users noun and notifications.filter.all exact all form. Replace Arabic while preserving all-users scope. Full combined due-card view usage remains open for fluent review. References: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json ; https://raw.githubusercontent.com/mastodon/mastodon/main/app/javascript/mastodon/locales/zgh.json"
},
{
"locale": "zgh",
"key": "edit-checklist-items-as-text",
"before": "Ẓreg amzwaru n uḍris",
"after": "ⵙⵏⴼⵍ ⵙ ⵓⴹⵕⵉⵙ",
"reason": "LOW CONFIDENCE composed Edit as text control. Native MediaWiki edit/skin-view-edit attest snfl/edit; yourtext attests adhris/text and tooltip-search-fulltext attests its bound udhrich variant. Derive bound udhris with consistent noun spelling. Remove the inherited amzwaru/first qualifier absent from English; preserve textual editing mode rather than checklist reordering. Complete as-text phrasing and bound spelling require fluent review. This unflagged wording repair does not reduce original pending counts. Checklist noun research remains separate: candidate lexicon explicitly labels asenqed/check KBL, not verified Standard Moroccan terminology. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "members",
"before": "أعضاء",
"after": "ⵉⴳⵎⴰⵎⵏ",
"reason": "Native MediaWiki nmembers attests plural igmamn/members. Replace Arabic generic member label and French board-members label. For board-members combine native Mastodon notifications.filter.all all form with inherited board/Tafelwit, using bound tflwit attested in MediaWiki metadata-fields table wording. LOW CONFIDENCE full all-board-members phrase and table-to-kanban-board lexical adaptation; generic plural members noun is directly attested. Preserve board membership rather than substituting all users or card assignees. Full compound needs fluent review. References: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json ; https://raw.githubusercontent.com/mastodon/mastodon/main/app/javascript/mastodon/locales/zgh.json"
},
{
"locale": "zgh",
"key": "board_members",
"before": "Tous les participants du tableau",
"after": "ⵉⴳⵎⴰⵎⵏ ⴰⴽⴽⵯ ⵏ ⵜⴼⵍⵡⵉⵜ",
"reason": "Native MediaWiki nmembers attests plural igmamn/members. Replace Arabic generic member label and French board-members label. For board-members combine native Mastodon notifications.filter.all all form with inherited board/Tafelwit, using bound tflwit attested in MediaWiki metadata-fields table wording. LOW CONFIDENCE full all-board-members phrase and table-to-kanban-board lexical adaptation; generic plural members noun is directly attested. Preserve board membership rather than substituting all users or card assignees. Full compound needs fluent review. References: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json ; https://raw.githubusercontent.com/mastodon/mastodon/main/app/javascript/mastodon/locales/zgh.json"
},
{
"locale": "zgh",
"key": "link-to-search",
"before": "Lien vers cette recherche",
"after": "ⴰⵙⵖⵏ ⵖⵔ ⵓⵔⵣⵣⵓ ⴰⴷ",
"reason": "Replace French with native MediaWiki permalink/link noun asghn and tooltip-t-permalink directional phrasing ghr ... ad; search and searchresults attest arzzu and bound urzzu. This is a link label, not an instruction to execute a search. LOW CONFIDENCE complete link-to-this-search phrase and demonstrative attachment; component attestation does not validate full wording. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "rename-board",
"before": "إعادة تسمية اللوحة",
"after": "ⴰⵍⵙ ⵉ ⵉⵙⵎ ⵏ ⵜⴼⵍⵡⵉⵜ",
"reason": "Replace Arabic board-renaming label. Native MediaWiki rcfilters-savedqueries-rename directly attests als i ism/Rename; combine with inherited board/Tafelwit and bound tflwit attested in native metadata-fields table wording. LOW CONFIDENCE full rename-board genitive phrasing and table-to-kanban-board lexical adaptation. Do not substitute generic edit or remove the board target. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "importMapMembersAddPopup-title",
"before": "Sélectionner le participant",
"after": "ⵙⵜⵉ ⴰⴳⵎⴰⵎ",
"reason": "Replace French. Native MediaWiki rcfilters-highlightmenu-title attests sti/select. Its nmembers and search-result-category-size attest member noun singular bound ugmam and plural igmamn; derive free singular agmam for the direct object. The popup selects an existing member for import mapping, not every user. LOW CONFIDENCE complete select-member phrase and free-state noun adaptation; components alone do not establish fluency. References: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json ; https://raw.githubusercontent.com/mastodon/mastodon/main/app/javascript/mastodon/locales/zgh.json"
},
{
"locale": "zgh",
"key": "card-show-lists",
"before": "Afficher les listes sur la carte",
"after": "ⵙⴽⵏ ⵜⵉⵍⴳⴰⵎⵉⵏ ⵖⴼ ⵜⴽⴰⵕⴹⴰ",
"reason": "Replace French. Use native MediaWiki skn/show, Mastodon column.lists tilgamin/lists and inherited card terminology. Retain the full-card location; do not copy the minicard small qualifier from card-show-lists-on-minicard. LOW CONFIDENCE full show-lists-on-card phrase, bound card form and kanban card lexical usage. References: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json ; https://raw.githubusercontent.com/mastodon/mastodon/main/app/javascript/mastodon/locales/zgh.json"
},
{
"locale": "zgh",
"key": "show-card-counter-per-list",
"before": "Afficher le nombre de cartes par liste",
"after": "ⵙⴽⵏ ⵓⵟⵟⵓⵏ ⵏ ⵜⴽⴰⵕⴹⵉⵡⵉⵏ ⴳ ⴽⵓ ⴷ ⵜⴰⵍⴳⴰⵎⵜ",
"reason": "Replace French. Native MediaWiki view attests skn/show; pageinfo-watchers attests uttun n/number of and statistics-edits-average attests g ku d/per-page phrasing. Adapt per-list with native Mastodon talgamt/list and inherited card plural Tikarḍiwin, removing initial i for a derived bound form. Preserve a count for each list rather than one total board count or showing list names. LOW CONFIDENCE full card-count/per-list clause, bound card plural and kanban card terminology. References: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json ; https://raw.githubusercontent.com/mastodon/mastodon/main/app/javascript/mastodon/locales/zgh.json"
},
{
"locale": "zgh",
"key": "r-d-remove-all-member",
"before": "Supprimer tous les participants",
"after": "ⴽⴽⵙ ⵉⴳⵎⴰⵎⵏ ⴰⴽⴽⵯ",
"reason": "Replace French. Native MediaWiki rcfilters-tag-remove attests kks/remove and nmembers directly attests plural igmamn/members; native Mastodon notifications.filter.all attests all form akkʷ. Preserve removal of every member rather than deleting user accounts. LOW CONFIDENCE full all-members command word order. References: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json ; https://raw.githubusercontent.com/mastodon/mastodon/main/app/javascript/mastodon/locales/zgh.json ; https://cndh.ma/sites/default/files/2024-01/memo_code_penal_v_amazighe.pdf"
},
{
"locale": "zgh",
"key": "r-remove-all",
"before": "Supprimer tous les membres de la carte",
"after": "ⴽⴽⵙ ⵉⴳⵎⴰⵎⵏ ⴰⴽⴽⵯ ⵙⴳ ⵜⴽⴰⵕⴹⴰ",
"reason": "Replace French. Use the same native remove/all/member components as r-d-remove-all-member, with sg/from attested in MediaWiki tooltip-ca-unwatch and inherited bound card wording. Actual rulesWorkflow action removes card members, not board membership or accounts. LOW CONFIDENCE full from-card compound, word order and kanban card usage. References: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json ; https://raw.githubusercontent.com/mastodon/mastodon/main/app/javascript/mastodon/locales/zgh.json ; https://cndh.ma/sites/default/files/2024-01/memo_code_penal_v_amazighe.pdf"
},
{
"locale": "zgh",
"key": "errors",
"before": "Erreurs",
"after": "ⵉⵣⴳⴰⵍⵏ",
"reason": "Replace French. Native MediaWiki databaseerror and loginerror attest masculine azgal/error. CNDH native Amazigh penal-code memorandum directly attests plural izgaln in PDF pages 79 and 99 (zero-based 78 and 98). Replace French plural without retaining a singular error label. LOW CONFIDENCE standalone software-error usage of this attested plural; legal-source context alone does not establish complete technical terminology. References: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json ; https://raw.githubusercontent.com/mastodon/mastodon/main/app/javascript/mastodon/locales/zgh.json ; https://cndh.ma/sites/default/files/2024-01/memo_code_penal_v_amazighe.pdf"
},
{
"locale": "zgh",
"key": "cron-clear-errors",
"before": "Effacer toutes les erreurs",
"after": "ⵚⵚⴼⴹ ⴰⴽⴽⵯ ⵉⵣⴳⴰⵍⵏ",
"reason": "Replace French. Native MediaWiki rcfilters-clear-all-filters attests ssfd akkʷ/Clear all; substitute attested plural izgaln (see errors) for filters. Preserve clearing error records rather than fixing software failures or deleting migrations. LOW CONFIDENCE full clear-all-errors command and software-error usage. References: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json ; https://raw.githubusercontent.com/mastodon/mastodon/main/app/javascript/mastodon/locales/zgh.json ; https://cndh.ma/sites/default/files/2024-01/memo_code_penal_v_amazighe.pdf"
},
{
"locale": "zgh",
"key": "filter-by-unread",
"before": "Filtrer par non lu",
"after": "ⵣⵉⵣⴷⵉⴳ: ⵓⵔ ⵉⵜⵜⵡⴰⵖⵔⵉⵏ",
"reason": "Replace French. Native MediaWiki rcfilters-search-placeholder attests zizdig/filter and Echo notification-inbox-filter-read attests ghr/read. Preserve inherited unread predicate ur ittwaghrin, labeling the filter state with a colon. LOW CONFIDENCE passive-read inflection and full unread-filter phrase; the inherited predicate is not independently attested by these sources. References: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json ; https://raw.githubusercontent.com/wikimedia/mediawiki-extensions-Echo/master/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "mark-all-as-read",
"before": "Marquer comme lus",
"after": "ⵕⵛⵎ ⴰⴽⴽⵯ: ⵉⵜⵜⵡⴰⵖⵔⵉⵏ",
"reason": "Replace French. Native MediaWiki tooltip-minoredit attests rchm/mark and searchall attests akkʷ/all; Echo attests ghr/read. Derive read state by removing ur/not from inherited unread predicate, with a colon identifying the selected state. Actual notificationsDrawer sets notification read timestamps for this action. LOW CONFIDENCE derived passive-read form, complete mark-all-read command and agreement; source ghr/read does not validate the full passive predicate. References: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json ; https://raw.githubusercontent.com/wikimedia/mediawiki-extensions-Echo/master/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "mark-all-as-unread",
"before": "Tout marquer comme non lu",
"after": "ⵕⵛⵎ ⴰⴽⴽⵯ: ⵓⵔ ⵉⵜⵜⵡⴰⵖⵔⵉⵏ",
"reason": "Replace French with the same mark/all components as mark-all-as-read, preserving ur/not in the inherited unread predicate. Actual notificationsDrawer sets notification read timestamps to null, so retain the opposite state and avoid delete/clear vocabulary. LOW CONFIDENCE inherited passive-read form, full command and agreement; independent native references establish component terms only. References: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json ; https://raw.githubusercontent.com/wikimedia/mediawiki-extensions-Echo/master/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "card-has-unread-comments",
"before": "ⵉⵡⵍⴰⴼⵏ ⵓⵔ ⵉⵜⵜⵡⴰⵖⵔⵉⵏ",
"after": "ⵉⵅⴼⴰⵡⴰⵍⵏ ⵓⵔ ⵉⵜⵜⵡⴰⵖⵔⵉⵏ",
"reason": "Wrong word: iwlafn is an image noun, not comments. Native MediaWiki expand_templates_remove_comments attests ixfawaln/comments. Replace only the incorrect noun, retaining inherited unread predicate. This minicard tooltip indicates unread comments; it must not indicate unread images. LOW CONFIDENCE full noun-predicate agreement, inherited passive-read wording and implicit Has indication; component attestation alone does not establish complete phrasing. References: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json ; https://raw.githubusercontent.com/wikimedia/mediawiki-extensions-Echo/master/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "createCustomField",
"before": "انشاء حقل",
"after": "ⵙⵏⵓⵍⴼⵓ ⵉⴳⵔ",
"reason": "Replace Arabic. Native MediaWiki createaccount directly attests snulfu/create; IRCAM Vocabulaire grammatical amazighe (2009), field entry on PDF pages 26 and 83 (zero-based 25 and 82), attests igr/field. The English label is Create Field, not Create Card. LOW CONFIDENCE adapting the grammatical/general field noun to a software field and complete create-field phrase. References: https://ircam.biblio.ma/catalogue/doc_num.php?explnum_id=130 ; https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "createCustomFieldPopup-title",
"before": "انشاء حقل",
"after": "ⵙⵏⵓⵍⴼⵓ ⵉⴳⵔ",
"reason": "Replace Arabic with the same native create/field components as createCustomField. Keep popup title and create-button wording identical, matching their English source. LOW CONFIDENCE full phrase and grammatical/general-to-software field adaptation; the reference does not attest an input-field label. References: https://ircam.biblio.ma/catalogue/doc_num.php?explnum_id=130 ; https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "editCustomFieldPopup-title",
"before": "Éditer le champ personnalisé",
"after": "ⵙⵏⴼⵍ ⵉⴳⵔ",
"reason": "Replace French. Native MediaWiki edit attests snfl/edit and IRCAM attests igr/field. Match English Edit Field rather than adding the custom qualifier from the French value. LOW CONFIDENCE full edit-field phrase and software-field sense. References: https://ircam.biblio.ma/catalogue/doc_num.php?explnum_id=130 ; https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "r-datefield",
"before": "champ date",
"after": "ⵉⴳⵔ ⵏ ⵓⵙⴰⴽⵓⴷ",
"reason": "Replace French date-field noun phrase. IRCAM attests igr/field; native MediaWiki upload-form-label-infoform-date attests asakud/date. Derive bound usakud after n/of. Actual rule actions choose a date field, not a calendar-system selector or a time-only field. LOW CONFIDENCE complete date-field compound, derived bound date form and software-field usage. References: https://ircam.biblio.ma/catalogue/doc_num.php?explnum_id=130 ; https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "show-field-on-card",
"before": "Afficher ce champ sur la carte",
"after": "ⵙⴽⵏ ⵉⴳⵔ ⴰⴷ ⵖⴼ ⵜⴽⴰⵕⴹⴰ",
"reason": "Replace French. Use native MediaWiki skn/show, IRCAM igr/field and native demonstrative ad. Preserve this field on the full card, not a field label on a minicard. LOW CONFIDENCE software-field usage, full demonstrative/location phrase and bound card form. References: https://ircam.biblio.ma/catalogue/doc_num.php?explnum_id=130 ; https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "automatically-field-on-card",
"before": "Ajouter le champ aux cartes nouvellement créées",
"after": "ⵔⵏⵓ ⵉⴳⵔ ⵉ ⵜⴽⴰⵕⴹⵉⵡⵉⵏ ⵜⵉⵎⴰⵢⵏⵓⵜⵉⵏ",
"reason": "Replace French. Native MediaWiki create-local attests rnu/add, IRCAM attests igr/field, and newpages directly attests feminine plural timaynutin/new. Use inherited card plural with a derived bound form after i/to. Preserve new-card scope, distinct from always-field-on-card/all cards. LOW CONFIDENCE complete phrase, software-field sense, card bound plural and adjective agreement. References: https://ircam.biblio.ma/catalogue/doc_num.php?explnum_id=130 ; https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "always-field-on-card",
"before": "Ajouter le champ à toutes les cartes",
"after": "ⵔⵏⵓ ⵉⴳⵔ ⵉ ⵜⴽⴰⵕⴹⵉⵡⵉⵏ ⴰⴽⴽⵯ",
"reason": "Replace French using the same native add/field components as automatically-field-on-card; MediaWiki searchall directly attests akkʷ/all. Preserve all-card scope rather than only newly created cards. LOW CONFIDENCE complete all-cards phrase, software-field sense and derived card bound plural. References: https://ircam.biblio.ma/catalogue/doc_num.php?explnum_id=130 ; https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "cardCustomField-datePopup-title",
"before": "تغير التاريخ",
"after": "ⵙⵏⴼⵍ ⴰⵙⴰⴽⵓⴷ",
"reason": "Replace Arabic. Native MediaWiki edit attests snfl/edit/change and upload-form-label-infoform-date directly attests asakud/date. Preserve date editing rather than calendar-system selection. LOW CONFIDENCE complete change-date phrase; component terms are attested but their combined popup usage needs fluent review. References: https://ircam.biblio.ma/catalogue/doc_num.php?explnum_id=130 ; https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "custom-field-dropdown-options",
"before": "Options de liste",
"after": "ⵜⵉⴷⵖⵔⵉⵏ ⵏ ⵜⵍⴳⴰⵎⵜ",
"reason": "Replace French. Native MediaWiki watchlist-options directly attests tidghrin n tlgamt/options of list before its watch qualifier. Retain that list-options phrase without the watch qualifier. Actual field editor lists selectable option names. LOW CONFIDENCE adapting general/watchlist options to dropdown choice values and complete field-editor usage. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "custom-field-dropdown-unknown",
"before": "(inconnu)",
"after": "(ⴰⵔⵓⵙⵙⵉⵏ)",
"reason": "Replace French unknown sentinel. MediaWiki pool-errorunknown attests feminine tarussint/unknown; derive masculine arussin by removing feminine boundary t letters for an unspecified value. Preserve parentheses and distinguish unknown (selected item ID cannot be found) from none (no selected value). LOW CONFIDENCE derived masculine form, implicit value agreement and standalone unknown sentinel; native source attests the feminine modifier, not this full value. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "setSelectionColorPopup-title",
"before": "Définir la couleur de sélection",
"after": "ⵙⵜⵉ ⴰⴽⵍⵓ ⵏ ⵓⵙⵜⵉ",
"reason": "Replace French. Native MediaWiki rcfilters-highlightmenu-title attests sti/select and uklu/bound color; derive free aklu after the command. Invert attests asti/selection, using derived bound usti after n/of. Actual setSelectionColorPopup applies card.setColor to every selected card. Preserve color of the selected cards, not label creation or a text-selection highlight. LOW CONFIDENCE complete selection-color genitive phrase and derived noun forms; component references do not validate full wording. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "email-resetPassword-subject",
"before": "Réinitialiser votre mot de passe sur __siteName__",
"after": "ⵔⴰⵔ ⴷ ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵏⵏⴽ ⴳ __siteName__",
"reason": "Replace French. Native MediaWiki passwordreset and mailmypassword directly attest rar d taguri n uzray/Reset password. Append native nnk/your and g/on/in site scope, preserving __siteName__ exactly. LOW CONFIDENCE possessive attachment and full reset-your-password-on-site email subject. The reset-password command itself is directly attested. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "email-verifyEmail-subject",
"before": "Vérifier votre adresse de courriel sur __siteName__",
"after": "ⵙⵙⵉⴷⴻⴷ ⴰⵏⵙⴰ ⵏ ⵉⵎⴰⵢⵍ ⵏⵏⴽ ⴳ __siteName__",
"reason": "Replace French. Native MediaWiki login-security attests ssided/Verify identity; createacct-email-ph attests ansa n imayl nnk/your email address. Combine those components with g/on/in site scope, preserving __siteName__ exactly. Keep email verification distinct from password reset. LOW CONFIDENCE complete subject, adapting identity verification to email-address verification and the inherited source verb spelling/dialect with schwa; native components alone do not establish fluent Standard Moroccan email phrasing. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "accounts-allowEmailChange",
"before": "السماح بتغيير البريد الإلكتروني",
"after": "ⴰⵊⵊ ⴰⵙⵏⴼⵍ ⵏ ⵉⵎⴰⵢⵍ",
"reason": "Replace Arabic with declared Standard Moroccan Tamazight. Native MediaWiki protect-default attests ajj/Allow, blocked-mailpassword attests asnfl/editing, and changeemail-submit and email attest email-change and imayl. Preserve permission to change email rather than changing the address immediately. LOW CONFIDENCE complete permission phrase and nominalizing change/edit as asnfl in this software setting; component vocabulary is reference-supported, not full fluent composition. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "subject",
"before": "موضوع",
"after": "ⵉⵎⵔⵙⵉ",
"reason": "Replace Arabic in the generic email subject label. Native MediaWiki subject directly attests imrsi/Subject; remove only its UI colon for consistency with the English label. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "card_members",
"before": "Tous les participants de la carte actuelle dans ce tableau",
"after": "ⵉⴳⵎⴰⵎⵏ ⴰⴽⴽⵯ ⵏ ⵜⴽⴰⵕⴹⴰ ⴰⴷ ⴳ ⵜⴼⵍⵡⵉⵜ ⴰⴷ",
"reason": "Replace French with declared Standard Moroccan Tamazight. Native MediaWiki member-group messages attest igmamn/member plural and searchall attests akkw/all. Follow existing board_members and card terminology, adding this-card/this-board scope with ad and g. Preserve all members of the current card, distinct from all board members. LOW CONFIDENCE complete card/board genitives, demonstrative scope and kanban terminology; native member/all components do not establish fluent full phrasing. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "delete",
"before": "Kkes",
"after": "ⴽⴽⵙ",
"reason": "Normalize Latin-script Kkes to the directly attested Tifinagh Delete command in native MediaWiki delete/filedelete-submit. Same meaning, consistent with the declared locale script. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "deleteCustomFieldPopup-title",
"before": "Supprimer le champ personnalisé ?",
"after": "ⴽⴽⵙ ⵉⴳⵔ ⵉⵥⵍⵉⵏ?",
"reason": "Replace French. Use native MediaWiki delete command kks and existing IRCAM-supported field noun igr, with existing customized/specific qualifier izlin. Retain the confirmation question. LOW CONFIDENCE software-field sense, custom qualifier and full phrase; field noun is general grammatical terminology. Field reference: https://ircam.biblio.ma/catalogue/doc_num.php?explnum_id=130. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "act-removeBoardMember",
"before": "a supprimé le participant __member__ du tableau __board__",
"after": "ⵉⴽⴽⵙ ⴰⴳⵎⴰⵎ __member__ ⵙⴳ ⵜⴼⵍⵡⵉⵜ __board__",
"reason": "Replace French. Native MediaWiki logentry-delete-delete attests masculine completed ikks/deleted; nmembers attests bound ugmam/member, with free agmam derived. Preserve removed member and source-board placeholders exactly, distinct from deleting their account. LOW CONFIDENCE adapting deletion to membership removal, derived free member form, board genitive and full activity agreement; native components alone do not prove fluent full activity phrasing. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "add-card-to-top-of-list",
"before": "Ajouter la carte en haut de la liste",
"after": "ⵔⵏⵓ ⵜⴰⴽⴰⵕⴹⴰ ⴳ ⵓⴷⵖⴰⵔ ⴰⵎⵣⵡⴰⵔⵓ ⵏ ⵜⵍⴳⴰⵎⵜ",
"reason": "Replace French. Native MediaWiki apisandbox-add-multi/add and move/Move attest rnu and smutti; page_first/page_last attest first/last and tooltip-n-help attests adghar/place, with bound udghar in rcfilters-quickfilters-placeholder-description. Express top as first place in list order, verified against server/rulesHelper.js minOrder-1/maxOrder+1. Reuse native list noun from watchlist translations and existing card terminology. Keep selected-list/addition scope distinct from the generic its-list command. LOW CONFIDENCE full place/order genitive composition, list/card software sense, bound forms and possessive attachment; native components do not establish fluent full commands. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "r-d-move-to-top-gen",
"before": "Déplacer la carte en haut de sa liste",
"after": "ⵙⵎⵓⵜⵜⵉ ⵜⴰⴽⴰⵕⴹⴰ ⴳ ⵓⴷⵖⴰⵔ ⴰⵎⵣⵡⴰⵔⵓ ⵏ ⵜⵍⴳⴰⵎⵜ ⵏⵏⵙ",
"reason": "Replace French. Native MediaWiki apisandbox-add-multi/add and move/Move attest rnu and smutti; page_first/page_last attest first/last and tooltip-n-help attests adghar/place, with bound udghar in rcfilters-quickfilters-placeholder-description. Express top as first place in list order, verified against server/rulesHelper.js minOrder-1/maxOrder+1. Reuse native list noun from watchlist translations and existing card terminology. Retain its-list possessive nns for generic actions, distinct from a selected destination list. LOW CONFIDENCE full place/order genitive composition, list/card software sense, bound forms and possessive attachment; native components do not establish fluent full commands. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "r-d-move-to-top-spec",
"before": "Déplacer la carte en haut de la liste",
"after": "ⵙⵎⵓⵜⵜⵉ ⵜⴰⴽⴰⵕⴹⴰ ⴳ ⵓⴷⵖⴰⵔ ⴰⵎⵣⵡⴰⵔⵓ ⵏ ⵜⵍⴳⴰⵎⵜ",
"reason": "Replace French. Native MediaWiki apisandbox-add-multi/add and move/Move attest rnu and smutti; page_first/page_last attest first/last and tooltip-n-help attests adghar/place, with bound udghar in rcfilters-quickfilters-placeholder-description. Express top as first place in list order, verified against server/rulesHelper.js minOrder-1/maxOrder+1. Reuse native list noun from watchlist translations and existing card terminology. Keep selected-list/addition scope distinct from the generic its-list command. LOW CONFIDENCE full place/order genitive composition, list/card software sense, bound forms and possessive attachment; native components do not establish fluent full commands. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "add-card-to-bottom-of-list",
"before": "Ajouter la carte en bas de la liste",
"after": "ⵔⵏⵓ ⵜⴰⴽⴰⵕⴹⴰ ⴳ ⵓⴷⵖⴰⵔ ⴰⵎⴳⴳⴰⵔⵓ ⵏ ⵜⵍⴳⴰⵎⵜ",
"reason": "Replace French. Native MediaWiki apisandbox-add-multi/add and move/Move attest rnu and smutti; page_first/page_last attest first/last and tooltip-n-help attests adghar/place, with bound udghar in rcfilters-quickfilters-placeholder-description. Express bottom as last place in list order, verified against server/rulesHelper.js minOrder-1/maxOrder+1. Reuse native list noun from watchlist translations and existing card terminology. Keep selected-list/addition scope distinct from the generic its-list command. LOW CONFIDENCE full place/order genitive composition, list/card software sense, bound forms and possessive attachment; native components do not establish fluent full commands. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "r-d-move-to-bottom-gen",
"before": "Déplacer la carte en bas de sa liste",
"after": "ⵙⵎⵓⵜⵜⵉ ⵜⴰⴽⴰⵕⴹⴰ ⴳ ⵓⴷⵖⴰⵔ ⴰⵎⴳⴳⴰⵔⵓ ⵏ ⵜⵍⴳⴰⵎⵜ ⵏⵏⵙ",
"reason": "Replace French. Native MediaWiki apisandbox-add-multi/add and move/Move attest rnu and smutti; page_first/page_last attest first/last and tooltip-n-help attests adghar/place, with bound udghar in rcfilters-quickfilters-placeholder-description. Express bottom as last place in list order, verified against server/rulesHelper.js minOrder-1/maxOrder+1. Reuse native list noun from watchlist translations and existing card terminology. Retain its-list possessive nns for generic actions, distinct from a selected destination list. LOW CONFIDENCE full place/order genitive composition, list/card software sense, bound forms and possessive attachment; native components do not establish fluent full commands. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "r-d-move-to-bottom-spec",
"before": "Déplacer la carte en bas de la liste",
"after": "ⵙⵎⵓⵜⵜⵉ ⵜⴰⴽⴰⵕⴹⴰ ⴳ ⵓⴷⵖⴰⵔ ⴰⵎⴳⴳⴰⵔⵓ ⵏ ⵜⵍⴳⴰⵎⵜ",
"reason": "Replace French. Native MediaWiki apisandbox-add-multi/add and move/Move attest rnu and smutti; page_first/page_last attest first/last and tooltip-n-help attests adghar/place, with bound udghar in rcfilters-quickfilters-placeholder-description. Express bottom as last place in list order, verified against server/rulesHelper.js minOrder-1/maxOrder+1. Reuse native list noun from watchlist translations and existing card terminology. Keep selected-list/addition scope distinct from the generic its-list command. LOW CONFIDENCE full place/order genitive composition, list/card software sense, bound forms and possessive attachment; native components do not establish fluent full commands. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "copyManyCardsPopup-format",
"before": "[ {\"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\"} ]",
"after": "[{\"title\":\"ⴰⵣⵡⵍ ⵏ ⵜⴽⴰⵕⴹⴰ ⵜⴰⵎⵣⵡⴰⵔⵓⵜ\",\"description\":\"ⴰⵙⴳⵣⵍ ⵏ ⵜⴽⴰⵕⴹⴰ ⵜⴰⵎⵣⵡⴰⵔⵓⵜ\"},{\"title\":\"ⴰⵣⵡⵍ ⵏ ⵜⴽⴰⵕⴹⴰ 2\",\"description\":\"ⴰⵙⴳⵣⵍ ⵏ ⵜⴽⴰⵕⴹⴰ 2\"},{\"title\":\"ⴰⵣⵡⵍ ⵏ ⵜⴽⴰⵕⴹⴰ ⵜⴰⵎⴳⴳⴰⵔⵓⵜ\",\"description\":\"ⴰⵙⴳⵣⵍ ⵏ ⵜⴽⴰⵕⴹⴰ ⵜⴰⵎⴳⴳⴰⵔⵓⵜ\"}]",
"reason": "Replace French sample prose in the bulk-card JSON example while preserving title/description property names, object order and three-card structure exactly. Use existing native title and description terms; MediaWiki badtitle attests azwl/title and filedesc attests asgzl/file description. page_first/page_last and lastmodifiedat support first/last components, deriving feminine card qualifiers; identify the second example as card 2 rather than inventing an unattested ordinal. LOW CONFIDENCE full card genitive and first-card feminine agreement/kanban sense; description term is preserved from the existing reviewed local value. JSON parsing and property-name regressions validate structure, not fluency. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "allowNonBoardMembers",
"before": "Autoriser tous les utilisateurs authentifiés",
"after": "ⴰⵊⵊ ⵉⵎⵙⵙⵎⵔⵙⵏ ⴰⴽⴽⵯ ⵏⵏⴰ ⴽⵛⵎⵏ",
"reason": "Replace French. Native MediaWiki protect-default directly supplies Allow all users; login and loginsuccesstitle supply login components. Add the signed-in restriction, preserving all logged-in users rather than anonymous visitors or only board members. LOW CONFIDENCE relative-clause and plural signed-in conjugation kchmn; native login components do not establish fluent full permission phrasing. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "error-board-notAMember",
"before": "Vous devez être participant de ce tableau pour faire cela",
"after": "ⵉⵍⵍⴰ ⴼⵍⵍⴰⴽ ⴰⴷ ⵜⴳⴷ ⴰⴳⵎⴰⵎ ⵏ ⵜⴼⵍⵡⵉⵜ ⴰⴷ ⴼⴰⴷ ⴰ ⵜⵙⴽⵔⵜ ⵎⴰⵢⴰⴷ",
"reason": "Replace French. Native MediaWiki noemailcreate attests requirement illa fllak ad; badaccess-group0 supplies purpose/action components and nmembers the bound member noun, with derived free agmam. Preserve required membership of this board to perform the action, distinct from administrator status. LOW CONFIDENCE full be-member conjugation, derived noun form, board genitive and complete requirement/action composition. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "error-board-notAdmin",
"before": "Vous devez être administrateur de ce tableau pour faire cela",
"after": "ⵉⵍⵍⴰ ⴼⵍⵍⴰⴽ ⴰⴷ ⵜⴳⴷ ⴰⵎⵙⵙⵓⴳⵓⵔ ⵏ ⵜⴼⵍⵡⵉⵜ ⴰⴷ ⴼⴰⴷ ⴰ ⵜⵙⴽⵔⵜ ⵎⴰⵢⴰⴷ",
"reason": "Replace French. Native MediaWiki noemailcreate attests requirement components; badaccess-group0 supplies purpose/action wording and protect-level-sysop administrator plural imssugurn, with singular amssugur derived. Preserve required administration of this board, not generic membership or global instance administration. LOW CONFIDENCE full be-admin conjugation, derived singular, board genitive and complete requirement/action composition. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "comment-only-desc",
"before": "يمكن التعليق على بطاقات فقط.",
"after": "ⵜⵥⴹⴰⵕⴷ ⴰⴷ ⵜⵔⵏⵓⴷ ⴰⵖⴼⴰⵡⴰⵍ ⵖⴼ ⵜⴽⴰⵕⴹⵉⵡⵉⵏ ⵖⴰⵙ.",
"reason": "Replace Arabic. Native MediaWiki search-ignored-headings attests tzdard ad/can, apisandbox-add-multi attests add/rnu, filehist-comment comment/aghfawal and protect-level-sysop only/ghas. Express the capability to add a comment on cards only, distinct from editing cards. LOW CONFIDENCE full ability/add conjugation, card bound plural and only-clause scope; components alone do not establish fluent role wording. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "no-comments-desc",
"before": "Impossible de voir les commentaires.",
"after": "ⵓⵔ ⵜⵥⴹⴰⵕⴷ ⴰⴷ ⵜⵥⵕⴷ ⵉⵅⴼⴰⵡⴰⵍⵏ.",
"reason": "Replace French. Native MediaWiki search-ignored-headings supports can construction, password-change-forbidden negative capability, skin-view-history zr/view and expand_templates_remove_comments ixfawaln/comments. Preserve inability to see comments, not a command to hide them and not merely inability to post. LOW CONFIDENCE negative ability/view conjugation and full permission composition. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "read-only-desc",
"before": "Peut seulement voir les cartes. Ne peut pas éditer.",
"after": "ⵜⵥⴹⴰⵕⴷ ⴰⴷ ⵜⵥⵕⴷ ⵜⵉⴽⴰⵕⴹⵉⵡⵉⵏ ⵖⴰⵙ. ⵓⵔ ⵜⵥⴹⴰⵕⴷ ⴰⴷ ⵜⵙⵏⴼⵍⴷ.",
"reason": "Replace French. Native MediaWiki search-ignored-headings supports can construction; password-change-forbidden negative capability; skin-view-history zr/view; edit snfl/edit; protect-level-sysop ghas/only. Preserve both positive viewing of cards and explicit inability to edit, distinct from comment-only role or hiding comments. LOW CONFIDENCE full view/edit ability conjugations, card free plural and only scope. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "operator-sort-invalid",
"before": "'%s' n'est pas valide pour le tri",
"after": "ⴰⴼⵔⴰⵏ ⵏ '%s' ⵓⵔ ⵉⵙⵖⵣⵏ.",
"reason": "Replace French. Native MediaWiki sort-ascending/sort-descending attest afran/sort and feed-invalid attests ur isghzn/not valid. Preserve the invalid sort value and its exact single %s token, distinct from an unknown operator, invalid status or nonnumeric limit. LOW CONFIDENCE full sort-genitive and invalid-predicate agreement; native components alone do not establish fluent complete diagnostics. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "sort",
"before": "رتب",
"after": "ⴰⴼⵔⴰⵏ",
"reason": "Replace Arabic in the generic Sort label with native MediaWiki afran/sort, directly attested in sort-ascending and sort-descending. Use the existing native nominal UI sort wording; this does not claim a separately attested imperative verb. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "show-week-of-year",
"before": "عرض أسبوع السنة (ISO 8601)",
"after": "ⵙⴽⵏ ⵉⵎⴰⵍⴰⵙⵙ ⵏ ⵓⵙⴳⴳⵯⴰⵙ (ISO 8601)",
"reason": "Replace Arabic. CLDR directly attests imalass/week and asggwas/year; native MediaWiki year attests bound usggwas and view skn/show. Preserve ISO 8601 exactly, retaining week-of-year rather than weekday/week-start meaning. LOW CONFIDENCE complete genitive/show phrase; component evidence is not fluent full UI verification. References: https://raw.githubusercontent.com/unicode-org/cldr/main/common/main/zgh.xml and https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "start-day-of-week",
"before": "Définir le jour de début de semaine",
"after": "ⵙⵜⵉ ⴰⵙⵙ ⴰⵎⵣⵡⴰⵔⵓ ⴳ ⵉⵎⴰⵍⴰⵙⵙ",
"reason": "Replace French. CLDR weekday display directly attests ass g imalass/day in week; native MediaWiki page_first attests amzwaru/first and userexists sti/choose. Express selecting the first day of the week, distinct from ISO week-of-year display. LOW CONFIDENCE complete first-day qualifier and selection phrase. References: https://raw.githubusercontent.com/unicode-org/cldr/main/common/main/zgh.xml and https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "show-at-all-boards-page",
"before": "Afficher sur la page de tous les tableaux",
"after": "ⵙⴽⵏ ⴳ ⵜⵙⵏⴰ ⵏ ⵜⴼⵍⵡⵉⵏ ⴰⴽⴽⵯ",
"reason": "Replace French. Native MediaWiki view attests show/skn, title-invalid bound page tsna and searchall all/akkw. Reuse existing board plural vocabulary with bound tflwin in page-of-all-boards scope. Preserve display on the All Boards page, not displaying every board or changing membership/access scope. LOW CONFIDENCE bound board plural and complete page genitive composition. References: https://raw.githubusercontent.com/unicode-org/cldr/main/common/main/zgh.xml and https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "custom-field-dropdown-options-placeholder",
"before": "Appuyez sur Entrée pour ajouter d'autres options",
"after": "ⵔⵏⵓ ⵜⵉⴷⵖⵔⵉⵏ ⵢⴰⴹⵏⵉⵏ ⵙ Enter",
"reason": "Replace French. Native MediaWiki apisandbox-add-multi attests Add/rnu and watchlist-options tidghrin/options; userexists attests other yadn, deriving plural yadnin. Express adding more options with Enter rather than inventing an unattested keyboard press verb. Preserve the same physical key and option scope. LOW CONFIDENCE plural other qualifier, instrumental keyboard usage and complete instruction. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "custom-field-stringtemplate-item-placeholder",
"before": "Appuyez sur Entrée pour ajouter plus d'éléments",
"after": "ⵔⵏⵓ ⵉⴼⵔⴷⵉⵙⵏ ⵢⴰⴹⵏⵉⵏ ⵙ Enter",
"reason": "Replace French. Use native MediaWiki Add/rnu and other qualifier components, with Enter retained as the physical key name. Reuse inherited local item noun ifrdisn without schwa transcription, keeping items distinct from dropdown options. Express adding more items with Enter, equivalent action/key scope to Press Enter to add more items. LOW CONFIDENCE inherited item terminology and dialect, plural qualifier, keyboard instrumental and full instruction; native add/other components do not establish Standard Moroccan item usage. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "account-created",
"before": "Compte créé ! Vous pouvez maintenant vous connecter.",
"after": "ⵉⵜⵜⵓⵙⵏⵓⵍⴼⴰ ⵓⵎⵉⴹⴰⵏ! ⵜⵥⴹⴰⵕⴷ ⴰ ⵜⴽⵛⵎⴷ ⴷⵖⵉⴽⴽ.",
"reason": "Replace French. Native MediaWiki accountcreated directly supplies the account-created clause; login, loginsuccess and search-ignored-headings supply sign-in, now and second-person capability components. Preserve completed creation followed by permission to sign in now, rather than claiming the user is already signed in. LOW CONFIDENCE full capability composition and conjugation; the account-created clause is directly attested. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "already-account",
"before": "Vous avez déjà un compte ? Se connecter",
"after": "ⵉⵙ ⵖⵓⵔⴽ ⵉⵍⵍⴰ ⵓⵎⵉⴹⴰⵏ ⵢⴰⴷ? ⴽⵛⵎ",
"reason": "Replace French. Adapt native MediaWiki userlogin-noaccount possession question to positive already-have-an-account scope; userexists attests yad/already and login directly attests the sign-in command. Retain the question and subsequent sign-in action. LOW CONFIDENCE positive question inflection, bound account noun and already modifier composition; the complete question is not directly attested. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "created-at-newest-first",
"before": "Date de création (Plus récentes en premier)",
"after": "ⴰⵙⴰⴽⵓⴷ ⵏ ⵓⵙⵏⴼⵍⵓⵍ (ⴰⵎⴰⵢⵏⵓ ⴰⵎⵣⵡⴰⵔⵓ)",
"reason": "Replace French. Native MediaWiki pageinfo-firsttime supplies creation-date components, histlast/histfirst newest/oldest, and page_first first. boardHeader handlers confirm createdAt -1 newest-first and +1 oldest-first. Preserve opposite chronological ordering. LOW CONFIDENCE nominal label and newest/oldest-first composition. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "created-at-oldest-first",
"before": "Date de création (Plus anciennes en premier)",
"after": "ⴰⵙⴰⴽⵓⴷ ⵏ ⵓⵙⵏⴼⵍⵓⵍ (ⴰⵇⴱⵓⵔ ⴰⵎⵣⵡⴰⵔⵓ)",
"reason": "Replace French. Native MediaWiki pageinfo-firsttime supplies creation-date components, histlast/histfirst newest/oldest, and page_first first. boardHeader handlers confirm createdAt -1 newest-first and +1 oldest-first. Preserve opposite chronological ordering. LOW CONFIDENCE nominal label and newest/oldest-first composition. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "export-card",
"before": "Exporter la carte",
"after": "ⵙⵙⵓⴼⵖ ⵜⴰⴽⴰⵕⴹⴰ",
"reason": "Replace French or mixed Latin/Tifinagh wording. Native MediaWiki export directly attests ssufgh/export; reuse local board/card nouns in Tifinagh and preserve literal PDF/Excel destinations where present. LOW CONFIDENCE kanban nouns and full format-destination composition. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "exportCardPopup-title",
"before": "Exporter la carte",
"after": "ⵙⵙⵓⴼⵖ ⵜⴰⴽⴰⵕⴹⴰ",
"reason": "Replace French or mixed Latin/Tifinagh wording. Native MediaWiki export directly attests ssufgh/export; reuse local board/card nouns in Tifinagh and preserve literal PDF/Excel destinations where present. LOW CONFIDENCE kanban nouns and full format-destination composition. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "export-card-pdf",
"before": "Exporter la carte en PDF",
"after": "ⵙⵙⵓⴼⵖ ⵜⴰⴽⴰⵕⴹⴰ ⵖⵔ PDF",
"reason": "Replace French or mixed Latin/Tifinagh wording. Native MediaWiki export directly attests ssufgh/export; reuse local board/card nouns in Tifinagh and preserve literal PDF/Excel destinations where present. LOW CONFIDENCE kanban nouns and full format-destination composition. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "exportBoardPopup-title",
"before": "Exporter le tableau",
"after": "ⵙⵙⵓⴼⵖ ⵜⴰⴼⵍⵡⵉⵜ",
"reason": "Replace French or mixed Latin/Tifinagh wording. Native MediaWiki export directly attests ssufgh/export; reuse local board/card nouns in Tifinagh and preserve literal PDF/Excel destinations where present. LOW CONFIDENCE kanban nouns and full format-destination composition. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "user-can-not-export-excel",
"before": "L'utilisateur ne peut pas exporter vers Excel",
"after": "ⴰⵏⵙⵙⵎⵔⵙ ⵓⵔ ⵉⵥⴹⴰⵕ ⴰ ⵉⵙⵙⵓⴼⵖ ⵖⵔ Excel",
"reason": "Replace French. Native MediaWiki userexists supplies bound user terminology, createaccountmail-help third-person capability, resetpass_forbidden negative capability and export the export verb. Preserve explicit export inability, card-specific versus general scope and literal Excel/PDF names. LOW CONFIDENCE derived free user noun, negative capability/verb conjugation, kanban card terminology and full destination phrase. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "user-can-not-export-card-to-excel",
"before": "L'utilisateur ne peut pas exporter la carte vers Excel",
"after": "ⴰⵏⵙⵙⵎⵔⵙ ⵓⵔ ⵉⵥⴹⴰⵕ ⴰ ⵉⵙⵙⵓⴼⵖ ⵜⴰⴽⴰⵕⴹⴰ ⵖⵔ Excel",
"reason": "Replace French. Native MediaWiki userexists supplies bound user terminology, createaccountmail-help third-person capability, resetpass_forbidden negative capability and export the export verb. Preserve explicit export inability, card-specific versus general scope and literal Excel/PDF names. LOW CONFIDENCE derived free user noun, negative capability/verb conjugation, kanban card terminology and full destination phrase. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "user-can-not-export-card-to-pdf",
"before": "L'utilisateur ne peut pas exporter de carte en PDF",
"after": "ⴰⵏⵙⵙⵎⵔⵙ ⵓⵔ ⵉⵥⴹⴰⵕ ⴰ ⵉⵙⵙⵓⴼⵖ ⵜⴰⴽⴰⵕⴹⴰ ⵖⵔ PDF",
"reason": "Replace French. Native MediaWiki userexists supplies bound user terminology, createaccountmail-help third-person capability, resetpass_forbidden negative capability and export the export verb. Preserve explicit export inability, card-specific versus general scope and literal Excel/PDF names. LOW CONFIDENCE derived free user noun, negative capability/verb conjugation, kanban card terminology and full destination phrase. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "board-view-time",
"before": "الوقت",
"after": "ⴰⴽⵓⴷ",
"reason": "Replace Arabic Time label with native akud/time, already reference-supported in the existing time correction. Unicode CLDR zgh time-zone labels attest akud. Reference: https://www.unicode.org/cldr/charts/47/summary/zgh.html"
},
{
"locale": "zgh",
"key": "cron-error-time",
"before": "الوقت",
"after": "ⴰⴽⵓⴷ",
"reason": "Replace Arabic Time label consistently with existing native akud/time. Reference: https://www.unicode.org/cldr/charts/47/summary/zgh.html"
},
{
"locale": "zgh",
"key": "board-view-timeline-now",
"before": "ⴰⵙⵙⴰ",
"after": "ⴷⵖⵉⴽⴽ",
"reason": "Correct today/assa to now/dghikk; native MediaWiki loginsuccess and cannotloginnow-title attest the current instant qualifier. Preserve timeline current-instant meaning rather than calendar today. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "invalid-time",
"before": "Heure invalide",
"after": "ⴰⴽⵓⴷ ⴰⵔⵓⵖⵣⵉⵏ",
"reason": "Replace French. Native CLDR supports time/akud and MediaWiki passwordreset-invalidemail supplies arughzin/invalid as a masculine qualifier. LOW CONFIDENCE composed time-validation label and qualifier agreement; complete label is not independently attested. References: https://www.unicode.org/cldr/charts/47/summary/zgh.html ; https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "activity-dueDate",
"before": "date d'échéance éditée de %s à %s",
"after": "ⵉⵙⵏⴼⵍ ⴰⵙⴰⴽⵓⴷ ⴰⵎⴳⴳⴰⵔⵓ ⵖⵔ %s ⵏ %s",
"reason": "Replace French; also restore date-destination then card-owner scope, rather than implying from/to dates. Preserve two positional %s tokens in source order. Native MediaWiki change components and existing local due-date term supply the vocabulary. LOW CONFIDENCE past-tense transitive conjugation, inherited final-date terminology for due date and complete destination/card genitive composition. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "a-dueAt",
"before": "Echéance modifiée à",
"after": "ⵉⵙⵏⴼⵍ ⴰⴽⵓⴷ ⴰⵎⴳⴳⴰⵔⵓ ⵖⵔ",
"reason": "Replace French due-time modification fragment, preserving the trailing destination preposition for the appended value. Native time and change components plus existing local final/due qualifier supply vocabulary. LOW CONFIDENCE past-tense verb conjugation, inherited due terminology and full fragment composition. References: https://www.unicode.org/cldr/charts/47/summary/zgh.html ; https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "creator",
"before": "المنشئ",
"after": "ⴰⵎⵙⵏⴼⵍⵓⵍ",
"reason": "Replace Arabic Creator with the native masculine creator noun attested in MediaWiki pageinfo-firstuser. General Creator label uses the masculine noun as the default label, matching native reference presentation. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "globalSearch-instructions-operator-member",
"before": "`__operator_member__:<nom>` - cartes pour lesquelles l'utilisateur *<nom>* est *participant*",
"after": "`__operator_member__:<ⵉⵙⵎ ⵏ ⵓⵏⵙⵙⵎⵔⵙ>` - ⵜⵉⴽⴰⵕⴹⵉⵡⵉⵏ ⵏⵏⴰ ⴳ ⵉⴳⴰ *<ⵉⵙⵎ ⵏ ⵓⵏⵙⵙⵎⵔⵙ>* *ⴰⴳⵎⴰⵎ*",
"reason": "Replace French. Preserve executable member operator token and repeat the same localized descriptive username example. Native MediaWiki userexists attests username; prior member corrections attest native member components. Preserve card membership rather than assignee status. LOW CONFIDENCE relative/locative composition, bound/free member form and kanban card plural terminology. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "globalSearch-instructions-operator-creator",
"before": "`__operator_creator__:<utilisateur>` - cartes dont le créateur est *<utilisateur>*",
"after": "`__operator_creator__:<ⵉⵙⵎ ⵏ ⵓⵏⵙⵙⵎⵔⵙ>` - ⵜⵉⴽⴰⵕⴹⵉⵡⵉⵏ ⵏⵏⴰ ⵉⴳⴰ *<ⵉⵙⵎ ⵏ ⵓⵏⵙⵙⵎⵔⵙ>* ⴰⵎⵙⵏⴼⵍⵓⵍ ⵏⵏⵙⵏⵜ",
"reason": "Replace French. Preserve executable creator operator token and localized descriptive username example. MediaWiki pageinfo-firstuser attests creator; userexists username. Preserve creator of the cards rather than board creator or current assignee. LOW CONFIDENCE relative clause, feminine-plural possessive agreement and kanban card terminology. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "globalSearch-instructions-operator-board",
"before": "`__operator_board__:<titre>` - cartes dont le tableau correspond à *<titre>*",
"after": "`__operator_board__:<ⴰⵣⵡⵍ>` - ⵜⵉⴽⴰⵕⴹⵉⵡⵉⵏ ⴳ ⵜⴼⵍⵡⵉⵏ ⵉⵎⵙⴰⵙⴰⵏ ⴷ *<ⴰⵣⵡⵍ>* ⵉⵥⵍⵉⵏ",
"reason": "Replace French. Preserve executable board operator token and identical localized title example. MediaWiki search-nonefound attests matching components, pageinfo-display-title title, createaccountmail specified qualifier. Preserve boards matching the specified title rather than card-title search. LOW CONFIDENCE board/card plurals, matching participle agreement and complete specified-title construction. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "globalSearch-instructions-operator-list",
"before": "`__operator_list__:<titre>` - cartes dont les listes correspondent à *<titre>*",
"after": "`__operator_list__:<ⴰⵣⵡⵍ>` - ⵜⵉⴽⴰⵕⴹⵉⵡⵉⵏ ⴳ ⵜⵍⴳⴰⵎⵉⵏ ⵉⵎⵙⴰⵙⴰⵏ ⴷ *<ⴰⵣⵡⵍ>* ⵉⵥⵍⵉⵏ",
"reason": "Replace French. Preserve executable list operator token and identical localized title example. MediaWiki search-nonefound attests matching components, pageinfo-display-title title, createaccountmail specified qualifier and recentchanges-notargetpage native list noun components. Preserve list-title matching rather than board/card title search. LOW CONFIDENCE derived list plural, card terminology, matching participle agreement and complete specified-title construction. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "text",
"before": "نص",
"after": "ⴰⴹⵕⵉⵙ",
"reason": "Replace Arabic Text with native MediaWiki yourtext noun after removing the possessive suffix; native UI text noun is directly attested. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "r-label",
"before": "étiquette",
"after": "ⴰⵔⵛⵓⵎ",
"reason": "Replace French label with native MediaWiki tag-list-wrapper singular noun, consistent with the existing native plural labels. LOW CONFIDENCE tag/label application to kanban. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "globalSearch-instructions-operator-comment",
"before": "`__operator_comment__:<texte>` - cartes dont le commentaire contient *<texte>*.",
"after": "`__operator_comment__:<ⴰⴹⵕⵉⵙ>` - ⵜⵉⴽⴰⵕⴹⵉⵡⵉⵏ ⵙ ⵓⵖⴼⴰⵡⴰⵍ ⵢⵓⵎⴰⵏ *<ⴰⴹⵕⵉⵙ>*.",
"reason": "Replace French. Native MediaWiki yourtext supplies text, metadata-help contains/yuma, filehist-comment comment noun; preserve search for cards having a comment containing the specified text, rather than searching the card title. Repeat the same localized descriptive example and preserve executable operator token. LOW CONFIDENCE bound comment form, containing participle and full card-relative construction. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "globalSearch-instructions-operator-label",
"before": "`__operator_label__:<couleur>` `__operator_label__:<nom>` - cartes qui ont une étiquette correspondant à *<couleur>* ou à *<nom>*.",
"after": "`__operator_label__:<ⴰⴽⵍⵓ>` `__operator_label__:<ⵉⵙⵎ>` - ⵜⵉⴽⴰⵕⴹⵉⵡⵉⵏ ⵙ ⵓⵔⵛⵓⵎ ⵉⵎⵙⴰⵙⴰⵏ ⴷ *<ⴰⴽⵍⵓ>* ⵏⵖ *<ⵉⵙⵎ>*.",
"reason": "Replace French. Native MediaWiki tag-list-wrapper supplies singular tag, rcfilters-highlightmenu-title color, saved-query name labels name and search-nonefound matching. Preserve color-or-name label matching and both executable operator examples; do not turn alternatives into a conjunction. LOW CONFIDENCE bound label noun, matching participle and full card/label construction. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "globalSearch-instructions-operator-hash",
"before": "`__operator_label_abbrev__<nom|couleur>` - raccourci pour `__operator_label__:<couleur>` ou `__operator_label__:<nom>`",
"after": "`__operator_label_abbrev__<ⵉⵙⵎ|ⴰⴽⵍⵓ>` - ⴰⵙⴳⵣⵍ ⵏ `__operator_label__:<ⴰⴽⵍⵓ>` ⵏⵖ `__operator_label__:<ⵉⵙⵎ>`",
"reason": "Replace French. Native MediaWiki rcfilters-legend-heading abbreviation plural supplies a derived singular short-form noun; native name/color terms are directly attested. Preserve abbreviated-operator syntax, its name|color alternatives and both expanded label examples. LOW CONFIDENCE abbreviation singular and search-syntax short-form application; literal operator tokens and separator remain unchanged. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "operator-status-invalid",
"before": "'%s' n'est pas un statut valide",
"after": "ⴰⴷⴷⴰⴷ ⵏ '%s' ⵓⵔ ⵉⵙⵖⵣⵏ.",
"reason": "Replace French. Native MediaWiki metadata-help attests state/addad in bound form waddad; feed-invalid attests invalid/not-valid predicate. Preserve the status-validation meaning and exactly one %s format token. LOW CONFIDENCE derived free state noun and full diagnostic composition. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "globalSearch-instructions-operator-status",
"before": "`__operator_status__:<état>` - où *<état>* est l'un des choix suivants :",
"after": "`__operator_status__:<ⴰⴷⴷⴰⴷ>` - ⵉⴳⴰ *<ⴰⴷⴷⴰⴷ>* ⵢⴰⵏ ⵙⴳ ⵉⴷⴷⴰⴷⵏ ⴰⴷ:",
"reason": "Replace French. Native MediaWiki metadata-help attests state components and category count messages use ad to introduce following items. Preserve one-of-following status choices, repeated descriptive example and executable operator token. LOW CONFIDENCE derived state plural, one-of construction and full search instruction. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "accounts-lockout-status",
"before": "Statut",
"after": "ⴰⴷⴷⴰⴷ",
"reason": "Replace French Status with state/addad, supported by native MediaWiki metadata-help bound waddad and existing local board-status. Derived free state noun is consistent with existing local Status vocabulary; software-status application needs wider terminology review. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "migration-progress-status",
"before": "Statut",
"after": "ⴰⴷⴷⴰⴷ",
"reason": "Replace French Status consistently with native state components attested in MediaWiki metadata-help and existing local migration-status. Software-status application needs wider terminology review. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "problems-status-title",
"before": "Statut",
"after": "ⴰⴷⴷⴰⴷ",
"reason": "Replace French Status consistently with native state components attested in MediaWiki metadata-help and existing local board-status. Software-status application needs wider terminology review. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "invalid-date",
"before": "تاريخ غير صالح",
"after": "ⴰⵙⴰⴽⵓⴷ ⴰⵔⵓⵖⵣⵉⵏ",
"reason": "Replace Arabic. Native MediaWiki upload-form-label-infoform-date supplies date/asakud and passwordreset-invalidemail masculine invalid qualifier. Preserve invalid date rather than invalid time. LOW CONFIDENCE composed date-validation label and qualifier agreement. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "invalid-user",
"before": "Utilisateur invalide",
"after": "ⴰⵏⵙⵙⵎⵔⵙ ⴰⵔⵓⵖⵣⵉⵏ",
"reason": "Replace French. Native MediaWiki userexists supplies user noun in bound form and passwordreset-invalidemail masculine invalid qualifier. Preserve invalid user rather than incorrect credentials. LOW CONFIDENCE derived free user form and composed diagnostic agreement. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "public",
"before": "عامّ",
"after": "ⴰⴳⴷⵓⴷⴰⵏ",
"reason": "Replace Arabic Public with native Moroccan public adjective. Finance ministry Tamazight page supplies public-sector masculine agdudan and feminine/plural forms. LOW CONFIDENCE generic masculine UI adjective and board-visibility application. Reference: https://www.finances.gov.ma/am/nos-metiers/Pages/loi-finances.aspx"
},
{
"locale": "zgh",
"key": "private",
"before": "خاص",
"after": "ⵓⵙⵍⵉⴳ",
"reason": "Replace Arabic Private. CNDH Tamazight privacy wording tudrt tusligt supports private qualifier and computing lexicon p127 private network/group explicitly attests uslig. Finance ministry also supplies private-sector feminine plural tusligin. LOW CONFIDENCE free masculine label and software-visibility application; computing lexicon uses mixed Amazigh sources, not independent Standard Moroccan proof. References: https://cndh.ma/sites/default/files/2024-01/memo_code_penal_v_amazighe.pdf ; https://cedric.cnam.fr/~bouzefra/books/amawal.pdf ; https://www.finances.gov.ma/am/nos-metiers/Pages/loi-finances.aspx"
},
{
"locale": "zgh",
"key": "globalSearch-instructions-status-public",
"before": "`__predicate_public__` - uniquement les cartes qui sont dans un tableau public.",
"after": "`__predicate_public__` - ⵜⵉⴽⴰⵕⴹⵉⵡⵉⵏ ⴳ ⵜⴼⵍⵡⵉⵏ ⵜⵉⴳⴷⵓⴷⴰⵏⵉⵏ ⵖⴰⵙ",
"reason": "Replace French. Preserve cards only in public boards and executable public predicate. Finance ministry supplies native feminine plural public adjective; inherited local board/card plurals supply kanban nouns. LOW CONFIDENCE full board/card scope and only qualifier attachment. Reference: https://www.finances.gov.ma/am/nos-metiers/Pages/loi-finances.aspx"
},
{
"locale": "zgh",
"key": "globalSearch-instructions-status-private",
"before": "`__predicate_private__` - uniquement les cartes qui sont dans un tableau privé.",
"after": "`__predicate_private__` - ⵜⵉⴽⴰⵕⴹⵉⵡⵉⵏ ⴳ ⵜⴼⵍⵡⵉⵏ ⵜⵓⵙⵍⵉⴳⵉⵏ ⵖⴰⵙ",
"reason": "Replace French. Preserve cards only in private boards and executable private predicate. Finance ministry supplies native feminine plural private adjective; CNDH privacy wording supports private meaning. LOW CONFIDENCE full board/card scope and only qualifier attachment. References: https://www.finances.gov.ma/am/nos-metiers/Pages/loi-finances.aspx ; https://cndh.ma/sites/default/files/2024-01/memo_code_penal_v_amazighe.pdf"
},
{
"locale": "zgh",
"key": "globalSearch-instructions-operator-sort",
"before": "`__operator_sort__:<tri>` - où *<tri>* est une méthode parmi `__predicate_due__`, `__predicate_created__` ou `__predicate_modified__`. Pour un tri descendant, préfixez la méthode par `-`.",
"after": "`__operator_sort__:<ⵉⵙⵎ ⵏ ⵓⴼⵔⴰⵏ>` - ⵉⴳⴰ *<ⵉⵙⵎ ⵏ ⵓⴼⵔⴰⵏ>* ⵢⴰⵏ ⵙⴳ `__predicate_due__`, `__predicate_created__` ⵏⵖ `__predicate_modified__`. ⵉ ⵓⴼⵔⴰⵏ ⵜⴰⴽⵙⴰⵔⵜ, ⵔⵏⵓ `-` ⴷⴰⵜ ⵏ ⵉⵙⵎ ⵏ ⵓⴼⵔⴰⵏ.",
"reason": "Replace French. Native MediaWiki sort-descending attests sort/descending, name labels name and add labels rnu; computing lexicon p112 prefix entry attests dat/before with MC Central Morocco source. Preserve all executable operator/predicate tokens, repeated descriptive sort-name example, three alternatives and explicit leading minus for descending sort. LOW CONFIDENCE full one-of and prefix instruction, noun/qualifier agreement and Central Morocco dat adaptation; mixed-source lexicon does not independently establish full Standard Moroccan sentence. References: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json ; https://cedric.cnam.fr/~bouzefra/books/amawal.pdf"
},
{
"locale": "zgh",
"key": "operator-unknown-error",
"before": "'%s' n'est pas un opérateur",
"after": "%s ⵓⵔ ⵉⴳⵉ ⴰⵎⴰⵀⴰⵍ",
"reason": "Replace French. Computing lexicon p102 mathematical/relational operator entry supplies amahal; native MediaWiki negative copula supplies ur igi. Preserve not-an-operator meaning and exactly one %s. LOW CONFIDENCE mathematical lexicon adaptation to search operator and complete negated classification; mixed-source lexicon is not independent Standard Moroccan sentence proof. References: https://cedric.cnam.fr/~bouzefra/books/amawal.pdf ; https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "operator-number-expected",
"before": "L'opérateur __operator__ n'attend pas '__value__' mais un nombre",
"after": "ⵉⵇⵇⴰⵏ ⴷ ⴰⵎⴹⴰⵏ ⵉ ⵓⵎⴰⵀⴰⵍ __operator__, ⵉⵔⵎⵙ '__value__'",
"reason": "Replace French. Express the expected number as a required number for the operator, followed by the received value, preserving all underscore tokens exactly and keeping required versus actual value distinct. Native MediaWiki requirement and recentchanges-label-plusminus number components support iqqan d/amdan; computing lexicon p102 operator and p120 receive/rmes (with Central Morocco take/catch note) support derived operator/receive forms. LOW CONFIDENCE bound operator noun, receive past-tense inflection and full diagnostic; mixed-source mathematical/receive usage is not independent Standard Moroccan search terminology proof. References: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json ; https://cedric.cnam.fr/~bouzefra/books/amawal.pdf"
},
{
"locale": "zgh",
"key": "number",
"before": "رقم",
"after": "ⴰⵎⴹⴰⵏ",
"reason": "Replace Arabic Number with derived free noun from native MediaWiki recentchanges-label-plusminus bound umdan/number. Preserve numeric value meaning; do not substitute a single digit. LOW CONFIDENCE free noun form and generic UI application. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json"
},
{
"locale": "zgh",
"key": "act-a-receivedAt",
"before": "Modification de la date de réception de __timeOldValue__ à __timeValue__",
"after": "ⵉⵙⵏⴼⵍ ⴰⴽⵓⴷ ⵏ ⵜⵔⵎⵙⵜ ⵖⵔ __timeValue__ ⵙⴳ (__timeOldValue__)",
"reason": "Replace French received-time activity with Tamazight time/change components and derived bound tarmest/reception. Preserve destination versus previous time, parentheses and exact placeholders; the short activity fragment leaves its destination for the viewer. LOW CONFIDENCE reception terminology adaptation from mixed-source lexicon MW (not MediaWiki), bound noun and full phrase composition. References: https://cedric.cnam.fr/~bouzefra/books/amawal.pdf (PDF page 120 reception Tarmest MW, rmes receive; Central Morocco root take/catch on same page); https://www.unicode.org/cldr/charts/47/summary/zgh.html (time akud); https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json (change/edit snfl)."
},
{
"locale": "zgh",
"key": "a-receivedAt",
"before": "Date de réception modifiée à",
"after": "ⵉⵙⵏⴼⵍ ⴰⴽⵓⴷ ⵏ ⵜⵔⵎⵙⵜ ⵖⵔ",
"reason": "Replace French received-time activity with Tamazight time/change components and derived bound tarmest/reception. Preserve destination versus previous time, parentheses and exact placeholders; the short activity fragment leaves its destination for the viewer. LOW CONFIDENCE reception terminology adaptation from mixed-source lexicon MW (not MediaWiki), bound noun and full phrase composition. References: https://cedric.cnam.fr/~bouzefra/books/amawal.pdf (PDF page 120 reception Tarmest MW, rmes receive; Central Morocco root take/catch on same page); https://www.unicode.org/cldr/charts/47/summary/zgh.html (time akud); https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json (change/edit snfl)."
},
{
"locale": "zgh",
"key": "act-a-startAt",
"before": "Modification de la date de début de __timeOldValue__ à __timeValue__",
"after": "ⵉⵙⵏⴼⵍ ⴰⴽⵓⴷ ⵏ ⵜⵓⴷⴷⵎⴰ ⵖⵔ __timeValue__ ⵙⴳ (__timeOldValue__)",
"reason": "Replace French/Arabic start or end time wording with native MediaWiki blockedtext-start-time tuddma and blockedtext-expiration-time tigira. Preserve start versus end, destination versus previous time, parentheses and all placeholders; short fragments leave the destination for the viewer. LOW CONFIDENCE generic card/calendar application of native block start/expiration terms and full composed activity phrases. References: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json (blockedtext-start-time, blockedtext-expiration-time, tags-edit and logentry-move-move); https://www.unicode.org/cldr/charts/47/summary/zgh.html (time akud)."
},
{
"locale": "zgh",
"key": "act-a-endAt",
"before": "Modification de la date de fin de __timeOldValue__ à __timeValue__",
"after": "ⵉⵙⵏⴼⵍ ⴰⴽⵓⴷ ⵏ ⵜⵉⴳⵉⵔⴰ ⵖⵔ __timeValue__ ⵙⴳ (__timeOldValue__)",
"reason": "Replace French/Arabic start or end time wording with native MediaWiki blockedtext-start-time tuddma and blockedtext-expiration-time tigira. Preserve start versus end, destination versus previous time, parentheses and all placeholders; short fragments leave the destination for the viewer. LOW CONFIDENCE generic card/calendar application of native block start/expiration terms and full composed activity phrases. References: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json (blockedtext-start-time, blockedtext-expiration-time, tags-edit and logentry-move-move); https://www.unicode.org/cldr/charts/47/summary/zgh.html (time akud)."
},
{
"locale": "zgh",
"key": "a-startAt",
"before": "Date de début modifiée à",
"after": "ⵉⵙⵏⴼⵍ ⴰⴽⵓⴷ ⵏ ⵜⵓⴷⴷⵎⴰ ⵖⵔ",
"reason": "Replace French/Arabic start or end time wording with native MediaWiki blockedtext-start-time tuddma and blockedtext-expiration-time tigira. Preserve start versus end, destination versus previous time, parentheses and all placeholders; short fragments leave the destination for the viewer. LOW CONFIDENCE generic card/calendar application of native block start/expiration terms and full composed activity phrases. References: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json (blockedtext-start-time, blockedtext-expiration-time, tags-edit and logentry-move-move); https://www.unicode.org/cldr/charts/47/summary/zgh.html (time akud)."
},
{
"locale": "zgh",
"key": "a-endAt",
"before": "Date de fin modifiée à",
"after": "ⵉⵙⵏⴼⵍ ⴰⴽⵓⴷ ⵏ ⵜⵉⴳⵉⵔⴰ ⵖⵔ",
"reason": "Replace French/Arabic start or end time wording with native MediaWiki blockedtext-start-time tuddma and blockedtext-expiration-time tigira. Preserve start versus end, destination versus previous time, parentheses and all placeholders; short fragments leave the destination for the viewer. LOW CONFIDENCE generic card/calendar application of native block start/expiration terms and full composed activity phrases. References: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json (blockedtext-start-time, blockedtext-expiration-time, tags-edit and logentry-move-move); https://www.unicode.org/cldr/charts/47/summary/zgh.html (time akud)."
},
{
"locale": "zgh",
"key": "card-start",
"before": "بداية",
"after": "ⵜⵓⴷⴷⵎⴰ",
"reason": "Replace French/Arabic start or end time wording with native MediaWiki blockedtext-start-time tuddma and blockedtext-expiration-time tigira. Preserve start versus end, destination versus previous time, parentheses and all placeholders; short fragments leave the destination for the viewer. LOW CONFIDENCE generic card/calendar application of native block start/expiration terms and full composed activity phrases. References: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json (blockedtext-start-time, blockedtext-expiration-time, tags-edit and logentry-move-move); https://www.unicode.org/cldr/charts/47/summary/zgh.html (time akud)."
},
{
"locale": "zgh",
"key": "card-end",
"before": "Fin",
"after": "ⵜⵉⴳⵉⵔⴰ",
"reason": "Replace French/Arabic start or end time wording with native MediaWiki blockedtext-start-time tuddma and blockedtext-expiration-time tigira. Preserve start versus end, destination versus previous time, parentheses and all placeholders; short fragments leave the destination for the viewer. LOW CONFIDENCE generic card/calendar application of native block start/expiration terms and full composed activity phrases. References: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json (blockedtext-start-time, blockedtext-expiration-time, tags-edit and logentry-move-move); https://www.unicode.org/cldr/charts/47/summary/zgh.html (time akud)."
},
{
"locale": "zgh",
"key": "start",
"before": "بداية",
"after": "ⵜⵓⴷⴷⵎⴰ",
"reason": "Replace French/Arabic start or end time wording with native MediaWiki blockedtext-start-time tuddma and blockedtext-expiration-time tigira. Preserve start versus end, destination versus previous time, parentheses and all placeholders; short fragments leave the destination for the viewer. LOW CONFIDENCE generic card/calendar application of native block start/expiration terms and full composed activity phrases. References: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json (blockedtext-start-time, blockedtext-expiration-time, tags-edit and logentry-move-move); https://www.unicode.org/cldr/charts/47/summary/zgh.html (time akud)."
},
{
"locale": "zgh",
"key": "add-custom-html-after-body-start",
"before": "Ajouter le HTML personnalisé après le début du <body>",
"after": "ⵔⵏⵓ HTML ⵉⵥⵍⵉⵏ ⴷⴼⴼⵉⵔ ⵏ ⵜⵓⴷⴷⵎⴰ ⵏ <body>",
"reason": "Replace French custom HTML insertion action with native Tamazight add, before/after and start/end components. Preserve HTML identifier, literal opening <body> versus closing </body> and insertion direction. LOW CONFIDENCE specified/custom izlin adaptation to HTML and full insertion phrase composition. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json (tooltip-watch rnu, tooltip-preview dat n, rc-change-size-new dffir n, createaccountmail izlin, blockedtext-start-time tuddma, blockedtext-expiration-time tigira)."
},
{
"locale": "zgh",
"key": "add-custom-html-before-body-end",
"before": "Ajouter le HTML personnalisé avant la fin du </body>",
"after": "ⵔⵏⵓ HTML ⵉⵥⵍⵉⵏ ⴷⴰⵜ ⵏ ⵜⵉⴳⵉⵔⴰ ⵏ </body>",
"reason": "Replace French custom HTML insertion action with native Tamazight add, before/after and start/end components. Preserve HTML identifier, literal opening <body> versus closing </body> and insertion direction. LOW CONFIDENCE specified/custom izlin adaptation to HTML and full insertion phrase composition. Reference: https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json (tooltip-watch rnu, tooltip-preview dat n, rc-change-size-new dffir n, createaccountmail izlin, blockedtext-start-time tuddma, blockedtext-expiration-time tigira)."
},
{
"locale": "zgh",
"key": "rules",
"before": "قواعد",
"after": "ⵉⵍⵓⴳⵏⵏ",
"reason": "Repair French/Arabic rule labels or inconsistent existing terminology using IRCAM rule alugn, bound ulugn and plural ilugnn. Distinguish rule from alugan/regular and replace the mistaken view/opinion noun in required rule-title prompt. Preserve singular/plural, board ownership and action semantics. LOW CONFIDENCE grammatical-rule adaptation to software automation, full composed phrases, adjective agreement and negative plural construction. References: https://biblio.ircam.ma/pmb/uploads/publications/134.pdf (Vocabulaire grammatical 2009 printed p65, indexed native rule paradigm versus regular; direct fetch temporarily failed); https://biblio.ircam.ma/pmb/uploads/publications/136.pdf (French index Rule alugen versus Regular alugan); https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json (add tooltip-watch, show, delete, tags-edit, new, please mk tufid, input skchm)."
},
{
"locale": "zgh",
"key": "r-rule",
"before": "Règle",
"after": "ⴰⵍⵓⴳⵏ",
"reason": "Repair French/Arabic rule labels or inconsistent existing terminology using IRCAM rule alugn, bound ulugn and plural ilugnn. Distinguish rule from alugan/regular and replace the mistaken view/opinion noun in required rule-title prompt. Preserve singular/plural, board ownership and action semantics. LOW CONFIDENCE grammatical-rule adaptation to software automation, full composed phrases, adjective agreement and negative plural construction. References: https://biblio.ircam.ma/pmb/uploads/publications/134.pdf (Vocabulaire grammatical 2009 printed p65, indexed native rule paradigm versus regular; direct fetch temporarily failed); https://biblio.ircam.ma/pmb/uploads/publications/136.pdf (French index Rule alugen versus Regular alugan); https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json (add tooltip-watch, show, delete, tags-edit, new, please mk tufid, input skchm)."
},
{
"locale": "zgh",
"key": "r-board-rules",
"before": "Règles du tableau",
"after": "ⵉⵍⵓⴳⵏⵏ ⵏ ⵜⴼⵍⵡⵉⵜ",
"reason": "Repair French/Arabic rule labels or inconsistent existing terminology using IRCAM rule alugn, bound ulugn and plural ilugnn. Distinguish rule from alugan/regular and replace the mistaken view/opinion noun in required rule-title prompt. Preserve singular/plural, board ownership and action semantics. LOW CONFIDENCE grammatical-rule adaptation to software automation, full composed phrases, adjective agreement and negative plural construction. References: https://biblio.ircam.ma/pmb/uploads/publications/134.pdf (Vocabulaire grammatical 2009 printed p65, indexed native rule paradigm versus regular; direct fetch temporarily failed); https://biblio.ircam.ma/pmb/uploads/publications/136.pdf (French index Rule alugen versus Regular alugan); https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json (add tooltip-watch, show, delete, tags-edit, new, please mk tufid, input skchm)."
},
{
"locale": "zgh",
"key": "r-add-rule",
"before": "Ajouter une règle",
"after": "ⵔⵏⵓ ⴰⵍⵓⴳⵏ",
"reason": "Repair French/Arabic rule labels or inconsistent existing terminology using IRCAM rule alugn, bound ulugn and plural ilugnn. Distinguish rule from alugan/regular and replace the mistaken view/opinion noun in required rule-title prompt. Preserve singular/plural, board ownership and action semantics. LOW CONFIDENCE grammatical-rule adaptation to software automation, full composed phrases, adjective agreement and negative plural construction. References: https://biblio.ircam.ma/pmb/uploads/publications/134.pdf (Vocabulaire grammatical 2009 printed p65, indexed native rule paradigm versus regular; direct fetch temporarily failed); https://biblio.ircam.ma/pmb/uploads/publications/136.pdf (French index Rule alugen versus Regular alugan); https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json (add tooltip-watch, show, delete, tags-edit, new, please mk tufid, input skchm)."
},
{
"locale": "zgh",
"key": "r-view-rule",
"before": "Voir la règle",
"after": "ⵙⴽⵏ ⴰⵍⵓⴳⵏ",
"reason": "Repair French/Arabic rule labels or inconsistent existing terminology using IRCAM rule alugn, bound ulugn and plural ilugnn. Distinguish rule from alugan/regular and replace the mistaken view/opinion noun in required rule-title prompt. Preserve singular/plural, board ownership and action semantics. LOW CONFIDENCE grammatical-rule adaptation to software automation, full composed phrases, adjective agreement and negative plural construction. References: https://biblio.ircam.ma/pmb/uploads/publications/134.pdf (Vocabulaire grammatical 2009 printed p65, indexed native rule paradigm versus regular; direct fetch temporarily failed); https://biblio.ircam.ma/pmb/uploads/publications/136.pdf (French index Rule alugen versus Regular alugan); https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json (add tooltip-watch, show, delete, tags-edit, new, please mk tufid, input skchm)."
},
{
"locale": "zgh",
"key": "r-delete-rule",
"before": "Supprimer la règle",
"after": "ⴽⴽⵙ ⴰⵍⵓⴳⵏ",
"reason": "Repair French/Arabic rule labels or inconsistent existing terminology using IRCAM rule alugn, bound ulugn and plural ilugnn. Distinguish rule from alugan/regular and replace the mistaken view/opinion noun in required rule-title prompt. Preserve singular/plural, board ownership and action semantics. LOW CONFIDENCE grammatical-rule adaptation to software automation, full composed phrases, adjective agreement and negative plural construction. References: https://biblio.ircam.ma/pmb/uploads/publications/134.pdf (Vocabulaire grammatical 2009 printed p65, indexed native rule paradigm versus regular; direct fetch temporarily failed); https://biblio.ircam.ma/pmb/uploads/publications/136.pdf (French index Rule alugen versus Regular alugan); https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json (add tooltip-watch, show, delete, tags-edit, new, please mk tufid, input skchm)."
},
{
"locale": "zgh",
"key": "r-new-rule-name",
"before": "Titre de la nouvelle règle",
"after": "ⴰⵣⵡⵍ ⵏ ⵓⵍⵓⴳⵏ ⴰⵎⴰⵢⵏⵓ",
"reason": "Repair French/Arabic rule labels or inconsistent existing terminology using IRCAM rule alugn, bound ulugn and plural ilugnn. Distinguish rule from alugan/regular and replace the mistaken view/opinion noun in required rule-title prompt. Preserve singular/plural, board ownership and action semantics. LOW CONFIDENCE grammatical-rule adaptation to software automation, full composed phrases, adjective agreement and negative plural construction. References: https://biblio.ircam.ma/pmb/uploads/publications/134.pdf (Vocabulaire grammatical 2009 printed p65, indexed native rule paradigm versus regular; direct fetch temporarily failed); https://biblio.ircam.ma/pmb/uploads/publications/136.pdf (French index Rule alugen versus Regular alugan); https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json (add tooltip-watch, show, delete, tags-edit, new, please mk tufid, input skchm)."
},
{
"locale": "zgh",
"key": "r-no-rules",
"before": "Pas de règles",
"after": "ⵓⵔ ⵍⵍⵉⵏ ⵉⵍⵓⴳⵏⵏ",
"reason": "Repair French/Arabic rule labels or inconsistent existing terminology using IRCAM rule alugn, bound ulugn and plural ilugnn. Distinguish rule from alugan/regular and replace the mistaken view/opinion noun in required rule-title prompt. Preserve singular/plural, board ownership and action semantics. LOW CONFIDENCE grammatical-rule adaptation to software automation, full composed phrases, adjective agreement and negative plural construction. References: https://biblio.ircam.ma/pmb/uploads/publications/134.pdf (Vocabulaire grammatical 2009 printed p65, indexed native rule paradigm versus regular; direct fetch temporarily failed); https://biblio.ircam.ma/pmb/uploads/publications/136.pdf (French index Rule alugen versus Regular alugan); https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json (add tooltip-watch, show, delete, tags-edit, new, please mk tufid, input skchm)."
},
{
"locale": "zgh",
"key": "r-edit-rule",
"before": "ⵥⵔⴻⴳ ⴰⵍⵓⴳⴰⵏ",
"after": "ⵙⵏⴼⵍ ⴰⵍⵓⴳⵏ",
"reason": "Repair French/Arabic rule labels or inconsistent existing terminology using IRCAM rule alugn, bound ulugn and plural ilugnn. Distinguish rule from alugan/regular and replace the mistaken view/opinion noun in required rule-title prompt. Preserve singular/plural, board ownership and action semantics. LOW CONFIDENCE grammatical-rule adaptation to software automation, full composed phrases, adjective agreement and negative plural construction. References: https://biblio.ircam.ma/pmb/uploads/publications/134.pdf (Vocabulaire grammatical 2009 printed p65, indexed native rule paradigm versus regular; direct fetch temporarily failed); https://biblio.ircam.ma/pmb/uploads/publications/136.pdf (French index Rule alugen versus Regular alugan); https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json (add tooltip-watch, show, delete, tags-edit, new, please mk tufid, input skchm)."
},
{
"locale": "zgh",
"key": "r-rule-title-required",
"before": "ⵎⴰⵕⵕⴰ ⵙⴽⵛⵎ ⴰⵣⵡⵍ ⵏ ⵜⴰⵏⵏⴰⵢⵜ",
"after": "ⵎⴽ ⵜⵓⴼⵉⴷ, ⵙⴽⵛⵎ ⴰⵣⵡⵍ ⵏ ⵓⵍⵓⴳⵏ",
"reason": "Repair French/Arabic rule labels or inconsistent existing terminology using IRCAM rule alugn, bound ulugn and plural ilugnn. Distinguish rule from alugan/regular and replace the mistaken view/opinion noun in required rule-title prompt. Preserve singular/plural, board ownership and action semantics. LOW CONFIDENCE grammatical-rule adaptation to software automation, full composed phrases, adjective agreement and negative plural construction. References: https://biblio.ircam.ma/pmb/uploads/publications/134.pdf (Vocabulaire grammatical 2009 printed p65, indexed native rule paradigm versus regular; direct fetch temporarily failed); https://biblio.ircam.ma/pmb/uploads/publications/136.pdf (French index Rule alugen versus Regular alugan); https://raw.githubusercontent.com/wikimedia/mediawiki/master/languages/i18n/zgh.json (add tooltip-watch, show, delete, tags-edit, new, please mk tufid, input skchm)."
}
]
+2 -2
View File
@@ -22,10 +22,10 @@ const pkgdef :Spk.PackageDefinition = (
appTitle = (defaultText = "Wekan"),
# The name of the app as it is displayed to the user.
appVersion = 1174,
appVersion = 1176,
# Increment this for every release.
appMarketingVersion = (defaultText = "11.74~2026-09-14"),
appMarketingVersion = (defaultText = "11.76~2026-09-14"),
# Human-readable presentation of the app version.
minUpgradableAppVersion = 0,
+4 -4
View File
@@ -19,7 +19,7 @@
# base: core24 (not core26) · no build-base: devel · grade: stable
# ─────────────────────────────────────────────────────────────────────────────
name: wekan
version: '11.74'
version: '11.76'
base: core24
confinement: strict
grade: stable
@@ -693,18 +693,18 @@ parts:
armhf) WEKAN_ARCH="armhf" ;;
*) echo "Unsupported architecture: ${CRAFT_ARCH_BUILD_FOR}"; exit 1 ;;
esac
WEKAN_ZIP="wekan-11.74-${WEKAN_ARCH}.zip"
WEKAN_ZIP="wekan-11.76-${WEKAN_ARCH}.zip"
echo "Cleaning environment first"
rm -rf .build
mkdir .build
cd .build
#wget https://github.com/wekan/wekan/releases/download/v11.74/wekan-11.74-amd64.zip
#wget https://github.com/wekan/wekan/releases/download/v11.76/wekan-11.76-amd64.zip
# Retry: a release asset can 404 for a short while right after it is
# uploaded (CDN/propagation lag), and a plain wget treated that as
# fatal. --retry-on-http-error covers the 404/5xx window; a genuinely
# missing bundle still fails after the tries are spent.
wget --tries=20 --waitretry=20 --retry-on-http-error=404,403,500,502,503 \
"https://github.com/wekan/wekan/releases/download/v11.74/${WEKAN_ZIP}"
"https://github.com/wekan/wekan/releases/download/v11.76/${WEKAN_ZIP}"
unzip "${WEKAN_ZIP}"
rm "${WEKAN_ZIP}"
# Copy to Snap. Use the bundle's OWN arch-correct Node.js: the
+36
View File
@@ -0,0 +1,36 @@
const assert = require('node:assert/strict');
const fs = require('node:fs');
const vm = require('node:vm');
const test = require('node:test');
const source = fs.readFileSync('client/components/activities/activities.js', 'utf8');
const jade = fs.readFileSync('client/components/activities/activities.jade', 'utf8');
test('both activity feeds render values through the shared HTML/Markdown/emoji viewer', () => {
assert.match(jade, /\+activity\(activity=activityData card=card mode=mode\)/);
assert.doesNotMatch(jade, /\(sanitize |\{\{\{_ /);
assert.match(jade, /activityMessage 'activity-changedTitle' \(activityValue activity.value\)/);
assert.match(source, /activityValue\(value\)[\s\S]*?return titleViewerHtml/);
assert.match(source, /stripLinks: !!\(setting && setting.renderLinksAsPlainText\)/);
assert.match(source, /\^https\?:/);
assert.match(jade, /div\.activity-desc/);
});
test('rich activity links preserve allowed HTML and avoid nested anchors', () => {
const html = {
Raw: value => value,
A: (attrs, text) => `<a href="${attrs.href}">${text}</a>`,
SPAN: (...values) => `<span>${values.join('')}</span>`,
};
const context = { HTML: html, Blaze: { toHTML: value => value },
titleViewerHtml: value => value,
sanitizeHTML: value => value.replace(/<script>.*?<\/script>/g, ''),
};
const start = source.indexOf('function linkedActivityValue(');
const end = source.indexOf('\nfunction createBoardLink', start);
vm.runInNewContext(source.slice(start, end), context);
assert.equal(context.linkedActivityValue('<strong>👍</strong>', '', 'card'), '<strong>👍</strong>');
assert.equal(context.linkedActivityValue('<strong>👍</strong><script>bad()</script>', '/card', 'card'),
'<a href="/card"><strong>👍</strong></a>');
const linked = context.linkedActivityValue('<a href="https://example.com">Title</a>', '/card', 'card');
assert.equal(linked, '<span><a href="https://example.com">Title</a> <a href="/card">↗</a></span>');
});
+4 -3
View File
@@ -57,17 +57,18 @@ test('chart title adapter delegates HTML, escapes SVG markup and observes settin
}
});
test('assignee helpers run without implicit FlowRouter or moment globals', () => {
test('assignee helpers use native dates without undeclared Moment dependency', () => {
const source = read('client/components/boards/groupByAssigneeView.js');
assert.match(source, /import \{ FlowRouter \} from 'meteor\/ostrio:flow-router-extra'/);
assert.match(source, /import moment from 'moment'/);
assert.match(source, /import \{ format \} from '\/imports\/lib\/dateUtils'/);
assert.doesNotMatch(source, /(?:from|require\()\s*['"]moment['"]/);
let helpers;
const context = {
Template: { groupByAssigneeView: { onCreated() {}, events() {}, helpers(value) { helpers = value; } } },
Session: { get() { return 'board'; } },
ReactiveCache: { getBoard() { return { _id: 'board', slug: 'demo' }; } },
FlowRouter: { path(route, params) { return `/${route}/${params.boardId}/${params.cardId}`; } },
moment: date => ({ format: pattern => `${date}:${pattern}` }),
format: (date, pattern) => `${date}:${pattern}`,
formatDateForDisplay: (date, includeTime, fallback) => fallback(date),
require: () => ({ translateGroupLabel() {} }),
};
@@ -0,0 +1,55 @@
const { test, expect } = require('../fixtures');
const db = require('../helpers/db');
const BoardPage = require('../pages/BoardPage');
const CardPage = require('../pages/CardPage');
test.describe.configure({ mode: 'serial' });
for (const policy of ['formatted', 'plain-links', 'plain-source']) {
test(`card and sidebar activities obey ${policy}`, async ({ boardPage, board, user }) => {
const setting = db.findOne('settings', {});
const activityId = db.uid('activity-viewer');
const title = '# Demo :thumbsup: <strong>allowed</strong> [link](https://example.com/) <img src="x" onerror="window.activityViewerAttack=1">';
db.updateOne('settings', { _id: setting._id }, { $set: {
renderLinksAsPlainText: policy === 'plain-links',
alwaysShowCodeAsText: policy === 'plain-source',
} });
try {
db.insertOne('activities', {
_id: activityId, activityType: 'a-changedTitle', value: title,
boardId: board.boardId, userId: user.id,
cardId: db.findCardIdByTitle({ boardId: board.boardId, title: 'Alpha Card' }),
listId: board.listIds[0], createdAt: new Date(),
});
await boardPage.reload();
const bp = new BoardPage(boardPage);
await bp.openSidebar();
if (!(await boardPage.locator(`.board-sidebar .activity[data-id="${activityId}"]`).count())) {
await boardPage.locator('.js-toggle-show-activities').first().click();
}
await bp.clickCard(board.listIds[0], 'Alpha Card');
const cp = new CardPage(boardPage);
await cp.waitForOpen();
await cp.root.locator('.js-toggle-card-section[data-section="activities"]').click();
for (const root of [boardPage.locator('.board-sidebar'), cp.root]) {
const activity = root.locator(`.activity[data-id="${activityId}"]`);
await expect(activity).toBeVisible();
await expect(activity.locator('[onerror], script')).toHaveCount(0);
expect(await boardPage.evaluate(() => window.activityViewerAttack)).toBeUndefined();
if (policy === 'plain-source') {
await expect(activity.locator('pre').first()).toHaveText(title);
await expect(activity.locator('strong')).toHaveCount(0);
} else {
await expect(activity.locator('strong').first()).toHaveText('allowed');
await expect(activity).toContainText('👍');
await expect(activity.locator('a[href="https://example.com/"]')).toHaveCount(policy === 'plain-links' ? 0 : 1);
}
}
} finally {
db.deleteOne('activities', { _id: activityId });
db.updateOne('settings', { _id: setting._id }, { $set: {
renderLinksAsPlainText: !!setting.renderLinksAsPlainText,
alwaysShowCodeAsText: !!setting.alwaysShowCodeAsText,
} });
}
});
}
+10 -12
View File
@@ -17,10 +17,8 @@
// missing heading compounded into a permanent, ever-repeating habit of
// skipping a number.
//
// The fix is a fixed +1 step with no history lookup, plus turning the other
// branch's "not the expected increment" case from a printed Note (which let
// the script proceed anyway) into a hard failure that requires an explicit
// override.
// The fix is a fixed +1 step with no history lookup. Releases now also
// require real Upcoming notes before any tool installation or forge contact.
const assert = require('assert');
const fs = require('fs');
@@ -36,7 +34,7 @@ console.log('releaseAllVersionStep:');
test('the Upcoming-rename branch computes NEW as a fixed +1, not a measured/re-applied STEP', () => {
const renameBlock = sh.slice(
sh.indexOf("elif grep -qE '^# Upcoming WeKan'"),
sh.indexOf('# An Upcoming section with real entries'),
sh.indexOf('Opening the next'),
);
assert.ok(/NEW="\$\(wekan_dec \$\(\( \$\(wekan_enc "\$OLD"\) \+ 1 \)\) \)"/.test(renameBlock),
@@ -47,13 +45,13 @@ test('the Upcoming-rename branch computes NEW as a fixed +1, not a measured/re-a
'STEP must not be computed by subtracting two encoded historical versions');
});
test('a version gap in the no-Upcoming branch is a hard failure, not a printed Note', () => {
const elseBlock = sh.slice(sh.indexOf('\nelse\n'), sh.indexOf('fi\n\necho "=== WeKan remote release'));
assert.ok(/echo "Error: newest CHANGELOG version v\$NEW is not the \+1 increment/.test(elseBlock),
'the mismatch message must be an Error');
assert.ok(/exit 1/.test(elseBlock.slice(elseBlock.indexOf('is not the +1 increment'))),
'a version gap must exit 1, not just warn and continue ("proceeding anyway" is the bug)');
assert.ok(!/proceeding anyway/.test(sh), 'the old "proceeding anyway" wording must be gone entirely');
test('missing Upcoming notes cannot fall back to an already released heading', () => {
const guard = sh.indexOf('bash "$REPO_DIR/releases/check-upcoming-release.sh"');
assert.ok(guard > -1 && guard < sh.indexOf('ensure_tools git gh'));
assert.ok(guard < sh.indexOf('bash "$(dirname "$0")/fix-changelog-hashes.sh"'));
assert.ok(!sh.includes('NEW="${RELEASED[0]:-}"'),
'a published section must never be reused when Upcoming notes are missing');
assert.ok(!sh.includes('treating it as the prepared release'));
});
test('wekan_enc/wekan_dec are unchanged (the encoding itself was never the bug)', () => {
+49
View File
@@ -0,0 +1,49 @@
'use strict';
const { test } = require('node:test');
const assert = require('node:assert/strict');
const fs = require('node:fs');
const path = require('node:path');
const { spawnSync } = require('node:child_process');
const root = path.resolve(__dirname, '..');
const tmpRoot = path.join(root, '.tools/tmp');
fs.mkdirSync(tmpRoot, { recursive: true });
const checker = path.join(root, 'releases/check-upcoming-release.sh');
const entry = '<details>\n<summary><a href="https://github.com/wekan/wekan/commit/1234567">Fix build</a></summary>\n</details>\n';
const upcoming = '# Upcoming WeKan ® release\n';
test('release preflight accepts real Upcoming entries and rejects missing/empty/duplicate notes', () => {
const dir = fs.mkdtempSync(path.join(tmpRoot, 'release-preflight-'));
try {
for (const [text, valid] of [
[upcoming + entry + '# v11.75 2026-09-14 WeKan ® release\n', true],
['# v11.75 2026-09-14 WeKan ® release\n' + entry, false],
[upcoming + '\n# v11.75 2026-09-14 WeKan ® release\n' + entry, false],
[upcoming + '**In short:** nothing here yet.\n', false],
[upcoming + entry + upcoming + entry, false],
['# Upcoming WeKan unrelated heading\n' + entry, false],
]) {
const file = path.join(dir, 'CHANGELOG.md');
fs.writeFileSync(file, text);
const result = spawnSync('bash', [checker, file], { encoding: 'utf8', env: { ...process.env, TMPDIR: tmpRoot } });
assert.equal(result.status, valid ? 0 : 1, result.stderr);
if (!valid) assert.match(result.stderr, /Error:.*Upcoming/);
assert.equal(fs.readFileSync(file, 'utf8'), text, 'preflight is read-only');
}
const absent = spawnSync('bash', [checker, path.join(dir, 'absent.md')], { encoding: 'utf8' });
assert.equal(absent.status, 1);
assert.match(absent.stderr, /changelog not found/);
} finally {
fs.rmSync(dir, { recursive: true, force: true });
}
});
test('release notes are checked before tools, hash repairs, version overrides or remote commands', () => {
const source = fs.readFileSync(path.join(root, 'releases/release-all.sh'), 'utf8');
const guard = source.indexOf('bash "$REPO_DIR/releases/check-upcoming-release.sh"');
assert.ok(guard > 0);
for (const later of ['ensure_tools git gh', 'bash "$(dirname "$0")/fix-changelog-hashes.sh"',
'if [ -n "${1:-}" ]', 'git add --all', '\n git push', 'gh workflow run']) {
assert.ok(source.indexOf(later) > guard, `${later} must follow successful preflight`);
}
assert.doesNotMatch(source, /NEW="\$\{RELEASED\[0\]/);
});