Compare commits

...
48 Commits
Author SHA1 Message Date
Maksim Eltyshev 818ae4a6df chore: Update version 2024-08-14 21:39:43 +02:00
Aurélien Troncy 0de0e809ac fix: Update French translation (#849) 2024-08-14 21:37:02 +02:00
Maksim Eltyshev da727c0a0b chore: Generate separate file to store version
Closes #848
2024-08-13 22:26:44 +02:00
Ken 4841a65c77 feat: Add Traditional Chinese translation (#846) 2024-08-13 12:53:42 +02:00
Maksim Eltyshev 0ec4b619d9 chore: Update version 2024-08-12 23:23:50 +02:00
Maksim Eltyshev 12f05adde7 fix: Fix styles, refactoring 2024-08-12 23:17:17 +02:00
Arkadiusz Dzięgiel c594e8bd71 feat: Colorize due date and make it toggleable (#845) 2024-08-12 18:29:50 +02:00
Maksim Eltyshev f84166406f ref: Refactoring 2024-07-26 20:51:59 +02:00
Fayad 82b2ba298d feat: Improvements for mobile version (#776) 2024-07-26 19:02:13 +02:00
jaycoolslm 38b6805ba1 fix: Update healthcheck parameters in docker-compose-dev.yml (#834) 2024-07-24 13:10:56 +02:00
dependabot[bot] 6a7a582045 chore(deps): Bump socket.io-parser from 3.3.3 to 3.3.4 in /client (#833)
Bumps [socket.io-parser](https://github.com/Automattic/socket.io-parser) from 3.3.3 to 3.3.4.
- [Release notes](https://github.com/Automattic/socket.io-parser/releases)
- [Changelog](https://github.com/socketio/socket.io-parser/blob/3.3.4/CHANGELOG.md)
- [Commits](https://github.com/Automattic/socket.io-parser/compare/3.3.3...3.3.4)

---
updated-dependencies:
- dependency-name: socket.io-parser
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-07-23 12:50:41 +02:00
Blyamur c53a00b4ba fix: Update Russian translation (#832) 2024-07-22 16:32:12 +02:00
Blyamur 52103c775b fix: Update Russian translation (#831) 2024-07-22 16:30:44 +02:00
Maksim Eltyshev eeb1bd80cc chore: Update version 2024-07-21 19:44:49 +02:00
dependabot[bot] e6b8538863 chore(deps): Bump ws, engine.io and socket.io-adapter in /server (#830)
Bumps [ws](https://github.com/websockets/ws), [engine.io](https://github.com/socketio/engine.io) and [socket.io-adapter](https://github.com/socketio/socket.io-adapter). These dependencies needed to be updated together.

Updates `ws` from 8.11.0 to 8.17.1
- [Release notes](https://github.com/websockets/ws/releases)
- [Commits](https://github.com/websockets/ws/compare/8.11.0...8.17.1)

Updates `engine.io` from 6.5.4 to 6.5.5
- [Release notes](https://github.com/socketio/engine.io/releases)
- [Changelog](https://github.com/socketio/engine.io/blob/6.5.5/CHANGELOG.md)
- [Commits](https://github.com/socketio/engine.io/compare/6.5.4...6.5.5)

Updates `socket.io-adapter` from 2.5.4 to 2.5.5
- [Release notes](https://github.com/socketio/socket.io-adapter/releases)
- [Changelog](https://github.com/socketio/socket.io-adapter/blob/2.5.5/CHANGELOG.md)
- [Commits](https://github.com/socketio/socket.io-adapter/compare/2.5.4...2.5.5)

---
updated-dependencies:
- dependency-name: ws
  dependency-type: indirect
- dependency-name: engine.io
  dependency-type: indirect
- dependency-name: socket.io-adapter
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-07-21 19:42:36 +02:00
Maksim Eltyshev 9dc38932fb feat: Languages with country codes 2024-07-21 19:33:57 +02:00
Aurélien Troncy e9b4a4adfc fix: Disable x-powered-by header (#829) 2024-07-21 18:27:26 +02:00
Mazyar Yousefiniyae shad 76c78c7252 feat: Add Persian translation (#828) 2024-07-21 18:21:18 +02:00
Maksim Eltyshev 04f52a63f2 chore: Update version 2024-07-17 14:03:00 +02:00
Maksim Eltyshev 6b16a104b1 docs: Update docker pulls counter 2024-07-16 12:39:57 +02:00
Maksim Eltyshev aff853c602 ref: Refactoring, fix linting 2024-07-16 12:33:38 +02:00
aleb_the_flash ad2966c5d6 feat: Improve OIDC support for strict providers (#824) 2024-07-16 12:19:27 +02:00
Maksim Eltyshev 8d74cc1732 chore: Update version 2024-07-15 16:24:31 +02:00
Emmanuel Guyot ea94fe8bf3 fix: Order users by name (#806) 2024-07-15 15:26:26 +02:00
Αλέξανδρος 6052f8999f fix: Fix application crashing when webhook is unavailable (#815) 2024-07-15 14:40:33 +02:00
ItzAndriss 67d1b1c194 fix: Update Hungarian translation (#823) 2024-07-15 14:25:31 +02:00
Stephan Michard b3cb8405f5 fix: Update German translation (#821) 2024-07-15 14:19:06 +02:00
Maksim Eltyshev 7acaec6d04 fix: Fix incorrect related data when transferring card
Closes #431, closes #803
2024-07-15 14:01:06 +02:00
Maksim Eltyshev 72896a66b3 chore: Update version 2024-06-21 12:11:15 +02:00
Maksim Eltyshev 4be4783251 fix: Fix icon spacing for action buttons 2024-06-21 12:01:46 +02:00
HannesOberreiter 5c6c6a0bcf feat: Add copy link action to card modal (#804) 2024-06-21 11:48:36 +02:00
HannesOberreiter ba178d66fa docs: Add types to webhook function (#796) 2024-06-18 15:41:12 +02:00
HannesOberreiter 270ce29f87 feat: Add custom user agent with base url to webhook (#799) 2024-06-18 15:36:51 +02:00
HannesOberreiter de1ed3c784 ref: Define all possible event types in webhook module (#795) 2024-06-18 15:32:39 +02:00
Maksim Eltyshev caf8790f28 chore: Update version 2024-06-14 17:18:42 +02:00
Sarah Soo 81436b373d feat: Ability to specify existing secrets for values in Helm (#791)
Closes #790
2024-06-14 16:41:10 +02:00
NathanVss cc1e886a31 feat: Ability to allow everyone to create projects (#787) 2024-06-14 16:38:06 +02:00
Maksim Eltyshev f0e9fe7904 chore: Update version 2024-06-12 09:06:20 +02:00
Gavin Mogan 5fcea5d651 fix: Handle WEBHOOKS env variable being unset (#785)
Closes #784
2024-06-12 08:59:36 +02:00
Maksim Eltyshev a963d85a66 chore: Update version 2024-06-12 01:02:55 +02:00
Samuel 04b42decef meta: Add issue templates (#782) 2024-06-12 00:59:37 +02:00
Maksim Eltyshev c065566c15 feat: Webhooks configuration, all events support, refactoring 2024-06-12 00:51:36 +02:00
HannesOberreiter 3779bdb053 feat: Events via webhook (#771)
Closes #215, closes #656
2024-06-06 20:22:14 +02:00
HannesOberreiter 4124ab17d2 fix: Focus end of field when editing (#779) 2024-06-06 20:06:16 +02:00
Maksim Eltyshev 0e3bc92a61 chore: Update version 2024-06-02 01:36:29 +02:00
Maksim Eltyshev b8d7e713b9 chore: Update dependencies 2024-06-02 01:34:03 +02:00
Emmanuel Guyot 017eee8302 fix: Use server base path for socket connection (#772)
Closes #768
2024-05-23 23:59:44 +02:00
Mitch Harvey 1b28892cf5 fix: Fix Helm template for dburl secret (#770) 2024-05-21 23:32:07 +02:00
239 changed files with 4431 additions and 2326 deletions
+53
View File
@@ -0,0 +1,53 @@
name: "🐛 Bug Report"
description: Report a bug found while using Planka
title: "[Bug]: "
labels: ["Type: Bug", "Status: Triage"]
body:
- type: dropdown
id: issue-type
attributes:
label: Where is the problem occurring?
description: Select the part of the application where you encountered the issue.
options:
- "I encountered the problem while using the application (Frontend)"
- "I encountered the problem while interacting with the server (Backend)"
- "I'm not sure"
- type: dropdown
id: browsers
attributes:
label: What browsers are you seeing the problem on?
multiple: true
options:
- Brave
- Chrome
- Firefox
- Microsoft Edge
- Safari
- Other
- type: textarea
id: current-behavior
attributes:
label: Current behaviour
description: A description of what is currently happening, including screenshots and other useful information (**DO NOT INCLUDE PRIVATE INFORMATION**).
placeholder: Currently...
validations:
required: true
- type: textarea
id: desired-behavior
attributes:
label: Desired behaviour
description: A clear description of what you think should happen.
placeholder: In this situation, I expected ...
- type: textarea
id: reproduction
attributes:
label: Steps to reproduce
description: Clearly describe which steps or actions you have taken to arrive at the problem. If you have some experience with the code, please link to the specific pieces of code.
placeholder: I did X, then Y, before arriving at Z, when ERROR ...
validations:
required: true
- type: textarea
id: other
attributes:
label: Other information
description: Any other details?
@@ -0,0 +1,33 @@
name: "✨ Feature Request"
description: Suggest a feature or enhancement to improve Planka.
labels: ["Type: Idea"]
body:
- type: dropdown
id: idea-type
attributes:
label: Is this a feature for the backend or frontend?
multiple: true
options:
- Backend
- Frontend
validations:
required: true
- type: textarea
id: feature
attributes:
label: What would you like?
description: A clear description of the feature or enhancement wanted.
placeholder: I'd like to be able to...
validations:
required: true
- type: textarea
id: reason
attributes:
label: Why is this needed?
description: A clear description of why this would be useful to have.
placeholder: I want this because...
- type: textarea
id: other
attributes:
label: Other information
placeholder: Any other details?
Executable → Regular
-2
View File
@@ -1,4 +1,2 @@
#!/bin/sh #!/bin/sh
. "$(dirname "$0")/_/husky.sh"
npx lint-staged npx lint-staged
+1 -1
View File
@@ -1,7 +1,7 @@
# Planka # Planka
#### Elegant open source project tracking. #### Elegant open source project tracking.
![David (path)](https://img.shields.io/github/package-json/v/plankanban/planka) ![Docker Pulls](https://img.shields.io/docker/pulls/meltyshev/planka) ![GitHub](https://img.shields.io/github/license/plankanban/planka) ![David (path)](https://img.shields.io/github/package-json/v/plankanban/planka) ![Docker Pulls](https://img.shields.io/badge/docker_pulls-4M%2B-%23066da5) ![GitHub](https://img.shields.io/github/license/plankanban/planka)
![](https://raw.githubusercontent.com/plankanban/planka/master/demo.gif) ![](https://raw.githubusercontent.com/plankanban/planka/master/demo.gif)
+2 -2
View File
@@ -15,13 +15,13 @@ type: application
# This is the chart version. This version number should be incremented each time you make changes # This is the chart version. This version number should be incremented each time you make changes
# to the chart and its templates, including the app version. # to the chart and its templates, including the app version.
# Versions are expected to follow Semantic Versioning (https://semver.org/) # Versions are expected to follow Semantic Versioning (https://semver.org/)
version: 0.1.31 version: 0.2.7
# This is the version number of the application being deployed. This version number should be # This is the version number of the application being deployed. This version number should be
# incremented each time you make changes to the application. Versions are not expected to # incremented each time you make changes to the application. Versions are not expected to
# follow Semantic Versioning. They should reflect the version the application is using. # follow Semantic Versioning. They should reflect the version the application is using.
# It is recommended to use it with quotes. # It is recommended to use it with quotes.
appVersion: "1.17.4" appVersion: "1.21.1"
dependencies: dependencies:
- alias: postgresql - alias: postgresql
+23 -3
View File
@@ -68,7 +68,7 @@ spec:
- name: DATABASE_URL - name: DATABASE_URL
valueFrom: valueFrom:
secretKeyRef: secretKeyRef:
name: .Values.existingDburlSecret name: {{ .Values.existingDburlSecret }}
key: uri key: uri
{{- else }} {{- else }}
- name: DATABASE_URL - name: DATABASE_URL
@@ -90,17 +90,37 @@ spec:
value: http://localhost:3000 value: http://localhost:3000
{{- end }} {{- end }}
- name: SECRET_KEY - name: SECRET_KEY
{{- if .Values.existingSecretkeySecret }}
valueFrom:
secretKeyRef:
name: {{ .Values.existingSecretkeySecret }}
key: key
{{- else }}
value: {{ required "A secret key needs to be generated using 'openssl rand -hex 64' and assigned to secretkey." .Values.secretkey }} value: {{ required "A secret key needs to be generated using 'openssl rand -hex 64' and assigned to secretkey." .Values.secretkey }}
{{- end }}
- name: TRUST_PROXY - name: TRUST_PROXY
value: "0" value: "0"
- name: DEFAULT_ADMIN_EMAIL - name: DEFAULT_ADMIN_EMAIL
value: {{ .Values.admin_email }} value: {{ .Values.admin_email }}
- name: DEFAULT_ADMIN_PASSWORD
value: {{ .Values.admin_password }}
- name: DEFAULT_ADMIN_NAME - name: DEFAULT_ADMIN_NAME
value: {{ .Values.admin_name }} value: {{ .Values.admin_name }}
{{- if .Values.existingAdminCredsSecret }}
- name: DEFAULT_ADMIN_USERNAME
valueFrom:
secretKeyRef:
name: {{ .Values.existingAdminCredsSecret }}
key: username
- name: DEFAULT_ADMIN_PASSWORD
valueFrom:
secretKeyRef:
name: {{ .Values.existingAdminCredsSecret }}
key: password
{{- else }}
- name: DEFAULT_ADMIN_USERNAME - name: DEFAULT_ADMIN_USERNAME
value: {{ .Values.admin_username }} value: {{ .Values.admin_username }}
- name: DEFAULT_ADMIN_PASSWORD
value: {{ .Values.admin_password }}
{{- end }}
{{ range $k, $v := .Values.env }} {{ range $k, $v := .Values.env }}
- name: {{ $k | quote }} - name: {{ $k | quote }}
value: {{ $v | quote }} value: {{ $v | quote }}
+10
View File
@@ -17,6 +17,16 @@ fullnameOverride: ""
# Generate a secret using openssl rand -base64 45 # Generate a secret using openssl rand -base64 45
secretkey: "" secretkey: ""
## @param existingSecretkeySecret Name of an existing secret containing the session key string
## NOTE: Must contain key `key`
## NOTE: When it's set, the secretkey parameter is ignored
existingSecretkeySecret: ""
## @param existingAdminCredsSecret Name of an existing secret containing the admin username and password
## NOTE: Must contain keys `username` and `password`
## NOTE: When it's set, the `admin_username` and `admin_password` parameters are ignored
existingAdminCredsSecret: ""
# Base url for Planka. Will override `ingress.hosts[0].host` # Base url for Planka. Will override `ingress.hosts[0].host`
# Defaults to `http://localhost:3000` if ingress is disabled. # Defaults to `http://localhost:3000` if ingress is disabled.
baseUrl: "" baseUrl: ""
-1
View File
@@ -1 +0,0 @@
REACT_APP_VERSION=1.17.4
+1040 -1652
View File
File diff suppressed because it is too large Load Diff
+10 -10
View File
@@ -65,8 +65,8 @@
"dequal": "^2.0.3", "dequal": "^2.0.3",
"easymde": "^2.18.0", "easymde": "^2.18.0",
"history": "^5.3.0", "history": "^5.3.0",
"i18next": "^23.11.2", "i18next": "^23.12.2",
"i18next-browser-languagedetector": "^7.2.1", "i18next-browser-languagedetector": "^8.0.0",
"initials": "^3.1.2", "initials": "^3.1.2",
"js-cookie": "^3.0.5", "js-cookie": "^3.0.5",
"jwt-decode": "^4.0.0", "jwt-decode": "^4.0.0",
@@ -75,7 +75,7 @@
"lodash": "^4.17.21", "lodash": "^4.17.21",
"nanoid": "^5.0.7", "nanoid": "^5.0.7",
"node-sass": "^9.0.0", "node-sass": "^9.0.0",
"photoswipe": "^5.4.3", "photoswipe": "^5.4.4",
"prop-types": "^15.8.1", "prop-types": "^15.8.1",
"react": "^18.2.0", "react": "^18.2.0",
"react-app-rewired": "^2.2.1", "react-app-rewired": "^2.2.1",
@@ -83,12 +83,12 @@
"react-datepicker": "^4.25.0", "react-datepicker": "^4.25.0",
"react-dom": "^18.2.0", "react-dom": "^18.2.0",
"react-dropzone": "^14.2.3", "react-dropzone": "^14.2.3",
"react-i18next": "^13.5.0", "react-i18next": "^15.0.0",
"react-input-mask": "^2.0.4", "react-input-mask": "^2.0.4",
"react-markdown": "^8.0.7", "react-markdown": "^8.0.7",
"react-photoswipe-gallery": "^2.2.7", "react-photoswipe-gallery": "^2.2.7",
"react-redux": "^8.1.3", "react-redux": "^8.1.3",
"react-router-dom": "^6.22.3", "react-router-dom": "^6.23.1",
"react-scripts": "5.0.1", "react-scripts": "5.0.1",
"react-simplemde-editor": "^5.2.0", "react-simplemde-editor": "^5.2.0",
"react-textarea-autosize": "^8.5.3", "react-textarea-autosize": "^8.5.3",
@@ -102,13 +102,13 @@
"sails.io.js": "^1.2.1", "sails.io.js": "^1.2.1",
"semantic-ui-react": "^2.1.5", "semantic-ui-react": "^2.1.5",
"socket.io-client": "^2.5.0", "socket.io-client": "^2.5.0",
"validator": "^13.11.0", "validator": "^13.12.0",
"whatwg-fetch": "^3.6.20", "whatwg-fetch": "^3.6.20",
"zxcvbn": "^4.4.2" "zxcvbn": "^4.4.2"
}, },
"devDependencies": { "devDependencies": {
"@testing-library/jest-dom": "^6.4.2", "@testing-library/jest-dom": "^6.4.5",
"@testing-library/react": "^14.3.1", "@testing-library/react": "^15.0.7",
"@testing-library/user-event": "^14.5.2", "@testing-library/user-event": "^14.5.2",
"babel-preset-airbnb": "^5.0.0", "babel-preset-airbnb": "^5.0.0",
"chai": "^4.4.1", "chai": "^4.4.1",
@@ -116,8 +116,8 @@
"eslint-config-airbnb": "^19.0.4", "eslint-config-airbnb": "^19.0.4",
"eslint-plugin-import": "^2.29.1", "eslint-plugin-import": "^2.29.1",
"eslint-plugin-jsx-a11y": "^6.8.0", "eslint-plugin-jsx-a11y": "^6.8.0",
"eslint-plugin-react": "^7.34.1", "eslint-plugin-react": "^7.34.2",
"eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-hooks": "^4.6.2",
"react-test-renderer": "^18.2.0" "react-test-renderer": "^18.2.0"
} }
} }
+1 -1
View File
@@ -3,7 +3,7 @@
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<link rel="icon" href="%PUBLIC_URL%/favicon.ico" /> <link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
<meta name="theme-color" content="#000000" /> <meta name="theme-color" content="#000000" />
<meta <meta
name="description" name="description"
+6 -1
View File
@@ -57,10 +57,15 @@ updateCard.failure = (id, error) => ({
}, },
}); });
const handleCardUpdate = (card) => ({ const handleCardUpdate = (card, isFetched, cardMemberships, cardLabels, tasks, attachments) => ({
type: ActionTypes.CARD_UPDATE_HANDLE, type: ActionTypes.CARD_UPDATE_HANDLE,
payload: { payload: {
card, card,
isFetched,
cardMemberships,
cardLabels,
tasks,
attachments,
}, },
}); });
+1 -1
View File
@@ -13,7 +13,7 @@ io.sails.environment = process.env.NODE_ENV;
const { socket } = io; const { socket } = io;
socket.path = `${Config.BASE_PATH}/socket.io`; socket.path = `${Config.SERVER_BASE_PATH}/socket.io`;
socket.connect = socket._connect; // eslint-disable-line no-underscore-dangle socket.connect = socket._connect; // eslint-disable-line no-underscore-dangle
['GET', 'POST', 'PUT', 'PATCH', 'DELETE'].forEach((method) => { ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'].forEach((method) => {
@@ -1,6 +1,8 @@
:global(#app) { :global(#app) {
.wrapper { .wrapper {
height: 100%; height: 100%;
max-height: 100vh;
max-width: 100vw;
position: fixed; position: fixed;
width: 100%; width: 100%;
z-index: -1; z-index: -1;
@@ -48,16 +48,6 @@
min-width: 100%; min-width: 100%;
} }
.panel {
align-items: center;
display: flex;
margin-bottom: 20px;
}
.panelItem {
margin-right: 20px;
}
.wrapper { .wrapper {
margin: 0 20px; margin: 0 20px;
} }
@@ -3,12 +3,13 @@
align-items: center; align-items: center;
display: flex; display: flex;
flex: 0 0 auto; flex: 0 0 auto;
margin-right: 20px;
} }
.actions { .actions {
align-items: center; align-items: center;
display: flex; display: flex;
gap: 20px;
justify-content: flex-start;
margin: 20px 20px; margin: 20px 20px;
} }
@@ -50,6 +50,10 @@
transition: width 0.2s ease; transition: width 0.2s ease;
width: 280px; width: 280px;
@media only screen and (max-width: 797px) {
width: 220px;
}
input { input {
font-size: 13px; font-size: 13px;
} }
+4 -1
View File
@@ -24,6 +24,7 @@ const Card = React.memo(
index, index,
name, name,
dueDate, dueDate,
isDueDateCompleted,
stopwatch, stopwatch,
coverUrl, coverUrl,
boardId, boardId,
@@ -120,7 +121,7 @@ const Card = React.memo(
)} )}
{dueDate && ( {dueDate && (
<span className={classNames(styles.attachment, styles.attachmentLeft)}> <span className={classNames(styles.attachment, styles.attachmentLeft)}>
<DueDate value={dueDate} size="tiny" /> <DueDate value={dueDate} isCompleted={isDueDateCompleted} size="tiny" />
</span> </span>
)} )}
{stopwatch && ( {stopwatch && (
@@ -221,6 +222,7 @@ Card.propTypes = {
index: PropTypes.number.isRequired, index: PropTypes.number.isRequired,
name: PropTypes.string.isRequired, name: PropTypes.string.isRequired,
dueDate: PropTypes.instanceOf(Date), dueDate: PropTypes.instanceOf(Date),
isDueDateCompleted: PropTypes.bool,
stopwatch: PropTypes.object, // eslint-disable-line react/forbid-prop-types stopwatch: PropTypes.object, // eslint-disable-line react/forbid-prop-types
coverUrl: PropTypes.string, coverUrl: PropTypes.string,
boardId: PropTypes.string.isRequired, boardId: PropTypes.string.isRequired,
@@ -255,6 +257,7 @@ Card.propTypes = {
Card.defaultProps = { Card.defaultProps = {
dueDate: undefined, dueDate: undefined,
isDueDateCompleted: undefined,
stopwatch: undefined, stopwatch: undefined,
coverUrl: undefined, coverUrl: undefined,
}; };
@@ -21,6 +21,14 @@
background: #ebeef0; background: #ebeef0;
color: #516b7a; color: #516b7a;
} }
@media only screen and (max-width: 797px) {
&:focus,
&:active {
background: #ebeef0;
color: #516b7a;
}
}
} }
.attachment { .attachment {
@@ -55,6 +63,12 @@
box-shadow: 0 1px 0 #ccc; box-shadow: 0 1px 0 #ccc;
position: relative; position: relative;
@media only screen and (max-width: 797px) {
.target {
opacity: 1;
}
}
&:hover { &:hover {
background: #f5f6f7; background: #f5f6f7;
border-bottom-color: rgba(9, 30, 66, 0.25); border-bottom-color: rgba(9, 30, 66, 0.25);
+2 -1
View File
@@ -5,6 +5,7 @@ import TextareaAutosize from 'react-textarea-autosize';
import { Button, Form, TextArea } from 'semantic-ui-react'; import { Button, Form, TextArea } from 'semantic-ui-react';
import { useClosableForm, useField } from '../../hooks'; import { useClosableForm, useField } from '../../hooks';
import { focusEnd } from '../../utils/element-helpers';
import styles from './NameEdit.module.scss'; import styles from './NameEdit.module.scss';
@@ -79,7 +80,7 @@ const NameEdit = React.forwardRef(({ children, defaultValue, onUpdate }, ref) =>
useEffect(() => { useEffect(() => {
if (isOpened) { if (isOpened) {
field.current.ref.current.focus(); focusEnd(field.current.ref.current);
} }
}, [isOpened]); }, [isOpened]);
@@ -6,6 +6,7 @@ import TextareaAutosize from 'react-textarea-autosize';
import { Button, Form, TextArea } from 'semantic-ui-react'; import { Button, Form, TextArea } from 'semantic-ui-react';
import { useForm } from '../../../hooks'; import { useForm } from '../../../hooks';
import { focusEnd } from '../../../utils/element-helpers';
import styles from './CommentEdit.module.scss'; import styles from './CommentEdit.module.scss';
@@ -70,7 +71,7 @@ const CommentEdit = React.forwardRef(({ children, defaultData, onUpdate }, ref)
useEffect(() => { useEffect(() => {
if (isOpened) { if (isOpened) {
textField.current.ref.current.focus(); focusEnd(textField.current.ref.current);
} }
}, [isOpened]); }, [isOpened]);
+47 -5
View File
@@ -1,8 +1,8 @@
import React, { useCallback, useRef } from 'react'; import React, { useCallback, useRef, useState } from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import classNames from 'classnames'; import classNames from 'classnames';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { Button, Grid, Icon, Modal } from 'semantic-ui-react'; import { Button, Checkbox, Grid, Icon, Modal } from 'semantic-ui-react';
import { usePopup } from '../../lib/popup'; import { usePopup } from '../../lib/popup';
import { Markdown } from '../../lib/custom-ui'; import { Markdown } from '../../lib/custom-ui';
@@ -32,6 +32,7 @@ const CardModal = React.memo(
name, name,
description, description,
dueDate, dueDate,
isDueDateCompleted,
stopwatch, stopwatch,
isSubscribed, isSubscribed,
isActivitiesFetching, isActivitiesFetching,
@@ -81,6 +82,7 @@ const CardModal = React.memo(
onClose, onClose,
}) => { }) => {
const [t] = useTranslation(); const [t] = useTranslation();
const [isLinkCopied, setIsLinkCopied] = useState(false);
const isGalleryOpened = useRef(false); const isGalleryOpened = useRef(false);
@@ -117,6 +119,12 @@ const CardModal = React.memo(
[onUpdate], [onUpdate],
); );
const handleDueDateCompletionChange = useCallback(() => {
onUpdate({
isDueDateCompleted: !isDueDateCompleted,
});
}, [isDueDateCompleted, onUpdate]);
const handleStopwatchUpdate = useCallback( const handleStopwatchUpdate = useCallback(
(newStopwatch) => { (newStopwatch) => {
onUpdate({ onUpdate({
@@ -146,6 +154,14 @@ const CardModal = React.memo(
onClose(); onClose();
}, [onDuplicate, onClose]); }, [onDuplicate, onClose]);
const handleCopyLinkClick = useCallback(() => {
navigator.clipboard.writeText(window.location.href);
setIsLinkCopied(true);
setTimeout(() => {
setIsLinkCopied(false);
}, 5000);
}, []);
const handleGalleryOpen = useCallback(() => { const handleGalleryOpen = useCallback(() => {
isGalleryOpened.current = true; isGalleryOpened.current = true;
}, []); }, []);
@@ -291,13 +307,24 @@ const CardModal = React.memo(
context: 'title', context: 'title',
})} })}
</div> </div>
<span className={styles.attachment}> <span className={classNames(styles.attachment, styles.attachmentDueDate)}>
{canEdit ? ( {canEdit ? (
<>
<Checkbox
checked={isDueDateCompleted}
disabled={!canEdit}
onChange={handleDueDateCompletionChange}
/>
<DueDateEditPopup defaultValue={dueDate} onUpdate={handleDueDateUpdate}> <DueDateEditPopup defaultValue={dueDate} onUpdate={handleDueDateUpdate}>
<DueDate value={dueDate} /> <DueDate
withStatusIcon
value={dueDate}
isCompleted={isDueDateCompleted}
/>
</DueDateEditPopup> </DueDateEditPopup>
</>
) : ( ) : (
<DueDate value={dueDate} /> <DueDate withStatusIcon value={dueDate} isCompleted={isDueDateCompleted} />
)} )}
</span> </span>
</div> </div>
@@ -506,6 +533,19 @@ const CardModal = React.memo(
<Icon name="copy outline" className={styles.actionIcon} /> <Icon name="copy outline" className={styles.actionIcon} />
{t('action.duplicate')} {t('action.duplicate')}
</Button> </Button>
{window.isSecureContext && (
<Button fluid className={styles.actionButton} onClick={handleCopyLinkClick}>
<Icon
name={isLinkCopied ? 'linkify' : 'unlink'}
className={styles.actionIcon}
/>
{isLinkCopied
? t('common.linkIsCopied')
: t('action.copyLink', {
context: 'title',
})}
</Button>
)}
<DeletePopup <DeletePopup
title="common.deleteCard" title="common.deleteCard"
content="common.areYouSureYouWantToDeleteThisCard" content="common.areYouSureYouWantToDeleteThisCard"
@@ -540,6 +580,7 @@ CardModal.propTypes = {
name: PropTypes.string.isRequired, name: PropTypes.string.isRequired,
description: PropTypes.string, description: PropTypes.string,
dueDate: PropTypes.instanceOf(Date), dueDate: PropTypes.instanceOf(Date),
isDueDateCompleted: PropTypes.bool,
stopwatch: PropTypes.object, // eslint-disable-line react/forbid-prop-types stopwatch: PropTypes.object, // eslint-disable-line react/forbid-prop-types
isSubscribed: PropTypes.bool.isRequired, isSubscribed: PropTypes.bool.isRequired,
isActivitiesFetching: PropTypes.bool.isRequired, isActivitiesFetching: PropTypes.bool.isRequired,
@@ -594,6 +635,7 @@ CardModal.propTypes = {
CardModal.defaultProps = { CardModal.defaultProps = {
description: undefined, description: undefined,
dueDate: undefined, dueDate: undefined,
isDueDateCompleted: false,
stopwatch: undefined, stopwatch: undefined,
}; };
@@ -20,12 +20,20 @@
.actionIcon { .actionIcon {
color: #17394d; color: #17394d;
display: inline;
margin-right: 8px; margin-right: 8px;
} }
.actions { .actions {
margin-bottom: 24px; margin-bottom: 24px;
@media only screen and (max-width: 797px) {
flex: 1;
}
@media only screen and (max-width: 425px) {
padding: 0;
width: 100%;
}
} }
.actionsTitle { .actionsTitle {
@@ -50,6 +58,12 @@
max-width: 100%; max-width: 100%;
} }
.attachmentDueDate {
align-items: center;
display: flex;
gap: 4px;
}
.attachments { .attachments {
display: inline-block; display: inline-block;
margin: 0 8px 8px 0; margin: 0 8px 8px 0;
@@ -63,6 +77,11 @@
.contentPadding { .contentPadding {
padding: 8px 8px 0 16px; padding: 8px 8px 0 16px;
@media only screen and (max-width: 797px) {
padding-right: 16px;
width: 100% !important;
}
} }
.cursorPointer { .cursorPointer {
@@ -155,6 +174,11 @@
.modalPadding { .modalPadding {
padding: 0px; padding: 0px;
@media only screen and (max-width: 797px) {
display: flex;
flex-flow: column nowrap;
}
} }
.moduleHeader { .moduleHeader {
@@ -185,6 +209,15 @@
.sidebarPadding { .sidebarPadding {
padding: 8px 16px 0 8px; padding: 8px 16px 0 8px;
@media only screen and (max-width: 797px) {
align-items: flex-start;
display: flex;
flex-flow: row wrap;
gap: 10px;
padding-left: 16px;
width: 100% !important;
}
} }
.text { .text {
@@ -5,6 +5,7 @@ import TextareaAutosize from 'react-textarea-autosize';
import { Button, Form, TextArea } from 'semantic-ui-react'; import { Button, Form, TextArea } from 'semantic-ui-react';
import { useField } from '../../../hooks'; import { useField } from '../../../hooks';
import { focusEnd } from '../../../utils/element-helpers';
import styles from './NameEdit.module.scss'; import styles from './NameEdit.module.scss';
@@ -65,7 +66,7 @@ const NameEdit = React.forwardRef(({ children, defaultValue, onUpdate }, ref) =>
useEffect(() => { useEffect(() => {
if (isOpened) { if (isOpened) {
field.current.ref.current.focus(); focusEnd(field.current.ref.current);
} }
}, [isOpened]); }, [isOpened]);
@@ -4,6 +4,7 @@
border-radius: 4px; border-radius: 4px;
bottom: 20px; bottom: 20px;
box-shadow: #b04632 0 1px 0; box-shadow: #b04632 0 1px 0;
max-width: calc(100% - 40px);
padding: 12px 18px; padding: 12px 18px;
position: fixed; position: fixed;
right: 20px; right: 20px;
+81 -2
View File
@@ -1,8 +1,10 @@
import upperFirst from 'lodash/upperFirst'; import upperFirst from 'lodash/upperFirst';
import React from 'react'; import React, { useEffect, useRef } from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import classNames from 'classnames'; import classNames from 'classnames';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { Icon } from 'semantic-ui-react';
import { useForceUpdate } from '../../lib/hooks';
import getDateFormat from '../../utils/get-date-format'; import getDateFormat from '../../utils/get-date-format';
@@ -14,6 +16,12 @@ const SIZES = {
MEDIUM: 'medium', MEDIUM: 'medium',
}; };
const STATUSES = {
DUE_SOON: 'dueSoon',
OVERDUE: 'overdue',
COMPLETED: 'completed',
};
const LONG_DATE_FORMAT_BY_SIZE = { const LONG_DATE_FORMAT_BY_SIZE = {
tiny: 'longDate', tiny: 'longDate',
small: 'longDate', small: 'longDate',
@@ -26,8 +34,47 @@ const FULL_DATE_FORMAT_BY_SIZE = {
medium: 'fullDateTime', medium: 'fullDateTime',
}; };
const DueDate = React.memo(({ value, size, isDisabled, onClick }) => { const STATUS_ICON_PROPS_BY_STATUS = {
[STATUSES.DUE_SOON]: {
name: 'hourglass half',
color: 'orange',
},
[STATUSES.OVERDUE]: {
name: 'hourglass end',
color: 'red',
},
[STATUSES.COMPLETED]: {
name: 'checkmark',
color: 'green',
},
};
const getStatus = (dateTime, isCompleted) => {
if (isCompleted) {
return STATUSES.COMPLETED;
}
const secondsLeft = Math.floor((dateTime.getTime() - new Date().getTime()) / 1000);
if (secondsLeft <= 0) {
return STATUSES.OVERDUE;
}
if (secondsLeft <= 24 * 60 * 60) {
return STATUSES.DUE_SOON;
}
return null;
};
const DueDate = React.memo(({ value, size, isCompleted, isDisabled, withStatusIcon, onClick }) => {
const [t] = useTranslation(); const [t] = useTranslation();
const forceUpdate = useForceUpdate();
const statusRef = useRef(null);
statusRef.current = getStatus(value, isCompleted);
const intervalRef = useRef(null);
const dateFormat = getDateFormat( const dateFormat = getDateFormat(
value, value,
@@ -35,11 +82,34 @@ const DueDate = React.memo(({ value, size, isDisabled, onClick }) => {
FULL_DATE_FORMAT_BY_SIZE[size], FULL_DATE_FORMAT_BY_SIZE[size],
); );
useEffect(() => {
if ([null, STATUSES.DUE_SOON].includes(statusRef.current)) {
intervalRef.current = setInterval(() => {
const status = getStatus(value, isCompleted);
if (status !== statusRef.current) {
forceUpdate();
}
if (status === STATUSES.OVERDUE) {
clearInterval(intervalRef.current);
}
}, 1000);
}
return () => {
if (intervalRef.current) {
clearInterval(intervalRef.current);
}
};
}, [value, isCompleted, forceUpdate]);
const contentNode = ( const contentNode = (
<span <span
className={classNames( className={classNames(
styles.wrapper, styles.wrapper,
styles[`wrapper${upperFirst(size)}`], styles[`wrapper${upperFirst(size)}`],
!withStatusIcon && statusRef.current && styles[`wrapper${upperFirst(statusRef.current)}`],
onClick && styles.wrapperHoverable, onClick && styles.wrapperHoverable,
)} )}
> >
@@ -47,6 +117,10 @@ const DueDate = React.memo(({ value, size, isDisabled, onClick }) => {
value, value,
postProcess: 'formatDate', postProcess: 'formatDate',
})} })}
{withStatusIcon && statusRef.current && (
// eslint-disable-next-line react/jsx-props-no-spreading
<Icon {...STATUS_ICON_PROPS_BY_STATUS[statusRef.current]} className={styles.statusIcon} />
)}
</span> </span>
); );
@@ -62,14 +136,19 @@ const DueDate = React.memo(({ value, size, isDisabled, onClick }) => {
DueDate.propTypes = { DueDate.propTypes = {
value: PropTypes.instanceOf(Date).isRequired, value: PropTypes.instanceOf(Date).isRequired,
size: PropTypes.oneOf(Object.values(SIZES)), size: PropTypes.oneOf(Object.values(SIZES)),
isCompleted: PropTypes.bool.isRequired,
isDisabled: PropTypes.bool, isDisabled: PropTypes.bool,
withStatusIcon: PropTypes.bool,
onClick: PropTypes.func, onClick: PropTypes.func,
onCompletionToggle: PropTypes.func,
}; };
DueDate.defaultProps = { DueDate.defaultProps = {
size: SIZES.MEDIUM, size: SIZES.MEDIUM,
isDisabled: false, isDisabled: false,
withStatusIcon: false,
onClick: undefined, onClick: undefined,
onCompletionToggle: undefined,
}; };
export default DueDate; export default DueDate;
@@ -8,16 +8,17 @@
padding: 0; padding: 0;
} }
.statusIcon {
line-height: 1;
margin: 0 0 0 8px;
}
.wrapper { .wrapper {
background: #dce0e4; background: #dce0e4;
border: none;
border-radius: 3px; border-radius: 3px;
color: #6a808b; color: #6a808b;
display: inline-block; display: inline-block;
outline: none;
text-align: left;
transition: background 0.3s ease; transition: background 0.3s ease;
vertical-align: top;
} }
.wrapperHoverable:hover { .wrapperHoverable:hover {
@@ -43,4 +44,21 @@
line-height: 20px; line-height: 20px;
padding: 6px 12px; padding: 6px 12px;
} }
/* Statuses */
.wrapperDueSoon {
background: #f2711c;
color: #fff;
}
.wrapperOverdue {
background: #db2828;
color: #fff;
}
.wrapperCompleted {
background: #21ba45;
color: #fff;
}
} }
@@ -1,5 +1,6 @@
:global(#app) { :global(#app) {
.wrapper { .wrapper {
max-width: 100vw;
position: fixed; position: fixed;
width: 100%; width: 100%;
z-index: 1; z-index: 1;
@@ -87,7 +87,12 @@
} }
.userName { .userName {
display: none;
margin-right: 10px; margin-right: 10px;
@media only screen and (min-width: 797px) {
display: block;
}
} }
.wrapper { .wrapper {
+2 -2
View File
@@ -17,7 +17,7 @@ const SIZES = {
const Label = React.memo(({ name, color, size, isDisabled, onClick }) => { const Label = React.memo(({ name, color, size, isDisabled, onClick }) => {
const contentNode = ( const contentNode = (
<div <span
title={name} title={name}
className={classNames( className={classNames(
styles.wrapper, styles.wrapper,
@@ -28,7 +28,7 @@ const Label = React.memo(({ name, color, size, isDisabled, onClick }) => {
)} )}
> >
{name || '\u00A0'} {name || '\u00A0'}
</div> </span>
); );
return onClick ? ( return onClick ? (
@@ -11,17 +11,17 @@
.wrapper { .wrapper {
border-radius: 3px; border-radius: 3px;
box-sizing: border-box;
color: #fff; color: #fff;
display: inline-block;
font-weight: 400; font-weight: 400;
outline: none;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.2); text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.2);
vertical-align: top;
white-space: nowrap; white-space: nowrap;
} }
.wrapperNameless{ .wrapperNameless {
width: 40px; width: 40px;
} }
@@ -80,6 +80,12 @@
&:hover .target { &:hover .target {
opacity: 1; opacity: 1;
} }
@media only screen and (max-width: 797px) {
.target {
opacity: 1;
}
}
} }
.headerEditable { .headerEditable {
@@ -103,6 +109,14 @@
background: rgba(9, 30, 66, 0.13); background: rgba(9, 30, 66, 0.13);
color: #516b7a; color: #516b7a;
} }
@media only screen and (max-width: 797px) {
&:focus,
&:active {
background: rgba(9, 30, 66, 0.13);
color: #516b7a;
}
}
} }
.headerName { .headerName {
+2 -1
View File
@@ -4,6 +4,7 @@ import TextareaAutosize from 'react-textarea-autosize';
import { TextArea } from 'semantic-ui-react'; import { TextArea } from 'semantic-ui-react';
import { useField } from '../../hooks'; import { useField } from '../../hooks';
import { focusEnd } from '../../utils/element-helpers';
import styles from './NameEdit.module.scss'; import styles from './NameEdit.module.scss';
@@ -71,7 +72,7 @@ const NameEdit = React.forwardRef(({ children, defaultValue, onUpdate }, ref) =>
useEffect(() => { useEffect(() => {
if (isOpened) { if (isOpened) {
field.current.ref.current.select(); focusEnd(field.current.ref.current);
} }
}, [isOpened]); }, [isOpened]);
@@ -11,6 +11,10 @@
vertical-align: top; vertical-align: top;
width: 36px; width: 36px;
@media only screen and (max-width: 797px) {
margin-left: 10px;
}
&:hover { &:hover {
background: rgba(0, 0, 0, 0.32); background: rgba(0, 0, 0, 0.32);
} }
@@ -10,13 +10,10 @@
.wrapper { .wrapper {
background: #dce0e4; background: #dce0e4;
border: none;
border-radius: 3px; border-radius: 3px;
color: #6a808b; color: #6a808b;
display: inline-block; display: inline-block;
font-variant-numeric: tabular-nums; font-variant-numeric: tabular-nums;
outline: none;
text-align: left;
transition: background 0.3s ease; transition: background 0.3s ease;
vertical-align: top; vertical-align: top;
} }
@@ -14,12 +14,10 @@
} }
.wrapper { .wrapper {
border: none;
border-radius: 50%; border-radius: 50%;
color: #fff; color: #fff;
display: inline-block; display: inline-block;
line-height: 1; line-height: 1;
outline: none;
text-align: center; text-align: center;
vertical-align: top; vertical-align: top;
} }
@@ -2,7 +2,7 @@ import React from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { Image, Tab } from 'semantic-ui-react'; import { Image, Tab } from 'semantic-ui-react';
import Config from '../../constants/Config'; import version from '../../version';
import logo from '../../assets/images/logo.png'; import logo from '../../assets/images/logo.png';
@@ -15,7 +15,7 @@ const AboutPane = React.memo(() => {
<Tab.Pane attached={false} className={styles.wrapper}> <Tab.Pane attached={false} className={styles.wrapper}>
<Image centered src={logo} size="large" /> <Image centered src={logo} size="large" />
<div className={styles.version}> <div className={styles.version}>
{t('common.version')} {Config.VERSION} {t('common.version')} {version}
</div> </div>
</Tab.Pane> </Tab.Pane>
); );
-3
View File
@@ -195,9 +195,6 @@ export default {
CARD_UPDATE__SUCCESS: 'CARD_UPDATE__SUCCESS', CARD_UPDATE__SUCCESS: 'CARD_UPDATE__SUCCESS',
CARD_UPDATE__FAILURE: 'CARD_UPDATE__FAILURE', CARD_UPDATE__FAILURE: 'CARD_UPDATE__FAILURE',
CARD_UPDATE_HANDLE: 'CARD_UPDATE_HANDLE', CARD_UPDATE_HANDLE: 'CARD_UPDATE_HANDLE',
CARD_TRANSFER: 'CARD_TRANSFER',
CARD_TRANSFER__SUCCESS: 'CARD_TRANSFER__SUCCESS',
CARD_TRANSFER__FAILURE: 'CARD_TRANSFER__FAILURE',
CARD_DUPLICATE: 'CARD_DUPLICATE', CARD_DUPLICATE: 'CARD_DUPLICATE',
CARD_DUPLICATE__SUCCESS: 'CARD_DUPLICATE__SUCCESS', CARD_DUPLICATE__SUCCESS: 'CARD_DUPLICATE__SUCCESS',
CARD_DUPLICATE__FAILURE: 'CARD_DUPLICATE__FAILURE', CARD_DUPLICATE__FAILURE: 'CARD_DUPLICATE__FAILURE',
+2 -3
View File
@@ -1,11 +1,10 @@
const VERSION = process.env.REACT_APP_VERSION;
const { BASE_URL } = window; const { BASE_URL } = window;
const BASE_PATH = BASE_URL.replace(/^.*\/\/[^/]*(.*)[^?#]*.*$/, '$1'); const BASE_PATH = BASE_URL.replace(/^.*\/\/[^/]*(.*)[^?#]*.*$/, '$1');
const SERVER_BASE_URL = const SERVER_BASE_URL =
process.env.REACT_APP_SERVER_BASE_URL || process.env.REACT_APP_SERVER_BASE_URL ||
(process.env.NODE_ENV === 'production' ? BASE_URL : 'http://localhost:1337'); (process.env.NODE_ENV === 'production' ? BASE_URL : 'http://localhost:1337');
const SERVER_BASE_PATH = SERVER_BASE_URL.replace(/^.*\/\/[^/]*(.*)[^?#]*.*$/, '$1');
const SERVER_HOST_NAME = SERVER_BASE_URL.replace(/^(.*\/\/[^/?#]*).*$/, '$1'); const SERVER_HOST_NAME = SERVER_BASE_URL.replace(/^(.*\/\/[^/?#]*).*$/, '$1');
@@ -17,9 +16,9 @@ const POSITION_GAP = 65535;
const ACTIVITIES_LIMIT = 50; const ACTIVITIES_LIMIT = 50;
export default { export default {
VERSION,
BASE_PATH, BASE_PATH,
SERVER_BASE_URL, SERVER_BASE_URL,
SERVER_BASE_PATH,
SERVER_HOST_NAME, SERVER_HOST_NAME,
ACCESS_TOKEN_KEY, ACCESS_TOKEN_KEY,
ACCESS_TOKEN_VERSION_KEY, ACCESS_TOKEN_VERSION_KEY,
+3 -4
View File
@@ -20,10 +20,8 @@ const makeMapStateToProps = () => {
const allLabels = selectors.selectLabelsForCurrentBoard(state); const allLabels = selectors.selectLabelsForCurrentBoard(state);
const currentUserMembership = selectors.selectCurrentUserMembershipForCurrentBoard(state); const currentUserMembership = selectors.selectCurrentUserMembershipForCurrentBoard(state);
const { name, dueDate, stopwatch, coverUrl, boardId, listId, isPersisted } = selectCardById( const { name, dueDate, isDueDateCompleted, stopwatch, coverUrl, boardId, listId, isPersisted } =
state, selectCardById(state, id);
id,
);
const users = selectUsersByCardId(state, id); const users = selectUsersByCardId(state, id);
const labels = selectLabelsByCardId(state, id); const labels = selectLabelsByCardId(state, id);
@@ -38,6 +36,7 @@ const makeMapStateToProps = () => {
index, index,
name, name,
dueDate, dueDate,
isDueDateCompleted,
stopwatch, stopwatch,
coverUrl, coverUrl,
boardId, boardId,
@@ -21,6 +21,7 @@ const mapStateToProps = (state) => {
name, name,
description, description,
dueDate, dueDate,
isDueDateCompleted,
stopwatch, stopwatch,
isSubscribed, isSubscribed,
isActivitiesFetching, isActivitiesFetching,
@@ -49,6 +50,7 @@ const mapStateToProps = (state) => {
name, name,
description, description,
dueDate, dueDate,
isDueDateCompleted,
stopwatch, stopwatch,
isSubscribed, isSubscribed,
isActivitiesFetching, isActivitiesFetching,
+2 -1
View File
@@ -6,12 +6,13 @@ import entryActions from '../entry-actions';
import Projects from '../components/Projects'; import Projects from '../components/Projects';
const mapStateToProps = (state) => { const mapStateToProps = (state) => {
const { allowAllToCreateProjects } = selectors.selectConfig(state);
const { isAdmin } = selectors.selectCurrentUser(state); const { isAdmin } = selectors.selectCurrentUser(state);
const projects = selectors.selectProjectsForCurrentUser(state); const projects = selectors.selectProjectsForCurrentUser(state);
return { return {
items: projects, items: projects,
canAdd: isAdmin, canAdd: allowAllToCreateProjects || isAdmin,
}; };
}; };
+3 -3
View File
@@ -58,9 +58,9 @@ i18n
.use(initReactI18next) .use(initReactI18next)
.init({ .init({
resources: embeddedLocales, resources: embeddedLocales,
fallbackLng: 'en', fallbackLng: 'en-US',
supportedLngs: languages, supportedLngs: languages,
load: 'languageOnly', load: 'currentOnly',
interpolation: { interpolation: {
escapeValue: false, escapeValue: false,
format(value, format, language) { format(value, format, language) {
@@ -80,7 +80,7 @@ i18n
}); });
i18n.loadCoreLocale = async (language = i18n.resolvedLanguage) => { i18n.loadCoreLocale = async (language = i18n.resolvedLanguage) => {
if (language === 'en') { if (language === i18n.options.fallbackLng[0]) {
return; return;
} }
@@ -1,7 +1,7 @@
import login from './login'; import login from './login';
export default { export default {
language: 'bg', language: 'bg-BG',
country: 'bg', country: 'bg',
name: 'Български', name: 'Български',
embeddedLocale: login, embeddedLocale: login,
@@ -1,7 +1,7 @@
import login from './login'; import login from './login';
export default { export default {
language: 'cs', language: 'cs-CZ',
country: 'cz', country: 'cz',
name: 'Čeština', name: 'Čeština',
embeddedLocale: login, embeddedLocale: login,
@@ -1,7 +1,7 @@
import login from './login'; import login from './login';
export default { export default {
language: 'da', language: 'da-DK',
country: 'dk', country: 'dk',
name: 'Dansk', name: 'Dansk',
embeddedLocale: login, embeddedLocale: login,
@@ -104,6 +104,7 @@ export default {
language: 'Sprache', language: 'Sprache',
leaveBoard_title: 'Board verlassen', leaveBoard_title: 'Board verlassen',
leaveProject_title: 'Projekt verlassen', leaveProject_title: 'Projekt verlassen',
linkIsCopied: 'Link kopiert',
list: 'Listen', list: 'Listen',
listActions_title: 'Aufgaben auflisten', listActions_title: 'Aufgaben auflisten',
managers: 'Manager', managers: 'Manager',
@@ -169,6 +170,7 @@ export default {
addTask: 'Aufgabe hinzufügen', addTask: 'Aufgabe hinzufügen',
addToCard: 'Zu Karte hinzufügen', addToCard: 'Zu Karte hinzufügen',
addUser: 'Benutzer hinzufügen', addUser: 'Benutzer hinzufügen',
copyLink_title: 'Link kopieren',
createBoard: 'Board erstellen', createBoard: 'Board erstellen',
createFile: 'Datei erstellen', createFile: 'Datei erstellen',
createLabel: 'Label erstellen', createLabel: 'Label erstellen',
@@ -190,6 +192,8 @@ export default {
deleteTask: 'Aufgabe löschen', deleteTask: 'Aufgabe löschen',
deleteTask_title: 'Aufgabe löschen', deleteTask_title: 'Aufgabe löschen',
deleteUser: 'Benutzer löschen', deleteUser: 'Benutzer löschen',
duplicate: 'Kopieren',
duplicateCard_title: 'Karte kopieren',
edit: 'Bearbeiten', edit: 'Bearbeiten',
editDueDate_title: 'Fälligkeitsdatum bearbeiten', editDueDate_title: 'Fälligkeitsdatum bearbeiten',
editDescription_title: 'Beschreibung ändern', editDescription_title: 'Beschreibung ändern',
@@ -1,7 +1,7 @@
import login from './login'; import login from './login';
export default { export default {
language: 'de', language: 'de-DE',
country: 'de', country: 'de',
name: 'Deutsch', name: 'Deutsch',
embeddedLocale: login, embeddedLocale: login,
@@ -106,6 +106,7 @@ export default {
language: 'Language', language: 'Language',
leaveBoard_title: 'Leave Board', leaveBoard_title: 'Leave Board',
leaveProject_title: 'Leave Project', leaveProject_title: 'Leave Project',
linkIsCopied: 'Link is copied',
list: 'List', list: 'List',
listActions_title: 'List Actions', listActions_title: 'List Actions',
managers: 'Managers', managers: 'Managers',
@@ -183,6 +184,7 @@ export default {
addTask: 'Add task', addTask: 'Add task',
addToCard: 'Add to card', addToCard: 'Add to card',
addUser: 'Add user', addUser: 'Add user',
copyLink_title: 'Copy Link',
createBoard: 'Create board', createBoard: 'Create board',
createFile: 'Create file', createFile: 'Create file',
createLabel: 'Create label', createLabel: 'Create label',
@@ -4,8 +4,8 @@ import login from './login';
import core from './core'; import core from './core';
export default { export default {
language: 'en', language: 'en-US',
country: 'gb', country: 'us',
name: 'English', name: 'English',
embeddedLocale: merge(login, core), embeddedLocale: merge(login, core),
}; };
@@ -1,7 +1,7 @@
import login from './login'; import login from './login';
export default { export default {
language: 'es', language: 'es-ES',
country: 'es', country: 'es',
name: 'Español', name: 'Español',
embeddedLocale: login, embeddedLocale: login,
+254
View File
@@ -0,0 +1,254 @@
import dateFns from 'date-fns/locale/fa-IR';
export default {
dateFns,
format: {
date: 'M/d/yyyy',
time: 'p',
dateTime: '$t(format:date) $t(format:time)',
longDate: 'MMM d',
longDateTime: "MMMM d 'at' p",
fullDate: 'MMM d, y',
fullDateTime: "MMMM d, y 'at' p",
},
translation: {
common: {
aboutPlanka: 'درباره Planka',
account: 'حساب کاربری',
actions: 'اقدامات',
addAttachment_title: 'اضافه کردن پیوست',
addComment: 'اضافه کردن نظر',
addManager_title: 'اضافه کردن مدیر',
addMember_title: 'اضافه کردن عضو',
addUser_title: 'اضافه کردن کاربر',
administrator: 'مدیر سیستم',
all: 'همه',
allChangesWillBeAutomaticallySavedAfterConnectionRestored:
'تمام تغییرات به صورت خودکار ذخیره می‌شوند<br />بعد از بازیابی ارتباط.',
areYouSureYouWantToDeleteThisAttachment:
'آیا مطمئن هستید که می‌خواهید این پیوست را حذف کنید؟',
areYouSureYouWantToDeleteThisBoard: 'آیا مطمئن هستید که می‌خواهید این برد را حذف کنید؟',
areYouSureYouWantToDeleteThisCard: 'آیا مطمئن هستید که می‌خواهید این کارت را حذف کنید؟',
areYouSureYouWantToDeleteThisComment: 'آیا مطمئن هستید که می‌خواهید این نظر را حذف کنید؟',
areYouSureYouWantToDeleteThisLabel: 'آیا مطمئن هستید که می‌خواهید این برچسب را حذف کنید؟',
areYouSureYouWantToDeleteThisList: 'آیا مطمئن هستید که می‌خواهید این لیست را حذف کنید؟',
areYouSureYouWantToDeleteThisProject: 'آیا مطمئن هستید که می‌خواهید این پروژه را حذف کنید؟',
areYouSureYouWantToDeleteThisTask: 'آیا مطمئن هستید که می‌خواهید این وظیفه را حذف کنید؟',
areYouSureYouWantToDeleteThisUser: 'آیا مطمئن هستید که می‌خواهید این کاربر را حذف کنید؟',
areYouSureYouWantToLeaveBoard: 'آیا مطمئن هستید که می‌خواهید از برد خارج شوید؟',
areYouSureYouWantToLeaveProject: 'آیا مطمئن هستید که می‌خواهید از پروژه خارج شوید؟',
areYouSureYouWantToRemoveThisManagerFromProject:
'آیا مطمئن هستید که می‌خواهید این مدیر را از پروژه حذف کنید؟',
areYouSureYouWantToRemoveThisMemberFromBoard:
'آیا مطمئن هستید که می‌خواهید این عضو را از برد حذف کنید؟',
attachment: 'پیوست',
attachments: 'پیوست‌ها',
authentication: 'احراز هویت',
background: 'پس‌زمینه',
board: 'برد',
boardNotFound_title: 'برد یافت نشد',
canComment: 'می‌تواند نظر بدهد',
canEditContentOfBoard: 'می‌تواند محتوای برد را ویرایش کند.',
canOnlyViewBoard: 'فقط می‌تواند برد را مشاهده کند.',
cardActions_title: 'اقدامات کارت',
cardNotFound_title: 'کارت یافت نشد',
cardOrActionAreDeleted: 'کارت یا اقدام حذف شده‌اند.',
color: 'رنگ',
copy_inline: 'کپی',
createBoard_title: 'ایجاد برد',
createLabel_title: 'ایجاد برچسب',
createNewOneOrSelectExistingOne: 'یک جدید ایجاد کنید یا<br />یکی موجود را انتخاب کنید.',
createProject_title: 'ایجاد پروژه',
createTextFile_title: 'ایجاد فایل متنی',
currentPassword: 'رمز عبور فعلی',
dangerZone_title: 'منطقه خطر',
date: 'تاریخ',
dueDate: 'تاریخ سررسید',
dueDate_title: 'تاریخ سررسید',
deleteAttachment_title: 'حذف پیوست',
deleteBoard_title: 'حذف برد',
deleteCard_title: 'حذف کارت',
deleteComment_title: 'حذف نظر',
deleteLabel_title: 'حذف برچسب',
deleteList_title: 'حذف لیست',
deleteProject_title: 'حذف پروژه',
deleteTask_title: 'حذف وظیفه',
deleteUser_title: 'حذف کاربر',
description: 'توضیحات',
detectAutomatically: 'تشخیص خودکار',
dropFileToUpload: 'فایل را برای آپلود بکشید',
editor: 'ویرایشگر',
editAttachment_title: 'ویرایش پیوست',
editAvatar_title: 'ویرایش آواتار',
editBoard_title: 'ویرایش برد',
editDueDate_title: 'ویرایش تاریخ سررسید',
editEmail_title: 'ویرایش ایمیل',
editInformation_title: 'ویرایش اطلاعات',
editLabel_title: 'ویرایش برچسب',
editPassword_title: 'ویرایش رمز عبور',
editPermissions_title: 'ویرایش دسترسی‌ها',
editStopwatch_title: 'ویرایش کرنومتر',
editUsername_title: 'ویرایش نام کاربری',
email: 'ایمیل',
emailAlreadyInUse: 'ایمیل قبلا استفاده شده است',
enterCardTitle: 'عنوان کارت را وارد کنید... [Ctrl+Enter] برای باز شدن خودکار.',
enterDescription: 'توضیحات را وارد کنید...',
enterFilename: 'نام فایل را وارد کنید',
enterListTitle: 'عنوان لیست را وارد کنید...',
enterProjectTitle: 'عنوان پروژه را وارد کنید',
enterTaskDescription: 'توضیحات وظیفه را وارد کنید...',
filterByLabels_title: 'فیلتر بر اساس برچسب‌ها',
filterByMembers_title: 'فیلتر بر اساس اعضا',
fromComputer_title: 'از کامپیوتر',
fromTrello: 'از Trello',
general: 'عمومی',
hours: 'ساعت‌ها',
importBoard_title: 'وارد کردن برد',
invalidCurrentPassword: 'رمز عبور فعلی نامعتبر است',
labels: 'برچسب‌ها',
language: 'زبان',
leaveBoard_title: 'ترک برد',
leaveProject_title: 'ترک پروژه',
linkIsCopied: 'لینک کپی شد',
list: 'لیست',
listActions_title: 'اقدامات لیست',
managers: 'مدیران',
managerActions_title: 'اقدامات مدیر',
members: 'اعضا',
memberActions_title: 'اقدامات عضو',
minutes: 'دقیقه‌ها',
moveCard_title: 'انتقال کارت',
name: 'نام',
newestFirst: 'جدیدترین اول',
newEmail: 'ایمیل جدید',
newPassword: 'رمز عبور جدید',
newUsername: 'نام کاربری جدید',
noConnectionToServer: 'ارتباط با سرور قطع است',
noBoards: 'بردی وجود ندارد',
noLists: 'لیستی وجود ندارد',
noProjects: 'پروژه‌ای وجود ندارد',
notifications: 'اعلان‌ها',
noUnreadNotifications: 'اعلان خوانده نشده‌ای وجود ندارد.',
oldestFirst: 'قدیمی‌ترین اول',
openBoard_title: 'باز کردن برد',
optional_inline: 'اختیاری',
organization: 'سازمان',
phone: 'تلفن',
preferences: 'ترجیحات',
pressPasteShortcutToAddAttachmentFromClipboard:
'نکته: با فشردن Ctrl-V (Cmd-V در مک) می‌توانید پیوست را از کلیپ بورد اضافه کنید.',
project: 'پروژه',
projectNotFound_title: 'پروژه یافت نشد',
removeManager_title: 'حذف مدیر',
removeMember_title: 'حذف عضو',
searchLabels: 'جستجوی برچسب‌ها...',
searchMembers: 'جستجوی اعضا...',
searchUsers: 'جستجوی کاربران...',
searchCards: 'جستجوی کارت‌ها...',
seconds: 'ثانیه‌ها',
selectBoard: 'انتخاب برد',
selectList: 'انتخاب لیست',
selectPermissions_title: 'انتخاب دسترسی‌ها',
selectProject: 'انتخاب پروژه',
settings: 'تنظیمات',
sortList_title: 'مرتب‌سازی لیست',
stopwatch: 'کرنومتر',
subscribeToMyOwnCardsByDefault: 'به طور پیش‌فرض به کارت‌های خودم مشترک شوم',
taskActions_title: 'اقدامات وظیفه',
tasks: 'وظایف',
thereIsNoPreviewAvailableForThisAttachment: 'پیش نمایشی برای این پیوست موجود نیست.',
time: 'زمان',
title: 'عنوان',
userActions_title: 'اقدامات کاربر',
userAddedThisCardToList: '<0>{{user}}</0><1> این کارت را به {{list}} اضافه کرد</1>',
userLeftNewCommentToCard: '{{user}} نظر جدید «{{comment}}» را به <2>{{card}}</2> اضافه کرد',
userMovedCardFromListToList:
'{{user}} <2>{{card}}</2> را از {{fromList}} به {{toList}} منتقل کرد',
userMovedThisCardFromListToList:
'<0>{{user}}</0><1> این کارت را از {{fromList}} به {{toList}} منتقل کرد</1>',
username: 'نام کاربری',
usernameAlreadyInUse: 'نام کاربری قبلا استفاده شده است',
users: 'کاربران',
version: 'نسخه',
viewer: 'بیننده',
writeComment: 'نظر بنویسید...',
},
action: {
addAnotherCard: 'اضافه کردن کارت دیگر',
addAnotherList: 'اضافه کردن لیست دیگر',
addAnotherTask: 'اضافه کردن وظیفه دیگر',
addCard: 'اضافه کردن کارت',
addCard_title: 'اضافه کردن کارت',
addComment: 'اضافه کردن نظر',
addList: 'اضافه کردن لیست',
addMember: 'اضافه کردن عضو',
addMoreDetailedDescription: 'اضافه کردن توضیحات بیشتر',
addTask: 'اضافه کردن وظیفه',
addToCard: 'اضافه کردن به کارت',
addUser: 'اضافه کردن کاربر',
copyLink_title: 'کپی لینک',
createBoard: 'ایجاد برد',
createFile: 'ایجاد فایل',
createLabel: 'ایجاد برچسب',
createNewLabel: 'ایجاد برچسب جدید',
createProject: 'ایجاد پروژه',
delete: 'حذف',
deleteAttachment: 'حذف پیوست',
deleteAvatar: 'حذف آواتار',
deleteBoard: 'حذف برد',
deleteCard: 'حذف کارت',
deleteCard_title: 'حذف کارت',
deleteComment: 'حذف نظر',
deleteImage: 'حذف تصویر',
deleteLabel: 'حذف برچسب',
deleteList: 'حذف لیست',
deleteList_title: 'حذف لیست',
deleteProject: 'حذف پروژه',
deleteProject_title: 'حذف پروژه',
deleteTask: 'حذف وظیفه',
deleteTask_title: 'حذف وظیفه',
deleteUser: 'حذف کاربر',
duplicate: 'تکرار',
duplicateCard_title: 'تکرار کارت',
edit: 'ویرایش',
editDueDate_title: 'ویرایش تاریخ سررسید',
editDescription_title: 'ویرایش توضیحات',
editEmail_title: 'ویرایش ایمیل',
editInformation_title: 'ویرایش اطلاعات',
editPassword_title: 'ویرایش رمز عبور',
editPermissions: 'ویرایش دسترسی‌ها',
editStopwatch_title: 'ویرایش کرنومتر',
editTitle_title: 'ویرایش عنوان',
editUsername_title: 'ویرایش نام کاربری',
hideDetails: 'پنهان کردن جزئیات',
import: 'وارد کردن',
leaveBoard: 'ترک برد',
leaveProject: 'ترک پروژه',
logOut_title: 'خروج',
makeCover_title: 'ایجاد کاور',
move: 'انتقال',
moveCard_title: 'انتقال کارت',
remove: 'حذف',
removeBackground: 'حذف پس‌زمینه',
removeCover_title: 'حذف کاور',
removeFromBoard: 'حذف از برد',
removeFromProject: 'حذف از پروژه',
removeManager: 'حذف مدیر',
removeMember: 'حذف عضو',
save: 'ذخیره',
showAllAttachments: 'نمایش همه پیوست‌ها ({{hidden}} مخفی)',
showDetails: 'نمایش جزئیات',
showFewerAttachments: 'نمایش کمتر پیوست‌ها',
sortList_title: 'مرتب‌سازی لیست',
start: 'شروع',
stop: 'توقف',
subscribe: 'مشترک شدن',
unsubscribe: 'لغو اشتراک',
uploadNewAvatar: 'آپلود آواتار جدید',
uploadNewImage: 'آپلود تصویر جدید',
},
},
};
+8
View File
@@ -0,0 +1,8 @@
import login from './login';
export default {
language: 'fa-IR',
country: 'ir',
name: 'فارسی',
embeddedLocale: login,
};
+22
View File
@@ -0,0 +1,22 @@
export default {
translation: {
common: {
emailOrUsername: 'ایمیل یا نام کاربری',
invalidEmailOrUsername: 'ایمیل یا نام کاربری نامعتبر است',
invalidPassword: 'رمز عبور نامعتبر است',
logInToPlanka: 'ورود به Planka',
noInternetConnection: 'بدون اتصال به اینترنت',
pageNotFound_title: 'صفحه یافت نشد',
password: 'رمز عبور',
projectManagement: 'مدیریت پروژه',
serverConnectionFailed: 'اتصال به سرور ناموفق بود',
unknownError: 'خطای ناشناخته، بعداً دوباره تلاش کنید',
useSingleSignOn: 'استفاده از ورود یکپارچه',
},
action: {
logIn: 'ورود',
logInWithSSO: 'ورود با SSO',
},
},
};
@@ -15,10 +15,12 @@ export default {
translation: { translation: {
common: { common: {
aboutPlanka: 'À propos de Planka',
account: 'Compte', account: 'Compte',
actions: 'Actions', actions: 'Actions',
addAttachment_title: 'Ajouter une pièce jointe', addAttachment_title: 'Ajouter une pièce jointe',
addComment: 'Ajouter un commentaire', addComment: 'Ajouter un commentaire',
addManager_title: 'Ajouter un manager',
addMember_title: 'Ajouter un membre', addMember_title: 'Ajouter un membre',
addUser_title: 'Ajouter un utilisateur', addUser_title: 'Ajouter un utilisateur',
administrator: 'Administrateur', administrator: 'Administrateur',
@@ -26,32 +28,43 @@ export default {
allChangesWillBeAutomaticallySavedAfterConnectionRestored: allChangesWillBeAutomaticallySavedAfterConnectionRestored:
'Toutes les modifications seront automatiquement enregistrées<br />une fois la connexion rétablie.', 'Toutes les modifications seront automatiquement enregistrées<br />une fois la connexion rétablie.',
areYouSureYouWantToDeleteThisAttachment: 'Voulez-vous vraiment supprimer cette pièce jointe?', areYouSureYouWantToDeleteThisAttachment: 'Voulez-vous vraiment supprimer cette pièce jointe?',
areYouSureYouWantToDeleteThisBoard: 'Êtes-vous sûr de vouloir supprimer ce forum?', areYouSureYouWantToDeleteThisBoard: 'Êtes-vous sûr de vouloir supprimer ce tableau?',
areYouSureYouWantToDeleteThisCard: 'Voulez-vous vraiment supprimer cette carte?', areYouSureYouWantToDeleteThisCard: 'Voulez-vous vraiment supprimer cette carte?',
areYouSureYouWantToDeleteThisComment: 'Êtes-vous sûr de vouloir supprimer ce commentaire?', areYouSureYouWantToDeleteThisComment: 'Êtes-vous sûr de vouloir supprimer ce commentaire?',
areYouSureYouWantToDeleteThisLabel: 'Voulez-vous vraiment supprimer ce libellé?', areYouSureYouWantToDeleteThisLabel: 'Voulez-vous vraiment supprimer cette étiquette?',
areYouSureYouWantToDeleteThisList: 'Êtes-vous sûr de vouloir supprimer cette liste?', areYouSureYouWantToDeleteThisList: 'Êtes-vous sûr de vouloir supprimer cette liste?',
areYouSureYouWantToDeleteThisProject: 'Êtes-vous sûr de vouloir supprimer ce projet?', areYouSureYouWantToDeleteThisProject: 'Êtes-vous sûr de vouloir supprimer ce projet?',
areYouSureYouWantToDeleteThisTask: 'Êtes-vous sûr de vouloir supprimer cette tâche?', areYouSureYouWantToDeleteThisTask: 'Êtes-vous sûr de vouloir supprimer cette tâche?',
areYouSureYouWantToDeleteThisUser: 'Êtes-vous sûr de vouloir supprimer cet utilisateur?', areYouSureYouWantToDeleteThisUser: 'Êtes-vous sûr de vouloir supprimer cet utilisateur?',
areYouSureYouWantToLeaveBoard: 'Êtes-vous sûr de vouloir quitter ce tableau ?',
areYouSureYouWantToLeaveProject: 'Êtes-vous sûr de vouloir quitter ce projet ?',
areYouSureYouWantToRemoveThisManagerFromProject:
'Êtes-vous sûr de vouloir supprimer ce manager du projet ?',
areYouSureYouWantToRemoveThisMemberFromProject: areYouSureYouWantToRemoveThisMemberFromProject:
'Êtes-vous sûr de vouloir supprimer ce membre du projet?', 'Êtes-vous sûr de vouloir supprimer ce membre du projet?',
attachment: 'Attachement', attachment: 'Pièce jointe',
attachments: 'Pièces jointes', attachments: 'Pièces jointes',
authentication: 'Authentification', authentication: 'Authentification',
background: 'Arrière-plan',
board: 'Tableau', board: 'Tableau',
boardNotFound_title: 'Carte non trouvée', boardNotFound_title: 'Carte non trouvée',
canComment: 'Peut commenter',
canEditContentOfBoard: 'Peut éditer le contenu du tableau.',
canOnlyViewBoard: 'Peut uniquement voir le tableau.',
cardActions_title: 'Actions sur la carte', cardActions_title: 'Actions sur la carte',
cardNotFound_title: 'Carte non trouvée', cardNotFound_title: 'Carte non trouvée',
cardOrActionAreDeleted: "La carte ou l'action sont supprimées.", cardOrActionAreDeleted: "La carte ou l'action sont supprimées.",
color: 'Couleur', color: 'Couleur',
copy_inline: 'copie',
createBoard_title: 'Créer un tableau', createBoard_title: 'Créer un tableau',
createLabel_title: 'Créer une étiquette', createLabel_title: 'Créer une étiquette',
createNewOneOrSelectExistingOne: 'Créez-en un nouveau ou sélectionnez<br />un existant.', createNewOneOrSelectExistingOne: 'Créez-en un nouveau ou sélectionnez<br />un existant.',
createProject_title: 'Créer un projet', createProject_title: 'Créer un projet',
createTextFile_title: 'Créer un fichier texte', createTextFile_title: 'Créer un fichier texte',
currentPassword: 'Mot de passe actuel', currentPassword: 'Mot de passe actuel',
dangerZone_title: 'Zone dangereuse',
date: 'Date', date: 'Date',
dueDate: "Date d'échéance",
dueDate_title: "Date d'échéance", dueDate_title: "Date d'échéance",
deleteAttachment_title: 'Supprimer la pièce jointe', deleteAttachment_title: 'Supprimer la pièce jointe',
deleteBoard_title: 'Supprimer le tableau', deleteBoard_title: 'Supprimer le tableau',
@@ -63,67 +76,89 @@ export default {
deleteTask_title: 'Supprimer la tâche', deleteTask_title: 'Supprimer la tâche',
deleteUser_title: "Supprimer l'utilisateur", deleteUser_title: "Supprimer l'utilisateur",
description: 'Description', description: 'Description',
detectAutomatically: 'Détecter automatiquement',
dropFileToUpload: 'Déposer le fichier à télécharger', dropFileToUpload: 'Déposer le fichier à télécharger',
editor: 'Éditeur',
editAttachment_title: 'Modifier la pièce jointe', editAttachment_title: 'Modifier la pièce jointe',
editAvatar_title: 'Modifier Avatar', editAvatar_title: 'Modifier Avatar',
editBoard_title: 'Modifier le tableau', editBoard_title: 'Modifier le tableau',
editDueDate_title: "Modifier la date d'échéance", editDueDate_title: "Modifier la date d'échéance",
editEmail_title: "Modifier l'e-mail", editEmail_title: "Modifier l'email",
editInformation_title: 'Modifier les informations',
editLabel_title: "Modifier l'étiquette", editLabel_title: "Modifier l'étiquette",
editPassword_title: 'Modifier le mot de passe', editPassword_title: 'Modifier le mot de passe',
editPermissions_title: 'Modifier les permissions',
editStopwatch_title: 'Modifier la minuterie', editStopwatch_title: 'Modifier la minuterie',
editUsername_title: "Modifier le nom d'utilisateur", editUsername_title: "Modifier le nom d'utilisateur",
email: 'E-mail', email: 'E-mail',
emailAlreadyInUse: 'Email déjà utilisé', emailAlreadyInUse: 'Email déjà utilisé',
enterCardTitle: 'Entrer le titre de la carte...', enterCardTitle: 'Saisir le titre de la carte... [Ctrl+Enter] pour ouvrir automatiquement',
enterDescription: 'Entrez la description...', enterDescription: 'Saisir la description...',
enterFilename: 'Entrez le nom du fichier', enterFilename: 'Saisir le nom du fichier',
enterListTitle: 'Entrer le titre de la liste...', enterListTitle: 'Saisie le titre de la liste...',
enterProjectTitle: 'Saisir le titre du projet', enterProjectTitle: 'Saisir le titre du projet',
enterTaskDescription: 'Saisir la description de la tâche...', enterTaskDescription: 'Saisir la description de la tâche...',
filterByLabels_title: 'Filtrer par libellés', filterByLabels_title: 'Filtrer par étiquettes',
filterByMembers_title: 'Filtrer par membres', filterByMembers_title: 'Filtrer par membres',
fromComputer_title: "Depuis l'ordinateur", fromComputer_title: "Depuis l'ordinateur",
hours: 'Les heures', fromTrello: 'Depuis Trello',
general: 'Général',
hours: 'Heures',
importBoard_title: 'Importer un tableau',
invalidCurrentPassword: 'Mot de passe actuel invalide', invalidCurrentPassword: 'Mot de passe actuel invalide',
labels: 'Étiquettes', labels: 'Étiquettes',
language: 'Langue',
leaveBoard_title: 'Quitter le tableau',
leaveProject_title: 'Quitter le projet',
linkIsCopied: 'Le lien est copié',
list: 'Lister', list: 'Lister',
listActions_title: 'Liste des actions', listActions_title: 'Liste des actions',
managers: 'Managers',
managerActions_title: 'Actions des managers',
members: 'Membres', members: 'Membres',
memberActions_title: 'Actions des membres',
minutes: 'Minutes', minutes: 'Minutes',
moveCard_title: 'Déplacer la carte', moveCard_title: 'Déplacer la carte',
name: 'Nom', name: 'Nom',
newEmail: 'Nouveau courriel', newestFirst: 'Le plus récent en premier',
newEmail: 'Nouveau email',
newPassword: 'Nouveau mot de passe', newPassword: 'Nouveau mot de passe',
newUsername: "Nouveau nom d'utilisateur", newUsername: "Nouveau nom d'utilisateur",
noConnectionToServer: 'Pas de connexion au serveur', noConnectionToServer: 'Pas de connexion au serveur',
noBoards: 'Pas de planches', noBoards: 'Pas de tableau',
noLists: 'Pas de listes', noLists: 'Pas de listes',
noProjects: 'Pas de projets', noProjects: 'Pas de projets',
notifications: 'Notifications', notifications: 'Notifications',
noUnreadNotifications: 'Aucune notification non lue.', noUnreadNotifications: 'Aucune notification non lue.',
openBoard_title: 'Open Board', oldestFirst: 'Le plus ancien en premier',
openBoard_title: 'Ouvrir le tableau',
optional_inline: 'optionnel', optional_inline: 'optionnel',
organization: 'Organisation', organization: 'Organisation',
phone: 'Téléphone', phone: 'Téléphone',
preferences: 'Préférences', preferences: 'Préférences',
pressPasteShortcutToAddAttachmentFromClipboard: 'Conseil', pressPasteShortcutToAddAttachmentFromClipboard:
'Conseil: appuyer sur Ctrl-V (Cmd-V sur Mac) pour ajouter une pièce jointe depuis le presse-papiers',
project: 'Projet', project: 'Projet',
projectNotFound_title: 'Projet introuvable', projectNotFound_title: 'Projet introuvable',
removeManager_title: 'Supprimer le manager',
removeMember_title: 'Supprimer le membre', removeMember_title: 'Supprimer le membre',
searchLabels: 'Chercher une étiquette...', searchLabels: 'Chercher une étiquette...',
searchMembers: 'Chercher un membre...', searchMembers: 'Chercher un membre...',
searchUsers: 'Chercher un utilisateur...', searchUsers: 'Chercher un utilisateur...',
searchCards: 'Chercher une carte...', searchCards: 'Chercher une carte...',
seconds: 'Secondes', seconds: 'Secondes',
selectBoard: 'Sélectionner une carte', selectBoard: 'Sélectionner un tableau',
selectList: 'Sélectionner une liste', selectList: 'Sélectionner une liste',
selectPermissions_title: 'Sélectionner les permissions',
selectProject: 'Sélectionner un projet', selectProject: 'Sélectionner un projet',
settings: 'Réglages', settings: 'Réglages',
sortList_title: 'Trier la liste',
stopwatch: 'Minuteur', stopwatch: 'Minuteur',
subscribeToMyOwnCardsByDefault: 'Abonnez-vous à mes propres cartes par défaut', subscribeToMyOwnCardsByDefault: 'Abonnez-vous à mes propres cartes par défaut',
taskActions_title: 'Actions de tâche', taskActions_title: 'Actions de tâche',
tasks: 'Tâches', tasks: 'Tâches',
thereIsNoPreviewAvailableForThisAttachment:
"Il n'y a pas de prévisualisation de disponible pour cette pièce jointe.",
time: 'Temps', time: 'Temps',
title: 'Titre', title: 'Titre',
userActions_title: "Actions de l'utilisateur", userActions_title: "Actions de l'utilisateur",
@@ -137,6 +172,8 @@ export default {
username: "Nom d'utilisateur", username: "Nom d'utilisateur",
usernameAlreadyInUse: "Nom d'utilisateur déjà utilisé", usernameAlreadyInUse: "Nom d'utilisateur déjà utilisé",
users: 'Utilisateurs', users: 'Utilisateurs',
version: 'Version',
viewer: 'Spectateur',
writeComment: 'Écrire un commentaire...', writeComment: 'Écrire un commentaire...',
}, },
@@ -148,10 +185,12 @@ export default {
addCard_title: 'Ajouter une carte', addCard_title: 'Ajouter une carte',
addComment: 'Ajouter un commentaire', addComment: 'Ajouter un commentaire',
addList: 'Ajouter la liste', addList: 'Ajouter la liste',
addMember: 'Ajouter un membre',
addMoreDetailedDescription: 'Ajouter une description plus détaillée', addMoreDetailedDescription: 'Ajouter une description plus détaillée',
addTask: 'Ajouter une tâche', addTask: 'Ajouter une tâche',
addToCard: 'Ajouter à la carte', addToCard: 'Ajouter à la carte',
addUser: 'Ajouter un utilisateur', addUser: 'Ajouter un utilisateur',
copyLink_title: 'Copier le lien',
createBoard: 'Créer un tableau', createBoard: 'Créer un tableau',
createFile: 'Créer un fichier', createFile: 'Créer un fichier',
createLabel: 'Créer une étiquette', createLabel: 'Créer une étiquette',
@@ -174,14 +213,21 @@ export default {
deleteTask_title: 'Supprimer la tâche', deleteTask_title: 'Supprimer la tâche',
deleteUser: "Supprimer l'utilisateur", deleteUser: "Supprimer l'utilisateur",
duplicate: 'Dupliquer', duplicate: 'Dupliquer',
duplicateCard_title: 'Dupliquer la carte',
edit: 'Modifier', edit: 'Modifier',
editDueDate_title: "Modifier la date d'échéance", editDueDate_title: "Modifier la date d'échéance",
editDescription_title: 'Éditer la description', editDescription_title: 'Modifier la description',
editEmail_title: "Modifier l'e-mail", editEmail_title: "Modifier l'email",
editInformation_title: 'Modifier les informations',
editPassword_title: 'Modifier le mot de passe', editPassword_title: 'Modifier le mot de passe',
editPermissions: 'Modifier les permissions',
editStopwatch_title: 'Modifier la minuterie', editStopwatch_title: 'Modifier la minuterie',
editTitle_title: 'Modifier le titre', editTitle_title: 'Modifier le titre',
editUsername_title: "Modifier le nom d'utilisateur", editUsername_title: "Modifier le nom d'utilisateur",
hideDetails: 'Cacher les détails',
import: 'Importer',
leaveBoard: 'Quitter le tableau',
leaveProject: 'Quitter le projet',
logOut_title: 'Se déconnecter', logOut_title: 'Se déconnecter',
makeCover_title: 'Faire la jaquette', makeCover_title: 'Faire la jaquette',
move: 'Déplacer', move: 'Déplacer',
@@ -189,11 +235,15 @@ export default {
remove: 'Supprimer', remove: 'Supprimer',
removeBackground: "Supprimer l'arrière-plan", removeBackground: "Supprimer l'arrière-plan",
removeCover_title: 'Supprimer la jaquette', removeCover_title: 'Supprimer la jaquette',
removeFromBoard: 'Supprimer le tableau',
removeFromProject: 'Supprimer du projet', removeFromProject: 'Supprimer du projet',
removeManager: 'Supprimer le manager',
removeMember: 'Supprimer le membre', removeMember: 'Supprimer le membre',
save: 'Sauvegarder', save: 'Sauvegarder',
showAllAttachments: 'Afficher toutes les pièces jointes ({{hidden}} masquées)', showAllAttachments: 'Afficher toutes les pièces jointes ({{hidden}} masquées)',
showDetails: 'Afficher les détails',
showFewerAttachments: 'Afficher moins de pièces jointes', showFewerAttachments: 'Afficher moins de pièces jointes',
sortList_title: 'Trier la liste',
start: 'Début', start: 'Début',
stop: 'Arrêter', stop: 'Arrêter',
subscribe: "S'abonner", subscribe: "S'abonner",
@@ -1,7 +1,7 @@
import login from './login'; import login from './login';
export default { export default {
language: 'fr', language: 'fr-FR',
country: 'fr', country: 'fr',
name: 'Français', name: 'Français',
embeddedLocale: login, embeddedLocale: login,
@@ -11,10 +11,12 @@ export default {
projectManagement: 'Gestion de projet', projectManagement: 'Gestion de projet',
serverConnectionFailed: 'Connection au serveur échouée', serverConnectionFailed: 'Connection au serveur échouée',
unknownError: 'Erreur inconnue, réessayez plus tard', unknownError: 'Erreur inconnue, réessayez plus tard',
useSingleSignOn: "Utiliser l'authentification unique",
}, },
action: { action: {
logIn: 'Se connecter', logIn: 'Se connecter',
logInWithSSO: "Se connecter avec l'authentification unique",
}, },
}, },
}; };
@@ -15,6 +15,16 @@ export default {
translation: { translation: {
common: { common: {
aboutPlanka: 'Plankáról',
account: 'Fiók',
actions: 'Műveletek',
addAttachment_title: 'Melléklet hozzáadása',
addComment: 'Megjegyzés hozzáadása',
addManager_title: 'Menedzser hozzáadása',
addMember_title: 'Tag létrehozása',
addUser_title: 'Felhasználó hozzáadása',
administrator: 'Rendszergazda',
all: 'Összes',
allChangesWillBeAutomaticallySavedAfterConnectionRestored: allChangesWillBeAutomaticallySavedAfterConnectionRestored:
'Az összes változás automatikusan mentésre kerül a kapcsolat helyreállása után.', 'Az összes változás automatikusan mentésre kerül a kapcsolat helyreállása után.',
areYouSureYouWantToDeleteThisAttachment: 'Biztosan törölni szeretné ezt a mellékletet?', areYouSureYouWantToDeleteThisAttachment: 'Biztosan törölni szeretné ezt a mellékletet?',
@@ -29,7 +39,7 @@ export default {
areYouSureYouWantToLeaveBoard: 'Biztosan el akarja hagyni a táblát?', areYouSureYouWantToLeaveBoard: 'Biztosan el akarja hagyni a táblát?',
areYouSureYouWantToLeaveProject: 'Biztosan el akarja hagyni a projektet?', areYouSureYouWantToLeaveProject: 'Biztosan el akarja hagyni a projektet?',
areYouSureYouWantToRemoveThisManagerFromProject: areYouSureYouWantToRemoveThisManagerFromProject:
'Biztosan eltávolítja ezt a vezetőt a projektből?', 'Biztosan eltávolítja ezt a menedzsert a projektből?',
areYouSureYouWantToRemoveThisMemberFromBoard: 'Biztosan eltávolítja ezt a tagot a tábláról?', areYouSureYouWantToRemoveThisMemberFromBoard: 'Biztosan eltávolítja ezt a tagot a tábláról?',
attachment: 'Melléklet', attachment: 'Melléklet',
attachments: 'Mellékletek', attachments: 'Mellékletek',
@@ -44,6 +54,7 @@ export default {
cardNotFound_title: 'Kártya nem található', cardNotFound_title: 'Kártya nem található',
cardOrActionAreDeleted: 'A kártya vagy művelet törölve lett.', cardOrActionAreDeleted: 'A kártya vagy művelet törölve lett.',
color: 'Szín', color: 'Szín',
copy_inline: 'másolás',
createBoard_title: 'Tábla létrehozása', createBoard_title: 'Tábla létrehozása',
createLabel_title: 'Címke létrehozása', createLabel_title: 'Címke létrehozása',
createNewOneOrSelectExistingOne: 'Hozzon létre egy újat, vagy válasszon ki egy meglévőt.', createNewOneOrSelectExistingOne: 'Hozzon létre egy újat, vagy válasszon ki egy meglévőt.',
@@ -52,6 +63,7 @@ export default {
currentPassword: 'Jelenlegi jelszó', currentPassword: 'Jelenlegi jelszó',
dangerZone_title: 'Veszélyzóna', dangerZone_title: 'Veszélyzóna',
date: 'Dátum', date: 'Dátum',
dueDate: 'Határidő',
dueDate_title: 'Esedékesség dátuma', dueDate_title: 'Esedékesség dátuma',
deleteAttachment_title: 'Melléklet törlése', deleteAttachment_title: 'Melléklet törlése',
deleteBoard_title: 'Tábla törlése', deleteBoard_title: 'Tábla törlése',
@@ -97,13 +109,17 @@ export default {
language: 'Nyelv', language: 'Nyelv',
leaveBoard_title: 'Tábla elhagyása', leaveBoard_title: 'Tábla elhagyása',
leaveProject_title: 'Projekt elhagyása', leaveProject_title: 'Projekt elhagyása',
linkIsCopied: 'Link másolva',
list: 'Lista', list: 'Lista',
listActions_title: 'Lista műveletek', listActions_title: 'Lista műveletek',
managers: 'Vezetők', managers: 'Menedzserek',
managerActions_title: 'Menedzseri műveletek',
members: 'Tagok', members: 'Tagok',
memberActions_title: 'Tag műveletek',
minutes: 'Percek', minutes: 'Percek',
moveCard_title: 'Kártya áthelyezése', moveCard_title: 'Kártya áthelyezése',
name: 'Név', name: 'Név',
newestFirst: 'Újabbak előre',
newEmail: 'Új e-mail', newEmail: 'Új e-mail',
newPassword: 'Új jelszó', newPassword: 'Új jelszó',
newUsername: 'Új felhasználónév', newUsername: 'Új felhasználónév',
@@ -113,6 +129,7 @@ export default {
noProjects: 'Nincsenek projektek', noProjects: 'Nincsenek projektek',
notifications: 'Értesítések', notifications: 'Értesítések',
noUnreadNotifications: 'Nincsenek olvasatlan értesítések.', noUnreadNotifications: 'Nincsenek olvasatlan értesítések.',
oldestFirst: 'Régebbi előre',
openBoard_title: 'Tábla megnyitása', openBoard_title: 'Tábla megnyitása',
optional_inline: 'opcionális', optional_inline: 'opcionális',
organization: 'Szervezet', organization: 'Szervezet',
@@ -122,17 +139,19 @@ export default {
'Tipp: nyomja meg a Ctrl-V (Cmd-V a Mac-en) billentyűkombinációt a vágólapról történő melléklet hozzáadásához.', 'Tipp: nyomja meg a Ctrl-V (Cmd-V a Mac-en) billentyűkombinációt a vágólapról történő melléklet hozzáadásához.',
project: 'Projekt', project: 'Projekt',
projectNotFound_title: 'Projekt nem található', projectNotFound_title: 'Projekt nem található',
removeManager_title: 'Vezető eltávolítása', removeManager_title: 'Menedzser eltávolítása',
removeMember_title: 'Tag eltávolítása', removeMember_title: 'Tag eltávolítása',
searchLabels: 'Címkék keresése...', searchLabels: 'Címkék keresése...',
searchMembers: 'Tagok keresése...', searchMembers: 'Tagok keresése...',
searchUsers: 'Felhasználók keresése...', searchUsers: 'Felhasználók keresése...',
searchCards: 'Kártyák keresése..',
seconds: 'Másodpercek', seconds: 'Másodpercek',
selectBoard: 'Válassza ki a táblát', selectBoard: 'Válassza ki a táblát',
selectList: 'Válassza ki a listát', selectList: 'Válassza ki a listát',
selectPermissions_title: 'Jogosultságok kiválasztása', selectPermissions_title: 'Jogosultságok kiválasztása',
selectProject: 'Válassza ki a projektet', selectProject: 'Válassza ki a projektet',
settings: 'Beállítások', settings: 'Beállítások',
sortList_title: 'Rendezés listában',
stopwatch: 'Stopper', stopwatch: 'Stopper',
subscribeToMyOwnCardsByDefault: 'Alapértelmezés szerint feliratkozás a saját kártyáimra', subscribeToMyOwnCardsByDefault: 'Alapértelmezés szerint feliratkozás a saját kártyáimra',
taskActions_title: 'Feladat műveletek', taskActions_title: 'Feladat műveletek',
@@ -170,6 +189,7 @@ export default {
addTask: 'Feladat hozzáadása', addTask: 'Feladat hozzáadása',
addToCard: 'Kártyához hozzáadása', addToCard: 'Kártyához hozzáadása',
addUser: 'Felhasználó hozzáadása', addUser: 'Felhasználó hozzáadása',
copyLink_title: 'Link másolása',
createBoard: 'Tábla létrehozása', createBoard: 'Tábla létrehozása',
createFile: 'Fájl létrehozása', createFile: 'Fájl létrehozása',
createLabel: 'Címke létrehozása', createLabel: 'Címke létrehozása',
@@ -191,6 +211,8 @@ export default {
deleteTask: 'Feladat törlése', deleteTask: 'Feladat törlése',
deleteTask_title: 'Feladat törlése', deleteTask_title: 'Feladat törlése',
deleteUser: 'Felhasználó törlése', deleteUser: 'Felhasználó törlése',
duplicate: 'Másolás',
duplicateCard_title: 'Kártya másolása',
edit: 'Szerkesztés', edit: 'Szerkesztés',
editDueDate_title: 'Esedékesség dátumának szerkesztése', editDueDate_title: 'Esedékesség dátumának szerkesztése',
editDescription_title: 'Leírás szerkesztése', editDescription_title: 'Leírás szerkesztése',
@@ -214,12 +236,13 @@ export default {
removeCover_title: 'Borító eltávolítása', removeCover_title: 'Borító eltávolítása',
removeFromBoard: 'Eltávolítás a tábláról', removeFromBoard: 'Eltávolítás a tábláról',
removeFromProject: 'Eltávolítás a projektről', removeFromProject: 'Eltávolítás a projektről',
removeManager: 'Vezető eltávolítása', removeManager: 'Menedzser eltávolítása',
removeMember: 'Tag eltávolítása', removeMember: 'Tag eltávolítása',
save: 'Mentés', save: 'Mentés',
showAllAttachments: 'Összes melléklet megjelenítése ({{hidden}} rejtve)', showAllAttachments: 'Összes melléklet megjelenítése ({{hidden}} rejtve)',
showDetails: 'Részletek megjelenítése', showDetails: 'Részletek megjelenítése',
showFewerAttachments: 'Kevesebb melléklet megjelenítése', showFewerAttachments: 'Kevesebb melléklet megjelenítése',
sortList_title: 'Rendezés listában',
start: 'Indítás', start: 'Indítás',
stop: 'Megállítás', stop: 'Megállítás',
subscribe: 'Feliratkozás', subscribe: 'Feliratkozás',
@@ -1,7 +1,7 @@
import login from './login'; import login from './login';
export default { export default {
language: 'hu', language: 'hu-HU',
country: 'hu', country: 'hu',
name: 'Magyar', name: 'Magyar',
embeddedLocale: login, embeddedLocale: login,
@@ -1,7 +1,7 @@
import login from './login'; import login from './login';
export default { export default {
language: 'id', language: 'id-ID',
country: 'id', country: 'id',
name: 'Bahasa Indonesia', name: 'Bahasa Indonesia',
embeddedLocale: login, embeddedLocale: login,
+50 -46
View File
@@ -1,51 +1,55 @@
import bg from './bg'; import bgBG from './bg-BG';
import cs from './cs'; import csCZ from './cs-CZ';
import da from './da'; import daDK from './da-DK';
import de from './de'; import deDE from './de-DE';
import en from './en'; import enUS from './en-US';
import es from './es'; import esES from './es-ES';
import fr from './fr'; import faIR from './fa-IR';
import hu from './hu'; import frFR from './fr-FR';
import id from './id'; import huHU from './hu-HU';
import it from './it'; import idID from './id-ID';
import ja from './ja'; import itIT from './it-IT';
import ko from './ko'; import jaJP from './ja-JP';
import nl from './nl'; import koKR from './ko-KR';
import pl from './pl'; import nlNL from './nl-NL';
import pt from './pt'; import plPL from './pl-PL';
import ro from './ro'; import ptBR from './pt-BR';
import ru from './ru'; import roRO from './ro-RO';
import sk from './sk'; import ruRU from './ru-RU';
import sv from './sv'; import skSK from './sk-SK';
import tr from './tr'; import svSE from './sv-SE';
import ua from './ua'; import trTR from './tr-TR';
import uz from './uz'; import ukUA from './uk-UA';
import zh from './zh'; import uzUZ from './uz-UZ';
import zhCN from './zh-CN';
import zhTW from './zh-TW';
const locales = [ const locales = [
bg, bgBG,
cs, csCZ,
da, daDK,
de, deDE,
en, enUS,
es, esES,
fr, faIR,
hu, frFR,
id, huHU,
it, idID,
ja, itIT,
ko, jaJP,
nl, koKR,
pl, nlNL,
pt, plPL,
ro, ptBR,
ru, roRO,
sk, ruRU,
sv, skSK,
tr, svSE,
ua, trTR,
uz, ukUA,
zh, uzUZ,
zhCN,
zhTW,
]; ];
export default locales; export default locales;
@@ -1,4 +1,8 @@
import dateFns from 'date-fns/locale/it';
export default { export default {
dateFns,
format: { format: {
date: 'd/M/yyyy', date: 'd/M/yyyy',
time: 'p', time: 'p',
@@ -1,7 +1,7 @@
import login from './login'; import login from './login';
export default { export default {
language: 'it', language: 'it-IT',
country: 'it', country: 'it',
name: 'Italiano', name: 'Italiano',
embeddedLocale: login, embeddedLocale: login,
@@ -1,7 +1,7 @@
import login from './login'; import login from './login';
export default { export default {
language: 'ja', language: 'ja-JP',
country: 'jp', country: 'jp',
name: '日本語', name: '日本語',
embeddedLocale: login, embeddedLocale: login,
@@ -1,7 +1,7 @@
import login from './login'; import login from './login';
export default { export default {
language: 'ko', language: 'ko-KR',
country: 'kr', country: 'kr',
name: '한국어', name: '한국어',
embeddedLocale: login, embeddedLocale: login,
@@ -1,7 +1,7 @@
import login from './login'; import login from './login';
export default { export default {
language: 'nl', language: 'nl-NL',
country: 'nl', country: 'nl',
name: 'Nederlands', name: 'Nederlands',
embeddedLocale: login, embeddedLocale: login,
@@ -1,7 +1,7 @@
import login from './login'; import login from './login';
export default { export default {
language: 'pl', language: 'pl-PL',
country: 'pl', country: 'pl',
name: 'Polski', name: 'Polski',
embeddedLocale: login, embeddedLocale: login,
@@ -1,7 +1,7 @@
import login from './login'; import login from './login';
export default { export default {
language: 'pt', language: 'pt-BR',
country: 'br', country: 'br',
name: 'Português', name: 'Português',
embeddedLocale: login, embeddedLocale: login,
@@ -1,7 +1,7 @@
import login from './login'; import login from './login';
export default { export default {
language: 'ro', language: 'ro-RO',
country: 'ro', country: 'ro',
name: 'Română', name: 'Română',
embeddedLocale: login, embeddedLocale: login,
@@ -55,7 +55,7 @@ export default {
cardNotFound: 'Карточка не найдена', cardNotFound: 'Карточка не найдена',
cardOrActionAreDeleted: 'Карточка или действие удалены.', cardOrActionAreDeleted: 'Карточка или действие удалены.',
color: 'Цвет', color: 'Цвет',
connectionRestored: 'Соединение восстановлено', copy_inline: 'копировать',
createBoard: 'Создание доски', createBoard: 'Создание доски',
createLabel: 'Создание метки', createLabel: 'Создание метки',
createNewOneOrSelectExistingOne: 'Создайте новую или выберите<br />уже существующую.', createNewOneOrSelectExistingOne: 'Создайте новую или выберите<br />уже существующую.',
@@ -65,6 +65,7 @@ export default {
dangerZone_title: 'Опасная зона', dangerZone_title: 'Опасная зона',
date: 'Дата', date: 'Дата',
dueDate: 'Срок', dueDate: 'Срок',
dueDate_title: 'Срок исполнения',
deleteAttachment: 'Удаление вложения', deleteAttachment: 'Удаление вложения',
deleteBoard: 'Удаление доски', deleteBoard: 'Удаление доски',
deleteCard: 'Удаление карточки', deleteCard: 'Удаление карточки',
@@ -80,9 +81,8 @@ export default {
editor: 'Редактор', editor: 'Редактор',
editAttachment: 'Изменение вложения', editAttachment: 'Изменение вложения',
editAvatar: 'Изменение аватара', editAvatar: 'Изменение аватара',
editBoard: 'Изменение доски', editBoard_title: 'Изменение доски',
editBackground: 'Изменение фона', editDueDate_title: 'Изменить срок выполнения',
editDueDate: 'Изменение срока',
editEmail: 'Изменение e-mail', editEmail: 'Изменение e-mail',
editInformation: 'Изменение информации', editInformation: 'Изменение информации',
editLabel: 'Изменение метки', editLabel: 'Изменение метки',
@@ -90,10 +90,10 @@ export default {
editPermissions: 'Редактирование разрешений', editPermissions: 'Редактирование разрешений',
editStopwatch: 'Изменение секундомера', editStopwatch: 'Изменение секундомера',
editTitle: 'Изменение названия', editTitle: 'Изменение названия',
editUsername: 'Изменение имени пользователя', editUsername_title: 'Изменение имени пользователя',
email: 'E-mail', email: 'E-mail',
emailAlreadyInUse: 'E-mail уже занят', emailAlreadyInUse: 'E-mail уже занят',
enterCardTitle: 'Введите заголовок для этой карточки...', enterCardTitle: 'Введите заголовок для этой карточки... [Ctrl+Enter] для применения',
enterDescription: 'Введите описание...', enterDescription: 'Введите описание...',
enterFilename: 'Введите название файла', enterFilename: 'Введите название файла',
enterListTitle: 'Введите заголовок списка...', enterListTitle: 'Введите заголовок списка...',
@@ -110,14 +110,18 @@ export default {
labels: 'Метки', labels: 'Метки',
language: 'Язык', language: 'Язык',
leaveBoard: 'Покинуть доску', leaveBoard: 'Покинуть доску',
leaveProject: 'Покинуть проект', leaveProject_title: 'Покинуть проект',
linkIsCopied: 'Ссылка скопирована',
list: 'Список', list: 'Список',
listActions: 'Действия со списком', listActions_title: 'Действия со списком',
managers: 'Менеджеры', managers: 'Менеджеры',
managerActions_title: 'Действия Менеджера',
members: 'Участники', members: 'Участники',
memberActions_title: 'Действия участников',
minutes: 'Минуты', minutes: 'Минуты',
moveCard: 'Перемещение карточки', moveCard_title: 'Перемещение карточки',
name: 'Имя', name: 'Имя',
newestFirst: 'Новые первые',
newEmail: 'Новый e-mail', newEmail: 'Новый e-mail',
newPassword: 'Новый пароль', newPassword: 'Новый пароль',
newUsername: 'Новое имя пользователя', newUsername: 'Новое имя пользователя',
@@ -127,7 +131,8 @@ export default {
noProjects: 'Проектов нет', noProjects: 'Проектов нет',
notifications: 'Уведомления', notifications: 'Уведомления',
noUnreadNotifications: 'Уведомлений нет.', noUnreadNotifications: 'Уведомлений нет.',
openBoard: 'Откройте доску', oldestFirst: 'Старые первые',
openBoard_title: 'Откройте доску',
optional_inline: 'необязательно', optional_inline: 'необязательно',
organization: 'Организация', organization: 'Организация',
phone: 'Телефон', phone: 'Телефон',
@@ -135,10 +140,9 @@ export default {
pressPasteShortcutToAddAttachmentFromClipboard: pressPasteShortcutToAddAttachmentFromClipboard:
'Совет: нажмите Ctrl-V (Cmd-V на Mac), чтобы добавить вложение из буфера обмена.', 'Совет: нажмите Ctrl-V (Cmd-V на Mac), чтобы добавить вложение из буфера обмена.',
project: 'Проект', project: 'Проект',
projectActions: 'Действия с проектом', projectNotFound_title: 'Проект не найден',
projectNotFound: 'Проект не найден', removeManager_title: 'Удалить менеджера',
removeManager: 'Удалить менеджера', removeMember_title: 'Удаление участника',
removeMember: 'Удаление участника',
searchLabels: 'Поиск меток...', searchLabels: 'Поиск меток...',
searchMembers: 'Поиск участников...', searchMembers: 'Поиск участников...',
searchUsers: 'Поиск пользователей...', searchUsers: 'Поиск пользователей...',
@@ -149,14 +153,15 @@ export default {
selectPermissions: 'Выбор разрешений', selectPermissions: 'Выбор разрешений',
selectProject: 'Выберите проект', selectProject: 'Выберите проект',
settings: 'Настройки', settings: 'Настройки',
sortList_title: 'Сортировка списка',
stopwatch: 'Секундомер', stopwatch: 'Секундомер',
subscribeToMyOwnCardsByDefault: 'По умолчанию подписываться на мои собственные карточки', subscribeToMyOwnCardsByDefault: 'По умолчанию подписываться на мои собственные карточки',
taskActions: 'Действия с задачей', taskActions_title: 'Действия по задаче',
tasks: 'Задачи', tasks: 'Задачи',
thereIsNoPreviewAvailableForThisAttachment: 'Предпросмотр для этого вложения недоступен.', thereIsNoPreviewAvailableForThisAttachment: 'Предпросмотр для этого вложения недоступен.',
time: 'Время', time: 'Время',
title: 'Название', title: 'Название',
userActions: 'Действия с пользователем', userActions_title: 'Действия с пользователем',
userAddedThisCardToList: '<0>{{user}}</0><1> добавил(а) эту карточку в {{list}}</1>', userAddedThisCardToList: '<0>{{user}}</0><1> добавил(а) эту карточку в {{list}}</1>',
userLeftNewCommentToCard: '{{user}} оставил(а) комментарий «{{comment}}» к <2>{{card}}</2>', userLeftNewCommentToCard: '{{user}} оставил(а) комментарий «{{comment}}» к <2>{{card}}</2>',
userMovedCardFromListToList: userMovedCardFromListToList:
@@ -175,7 +180,7 @@ export default {
addAnotherCard: 'Добавить еще одну карточку', addAnotherCard: 'Добавить еще одну карточку',
addAnotherList: 'Добавить еще один список', addAnotherList: 'Добавить еще один список',
addAnotherTask: 'Добавить еще одну задачу', addAnotherTask: 'Добавить еще одну задачу',
addCard: 'Добавить карточку', addCard_title: 'Добавить карточку',
addComment: 'Добавить комментарий', addComment: 'Добавить комментарий',
addList: 'Добавить список', addList: 'Добавить список',
addMember: 'Добавить участника', addMember: 'Добавить участника',
@@ -183,6 +188,7 @@ export default {
addTask: 'Добавить задачу', addTask: 'Добавить задачу',
addToCard: 'Добавить на карточку', addToCard: 'Добавить на карточку',
addUser: 'Добавить пользователя', addUser: 'Добавить пользователя',
copyLink_title: 'Копировать ссылку',
createBoard: 'Создать доску', createBoard: 'Создать доску',
createFile: 'Создать файл', createFile: 'Создать файл',
createLabel: 'Создать метку', createLabel: 'Создать метку',
@@ -193,38 +199,41 @@ export default {
deleteAvatar: 'Удалить аватар', deleteAvatar: 'Удалить аватар',
deleteBoard: 'Удалить доску', deleteBoard: 'Удалить доску',
deleteCard: 'Удалить карточку', deleteCard: 'Удалить карточку',
deleteCard_title: 'Удалить карточку',
deleteComment: 'Удалить комментарий', deleteComment: 'Удалить комментарий',
deleteImage: 'Удалить изображение', deleteImage: 'Удалить изображение',
deleteLabel: 'Удалить метку', deleteLabel: 'Удалить метку',
deleteList: 'Удалить список', deleteList: 'Удалить список',
deleteList_title: 'Удалить список',
deleteProject: 'Удалить проект', deleteProject: 'Удалить проект',
deleteProject_title: 'Удалить проект',
deleteTask: 'Удалить задачу', deleteTask: 'Удалить задачу',
deleteTask_title: 'Удалить задачу',
deleteUser: 'Удалить пользователя', deleteUser: 'Удалить пользователя',
duplicate: 'Дублировать', duplicate: 'Дублировать',
duplicateCard_title: 'Дублировать карточку', duplicateCard_title: 'Дублировать карточку',
edit: 'Изменить', edit: 'Изменить',
editBackground: 'Изменить фон', editBackground: 'Изменить фон',
editDueDate: 'Изменить срок', editDueDate_title: 'Изменить срок',
editDescription: 'Изменить описание', editDescription_title: 'Изменить описание',
editEmail: 'Изменить e-mail', editEmail_title: 'Изменить e-mail',
editInformation: 'Изменить информацию', editInformation_title: 'Изменить информацию',
editPassword: 'Изменить пароль', editPassword_title: 'Изменить пароль',
editPermissions: 'Изменить разрешения', editPermissions: 'Изменить разрешения',
editStopwatch: 'Изменить секундомер', editStopwatch_title: 'Изменить секундомер',
editTask: 'Изменить задачу', editTitle_title: 'Изменить название',
editTitle: 'Изменить название', editUsername_title: 'Изменить имя пользователя',
editUsername: 'Изменить имя пользователя',
hideDetails: 'Скрыть подробности', hideDetails: 'Скрыть подробности',
import: 'Импорт', import: 'Импорт',
leaveBoard: 'Покинуть доску', leaveBoard: 'Покинуть доску',
leaveProject: 'Покинуть проект', leaveProject: 'Покинуть проект',
logOut: 'Выйти', logOut_title: 'Выйти',
makeCover: 'Сделать обложкой', makeCover_title: 'Сделать обложкой',
move: 'Переместить', move: 'Переместить',
moveCard: 'Переместить карточку', moveCard_title: 'Переместить карточку',
remove: 'Убрать', remove: 'Убрать',
removeBackground: 'Убрать фон', removeBackground: 'Убрать фон',
removeCover: 'Убрать обложку', removeCover_title: 'Убрать обложку',
removeFromBoard: 'Удалить из доски', removeFromBoard: 'Удалить из доски',
removeFromProject: 'Удалить из проекта', removeFromProject: 'Удалить из проекта',
removeManager: 'Удалить менеджера', removeManager: 'Удалить менеджера',
@@ -1,7 +1,7 @@
import login from './login'; import login from './login';
export default { export default {
language: 'ru', language: 'ru-RU',
country: 'ru', country: 'ru',
name: 'Русский', name: 'Русский',
embeddedLocale: login, embeddedLocale: login,
@@ -6,15 +6,17 @@ export default {
invalidPassword: 'Неверный пароль', invalidPassword: 'Неверный пароль',
logInToPlanka: 'Вход в Planka', logInToPlanka: 'Вход в Planka',
noInternetConnection: 'Нет соединения', noInternetConnection: 'Нет соединения',
pageNotFound: 'Страница не найдена', pageNotFound_title: 'Страница не найдена',
password: 'Пароль', password: 'Пароль',
projectManagement: 'Управление проектами', projectManagement: 'Управление проектами',
serverConnectionFailed: 'Не могу подключиться к серверу', serverConnectionFailed: 'Не могу подключиться к серверу',
unknownError: 'Что-то пошло не так, попробуйте позже', unknownError: 'Что-то пошло не так, попробуйте позже',
useSingleSignOn: 'Используйте единый вход',
}, },
action: { action: {
logIn: 'Войти', logIn: 'Войти',
logInWithSSO: 'Войти с помощью единого входа',
}, },
}, },
}; };
@@ -1,7 +1,7 @@
import login from './login'; import login from './login';
export default { export default {
language: 'sk', language: 'sk-SK',
country: 'sk', country: 'sk',
name: 'Slovenčina', name: 'Slovenčina',
embeddedLocale: login, embeddedLocale: login,

Some files were not shown because too many files have changed in this diff Show More