Compare commits

...
24 Commits
Author SHA1 Message Date
Lauri Ojansivu b7d9af9ae7 v7.89 2025-05-13 22:45:44 +03:00
Lauri Ojansivu 0046b3c802 Merge pull request #5772 from oussama-madimagh/fix/css-compatibility
Fix: Add vendor prefixes for user-select and text-size-adjust for better browser compatibility
2025-05-13 22:37:32 +03:00
oussama-madimagh 25384c8ac3 Fix: Add vendor prefixes for user-select and text-size-adjust for better browser compatibility 2025-05-13 20:33:29 +01:00
Lauri Ojansivu 2eee72da8a Updated ChangeLog. 2025-05-13 22:00:50 +03:00
Lauri Ojansivu d65c422e3f Merge pull request #5769 from Adamsss001/feature/email-i18n
Add email notifications language localization feature
2025-05-13 21:50:53 +03:00
Omar Abid 2ab9bd3172 Add email notifications language localization feature 2025-05-13 19:45:08 +01:00
Lauri Ojansivu a0b5c2e88c Updated ChangeLog. 2025-05-13 19:42:41 +03:00
Lauri Ojansivu 0bd4108661 Upgraded to MongoDB 6.0.23 at Snap Candidate.
Thanks to MongoDB developers !
2025-05-13 19:37:42 +03:00
Lauri Ojansivu 7d1a1475ba Add missing code of fix insertion order of list.
Thanks to xet7 !

Fixes https://github.com/wekan/wekan/pull/5767,
fixes #5732
2025-05-13 18:54:14 +03:00
Lauri Ojansivu 6418263165 Merge branch 'correct-list-position' of github.com:valhalla-creator/wekan 2025-05-13 18:30:59 +03:00
Lauri Ojansivu b32c835cf9 Updated license 2025-05-13 17:00:54 +03:00
valhalla-creator a927685bc6 Update swimlanes.js 2025-05-12 22:33:42 +01:00
Lauri Ojansivu 6827d40e84 Updated ChangeLog. 2025-05-12 22:26:33 +03:00
Lauri Ojansivu 9aa12b0eb6 Updated Caddy docs.
Thanks to xet7 !
2025-05-12 22:25:18 +03:00
Lauri Ojansivu 8ca1a36d78 Updated ChangeLog. 2025-05-12 21:57:43 +03:00
Lauri Ojansivu 394f2eae69 Updated Browser Compatibility Matrix.
Thanks to xet7 !
2025-05-12 21:56:11 +03:00
Lauri Ojansivu 7588459c3e Updated translations. 2025-05-12 21:43:02 +03:00
Lauri Ojansivu 2c33f45a6a Updated translations. 2025-04-29 05:47:20 +03:00
Lauri Ojansivu 43cf0b66ac Merge pull request #5754 from wekan/dependabot/github_actions/docker/build-push-action-6.16.0
Bump docker/build-push-action from 6.15.0 to 6.16.0
2025-04-29 04:59:27 +03:00
dependabot[bot] c05f6fcff2 Bump docker/build-push-action from 6.15.0 to 6.16.0
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 6.15.0 to 6.16.0.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](https://github.com/docker/build-push-action/compare/471d1dc4e07e5cdedd4c2171150001c434f0b7a4...14487ce63c7a62a4a324b0bfb37086795e31c6c1)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-version: 6.16.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-28 21:07:25 +00:00
Lauri Ojansivu a4eb32158b Updated ChangeLog. 2025-04-25 23:33:40 +03:00
Lauri Ojansivu 072ced9d0e Added script to build snap locally and push to snapcraft.io candidate and edge.
Thanks to xet7 !
2025-04-25 23:30:57 +03:00
Lauri Ojansivu c5fefc1414 v7.88 2025-04-25 22:12:37 +03:00
Lauri Ojansivu c825895ceb Reverted translation fix that sometimes did not work.
Thanks to xet7 !

Fixes #5751,
related https://github.com/wekan/wekan/pull/5748
2025-04-25 22:06:06 +03:00
26 changed files with 368 additions and 259 deletions

No files matched your search

+1 -1
View File
@@ -55,7 +55,7 @@ jobs:
# Build and push Docker image with Buildx (don't push on PR)
# https://github.com/docker/build-push-action
- name: Build and push Docker image
uses: docker/build-push-action@471d1dc4e07e5cdedd4c2171150001c434f0b7a4
uses: docker/build-push-action@14487ce63c7a62a4a324b0bfb37086795e31c6c1
with:
context: .
push: ${{ github.event_name != 'pull_request' }}
+38
View File
@@ -15,8 +15,46 @@ Fixing other platforms In Progress.
[How to upgrade WeKan](https://github.com/wekan/wekan/issues/4585)
# v7.89 2025-05-13 WeKan ® release
This release adds the following new features:
- [Add email notifications language localization feature](https://github.com/wekan/wekan/pull/5769).
Thanks to Adamsss001.
and adds the following updates:
- [Added script to build snap locally and push to snapcraft.io candidate and edge](https://github.com/wekan/wekan/commit/072ced9d0e53dc6c8964e9b37fc7d1036962ca19).
Thanks to xet7.
- [Updated Browser Compatibility Matrix by adding Servo](https://github.com/wekan/wekan/commit/394f2eae69542067fde9e2511ffcef165d170d2d).
Thanks to xet7.
- [Updated Caddy docs](https://github.com/wekan/wekan/commit/9aa12b0eb62962bd107fe1aa87cdf5bad5a5905f).
Thanks to xet7.
- [Upgraded to MongoDB 6.0.23 at Snap Candidate](https://github.com/wekan/wekan/commit/0bd410866196bc2faa76b9c26c12f42617321a03).
Thanks to MongoDB developers.
and fixes the following bugs:
- [Fix list insertion order and prevent runtime error in "Add After" feature](https://github.com/wekan/wekan/pull/5767).
Thanks to valhalla-creator.
- [Fix: Add CSS vendor prefixes for user-select and text-size-adjust for better browser compatibility](https://github.com/wekan/wekan/pull/5772).
Thanks to oussama-madimagh.
Thanks to above GitHub users for their contributions and translators for their translations.
# v7.88 2025-04-25 WeKan ® release
This release fixes the following bugs:
- [Reverted translation fix that sometimes did not work](https://github.com/wekan/wekan/commit/c825895cebd24355d076741512c9aa16844393d9).
Thanks to xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
# v7.87 2025-04-25 WeKan ® release
Note: This release does not work, there is bugs. Use newest release.
This release fixes the following bugs:
- [Fix typos](https://github.com/wekan/wekan/commit/d0ea5bf50067fd76359330986edbad8dd1fbcdcc).
+1 -1
View File
@@ -1,6 +1,6 @@
The MIT License (MIT)
Copyright (c) 2014-2024 The Wekan Team
Copyright (c) Lauri Ojansivu
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
+1 -1
View File
@@ -1,5 +1,5 @@
appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928
appVersion: "v7.87.0"
appVersion: "v7.89.0"
files:
userUploads:
- README.md
+3
View File
@@ -98,6 +98,7 @@ textarea:disabled {
border-color: #bfbfbf;
color: #8c8c8c;
-webkit-touch-callout: none;
-webkit-user-select: none;
user-select: none;
}
select {
@@ -322,6 +323,7 @@ textarea::-moz-placeholder {
background: linear-gradient(#fff, #f5f5f5);
border-radius: 3px;
box-sizing: border-box;
-webkit-user-select: none;
user-select: none;
border: 1px solid #e3e3e3;
border-bottom-color: #c2c2c2;
@@ -505,6 +507,7 @@ button.loud-text-button:hover {
.emphasis-button,
.quiet-button {
border-radius: 3px;
-webkit-user-select: none;
user-select: none;
color: #8c8c8c;
display: block;
+7
View File
@@ -59,8 +59,12 @@ button {
html {
font-size: 100%;
max-height: 100%;
-webkit-user-select: none;
user-select: none;
-webkit-text-size-adjust: 100%;
text-size-adjust: 100%;
}
body {
background: #dedede;
@@ -188,7 +192,10 @@ strong {
font-weight: bold;
}
p {
-webkit-user-select: none;
user-select: text;
}
p a {
text-decoration: underline;
+29 -20
View File
@@ -250,36 +250,45 @@ BlazeComponent.extendComponent({
return [
{
submit(evt) {
evt.preventDefault();
const lastList = this.currentBoard.getLastList();
const titleInput = this.find('.list-name-input');
const title = titleInput.value.trim();
let sortIndex = 0
if (lastList) {
const positionInput = this.find('.list-position-input');
const position = positionInput.value.trim();
const ret = ReactiveCache.getList({ boardId: Utils.getCurrentBoardId(), _id: position, archived: false })
sortIndex = parseInt(JSON.stringify(ret['sort']))
sortIndex = sortIndex+1
} else {
sortIndex = Utils.calculateIndexData(lastList, null).base;
}
evt.preventDefault();
const titleInput = this.find('.list-name-input');
const title = titleInput?.value.trim();
if (!title) return;
let sortIndex = 0;
const lastList = this.currentBoard.getLastList();
const boardId = Utils.getCurrentBoardId();
const positionInput = this.find('.list-position-input');
if (positionInput) {
const positionId = positionInput.value.trim();
const selectedList = ReactiveCache.getList({ boardId, _id: positionId, archived: false });
if (selectedList) {
sortIndex = selectedList.sort + 1;
} else {
sortIndex = Utils.calculateIndexData(lastList, null).base;
}
} else {
sortIndex = Utils.calculateIndexData(lastList, null).base;
}
if (title) {
Lists.insert({
title,
boardId: Session.get('currentBoard'),
sort: sortIndex,
type: this.isListTemplatesSwimlane ? 'template-list' : 'list',
swimlaneId: this.currentBoard.isTemplatesBoard()
? this.currentSwimlane._id
: '',
swimlaneId: this.currentBoard.isTemplatesBoard() ? this.currentSwimlane._id : '',
});
titleInput.value = '';
titleInput.focus();
}
},
}
},
{
'click .js-list-template': Popup.open('searchElement'),
},
];
@@ -58,8 +58,14 @@ Internet Explorer | No | No | No | No | No
## Servo based, not tested yet
- Apache 2.0 or MIT license
- Repo: https://github.com/versotile-org/verso
- Verso
- Apache 2.0 or MIT license
- Repo: https://github.com/versotile-org/verso
- Servo
- MPL-2.0 license
- https://servo.org
- Repo: https://github.com/servo/servo
- At https://www.youtube.com/watch?v=g9hzWXxUgiU was said, that Gmail works, so maybe WeKan could also work
## Ladybird based, not yet compatible with WeKan
+4 -4
View File
@@ -10,19 +10,19 @@ This is without container (without Docker or Snap).
Right click and download files 1-4:
1. [wekan-7.87-amd64-windows.zip](https://github.com/wekan/wekan/releases/download/v7.87/wekan-7.87-amd64-windows.zip)
1. [wekan-7.89-amd64-windows.zip](https://github.com/wekan/wekan/releases/download/v7.89/wekan-7.89-amd64-windows.zip)
2. [node.exe](https://nodejs.org/dist/latest-v14.x/win-x64/node.exe)
3. [mongodb-windows-x86_64-6.0.22-signed.msi](https://fastdl.mongodb.org/windows/mongodb-windows-x86_64-6.0.22-signed.msi)
3. [mongodb-windows-x86_64-6.0.23-signed.msi](https://fastdl.mongodb.org/windows/mongodb-windows-x86_64-6.0.23-signed.msi)
4. [start-wekan.bat](https://raw.githubusercontent.com/wekan/wekan/main/start-wekan.bat)
5. Copy files from steps 1-4 with USB stick or DVD to offline Windows computer
6. Double click `mongodb-windows-x86_64-6.0.22-signed.msi` . In installer, uncheck downloading MongoDB compass.
6. Double click `mongodb-windows-x86_64-6.0.23-signed.msi` . In installer, uncheck downloading MongoDB compass.
7. Unzip `wekan-7.87-amd64-windows.zip` , inside it is directory `bundle`, to it copy other files:
7. Unzip `wekan-7.89-amd64-windows.zip` , inside it is directory `bundle`, to it copy other files:
```
bundle (directory)
+7
View File
@@ -1,3 +1,10 @@
## Infra Caddy Guy Scripts: Docker, Caddy Lightweight Server Management Bash TUI
- https://github.com/nguyenanhung/infra-caddy-guy
- https://news.ycombinator.com/item?id=43940096
----
[Caddy 2 .well-known/assetlinks.json config for WeKan Android Play Store app](../PWA#fullscreen-android-app-with-caddy-and-wekan-server)
# CloudFlare DNS
+69 -69
View File
@@ -89,13 +89,13 @@
"setListWidthPopup-title": "تعيين العرض",
"set-list-width": "تعيين العرض",
"set-list-width-value": "تعيين الحد الأدنى والأقصى للعرض (بالبكسل)",
"list-width-error-message": "List widths must be integers greater than 100",
"keyboard-shortcuts-enabled": "Keyboard shortcuts enabled. Click to disable.",
"keyboard-shortcuts-disabled": "Keyboard shortcuts disabled. Click to enable.",
"setSwimlaneHeightPopup-title": "Set Swimlane Height",
"set-swimlane-height": "Set Swimlane Height",
"set-swimlane-height-value": "Swimlane Height (pixels)",
"swimlane-height-error-message": "Swimlane height must be a positive integer",
"list-width-error-message": "يجب أن تكون عرضات القائمة أعدادًا صحيحة أكبر من 100",
"keyboard-shortcuts-enabled": "تم تفعيل اختصارات لوحة المفاتيح. انقر لتعطيلها.",
"keyboard-shortcuts-disabled": "اختصارات لوحة المفاتيح معطلة. انقر للتفعيل.",
"setSwimlaneHeightPopup-title": "ضبط ارتفاع مسار السباحة",
"set-swimlane-height": "ضبط ارتفاع مسار السباحة",
"set-swimlane-height-value": "ارتفاع مسار السباحة (بكسل)",
"swimlane-height-error-message": "يجب أن يكون ارتفاع مسار السباحة عددًا صحيحًا موجبًا\n ",
"add-swimlane": "Add Swimlane",
"add-subtask": "إضافة مهمة فرعية",
"add-checklist": "إضافة قائمة تدقيق",
@@ -103,10 +103,10 @@
"close-add-checklist-item": "Close add an item to checklist form",
"close-edit-checklist-item": "Close edit an item to checklist form",
"convertChecklistItemToCardPopup-title": "Convert to Card",
"add-cover": "Add cover image to minicard",
"add-cover": "إضافة صورة الغلاف إلى البطاقة الصغيرة",
"add-label": "إضافة ملصق",
"add-list": "إضافة قائمة",
"add-after-list": "Add After List",
"add-after-list": "أضف بعد القائمة",
"add-members": "إضافة أعضاء",
"added": "أُضيف",
"addMemberPopup-title": "أعضاء",
@@ -146,13 +146,13 @@
"attachmentDeletePopup-title": "تريد حذف المرفق ?",
"attachments": "المرفقات",
"auto-watch": "مراقبة لوحات تلقائيا عندما يتم إنشاؤها",
"avatar-too-big": "The avatar is too large (__size__ max)",
"avatar-too-big": "الصورة الرمزية كبيرة جدًا (الحجم الأقصى)",
"back": "رجوع",
"board-change-color": "تغيير اللومr",
"board-change-background-image": "Change Background Image",
"board-background-image-url": "Background Image URL",
"add-background-image": "Add Background Image",
"remove-background-image": "Remove Background Image",
"board-change-background-image": "تغيير صورة الخلفية",
"board-background-image-url": "عنوان URL لصورة الخلفية",
"add-background-image": "إضافة صورة الخلفية",
"remove-background-image": "إزالة صورة الخلفية",
"show-at-all-boards-page" : "Show at All Boards page",
"board-info-on-my-boards" : "جميع إعدادات اللوحات",
"boardInfoOnMyBoardsPopup-title" : "جميع إعدادات اللوحات",
@@ -165,9 +165,9 @@
"board-public-info": "سوف تصبح هذه اللوحة <strong>عامّة</strong>.",
"board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.",
"boardChangeColorPopup-title": "تعديل خلفية الشاشة",
"boardChangeBackgroundImagePopup-title": "Change Background Image",
"boardChangeBackgroundImagePopup-title": "تغيير صورة الخلفية",
"allBoardsChangeColorPopup-title": "تغيير اللومr",
"allBoardsChangeBackgroundImagePopup-title": "Change Background Image",
"allBoardsChangeBackgroundImagePopup-title": "تغيير صورة الخلفية",
"boardChangeTitlePopup-title": "إعادة تسمية اللوحة",
"boardChangeVisibilityPopup-title": "تعديل وضوح الرؤية",
"boardChangeWatchPopup-title": "تغيير المتابعة",
@@ -266,9 +266,9 @@
"checklists": "قوائم التّدقيق",
"click-to-star": "اضغط لإضافة اللوحة للمفضلة.",
"click-to-unstar": "اضغط لحذف اللوحة من المفضلة.",
"click-to-enable-auto-width": "Auto list width disabled. Click to enable.",
"click-to-disable-auto-width": "Auto list width enabled. Click to disable.",
"auto-list-width": "Auto list width",
"click-to-enable-auto-width": "تم تعطيل عرض القائمة التلقائي. انقر للتفعيل.",
"click-to-disable-auto-width": "تم تفعيل عرض القائمة التلقائي. انقر لتعطيله.",
"auto-list-width": "عرض القائمة التلقائية",
"clipboard": "Clipboard or drag & drop",
"close": "غلق",
"close-board": "غلق اللوحة",
@@ -300,7 +300,7 @@
"color-white": "أبيض",
"color-yellow": "yellow",
"unset-color": "غير محدد",
"comments": "Comments",
"comments": "تعليقات",
"comment": "تعليق",
"comment-placeholder": "أكتب تعليق",
"comment-only": "التعليق فقط",
@@ -383,14 +383,14 @@
"email-sent": "Email sent",
"email-verifyEmail-subject": "Verify your email address on __siteName__",
"email-verifyEmail-text": "Hello __user__,\n\nTo verify your account email, simply click the link below.\n\n__url__\n\nThanks.",
"enable-vertical-scrollbars": "Enable vertical scrollbars",
"enable-vertical-scrollbars": "تمكين أشرطة التمرير العمودية",
"enable-wip-limit": "Enable WIP Limit",
"error-board-doesNotExist": "This board does not exist",
"error-board-notAdmin": "You need to be admin of this board to do that",
"error-board-notAMember": "You need to be a member of this board to do that",
"error-json-malformed": "Your text is not valid JSON",
"error-json-schema": "Your JSON data does not include the proper information in the correct format",
"error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format ",
"error-csv-schema": "لا يتضمن ملف CSV (القيم المفصولة بفواصل)/TSV (القيم المفصولة بعلامات التبويب) الخاص بك المعلومات الصحيحة بالتنسيق الصحيح",
"error-list-doesNotExist": "This list does not exist",
"error-user-doesNotExist": "This user does not exist",
"error-user-notAllowSelf": "لا يمكنك دعوة نفسك",
@@ -429,7 +429,7 @@
"filter-overdue": "Overdue",
"filter-due-today": "Due today",
"filter-due-this-week": "Due this week",
"filter-due-next-week": "Due next week",
"filter-due-next-week": "المقرر الاسبوع المقبل",
"filter-due-tomorrow": "Due tomorrow",
"list-filter-label": "Filter List by Title",
"filter-clear": "مسح التصفية",
@@ -451,7 +451,7 @@
"advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\\\/) to be skipped, you can use \\\\. For example: Field1 == I\\\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i",
"fullname": "الإسم الكامل",
"header-logo-title": "الرجوع إلى صفحة اللوحات",
"show-activities": "Show Activities",
"show-activities": "عرض الأنشطة",
"headerBarCreateBoardPopup-title": "إنشاء لوحة",
"home": "الرئيسية",
"import": "Import",
@@ -558,7 +558,7 @@
"public": "عامّ",
"public-desc": "هذه اللوحة عامة: مرئية لكلّ من يحصل على الرابط ، و هي مرئية أيضا في محركات البحث مثل جوجل. التعديل مسموح به للأعضاء فقط.",
"quick-access-description": "أضف لوحة إلى المفضلة لإنشاء اختصار في هذا الشريط.",
"remove-cover": "Remove cover image from minicard",
"remove-cover": "إزالة صورة الغلاف من البطاقة الصغيرة",
"remove-from-board": "حذف من اللوحة",
"remove-label": "إزالة التصنيف",
"listDeletePopup-title": "حذف القائمة ؟",
@@ -587,7 +587,7 @@
"shortcut-clear-filters": "مسح التصفيات",
"shortcut-close-dialog": "غلق النافذة",
"shortcut-filter-my-cards": "تصفية بطاقاتي",
"shortcut-filter-my-assigned-cards": "Filter my assigned cards",
"shortcut-filter-my-assigned-cards": "تصفية البطاقات المخصصة لي",
"shortcut-show-shortcuts": "عرض قائمة الإختصارات ،تلك",
"shortcut-toggle-filterbar": "Toggle Filter Sidebar",
"shortcut-toggle-searchbar": "Toggle Search Sidebar",
@@ -610,7 +610,7 @@
"has-spenttime-cards": "Has spent time cards",
"time": "الوقت",
"title": "عنوان",
"toggle-assignees": "Toggle assignees 1-9 for card (By order of addition to board).",
"toggle-assignees": "تبديل المخصصين من 1-9 للبطاقة (حسب ترتيب الإضافة إلى اللوحة).",
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
"tracking": "تتبع",
@@ -750,9 +750,9 @@
"deposit-subtasks-list": "Landing list for subtasks deposited here:",
"show-parent-in-minicard": "Show parent in minicard:",
"description-on-minicard": "Description on minicard",
"cover-attachment-on-minicard": "Cover image on minicard",
"badge-attachment-on-minicard": "Count of attachments on minicard",
"card-sorting-by-number-on-minicard": "Card sorting by number on minicard",
"cover-attachment-on-minicard": "صورة الغلاف على البطاقة الصغيرة",
"badge-attachment-on-minicard": "عدد المرفقات على البطاقة الصغيرة",
"card-sorting-by-number-on-minicard": "رز البطاقات حسب الرقم على البطاقة الصغيرة",
"prefix-with-full-path": "Prefix with full path",
"prefix-with-parent": "Prefix with parent",
"subtext-with-full-path": "Subtext with full path",
@@ -865,7 +865,7 @@
"r-items-list": "item1,item2,item3",
"r-add-swimlane": "Add swimlane",
"r-swimlane-name": "swimlane name",
"r-board-note": "Note: leave a field empty to match every possible value. ",
"r-board-note": "ملحوظة: اترك الحقل فارغًا لمطابقة كل قيمة ممكنة.",
"r-checklist-note": "Note: checklist's items have to be written as comma separated values.",
"r-when-a-card-is-moved": "When a card is moved to another list",
"r-set": "Set",
@@ -896,9 +896,9 @@
"oidc-button-text": "Customize the OIDC button text",
"default-authentication-method": "Default Authentication Method",
"duplicate-board": "Duplicate Board",
"org-number": "The number of organizations is: ",
"team-number": "The number of teams is: ",
"people-number": "The number of people is: ",
"org-number": "عدد المنظمات هو:",
"team-number": "عدد الفرق هو:",
"people-number": "عدد الأشخاص هو:",
"swimlaneDeletePopup-title": "Delete Swimlane ?",
"swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
"restore-all": "Restore all",
@@ -966,7 +966,7 @@
"delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has",
"delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list",
"hide-checked-items": "Hide checked items",
"hide-finished-checklist": "Hide finished checklist",
"hide-finished-checklist": "إخفاء قائمة التحقق النهائية",
"task": "Task",
"create-task": "Create Task",
"ok": "OK",
@@ -974,7 +974,7 @@
"teams": "Teams",
"displayName": "Display Name",
"shortName": "Short Name",
"autoAddUsersWithDomainName": "Automatically add users with the domain name",
"autoAddUsersWithDomainName": "إضافة المستخدمين تلقائيًا باستخدام اسم المجال",
"website": "موقع الكتروني",
"person": "شخص",
"my-cards": "My Cards",
@@ -1111,7 +1111,7 @@
"label-names": "Label Names",
"archived-at": "archived at",
"sort-cards": "Sort Cards",
"sort-is-on": "Sort is on",
"sort-is-on": "الفرز قيد التشغيل",
"cardsSortPopup-title": "Sort Cards",
"due-date": "Due Date",
"server-error": "خطأ بالخادم",
@@ -1120,8 +1120,8 @@
"created-at-newest-first": "Created At (Newest First)",
"created-at-oldest-first": "Created At (Oldest First)",
"links-heading": "روابط",
"hide-activities-of-all-boards": "Don't show the board activities on all boards",
"now-activities-of-all-boards-are-hidden": "Now all activities of all boards are hidden",
"hide-activities-of-all-boards": "لا تعرض أنشطة اللوحة على جميع اللوحات",
"now-activities-of-all-boards-are-hidden": "الآن تم إخفاء جميع أنشطة جميع المجالس",
"move-swimlane": "Move Swimlane",
"moveSwimlanePopup-title": "Move Swimlane",
"custom-field-stringtemplate": "String Template",
@@ -1129,7 +1129,7 @@
"custom-field-stringtemplate-separator": "Separator (use &#32; or &nbsp; for a space)",
"custom-field-stringtemplate-item-placeholder": "Press enter to add more items",
"creator": "المنشئ",
"creator-on-minicard": "Creator on minicard",
"creator-on-minicard": "الخالق على بطاقة صغيرة",
"filesReportTitle": "تقارير الملفات",
"reports": "تقارير",
"rulesReportTitle": "Rules Report",
@@ -1204,9 +1204,9 @@
"checklistActionsPopup-title": "Checklist Actions",
"moveChecklist": "Move Checklist",
"moveChecklistPopup-title": "Move Checklist",
"newlineBecomesNewChecklistItem": "Each line of text becomes one of the checklist items",
"newLineNewItem": "One line of text = one checklist item",
"newlineBecomesNewChecklistItemOriginOrder": "Each line of text becomes one of the checklist items, original order",
"newlineBecomesNewChecklistItem": "يصبح كل سطر من النص أحد عناصر قائمة التحقق",
"newLineNewItem": "سطر واحد من النص = عنصر واحد من قائمة التحقق",
"newlineBecomesNewChecklistItemOriginOrder": "يصبح كل سطر من النص أحد عناصر قائمة التحقق، الترتيب الأصلي",
"originOrder": "النظام الأصلي\n ",
"copyChecklist": "Copy Checklist",
"copyChecklistPopup-title": "Copy Checklist",
@@ -1241,32 +1241,32 @@
"minicardDetailsActionsPopup-title": "نقاصيل البطاقة",
"Mongo_sessions_count": "Mongo sessions count",
"change-visibility": "تعديل وضوح الرؤية",
"max-upload-filesize": "Max upload filesize in bytes:",
"allowed-upload-filetypes": "Allowed upload filetypes:",
"max-avatar-filesize": "Max avatar filesize in bytes:",
"allowed-avatar-filetypes": "Allowed avatar filetypes:",
"invalid-file": "If filename is invalid, upload or rename is cancelled.",
"preview-pdf-not-supported": "Your device does not support previewing PDF. Try downloading instead.",
"drag-board": "Drag board",
"translation-number": "The number of custom translation strings is:",
"delete-translation-confirm-popup": "Are you sure you want to delete this custom translation string? There is no undo.",
"newTranslationPopup-title": "New custom translation string",
"editTranslationPopup-title": "Edit custom translation string",
"settingsTranslationPopup-title": "Delete this custom translation string?",
"translation": "Translation",
"max-upload-filesize": "الحد الأقصى لحجم الملف المرفوع بالبايت:",
"allowed-upload-filetypes": "أنواع الملفات المسموح بتحميلها:",
"max-avatar-filesize": "الحد الأقصى لحجم الصورة الرمزية بالبايت:",
"allowed-avatar-filetypes": "أنواع ملفات الصورة الرمزية المسموح بها:",
"invalid-file": "إذا كان اسم الملف غير صالح، فسيتم إلغاء عملية التحميل أو إعادة التسمية.",
"preview-pdf-not-supported": "جهازك لا يدعم معاينة ملفات PDF. حاول تنزيل الملف بدلاً من ذلك.",
"drag-board": "لوحة السحب",
"translation-number": "عدد سلاسل الترجمة المخصصة هو:",
"delete-translation-confirm-popup": "هل أنت متأكد من حذف سلسلة الترجمة المخصصة هذه؟ لا يوجد خيار للتراجع.",
"newTranslationPopup-title": "سلسلة ترجمة مخصصة جديدة",
"editTranslationPopup-title": "تحرير سلسلة الترجمة المخصصة",
"settingsTranslationPopup-title": "حذف سلسلة الترجمة المخصصة هذه؟",
"translation": "ترجمة",
"text": "نص",
"translation-text": "Translation text",
"show-subtasks-field": "Show subtasks field",
"show-week-of-year": "Show week of year (ISO 8601)",
"convert-to-markdown": "Convert to markdown",
"import-board-zip": "Add .zip file that has board JSON files, and board name subdirectories with attachments",
"translation-text": "نص الترجمة",
"show-subtasks-field": "إظهار حقل المهام الفرعية",
"show-week-of-year": "عرض أسبوع السنة (ISO 8601)",
"convert-to-markdown": "تحويل إلى تخفيض السعر",
"import-board-zip": "أضف ملف .zip الذي يحتوي على ملفات JSON الخاصة باللوحة، ودلائل فرعية لأسماء اللوحة مع المرفقات",
"collapse": "انهيار",
"uncollapse": "Uncollapse",
"hideCheckedChecklistItems": "Hide checked checklist items",
"hideAllChecklistItems": "Hide all checklist items",
"support": "Support",
"supportPopup-title": "Support",
"accessibility-page-enabled": "Accessibility page enabled",
"accessibility-title": "Accessibility topic",
"accessibility-content": "Accessibility content"
"uncollapse": "إلغاء الانهيار",
"hideCheckedChecklistItems": "إخفاء عناصر قائمة التحقق المحددة",
"hideAllChecklistItems": "إخفاء جميع عناصر قائمة التحقق",
"support": "دعم",
"supportPopup-title": "دعم",
"accessibility-page-enabled": "تم تمكين صفحة إمكانية الوصول",
"accessibility-title": "موضوع إمكانية الوصول",
"accessibility-content": "محتوى إمكانية الوصول"
}
+21 -21
View File
@@ -14,7 +14,7 @@
"act-removeChecklistItem": "移除看板 __board__ 中的泳道 __swimlane__ 中的列表 __list__ 中的卡片 __card__ 中的清单 __checklist__ 清单项 __checklistItem__",
"act-checkedItem": "选中看板 __board__ 中的泳道 __swimlane__ 中的列表 __list__ 中的卡片 __card__ 中的清单 __checklist__ 的清单项 __checklistItem__",
"act-uncheckedItem": "反选看板 __board__ 中的泳道 __swimlane__ 中的列表 __list__ 中的卡片 __card__ 中的清单 __checklist__ 的清单项 __checklistItem__",
"act-completeChecklist": "完成检查列表 __checklist__ 卡片 __card__ 列表 __list__ 泳道 __swimlane__ 看板 __board__",
"act-completeChecklist": "完成清单 __checklist__ 卡片 __card__ 列表 __list__ 泳道 __swimlane__ 看板 __board__",
"act-uncompleteChecklist": "看板 __board__ 中的泳道 __swimlane__ 中的列表 __list__ 中的卡片 __card__ 中的清单 __checklist__ 未完成",
"act-addComment": "对看板 __board__ 中的泳道 __swimlane__ 中的列表 __list__ 中的卡片 __card__ 发表了评论: __comment__",
"act-editComment": "编辑卡片中的评论:看板__board__中的泳道__swimlane__中的列表__list__中的评论__comment__",
@@ -86,12 +86,12 @@
"add-card": "添加卡片",
"add-card-to-top-of-list": "添加卡片到列表顶部",
"add-card-to-bottom-of-list": "添加卡片到列表底部",
"setListWidthPopup-title": "Set Widths",
"set-list-width": "Set Widths",
"set-list-width-value": "Set Min & Max Widths (pixels)",
"list-width-error-message": "List widths must be integers greater than 100",
"keyboard-shortcuts-enabled": "Keyboard shortcuts enabled. Click to disable.",
"keyboard-shortcuts-disabled": "Keyboard shortcuts disabled. Click to enable.",
"setListWidthPopup-title": "设定宽度",
"set-list-width": "设定宽度",
"set-list-width-value": "设定最小与最大宽度(像素)",
"list-width-error-message": "列表宽度必须为大于100的整数",
"keyboard-shortcuts-enabled": "已启用键盘快捷键。点选已停用。",
"keyboard-shortcuts-disabled": "已停用键盘快捷键。点选已启用。",
"setSwimlaneHeightPopup-title": "设置泳道高度",
"set-swimlane-height": "设置泳道高度",
"set-swimlane-height-value": "泳道高度(px)",
@@ -266,9 +266,9 @@
"checklists": "清单",
"click-to-star": "点此来标记该看板",
"click-to-unstar": "点此来去除该看板的标记",
"click-to-enable-auto-width": "Auto list width disabled. Click to enable.",
"click-to-disable-auto-width": "Auto list width enabled. Click to disable.",
"auto-list-width": "Auto list width",
"click-to-enable-auto-width": "已停用自动列表宽度。点选已启用。",
"click-to-disable-auto-width": "已启用自动列表宽度。点选已停用。",
"auto-list-width": "自动列表宽度",
"clipboard": "剪贴板或者拖放文件",
"close": "关闭",
"close-board": "关闭看板",
@@ -383,7 +383,7 @@
"email-sent": "邮件已发送",
"email-verifyEmail-subject": "在 __siteName__ 验证您的邮件地址",
"email-verifyEmail-text": "尊敬的 __user__,\n\n点击下面的链接,验证您的邮件地址:\n\n__url__\n\n谢谢。",
"enable-vertical-scrollbars": "Enable vertical scrollbars",
"enable-vertical-scrollbars": "启用垂直滚动条",
"enable-wip-limit": "启用最大任务数限制",
"error-board-doesNotExist": "该看板不存在",
"error-board-notAdmin": "需要成为管理员才能执行此操作",
@@ -580,7 +580,7 @@
"select-board": "选择看板",
"set-wip-limit-value": "设置此列表中的最大任务数",
"setWipLimitPopup-title": "设置最大任务数",
"shortcut-add-self": "Add yourself to current card",
"shortcut-add-self": "将您新增至目前的卡片",
"shortcut-assign-self": "指派当前卡片给自己",
"shortcut-autocomplete-emoji": "表情符号自动补全",
"shortcut-autocomplete-members": "自动补全成员",
@@ -610,7 +610,7 @@
"has-spenttime-cards": "耗时卡",
"time": "时间",
"title": "标题",
"toggle-assignees": "Toggle assignees 1-9 for card (By order of addition to board).",
"toggle-assignees": "切换卡片的代理人 1-9(按加入看板的顺序)。",
"toggle-labels": "切换卡片标签1-9,多选添加标签1-9",
"remove-labels-multiselect": "多选移除标签1-9",
"tracking": "跟踪",
@@ -1257,16 +1257,16 @@
"text": "文本",
"translation-text": "翻译文本",
"show-subtasks-field": "显示子任务字段",
"show-week-of-year": "Show week of year (ISO 8601)",
"show-week-of-year": "显示年度周数(ISO 8601)",
"convert-to-markdown": "转换成markdown",
"import-board-zip": "Add .zip file that has board JSON files, and board name subdirectories with attachments",
"import-board-zip": "新增包含看板 JSON文件与帶有附件的看板名称子目录的 .zip文件",
"collapse": "崩溃",
"uncollapse": "展开",
"hideCheckedChecklistItems": "隐藏勾选的清单项",
"hideAllChecklistItems": "Hide all checklist items",
"support": "Support",
"supportPopup-title": "Support",
"accessibility-page-enabled": "Accessibility page enabled",
"accessibility-title": "Accessibility topic",
"accessibility-content": "Accessibility content"
"hideAllChecklistItems": "隐藏所有待办清单项目",
"support": "支持",
"supportPopup-title": "支持",
"accessibility-page-enabled": "已启用无障碍页面",
"accessibility-title": "无障碍主题",
"accessibility-content": "无障碍内容"
}
+7 -10
View File
@@ -2,16 +2,13 @@ import { TAPi18n } from './tap';
import './accounts';
import './moment';
export { TAPi18n };
if (Meteor.isClient) {
(async () => {
await import('./blaze');
await TAPi18n.init();
})();
} else {
(async () => {
await TAPi18n.init();
})();
import './blaze';
}
export { TAPi18n };
(async () => {
await TAPi18n.init();
})();
+9 -20
View File
@@ -275,22 +275,18 @@ if (Meteor.isServer) {
url: FlowRouter.url('sign-up'),
};
const lang = author.getLanguage();
/*
if (process.env.MAIL_SERVICE !== '') {
let transporter = nodemailer.createTransport({
service: process.env.MAIL_SERVICE,
auth: {
user: process.env.MAIL_SERVICE_USER,
pass: process.env.MAIL_SERVICE_PASSWORD
},
})
let info = transporter.sendMail({
// Use EmailLocalization utility to handle email in the proper language
if (typeof EmailLocalization !== 'undefined') {
EmailLocalization.sendEmail({
to: icode.email,
from: Accounts.emailTemplates.from,
subject: TAPi18n.__('email-invite-register-subject', params, lang),
text: TAPi18n.__('email-invite-register-text', params, lang),
})
subject: 'email-invite-register-subject',
text: 'email-invite-register-text',
params: params,
language: lang
});
} else {
// Fallback if EmailLocalization is not available
Email.send({
to: icode.email,
from: Accounts.emailTemplates.from,
@@ -298,13 +294,6 @@ if (Meteor.isServer) {
text: TAPi18n.__('email-invite-register-text', params, lang),
});
}
*/
Email.send({
to: icode.email,
from: Accounts.emailTemplates.from,
subject: TAPi18n.__('email-invite-register-subject', params, lang),
text: TAPi18n.__('email-invite-register-text', params, lang),
});
} catch (e) {
InvitationCodes.remove(_id);
throw new Meteor.Error('email-fail', e.message);
+44 -55
View File
@@ -1618,62 +1618,51 @@ if (Meteor.isServer) {
subBoard.addMember(user._id);
user.addInvite(subBoard._id);
}
}
} try {
const fullName =
inviter.profile !== undefined &&
inviter.profile.fullname !== undefined
? inviter.profile.fullname
: '';
const userFullName =
user.profile !== undefined && user.profile.fullname !== undefined
? user.profile.fullname
: '';
const params = {
user:
userFullName != ''
? userFullName + ' (' + user.username + ' )'
: user.username,
inviter:
fullName != ''
? fullName + ' (' + inviter.username + ' )'
: inviter.username,
board: board.title,
url: board.absoluteUrl(),
};
// Get the recipient user's language preference for the email
const lang = user.getLanguage();
try {
const fullName =
inviter.profile !== undefined &&
inviter.profile.fullname !== undefined
? inviter.profile.fullname
: '';
const userFullName =
user.profile !== undefined && user.profile.fullname !== undefined
? user.profile.fullname
: '';
const params = {
user:
userFullName != ''
? userFullName + ' (' + user.username + ' )'
: user.username,
inviter:
fullName != ''
? fullName + ' (' + inviter.username + ' )'
: inviter.username,
board: board.title,
url: board.absoluteUrl(),
};
const lang = user.getLanguage();
/*
if (process.env.MAIL_SERVICE !== '') {
let transporter = nodemailer.createTransport({
service: process.env.MAIL_SERVICE,
auth: {
user: process.env.MAIL_SERVICE_USER,
pass: process.env.MAIL_SERVICE_PASSWORD
},
})
let info = transporter.sendMail({
to: user.emails[0].address.toLowerCase(),
from: Accounts.emailTemplates.from,
subject: TAPi18n.__('email-invite-subject', params, lang),
text: TAPi18n.__('email-invite-text', params, lang),
})
} else {
Email.send({
to: user.emails[0].address.toLowerCase(),
from: Accounts.emailTemplates.from,
subject: TAPi18n.__('email-invite-subject', params, lang),
text: TAPi18n.__('email-invite-text', params, lang),
});
}
*/
Email.send({
to: user.emails[0].address.toLowerCase(),
from: Accounts.emailTemplates.from,
subject: TAPi18n.__('email-invite-subject', params, lang),
text: TAPi18n.__('email-invite-text', params, lang),
});
// Add code to send invitation with EmailLocalization
if (typeof EmailLocalization !== 'undefined') {
EmailLocalization.sendEmail({
to: user.emails[0].address,
from: Accounts.emailTemplates.from,
subject: 'email-invite-subject',
text: 'email-invite-text',
params: params,
language: lang,
userId: user._id
});
} else {
// Fallback if EmailLocalization is not available
Email.send({
to: user.emails[0].address,
from: Accounts.emailTemplates.from,
subject: TAPi18n.__('email-invite-subject', params, lang),
text: TAPi18n.__('email-invite-text', params, lang),
});
}
} catch (e) {
throw new Meteor.Error('email-fail', e.message);
}
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "wekan",
"version": "v7.87.0",
"version": "v7.89.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "wekan",
"version": "v7.87.0",
"version": "v7.89.0",
"description": "Open-Source kanban",
"private": true,
"repository": {
+2 -2
View File
@@ -1524,7 +1524,7 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
<ul class="toc-list-h1">
<li>
<a href="#wekan-rest-api" class="toc-h1 toc-link" data-title="Wekan REST API v7.87">Wekan REST API v7.87</a>
<a href="#wekan-rest-api" class="toc-h1 toc-link" data-title="Wekan REST API v7.89">Wekan REST API v7.89</a>
</li>
@@ -1963,7 +1963,7 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
<div class="page-wrapper">
<div class="dark-box"></div>
<div class="content">
<h1 id="wekan-rest-api">Wekan REST API v7.87</h1>
<h1 id="wekan-rest-api">Wekan REST API v7.89</h1>
<blockquote>
<p>Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.</p>
</blockquote>
+1 -1
View File
@@ -1,7 +1,7 @@
swagger: '2.0'
info:
title: Wekan REST API
version: v7.87
version: v7.89
description: |
The REST API allows you to control and extend Wekan with ease.
+18
View File
@@ -0,0 +1,18 @@
#!/bin/bash
if [ $# -ne 1 ]
then
echo "Use: snapcraft login"
echo "Then use version number:"
echo " ./releases/snap-build-push-edge-candidate.sh 7.88"
exit 1
fi
sudo apt -y install snapd
sudo systemctl enable snapd
sudo systemctl start snapd
sudo snap install snapcraft --classic
sudo snap install multipass
multipass launch --name ubu
snapcraft
snapcraft upload --release=candidate,edge wekan_$1_amd64.snap
+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 = 787,
appVersion = 789,
# Increment this for every release.
appMarketingVersion = (defaultText = "7.87.0~2025-04-25"),
appMarketingVersion = (defaultText = "7.89.0~2025-05-13"),
# Human-readable presentation of the app version.
minUpgradableAppVersion = 0,
+58
View File
@@ -0,0 +1,58 @@
// emailLocalization.js
// Utility functions to handle email localization in Wekan
import { TAPi18n } from '/imports/i18n';
import { ReactiveCache } from '/imports/reactiveCache';
// Main object for email localization utilities
EmailLocalization = {
/**
* Send an email using the recipient's preferred language
* @param {Object} options - Standard email sending options plus language options
* @param {String} options.to - Recipient email address
* @param {String} options.from - Sender email address
* @param {String} options.subject - Email subject i18n key
* @param {String} options.text - Email text i18n key
* @param {Object} options.params - Parameters for i18n translation
* @param {String} options.language - Language code to use (if not provided, will try to detect)
* @param {String} options.userId - User ID to determine language (if not provided with language)
*/
sendEmail(options) {
// Determine the language to use
let lang = options.language;
// If no language is specified but we have a userId, try to get the user's language
if (!lang && options.userId) {
const user = ReactiveCache.getUser(options.userId);
if (user) {
lang = user.getLanguage();
}
}
// If no language could be determined, use the site default
if (!lang) {
lang = TAPi18n.getLanguage() || 'en';
}
// Translate subject and text using the determined language
const subject = TAPi18n.__(options.subject, options.params || {}, lang);
let text = options.text;
// If text is an i18n key, translate it
if (typeof text === 'string' && text.startsWith('email-')) {
text = TAPi18n.__(text, options.params || {}, lang);
}
// Send the email with translated content
return Email.send({
to: options.to,
from: options.from || Accounts.emailTemplates.from,
subject: subject,
text: text,
html: options.html
});
}
};
// Add module.exports to make it accessible from other files
module.exports = EmailLocalization;
+4
View File
@@ -0,0 +1,4 @@
// This file ensures the EmailLocalization utility is imported
// and available throughout the application
import './emailLocalization';
+7 -25
View File
@@ -2,6 +2,8 @@ import { ReactiveCache } from '/imports/reactiveCache';
import { TAPi18n } from '/imports/i18n';
//var nodemailer = require('nodemailer');
import EmailLocalization from '../lib/emailLocalization';
// buffer each user's email text in a queue, then flush them in single email
Meteor.startup(() => {
Notifications.subscribe('email', (user, title, description, params) => {
@@ -14,6 +16,7 @@ Meteor.startup(() => {
quoteParams[key] = quoteParams[key] ? `${params[key]}` : '';
});
// Get user's preferred language
const lan = user.getLanguage();
const subject = TAPi18n.__(title, params, lan); // the original function has a fault, i believe the title should be used according to original author
const existing = user.getEmailBuffer().length > 0;
@@ -42,35 +45,14 @@ Meteor.startup(() => {
const html = texts.join('<br/>\n\n');
user.clearEmailBuffer();
try {
/*
if (process.env.MAIL_SERVICE !== '') {
let transporter = nodemailer.createTransport({
service: process.env.MAIL_SERVICE,
auth: {
user: process.env.MAIL_SERVICE_USER,
pass: process.env.MAIL_SERVICE_PASSWORD
},
})
let info = transporter.sendMail({
to: user.emails[0].address.toLowerCase(),
from: Accounts.emailTemplates.from,
subject,
html,
})
} else {
Email.send({
to: user.emails[0].address.toLowerCase(),
from: Accounts.emailTemplates.from,
subject,
html,
});
}
*/
Email.send({
// Use EmailLocalization utility to ensure the correct language is used
EmailLocalization.sendEmail({
to: user.emails[0].address.toLowerCase(),
from: Accounts.emailTemplates.from,
subject,
html,
language: user.getLanguage(),
userId: user._id
});
} catch (e) {
return;
+20 -18
View File
@@ -125,22 +125,31 @@ RulesHelper = {
const text = action.emailMsg || '';
const subject = action.emailSubject || '';
try {
/*
if (process.env.MAIL_SERVICE !== '') {
let transporter = nodemailer.createTransport({
service: process.env.MAIL_SERVICE,
auth: {
user: process.env.MAIL_SERVICE_USER,
pass: process.env.MAIL_SERVICE_PASSWORD
},
})
let info = transporter.sendMail({
// Try to detect the recipient's language preference if it's a Wekan user
// Otherwise, use the default language for the rule-triggered emails
let recipientUser = null;
let recipientLang = TAPi18n.getLanguage() || 'en';
// Check if recipient is a Wekan user to get their language
if (to && to.includes('@')) {
recipientUser = ReactiveCache.getUser({ 'emails.address': to.toLowerCase() });
if (recipientUser && typeof recipientUser.getLanguage === 'function') {
recipientLang = recipientUser.getLanguage();
}
}
// Use EmailLocalization if available
if (typeof EmailLocalization !== 'undefined') {
EmailLocalization.sendEmail({
to,
from: Accounts.emailTemplates.from,
subject,
text,
})
language: recipientLang,
userId: recipientUser ? recipientUser._id : null
});
} else {
// Fallback to standard Email.send
Email.send({
to,
from: Accounts.emailTemplates.from,
@@ -148,13 +157,6 @@ RulesHelper = {
text,
});
}
*/
Email.send({
to,
from: Accounts.emailTemplates.from,
subject,
text,
});
} catch (e) {
// eslint-disable-next-line no-console
console.error(e);
+5 -5
View File
@@ -1,5 +1,5 @@
name: wekan
version: '7.87'
version: '7.89'
base: core20
summary: Open Source kanban
description: |
@@ -65,7 +65,7 @@ apps:
parts:
mongodb:
source: https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu2004-6.0.22.tgz
source: https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu2004-6.0.23.tgz
plugin: dump
stage-packages:
- libssl1.1
@@ -170,9 +170,9 @@ parts:
# Cleanup
mkdir .build
cd .build
wget https://github.com/wekan/wekan/releases/download/v7.87/wekan-7.87-amd64.zip
unzip wekan-7.87-amd64.zip
rm wekan-7.87-amd64.zip
wget https://github.com/wekan/wekan/releases/download/v7.89/wekan-7.89-amd64.zip
unzip wekan-7.89-amd64.zip
rm wekan-7.89-amd64.zip
cd ..
##cd .build/bundle
##find . -type d -name '*-garbage*' | xargs rm -rf