Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c0d44a8686 | ||
|
|
a1700f38b1 | ||
|
|
b82ba63532 | ||
|
|
dbd1324a90 | ||
|
|
e52158b729 | ||
|
|
68a717cf47 | ||
|
|
c0a9780f80 | ||
|
|
0520129a40 | ||
|
|
6b36e126ab | ||
|
|
3cb4662363 | ||
|
|
cef14f301f | ||
|
|
eca4a0c440 | ||
|
|
cea04b2ada | ||
|
|
b7d9af9ae7 | ||
|
|
0046b3c802 | ||
|
|
25384c8ac3 | ||
|
|
2eee72da8a | ||
|
|
d65c422e3f | ||
|
|
2ab9bd3172 | ||
|
|
a0b5c2e88c | ||
|
|
0bd4108661 | ||
|
|
7d1a1475ba | ||
|
|
6418263165 | ||
|
|
b32c835cf9 | ||
|
|
a927685bc6 | ||
|
|
6827d40e84 | ||
|
|
9aa12b0eb6 | ||
|
|
8ca1a36d78 | ||
|
|
394f2eae69 | ||
|
|
7588459c3e | ||
|
|
2c33f45a6a | ||
|
|
43cf0b66ac | ||
|
|
c05f6fcff2 | ||
|
|
a4eb32158b | ||
|
|
072ced9d0e | ||
|
|
c5fefc1414 | ||
|
|
c825895ceb | ||
|
|
9488972ed8 | ||
|
|
1f4bed38f7 | ||
|
|
747112957a | ||
|
|
18228096f9 | ||
|
|
d0ea5bf500 | ||
|
|
74fe91fa3a | ||
|
|
d4e3075fcc | ||
|
|
413ae5f20e | ||
|
|
e23f86f542 | ||
|
|
b3c47dbe84 | ||
|
|
b10c2b9a15 | ||
|
|
bb6910acd1 | ||
|
|
76b000820e | ||
|
|
50b874629c | ||
|
|
4d145ab4ad | ||
|
|
4d67a4641f | ||
|
|
bc2eab6f9d | ||
|
|
3ccce75863 | ||
|
|
b390b266e2 | ||
|
|
561af8926c | ||
|
|
5717dc2cf4 | ||
|
|
d0e64ad6d2 | ||
|
|
8e1a735ec7 | ||
|
|
1301d67295 | ||
|
|
7c239f5218 | ||
|
|
61235c953c | ||
|
|
ea65a0308d | ||
|
|
f840b07c02 | ||
|
|
8af719d39e | ||
|
|
c1a4250bd2 | ||
|
|
b4b442f8a8 | ||
|
|
b7e76fcfa1 | ||
|
|
01950cc796 | ||
|
|
14f2022e21 | ||
|
|
23bac73559 | ||
|
|
2de9b94b01 | ||
|
|
05d1736f5f | ||
|
|
db5346fc5c | ||
|
|
f09f5bd737 | ||
|
|
d96a1a5c9e | ||
|
|
ad3cc9c087 | ||
|
|
d0c7bf65a4 | ||
|
|
bb6ac70f63 | ||
|
|
c38b9da7d6 | ||
|
|
19153ca489 | ||
|
|
8e7a5e8cb5 | ||
|
|
1407059937 | ||
|
|
a2911bc9c3 | ||
|
|
f99b735746 | ||
|
|
4510ddda15 | ||
|
|
028ec46f46 | ||
|
|
c0e4e01deb | ||
|
|
cfcf682134 | ||
|
|
27bd9817d7 | ||
|
|
dc389a68ab | ||
|
|
6d982cdfd9 | ||
|
|
827ee615c1 | ||
|
|
f5f0ba721e | ||
|
|
1344f85986 | ||
|
|
e7462ada12 | ||
|
|
11199b6225 | ||
|
|
345aece0f2 | ||
|
|
912c84422b | ||
|
|
b402676079 | ||
|
|
908a5fc60d | ||
|
|
38e57d3635 | ||
|
|
14167b19b9 | ||
|
|
fc548b426d | ||
|
|
094f13934c | ||
|
|
71acd9603e | ||
|
|
341f655ab7 | ||
|
|
0c5323c106 | ||
|
|
7f871fdf30 | ||
|
|
6347b40a02 | ||
|
|
bce84a432a | ||
|
|
b6fc4deb63 | ||
|
|
6b48f9e259 | ||
|
|
44b7666426 | ||
|
|
ef70ed76a2 | ||
|
|
a1a1b3d1ee | ||
|
|
0326757399 | ||
|
|
edbc8ed92b | ||
|
|
07e9ec0617 | ||
|
|
18d0fa4327 | ||
|
|
666ee84033 | ||
|
|
120642f47d | ||
|
|
148b81262d | ||
|
|
c41467f76e | ||
|
|
c83e83b8b1 | ||
|
|
563a508e26 | ||
|
|
1d8347cc23 | ||
|
|
874abf2c41 | ||
|
|
3e18f820ea | ||
|
|
b571f1c953 | ||
|
|
fd69c7ceb8 | ||
|
|
d15faa1890 | ||
|
|
0c7e12c5e7 | ||
|
|
36a3077853 | ||
|
|
51bc23dbd9 | ||
|
|
0b1e0bd395 | ||
|
|
151aafd114 | ||
|
|
16c8a65a1c | ||
|
|
f3133e9cd8 | ||
|
|
de84aa7674 | ||
|
|
1bdbfe86bb | ||
|
|
397b9f439e | ||
|
|
261e0aee0f | ||
|
|
a6d9bde658 | ||
|
|
8d0a07e1a8 | ||
|
|
659615e6f2 | ||
|
|
9f0b82c0d5 |
No files matched your search
@@ -38,7 +38,7 @@ jobs:
|
||||
# https://github.com/docker/login-action
|
||||
- name: Log into registry ${{ env.REGISTRY }}
|
||||
if: github.event_name != 'pull_request'
|
||||
uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567
|
||||
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772
|
||||
with:
|
||||
registry: ${{ env.REGISTRY }}
|
||||
username: ${{ github.actor }}
|
||||
@@ -48,14 +48,14 @@ jobs:
|
||||
# https://github.com/docker/metadata-action
|
||||
- name: Extract Docker metadata
|
||||
id: meta
|
||||
uses: docker/metadata-action@369eb591f429131d6889c46b94e711f089e6ca96
|
||||
uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804
|
||||
with:
|
||||
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
||||
|
||||
# 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@48aba3b46d1b1fec4febb7c5d0c644b249a11355
|
||||
uses: docker/build-push-action@14487ce63c7a62a4a324b0bfb37086795e31c6c1
|
||||
with:
|
||||
context: .
|
||||
push: ${{ github.event_name != 'pull_request' }}
|
||||
|
||||
@@ -25,6 +25,6 @@ jobs:
|
||||
git config user.email "$GITHUB_ACTOR@users.noreply.github.com"
|
||||
|
||||
- name: Run chart-releaser
|
||||
uses: helm/chart-releaser-action@v1.6.0
|
||||
uses: helm/chart-releaser-action@v1.7.0
|
||||
env:
|
||||
CR_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
|
||||
+210
@@ -15,6 +15,216 @@ Fixing other platforms In Progress.
|
||||
|
||||
[How to upgrade WeKan](https://github.com/wekan/wekan/issues/4585)
|
||||
|
||||
# v7.90 2025-05-14 WeKan ® release
|
||||
|
||||
This release fixes the following bugs:
|
||||
|
||||
- [Fix Due Date Problem in Non-English Numbers](https://github.com/wekan/wekan/pull/5774).
|
||||
Thanks to valhalla-creator.
|
||||
- [Added missing quotes to Fix Due Date Problem in Non-English Numbers](https://github.com/wekan/wekan/commit/c0a9780f803ed445a93a274d13504a8f245c1885).
|
||||
Thanks to xet7.
|
||||
- [Changed start.bat default ROOT_URL=http://localhost , although it only works for local user](https://github.com/wekan/wekan/commit/e52158b729c8ba39a55fe52e38fd6b134b42548e).
|
||||
Thanks to xet7.
|
||||
- [Fix Lines in multiline markdown code block to not anymore have darker background](https://github.com/wekan/wekan/commit/b82ba63532b32ec3a0c860a380648cef6739db0f).
|
||||
Thanks to mueller-ma and xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.89 2025-05-13 WeKan ® release
|
||||
|
||||
Note: Docker image is only at ghcr.io (GitHub) and Docker Hub (wekanteam/wekan).
|
||||
Quay.io is at read only mode, they are fixing something, so it's not possible to
|
||||
push Docker image yet to quay.io .
|
||||
|
||||
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.
|
||||
- [Add missing code of fix insertion order of list](https://github.com/wekan/wekan/commit/7d1a1475baefb3fd20da3df835c349a62b425041).
|
||||
Thanks to xet7.
|
||||
- [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).
|
||||
Thanks to xet7.
|
||||
- [Fix more contrasting issues](https://github.com/wekan/wekan/pull/5750).
|
||||
Thanks to walster001.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.86 2025-04-25 WeKan ® release
|
||||
|
||||
Note: This release does not work, there is typos. Use newest release.
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
- [Improve impersonate user documentation in docs/Admin/Impersonate-user.md](https://github.com/wekan/wekan/pull/5746).
|
||||
Thanks to nourguidara.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Add toggle watch icon on card. Add questions are you sure to duplicate board and archive board](https://github.com/wekan/wekan/pull/5745).
|
||||
Thanks to Rayene123.
|
||||
- [Fix translations not working](https://github.com/wekan/wekan/pull/5748).
|
||||
Thanks to nourguidara.
|
||||
- [Fix contrast issue checkbox at Exodark theme](https://github.com/wekan/wekan/pull/5749).
|
||||
Thanks to walster001.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.85 2025-04-21 WeKan ® release
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
- Updated Browser compatibility matrix, adding Iris browser at RISC OS Direct, and fixing links.
|
||||
[Part1](https://github.com/wekan/wekan/commit/db5346fc5c7407160f381c0fcf4a87204206ed55),
|
||||
[Part2](https://github.com/wekan/wekan/commit/05d1736f5f21e93e83b2e25029c6cab6c5106398).
|
||||
Thanks to xet7.
|
||||
- [Updated to MongoDB 6.0.22](https://github.com/wekan/wekan/commit/c1a4250bd2e26be5549704234a3cfb5306120352).
|
||||
Thanks to MongoDB developers.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fix board sidebar menu doesn't open in mobile](https://github.com/wekan/wekan/commit/01950cc796697fa201ac9e4376cb204d308e8181).
|
||||
Thanks to mimZD and xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.84 2025-03-23 WeKan ® release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [Time on minicard for Start/End/Due Date](https://github.com/wekan/wekan/pull/5712).
|
||||
Thanks to Rayene123.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- [Added developer docs about Login code](https://github.com/wekan/wekan/commit/c0e4e01deb936653df69b4fd21598ac27cd349a0).
|
||||
Thanks to xet7.
|
||||
- Updated dependencies.
|
||||
[Part 1](https://github.com/wekan/wekan/pull/5718),
|
||||
[Part 2](https://github.com/wekan/wekan/commit/bb6ac70f63b6f3568b7c943417c698615936a956).
|
||||
Thanks to developers of dependencies.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fixed typo at Shortcuts, now became visible translations of assignees visibility 1-9 shortcuts](https://github.com/wekan/wekan/commit/4510ddda1507bc775b9523d3673adba48d7a8385).
|
||||
Thanks to xet7.
|
||||
- [Fixed building OpenAPI docs](https://github.com/wekan/wekan/commit/a2911bc9c3bd94ef583388931d2cd354cc8657e3).
|
||||
Thanks to xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.83 2025-03-08 WeKan ® release
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
- [Adding Development information to readme](https://github.com/wekan/wekan/pull/5702).
|
||||
Thanks to adam-fu.
|
||||
- Updated GitHub actions.
|
||||
[Part 1](https://github.com/wekan/wekan/pull/5703),
|
||||
[Part 2](https://github.com/wekan/wekan/pull/5704).
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Removed siteurl from manifest to fix browser console error about not matching URL](https://github.com/wekan/wekan/commit/b402676079517e463ed291285f69c04126a00975).
|
||||
Thanks to xet7.
|
||||
- [Exception while invoking method 'copyCard' TypeError: Cannot read property 'name' of undefined](https://github.com/wekan/wekan/pull/5711).
|
||||
Thanks to Firas-Git.
|
||||
- [Comment out error message of non-existing Custom Field](https://github.com/wekan/wekan/commit/908a5fc60d5d574a36d4bfd496d3a16fd267ae75).
|
||||
Thanks to xet7.
|
||||
- [Reverted Docker changes of WeKan v7.68 to get WeKan Docker version working](https://github.com/wekan/wekan/commit/e7462ada12ec8edfd08d6c3b3a97a034211d51eb).
|
||||
Thanks to xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.82 2025-02-24 WeKan ® release
|
||||
|
||||
v7.82 Docker version is broken: https://github.com/wekan/wekan/issues/5697 . Snap Candidate works.
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [Add possibility to use a token in place of ipaddress to access metrics route](https://github.com/wekan/wekan/pull/5682).
|
||||
Thanks to salleman33.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- [Updated dependencies](https://github.com/wekan/wekan/pull/5691).
|
||||
Thanks to dependabot.
|
||||
- [Updated requirements at docs](https://github.com/wekan/wekan/commit/148b81262d0d143460e881d645fefa6740aae40d).
|
||||
Thanks to mueller-ma.
|
||||
- [Updated dependencies](https://github.com/wekan/wekan/commit/666ee8403388f7d5e1a30cf0e53bc46a70bf1c40).
|
||||
Thanks to developes of dependencies.
|
||||
- [Fixed building WeKan. Updated dompurify. Forked Meteor 2.14 version of meteor-node-stubs to update elliptic](https://github.com/wekan/wekan/commit/18d0fa43275cd2955dd6416213e316ca08a62255).
|
||||
Thanks to developers of depedencies and xet7.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Added missing ) character](https://github.com/wekan/wekan/commit/563a508e269be87eb713e2888409525e1ba82001).
|
||||
Thanks to xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.81 2025-02-07 WeKan ® release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [Helm Chart: Added secretManaged value for enabling or disabling the creation of secret by Helm](https://github.com/wekan/charts/pull/39).
|
||||
Thanks to salleman33.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- [Updated Docker Actions](https://github.com/wekan/wekan/pull/5670).
|
||||
Thanks to dependabot.
|
||||
- [Added Meteor 3.1 learning course to docs](https://github.com/wekan/wekan/commit/0c7e12c5e7f322bdbaaa61100e66153dd0b92e4d).
|
||||
Thanks to producer of learning course.
|
||||
- [Upgraded to MongoDB 6.0.20 at Snap Candidate](https://github.com/wekan/wekan/commit/b571f1c9530b899db75bf28a03c18277a9b77cb8).
|
||||
Thanks to MongoDB developers.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fixed env variable METRICS_ACCEPTED_IP_ADDRESS to be same as at docs](https://github.com/wekan/wekan/commit/0b1e0bd39569175668c195b63dde91bf0e6f1b24).
|
||||
Thanks to salleman33.
|
||||
- [Fixed misspelling of hours at env variable setting LDAP_BACKGROUND_SYNC_INTERVAL](https://github.com/wekan/wekan/commit/36a307785369337a788499065f64175971878930).
|
||||
Thanks to hubermam.
|
||||
- [Helm Chart: Restore pod security context in deployment](https://github.com/wekan/charts/pull/40).
|
||||
Thanks to adalinesimonian.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.80 2025-01-12 WeKan ® release
|
||||
|
||||
This release fixes the following bugs:
|
||||
|
||||
+133
-95
@@ -1,76 +1,31 @@
|
||||
FROM scratch AS downloads
|
||||
|
||||
# Download NodeJS bundle
|
||||
ADD https://static.meteor.com/dev-bundle-node-os/v14.21.4/node-v14.21.4-linux-x64.tar.gz node.tar.gz
|
||||
|
||||
# Download Meteor bundle
|
||||
ADD https://static.meteor.com/packages-bootstrap/2.16/meteor-bootstrap-os.linux.x86_64.tar.gz meteor.tar.gz
|
||||
|
||||
FROM ubuntu:24.04 AS build
|
||||
|
||||
# Install node from official archive
|
||||
RUN --mount=type=bind,from=downloads,source=node.tar.gz,target=node.tar.gz \
|
||||
tar xzf node.tar.gz --strip-components=1 --keep-old-files --no-same-owner
|
||||
|
||||
# Install meteor from official archive
|
||||
RUN --mount=type=bind,from=downloads,source=meteor.tar.gz,target=meteor.tar.gz \
|
||||
tar xzf meteor.tar.gz -C $HOME --no-same-owner
|
||||
|
||||
# Update the npm version
|
||||
RUN npm install -g npm@6.14.17
|
||||
|
||||
# Install several build dependencies
|
||||
RUN apt update && \
|
||||
apt install --yes --no-install-suggests --no-install-recommends ssh git g++ curl ca-certificates && \
|
||||
rm -r /var/lib/apt/lists
|
||||
|
||||
# Change to temporary working directory
|
||||
WORKDIR /workdir
|
||||
|
||||
# Copy package.json and package-lock.json to install application dependencies
|
||||
COPY package.json .
|
||||
COPY package-lock.json .
|
||||
|
||||
# Install build dependencies
|
||||
RUN $HOME/.meteor/meteor npm install --production
|
||||
|
||||
# Copy meteor application configurations
|
||||
COPY .meteor .meteor
|
||||
|
||||
# Copy application sources
|
||||
COPY packages packages
|
||||
COPY imports imports
|
||||
COPY config config
|
||||
COPY models models
|
||||
COPY public public
|
||||
COPY server server
|
||||
COPY client client
|
||||
|
||||
# Build the application
|
||||
RUN $HOME/.meteor/meteor build --directory /build --allow-superuser
|
||||
|
||||
# Enter server bundle directory
|
||||
WORKDIR /build/bundle/programs/server
|
||||
|
||||
# Install server dependencies
|
||||
RUN $HOME/.meteor/meteor npm install --production
|
||||
|
||||
# Enter installation directory of fibers
|
||||
WORKDIR /build/bundle/programs/server/node_modules/fibers
|
||||
|
||||
# Build fibers integrations
|
||||
RUN node build.js
|
||||
|
||||
FROM ubuntu:24.04 AS wekan
|
||||
|
||||
# Add metadata to image
|
||||
FROM ubuntu:24.04
|
||||
LABEL maintainer="wekan"
|
||||
LABEL org.opencontainers.image.ref.name="ubuntu"
|
||||
LABEL org.opencontainers.image.version="24.04"
|
||||
LABEL org.opencontainers.image.source="https://github.com/wekan/wekan"
|
||||
|
||||
# Set default environment variables
|
||||
ENV WITH_API=true \
|
||||
# 2022-04-25:
|
||||
# - gyp does not yet work with Ubuntu 22.04 ubuntu:rolling,
|
||||
# so changing to 21.10. https://github.com/wekan/wekan/issues/4488
|
||||
|
||||
# 2021-09-18:
|
||||
# - Above Ubuntu base image copied from Docker Hub ubuntu:hirsute-20210825
|
||||
# to Quay to avoid Docker Hub rate limits.
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
ENV BUILD_DEPS="apt-utils gnupg gosu wget bzip2 g++ curl libarchive-tools build-essential git ca-certificates python3"
|
||||
|
||||
ENV \
|
||||
DEBUG=false \
|
||||
NODE_VERSION=v14.21.4 \
|
||||
METEOR_RELEASE=METEOR@2.14 \
|
||||
USE_EDGE=false \
|
||||
METEOR_EDGE=1.5-beta.17 \
|
||||
NPM_VERSION=6.14.17 \
|
||||
FIBERS_VERSION=4.0.1 \
|
||||
ARCHITECTURE=linux-x64 \
|
||||
SRC_PATH=./ \
|
||||
WITH_API=true \
|
||||
RESULTS_PER_PAGE="" \
|
||||
DEFAULT_BOARD_ID="" \
|
||||
ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURES_BEFORE=3 \
|
||||
@@ -203,36 +158,119 @@ ENV WITH_API=true \
|
||||
WRITABLE_PATH=/data \
|
||||
S3=""
|
||||
|
||||
# Install node and application sources from build stage
|
||||
RUN --mount=type=bind,from=downloads,source=node.tar.gz,target=node.tar.gz \
|
||||
--mount=type=bind,from=build,source=/build,target=/build \
|
||||
# Install NodeJS
|
||||
tar xzf node.tar.gz --strip-components=1 --keep-old-files --no-same-owner && \
|
||||
# Add the wekan user
|
||||
useradd --uid 999 --user-group --system wekan && \
|
||||
# Copy wekan bundle
|
||||
cp -r /build/bundle /wekan && \
|
||||
# Remove the web.browser.legacy platform
|
||||
rm -r /wekan/programs/web.browser.legacy && \
|
||||
# Change ownership of wekan directory
|
||||
chown wekan:wekan -R /wekan && \
|
||||
# Create the data directory
|
||||
mkdir /data && \
|
||||
# Change ownership of data directory
|
||||
chown wekan:root -R /data
|
||||
# NODE_OPTIONS="--max_old_space_size=4096"
|
||||
|
||||
#---------------------------------------------
|
||||
# == at docker-compose.yml: AUTOLOGIN WITH OIDC/OAUTH2 ====
|
||||
# https://github.com/wekan/wekan/wiki/autologin
|
||||
#- OIDC_REDIRECTION_ENABLED=true
|
||||
#---------------------------------------------------------------------
|
||||
|
||||
# Copy the app to the image
|
||||
COPY ${SRC_PATH} /home/wekan/app
|
||||
|
||||
# Install OS
|
||||
RUN <<EOR
|
||||
set -o xtrace
|
||||
|
||||
# Add non-root user wekan
|
||||
useradd --user-group --system --home-dir /home/wekan wekan
|
||||
# OS dependencies
|
||||
apt-get update --assume-yes
|
||||
apt-get install --assume-yes --no-install-recommends ${BUILD_DEPS}
|
||||
|
||||
# Meteor installer doesn't work with the default tar binary, so using bsdtar while installing.
|
||||
# https://github.com/coreos/bugs/issues/1095#issuecomment-350574389
|
||||
cp $(which tar) $(which tar)~
|
||||
ln -sf $(which bsdtar) $(which tar)
|
||||
|
||||
# Install NodeJS
|
||||
cd /tmp
|
||||
|
||||
# Download nodejs
|
||||
wget "https://github.com/wekan/node-v14-esm/releases/download/${NODE_VERSION}/node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz"
|
||||
wget "https://github.com/wekan/node-v14-esm/releases/download/${NODE_VERSION}/SHASUMS256.txt"
|
||||
|
||||
# Verify nodejs authenticity
|
||||
grep "node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz" "SHASUMS256.txt" | shasum -a 256 -c -
|
||||
rm -f "SHASUMS256.txt"
|
||||
|
||||
# Install Node
|
||||
tar xzf "node-$NODE_VERSION-$ARCHITECTURE.tar.gz" -C /usr/local --strip-components=1 --no-same-owner
|
||||
rm "node-$NODE_VERSION-$ARCHITECTURE.tar.gz" "SHASUMS256.txt"
|
||||
ln -s "/usr/local/bin/node" "/usr/local/bin/nodejs"
|
||||
mkdir -p "/opt/nodejs/lib/node_modules/fibers/.node-gyp" "/root/.node-gyp/${NODE_VERSION} /home/wekan/.config"
|
||||
|
||||
# Install node dependencies
|
||||
npm install -g npm@${NPM_VERSION} --production
|
||||
chown --recursive wekan:wekan /home/wekan/.config
|
||||
|
||||
# Install Meteor
|
||||
cd /home/wekan
|
||||
chown --recursive wekan:wekan /home/wekan
|
||||
echo "Starting meteor ${METEOR_RELEASE} installation... \n"
|
||||
gosu wekan:wekan curl https://install.meteor.com/ | /bin/sh
|
||||
mv /root/.meteor /home/wekan/
|
||||
chown --recursive wekan:wekan /home/wekan/.meteor
|
||||
|
||||
sed -i 's/api\.versionsFrom/\/\/api.versionsFrom/' /home/wekan/app/packages/meteor-useraccounts-core/package.js
|
||||
cd /home/wekan/.meteor
|
||||
gosu wekan:wekan /home/wekan/.meteor/meteor -- help
|
||||
|
||||
# Build app (Production)
|
||||
cd /home/wekan/app
|
||||
mkdir -p /home/wekan/.npm
|
||||
chown --recursive wekan:wekan /home/wekan/.npm
|
||||
chmod u+w *.json
|
||||
gosu wekan:wekan meteor npm install --production
|
||||
gosu wekan:wekan /home/wekan/.meteor/meteor build --directory /home/wekan/app_build
|
||||
cd /home/wekan/app_build/bundle/programs/server/
|
||||
chmod u+w *.json
|
||||
gosu wekan:wekan meteor npm install --production
|
||||
cd node_modules/fibers
|
||||
node build.js
|
||||
cd ../..
|
||||
# Remove legacy webbroser bundle, so that Wekan works also at Android Firefox, iOS Safari, etc.
|
||||
rm -rf /home/wekan/app_build/bundle/programs/web.browser.legacy
|
||||
mv /home/wekan/app_build/bundle /build
|
||||
|
||||
# Put back the original tar
|
||||
mv $(which tar)~ $(which tar)
|
||||
|
||||
# Cleanup
|
||||
apt-get remove --purge --assume-yes ${BUILD_DEPS}
|
||||
npm uninstall -g api2html
|
||||
apt-get autoremove --assume-yes
|
||||
apt-get clean --assume-yes
|
||||
rm -Rf /tmp/*
|
||||
rm -Rf /var/lib/apt/lists/*
|
||||
rm -Rf /var/cache/apt
|
||||
rm -Rf /var/lib/apt/lists
|
||||
rm -Rf /home/wekan/app_build
|
||||
rm -Rf /home/wekan/app
|
||||
rm -Rf /home/wekan/.meteor
|
||||
|
||||
mkdir /data
|
||||
chown wekan --recursive /data
|
||||
EOR
|
||||
|
||||
# Change to the wekan user
|
||||
USER wekan
|
||||
|
||||
# Set the port to listen on
|
||||
ENV PORT=8080
|
||||
EXPOSE ${PORT}
|
||||
EXPOSE $PORT
|
||||
|
||||
# Define the stop signal for node
|
||||
STOPSIGNAL SIGINT
|
||||
STOPSIGNAL SIGKILL
|
||||
WORKDIR /home/wekan/app
|
||||
|
||||
# Declare a volume on /data
|
||||
VOLUME /data
|
||||
|
||||
# Set startup command
|
||||
CMD ["node", "/wekan/main.js"]
|
||||
#---------------------------------------------------------------------
|
||||
# https://github.com/wekan/wekan/issues/3585#issuecomment-1021522132
|
||||
# Add more Node heap:
|
||||
# NODE_OPTIONS="--max_old_space_size=4096"
|
||||
# Add more stack:
|
||||
# bash -c "ulimit -s 65500; exec node --stack-size=65500 main.js"
|
||||
#---------------------------------------------------------------------
|
||||
#
|
||||
# CMD ["node", "/build/main.js"]
|
||||
# CMD ["bash", "-c", "ulimit -s 65500; exec node --stack-size=65500 /build/main.js"]
|
||||
# CMD ["bash", "-c", "ulimit -s 65500; exec node --stack-size=65500 --max-old-space-size=8192 /build/main.js"]
|
||||
CMD ["bash", "-c", "ulimit -s 65500; exec node /build/main.js"]
|
||||
@@ -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
|
||||
|
||||
@@ -107,6 +107,14 @@ that by providing one-click installation on various platforms.
|
||||
We also welcome sponsors for features and bugfixes.
|
||||
By working directly with WeKan ® you get the benefit of active maintenance and new features added by growing WeKan ® developer community.
|
||||
|
||||
## Getting Started with Development
|
||||
|
||||
The default branch uses [Meteor 2 with Node.js 14](https://wekan.github.io/install/).
|
||||
|
||||
To contribute, [create a fork](https://github.com/wekan/wekan/wiki/Emoji#2-create-fork-of-httpsgithubcomwekanwekan-at-github-web-page) and run `./rebuild-wekan.sh` (or `./rebuild-wekan.bat` on Windows) as detailed [here](https://github.com/wekan/wekan/wiki/Emoji#3-select-option-1-to-install-dependencies-and-then-enter). Once you're ready, please test your code and [submit a pull request (PR)](https://github.com/wekan/wekan/wiki/Emoji#7-test).
|
||||
|
||||
Please refer to the [developer documentation](https://github.com/wekan/wekan/wiki/Developer-Documentation) for more information.
|
||||
|
||||
## Screenshot
|
||||
|
||||
[More screenshots at Features page](https://github.com/wekan/wekan/wiki/Features)
|
||||
|
||||
@@ -0,0 +1,113 @@
|
||||
# 🔐 WeKan — Login System Overview
|
||||
|
||||
This document provides a detailed overview of WeKan’s **login and authentication system**, covering client-side UI, server-side logic, external authentication methods, and potential upgrade paths.
|
||||
|
||||
---
|
||||
|
||||
## 🖥️ Login Web UI
|
||||
|
||||
WeKan's login interface is implemented using a combination of:
|
||||
|
||||
- `layouts.jade` – Login HTML structure
|
||||
- `layouts.js` – Login logic and interactivity
|
||||
- `layouts.css` – Styling and layout
|
||||
|
||||
📁 Source: [`client/components/main`](https://github.com/wekan/wekan/tree/main/client/components/main)
|
||||
|
||||
---
|
||||
|
||||
## ⚙️ Server-Side Authentication
|
||||
|
||||
Server-side login functionality is handled in:
|
||||
|
||||
- [`server/authentication.js`](https://github.com/wekan/wekan/blob/main/server/authentication.js)
|
||||
|
||||
Other related configurations:
|
||||
|
||||
- 🔧 Account config: [`config/accounts.js`](https://github.com/wekan/wekan/blob/main/config/accounts.js)
|
||||
- 📨 Sign-up invitations: [`models/settings.js#L275`](https://github.com/wekan/wekan/blob/main/models/settings.js#L275)
|
||||
- 👤 User creation logic: [`models/users.js#L1339`](https://github.com/wekan/wekan/blob/main/models/users.js#L1339)
|
||||
|
||||
---
|
||||
|
||||
## 👥 Meteor User Accounts
|
||||
|
||||
WeKan utilizes Meteor’s `accounts` system. Relevant resources:
|
||||
|
||||
- 📚 Meteor 2.x Accounts Docs: [v2-docs.meteor.com/api/accounts](https://v2-docs.meteor.com/api/accounts)
|
||||
- 🔍 Meteor Packages:
|
||||
- [`packages`](https://github.com/wekan/wekan/blob/main/.meteor/packages)
|
||||
- [`versions`](https://github.com/wekan/wekan/blob/main/.meteor/versions)
|
||||
- 📦 Meteor 2.14 core packages: [Meteor 2.14 packages](https://github.com/meteor/meteor/tree/release/METEOR%402.14/packages)
|
||||
|
||||
---
|
||||
|
||||
## 🔐 External Authentication (OIDC, LDAP, etc.)
|
||||
|
||||
WeKan supports external authentication methods via internal packages.
|
||||
|
||||
📁 See [`packages/`](https://github.com/wekan/wekan/tree/main/packages) for:
|
||||
- OpenID Connect (OIDC)
|
||||
- LDAP
|
||||
- OAuth and other integrations
|
||||
|
||||
---
|
||||
|
||||
## 📦 NPM & AtmosphereJS Dependencies
|
||||
|
||||
- 🔗 `package.json`: [Dependencies list](https://github.com/wekan/wekan/blob/main/package.json)
|
||||
- 🧩 WekanTeam scoped NPM packages: [@wekanteam on npm](https://www.npmjs.com/search?q=%40wekanteam)
|
||||
- ☁️ AtmosphereJS Meteor packages: [atmospherejs.com](https://atmospherejs.com)
|
||||
|
||||
---
|
||||
|
||||
## 🚧 Meteor Version & Upgrade Notes
|
||||
|
||||
- 📌 Current Version: **Meteor 2.14**
|
||||
- [`.meteor/release`](https://github.com/wekan/wekan/blob/main/.meteor/release)
|
||||
- 🔧 Maintained with only **critical fixes** until ~Summer 2025
|
||||
- 🚀 Migration to **Meteor 3** or a new framework is under consideration
|
||||
|
||||
📘 Meteor 3 API: [docs.meteor.com/api/accounts](https://docs.meteor.com/api/accounts)
|
||||
|
||||
---
|
||||
|
||||
## 🧪 Prototypes & Examples
|
||||
|
||||
### 🐘 PHP Prototype Sign-Up
|
||||
|
||||
Used in experimental versions:
|
||||
|
||||
- Step 1: [`sign-up1.php`](https://github.com/wekan/php/blob/main/page/sign-up1.php)
|
||||
- Step 2: [`sign-up2.php`](https://github.com/wekan/php/blob/main/page/sign-up2.php)
|
||||
- Main entry: [`index.php#L72-L83`](https://github.com/wekan/php/blob/main/public/index.php#L72-L83)
|
||||
|
||||
---
|
||||
|
||||
### 🎨 WeKan Studio Prototype
|
||||
|
||||
Sign-up logic in the **WeKan Studio** version:
|
||||
|
||||
- [`signUp.fmt`](https://github.com/wekan/wekanstudio/blob/main/srv/templates/login/signUp.fmt)
|
||||
|
||||
---
|
||||
|
||||
## 📎 Future Considerations
|
||||
|
||||
- Upgrading to **Meteor 3.x**
|
||||
- Refactoring frontend logic to fix translation rendering order
|
||||
- Exploring **simplified authentication systems** in future prototypes
|
||||
|
||||
---
|
||||
|
||||
## 🔗 Project Links
|
||||
|
||||
- 🔧 Main Repo: [github.com/wekan/wekan](https://github.com/wekan/wekan)
|
||||
- 🌐 Website: [wekan.github.io](https://wekan.github.io)
|
||||
- 📚 Documentation: [Wekan Wiki](https://github.com/wekan/wekan/wiki)
|
||||
|
||||
---
|
||||
|
||||
|
||||
|
||||
---
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928
|
||||
appVersion: "v7.80.0"
|
||||
appVersion: "v7.90.0"
|
||||
files:
|
||||
userUploads:
|
||||
- README.md
|
||||
|
||||
@@ -2544,8 +2544,8 @@ THEME - Exodark
|
||||
background: #1b1b1b;
|
||||
}
|
||||
.board-color-exodark .materialCheckBox.is-checked {
|
||||
border-bottom: 2px solid #222;
|
||||
border-right: 2px solid #222;
|
||||
border-bottom: 2px solid #dbdbdb!important;/*Fix contrast of checkbox*/
|
||||
border-right: 2px solid #dbdbdb!important;
|
||||
}
|
||||
.board-color-exodark .is-multiselection-active .multi-selection-checkbox.is-checked + .minicard {
|
||||
background: #e9e9e9;
|
||||
@@ -3179,10 +3179,17 @@ THEME - Clean Dark
|
||||
margin-top: 8px;
|
||||
}
|
||||
|
||||
.board-color-cleandark.background-box {
|
||||
background-color:#23232B;
|
||||
} /*Fixes contrast issues with background box in theme selection list*/
|
||||
/* ===============
|
||||
THEME - Clean Light
|
||||
=================*/
|
||||
/* Please note Clean Light theme elements also contain references to some cleandark theme elements so if unable to find code you're looking for under CleanDark it might be here. This should probably be cleaned up*/
|
||||
.board-color-cleanlight.background-box {
|
||||
background-color:#e0e0e0;
|
||||
color:#010101!important;
|
||||
} /*Fixes issues with text colour/background box being similar no contrast */
|
||||
|
||||
.board-color-cleanlight {
|
||||
background: #E0E0E0;
|
||||
|
||||
@@ -239,34 +239,40 @@ BlazeComponent.extendComponent({
|
||||
evt.preventDefault();
|
||||
},
|
||||
'click .js-clone-board'(evt) {
|
||||
let title = getSlug(ReactiveCache.getBoard(this.currentData()._id).title) || 'cloned-board';
|
||||
Meteor.call(
|
||||
'copyBoard',
|
||||
this.currentData()._id,
|
||||
{
|
||||
sort: ReactiveCache.getBoards({ archived: false }).length,
|
||||
type: 'board',
|
||||
title: ReactiveCache.getBoard(this.currentData()._id).title,
|
||||
},
|
||||
(err, res) => {
|
||||
if (err) {
|
||||
console.error(err);
|
||||
} else {
|
||||
Session.set('fromBoard', null);
|
||||
subManager.subscribe('board', res, false);
|
||||
FlowRouter.go('board', {
|
||||
id: res,
|
||||
slug: title,
|
||||
});
|
||||
}
|
||||
},
|
||||
);
|
||||
evt.preventDefault();
|
||||
if (confirm(TAPi18n.__('duplicate-board-confirm'))) {
|
||||
let title =
|
||||
getSlug(ReactiveCache.getBoard(this.currentData()._id).title) ||
|
||||
'cloned-board';
|
||||
Meteor.call(
|
||||
'copyBoard',
|
||||
this.currentData()._id,
|
||||
{
|
||||
sort: ReactiveCache.getBoards({ archived: false }).length,
|
||||
type: 'board',
|
||||
title: ReactiveCache.getBoard(this.currentData()._id).title,
|
||||
},
|
||||
(err, res) => {
|
||||
if (err) {
|
||||
console.error(err);
|
||||
} else {
|
||||
Session.set('fromBoard', null);
|
||||
subManager.subscribe('board', res, false);
|
||||
FlowRouter.go('board', {
|
||||
id: res,
|
||||
slug: title,
|
||||
});
|
||||
}
|
||||
},
|
||||
);
|
||||
evt.preventDefault();
|
||||
}
|
||||
},
|
||||
'click .js-archive-board'(evt) {
|
||||
const boardId = this.currentData()._id;
|
||||
Meteor.call('archiveBoard', boardId);
|
||||
evt.preventDefault();
|
||||
if (confirm(TAPi18n.__('archive-board-confirm'))) {
|
||||
const boardId = this.currentData()._id;
|
||||
Meteor.call('archiveBoard', boardId);
|
||||
evt.preventDefault();
|
||||
}
|
||||
},
|
||||
'click .js-accept-invite'() {
|
||||
const boardId = this.currentData()._id;
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import { Utils } from '/client/lib/utils';
|
||||
import moment from 'moment/min/moment-with-locales';
|
||||
import { TAPi18n } from '/imports/i18n';
|
||||
import { DatePicker } from '/client/lib/datepicker';
|
||||
@@ -11,7 +12,7 @@ import { DatePicker } from '/client/lib/datepicker';
|
||||
}
|
||||
|
||||
_storeDate(date) {
|
||||
this.card.setReceived(date);
|
||||
this.card.setReceived(moment(date).format('YYYY-MM-DD HH:mm'));
|
||||
}
|
||||
|
||||
_deleteDate() {
|
||||
@@ -37,7 +38,7 @@ import { DatePicker } from '/client/lib/datepicker';
|
||||
}
|
||||
|
||||
_storeDate(date) {
|
||||
this.card.setStart(date);
|
||||
this.card.setStart(moment(date).format('YYYY-MM-DD HH:mm'));
|
||||
}
|
||||
|
||||
_deleteDate() {
|
||||
@@ -60,7 +61,7 @@ import { DatePicker } from '/client/lib/datepicker';
|
||||
}
|
||||
|
||||
_storeDate(date) {
|
||||
this.card.setDue(date);
|
||||
this.card.setDue(moment(date).format('YYYY-MM-DD HH:mm'));
|
||||
}
|
||||
|
||||
_deleteDate() {
|
||||
@@ -83,7 +84,7 @@ import { DatePicker } from '/client/lib/datepicker';
|
||||
}
|
||||
|
||||
_storeDate(date) {
|
||||
this.card.setEnd(date);
|
||||
this.card.setEnd(moment(date).format('YYYY-MM-DD HH:mm'));
|
||||
}
|
||||
|
||||
_deleteDate() {
|
||||
@@ -322,19 +323,19 @@ CardCustomFieldDate.register('cardCustomFieldDate');
|
||||
|
||||
(class extends CardStartDate {
|
||||
showDate() {
|
||||
return this.date.get().format('L');
|
||||
return this.date.get().format('YYYY-MM-DD HH:mm');
|
||||
}
|
||||
}.register('minicardStartDate'));
|
||||
|
||||
(class extends CardDueDate {
|
||||
showDate() {
|
||||
return this.date.get().format('L');
|
||||
return this.date.get().format('YYYY-MM-DD HH:mm');
|
||||
}
|
||||
}.register('minicardDueDate'));
|
||||
|
||||
(class extends CardEndDate {
|
||||
showDate() {
|
||||
return this.date.get().format('L');
|
||||
return this.date.get().format('YYYY-MM-DD HH:mm');
|
||||
}
|
||||
}.register('minicardEndDate'));
|
||||
|
||||
|
||||
@@ -225,3 +225,12 @@ template(name="minicardDetailsActionsPopup")
|
||||
a.js-link
|
||||
i.fa.fa-link
|
||||
| {{_ 'link-card'}}
|
||||
li
|
||||
a.js-toggle-watch-card
|
||||
if isWatching
|
||||
i.fa.fa-eye
|
||||
| {{_ 'unwatch'}}
|
||||
else
|
||||
i.fa.fa-eye-slash
|
||||
| {{_ 'watch'}}
|
||||
|
||||
@@ -46,6 +46,10 @@ BlazeComponent.extendComponent({
|
||||
}
|
||||
return ret;
|
||||
},
|
||||
isWatching() {
|
||||
const card = this.currentData();
|
||||
return card.findWatcher(Meteor.userId());
|
||||
},
|
||||
|
||||
showMembers() {
|
||||
// cache "board" to reduce the mini-mongodb access
|
||||
@@ -125,6 +129,9 @@ Template.minicard.helpers({
|
||||
? Meteor.connection._lastSessionId
|
||||
: null;
|
||||
},
|
||||
isWatching() {
|
||||
return this.findWatcher(Meteor.userId());
|
||||
}
|
||||
});
|
||||
|
||||
BlazeComponent.extendComponent({
|
||||
@@ -178,4 +185,11 @@ Template.minicardDetailsActionsPopup.events({
|
||||
this.archive();
|
||||
Utils.goBoardId(this.boardId);
|
||||
}),
|
||||
'click .js-toggle-watch-card'() {
|
||||
const currentCard = this;
|
||||
const level = currentCard.findWatcher(Meteor.userId()) ? null : 'watching';
|
||||
Meteor.call('watch', 'card', currentCard._id, level, (err, ret) => {
|
||||
if (!err && ret) Popup.back();
|
||||
});
|
||||
},
|
||||
});
|
||||
@@ -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;
|
||||
@@ -207,7 +214,7 @@ pre,
|
||||
code,
|
||||
tt {
|
||||
font-family: lucida console, monospace;
|
||||
line-height: 1.25em;
|
||||
line-height: 1.3em;
|
||||
}
|
||||
blockquote {
|
||||
margin: 8px 0 8px 8px;
|
||||
@@ -431,7 +438,8 @@ a:not(.disabled).is-active i.fa {
|
||||
.viewer em {
|
||||
font-style: italic;
|
||||
}
|
||||
.viewer pre {
|
||||
.viewer pre,
|
||||
.viewer code {
|
||||
padding: 10px 12px 7px;
|
||||
background: #dedede;
|
||||
overflow-y: auto;
|
||||
|
||||
@@ -177,7 +177,7 @@
|
||||
@media screen and (max-width: 800px) {
|
||||
.board-sidebar {
|
||||
width: 100%;
|
||||
right: -100%;
|
||||
left: 0;
|
||||
}
|
||||
.board-sidebar .sidebar-content .hide-btn {
|
||||
width: 40px;
|
||||
|
||||
@@ -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'),
|
||||
},
|
||||
];
|
||||
|
||||
@@ -83,7 +83,8 @@ export class DatePicker extends BlazeComponent {
|
||||
{
|
||||
'keyup .js-date-field'() {
|
||||
// parse for localized date format in strict mode
|
||||
const dateMoment = moment(this.find('#date').value, 'L', true);
|
||||
const normalizedValue = Utils.normalizeDigits(this.find('#date').value);
|
||||
const dateMoment = moment(normalizedValue, 'L', true);
|
||||
if (dateMoment.isValid()) {
|
||||
this.error.set('');
|
||||
this.$('.js-datepicker').datepicker('update', dateMoment.toDate());
|
||||
@@ -91,9 +92,10 @@ export class DatePicker extends BlazeComponent {
|
||||
},
|
||||
'keyup .js-time-field'() {
|
||||
// parse for localized time format in strict mode
|
||||
const normalizedValue = Utils.normalizeDigits(this.find('#time').value);
|
||||
const dateMoment = moment(
|
||||
this.find('#time').value,
|
||||
adjustedTimeFormat(),
|
||||
normalizedValue,
|
||||
adjustedTimeFormat(),
|
||||
true,
|
||||
);
|
||||
if (dateMoment.isValid()) {
|
||||
@@ -104,12 +106,14 @@ export class DatePicker extends BlazeComponent {
|
||||
evt.preventDefault();
|
||||
|
||||
// if no time was given, init with 12:00
|
||||
const timeValue = Utils.normalizeDigits(evt.target.time.value);
|
||||
const time =
|
||||
evt.target.time.value ||
|
||||
moment(new Date().setHours(12, 0, 0)).format('LT');
|
||||
timeValue ||
|
||||
moment(new Date().setHours(12, 0, 0)).format('LT');
|
||||
const newTime = moment(time, adjustedTimeFormat(), true);
|
||||
const newDate = moment(evt.target.date.value, 'L', true);
|
||||
const dateString = `${evt.target.date.value} ${time}`;
|
||||
const dateValue = Utils.normalizeDigits(evt.target.date.value);
|
||||
const newDate = moment(dateValue, 'L', true);
|
||||
const dateString = `${dateValue} ${time}`;
|
||||
const newCompleteDate = moment(
|
||||
dateString,
|
||||
`L ${adjustedTimeFormat()}`,
|
||||
|
||||
@@ -366,7 +366,7 @@ Template.keyboardShortcuts.helpers({
|
||||
},
|
||||
{
|
||||
keys: ['ctrl + alt + number keys 1-9'],
|
||||
action: 'toggle-asignees'
|
||||
action: 'toggle-assignees'
|
||||
},
|
||||
],
|
||||
});
|
||||
@@ -11,6 +11,17 @@ Utils = {
|
||||
currentBoard.setColor(currentBoard["background-color"]);
|
||||
}
|
||||
},
|
||||
// Normalize non-Western (Persian/Arabic) digits to Western Arabic (0-9)
|
||||
// This helps with date parsing in non-English languages
|
||||
normalizeDigits(str) {
|
||||
if (!str) return str;
|
||||
const persian = [/۰/g, /۱/g, /۲/g, /۳/g, /۴/g, /۵/g, /۶/g, /۷/g, /۸/g, /۹/g];
|
||||
const arabic = [/٠/g, /١/g, /٢/g, /٣/g, /٤/g, /٥/g, /٦/g, /٧/g, /٨/g, /٩/g];
|
||||
for (let i = 0; i < 10; i++) {
|
||||
str = str.replace(persian[i], i).replace(arabic[i], i);
|
||||
}
|
||||
return str;
|
||||
},
|
||||
/** returns the current board id
|
||||
* <li> returns the current board id or the board id of the popup card if set
|
||||
*/
|
||||
|
||||
+6
-2
@@ -577,10 +577,14 @@ services:
|
||||
# If the sync of the users should be done in the background
|
||||
#- LDAP_BACKGROUND_SYNC=false
|
||||
#
|
||||
# At which interval does the background task sync.
|
||||
# LDAP_BACKGROUND_SYNC_INTERVAL : At which interval does the background task sync in milliseconds
|
||||
# The format must be as specified in:
|
||||
# https://bunkat.github.io/later/parsers.html#text
|
||||
#- LDAP_BACKGROUND_SYNC_INTERVAL=every 1 hour
|
||||
#- LDAP_BACKGROUND_SYNC_INTERVAL=every 1 hours
|
||||
# At which interval does the background task sync in milliseconds.
|
||||
# Leave this unset, so it uses default, and does not crash.
|
||||
# https://github.com/wekan/wekan/issues/2354#issuecomment-515305722
|
||||
- LDAP_BACKGROUND_SYNC_INTERVAL=''
|
||||
#
|
||||
#- LDAP_BACKGROUND_SYNC_KEEP_EXISTANT_USERS_UPDATED=false
|
||||
#
|
||||
|
||||
@@ -575,10 +575,14 @@ services:
|
||||
# If the sync of the users should be done in the background
|
||||
#- LDAP_BACKGROUND_SYNC=false
|
||||
#
|
||||
# At which interval does the background task sync.
|
||||
# LDAP_BACKGROUND_SYNC_INTERVAL : At which interval does the background task sync in milliseconds
|
||||
# The format must be as specified in:
|
||||
# https://bunkat.github.io/later/parsers.html#text
|
||||
#- LDAP_BACKGROUND_SYNC_INTERVAL=every 1 hour
|
||||
#- LDAP_BACKGROUND_SYNC_INTERVAL=every 1 hours
|
||||
# At which interval does the background task sync in milliseconds.
|
||||
# Leave this unset, so it uses default, and does not crash.
|
||||
# https://github.com/wekan/wekan/issues/2354#issuecomment-515305722
|
||||
- LDAP_BACKGROUND_SYNC_INTERVAL=''
|
||||
#
|
||||
#- LDAP_BACKGROUND_SYNC_KEEP_EXISTANT_USERS_UPDATED=false
|
||||
#
|
||||
|
||||
@@ -1,8 +1,21 @@
|
||||
Admin Panel / People / Click at right side of usename `...` button that is User Settings / Impersonate user.
|
||||
## Impersonate a User
|
||||
|
||||
You will be switched to logged in as that user.
|
||||
To impersonate another user in the Admin Panel:
|
||||
|
||||
To switch back to your original user, at your webbrowser click `Reload open webpage` round arrow button.
|
||||
1. Go to **Admin Panel** → **People**.
|
||||
2. Find the user you want to impersonate.
|
||||
3. Click the **`...` (three dots)** menu on the right side of the username.
|
||||
4. Select **User Settings** → **Impersonate User**.
|
||||
|
||||
You will now be logged in as that user.
|
||||
|
||||
### How to Switch Back
|
||||
To return to your original admin account:
|
||||
|
||||
- Click the **Reload** (🔄) button in your web browser to refresh the page.
|
||||
|
||||
---
|
||||
|
||||
📝 **Note:**
|
||||
This feature was added to Wekan v4.39 at https://github.com/wekan/wekan/pull/3280
|
||||
|
||||
@@ -10,6 +10,7 @@ There edit Browser-compatibility-matrix.md and attach it with .txt extension or
|
||||
Browser | [PWA](PWA) | Mobile | Desktop | OS
|
||||
------- | ----| ------ | ------- | -------
|
||||
Safari | iOS Yes | iOS Newest | Newest | iOS, macOS
|
||||
Iris | No | No | Newest | [Iris browser news](https://www.riscosopen.org/forum/forums/1/topics/19545), Download [RISC OS Direct](https://www.riscosdev.com/direct/) for Raspberry Pi etc. [Other versions of RISC OS for many ARM CPU devices](https://www.riscosopen.org/content/downloads) do not have Iris browser yet, but there could be some way to transfer Iris browser files from RISC OS Direct.
|
||||
|
||||
## Firefox based
|
||||
|
||||
@@ -17,10 +18,8 @@ Any telemetry at any Firefox based browser can be additionally most locked down
|
||||
|
||||
Browser | [PWA](PWA) | Mobile | Desktop | OS
|
||||
------- | ----| ------ | ------- | -------
|
||||
[Mypal](https://releases.wekan.team/mypal/) | No | No | Newest | For 32bit ReactOS/WinXP/Win7/etc [issue](https://github.com/wekan/wekan/issues/3132), Other 32bit browsers probably not
|
||||
Firefox | Android Yes | Android Newest | Newest | Win/Mac/Linux/BSD/RasPi. [Haiku](https://discuss.haiku-os.org/t/progress-on-porting-firefox/13493/143) not tested yet - [HN](https://news.ycombinator.com/item?id=41214762).
|
||||
Morph Browser | No | Yes | Yes | [Ubuntu Touch](https://ubports.com) (based on Ubuntu 16.04) on PinePhone, OnePlus 3, [RasPi3](https://ci.ubports.com/job/rootfs/job/rootfs-rpi/) (not RasPi4 yet). Works best with bluetooth or USB mouse and keyboard. [Repo](https://gitlab.com/ubports/development/core/morph-browser)
|
||||
[OpenStore App](https://open-store.io/app/wekan.wekanteam) | Yes | Yes | Yes | Based on [Wekan PWA](https://boards.wekan.team/b/D2SzJKZDS4Z48yeQH/wekan-open-source-kanban-board-with-mit-license/s7SkzYviC2e963FkT), [Ubuntu Touch](https://ubports.com) app at [OpenStore](https://open-store.io/app/wekan.wekanteam) using Morph browser with Wekan demo & development server https://boards.wekan.team . Tested on [RasPi3](https://ci.ubports.com/job/rootfs/job/rootfs-rpi/). PWA URL is configured here https://github.com/wekan/wekan-openstore/blob/master/wekan.desktop#L3
|
||||
[Mypal](https://github.com/reactosapps/apps/releases/download/0.01/mypal-27.9.4.win32.installer.exe) | No | No | Newest | For 32bit ReactOS/WinXP/Win7/etc [issue](https://github.com/wekan/wekan/issues/3132)
|
||||
Firefox | No | Newest | Newest | iOS/Android/Win/Mac/Linux/BSD/RasPi. At iOS uses Safari engine, elsewhere Firefox engine. [Haiku](https://discuss.haiku-os.org/t/progress-on-porting-firefox/13493/143) not tested yet - [HN](https://news.ycombinator.com/item?id=41214762).
|
||||
[Waterfox](https://www.waterfox.net) | No | No | Yes | Win/Mac/Linux, more private than Firefox, no tracking. [Repo](https://github.com/BrowserWorks/Waterfox)
|
||||
[Floorp](https://floorp.app) | No | No | Yes | [Win/Mac/Linux](https://github.com/Floorp-Projects/Floorp/releases), more private than Firefox, [Repo](https://github.com/Floorp-Projects/Floorp)
|
||||
[Mercury](https://thorium.rocks/mercury) | No | No | Yes | [Win/Linux](https://github.com/Alex313031/Mercury/releases), more private than Firefox, [Repo](https://github.com/Alex313031/Mercury)
|
||||
@@ -38,6 +37,8 @@ Brave | Android Yes | Android Newest | Newest | Win/Mac/Linux/RasPi
|
||||
Vivaldi | Android Yes | Android Newest | Newest | Win/Mac/Linux
|
||||
Opera | Android Yes | Android Newest | Newest | Win/Mac/Linux
|
||||
Credge, Chromium Edge | Android Yes | Android | Newest | Win/Mac/Linux/Mobile
|
||||
Morph Browser | No | Yes | Yes | [Ubuntu Touch](https://ubports.com) based on Ubuntu 16.04 and 20.04 at all Ubuntu Touch devices, [RasPi3](https://ci.ubports.com/job/rootfs/job/rootfs-rpi/) (not RasPi4 yet). [Repo](https://gitlab.com/ubports/development/core/morph-browser)
|
||||
[OpenStore App](https://open-store.io/app/wekan.wekanteam) | Yes | Yes | Yes | [Ubuntu Touch](https://ubports.com) app at [OpenStore](https://open-store.io/app/wekan.wekanteam) using Morph browser with Wekan demo & development server https://boards.wekan.team . App source code for Ubuntu 16.04 at https://github.com/wekan/wekan-openstore and Ubuntu 20.04 at https://github.com/wekan/wekan-openstore2
|
||||
[Microsoft Store App](https://www.microsoft.com/fi-fi/p/wekan/9p2mrxvd087r#activetab=pivot:overviewtab) | Yes | Yes | Yes | At Microsoft Store of Windows 10/11 desktop, made with [PWABuilder](https://www.pwabuilder.com/). Based on [Wekan PWA](https://boards.wekan.team/b/D2SzJKZDS4Z48yeQH/wekan-open-source-kanban-board-with-mit-license/s7SkzYviC2e963FkT), changed app from EdgeHTML to Credge based with Wekan demo & development server https://boards.wekan.team
|
||||
[Android Play Store App](https://play.google.com/store/apps/details?id=team.wekan.boards.twa) | Yes | Yes | Yes | Based on [Wekan PWA](https://boards.wekan.team/b/D2SzJKZDS4Z48yeQH/wekan-open-source-kanban-board-with-mit-license/s7SkzYviC2e963FkT), made with [PWABuilder](https://www.pwabuilder.com/), uses Android Chrome browser with Wekan demo & development server https://boards.wekan.team
|
||||
[Thorium](https://thorium.rocks) | No | Yes | Yes | [Win/Win7/Mac/Linux/Android/RasPi](https://thorium.rocks), speed optimized
|
||||
@@ -57,10 +58,16 @@ 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 tested yet:
|
||||
## Ladybird based, not yet compatible with WeKan
|
||||
|
||||
- BSD-2-Clause license
|
||||
- Website: https://ladybird.org
|
||||
@@ -76,7 +83,7 @@ Benefits:
|
||||
|
||||
## Desktop app with Meteor
|
||||
|
||||
https://forums.meteor.com/t/desktop-electron-meteor-app-with-todesktop/60904
|
||||
- https://forums.meteor.com/t/desktop-electron-meteor-app-with-todesktop/60904
|
||||
|
||||
## Optional Payments
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
- 2024-08 Design discussion here: https://github.com/wekan/wekan/discussions/5507
|
||||
- Original WeKan Design:
|
||||
- Uses WeKan style confirm popups `Popup.afterConfirm(` , translations etc. Please look at existing code to keep same style.
|
||||
- Kanban, the good parts. Like was done when figuring out best design for Swimlanes https://github.com/wekan/wekan/issues/955
|
||||
- Intuitive, easy to figure out, prevent messing up something https://github.com/wekan/wekan/wiki/Monkey-Proof-Software
|
||||
- Polished UI/UX
|
||||
|
||||
@@ -6,6 +6,7 @@ Please read the meteor style guide before making any significant contribution.
|
||||
|
||||
# Stories about how Wekan works, and developing Wekan
|
||||
|
||||
- [Login code](https://github.com/wekan/wekan/issues/5714)
|
||||
- https://www.mongodb.com/docs/drivers/node/v3.7/fundamentals/promises/
|
||||
- [Do not use code formatters like Prettier and ESLint](https://github.com/wekan/wekan/pull/4633#issuecomment-1214214591)
|
||||
- [How realtime board updates work](https://github.com/wekan/wekan/issues/3788#issuecomment-834649553)
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
## Learning Course: Your First Meteor 3.1 Application
|
||||
|
||||
- https://www.youtube.com/watch?v=aFZzBb2oRi8&list=PLKKckIyt2nF863eP16mvVgWKR4JDyJoKy
|
||||
|
||||
## Meteor 3 Example Code
|
||||
|
||||
- https://github.com/fredmaiaarantes/simpletasks
|
||||
|
||||
@@ -4,15 +4,35 @@
|
||||
- Bun Javascript Engine https://bun.sh
|
||||
- MongoDB 5.x and newer https://github.com/turnkeylinux/tracker/issues/1724#issuecomment-2351544191
|
||||
- Does not work at s390x
|
||||
- V programming language https://github.com/vlang/v/issues/18737
|
||||
- Bun Javascript Engine https://github.com/oven-sh/bun/issues/2632
|
||||
- Deno Javascript Engine https://github.com/denoland/deno/issues/20212#issuecomment-1756663943
|
||||
- Lazarus IDE https://www.lazarus-ide.org
|
||||
- FreePascal programming language https://www.freepascal.org
|
||||
- TigerBeetle database https://github.com/tigerbeetle/tigerbeetle/issues/2241
|
||||
- GUI requires porting to other OS
|
||||
|
||||
## What is Cross-Platform
|
||||
|
||||
- Works at s390x
|
||||
- Programming languages
|
||||
- Node.js https://nodejs.org https://github.com/wekan/ferretdb/tree/main/node-deno-bun (not Deno or Bun)
|
||||
- C89 https://github.com/xet7/darkesthour
|
||||
- PHP https://github.com/wekan/php
|
||||
- Go https://github.com/wekan/wekango
|
||||
- Tcl/Tk
|
||||
- Web Frameworks
|
||||
- V veb https://github.com/vlang/v/issues/18737
|
||||
- Gambas https://github.com/wekan/hx/tree/main/prototypes/ui/gambas
|
||||
- Python Py4Web https://py4web.com
|
||||
- Ruby on Rails https://github.com/werot
|
||||
- WeKan Studio https://github.com/wekan/wekanstudio
|
||||
- Works at AmigaOS 3.x/4.x/MorphOS/AROS, Win/Mac/Linux
|
||||
- Web frameworks
|
||||
- FreePascal https://github.com/wekan/wami
|
||||
- GUI
|
||||
- BBC Basic https://www.bbcbasic.net/wiki/doku.php?id=converting_20programs_20from_20risc_20os_20to_20windows
|
||||
- Tcl/Tk GUI does works at most OS
|
||||
- Godot https://godotengine.org , https://github.com/godotengine/godot
|
||||
- Redot https://www.redotengine.org , https://github.com/Redot-Engine/redot-engine
|
||||
- HaxeUI https://haxeui.org
|
||||
|
||||
## Prototype Strategy
|
||||
|
||||
@@ -251,7 +271,7 @@ https://github.com/wekan/php/blob/main/page/allboardschar.php
|
||||
- Only test webpage. No actual features.
|
||||
|
||||
### Node.js 20, Bun and Deno
|
||||
- Repo https://github.com/wekan/wekan-node20
|
||||
- Repo https://github.com/wekan/ferretdb/tree/main/node-deno-bun
|
||||
- Features:
|
||||
- main.js makes database queries to many databases
|
||||
- Database drivers:
|
||||
@@ -282,7 +302,7 @@ https://github.com/wekan/php/blob/main/page/allboardschar.php
|
||||
### FreePascal
|
||||
|
||||
- Repo https://github.com/wekan/wami
|
||||
- Some static pages
|
||||
- Some static pages. At upload page, uploading file now works.
|
||||
- Previous:
|
||||
- Repo https://github.com/wekan/hx/tree/main/prototypes/code/webserver/works/freepascal-router
|
||||
- Router and some webpage
|
||||
@@ -345,4 +365,8 @@ https://github.com/wekan/php/blob/main/page/allboardschar.php
|
||||
### Swap microframework, vs HTMX
|
||||
|
||||
- https://github.com/josephernest/Swap
|
||||
- https://news.ycombinator.com/item?id=35991783
|
||||
- https://news.ycombinator.com/item?id=35991783
|
||||
|
||||
### Ruby on Rails
|
||||
|
||||
- https://github.com/wekan/weror . Password register and login works, there is workspaces and dragging cards, but no user management etc features yet.
|
||||
@@ -1,8 +1 @@
|
||||
Wekan works on x64. There is not yet version for [Raspberry Pi](https://github.com/wekan/wekan/issues/1053).
|
||||
|
||||
Wekan requires MongoDB 3.2.x . For other requirements and versions see [VirtualBox scripts](https://github.com/wekan/wekan-maintainer/tree/master/virtualbox) or [Dockerfile](https://github.com/wekan/wekan/blob/main/Dockerfile).
|
||||
|
||||
Known bugs with other versions:
|
||||
- Node 6.x: 100% CPU usage.
|
||||
- MongoDB 3.4.x: Wekan crashes when uploading attachment.
|
||||
- [Hardened kernel prevents creating new Wekan boards at Sandstorm](https://github.com/wekan/wekan/issues/1398)
|
||||
WeKan Requiremens are at https://wekan.github.io/install/
|
||||
@@ -0,0 +1,23 @@
|
||||
## Multiple lines to Checklist
|
||||
|
||||
1. Click Add new Checklist
|
||||
2. Click Add new Checklist Item
|
||||
3. Toggle `One line of text = one checklist item`
|
||||
4. Paste multiple lines of text
|
||||
5. Click Save
|
||||
|
||||
<img src="https://wekan.github.io/multiline/multiline1.png" width="60%" alt="Multiple lines to Checklist" />
|
||||
|
||||
## Card ☰ Menu / Copy Checklist Template to Many Cards
|
||||
|
||||
<img src="https://wekan.github.io/multiline/multiline2.png" width="60%" alt="Checklist Template to Many Cards 1" />
|
||||
|
||||
## Edit titles and descriptions of Many Cards
|
||||
```
|
||||
[ {"title": "First card title", "description":"First card description"},
|
||||
{"title":"Second card title","description":"Second card description"},
|
||||
{"title":"Last card title","description":"Last card description"} ]
|
||||
```
|
||||
|
||||
<img src="https://wekan.github.io/multiline/multiline3.png" width="60%" alt="Checklist Template to Many Cards 2" />
|
||||
|
||||
+35
-7
@@ -52,7 +52,15 @@ sudo snap set wekan ldap-authentication-userdn='CN=LDAP-User,OU=Service Accounts
|
||||
sudo snap set wekan ldap-authentication-password='<password>'
|
||||
sudo snap set wekan ldap-log-enabled='true'
|
||||
sudo snap set wekan ldap-background-sync='true'
|
||||
sudo snap set wekan ldap-background-sync-interval='every 1 minute'
|
||||
# LDAP_BACKGROUND_SYNC_INTERVAL : At which interval does the background task sync in milliseconds
|
||||
# The format must be as specified in:
|
||||
# https://bunkat.github.io/later/parsers.html#text
|
||||
#sudo snap set wekan ldap-background-sync-interval='every 1 hours'
|
||||
# At which interval does the background task sync in milliseconds.
|
||||
# If not in use, Leave this unset, so it uses default, and does not crash.
|
||||
# https://github.com/wekan/wekan/issues/2354#issuecomment-515305722
|
||||
#sudo snap set wekan ldap-background-sync-interval=''
|
||||
sudo snap set wekan ldap-background-sync-interval='every 1 hours'
|
||||
sudo snap set wekan ldap-background-sync-keep-existant-users-updated='true'
|
||||
sudo snap set wekan ldap-background-sync-import-new-users='true'
|
||||
sudo snap set wekan ldap-encryption='false'
|
||||
@@ -100,7 +108,15 @@ snap set wekan ldap-basedn='dc=example,dc=com'
|
||||
snap set wekan ldap-background-sync='true'
|
||||
snap set wekan ldap-background-sync-keep-existant-users-updated='true'
|
||||
snap set wekan ldap-background-sync-import-new-users='true'
|
||||
snap set wekan ldap-background-sync-interval='Every 1 minute'
|
||||
# LDAP_BACKGROUND_SYNC_INTERVAL : At which interval does the background task sync in milliseconds
|
||||
# The format must be as specified in:
|
||||
# https://bunkat.github.io/later/parsers.html#text
|
||||
#sudo snap set wekan ldap-background-sync-interval='every 1 hours'
|
||||
# At which interval does the background task sync in milliseconds.
|
||||
# If not in use, Leave this unset, so it uses default, and does not crash.
|
||||
# https://github.com/wekan/wekan/issues/2354#issuecomment-515305722
|
||||
#sudo snap set wekan ldap-background-sync-interval=''
|
||||
snap set wekan ldap-background-sync-interval='every 1 hours'
|
||||
snap set wekan ldap-merge-existing-users='true'
|
||||
snap set wekan ldap-user-search-field='uid'
|
||||
snap set wekan ldap-user-search-filter='(&(objectclass=person))'
|
||||
@@ -121,7 +137,15 @@ sudo snap set wekan ldap-authentication-password='********'
|
||||
sudo snap set wekan ldap-authentication-userdn='cn=admin,dc=*******,dc=lan'
|
||||
sudo snap set wekan ldap-background-sync='true'
|
||||
sudo snap set wekan ldap-background-sync-import-new-users='true'
|
||||
sudo snap set wekan ldap-background-sync-interval='Every 1 minute'
|
||||
# LDAP_BACKGROUND_SYNC_INTERVAL : At which interval does the background task sync in milliseconds
|
||||
# The format must be as specified in:
|
||||
# https://bunkat.github.io/later/parsers.html#text
|
||||
#sudo snap set wekan ldap-background-sync-interval='every 1 hours'
|
||||
# At which interval does the background task sync in milliseconds.
|
||||
# If not in use, Leave this unset, so it uses default, and does not crash.
|
||||
# https://github.com/wekan/wekan/issues/2354#issuecomment-515305722
|
||||
#sudo snap set wekan ldap-background-sync-interval=''
|
||||
sudo snap set wekan ldap-background-sync-interval='every 1 hours'
|
||||
sudo snap set wekan ldap-basedn='dc=*****,dc=lan'
|
||||
sudo snap set wekan ldap-email-field='mail'
|
||||
sudo snap set wekan ldap-enable='true'
|
||||
@@ -316,10 +340,14 @@ services:
|
||||
# LDAP_BACKGROUND_SYNC : If the sync of the users should be done in the background
|
||||
# example : LDAP_BACKGROUND_SYNC=true
|
||||
- LDAP_BACKGROUND_SYNC=false
|
||||
# LDAP_BACKGROUND_SYNC_INTERVAL : At which interval does the background task sync
|
||||
# example : LDAP_BACKGROUND_SYNC_INTERVAL='every 15 minutes'
|
||||
# for more info: http://bunkat.github.io/later/parsers.html#text
|
||||
- LDAP_BACKGROUND_SYNC_INTERVAL='every 1 hour'
|
||||
# LDAP_BACKGROUND_SYNC_INTERVAL : At which interval does the background task sync in milliseconds
|
||||
# The format must be as specified in:
|
||||
# https://bunkat.github.io/later/parsers.html#text
|
||||
#- LDAP_BACKGROUND_SYNC_INTERVAL=every 1 hours
|
||||
# At which interval does the background task sync in milliseconds.
|
||||
# Leave this unset, so it uses default, and does not crash.
|
||||
# https://github.com/wekan/wekan/issues/2354#issuecomment-515305722
|
||||
- LDAP_BACKGROUND_SYNC_INTERVAL=''
|
||||
# LDAP_BACKGROUND_SYNC_KEEP_EXISTANT_USERS_UPDATED :
|
||||
# example : LDAP_BACKGROUND_SYNC_KEEP_EXISTANT_USERS_UPDATED=true
|
||||
- LDAP_BACKGROUND_SYNC_KEEP_EXISTANT_USERS_UPDATED=false
|
||||
|
||||
+19
-1
@@ -46,4 +46,22 @@ Wekan clientside code is at `wekan/client/components/main/layouts.*`
|
||||
|
||||
Wekan serverside code is at:
|
||||
- `wekan/server/authentication.js` at bottom
|
||||
- `wekan/packages/meteor-accounts-saml/*`
|
||||
- `wekan/packages/meteor-accounts-saml/*`
|
||||
|
||||
## Gitea
|
||||
|
||||
- https://github.com/crewjam/saml
|
||||
- https://github.com/go-gitea/gitea/pull/29403
|
||||
- https://docs.gitea.com/enterprise/features/saml-auth
|
||||
|
||||
## Laravel
|
||||
|
||||
- https://github.com/24Slides/laravel-saml2
|
||||
|
||||
## ruby-saml/omniauth/RoR: Sign in as anyone: Bypassing SAML SSO authentication with parser differentials
|
||||
|
||||
- https://github.blog/security/sign-in-as-anyone-bypassing-saml-sso-authentication-with-parser-differentials/
|
||||
- https://news.ycombinator.com/item?id=43349634
|
||||
- https://github.com/github/securitylab
|
||||
|
||||
|
||||
@@ -1,7 +1,12 @@
|
||||
- At some cases [Hardened kernel may prevent creating new Wekan boards at Sandstorm](https://github.com/wekan/wekan/issues/1398)
|
||||
|
||||
# Sandstorm at Debian and Ubuntu
|
||||
|
||||
### Sandstorm CloudFlare DNS settings
|
||||
|
||||
Sandstorm works when configured to full domain, with CloudFlare SSL/TLS, with Caddy.
|
||||
Not subdomain, not sub-url, and not with Let's Encrypt that AFAIK does not support wildcard SSL/TLS.
|
||||
|
||||
Source: https://github.com/sandstorm-io/sandstorm/issues/3714#issuecomment-2366866243
|
||||
|
||||
For me, it works at CloudFlare DNS using TLS Strict checking and DNS setting clicking to orange cloud icon to make TLS proxy with Origin certificate, that is at /etc/caddy/certs/example.com.pem with above private key and below cert.
|
||||
@@ -13,17 +18,52 @@ DNS records:
|
||||
```
|
||||
Caddyfile, proxy to KVM VM that is running Debian and Sandstorm:
|
||||
```
|
||||
# Full domain where Sandstorm login is. Not subdomain. Not sub-url.
|
||||
*.example.com example.com {
|
||||
tls {
|
||||
load /etc/caddy/certs
|
||||
alpn http/1.1
|
||||
}
|
||||
# If KVM VM, it's IP address:
|
||||
#reverse_proxy 123.123.123.123:80
|
||||
# Localhost port 81, when not in KVM VM
|
||||
reverse_proxy 127.0.0.1:81
|
||||
}
|
||||
|
||||
reverse_proxy 123.123.123.123:80
|
||||
blog.somecompany.com {
|
||||
tls {
|
||||
load /etc/caddy/certs
|
||||
alpn http/1.1
|
||||
}
|
||||
# Blog hosted at Sandstorm WordPress
|
||||
reverse_proxy 127.0.0.1:81
|
||||
}
|
||||
|
||||
othercompany.com {
|
||||
tls {
|
||||
load /etc/caddy/certs
|
||||
alpn http/1.1
|
||||
}
|
||||
# Website hosted at Sandstorm Hacker CMS
|
||||
reverse_proxy 127.0.0.1:81
|
||||
}
|
||||
```
|
||||
At /opt/sandstorm/sandstorm.conf is domain, http port etc.
|
||||
If having Sandstorm inside of KVM VM: https://github.com/wekan/wekan/blob/main/docs/Platforms/FOSS/Snap/Many-Snaps-on-LXC.md
|
||||
|
||||
At /opt/sandstorm/sandstorm.conf is domain where Sandstorm login is, http port etc.
|
||||
```
|
||||
SERVER_USER=sandstorm
|
||||
PORT=81
|
||||
MONGO_PORT=6081
|
||||
BIND_IP=127.0.0.1
|
||||
BASE_URL=https://example.com
|
||||
WILDCARD_HOST=*.example.com
|
||||
UPDATE_CHANNEL=dev
|
||||
ALLOW_DEV_ACCOUNTS=false
|
||||
SMTP_LISTEN_PORT=25
|
||||
#SANDCATS_BASE_DOMAIN=sandcats.io
|
||||
#HTTPS_PORT=443
|
||||
```
|
||||
Some related info at:
|
||||
|
||||
https://github.com/wekan/wekan/wiki/Caddy-Webserver-Config
|
||||
|
||||
@@ -520,6 +520,15 @@ services:
|
||||
# https://bunkat.github.io/later/parsers.html#text
|
||||
#- LDAP_BACKGROUND_SYNC_INTERVAL='every 1 hour'
|
||||
#
|
||||
# LDAP_BACKGROUND_SYNC_INTERVAL : At which interval does the background task sync in milliseconds
|
||||
# The format must be as specified in:
|
||||
# https://bunkat.github.io/later/parsers.html#text
|
||||
#- LDAP_BACKGROUND_SYNC_INTERVAL=every 1 hours
|
||||
# At which interval does the background task sync in milliseconds.
|
||||
# Leave this unset, so it uses default, and does not crash.
|
||||
# https://github.com/wekan/wekan/issues/2354#issuecomment-515305722
|
||||
- LDAP_BACKGROUND_SYNC_INTERVAL=''
|
||||
#
|
||||
# LDAP_BACKGROUND_SYNC_KEEP_EXISTANT_USERS_UPDATED :
|
||||
# example : LDAP_BACKGROUND_SYNC_KEEP_EXISTANT_USERS_UPDATED=true
|
||||
#- LDAP_BACKGROUND_SYNC_KEEP_EXISTANT_USERS_UPDATED=false
|
||||
|
||||
@@ -10,19 +10,19 @@ This is without container (without Docker or Snap).
|
||||
|
||||
Right click and download files 1-4:
|
||||
|
||||
1. [wekan-7.80-amd64-windows.zip](https://github.com/wekan/wekan/releases/download/v7.80/wekan-7.80-amd64-windows.zip)
|
||||
1. [wekan-7.90-amd64-windows.zip](https://github.com/wekan/wekan/releases/download/v7.90/wekan-7.90-amd64-windows.zip)
|
||||
|
||||
2. [node.exe](https://nodejs.org/dist/latest-v14.x/win-x64/node.exe)
|
||||
|
||||
3. [mongodb-windows-x86_64-6.0.19-signed.msi](https://fastdl.mongodb.org/windows/mongodb-windows-x86_64-6.0.19-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.19-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.80-amd64-windows.zip` , inside it is directory `bundle`, to it copy other files:
|
||||
7. Unzip `wekan-7.90-amd64-windows.zip` , inside it is directory `bundle`, to it copy other files:
|
||||
|
||||
```
|
||||
bundle (directory)
|
||||
|
||||
@@ -27,4 +27,58 @@ Then in your JADE files, use the string like so:
|
||||
|
||||
We pull all translations from Transifex before every new Wekan release
|
||||
candidate, ask the translators to review the app, and pull all translations
|
||||
again for the final release.
|
||||
again for the final release.
|
||||
|
||||
## Example
|
||||
|
||||
```
|
||||
diff --git a/client/components/cards/cardDetails.jade b/client/components/cards/cardDetails.jade
|
||||
index ee31d76be..e3b2ea7cd 100644
|
||||
--- a/client/components/cards/cardDetails.jade
|
||||
+++ b/client/components/cards/cardDetails.jade
|
||||
@@ -142,19 +142,19 @@ template(name="cardDetails")
|
||||
.card-details-item.card-details-item-recurring
|
||||
h3.card-details-item-title
|
||||
i.fa.fa-repeat
|
||||
- | Recurrence
|
||||
+ | {{_ 'recurrence'}}
|
||||
label
|
||||
input.js-recurring-checkbox(type="checkbox" checked=card.isRecurring)
|
||||
- | Repeat this card
|
||||
+ | {{_ 'repeat-this-card'}}
|
||||
if card.isRecurring
|
||||
label
|
||||
- | Repeat every
|
||||
+ | {{_ 'repeat-every'}}
|
||||
select.js-recurring-pattern
|
||||
- option(value="daily" selected=card.recurrencePattern === 'daily') Daily
|
||||
- option(value="weekly" selected=card.recurrencePattern === 'weekly') Weekly
|
||||
- option(value="monthly" selected=card.recurrencePattern === 'monthly') Monthly
|
||||
+ option(value="daily", selected="#{card.recurrencePattern === 'daily'}") {{_ 'daily'}}
|
||||
+ option(value="weekly", selected="#{card.recurrencePattern === 'weekly'}") {{_ 'weekly'}}
|
||||
+ option(value="monthly", selected="#{card.recurrencePattern === 'monthly'}") {{_ 'monthly'}}
|
||||
label
|
||||
- | End repeat on
|
||||
+ | {{_ 'end-repeat-on'}}
|
||||
input.js-recurring-end-date(type="date" value=card.recurrenceEndDate)
|
||||
if currentBoard.hasAnyAllowsUser
|
||||
hr
|
||||
diff --git a/imports/i18n/data/en.i18n.json b/imports/i18n/data/en.i18n.json
|
||||
index 10260ff2b..b16200c1a 100644
|
||||
--- a/imports/i18n/data/en.i18n.json
|
||||
+++ b/imports/i18n/data/en.i18n.json
|
||||
@@ -1270,5 +1270,12 @@
|
||||
"supportPopup-title": "Support",
|
||||
"accessibility-page-enabled": "Accessibility page enabled",
|
||||
"accessibility-title": "Accessibility topic",
|
||||
- "accessibility-content": "Accessibility content"
|
||||
+ "accessibility-content": "Accessibility content",
|
||||
+ "recurrence": "Recurrence",
|
||||
+ "repeat-this-card": "Repeat this card",
|
||||
+ "repeat-every": "Repeat every",
|
||||
+ "daily": "Daily",
|
||||
+ "weekly": "Weekly",
|
||||
+ "monthly": "Monthly",
|
||||
+ "end-repeat-on": "End repeat on"
|
||||
}
|
||||
```
|
||||
@@ -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
|
||||
|
||||
@@ -129,6 +129,7 @@
|
||||
|
||||
# <a name="Features"></a>Features
|
||||
|
||||
* [Multiline](Multiline)
|
||||
* [Linked Cards](Linked-Cards)
|
||||
* [Drag Drop](https://github.com/wekan/wekan/wiki/Drag-Drop) on Mobile and Desktop
|
||||
* [Rclone: Store attachments to cloud storage like S3, MinIO, etc](Rclone)
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
"activity-archived": "%s انتقل الى الارشيف",
|
||||
"activity-attached": "إرفاق %s ل %s",
|
||||
"activity-created": "أنشأ %s",
|
||||
"activity-changedListTitle": "renamed list to %s",
|
||||
"activity-changedListTitle": "إعادة تسمية القائمة إلى ",
|
||||
"activity-customfield-created": "%s احدت حقل مخصص",
|
||||
"activity-excluded": "استبعاد %s عن %s",
|
||||
"activity-imported": "imported %s into %s from %s",
|
||||
@@ -86,16 +86,16 @@
|
||||
"add-card": "إضافة بطاقة",
|
||||
"add-card-to-top-of-list": "Add Card to Top of List",
|
||||
"add-card-to-bottom-of-list": "Add Card to Bottom of List",
|
||||
"setListWidthPopup-title": "Set Widths",
|
||||
"set-list-width": "Set Widths",
|
||||
"set-list-width-value": "Set Min & Max Widths (pixels)",
|
||||
"list-width-error-message": "List widths must be integers greater than 100",
|
||||
"keyboard-shortcuts-enabled": "Keyboard shortcuts enabled. Click to disable.",
|
||||
"keyboard-shortcuts-disabled": "Keyboard shortcuts disabled. Click to enable.",
|
||||
"setSwimlaneHeightPopup-title": "Set Swimlane Height",
|
||||
"set-swimlane-height": "Set Swimlane Height",
|
||||
"set-swimlane-height-value": "Swimlane Height (pixels)",
|
||||
"swimlane-height-error-message": "Swimlane height must be a positive integer",
|
||||
"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": "ارتفاع مسار السباحة (بكسل)",
|
||||
"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": "لا يمكنك دعوة نفسك",
|
||||
@@ -411,10 +411,10 @@
|
||||
"user-can-not-export-card-to-pdf": "User can not export card to PDF",
|
||||
"exportBoardPopup-title": "Export board",
|
||||
"exportCardPopup-title": "Export card",
|
||||
"sort": "Sort",
|
||||
"sorted": "Sorted",
|
||||
"remove-sort": "Remove sort",
|
||||
"sort-desc": "Click to Sort List",
|
||||
"sort": "رتب",
|
||||
"sorted": "مرتبة",
|
||||
"remove-sort": "إزالة الفرز\n ",
|
||||
"sort-desc": "انقر لفرز القائمة\n ",
|
||||
"list-sort-by": "Sort the List By:",
|
||||
"list-label-modifiedAt": "Last Access Time",
|
||||
"list-label-title": "Name of the List",
|
||||
@@ -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,10 +1204,10 @@
|
||||
"checklistActionsPopup-title": "Checklist Actions",
|
||||
"moveChecklist": "Move Checklist",
|
||||
"moveChecklistPopup-title": "Move Checklist",
|
||||
"newlineBecomesNewChecklistItem": "Each line of text becomes one of the checklist items",
|
||||
"newLineNewItem": "One line of text = one checklist item",
|
||||
"newlineBecomesNewChecklistItemOriginOrder": "Each line of text becomes one of the checklist items, original order",
|
||||
"originOrder": "original order",
|
||||
"newlineBecomesNewChecklistItem": "يصبح كل سطر من النص أحد عناصر قائمة التحقق",
|
||||
"newLineNewItem": "سطر واحد من النص = عنصر واحد من قائمة التحقق",
|
||||
"newlineBecomesNewChecklistItemOriginOrder": "يصبح كل سطر من النص أحد عناصر قائمة التحقق، الترتيب الأصلي",
|
||||
"originOrder": "النظام الأصلي\n ",
|
||||
"copyChecklist": "Copy Checklist",
|
||||
"copyChecklistPopup-title": "Copy Checklist",
|
||||
"card-show-lists": "Card Show Lists",
|
||||
@@ -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": "محتوى إمكانية الوصول"
|
||||
}
|
||||
@@ -319,7 +319,7 @@
|
||||
"copy-card-link-to-clipboard": "Copy card link to clipboard",
|
||||
"copy-text-to-clipboard": "Copy text to clipboard",
|
||||
"linkCardPopup-title": "Link Card",
|
||||
"searchElementPopup-title": "Search",
|
||||
"searchElementPopup-title": "Klask",
|
||||
"copyCardPopup-title": "Copy Card",
|
||||
"copyManyCardsPopup-title": "Copy Template to Many Cards",
|
||||
"copyManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
|
||||
@@ -572,7 +572,7 @@
|
||||
"rescue-card-description": "Show rescue dialogue before closing for unsaved card descriptions",
|
||||
"rescue-card-description-dialogue": "Overwrite current card description with your changes?",
|
||||
"save": "Save",
|
||||
"search": "Search",
|
||||
"search": "Klask",
|
||||
"rules": "Rules",
|
||||
"search-cards": "Search from card/list titles, descriptions and custom fields on this board",
|
||||
"search-example": "Write text you search and press Enter",
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
@@ -125,6 +125,7 @@
|
||||
"archive": "Move to Archive",
|
||||
"archive-all": "Move All to Archive",
|
||||
"archive-board": "Move Board to Archive",
|
||||
"archive-board-confirm": "Are you sure you want to archive this board?",
|
||||
"archive-card": "Move Card to Archive",
|
||||
"archive-list": "Move List to Archive",
|
||||
"archive-swimlane": "Move Swimlane to Archive",
|
||||
@@ -896,6 +897,7 @@
|
||||
"oidc-button-text": "Customize the OIDC button text",
|
||||
"default-authentication-method": "Default Authentication Method",
|
||||
"duplicate-board": "Duplicate Board",
|
||||
"duplicate-board-confirm": "Are you sure you want to duplicate this board?",
|
||||
"org-number": "The number of organizations is: ",
|
||||
"team-number": "The number of teams is: ",
|
||||
"people-number": "The number of people is: ",
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
@@ -300,7 +300,7 @@
|
||||
"color-white": "white",
|
||||
"color-yellow": "flava",
|
||||
"unset-color": "Unset",
|
||||
"comments": "Comments",
|
||||
"comments": "Komentoj",
|
||||
"comment": "Komento",
|
||||
"comment-placeholder": "Write Comment",
|
||||
"comment-only": "Comment only",
|
||||
@@ -1253,7 +1253,7 @@
|
||||
"newTranslationPopup-title": "New custom translation string",
|
||||
"editTranslationPopup-title": "Edit custom translation string",
|
||||
"settingsTranslationPopup-title": "Delete this custom translation string?",
|
||||
"translation": "Translation",
|
||||
"translation": "Traduko",
|
||||
"text": "Teksto",
|
||||
"translation-text": "Translation text",
|
||||
"show-subtasks-field": "Show subtasks field",
|
||||
|
||||
+135
-135
@@ -16,9 +16,9 @@
|
||||
"act-uncheckedItem": "desmarcado el elemento __checklistItem__ de la lista de verificación __checklist__ de la tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-completeChecklist": "completada la lista de verificación __checklist__ de la tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-uncompleteChecklist": "no completada la lista de verificación __checklist__ de la tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-addComment": "comentario en la tarjeta__card__: __comment__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-editComment": "comentario editado en la tarjeta __card__: __comment__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-deleteComment": "comentario eliminado en la tarjeta __card__: __comment__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-addComment": "ha comentado en la tarjeta__card__: __comment__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-editComment": "ha editado la tarjeta __card__: __comment__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-deleteComment": "ha borrado el comentario en la tarjeta __card__: __comment__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
"act-createBoard": "creó el tablero __board__",
|
||||
"act-createSwimlane": "creó el carril de flujo __swimlane__ en el tablero __board__",
|
||||
"act-createCard": "creada la tarjeta __card__ de la lista __list__ del carril __swimlane__ del tablero __board__",
|
||||
@@ -49,7 +49,7 @@
|
||||
"activity-archived": "%s se ha archivado",
|
||||
"activity-attached": "adjuntado(s) %s a %s",
|
||||
"activity-created": "ha creado %s",
|
||||
"activity-changedListTitle": "renamed list to %s",
|
||||
"activity-changedListTitle": "lista renombrada como %s",
|
||||
"activity-customfield-created": "creó el campo personalizado %s",
|
||||
"activity-excluded": "ha excluido %s de %s",
|
||||
"activity-imported": "ha importado %s en %s desde %s",
|
||||
@@ -86,27 +86,27 @@
|
||||
"add-card": "Añadir una tarjeta",
|
||||
"add-card-to-top-of-list": "Subir la tarjeta al principio de la lista",
|
||||
"add-card-to-bottom-of-list": "Bajar la tarjeta al final de la lista",
|
||||
"setListWidthPopup-title": "Set Widths",
|
||||
"set-list-width": "Set Widths",
|
||||
"set-list-width-value": "Set Min & Max Widths (pixels)",
|
||||
"list-width-error-message": "List widths must be integers greater than 100",
|
||||
"keyboard-shortcuts-enabled": "Keyboard shortcuts enabled. Click to disable.",
|
||||
"keyboard-shortcuts-disabled": "Keyboard shortcuts disabled. Click to enable.",
|
||||
"setSwimlaneHeightPopup-title": "Set Swimlane Height",
|
||||
"set-swimlane-height": "Set Swimlane Height",
|
||||
"set-swimlane-height-value": "Swimlane Height (pixels)",
|
||||
"swimlane-height-error-message": "Swimlane height must be a positive integer",
|
||||
"setListWidthPopup-title": "Ajustar anchuras",
|
||||
"set-list-width": "Ajustar anchuras",
|
||||
"set-list-width-value": "Establecer anchos mín. y máx. (píxeles)",
|
||||
"list-width-error-message": "Las anchuras de las listas deben ser enteros mayores de 100",
|
||||
"keyboard-shortcuts-enabled": "Atajos de teclado habilitados. Haz clic para deshabilitarlos.",
|
||||
"keyboard-shortcuts-disabled": "Atajos de teclado deshabilitados. Haz clic para habilitarlos.",
|
||||
"setSwimlaneHeightPopup-title": "Ajustar la altura del carril",
|
||||
"set-swimlane-height": "Ajustar la altura del carril",
|
||||
"set-swimlane-height-value": "Altura de carril (píxeles)",
|
||||
"swimlane-height-error-message": "La altura de carril debe ser un entero positivo",
|
||||
"add-swimlane": "Añadir un carril de flujo",
|
||||
"add-subtask": "Añadir subtarea",
|
||||
"add-checklist": "Añadir una lista de verificación",
|
||||
"add-checklist-item": "Añadir un elemento a la lista de verificación",
|
||||
"close-add-checklist-item": "Close add an item to checklist form",
|
||||
"close-edit-checklist-item": "Close edit an item to checklist form",
|
||||
"close-add-checklist-item": "Cerrar el formulario para añadir un elemento a la lista de verificación",
|
||||
"close-edit-checklist-item": "Cerrar el formulario de edición de un elemento de la lista de verificación",
|
||||
"convertChecklistItemToCardPopup-title": "Convertir en tarjeta",
|
||||
"add-cover": "Add cover image to minicard",
|
||||
"add-cover": "Añadir imagen de portada a la minitarjeta",
|
||||
"add-label": "Añadir una etiqueta",
|
||||
"add-list": "Añadir una lista",
|
||||
"add-after-list": "Add After List",
|
||||
"add-after-list": "Añadir después de la lista",
|
||||
"add-members": "Añadir miembros",
|
||||
"added": "Añadida el",
|
||||
"addMemberPopup-title": "Miembros",
|
||||
@@ -120,7 +120,7 @@
|
||||
"and-n-other-card": "y __count__ tarjeta más",
|
||||
"and-n-other-card_plural": "y otras __count__ tarjetas",
|
||||
"apply": "Aplicar",
|
||||
"app-is-offline": "Cargando, espera por favor. Refrescar esta página causará pérdida de datos. Si la carga no funciona, por favor comprueba que el servidor no se ha parado.",
|
||||
"app-is-offline": "Cargando, espera por favor. Refrescar esta página causará la pérdida de datos. Si la carga no funciona, por favor comprueba que el servidor no se ha parado.",
|
||||
"app-try-reconnect": "Intente reconectar.",
|
||||
"archive": "Archivar",
|
||||
"archive-all": "Archivar todo",
|
||||
@@ -149,10 +149,10 @@
|
||||
"avatar-too-big": "El avatar es demasiado grande (__size__ máx)",
|
||||
"back": "Atrás",
|
||||
"board-change-color": "Cambiar el color",
|
||||
"board-change-background-image": "Change Background Image",
|
||||
"board-background-image-url": "Background Image URL",
|
||||
"add-background-image": "Add Background Image",
|
||||
"remove-background-image": "Remove Background Image",
|
||||
"board-change-background-image": "Cambiar imagen de fondo",
|
||||
"board-background-image-url": "URL de la imagen de fondo",
|
||||
"add-background-image": "Añadir imagen de fondo",
|
||||
"remove-background-image": "Quitar imagen de fondo",
|
||||
"show-at-all-boards-page" : "Mostrar todos los tableros",
|
||||
"board-info-on-my-boards" : "Configuración de todos los tableros",
|
||||
"boardInfoOnMyBoardsPopup-title" : "Configuración de todos los tableros",
|
||||
@@ -163,11 +163,11 @@
|
||||
"board-not-found": "Tablero no encontrado",
|
||||
"board-private-info": "Este tablero será <strong>privado</strong>.",
|
||||
"board-public-info": "Este tablero será <strong>público</strong>.",
|
||||
"board-drag-drop-reorder-or-click-open": "Mueve y posiciona para reordenar los iconos de los tableros. Click en el icono del tablero para abrirlo",
|
||||
"board-drag-drop-reorder-or-click-open": "Arrastra y suelta para reordenar los iconos del tablero. Click en el icono del tablero para abrirlo",
|
||||
"boardChangeColorPopup-title": "Cambiar el fondo del tablero",
|
||||
"boardChangeBackgroundImagePopup-title": "Change Background Image",
|
||||
"boardChangeBackgroundImagePopup-title": "Cambiar imagen de fondo",
|
||||
"allBoardsChangeColorPopup-title": "Cambiar el color",
|
||||
"allBoardsChangeBackgroundImagePopup-title": "Change Background Image",
|
||||
"allBoardsChangeBackgroundImagePopup-title": "Cambiar imagen de fondo",
|
||||
"boardChangeTitlePopup-title": "Renombrar el tablero",
|
||||
"boardChangeVisibilityPopup-title": "Cambiar visibilidad",
|
||||
"boardChangeWatchPopup-title": "Cambiar vigilancia",
|
||||
@@ -217,10 +217,10 @@
|
||||
"vote-against": "contrarios",
|
||||
"deleteVotePopup-title": "¿Borrar voto?",
|
||||
"vote-delete-pop": "El Borrado es permanente. Perderá todas las acciones asociadas con este voto.",
|
||||
"cardStartPlanningPokerPopup-title": "Comenzar una Planning Poker",
|
||||
"card-edit-planning-poker": "Editar la planificación del Poker",
|
||||
"editPokerEndDatePopup-title": "Cambiar la fecha final para la planificación del Poker",
|
||||
"poker-question": "Planificación del Poker",
|
||||
"cardStartPlanningPokerPopup-title": "Comenzar un Planning Poker",
|
||||
"card-edit-planning-poker": "Editar el Planning Poker",
|
||||
"editPokerEndDatePopup-title": "Cambiar la fecha final de voto del Planning Poker",
|
||||
"poker-question": "Planning Poker",
|
||||
"poker-one": "1",
|
||||
"poker-two": "2",
|
||||
"poker-three": "3",
|
||||
@@ -236,8 +236,8 @@
|
||||
"poker-result-who": "¿Quien?",
|
||||
"poker-replay": "Reproducir",
|
||||
"set-estimation": "Fijar estimación",
|
||||
"deletePokerPopup-title": "¿Borrar el póquer de planificación?",
|
||||
"poker-delete-pop": "El borrado es permanente. Perderás todas las acciones asociadas a este póker de planificación.",
|
||||
"deletePokerPopup-title": "¿Borrar el Planning Poker?",
|
||||
"poker-delete-pop": "El borrado es permanente. Perderás todas las acciones asociadas a este Planning Poker.",
|
||||
"cardDeletePopup-title": "¿Eliminar la tarjeta?",
|
||||
"cardArchivePopup-title": "¿Archivar tarjeta?",
|
||||
"cardDetailsActionsPopup-title": "Acciones de la tarjeta",
|
||||
@@ -266,9 +266,9 @@
|
||||
"checklists": "Lista de verificación",
|
||||
"click-to-star": "Haz clic para destacar este tablero.",
|
||||
"click-to-unstar": "Haz clic para dejar de destacar este tablero.",
|
||||
"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": "Ancho de lista automático deshabilitado. Haz clic para habilitarlo.",
|
||||
"click-to-disable-auto-width": "Ancho de lista automático habilitado. Haz clic para deshabilitarlo.",
|
||||
"auto-list-width": "Ancho de lista automático",
|
||||
"clipboard": "el portapapeles o con arrastrar y soltar",
|
||||
"close": "Cerrar",
|
||||
"close-board": "Cerrar el tablero",
|
||||
@@ -300,7 +300,7 @@
|
||||
"color-white": "blanco",
|
||||
"color-yellow": "amarilla",
|
||||
"unset-color": "Desmarcar",
|
||||
"comments": "Comments",
|
||||
"comments": "Comentarios",
|
||||
"comment": "Comentar",
|
||||
"comment-placeholder": "Escribir comentario",
|
||||
"comment-only": "Sólo comentarios",
|
||||
@@ -313,7 +313,7 @@
|
||||
"worker-desc": "Solo puede mover tarjetas, asignarse a la tarjeta y comentar.",
|
||||
"computer": "el ordenador",
|
||||
"confirm-subtask-delete-popup": "¿Seguro que quieres eliminar la subtarea?",
|
||||
"confirm-checklist-delete-popup": "¿Está seguro de que quiere eliminar la lista de tareas?",
|
||||
"confirm-checklist-delete-popup": "¿Está seguro de querer eliminar la lista de tareas?",
|
||||
"subtaskDeletePopup-title": "¿Borrar subtarea?",
|
||||
"checklistDeletePopup-title": "¿Borrar la lista de tareas?",
|
||||
"copy-card-link-to-clipboard": "Copiar el enlace de la tarjeta al portapapeles",
|
||||
@@ -338,7 +338,7 @@
|
||||
"custom-field-date": "Fecha",
|
||||
"custom-field-dropdown": "Lista desplegable",
|
||||
"custom-field-dropdown-none": "(nada)",
|
||||
"custom-field-dropdown-options": "Opciones de la lista",
|
||||
"custom-field-dropdown-options": "Opciones de listas",
|
||||
"custom-field-dropdown-options-placeholder": "Pulsa Intro para añadir más opciones",
|
||||
"custom-field-dropdown-unknown": "(desconocido)",
|
||||
"custom-field-number": "Número",
|
||||
@@ -383,7 +383,7 @@
|
||||
"email-sent": "Correo enviado",
|
||||
"email-verifyEmail-subject": "Verifica tu dirección de correo en __siteName__",
|
||||
"email-verifyEmail-text": "Hola __user__,\n\nPara verificar tu cuenta de correo electrónico, haz clic en el siguiente enlace.\n\n__url__\n\nGracias.",
|
||||
"enable-vertical-scrollbars": "Enable vertical scrollbars",
|
||||
"enable-vertical-scrollbars": "Habilitar barras de desplazamiento verticales",
|
||||
"enable-wip-limit": "Habilitar el límite del trabajo en proceso",
|
||||
"error-board-doesNotExist": "El tablero no existe",
|
||||
"error-board-notAdmin": "Es necesario ser administrador de este tablero para hacer eso",
|
||||
@@ -414,7 +414,7 @@
|
||||
"sort": "Ordenar",
|
||||
"sorted": "Ordenado",
|
||||
"remove-sort": "Eliminar el ordenamiento",
|
||||
"sort-desc": "Click para ordenar la lista",
|
||||
"sort-desc": "Clic para ordenar la lista",
|
||||
"list-sort-by": "Ordenar la lista por:",
|
||||
"list-label-modifiedAt": "Hora de último acceso",
|
||||
"list-label-title": "Nombre de la lista",
|
||||
@@ -451,7 +451,7 @@
|
||||
"advanced-filter-description": "El filtrado avanzado permite escribir una cadena que contiene los siguientes operadores: == != <= >= && || ( ) Se utiliza un espacio como separador entre los operadores. Se pueden filtrar todos los campos personalizados escribiendo sus nombres y valores. Por ejemplo: Campo1 == Valor1. Nota: Si los campos o valores contienen espacios, deben encapsularse entre comillas simples. Por ejemplo: 'Campo 1' == 'Valor 1'. Para omitir los caracteres de control único (' \\\\/), se usa \\\\. Por ejemplo: Campo1 = I\\\\'m. También se pueden combinar múltiples condiciones. Por ejemplo: C1 == V1 || C1 == V2. Normalmente todos los operadores se interpretan de izquierda a derecha. Se puede cambiar el orden colocando paréntesis. Por ejemplo: C1 == V1 && ( C2 == V2 || C2 == V3 ). También se puede buscar en campos de texto usando expresiones regulares: C1 == /Tes.*/i",
|
||||
"fullname": "Nombre completo",
|
||||
"header-logo-title": "Volver a tu página de tableros",
|
||||
"show-activities": "Show Activities",
|
||||
"show-activities": "Mostrar actividades",
|
||||
"headerBarCreateBoardPopup-title": "Crear tablero",
|
||||
"home": "Inicio",
|
||||
"import": "Importar",
|
||||
@@ -500,7 +500,7 @@
|
||||
"list-move-cards": "Mover todas las tarjetas de esta lista",
|
||||
"list-select-cards": "Seleccionar todas las tarjetas de esta lista",
|
||||
"set-color-list": "Cambiar el color",
|
||||
"listActionPopup-title": "Acciones de la lista",
|
||||
"listActionPopup-title": "Acciones de listas",
|
||||
"settingsUserPopup-title": "Preferencias de usuario",
|
||||
"settingsTeamPopup-title": "Configuración del Equipo",
|
||||
"settingsOrgPopup-title": "Configuración de la Organización",
|
||||
@@ -510,7 +510,7 @@
|
||||
"listImportCardsTsvPopup-title": "Importar CSV/TSV",
|
||||
"listMorePopup-title": "Más",
|
||||
"link-list": "Enlazar a esta lista",
|
||||
"list-delete-pop": "Todas las acciones serán eliminadas del historial de actividades y no se podrá recuperar la lista. Esta acción no puede deshacerse.",
|
||||
"list-delete-pop": "Se eliminarán todas las acciones del historial de actividades y no se podrá volver a abrir la lista. Esta acción no puede deshacerse.",
|
||||
"list-delete-suggest-archive": "Puedes mover una lista al Archivo para quitarla del tablero y preservar la actividad.",
|
||||
"lists": "Listas",
|
||||
"swimlanes": "Carriles",
|
||||
@@ -540,7 +540,7 @@
|
||||
"normal": "Normal",
|
||||
"normal-desc": "Puedes ver y editar tarjetas. No puedes cambiar la configuración.",
|
||||
"not-accepted-yet": "La invitación no ha sido aceptada aún",
|
||||
"notify-participate": "Receive updates to any cards you participate as creator or member",
|
||||
"notify-participate": "Recibir actualizaciones de cualquier tarjeta en la que participes como creador o miembro",
|
||||
"notify-watch": "Recibir actuaizaciones de cualquier tablero, lista o tarjeta que estés vigilando",
|
||||
"optional": "opcional",
|
||||
"or": "o",
|
||||
@@ -558,7 +558,7 @@
|
||||
"public": "Público",
|
||||
"public-desc": "Este tablero es público. Es visible para cualquiera a través del enlace, y se mostrará en los buscadores como Google. Sólo las personas añadidas al tablero pueden editarlo.",
|
||||
"quick-access-description": "Destaca un tablero para añadir un acceso directo en esta barra.",
|
||||
"remove-cover": "Remove cover image from minicard",
|
||||
"remove-cover": "Quitar imagen de portada de la minitarjeta",
|
||||
"remove-from-board": "Desvincular del tablero",
|
||||
"remove-label": "Eliminar la etiqueta",
|
||||
"listDeletePopup-title": "¿Eliminar la lista?",
|
||||
@@ -580,14 +580,14 @@
|
||||
"select-board": "Seleccionar tablero",
|
||||
"set-wip-limit-value": "Cambiar el límite para el número máximo de tareas en esta lista.",
|
||||
"setWipLimitPopup-title": "Establecer el límite del trabajo en proceso",
|
||||
"shortcut-add-self": "Add yourself to current card",
|
||||
"shortcut-add-self": "Añadirte a ti mismo a la tarjeta actual",
|
||||
"shortcut-assign-self": "Asignarte a ti mismo a la tarjeta actual",
|
||||
"shortcut-autocomplete-emoji": "Autocompletar emoji",
|
||||
"shortcut-autocomplete-members": "Autocompletar miembros",
|
||||
"shortcut-clear-filters": "Limpiar todos los filtros",
|
||||
"shortcut-close-dialog": "Cerrar el cuadro de diálogo",
|
||||
"shortcut-filter-my-cards": "Filtrar mis tarjetas",
|
||||
"shortcut-filter-my-assigned-cards": "Filter my assigned cards",
|
||||
"shortcut-filter-my-assigned-cards": "Filtrar mis tarjetas asignadas",
|
||||
"shortcut-show-shortcuts": "Mostrar esta lista de atajos",
|
||||
"shortcut-toggle-filterbar": "Conmutar la barra lateral del filtro",
|
||||
"shortcut-toggle-searchbar": "Conmutar la barra lateral de búsqueda",
|
||||
@@ -604,13 +604,13 @@
|
||||
"this-board": "este tablero",
|
||||
"this-card": "esta tarjeta",
|
||||
"spent-time-hours": "Tiempo consumido (horas)",
|
||||
"overtime-hours": "Tiempo excesivo (horas)",
|
||||
"overtime-hours": "Horas extras",
|
||||
"overtime": "Tiempo excesivo",
|
||||
"has-overtime-cards": "Hay tarjetas con el tiempo excedido",
|
||||
"has-spenttime-cards": "Se ha excedido el tiempo de las tarjetas",
|
||||
"time": "Hora",
|
||||
"title": "Título",
|
||||
"toggle-assignees": "Toggle assignees 1-9 for card (By order of addition to board).",
|
||||
"toggle-assignees": "Alternar asignados 1-9 para la tarjeta (por orden de adición al tablero).",
|
||||
"toggle-labels": "Alterna las etiquetas 1-9 para la tarjeta. La selección múltiple añade las etiquetas 1-9",
|
||||
"remove-labels-multiselect": "La selección múltiple elimina las etiquetas 1-9",
|
||||
"tracking": "Siguiendo",
|
||||
@@ -624,12 +624,12 @@
|
||||
"uploaded-avatar": "Avatar cargado",
|
||||
"custom-top-left-corner-logo-image-url": "Personalizar la URL del logotipo en la esquina superior izquierda",
|
||||
"custom-top-left-corner-logo-link-url": "Personalizar el enlace del logotipo de la esquina superior izquierda",
|
||||
"custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27",
|
||||
"custom-top-left-corner-logo-height": "Altura personalizada del logo de la esquina superior izquierda. Por defecto: 27",
|
||||
"custom-login-logo-image-url": "Custom Login Logo Image URL",
|
||||
"custom-login-logo-link-url": "Custom Login Logo Link URL",
|
||||
"custom-help-link-url": "Custom Help Link URL",
|
||||
"custom-help-link-url": "Enlace URL de ayuda personalizada",
|
||||
"text-below-custom-login-logo": "Text below Custom Login Logo",
|
||||
"automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line",
|
||||
"automatic-linked-url-schemes": "Esquemas de URL personalizados que deberían ser clicables automáticamente. Un esquema de URL por línea.",
|
||||
"username": "Nombre de usuario",
|
||||
"import-usernames": "Importar Usuarios",
|
||||
"view-it": "Verla",
|
||||
@@ -656,7 +656,7 @@
|
||||
"disable-forgot-password": "Disable Forgot Password",
|
||||
"invite": "Invitar",
|
||||
"invite-people": "Invitar a personas",
|
||||
"to-boards": "A el(los) tablero(s)",
|
||||
"to-boards": "Al (A los) tablero(s)",
|
||||
"email-addresses": "Direcciones de correo electrónico",
|
||||
"smtp-host-description": "Dirección del servidor SMTP para gestionar tus correos",
|
||||
"smtp-port-description": "Puerto usado por el servidor SMTP para mandar correos",
|
||||
@@ -731,7 +731,7 @@
|
||||
"setListColorPopup-title": "Elegir un color",
|
||||
"assigned-by": "Asignado por",
|
||||
"requested-by": "Solicitado por",
|
||||
"card-sorting-by-number": "Card sorting by number",
|
||||
"card-sorting-by-number": "Orden de tarjetas por número",
|
||||
"board-delete-notice": "Se eliminarán todas las listas, tarjetas y acciones asociadas a este tablero. Esta acción no puede deshacerse.",
|
||||
"delete-board-confirm-popup": "Se eliminarán todas las listas, tarjetas, etiquetas y actividades, y no podrás recuperar los contenidos del tablero. Esta acción no puede deshacerse.",
|
||||
"boardDeletePopup-title": "¿Eliminar el tablero?",
|
||||
@@ -742,7 +742,7 @@
|
||||
"queue": "Cola",
|
||||
"subtask-settings": "Preferencias de las subtareas",
|
||||
"card-settings": "Preferencias de la tarjeta",
|
||||
"minicard-settings": "Minicard Settings",
|
||||
"minicard-settings": "Configuración de minitarjeta",
|
||||
"boardSubtaskSettingsPopup-title": "Preferencias de las subtareas del tablero",
|
||||
"boardCardSettingsPopup-title": "Preferencias de la tarjeta",
|
||||
"boardMinicardSettingsPopup-title": "Minicard Settings",
|
||||
@@ -750,9 +750,9 @@
|
||||
"deposit-subtasks-list": "Lista de destino para subtareas depositadas aquí:",
|
||||
"show-parent-in-minicard": "Mostrar el padre en una minitarjeta:",
|
||||
"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": "Imagen de portada de la minitarjeta",
|
||||
"badge-attachment-on-minicard": "Contador de adjuntos en la minitarjeta",
|
||||
"card-sorting-by-number-on-minicard": "Orden de tarjetas por número de minitarjeta",
|
||||
"prefix-with-full-path": "Prefijo con ruta completa",
|
||||
"prefix-with-parent": "Prefijo con el padre",
|
||||
"subtext-with-full-path": "Subtexto con ruta completa",
|
||||
@@ -786,7 +786,7 @@
|
||||
"r-added-to": "Añadido a",
|
||||
"r-removed-from": "eliminado de",
|
||||
"r-the-board": "el tablero",
|
||||
"r-list": "la lista",
|
||||
"r-list": "lista",
|
||||
"set-filter": "Filtrar",
|
||||
"r-moved-to": "Movido a",
|
||||
"r-moved-from": "Movido desde",
|
||||
@@ -861,12 +861,12 @@
|
||||
"r-d-remove-checklist": "Eliminar lista de verificación",
|
||||
"r-by": "por",
|
||||
"r-add-checklist": "Añadir una lista de verificación",
|
||||
"r-with-items": "con items",
|
||||
"r-with-items": "con elementos",
|
||||
"r-items-list": "item1,item2,item3",
|
||||
"r-add-swimlane": "Agregar el carril",
|
||||
"r-swimlane-name": "nombre del carril",
|
||||
"r-board-note": "Nota: deje un campo vacío para que coincida con todos los valores posibles",
|
||||
"r-checklist-note": "Nota: los ítems de la lista tienen que escribirse como valores separados por coma.",
|
||||
"r-checklist-note": "Nota: los elementos de la lista tienen que escribirse como valores separados por coma.",
|
||||
"r-when-a-card-is-moved": "Cuando una tarjeta es movida a otra lista",
|
||||
"r-set": "Cambiar",
|
||||
"r-update": "Actualizar",
|
||||
@@ -877,7 +877,7 @@
|
||||
"r-df-received-at": "recibido",
|
||||
"r-to-current-datetime": "a la fecha/hora actual",
|
||||
"r-remove-value-from": "Eliminar el valor de",
|
||||
"r-link-card": "Link card to",
|
||||
"r-link-card": "Enlazar tarjeta a",
|
||||
"ldap": "LDAP",
|
||||
"oauth2": "OAuth2",
|
||||
"cas": "CAS",
|
||||
@@ -890,7 +890,7 @@
|
||||
"hide-board-member-list": "Hide board member list on All Boards",
|
||||
"add-custom-html-after-body-start": "Añade HTML personalizado después de <body>",
|
||||
"add-custom-html-before-body-end": "Añade HTML personalizado después de </body>",
|
||||
"error-undefined": "Algo no está bien",
|
||||
"error-undefined": "Algo ha salido mal",
|
||||
"error-ldap-login": "Ocurrió un error al intentar acceder",
|
||||
"display-authentication-method": "Mostrar el método de autenticación",
|
||||
"oidc-button-text": "Customize the OIDC button text",
|
||||
@@ -916,15 +916,15 @@
|
||||
"almostdue": "está próxima la hora de vencimiento actual %s",
|
||||
"pastdue": "se sobrepasó la hora de vencimiento actual%s",
|
||||
"duenow": "la hora de vencimiento actual %s es hoy",
|
||||
"act-newDue": "__list__/__card__ tiene una 1ra notificación de vencimiento [__board__]",
|
||||
"act-newDue": "__list__/__card__ tiene una primera notificación de vencimiento [__board__]",
|
||||
"act-withDue": "__list__/__card__ notificaciones de vencimiento [__board__]",
|
||||
"act-almostdue": "se ha notificado que el vencimiento actual (__timeValue__) de __card__ está próximo",
|
||||
"act-pastdue": "se ha notificado que el vencimiento actual (__timeValue__) de __card__ se sobrepasó",
|
||||
"act-duenow": "se ha notificado que el vencimiento actual (__timeValue__) de __card__ es ahora",
|
||||
"act-atUserComment": "Se te mencionó en [__board__] __list__/__card__",
|
||||
"delete-user-confirm-popup": "¿Seguro que quieres eliminar esta cuenta? Esta acción no puede deshacerse.",
|
||||
"delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.",
|
||||
"delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.",
|
||||
"delete-user-confirm-popup": "¿Estás seguro de querer eliminar esta cuenta? Esta acción no puede deshacerse.",
|
||||
"delete-team-confirm-popup": "¿Estás seguro de querer eliminar este equipo? Esta acción no puede deshacerse",
|
||||
"delete-org-confirm-popup": "¿Estás seguro de querer eliminar esta organización? Esta acción no puede deshacerse.",
|
||||
"accounts-allowUserDelete": "Permitir a los usuarios eliminar su cuenta",
|
||||
"hide-minicard-label-text": "Ocultar el texto de la etiqueta de la minitarjeta",
|
||||
"show-desktop-drag-handles": "Mostrar los controles de arrastre del escritorio",
|
||||
@@ -966,7 +966,7 @@
|
||||
"delete-linked-card-before-this-card": "No puede borrar esta tarjeta antes de borrar la tarjeta enlazada que tiene",
|
||||
"delete-linked-cards-before-this-list": "No puede borrar esta lista antes de borrar las tarjetas enlazadas que apuntan a tarjetas en esta lista",
|
||||
"hide-checked-items": "Ocultar elementos marcados",
|
||||
"hide-finished-checklist": "Hide finished checklist",
|
||||
"hide-finished-checklist": "Esconder la lista de tareas finalizada",
|
||||
"task": "Tarea",
|
||||
"create-task": "Crear Tarea",
|
||||
"ok": "Vale",
|
||||
@@ -974,7 +974,7 @@
|
||||
"teams": "Equipos",
|
||||
"displayName": "Mostrar Nombre",
|
||||
"shortName": "Nombre Corto",
|
||||
"autoAddUsersWithDomainName": "Automatically add users with the domain name",
|
||||
"autoAddUsersWithDomainName": "Añadir automáticamente usuarios con el nombre del dominio",
|
||||
"website": "Sitio web",
|
||||
"person": "Persona",
|
||||
"my-cards": "Mis Tarjetas",
|
||||
@@ -998,13 +998,13 @@
|
||||
"dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.",
|
||||
"broken-cards": "Tarjetas Rotas",
|
||||
"board-title-not-found": "Tablero '%s' no encontrado.",
|
||||
"swimlane-title-not-found": "Swimlane '%s' not found.",
|
||||
"swimlane-title-not-found": "Carril '%s' no encontrado.",
|
||||
"list-title-not-found": "Lista '%s' no encontrada.",
|
||||
"label-not-found": "Etiqueta '%s' no encontrada.",
|
||||
"label-color-not-found": "Label color %s not found.",
|
||||
"user-username-not-found": "Usuario '%s' no encontrado.",
|
||||
"comment-not-found": "Card with comment containing text '%s' not found.",
|
||||
"org-name-not-found": "Organization '%s' not found.",
|
||||
"org-name-not-found": "Organización '%s' no encontrada.",
|
||||
"team-name-not-found": "Team '%s' not found.",
|
||||
"globalSearch-title": "Buscar todas las tarjetas",
|
||||
"no-cards-found": "Ninguna tarjeta encontrada",
|
||||
@@ -1013,9 +1013,9 @@
|
||||
"n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found",
|
||||
"operator-board": "tablero",
|
||||
"operator-board-abbrev": "b",
|
||||
"operator-swimlane": "swimlane",
|
||||
"operator-swimlane": "carril",
|
||||
"operator-swimlane-abbrev": "s",
|
||||
"operator-list": "la lista",
|
||||
"operator-list": "lista",
|
||||
"operator-list-abbrev": "l",
|
||||
"operator-label": "etiqueta",
|
||||
"operator-label-abbrev": "#",
|
||||
@@ -1041,7 +1041,7 @@
|
||||
"predicate-open": "abierto",
|
||||
"predicate-ended": "finalizó",
|
||||
"predicate-all": "todo",
|
||||
"predicate-overdue": "overdue",
|
||||
"predicate-overdue": "atrasado",
|
||||
"predicate-week": "semana",
|
||||
"predicate-month": "mes",
|
||||
"predicate-quarter": "cuarto",
|
||||
@@ -1064,45 +1064,45 @@
|
||||
"operator-number-expected": "operator __operator__ expected a number, got '__value__'",
|
||||
"operator-sort-invalid": "sort of '%s' is invalid",
|
||||
"operator-status-invalid": "'%s' no es un estado válido",
|
||||
"operator-has-invalid": "%s is not a valid existence check",
|
||||
"operator-has-invalid": "%s no es una comprobación de existencia válida",
|
||||
"operator-limit-invalid": "%s no es un límite válido. El límite ha de ser un entero positivo.",
|
||||
"operator-debug-invalid": "%s is not a valid debug predicate",
|
||||
"next-page": "Página Siguiente",
|
||||
"previous-page": "Página Anterior",
|
||||
"heading-notes": "Notas",
|
||||
"globalSearch-instructions-heading": "Buscar instrucciones.",
|
||||
"globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).",
|
||||
"globalSearch-instructions-heading": "Instrucciones de búsqueda",
|
||||
"globalSearch-instructions-description": "Se pueden usar operadores para refinar la búsqueda. Los operadores se especifican escribiendo el nombre del operador y su valor separado por dos puntos. Por ejemplo, especificar `lista:Bloqueada` limitaría la búsqueda a tarjetas que conengan una lista llamada *Bloqueada*. Si el valor contiene espacios o caracteres especiales, debe escribirse entre comillas (por ejemplo: `__operator_list__:\"To Review\"`).",
|
||||
"globalSearch-instructions-operators": "Operadores disponibles:",
|
||||
"globalSearch-instructions-operator-board": "`__operator_board__:<title>` - cards in boards matching the specified *<title>*",
|
||||
"globalSearch-instructions-operator-board": "`__operator_board__:<title>` - tarjetas en tableros que coincidan con *<title>*",
|
||||
"globalSearch-instructions-operator-list": "`__operator_list__:<title>` - cards in lists matching the specified *<title>*",
|
||||
"globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*",
|
||||
"globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.",
|
||||
"globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - tarjetas con comentarios que contengan *<text>*.",
|
||||
"globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>",
|
||||
"globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`",
|
||||
"globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - abreviatura para `__operator_label__:<color>` o `__operator_label__:<name>`",
|
||||
"globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*",
|
||||
"globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`",
|
||||
"globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - abreviatura para `user:<username>`",
|
||||
"globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*",
|
||||
"globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*",
|
||||
"globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator",
|
||||
"globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - tarjetas donde *<username>* es el creador de la tarjeta",
|
||||
"globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cards belonging to a board assigned to organization *<name>*",
|
||||
"globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cards belonging to a board assigned to team *<name>*",
|
||||
"globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now. `__operator_due__:__predicate_overdue__ lists all cards past their due date.",
|
||||
"globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - las tarjetas pertenecientes al tablero asignadas al equipo *<name>*",
|
||||
"globalSearch-instructions-operator-due": "`__operator_due__:<n>` - tarjetas que vencen dentro de *<n>* days. `__operator_due__:__predicate_overdue__ lista todas las tarjetas que han vencido.",
|
||||
"globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less",
|
||||
"globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less",
|
||||
"globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:",
|
||||
"globalSearch-instructions-operator-status": "`__operator_status__:<status>` - donde *<status>* puede ser uno de los siguientes:",
|
||||
"globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards",
|
||||
"globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards",
|
||||
"globalSearch-instructions-status-all": "`__predicate_all__` - todas las tarjetas archivadas o no archivadas",
|
||||
"globalSearch-instructions-status-ended": "`__predicate_ended__` - cards with an end date",
|
||||
"globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards",
|
||||
"globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards",
|
||||
"globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`. Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).",
|
||||
"globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`. For a descending sort, place a `-` in front of the sort name.",
|
||||
"globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.",
|
||||
"globalSearch-instructions-notes-1": "Múltiple operadores pueden ser seleccionados.",
|
||||
"globalSearch-instructions-notes-2": "Similar operators are *OR*ed together. Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.",
|
||||
"globalSearch-instructions-notes-3": "Differing operators are *AND*ed together. Only cards that match all of the differing operators are returned. `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.",
|
||||
"globalSearch-instructions-status-private": "`__predicate_private__` - solo tarjetas de tableros privados",
|
||||
"globalSearch-instructions-operator-has": "`__operator_has__:<field>` - donde *<field>* puede ser `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` o `__predicate_member__`. Colocando un `-` delante de *<field>* busca la ausencia del valor en ese campo (por ejemplo, `has:-due` busca tarjetas sin fecha de vencimiento).",
|
||||
"globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - donde *<sort-name>* puede ser `__predicate_due__`, `__predicate_created__` o `__predicate_modified__`. Para ordenar descendentemente, coloca un `-` delante del tipo de orden.",
|
||||
"globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - donde *<n>* es un entero positivo que expresa el número de tarjetas que se mostrarán por página.",
|
||||
"globalSearch-instructions-notes-1": "Se pueden especificar múltiples operadores.",
|
||||
"globalSearch-instructions-notes-2": "Múltiples condiciones de operadores parecidos se tratan internamente con el operador lógico OR. Es decir, la búsqueda devolverá las tarjetas que coincidan con alguna de las condiciones:\n`__operator_list__:Disponible __operator_list__:Bloqueada` devolverá tarjetas contenidas en cualquier lista nombrada *Bloqueada* o *Disponible*.",
|
||||
"globalSearch-instructions-notes-3": "Múltiples condiciones de operadores distintos se tratan internamente con el operador lógico AND. Es decir, la búsqueda devolverá las tarjetas que coincidan con TODAS las condiciones:\n`__operator_list__:Disponible __operator_label__:rojo` devuelve sólo las tarjetas en la lista *Disponible* con una etiqueta *roja*.",
|
||||
"globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.",
|
||||
"globalSearch-instructions-notes-4": "La búsqueda de texto distingue entre mayúsculas y minúsculas.",
|
||||
"globalSearch-instructions-notes-4": "Las búsquedas de texto no distinguen entre mayúsculas y minúsculas.",
|
||||
"globalSearch-instructions-notes-5": "Por defecto no se buscan las tarjetas archivadas.",
|
||||
"link-to-search": "Enlazar a esta búsqueda",
|
||||
"excel-font": "Arial",
|
||||
@@ -1111,32 +1111,32 @@
|
||||
"label-names": "Nombres de las etiquetas",
|
||||
"archived-at": "archivado el",
|
||||
"sort-cards": "Ordenar tarjetas",
|
||||
"sort-is-on": "Sort is on",
|
||||
"sort-is-on": "Ordenamiento activado",
|
||||
"cardsSortPopup-title": "Ordenar tarjetas",
|
||||
"due-date": "Fecha de Vencimiento",
|
||||
"server-error": "Error del Servidor",
|
||||
"server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`",
|
||||
"server-error-troubleshooting": "Por favor, envíe el error generado por el servidor.\nPara la instalación con snap, ejecute: `sudo snap logs wekan.wekan`\nPara la instalación con docker, ejecute: `sudo docker logs wekan-app`",
|
||||
"title-alphabetically": "Título (Alfabéticamente)",
|
||||
"created-at-newest-first": "Creación (Nuevos Primero)",
|
||||
"created-at-oldest-first": "Creación (Antiguos Primero)",
|
||||
"links-heading": "Enlaces",
|
||||
"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": "No mostrar las actividades del tablero en todos los tableros",
|
||||
"now-activities-of-all-boards-are-hidden": "Todas las actividades de todos los tableros están ahora ocultas",
|
||||
"move-swimlane": "Move Swimlane",
|
||||
"moveSwimlanePopup-title": "Move Swimlane",
|
||||
"custom-field-stringtemplate": "String Template",
|
||||
"custom-field-stringtemplate": "Plantilla de cadenas",
|
||||
"custom-field-stringtemplate-format": "Format (use %{value} as placeholder)",
|
||||
"custom-field-stringtemplate-separator": "Separator (use   or for a space)",
|
||||
"custom-field-stringtemplate-item-placeholder": "Pulsa intro para añadir más elementos",
|
||||
"creator": "Creador",
|
||||
"creator-on-minicard": "Creator on minicard",
|
||||
"creator-on-minicard": "Creador en minitarjeta",
|
||||
"filesReportTitle": "Informe sobre los archivos",
|
||||
"reports": "Informes",
|
||||
"rulesReportTitle": "Informe sobre las Reglas",
|
||||
"boardsReportTitle": "Informe sobre los Tableros",
|
||||
"cardsReportTitle": "Informe sobre las Tarjetas",
|
||||
"copy-swimlane": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copy Swimlane",
|
||||
"copySwimlanePopup-title": "Copiar carril",
|
||||
"display-card-creator": "Mostrar Creador de la Tarjeta",
|
||||
"wait-spinner": "Wait Spinner",
|
||||
"Bounce": "Bounce Wait Spinner",
|
||||
@@ -1150,7 +1150,7 @@
|
||||
"maximize-card": "Maximizar Tarjeta",
|
||||
"minimize-card": "Minimizar Tarjeta",
|
||||
"delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
|
||||
"delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it",
|
||||
"delete-team-warning-message": "No se puede eliminar este equipo, hay al menos un usuario que pertenece a este equipo.",
|
||||
"subject": "Asunto",
|
||||
"details": "Detalles",
|
||||
"carbon-copy": "Carbon Copy (Cc:)",
|
||||
@@ -1175,9 +1175,9 @@
|
||||
"remove-btn": "Eliminar",
|
||||
"filter-card-title-label": "Filtrar por el título de la tarjeta",
|
||||
"invite-people-success": "Invitation to register sent with success",
|
||||
"invite-people-error": "Error while sending invitation to register",
|
||||
"invite-people-error": "Error al enviar la invitación para registrarse",
|
||||
"can-invite-if-same-mailDomainName": "Email domain name",
|
||||
"to-create-teams-contact-admin": "To create teams, please contact the administrator.",
|
||||
"to-create-teams-contact-admin": "Para crear equipos, por favor contacte con el administrador.",
|
||||
"Node_heap_total_heap_size": "Node heap: total heap size",
|
||||
"Node_heap_total_heap_size_executable": "Node heap: total heap size executable",
|
||||
"Node_heap_total_physical_size": "Node heap: total physical size",
|
||||
@@ -1195,7 +1195,7 @@
|
||||
"Node_memory_usage_external": "Node memory usage: external",
|
||||
"add-organizations": "Añadir organizaciones",
|
||||
"add-organizations-label": "Added organizations are displayed below:",
|
||||
"remove-organization-from-board": "Are you sure you want to remove this organization from this board ?",
|
||||
"remove-organization-from-board": "¿Estás seguro de querer quitar esta organización del tablero?",
|
||||
"to-create-organizations-contact-admin": "Para crear organizaciones, póngase en contacto con el administrador.",
|
||||
"custom-legal-notice-link-url": "URL personalizada de la página de aviso legal",
|
||||
"acceptance_of_our_legalNotice": "Al continuar, usted acepta nuestra",
|
||||
@@ -1204,25 +1204,25 @@
|
||||
"checklistActionsPopup-title": "Acciones de la Lista de Tareas",
|
||||
"moveChecklist": "Mover Lista de Tareas",
|
||||
"moveChecklistPopup-title": "Mover Lista de Tareas",
|
||||
"newlineBecomesNewChecklistItem": "Each line of text becomes one of the checklist items",
|
||||
"newLineNewItem": "One line of text = one checklist item",
|
||||
"newlineBecomesNewChecklistItemOriginOrder": "Each line of text becomes one of the checklist items, original order",
|
||||
"originOrder": "original order",
|
||||
"newlineBecomesNewChecklistItem": "Cada línea de texto se convierte en un nuevo elemento de la lista de verificación",
|
||||
"newLineNewItem": "Una línea de texto = un elemento de la lista de verificación",
|
||||
"newlineBecomesNewChecklistItemOriginOrder": "Cada línea de texto se convierte en un nuevo elemento de la lista de verificación, orden original",
|
||||
"originOrder": "orden original",
|
||||
"copyChecklist": "Copiar Lista de Tareas",
|
||||
"copyChecklistPopup-title": "Copiar Lista de Tareas",
|
||||
"card-show-lists": "Mostrar Listas de Tarjetas",
|
||||
"subtaskActionsPopup-title": "Acciones de la Subtarea",
|
||||
"attachmentActionsPopup-title": "Acciones de Adhesión",
|
||||
"attachment-move-storage-fs": "Mover el archivo adjunto al sistema de archivos",
|
||||
"attachment-move-storage-gridfs": "Move attachment to GridFS",
|
||||
"attachment-move-storage-gridfs": "Mover adjunto a GridFS",
|
||||
"attachment-move-storage-s3": "Move attachment to S3",
|
||||
"attachment-move": "Mover el Adjunto",
|
||||
"move-all-attachments-to-fs": "Mover todos los archivos adjuntos al sistema de archivos",
|
||||
"move-all-attachments-to-gridfs": "Move all attachments to GridFS",
|
||||
"move-all-attachments-to-gridfs": "Mover todos los adjuntos a GridFS",
|
||||
"move-all-attachments-to-s3": "Move all attachments to S3",
|
||||
"move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem",
|
||||
"move-all-attachments-of-board-to-fs": "Mover todos los adjuntos del tablero al sistema de archivos",
|
||||
"move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS",
|
||||
"move-all-attachments-of-board-to-s3": "Move all attachments of board to S3",
|
||||
"move-all-attachments-of-board-to-s3": "Mover todos los adjuntos del tablero a S3",
|
||||
"path": "Ruta",
|
||||
"version-name": "Nombre de la versión",
|
||||
"size": "Tamaño",
|
||||
@@ -1234,7 +1234,7 @@
|
||||
"remaining_time": "Tiempo restante",
|
||||
"speed": "Velocidad",
|
||||
"progress": "Progreso",
|
||||
"password-again": "Password (again)",
|
||||
"password-again": "Contraseña (repetir)",
|
||||
"if-you-already-have-an-account": "If you already have an account",
|
||||
"register": "Register",
|
||||
"forgot-password": "Forgot password",
|
||||
@@ -1246,27 +1246,27 @@
|
||||
"max-avatar-filesize": "Máximo tamaño de archivo de avatar en bytes:",
|
||||
"allowed-avatar-filetypes": "Tipos de archivo permitidos para el avatar:",
|
||||
"invalid-file": "Si el nombre de archivo no es válido, la carga o el cambio de nombre es cancelado.",
|
||||
"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",
|
||||
"preview-pdf-not-supported": "Tu dispositivo no permite previsualizar PDF. Intenta descargarlo.",
|
||||
"drag-board": "Arrastrar tablero",
|
||||
"translation-number": "El número de cadenas de traducción personalizadas es:",
|
||||
"delete-translation-confirm-popup": "¿Estás seguro de querer eliminar esta cadena de traducción personalizada? Esta acción no puede deshacerse.",
|
||||
"newTranslationPopup-title": "Nueva cadena de traducción personalizada",
|
||||
"editTranslationPopup-title": "Editar cadena de traducción personalizada",
|
||||
"settingsTranslationPopup-title": "¿Borrar esta cadena de traducción personalizada?",
|
||||
"translation": "Traducción",
|
||||
"text": "Texto",
|
||||
"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": "Texto de traducción",
|
||||
"show-subtasks-field": "Mostrar campo de subtareas",
|
||||
"show-week-of-year": "Mostrar semana del año (ISO 8601)",
|
||||
"convert-to-markdown": "Convertir en Markdown",
|
||||
"import-board-zip": "Añadir archivo .zip que contenga los archivos JSON del tablero y los nombres de las subcarpetas con adjuntos del tablero",
|
||||
"collapse": "Contraer",
|
||||
"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": "Expandir",
|
||||
"hideCheckedChecklistItems": "Ocultar elementos marcados de la lista de verificación",
|
||||
"hideAllChecklistItems": "Ocultar todos los elementos de la lista de verificación",
|
||||
"support": "Soporte",
|
||||
"supportPopup-title": "Soporte",
|
||||
"accessibility-page-enabled": "Página de accesibilidad habilitada",
|
||||
"accessibility-title": "Temas de accesibilidad",
|
||||
"accessibility-content": "Contenido de accesibilidad"
|
||||
}
|
||||
@@ -90,8 +90,8 @@
|
||||
"set-list-width": "Ezarri zabalerak",
|
||||
"set-list-width-value": "Ezarri gutxieneko eta gehieneko zabalerak (pixel)",
|
||||
"list-width-error-message": "Zerrenden zabalerak 100 baino handiagoak izan behar dira",
|
||||
"keyboard-shortcuts-enabled": "Keyboard shortcuts enabled. Click to disable.",
|
||||
"keyboard-shortcuts-disabled": "Keyboard shortcuts disabled. Click to enable.",
|
||||
"keyboard-shortcuts-enabled": "Laster-teklak gaituta. Egin klik desgaitzeko.",
|
||||
"keyboard-shortcuts-disabled": "Laster-teklak desgaituta. Egin klik gaitzeko.",
|
||||
"setSwimlaneHeightPopup-title": "Errailaren altuera ezarri",
|
||||
"set-swimlane-height": "Errailaren altuera ezarri",
|
||||
"set-swimlane-height-value": "Errailaren altuera (pixelak)",
|
||||
@@ -266,9 +266,9 @@
|
||||
"checklists": "Kontrol-zerrendak",
|
||||
"click-to-star": "Egin klik arbel honi izarra jartzeko",
|
||||
"click-to-unstar": "Egin klik arbel honi izarra kentzeko",
|
||||
"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": "Zerrenda zabalera automatikoa desgaituta dago. Egin klik gaitzeko.",
|
||||
"click-to-disable-auto-width": "Zerrenda zabalera automatikoa gaituta dago. Egin klik desgaitzeko.",
|
||||
"auto-list-width": "Zerrenda zabalera automatikoa",
|
||||
"clipboard": "Kopiatu eta itsatsi edo arrastatu eta jaregin",
|
||||
"close": "Itxi",
|
||||
"close-board": "Itxi arbela",
|
||||
@@ -383,7 +383,7 @@
|
||||
"email-sent": "E-posta bidali da",
|
||||
"email-verifyEmail-subject": "Egiaztatu __siteName__ guneko zure e-posta helbidea.",
|
||||
"email-verifyEmail-text": "Kaixo __user__,\n\nZure e-posta kontua egiaztatzeko, egin klik beheko loturan.\n\n__url__\n\nEskerrik asko.",
|
||||
"enable-vertical-scrollbars": "Enable vertical scrollbars",
|
||||
"enable-vertical-scrollbars": "Gaitu korritze barra bertikalak",
|
||||
"enable-wip-limit": "WIP muga gaitu",
|
||||
"error-board-doesNotExist": "Arbel hau ez da existitzen",
|
||||
"error-board-notAdmin": "Arbel honetako kudeatzailea izan behar zara hori egin ahal izateko",
|
||||
@@ -1257,7 +1257,7 @@
|
||||
"text": "Testua",
|
||||
"translation-text": "itzulpenaren testua",
|
||||
"show-subtasks-field": "azpi-zereginen eremua bezala",
|
||||
"show-week-of-year": "Show week of year (ISO 8601)",
|
||||
"show-week-of-year": "Erakutsi rrteko aste zenbakia (ISO 8601)",
|
||||
"convert-to-markdown": "Bihurtu markdown-era",
|
||||
"import-board-zip": "Gehitu taula JSON fitxategiak dituen .zip fitxategia eta eranskinak dituzten taularen izenen azpidirektorioak",
|
||||
"collapse": "Tolestu",
|
||||
|
||||
@@ -107,7 +107,7 @@
|
||||
"add-label": "Ajouter une étiquette",
|
||||
"add-list": "Ajouter une liste",
|
||||
"add-after-list": "Ajouter après la liste",
|
||||
"add-members": "Assigner des participants",
|
||||
"add-members": "Ajouter des participants",
|
||||
"added": "Ajouté le",
|
||||
"addMemberPopup-title": "Participants",
|
||||
"memberPopup-title": "Préférence du participant",
|
||||
@@ -139,7 +139,7 @@
|
||||
"templates": "Modèles",
|
||||
"template-container": "Conteneur de modèles",
|
||||
"add-template-container": "Ajouter un conteneur de modèles",
|
||||
"assign-member": "Affecter un participant",
|
||||
"assign-member": "Attribuer à un participant",
|
||||
"attached": "joint",
|
||||
"attachment": "Pièce jointe",
|
||||
"attachment-delete-pop": "La suppression d'une pièce jointe est définitive. Cela est irréversible.",
|
||||
@@ -199,7 +199,7 @@
|
||||
"card-edit-labels": "Gérer les étiquettes",
|
||||
"card-edit-members": "Gérer les participants",
|
||||
"card-labels-title": "Modifier les étiquettes de la carte.",
|
||||
"card-members-title": "Assigner ou supprimer des participants à la carte.",
|
||||
"card-members-title": "Ajouter ou supprimer des participants du tableau à la carte.",
|
||||
"card-start": "Début",
|
||||
"card-start-on": "Commence le",
|
||||
"cardAttachmentsPopup-title": "Ajouter depuis",
|
||||
@@ -310,7 +310,7 @@
|
||||
"no-comments": "Aucun commentaire",
|
||||
"no-comments-desc": "Ne peut pas voir les commentaires et les activités.",
|
||||
"worker": "Travailleur",
|
||||
"worker-desc": "Peut seulement déplacer des cartes, s'assigner à une carte et la commenter.",
|
||||
"worker-desc": "Peut seulement déplacer des cartes, s'attribuer une carte et la commenter.",
|
||||
"computer": "Ordinateur",
|
||||
"confirm-subtask-delete-popup": "Êtes-vous sûr de vouloir supprimer la sous-tâche ?",
|
||||
"confirm-checklist-delete-popup": "Êtes-vous sûr de vouloir supprimer la check-list ?",
|
||||
@@ -437,8 +437,8 @@
|
||||
"filter-no-label": "Aucune étiquette",
|
||||
"filter-member-label": "Filtrer par participant",
|
||||
"filter-no-member": "Aucun participant",
|
||||
"filter-assignee-label": "Filtrer par personne en charge",
|
||||
"filter-no-assignee": "Pas de personne en charge",
|
||||
"filter-assignee-label": "Filtrer par intervenant",
|
||||
"filter-no-assignee": "Pas d'intervenant",
|
||||
"filter-custom-fields-label": "Filtrer par champs personnalisés",
|
||||
"filter-no-custom-fields": "Pas de champs personnalisés",
|
||||
"filter-show-archive": "Montrer les listes archivées",
|
||||
@@ -471,9 +471,9 @@
|
||||
"import-board-instruction-about-errors": "Si une erreur survient en important le tableau, il se peut que l'import ait fonctionné, et que le tableau se trouve sur la page \"Tous les tableaux\".",
|
||||
"import-json-placeholder": "Collez ici les données JSON valides",
|
||||
"import-csv-placeholder": "Déposez ici vos données valides CSV/TSV",
|
||||
"import-map-members": "Assigner des participants",
|
||||
"import-members-map": "Le tableau que vous venez d'importer contient des participants. Veuillez assigner les participants que vous souhaitez importer à vos utilisateurs.",
|
||||
"import-members-map-note": "Note: les participants ne concordant pas seront assignés à l'utilisateur courant.",
|
||||
"import-map-members": "Faire correspondre les participants",
|
||||
"import-members-map": "Le tableau que vous venez d'importer contient des participants. Veuillez faire correspondre les participants que vous souhaitez importer à vos utilisateurs.",
|
||||
"import-members-map-note": "Note: les participants ne concordant pas seront attribués à l'utilisateur courant.",
|
||||
"import-show-user-mapping": "Contrôler l'assignation des participants",
|
||||
"import-user-select": "Sélectionnez l'utilisateur existant que vous voulez associer à ce participant",
|
||||
"importMapMembersAddPopup-title": "Sélectionner le participant",
|
||||
@@ -581,13 +581,13 @@
|
||||
"set-wip-limit-value": "Définit une limite maximale au nombre de cartes de cette liste",
|
||||
"setWipLimitPopup-title": "Définir la limite WIP",
|
||||
"shortcut-add-self": "S'ajouter à la carte courante",
|
||||
"shortcut-assign-self": "Affecter cette carte à vous-même",
|
||||
"shortcut-assign-self": "S'attribuer cette carte",
|
||||
"shortcut-autocomplete-emoji": "Auto-complétion des emoji",
|
||||
"shortcut-autocomplete-members": "Auto-complétion des participants",
|
||||
"shortcut-clear-filters": "Retirer tous les filtres",
|
||||
"shortcut-close-dialog": "Fermer la boîte de dialogue",
|
||||
"shortcut-filter-my-cards": "Filtrer mes cartes",
|
||||
"shortcut-filter-my-assigned-cards": "Filtrer mes cartes assignées",
|
||||
"shortcut-filter-my-assigned-cards": "Filtrer mes cartes attribuées",
|
||||
"shortcut-show-shortcuts": "Afficher cette liste de raccourcis",
|
||||
"shortcut-toggle-filterbar": "Afficher/Masquer la barre latérale des filtres",
|
||||
"shortcut-toggle-searchbar": "Afficher/Masquer la barre latérale de recherche",
|
||||
@@ -610,7 +610,7 @@
|
||||
"has-spenttime-cards": "A des cartes avec du temps passé",
|
||||
"time": "Temps",
|
||||
"title": "Titre",
|
||||
"toggle-assignees": "Changer les personnes en charge 1-9 sur les cartes (par ordre d'ajout au tableau)",
|
||||
"toggle-assignees": "Changer les intervenants 1-9 sur une carte (par ordre d'ajout au tableau)",
|
||||
"toggle-labels": "Afficher/Masquer les étiquettes 1-9 sur les cartes. La sélection multiple ajoute les étiquettes 1-9",
|
||||
"remove-labels-multiselect": "La multi-sélection supprime les étiquettes 1-9",
|
||||
"tracking": "Suivi",
|
||||
@@ -729,7 +729,7 @@
|
||||
"setCardActionsColorPopup-title": "Choisissez une couleur",
|
||||
"setSwimlaneColorPopup-title": "Choisissez une couleur",
|
||||
"setListColorPopup-title": "Choisissez une couleur",
|
||||
"assigned-by": "Assigné par",
|
||||
"assigned-by": "Attribué par",
|
||||
"requested-by": "Demandé par",
|
||||
"card-sorting-by-number": "Tri numérique des cartes",
|
||||
"board-delete-notice": "La suppression est définitive. Vous perdrez toutes les listes, cartes et actions associées à ce tableau.",
|
||||
@@ -928,8 +928,8 @@
|
||||
"accounts-allowUserDelete": "Autoriser les utilisateurs à supprimer leur compte",
|
||||
"hide-minicard-label-text": "Cacher l'étiquette de la mini-carte",
|
||||
"show-desktop-drag-handles": "Voir les poignées de déplacement du bureau",
|
||||
"assignee": "Personne en charge",
|
||||
"cardAssigneesPopup-title": "Personne en charge",
|
||||
"assignee": "Intervenant",
|
||||
"cardAssigneesPopup-title": "Intervenant",
|
||||
"addmore-detail": "Ajouter une description plus détaillée",
|
||||
"show-on-card": "Afficher sur la carte",
|
||||
"show-on-minicard": "Afficher sur la mini-carte",
|
||||
@@ -1023,7 +1023,7 @@
|
||||
"operator-user-abbrev": "@",
|
||||
"operator-member": "participant",
|
||||
"operator-member-abbrev": "m",
|
||||
"operator-assignee": "personne en charge",
|
||||
"operator-assignee": "intervenant",
|
||||
"operator-assignee-abbrev": "a",
|
||||
"operator-creator": "créateur",
|
||||
"operator-status": "statut",
|
||||
@@ -1054,7 +1054,7 @@
|
||||
"predicate-checklist": "check-list",
|
||||
"predicate-start": "début",
|
||||
"predicate-end": "fin",
|
||||
"predicate-assignee": "personne en charge",
|
||||
"predicate-assignee": "intervenant",
|
||||
"predicate-member": "participant",
|
||||
"predicate-public": "public",
|
||||
"predicate-private": "privé",
|
||||
@@ -1079,13 +1079,13 @@
|
||||
"globalSearch-instructions-operator-comment": "`__operator_comment__:<texte>` - cartes dont le commentaire contient *<texte>*.",
|
||||
"globalSearch-instructions-operator-label": "`__operator_label__:<couleur>` `__operator_label__:<nom>` - cartes qui ont une étiquette correspondant à *<couleur>* ou à *<nom>*.",
|
||||
"globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<nom|couleur>` - raccourci pour `__operator_label__:<couleur>` ou `__operator_label__:<nom>`",
|
||||
"globalSearch-instructions-operator-user": "`__operator_user__:<nom>` - cartes où l'utilisateur <nom> est *participant* ou est *en charge*.",
|
||||
"globalSearch-instructions-operator-user": "`__operator_user__:<nom>` - cartes où l'utilisateur <nom> est *participant* ou *intervenant*.",
|
||||
"globalSearch-instructions-operator-at": "`__operator_user_abbrev__nom` - raccourci pour `__operator_user__:<nom>`",
|
||||
"globalSearch-instructions-operator-member": "`__operator_member__:<nom>` - cartes pour lesquelles l'utilisateur *<nom>* est *participant*",
|
||||
"globalSearch-instructions-operator-assignee": "`__operator_assignee__:<nom>` - cartes *assignées* à l'utilisateur *<nom>*",
|
||||
"globalSearch-instructions-operator-assignee": "`__operator_assignee__:<nom>` - cartes *attribuées* à l'utilisateur *<nom>*",
|
||||
"globalSearch-instructions-operator-creator": "`__operator_creator__:<utilisateur>` - cartes dont le créateur est *<utilisateur>*",
|
||||
"globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cartes appartenant à un tableau assigné à l'organisation *<name>*",
|
||||
"globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cartes appartenant à un tableau assigné à l'équipe *<name>*",
|
||||
"globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cartes appartenant à un tableau attribué à l'organisation *<name>*",
|
||||
"globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cartes appartenant à un tableau attribué à l'équipe *<name>*",
|
||||
"globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cartes qui arrive à échéance dans moins de *<n>* jours à partir d'aujourd'hui.\n`__operator_due__:__predicate_overdue__` liste toutes les cartes ayant passé la date d'échéance.",
|
||||
"globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cartes qui ont été créées il y a *<n>* jours ou moins",
|
||||
"globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cartes qui ont été modifiées il y a *<n>* jours ou moins",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"accept": "Accept",
|
||||
"accept": "Terima",
|
||||
"act-activity-notify": "Activity Notification",
|
||||
"act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
|
||||
"act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
|
||||
@@ -49,7 +49,7 @@
|
||||
"activity-archived": "%s moved to Archive",
|
||||
"activity-attached": "attached %s to %s",
|
||||
"activity-created": "created %s",
|
||||
"activity-changedListTitle": "renamed list to %s",
|
||||
"activity-changedListTitle": "Namakan semula senarai kepada %s",
|
||||
"activity-customfield-created": "created custom field %s",
|
||||
"activity-excluded": "excluded %s from %s",
|
||||
"activity-imported": "imported %s into %s from %s",
|
||||
@@ -86,9 +86,9 @@
|
||||
"add-card": "Add Card",
|
||||
"add-card-to-top-of-list": "Add Card to Top of List",
|
||||
"add-card-to-bottom-of-list": "Add Card to Bottom of List",
|
||||
"setListWidthPopup-title": "Set Widths",
|
||||
"set-list-width": "Set Widths",
|
||||
"set-list-width-value": "Set Min & Max Widths (pixels)",
|
||||
"setListWidthPopup-title": "Tetapkan Lebar",
|
||||
"set-list-width": "Tetapkan Lebar",
|
||||
"set-list-width-value": "Tetapkan lebar minimum dan maksimum (piksel)",
|
||||
"list-width-error-message": "List widths must be integers greater than 100",
|
||||
"keyboard-shortcuts-enabled": "Keyboard shortcuts enabled. Click to disable.",
|
||||
"keyboard-shortcuts-disabled": "Keyboard shortcuts disabled. Click to enable.",
|
||||
@@ -105,20 +105,20 @@
|
||||
"convertChecklistItemToCardPopup-title": "Convert to Card",
|
||||
"add-cover": "Add cover image to minicard",
|
||||
"add-label": "Add Label",
|
||||
"add-list": "Add List",
|
||||
"add-list": "Tambah Senarai",
|
||||
"add-after-list": "Add After List",
|
||||
"add-members": "Add Members",
|
||||
"added": "Added",
|
||||
"addMemberPopup-title": "Members",
|
||||
"memberPopup-title": "Member Settings",
|
||||
"admin": "Admin",
|
||||
"add-members": "Tambah Ahli",
|
||||
"added": "Ditambah",
|
||||
"addMemberPopup-title": "Ahli-ahli",
|
||||
"memberPopup-title": "Tetapan Ahli",
|
||||
"admin": "Pentadbir",
|
||||
"admin-desc": "Can view and edit cards, remove members, and change settings for the board.",
|
||||
"admin-announcement": "Announcement",
|
||||
"admin-announcement": "Pengumuman",
|
||||
"admin-announcement-active": "Active System-Wide Announcement",
|
||||
"admin-announcement-title": "Announcement from Administrator",
|
||||
"all-boards": "All Boards",
|
||||
"and-n-other-card": "And __count__ other card",
|
||||
"and-n-other-card_plural": "And __count__ other cards",
|
||||
"admin-announcement-title": "Pengumuman dari Pentadbir",
|
||||
"all-boards": "Semua Papan",
|
||||
"and-n-other-card": "Dan __count__ kad lain",
|
||||
"and-n-other-card_plural": "Dan __count__ kad-kad lain",
|
||||
"apply": "Apply",
|
||||
"app-is-offline": "Loading, please wait. Refreshing the page will cause data loss. If loading does not work, please check that server has not stopped.",
|
||||
"app-try-reconnect": "Try to reconnect.",
|
||||
@@ -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": "Full Name",
|
||||
"header-logo-title": "Go back to your boards page.",
|
||||
"show-activities": "Show Activities",
|
||||
"show-activities": "Tunjukkan Aktiviti",
|
||||
"headerBarCreateBoardPopup-title": "Create Board",
|
||||
"home": "Home",
|
||||
"import": "Import",
|
||||
@@ -972,20 +972,20 @@
|
||||
"ok": "OK",
|
||||
"organizations": "Organizations",
|
||||
"teams": "Teams",
|
||||
"displayName": "Display Name",
|
||||
"shortName": "Short Name",
|
||||
"displayName": "Nama Paparan",
|
||||
"shortName": "Nama Ringkas",
|
||||
"autoAddUsersWithDomainName": "Automatically add users with the domain name",
|
||||
"website": "Website",
|
||||
"website": "Laman Sesawang",
|
||||
"person": "Person",
|
||||
"my-cards": "My Cards",
|
||||
"card": "Card",
|
||||
"list": "List",
|
||||
"board": "Board",
|
||||
"my-cards": "Kad Saya",
|
||||
"card": "Kad",
|
||||
"list": "Senarai",
|
||||
"board": "Papan",
|
||||
"context-separator": "/",
|
||||
"myCardsViewChange-title": "My Cards View",
|
||||
"myCardsViewChangePopup-title": "My Cards View",
|
||||
"myCardsViewChange-choice-boards": "Boards",
|
||||
"myCardsViewChange-choice-table": "Table",
|
||||
"myCardsViewChange-choice-boards": "Papan",
|
||||
"myCardsViewChange-choice-table": "Jadual",
|
||||
"myCardsSortChange-title": "My Cards Sort",
|
||||
"myCardsSortChangePopup-title": "My Cards Sort",
|
||||
"myCardsSortChange-choice-board": "By Board",
|
||||
@@ -993,8 +993,8 @@
|
||||
"dueCards-title": "Due Cards",
|
||||
"dueCardsViewChange-title": "Due Cards View",
|
||||
"dueCardsViewChangePopup-title": "Due Cards View",
|
||||
"dueCardsViewChange-choice-me": "Me",
|
||||
"dueCardsViewChange-choice-all": "All Users",
|
||||
"dueCardsViewChange-choice-me": "Saya",
|
||||
"dueCardsViewChange-choice-all": "Semua Pengguna",
|
||||
"dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.",
|
||||
"broken-cards": "Broken Cards",
|
||||
"board-title-not-found": "Board '%s' not found.",
|
||||
@@ -1004,27 +1004,27 @@
|
||||
"label-color-not-found": "Label color %s not found.",
|
||||
"user-username-not-found": "Username '%s' not found.",
|
||||
"comment-not-found": "Card with comment containing text '%s' not found.",
|
||||
"org-name-not-found": "Organization '%s' not found.",
|
||||
"team-name-not-found": "Team '%s' not found.",
|
||||
"globalSearch-title": "Search All Boards",
|
||||
"no-cards-found": "No Cards Found",
|
||||
"one-card-found": "One Card Found",
|
||||
"n-cards-found": "%s Cards Found",
|
||||
"org-name-not-found": "Organisasi '%s' tidak ditemui.",
|
||||
"team-name-not-found": "Pasukan '%s' tidak ditemui.",
|
||||
"globalSearch-title": "Cari di Semua Papan",
|
||||
"no-cards-found": "Tiada Kad Ditemui",
|
||||
"one-card-found": "Satu Kad Ditemui",
|
||||
"n-cards-found": "%s Kad Ditemui",
|
||||
"n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found",
|
||||
"operator-board": "board",
|
||||
"operator-board-abbrev": "b",
|
||||
"operator-board": "papan",
|
||||
"operator-board-abbrev": "p",
|
||||
"operator-swimlane": "swimlane",
|
||||
"operator-swimlane-abbrev": "s",
|
||||
"operator-list": "list",
|
||||
"operator-list-abbrev": "l",
|
||||
"operator-list": "senarai",
|
||||
"operator-list-abbrev": "s",
|
||||
"operator-label": "label",
|
||||
"operator-label-abbrev": "#",
|
||||
"operator-user": "user",
|
||||
"operator-user": "pengguna",
|
||||
"operator-user-abbrev": "@",
|
||||
"operator-member": "member",
|
||||
"operator-member-abbrev": "m",
|
||||
"operator-assignee": "assignee",
|
||||
"operator-assignee-abbrev": "a",
|
||||
"operator-member": "ahli",
|
||||
"operator-member-abbrev": "a",
|
||||
"operator-assignee": "pemberi tugas",
|
||||
"operator-assignee-abbrev": "pt",
|
||||
"operator-creator": "creator",
|
||||
"operator-status": "status",
|
||||
"operator-due": "due",
|
||||
@@ -1033,31 +1033,31 @@
|
||||
"operator-sort": "sort",
|
||||
"operator-comment": "comment",
|
||||
"operator-has": "has",
|
||||
"operator-limit": "limit",
|
||||
"operator-limit": "had",
|
||||
"operator-debug": "debug",
|
||||
"operator-org": "org",
|
||||
"operator-team": "team",
|
||||
"predicate-archived": "archived",
|
||||
"predicate-open": "open",
|
||||
"predicate-ended": "ended",
|
||||
"predicate-all": "all",
|
||||
"predicate-all": "semua",
|
||||
"predicate-overdue": "overdue",
|
||||
"predicate-week": "week",
|
||||
"predicate-month": "month",
|
||||
"predicate-quarter": "quarter",
|
||||
"predicate-year": "year",
|
||||
"predicate-week": "minggu",
|
||||
"predicate-month": "bulan",
|
||||
"predicate-quarter": "suku",
|
||||
"predicate-year": "tahun",
|
||||
"predicate-due": "due",
|
||||
"predicate-modified": "modified",
|
||||
"predicate-created": "created",
|
||||
"predicate-attachment": "attachment",
|
||||
"predicate-description": "description",
|
||||
"predicate-description": "huraian",
|
||||
"predicate-checklist": "checklist",
|
||||
"predicate-start": "start",
|
||||
"predicate-end": "end",
|
||||
"predicate-start": "mula",
|
||||
"predicate-end": "akhir",
|
||||
"predicate-assignee": "assignee",
|
||||
"predicate-member": "member",
|
||||
"predicate-public": "public",
|
||||
"predicate-private": "private",
|
||||
"predicate-public": "umum",
|
||||
"predicate-private": "peribadi",
|
||||
"predicate-selector": "selector",
|
||||
"predicate-projection": "projection",
|
||||
"operator-unknown-error": "%s is not an operator",
|
||||
@@ -1067,10 +1067,10 @@
|
||||
"operator-has-invalid": "%s is not a valid existence check",
|
||||
"operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.",
|
||||
"operator-debug-invalid": "%s is not a valid debug predicate",
|
||||
"next-page": "Next Page",
|
||||
"previous-page": "Previous Page",
|
||||
"heading-notes": "Notes",
|
||||
"globalSearch-instructions-heading": "Search Instructions",
|
||||
"next-page": "Halaman Seterusnya",
|
||||
"previous-page": "Halaman Sebelumnya",
|
||||
"heading-notes": "Nota-nota",
|
||||
"globalSearch-instructions-heading": "Cari arahan",
|
||||
"globalSearch-instructions-description": "Searches can include operators to refine the search. Operators are specified by writing the operator name and value separated by a colon. For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*. If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).",
|
||||
"globalSearch-instructions-operators": "Available operators:",
|
||||
"globalSearch-instructions-operator-board": "`__operator_board__:<title>` - cards in boards matching the specified *<title>*",
|
||||
@@ -1106,7 +1106,7 @@
|
||||
"globalSearch-instructions-notes-5": "By default archived cards are not searched.",
|
||||
"link-to-search": "Link to this search",
|
||||
"excel-font": "Arial",
|
||||
"number": "Number",
|
||||
"number": "Nombor",
|
||||
"label-colors": "Label Colors",
|
||||
"label-names": "Label Names",
|
||||
"archived-at": "archived at",
|
||||
@@ -1128,8 +1128,8 @@
|
||||
"custom-field-stringtemplate-format": "Format (use %{value} as placeholder)",
|
||||
"custom-field-stringtemplate-separator": "Separator (use   or for a space)",
|
||||
"custom-field-stringtemplate-item-placeholder": "Press enter to add more items",
|
||||
"creator": "Creator",
|
||||
"creator-on-minicard": "Creator on minicard",
|
||||
"creator": "Pencipta",
|
||||
"creator-on-minicard": "Pencipta pada kad mini",
|
||||
"filesReportTitle": "Files Report",
|
||||
"reports": "Reports",
|
||||
"rulesReportTitle": "Rules Report",
|
||||
@@ -1152,27 +1152,27 @@
|
||||
"delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
|
||||
"delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it",
|
||||
"subject": "Subject",
|
||||
"details": "Details",
|
||||
"details": "Maklumat",
|
||||
"carbon-copy": "Carbon Copy (Cc:)",
|
||||
"ticket": "Ticket",
|
||||
"tickets": "Tickets",
|
||||
"ticket-number": "Ticket Number",
|
||||
"open": "Open",
|
||||
"ticket": "Tiket",
|
||||
"tickets": "Tiket-tiket",
|
||||
"ticket-number": "Nombor Tiket",
|
||||
"open": "Dibuka",
|
||||
"pending": "Pending",
|
||||
"closed": "Closed",
|
||||
"resolved": "Resolved",
|
||||
"cancelled": "Cancelled",
|
||||
"history": "History",
|
||||
"closed": "Ditutup",
|
||||
"resolved": "Selesai",
|
||||
"cancelled": "Batalkan",
|
||||
"history": "Sejarah",
|
||||
"request": "Request",
|
||||
"requests": "Requests",
|
||||
"help-request": "Help Request",
|
||||
"editCardSortOrderPopup-title": "Change Sorting",
|
||||
"cardDetailsPopup-title": "Card Details",
|
||||
"add-teams": "Add teams",
|
||||
"cardDetailsPopup-title": "Maklumat Kad",
|
||||
"add-teams": "Tambahkan Kumpulan",
|
||||
"add-teams-label": "Added teams are displayed below:",
|
||||
"remove-team-from-table": "Are you sure you want to remove this team from the board ?",
|
||||
"confirm-btn": "Confirm",
|
||||
"remove-btn": "Remove",
|
||||
"confirm-btn": "Sahkan",
|
||||
"remove-btn": "Hapus",
|
||||
"filter-card-title-label": "Filter by card title",
|
||||
"invite-people-success": "Invitation to register sent with success",
|
||||
"invite-people-error": "Error while sending invitation to register",
|
||||
@@ -1200,14 +1200,14 @@
|
||||
"custom-legal-notice-link-url": "Custom legal notice page URL",
|
||||
"acceptance_of_our_legalNotice": "By continuing, you accept our",
|
||||
"legalNotice": "legal notice",
|
||||
"copied": "Copied!",
|
||||
"copied": "Disalin!",
|
||||
"checklistActionsPopup-title": "Checklist Actions",
|
||||
"moveChecklist": "Move Checklist",
|
||||
"moveChecklistPopup-title": "Move Checklist",
|
||||
"newlineBecomesNewChecklistItem": "Each line of text becomes one of the checklist items",
|
||||
"newLineNewItem": "One line of text = one checklist item",
|
||||
"newlineBecomesNewChecklistItemOriginOrder": "Each line of text becomes one of the checklist items, original order",
|
||||
"originOrder": "original order",
|
||||
"originOrder": "aturan asal",
|
||||
"copyChecklist": "Copy Checklist",
|
||||
"copyChecklistPopup-title": "Copy Checklist",
|
||||
"card-show-lists": "Card Show Lists",
|
||||
@@ -1223,21 +1223,21 @@
|
||||
"move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem",
|
||||
"move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS",
|
||||
"move-all-attachments-of-board-to-s3": "Move all attachments of board to S3",
|
||||
"path": "Path",
|
||||
"version-name": "Version-Name",
|
||||
"size": "Size",
|
||||
"storage": "Storage",
|
||||
"action": "Action",
|
||||
"board-title": "Board Title",
|
||||
"attachmentRenamePopup-title": "Rename",
|
||||
"uploading": "Uploading",
|
||||
"remaining_time": "Remaining time",
|
||||
"path": "Haluan",
|
||||
"version-name": "Versi-Nama",
|
||||
"size": "Saiz",
|
||||
"storage": "Simpanan",
|
||||
"action": "Tindakan",
|
||||
"board-title": "Tajuk Papan",
|
||||
"attachmentRenamePopup-title": "Namakan Semula",
|
||||
"uploading": "Memuat Naik",
|
||||
"remaining_time": "Masa yang tersisa",
|
||||
"speed": "Speed",
|
||||
"progress": "Progress",
|
||||
"password-again": "Password (again)",
|
||||
"if-you-already-have-an-account": "If you already have an account",
|
||||
"register": "Register",
|
||||
"forgot-password": "Forgot password",
|
||||
"progress": "Perkembangan",
|
||||
"password-again": "Kata laluan (semula)",
|
||||
"if-you-already-have-an-account": "Jika anda sudah mempunyai akaun",
|
||||
"register": "Daftar",
|
||||
"forgot-password": "Lupa kata laluan",
|
||||
"minicardDetailsActionsPopup-title": "Card Details",
|
||||
"Mongo_sessions_count": "Mongo sessions count",
|
||||
"change-visibility": "Change Visibility",
|
||||
@@ -1253,9 +1253,9 @@
|
||||
"newTranslationPopup-title": "New custom translation string",
|
||||
"editTranslationPopup-title": "Edit custom translation string",
|
||||
"settingsTranslationPopup-title": "Delete this custom translation string?",
|
||||
"translation": "Translation",
|
||||
"text": "Text",
|
||||
"translation-text": "Translation text",
|
||||
"translation": "Terjemahan",
|
||||
"text": "Teks",
|
||||
"translation-text": "Teks terjemahan",
|
||||
"show-subtasks-field": "Show subtasks field",
|
||||
"show-week-of-year": "Show week of year (ISO 8601)",
|
||||
"convert-to-markdown": "Convert to markdown",
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
"activity-archived": "%s Arşive taşındı",
|
||||
"activity-attached": "%s içine %s ekledi",
|
||||
"activity-created": "%s öğesini oluşturdu",
|
||||
"activity-changedListTitle": "renamed list to %s",
|
||||
"activity-changedListTitle": "Liste adı %syapıldı",
|
||||
"activity-customfield-created": "%s adlı özel alan yaratıldı",
|
||||
"activity-excluded": "%s içinden %s çıkarttı",
|
||||
"activity-imported": "%s kaynağından %s öğesini %s öğesinin içine taşıdı",
|
||||
@@ -86,10 +86,10 @@
|
||||
"add-card": "Kart Ekle",
|
||||
"add-card-to-top-of-list": "Listenin Başına Kart Ekle",
|
||||
"add-card-to-bottom-of-list": "Listenin Sonuna Kart Ekle",
|
||||
"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",
|
||||
"setListWidthPopup-title": "Genişlik Ata",
|
||||
"set-list-width": "Genişlik Ata",
|
||||
"set-list-width-value": "En Az & En Çok Genişlik (piksel) Ata ",
|
||||
"list-width-error-message": "Liste genişliği 100'den büyük sayısal bir değer olmalı",
|
||||
"keyboard-shortcuts-enabled": "Keyboard shortcuts enabled. Click to disable.",
|
||||
"keyboard-shortcuts-disabled": "Keyboard shortcuts disabled. Click to enable.",
|
||||
"setSwimlaneHeightPopup-title": "Kulvar Uzunluğunu Ayarla",
|
||||
@@ -300,7 +300,7 @@
|
||||
"color-white": "beyaz",
|
||||
"color-yellow": "sarı",
|
||||
"unset-color": "Seçilmemiş",
|
||||
"comments": "Comments",
|
||||
"comments": "Yorumlar",
|
||||
"comment": "Yorum",
|
||||
"comment-placeholder": "Yorum Yaz",
|
||||
"comment-only": "Sadece yorum",
|
||||
|
||||
@@ -383,7 +383,7 @@
|
||||
"email-sent": "Email відправлений",
|
||||
"email-verifyEmail-subject": "Підтвердіть вашу email адресу на __siteName__",
|
||||
"email-verifyEmail-text": "Привіт __user__,\n\nЩоб підтвердити ваш акаунт email, просто натисніть на посилання нижче.\n\n__url__\n\nДякуємо.",
|
||||
"enable-vertical-scrollbars": "Enable vertical scrollbars",
|
||||
"enable-vertical-scrollbars": "Увімкнути вертикальні скроллбари",
|
||||
"enable-wip-limit": "Увімкнути ліміт WIP",
|
||||
"error-board-doesNotExist": "Ця дошка не існує",
|
||||
"error-board-notAdmin": "Вам потрібно бути адміністратором цієї дошки, щоб зробити це",
|
||||
@@ -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,7 +1257,7 @@
|
||||
"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": "Додати файл .zip, який містить файли JSON дошки та підкаталоги з назвами дошок і вкладеннями",
|
||||
"collapse": "Згорнути",
|
||||
|
||||
@@ -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": "Висота доріжки (у пікселях)",
|
||||
@@ -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 відправлений",
|
||||
"email-verifyEmail-subject": "Підтвердіть вашу email адресу на __siteName__",
|
||||
"email-verifyEmail-text": "Привіт __user__,\n\nЩоб підтвердити ваш акаунт email, просто натисніть на посилання нижче.\n\n__url__\n\nДякуємо.",
|
||||
"enable-vertical-scrollbars": "Enable vertical scrollbars",
|
||||
"enable-vertical-scrollbars": "Увімкнути вертикальні скроллбари",
|
||||
"enable-wip-limit": "Увімкнути ліміт WIP",
|
||||
"error-board-doesNotExist": "Ця дошка не існує",
|
||||
"error-board-notAdmin": "Вам потрібно бути адміністратором цієї дошки, щоб зробити це",
|
||||
@@ -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,7 +1257,7 @@
|
||||
"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": "Додати файл .zip, який містить файли JSON дошки та підкаталоги з назвами дошок і вкладеннями",
|
||||
"collapse": "Згорнути",
|
||||
@@ -1266,7 +1266,7 @@
|
||||
"hideAllChecklistItems": "Приховати всі пункти чек-листа",
|
||||
"support": "Підтримка",
|
||||
"supportPopup-title": "Підтримка",
|
||||
"accessibility-page-enabled": "Accessibility page enabled",
|
||||
"accessibility-title": "Accessibility topic",
|
||||
"accessibility-content": "Accessibility content"
|
||||
"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": "无障碍内容"
|
||||
}
|
||||
+23
-13
@@ -531,20 +531,30 @@ Cards.helpers({
|
||||
mapCustomFieldsToBoard(boardId) {
|
||||
// Map custom fields to new board
|
||||
return this.customFields.map(cf => {
|
||||
const oldCf = ReactiveCache.getCustomField(cf._id);
|
||||
const newCf = ReactiveCache.getCustomField({
|
||||
boardIds: boardId,
|
||||
name: oldCf.name,
|
||||
type: oldCf.type,
|
||||
});
|
||||
if (newCf) {
|
||||
cf._id = newCf._id;
|
||||
} else if (!_.contains(oldCf.boardIds, boardId)) {
|
||||
oldCf.addBoard(boardId);
|
||||
}
|
||||
return cf;
|
||||
const oldCf = ReactiveCache.getCustomField(cf._id);
|
||||
|
||||
// Check if oldCf is undefined or null
|
||||
if (!oldCf) {
|
||||
//console.error(`Custom field with ID ${cf._id} not found.`);
|
||||
return cf; // Skip this field if oldCf is not found
|
||||
}
|
||||
|
||||
const newCf = ReactiveCache.getCustomField({
|
||||
boardIds: boardId,
|
||||
name: oldCf.name,
|
||||
type: oldCf.type,
|
||||
});
|
||||
|
||||
if (newCf) {
|
||||
cf._id = newCf._id;
|
||||
} else if (!_.contains(oldCf.boardIds, boardId)) {
|
||||
oldCf.addBoard(boardId);
|
||||
}
|
||||
|
||||
return cf;
|
||||
});
|
||||
},
|
||||
},
|
||||
|
||||
|
||||
copy(boardId, swimlaneId, listId) {
|
||||
const oldId = this._id;
|
||||
|
||||
@@ -2,13 +2,38 @@ import { Meteor } from 'meteor/meteor';
|
||||
import Users from '../users';
|
||||
|
||||
function acceptedIpAddress(ipAddress) {
|
||||
const trustedIpAddress = process.env.WEKAN_METRICS_ACCEPTED_IP_ADDRESS;
|
||||
const trustedIpAddress = process.env.METRICS_ACCEPTED_IP_ADDRESS;
|
||||
return (
|
||||
trustedIpAddress !== undefined &&
|
||||
trustedIpAddress.split(',').includes(ipAddress)
|
||||
);
|
||||
}
|
||||
|
||||
function accessToken(req) {
|
||||
const valid_token = process.env.METRICS_ACCESS_TOKEN;
|
||||
let token;
|
||||
if (req.headers && req.headers.authorization) {
|
||||
var parts = req.headers.authorization.split(" ");
|
||||
|
||||
if (parts.length === 2) {
|
||||
var scheme = parts[0];
|
||||
var credentials = parts[1];
|
||||
|
||||
if (/^Bearer$/i.test(scheme)) {
|
||||
token = credentials;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!token && req.query && req.query.access_token) {
|
||||
token = req.query.access_token;
|
||||
}
|
||||
return (
|
||||
token !== undefined &&
|
||||
valid_token !== undefined &&
|
||||
token == valid_token
|
||||
);
|
||||
}
|
||||
|
||||
const getBoardTitleWithMostActivities = (dateWithXdaysAgo, nbLimit) => {
|
||||
return Promise.await(
|
||||
Activities.rawCollection()
|
||||
@@ -48,8 +73,8 @@ Meteor.startup(() => {
|
||||
// const ipAddress = req.socket.remoteAddress
|
||||
// }
|
||||
|
||||
// List of trusted ip adress will be found in environment variable "WEKAN_METRICS_ACCEPTED_IP_ADDRESS" (separeted with commas)
|
||||
if (acceptedIpAddress(ipAddress)) {
|
||||
// List of trusted ip adress will be found in environment variable "METRICS_ACCEPTED_IP_ADDRESS" (separeted with commas)
|
||||
if (acceptedIpAddress(ipAddress) || (accessToken(req))) {
|
||||
let metricsRes = '';
|
||||
let resCount = 0;
|
||||
//connected users
|
||||
@@ -170,12 +195,12 @@ Meteor.startup(() => {
|
||||
|
||||
metricsRes +=
|
||||
'# Top 10 boards with most activities dated 30 days ago\n';
|
||||
//Get top 10 table with most activities in current month
|
||||
//Get top 10 table with most activities in current month
|
||||
const boardTitleWithMostActivities = getBoardTitleWithMostActivities(
|
||||
dateWithXdaysAgo,
|
||||
xdays,
|
||||
);
|
||||
|
||||
|
||||
const boardWithMostActivities = boardTitleWithMostActivities.map(
|
||||
(board) => board.lookup[0].title,
|
||||
);
|
||||
@@ -185,7 +210,7 @@ Meteor.startup(() => {
|
||||
`wekan_top10BoardsWithMostActivities{n="${title}"} ${
|
||||
index + 1
|
||||
}` + '\n';
|
||||
});
|
||||
});
|
||||
|
||||
res.writeHead(200); // HTTP status
|
||||
res.end(metricsRes);
|
||||
|
||||
+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);
|
||||
}
|
||||
|
||||
@@ -65,6 +65,8 @@ def get_req_body_elems(obj, elems):
|
||||
elif obj.type in ('LogicalExpression', 'BinaryExpression', 'AssignmentExpression'):
|
||||
get_req_body_elems(obj.left, elems)
|
||||
get_req_body_elems(obj.right, elems)
|
||||
elif obj.type == 'ChainExpression':
|
||||
get_req_body_elems(obj.expression, elems)
|
||||
elif obj.type in ('ReturnStatement', 'UnaryExpression'):
|
||||
if obj.argument is not None:
|
||||
get_req_body_elems(obj.argument, elems)
|
||||
|
||||
Generated
+80
-159
@@ -1,13 +1,13 @@
|
||||
{
|
||||
"name": "wekan",
|
||||
"version": "v7.80.0",
|
||||
"version": "v7.90.0",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
"@babel/runtime": {
|
||||
"version": "7.25.0",
|
||||
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz",
|
||||
"integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==",
|
||||
"version": "7.26.10",
|
||||
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.10.tgz",
|
||||
"integrity": "sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==",
|
||||
"requires": {
|
||||
"regenerator-runtime": "^0.14.0"
|
||||
}
|
||||
@@ -108,6 +108,12 @@
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz",
|
||||
"integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ=="
|
||||
},
|
||||
"@types/trusted-types": {
|
||||
"version": "2.0.7",
|
||||
"resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",
|
||||
"integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",
|
||||
"optional": true
|
||||
},
|
||||
"@wekanteam/dragscroll": {
|
||||
"version": "git+https://github.com/wekan/dragscroll.git#6ea215c8cdbde9362ecba8ffb72ce9f9fde842d2",
|
||||
"from": "git+https://github.com/wekan/dragscroll.git"
|
||||
@@ -600,9 +606,12 @@
|
||||
}
|
||||
},
|
||||
"dompurify": {
|
||||
"version": "2.5.6",
|
||||
"resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.5.6.tgz",
|
||||
"integrity": "sha512-zUTaUBO8pY4+iJMPE1B9XlO2tXVYIcEA4SNGtvDELzTSCQO7RzH+j7S180BmhmJId78lqGU2z19vgVx2Sxs/PQ=="
|
||||
"version": "3.2.4",
|
||||
"resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.4.tgz",
|
||||
"integrity": "sha512-ysFSFEDVduQpyhzAob/kkuJjf5zWkZD8/A9ywSp1byueyuCfHamrCBa14/Oc2iiB0e51B+NpxSl5gmzn+Ms/mg==",
|
||||
"requires": {
|
||||
"@types/trusted-types": "^2.0.7"
|
||||
}
|
||||
},
|
||||
"domutils": {
|
||||
"version": "2.8.0",
|
||||
@@ -1373,16 +1382,15 @@
|
||||
"integrity": "sha512-SBbbYWvFYvsxHVL+q6ZB8lT3rp2LSvfALD2V52H+MGH2IgJsevy0VtXRkRG0EsUewwOaDTIKBn9DlD8HQ3GSwg=="
|
||||
},
|
||||
"meteor-node-stubs": {
|
||||
"version": "1.2.12",
|
||||
"resolved": "https://registry.npmjs.org/meteor-node-stubs/-/meteor-node-stubs-1.2.12.tgz",
|
||||
"integrity": "sha512-mzp3KI2aGNDhFlCVXPd0pfMr2z9A5vl1AqEgV13/z7AgKwcbd2X+ymE6tpSAMkrrQb40PU9PC2B59bCb6XkAaw==",
|
||||
"version": "git+https://github.com/wekan/meteor-node-stubs.git#4f2609bc4d9d700ff79424ad4ed8dbf1f06666cb",
|
||||
"from": "git+https://github.com/wekan/meteor-node-stubs.git",
|
||||
"requires": {
|
||||
"@meteorjs/crypto-browserify": "^3.12.1",
|
||||
"assert": "^2.1.0",
|
||||
"browserify-zlib": "^0.2.0",
|
||||
"buffer": "^5.7.1",
|
||||
"console-browserify": "^1.2.0",
|
||||
"constants-browserify": "^1.0.0",
|
||||
"crypto-browserify": "^3.12.0",
|
||||
"domain-browser": "^4.23.0",
|
||||
"elliptic": "^6.6.0",
|
||||
"events": "^3.3.0",
|
||||
@@ -1398,46 +1406,19 @@
|
||||
"string_decoder": "^1.3.0",
|
||||
"timers-browserify": "^2.0.12",
|
||||
"tty-browserify": "0.0.1",
|
||||
"url": "^0.11.4",
|
||||
"url": "^0.11.3",
|
||||
"util": "^0.12.5",
|
||||
"vm-browserify": "^1.1.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"@meteorjs/crypto-browserify": {
|
||||
"version": "3.12.1",
|
||||
"bundled": true,
|
||||
"requires": {
|
||||
"browserify-cipher": "^1.0.1",
|
||||
"browserify-sign": "^4.2.3",
|
||||
"create-ecdh": "^4.0.4",
|
||||
"create-hash": "^1.2.0",
|
||||
"create-hmac": "^1.1.7",
|
||||
"diffie-hellman": "^5.0.3",
|
||||
"hash-base": "~3.0.4",
|
||||
"inherits": "^2.0.4",
|
||||
"pbkdf2": "^3.1.2",
|
||||
"public-encrypt": "^4.0.3",
|
||||
"randombytes": "^2.1.0",
|
||||
"randomfill": "^1.0.4"
|
||||
},
|
||||
"dependencies": {
|
||||
"hash-base": {
|
||||
"version": "3.0.4",
|
||||
"bundled": true,
|
||||
"requires": {
|
||||
"inherits": "^2.0.1",
|
||||
"safe-buffer": "^5.0.1"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"asn1.js": {
|
||||
"version": "4.10.1",
|
||||
"version": "5.4.1",
|
||||
"bundled": true,
|
||||
"requires": {
|
||||
"bn.js": "^4.0.0",
|
||||
"inherits": "^2.0.1",
|
||||
"minimalistic-assert": "^1.0.0"
|
||||
"minimalistic-assert": "^1.0.0",
|
||||
"safer-buffer": "^2.1.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"bn.js": {
|
||||
@@ -1513,64 +1494,23 @@
|
||||
}
|
||||
},
|
||||
"browserify-sign": {
|
||||
"version": "4.2.3",
|
||||
"version": "4.2.2",
|
||||
"bundled": true,
|
||||
"requires": {
|
||||
"bn.js": "^5.2.1",
|
||||
"browserify-rsa": "^4.1.0",
|
||||
"create-hash": "^1.2.0",
|
||||
"create-hmac": "^1.1.7",
|
||||
"elliptic": "^6.5.5",
|
||||
"hash-base": "~3.0",
|
||||
"elliptic": "^6.5.4",
|
||||
"inherits": "^2.0.4",
|
||||
"parse-asn1": "^5.1.7",
|
||||
"readable-stream": "^2.3.8",
|
||||
"parse-asn1": "^5.1.6",
|
||||
"readable-stream": "^3.6.2",
|
||||
"safe-buffer": "^5.2.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"bn.js": {
|
||||
"version": "5.2.1",
|
||||
"bundled": true
|
||||
},
|
||||
"hash-base": {
|
||||
"version": "3.0.4",
|
||||
"bundled": true,
|
||||
"requires": {
|
||||
"inherits": "^2.0.1",
|
||||
"safe-buffer": "^5.0.1"
|
||||
}
|
||||
},
|
||||
"readable-stream": {
|
||||
"version": "2.3.8",
|
||||
"bundled": true,
|
||||
"requires": {
|
||||
"core-util-is": "~1.0.0",
|
||||
"inherits": "~2.0.3",
|
||||
"isarray": "~1.0.0",
|
||||
"process-nextick-args": "~2.0.0",
|
||||
"safe-buffer": "~5.1.1",
|
||||
"string_decoder": "~1.1.1",
|
||||
"util-deprecate": "~1.0.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"safe-buffer": {
|
||||
"version": "5.1.2",
|
||||
"bundled": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"string_decoder": {
|
||||
"version": "1.1.1",
|
||||
"bundled": true,
|
||||
"requires": {
|
||||
"safe-buffer": "~5.1.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"safe-buffer": {
|
||||
"version": "5.1.2",
|
||||
"bundled": true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -1598,14 +1538,12 @@
|
||||
"bundled": true
|
||||
},
|
||||
"call-bind": {
|
||||
"version": "1.0.7",
|
||||
"version": "1.0.5",
|
||||
"bundled": true,
|
||||
"requires": {
|
||||
"es-define-property": "^1.0.0",
|
||||
"es-errors": "^1.3.0",
|
||||
"function-bind": "^1.1.2",
|
||||
"get-intrinsic": "^1.2.4",
|
||||
"set-function-length": "^1.2.1"
|
||||
"get-intrinsic": "^1.2.1",
|
||||
"set-function-length": "^1.1.1"
|
||||
}
|
||||
},
|
||||
"cipher-base": {
|
||||
@@ -1624,10 +1562,6 @@
|
||||
"version": "1.0.0",
|
||||
"bundled": true
|
||||
},
|
||||
"core-util-is": {
|
||||
"version": "1.0.3",
|
||||
"bundled": true
|
||||
},
|
||||
"create-ecdh": {
|
||||
"version": "4.0.4",
|
||||
"bundled": true,
|
||||
@@ -1665,13 +1599,30 @@
|
||||
"sha.js": "^2.4.8"
|
||||
}
|
||||
},
|
||||
"define-data-property": {
|
||||
"version": "1.1.4",
|
||||
"crypto-browserify": {
|
||||
"version": "3.12.0",
|
||||
"bundled": true,
|
||||
"requires": {
|
||||
"es-define-property": "^1.0.0",
|
||||
"es-errors": "^1.3.0",
|
||||
"gopd": "^1.0.1"
|
||||
"browserify-cipher": "^1.0.0",
|
||||
"browserify-sign": "^4.0.0",
|
||||
"create-ecdh": "^4.0.0",
|
||||
"create-hash": "^1.1.0",
|
||||
"create-hmac": "^1.1.0",
|
||||
"diffie-hellman": "^5.0.0",
|
||||
"inherits": "^2.0.1",
|
||||
"pbkdf2": "^3.0.3",
|
||||
"public-encrypt": "^4.0.0",
|
||||
"randombytes": "^2.0.0",
|
||||
"randomfill": "^1.0.3"
|
||||
}
|
||||
},
|
||||
"define-data-property": {
|
||||
"version": "1.1.1",
|
||||
"bundled": true,
|
||||
"requires": {
|
||||
"get-intrinsic": "^1.2.1",
|
||||
"gopd": "^1.0.1",
|
||||
"has-property-descriptors": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"define-properties": {
|
||||
@@ -1711,7 +1662,7 @@
|
||||
"bundled": true
|
||||
},
|
||||
"elliptic": {
|
||||
"version": "6.6.0",
|
||||
"version": "6.6.1",
|
||||
"bundled": true,
|
||||
"requires": {
|
||||
"bn.js": "^4.11.9",
|
||||
@@ -1724,22 +1675,11 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"bn.js": {
|
||||
"version": "4.12.0",
|
||||
"version": "4.12.1",
|
||||
"bundled": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"es-define-property": {
|
||||
"version": "1.0.0",
|
||||
"bundled": true,
|
||||
"requires": {
|
||||
"get-intrinsic": "^1.2.4"
|
||||
}
|
||||
},
|
||||
"es-errors": {
|
||||
"version": "1.3.0",
|
||||
"bundled": true
|
||||
},
|
||||
"events": {
|
||||
"version": "3.3.0",
|
||||
"bundled": true
|
||||
@@ -1764,10 +1704,9 @@
|
||||
"bundled": true
|
||||
},
|
||||
"get-intrinsic": {
|
||||
"version": "1.2.4",
|
||||
"version": "1.2.2",
|
||||
"bundled": true,
|
||||
"requires": {
|
||||
"es-errors": "^1.3.0",
|
||||
"function-bind": "^1.1.2",
|
||||
"has-proto": "^1.0.1",
|
||||
"has-symbols": "^1.0.3",
|
||||
@@ -1782,10 +1721,10 @@
|
||||
}
|
||||
},
|
||||
"has-property-descriptors": {
|
||||
"version": "1.0.2",
|
||||
"version": "1.0.1",
|
||||
"bundled": true,
|
||||
"requires": {
|
||||
"es-define-property": "^1.0.0"
|
||||
"get-intrinsic": "^1.2.2"
|
||||
}
|
||||
},
|
||||
"has-proto": {
|
||||
@@ -1882,10 +1821,6 @@
|
||||
"which-typed-array": "^1.1.11"
|
||||
}
|
||||
},
|
||||
"isarray": {
|
||||
"version": "1.0.0",
|
||||
"bundled": true
|
||||
},
|
||||
"md5.js": {
|
||||
"version": "1.3.5",
|
||||
"bundled": true,
|
||||
@@ -1918,7 +1853,7 @@
|
||||
"bundled": true
|
||||
},
|
||||
"object-inspect": {
|
||||
"version": "1.13.2",
|
||||
"version": "1.13.1",
|
||||
"bundled": true
|
||||
},
|
||||
"object-is": {
|
||||
@@ -1952,25 +1887,14 @@
|
||||
"bundled": true
|
||||
},
|
||||
"parse-asn1": {
|
||||
"version": "5.1.7",
|
||||
"version": "5.1.6",
|
||||
"bundled": true,
|
||||
"requires": {
|
||||
"asn1.js": "^4.10.1",
|
||||
"browserify-aes": "^1.2.0",
|
||||
"evp_bytestokey": "^1.0.3",
|
||||
"hash-base": "~3.0",
|
||||
"pbkdf2": "^3.1.2",
|
||||
"safe-buffer": "^5.2.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"hash-base": {
|
||||
"version": "3.0.4",
|
||||
"bundled": true,
|
||||
"requires": {
|
||||
"inherits": "^2.0.1",
|
||||
"safe-buffer": "^5.0.1"
|
||||
}
|
||||
}
|
||||
"asn1.js": "^5.2.0",
|
||||
"browserify-aes": "^1.0.0",
|
||||
"evp_bytestokey": "^1.0.0",
|
||||
"pbkdf2": "^3.0.3",
|
||||
"safe-buffer": "^5.1.1"
|
||||
}
|
||||
},
|
||||
"path-browserify": {
|
||||
@@ -1992,10 +1916,6 @@
|
||||
"version": "0.11.10",
|
||||
"bundled": true
|
||||
},
|
||||
"process-nextick-args": {
|
||||
"version": "2.0.1",
|
||||
"bundled": true
|
||||
},
|
||||
"public-encrypt": {
|
||||
"version": "4.0.3",
|
||||
"bundled": true,
|
||||
@@ -2019,10 +1939,10 @@
|
||||
"bundled": true
|
||||
},
|
||||
"qs": {
|
||||
"version": "6.13.0",
|
||||
"version": "6.11.2",
|
||||
"bundled": true,
|
||||
"requires": {
|
||||
"side-channel": "^1.0.6"
|
||||
"side-channel": "^1.0.4"
|
||||
}
|
||||
},
|
||||
"querystring-es3": {
|
||||
@@ -2065,16 +1985,18 @@
|
||||
"version": "5.2.1",
|
||||
"bundled": true
|
||||
},
|
||||
"safer-buffer": {
|
||||
"version": "2.1.2",
|
||||
"bundled": true
|
||||
},
|
||||
"set-function-length": {
|
||||
"version": "1.2.2",
|
||||
"version": "1.1.1",
|
||||
"bundled": true,
|
||||
"requires": {
|
||||
"define-data-property": "^1.1.4",
|
||||
"es-errors": "^1.3.0",
|
||||
"function-bind": "^1.1.2",
|
||||
"get-intrinsic": "^1.2.4",
|
||||
"define-data-property": "^1.1.1",
|
||||
"get-intrinsic": "^1.2.1",
|
||||
"gopd": "^1.0.1",
|
||||
"has-property-descriptors": "^1.0.2"
|
||||
"has-property-descriptors": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"setimmediate": {
|
||||
@@ -2090,13 +2012,12 @@
|
||||
}
|
||||
},
|
||||
"side-channel": {
|
||||
"version": "1.0.6",
|
||||
"version": "1.0.4",
|
||||
"bundled": true,
|
||||
"requires": {
|
||||
"call-bind": "^1.0.7",
|
||||
"es-errors": "^1.3.0",
|
||||
"get-intrinsic": "^1.2.4",
|
||||
"object-inspect": "^1.13.1"
|
||||
"call-bind": "^1.0.0",
|
||||
"get-intrinsic": "^1.0.2",
|
||||
"object-inspect": "^1.9.0"
|
||||
}
|
||||
},
|
||||
"stream-browserify": {
|
||||
@@ -2136,11 +2057,11 @@
|
||||
"bundled": true
|
||||
},
|
||||
"url": {
|
||||
"version": "0.11.4",
|
||||
"version": "0.11.3",
|
||||
"bundled": true,
|
||||
"requires": {
|
||||
"punycode": "^1.4.1",
|
||||
"qs": "^6.12.3"
|
||||
"qs": "^6.11.2"
|
||||
}
|
||||
},
|
||||
"util": {
|
||||
|
||||
+4
-4
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "wekan",
|
||||
"version": "v7.80.0",
|
||||
"version": "v7.90.0",
|
||||
"description": "Open-Source kanban",
|
||||
"private": true,
|
||||
"repository": {
|
||||
@@ -17,7 +17,7 @@
|
||||
"sinon": "^13.0.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.25.0",
|
||||
"@babel/runtime": "^7.26.10",
|
||||
"@mapbox/node-pre-gyp": "^1.0.10",
|
||||
"@rwap/jquery-ui-touch-punch": "^1.0.11",
|
||||
"@wekanteam/dragscroll": "https://github.com/wekan/dragscroll.git",
|
||||
@@ -28,7 +28,7 @@
|
||||
"ajv": "^6.12.6",
|
||||
"bcryptjs": "^2.4.3",
|
||||
"bson": "^4.5.2",
|
||||
"dompurify": "^2.5.6",
|
||||
"dompurify": "^3.2.4",
|
||||
"es6-promise": "^4.2.4",
|
||||
"escape-string-regexp": "^5.0.0",
|
||||
"fibers": "^5.0.3",
|
||||
@@ -44,7 +44,7 @@
|
||||
"markdown-it-emoji": "^2.0.0",
|
||||
"markdown-it-mathjax3": "^4.3.2",
|
||||
"meteor-accounts-t9n": "^2.6.0",
|
||||
"meteor-node-stubs": "^1.2.12",
|
||||
"meteor-node-stubs": "https://github.com/wekan/meteor-node-stubs.git",
|
||||
"minio": "^7.1.3",
|
||||
"moment": "^2.29.4",
|
||||
"os": "^0.1.2",
|
||||
|
||||
+3229
-8254
File diff suppressed because it is too large.
Load diff
@@ -1,7 +1,7 @@
|
||||
swagger: '2.0'
|
||||
info:
|
||||
title: Wekan REST API
|
||||
version: v7.80
|
||||
version: v7.90
|
||||
description: |
|
||||
The REST API allows you to control and extend Wekan with ease.
|
||||
|
||||
|
||||
@@ -0,0 +1,524 @@
|
||||
{
|
||||
"name": "Wekan",
|
||||
"short_name": "Wekan",
|
||||
"icons": [
|
||||
{
|
||||
"src": "svg-etc/wekan-logo-512.svg",
|
||||
"sizes": "any",
|
||||
"type": "image/svg"
|
||||
},
|
||||
{
|
||||
"src": "android-chrome-192x192.png",
|
||||
"sizes": "192x192",
|
||||
"type": "image/png"
|
||||
},
|
||||
{
|
||||
"src": "android-chrome-512x512.png",
|
||||
"sizes": "512x512",
|
||||
"type": "image/png"
|
||||
},
|
||||
{
|
||||
"src": "Square150x150Logo.scale-100.png",
|
||||
"sizes": "150x150",
|
||||
"type": "image/png"
|
||||
},
|
||||
{
|
||||
"src": "Square44x44Logo.scale-100.png",
|
||||
"sizes": "44x44",
|
||||
"type": "image/png"
|
||||
},
|
||||
{
|
||||
"src": "StoreLogo.scale-100.png",
|
||||
"sizes": "50x50",
|
||||
"type": "image/png"
|
||||
},
|
||||
{
|
||||
"src": "maskable_icon.png",
|
||||
"sizes": "474x474",
|
||||
"type": "image/png",
|
||||
"purpose": "maskable"
|
||||
},
|
||||
{
|
||||
"src": "monochrome-icon-512x512.png",
|
||||
"sizes": "512x512",
|
||||
"type": "image/png",
|
||||
"purpose": "monochrome"
|
||||
},
|
||||
{
|
||||
"src": "windows11/SmallTile.scale-100.png",
|
||||
"sizes": "71x71"
|
||||
},
|
||||
{
|
||||
"src": "windows11/SmallTile.scale-125.png",
|
||||
"sizes": "89x89"
|
||||
},
|
||||
{
|
||||
"src": "windows11/SmallTile.scale-150.png",
|
||||
"sizes": "107x107"
|
||||
},
|
||||
{
|
||||
"src": "windows11/SmallTile.scale-200.png",
|
||||
"sizes": "142x142"
|
||||
},
|
||||
{
|
||||
"src": "windows11/SmallTile.scale-400.png",
|
||||
"sizes": "284x284"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square150x150Logo.scale-100.png",
|
||||
"sizes": "150x150"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square150x150Logo.scale-125.png",
|
||||
"sizes": "188x188"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square150x150Logo.scale-150.png",
|
||||
"sizes": "225x225"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square150x150Logo.scale-200.png",
|
||||
"sizes": "300x300"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square150x150Logo.scale-400.png",
|
||||
"sizes": "600x600"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Wide310x150Logo.scale-100.png",
|
||||
"sizes": "310x150"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Wide310x150Logo.scale-125.png",
|
||||
"sizes": "388x188"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Wide310x150Logo.scale-150.png",
|
||||
"sizes": "465x225"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Wide310x150Logo.scale-200.png",
|
||||
"sizes": "620x300"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Wide310x150Logo.scale-400.png",
|
||||
"sizes": "1240x600"
|
||||
},
|
||||
{
|
||||
"src": "windows11/LargeTile.scale-100.png",
|
||||
"sizes": "310x310"
|
||||
},
|
||||
{
|
||||
"src": "windows11/LargeTile.scale-125.png",
|
||||
"sizes": "388x388"
|
||||
},
|
||||
{
|
||||
"src": "windows11/LargeTile.scale-150.png",
|
||||
"sizes": "465x465"
|
||||
},
|
||||
{
|
||||
"src": "windows11/LargeTile.scale-200.png",
|
||||
"sizes": "620x620"
|
||||
},
|
||||
{
|
||||
"src": "windows11/LargeTile.scale-400.png",
|
||||
"sizes": "1240x1240"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.scale-100.png",
|
||||
"sizes": "44x44"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.scale-125.png",
|
||||
"sizes": "55x55"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.scale-150.png",
|
||||
"sizes": "66x66"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.scale-200.png",
|
||||
"sizes": "88x88"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.scale-400.png",
|
||||
"sizes": "176x176"
|
||||
},
|
||||
{
|
||||
"src": "windows11/StoreLogo.scale-100.png",
|
||||
"sizes": "50x50"
|
||||
},
|
||||
{
|
||||
"src": "windows11/StoreLogo.scale-125.png",
|
||||
"sizes": "63x63"
|
||||
},
|
||||
{
|
||||
"src": "windows11/StoreLogo.scale-150.png",
|
||||
"sizes": "75x75"
|
||||
},
|
||||
{
|
||||
"src": "windows11/StoreLogo.scale-200.png",
|
||||
"sizes": "100x100"
|
||||
},
|
||||
{
|
||||
"src": "windows11/StoreLogo.scale-400.png",
|
||||
"sizes": "200x200"
|
||||
},
|
||||
{
|
||||
"src": "windows11/SplashScreen.scale-100.png",
|
||||
"sizes": "620x300"
|
||||
},
|
||||
{
|
||||
"src": "windows11/SplashScreen.scale-125.png",
|
||||
"sizes": "775x375"
|
||||
},
|
||||
{
|
||||
"src": "windows11/SplashScreen.scale-150.png",
|
||||
"sizes": "930x450"
|
||||
},
|
||||
{
|
||||
"src": "windows11/SplashScreen.scale-200.png",
|
||||
"sizes": "1240x600"
|
||||
},
|
||||
{
|
||||
"src": "windows11/SplashScreen.scale-400.png",
|
||||
"sizes": "2480x1200"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.targetsize-16.png",
|
||||
"sizes": "16x16"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.targetsize-20.png",
|
||||
"sizes": "20x20"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.targetsize-24.png",
|
||||
"sizes": "24x24"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.targetsize-30.png",
|
||||
"sizes": "30x30"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.targetsize-32.png",
|
||||
"sizes": "32x32"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.targetsize-36.png",
|
||||
"sizes": "36x36"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.targetsize-40.png",
|
||||
"sizes": "40x40"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.targetsize-44.png",
|
||||
"sizes": "44x44"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.targetsize-48.png",
|
||||
"sizes": "48x48"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.targetsize-60.png",
|
||||
"sizes": "60x60"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.targetsize-64.png",
|
||||
"sizes": "64x64"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.targetsize-72.png",
|
||||
"sizes": "72x72"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.targetsize-80.png",
|
||||
"sizes": "80x80"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.targetsize-96.png",
|
||||
"sizes": "96x96"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.targetsize-256.png",
|
||||
"sizes": "256x256"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-unplated_targetsize-16.png",
|
||||
"sizes": "16x16"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-unplated_targetsize-20.png",
|
||||
"sizes": "20x20"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-unplated_targetsize-24.png",
|
||||
"sizes": "24x24"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-unplated_targetsize-30.png",
|
||||
"sizes": "30x30"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-unplated_targetsize-32.png",
|
||||
"sizes": "32x32"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-unplated_targetsize-36.png",
|
||||
"sizes": "36x36"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-unplated_targetsize-40.png",
|
||||
"sizes": "40x40"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-unplated_targetsize-44.png",
|
||||
"sizes": "44x44"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-unplated_targetsize-48.png",
|
||||
"sizes": "48x48"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-unplated_targetsize-60.png",
|
||||
"sizes": "60x60"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-unplated_targetsize-64.png",
|
||||
"sizes": "64x64"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-unplated_targetsize-72.png",
|
||||
"sizes": "72x72"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-unplated_targetsize-80.png",
|
||||
"sizes": "80x80"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-unplated_targetsize-96.png",
|
||||
"sizes": "96x96"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-unplated_targetsize-256.png",
|
||||
"sizes": "256x256"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-16.png",
|
||||
"sizes": "16x16"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-20.png",
|
||||
"sizes": "20x20"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-24.png",
|
||||
"sizes": "24x24"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-30.png",
|
||||
"sizes": "30x30"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-32.png",
|
||||
"sizes": "32x32"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-36.png",
|
||||
"sizes": "36x36"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-40.png",
|
||||
"sizes": "40x40"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-44.png",
|
||||
"sizes": "44x44"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-48.png",
|
||||
"sizes": "48x48"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-60.png",
|
||||
"sizes": "60x60"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-64.png",
|
||||
"sizes": "64x64"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-72.png",
|
||||
"sizes": "72x72"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-80.png",
|
||||
"sizes": "80x80"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-96.png",
|
||||
"sizes": "96x96"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-256.png",
|
||||
"sizes": "256x256"
|
||||
},
|
||||
{
|
||||
"src": "android/android-launchericon-512-512.png",
|
||||
"sizes": "512x512"
|
||||
},
|
||||
{
|
||||
"src": "android/android-launchericon-192-192.png",
|
||||
"sizes": "192x192"
|
||||
},
|
||||
{
|
||||
"src": "android/android-launchericon-144-144.png",
|
||||
"sizes": "144x144"
|
||||
},
|
||||
{
|
||||
"src": "android/android-launchericon-96-96.png",
|
||||
"sizes": "96x96"
|
||||
},
|
||||
{
|
||||
"src": "android/android-launchericon-72-72.png",
|
||||
"sizes": "72x72"
|
||||
},
|
||||
{
|
||||
"src": "android/android-launchericon-48-48.png",
|
||||
"sizes": "48x48"
|
||||
},
|
||||
{
|
||||
"src": "ios/16.png",
|
||||
"sizes": "16x16"
|
||||
},
|
||||
{
|
||||
"src": "ios/20.png",
|
||||
"sizes": "20x20"
|
||||
},
|
||||
{
|
||||
"src": "ios/29.png",
|
||||
"sizes": "29x29"
|
||||
},
|
||||
{
|
||||
"src": "ios/32.png",
|
||||
"sizes": "32x32"
|
||||
},
|
||||
{
|
||||
"src": "ios/40.png",
|
||||
"sizes": "40x40"
|
||||
},
|
||||
{
|
||||
"src": "ios/50.png",
|
||||
"sizes": "50x50"
|
||||
},
|
||||
{
|
||||
"src": "ios/57.png",
|
||||
"sizes": "57x57"
|
||||
},
|
||||
{
|
||||
"src": "ios/58.png",
|
||||
"sizes": "58x58"
|
||||
},
|
||||
{
|
||||
"src": "ios/60.png",
|
||||
"sizes": "60x60"
|
||||
},
|
||||
{
|
||||
"src": "ios/64.png",
|
||||
"sizes": "64x64"
|
||||
},
|
||||
{
|
||||
"src": "ios/72.png",
|
||||
"sizes": "72x72"
|
||||
},
|
||||
{
|
||||
"src": "ios/76.png",
|
||||
"sizes": "76x76"
|
||||
},
|
||||
{
|
||||
"src": "ios/80.png",
|
||||
"sizes": "80x80"
|
||||
},
|
||||
{
|
||||
"src": "ios/87.png",
|
||||
"sizes": "87x87"
|
||||
},
|
||||
{
|
||||
"src": "ios/100.png",
|
||||
"sizes": "100x100"
|
||||
},
|
||||
{
|
||||
"src": "ios/114.png",
|
||||
"sizes": "114x114"
|
||||
},
|
||||
{
|
||||
"src": "ios/120.png",
|
||||
"sizes": "120x120"
|
||||
},
|
||||
{
|
||||
"src": "ios/128.png",
|
||||
"sizes": "128x128"
|
||||
},
|
||||
{
|
||||
"src": "ios/144.png",
|
||||
"sizes": "144x144"
|
||||
},
|
||||
{
|
||||
"src": "ios/152.png",
|
||||
"sizes": "152x152"
|
||||
},
|
||||
{
|
||||
"src": "ios/167.png",
|
||||
"sizes": "167x167"
|
||||
},
|
||||
{
|
||||
"src": "ios/180.png",
|
||||
"sizes": "180x180"
|
||||
},
|
||||
{
|
||||
"src": "ios/192.png",
|
||||
"sizes": "192x192"
|
||||
},
|
||||
{
|
||||
"src": "ios/256.png",
|
||||
"sizes": "256x256"
|
||||
},
|
||||
{
|
||||
"src": "ios/512.png",
|
||||
"sizes": "512x512"
|
||||
},
|
||||
{
|
||||
"src": "ios/1024.png",
|
||||
"sizes": "1024x1024"
|
||||
}
|
||||
],
|
||||
"screenshots": [
|
||||
{
|
||||
"src": "screenshot1.webp",
|
||||
"sizes": "1280x720",
|
||||
"type": "image/webp"
|
||||
},
|
||||
{
|
||||
"src": "screenshot2.webp",
|
||||
"sizes": "1280x720",
|
||||
"type": "image/webp"
|
||||
}
|
||||
],
|
||||
"theme_color": "#000000",
|
||||
"background_color": "#000000",
|
||||
"start_url": "sign-in",
|
||||
"display": "standalone",
|
||||
"orientation": "any",
|
||||
"categories": [
|
||||
"productivity"
|
||||
],
|
||||
"iarc_rating_id": "70d7c4a4-3e5a-4714-a7dc-fa006613ba96",
|
||||
"description": "Open Source kanban with MIT license",
|
||||
"dir": "auto",
|
||||
"scope": "https://boards.wekan.team",
|
||||
"prefer_related_applications": false,
|
||||
"display_override": [
|
||||
"standalone"
|
||||
]
|
||||
}
|
||||
@@ -513,10 +513,8 @@
|
||||
"categories": [
|
||||
"productivity"
|
||||
],
|
||||
"iarc_rating_id": "70d7c4a4-3e5a-4714-a7dc-fa006613ba96",
|
||||
"description": "Open Source kanban with MIT license",
|
||||
"dir": "auto",
|
||||
"scope": "https://boards.wekan.team",
|
||||
"prefer_related_applications": false,
|
||||
"display_override": [
|
||||
"standalone"
|
||||
|
||||
@@ -15,7 +15,8 @@ fi
|
||||
|
||||
if [ ! -d ~/python/esprima-python ]; then
|
||||
sudo apt-get -y install python3-pip python3-swagger-spec-validator python3-wheel python3-setuptools
|
||||
sudo npm install -g api2html
|
||||
# Install older version of api2html that works with Node.js 14
|
||||
sudo npm install -g api2html@0.3.0 || sudo npm install -g swagger-ui-watcher
|
||||
(mkdir -p ~/python && cd ~/python && git clone --depth 1 -b master https://github.com/Kronuz/esprima-python)
|
||||
(cd ~/python/esprima-python && git fetch origin pull/20/head:delete_fix && git checkout delete_fix && sudo python3 setup.py install --record files.txt)
|
||||
#(cd ~/python/esprima-python && git fetch origin pull/20/head:delete_fix && git checkout delete_fix && sudo pip3 install .)
|
||||
@@ -38,10 +39,11 @@ if [ ! -d public/api ]; then
|
||||
mkdir -p public/api
|
||||
fi
|
||||
|
||||
# 4) Generate docs.
|
||||
#python3 ./openapi/generate_openapi.py --release $(git describe --tags --abbrev=0) > ./public/api/wekan.yml
|
||||
# 4) Generate docs with api2html or fallback to swagger-ui-watcher
|
||||
python3 ./openapi/generate_openapi.py --release v$1 > ./public/api/wekan.yml
|
||||
api2html -c ./public/logo-header.png -o ./public/api/wekan.html ./public/api/wekan.yml
|
||||
if ! api2html -c ./public/logo-header.png -o ./public/api/wekan.html ./public/api/wekan.yml; then
|
||||
swagger-ui-watcher ./public/api/wekan.yml -p 8080
|
||||
fi
|
||||
|
||||
# Copy docs to bundle
|
||||
#cp -pR ./public/api ~/repos/wekan/.build/bundle/programs/web.browser/app/
|
||||
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 = 780,
|
||||
appVersion = 790,
|
||||
# Increment this for every release.
|
||||
|
||||
appMarketingVersion = (defaultText = "7.80.0~2025-01-12"),
|
||||
appMarketingVersion = (defaultText = "7.90.0~2025-05-14"),
|
||||
# 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.80'
|
||||
version: '7.90'
|
||||
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.19.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.80/wekan-7.80-amd64.zip
|
||||
unzip wekan-7.80-amd64.zip
|
||||
rm wekan-7.80-amd64.zip
|
||||
wget https://github.com/wekan/wekan/releases/download/v7.90/wekan-7.90-amd64.zip
|
||||
unzip wekan-7.90-amd64.zip
|
||||
rm wekan-7.90-amd64.zip
|
||||
cd ..
|
||||
##cd .build/bundle
|
||||
##find . -type d -name '*-garbage*' | xargs rm -rf
|
||||
|
||||
+4
-1
@@ -14,7 +14,7 @@ SET MONGO_URL=mongodb://127.0.0.1:27017/wekan
|
||||
REM # If port is 80, must change ROOT_URL to: http://YOUR-WEKAN-SERVER-IPv4-ADDRESS , like http://192.168.0.100
|
||||
REM # If port is not 80, must change ROOT_URL to: http://YOUR-WEKAN-SERVER-IPv4-ADDRESS:YOUR-PORT-NUMBER , like http://192.168.0.100:2000
|
||||
REM # If ROOT_URL is not correct, these do not work: translations, uploading attachments.
|
||||
SET ROOT_URL=http://192.168.0.21
|
||||
SET ROOT_URL=http://localhost
|
||||
|
||||
REM # Must change to YOUR-PORT-NUMBER:
|
||||
SET PORT=80
|
||||
@@ -459,6 +459,9 @@ REM # example : LDAP_BACKGROUND_SYNC=true
|
||||
REM SET LDAP_BACKGROUND_SYNC=false
|
||||
|
||||
REM # LDAP_BACKGROUND_SYNC_INTERVAL : At which interval does the background task sync in milliseconds
|
||||
REM # The format must be as specified in:
|
||||
REM # https://bunkat.github.io/later/parsers.html#text
|
||||
REM SET LDAP_BACKGROUND_SYNC_INTERVAL=every 1 hours
|
||||
REM # At which interval does the background task sync in milliseconds.
|
||||
REM # Leave this unset, so it uses default, and does not crash.
|
||||
REM # https://github.com/wekan/wekan/issues/2354#issuecomment-515305722
|
||||
|
||||
@@ -385,6 +385,9 @@
|
||||
#export LDAP_BACKGROUND_SYNC=false
|
||||
#
|
||||
# LDAP_BACKGROUND_SYNC_INTERVAL : At which interval does the background task sync in milliseconds
|
||||
# The format must be as specified in:
|
||||
# https://bunkat.github.io/later/parsers.html#text
|
||||
#export LDAP_BACKGROUND_SYNC_INTERVAL=every 1 hours
|
||||
# At which interval does the background task sync in milliseconds.
|
||||
# Leave this unset, so it uses default, and does not crash.
|
||||
# https://github.com/wekan/wekan/issues/2354#issuecomment-515305722
|
||||
|
||||
Reference in new issue
Block a user