Compare commits
6
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a26c468a9d | ||
|
|
0f076f4cc4 | ||
|
|
f1865db477 | ||
|
|
b80127e952 | ||
|
|
5e400c5c4e | ||
|
|
8367fa4a29 |
@@ -2,11 +2,6 @@ name: Build and push Docker DEV image
|
||||
|
||||
on:
|
||||
push:
|
||||
paths-ignore:
|
||||
- '.github/**'
|
||||
- 'charts/**'
|
||||
- 'docker-*.sh'
|
||||
- '*.md'
|
||||
branches: [master]
|
||||
|
||||
jobs:
|
||||
|
||||
@@ -35,9 +35,8 @@ jobs:
|
||||
done
|
||||
|
||||
- name: Run chart-releaser for stable
|
||||
uses: helm/chart-releaser-action@v1.6.0
|
||||
uses: helm/chart-releaser-action@v1.5.0
|
||||
with:
|
||||
charts_dir: charts
|
||||
mark_as_latest: false
|
||||
env:
|
||||
CR_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
|
||||
|
||||
+3
-11
@@ -1,8 +1,4 @@
|
||||
FROM node:18-alpine as server-dependencies
|
||||
|
||||
RUN apk -U upgrade \
|
||||
&& apk add build-base python3 \
|
||||
--no-cache
|
||||
FROM ghcr.io/plankanban/planka:base-latest as server-dependencies
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
@@ -10,7 +6,6 @@ COPY server/package.json server/package-lock.json .
|
||||
|
||||
RUN npm install npm@latest --global \
|
||||
&& npm install pnpm --global \
|
||||
&& pnpm import \
|
||||
&& pnpm install --prod
|
||||
|
||||
FROM node:lts AS client
|
||||
@@ -21,17 +16,14 @@ COPY client/package.json client/package-lock.json .
|
||||
|
||||
RUN npm install npm@latest --global \
|
||||
&& npm install pnpm --global \
|
||||
&& pnpm import \
|
||||
&& pnpm install --prod
|
||||
|
||||
COPY client .
|
||||
RUN DISABLE_ESLINT_PLUGIN=true npm run build
|
||||
|
||||
FROM node:18-alpine
|
||||
FROM ghcr.io/plankanban/planka:base-latest
|
||||
|
||||
RUN apk -U upgrade \
|
||||
&& apk add bash \
|
||||
--no-cache
|
||||
RUN apk del vips-dependencies --purge
|
||||
|
||||
USER node
|
||||
WORKDIR /app
|
||||
|
||||
+17
-12
@@ -1,22 +1,27 @@
|
||||
FROM node:18-alpine
|
||||
FROM node:lts-alpine
|
||||
|
||||
ARG VIPS_VERSION=8.14.5
|
||||
ARG ALPINE_VERSION=3.16
|
||||
ARG VIPS_VERSION=8.13.3
|
||||
|
||||
RUN apk -U upgrade \
|
||||
&& apk add \
|
||||
bash pkgconf \
|
||||
libjpeg-turbo libexif librsvg cgif tiff libspng libimagequant \
|
||||
bash giflib glib lcms2 libexif \
|
||||
libgsf libjpeg-turbo libpng librsvg libwebp \
|
||||
orc pango tiff \
|
||||
--repository https://alpine.global.ssl.fastly.net/alpine/v${ALPINE_VERSION}/community/ \
|
||||
--repository https://alpine.global.ssl.fastly.net/alpine/v${ALPINE_VERSION}/main/ \
|
||||
--no-cache \
|
||||
&& apk add \
|
||||
build-base gobject-introspection-dev meson \
|
||||
libjpeg-turbo-dev libexif-dev librsvg-dev cgif-dev tiff-dev libspng-dev libimagequant-dev \
|
||||
build-base giflib-dev glib-dev lcms2-dev libexif-dev \
|
||||
libgsf-dev libjpeg-turbo-dev libpng-dev librsvg-dev libwebp-dev \
|
||||
orc-dev pango-dev tiff-dev \
|
||||
--virtual vips-dependencies \
|
||||
--repository https://alpine.global.ssl.fastly.net/alpine/v${ALPINE_VERSION}/community/ \
|
||||
--repository https://alpine.global.ssl.fastly.net/alpine/v${ALPINE_VERSION}/main/ \
|
||||
--no-cache \
|
||||
&& wget -O- https://github.com/libvips/libvips/releases/download/v${VIPS_VERSION}/vips-${VIPS_VERSION}.tar.xz | tar xJC /tmp \
|
||||
&& wget -O- https://github.com/libvips/libvips/releases/download/v${VIPS_VERSION}/vips-${VIPS_VERSION}.tar.gz | tar xzC /tmp \
|
||||
&& cd /tmp/vips-${VIPS_VERSION} \
|
||||
&& meson setup build-dir \
|
||||
&& cd build-dir \
|
||||
&& ninja \
|
||||
&& ninja test \
|
||||
&& ninja install \
|
||||
&& ./configure \
|
||||
&& make \
|
||||
&& make install-strip \
|
||||
&& rm -rf /tmp/vips-${VIPS_VERSION}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# Planka
|
||||
#### Elegant open source project tracking.
|
||||
#### Elegant open source project tracking
|
||||
|
||||
  
|
||||
|
||||
@@ -20,7 +20,10 @@
|
||||
|
||||
## How to deploy Planka
|
||||
|
||||
There are many ways to install Planka, [check them out](https://docs.planka.cloud/docs/intro).
|
||||
There are 2 types of installation:
|
||||
- [Without Docker](https://docs.planka.cloud/docs/installl-planka/Debian%20&%20Ubuntu) ([for Windows](https://docs.planka.cloud/docs/installl-planka/Windows))
|
||||
- [Dockerized](https://docs.planka.cloud/docs/installl-planka/Docker%20Compose)
|
||||
- [Automated installation](https://github.com/plankanban/planka-installer)
|
||||
|
||||
For configuration, please see the [configuration section](https://docs.planka.cloud/docs/category/configuration).
|
||||
|
||||
|
||||
@@ -15,17 +15,17 @@ type: application
|
||||
# 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.
|
||||
# Versions are expected to follow Semantic Versioning (https://semver.org/)
|
||||
version: 0.1.13
|
||||
version: 0.1.2
|
||||
|
||||
# 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
|
||||
# follow Semantic Versioning. They should reflect the version the application is using.
|
||||
# It is recommended to use it with quotes.
|
||||
appVersion: "1.15.2"
|
||||
appVersion: "1.12.0"
|
||||
|
||||
dependencies:
|
||||
- alias: postgresql
|
||||
condition: postgresql.enabled
|
||||
name: postgresql
|
||||
repository: &bitnami-repo https://charts.bitnami.com/bitnami
|
||||
version: 12.5.1
|
||||
- alias: postgresql
|
||||
condition: postgresql.enabled
|
||||
name: postgresql
|
||||
repository: &bitnami-repo https://charts.bitnami.com/bitnami
|
||||
version: 12.5.1
|
||||
|
||||
+1
-23
@@ -21,11 +21,7 @@ git clone https://github.com/Chris-Greaves/planka-helm-chart.git
|
||||
cd planka-helm-chart
|
||||
helm dependency build
|
||||
export SECRETKEY=$(openssl rand -hex 64)
|
||||
helm install planka . --set secretkey=$SECRETKEY \
|
||||
--set admin_email="demo@demo.demo" \
|
||||
--set admin_password="demo" \
|
||||
--set admin_name="Demo Demo" \
|
||||
--set admin_username="demo"
|
||||
helm install planka . --set secretkey=$SECRETKEY
|
||||
```
|
||||
|
||||
> **NOTE:** The command `openssl rand -hex 64` is needed to create a random hexadecimal key for planka. On Windows you can use Git Bash to run that command.
|
||||
@@ -43,19 +39,11 @@ To access Planka externally you can use the following configuration
|
||||
```bash
|
||||
# HTTP only
|
||||
helm install planka . --set secretkey=$SECRETKEY \
|
||||
--set admin_email="demo@demo.demo" \
|
||||
--set admin_password="demo" \
|
||||
--set admin_name="Demo Demo" \
|
||||
--set admin_username="demo"
|
||||
--set ingress.enabled=true \
|
||||
--set ingress.hosts[0].host=planka.example.dev \
|
||||
|
||||
# HTTPS
|
||||
helm install planka . --set secretkey=$SECRETKEY \
|
||||
--set admin_email="demo@demo.demo" \
|
||||
--set admin_password="demo" \
|
||||
--set admin_name="Demo Demo" \
|
||||
--set admin_username="demo"
|
||||
--set ingress.enabled=true \
|
||||
--set ingress.hosts[0].host=planka.example.dev \
|
||||
--set ingress.tls[0].secretName=planka-tls \
|
||||
@@ -66,16 +54,6 @@ or create a values.yaml file like:
|
||||
|
||||
```yaml
|
||||
secretkey: "<InsertSecretKey>"
|
||||
# The admin section needs to be present for new instances of Planka, after the first start you can remove the lines starting with admin_. If you want the admin user to be unchangeable admin_email: has to stay
|
||||
# After changing the config you have to run ```helm upgrade planka . -f values.yaml```
|
||||
|
||||
# Admin user
|
||||
admin_email: "demo@demo.demo" # Do not remove if you want to prevent this user from being edited/deleted
|
||||
admin_password: "demo"
|
||||
admin_name: "Demo Demo"
|
||||
admin_username: "demo"
|
||||
# Admin user
|
||||
|
||||
ingress:
|
||||
enabled: true
|
||||
hosts:
|
||||
|
||||
@@ -35,7 +35,7 @@ spec:
|
||||
imagePullPolicy: {{ .Values.image.pullPolicy }}
|
||||
ports:
|
||||
- name: http
|
||||
containerPort: {{ .Values.service.containerPort | default 1337 }}
|
||||
containerPort: {{ .Values.service.port }}
|
||||
protocol: TCP
|
||||
livenessProbe:
|
||||
httpGet:
|
||||
@@ -75,45 +75,6 @@ spec:
|
||||
value: {{ required "A secret key needs to be generated using 'openssl rand -hex 64' and assigned to secretkey." .Values.secretkey }}
|
||||
- name: TRUST_PROXY
|
||||
value: "0"
|
||||
- name: DEFAULT_ADMIN_EMAIL
|
||||
value: {{ .Values.admin_email }}
|
||||
- name: DEFAULT_ADMIN_PASSWORD
|
||||
value: {{ .Values.admin_password }}
|
||||
- name: DEFAULT_ADMIN_NAME
|
||||
value: {{ .Values.admin_name }}
|
||||
- name: DEFAULT_ADMIN_USERNAME
|
||||
value: {{ .Values.admin_username }}
|
||||
{{ range $k, $v := .Values.env }}
|
||||
- name: {{ $k | quote }}
|
||||
value: {{ $v | quote }}
|
||||
{{- end }}
|
||||
{{- if .Values.oidc.enabled }}
|
||||
{{- $secretName := default (printf "%s-oidc" (include "planka.fullname" .)) .Values.oidc.existingSecret }}
|
||||
- name: OIDC_CLIENT_ID
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
key: clientId
|
||||
name: {{ $secretName }}
|
||||
- name: OIDC_CLIENT_SECRET
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
key: clientSecret
|
||||
name: {{ $secretName }}
|
||||
- name: OIDC_ISSUER
|
||||
value: {{ required "issuerUrl is required when configuring OIDC" .Values.oidc.issuerUrl | quote }}
|
||||
- name: OIDC_SCOPES
|
||||
value: {{ join " " .Values.oidc.scopes | default "openid profile email" | quote }}
|
||||
{{- if .Values.oidc.admin.roles }}
|
||||
- name: OIDC_ADMIN_ROLES
|
||||
value: {{ join "," .Values.oidc.admin.roles | quote }}
|
||||
{{- end }}
|
||||
- name: OIDC_ROLES_ATTRIBUTE
|
||||
value: {{ .Values.oidc.admin.rolesAttribute | default "groups" | quote }}
|
||||
{{- if .Values.oidc.admin.ignoreRoles }}
|
||||
- name: OIDC_IGNORE_ROLES
|
||||
value: {{ .Values.oidc.admin.ignoreRoles | quote }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- with .Values.nodeSelector }}
|
||||
nodeSelector:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
{{- if .Values.oidc.enabled }}
|
||||
{{- if eq (and (not (empty .Values.oidc.clientId)) (not (empty .Values.oidc.clientSecret))) (not (empty .Values.oidc.existingSecret)) -}}
|
||||
{{- fail "Either specify inline `clientId` and `clientSecret` or refer to them via `existingSecret`" -}}
|
||||
{{- end }}
|
||||
{{- if (and (and (not (empty .Values.oidc.clientId)) (not (empty .Values.oidc.clientSecret))) (empty .Values.oidc.existingSecret)) -}}
|
||||
apiVersion: v1
|
||||
kind: Secret
|
||||
metadata:
|
||||
name: {{ include "planka.fullname" . }}-oidc
|
||||
labels:
|
||||
{{- include "planka.labels" . | nindent 4 }}
|
||||
type: Opaque
|
||||
data:
|
||||
clientId: {{ .Values.oidc.clientId | b64enc | quote }}
|
||||
clientSecret: {{ .Values.oidc.clientSecret | b64enc | quote }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
@@ -46,10 +46,6 @@ securityContext: {}
|
||||
service:
|
||||
type: ClusterIP
|
||||
port: 1337
|
||||
## @param service.containerPort Planka HTTP container port
|
||||
## If empty will default to 1337
|
||||
##
|
||||
containerPort: 1337
|
||||
|
||||
ingress:
|
||||
enabled: false
|
||||
@@ -113,68 +109,3 @@ persistence:
|
||||
|
||||
accessMode: ReadWriteOnce
|
||||
size: 10Gi
|
||||
|
||||
## OpenID Identity Management configuration
|
||||
##
|
||||
## Example:
|
||||
## ---------------
|
||||
## oidc:
|
||||
## enabled: true
|
||||
## clientId: sxxaAIAxVXlCxTmc1YLHBbQr8NL8MqLI2DUbt42d
|
||||
## clientSecret: om4RTMRVHRszU7bqxB7RZNkHIzA8e4sGYWxeCwIMYQXPwEBWe4SY5a0wwCe9ltB3zrq5f0dnFnp34cEHD7QSMHsKvV9AiV5Z7eqDraMnv0I8IFivmuV5wovAECAYreSI
|
||||
## issuerUrl: https://auth.local/application/o/planka/
|
||||
## admin:
|
||||
## roles:
|
||||
## - planka-admin
|
||||
##
|
||||
## ---------------
|
||||
## NOTE: A minimal configuration requires setting `clientId`, `clientSecret` and `issuerUrl`. (plus `admin.roles` for administrators)
|
||||
## ref: https://docs.planka.cloud/docs/Configuration/OIDC
|
||||
##
|
||||
oidc:
|
||||
## @param oidc.enabled Enable single sign-on (SSO) with OpenID Connect (OIDC)
|
||||
##
|
||||
enabled: false
|
||||
|
||||
## OIDC credentials
|
||||
## @param oidc.clientId A string unique to the provider that identifies your app.
|
||||
## @param oidc.clientSecret A secret string that the provider uses to confirm ownership of a client ID.
|
||||
##
|
||||
## NOTE: Either specify inline `clientId` and `clientSecret` or refer to them via `existingSecret`
|
||||
##
|
||||
clientId: ""
|
||||
clientSecret: ""
|
||||
|
||||
## @param oidc.existingSecret Name of an existing secret containing OIDC credentials
|
||||
## NOTE: Must contain key `clientId` and `clientSecret`
|
||||
## NOTE: When it's set, the `clientId` and `clientSecret` parameters are ignored
|
||||
##
|
||||
existingSecret: ""
|
||||
|
||||
## @param oidc.issuerUrl The OpenID connect metadata document endpoint
|
||||
##
|
||||
issuerUrl: ""
|
||||
|
||||
## @param oidc.scopes A list of scopes required for OIDC client.
|
||||
## If empty will default to `openid`, `profile` and `email`
|
||||
## NOTE: Planka needs the email and name claims
|
||||
##
|
||||
scopes: []
|
||||
|
||||
## Admin permissions configuration
|
||||
admin:
|
||||
## @param oidc.admin.ignoreRoles If set to true, the admin roles will be ignored.
|
||||
## It is useful if you want to use OIDC for authentication but not for authorization.
|
||||
## If empty will default to `false`
|
||||
##
|
||||
ignoreRoles: false
|
||||
|
||||
## @param oidc.admin.rolesAttribute The name of a custom group claim that you have configured in your OIDC provider
|
||||
## If empty will default to `groups`
|
||||
##
|
||||
rolesAttribute: groups
|
||||
|
||||
## @param oidc.admin.roles The names of the admin groups
|
||||
##
|
||||
roles: []
|
||||
# - planka-admin
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
REACT_APP_VERSION=1.15.2
|
||||
REACT_APP_VERSION=1.12.0
|
||||
|
||||
Generated
+22008
-3386
File diff suppressed because it is too large
Load Diff
+30
-36
@@ -49,72 +49,66 @@
|
||||
"**/*.test.js"
|
||||
]
|
||||
}
|
||||
],
|
||||
"prettier/prettier": [
|
||||
"error",
|
||||
{
|
||||
"endOfLine": "auto"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"dependencies": {
|
||||
"@juggle/resize-observer": "^3.4.0",
|
||||
"classnames": "^2.3.2",
|
||||
"date-fns": "^2.30.0",
|
||||
"date-fns": "^2.29.3",
|
||||
"dequal": "^2.0.3",
|
||||
"easymde": "^2.18.0",
|
||||
"history": "^5.3.0",
|
||||
"i18next": "^23.7.6",
|
||||
"i18next-browser-languagedetector": "^7.2.0",
|
||||
"i18next": "^22.0.6",
|
||||
"i18next-browser-languagedetector": "^7.0.1",
|
||||
"initials": "^3.1.2",
|
||||
"js-cookie": "^3.0.5",
|
||||
"jwt-decode": "^4.0.0",
|
||||
"js-cookie": "^3.0.1",
|
||||
"jwt-decode": "^3.1.2",
|
||||
"lodash": "^4.17.21",
|
||||
"nanoid": "^5.0.3",
|
||||
"node-sass": "^9.0.0",
|
||||
"photoswipe": "^5.4.2",
|
||||
"node-sass": "^8.0.0",
|
||||
"photoswipe": "^5.3.3",
|
||||
"prop-types": "^15.8.1",
|
||||
"react": "^18.2.0",
|
||||
"react-app-rewired": "^2.2.1",
|
||||
"react-beautiful-dnd": "^13.1.1",
|
||||
"react-datepicker": "^4.21.0",
|
||||
"react-datepicker": "^4.8.0",
|
||||
"react-dom": "^18.2.0",
|
||||
"react-dropzone": "^14.2.3",
|
||||
"react-i18next": "^13.5.0",
|
||||
"react-i18next": "^12.0.0",
|
||||
"react-input-mask": "^2.0.4",
|
||||
"react-markdown": "^8.0.7",
|
||||
"react-photoswipe-gallery": "^2.2.7",
|
||||
"react-redux": "^8.1.3",
|
||||
"react-router-dom": "^6.19.0",
|
||||
"react-markdown": "^8.0.3",
|
||||
"react-oidc-context": "^2.2.2",
|
||||
"react-photoswipe-gallery": "^2.2.2",
|
||||
"react-redux": "^8.0.5",
|
||||
"react-router-dom": "^6.4.3",
|
||||
"react-scripts": "5.0.1",
|
||||
"react-simplemde-editor": "^5.2.0",
|
||||
"react-textarea-autosize": "^8.5.3",
|
||||
"redux": "^4.2.1",
|
||||
"react-textarea-autosize": "^8.4.0",
|
||||
"redux": "^4.2.0",
|
||||
"redux-logger": "^3.0.6",
|
||||
"redux-orm": "^0.16.2",
|
||||
"redux-saga": "^1.2.3",
|
||||
"remark-breaks": "^4.0.0",
|
||||
"redux-saga": "^1.2.1",
|
||||
"remark-breaks": "^3.0.2",
|
||||
"remark-gfm": "^3.0.1",
|
||||
"reselect": "^4.1.8",
|
||||
"reselect": "^4.1.7",
|
||||
"sails.io.js": "^1.2.1",
|
||||
"semantic-ui-react": "^2.1.4",
|
||||
"semantic-ui-react": "^2.1.3",
|
||||
"socket.io-client": "^2.5.0",
|
||||
"validator": "^13.11.0",
|
||||
"whatwg-fetch": "^3.6.19",
|
||||
"validator": "^13.7.0",
|
||||
"whatwg-fetch": "^3.6.2",
|
||||
"zxcvbn": "^4.4.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@testing-library/jest-dom": "^6.1.4",
|
||||
"@testing-library/react": "^14.1.0",
|
||||
"@testing-library/user-event": "^14.5.1",
|
||||
"@testing-library/jest-dom": "^5.16.5",
|
||||
"@testing-library/react": "^13.4.0",
|
||||
"@testing-library/user-event": "^13.5.0",
|
||||
"babel-preset-airbnb": "^5.0.0",
|
||||
"chai": "^4.3.10",
|
||||
"eslint": "^8.53.0",
|
||||
"chai": "^4.3.7",
|
||||
"eslint": "^8.28.0",
|
||||
"eslint-config-airbnb": "^19.0.4",
|
||||
"eslint-plugin-import": "^2.29.0",
|
||||
"eslint-plugin-jsx-a11y": "^6.8.0",
|
||||
"eslint-plugin-react": "^7.33.2",
|
||||
"eslint-plugin-import": "^2.26.0",
|
||||
"eslint-plugin-jsx-a11y": "^6.6.1",
|
||||
"eslint-plugin-react": "^7.31.11",
|
||||
"eslint-plugin-react-hooks": "^4.6.0",
|
||||
"react-test-renderer": "^18.2.0"
|
||||
}
|
||||
|
||||
@@ -39,14 +39,6 @@ const initializeCore = (
|
||||
},
|
||||
});
|
||||
|
||||
// TODO: with success?
|
||||
initializeCore.fetchConfig = (config) => ({
|
||||
type: ActionTypes.CORE_INITIALIZE__CONFIG_FETCH,
|
||||
payload: {
|
||||
config,
|
||||
},
|
||||
});
|
||||
|
||||
const logout = () => ({
|
||||
type: ActionTypes.LOGOUT,
|
||||
payload: {},
|
||||
|
||||
@@ -1,12 +1,5 @@
|
||||
import ActionTypes from '../constants/ActionTypes';
|
||||
|
||||
const initializeLogin = (config) => ({
|
||||
type: ActionTypes.LOGIN_INITIALIZE,
|
||||
payload: {
|
||||
config,
|
||||
},
|
||||
});
|
||||
|
||||
const authenticate = (data) => ({
|
||||
type: ActionTypes.AUTHENTICATE,
|
||||
payload: {
|
||||
@@ -28,33 +21,12 @@ authenticate.failure = (error) => ({
|
||||
},
|
||||
});
|
||||
|
||||
const authenticateUsingOidc = () => ({
|
||||
type: ActionTypes.USING_OIDC_AUTHENTICATE,
|
||||
payload: {},
|
||||
});
|
||||
|
||||
authenticateUsingOidc.success = (accessToken) => ({
|
||||
type: ActionTypes.USING_OIDC_AUTHENTICATE__SUCCESS,
|
||||
payload: {
|
||||
accessToken,
|
||||
},
|
||||
});
|
||||
|
||||
authenticateUsingOidc.failure = (error) => ({
|
||||
type: ActionTypes.USING_OIDC_AUTHENTICATE__FAILURE,
|
||||
payload: {
|
||||
error,
|
||||
},
|
||||
});
|
||||
|
||||
const clearAuthenticateError = () => ({
|
||||
type: ActionTypes.AUTHENTICATE_ERROR_CLEAR,
|
||||
payload: {},
|
||||
});
|
||||
|
||||
export default {
|
||||
initializeLogin,
|
||||
authenticate,
|
||||
authenticateUsingOidc,
|
||||
clearAuthenticateError,
|
||||
};
|
||||
|
||||
@@ -4,15 +4,14 @@ import socket from './socket';
|
||||
/* Actions */
|
||||
|
||||
const createAccessToken = (data, headers) => http.post('/access-tokens', data, headers);
|
||||
|
||||
const exchangeForAccessTokenUsingOidc = (data, headers) =>
|
||||
http.post('/access-tokens/exchange-using-oidc', data, headers);
|
||||
const exchangeOidcToken = (accessToken, headers) =>
|
||||
http.post('/access-tokens/exchange', { token: accessToken }, headers);
|
||||
|
||||
const deleteCurrentAccessToken = (headers) =>
|
||||
socket.delete('/access-tokens/me', undefined, headers);
|
||||
|
||||
export default {
|
||||
createAccessToken,
|
||||
exchangeForAccessTokenUsingOidc,
|
||||
deleteCurrentAccessToken,
|
||||
exchangeOidcToken,
|
||||
};
|
||||
|
||||
@@ -5,15 +5,13 @@ import Config from '../constants/Config';
|
||||
const http = {};
|
||||
|
||||
// TODO: add all methods
|
||||
['GET', 'POST'].forEach((method) => {
|
||||
['POST'].forEach((method) => {
|
||||
http[method.toLowerCase()] = (url, data, headers) => {
|
||||
const formData =
|
||||
data &&
|
||||
Object.keys(data).reduce((result, key) => {
|
||||
result.append(key, data[key]);
|
||||
const formData = Object.keys(data).reduce((result, key) => {
|
||||
result.append(key, data[key]);
|
||||
|
||||
return result;
|
||||
}, new FormData());
|
||||
return result;
|
||||
}, new FormData());
|
||||
|
||||
return fetch(`${Config.SERVER_BASE_URL}/api${url}`, {
|
||||
method,
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import http from './http';
|
||||
import socket from './socket';
|
||||
import root from './root';
|
||||
import accessTokens from './access-tokens';
|
||||
import users from './users';
|
||||
import projects from './projects';
|
||||
@@ -21,7 +20,6 @@ import notifications from './notifications';
|
||||
export { http, socket };
|
||||
|
||||
export default {
|
||||
...root,
|
||||
...accessTokens,
|
||||
...users,
|
||||
...projects,
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
import http from './http';
|
||||
|
||||
/* Actions */
|
||||
|
||||
const getConfig = (headers) => http.get('/config', undefined, headers);
|
||||
|
||||
export default {
|
||||
getConfig,
|
||||
};
|
||||
@@ -217,7 +217,6 @@ const CardModal = React.memo(
|
||||
onUserSelect={onUserAdd}
|
||||
onUserDeselect={onUserRemove}
|
||||
>
|
||||
{/* eslint-disable-next-line jsx-a11y/control-has-associated-label */}
|
||||
<button
|
||||
type="button"
|
||||
className={classNames(styles.attachment, styles.dueDate)}
|
||||
@@ -267,7 +266,6 @@ const CardModal = React.memo(
|
||||
onMove={onLabelMove}
|
||||
onDelete={onLabelDelete}
|
||||
>
|
||||
{/* eslint-disable-next-line jsx-a11y/control-has-associated-label */}
|
||||
<button
|
||||
type="button"
|
||||
className={classNames(styles.attachment, styles.dueDate)}
|
||||
@@ -316,11 +314,10 @@ const CardModal = React.memo(
|
||||
)}
|
||||
</span>
|
||||
{canEdit && (
|
||||
// eslint-disable-next-line jsx-a11y/control-has-associated-label
|
||||
<button
|
||||
onClick={handleToggleStopwatchClick}
|
||||
type="button"
|
||||
className={classNames(styles.attachment, styles.dueDate)}
|
||||
onClick={handleToggleStopwatchClick}
|
||||
>
|
||||
<Icon
|
||||
name={stopwatch.startedAt ? 'pause' : 'play'}
|
||||
|
||||
@@ -48,21 +48,14 @@ const Tasks = React.memo(({ items, canEdit, onCreate, onUpdate, onMove, onDelete
|
||||
return (
|
||||
<>
|
||||
{items.length > 0 && (
|
||||
<>
|
||||
<span className={styles.progressWrapper}>
|
||||
<Progress
|
||||
autoSuccess
|
||||
value={completedItems.length}
|
||||
total={items.length}
|
||||
color="blue"
|
||||
size="tiny"
|
||||
className={styles.progress}
|
||||
/>
|
||||
</span>
|
||||
<span className={styles.count}>
|
||||
{completedItems.length}/{items.length}
|
||||
</span>
|
||||
</>
|
||||
<Progress
|
||||
autoSuccess
|
||||
value={completedItems.length}
|
||||
total={items.length}
|
||||
color="blue"
|
||||
size="tiny"
|
||||
className={styles.progress}
|
||||
/>
|
||||
)}
|
||||
<DragDropContext onDragStart={handleDragStart} onDragEnd={handleDragEnd}>
|
||||
<Droppable droppableId="tasks" type={DroppableTypes.TASK}>
|
||||
|
||||
@@ -3,23 +3,6 @@
|
||||
margin: 0 0 16px;
|
||||
}
|
||||
|
||||
.progressWrapper {
|
||||
display: inline-block;
|
||||
padding: 3px 0;
|
||||
vertical-align: top;
|
||||
width: calc(100% - 50px);
|
||||
}
|
||||
|
||||
.count {
|
||||
color: #8c8c8c;
|
||||
display: inline-block;
|
||||
font-size: 14px;
|
||||
line-height: 14px;
|
||||
text-align: right;
|
||||
vertical-align: top;
|
||||
width: 50px;
|
||||
}
|
||||
|
||||
.taskButton {
|
||||
background: transparent;
|
||||
border: none;
|
||||
|
||||
@@ -3,6 +3,7 @@ import PropTypes from 'prop-types';
|
||||
import classNames from 'classnames';
|
||||
import { Link } from 'react-router-dom';
|
||||
import { Button, Icon, Menu } from 'semantic-ui-react';
|
||||
import { useAuth } from 'react-oidc-context';
|
||||
import { usePopup } from '../../lib/popup';
|
||||
|
||||
import Paths from '../../constants/Paths';
|
||||
@@ -29,6 +30,7 @@ const Header = React.memo(
|
||||
onUserSettingsClick,
|
||||
onLogout,
|
||||
}) => {
|
||||
const auth = useAuth();
|
||||
const handleProjectSettingsClick = useCallback(() => {
|
||||
if (canEditProject) {
|
||||
onProjectSettingsClick();
|
||||
@@ -38,6 +40,11 @@ const Header = React.memo(
|
||||
const NotificationsPopup = usePopup(NotificationsStep, POPUP_PROPS);
|
||||
const UserPopup = usePopup(UserStep, POPUP_PROPS);
|
||||
|
||||
const onFullLogout = () => {
|
||||
auth.signoutSilent();
|
||||
onLogout();
|
||||
};
|
||||
|
||||
return (
|
||||
<div className={styles.wrapper}>
|
||||
{!project && (
|
||||
@@ -88,7 +95,7 @@ const Header = React.memo(
|
||||
<UserPopup
|
||||
isLogouting={isLogouting}
|
||||
onSettingsClick={onUserSettingsClick}
|
||||
onLogout={onLogout}
|
||||
onLogout={onFullLogout}
|
||||
>
|
||||
<Menu.Item className={classNames(styles.item, styles.itemHoverable)}>
|
||||
{user.name}
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
import isEmail from 'validator/lib/isEmail';
|
||||
import React, { useCallback, useEffect, useMemo, useRef } from 'react';
|
||||
import { useAuth } from 'react-oidc-context';
|
||||
import PropTypes from 'prop-types';
|
||||
import classNames from 'classnames';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { Button, Form, Grid, Header, Message } from 'semantic-ui-react';
|
||||
import { Form, Grid, Header, Message } from 'semantic-ui-react';
|
||||
import { useDidUpdate, usePrevious, useToggle } from '../../lib/hooks';
|
||||
import { Input } from '../../lib/custom-ui';
|
||||
|
||||
@@ -28,21 +29,6 @@ const createMessage = (error) => {
|
||||
type: 'error',
|
||||
content: 'common.invalidPassword',
|
||||
};
|
||||
case 'Use single sign-on':
|
||||
return {
|
||||
type: 'error',
|
||||
content: 'common.useSingleSignOn',
|
||||
};
|
||||
case 'Email already in use':
|
||||
return {
|
||||
type: 'error',
|
||||
content: 'common.emailAlreadyInUse',
|
||||
};
|
||||
case 'Username already in use':
|
||||
return {
|
||||
type: 'error',
|
||||
content: 'common.usernameAlreadyInUse',
|
||||
};
|
||||
case 'Failed to fetch':
|
||||
return {
|
||||
type: 'warning',
|
||||
@@ -62,16 +48,8 @@ const createMessage = (error) => {
|
||||
};
|
||||
|
||||
const Login = React.memo(
|
||||
({
|
||||
defaultData,
|
||||
isSubmitting,
|
||||
isSubmittingUsingOidc,
|
||||
error,
|
||||
withOidc,
|
||||
onAuthenticate,
|
||||
onAuthenticateUsingOidc,
|
||||
onMessageDismiss,
|
||||
}) => {
|
||||
({ defaultData, isSubmitting, error, onAuthenticate, onMessageDismiss }) => {
|
||||
const auth = useAuth();
|
||||
const [t] = useTranslation();
|
||||
const wasSubmitting = usePrevious(isSubmitting);
|
||||
|
||||
@@ -192,19 +170,12 @@ const Login = React.memo(
|
||||
content={t('action.logIn')}
|
||||
floated="right"
|
||||
loading={isSubmitting}
|
||||
disabled={isSubmitting || isSubmittingUsingOidc}
|
||||
disabled={isSubmitting}
|
||||
/>
|
||||
</Form>
|
||||
{withOidc && (
|
||||
<Button
|
||||
type="button"
|
||||
loading={isSubmittingUsingOidc}
|
||||
disabled={isSubmitting || isSubmittingUsingOidc}
|
||||
onClick={onAuthenticateUsingOidc}
|
||||
>
|
||||
{t('action.logInWithSSO')}
|
||||
</Button>
|
||||
)}
|
||||
<Form.Button type="button" onClick={() => auth.signinRedirect()}>
|
||||
Log in with SSO
|
||||
</Form.Button>
|
||||
</div>
|
||||
</div>
|
||||
</Grid.Column>
|
||||
@@ -235,15 +206,10 @@ const Login = React.memo(
|
||||
);
|
||||
|
||||
Login.propTypes = {
|
||||
/* eslint-disable react/forbid-prop-types */
|
||||
defaultData: PropTypes.object.isRequired,
|
||||
/* eslint-enable react/forbid-prop-types */
|
||||
defaultData: PropTypes.object.isRequired, // eslint-disable-line react/forbid-prop-types
|
||||
isSubmitting: PropTypes.bool.isRequired,
|
||||
isSubmittingUsingOidc: PropTypes.bool.isRequired,
|
||||
error: PropTypes.object, // eslint-disable-line react/forbid-prop-types
|
||||
withOidc: PropTypes.bool.isRequired,
|
||||
onAuthenticate: PropTypes.func.isRequired,
|
||||
onAuthenticateUsingOidc: PropTypes.func.isRequired,
|
||||
onMessageDismiss: PropTypes.func.isRequired,
|
||||
};
|
||||
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
import React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { Loader } from 'semantic-ui-react';
|
||||
|
||||
import LoginContainer from '../containers/LoginContainer';
|
||||
|
||||
const LoginWrapper = React.memo(({ isInitializing }) => {
|
||||
if (isInitializing) {
|
||||
return <Loader active size="massive" />;
|
||||
}
|
||||
|
||||
return <LoginContainer />;
|
||||
});
|
||||
|
||||
LoginWrapper.propTypes = {
|
||||
isInitializing: PropTypes.bool.isRequired,
|
||||
};
|
||||
|
||||
export default LoginWrapper;
|
||||
@@ -0,0 +1,19 @@
|
||||
import { useAuth } from 'react-oidc-context';
|
||||
import PropTypes from 'prop-types';
|
||||
import React from 'react';
|
||||
|
||||
let isLoggingIn = true;
|
||||
const OidcLogin = React.memo(({ onAuthenticate }) => {
|
||||
const auth = useAuth();
|
||||
if (isLoggingIn && auth.user) {
|
||||
isLoggingIn = false;
|
||||
const { user } = auth;
|
||||
onAuthenticate(user);
|
||||
}
|
||||
});
|
||||
|
||||
OidcLogin.propTypes = {
|
||||
onAuthenticate: PropTypes.func.isRequired,
|
||||
};
|
||||
|
||||
export default OidcLogin;
|
||||
@@ -0,0 +1,3 @@
|
||||
import OidcLogin from './OidcLogin';
|
||||
|
||||
export default OidcLogin;
|
||||
@@ -1,11 +1,12 @@
|
||||
import React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { AuthProvider } from 'react-oidc-context';
|
||||
import { Provider } from 'react-redux';
|
||||
import { Route, Routes } from 'react-router-dom';
|
||||
import { ReduxRouter } from '../lib/redux-router';
|
||||
|
||||
import Paths from '../constants/Paths';
|
||||
import LoginWrapperContainer from '../containers/LoginWrapperContainer';
|
||||
import LoginContainer from '../containers/LoginContainer';
|
||||
import CoreContainer from '../containers/CoreContainer';
|
||||
import NotFound from './NotFound';
|
||||
|
||||
@@ -14,29 +15,40 @@ import 'photoswipe/dist/photoswipe.css';
|
||||
import 'easymde/dist/easymde.min.css';
|
||||
import '../lib/custom-ui/styles.css';
|
||||
import '../styles.module.scss';
|
||||
import OidcLoginContainer from '../containers/OidcLoginContainer';
|
||||
|
||||
function Root({ store, history }) {
|
||||
function Root({ store, history, config }) {
|
||||
return (
|
||||
<Provider store={store}>
|
||||
<ReduxRouter history={history}>
|
||||
<Routes>
|
||||
<Route path={Paths.LOGIN} element={<LoginWrapperContainer />} />
|
||||
<Route path={Paths.OIDC_CALLBACK} element={<LoginWrapperContainer />} />
|
||||
<Route path={Paths.ROOT} element={<CoreContainer />} />
|
||||
<Route path={Paths.PROJECTS} element={<CoreContainer />} />
|
||||
<Route path={Paths.BOARDS} element={<CoreContainer />} />
|
||||
<Route path={Paths.CARDS} element={<CoreContainer />} />
|
||||
<Route path="*" element={<NotFound />} />
|
||||
</Routes>
|
||||
</ReduxRouter>
|
||||
</Provider>
|
||||
<AuthProvider
|
||||
authority={config.authority}
|
||||
client_id={config.clientId}
|
||||
redirect_uri={config.redirectUri}
|
||||
scope={config.scopes}
|
||||
onSigninCallback={() => {
|
||||
window.history.replaceState({}, document.title, window.location.pathname);
|
||||
}}
|
||||
>
|
||||
<Provider store={store}>
|
||||
<ReduxRouter history={history}>
|
||||
<Routes>
|
||||
<Route path={Paths.LOGIN} element={<LoginContainer />} />
|
||||
<Route path={Paths.OIDC_LOGIN} element={<OidcLoginContainer />} />
|
||||
<Route path={Paths.ROOT} element={<CoreContainer />} />
|
||||
<Route path={Paths.PROJECTS} element={<CoreContainer />} />
|
||||
<Route path={Paths.BOARDS} element={<CoreContainer />} />
|
||||
<Route path={Paths.CARDS} element={<CoreContainer />} />
|
||||
<Route path="*" element={<NotFound />} />
|
||||
</Routes>
|
||||
</ReduxRouter>
|
||||
</Provider>
|
||||
</AuthProvider>
|
||||
);
|
||||
}
|
||||
|
||||
Root.propTypes = {
|
||||
/* eslint-disable react/forbid-prop-types */
|
||||
store: PropTypes.object.isRequired,
|
||||
history: PropTypes.object.isRequired,
|
||||
config: PropTypes.object.isRequired,
|
||||
/* eslint-enable react/forbid-prop-types */
|
||||
};
|
||||
|
||||
|
||||
@@ -16,8 +16,8 @@ const UserSettingsModal = React.memo(
|
||||
phone,
|
||||
organization,
|
||||
language,
|
||||
subscribeToOwnCards,
|
||||
isLocked,
|
||||
subscribeToOwnCards,
|
||||
isAvatarUpdating,
|
||||
usernameUpdateForm,
|
||||
emailUpdateForm,
|
||||
@@ -106,8 +106,8 @@ UserSettingsModal.propTypes = {
|
||||
phone: PropTypes.string,
|
||||
organization: PropTypes.string,
|
||||
language: PropTypes.string,
|
||||
subscribeToOwnCards: PropTypes.bool.isRequired,
|
||||
isLocked: PropTypes.bool.isRequired,
|
||||
subscribeToOwnCards: PropTypes.bool.isRequired,
|
||||
isAvatarUpdating: PropTypes.bool.isRequired,
|
||||
/* eslint-disable react/forbid-prop-types */
|
||||
usernameUpdateForm: PropTypes.object.isRequired,
|
||||
|
||||
@@ -153,15 +153,13 @@ const ActionsStep = React.memo(
|
||||
context: 'title',
|
||||
})}
|
||||
</Menu.Item>
|
||||
<Menu.Item className={styles.menuItem} onClick={handleDeleteClick}>
|
||||
{t('action.deleteUser', {
|
||||
context: 'title',
|
||||
})}
|
||||
</Menu.Item>
|
||||
</>
|
||||
)}
|
||||
{!user.isDeletionLocked && (
|
||||
<Menu.Item className={styles.menuItem} onClick={handleDeleteClick}>
|
||||
{t('action.deleteUser', {
|
||||
context: 'title',
|
||||
})}
|
||||
</Menu.Item>
|
||||
)}
|
||||
</Menu>
|
||||
</Popup.Content>
|
||||
</>
|
||||
|
||||
@@ -18,8 +18,6 @@ const Item = React.memo(
|
||||
phone,
|
||||
isAdmin,
|
||||
isLocked,
|
||||
isRoleLocked,
|
||||
isDeletionLocked,
|
||||
emailUpdateForm,
|
||||
passwordUpdateForm,
|
||||
usernameUpdateForm,
|
||||
@@ -49,7 +47,7 @@ const Item = React.memo(
|
||||
<Table.Cell>{username || '-'}</Table.Cell>
|
||||
<Table.Cell>{email}</Table.Cell>
|
||||
<Table.Cell>
|
||||
<Radio toggle checked={isAdmin} disabled={isRoleLocked} onChange={handleIsAdminChange} />
|
||||
<Radio toggle checked={isAdmin} disabled={isLocked} onChange={handleIsAdminChange} />
|
||||
</Table.Cell>
|
||||
<Table.Cell textAlign="right">
|
||||
<ActionsPopup
|
||||
@@ -61,7 +59,6 @@ const Item = React.memo(
|
||||
phone,
|
||||
isAdmin,
|
||||
isLocked,
|
||||
isDeletionLocked,
|
||||
emailUpdateForm,
|
||||
passwordUpdateForm,
|
||||
usernameUpdateForm,
|
||||
@@ -94,8 +91,6 @@ Item.propTypes = {
|
||||
phone: PropTypes.string,
|
||||
isAdmin: PropTypes.bool.isRequired,
|
||||
isLocked: PropTypes.bool.isRequired,
|
||||
isRoleLocked: PropTypes.bool.isRequired,
|
||||
isDeletionLocked: PropTypes.bool.isRequired,
|
||||
/* eslint-disable react/forbid-prop-types */
|
||||
emailUpdateForm: PropTypes.object.isRequired,
|
||||
passwordUpdateForm: PropTypes.object.isRequired,
|
||||
|
||||
@@ -111,8 +111,6 @@ const UsersModal = React.memo(
|
||||
phone={item.phone}
|
||||
isAdmin={item.isAdmin}
|
||||
isLocked={item.isLocked}
|
||||
isRoleLocked={item.isRoleLocked}
|
||||
isDeletionLocked={item.isDeletionLocked}
|
||||
emailUpdateForm={item.emailUpdateForm}
|
||||
passwordUpdateForm={item.passwordUpdateForm}
|
||||
usernameUpdateForm={item.usernameUpdateForm}
|
||||
|
||||
@@ -12,19 +12,14 @@ export default {
|
||||
|
||||
/* Login */
|
||||
|
||||
LOGIN_INITIALIZE: 'LOGIN_INITIALIZE',
|
||||
AUTHENTICATE: 'AUTHENTICATE',
|
||||
AUTHENTICATE__SUCCESS: 'AUTHENTICATE__SUCCESS',
|
||||
AUTHENTICATE__FAILURE: 'AUTHENTICATE__FAILURE',
|
||||
USING_OIDC_AUTHENTICATE: 'USING_OIDC_AUTHENTICATE',
|
||||
USING_OIDC_AUTHENTICATE__SUCCESS: 'USING_OIDC_AUTHENTICATE__SUCCESS',
|
||||
USING_OIDC_AUTHENTICATE__FAILURE: 'USING_OIDC_AUTHENTICATE__FAILURE',
|
||||
AUTHENTICATE_ERROR_CLEAR: 'AUTHENTICATE_ERROR_CLEAR',
|
||||
|
||||
/* Core */
|
||||
|
||||
CORE_INITIALIZE: 'CORE_INITIALIZE',
|
||||
CORE_INITIALIZE__CONFIG_FETCH: 'CORE_INITIALIZE__CONFIG_FETCH',
|
||||
LOGOUT: 'LOGOUT',
|
||||
LOGOUT__ACCESS_TOKEN_INVALIDATE: 'LOGOUT__ACCESS_TOKEN_INVALIDATE',
|
||||
|
||||
|
||||
@@ -11,11 +11,11 @@ export default {
|
||||
/* Login */
|
||||
|
||||
AUTHENTICATE: `${PREFIX}/AUTHENTICATE`,
|
||||
USING_OIDC_AUTHENTICATE: `${PREFIX}/USING_OIDC_AUTHENTICATE`,
|
||||
AUTHENTICATE_ERROR_CLEAR: `${PREFIX}/AUTHENTICATE_ERROR_CLEAR`,
|
||||
|
||||
/* Core */
|
||||
|
||||
CORE_INITIALIZE: `${PREFIX}/CORE_INITIALIZE`,
|
||||
LOGOUT: `${PREFIX}/LOGOUT`,
|
||||
|
||||
/* Modals */
|
||||
|
||||
@@ -2,7 +2,7 @@ import Config from './Config';
|
||||
|
||||
const ROOT = `${Config.BASE_PATH}/`;
|
||||
const LOGIN = `${Config.BASE_PATH}/login`;
|
||||
const OIDC_CALLBACK = `${Config.BASE_PATH}/oidc-callback`;
|
||||
const OIDC_LOGIN = `${Config.BASE_PATH}/oidclogin`;
|
||||
const PROJECTS = `${Config.BASE_PATH}/projects/:id`;
|
||||
const BOARDS = `${Config.BASE_PATH}/boards/:id`;
|
||||
const CARDS = `${Config.BASE_PATH}/cards/:id`;
|
||||
@@ -10,8 +10,8 @@ const CARDS = `${Config.BASE_PATH}/cards/:id`;
|
||||
export default {
|
||||
ROOT,
|
||||
LOGIN,
|
||||
OIDC_CALLBACK,
|
||||
PROJECTS,
|
||||
BOARDS,
|
||||
CARDS,
|
||||
OIDC_LOGIN,
|
||||
};
|
||||
|
||||
@@ -4,18 +4,18 @@ import selectors from '../selectors';
|
||||
import Core from '../components/Core';
|
||||
|
||||
const mapStateToProps = (state) => {
|
||||
const isInitializing = selectors.selectIsInitializing(state);
|
||||
const isCoreInitializing = selectors.selectIsCoreInitializing(state);
|
||||
const isSocketDisconnected = selectors.selectIsSocketDisconnected(state);
|
||||
const currentModal = selectors.selectCurrentModal(state);
|
||||
const currentProject = selectors.selectCurrentProject(state);
|
||||
const currentBoard = selectors.selectCurrentBoard(state);
|
||||
|
||||
return {
|
||||
isInitializing,
|
||||
isSocketDisconnected,
|
||||
currentModal,
|
||||
currentProject,
|
||||
currentBoard,
|
||||
isInitializing: isCoreInitializing,
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -1,33 +1,23 @@
|
||||
import { bindActionCreators } from 'redux';
|
||||
import { connect } from 'react-redux';
|
||||
|
||||
import selectors from '../selectors';
|
||||
import entryActions from '../entry-actions';
|
||||
import Login from '../components/Login';
|
||||
|
||||
const mapStateToProps = (state) => {
|
||||
const oidcConfig = selectors.selectOidcConfig(state);
|
||||
|
||||
const {
|
||||
ui: {
|
||||
authenticateForm: { data: defaultData, isSubmitting, isSubmittingUsingOidc, error },
|
||||
},
|
||||
} = state;
|
||||
|
||||
return {
|
||||
defaultData,
|
||||
isSubmitting,
|
||||
isSubmittingUsingOidc,
|
||||
error,
|
||||
withOidc: !!oidcConfig,
|
||||
};
|
||||
};
|
||||
const mapStateToProps = ({
|
||||
ui: {
|
||||
authenticateForm: { data: defaultData, isSubmitting, error },
|
||||
},
|
||||
}) => ({
|
||||
defaultData,
|
||||
isSubmitting,
|
||||
error,
|
||||
});
|
||||
|
||||
const mapDispatchToProps = (dispatch) =>
|
||||
bindActionCreators(
|
||||
{
|
||||
onAuthenticate: entryActions.authenticate,
|
||||
onAuthenticateUsingOidc: entryActions.authenticateUsingOidc,
|
||||
onMessageDismiss: entryActions.clearAuthenticateError,
|
||||
},
|
||||
dispatch,
|
||||
|
||||
@@ -1,14 +0,0 @@
|
||||
import { connect } from 'react-redux';
|
||||
|
||||
import selectors from '../selectors';
|
||||
import LoginWrapper from '../components/LoginWrapper';
|
||||
|
||||
const mapStateToProps = (state) => {
|
||||
const isInitializing = selectors.selectIsInitializing(state);
|
||||
|
||||
return {
|
||||
isInitializing,
|
||||
};
|
||||
};
|
||||
|
||||
export default connect(mapStateToProps)(LoginWrapper);
|
||||
@@ -0,0 +1,26 @@
|
||||
import { bindActionCreators } from 'redux';
|
||||
import { connect } from 'react-redux';
|
||||
|
||||
import entryActions from '../entry-actions';
|
||||
import OidcLogin from '../components/OIDC';
|
||||
|
||||
const mapStateToProps = ({
|
||||
ui: {
|
||||
authenticateForm: { data: defaultData, isSubmitting, error },
|
||||
},
|
||||
}) => ({
|
||||
defaultData,
|
||||
isSubmitting,
|
||||
error,
|
||||
});
|
||||
|
||||
const mapDispatchToProps = (dispatch) =>
|
||||
bindActionCreators(
|
||||
{
|
||||
onAuthenticate: entryActions.authenticate,
|
||||
onMessageDismiss: entryActions.clearAuthenticateError,
|
||||
},
|
||||
dispatch,
|
||||
);
|
||||
|
||||
export default connect(mapStateToProps, mapDispatchToProps)(OidcLogin);
|
||||
@@ -14,8 +14,8 @@ const mapStateToProps = (state) => {
|
||||
phone,
|
||||
organization,
|
||||
language,
|
||||
subscribeToOwnCards,
|
||||
isLocked,
|
||||
subscribeToOwnCards,
|
||||
isAvatarUpdating,
|
||||
emailUpdateForm,
|
||||
passwordUpdateForm,
|
||||
@@ -30,8 +30,8 @@ const mapStateToProps = (state) => {
|
||||
phone,
|
||||
organization,
|
||||
language,
|
||||
subscribeToOwnCards,
|
||||
isLocked,
|
||||
subscribeToOwnCards,
|
||||
isAvatarUpdating,
|
||||
emailUpdateForm,
|
||||
passwordUpdateForm,
|
||||
|
||||
@@ -1,10 +1,16 @@
|
||||
import EntryActionTypes from '../constants/EntryActionTypes';
|
||||
|
||||
const initializeCore = () => ({
|
||||
type: EntryActionTypes.CORE_INITIALIZE,
|
||||
payload: {},
|
||||
});
|
||||
|
||||
const logout = () => ({
|
||||
type: EntryActionTypes.LOGOUT,
|
||||
payload: {},
|
||||
});
|
||||
|
||||
export default {
|
||||
initializeCore,
|
||||
logout,
|
||||
};
|
||||
|
||||
@@ -7,11 +7,6 @@ const authenticate = (data) => ({
|
||||
},
|
||||
});
|
||||
|
||||
const authenticateUsingOidc = () => ({
|
||||
type: EntryActionTypes.USING_OIDC_AUTHENTICATE,
|
||||
payload: {},
|
||||
});
|
||||
|
||||
const clearAuthenticateError = () => ({
|
||||
type: EntryActionTypes.AUTHENTICATE_ERROR_CLEAR,
|
||||
payload: {},
|
||||
@@ -19,6 +14,5 @@ const clearAuthenticateError = () => ({
|
||||
|
||||
export default {
|
||||
authenticate,
|
||||
authenticateUsingOidc,
|
||||
clearAuthenticateError,
|
||||
};
|
||||
|
||||
+7
-3
@@ -1,11 +1,15 @@
|
||||
import React from 'react';
|
||||
import ReactDOM from 'react-dom/client';
|
||||
|
||||
import Config from './constants/Config';
|
||||
import store from './store';
|
||||
import history from './history';
|
||||
import Root from './components/Root';
|
||||
|
||||
import './i18n';
|
||||
|
||||
const root = ReactDOM.createRoot(document.getElementById('root'));
|
||||
root.render(React.createElement(Root, { store, history }));
|
||||
fetch(`${Config.SERVER_BASE_URL}/api/appconfig`).then((response) => {
|
||||
response.json().then((config) => {
|
||||
const root = ReactDOM.createRoot(document.getElementById('root'));
|
||||
root.render(React.createElement(Root, { store, history, config }));
|
||||
});
|
||||
});
|
||||
|
||||
@@ -0,0 +1,233 @@
|
||||
export default {
|
||||
format: {
|
||||
date: 'M/d/yyyy',
|
||||
time: 'p',
|
||||
dateTime: '$t(format:date) $t(format:time)',
|
||||
longDate: 'MMM d',
|
||||
longDateTime: "MMMM d 'at' p",
|
||||
},
|
||||
|
||||
translation: {
|
||||
common: {
|
||||
aboutPlanka: 'حول بلانكا',
|
||||
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: 'اللون',
|
||||
createBoard_title: 'إنشاء لوحة',
|
||||
createLabel_title: 'إنشاء علامة',
|
||||
createNewOneOrSelectExistingOne: 'إنشاء واحدة جديدة أو اختيار<br />واحدة موجودة بالفعل',
|
||||
createProject_title: 'إنشاء مشروع',
|
||||
createTextFile_title: 'إنشاء ملف نصي',
|
||||
currentPassword: 'كلمة المرور الحالية',
|
||||
dangerZone_title: 'المنطقة الخطرة',
|
||||
date: 'التاريخ',
|
||||
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: 'من تريلو',
|
||||
general: 'عام',
|
||||
hours: 'ساعات',
|
||||
importBoard_title: 'استيراد اللوحة',
|
||||
invalidCurrentPassword: 'كلمة المرور الحالية غير صالحة',
|
||||
labels: 'العلامات',
|
||||
language: 'اللغة',
|
||||
leaveBoard_title: 'مغادرة اللوحة',
|
||||
leaveProject_title: 'مغادرة المشروع',
|
||||
list: 'القائمة',
|
||||
listActions_title: 'إجراءات القائمة',
|
||||
managers: 'المديرين',
|
||||
members: 'الأعضاء',
|
||||
minutes: 'دقائق',
|
||||
moveCard_title: 'نقل البطاقة',
|
||||
name: 'الاسم',
|
||||
newEmail: 'البريد الإلكتروني الجديد',
|
||||
newPassword: 'كلمة المرور الجديدة',
|
||||
newUsername: 'اسم المستخدم الجديد',
|
||||
noConnectionToServer: 'لا يوجد اتصال بالخادم',
|
||||
noBoards: 'لا توجد لوحات',
|
||||
noLists: 'لا توجد قوائم',
|
||||
noProjects: 'لا توجد مشاريع',
|
||||
notifications: 'الإشعارات',
|
||||
noUnreadNotifications: 'لا توجد إشعارات غير مقروءة',
|
||||
openBoard_title: 'فتح اللوحة',
|
||||
optional_inline: 'اختياري',
|
||||
organization: 'المنظمة',
|
||||
phone: 'الهاتف',
|
||||
preferences: 'التفضيلات',
|
||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||
'نصيحة: اضغط على Ctrl-V (Cmd-V على ماك) لإضافة مرفق من الحافظة',
|
||||
project: 'المشروع',
|
||||
projectNotFound_title: 'المشروع غير موجود',
|
||||
removeManager_title: 'إزالة المدير',
|
||||
removeMember_title: 'إزالة العضو',
|
||||
searchLabels: 'البحث في العلامات...',
|
||||
searchMembers: 'البحث في الأعضاء...',
|
||||
searchUsers: 'البحث في المستخدمين...',
|
||||
seconds: 'ثواني',
|
||||
selectBoard: 'اختيار اللوحة',
|
||||
selectList: 'اختيار القائمة',
|
||||
selectPermissions_title: 'اختيار الصلاحيات',
|
||||
selectProject: 'اختيار المشروع',
|
||||
settings: 'الإعدادات',
|
||||
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: 'إضافة مستخدم',
|
||||
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: 'حذف المستخدم',
|
||||
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: 'عرض مرفقات أقل',
|
||||
start: 'بدء',
|
||||
stop: 'إيقاف',
|
||||
subscribe: 'الاشتراك',
|
||||
unsubscribe: 'إلغاء الاشتراك',
|
||||
uploadNewAvatar: 'تحميل صورة رمزية جديدة',
|
||||
uploadNewImage: 'تحميل صورة جديدة',
|
||||
},
|
||||
},
|
||||
};
|
||||
@@ -0,0 +1,11 @@
|
||||
import merge from 'lodash/merge';
|
||||
|
||||
import login from './login';
|
||||
import core from './core';
|
||||
|
||||
export default {
|
||||
language: 'ar',
|
||||
country: 'ar',
|
||||
name: 'Arabic',
|
||||
embeddedLocale: merge(login, core),
|
||||
};
|
||||
@@ -0,0 +1,20 @@
|
||||
export default {
|
||||
translation: {
|
||||
common: {
|
||||
emailOrUsername: 'البريد الإلكتروني أو اسم المستخدم',
|
||||
invalidEmailOrUsername: 'بريد إلكتروني أو اسم مستخدم غير صالح',
|
||||
invalidPassword: 'كلمة مرور غير صالحة',
|
||||
logInToPlanka: 'تسجيل الدخول إلى بلانكا',
|
||||
noInternetConnection: 'لا يوجد اتصال بالإنترنت',
|
||||
pageNotFound_title: 'الصفحة غير موجودة',
|
||||
password: 'كلمة المرور',
|
||||
projectManagement: 'إدارة المشروع',
|
||||
serverConnectionFailed: 'فشل الاتصال بالخادم',
|
||||
unknownError: 'خطأ غير معروف، حاول مرة أخرى لاحقًا',
|
||||
},
|
||||
|
||||
action: {
|
||||
logIn: 'تسجيل الدخول',
|
||||
},
|
||||
},
|
||||
};
|
||||
@@ -0,0 +1,235 @@
|
||||
export default {
|
||||
format: {
|
||||
date: 'M/d/yyyy',
|
||||
time: 'p',
|
||||
dateTime: '$t(format:date) $t(format:time)',
|
||||
longDate: 'MMM d',
|
||||
longDateTime: "MMMM d 'তে' p",
|
||||
},
|
||||
|
||||
translation: {
|
||||
common: {
|
||||
aboutPlanka: 'প্লাঙ্কা সম্পর্কে',
|
||||
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: 'রং',
|
||||
createBoard_title: 'বোর্ড তৈরি করুন',
|
||||
createLabel_title: 'লেবেল তৈরি করুন',
|
||||
createNewOneOrSelectExistingOne: 'নতুন তৈরি করুন অথবা<br />বিদ্যমান একটি নির্বাচন করুন',
|
||||
createProject_title: 'প্রকল্প তৈরি করুন',
|
||||
createTextFile_title: 'টেক্সট ফাইল তৈরি করুন',
|
||||
currentPassword: 'বর্তমান পাসওয়ার্ড',
|
||||
dangerZone_title: 'আপত্তি জোন',
|
||||
date: 'তারিখ',
|
||||
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: 'ট্রেলো থেকে',
|
||||
general: 'সাধারণ',
|
||||
hours: 'ঘণ্টা',
|
||||
importBoard_title: 'বোর্ড আমদানি করুন',
|
||||
invalidCurrentPassword: 'বর্তমান পাসওয়ার্ড অবৈধ',
|
||||
labels: 'লেবেল',
|
||||
language: 'ভাষা',
|
||||
leaveBoard_title: 'বোর্ড ত্যাগ করুন',
|
||||
leaveProject_title: 'প্রকল্প ত্যাগ করুন',
|
||||
list: 'তালিকা',
|
||||
listActions_title: 'তালিকা ক্রিয়াকলাপ',
|
||||
managers: 'ম্যানেজারসমূহ',
|
||||
members: 'সদস্যগণ',
|
||||
minutes: 'মিনিট',
|
||||
moveCard_title: 'কার্ড সরান',
|
||||
name: 'নাম',
|
||||
newEmail: 'নতুন ইমেইল',
|
||||
newPassword: 'নতুন পাসওয়ার্ড',
|
||||
newUsername: 'নতুন ব্যবহারকারীর নাম',
|
||||
noConnectionToServer: 'সার্ভারে সংযোগ নেই',
|
||||
noBoards: 'কোন বোর্ড নেই',
|
||||
noLists: 'কোন তালিকা নেই',
|
||||
noProjects: 'কোন প্রকল্প নেই',
|
||||
notifications: 'বিজ্ঞপ্তি',
|
||||
noUnreadNotifications: 'কোন অপঠিত বিজ্ঞপ্তি নেই',
|
||||
openBoard_title: 'বোর্ড খুলুন',
|
||||
optional_inline: 'ঐচ্ছিক',
|
||||
organization: 'সংগঠন',
|
||||
phone: 'ফোন',
|
||||
preferences: 'পছন্দ',
|
||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||
'প্রয়োজনীয়: Ctrl-V (Mac উপর Cmd-V) চাপুন যেটাতে ক্লিপবোর্ড থেকে সংযুক্তি যোগ করতে পারবেন',
|
||||
project: 'প্রকল্প',
|
||||
projectNotFound_title: 'প্রকল্প পাওয়া যায়নি',
|
||||
removeManager_title: 'ম্যানেজার সরান',
|
||||
removeMember_title: 'সদস্য সরান',
|
||||
searchLabels: 'লেবেল খুঁজুন...',
|
||||
searchMembers: 'সদস্য খুঁজুন...',
|
||||
searchUsers: 'ব্যবহারকারী খুঁজুন...',
|
||||
seconds: 'সেকেন্ড',
|
||||
selectBoard: 'বোর্ড নির্বাচন করুন',
|
||||
selectList: 'তালিকা নির্বাচন করুন',
|
||||
selectPermissions_title: 'অনুমতি নির্বাচন করুন',
|
||||
selectProject: 'প্রকল্প নির্বাচন করুন',
|
||||
settings: 'সেটিংস',
|
||||
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: 'ব্যবহারকারী যোগ করুন',
|
||||
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: 'ব্যবহারকারী মুছে ফেলুন',
|
||||
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: 'কম সংযুক্তি দেখান',
|
||||
start: 'শুরু',
|
||||
stop: 'বন্ধ',
|
||||
subscribe: 'সাবস্ক্রাইব করুন',
|
||||
unsubscribe: 'সাবস্ক্রাইব বাতিল করুন',
|
||||
uploadNewAvatar: 'নতুন অবতার আপলোড করুন',
|
||||
uploadNewImage: 'নতুন চিত্র আপলোড করুন',
|
||||
},
|
||||
},
|
||||
};
|
||||
@@ -0,0 +1,11 @@
|
||||
import merge from 'lodash/merge';
|
||||
|
||||
import login from './login';
|
||||
import core from './core';
|
||||
|
||||
export default {
|
||||
language: 'bn',
|
||||
country: 'bn',
|
||||
name: 'Bengali',
|
||||
embeddedLocale: merge(login, core),
|
||||
};
|
||||
@@ -0,0 +1,20 @@
|
||||
export default {
|
||||
translation: {
|
||||
common: {
|
||||
emailOrUsername: 'ইমেইল বা ব্যবহারকারীর নাম',
|
||||
invalidEmailOrUsername: 'অবৈধ ইমেইল বা ব্যবহারকারীর নাম',
|
||||
invalidPassword: 'অবৈধ পাসওয়ার্ড',
|
||||
logInToPlanka: 'Planka-তে লগ ইন করুন',
|
||||
noInternetConnection: 'ইন্টারনেট সংযোগ নেই',
|
||||
pageNotFound_title: 'পেজ পাওয়া যায়নি',
|
||||
password: 'পাসওয়ার্ড',
|
||||
projectManagement: 'প্রকল্প পরিচালনা',
|
||||
serverConnectionFailed: 'সার্ভার সংযোগ ব্যর্থ হয়েছে',
|
||||
unknownError: 'অজানা ত্রুটি, পরে আবার চেষ্টা করুন',
|
||||
},
|
||||
|
||||
action: {
|
||||
logIn: 'লগ ইন করুন',
|
||||
},
|
||||
},
|
||||
};
|
||||
@@ -24,7 +24,7 @@ export default {
|
||||
administrator: 'Administrátor',
|
||||
all: 'Vše',
|
||||
allChangesWillBeAutomaticallySavedAfterConnectionRestored:
|
||||
'Všechny změny budou automaticky uloženy<br />po obnově spojení.',
|
||||
'Všechny změny budou automaticky uloženy<br />po obnově spojení',
|
||||
areYouSureYouWantToDeleteThisAttachment: 'Opravdu chcete smazat tuto přílohu?',
|
||||
areYouSureYouWantToDeleteThisBoard: 'Opravdu chcete smazat tuto tabuli?',
|
||||
areYouSureYouWantToDeleteThisCard: 'Opravdu chcete smazat tuto kartu?',
|
||||
@@ -47,15 +47,15 @@ export default {
|
||||
board: 'Tabule',
|
||||
boardNotFound_title: 'Tabule nenalezena',
|
||||
canComment: 'Může komentovat',
|
||||
canEditContentOfBoard: 'Může upravovat obsah tabule.',
|
||||
canOnlyViewBoard: 'Může zobrazit pouze tabuli.',
|
||||
canEditContentOfBoard: 'Může upravovat obsah tabule',
|
||||
canOnlyViewBoard: 'Může zobrazit pouze tabuli',
|
||||
cardActions_title: 'Akce na kartě',
|
||||
cardNotFound_title: 'Karta nenalezena',
|
||||
cardOrActionAreDeleted: 'Karta nebo akce je smazána.',
|
||||
cardOrActionAreDeleted: 'Karta nebo akce je smazána',
|
||||
color: 'Barva',
|
||||
createBoard_title: 'Vytvořit tabuli',
|
||||
createLabel_title: 'Vytvořit štítek',
|
||||
createNewOneOrSelectExistingOne: 'Vytvořit nový nebo vyberte<br />již existující.',
|
||||
createNewOneOrSelectExistingOne: 'Vytvořit nový nebo vyberte<br />již existující',
|
||||
createProject_title: 'Vytvořit projekt',
|
||||
createTextFile_title: 'Vytvořit textový soubor',
|
||||
currentPassword: 'Aktuální heslo',
|
||||
@@ -128,7 +128,7 @@ export default {
|
||||
phone: 'Telefon',
|
||||
preferences: 'Volby',
|
||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||
'Tip: dejte Ctrl-V (Cmd-V na Mac) pro vložení přílohy ze schránky.',
|
||||
'Tip: dejte Ctrl-V (Cmd-V na Mac) pro vložení přílohy ze schránky',
|
||||
project: 'Projekt',
|
||||
projectNotFound_title: 'Projekt nenalezen',
|
||||
removeManager_title: 'Odstranit vedoucího',
|
||||
@@ -146,7 +146,7 @@ export default {
|
||||
subscribeToMyOwnCardsByDefault: 'Ve výchozím nastavení odebírat vlastní karty',
|
||||
taskActions_title: 'Akce na úkolu',
|
||||
tasks: 'Úkoly',
|
||||
thereIsNoPreviewAvailableForThisAttachment: 'Pro tuto přílohu není k dispozici žádný náhled.',
|
||||
thereIsNoPreviewAvailableForThisAttachment: 'Pro tuto přílohu není k dispozici žádný náhled',
|
||||
time: 'Čas',
|
||||
title: 'Titulek',
|
||||
userActions_title: 'Akce na uživateli',
|
||||
|
||||
@@ -23,7 +23,7 @@ export default {
|
||||
administrator: 'Administrator',
|
||||
all: 'Alle',
|
||||
allChangesWillBeAutomaticallySavedAfterConnectionRestored:
|
||||
'Alle ændringer vil automatisk blive gemt<br />ved genforbindelse.',
|
||||
'Alle ændringer vil automatisk blive gemt<br />ved genforbindelse',
|
||||
areYouSureYouWantToDeleteThisAttachment: 'Vil du slette den vedhæftede fil?',
|
||||
areYouSureYouWantToDeleteThisBoard: 'Vil du slette dette bræt?',
|
||||
areYouSureYouWantToDeleteThisCard: 'Vil du slette dette kort?',
|
||||
@@ -46,11 +46,11 @@ export default {
|
||||
boardNotFound_title: 'Bræt ikke fundet',
|
||||
cardActions_title: 'Korthandlinger',
|
||||
cardNotFound_title: 'Kort ikke fundet',
|
||||
cardOrActionAreDeleted: 'Kort eller handling er slettet.',
|
||||
cardOrActionAreDeleted: 'Kort eller handling er slettet',
|
||||
color: 'Farve',
|
||||
createBoard_title: 'Opret bræt',
|
||||
createLabel_title: 'Opret mærkat',
|
||||
createNewOneOrSelectExistingOne: 'Lav en ny eller marker<br />en eksisterende.',
|
||||
createNewOneOrSelectExistingOne: 'Lav en ny eller marker<br />en eksisterende',
|
||||
createProject_title: 'Opret projekt',
|
||||
createTextFile_title: 'Opret tekstfil',
|
||||
currentPassword: 'Nuværende løsen',
|
||||
@@ -109,14 +109,14 @@ export default {
|
||||
noLists: 'Ingen lister',
|
||||
noProjects: 'Ingen projekter',
|
||||
notifications: 'Notifikationer',
|
||||
noUnreadNotifications: 'Ingen ulæste notifikationer.',
|
||||
noUnreadNotifications: 'Ingen ulæste notifikationer',
|
||||
openBoard_title: 'Åben bræt',
|
||||
optional_inline: 'valgfri',
|
||||
organization: 'Organisation',
|
||||
phone: 'Telefon',
|
||||
preferences: 'Præferencer',
|
||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||
'Tip: Tryk Ctrl-V (Cmd-V på Mac) for at vedhæfte direkte fra udklipsholder.',
|
||||
'Tip: Tryk Ctrl-V (Cmd-V på Mac) for at vedhæfte direkte fra udklipsholder',
|
||||
project: 'Projekt',
|
||||
projectNotFound_title: 'Projekt ej fundet',
|
||||
removeManager_title: 'Fjern projektleder',
|
||||
|
||||
@@ -51,7 +51,7 @@ export default {
|
||||
boardNotFound_title: 'Board nicht gefunden',
|
||||
cardActions_title: 'Kartenaktionen',
|
||||
cardNotFound_title: 'Karte nicht gefunden',
|
||||
cardOrActionAreDeleted: 'Karte oder Aktion wurden gelöscht.',
|
||||
cardOrActionAreDeleted: 'Karte oder Aktion wurden gelöscht',
|
||||
color: 'Farbe',
|
||||
createBoard_title: 'Board erstellen',
|
||||
createLabel_title: 'Label erstellen',
|
||||
@@ -117,14 +117,14 @@ export default {
|
||||
noLists: 'Keine Listen',
|
||||
noProjects: 'Keine Projekte',
|
||||
notifications: 'Benachrichtigungen',
|
||||
noUnreadNotifications: 'Keine ungelesenen Benachrichtigungen.',
|
||||
noUnreadNotifications: 'Keine ungelesenen Benachrichtigungen',
|
||||
openBoard_title: 'Board öffnen',
|
||||
optional_inline: 'Optional',
|
||||
organization: 'Organisation',
|
||||
phone: 'Telefon',
|
||||
preferences: 'Voreinstellungen',
|
||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||
'Tipp: Drücken Sie STRG-V (Cmd-V auf Mac), um einen Anhang aus der Zwischenablage hinzuzufügen.',
|
||||
'Tipp: Drücken Sie STRG-V (Cmd-V auf Mac), um einen Anhang aus der Zwischenablage hinzuzufügen',
|
||||
project: 'Projekt',
|
||||
projectNotFound_title: 'Projekt nicht gefunden',
|
||||
removeManager_title: 'Manager entfernen',
|
||||
|
||||
@@ -20,7 +20,7 @@ export default {
|
||||
administrator: 'Administrator',
|
||||
all: 'All',
|
||||
allChangesWillBeAutomaticallySavedAfterConnectionRestored:
|
||||
'All changes will be automatically saved<br />after connection restored.',
|
||||
'All changes will be automatically saved<br />after connection restored',
|
||||
areYouSureYouWantToDeleteThisAttachment: 'Are you sure you want to delete this attachment?',
|
||||
areYouSureYouWantToDeleteThisBoard: 'Are you sure you want to delete this board?',
|
||||
areYouSureYouWantToDeleteThisCard: 'Are you sure you want to delete this card?',
|
||||
@@ -43,15 +43,15 @@ export default {
|
||||
board: 'Board',
|
||||
boardNotFound_title: 'Board Not Found',
|
||||
canComment: 'Can comment',
|
||||
canEditContentOfBoard: 'Can edit the content of the board.',
|
||||
canOnlyViewBoard: 'Can only view the board.',
|
||||
canEditContentOfBoard: 'Can edit the content of the board',
|
||||
canOnlyViewBoard: 'Can only view the board',
|
||||
cardActions_title: 'Card Actions',
|
||||
cardNotFound_title: 'Card Not Found',
|
||||
cardOrActionAreDeleted: 'Card or action are deleted.',
|
||||
cardOrActionAreDeleted: 'Card or action are deleted',
|
||||
color: 'Color',
|
||||
createBoard_title: 'Create Board',
|
||||
createLabel_title: 'Create Label',
|
||||
createNewOneOrSelectExistingOne: 'Create a new one or select<br />an existing one.',
|
||||
createNewOneOrSelectExistingOne: 'Create a new one or select<br />an existing one',
|
||||
createProject_title: 'Create Project',
|
||||
createTextFile_title: 'Create Text File',
|
||||
currentPassword: 'Current password',
|
||||
@@ -84,7 +84,7 @@ export default {
|
||||
editUsername_title: 'Edit Username',
|
||||
email: 'E-mail',
|
||||
emailAlreadyInUse: 'E-mail already in use',
|
||||
enterCardTitle: 'Enter card title... [Ctrl+Enter] to auto-open.',
|
||||
enterCardTitle: 'Enter card title... [Ctrl+Enter] to auto-open',
|
||||
enterDescription: 'Enter description...',
|
||||
enterFilename: 'Enter filename',
|
||||
enterListTitle: 'Enter list title...',
|
||||
@@ -117,14 +117,14 @@ export default {
|
||||
noLists: 'No lists',
|
||||
noProjects: 'No projects',
|
||||
notifications: 'Notifications',
|
||||
noUnreadNotifications: 'No unread notifications.',
|
||||
noUnreadNotifications: 'No unread notifications',
|
||||
openBoard_title: 'Open Board',
|
||||
optional_inline: 'optional',
|
||||
organization: 'Organization',
|
||||
phone: 'Phone',
|
||||
preferences: 'Preferences',
|
||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||
'Tip: press Ctrl-V (Cmd-V on Mac) to add an attachment from the clipboard.',
|
||||
'Tip: press Ctrl-V (Cmd-V on Mac) to add an attachment from the clipboard',
|
||||
project: 'Project',
|
||||
projectNotFound_title: 'Project Not Found',
|
||||
removeManager_title: 'Remove Manager',
|
||||
@@ -143,7 +143,7 @@ export default {
|
||||
taskActions_title: 'Task Actions',
|
||||
tasks: 'Tasks',
|
||||
thereIsNoPreviewAvailableForThisAttachment:
|
||||
'There is no preview available for this attachment.',
|
||||
'There is no preview available for this attachment',
|
||||
time: 'Time',
|
||||
title: 'Title',
|
||||
userActions_title: 'User Actions',
|
||||
|
||||
@@ -11,12 +11,10 @@ export default {
|
||||
projectManagement: 'Project management',
|
||||
serverConnectionFailed: 'Server connection failed',
|
||||
unknownError: 'Unknown error, try again later',
|
||||
useSingleSignOn: 'Use single sign-on',
|
||||
},
|
||||
|
||||
action: {
|
||||
logIn: 'Log in',
|
||||
logInWithSSO: 'Log in with SSO',
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
@@ -22,7 +22,7 @@ export default {
|
||||
administrator: 'Administrador',
|
||||
all: 'Todos',
|
||||
allChangesWillBeAutomaticallySavedAfterConnectionRestored:
|
||||
'Todos los cambios serán automáticamente guardados<br />después de que se restaure la conexión.',
|
||||
'Todos los cambios serán automáticamente guardados<br />después de que se restaure la conexión',
|
||||
areYouSureYouWantToDeleteThisAttachment: '¿Estás seguro de que quieres borrar este adjunto?',
|
||||
areYouSureYouWantToDeleteThisBoard: '¿Estás seguro de que quieres borrar este tablero?',
|
||||
areYouSureYouWantToDeleteThisCard: '¿Estás seguro de que quieres borrar esta tarjeta?',
|
||||
@@ -41,11 +41,11 @@ export default {
|
||||
boardNotFound_title: 'Tablero no encontrado',
|
||||
cardActions_title: 'Acciones de las tarjetas',
|
||||
cardNotFound_title: 'tarjeta no encontrada',
|
||||
cardOrActionAreDeleted: 'La tarjeta o la acción está eliminada.',
|
||||
cardOrActionAreDeleted: 'La tarjeta o la acción está eliminada',
|
||||
color: 'Color',
|
||||
createBoard_title: 'Crear Tablero',
|
||||
createLabel_title: 'Crear Etiqueta',
|
||||
createNewOneOrSelectExistingOne: 'Crear uno nuevo o seleccionar<br />uno existente.',
|
||||
createNewOneOrSelectExistingOne: 'Crear uno nuevo o seleccionar<br /> uno existente',
|
||||
createProject_title: 'Crear Proyecto',
|
||||
createTextFile_title: 'Crear archivo de Texto',
|
||||
currentPassword: 'Contraseña Actual',
|
||||
@@ -106,7 +106,7 @@ export default {
|
||||
phone: 'Teléfono',
|
||||
preferences: 'Preferencias',
|
||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||
'Tip: presiona Ctrl-V (Cmd-V en Mac) para añadir adjuntos desde el portapapeles.',
|
||||
'Tip: presiona Ctrl-V (Cmd-V en Mac) para añadir adjuntos desde el portapapeles',
|
||||
project: 'Proyecto',
|
||||
projectNotFound_title: 'Proyecto no encontrado',
|
||||
removeMember_title: 'Remover Miembro',
|
||||
|
||||
@@ -22,7 +22,7 @@ export default {
|
||||
administrator: 'Administrateur',
|
||||
all: 'Tout',
|
||||
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?',
|
||||
areYouSureYouWantToDeleteThisBoard: 'Êtes-vous sûr de vouloir supprimer ce forum?',
|
||||
areYouSureYouWantToDeleteThisCard: 'Voulez-vous vraiment supprimer cette carte?',
|
||||
@@ -41,11 +41,11 @@ export default {
|
||||
boardNotFound_title: 'Carte non trouvée',
|
||||
cardActions_title: 'Actions sur la carte',
|
||||
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',
|
||||
createBoard_title: 'Créer un tableau',
|
||||
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',
|
||||
createTextFile_title: 'Créer un fichier texte',
|
||||
currentPassword: 'Mot de passe actuel',
|
||||
@@ -73,12 +73,12 @@ export default {
|
||||
editUsername_title: "Modifier le nom d'utilisateur",
|
||||
email: 'E-mail',
|
||||
emailAlreadyInUse: 'Email déjà utilisé',
|
||||
enterCardTitle: 'Entrer le titre de la carte...',
|
||||
enterDescription: 'Entrez la description...',
|
||||
enterCardTitle: 'Entrer le titre de la carte ...',
|
||||
enterDescription: 'Entrez la description ...',
|
||||
enterFilename: 'Entrez le nom du fichier',
|
||||
enterListTitle: 'Entrer le titre de la liste...',
|
||||
enterListTitle: 'Entrer le titre de la liste ...',
|
||||
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',
|
||||
filterByMembers_title: 'Filtrer par membres',
|
||||
fromComputer_title: "Depuis l'ordinateur",
|
||||
@@ -99,7 +99,7 @@ export default {
|
||||
noLists: 'Pas de listes',
|
||||
noProjects: 'Pas de projets',
|
||||
notifications: 'Notifications',
|
||||
noUnreadNotifications: 'Aucune notification non lue.',
|
||||
noUnreadNotifications: 'Aucune notification non lue',
|
||||
openBoard_title: 'Open Board',
|
||||
optional_inline: 'optionnel',
|
||||
organization: 'Organisation',
|
||||
|
||||
@@ -0,0 +1,236 @@
|
||||
export default {
|
||||
format: {
|
||||
date: 'd/M/yyyy',
|
||||
time: 'A',
|
||||
dateTime: '$t(format:date), $t(format:time)',
|
||||
longDate: 'd MMM',
|
||||
longDateTime: "d MMMM 'को' $t(format:time)",
|
||||
},
|
||||
|
||||
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: 'रंग',
|
||||
createBoard_title: 'बोर्ड बनाएं',
|
||||
createLabel_title: 'लेबल बनाएं',
|
||||
createNewOneOrSelectExistingOne: 'नया बनाएं या<br />मौजूदा चुनें',
|
||||
createProject_title: 'परियोजना बनाएं',
|
||||
createTextFile_title: 'टेक्स्ट फ़ाइल बनाएं',
|
||||
currentPassword: 'वर्तमान पासवर्ड',
|
||||
dangerZone_title: 'खतरे का क्षेत्र',
|
||||
date: 'तारीख',
|
||||
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: 'परियोजना छोड़ें',
|
||||
list: 'सूची',
|
||||
listActions_title: 'सूची क्रियाएँ',
|
||||
managers: 'मैनेजर',
|
||||
members: 'सदस्य',
|
||||
minutes: 'मिनट',
|
||||
moveCard_title: 'कार्ड को ले जाएं',
|
||||
name: 'नाम',
|
||||
newEmail: 'नई ईमेल',
|
||||
newPassword: 'नया पासवर्ड',
|
||||
newUsername: 'नया उपयोगकर्ता नाम',
|
||||
noConnectionToServer: 'सर्वर से कोई जुड़ाव नहीं है',
|
||||
noBoards: 'कोई बोर्ड नहीं',
|
||||
noLists: 'कोई सूची नहीं',
|
||||
noProjects: 'कोई परियोजनाएँ नहीं',
|
||||
notifications: 'सूचनाएँ',
|
||||
noUnreadNotifications: 'कोई अपठित सूचनाएँ नहीं हैं',
|
||||
openBoard_title: 'बोर्ड खोलें',
|
||||
optional_inline: 'वैकल्पिक',
|
||||
organization: 'संगठन',
|
||||
phone: 'फ़ोन',
|
||||
preferences: 'प्राथमिकताएँ',
|
||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||
'सुझाव: क्लिपबोर्ड से अटैचमेंट जोड़ने के लिए Ctrl-V (Mac पर Cmd-V) दबाएं',
|
||||
project: 'परियोजना',
|
||||
projectNotFound_title: 'परियोजना नहीं मिली',
|
||||
removeManager_title: 'मैनेजर हटाएं',
|
||||
removeMember_title: 'सदस्य हटाएं',
|
||||
searchLabels: 'लेबल खोजें...',
|
||||
searchMembers: 'सदस्य खोजें...',
|
||||
searchUsers: 'उपयोगकर्ताओं को खोजें...',
|
||||
seconds: 'सेकंड्स',
|
||||
selectBoard: 'बोर्ड चुनें',
|
||||
selectList: 'सूची चुनें',
|
||||
selectPermissions_title: 'अनुमतियाँ चुनें',
|
||||
selectProject: 'परियोजना चुनें',
|
||||
settings: 'सेटिंग्स',
|
||||
stopwatch: 'स्टॉपवॉच',
|
||||
subscribeToMyOwnCardsByDefault: 'डिफ़ॉल्ट रूप से मेरे अपने कार्डों की सदस्यता लें',
|
||||
taskActions_title: 'कार्य क्रियाएँ',
|
||||
tasks: 'कार्य',
|
||||
thereIsNoPreviewAvailableForThisAttachment:
|
||||
'इस अटैचमेंट के लिए कोई पूर्वावलोकन उपलब्ध नहीं है',
|
||||
time: 'समय',
|
||||
title: 'शीर्षक',
|
||||
userActions_title: 'उपयोगकर्ता क्रियाएँ',
|
||||
userAddedThisCardToList: '<0>{{user}}</0><1> ने इस कार्ड को {{list}} में जोड़ा</1>',
|
||||
userLeftNewCommentToCard:
|
||||
'{{user}} ने कार्ड <2>{{card}}</2> पर नई टिप्पणी छोड़ी «{{comment}}»',
|
||||
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: 'उपयोगकर्ता जोड़ें',
|
||||
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: 'उपयोगकर्ता हटाएं',
|
||||
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: 'कम अटैचमेंट दिखाएं',
|
||||
start: 'शुरू करें',
|
||||
stop: 'रोकें',
|
||||
subscribe: 'सदस्यता लें',
|
||||
unsubscribe: 'सदस्यता रद्द करें',
|
||||
uploadNewAvatar: 'नया अवतार अपलोड करें',
|
||||
uploadNewImage: 'नई छवि अपलोड करें',
|
||||
},
|
||||
},
|
||||
};
|
||||
@@ -0,0 +1,11 @@
|
||||
import merge from 'lodash/merge';
|
||||
|
||||
import login from './login';
|
||||
import core from './core';
|
||||
|
||||
export default {
|
||||
language: 'hi',
|
||||
country: 'hi',
|
||||
name: 'Hindi',
|
||||
embeddedLocale: merge(login, core),
|
||||
};
|
||||
@@ -0,0 +1,20 @@
|
||||
export default {
|
||||
translation: {
|
||||
common: {
|
||||
emailOrUsername: 'ईमेल या उपयोगकर्ता नाम',
|
||||
invalidEmailOrUsername: 'अवैध ईमेल या उपयोगकर्ता नाम',
|
||||
invalidPassword: 'अवैध पासवर्ड',
|
||||
logInToPlanka: 'Planka में लॉग इन करें',
|
||||
noInternetConnection: 'कोई इंटरनेट कनेक्शन नहीं',
|
||||
pageNotFound_title: 'पृष्ठ नहीं मिला',
|
||||
password: 'पासवर्ड',
|
||||
projectManagement: 'परियोजना प्रबंधन',
|
||||
serverConnectionFailed: 'सर्वर कनेक्शन विफल हो गया',
|
||||
unknownError: 'अज्ञात त्रुटि, बाद में पुनः प्रयास करें',
|
||||
},
|
||||
|
||||
action: {
|
||||
logIn: 'लॉग इन करें',
|
||||
},
|
||||
},
|
||||
};
|
||||
@@ -1,14 +1,17 @@
|
||||
import ar from './ar';
|
||||
import bn from './bn';
|
||||
import cs from './cs';
|
||||
import da from './da';
|
||||
import de from './de';
|
||||
import en from './en';
|
||||
import es from './es';
|
||||
import fr from './fr';
|
||||
import hi from './hi';
|
||||
import it from './it';
|
||||
import ja from './ja';
|
||||
import ko from './ko';
|
||||
import nl from './nl';
|
||||
import pl from './pl';
|
||||
import ro from './ro';
|
||||
import ru from './ru';
|
||||
import sk from './sk';
|
||||
import sv from './sv';
|
||||
@@ -16,7 +19,7 @@ import tr from './tr';
|
||||
import uz from './uz';
|
||||
import zh from './zh';
|
||||
|
||||
const locales = [cs, da, de, en, es, fr, it, ja, ko, pl, ro, ru, sk, sv, tr, uz, zh];
|
||||
const locales = [ar, bn, cs, da, de, en, es, fr, hi, it, ja, ko, nl, pl, ru, sk, sv, tr, uz, zh];
|
||||
|
||||
export default locales;
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ export default {
|
||||
administrator: 'Amministratore',
|
||||
all: 'tutto',
|
||||
allChangesWillBeAutomaticallySavedAfterConnectionRestored:
|
||||
'All changes will be automatically saved<br />after connection restored.',
|
||||
'All changes will be automatically saved<br />after connection restored',
|
||||
areYouSureYouWantToDeleteThisAttachment: 'Sei sicuro di voler eliminare questo allegato?',
|
||||
areYouSureYouWantToDeleteThisBoard: 'Sei sicuro di voler eliminare questa bacheca?',
|
||||
areYouSureYouWantToDeleteThisCard: 'Sei sicuro di voler eliminare questa card?',
|
||||
@@ -42,15 +42,15 @@ export default {
|
||||
board: 'Bacheca',
|
||||
boardNotFound_title: 'Bacheca non trovata',
|
||||
canComment: 'Può commentare',
|
||||
canEditContentOfBoard: 'Può modificare il contenuto della bacheca.',
|
||||
canOnlyViewBoard: 'Può solo vedere la bacheca.',
|
||||
canEditContentOfBoard: 'Può modificare il contenuto della bacheca',
|
||||
canOnlyViewBoard: 'Può solo vedere la bacheca',
|
||||
cardActions_title: 'Card Azioni',
|
||||
cardNotFound_title: 'Card non trovata',
|
||||
cardOrActionAreDeleted: "La card o l'azione vengono eliminate.",
|
||||
cardOrActionAreDeleted: "La card o l'azione vengono eliminate",
|
||||
color: 'Colore',
|
||||
createBoard_title: 'Crea Bacheca',
|
||||
createLabel_title: 'Crea Etichetta',
|
||||
createNewOneOrSelectExistingOne: 'Crea nuovo o seleziona<br />esistente.',
|
||||
createNewOneOrSelectExistingOne: 'Crea nuovo o seleziona <br /> esistente',
|
||||
createProject_title: 'Crea Progetto',
|
||||
createTextFile_title: 'Create File di Testo',
|
||||
currentPassword: 'Password corrente',
|
||||
@@ -114,14 +114,14 @@ export default {
|
||||
noLists: 'No liste',
|
||||
noProjects: 'No progetti',
|
||||
notifications: 'Notifiche',
|
||||
noUnreadNotifications: 'Nessuna notifica non letta.',
|
||||
noUnreadNotifications: 'Nessuna notifica non letta',
|
||||
openBoard_title: 'Bacheca aperta',
|
||||
optional_inline: 'opzionale',
|
||||
organization: 'Organizazzione',
|
||||
phone: 'Telefono',
|
||||
preferences: 'Preferenze',
|
||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||
'Tip: prmi Ctrl-V (Cmd-V on Mac) per aggiungere un allegato dalla clipboard.',
|
||||
'Tip: prmi Ctrl-V (Cmd-V on Mac) per aggiungere un allegato dalla clipboard',
|
||||
project: 'Progetto',
|
||||
projectNotFound_title: 'Progetto non trovato',
|
||||
removeManager_title: 'Rimuovi Manager',
|
||||
@@ -140,7 +140,7 @@ export default {
|
||||
taskActions_title: 'Task Azioni',
|
||||
tasks: 'Tasks',
|
||||
thereIsNoPreviewAvailableForThisAttachment:
|
||||
'Non è disponibile alcuna anteprima per questo allegato.',
|
||||
'Non è disponibile alcuna anteprima per questo allegato',
|
||||
time: 'Tempo',
|
||||
title: 'Titolo',
|
||||
userActions_title: 'Azioni Utente',
|
||||
|
||||
@@ -8,12 +8,11 @@ export default {
|
||||
time: 'HH:mm',
|
||||
dateTime: '$t(format:date) $t(format:time)',
|
||||
longDate: 'MMMMd日',
|
||||
longDateTime: "MMMMd'日 ' HH:mm",
|
||||
longDateTime: "MMMMd'日 ' HH:MM",
|
||||
},
|
||||
|
||||
translation: {
|
||||
common: {
|
||||
aboutPlanka: 'Plankaについて',
|
||||
account: 'アカウント',
|
||||
actions: 'アクション',
|
||||
addAttachment_title: '添付ファイルを追加',
|
||||
@@ -24,7 +23,7 @@ export default {
|
||||
administrator: '管理者',
|
||||
all: 'すべて',
|
||||
allChangesWillBeAutomaticallySavedAfterConnectionRestored:
|
||||
'全ての変更は接続回復後自動的に保存されます。',
|
||||
'全ての変更は接続回復後自動的に保存されます',
|
||||
areYouSureYouWantToDeleteThisAttachment: 'この添付ファイルを削除してもよろしいですか?',
|
||||
areYouSureYouWantToDeleteThisBoard: 'このボードを削除してもよろしいですか?',
|
||||
areYouSureYouWantToDeleteThisCard: 'このカードを削除してもよろしいですか?',
|
||||
@@ -46,16 +45,13 @@ export default {
|
||||
background: '背景',
|
||||
board: 'ボード',
|
||||
boardNotFound_title: 'ボードが見つかりません',
|
||||
canComment: 'コメントを作成することができます',
|
||||
canEditContentOfBoard: 'ボードコンテンツを修正することができます。',
|
||||
canOnlyViewBoard: 'ボードの読み取りのみ可能です。',
|
||||
cardActions_title: 'カードのアクション',
|
||||
cardNotFound_title: 'カードが見つかりません',
|
||||
cardOrActionAreDeleted: 'カードやアクションが削除されます。',
|
||||
cardOrActionAreDeleted: 'カードやアクションが削除されます',
|
||||
color: '色',
|
||||
createBoard_title: 'ボードを作成',
|
||||
createLabel_title: 'ラベルを作成',
|
||||
createNewOneOrSelectExistingOne: '新規作成もしくは<br />既存のものから選択。',
|
||||
createNewOneOrSelectExistingOne: '新規作成もしくは既存のものから選択',
|
||||
createProject_title: 'プロジェクトを作成',
|
||||
createTextFile_title: 'テキストファイルを作成',
|
||||
currentPassword: '現在のパスワード',
|
||||
@@ -72,38 +68,31 @@ export default {
|
||||
deleteTask_title: 'タスクを削除',
|
||||
deleteUser_title: 'ユーザーを削除',
|
||||
description: '説明',
|
||||
detectAutomatically: '自動的に検知',
|
||||
dropFileToUpload: 'ファイルをドロップしてアップロード',
|
||||
editor: 'エディター',
|
||||
editAttachment_title: '添付ファイルを編集',
|
||||
editAvatar_title: 'アバターを編集',
|
||||
editBoard_title: 'ボードを編集',
|
||||
editDueDate_title: '期限を編集',
|
||||
editEmail_title: 'Eメールを編集',
|
||||
editInformation_title: '情報を編集',
|
||||
editLabel_title: 'ラベルを編集',
|
||||
editPassword_title: 'パスワードを編集',
|
||||
editPermissions_title: '権限を編集',
|
||||
editStopwatch_title: 'タイマーを編集',
|
||||
editUsername_title: 'ユーザー名を編集',
|
||||
email: 'Eメール',
|
||||
emailAlreadyInUse: 'Eメールは既に使われています',
|
||||
enterCardTitle: 'カードのタイトルを入力… [Ctrl+Enter]で自動的に開く。',
|
||||
enterDescription: '説明を入力…',
|
||||
enterFilename: 'ファイル名を入力',
|
||||
enterListTitle: 'リストのタイトルを入力…',
|
||||
enterCardTitle: 'カードのタイトルを入力...',
|
||||
enterDescription: '説明を入力...',
|
||||
enterFilename: 'ファイル名を入力...',
|
||||
enterListTitle: 'リストのタイトルを入力...',
|
||||
enterProjectTitle: 'プロジェクトのタイトルを入力',
|
||||
enterTaskDescription: 'タスクの説明を入力…',
|
||||
enterTaskDescription: 'タスクの説明を入力...',
|
||||
filterByLabels_title: 'ラベルで絞り込む',
|
||||
filterByMembers_title: 'メンバーで絞り込む',
|
||||
fromComputer_title: 'コンピューターから',
|
||||
fromTrello: 'Trelloから',
|
||||
general: '一般',
|
||||
hours: '時間',
|
||||
importBoard_title: 'インポートボード',
|
||||
invalidCurrentPassword: '現在のパスワードが無効',
|
||||
labels: 'ラベル',
|
||||
language: '使用言語',
|
||||
leaveBoard_title: 'ボードから退出',
|
||||
leaveProject_title: 'プロジェクトから退出',
|
||||
list: 'リスト',
|
||||
@@ -121,48 +110,41 @@ export default {
|
||||
noLists: 'リストがありません',
|
||||
noProjects: 'プロジェクトがありません',
|
||||
notifications: '通知',
|
||||
noUnreadNotifications: '未読の通知はありません。',
|
||||
noUnreadNotifications: '未読の通知はありません',
|
||||
openBoard_title: 'ボードを開く',
|
||||
optional_inline: '任意',
|
||||
organization: '組織',
|
||||
phone: '電話番号',
|
||||
preferences: '環境設定',
|
||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||
'ヒント: Ctrl-V(MacではCmd-V)を押して、クリップボードから添付ファイルを追加します。',
|
||||
'ヒント: Ctrl-V(MacではCmd-V)を押して、クリップボードから添付ファイルを追加します',
|
||||
project: 'プロジェクト',
|
||||
projectNotFound_title: 'プロジェクトがありません',
|
||||
removeManager_title: 'マネージャーを削除',
|
||||
removeMember_title: 'メンバーを削除',
|
||||
searchLabels: 'ラベルから探す…',
|
||||
searchMembers: 'メンバーから探す…',
|
||||
searchUsers: 'ユーザーから探す…',
|
||||
seconds: '秒',
|
||||
selectBoard: 'ボードを選択',
|
||||
selectList: 'リストを選択',
|
||||
selectPermissions_title: '権限を選択',
|
||||
selectProject: 'プロジェクトを選択',
|
||||
settings: '設定',
|
||||
stopwatch: 'タイマー',
|
||||
subscribeToMyOwnCardsByDefault: '自分のカードをデフォルトで購読する',
|
||||
taskActions_title: 'タスクのアクション',
|
||||
tasks: 'タスク',
|
||||
thereIsNoPreviewAvailableForThisAttachment: 'この添付ファイルにはプレビューがありません。',
|
||||
time: '時間',
|
||||
title: 'タイトル',
|
||||
userActions_title: 'ユーザーのアクション',
|
||||
userAddedThisCardToList: '<0>{{user}}</0> 様が <1>{{list}} をこのカードに追加しました</1>',
|
||||
userAddedThisCardToList: '<0>{{user}}</0> は <1>{{list}} をこのカードに追加しました</1>',
|
||||
userLeftNewCommentToCard:
|
||||
'{{user}} 様が <2> {{card}} </2> に新しいコメント «{{comment}}» を残しました',
|
||||
'{{user}} は <2> {{card}} </2> に新しいコメント «{{comment}}» を残しました',
|
||||
userMovedCardFromListToList:
|
||||
'{{user}} 様が <2> {{card}} </2> を {{fromList}} から {{toList}} に移動しました',
|
||||
'{{user}} は <2> {{card}} </2> を {{fromList}} から {{toList}} に移動しました',
|
||||
userMovedThisCardFromListToList:
|
||||
'<0>{{user}}</0> <1>様がこのカードを {{fromList}} から {{toList}} に移動しました</1>',
|
||||
'<0>{{user}}</0> <1>はこのカードを {{fromList}} から {{toList}} に移動しました</1>',
|
||||
username: 'ユーザー名',
|
||||
usernameAlreadyInUse: 'ユーザー名は既に使われています',
|
||||
users: 'ユーザー',
|
||||
version: 'バージョン',
|
||||
viewer: 'ビューア',
|
||||
writeComment: 'コメントを書く…',
|
||||
writeComment: 'コメントを書く...',
|
||||
},
|
||||
|
||||
action: {
|
||||
@@ -173,7 +155,6 @@ export default {
|
||||
addCard_title: 'カードを追加',
|
||||
addComment: 'コメントを追加',
|
||||
addList: 'リストを追加',
|
||||
addMember: 'メンバーを追加',
|
||||
addMoreDetailedDescription: 'より詳細な説明を追加',
|
||||
addTask: 'タスクを追加',
|
||||
addToCard: 'カードに追加',
|
||||
@@ -203,14 +184,10 @@ export default {
|
||||
editDueDate_title: '期限を編集',
|
||||
editDescription_title: '説明を編集',
|
||||
editEmail_title: 'Eメールを編集',
|
||||
editInformation_title: '情報を編集',
|
||||
editPassword_title: 'パスワードの編集',
|
||||
editPermissions: '権限を編集',
|
||||
editStopwatch_title: 'タイマーの編集',
|
||||
editTitle_title: 'タイトルの編集',
|
||||
editUsername_title: 'ユーザー名の編集',
|
||||
hideDetails: '詳細を隠す',
|
||||
import: 'インポート',
|
||||
leaveBoard: 'ボードから退出',
|
||||
leaveProject: 'プロジェクトから退出',
|
||||
logOut_title: 'ログアウト',
|
||||
@@ -226,7 +203,6 @@ export default {
|
||||
removeMember: 'メンバーを削除',
|
||||
save: '保存',
|
||||
showAllAttachments: '全ての添付ファイルを表示する({{hidden}} 非表示)',
|
||||
showDetails: '詳細を表示',
|
||||
showFewerAttachments: 'テンプファイルの表示数を減らす',
|
||||
start: 'スタート',
|
||||
stop: 'ストップ',
|
||||
|
||||
@@ -5,18 +5,16 @@ export default {
|
||||
invalidEmailOrUsername: 'Eメールまたはユーザー名が無効',
|
||||
invalidPassword: 'パスワードが無効',
|
||||
logInToPlanka: 'Planka にログインする',
|
||||
noInternetConnection: 'インターネットに接続されていません',
|
||||
pageNotFound_title: 'ページが見つかりません',
|
||||
noInternetConnection: 'インターネットに接続されていません。',
|
||||
pageNotFound_title: 'ページが見つかりません。',
|
||||
password: 'パスワード',
|
||||
projectManagement: 'プロジェクト管理',
|
||||
serverConnectionFailed: 'サーバーの接続に失敗',
|
||||
unknownError: '不明なエラーです。後でもう一度試してください。',
|
||||
useSingleSignOn: 'SSOを使用',
|
||||
},
|
||||
|
||||
action: {
|
||||
logIn: 'ログイン',
|
||||
logInWithSSO: 'SSOでログイン',
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
+128
-146
@@ -1,181 +1,167 @@
|
||||
import dateFns from 'date-fns/locale/ko';
|
||||
|
||||
/* Translated by Park Seok Ho */
|
||||
|
||||
export default {
|
||||
dateFns,
|
||||
|
||||
format: {
|
||||
date: 'yyyy/M/d',
|
||||
time: 'a hh시 mm분',
|
||||
time: 'HH:mm',
|
||||
dateTime: '$t(format:date) $t(format:time)',
|
||||
longDate: "MMMMd'일'",
|
||||
longDateTime: "MMMMd'일 ' a hh시 mm분",
|
||||
longDate: 'MMMMd일',
|
||||
longDateTime: "MMMMd'일 ' HH:MM",
|
||||
},
|
||||
|
||||
translation: {
|
||||
common: {
|
||||
aboutPlanka: 'Planka에 대해서',
|
||||
account: '계정',
|
||||
actions: '활동',
|
||||
addAttachment_title: '첨부 파일 추가',
|
||||
addAttachment_title: '첨부파일 추가',
|
||||
addComment: '댓글',
|
||||
addManager_title: '매니저 추가',
|
||||
addMember_title: '멤버 추가',
|
||||
addManager_title: '관리자 추가',
|
||||
addMember_title: '회원 추가',
|
||||
addUser_title: '사용자 추가',
|
||||
administrator: '관리자',
|
||||
all: '모두',
|
||||
administrator: '시스템 관리자',
|
||||
all: 'All',
|
||||
allChangesWillBeAutomaticallySavedAfterConnectionRestored:
|
||||
'연결이 복원되면<br />모든 변경 사항이 자동으로 저장됩니다.',
|
||||
areYouSureYouWantToDeleteThisAttachment: '해당하는 첨부 파일을 삭제하시겠습니까?',
|
||||
areYouSureYouWantToDeleteThisBoard: '해당하는 보드를 삭제하시겠습니까?',
|
||||
areYouSureYouWantToDeleteThisCard: '해당하는 항목카드를 삭제하시겠습니까?',
|
||||
areYouSureYouWantToDeleteThisComment: '해당하는 댓글을 삭제하시겠습니까?',
|
||||
areYouSureYouWantToDeleteThisLabel: '해당하는 라벨을 삭제하시겠습니까?',
|
||||
areYouSureYouWantToDeleteThisList: '해당하는 목록를 삭제하시겠습니까?',
|
||||
areYouSureYouWantToDeleteThisProject: '해당하는 프로젝트를 삭제하시겠습니까?',
|
||||
areYouSureYouWantToDeleteThisTask: '해당하는 업무를 삭제하겠습니까?',
|
||||
areYouSureYouWantToDeleteThisUser: '해당하는 사용자를 삭제하겠습니까?',
|
||||
'모든 변경 사항은 연결이 복원된 후 자동으로 저장됩니다',
|
||||
areYouSureYouWantToDeleteThisAttachment: '첨부 파일을 삭제하시겠습니까?',
|
||||
areYouSureYouWantToDeleteThisBoard: '보드를 삭제하시겠습니까?',
|
||||
areYouSureYouWantToDeleteThisCard: '항목카드를 삭제하시겠습니까?',
|
||||
areYouSureYouWantToDeleteThisComment: '댓글을 삭제하시겠습니까?',
|
||||
areYouSureYouWantToDeleteThisLabel: '라벨을 삭제하시겠습니까?',
|
||||
areYouSureYouWantToDeleteThisList: '리스트를 삭제하시겠습니까?',
|
||||
areYouSureYouWantToDeleteThisProject: '프로젝트를 삭제하시겠습니까?',
|
||||
areYouSureYouWantToDeleteThisTask: '태스트를 삭제하겠습니까?',
|
||||
areYouSureYouWantToDeleteThisUser: '이 유저를 삭제하겠습니까?',
|
||||
areYouSureYouWantToLeaveBoard: '이 보드에서 나가시겠습니까?',
|
||||
areYouSureYouWantToLeaveProject: '이 프로젝트에서 나가시겠습니까?',
|
||||
areYouSureYouWantToRemoveThisManagerFromProject:
|
||||
'해당하는 프로젝트에서 매니저를 제거하시겠습니까?',
|
||||
areYouSureYouWantToRemoveThisMemberFromBoard: '해당하는 멤버를 보드에서 삭제하시겠습니까?',
|
||||
attachment: '첨부',
|
||||
attachments: '첨부 파일',
|
||||
authentication: '인증',
|
||||
background: '배경',
|
||||
areYouSureYouWantToRemoveThisManagerFromProject: '프로젝트에서 관리자를 제거하시겠습니까?',
|
||||
areYouSureYouWantToRemoveThisMemberFromBoard: '이 회원을 보드에서 탈퇴시키겠습니까?',
|
||||
attachment: '첨부파일',
|
||||
attachments: '첨부파일',
|
||||
authentication: '계정 관리',
|
||||
background: 'Background',
|
||||
board: '보드',
|
||||
boardNotFound_title: '보드를 찾을 수 없습니다',
|
||||
canComment: '댓글을 작성할 수 있습니다',
|
||||
canEditContentOfBoard: '보드 콘텐츠를 수정할 수 있습니다.',
|
||||
canOnlyViewBoard: '보드를 읽기만 할 수 있습니다.',
|
||||
cardActions_title: '카드 작업',
|
||||
cardNotFound_title: '카드를 찾을 수 없습니다',
|
||||
cardOrActionAreDeleted: '카드 또는 작업이 삭제되었습니다.',
|
||||
color: '색상',
|
||||
createBoard_title: '보드 생성',
|
||||
boardNotFound_title: '보드를 찾을 수 없습니다.',
|
||||
cardActions_title: 'Card Actions',
|
||||
cardNotFound_title: '항목카드를 찾을 수 없습니다.',
|
||||
cardOrActionAreDeleted: '항목카드 혹은 활동내역이 삭제되었습니다.',
|
||||
color: 'Color',
|
||||
createBoard_title: '보드명칭을 입력하세요.',
|
||||
createLabel_title: '라벨 생성',
|
||||
createNewOneOrSelectExistingOne: '새로 생성하거나<br />기존 항목을 선택하세요.',
|
||||
createNewOneOrSelectExistingOne: '새 항목을 만들거나<br />기존 항목을 선택하세요.',
|
||||
createProject_title: '프로젝트 생성',
|
||||
createTextFile_title: '텍스트 파일 생성',
|
||||
createTextFile_title: 'Text File 생성',
|
||||
currentPassword: '현재 비밀번호',
|
||||
dangerZone_title: '위험 구역',
|
||||
dangerZone_title: 'Danger Zone',
|
||||
date: '날짜',
|
||||
dueDate_title: '마감일',
|
||||
deleteAttachment_title: '첨부 파일 삭제',
|
||||
dueDate_title: '완료일',
|
||||
deleteAttachment_title: '첨부파일 삭제',
|
||||
deleteBoard_title: '보드 삭제',
|
||||
deleteCard_title: '카드 삭제',
|
||||
deleteCard_title: '항목 카드 삭제',
|
||||
deleteComment_title: '댓글 삭제',
|
||||
deleteLabel_title: '라벨 삭제',
|
||||
deleteList_title: '목록 삭제',
|
||||
deleteList_title: '리스트 삭제',
|
||||
deleteProject_title: '프로젝트 삭제',
|
||||
deleteTask_title: '업무 삭제',
|
||||
deleteTask_title: '태스크 삭제',
|
||||
deleteUser_title: '사용자 삭제',
|
||||
description: '설명',
|
||||
detectAutomatically: '자동으로 감지',
|
||||
dropFileToUpload: '업로드할 파일 놓기',
|
||||
editor: '편집기',
|
||||
dropFileToUpload: '업로드 하기 위해서 파일을 Drop 하세요.',
|
||||
editAttachment_title: '첨부 수정',
|
||||
editAvatar_title: '아바타 수정',
|
||||
editAvatar_title: '프로필사진 수정',
|
||||
editBoard_title: '보드 수정',
|
||||
editDueDate_title: '마감일 수정',
|
||||
editEmail_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: 'PC에서',
|
||||
fromTrello: '트렐로에서',
|
||||
general: '일반',
|
||||
editStopwatch_title: '타이머 수정',
|
||||
editUsername_title: '사용자이름 수정',
|
||||
email: '메일',
|
||||
emailAlreadyInUse: '기 가입된 이메일이 존재합니다.',
|
||||
enterCardTitle: '항목카드명을 입력하세요...',
|
||||
enterDescription: '자세한 설명을 작성하세요...',
|
||||
enterFilename: '파일이름을 입력하세요...',
|
||||
enterListTitle: '리스트명을 입력 (예,todo,완료,이슈등...)',
|
||||
enterProjectTitle: '프로젝트명칭을 입력하세요.',
|
||||
enterTaskDescription: '태스크 설명을 입력하세요...',
|
||||
filterByLabels_title: '라벨 검색',
|
||||
filterByMembers_title: '회원으로 검색',
|
||||
fromComputer_title: 'PC로 부터',
|
||||
general: 'General',
|
||||
hours: '시',
|
||||
importBoard_title: '보드 가져오기',
|
||||
invalidCurrentPassword: '현재 비밀번호가 일치하지 않습니다',
|
||||
invalidCurrentPassword: '현재 패스워드는 유효하지 않습니다.',
|
||||
labels: '라벨',
|
||||
language: '언어',
|
||||
leaveBoard_title: '보드 떠나기',
|
||||
leaveProject_title: '프로젝트 떠나기',
|
||||
list: '목록',
|
||||
listActions_title: '목록 항목 조율',
|
||||
managers: '매니저',
|
||||
members: '멤버',
|
||||
language: '언어 선택',
|
||||
leaveBoard_title: '보드 탈퇴',
|
||||
leaveProject_title: '프로젝트 탈퇴',
|
||||
list: '내역',
|
||||
listActions_title: '활용 내역',
|
||||
managers: '관리자',
|
||||
members: '팀원',
|
||||
minutes: '분',
|
||||
moveCard_title: '카드 옮기기',
|
||||
moveCard_title: '항목카드 이동',
|
||||
name: '이름',
|
||||
newEmail: '새로운 이메일',
|
||||
newPassword: '새로운 비밀번호',
|
||||
newEmail: '새로운 메일',
|
||||
newPassword: '새로운 패스워드',
|
||||
newUsername: '새로운 사용자 이름',
|
||||
noConnectionToServer: '서버에 연결할 수 없습니다',
|
||||
noBoards: '보드가 존재하지 않습니다',
|
||||
noLists: '목록이 존재하지 않습니다',
|
||||
noProjects: '프로젝트가 존재하지 않습니다',
|
||||
noConnectionToServer: '서버에 연결할수 없습니다.',
|
||||
noBoards: '보드가 존재하지 않습니다.',
|
||||
noLists: '리스트가 존재하지 않습니다.',
|
||||
noProjects: '프로젝트가 존재하지 않습니다.',
|
||||
notifications: '알림',
|
||||
noUnreadNotifications: '확인하지 않은 알림이 없습니다.',
|
||||
openBoard_title: '보드 열기',
|
||||
noUnreadNotifications: '알림을 모두 확인했습니다.',
|
||||
openBoard_title: '보드열기',
|
||||
optional_inline: '옵션',
|
||||
organization: '조직',
|
||||
phone: '전화번호',
|
||||
preferences: '환경설정',
|
||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||
'팁: 클립보드에서 첨부 파일을 추가하려면 Ctrl-V (Mac의 경우 Cmd-V)를 누릅니다.',
|
||||
'Tip: 클립보드에서 첨부 파일을 추가하려면 Ctrl-V(Mac의 경우 Cmd-V) 입니다..',
|
||||
project: '프로젝트',
|
||||
projectNotFound_title: '프로젝트를 찾을 수 없습니다',
|
||||
removeManager_title: '매니저 삭제',
|
||||
removeMember_title: '멤버 삭제',
|
||||
searchLabels: '라벨 검색...',
|
||||
searchMembers: '멤버 검색...',
|
||||
searchUsers: '사용자 검색...',
|
||||
projectNotFound_title: '프로젝트가 존재하지 않습니다.',
|
||||
removeManager_title: '관리자 삭제',
|
||||
removeMember_title: '맴버 삭제',
|
||||
seconds: '초',
|
||||
selectBoard: '보드 선택',
|
||||
selectList: '목록 선택',
|
||||
selectPermissions_title: '권한 선택',
|
||||
selectList: '리스트 선택',
|
||||
selectProject: '프로젝트 선택',
|
||||
settings: '설정',
|
||||
stopwatch: '스톱워치',
|
||||
subscribeToMyOwnCardsByDefault: '기본적으로 내 카드를 구독합니다',
|
||||
taskActions_title: '업무 조율',
|
||||
tasks: '업무',
|
||||
thereIsNoPreviewAvailableForThisAttachment: '이 첨부 파일은 미리 보기를 사용할 수 없습니다.',
|
||||
stopwatch: '활동시간',
|
||||
subscribeToMyOwnCardsByDefault: '내 항목카드는 기본으로 구독',
|
||||
taskActions_title: '태스크 활동',
|
||||
tasks: '태스크',
|
||||
thereIsNoPreviewAvailableForThisAttachment:
|
||||
'이 첨부 파일에 사용할 수 있는 미리보기가 없습니다.',
|
||||
time: '시간',
|
||||
title: '제목',
|
||||
userActions_title: '사용자 조율',
|
||||
userAddedThisCardToList: '<0>{{user}}</0>님이 <1>{{list}}에 카드를 추가했습니다</1>',
|
||||
userActions_title: '',
|
||||
userAddedThisCardToList: '<0>{{user}}</0><1>이 카드를 {{list}}</1>에 추가했습니다.',
|
||||
userLeftNewCommentToCard:
|
||||
'{{user}}님이 <2>{{card}}</2>에 «{{comment}}»라는 댓글을 남겼습니다',
|
||||
userMovedCardFromListToList:
|
||||
'{{user}}님이 {{fromList}}에서 {{toList}}로 <2>{{card}}</2>를 옮겼습니다',
|
||||
'{{user}}이(가) <2>{{card}}</2>에 «{{comment}}»라는 댓글을 남겼습니다',
|
||||
userMovedCardFromListToList: '{{user}} moved <2>{{card}}</2> from {{fromList}} to {{toList}}',
|
||||
userMovedThisCardFromListToList:
|
||||
'<0>{{user}}</0><1> 님이 {{fromList}}에서 {{toList}}로 이 카드를 옮겼습니다</1>',
|
||||
username: '사용자 이름',
|
||||
usernameAlreadyInUse: '이미 사용중인 사용자 이름입니다',
|
||||
'<0>{{user}}</0><1> 이 항목카드를 {{fromList}} 에서 {{toList}} 으로 이동했습니다. </1>',
|
||||
username: '아이디',
|
||||
usernameAlreadyInUse: '이미 사용중인 사용자입니다.',
|
||||
users: '사용자',
|
||||
version: '버전',
|
||||
viewer: '열람자',
|
||||
writeComment: '댓글 쓰기...',
|
||||
writeComment: '댓글 작성...',
|
||||
},
|
||||
|
||||
action: {
|
||||
addAnotherCard: '다른 카드 추가',
|
||||
addAnotherList: '다른 목록 추가',
|
||||
addAnotherTask: '다른 업무 추가',
|
||||
addCard: '카드 추가',
|
||||
addCard_title: '카드 추가',
|
||||
addAnotherCard: '다른 항목카드 추가',
|
||||
addAnotherList: '다른 리스트 추가',
|
||||
addAnotherTask: '다른 TASK 추가',
|
||||
addCard: '항목카드 추가',
|
||||
addCard_title: '항목카드 추가',
|
||||
addComment: '댓글 추가',
|
||||
addList: '목록 추가',
|
||||
addMember: '멤버 추가',
|
||||
addList: '리스트 추가',
|
||||
addMoreDetailedDescription: '자세한 설명 추가',
|
||||
addTask: '업무 추가',
|
||||
addToCard: '카드에 추가',
|
||||
addTask: '태스트 추가',
|
||||
addToCard: '항목카드 추가',
|
||||
addUser: '사용자 추가',
|
||||
createBoard: '보드 생성',
|
||||
createFile: '파일 생성',
|
||||
@@ -183,55 +169,51 @@ export default {
|
||||
createNewLabel: '새로운 라벨 생성',
|
||||
createProject: '프로젝트 생성',
|
||||
delete: '삭제',
|
||||
deleteAttachment: '첨부 삭제',
|
||||
deleteAvatar: '아바타 삭제',
|
||||
deleteAttachment: '첨부삭제',
|
||||
deleteAvatar: '프로필 사진 삭제',
|
||||
deleteBoard: '보드 삭제',
|
||||
deleteCard: '카드 삭제',
|
||||
deleteCard_title: '카드 삭제',
|
||||
deleteCard: '항목카드 삭제',
|
||||
deleteCard_title: '항목카드 삭제',
|
||||
deleteComment: '댓글 삭제',
|
||||
deleteImage: '이미지 삭제',
|
||||
deleteLabel: '라벨 삭제',
|
||||
deleteList: '목록 삭제',
|
||||
deleteList_title: '목록 삭제',
|
||||
deleteList: '리스트 삭제',
|
||||
deleteList_title: '리스트 삭제',
|
||||
deleteProject: '프로젝트 삭제',
|
||||
deleteProject_title: '프로젝트 삭제',
|
||||
deleteTask: '업무 삭제',
|
||||
deleteTask_title: '업무 삭제',
|
||||
deleteTask: '태스트 삭제',
|
||||
deleteTask_title: '태스트 삭제',
|
||||
deleteUser: '사용자 삭제',
|
||||
edit: '수정',
|
||||
editDueDate_title: '마감일 수정',
|
||||
editDueDate_title: '완료일 수정',
|
||||
editDescription_title: '설명 수정',
|
||||
editEmail_title: '이메일 수정',
|
||||
editEmail_title: '메일 수정',
|
||||
editInformation_title: '정보 수정',
|
||||
editPassword_title: '비밀번호 수정',
|
||||
editPermissions: '권한 수정',
|
||||
editStopwatch_title: '스톱워치 수정',
|
||||
editPassword_title: '패스워드 수정',
|
||||
editStopwatch_title: '시간 수정',
|
||||
editTitle_title: '제목 수정',
|
||||
editUsername_title: '사용자 이름 수정',
|
||||
hideDetails: '세부 사항 숨기기',
|
||||
import: '가져오기',
|
||||
leaveBoard: '보드 나가기',
|
||||
leaveProject: '프로젝트 나가기',
|
||||
editUsername_title: '이름 수정',
|
||||
leaveBoard: '보드에서 나가기',
|
||||
leaveProject: '프로젝트에서 나가기',
|
||||
logOut_title: '로그아웃',
|
||||
makeCover_title: '커버 만들기',
|
||||
move: '이동',
|
||||
moveCard_title: '카드 이동',
|
||||
moveCard_title: '항목카드 이동',
|
||||
remove: '제거',
|
||||
removeBackground: '배경 제거',
|
||||
removeBackground: '백그라운드 제거',
|
||||
removeCover_title: '커버 제거',
|
||||
removeFromBoard: '보드 제거',
|
||||
removeFromProject: '프로젝트 제거',
|
||||
removeManager: '매니저 제거',
|
||||
removeMember: '멤버 제거',
|
||||
removeFromBoard: '보드에서 제거',
|
||||
removeFromProject: '프로젝트에서 제거',
|
||||
removeManager: '관리자 삭제',
|
||||
removeMember: '멤버 삭제',
|
||||
save: '저장',
|
||||
showAllAttachments: '모든 첨부 파일 표시 ({{hidden}} 숨겨짐)',
|
||||
showDetails: '세부 사항 표시',
|
||||
showFewerAttachments: '일부 첨부 파일만 표시',
|
||||
showAllAttachments: '모든 첨부파일 표시 ({{hidden}} hidden)',
|
||||
showFewerAttachments: '일부 첨부파일만 표시',
|
||||
start: '시작',
|
||||
stop: '종료',
|
||||
subscribe: '구독',
|
||||
stop: '끝',
|
||||
subscribe: '구독하기',
|
||||
unsubscribe: '구독 취소',
|
||||
uploadNewAvatar: '새로운 아바타 업로드',
|
||||
uploadNewAvatar: '새로운 프로필 사진 업로드',
|
||||
uploadNewImage: '새로운 이미지 업로드',
|
||||
},
|
||||
},
|
||||
|
||||
@@ -1,22 +1,22 @@
|
||||
/* Translated by Park Seok Ho */
|
||||
|
||||
export default {
|
||||
translation: {
|
||||
common: {
|
||||
emailOrUsername: '이메일 혹은 사용자 이름',
|
||||
invalidEmailOrUsername: '이메일 혹은 사용자 이름이 유효하지 않습니다',
|
||||
invalidPassword: '유효하지 않은 비밀번호',
|
||||
emailOrUsername: '이메일 혹은 아이디',
|
||||
invalidEmailOrUsername: '이메일이나 사용자 이름이 유효하지 않습니다.',
|
||||
invalidPassword: '잘못된 비밀번호',
|
||||
logInToPlanka: 'Planka에 로그인',
|
||||
noInternetConnection: '인터넷 연결이 없음',
|
||||
pageNotFound_title: '페이지를 찾을 수 없습니다',
|
||||
password: '비밀번호',
|
||||
noInternetConnection: '인터넷에 연결되지 않음',
|
||||
pageNotFound_title: '페이지를 찾을수 없습니다.',
|
||||
password: '패스워드',
|
||||
projectManagement: '프로젝트 관리',
|
||||
serverConnectionFailed: '서버 연결에 실패함',
|
||||
unknownError: '알 수 없는 오류, 나중에 다시 시도하십시오',
|
||||
useSingleSignOn: 'single sign-on(SSO) 사용',
|
||||
serverConnectionFailed: '서버 연결 실패',
|
||||
unknownError: '알 수 없는 오류가 발생하였습니다, 나중에 다시 시도하세요.',
|
||||
},
|
||||
|
||||
action: {
|
||||
logIn: '로그인',
|
||||
logInWithSSO: 'single sign-on(SSO)으로 로그인',
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
Executable
+236
@@ -0,0 +1,236 @@
|
||||
export default {
|
||||
format: {
|
||||
date: 'd-M-yyyy',
|
||||
time: 'HH:mm',
|
||||
dateTime: '$t(format:date) $t(format:time)',
|
||||
longDate: 'd MMM',
|
||||
longDateTime: "d MMMM 'om' HH:mm",
|
||||
},
|
||||
|
||||
translation: {
|
||||
common: {
|
||||
aboutPlanka: 'Over Planka',
|
||||
account: 'Account',
|
||||
actions: 'Acties',
|
||||
addAttachment_title: 'Bijlage Toevoegen',
|
||||
addComment: 'Opmerking Toevoegen',
|
||||
addManager_title: 'Manager Toevoegen',
|
||||
addMember_title: 'Lid Toevoegen',
|
||||
addUser_title: 'Gebruiker Toevoegen',
|
||||
administrator: 'Beheerder',
|
||||
all: 'Alles',
|
||||
allChangesWillBeAutomaticallySavedAfterConnectionRestored:
|
||||
'Alle wijzigingen worden automatisch opgeslagen<br />nadat de verbinding is hersteld',
|
||||
areYouSureYouWantToDeleteThisAttachment: 'Weet u zeker dat u deze bijlage wilt verwijderen?',
|
||||
areYouSureYouWantToDeleteThisBoard: 'Weet u zeker dat u dit bord wilt verwijderen?',
|
||||
areYouSureYouWantToDeleteThisCard: 'Weet u zeker dat u deze kaart wilt verwijderen?',
|
||||
areYouSureYouWantToDeleteThisComment: 'Weet u zeker dat u deze opmerking wilt verwijderen?',
|
||||
areYouSureYouWantToDeleteThisLabel: 'Weet u zeker dat u deze label wilt verwijderen?',
|
||||
areYouSureYouWantToDeleteThisList: 'Weet u zeker dat u deze lijst wilt verwijderen?',
|
||||
areYouSureYouWantToDeleteThisProject: 'Weet u zeker dat u dit project wilt verwijderen?',
|
||||
areYouSureYouWantToDeleteThisTask: 'Weet u zeker dat u deze taak wilt verwijderen?',
|
||||
areYouSureYouWantToDeleteThisUser: 'Weet u zeker dat u deze gebruiker wilt verwijderen?',
|
||||
areYouSureYouWantToLeaveBoard: 'Weet u zeker dat u het bord wilt verlaten?',
|
||||
areYouSureYouWantToLeaveProject: 'Weet u zeker dat u het project wilt verlaten?',
|
||||
areYouSureYouWantToRemoveThisManagerFromProject:
|
||||
'Weet u zeker dat u deze manager uit het project wilt verwijderen?',
|
||||
areYouSureYouWantToRemoveThisMemberFromBoard:
|
||||
'Weet u zeker dat u dit lid uit het bord wilt verwijderen?',
|
||||
attachment: 'Bijlage',
|
||||
attachments: 'Bijlagen',
|
||||
authentication: 'Authenticatie',
|
||||
background: 'Achtergrond',
|
||||
board: 'Bord',
|
||||
boardNotFound_title: 'Bord Niet Gevonden',
|
||||
canComment: 'Kan opmerking plaatsen',
|
||||
canEditContentOfBoard: 'Kan de inhoud van het bord bewerken',
|
||||
canOnlyViewBoard: 'Kan alleen het bord bekijken',
|
||||
cardActions_title: 'Kaartacties',
|
||||
cardNotFound_title: 'Kaart Niet Gevonden',
|
||||
cardOrActionAreDeleted: 'Kaart of actie zijn verwijderd',
|
||||
color: 'Kleur',
|
||||
createBoard_title: 'Bord Aanmaken',
|
||||
createLabel_title: 'Label Aanmaken',
|
||||
createNewOneOrSelectExistingOne: 'Maak een nieuwe aan of selecteer<br />een bestaande',
|
||||
createProject_title: 'Project Aanmaken',
|
||||
createTextFile_title: 'Tekstbestand Aanmaken',
|
||||
currentPassword: 'Huidig wachtwoord',
|
||||
dangerZone_title: 'Gevaarlijke Zone',
|
||||
date: 'Datum',
|
||||
dueDate_title: 'Vervaldatum',
|
||||
deleteAttachment_title: 'Bijlage Verwijderen',
|
||||
deleteBoard_title: 'Bord Verwijderen',
|
||||
deleteCard_title: 'Kaart Verwijderen',
|
||||
deleteComment_title: 'Opmerking Verwijderen',
|
||||
deleteLabel_title: 'Label Verwijderen',
|
||||
deleteList_title: 'Lijst Verwijderen',
|
||||
deleteProject_title: 'Project Verwijderen',
|
||||
deleteTask_title: 'Taak Verwijderen',
|
||||
deleteUser_title: 'Gebruiker Verwijderen',
|
||||
description: 'Beschrijving',
|
||||
detectAutomatically: 'Automatisch detecteren',
|
||||
dropFileToUpload: 'Sleep het bestand om te uploaden',
|
||||
editor: 'Editor',
|
||||
editAttachment_title: 'Bijlage Bewerken',
|
||||
editAvatar_title: 'Avatar Bewerken',
|
||||
editBoard_title: 'Bord Bewerken',
|
||||
editDueDate_title: 'Vervaldatum Bewerken',
|
||||
editEmail_title: 'E-mail Bewerken',
|
||||
editInformation_title: 'Informatie Bewerken',
|
||||
editLabel_title: 'Label Bewerken',
|
||||
editPassword_title: 'Wachtwoord Bewerken',
|
||||
editPermissions_title: 'Rechten Bewerken',
|
||||
editStopwatch_title: 'Stopwatch Bewerken',
|
||||
editUsername_title: 'Gebruikersnaam Bewerken',
|
||||
email: 'E-mail',
|
||||
emailAlreadyInUse: 'E-mail is al in gebruik',
|
||||
enterCardTitle: 'Voer de kaarttitel in... [Ctrl+Enter] om automatisch te openen',
|
||||
enterDescription: 'Voer beschrijving in...',
|
||||
enterFilename: 'Voer bestandsnaam in',
|
||||
enterListTitle: 'Voer de lijsttitel in...',
|
||||
enterProjectTitle: 'Voer de projecttitel in',
|
||||
enterTaskDescription: 'Voer taakbeschrijving in...',
|
||||
filterByLabels_title: 'Filteren op Labels',
|
||||
filterByMembers_title: 'Filteren op Leden',
|
||||
fromComputer_title: 'Van Computer',
|
||||
fromTrello: 'Van Trello',
|
||||
general: 'Algemeen',
|
||||
hours: 'Uren',
|
||||
importBoard_title: 'Bord Importeren',
|
||||
invalidCurrentPassword: 'Ongeldig huidig wachtwoord',
|
||||
labels: 'Labels',
|
||||
language: 'Taal',
|
||||
leaveBoard_title: 'Bord Verlaten',
|
||||
leaveProject_title: 'Project Verlaten',
|
||||
list: 'Lijst',
|
||||
listActions_title: 'Lijstacties',
|
||||
managers: 'Managers',
|
||||
members: 'Leden',
|
||||
minutes: 'Minuten',
|
||||
moveCard_title: 'Kaart Verplaatsen',
|
||||
name: 'Naam',
|
||||
newEmail: 'Nieuwe e-mail',
|
||||
newPassword: 'Nieuw wachtwoord',
|
||||
newUsername: 'Nieuwe gebruikersnaam',
|
||||
noConnectionToServer: 'Geen verbinding met de server',
|
||||
noBoards: 'Geen borden',
|
||||
noLists: 'Geen lijsten',
|
||||
noProjects: 'Geen projecten',
|
||||
notifications: 'Meldingen',
|
||||
noUnreadNotifications: 'Geen ongelezen meldingen',
|
||||
openBoard_title: 'Bord Openen',
|
||||
optional_inline: 'optioneel',
|
||||
organization: 'Organisatie',
|
||||
phone: 'Telefoon',
|
||||
preferences: 'Voorkeuren',
|
||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||
'Tip: druk op Ctrl-V (Cmd-V op Mac) om een bijlage van het klembord toe te voegen',
|
||||
project: 'Project',
|
||||
projectNotFound_title: 'Project Niet Gevonden',
|
||||
removeManager_title: 'Manager Verwijderen',
|
||||
removeMember_title: 'Lid Verwijderen',
|
||||
searchLabels: 'Zoek labels...',
|
||||
searchMembers: 'Zoek leden...',
|
||||
searchUsers: 'Zoek gebruikers...',
|
||||
seconds: 'Seconden',
|
||||
selectBoard: 'Selecteer bord',
|
||||
selectList: 'Selecteer lijst',
|
||||
selectPermissions_title: 'Selecteer Rechten',
|
||||
selectProject: 'Selecteer project',
|
||||
settings: 'Instellingen',
|
||||
stopwatch: 'Stopwatch',
|
||||
subscribeToMyOwnCardsByDefault: 'Standaard abonneren op mijn eigen kaarten',
|
||||
taskActions_title: 'Taakacties',
|
||||
tasks: 'Taken',
|
||||
thereIsNoPreviewAvailableForThisAttachment:
|
||||
'Er is geen voorbeeld beschikbaar voor deze bijlage',
|
||||
time: 'Tijd',
|
||||
title: 'Titel',
|
||||
userActions_title: 'Gebruikersacties',
|
||||
userAddedThisCardToList: '<0>{{user}}</0><1> voegde deze kaart toe aan {{list}}</1>',
|
||||
userLeftNewCommentToCard:
|
||||
'{{user}} liet een nieuwe opmerking achter «{{comment}}» bij <2>{{card}}</2>',
|
||||
userMovedCardFromListToList:
|
||||
'{{user}} verplaatste <2>{{kaart}}</2> van {{fromList}} naar {{toList}}',
|
||||
userMovedThisCardFromListToList:
|
||||
'<0>{{user}}</0><1> verplaatste deze kaart van {{fromList}} naar {{toList}}</1>',
|
||||
username: 'Gebruikersnaam',
|
||||
usernameAlreadyInUse: 'Gebruikersnaam is al in gebruik',
|
||||
users: 'Gebruikers',
|
||||
version: 'Versie',
|
||||
viewer: 'Viewer',
|
||||
writeComment: 'Schrijf een opmerking...',
|
||||
},
|
||||
|
||||
action: {
|
||||
addAnotherCard: 'Voeg nog een kaart toe',
|
||||
addAnotherList: 'Voeg nog een lijst toe',
|
||||
addAnotherTask: 'Voeg nog een taak toe',
|
||||
addCard: 'Kaart toevoegen',
|
||||
addCard_title: 'Kaart Toevoegen',
|
||||
addComment: 'Opmerking toevoegen',
|
||||
addList: 'Lijst toevoegen',
|
||||
addMember: 'Lid toevoegen',
|
||||
addMoreDetailedDescription: 'Voeg een meer gedetailleerde beschrijving toe',
|
||||
addTask: 'Taak toevoegen',
|
||||
addToCard: 'Toevoegen aan kaart',
|
||||
addUser: 'Gebruiker toevoegen',
|
||||
createBoard: 'Bord aanmaken',
|
||||
createFile: 'Bestand aanmaken',
|
||||
createLabel: 'Label aanmaken',
|
||||
createNewLabel: 'Nieuw label aanmaken',
|
||||
createProject: 'Project aanmaken',
|
||||
delete: 'Verwijderen',
|
||||
deleteAttachment: 'Bijlage verwijderen',
|
||||
deleteAvatar: 'Avatar verwijderen',
|
||||
deleteBoard: 'Bord verwijderen',
|
||||
deleteCard: 'Kaart verwijderen',
|
||||
deleteCard_title: 'Kaart Verwijderen',
|
||||
deleteComment: 'Opmerking verwijderen',
|
||||
deleteImage: 'Afbeelding verwijderen',
|
||||
deleteLabel: 'Label verwijderen',
|
||||
deleteList: 'Lijst verwijderen',
|
||||
deleteList_title: 'Lijst Verwijderen',
|
||||
deleteProject: 'Project verwijderen',
|
||||
deleteProject_title: 'Project Verwijderen',
|
||||
deleteTask: 'Taak verwijderen',
|
||||
deleteTask_title: 'Taak Verwijderen',
|
||||
deleteUser: 'Gebruiker verwijderen',
|
||||
edit: 'Bewerken',
|
||||
editDueDate_title: 'Vervaldatum Bewerken',
|
||||
editDescription_title: 'Beschrijving Bewerken',
|
||||
editEmail_title: 'E-mail Bewerken',
|
||||
editInformation_title: 'Informatie Bewerken',
|
||||
editPassword_title: 'Wachtwoord Bewerken',
|
||||
editPermissions: 'Rechten Bewerken',
|
||||
editStopwatch_title: 'Stopwatch Bewerken',
|
||||
editTitle_title: 'Titel Bewerken',
|
||||
editUsername_title: 'Gebruikersnaam Bewerken',
|
||||
hideDetails: 'Details verbergen',
|
||||
import: 'Importeren',
|
||||
leaveBoard: 'Bord verlaten',
|
||||
leaveProject: 'Project verlaten',
|
||||
logOut_title: 'Uitloggen',
|
||||
makeCover_title: 'Maak Omslag',
|
||||
move: 'Verplaatsen',
|
||||
moveCard_title: 'Kaart Verplaatsen',
|
||||
remove: 'Verwijderen',
|
||||
removeBackground: 'Achtergrond verwijderen',
|
||||
removeCover_title: 'Omslag Verwijderen',
|
||||
removeFromBoard: 'Verwijderen van bord',
|
||||
removeFromProject: 'Verwijderen van project',
|
||||
removeManager: 'Manager verwijderen',
|
||||
removeMember: 'Lid verwijderen',
|
||||
save: 'Opslaan',
|
||||
showAllAttachments: 'Toon alle bijlagen ({{hidden}} verborgen)',
|
||||
showDetails: 'Details weergeven',
|
||||
showFewerAttachments: 'Toon minder bijlagen',
|
||||
start: 'Start',
|
||||
stop: 'Stop',
|
||||
subscribe: 'Abonneren',
|
||||
unsubscribe: 'Afmelden',
|
||||
uploadNewAvatar: 'Nieuwe avatar uploaden',
|
||||
uploadNewImage: 'Nieuwe afbeelding uploaden',
|
||||
},
|
||||
},
|
||||
};
|
||||
@@ -0,0 +1,11 @@
|
||||
import merge from 'lodash/merge';
|
||||
|
||||
import login from './login';
|
||||
import core from './core';
|
||||
|
||||
export default {
|
||||
language: 'nl',
|
||||
country: 'nl',
|
||||
name: 'Dutch',
|
||||
embeddedLocale: merge(login, core),
|
||||
};
|
||||
@@ -0,0 +1,20 @@
|
||||
export default {
|
||||
translation: {
|
||||
common: {
|
||||
emailOrUsername: 'E-mail of gebruikersnaam',
|
||||
invalidEmailOrUsername: 'Ongeldige e-mail of gebruikersnaam',
|
||||
invalidPassword: 'Ongeldig wachtwoord',
|
||||
logInToPlanka: 'Inloggen op Planka',
|
||||
noInternetConnection: 'Geen internetverbinding',
|
||||
pageNotFound_title: 'Pagina Niet Gevonden',
|
||||
password: 'Wachtwoord',
|
||||
projectManagement: 'Projectbeheer',
|
||||
serverConnectionFailed: 'Verbinding met server mislukt',
|
||||
unknownError: 'Onbekende fout, probeer het later opnieuw',
|
||||
},
|
||||
|
||||
action: {
|
||||
logIn: 'Inloggen',
|
||||
},
|
||||
},
|
||||
};
|
||||
@@ -22,7 +22,7 @@ export default {
|
||||
administrator: 'Administrator',
|
||||
all: 'Wszyscy',
|
||||
allChangesWillBeAutomaticallySavedAfterConnectionRestored:
|
||||
'Wszystkie zmiany zostaną automatycznie zapisane<br />po przywróceniu połączenia.',
|
||||
'Wszystkie zmiany zostaną automatycznie zapisane<br />po przywróceniu połączenia',
|
||||
areYouSureYouWantToDeleteThisAttachment: 'Jesteś pewien że chcesz usunąć ten załącznik?',
|
||||
areYouSureYouWantToDeleteThisBoard: 'Jesteś pewien że chcesz usunąć tę tablicę?',
|
||||
areYouSureYouWantToDeleteThisCard: 'Jesteś pewien że chcesz usunąć tę kartę?',
|
||||
@@ -41,11 +41,11 @@ export default {
|
||||
boardNotFound_title: 'Tablica Nie Znaleziona',
|
||||
cardActions_title: 'Akcje Karty',
|
||||
cardNotFound_title: 'Karta Nie Znaleziona',
|
||||
cardOrActionAreDeleted: 'Karta lub akcja została usunięta.',
|
||||
cardOrActionAreDeleted: 'Karta lub akcja została usunięta',
|
||||
color: 'Kolor',
|
||||
createBoard_title: 'Utwórz Tablicę',
|
||||
createLabel_title: 'Utwórz Oznaczenie',
|
||||
createNewOneOrSelectExistingOne: 'Utwórz nowy lub wybierz<br />istniejący.',
|
||||
createNewOneOrSelectExistingOne: 'Utwórz nowy lub wybierz<br />istniejący',
|
||||
createProject_title: 'Utwórz Projekt',
|
||||
createTextFile_title: 'Utwórz Plik Tekstowy',
|
||||
currentPassword: 'Aktualne hasło',
|
||||
@@ -99,14 +99,14 @@ export default {
|
||||
noLists: 'Brak list',
|
||||
noProjects: 'Brak projektów',
|
||||
notifications: 'Powiadomienia',
|
||||
noUnreadNotifications: 'Brak nieprzeczytanych powiadomień.',
|
||||
noUnreadNotifications: 'Brak nieprzeczytanych powiadomień',
|
||||
openBoard_title: 'Otwórz Tablicę',
|
||||
optional_inline: 'opcjonalny',
|
||||
organization: 'Organizacja',
|
||||
phone: 'Telefon',
|
||||
preferences: 'Preferencje',
|
||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||
'Podpowiedź: naciśnij Ctrl-V (Cmd-V na Macu) aby dodać załącznik ze schowka.',
|
||||
'Podpowiedź: naciśnij Ctrl-V (Cmd-V na Macu) aby dodać załącznik ze schowka',
|
||||
project: 'Projekt',
|
||||
projectNotFound_title: 'Projekt Nie Znaleziony',
|
||||
removeMember_title: 'Usuń Członka',
|
||||
|
||||
@@ -1,240 +0,0 @@
|
||||
import dateFns from 'date-fns/locale/ro';
|
||||
|
||||
export default {
|
||||
dateFns,
|
||||
|
||||
format: {
|
||||
date: 'P',
|
||||
time: 'HH:mm',
|
||||
dateTime: '$t(format:date) $t(format:time)',
|
||||
longDate: 'd MMM',
|
||||
longDateTime: "d MMMM 'в' p",
|
||||
},
|
||||
|
||||
translation: {
|
||||
common: {
|
||||
aboutPlanka: 'Despre Planka',
|
||||
account: 'Cont',
|
||||
actions: 'Acțiuni',
|
||||
addAttachment_title: 'Adauga atasament',
|
||||
addComment: 'Adaugă comentariu',
|
||||
addManager_title: 'Adaugă Manager',
|
||||
addMember_title: 'Adaugă Membru',
|
||||
addUser_title: 'Adaugă Utilizator',
|
||||
administrator: 'Administrator',
|
||||
all: 'Toate',
|
||||
allChangesWillBeAutomaticallySavedAfterConnectionRestored:
|
||||
'Toate modificarile vor fi salvate automat<br />dupa restabilirea conexiunii.',
|
||||
areYouSureYouWantToDeleteThisAttachment: 'Sigur doriți să ștergeți acest atașament?',
|
||||
areYouSureYouWantToDeleteThisBoard: 'Sigur doriți să ștergeți acest panou?',
|
||||
areYouSureYouWantToDeleteThisCard: 'Sigur doriți să ștergeți acest card?',
|
||||
areYouSureYouWantToDeleteThisComment: 'Sigur doriți să ștergeți acest comentariu?',
|
||||
areYouSureYouWantToDeleteThisLabel: 'Sigur doriți să ștergeți această etichetă?',
|
||||
areYouSureYouWantToDeleteThisList: 'Sigur doriți să ștergeți această listă?',
|
||||
areYouSureYouWantToDeleteThisProject: 'Sigur doriți să ștergeți acest proiect?',
|
||||
areYouSureYouWantToDeleteThisTask: 'Sigur doriți să ștergeți această sarcină?',
|
||||
areYouSureYouWantToDeleteThisUser: 'Sigur doriți să ștergeți acest utilizator?',
|
||||
areYouSureYouWantToLeaveBoard: 'Ești sigur că vrei să părăsești tabla?',
|
||||
areYouSureYouWantToLeaveProject: 'Ești sigur că vrei să părăsești proiectul?',
|
||||
areYouSureYouWantToRemoveThisManagerFromProject:
|
||||
'Sigur doriți să eliminați acest manager din proiect?',
|
||||
areYouSureYouWantToRemoveThisMemberFromBoard:
|
||||
'Sigur doriți să eliminați acest membru din consiliu?',
|
||||
attachment: 'Atașament',
|
||||
attachments: 'Atasamente',
|
||||
authentication: 'Autentificare',
|
||||
background: 'Fundal',
|
||||
board: 'Tabla',
|
||||
boardNotFound_title: 'Tabla nu a fost găsită',
|
||||
canComment: 'Poate comenta',
|
||||
canEditContentOfBoard: 'Poate edita conținutul tablei.',
|
||||
canOnlyViewBoard: 'Poate doar vizualiza tabla.',
|
||||
cardActions_title: 'Acțiuni cu carduri',
|
||||
cardNotFound_title: 'Cardul nu a fost găsit',
|
||||
cardOrActionAreDeleted: 'Cardul sau acțiunea sunt șterse.',
|
||||
color: 'Culoarea',
|
||||
createBoard_title: 'Creare Tabla',
|
||||
createLabel_title: 'Creați etichetă',
|
||||
createNewOneOrSelectExistingOne: 'Crează unu nou sau selectează<br />unu deja existent.',
|
||||
createProject_title: 'Crează Proiect',
|
||||
createTextFile_title: 'Crează un Fișier Text',
|
||||
currentPassword: 'Parola Curentă',
|
||||
dangerZone_title: 'Zona periculoasă',
|
||||
date: 'Data',
|
||||
dueDate_title: 'Data scadentă',
|
||||
deleteAttachment_title: 'Ștergeți atașamentul',
|
||||
deleteBoard_title: 'Ștergeți Tabla',
|
||||
deleteCard_title: 'Ștergeți cardul',
|
||||
deleteComment_title: 'Șterge comentariul',
|
||||
deleteLabel_title: 'Ștergeți eticheta',
|
||||
deleteList_title: 'Șterge lista',
|
||||
deleteProject_title: 'Șterge proiectul',
|
||||
deleteTask_title: 'Ștergeți sarcina',
|
||||
deleteUser_title: 'Șterge utilizator',
|
||||
description: 'Descriere',
|
||||
detectAutomatically: 'Detectează automat',
|
||||
dropFileToUpload: 'Aruncă fișierul pentru a încărca',
|
||||
editor: 'Editor',
|
||||
editAttachment_title: 'Editați atașamentul',
|
||||
editAvatar_title: 'Editați avatarul',
|
||||
editBoard_title: 'Editați tabla',
|
||||
editDueDate_title: 'Editați data scadentă',
|
||||
editEmail_title: 'Editați E-mail',
|
||||
editInformation_title: 'Editați informații',
|
||||
editLabel_title: 'Editați eticheta',
|
||||
editPassword_title: 'Editați parola',
|
||||
editPermissions_title: 'Editați permisiunile',
|
||||
editStopwatch_title: 'Editați cronometrul',
|
||||
editUsername_title: 'Editați numele de utilizator',
|
||||
email: 'E-mail',
|
||||
emailAlreadyInUse: 'E-mail deja utilizat',
|
||||
enterCardTitle: 'Introduceți titlul cardului... [Ctrl+Enter] pentru a se deschide automat.',
|
||||
enterDescription: 'Introduceți descrierea...',
|
||||
enterFilename: 'Introduceți numele fișierului',
|
||||
enterListTitle: 'Introduceți titlul listei...',
|
||||
enterProjectTitle: 'Introduceți titlul proiectului',
|
||||
enterTaskDescription: 'Introduceți descrierea sarcinii...',
|
||||
filterByLabels_title: 'Filtrați după etichete',
|
||||
filterByMembers_title: 'Filtrați după membri',
|
||||
fromComputer_title: 'De pe computer',
|
||||
fromTrello: 'De pe Trello',
|
||||
general: 'General',
|
||||
hours: 'Ore',
|
||||
importBoard_title: 'Import Tabla',
|
||||
invalidCurrentPassword: 'Parolă actuală nevalidă',
|
||||
labels: 'Etichete',
|
||||
language: 'Limba',
|
||||
leaveBoard_title: 'Părăsiți Tabla',
|
||||
leaveProject_title: 'Părăsiți proiectul',
|
||||
list: 'Lista',
|
||||
listActions_title: 'Listează acțiuni',
|
||||
managers: 'Managerii',
|
||||
members: 'Membri',
|
||||
minutes: 'Minute',
|
||||
moveCard_title: 'Mutați cardul',
|
||||
name: 'Nume',
|
||||
newEmail: 'Email nou',
|
||||
newPassword: 'Parolă Nouă',
|
||||
newUsername: 'Nume de utilizator nou',
|
||||
noConnectionToServer: 'Nicio conexiune la server',
|
||||
noBoards: 'Fără Table',
|
||||
noLists: 'Fără Liste',
|
||||
noProjects: 'Fără proiecte',
|
||||
notifications: 'Notificări',
|
||||
noUnreadNotifications: 'Fără notificări necitite.',
|
||||
openBoard_title: 'Tablă deschisă',
|
||||
optional_inline: 'optional',
|
||||
organization: 'Organizatia',
|
||||
phone: 'Telefon',
|
||||
preferences: 'Preferințe',
|
||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||
'Sfat: apăsați Ctrl-V (Cmd-V pe Mac) pentru a adăuga un atașament din clipboard.',
|
||||
project: 'Proiect',
|
||||
projectNotFound_title: 'Proiectul nu a fost găsit',
|
||||
removeManager_title: 'Eliminați Manager',
|
||||
removeMember_title: 'Eliminați membru',
|
||||
searchLabels: 'Căutați etichete...',
|
||||
searchMembers: 'Căutați membri...',
|
||||
searchUsers: 'Căutați utilizatori...',
|
||||
seconds: 'Secunde',
|
||||
selectBoard: 'Selectați tabla',
|
||||
selectList: 'Selectați lista',
|
||||
selectPermissions_title: 'Selectați Permisiuni',
|
||||
selectProject: 'Selectați proiectul',
|
||||
settings: 'Setări',
|
||||
stopwatch: 'Cronometru',
|
||||
subscribeToMyOwnCardsByDefault: 'Abonați-vă la propriile carduri în mod implicit',
|
||||
taskActions_title: 'Acțiuni de sarcină',
|
||||
tasks: 'Sarcini',
|
||||
thereIsNoPreviewAvailableForThisAttachment:
|
||||
'Nu există nicio previzualizare disponibilă pentru acest atașament.',
|
||||
time: 'Timp',
|
||||
title: 'Titlu',
|
||||
userActions_title: 'Acțiunile utilizatorului',
|
||||
userAddedThisCardToList: '<0>{{user}}</0><1> a adăugat acest card în {{list}}</1>',
|
||||
userLeftNewCommentToCard:
|
||||
'{{user}} a lăsat un nou comentariu «{{comment}}» în <2>{{card}}</2>',
|
||||
userMovedCardFromListToList:
|
||||
'{{user}} a mutat <2>{{card}}</2> din {{fromList}} în {{toList}}',
|
||||
userMovedThisCardFromListToList:
|
||||
'<0>{{user}}</0><1> a mutat aceast card din {{fromList}} în {{toList}}</1>',
|
||||
username: 'Nume utilizator',
|
||||
usernameAlreadyInUse: 'Nume utilizator deja exista',
|
||||
users: 'Utilizatori',
|
||||
version: 'Versiunea',
|
||||
viewer: 'Vizualizator',
|
||||
writeComment: 'Scrie un comentariu...',
|
||||
},
|
||||
|
||||
action: {
|
||||
addAnotherCard: 'Adăugați un alt card',
|
||||
addAnotherList: 'Adăugați o altă listă',
|
||||
addAnotherTask: 'Adăugați o altă sarcină',
|
||||
addCard: 'Adăugați card',
|
||||
addCard_title: 'Adăugați card',
|
||||
addComment: 'Adauga comentariu',
|
||||
addList: 'Adăugați listă',
|
||||
addMember: 'Adăugați membru',
|
||||
addMoreDetailedDescription: 'Adăugați descrierea mai detaliata',
|
||||
addTask: 'Adăugați sarcină',
|
||||
addToCard: 'Adauga în card',
|
||||
addUser: 'Adăugați utilizator',
|
||||
createBoard: 'Creați tablă',
|
||||
createFile: 'Creați fișier',
|
||||
createLabel: 'Creați eticheta',
|
||||
createNewLabel: 'Creați o nouă etichetă',
|
||||
createProject: 'Creați proiect',
|
||||
delete: 'Ștergeți',
|
||||
deleteAttachment: 'Ștergeți atașamentul',
|
||||
deleteAvatar: 'Ștergeți avatarul',
|
||||
deleteBoard: 'Ștergeți tabla',
|
||||
deleteCard: 'Ștergeți cardul',
|
||||
deleteCard_title: 'Ștergeți Cardul',
|
||||
deleteComment: 'Șterge comentariu',
|
||||
deleteImage: 'Șterge imaginea',
|
||||
deleteLabel: 'Ștergeți Eticheta',
|
||||
deleteList: 'Ștergeți lista',
|
||||
deleteList_title: 'Ștergeți Lista',
|
||||
deleteProject: 'Ștergeți proiectul',
|
||||
deleteProject_title: 'Ștergeți Proiectul',
|
||||
deleteTask: 'Ștergeți sarcina',
|
||||
deleteTask_title: 'Ștergeți Sarcina',
|
||||
deleteUser: 'Ștergeți utilizatorul',
|
||||
edit: 'Editați',
|
||||
editDueDate_title: 'Editați data scadentă',
|
||||
editDescription_title: 'Editați descrierea',
|
||||
editEmail_title: 'Editați e-mailul',
|
||||
editInformation_title: 'Editați informații',
|
||||
editPassword_title: 'Editați parola',
|
||||
editPermissions: 'Editați permisiunile',
|
||||
editStopwatch_title: 'Editați cronometrul',
|
||||
editTitle_title: 'Editați Titlul',
|
||||
editUsername_title: 'Editați Numele Utilizator',
|
||||
hideDetails: 'Ascunde detalii',
|
||||
import: 'Import',
|
||||
leaveBoard: 'Părăsiți bordul',
|
||||
leaveProject: 'Părăsiți proiect',
|
||||
logOut_title: 'Deconectați-vă',
|
||||
makeCover_title: 'Faceți Coperta',
|
||||
move: 'Mutați',
|
||||
moveCard_title: 'Mutați cardul',
|
||||
remove: 'Eliminați',
|
||||
removeBackground: 'Eliminați fundalul',
|
||||
removeCover_title: 'Eliminați Coperta',
|
||||
removeFromBoard: 'Eliminați din Tabla',
|
||||
removeFromProject: 'Eliminați din proiect',
|
||||
removeManager: 'Eliminați managerul',
|
||||
removeMember: 'Eliminați membrul',
|
||||
save: 'Salveaza',
|
||||
showAllAttachments: 'Afișați toate atașamentele ({{hidden}} ascunse)',
|
||||
showDetails: 'Arată detalii',
|
||||
showFewerAttachments: 'Afișați mai puține atașamente',
|
||||
start: 'Start',
|
||||
stop: 'Stop',
|
||||
subscribe: 'Abonati-va',
|
||||
unsubscribe: 'Dezabonați-vă',
|
||||
uploadNewAvatar: 'Încărcați un avatar nou',
|
||||
uploadNewImage: 'Încărcați o nouă imagine',
|
||||
},
|
||||
},
|
||||
};
|
||||
@@ -1,8 +0,0 @@
|
||||
import login from './login';
|
||||
|
||||
export default {
|
||||
language: 'ro',
|
||||
country: 'ro',
|
||||
name: 'Română',
|
||||
embeddedLocale: login,
|
||||
};
|
||||
@@ -1,22 +0,0 @@
|
||||
export default {
|
||||
translation: {
|
||||
common: {
|
||||
emailOrUsername: 'E-mail sau nume de utilizator',
|
||||
invalidEmailOrUsername: 'E-mail sau nume de utilizator introduse greșit',
|
||||
invalidPassword: 'Parola greșita',
|
||||
logInToPlanka: 'Autentificarea în Planka',
|
||||
noInternetConnection: 'Lipsește conexiunea cu internet',
|
||||
pageNotFound_title: 'Pagina n-a fost găsită',
|
||||
password: 'Parola',
|
||||
projectManagement: 'Gestionarea proiectului',
|
||||
serverConnectionFailed: 'Conexiunea cu Server a eșuat',
|
||||
unknownError: 'Eroarea necunoscuta, mai incercați',
|
||||
useSingleSignOn: 'Folosiți autentificarea unica',
|
||||
},
|
||||
|
||||
action: {
|
||||
logIn: 'Autentificarea',
|
||||
logInWithSSO: 'Autentificarea cu SSO',
|
||||
},
|
||||
},
|
||||
};
|
||||
@@ -24,7 +24,7 @@ export default {
|
||||
administrator: 'Администратор',
|
||||
all: 'Все',
|
||||
allChangesWillBeAutomaticallySavedAfterConnectionRestored:
|
||||
'Все изменения сохранятся автоматически,<br />как только подключение восстановится.',
|
||||
'Все изменения сохранятся автоматически,<br />как только подключение восстановится',
|
||||
areYouSureYouWantToDeleteThisAttachment: 'Вы уверены, что хотите удалить это вложение?',
|
||||
areYouSureYouWantToDeleteThisBoard: 'Вы уверены, что хотите удалить эту доску?',
|
||||
areYouSureYouWantToDeleteThisCard: 'Вы уверены, что хотите удалить эту карточку?',
|
||||
@@ -47,16 +47,16 @@ export default {
|
||||
board: 'Доска',
|
||||
boardNotFound: 'Доска не найдена',
|
||||
canComment: 'Может комментировать',
|
||||
canEditContentOfBoard: 'Может редактировать содержимое доски.',
|
||||
canOnlyViewBoard: 'Может только просматривать доску.',
|
||||
canEditContentOfBoard: 'Может редактировать содержимое доски',
|
||||
canOnlyViewBoard: 'Может только просматривать доску',
|
||||
cardActions: 'Действия с карточкой',
|
||||
cardNotFound: 'Карточка не найдена',
|
||||
cardOrActionAreDeleted: 'Карточка или действие удалены.',
|
||||
cardOrActionAreDeleted: 'Карточка или действие удалены',
|
||||
color: 'Цвет',
|
||||
connectionRestored: 'Соединение восстановлено',
|
||||
createBoard: 'Создание доски',
|
||||
createLabel: 'Создание метки',
|
||||
createNewOneOrSelectExistingOne: 'Создайте новую или выберите<br />уже существующую.',
|
||||
createNewOneOrSelectExistingOne: 'Создайте новую или выберите<br />уже существующую',
|
||||
createProject: 'Создание проекта',
|
||||
createTextFile: 'Создание текстового файла',
|
||||
currentPassword: 'Текущий пароль',
|
||||
@@ -124,14 +124,14 @@ export default {
|
||||
noLists: 'Списков нет',
|
||||
noProjects: 'Проектов нет',
|
||||
notifications: 'Уведомления',
|
||||
noUnreadNotifications: 'Уведомлений нет.',
|
||||
noUnreadNotifications: 'Уведомлений нет',
|
||||
openBoard: 'Откройте доску',
|
||||
optional_inline: 'необязательно',
|
||||
organization: 'Организация',
|
||||
phone: 'Телефон',
|
||||
preferences: 'Предпочтения',
|
||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||
'Совет: нажмите Ctrl-V (Cmd-V на Mac), чтобы добавить вложение из буфера обмена.',
|
||||
'Совет: нажмите Ctrl-V (Cmd-V на Mac), чтобы добавить вложение из буфера обмена',
|
||||
project: 'Проект',
|
||||
projectActions: 'Действия с проектом',
|
||||
projectNotFound: 'Проект не найден',
|
||||
@@ -150,7 +150,7 @@ export default {
|
||||
subscribeToMyOwnCardsByDefault: 'По умолчанию подписываться на мои собственные карточки',
|
||||
taskActions: 'Действия с задачей',
|
||||
tasks: 'Задачи',
|
||||
thereIsNoPreviewAvailableForThisAttachment: 'Предпросмотр для этого вложения недоступен.',
|
||||
thereIsNoPreviewAvailableForThisAttachment: 'Предпросмотр для этого вложения недоступен',
|
||||
time: 'Время',
|
||||
title: 'Название',
|
||||
userActions: 'Действия с пользователем',
|
||||
|
||||
@@ -23,7 +23,7 @@ export default {
|
||||
administrator: 'Administrátor',
|
||||
all: 'Všetko',
|
||||
allChangesWillBeAutomaticallySavedAfterConnectionRestored:
|
||||
'Všetky zmeny budú automaticky uložené<br />po obnovení spojenia.',
|
||||
'Všetky zmeny budú automaticky uložené<br />po obnovení spojenia',
|
||||
areYouSureYouWantToDeleteThisAttachment: 'Naozaj chcete zmazať túto prílohu?',
|
||||
areYouSureYouWantToDeleteThisBoard: 'Naozaj chcete zmazať túto tabuľu?',
|
||||
areYouSureYouWantToDeleteThisCard: 'Naozaj chcete zmazať túto kartu?',
|
||||
@@ -47,11 +47,11 @@ export default {
|
||||
boardNotFound_title: 'Tabuľa neexistuje',
|
||||
cardActions_title: 'Akcie na karte',
|
||||
cardNotFound_title: 'Karta neexistuje',
|
||||
cardOrActionAreDeleted: 'Karta alebo akcia sú zmazané.',
|
||||
cardOrActionAreDeleted: 'Karta alebo akcia sú zmazané',
|
||||
color: 'Farba',
|
||||
createBoard_title: 'Vytvoriť tabuľu',
|
||||
createLabel_title: 'Vytvoriť štítok',
|
||||
createNewOneOrSelectExistingOne: 'Vytvoriť nový alebo vyberte<br />už existujúci.',
|
||||
createNewOneOrSelectExistingOne: 'Vytvoriť nový alebo vyberte<br />už existujúci',
|
||||
createProject_title: 'Vytvoriť projekt',
|
||||
createTextFile_title: 'Vytvoriť textový súbor',
|
||||
currentPassword: 'Aktuálne heslo',
|
||||
@@ -111,14 +111,14 @@ export default {
|
||||
noLists: 'Žiadne zoznamy',
|
||||
noProjects: 'Žiadne projekty',
|
||||
notifications: 'Oznámenia',
|
||||
noUnreadNotifications: 'Žiadne neprečítané oznámenia.',
|
||||
noUnreadNotifications: 'Žiadne neprečítané oznámenia',
|
||||
openBoard_title: 'Otvoriť tabuľu',
|
||||
optional_inline: 'voliteľné',
|
||||
organization: 'Spoločnosť',
|
||||
phone: 'Telefón',
|
||||
preferences: 'Voľby',
|
||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||
'Tip: stlačte Ctrl-V (Cmd-V na Mac) pre vloženie prílohy zo schránky.',
|
||||
'Tip: stlačte Ctrl-V (Cmd-V na Mac) pre vloženie prílohy zo schránky',
|
||||
project: 'Projekt',
|
||||
projectNotFound_title: 'Projekt neexistuje',
|
||||
removeManager_title: 'Odstrániť správcu',
|
||||
|
||||
@@ -23,7 +23,7 @@ export default {
|
||||
administrator: 'Administratör',
|
||||
all: 'Alla',
|
||||
allChangesWillBeAutomaticallySavedAfterConnectionRestored:
|
||||
'Alla ändringar kommer att sparas automatiskt<br />så fort anslutningen är återställd.',
|
||||
'Alla ändringar kommer att sparas automatiskt<br />så fort anslutningen är återställd',
|
||||
areYouSureYouWantToDeleteThisAttachment:
|
||||
'Är du säker på att du vill ta bort den här bilagan?',
|
||||
areYouSureYouWantToDeleteThisBoard: 'Är du säker på att du vill ta bort den här tavlan?',
|
||||
@@ -49,11 +49,11 @@ export default {
|
||||
boardNotFound_title: 'Tavla Ej Funnen',
|
||||
cardActions_title: 'Kortåtgärder',
|
||||
cardNotFound_title: 'Kort Ej Funnet',
|
||||
cardOrActionAreDeleted: 'Kort eller åtgärd är borttagen.',
|
||||
cardOrActionAreDeleted: 'Kort eller åtgärd är borttagen',
|
||||
color: 'Färg',
|
||||
createBoard_title: 'Skapa Tavla',
|
||||
createLabel_title: 'Skapa Etikett',
|
||||
createNewOneOrSelectExistingOne: 'Skapa en ny eller välj<br />en redan existerande.',
|
||||
createNewOneOrSelectExistingOne: 'Skapa en ny eller välj<br />en redan existerande',
|
||||
createProject_title: 'Skapa Projekt',
|
||||
createTextFile_title: 'Skapa Textfil',
|
||||
currentPassword: 'Nuvarande lösenord',
|
||||
@@ -112,14 +112,14 @@ export default {
|
||||
noLists: 'Inga listor',
|
||||
noProjects: 'Inga projekt',
|
||||
notifications: 'Notifikationer',
|
||||
noUnreadNotifications: 'Inga olästa notifikationer.',
|
||||
noUnreadNotifications: 'Inga olästa notifikationer',
|
||||
openBoard_title: 'Öppna Tavla',
|
||||
optional_inline: 'valfri',
|
||||
organization: 'Organisation',
|
||||
phone: 'Telefon',
|
||||
preferences: 'Preferenser',
|
||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||
'Tips: tryck på Ctrl-V (Cmd-V på Mac) för att lägga till en bilaga från urklipp.',
|
||||
'Tips: tryck på Ctrl-V (Cmd-V på Mac) för att lägga till en bilaga från urklipp',
|
||||
project: 'Projekt',
|
||||
projectNotFound_title: 'Projekt Ej Funnet',
|
||||
removeManager_title: 'Ta Bort Projektledare',
|
||||
|
||||
@@ -47,7 +47,7 @@ export default {
|
||||
boardNotFound_title: 'Pano bulunamadı',
|
||||
cardActions_title: 'Kart İşlemleri',
|
||||
cardNotFound_title: 'Kart bulunamadı',
|
||||
cardOrActionAreDeleted: 'Kart veya işlem silindi.',
|
||||
cardOrActionAreDeleted: 'Kart veya işlem silindi',
|
||||
color: 'renk',
|
||||
createBoard_title: 'Pano Oluştur',
|
||||
createLabel_title: 'Etiket Oluştur',
|
||||
@@ -81,12 +81,12 @@ export default {
|
||||
editUsername_title: 'Kullanıcı Adını Düzenle',
|
||||
email: 'e-posta',
|
||||
emailAlreadyInUse: 'E-posta adresi zaten kullanımda',
|
||||
enterCardTitle: 'Kart başlığını girin...',
|
||||
enterDescription: 'Açıklamayı girin...',
|
||||
enterCardTitle: 'Kart başlığını girin',
|
||||
enterDescription: 'Açıklamayı girin',
|
||||
enterFilename: 'Dosya adını girin',
|
||||
enterListTitle: 'Liste başlığını girin...',
|
||||
enterListTitle: 'Liste başlığını girin',
|
||||
enterProjectTitle: 'Proje başlığını girin',
|
||||
enterTaskDescription: 'Görev açıklamasını girin...',
|
||||
enterTaskDescription: 'Görev açıklamasını girin',
|
||||
filterByLabels_title: 'Etikete Göre Filtrele',
|
||||
filterByMembers_title: 'Üyelere göre filtrele',
|
||||
fromComputer_title: 'Bilgisayardan',
|
||||
@@ -112,14 +112,14 @@ export default {
|
||||
noLists: 'Liste yok',
|
||||
noProjects: 'Proje yok',
|
||||
notifications: 'Bildirimler',
|
||||
noUnreadNotifications: 'Okunmamış bildirim yok.',
|
||||
noUnreadNotifications: 'Okunmamış bildirim yok',
|
||||
openBoard_title: 'Açık Pano',
|
||||
optional_inline: 'İsteğe bağlı',
|
||||
organization: 'Organizasyon',
|
||||
phone: 'telefon',
|
||||
preferences: 'Tercihler',
|
||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||
'İpucu: Panodan bir ek eklemek için CTRL-V ye (Macte Cmd-V) basın.',
|
||||
'İpucu: Panodan bir ek eklemek için CTRL-V ye (Macte Cmd-V) basın',
|
||||
project: 'Proje',
|
||||
projectNotFound_title: 'Proje bulunamadı',
|
||||
removeManager_title: 'Yöneticiyi Kaldır',
|
||||
@@ -133,7 +133,7 @@ export default {
|
||||
subscribeToMyOwnCardsByDefault: 'Varsayılan olarak kendi kartlarıma abone ol',
|
||||
taskActions_title: 'Görev Eylemleri',
|
||||
tasks: 'Görevler',
|
||||
thereIsNoPreviewAvailableForThisAttachment: 'Bu ek için önizleme mevcut değil.',
|
||||
thereIsNoPreviewAvailableForThisAttachment: 'Bu ek için önizleme mevcut değil',
|
||||
time: 'zaman',
|
||||
title: 'başlık',
|
||||
userActions_title: 'Kullanıcı İşlemleri',
|
||||
@@ -147,7 +147,7 @@ export default {
|
||||
username: 'kullanıcı adı',
|
||||
usernameAlreadyInUse: 'Kullanıcı adı zaten kullanımda',
|
||||
users: 'kullanıcı',
|
||||
writeComment: 'Yorum yazın...',
|
||||
writeComment: 'Yorum yazın',
|
||||
},
|
||||
action: {
|
||||
addAnotherCard: 'Başka bir kart ekle',
|
||||
|
||||
@@ -19,7 +19,7 @@ export default {
|
||||
administrator: 'Administrator',
|
||||
all: 'Barchasi',
|
||||
allChangesWillBeAutomaticallySavedAfterConnectionRestored:
|
||||
"Barcha o'zgarishlar tarmoq ulanishi tiklangandan so'ng<br />avtomatik saqlanadi.",
|
||||
"Barcha o'zgarishlar tarmoq ulanishi tiklangandan so'ng<br /> avtomatik saqlanadi",
|
||||
areYouSureYouWantToDeleteThisAttachment: "Ushbu biriktirmani o'chirmoqchimisiz?",
|
||||
areYouSureYouWantToDeleteThisBoard: "Ushbu doskani o'chirmoqchimisiz?",
|
||||
areYouSureYouWantToDeleteThisCard: "Ushbu kartani o'chirmoqchimisiz?",
|
||||
@@ -42,11 +42,11 @@ export default {
|
||||
boardNotFound_title: 'Doska Topilmadi',
|
||||
cardActions_title: 'Karta Amallari',
|
||||
cardNotFound_title: 'Karta Topilmadi',
|
||||
cardOrActionAreDeleted: "Karta yoki amal o'chirilgan.",
|
||||
cardOrActionAreDeleted: "Karta yoki amal o'chirilgan",
|
||||
color: 'Rang',
|
||||
createBoard_title: 'Doska Yaratish',
|
||||
createLabel_title: 'Yorliq Yaratish',
|
||||
createNewOneOrSelectExistingOne: "Yangisini tanlash yoki<br />mavjud bo'lganini tanlash.",
|
||||
createNewOneOrSelectExistingOne: "Yangisini tanlash yoki<br /> mavjud bo'lganini tanlash",
|
||||
createProject_title: 'Loyiha Yaratish',
|
||||
createTextFile_title: 'Matnli fayl yaratish',
|
||||
currentPassword: 'Hozirgi parol',
|
||||
@@ -105,14 +105,14 @@ export default {
|
||||
noLists: "Ro'yxatlar yo'q",
|
||||
noProjects: "Loyihalar yo'q",
|
||||
notifications: 'Bildirishnomalar',
|
||||
noUnreadNotifications: "O'qilmagan bildirishnomalar yo'q.",
|
||||
noUnreadNotifications: "O'qilmagan bildirishnomalar yo'q",
|
||||
openBoard_title: 'Doskani Ochish',
|
||||
optional_inline: 'ixtiyoriy',
|
||||
organization: 'Tashkilot',
|
||||
phone: 'Telefon',
|
||||
preferences: 'Afzalliklar',
|
||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||
"Tip: Buferdan ilova qo'shish uchun Ctrl-V (Mac da Cmd-V) ni bosing.",
|
||||
"Tip: Buferdan ilova qo'shish uchun Ctrl-V (Mac da Cmd-V) ni bosing",
|
||||
project: 'Loyiha',
|
||||
projectNotFound_title: 'Loyiha Topilmadi',
|
||||
removeManager_title: "Boshqaruvchini O'chirish",
|
||||
|
||||
@@ -43,14 +43,16 @@ export default class extends BaseModel {
|
||||
organization: attr(),
|
||||
language: attr(),
|
||||
subscribeToOwnCards: attr(),
|
||||
isAdmin: attr(),
|
||||
isLocked: attr(),
|
||||
isRoleLocked: attr(),
|
||||
isDeletionLocked: attr(),
|
||||
deletedAt: attr(),
|
||||
createdAt: attr({
|
||||
getDefault: () => new Date(),
|
||||
}),
|
||||
deletedAt: attr(),
|
||||
isAdmin: attr({
|
||||
getDefault: () => false,
|
||||
}),
|
||||
isLocked: attr({
|
||||
getDefault: () => false,
|
||||
}),
|
||||
isAvatarUpdating: attr({
|
||||
getDefault: () => false,
|
||||
}),
|
||||
|
||||
@@ -10,7 +10,6 @@ const initialState = {
|
||||
export default (state = initialState, { type, payload }) => {
|
||||
switch (type) {
|
||||
case ActionTypes.AUTHENTICATE__SUCCESS:
|
||||
case ActionTypes.USING_OIDC_AUTHENTICATE__SUCCESS:
|
||||
return {
|
||||
...state,
|
||||
accessToken: payload.accessToken,
|
||||
|
||||
@@ -4,6 +4,7 @@ import ActionTypes from '../constants/ActionTypes';
|
||||
import ModalTypes from '../constants/ModalTypes';
|
||||
|
||||
const initialState = {
|
||||
isInitializing: true,
|
||||
isLogouting: false,
|
||||
currentModal: null,
|
||||
};
|
||||
@@ -17,6 +18,11 @@ export default (state = initialState, { type, payload }) => {
|
||||
...state,
|
||||
currentModal: null,
|
||||
};
|
||||
case ActionTypes.CORE_INITIALIZE:
|
||||
return {
|
||||
...state,
|
||||
isInitializing: false,
|
||||
};
|
||||
case ActionTypes.LOGOUT__ACCESS_TOKEN_INVALIDATE:
|
||||
return {
|
||||
...state,
|
||||
|
||||
@@ -3,7 +3,6 @@ import { combineReducers } from 'redux';
|
||||
import router from './router';
|
||||
import socket from './socket';
|
||||
import orm from './orm';
|
||||
import root from './root';
|
||||
import auth from './auth';
|
||||
import core from './core';
|
||||
import ui from './ui';
|
||||
@@ -12,7 +11,6 @@ export default combineReducers({
|
||||
router,
|
||||
socket,
|
||||
orm,
|
||||
root,
|
||||
auth,
|
||||
core,
|
||||
ui,
|
||||
|
||||
@@ -1,36 +0,0 @@
|
||||
import ActionTypes from '../constants/ActionTypes';
|
||||
|
||||
const initialState = {
|
||||
isInitializing: true,
|
||||
config: null,
|
||||
};
|
||||
|
||||
// eslint-disable-next-line default-param-last
|
||||
export default (state = initialState, { type, payload }) => {
|
||||
switch (type) {
|
||||
case ActionTypes.LOGIN_INITIALIZE:
|
||||
return {
|
||||
...state,
|
||||
isInitializing: false,
|
||||
config: payload.config,
|
||||
};
|
||||
case ActionTypes.AUTHENTICATE__SUCCESS:
|
||||
case ActionTypes.USING_OIDC_AUTHENTICATE__SUCCESS:
|
||||
return {
|
||||
...state,
|
||||
isInitializing: true,
|
||||
};
|
||||
case ActionTypes.CORE_INITIALIZE:
|
||||
return {
|
||||
...state,
|
||||
isInitializing: false,
|
||||
};
|
||||
case ActionTypes.CORE_INITIALIZE__CONFIG_FETCH:
|
||||
return {
|
||||
...state,
|
||||
config: payload.config,
|
||||
};
|
||||
default:
|
||||
return state;
|
||||
}
|
||||
};
|
||||
@@ -1,7 +1,4 @@
|
||||
import { LOCATION_CHANGE_HANDLE } from '../../lib/redux-router';
|
||||
|
||||
import ActionTypes from '../../constants/ActionTypes';
|
||||
import Paths from '../../constants/Paths';
|
||||
|
||||
const initialState = {
|
||||
data: {
|
||||
@@ -9,22 +6,12 @@ const initialState = {
|
||||
password: '',
|
||||
},
|
||||
isSubmitting: false,
|
||||
isSubmittingUsingOidc: false,
|
||||
error: null,
|
||||
};
|
||||
|
||||
// eslint-disable-next-line default-param-last
|
||||
export default (state = initialState, { type, payload }) => {
|
||||
switch (type) {
|
||||
case LOCATION_CHANGE_HANDLE:
|
||||
if (payload.location.pathname === Paths.OIDC_CALLBACK) {
|
||||
return {
|
||||
...state,
|
||||
isSubmittingUsingOidc: true,
|
||||
};
|
||||
}
|
||||
|
||||
return state;
|
||||
case ActionTypes.AUTHENTICATE:
|
||||
return {
|
||||
...state,
|
||||
@@ -35,7 +22,6 @@ export default (state = initialState, { type, payload }) => {
|
||||
isSubmitting: true,
|
||||
};
|
||||
case ActionTypes.AUTHENTICATE__SUCCESS:
|
||||
case ActionTypes.USING_OIDC_AUTHENTICATE__SUCCESS:
|
||||
return initialState;
|
||||
case ActionTypes.AUTHENTICATE__FAILURE:
|
||||
return {
|
||||
@@ -43,12 +29,6 @@ export default (state = initialState, { type, payload }) => {
|
||||
isSubmitting: false,
|
||||
error: payload.error,
|
||||
};
|
||||
case ActionTypes.USING_OIDC_AUTHENTICATE__FAILURE:
|
||||
return {
|
||||
...state,
|
||||
isSubmittingUsingOidc: false,
|
||||
error: payload.error,
|
||||
};
|
||||
case ActionTypes.AUTHENTICATE_ERROR_CLEAR:
|
||||
return {
|
||||
...state,
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
import { all, apply, fork, select, take } from 'redux-saga/effects';
|
||||
import { all, apply, fork, take } from 'redux-saga/effects';
|
||||
|
||||
import watchers from './watchers';
|
||||
import services from './services';
|
||||
import selectors from '../../selectors';
|
||||
import { socket } from '../../api';
|
||||
import ActionTypes from '../../constants/ActionTypes';
|
||||
import Paths from '../../constants/Paths';
|
||||
@@ -15,12 +14,5 @@ export default function* coreSaga() {
|
||||
|
||||
yield take(ActionTypes.LOGOUT);
|
||||
|
||||
const oidcConfig = yield select(selectors.selectOidcConfig);
|
||||
|
||||
if (oidcConfig && oidcConfig.endSessionUrl !== null) {
|
||||
// Redirect the user to the IDP to log out.
|
||||
window.location.href = oidcConfig.endSessionUrl;
|
||||
} else {
|
||||
window.location.href = Paths.LOGIN;
|
||||
}
|
||||
window.location.href = Paths.LOGIN;
|
||||
}
|
||||
|
||||
@@ -1,23 +1,13 @@
|
||||
import { call, put, select, take } from 'redux-saga/effects';
|
||||
import { call, put, take } from 'redux-saga/effects';
|
||||
|
||||
import request from '../request';
|
||||
import requests from '../requests';
|
||||
import selectors from '../../../selectors';
|
||||
import actions from '../../../actions';
|
||||
import api from '../../../api';
|
||||
import i18n from '../../../i18n';
|
||||
import { removeAccessToken } from '../../../utils/access-token-storage';
|
||||
|
||||
export function* initializeCore() {
|
||||
const currentConfig = yield select(selectors.selectConfig); // TODO: add boolean selector?
|
||||
|
||||
let config;
|
||||
if (!currentConfig) {
|
||||
({ item: config } = yield call(api.getConfig)); // TODO: handle error
|
||||
|
||||
yield put(actions.initializeCore.fetchConfig(config));
|
||||
}
|
||||
|
||||
const {
|
||||
user,
|
||||
board,
|
||||
|
||||
@@ -33,16 +33,15 @@ export function* handleLocationChange() {
|
||||
|
||||
switch (pathsMatch.pattern.path) {
|
||||
case Paths.LOGIN:
|
||||
case Paths.OIDC_CALLBACK:
|
||||
yield call(goToRoot);
|
||||
|
||||
return;
|
||||
break;
|
||||
default:
|
||||
}
|
||||
|
||||
const isInitializing = yield select(selectors.selectIsInitializing);
|
||||
const isCoreInitializing = yield select(selectors.selectIsCoreInitializing);
|
||||
|
||||
if (isInitializing) {
|
||||
if (isCoreInitializing) {
|
||||
yield take(ActionTypes.CORE_INITIALIZE);
|
||||
}
|
||||
|
||||
|
||||
@@ -14,45 +14,24 @@ export function* handleSocketReconnect() {
|
||||
|
||||
yield put(actions.handleSocketReconnect.fetchCore(currentUserId, boardId));
|
||||
|
||||
let user;
|
||||
let board;
|
||||
let users;
|
||||
let projects;
|
||||
let projectManagers;
|
||||
let boards;
|
||||
let boardMemberships;
|
||||
let labels;
|
||||
let lists;
|
||||
let cards;
|
||||
let cardMemberships;
|
||||
let cardLabels;
|
||||
let tasks;
|
||||
let attachments;
|
||||
let activities;
|
||||
let notifications;
|
||||
|
||||
try {
|
||||
({
|
||||
user,
|
||||
board,
|
||||
users,
|
||||
projects,
|
||||
projectManagers,
|
||||
boards,
|
||||
boardMemberships,
|
||||
labels,
|
||||
lists,
|
||||
cards,
|
||||
cardMemberships,
|
||||
cardLabels,
|
||||
tasks,
|
||||
attachments,
|
||||
activities,
|
||||
notifications,
|
||||
} = yield call(requests.fetchCore));
|
||||
} catch (error) {
|
||||
return;
|
||||
}
|
||||
const {
|
||||
user,
|
||||
board,
|
||||
users,
|
||||
projects,
|
||||
projectManagers,
|
||||
boards,
|
||||
boardMemberships,
|
||||
labels,
|
||||
lists,
|
||||
cards,
|
||||
cardMemberships,
|
||||
cardLabels,
|
||||
tasks,
|
||||
attachments,
|
||||
activities,
|
||||
notifications,
|
||||
} = yield call(requests.fetchCore); // TODO: handle error
|
||||
|
||||
yield put(
|
||||
actions.handleSocketReconnect(
|
||||
|
||||
@@ -4,5 +4,8 @@ import services from '../services';
|
||||
import EntryActionTypes from '../../../constants/EntryActionTypes';
|
||||
|
||||
export default function* coreWatchers() {
|
||||
yield all([takeEvery(EntryActionTypes.LOGOUT, () => services.logout())]);
|
||||
yield all([
|
||||
takeEvery(EntryActionTypes.CORE_INITIALIZE, () => services.initializeCore()),
|
||||
takeEvery(EntryActionTypes.LOGOUT, () => services.logout()),
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -7,9 +7,7 @@ import ActionTypes from '../../constants/ActionTypes';
|
||||
export default function* loginSaga() {
|
||||
const watcherTasks = yield all(watchers.map((watcher) => fork(watcher)));
|
||||
|
||||
yield fork(services.initializeLogin);
|
||||
|
||||
yield take([ActionTypes.AUTHENTICATE__SUCCESS, ActionTypes.USING_OIDC_AUTHENTICATE__SUCCESS]);
|
||||
yield take(ActionTypes.AUTHENTICATE__SUCCESS);
|
||||
|
||||
yield cancel(watcherTasks);
|
||||
yield call(services.goToRoot);
|
||||
|
||||
@@ -1,25 +1,19 @@
|
||||
import { nanoid } from 'nanoid';
|
||||
import { call, put, select } from 'redux-saga/effects';
|
||||
import { replace } from '../../../lib/redux-router';
|
||||
import { call, put } from 'redux-saga/effects';
|
||||
|
||||
import selectors from '../../../selectors';
|
||||
import actions from '../../../actions';
|
||||
import api from '../../../api';
|
||||
import { setAccessToken } from '../../../utils/access-token-storage';
|
||||
import Paths from '../../../constants/Paths';
|
||||
|
||||
export function* initializeLogin() {
|
||||
const { item: config } = yield call(api.getConfig); // TODO: handle error
|
||||
|
||||
yield put(actions.initializeLogin(config));
|
||||
}
|
||||
|
||||
export function* authenticate(data) {
|
||||
yield put(actions.authenticate(data));
|
||||
|
||||
let accessToken;
|
||||
let accessToken = data.access_token;
|
||||
try {
|
||||
({ item: accessToken } = yield call(api.createAccessToken, data));
|
||||
if (accessToken) {
|
||||
({ item: accessToken } = yield call(api.exchangeOidcToken, accessToken));
|
||||
} else {
|
||||
({ item: accessToken } = yield call(api.createAccessToken, data));
|
||||
}
|
||||
} catch (error) {
|
||||
yield put(actions.authenticate.failure(error));
|
||||
return;
|
||||
@@ -29,94 +23,11 @@ export function* authenticate(data) {
|
||||
yield put(actions.authenticate.success(accessToken));
|
||||
}
|
||||
|
||||
export function* authenticateUsingOidc() {
|
||||
const oidcConfig = yield select(selectors.selectOidcConfig);
|
||||
|
||||
const state = nanoid();
|
||||
window.sessionStorage.setItem('oidc-state', state);
|
||||
|
||||
const nonce = nanoid();
|
||||
window.sessionStorage.setItem('oidc-nonce', nonce);
|
||||
|
||||
let redirectUrl = `${oidcConfig.authorizationUrl}`;
|
||||
redirectUrl += `&state=${encodeURIComponent(state)}`;
|
||||
redirectUrl += `&nonce=${encodeURIComponent(nonce)}`;
|
||||
|
||||
window.location.href = redirectUrl;
|
||||
}
|
||||
|
||||
export function* authenticateUsingOidcCallback() {
|
||||
// https://github.com/plankanban/planka/issues/511#issuecomment-1771385639
|
||||
const params = new URLSearchParams(window.location.hash.substring(1) || window.location.search);
|
||||
|
||||
const state = window.sessionStorage.getItem('oidc-state');
|
||||
window.sessionStorage.removeItem('oidc-state');
|
||||
|
||||
const nonce = window.sessionStorage.getItem('oidc-nonce');
|
||||
window.sessionStorage.removeItem('oidc-nonce');
|
||||
|
||||
yield put(replace(Paths.LOGIN));
|
||||
|
||||
if (params.get('error') !== null) {
|
||||
yield put(
|
||||
actions.authenticateUsingOidc.failure(
|
||||
new Error(
|
||||
`OIDC Authorization error: ${params.get('error')}: ${params.get('error_description')}`,
|
||||
),
|
||||
),
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
const code = params.get('code');
|
||||
if (code === null) {
|
||||
yield put(
|
||||
actions.authenticateUsingOidc.failure(new Error('Invalid OIDC response: no code parameter')),
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
if (params.get('state') !== state) {
|
||||
yield put(
|
||||
actions.authenticateUsingOidc.failure(
|
||||
new Error('Unable to process OIDC response: state mismatch'),
|
||||
),
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
if (nonce === null) {
|
||||
yield put(
|
||||
actions.authenticateUsingOidc.failure(
|
||||
new Error('Unable to process OIDC response: no nonce issued'),
|
||||
),
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
let accessToken;
|
||||
try {
|
||||
({ item: accessToken } = yield call(api.exchangeForAccessTokenUsingOidc, {
|
||||
code,
|
||||
nonce,
|
||||
}));
|
||||
} catch (error) {
|
||||
yield put(actions.authenticateUsingOidc.failure(error));
|
||||
return;
|
||||
}
|
||||
|
||||
yield call(setAccessToken, accessToken);
|
||||
yield put(actions.authenticateUsingOidc.success(accessToken));
|
||||
}
|
||||
|
||||
export function* clearAuthenticateError() {
|
||||
yield put(actions.clearAuthenticateError());
|
||||
}
|
||||
|
||||
export default {
|
||||
initializeLogin,
|
||||
authenticate,
|
||||
authenticateUsingOidc,
|
||||
authenticateUsingOidcCallback,
|
||||
clearAuthenticateError,
|
||||
};
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
import { call, put, select, take } from 'redux-saga/effects';
|
||||
import { call, put, select } from 'redux-saga/effects';
|
||||
import { push } from '../../../lib/redux-router';
|
||||
|
||||
import { authenticateUsingOidcCallback } from './login';
|
||||
import selectors from '../../../selectors';
|
||||
import ActionTypes from '../../../constants/ActionTypes';
|
||||
import Paths from '../../../constants/Paths';
|
||||
|
||||
export function* goToLogin() {
|
||||
@@ -29,17 +27,6 @@ export function* handleLocationChange() {
|
||||
yield call(goToLogin);
|
||||
|
||||
break;
|
||||
case Paths.OIDC_CALLBACK: {
|
||||
const isInitializing = yield select(selectors.selectIsInitializing);
|
||||
|
||||
if (isInitializing) {
|
||||
yield take(ActionTypes.LOGIN_INITIALIZE);
|
||||
}
|
||||
|
||||
yield call(authenticateUsingOidcCallback);
|
||||
|
||||
break;
|
||||
}
|
||||
default:
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,7 +8,6 @@ export default function* loginWatchers() {
|
||||
takeEvery(EntryActionTypes.AUTHENTICATE, ({ payload: { data } }) =>
|
||||
services.authenticate(data),
|
||||
),
|
||||
takeEvery(EntryActionTypes.USING_OIDC_AUTHENTICATE, () => services.authenticateUsingOidc()),
|
||||
takeEvery(EntryActionTypes.AUTHENTICATE_ERROR_CLEAR, () => services.clearAuthenticateError()),
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -6,6 +6,8 @@ import Config from '../constants/Config';
|
||||
|
||||
export const selectAccessToken = ({ auth: { accessToken } }) => accessToken;
|
||||
|
||||
export const selectIsCoreInitializing = ({ core: { isInitializing } }) => isInitializing;
|
||||
|
||||
export const selectIsLogouting = ({ core: { isLogouting } }) => isLogouting;
|
||||
|
||||
const nextPosition = (items, index, excludedId) => {
|
||||
@@ -113,6 +115,7 @@ export const selectNextTaskPosition = createSelector(
|
||||
|
||||
export default {
|
||||
selectAccessToken,
|
||||
selectIsCoreInitializing,
|
||||
selectIsLogouting,
|
||||
selectNextBoardPosition,
|
||||
selectNextLabelPosition,
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import router from './router';
|
||||
import socket from './socket';
|
||||
import root from './root';
|
||||
import core from './core';
|
||||
import modals from './modals';
|
||||
import users from './users';
|
||||
@@ -17,7 +16,6 @@ import attachments from './attachments';
|
||||
export default {
|
||||
...router,
|
||||
...socket,
|
||||
...root,
|
||||
...core,
|
||||
...modals,
|
||||
...users,
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
export const selectIsInitializing = ({ root: { isInitializing } }) => isInitializing;
|
||||
|
||||
export const selectConfig = ({ root: { config } }) => config;
|
||||
|
||||
export const selectOidcConfig = (state) => selectConfig(state).oidc;
|
||||
|
||||
export default {
|
||||
selectIsInitializing,
|
||||
selectConfig,
|
||||
selectOidcConfig,
|
||||
};
|
||||
@@ -1,5 +1,5 @@
|
||||
import Cookies from 'js-cookie';
|
||||
import { jwtDecode } from 'jwt-decode';
|
||||
import jwtDecode from 'jwt-decode';
|
||||
|
||||
import Config from '../constants/Config';
|
||||
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
version: '3'
|
||||
|
||||
services:
|
||||
postgres:
|
||||
image: postgres:alpine
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- db-data:/var/lib/postgresql/data
|
||||
ports:
|
||||
- 5432:5432
|
||||
environment:
|
||||
- POSTGRES_DB=planka
|
||||
- POSTGRES_HOST_AUTH_METHOD=trust
|
||||
|
||||
volumes:
|
||||
db-data:
|
||||
+3
-52
@@ -1,65 +1,16 @@
|
||||
version: '3'
|
||||
|
||||
services:
|
||||
planka:
|
||||
image: ghcr.io/plankanban/planka:dev
|
||||
command: >
|
||||
bash -c
|
||||
"for i in `seq 1 30`; do
|
||||
./start.sh &&
|
||||
s=$$? && break || s=$$?;
|
||||
echo \"Tried $$i times. Waiting 5 seconds...\";
|
||||
sleep 5;
|
||||
done; (exit $$s)"
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- user-avatars:/app/public/user-avatars
|
||||
- project-background-images:/app/public/project-background-images
|
||||
- attachments:/app/private/attachments
|
||||
ports:
|
||||
- 3000:1337
|
||||
environment:
|
||||
- BASE_URL=http://localhost:3000
|
||||
- DATABASE_URL=postgresql://postgres@postgres/planka
|
||||
- SECRET_KEY=notsecretkey
|
||||
|
||||
# - TRUST_PROXY=0
|
||||
# - TOKEN_EXPIRES_IN=365 # In days
|
||||
|
||||
# related: https://github.com/knex/knex/issues/2354
|
||||
# As knex does not pass query parameters from the connection string we
|
||||
# have to use environment variables in order to pass the desired values, e.g.
|
||||
# - PGSSLMODE=<value>
|
||||
|
||||
# Configure knex to accept SSL certificates
|
||||
# - KNEX_REJECT_UNAUTHORIZED_SSL_CERTIFICATE=false
|
||||
|
||||
# - DEFAULT_ADMIN_EMAIL=demo@demo.demo # Do not remove if you want to prevent this user from being edited/deleted
|
||||
# - DEFAULT_ADMIN_PASSWORD=demo
|
||||
# - DEFAULT_ADMIN_NAME=Demo Demo
|
||||
# - DEFAULT_ADMIN_USERNAME=demo
|
||||
|
||||
# - OIDC_ISSUER=
|
||||
# - OIDC_CLIENT_ID=
|
||||
# - OIDC_CLIENT_SECRET=
|
||||
# - OIDC_SCOPES=openid email profile
|
||||
# - OIDC_ADMIN_ROLES=admin
|
||||
# - OIDC_ROLES_ATTRIBUTE=groups
|
||||
# - OIDC_IGNORE_ROLES=true
|
||||
depends_on:
|
||||
- postgres
|
||||
|
||||
postgres:
|
||||
image: postgres:14-alpine
|
||||
image: postgres:alpine
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- db-data:/var/lib/postgresql/data
|
||||
ports:
|
||||
- 5432:5432
|
||||
environment:
|
||||
- POSTGRES_DB=planka
|
||||
- POSTGRES_HOST_AUTH_METHOD=trust
|
||||
|
||||
volumes:
|
||||
user-avatars:
|
||||
project-background-images:
|
||||
attachments:
|
||||
db-data:
|
||||
|
||||
+6
-15
@@ -20,11 +20,15 @@ services:
|
||||
- 3000:1337
|
||||
environment:
|
||||
- BASE_URL=http://localhost:3000
|
||||
- TRUST_PROXY=0
|
||||
- DATABASE_URL=postgresql://postgres@postgres/planka
|
||||
- SECRET_KEY=notsecretkey
|
||||
|
||||
# - TRUST_PROXY=0
|
||||
# - TOKEN_EXPIRES_IN=365 # In days
|
||||
# Can be removed after installation
|
||||
- DEFAULT_ADMIN_EMAIL=demo@demo.demo # Do not remove if you want to prevent this user from being edited/deleted
|
||||
- DEFAULT_ADMIN_PASSWORD=demo
|
||||
- DEFAULT_ADMIN_NAME=Demo Demo
|
||||
- DEFAULT_ADMIN_USERNAME=demo
|
||||
|
||||
# related: https://github.com/knex/knex/issues/2354
|
||||
# As knex does not pass query parameters from the connection string we
|
||||
@@ -33,19 +37,6 @@ services:
|
||||
|
||||
# Configure knex to accept SSL certificates
|
||||
# - KNEX_REJECT_UNAUTHORIZED_SSL_CERTIFICATE=false
|
||||
|
||||
# - DEFAULT_ADMIN_EMAIL=demo@demo.demo # Do not remove if you want to prevent this user from being edited/deleted
|
||||
# - DEFAULT_ADMIN_PASSWORD=demo
|
||||
# - DEFAULT_ADMIN_NAME=Demo Demo
|
||||
# - DEFAULT_ADMIN_USERNAME=demo
|
||||
|
||||
# - OIDC_ISSUER=
|
||||
# - OIDC_CLIENT_ID=
|
||||
# - OIDC_CLIENT_SECRET=
|
||||
# - OIDC_SCOPES=openid email profile
|
||||
# - OIDC_ADMIN_ROLES=admin
|
||||
# - OIDC_ROLES_ATTRIBUTE=groups
|
||||
# - OIDC_IGNORE_ROLES=true
|
||||
depends_on:
|
||||
- postgres
|
||||
|
||||
|
||||
Generated
+827
-1384
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user