Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b7d9af9ae7 | ||
|
|
0046b3c802 | ||
|
|
25384c8ac3 | ||
|
|
2eee72da8a | ||
|
|
d65c422e3f | ||
|
|
2ab9bd3172 | ||
|
|
a0b5c2e88c | ||
|
|
0bd4108661 | ||
|
|
7d1a1475ba | ||
|
|
6418263165 | ||
|
|
b32c835cf9 | ||
|
|
a927685bc6 | ||
|
|
6827d40e84 | ||
|
|
9aa12b0eb6 | ||
|
|
8ca1a36d78 | ||
|
|
394f2eae69 | ||
|
|
7588459c3e | ||
|
|
2c33f45a6a | ||
|
|
43cf0b66ac | ||
|
|
c05f6fcff2 | ||
|
|
a4eb32158b | ||
|
|
072ced9d0e | ||
|
|
c5fefc1414 | ||
|
|
c825895ceb |
No files matched your search
@@ -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' }}
|
||||
|
||||
@@ -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,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
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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   or 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": "محتوى إمكانية الوصول"
|
||||
}
|
||||
@@ -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
@@ -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
@@ -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
@@ -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);
|
||||
}
|
||||
|
||||
Generated
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "wekan",
|
||||
"version": "v7.87.0",
|
||||
"version": "v7.89.0",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "wekan",
|
||||
"version": "v7.87.0",
|
||||
"version": "v7.89.0",
|
||||
"description": "Open-Source kanban",
|
||||
"private": true,
|
||||
"repository": {
|
||||
|
||||
@@ -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,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.
|
||||
|
||||
|
||||
Executable
+18
@@ -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
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
@@ -0,0 +1,4 @@
|
||||
// This file ensures the EmailLocalization utility is imported
|
||||
// and available throughout the application
|
||||
|
||||
import './emailLocalization';
|
||||
@@ -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
@@ -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
@@ -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
|
||||
|
||||
Reference in new issue
Block a user