mirror of
https://github.com/plankanban/planka.git
synced 2025-12-20 01:14:12 +03:00
feat: Add ability to configure and test SMTP via UI
This commit is contained in:
@@ -224,11 +224,11 @@ extraEnv: []
|
|||||||
## value: "Your Name"
|
## value: "Your Name"
|
||||||
## - name: SMTP_SECURE
|
## - name: SMTP_SECURE
|
||||||
## value: "true"
|
## value: "true"
|
||||||
|
## - name: SMTP_TLS_REJECT_UNAUTHORIZED
|
||||||
|
## value: "false"
|
||||||
## - name: SMTP_USER
|
## - name: SMTP_USER
|
||||||
## value: "your_email@example.com"
|
## value: "your_email@example.com"
|
||||||
## - name: SMTP_PASSWORD
|
## - name: SMTP_PASSWORD
|
||||||
## value: "your_password"
|
## value: "your_password"
|
||||||
## - name: SMTP_FROM
|
## - name: SMTP_FROM
|
||||||
## value: "your_email@example.com"
|
## value: "your_email@example.com"
|
||||||
## - name: SMTP_TLS_REJECT_UNAUTHORIZED
|
|
||||||
## value: "false"
|
|
||||||
|
|||||||
59
client/src/actions/config.js
Normal file
59
client/src/actions/config.js
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
/*!
|
||||||
|
* Copyright (c) 2024 PLANKA Software GmbH
|
||||||
|
* Licensed under the Fair Use License: https://github.com/plankanban/planka/blob/master/LICENSE.md
|
||||||
|
*/
|
||||||
|
|
||||||
|
import ActionTypes from '../constants/ActionTypes';
|
||||||
|
|
||||||
|
const updateConfig = (data) => ({
|
||||||
|
type: ActionTypes.CONFIG_UPDATE,
|
||||||
|
payload: {
|
||||||
|
data,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
updateConfig.success = (config) => ({
|
||||||
|
type: ActionTypes.CONFIG_UPDATE__SUCCESS,
|
||||||
|
payload: {
|
||||||
|
config,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
updateConfig.failure = (error) => ({
|
||||||
|
type: ActionTypes.CONFIG_UPDATE__FAILURE,
|
||||||
|
payload: {
|
||||||
|
error,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const handleConfigUpdate = (config) => ({
|
||||||
|
type: ActionTypes.CONFIG_UPDATE_HANDLE,
|
||||||
|
payload: {
|
||||||
|
config,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const testSmtpConfig = () => ({
|
||||||
|
type: ActionTypes.SMTP_CONFIG_TEST,
|
||||||
|
payload: {},
|
||||||
|
});
|
||||||
|
|
||||||
|
testSmtpConfig.success = (logs) => ({
|
||||||
|
type: ActionTypes.SMTP_CONFIG_TEST__SUCCESS,
|
||||||
|
payload: {
|
||||||
|
logs,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
testSmtpConfig.failure = (error) => ({
|
||||||
|
type: ActionTypes.SMTP_CONFIG_TEST__FAILURE,
|
||||||
|
payload: {
|
||||||
|
error,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
export default {
|
||||||
|
updateConfig,
|
||||||
|
handleConfigUpdate,
|
||||||
|
testSmtpConfig,
|
||||||
|
};
|
||||||
@@ -6,6 +6,7 @@
|
|||||||
import ActionTypes from '../constants/ActionTypes';
|
import ActionTypes from '../constants/ActionTypes';
|
||||||
|
|
||||||
const initializeCore = (
|
const initializeCore = (
|
||||||
|
config,
|
||||||
user,
|
user,
|
||||||
board,
|
board,
|
||||||
webhooks,
|
webhooks,
|
||||||
@@ -32,6 +33,7 @@ const initializeCore = (
|
|||||||
) => ({
|
) => ({
|
||||||
type: ActionTypes.CORE_INITIALIZE,
|
type: ActionTypes.CORE_INITIALIZE,
|
||||||
payload: {
|
payload: {
|
||||||
|
config,
|
||||||
user,
|
user,
|
||||||
board,
|
board,
|
||||||
webhooks,
|
webhooks,
|
||||||
@@ -58,10 +60,10 @@ const initializeCore = (
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
initializeCore.fetchConfig = (config) => ({
|
initializeCore.fetchBootstrap = (bootstrap) => ({
|
||||||
type: ActionTypes.CORE_INITIALIZE__CONFIG_FETCH,
|
type: ActionTypes.CORE_INITIALIZE__BOOTSTRAP_FETCH,
|
||||||
payload: {
|
payload: {
|
||||||
config,
|
bootstrap,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import socket from './socket';
|
|||||||
import login from './login';
|
import login from './login';
|
||||||
import core from './core';
|
import core from './core';
|
||||||
import modals from './modals';
|
import modals from './modals';
|
||||||
|
import config from './config';
|
||||||
import webhooks from './webhooks';
|
import webhooks from './webhooks';
|
||||||
import users from './users';
|
import users from './users';
|
||||||
import projects from './projects';
|
import projects from './projects';
|
||||||
@@ -36,6 +37,7 @@ export default {
|
|||||||
...login,
|
...login,
|
||||||
...core,
|
...core,
|
||||||
...modals,
|
...modals,
|
||||||
|
...config,
|
||||||
...webhooks,
|
...webhooks,
|
||||||
...users,
|
...users,
|
||||||
...projects,
|
...projects,
|
||||||
|
|||||||
@@ -5,10 +5,10 @@
|
|||||||
|
|
||||||
import ActionTypes from '../constants/ActionTypes';
|
import ActionTypes from '../constants/ActionTypes';
|
||||||
|
|
||||||
const initializeLogin = (config) => ({
|
const initializeLogin = (bootstrap) => ({
|
||||||
type: ActionTypes.LOGIN_INITIALIZE,
|
type: ActionTypes.LOGIN_INITIALIZE,
|
||||||
payload: {
|
payload: {
|
||||||
config,
|
bootstrap,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ const handleSocketDisconnect = () => ({
|
|||||||
});
|
});
|
||||||
|
|
||||||
const handleSocketReconnect = (
|
const handleSocketReconnect = (
|
||||||
|
bootstrap,
|
||||||
config,
|
config,
|
||||||
user,
|
user,
|
||||||
board,
|
board,
|
||||||
@@ -38,6 +39,7 @@ const handleSocketReconnect = (
|
|||||||
) => ({
|
) => ({
|
||||||
type: ActionTypes.SOCKET_RECONNECT_HANDLE,
|
type: ActionTypes.SOCKET_RECONNECT_HANDLE,
|
||||||
payload: {
|
payload: {
|
||||||
|
bootstrap,
|
||||||
config,
|
config,
|
||||||
user,
|
user,
|
||||||
board,
|
board,
|
||||||
|
|||||||
@@ -65,6 +65,7 @@ const handleUserUpdate = (
|
|||||||
user,
|
user,
|
||||||
projectIds,
|
projectIds,
|
||||||
boardIds,
|
boardIds,
|
||||||
|
bootstrap,
|
||||||
config,
|
config,
|
||||||
board,
|
board,
|
||||||
webhooks,
|
webhooks,
|
||||||
@@ -94,6 +95,7 @@ const handleUserUpdate = (
|
|||||||
user,
|
user,
|
||||||
projectIds,
|
projectIds,
|
||||||
boardIds,
|
boardIds,
|
||||||
|
bootstrap,
|
||||||
config,
|
config,
|
||||||
board,
|
board,
|
||||||
webhooks,
|
webhooks,
|
||||||
|
|||||||
14
client/src/api/bootstrap.js
vendored
Normal file
14
client/src/api/bootstrap.js
vendored
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
/*!
|
||||||
|
* Copyright (c) 2024 PLANKA Software GmbH
|
||||||
|
* Licensed under the Fair Use License: https://github.com/plankanban/planka/blob/master/LICENSE.md
|
||||||
|
*/
|
||||||
|
|
||||||
|
import http from './http';
|
||||||
|
|
||||||
|
/* Actions */
|
||||||
|
|
||||||
|
const getBootstrap = (headers) => http.get('/bootstrap', undefined, headers);
|
||||||
|
|
||||||
|
export default {
|
||||||
|
getBootstrap,
|
||||||
|
};
|
||||||
@@ -3,12 +3,18 @@
|
|||||||
* Licensed under the Fair Use License: https://github.com/plankanban/planka/blob/master/LICENSE.md
|
* Licensed under the Fair Use License: https://github.com/plankanban/planka/blob/master/LICENSE.md
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import http from './http';
|
import socket from './socket';
|
||||||
|
|
||||||
/* Actions */
|
/* Actions */
|
||||||
|
|
||||||
const getConfig = (headers) => http.get('/config', undefined, headers);
|
const getConfig = (headers) => socket.get('/config', undefined, headers);
|
||||||
|
|
||||||
|
const updateConfig = (data, headers) => socket.patch('/config', data, headers);
|
||||||
|
|
||||||
|
const testSmtpConfig = (headers) => socket.post('/config/test-smtp', undefined, headers);
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
getConfig,
|
getConfig,
|
||||||
|
updateConfig,
|
||||||
|
testSmtpConfig,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -5,9 +5,10 @@
|
|||||||
|
|
||||||
import http from './http';
|
import http from './http';
|
||||||
import socket from './socket';
|
import socket from './socket';
|
||||||
import config from './config';
|
import bootstrap from './bootstrap';
|
||||||
import terms from './terms';
|
import terms from './terms';
|
||||||
import accessTokens from './access-tokens';
|
import accessTokens from './access-tokens';
|
||||||
|
import config from './config';
|
||||||
import webhooks from './webhooks';
|
import webhooks from './webhooks';
|
||||||
import users from './users';
|
import users from './users';
|
||||||
import projects from './projects';
|
import projects from './projects';
|
||||||
@@ -35,9 +36,10 @@ import notificationServices from './notification-services';
|
|||||||
export { http, socket };
|
export { http, socket };
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
...config,
|
...bootstrap,
|
||||||
...terms,
|
...terms,
|
||||||
...accessTokens,
|
...accessTokens,
|
||||||
|
...config,
|
||||||
...webhooks,
|
...webhooks,
|
||||||
...users,
|
...users,
|
||||||
...projects,
|
...projects,
|
||||||
|
|||||||
@@ -5,18 +5,22 @@
|
|||||||
|
|
||||||
import React, { useCallback, useState } from 'react';
|
import React, { useCallback, useState } from 'react';
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import { useDispatch } from 'react-redux';
|
import { useDispatch, useSelector } from 'react-redux';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
import { Modal, Tab } from 'semantic-ui-react';
|
import { Modal, Tab } from 'semantic-ui-react';
|
||||||
|
|
||||||
|
import selectors from '../../../selectors';
|
||||||
import entryActions from '../../../entry-actions';
|
import entryActions from '../../../entry-actions';
|
||||||
import { useClosableModal } from '../../../hooks';
|
import { useClosableModal } from '../../../hooks';
|
||||||
import UsersPane from './UsersPane';
|
import UsersPane from './UsersPane';
|
||||||
|
import SmtpPane from './SmtpPane';
|
||||||
import WebhooksPane from './WebhooksPane';
|
import WebhooksPane from './WebhooksPane';
|
||||||
|
|
||||||
import styles from './AdministrationModal.module.scss';
|
import styles from './AdministrationModal.module.scss';
|
||||||
|
|
||||||
const AdministrationModal = React.memo(() => {
|
const AdministrationModal = React.memo(() => {
|
||||||
|
const config = useSelector(selectors.selectConfig);
|
||||||
|
|
||||||
const dispatch = useDispatch();
|
const dispatch = useDispatch();
|
||||||
const [t] = useTranslation();
|
const [t] = useTranslation();
|
||||||
const [activeTabIndex, setActiveTabIndex] = useState(0);
|
const [activeTabIndex, setActiveTabIndex] = useState(0);
|
||||||
@@ -38,13 +42,21 @@ const AdministrationModal = React.memo(() => {
|
|||||||
}),
|
}),
|
||||||
render: () => <UsersPane />,
|
render: () => <UsersPane />,
|
||||||
},
|
},
|
||||||
{
|
];
|
||||||
menuItem: t('common.webhooks', {
|
if (config.smtpHost !== undefined) {
|
||||||
|
panes.push({
|
||||||
|
menuItem: t('common.smtp', {
|
||||||
context: 'title',
|
context: 'title',
|
||||||
}),
|
}),
|
||||||
render: () => <WebhooksPane />,
|
render: () => <SmtpPane />,
|
||||||
},
|
});
|
||||||
];
|
}
|
||||||
|
panes.push({
|
||||||
|
menuItem: t('common.webhooks', {
|
||||||
|
context: 'title',
|
||||||
|
}),
|
||||||
|
render: () => <WebhooksPane />,
|
||||||
|
});
|
||||||
|
|
||||||
const isUsersPaneActive = activeTabIndex === 0;
|
const isUsersPaneActive = activeTabIndex === 0;
|
||||||
|
|
||||||
|
|||||||
227
client/src/components/common/AdministrationModal/SmtpPane.jsx
Normal file
227
client/src/components/common/AdministrationModal/SmtpPane.jsx
Normal file
@@ -0,0 +1,227 @@
|
|||||||
|
/*!
|
||||||
|
* Copyright (c) 2024 PLANKA Software GmbH
|
||||||
|
* Licensed under the Fair Use License: https://github.com/plankanban/planka/blob/master/LICENSE.md
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { dequal } from 'dequal';
|
||||||
|
import React, { useCallback, useMemo } from 'react';
|
||||||
|
import classNames from 'classnames';
|
||||||
|
import { useDispatch, useSelector } from 'react-redux';
|
||||||
|
import { useTranslation } from 'react-i18next';
|
||||||
|
import TextareaAutosize from 'react-textarea-autosize';
|
||||||
|
import { Button, Checkbox, Divider, Form, Header, Tab, TextArea } from 'semantic-ui-react';
|
||||||
|
import { Input } from '../../../lib/custom-ui';
|
||||||
|
|
||||||
|
import selectors from '../../../selectors';
|
||||||
|
import entryActions from '../../../entry-actions';
|
||||||
|
import { useForm, useNestedRef } from '../../../hooks';
|
||||||
|
|
||||||
|
import styles from './SmtpPane.module.scss';
|
||||||
|
|
||||||
|
const SmtpPane = React.memo(() => {
|
||||||
|
const config = useSelector(selectors.selectConfig);
|
||||||
|
const smtpTest = useSelector(selectors.selectSmtpTest);
|
||||||
|
|
||||||
|
const dispatch = useDispatch();
|
||||||
|
const [t] = useTranslation();
|
||||||
|
|
||||||
|
const [passwordFieldRef, handlePasswordFieldRef] = useNestedRef('inputRef');
|
||||||
|
|
||||||
|
const defaultData = useMemo(
|
||||||
|
() => ({
|
||||||
|
smtpHost: config.smtpHost,
|
||||||
|
smtpPort: config.smtpPort,
|
||||||
|
smtpName: config.smtpName,
|
||||||
|
smtpSecure: config.smtpSecure,
|
||||||
|
smtpTlsRejectUnauthorized: config.smtpTlsRejectUnauthorized,
|
||||||
|
smtpUser: config.smtpUser,
|
||||||
|
smtpPassword: config.smtpPassword,
|
||||||
|
smtpFrom: config.smtpFrom,
|
||||||
|
}),
|
||||||
|
[config],
|
||||||
|
);
|
||||||
|
|
||||||
|
const [data, handleFieldChange] = useForm(() => ({
|
||||||
|
...defaultData,
|
||||||
|
smtpHost: defaultData.smtpHost || '',
|
||||||
|
smtpPort: defaultData.smtpPort || '',
|
||||||
|
smtpName: defaultData.smtpName || '',
|
||||||
|
smtpSecure: defaultData.smtpSecure,
|
||||||
|
smtpTlsRejectUnauthorized: defaultData.smtpTlsRejectUnauthorized,
|
||||||
|
smtpUser: defaultData.smtpUser || '',
|
||||||
|
smtpPassword: defaultData.smtpPassword || '',
|
||||||
|
smtpFrom: defaultData.smtpFrom || '',
|
||||||
|
}));
|
||||||
|
|
||||||
|
const isPasswordSet = defaultData.smtpPassword === undefined;
|
||||||
|
|
||||||
|
const cleanData = useMemo(
|
||||||
|
() => ({
|
||||||
|
...data,
|
||||||
|
smtpHost: data.smtpHost.trim() || null,
|
||||||
|
smtpPort: parseInt(data.smtpPort, 10) || null,
|
||||||
|
smtpName: data.smtpName.trim() || null,
|
||||||
|
smtpUser: data.smtpUser.trim() || null,
|
||||||
|
smtpPassword: data.smtpPassword || (isPasswordSet ? undefined : null),
|
||||||
|
smtpFrom: data.smtpFrom.trim() || null,
|
||||||
|
}),
|
||||||
|
[data, isPasswordSet],
|
||||||
|
);
|
||||||
|
|
||||||
|
const handleSubmit = useCallback(() => {
|
||||||
|
dispatch(entryActions.updateConfig(cleanData));
|
||||||
|
}, [dispatch, cleanData]);
|
||||||
|
|
||||||
|
const handlePasswordClear = useCallback(() => {
|
||||||
|
dispatch(
|
||||||
|
entryActions.updateConfig({
|
||||||
|
smtpPassword: null,
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
|
||||||
|
passwordFieldRef.current.focus();
|
||||||
|
}, [dispatch, passwordFieldRef]);
|
||||||
|
|
||||||
|
const handleTestClick = useCallback(() => {
|
||||||
|
dispatch(entryActions.testSmtpConfig());
|
||||||
|
}, [dispatch]);
|
||||||
|
|
||||||
|
const isModified = !dequal(cleanData, defaultData);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Tab.Pane attached={false} className={styles.wrapper}>
|
||||||
|
<Form onSubmit={handleSubmit}>
|
||||||
|
<div className={styles.text}>{t('common.host')}</div>
|
||||||
|
<Input
|
||||||
|
fluid
|
||||||
|
name="smtpHost"
|
||||||
|
value={data.smtpHost}
|
||||||
|
maxLength={256}
|
||||||
|
className={styles.field}
|
||||||
|
onChange={handleFieldChange}
|
||||||
|
/>
|
||||||
|
<div className={styles.text}>{t('common.port')}</div>
|
||||||
|
<Input
|
||||||
|
fluid
|
||||||
|
type="number"
|
||||||
|
name="smtpPort"
|
||||||
|
value={data.smtpPort}
|
||||||
|
placeholder={data.smtpSecure ? '465' : '587'}
|
||||||
|
min={0}
|
||||||
|
max={65535}
|
||||||
|
step={1}
|
||||||
|
className={styles.field}
|
||||||
|
onChange={handleFieldChange}
|
||||||
|
/>
|
||||||
|
<div className={styles.text}>
|
||||||
|
{t('common.clientHostnameInEhlo')} (
|
||||||
|
{t('common.optional', {
|
||||||
|
context: 'inline',
|
||||||
|
})}
|
||||||
|
)
|
||||||
|
</div>
|
||||||
|
<Input
|
||||||
|
fluid
|
||||||
|
name="smtpName"
|
||||||
|
value={data.smtpName}
|
||||||
|
maxLength={256}
|
||||||
|
className={styles.field}
|
||||||
|
onChange={handleFieldChange}
|
||||||
|
/>
|
||||||
|
<Checkbox
|
||||||
|
name="smtpSecure"
|
||||||
|
checked={data.smtpSecure}
|
||||||
|
label={t('common.useSecureConnection')}
|
||||||
|
className={styles.checkbox}
|
||||||
|
onChange={handleFieldChange}
|
||||||
|
/>
|
||||||
|
<Checkbox
|
||||||
|
name="smtpTlsRejectUnauthorized"
|
||||||
|
checked={data.smtpTlsRejectUnauthorized}
|
||||||
|
label={t('common.rejectUnauthorizedTlsCertificates')}
|
||||||
|
className={classNames(styles.field, styles.checkbox)}
|
||||||
|
onChange={handleFieldChange}
|
||||||
|
/>
|
||||||
|
<div className={styles.text}>
|
||||||
|
{t('common.username')} (
|
||||||
|
{t('common.optional', {
|
||||||
|
context: 'inline',
|
||||||
|
})}
|
||||||
|
)
|
||||||
|
</div>
|
||||||
|
<Input
|
||||||
|
fluid
|
||||||
|
name="smtpUser"
|
||||||
|
value={data.smtpUser}
|
||||||
|
maxLength={256}
|
||||||
|
className={styles.field}
|
||||||
|
onChange={handleFieldChange}
|
||||||
|
/>
|
||||||
|
<div className={styles.text}>
|
||||||
|
{t('common.password')} (
|
||||||
|
{t('common.optional', {
|
||||||
|
context: 'inline',
|
||||||
|
})}
|
||||||
|
)
|
||||||
|
</div>
|
||||||
|
<Input.Password
|
||||||
|
fluid
|
||||||
|
ref={handlePasswordFieldRef}
|
||||||
|
name="smtpPassword"
|
||||||
|
value={data.smtpPassword}
|
||||||
|
placeholder={isPasswordSet ? t('common.passwordIsSet') : undefined}
|
||||||
|
maxLength={256}
|
||||||
|
className={styles.field}
|
||||||
|
onClear={!data.smtpPassword && isPasswordSet ? handlePasswordClear : undefined}
|
||||||
|
onChange={handleFieldChange}
|
||||||
|
/>
|
||||||
|
<div className={styles.text}>
|
||||||
|
{t('common.defaultFrom')} (
|
||||||
|
{t('common.optional', {
|
||||||
|
context: 'inline',
|
||||||
|
})}
|
||||||
|
)
|
||||||
|
</div>
|
||||||
|
<Input
|
||||||
|
fluid
|
||||||
|
name="smtpFrom"
|
||||||
|
value={data.smtpFrom}
|
||||||
|
maxLength={256}
|
||||||
|
className={styles.field}
|
||||||
|
onChange={handleFieldChange}
|
||||||
|
/>
|
||||||
|
<div className={styles.controls}>
|
||||||
|
<Button positive disabled={!isModified} content={t('action.save')} />
|
||||||
|
{config.smtpHost && !isModified && (
|
||||||
|
<Button
|
||||||
|
type="button"
|
||||||
|
content={t('action.sendTestEmail')}
|
||||||
|
loading={smtpTest.isLoading}
|
||||||
|
disabled={smtpTest.isLoading}
|
||||||
|
onClick={handleTestClick}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</Form>
|
||||||
|
{smtpTest.logs && (
|
||||||
|
<>
|
||||||
|
<Divider horizontal>
|
||||||
|
<Header as="h4">
|
||||||
|
{t('common.testLog', {
|
||||||
|
context: 'title',
|
||||||
|
})}
|
||||||
|
</Header>
|
||||||
|
</Divider>
|
||||||
|
<TextArea
|
||||||
|
readOnly
|
||||||
|
as={TextareaAutosize}
|
||||||
|
value={smtpTest.logs.join('\n')}
|
||||||
|
className={styles.testLog}
|
||||||
|
/>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</Tab.Pane>
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
export default SmtpPane;
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
/*!
|
||||||
|
* Copyright (c) 2024 PLANKA Software GmbH
|
||||||
|
* Licensed under the Fair Use License: https://github.com/plankanban/planka/blob/master/LICENSE.md
|
||||||
|
*/
|
||||||
|
|
||||||
|
:global(#app) {
|
||||||
|
.checkbox {
|
||||||
|
display: block;
|
||||||
|
padding: 8px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.controls {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
}
|
||||||
|
|
||||||
|
.field {
|
||||||
|
margin-bottom: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.testLog {
|
||||||
|
border: 1px solid rgba(9, 30, 66, 0.13);
|
||||||
|
border-radius: 3px;
|
||||||
|
color: #333;
|
||||||
|
line-height: 1.4;
|
||||||
|
padding: 8px 12px;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.text {
|
||||||
|
color: #444444;
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: bold;
|
||||||
|
padding-bottom: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wrapper {
|
||||||
|
border: none;
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -22,8 +22,8 @@ const UsersPane = React.memo(() => {
|
|||||||
const activeUsersTotal = useSelector(selectors.selectActiveUsersTotal);
|
const activeUsersTotal = useSelector(selectors.selectActiveUsersTotal);
|
||||||
|
|
||||||
const canAdd = useSelector((state) => {
|
const canAdd = useSelector((state) => {
|
||||||
const oidcConfig = selectors.selectOidcConfig(state);
|
const oidcBootstrap = selectors.selectOidcBootstrap(state);
|
||||||
return !oidcConfig || !oidcConfig.isEnforced;
|
return !oidcBootstrap || !oidcBootstrap.isEnforced;
|
||||||
});
|
});
|
||||||
|
|
||||||
const [t] = useTranslation();
|
const [t] = useTranslation();
|
||||||
|
|||||||
@@ -30,8 +30,8 @@ const Core = React.memo(() => {
|
|||||||
|
|
||||||
// TODO: move to selector?
|
// TODO: move to selector?
|
||||||
const isNewVersionAvailable = useSelector((state) => {
|
const isNewVersionAvailable = useSelector((state) => {
|
||||||
const config = selectors.selectConfig(state);
|
const bootstrap = selectors.selectBootstrap(state);
|
||||||
return !!config && config.version !== version;
|
return !!bootstrap && bootstrap.version !== version;
|
||||||
});
|
});
|
||||||
|
|
||||||
const [t] = useTranslation();
|
const [t] = useTranslation();
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ const createMessage = (error) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const Content = React.memo(() => {
|
const Content = React.memo(() => {
|
||||||
const config = useSelector(selectors.selectConfig);
|
const bootstrap = useSelector(selectors.selectBootstrap);
|
||||||
|
|
||||||
const {
|
const {
|
||||||
data: defaultData,
|
data: defaultData,
|
||||||
@@ -139,8 +139,8 @@ const Content = React.memo(() => {
|
|||||||
dispatch(entryActions.clearAuthenticateError());
|
dispatch(entryActions.clearAuthenticateError());
|
||||||
}, [dispatch]);
|
}, [dispatch]);
|
||||||
|
|
||||||
const withOidc = !!config.oidc;
|
const withOidc = !!bootstrap.oidc;
|
||||||
const isOidcEnforced = withOidc && config.oidc.isEnforced;
|
const isOidcEnforced = withOidc && bootstrap.oidc.isEnforced;
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!isOidcEnforced) {
|
if (!isOidcEnforced) {
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ export default {
|
|||||||
/* Core */
|
/* Core */
|
||||||
|
|
||||||
CORE_INITIALIZE: 'CORE_INITIALIZE',
|
CORE_INITIALIZE: 'CORE_INITIALIZE',
|
||||||
CORE_INITIALIZE__CONFIG_FETCH: 'CORE_INITIALIZE__CONFIG_FETCH',
|
CORE_INITIALIZE__BOOTSTRAP_FETCH: 'CORE_INITIALIZE__BOOTSTRAP_FETCH',
|
||||||
FAVORITES_TOGGLE: 'FAVORITES_TOGGLE',
|
FAVORITES_TOGGLE: 'FAVORITES_TOGGLE',
|
||||||
EDIT_MODE_TOGGLE: 'EDIT_MODE_TOGGLE',
|
EDIT_MODE_TOGGLE: 'EDIT_MODE_TOGGLE',
|
||||||
HOME_VIEW_UPDATE: 'HOME_VIEW_UPDATE',
|
HOME_VIEW_UPDATE: 'HOME_VIEW_UPDATE',
|
||||||
@@ -51,6 +51,16 @@ export default {
|
|||||||
MODAL_OPEN: 'MODAL_OPEN',
|
MODAL_OPEN: 'MODAL_OPEN',
|
||||||
MODAL_CLOSE: 'MODAL_CLOSE',
|
MODAL_CLOSE: 'MODAL_CLOSE',
|
||||||
|
|
||||||
|
/* Config */
|
||||||
|
|
||||||
|
CONFIG_UPDATE: 'CONFIG_UPDATE',
|
||||||
|
CONFIG_UPDATE__SUCCESS: 'CONFIG_UPDATE__SUCCESS',
|
||||||
|
CONFIG_UPDATE__FAILURE: 'CONFIG_UPDATE__FAILURE',
|
||||||
|
CONFIG_UPDATE_HANDLE: 'CONFIG_UPDATE_HANDLE',
|
||||||
|
SMTP_CONFIG_TEST: 'SMTP_CONFIG_TEST',
|
||||||
|
SMTP_CONFIG_TEST__SUCCESS: 'SMTP_CONFIG_TEST__SUCCESS',
|
||||||
|
SMTP_CONFIG_TEST__FAILURE: 'SMTP_CONFIG_TEST__FAILURE',
|
||||||
|
|
||||||
/* Webhooks */
|
/* Webhooks */
|
||||||
|
|
||||||
WEBHOOK_CREATE: 'WEBHOOK_CREATE',
|
WEBHOOK_CREATE: 'WEBHOOK_CREATE',
|
||||||
|
|||||||
@@ -34,6 +34,12 @@ export default {
|
|||||||
MODAL_OPEN: `${PREFIX}/MODAL_OPEN`,
|
MODAL_OPEN: `${PREFIX}/MODAL_OPEN`,
|
||||||
MODAL_CLOSE: `${PREFIX}/MODAL_CLOSE`,
|
MODAL_CLOSE: `${PREFIX}/MODAL_CLOSE`,
|
||||||
|
|
||||||
|
/* Config */
|
||||||
|
|
||||||
|
CONFIG_UPDATE: `${PREFIX}/CONFIG_UPDATE`,
|
||||||
|
CONFIG_UPDATE_HANDLE: `${PREFIX}/CONFIG_UPDATE_HANDLE`,
|
||||||
|
SMTP_CONFIG_TEST: `${PREFIX}/SMTP_CONFIG_TEST`,
|
||||||
|
|
||||||
/* Webhooks */
|
/* Webhooks */
|
||||||
|
|
||||||
WEBHOOK_CREATE: `${PREFIX}/WEBHOOK_CREATE`,
|
WEBHOOK_CREATE: `${PREFIX}/WEBHOOK_CREATE`,
|
||||||
|
|||||||
@@ -39,6 +39,8 @@ export default [
|
|||||||
'commentUpdate',
|
'commentUpdate',
|
||||||
'commentDelete',
|
'commentDelete',
|
||||||
|
|
||||||
|
'configUpdate',
|
||||||
|
|
||||||
'customFieldCreate',
|
'customFieldCreate',
|
||||||
'customFieldUpdate',
|
'customFieldUpdate',
|
||||||
'customFieldDelete',
|
'customFieldDelete',
|
||||||
|
|||||||
31
client/src/entry-actions/config.js
Normal file
31
client/src/entry-actions/config.js
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
/*!
|
||||||
|
* Copyright (c) 2024 PLANKA Software GmbH
|
||||||
|
* Licensed under the Fair Use License: https://github.com/plankanban/planka/blob/master/LICENSE.md
|
||||||
|
*/
|
||||||
|
|
||||||
|
import EntryActionTypes from '../constants/EntryActionTypes';
|
||||||
|
|
||||||
|
const updateConfig = (data) => ({
|
||||||
|
type: EntryActionTypes.CONFIG_UPDATE,
|
||||||
|
payload: {
|
||||||
|
data,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const handleConfigUpdate = (config) => ({
|
||||||
|
type: EntryActionTypes.CONFIG_UPDATE_HANDLE,
|
||||||
|
payload: {
|
||||||
|
config,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const testSmtpConfig = () => ({
|
||||||
|
type: EntryActionTypes.SMTP_CONFIG_TEST,
|
||||||
|
payload: {},
|
||||||
|
});
|
||||||
|
|
||||||
|
export default {
|
||||||
|
updateConfig,
|
||||||
|
handleConfigUpdate,
|
||||||
|
testSmtpConfig,
|
||||||
|
};
|
||||||
@@ -7,6 +7,7 @@ import socket from './socket';
|
|||||||
import login from './login';
|
import login from './login';
|
||||||
import core from './core';
|
import core from './core';
|
||||||
import modals from './modals';
|
import modals from './modals';
|
||||||
|
import config from './config';
|
||||||
import webhooks from './webhooks';
|
import webhooks from './webhooks';
|
||||||
import users from './users';
|
import users from './users';
|
||||||
import projects from './projects';
|
import projects from './projects';
|
||||||
@@ -34,6 +35,7 @@ export default {
|
|||||||
...login,
|
...login,
|
||||||
...core,
|
...core,
|
||||||
...modals,
|
...modals,
|
||||||
|
...config,
|
||||||
...webhooks,
|
...webhooks,
|
||||||
...users,
|
...users,
|
||||||
...projects,
|
...projects,
|
||||||
|
|||||||
@@ -5,13 +5,15 @@
|
|||||||
|
|
||||||
import { useCallback, useState } from 'react';
|
import { useCallback, useState } from 'react';
|
||||||
|
|
||||||
|
const CHECKED_TYPES_SET = new Set(['checkbox', 'radio']);
|
||||||
|
|
||||||
export default (initialData) => {
|
export default (initialData) => {
|
||||||
const [data, setData] = useState(initialData);
|
const [data, setData] = useState(initialData);
|
||||||
|
|
||||||
const handleFieldChange = useCallback((_, { type, name: fieldName, value, checked }) => {
|
const handleFieldChange = useCallback((_, { type, name: fieldName, value, checked }) => {
|
||||||
setData((prevData) => ({
|
setData((prevData) => ({
|
||||||
...prevData,
|
...prevData,
|
||||||
[fieldName]: type === 'radio' ? checked : value,
|
[fieldName]: CHECKED_TYPES_SET.has(type) ? checked : value,
|
||||||
}));
|
}));
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import styles from './InputPassword.module.css';
|
|||||||
const STRENGTH_SCORE_COLORS = ['red', 'orange', 'yellow', 'olive', 'green'];
|
const STRENGTH_SCORE_COLORS = ['red', 'orange', 'yellow', 'olive', 'green'];
|
||||||
|
|
||||||
const InputPassword = React.forwardRef(
|
const InputPassword = React.forwardRef(
|
||||||
({ value, withStrengthBar, minStrengthScore, className, ...props }, ref) => {
|
({ value, withStrengthBar, minStrengthScore, className, onClear, ...props }, ref) => {
|
||||||
const [isVisible, toggleVisible] = useToggle();
|
const [isVisible, toggleVisible] = useToggle();
|
||||||
|
|
||||||
const strengthScore = useMemo(() => {
|
const strengthScore = useMemo(() => {
|
||||||
@@ -32,8 +32,13 @@ const InputPassword = React.forwardRef(
|
|||||||
const inputProps = {
|
const inputProps = {
|
||||||
...props,
|
...props,
|
||||||
ref,
|
ref,
|
||||||
|
value,
|
||||||
type: isVisible ? 'text' : 'password',
|
type: isVisible ? 'text' : 'password',
|
||||||
icon: <Icon link name={isVisible ? 'eye' : 'eye slash'} onClick={handleToggleClick} />,
|
icon: onClear ? (
|
||||||
|
<Icon link name="cancel" onClick={onClear} />
|
||||||
|
) : (
|
||||||
|
<Icon link name={isVisible ? 'eye' : 'eye slash'} onClick={handleToggleClick} />
|
||||||
|
),
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!withStrengthBar) {
|
if (!withStrengthBar) {
|
||||||
@@ -68,12 +73,14 @@ InputPassword.propTypes = {
|
|||||||
withStrengthBar: PropTypes.bool,
|
withStrengthBar: PropTypes.bool,
|
||||||
minStrengthScore: PropTypes.number,
|
minStrengthScore: PropTypes.number,
|
||||||
className: PropTypes.string,
|
className: PropTypes.string,
|
||||||
|
onClear: PropTypes.func,
|
||||||
};
|
};
|
||||||
|
|
||||||
InputPassword.defaultProps = {
|
InputPassword.defaultProps = {
|
||||||
withStrengthBar: false,
|
withStrengthBar: false,
|
||||||
minStrengthScore: 2,
|
minStrengthScore: 2,
|
||||||
className: undefined,
|
className: undefined,
|
||||||
|
onClear: undefined,
|
||||||
};
|
};
|
||||||
|
|
||||||
export default React.memo(InputPassword);
|
export default React.memo(InputPassword);
|
||||||
|
|||||||
@@ -98,6 +98,7 @@ export default {
|
|||||||
cardsOnThisListAreCompleteAndReadyToBeArchived: null,
|
cardsOnThisListAreCompleteAndReadyToBeArchived: null,
|
||||||
cardsOnThisListAreReadyToBeWorkedOn: null,
|
cardsOnThisListAreReadyToBeWorkedOn: null,
|
||||||
clickHereOrRefreshPageToUpdate: null,
|
clickHereOrRefreshPageToUpdate: null,
|
||||||
|
clientHostnameInEhlo: null,
|
||||||
closed: null,
|
closed: null,
|
||||||
color: 'اللون',
|
color: 'اللون',
|
||||||
comments: null,
|
comments: null,
|
||||||
@@ -120,6 +121,7 @@ export default {
|
|||||||
date: 'تاريخ',
|
date: 'تاريخ',
|
||||||
deactivateUser_title: null,
|
deactivateUser_title: null,
|
||||||
defaultCardType_title: null,
|
defaultCardType_title: null,
|
||||||
|
defaultFrom: null,
|
||||||
defaultView_title: null,
|
defaultView_title: null,
|
||||||
deleteAllBoardsToBeAbleToDeleteThisProject: null,
|
deleteAllBoardsToBeAbleToDeleteThisProject: null,
|
||||||
deleteAttachment_title: 'حذف المرفق',
|
deleteAttachment_title: 'حذف المرفق',
|
||||||
@@ -183,6 +185,7 @@ export default {
|
|||||||
grid: null,
|
grid: null,
|
||||||
hideCompletedTasks: null,
|
hideCompletedTasks: null,
|
||||||
hideFromProjectListAndFavorites: null,
|
hideFromProjectListAndFavorites: null,
|
||||||
|
host: null,
|
||||||
hours: 'ساعات',
|
hours: 'ساعات',
|
||||||
importBoard_title: 'استيراد اللوحة',
|
importBoard_title: 'استيراد اللوحة',
|
||||||
invalidCurrentPassword: 'كلمة المرور الحالية غير صالحة',
|
invalidCurrentPassword: 'كلمة المرور الحالية غير صالحة',
|
||||||
@@ -226,8 +229,10 @@ export default {
|
|||||||
optional_inline: 'اختياري',
|
optional_inline: 'اختياري',
|
||||||
organization: 'المنظمة',
|
organization: 'المنظمة',
|
||||||
others: null,
|
others: null,
|
||||||
|
passwordIsSet: null,
|
||||||
phone: 'الهاتف',
|
phone: 'الهاتف',
|
||||||
plankaUsesAppriseToSendNotificationsToOver100PopularServices: null,
|
plankaUsesAppriseToSendNotificationsToOver100PopularServices: null,
|
||||||
|
port: null,
|
||||||
preferences: 'التفضيلات',
|
preferences: 'التفضيلات',
|
||||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||||
'نصيحة: اضغط على Ctrl-V (Cmd-V على Mac) لإضافة مرفق من الحافظة.',
|
'نصيحة: اضغط على Ctrl-V (Cmd-V على Mac) لإضافة مرفق من الحافظة.',
|
||||||
@@ -236,6 +241,7 @@ export default {
|
|||||||
projectNotFound_title: 'المشروع غير موجود',
|
projectNotFound_title: 'المشروع غير موجود',
|
||||||
projectOwner: null,
|
projectOwner: null,
|
||||||
referenceDataAndKnowledgeStorage: null,
|
referenceDataAndKnowledgeStorage: null,
|
||||||
|
rejectUnauthorizedTlsCertificates: null,
|
||||||
removeManager_title: 'إزالة المدير',
|
removeManager_title: 'إزالة المدير',
|
||||||
removeMember_title: 'إزالة العضو',
|
removeMember_title: 'إزالة العضو',
|
||||||
role: null,
|
role: null,
|
||||||
@@ -262,6 +268,7 @@ export default {
|
|||||||
shared: null,
|
shared: null,
|
||||||
sharedWithMe_title: null,
|
sharedWithMe_title: null,
|
||||||
showOnFrontOfCard: null,
|
showOnFrontOfCard: null,
|
||||||
|
smtp: null,
|
||||||
sortList_title: 'فرز القائمة',
|
sortList_title: 'فرز القائمة',
|
||||||
stopwatch: 'المؤقت',
|
stopwatch: 'المؤقت',
|
||||||
story: null,
|
story: null,
|
||||||
@@ -273,6 +280,7 @@ export default {
|
|||||||
taskList_title: null,
|
taskList_title: null,
|
||||||
team: null,
|
team: null,
|
||||||
terms: null,
|
terms: null,
|
||||||
|
testLog_title: null,
|
||||||
thereIsNoPreviewAvailableForThisAttachment: 'لا يوجد معاينة متاحة لهذا المرفق.',
|
thereIsNoPreviewAvailableForThisAttachment: 'لا يوجد معاينة متاحة لهذا المرفق.',
|
||||||
time: 'الوقت',
|
time: 'الوقت',
|
||||||
title: 'العنوان',
|
title: 'العنوان',
|
||||||
@@ -286,6 +294,7 @@ export default {
|
|||||||
uploadFailedNotEnoughStorageSpace: null,
|
uploadFailedNotEnoughStorageSpace: null,
|
||||||
uploadedImages: null,
|
uploadedImages: null,
|
||||||
url: null,
|
url: null,
|
||||||
|
useSecureConnection: null,
|
||||||
userActions_title: 'إجراءات المستخدم',
|
userActions_title: 'إجراءات المستخدم',
|
||||||
userAddedCardToList: null,
|
userAddedCardToList: null,
|
||||||
userAddedThisCardToList: '<0>{{user}}</0> تمت إضافة هذه البطاقة إلى {{list}}',
|
userAddedThisCardToList: '<0>{{user}}</0> تمت إضافة هذه البطاقة إلى {{list}}',
|
||||||
@@ -422,6 +431,7 @@ export default {
|
|||||||
restoreToList: null,
|
restoreToList: null,
|
||||||
returnToBoard: null,
|
returnToBoard: null,
|
||||||
save: 'حفظ',
|
save: 'حفظ',
|
||||||
|
sendTestEmail: null,
|
||||||
showActive: null,
|
showActive: null,
|
||||||
showAllAttachments: 'إظهار جميع المرفقات ({{hidden}} hidden)',
|
showAllAttachments: 'إظهار جميع المرفقات ({{hidden}} hidden)',
|
||||||
showCardsWithThisUser: null,
|
showCardsWithThisUser: null,
|
||||||
|
|||||||
@@ -102,6 +102,7 @@ export default {
|
|||||||
cardsOnThisListAreCompleteAndReadyToBeArchived: null,
|
cardsOnThisListAreCompleteAndReadyToBeArchived: null,
|
||||||
cardsOnThisListAreReadyToBeWorkedOn: null,
|
cardsOnThisListAreReadyToBeWorkedOn: null,
|
||||||
clickHereOrRefreshPageToUpdate: null,
|
clickHereOrRefreshPageToUpdate: null,
|
||||||
|
clientHostnameInEhlo: null,
|
||||||
closed: null,
|
closed: null,
|
||||||
color: 'Цвят',
|
color: 'Цвят',
|
||||||
comments: null,
|
comments: null,
|
||||||
@@ -124,6 +125,7 @@ export default {
|
|||||||
date: 'Дата',
|
date: 'Дата',
|
||||||
deactivateUser_title: null,
|
deactivateUser_title: null,
|
||||||
defaultCardType_title: null,
|
defaultCardType_title: null,
|
||||||
|
defaultFrom: null,
|
||||||
defaultView_title: null,
|
defaultView_title: null,
|
||||||
deleteAllBoardsToBeAbleToDeleteThisProject: null,
|
deleteAllBoardsToBeAbleToDeleteThisProject: null,
|
||||||
deleteAttachment_title: 'Изтриване на прикачен файл',
|
deleteAttachment_title: 'Изтриване на прикачен файл',
|
||||||
@@ -187,6 +189,7 @@ export default {
|
|||||||
grid: null,
|
grid: null,
|
||||||
hideCompletedTasks: null,
|
hideCompletedTasks: null,
|
||||||
hideFromProjectListAndFavorites: null,
|
hideFromProjectListAndFavorites: null,
|
||||||
|
host: null,
|
||||||
hours: 'Часове',
|
hours: 'Часове',
|
||||||
importBoard_title: 'Импортиране на табло',
|
importBoard_title: 'Импортиране на табло',
|
||||||
invalidCurrentPassword: 'Невалидна текуща парола',
|
invalidCurrentPassword: 'Невалидна текуща парола',
|
||||||
@@ -230,8 +233,10 @@ export default {
|
|||||||
optional_inline: 'по желание',
|
optional_inline: 'по желание',
|
||||||
organization: 'Организация',
|
organization: 'Организация',
|
||||||
others: null,
|
others: null,
|
||||||
|
passwordIsSet: null,
|
||||||
phone: 'Телефон',
|
phone: 'Телефон',
|
||||||
plankaUsesAppriseToSendNotificationsToOver100PopularServices: null,
|
plankaUsesAppriseToSendNotificationsToOver100PopularServices: null,
|
||||||
|
port: null,
|
||||||
preferences: 'Предпочитания',
|
preferences: 'Предпочитания',
|
||||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||||
'Съвет: натиснете Ctrl-V (Cmd-V на Mac), за да добавите прикачен файл от клипборда',
|
'Съвет: натиснете Ctrl-V (Cmd-V на Mac), за да добавите прикачен файл от клипборда',
|
||||||
@@ -240,6 +245,7 @@ export default {
|
|||||||
projectNotFound_title: 'Проектът не е намерен',
|
projectNotFound_title: 'Проектът не е намерен',
|
||||||
projectOwner: null,
|
projectOwner: null,
|
||||||
referenceDataAndKnowledgeStorage: null,
|
referenceDataAndKnowledgeStorage: null,
|
||||||
|
rejectUnauthorizedTlsCertificates: null,
|
||||||
removeManager_title: 'Премахване на мениджър',
|
removeManager_title: 'Премахване на мениджър',
|
||||||
removeMember_title: 'Премахване на член',
|
removeMember_title: 'Премахване на член',
|
||||||
role: null,
|
role: null,
|
||||||
@@ -266,6 +272,7 @@ export default {
|
|||||||
shared: null,
|
shared: null,
|
||||||
sharedWithMe_title: null,
|
sharedWithMe_title: null,
|
||||||
showOnFrontOfCard: null,
|
showOnFrontOfCard: null,
|
||||||
|
smtp: null,
|
||||||
sortList_title: 'Сортиране на списък',
|
sortList_title: 'Сортиране на списък',
|
||||||
stopwatch: 'Хронометър',
|
stopwatch: 'Хронометър',
|
||||||
story: null,
|
story: null,
|
||||||
@@ -277,6 +284,7 @@ export default {
|
|||||||
taskList_title: null,
|
taskList_title: null,
|
||||||
team: null,
|
team: null,
|
||||||
terms: null,
|
terms: null,
|
||||||
|
testLog_title: null,
|
||||||
thereIsNoPreviewAvailableForThisAttachment: 'Няма наличен преглед за този прикачен файл.',
|
thereIsNoPreviewAvailableForThisAttachment: 'Няма наличен преглед за този прикачен файл.',
|
||||||
time: 'Време',
|
time: 'Време',
|
||||||
title: 'Заглавие',
|
title: 'Заглавие',
|
||||||
@@ -290,6 +298,7 @@ export default {
|
|||||||
uploadFailedNotEnoughStorageSpace: null,
|
uploadFailedNotEnoughStorageSpace: null,
|
||||||
uploadedImages: null,
|
uploadedImages: null,
|
||||||
url: null,
|
url: null,
|
||||||
|
useSecureConnection: null,
|
||||||
userActions_title: 'Потребителски действия',
|
userActions_title: 'Потребителски действия',
|
||||||
userAddedCardToList: null,
|
userAddedCardToList: null,
|
||||||
userAddedThisCardToList: '<0>{{user}}</0> добави тази карта в {{list}}',
|
userAddedThisCardToList: '<0>{{user}}</0> добави тази карта в {{list}}',
|
||||||
@@ -427,6 +436,7 @@ export default {
|
|||||||
restoreToList: null,
|
restoreToList: null,
|
||||||
returnToBoard: null,
|
returnToBoard: null,
|
||||||
save: 'Запазване',
|
save: 'Запазване',
|
||||||
|
sendTestEmail: null,
|
||||||
showActive: null,
|
showActive: null,
|
||||||
showAllAttachments: 'Показване на всички прикачени файлове ({{hidden}} скрити)',
|
showAllAttachments: 'Показване на всички прикачени файлове ({{hidden}} скрити)',
|
||||||
showCardsWithThisUser: null,
|
showCardsWithThisUser: null,
|
||||||
|
|||||||
@@ -111,6 +111,7 @@ export default {
|
|||||||
'Karty na tomto seznamu jsou kompletní a připravené k archivaci.',
|
'Karty na tomto seznamu jsou kompletní a připravené k archivaci.',
|
||||||
cardsOnThisListAreReadyToBeWorkedOn: 'Karty na tomto seznamu jsou připraveny k práci.',
|
cardsOnThisListAreReadyToBeWorkedOn: 'Karty na tomto seznamu jsou připraveny k práci.',
|
||||||
clickHereOrRefreshPageToUpdate: '<0>Klikněte sem</0> nebo aktualizujte stránku.',
|
clickHereOrRefreshPageToUpdate: '<0>Klikněte sem</0> nebo aktualizujte stránku.',
|
||||||
|
clientHostnameInEhlo: null,
|
||||||
closed: 'Uzavřeno',
|
closed: 'Uzavřeno',
|
||||||
color: 'Barva',
|
color: 'Barva',
|
||||||
comments: 'Komentáře',
|
comments: 'Komentáře',
|
||||||
@@ -133,6 +134,7 @@ export default {
|
|||||||
date: 'Datum',
|
date: 'Datum',
|
||||||
deactivateUser_title: 'Deaktivace uživatele',
|
deactivateUser_title: 'Deaktivace uživatele',
|
||||||
defaultCardType_title: 'Výchozí typ karty',
|
defaultCardType_title: 'Výchozí typ karty',
|
||||||
|
defaultFrom: null,
|
||||||
defaultView_title: 'Výchozí zobrazení',
|
defaultView_title: 'Výchozí zobrazení',
|
||||||
deleteAllBoardsToBeAbleToDeleteThisProject:
|
deleteAllBoardsToBeAbleToDeleteThisProject:
|
||||||
'Pro smazání tohoto projektu je třeba nejprve smazat všechny nástěnky',
|
'Pro smazání tohoto projektu je třeba nejprve smazat všechny nástěnky',
|
||||||
@@ -197,6 +199,7 @@ export default {
|
|||||||
grid: 'Mřížka',
|
grid: 'Mřížka',
|
||||||
hideCompletedTasks: 'Skrýt dokončené úkoly',
|
hideCompletedTasks: 'Skrýt dokončené úkoly',
|
||||||
hideFromProjectListAndFavorites: 'Skrýt ze seznamu projektů a oblíbených položek',
|
hideFromProjectListAndFavorites: 'Skrýt ze seznamu projektů a oblíbených položek',
|
||||||
|
host: null,
|
||||||
hours: 'Hodiny',
|
hours: 'Hodiny',
|
||||||
importBoard_title: 'Importovat nástěnku',
|
importBoard_title: 'Importovat nástěnku',
|
||||||
invalidCurrentPassword: 'Neplatné aktuální heslo',
|
invalidCurrentPassword: 'Neplatné aktuální heslo',
|
||||||
@@ -241,9 +244,11 @@ export default {
|
|||||||
optional_inline: 'volitelné',
|
optional_inline: 'volitelné',
|
||||||
organization: 'Společnost',
|
organization: 'Společnost',
|
||||||
others: 'Jiné',
|
others: 'Jiné',
|
||||||
|
passwordIsSet: null,
|
||||||
phone: 'Telefon',
|
phone: 'Telefon',
|
||||||
plankaUsesAppriseToSendNotificationsToOver100PopularServices:
|
plankaUsesAppriseToSendNotificationsToOver100PopularServices:
|
||||||
'PLANKA používá <1><0>Apprise</0></1> k zasílání oznámení do více než 100 oblíbených služeb.',
|
'PLANKA používá <1><0>Apprise</0></1> k zasílání oznámení do více než 100 oblíbených služeb.',
|
||||||
|
port: null,
|
||||||
preferences: 'Volby',
|
preferences: 'Volby',
|
||||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||||
'Tip: stisknutím Ctrl-V (Cmd-V na Macu) přidáte přílohu ze schránky.',
|
'Tip: stisknutím Ctrl-V (Cmd-V na Macu) přidáte přílohu ze schránky.',
|
||||||
@@ -252,6 +257,7 @@ export default {
|
|||||||
projectNotFound_title: 'Projekt nenalezen',
|
projectNotFound_title: 'Projekt nenalezen',
|
||||||
projectOwner: 'Vlastník projektu',
|
projectOwner: 'Vlastník projektu',
|
||||||
referenceDataAndKnowledgeStorage: 'Uchovávání referenčních údajů a znalostí.',
|
referenceDataAndKnowledgeStorage: 'Uchovávání referenčních údajů a znalostí.',
|
||||||
|
rejectUnauthorizedTlsCertificates: null,
|
||||||
removeManager_title: 'Odstranit správce',
|
removeManager_title: 'Odstranit správce',
|
||||||
removeMember_title: 'Odstranit člena',
|
removeMember_title: 'Odstranit člena',
|
||||||
role: 'Role',
|
role: 'Role',
|
||||||
@@ -278,6 +284,7 @@ export default {
|
|||||||
shared: 'Sdílené',
|
shared: 'Sdílené',
|
||||||
sharedWithMe_title: 'Sdíleno se mnou',
|
sharedWithMe_title: 'Sdíleno se mnou',
|
||||||
showOnFrontOfCard: 'Zobrazit na přední straně karty',
|
showOnFrontOfCard: 'Zobrazit na přední straně karty',
|
||||||
|
smtp: null,
|
||||||
sortList_title: 'Řadit podle',
|
sortList_title: 'Řadit podle',
|
||||||
stopwatch: 'Časovač',
|
stopwatch: 'Časovač',
|
||||||
story: 'Příběh',
|
story: 'Příběh',
|
||||||
@@ -289,6 +296,7 @@ export default {
|
|||||||
taskList_title: 'Seznam úkolů',
|
taskList_title: 'Seznam úkolů',
|
||||||
team: 'Tým',
|
team: 'Tým',
|
||||||
terms: 'Podmínky',
|
terms: 'Podmínky',
|
||||||
|
testLog_title: null,
|
||||||
thereIsNoPreviewAvailableForThisAttachment: 'Pro tuto přílohu není k dispozici žádný náhled.',
|
thereIsNoPreviewAvailableForThisAttachment: 'Pro tuto přílohu není k dispozici žádný náhled.',
|
||||||
time: 'Čas',
|
time: 'Čas',
|
||||||
title: 'Titulek',
|
title: 'Titulek',
|
||||||
@@ -302,6 +310,7 @@ export default {
|
|||||||
uploadFailedNotEnoughStorageSpace: 'Nahrávání se nezdařilo: Nedostatek úložného prostoru.',
|
uploadFailedNotEnoughStorageSpace: 'Nahrávání se nezdařilo: Nedostatek úložného prostoru.',
|
||||||
uploadedImages: 'Nahrané obrázky',
|
uploadedImages: 'Nahrané obrázky',
|
||||||
url: 'URL',
|
url: 'URL',
|
||||||
|
useSecureConnection: null,
|
||||||
userActions_title: 'Akce uživatele',
|
userActions_title: 'Akce uživatele',
|
||||||
userAddedCardToList: '<0>{{user}}</0> přidal <2>{{card}}</2> do {{list}}',
|
userAddedCardToList: '<0>{{user}}</0> přidal <2>{{card}}</2> do {{list}}',
|
||||||
userAddedThisCardToList: '<0>{{user}}</0> přidal kartu do {{list}}',
|
userAddedThisCardToList: '<0>{{user}}</0> přidal kartu do {{list}}',
|
||||||
@@ -442,6 +451,7 @@ export default {
|
|||||||
restoreToList: 'Obnovit do {{list}}',
|
restoreToList: 'Obnovit do {{list}}',
|
||||||
returnToBoard: 'Návrat na nástěnku',
|
returnToBoard: 'Návrat na nástěnku',
|
||||||
save: 'Uložit',
|
save: 'Uložit',
|
||||||
|
sendTestEmail: null,
|
||||||
showActive: 'Zobrazit aktivní',
|
showActive: 'Zobrazit aktivní',
|
||||||
showAllAttachments: 'Zozbrazit všechny přílohy ({{hidden}} skryté)',
|
showAllAttachments: 'Zozbrazit všechny přílohy ({{hidden}} skryté)',
|
||||||
showCardsWithThisUser: 'Zobrazit karty tohoto uživatele',
|
showCardsWithThisUser: 'Zobrazit karty tohoto uživatele',
|
||||||
|
|||||||
@@ -115,6 +115,7 @@ export default {
|
|||||||
'Kort på denne liste er afsluttede og klar til at blive arkiveret.',
|
'Kort på denne liste er afsluttede og klar til at blive arkiveret.',
|
||||||
cardsOnThisListAreReadyToBeWorkedOn: 'Kort på denne liste er klar til at blive arbejdet på.',
|
cardsOnThisListAreReadyToBeWorkedOn: 'Kort på denne liste er klar til at blive arbejdet på.',
|
||||||
clickHereOrRefreshPageToUpdate: '<0>Klik her</0> eller opdater siden for at opdatere.',
|
clickHereOrRefreshPageToUpdate: '<0>Klik her</0> eller opdater siden for at opdatere.',
|
||||||
|
clientHostnameInEhlo: null,
|
||||||
closed: 'Lukket',
|
closed: 'Lukket',
|
||||||
color: 'Farve',
|
color: 'Farve',
|
||||||
comments: 'Kommentarer',
|
comments: 'Kommentarer',
|
||||||
@@ -138,6 +139,7 @@ export default {
|
|||||||
date: 'Dato',
|
date: 'Dato',
|
||||||
deactivateUser_title: 'Deaktiver bruger',
|
deactivateUser_title: 'Deaktiver bruger',
|
||||||
defaultCardType_title: 'Standard korttype',
|
defaultCardType_title: 'Standard korttype',
|
||||||
|
defaultFrom: null,
|
||||||
defaultView_title: 'Standard visning',
|
defaultView_title: 'Standard visning',
|
||||||
deleteAllBoardsToBeAbleToDeleteThisProject:
|
deleteAllBoardsToBeAbleToDeleteThisProject:
|
||||||
'Slet alle tavler for at kunne slette dette projekt.',
|
'Slet alle tavler for at kunne slette dette projekt.',
|
||||||
@@ -202,6 +204,7 @@ export default {
|
|||||||
grid: 'Gitter',
|
grid: 'Gitter',
|
||||||
hideCompletedTasks: null,
|
hideCompletedTasks: null,
|
||||||
hideFromProjectListAndFavorites: 'Skjul fra projektliste og favoritter',
|
hideFromProjectListAndFavorites: 'Skjul fra projektliste og favoritter',
|
||||||
|
host: null,
|
||||||
hours: 'Timer',
|
hours: 'Timer',
|
||||||
importBoard_title: 'Importer tavle',
|
importBoard_title: 'Importer tavle',
|
||||||
invalidCurrentPassword: 'Nuværende adgangskode er ugyldig',
|
invalidCurrentPassword: 'Nuværende adgangskode er ugyldig',
|
||||||
@@ -245,9 +248,11 @@ export default {
|
|||||||
optional_inline: 'valgfri',
|
optional_inline: 'valgfri',
|
||||||
organization: 'Organisation',
|
organization: 'Organisation',
|
||||||
others: 'Andre',
|
others: 'Andre',
|
||||||
|
passwordIsSet: null,
|
||||||
phone: 'Telefon',
|
phone: 'Telefon',
|
||||||
plankaUsesAppriseToSendNotificationsToOver100PopularServices:
|
plankaUsesAppriseToSendNotificationsToOver100PopularServices:
|
||||||
'PLANKA bruger <1><0>Apprise</0></1> til at sende notifikationer til over 100 populære tjenester.',
|
'PLANKA bruger <1><0>Apprise</0></1> til at sende notifikationer til over 100 populære tjenester.',
|
||||||
|
port: null,
|
||||||
preferences: 'Præferencer',
|
preferences: 'Præferencer',
|
||||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
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.',
|
||||||
@@ -256,6 +261,7 @@ export default {
|
|||||||
projectNotFound_title: 'Projekt ikke fundet',
|
projectNotFound_title: 'Projekt ikke fundet',
|
||||||
projectOwner: 'Projektejer',
|
projectOwner: 'Projektejer',
|
||||||
referenceDataAndKnowledgeStorage: 'Reference data og vidensopbevaring',
|
referenceDataAndKnowledgeStorage: 'Reference data og vidensopbevaring',
|
||||||
|
rejectUnauthorizedTlsCertificates: null,
|
||||||
removeManager_title: 'Fjern projektleder',
|
removeManager_title: 'Fjern projektleder',
|
||||||
removeMember_title: 'Fjern medlem',
|
removeMember_title: 'Fjern medlem',
|
||||||
role: 'Rolle',
|
role: 'Rolle',
|
||||||
@@ -282,6 +288,7 @@ export default {
|
|||||||
shared: 'Delt',
|
shared: 'Delt',
|
||||||
sharedWithMe_title: 'Delt med mig',
|
sharedWithMe_title: 'Delt med mig',
|
||||||
showOnFrontOfCard: 'Vis på forsiden af kortet',
|
showOnFrontOfCard: 'Vis på forsiden af kortet',
|
||||||
|
smtp: null,
|
||||||
sortList_title: 'Sortér liste',
|
sortList_title: 'Sortér liste',
|
||||||
stopwatch: 'Stopur',
|
stopwatch: 'Stopur',
|
||||||
story: 'Story',
|
story: 'Story',
|
||||||
@@ -293,6 +300,7 @@ export default {
|
|||||||
taskList_title: 'Opgaveliste',
|
taskList_title: 'Opgaveliste',
|
||||||
team: 'Team',
|
team: 'Team',
|
||||||
terms: null,
|
terms: null,
|
||||||
|
testLog_title: null,
|
||||||
thereIsNoPreviewAvailableForThisAttachment:
|
thereIsNoPreviewAvailableForThisAttachment:
|
||||||
'Der er ingen forhåndsvisning tilgængelig for denne vedhæftning.',
|
'Der er ingen forhåndsvisning tilgængelig for denne vedhæftning.',
|
||||||
time: 'Tid',
|
time: 'Tid',
|
||||||
@@ -307,6 +315,7 @@ export default {
|
|||||||
uploadFailedNotEnoughStorageSpace: null,
|
uploadFailedNotEnoughStorageSpace: null,
|
||||||
uploadedImages: 'Uploadede billeder',
|
uploadedImages: 'Uploadede billeder',
|
||||||
url: null,
|
url: null,
|
||||||
|
useSecureConnection: null,
|
||||||
userActions_title: 'Brugerhandlinger',
|
userActions_title: 'Brugerhandlinger',
|
||||||
userAddedCardToList: '<0>{{user}}</0> tilføjede <2>{{card}}</2> til {{list}}',
|
userAddedCardToList: '<0>{{user}}</0> tilføjede <2>{{card}}</2> til {{list}}',
|
||||||
userAddedThisCardToList: '<0>{{user}}</0> tilføjede kortet til {{list}}',
|
userAddedThisCardToList: '<0>{{user}}</0> tilføjede kortet til {{list}}',
|
||||||
@@ -447,6 +456,7 @@ export default {
|
|||||||
restoreToList: 'Gendan til {{list}}',
|
restoreToList: 'Gendan til {{list}}',
|
||||||
returnToBoard: 'Tilbage til tavle',
|
returnToBoard: 'Tilbage til tavle',
|
||||||
save: 'Gem ændringer',
|
save: 'Gem ændringer',
|
||||||
|
sendTestEmail: null,
|
||||||
showActive: 'Vis aktive',
|
showActive: 'Vis aktive',
|
||||||
showAllAttachments: 'Vis alle vedhæftninger ({{hidden}} skjulte)',
|
showAllAttachments: 'Vis alle vedhæftninger ({{hidden}} skjulte)',
|
||||||
showCardsWithThisUser: 'Vis kort med denne bruger',
|
showCardsWithThisUser: 'Vis kort med denne bruger',
|
||||||
|
|||||||
@@ -125,6 +125,7 @@ export default {
|
|||||||
cardsOnThisListAreReadyToBeWorkedOn: 'Karten in dieser Liste sind bereit zur Bearbeitung.',
|
cardsOnThisListAreReadyToBeWorkedOn: 'Karten in dieser Liste sind bereit zur Bearbeitung.',
|
||||||
clickHereOrRefreshPageToUpdate:
|
clickHereOrRefreshPageToUpdate:
|
||||||
'<0>Hier klicken</0> oder Seite aktualisieren, um zu aktualisieren.',
|
'<0>Hier klicken</0> oder Seite aktualisieren, um zu aktualisieren.',
|
||||||
|
clientHostnameInEhlo: null,
|
||||||
closed: 'Geschlossen',
|
closed: 'Geschlossen',
|
||||||
color: 'Farbe',
|
color: 'Farbe',
|
||||||
comments: 'Kommentare',
|
comments: 'Kommentare',
|
||||||
@@ -147,6 +148,7 @@ export default {
|
|||||||
date: 'Datum',
|
date: 'Datum',
|
||||||
deactivateUser_title: 'Benutzer deaktivieren',
|
deactivateUser_title: 'Benutzer deaktivieren',
|
||||||
defaultCardType_title: 'Standard-Kartentyp',
|
defaultCardType_title: 'Standard-Kartentyp',
|
||||||
|
defaultFrom: null,
|
||||||
defaultView_title: 'Standardansicht',
|
defaultView_title: 'Standardansicht',
|
||||||
deleteAllBoardsToBeAbleToDeleteThisProject:
|
deleteAllBoardsToBeAbleToDeleteThisProject:
|
||||||
'Löschen Sie alle Arbeitsbereiche, um dieses Projekt löschen zu können',
|
'Löschen Sie alle Arbeitsbereiche, um dieses Projekt löschen zu können',
|
||||||
@@ -211,6 +213,7 @@ export default {
|
|||||||
grid: 'Raster',
|
grid: 'Raster',
|
||||||
hideCompletedTasks: null,
|
hideCompletedTasks: null,
|
||||||
hideFromProjectListAndFavorites: 'Aus Projektliste und Favoriten ausblenden',
|
hideFromProjectListAndFavorites: 'Aus Projektliste und Favoriten ausblenden',
|
||||||
|
host: null,
|
||||||
hours: 'Stunden',
|
hours: 'Stunden',
|
||||||
importBoard_title: 'Board importieren',
|
importBoard_title: 'Board importieren',
|
||||||
invalidCurrentPassword: 'Das aktuelle Passwort ist falsch',
|
invalidCurrentPassword: 'Das aktuelle Passwort ist falsch',
|
||||||
@@ -254,9 +257,11 @@ export default {
|
|||||||
optional_inline: 'Optional',
|
optional_inline: 'Optional',
|
||||||
organization: 'Organisation',
|
organization: 'Organisation',
|
||||||
others: 'Andere',
|
others: 'Andere',
|
||||||
|
passwordIsSet: null,
|
||||||
phone: 'Telefon',
|
phone: 'Telefon',
|
||||||
plankaUsesAppriseToSendNotificationsToOver100PopularServices:
|
plankaUsesAppriseToSendNotificationsToOver100PopularServices:
|
||||||
'PLANKA verwendet <1><0>Apprise</0></1>, um Benachrichtigungen an über 100 beliebte Dienste zu senden.',
|
'PLANKA verwendet <1><0>Apprise</0></1>, um Benachrichtigungen an über 100 beliebte Dienste zu senden.',
|
||||||
|
port: null,
|
||||||
preferences: 'Voreinstellungen',
|
preferences: 'Voreinstellungen',
|
||||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
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.',
|
||||||
@@ -265,6 +270,7 @@ export default {
|
|||||||
projectNotFound_title: 'Projekt nicht gefunden',
|
projectNotFound_title: 'Projekt nicht gefunden',
|
||||||
projectOwner: 'Projektleitung',
|
projectOwner: 'Projektleitung',
|
||||||
referenceDataAndKnowledgeStorage: 'Speichern von Wissen und Referenzen.',
|
referenceDataAndKnowledgeStorage: 'Speichern von Wissen und Referenzen.',
|
||||||
|
rejectUnauthorizedTlsCertificates: null,
|
||||||
removeManager_title: 'Projektleiter entfernen',
|
removeManager_title: 'Projektleiter entfernen',
|
||||||
removeMember_title: 'Mitglied entfernen',
|
removeMember_title: 'Mitglied entfernen',
|
||||||
role: 'Rolle',
|
role: 'Rolle',
|
||||||
@@ -291,6 +297,7 @@ export default {
|
|||||||
shared: 'Geteilt',
|
shared: 'Geteilt',
|
||||||
sharedWithMe_title: 'Mit mir geteilt',
|
sharedWithMe_title: 'Mit mir geteilt',
|
||||||
showOnFrontOfCard: 'Auf der Vorderseite der Karte anzeigen',
|
showOnFrontOfCard: 'Auf der Vorderseite der Karte anzeigen',
|
||||||
|
smtp: null,
|
||||||
sortList_title: 'Liste sortieren',
|
sortList_title: 'Liste sortieren',
|
||||||
stopwatch: 'Stoppuhr',
|
stopwatch: 'Stoppuhr',
|
||||||
story: 'Wissen',
|
story: 'Wissen',
|
||||||
@@ -302,6 +309,7 @@ export default {
|
|||||||
taskList_title: 'Aufgaben',
|
taskList_title: 'Aufgaben',
|
||||||
team: 'Team',
|
team: 'Team',
|
||||||
terms: null,
|
terms: null,
|
||||||
|
testLog_title: null,
|
||||||
thereIsNoPreviewAvailableForThisAttachment: 'Für diesen Anhang ist keine Vorschau verfügbar.',
|
thereIsNoPreviewAvailableForThisAttachment: 'Für diesen Anhang ist keine Vorschau verfügbar.',
|
||||||
time: 'Zeit',
|
time: 'Zeit',
|
||||||
title: 'Titel',
|
title: 'Titel',
|
||||||
@@ -315,6 +323,7 @@ export default {
|
|||||||
uploadFailedNotEnoughStorageSpace: null,
|
uploadFailedNotEnoughStorageSpace: null,
|
||||||
uploadedImages: 'Hochgeladene Bilder',
|
uploadedImages: 'Hochgeladene Bilder',
|
||||||
url: null,
|
url: null,
|
||||||
|
useSecureConnection: null,
|
||||||
userActions_title: 'Benutzeraktionen',
|
userActions_title: 'Benutzeraktionen',
|
||||||
userAddedCardToList: null,
|
userAddedCardToList: null,
|
||||||
userAddedThisCardToList: '<0>{{user}}</0> hat diese Karte hinzugefügt zu {{list}}',
|
userAddedThisCardToList: '<0>{{user}}</0> hat diese Karte hinzugefügt zu {{list}}',
|
||||||
@@ -452,6 +461,7 @@ export default {
|
|||||||
restoreToList: 'Wiederherstellen in {{list}}',
|
restoreToList: 'Wiederherstellen in {{list}}',
|
||||||
returnToBoard: 'Zurück zum Arbeitsbereich',
|
returnToBoard: 'Zurück zum Arbeitsbereich',
|
||||||
save: 'Speichern',
|
save: 'Speichern',
|
||||||
|
sendTestEmail: null,
|
||||||
showActive: 'Aktive anzeigen',
|
showActive: 'Aktive anzeigen',
|
||||||
showAllAttachments: 'Alle Anhänge anzeigen ({{hidden}} versteckt)',
|
showAllAttachments: 'Alle Anhänge anzeigen ({{hidden}} versteckt)',
|
||||||
showCardsWithThisUser: 'Karten mit diesem Benutzer zeigen',
|
showCardsWithThisUser: 'Karten mit diesem Benutzer zeigen',
|
||||||
|
|||||||
@@ -125,6 +125,7 @@ export default {
|
|||||||
cardsOnThisListAreReadyToBeWorkedOn:
|
cardsOnThisListAreReadyToBeWorkedOn:
|
||||||
'Οι κάρτες σε αυτήν τη λίστα είναι έτοιμες για επεξεργασία.',
|
'Οι κάρτες σε αυτήν τη λίστα είναι έτοιμες για επεξεργασία.',
|
||||||
clickHereOrRefreshPageToUpdate: '<0>Κάντε κλικ εδώ</0> ή ανανεώστε τη σελίδα για ενημέρωση.',
|
clickHereOrRefreshPageToUpdate: '<0>Κάντε κλικ εδώ</0> ή ανανεώστε τη σελίδα για ενημέρωση.',
|
||||||
|
clientHostnameInEhlo: null,
|
||||||
closed: 'Κλειστό',
|
closed: 'Κλειστό',
|
||||||
color: 'Χρώμα',
|
color: 'Χρώμα',
|
||||||
comments: 'Σχόλια',
|
comments: 'Σχόλια',
|
||||||
@@ -148,6 +149,7 @@ export default {
|
|||||||
date: 'Ημερομηνία',
|
date: 'Ημερομηνία',
|
||||||
deactivateUser_title: 'Απενεργοποίηση χρήστη',
|
deactivateUser_title: 'Απενεργοποίηση χρήστη',
|
||||||
defaultCardType_title: 'Προεπιλεγμένος τύπος κάρτας',
|
defaultCardType_title: 'Προεπιλεγμένος τύπος κάρτας',
|
||||||
|
defaultFrom: null,
|
||||||
defaultView_title: 'Προεπιλεγμένη προβολή',
|
defaultView_title: 'Προεπιλεγμένη προβολή',
|
||||||
deleteAllBoardsToBeAbleToDeleteThisProject:
|
deleteAllBoardsToBeAbleToDeleteThisProject:
|
||||||
'Διαγράψτε όλους τους πίνακες για να μπορέσετε να διαγράψετε αυτό το έργο',
|
'Διαγράψτε όλους τους πίνακες για να μπορέσετε να διαγράψετε αυτό το έργο',
|
||||||
@@ -212,6 +214,7 @@ export default {
|
|||||||
grid: 'Πλέγμα',
|
grid: 'Πλέγμα',
|
||||||
hideCompletedTasks: null,
|
hideCompletedTasks: null,
|
||||||
hideFromProjectListAndFavorites: 'Απόκρυψη από τη λίστα έργων και τα αγαπημένα',
|
hideFromProjectListAndFavorites: 'Απόκρυψη από τη λίστα έργων και τα αγαπημένα',
|
||||||
|
host: null,
|
||||||
hours: 'Ώρες',
|
hours: 'Ώρες',
|
||||||
importBoard_title: 'Εισαγωγή πίνακα',
|
importBoard_title: 'Εισαγωγή πίνακα',
|
||||||
invalidCurrentPassword: 'Μη έγκυρος τρέχων κωδικός',
|
invalidCurrentPassword: 'Μη έγκυρος τρέχων κωδικός',
|
||||||
@@ -255,9 +258,11 @@ export default {
|
|||||||
optional_inline: 'προαιρετικό',
|
optional_inline: 'προαιρετικό',
|
||||||
organization: 'Οργάνωση',
|
organization: 'Οργάνωση',
|
||||||
others: 'Άλλοι',
|
others: 'Άλλοι',
|
||||||
|
passwordIsSet: null,
|
||||||
phone: 'Τηλέφωνο',
|
phone: 'Τηλέφωνο',
|
||||||
plankaUsesAppriseToSendNotificationsToOver100PopularServices:
|
plankaUsesAppriseToSendNotificationsToOver100PopularServices:
|
||||||
'Το PLANKA χρησιμοποιεί το <1><0>Apprise</0></1> για να στέλνει ειδοποιήσεις σε πάνω από 100 δημοφιλείς υπηρεσίες.',
|
'Το PLANKA χρησιμοποιεί το <1><0>Apprise</0></1> για να στέλνει ειδοποιήσεις σε πάνω από 100 δημοφιλείς υπηρεσίες.',
|
||||||
|
port: null,
|
||||||
preferences: 'Προτιμήσεις',
|
preferences: 'Προτιμήσεις',
|
||||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||||
'Συμβουλή: πατήστε Ctrl-V (Cmd-V σε Mac) για να προσθέσετε συνημμένο από το πρόχειρο.',
|
'Συμβουλή: πατήστε Ctrl-V (Cmd-V σε Mac) για να προσθέσετε συνημμένο από το πρόχειρο.',
|
||||||
@@ -266,6 +271,7 @@ export default {
|
|||||||
projectNotFound_title: 'Το έργο δεν βρέθηκε',
|
projectNotFound_title: 'Το έργο δεν βρέθηκε',
|
||||||
projectOwner: 'Ιδιοκτήτης έργου',
|
projectOwner: 'Ιδιοκτήτης έργου',
|
||||||
referenceDataAndKnowledgeStorage: 'Αποθήκευση δεδομένων και γνώσης αναφοράς.',
|
referenceDataAndKnowledgeStorage: 'Αποθήκευση δεδομένων και γνώσης αναφοράς.',
|
||||||
|
rejectUnauthorizedTlsCertificates: null,
|
||||||
removeManager_title: 'Αφαίρεση διαχειριστή',
|
removeManager_title: 'Αφαίρεση διαχειριστή',
|
||||||
removeMember_title: 'Αφαίρεση μέλους',
|
removeMember_title: 'Αφαίρεση μέλους',
|
||||||
role: 'Ρόλος',
|
role: 'Ρόλος',
|
||||||
@@ -292,6 +298,7 @@ export default {
|
|||||||
shared: 'Κοινόχρηστο',
|
shared: 'Κοινόχρηστο',
|
||||||
sharedWithMe_title: 'Κοινόχρηστο με εμένα',
|
sharedWithMe_title: 'Κοινόχρηστο με εμένα',
|
||||||
showOnFrontOfCard: 'Εμφάνιση στο μπροστινό μέρος της κάρτας',
|
showOnFrontOfCard: 'Εμφάνιση στο μπροστινό μέρος της κάρτας',
|
||||||
|
smtp: null,
|
||||||
sortList_title: 'Ταξινόμηση λίστας',
|
sortList_title: 'Ταξινόμηση λίστας',
|
||||||
stopwatch: 'Χρονόμετρο',
|
stopwatch: 'Χρονόμετρο',
|
||||||
story: 'Ιστορία',
|
story: 'Ιστορία',
|
||||||
@@ -303,6 +310,7 @@ export default {
|
|||||||
taskList_title: 'Λίστα εργασιών',
|
taskList_title: 'Λίστα εργασιών',
|
||||||
team: 'Ομάδα',
|
team: 'Ομάδα',
|
||||||
terms: null,
|
terms: null,
|
||||||
|
testLog_title: null,
|
||||||
thereIsNoPreviewAvailableForThisAttachment:
|
thereIsNoPreviewAvailableForThisAttachment:
|
||||||
'Δεν υπάρχει διαθέσιμη προεπισκόπηση για αυτό το συνημμένο.',
|
'Δεν υπάρχει διαθέσιμη προεπισκόπηση για αυτό το συνημμένο.',
|
||||||
time: 'Ώρα',
|
time: 'Ώρα',
|
||||||
@@ -317,6 +325,7 @@ export default {
|
|||||||
uploadFailedNotEnoughStorageSpace: null,
|
uploadFailedNotEnoughStorageSpace: null,
|
||||||
uploadedImages: 'Μεταφορτωμένες εικόνες',
|
uploadedImages: 'Μεταφορτωμένες εικόνες',
|
||||||
url: null,
|
url: null,
|
||||||
|
useSecureConnection: null,
|
||||||
userActions_title: 'Ενέργειες χρήστη',
|
userActions_title: 'Ενέργειες χρήστη',
|
||||||
userAddedCardToList: '<0>{{user}}</0> πρόσθεσε <2>{{card}}</2> στη λίστα {{list}}',
|
userAddedCardToList: '<0>{{user}}</0> πρόσθεσε <2>{{card}}</2> στη λίστα {{list}}',
|
||||||
userAddedThisCardToList: '<0>{{user}}</0> πρόσθεσε αυτήν την κάρτα στη λίστα {{list}}',
|
userAddedThisCardToList: '<0>{{user}}</0> πρόσθεσε αυτήν την κάρτα στη λίστα {{list}}',
|
||||||
@@ -463,6 +472,7 @@ export default {
|
|||||||
restoreToList: 'Επαναφορά στη {{list}}',
|
restoreToList: 'Επαναφορά στη {{list}}',
|
||||||
returnToBoard: 'Επιστροφή στον πίνακα',
|
returnToBoard: 'Επιστροφή στον πίνακα',
|
||||||
save: 'Αποθήκευση',
|
save: 'Αποθήκευση',
|
||||||
|
sendTestEmail: null,
|
||||||
showActive: 'Εμφάνιση ενεργών',
|
showActive: 'Εμφάνιση ενεργών',
|
||||||
showAllAttachments: 'Εμφάνιση όλων των συνημμένων ({{hidden}} κρυφά)',
|
showAllAttachments: 'Εμφάνιση όλων των συνημμένων ({{hidden}} κρυφά)',
|
||||||
showCardsWithThisUser: 'Εμφάνιση καρτών με αυτόν τον χρήστη',
|
showCardsWithThisUser: 'Εμφάνιση καρτών με αυτόν τον χρήστη',
|
||||||
|
|||||||
@@ -115,6 +115,7 @@ export default {
|
|||||||
'Cards on this list are complete and ready to be archived.',
|
'Cards on this list are complete and ready to be archived.',
|
||||||
cardsOnThisListAreReadyToBeWorkedOn: 'Cards on this list are ready to be worked on.',
|
cardsOnThisListAreReadyToBeWorkedOn: 'Cards on this list are ready to be worked on.',
|
||||||
clickHereOrRefreshPageToUpdate: '<0>Click here</0> or refresh the page to update.',
|
clickHereOrRefreshPageToUpdate: '<0>Click here</0> or refresh the page to update.',
|
||||||
|
clientHostnameInEhlo: 'Client hostname in EHLO',
|
||||||
closed: 'Closed',
|
closed: 'Closed',
|
||||||
color: 'Color',
|
color: 'Color',
|
||||||
comments: 'Comments',
|
comments: 'Comments',
|
||||||
@@ -137,6 +138,7 @@ export default {
|
|||||||
date: 'Date',
|
date: 'Date',
|
||||||
deactivateUser_title: 'Deactivate User',
|
deactivateUser_title: 'Deactivate User',
|
||||||
defaultCardType_title: 'Default Card Type',
|
defaultCardType_title: 'Default Card Type',
|
||||||
|
defaultFrom: 'Default "from"',
|
||||||
defaultView_title: 'Default View',
|
defaultView_title: 'Default View',
|
||||||
deleteAllBoardsToBeAbleToDeleteThisProject:
|
deleteAllBoardsToBeAbleToDeleteThisProject:
|
||||||
'Delete all boards to be able to delete this project',
|
'Delete all boards to be able to delete this project',
|
||||||
@@ -201,6 +203,7 @@ export default {
|
|||||||
grid: 'Grid',
|
grid: 'Grid',
|
||||||
hideCompletedTasks: 'Hide completed tasks',
|
hideCompletedTasks: 'Hide completed tasks',
|
||||||
hideFromProjectListAndFavorites: 'Hide from project list and favorites',
|
hideFromProjectListAndFavorites: 'Hide from project list and favorites',
|
||||||
|
host: 'Host',
|
||||||
hours: 'Hours',
|
hours: 'Hours',
|
||||||
importBoard_title: 'Import Board',
|
importBoard_title: 'Import Board',
|
||||||
invalidCurrentPassword: 'Invalid current password',
|
invalidCurrentPassword: 'Invalid current password',
|
||||||
@@ -245,9 +248,11 @@ export default {
|
|||||||
optional_inline: 'optional',
|
optional_inline: 'optional',
|
||||||
organization: 'Organization',
|
organization: 'Organization',
|
||||||
others: 'Others',
|
others: 'Others',
|
||||||
|
passwordIsSet: 'Password is set',
|
||||||
phone: 'Phone',
|
phone: 'Phone',
|
||||||
plankaUsesAppriseToSendNotificationsToOver100PopularServices:
|
plankaUsesAppriseToSendNotificationsToOver100PopularServices:
|
||||||
'PLANKA uses <1><0>Apprise</0></1> to send notifications to over 100 popular services.',
|
'PLANKA uses <1><0>Apprise</0></1> to send notifications to over 100 popular services.',
|
||||||
|
port: 'Port',
|
||||||
preferences: 'Preferences',
|
preferences: 'Preferences',
|
||||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
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.',
|
||||||
@@ -256,6 +261,7 @@ export default {
|
|||||||
projectNotFound_title: 'Project Not Found',
|
projectNotFound_title: 'Project Not Found',
|
||||||
projectOwner: 'Project owner',
|
projectOwner: 'Project owner',
|
||||||
referenceDataAndKnowledgeStorage: 'Reference data and knowledge storage.',
|
referenceDataAndKnowledgeStorage: 'Reference data and knowledge storage.',
|
||||||
|
rejectUnauthorizedTlsCertificates: 'Reject unauthorized TLS certificates',
|
||||||
removeManager_title: 'Remove Manager',
|
removeManager_title: 'Remove Manager',
|
||||||
removeMember_title: 'Remove Member',
|
removeMember_title: 'Remove Member',
|
||||||
role: 'Role',
|
role: 'Role',
|
||||||
@@ -282,6 +288,7 @@ export default {
|
|||||||
shared: 'Shared',
|
shared: 'Shared',
|
||||||
sharedWithMe_title: 'Shared With Me',
|
sharedWithMe_title: 'Shared With Me',
|
||||||
showOnFrontOfCard: 'Show on front of card',
|
showOnFrontOfCard: 'Show on front of card',
|
||||||
|
smtp: 'SMTP',
|
||||||
sortList_title: 'Sort List',
|
sortList_title: 'Sort List',
|
||||||
stopwatch: 'Stopwatch',
|
stopwatch: 'Stopwatch',
|
||||||
story: 'Story',
|
story: 'Story',
|
||||||
@@ -293,6 +300,7 @@ export default {
|
|||||||
taskList_title: 'Task List',
|
taskList_title: 'Task List',
|
||||||
team: 'Team',
|
team: 'Team',
|
||||||
terms: 'Terms',
|
terms: 'Terms',
|
||||||
|
testLog_title: 'Test Log',
|
||||||
thereIsNoPreviewAvailableForThisAttachment:
|
thereIsNoPreviewAvailableForThisAttachment:
|
||||||
'There is no preview available for this attachment.',
|
'There is no preview available for this attachment.',
|
||||||
time: 'Time',
|
time: 'Time',
|
||||||
@@ -307,6 +315,7 @@ export default {
|
|||||||
uploadFailedNotEnoughStorageSpace: 'Upload failed: Not enough storage space.',
|
uploadFailedNotEnoughStorageSpace: 'Upload failed: Not enough storage space.',
|
||||||
uploadedImages: 'Uploaded images',
|
uploadedImages: 'Uploaded images',
|
||||||
url: 'URL',
|
url: 'URL',
|
||||||
|
useSecureConnection: 'Use secure connection',
|
||||||
userActions_title: 'User Actions',
|
userActions_title: 'User Actions',
|
||||||
userAddedCardToList: '<0>{{user}}</0> added <2>{{card}}</2> to {{list}}',
|
userAddedCardToList: '<0>{{user}}</0> added <2>{{card}}</2> to {{list}}',
|
||||||
userAddedThisCardToList: '<0>{{user}}</0> added this card to {{list}}',
|
userAddedThisCardToList: '<0>{{user}}</0> added this card to {{list}}',
|
||||||
@@ -446,6 +455,7 @@ export default {
|
|||||||
restoreToList: 'Restore to {{list}}',
|
restoreToList: 'Restore to {{list}}',
|
||||||
returnToBoard: 'Return to board',
|
returnToBoard: 'Return to board',
|
||||||
save: 'Save',
|
save: 'Save',
|
||||||
|
sendTestEmail: 'Send test email',
|
||||||
showActive: 'Show active',
|
showActive: 'Show active',
|
||||||
showAllAttachments: 'Show all attachments ({{hidden}} hidden)',
|
showAllAttachments: 'Show all attachments ({{hidden}} hidden)',
|
||||||
showCardsWithThisUser: 'Show cards with this user',
|
showCardsWithThisUser: 'Show cards with this user',
|
||||||
|
|||||||
@@ -110,6 +110,7 @@ export default {
|
|||||||
'Cards on this list are complete and ready to be archived.',
|
'Cards on this list are complete and ready to be archived.',
|
||||||
cardsOnThisListAreReadyToBeWorkedOn: 'Cards on this list are ready to be worked on.',
|
cardsOnThisListAreReadyToBeWorkedOn: 'Cards on this list are ready to be worked on.',
|
||||||
clickHereOrRefreshPageToUpdate: '<0>Click here</0> or refresh the page to update.',
|
clickHereOrRefreshPageToUpdate: '<0>Click here</0> or refresh the page to update.',
|
||||||
|
clientHostnameInEhlo: 'Client hostname in EHLO',
|
||||||
closed: 'Closed',
|
closed: 'Closed',
|
||||||
color: 'Color',
|
color: 'Color',
|
||||||
comments: 'Comments',
|
comments: 'Comments',
|
||||||
@@ -132,6 +133,7 @@ export default {
|
|||||||
date: 'Date',
|
date: 'Date',
|
||||||
deactivateUser_title: 'Deactivate User',
|
deactivateUser_title: 'Deactivate User',
|
||||||
defaultCardType_title: 'Default Card Type',
|
defaultCardType_title: 'Default Card Type',
|
||||||
|
defaultFrom: 'Default "from"',
|
||||||
defaultView_title: 'Default View',
|
defaultView_title: 'Default View',
|
||||||
deleteAllBoardsToBeAbleToDeleteThisProject:
|
deleteAllBoardsToBeAbleToDeleteThisProject:
|
||||||
'Delete all boards to be able to delete this project',
|
'Delete all boards to be able to delete this project',
|
||||||
@@ -196,6 +198,7 @@ export default {
|
|||||||
grid: 'Grid',
|
grid: 'Grid',
|
||||||
hideCompletedTasks: 'Hide completed tasks',
|
hideCompletedTasks: 'Hide completed tasks',
|
||||||
hideFromProjectListAndFavorites: 'Hide from project list and favorites',
|
hideFromProjectListAndFavorites: 'Hide from project list and favorites',
|
||||||
|
host: 'Host',
|
||||||
hours: 'Hours',
|
hours: 'Hours',
|
||||||
importBoard_title: 'Import Board',
|
importBoard_title: 'Import Board',
|
||||||
invalidCurrentPassword: 'Invalid current password',
|
invalidCurrentPassword: 'Invalid current password',
|
||||||
@@ -240,9 +243,11 @@ export default {
|
|||||||
optional_inline: 'optional',
|
optional_inline: 'optional',
|
||||||
organization: 'Organization',
|
organization: 'Organization',
|
||||||
others: 'Others',
|
others: 'Others',
|
||||||
|
passwordIsSet: 'Password is set',
|
||||||
phone: 'Phone',
|
phone: 'Phone',
|
||||||
plankaUsesAppriseToSendNotificationsToOver100PopularServices:
|
plankaUsesAppriseToSendNotificationsToOver100PopularServices:
|
||||||
'PLANKA uses <1><0>Apprise</0></1> to send notifications to over 100 popular services.',
|
'PLANKA uses <1><0>Apprise</0></1> to send notifications to over 100 popular services.',
|
||||||
|
port: 'Port',
|
||||||
preferences: 'Preferences',
|
preferences: 'Preferences',
|
||||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
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.',
|
||||||
@@ -251,6 +256,7 @@ export default {
|
|||||||
projectNotFound_title: 'Project Not Found',
|
projectNotFound_title: 'Project Not Found',
|
||||||
projectOwner: 'Project owner',
|
projectOwner: 'Project owner',
|
||||||
referenceDataAndKnowledgeStorage: 'Reference data and knowledge storage.',
|
referenceDataAndKnowledgeStorage: 'Reference data and knowledge storage.',
|
||||||
|
rejectUnauthorizedTlsCertificates: 'Reject unauthorized TLS certificates',
|
||||||
removeManager_title: 'Remove Manager',
|
removeManager_title: 'Remove Manager',
|
||||||
removeMember_title: 'Remove Member',
|
removeMember_title: 'Remove Member',
|
||||||
role: 'Role',
|
role: 'Role',
|
||||||
@@ -277,6 +283,7 @@ export default {
|
|||||||
shared: 'Shared',
|
shared: 'Shared',
|
||||||
sharedWithMe_title: 'Shared With Me',
|
sharedWithMe_title: 'Shared With Me',
|
||||||
showOnFrontOfCard: 'Show on front of card',
|
showOnFrontOfCard: 'Show on front of card',
|
||||||
|
smtp: 'SMTP',
|
||||||
sortList_title: 'Sort List',
|
sortList_title: 'Sort List',
|
||||||
stopwatch: 'Stopwatch',
|
stopwatch: 'Stopwatch',
|
||||||
story: 'Story',
|
story: 'Story',
|
||||||
@@ -288,6 +295,7 @@ export default {
|
|||||||
taskList_title: 'Task List',
|
taskList_title: 'Task List',
|
||||||
team: 'Team',
|
team: 'Team',
|
||||||
terms: 'Terms',
|
terms: 'Terms',
|
||||||
|
testLog_title: 'Test Log',
|
||||||
thereIsNoPreviewAvailableForThisAttachment:
|
thereIsNoPreviewAvailableForThisAttachment:
|
||||||
'There is no preview available for this attachment.',
|
'There is no preview available for this attachment.',
|
||||||
time: 'Time',
|
time: 'Time',
|
||||||
@@ -302,6 +310,7 @@ export default {
|
|||||||
uploadFailedNotEnoughStorageSpace: 'Upload failed: Not enough storage space.',
|
uploadFailedNotEnoughStorageSpace: 'Upload failed: Not enough storage space.',
|
||||||
uploadedImages: 'Uploaded images',
|
uploadedImages: 'Uploaded images',
|
||||||
url: 'URL',
|
url: 'URL',
|
||||||
|
useSecureConnection: 'Use secure connection',
|
||||||
userActions_title: 'User Actions',
|
userActions_title: 'User Actions',
|
||||||
userAddedCardToList: '<0>{{user}}</0> added <2>{{card}}</2> to {{list}}',
|
userAddedCardToList: '<0>{{user}}</0> added <2>{{card}}</2> to {{list}}',
|
||||||
userAddedThisCardToList: '<0>{{user}}</0> added this card to {{list}}',
|
userAddedThisCardToList: '<0>{{user}}</0> added this card to {{list}}',
|
||||||
@@ -441,6 +450,7 @@ export default {
|
|||||||
restoreToList: 'Restore to {{list}}',
|
restoreToList: 'Restore to {{list}}',
|
||||||
returnToBoard: 'Return to board',
|
returnToBoard: 'Return to board',
|
||||||
save: 'Save',
|
save: 'Save',
|
||||||
|
sendTestEmail: 'Send test email',
|
||||||
showActive: 'Show active',
|
showActive: 'Show active',
|
||||||
showAllAttachments: 'Show all attachments ({{hidden}} hidden)',
|
showAllAttachments: 'Show all attachments ({{hidden}} hidden)',
|
||||||
showCardsWithThisUser: 'Show cards with this user',
|
showCardsWithThisUser: 'Show cards with this user',
|
||||||
|
|||||||
@@ -116,6 +116,7 @@ export default {
|
|||||||
cardsOnThisListAreReadyToBeWorkedOn:
|
cardsOnThisListAreReadyToBeWorkedOn:
|
||||||
'Las tarjetas en esta lista están listas para ser trabajadas.',
|
'Las tarjetas en esta lista están listas para ser trabajadas.',
|
||||||
clickHereOrRefreshPageToUpdate: '<0>Haz clic aquí</0> o actualiza la página para actualizar.',
|
clickHereOrRefreshPageToUpdate: '<0>Haz clic aquí</0> o actualiza la página para actualizar.',
|
||||||
|
clientHostnameInEhlo: null,
|
||||||
closed: 'Cerrado',
|
closed: 'Cerrado',
|
||||||
color: 'Color',
|
color: 'Color',
|
||||||
comments: 'Comentarios',
|
comments: 'Comentarios',
|
||||||
@@ -138,6 +139,7 @@ export default {
|
|||||||
date: 'Fecha',
|
date: 'Fecha',
|
||||||
deactivateUser_title: 'Desactivar usuario',
|
deactivateUser_title: 'Desactivar usuario',
|
||||||
defaultCardType_title: 'Tipo de tarjeta por defecto',
|
defaultCardType_title: 'Tipo de tarjeta por defecto',
|
||||||
|
defaultFrom: null,
|
||||||
defaultView_title: 'Vista por defecto',
|
defaultView_title: 'Vista por defecto',
|
||||||
deleteAllBoardsToBeAbleToDeleteThisProject:
|
deleteAllBoardsToBeAbleToDeleteThisProject:
|
||||||
'Elimina todos los tableros para poder eliminar este proyecto.',
|
'Elimina todos los tableros para poder eliminar este proyecto.',
|
||||||
@@ -202,6 +204,7 @@ export default {
|
|||||||
grid: 'Cuadrícula',
|
grid: 'Cuadrícula',
|
||||||
hideCompletedTasks: null,
|
hideCompletedTasks: null,
|
||||||
hideFromProjectListAndFavorites: 'Ocultar de la lista de proyectos y favoritos',
|
hideFromProjectListAndFavorites: 'Ocultar de la lista de proyectos y favoritos',
|
||||||
|
host: null,
|
||||||
hours: 'Horas',
|
hours: 'Horas',
|
||||||
importBoard_title: 'Importar tablero',
|
importBoard_title: 'Importar tablero',
|
||||||
invalidCurrentPassword: 'Contraseña actual inválida',
|
invalidCurrentPassword: 'Contraseña actual inválida',
|
||||||
@@ -245,9 +248,11 @@ export default {
|
|||||||
optional_inline: 'opcional',
|
optional_inline: 'opcional',
|
||||||
organization: 'Organización',
|
organization: 'Organización',
|
||||||
others: 'Otros',
|
others: 'Otros',
|
||||||
|
passwordIsSet: null,
|
||||||
phone: 'Teléfono',
|
phone: 'Teléfono',
|
||||||
plankaUsesAppriseToSendNotificationsToOver100PopularServices:
|
plankaUsesAppriseToSendNotificationsToOver100PopularServices:
|
||||||
'PLANKA utiliza <1><0>Apprise</0></1> para enviar notificaciones a más de 100 servicios populares.',
|
'PLANKA utiliza <1><0>Apprise</0></1> para enviar notificaciones a más de 100 servicios populares.',
|
||||||
|
port: null,
|
||||||
preferences: 'Preferencias',
|
preferences: 'Preferencias',
|
||||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
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.',
|
||||||
@@ -256,6 +261,7 @@ export default {
|
|||||||
projectNotFound_title: 'Proyecto no encontrado',
|
projectNotFound_title: 'Proyecto no encontrado',
|
||||||
projectOwner: 'Propietario del proyecto',
|
projectOwner: 'Propietario del proyecto',
|
||||||
referenceDataAndKnowledgeStorage: 'Datos de referencia y almacenamiento de conocimiento',
|
referenceDataAndKnowledgeStorage: 'Datos de referencia y almacenamiento de conocimiento',
|
||||||
|
rejectUnauthorizedTlsCertificates: null,
|
||||||
removeManager_title: null,
|
removeManager_title: null,
|
||||||
removeMember_title: 'Remover Miembro',
|
removeMember_title: 'Remover Miembro',
|
||||||
role: 'Rol',
|
role: 'Rol',
|
||||||
@@ -282,6 +288,7 @@ export default {
|
|||||||
shared: 'Compartido',
|
shared: 'Compartido',
|
||||||
sharedWithMe_title: 'Compartido conmigo',
|
sharedWithMe_title: 'Compartido conmigo',
|
||||||
showOnFrontOfCard: 'Mostrar en el frente de la tarjeta',
|
showOnFrontOfCard: 'Mostrar en el frente de la tarjeta',
|
||||||
|
smtp: null,
|
||||||
sortList_title: 'Ordenar',
|
sortList_title: 'Ordenar',
|
||||||
stopwatch: 'Temporizador',
|
stopwatch: 'Temporizador',
|
||||||
story: 'Historia',
|
story: 'Historia',
|
||||||
@@ -293,6 +300,7 @@ export default {
|
|||||||
taskList_title: 'Lista de tareas',
|
taskList_title: 'Lista de tareas',
|
||||||
team: 'Equipo',
|
team: 'Equipo',
|
||||||
terms: null,
|
terms: null,
|
||||||
|
testLog_title: null,
|
||||||
thereIsNoPreviewAvailableForThisAttachment:
|
thereIsNoPreviewAvailableForThisAttachment:
|
||||||
'No hay vista previa disponible para este adjunto.',
|
'No hay vista previa disponible para este adjunto.',
|
||||||
time: 'Tiempo',
|
time: 'Tiempo',
|
||||||
@@ -307,6 +315,7 @@ export default {
|
|||||||
uploadFailedNotEnoughStorageSpace: null,
|
uploadFailedNotEnoughStorageSpace: null,
|
||||||
uploadedImages: 'Imágenes subidas',
|
uploadedImages: 'Imágenes subidas',
|
||||||
url: null,
|
url: null,
|
||||||
|
useSecureConnection: null,
|
||||||
userActions_title: 'Acciones de Usuario',
|
userActions_title: 'Acciones de Usuario',
|
||||||
userAddedCardToList: '<0>{{user}}</0> añadió <2>{{card}}</2> a {{list}}',
|
userAddedCardToList: '<0>{{user}}</0> añadió <2>{{card}}</2> a {{list}}',
|
||||||
userAddedThisCardToList: '<0>{{user}}</0> añadido a esta tarjeta en {{list}}',
|
userAddedThisCardToList: '<0>{{user}}</0> añadido a esta tarjeta en {{list}}',
|
||||||
@@ -446,6 +455,7 @@ export default {
|
|||||||
restoreToList: 'Restaurar a {{list}}',
|
restoreToList: 'Restaurar a {{list}}',
|
||||||
returnToBoard: 'Volver al tablero',
|
returnToBoard: 'Volver al tablero',
|
||||||
save: 'Guardar',
|
save: 'Guardar',
|
||||||
|
sendTestEmail: null,
|
||||||
showActive: 'Mostrar activos',
|
showActive: 'Mostrar activos',
|
||||||
showAllAttachments: 'Mostrar todos los adjuntos ({{hidden}} ocultos)',
|
showAllAttachments: 'Mostrar todos los adjuntos ({{hidden}} ocultos)',
|
||||||
showCardsWithThisUser: 'Mostrar tarjetas con este usuario',
|
showCardsWithThisUser: 'Mostrar tarjetas con este usuario',
|
||||||
|
|||||||
@@ -115,6 +115,7 @@ export default {
|
|||||||
'Kaardid sellel nimekirjal on täidetud ja valmis arhiveerimiseks.',
|
'Kaardid sellel nimekirjal on täidetud ja valmis arhiveerimiseks.',
|
||||||
cardsOnThisListAreReadyToBeWorkedOn: 'Kaardid sellel nimekirjal on valmis tööle.',
|
cardsOnThisListAreReadyToBeWorkedOn: 'Kaardid sellel nimekirjal on valmis tööle.',
|
||||||
clickHereOrRefreshPageToUpdate: '<0>Klõpsa siia</0> või uuendage lehte.',
|
clickHereOrRefreshPageToUpdate: '<0>Klõpsa siia</0> või uuendage lehte.',
|
||||||
|
clientHostnameInEhlo: null,
|
||||||
closed: 'Suletud',
|
closed: 'Suletud',
|
||||||
color: 'Värv',
|
color: 'Värv',
|
||||||
comments: 'Kommentaarid',
|
comments: 'Kommentaarid',
|
||||||
@@ -137,6 +138,7 @@ export default {
|
|||||||
date: 'Kuupäev',
|
date: 'Kuupäev',
|
||||||
deactivateUser_title: 'Deaktiveeri kasutaja',
|
deactivateUser_title: 'Deaktiveeri kasutaja',
|
||||||
defaultCardType_title: 'Vaikimisi kaardi tüüp',
|
defaultCardType_title: 'Vaikimisi kaardi tüüp',
|
||||||
|
defaultFrom: null,
|
||||||
defaultView_title: 'Vaikimisi vaade',
|
defaultView_title: 'Vaikimisi vaade',
|
||||||
deleteAllBoardsToBeAbleToDeleteThisProject:
|
deleteAllBoardsToBeAbleToDeleteThisProject:
|
||||||
'Kustuta kõik tahvlid, et seda projekti kustutada',
|
'Kustuta kõik tahvlid, et seda projekti kustutada',
|
||||||
@@ -201,6 +203,7 @@ export default {
|
|||||||
grid: 'Grill',
|
grid: 'Grill',
|
||||||
hideCompletedTasks: null,
|
hideCompletedTasks: null,
|
||||||
hideFromProjectListAndFavorites: 'Peida projektiloendist ja lemmikutest',
|
hideFromProjectListAndFavorites: 'Peida projektiloendist ja lemmikutest',
|
||||||
|
host: null,
|
||||||
hours: 'Tunnid',
|
hours: 'Tunnid',
|
||||||
importBoard_title: 'Impordi tahvel',
|
importBoard_title: 'Impordi tahvel',
|
||||||
invalidCurrentPassword: 'Vale praegune parool',
|
invalidCurrentPassword: 'Vale praegune parool',
|
||||||
@@ -244,9 +247,11 @@ export default {
|
|||||||
optional_inline: 'valikuline',
|
optional_inline: 'valikuline',
|
||||||
organization: 'Organisatsioon',
|
organization: 'Organisatsioon',
|
||||||
others: 'Teised',
|
others: 'Teised',
|
||||||
|
passwordIsSet: null,
|
||||||
phone: 'Telefon',
|
phone: 'Telefon',
|
||||||
plankaUsesAppriseToSendNotificationsToOver100PopularServices:
|
plankaUsesAppriseToSendNotificationsToOver100PopularServices:
|
||||||
'PLANKA kasutab <1><0>Apprise</0></1> teavitusteenuse, et teavitada üle 100 populaarset teenust.',
|
'PLANKA kasutab <1><0>Apprise</0></1> teavitusteenuse, et teavitada üle 100 populaarset teenust.',
|
||||||
|
port: null,
|
||||||
preferences: 'Eelistused',
|
preferences: 'Eelistused',
|
||||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||||
"Näpunäide: vajutage Ctrl-V (Cmd-V Mac'il) manuse lisamiseks kleebist.",
|
"Näpunäide: vajutage Ctrl-V (Cmd-V Mac'il) manuse lisamiseks kleebist.",
|
||||||
@@ -255,6 +260,7 @@ export default {
|
|||||||
projectNotFound_title: 'Projekt ei leitud',
|
projectNotFound_title: 'Projekt ei leitud',
|
||||||
projectOwner: 'Projekti omanik',
|
projectOwner: 'Projekti omanik',
|
||||||
referenceDataAndKnowledgeStorage: 'Viideandmete ja teadmise salvestamiseks.',
|
referenceDataAndKnowledgeStorage: 'Viideandmete ja teadmise salvestamiseks.',
|
||||||
|
rejectUnauthorizedTlsCertificates: null,
|
||||||
removeManager_title: 'Eemalda haldur',
|
removeManager_title: 'Eemalda haldur',
|
||||||
removeMember_title: 'Eemalda liige',
|
removeMember_title: 'Eemalda liige',
|
||||||
role: 'Roll',
|
role: 'Roll',
|
||||||
@@ -281,6 +287,7 @@ export default {
|
|||||||
shared: 'Jagatud',
|
shared: 'Jagatud',
|
||||||
sharedWithMe_title: 'Jagatud minuga',
|
sharedWithMe_title: 'Jagatud minuga',
|
||||||
showOnFrontOfCard: 'Kuva kaardi ees',
|
showOnFrontOfCard: 'Kuva kaardi ees',
|
||||||
|
smtp: null,
|
||||||
sortList_title: 'Nimekiri sorteerimine',
|
sortList_title: 'Nimekiri sorteerimine',
|
||||||
stopwatch: 'Stopper',
|
stopwatch: 'Stopper',
|
||||||
story: 'Kirjeldus',
|
story: 'Kirjeldus',
|
||||||
@@ -292,6 +299,7 @@ export default {
|
|||||||
taskList_title: 'Ülesanne nimekiri',
|
taskList_title: 'Ülesanne nimekiri',
|
||||||
team: 'Töögrupp',
|
team: 'Töögrupp',
|
||||||
terms: null,
|
terms: null,
|
||||||
|
testLog_title: null,
|
||||||
thereIsNoPreviewAvailableForThisAttachment: 'Selle manusi eelvaadet pole saadaval.',
|
thereIsNoPreviewAvailableForThisAttachment: 'Selle manusi eelvaadet pole saadaval.',
|
||||||
time: 'Aeg',
|
time: 'Aeg',
|
||||||
title: 'Pealkiri',
|
title: 'Pealkiri',
|
||||||
@@ -305,6 +313,7 @@ export default {
|
|||||||
uploadFailedNotEnoughStorageSpace: null,
|
uploadFailedNotEnoughStorageSpace: null,
|
||||||
uploadedImages: 'Laaditud pildid',
|
uploadedImages: 'Laaditud pildid',
|
||||||
url: null,
|
url: null,
|
||||||
|
useSecureConnection: null,
|
||||||
userActions_title: 'Kasutaja tegevused',
|
userActions_title: 'Kasutaja tegevused',
|
||||||
userAddedCardToList: '<0>{{user}}</0> lisas <2>{{card}}</2> nimekirjaan {{list}}',
|
userAddedCardToList: '<0>{{user}}</0> lisas <2>{{card}}</2> nimekirjaan {{list}}',
|
||||||
userAddedThisCardToList: '<0>{{user}}</0> lisas selle kaardi nimekirjaan {{list}}',
|
userAddedThisCardToList: '<0>{{user}}</0> lisas selle kaardi nimekirjaan {{list}}',
|
||||||
@@ -445,6 +454,7 @@ export default {
|
|||||||
restoreToList: 'Taasta nimekirja {{list}}',
|
restoreToList: 'Taasta nimekirja {{list}}',
|
||||||
returnToBoard: 'Tagasi tahvlile',
|
returnToBoard: 'Tagasi tahvlile',
|
||||||
save: 'Salvesta',
|
save: 'Salvesta',
|
||||||
|
sendTestEmail: null,
|
||||||
showActive: 'Näita aktiivseid',
|
showActive: 'Näita aktiivseid',
|
||||||
showAllAttachments: 'Näita kõiki manuseid ({{hidden}} peidetud)',
|
showAllAttachments: 'Näita kõiki manuseid ({{hidden}} peidetud)',
|
||||||
showCardsWithThisUser: 'Näita selle kasutajaga kaarte',
|
showCardsWithThisUser: 'Näita selle kasutajaga kaarte',
|
||||||
|
|||||||
@@ -99,6 +99,7 @@ export default {
|
|||||||
cardsOnThisListAreCompleteAndReadyToBeArchived: null,
|
cardsOnThisListAreCompleteAndReadyToBeArchived: null,
|
||||||
cardsOnThisListAreReadyToBeWorkedOn: null,
|
cardsOnThisListAreReadyToBeWorkedOn: null,
|
||||||
clickHereOrRefreshPageToUpdate: null,
|
clickHereOrRefreshPageToUpdate: null,
|
||||||
|
clientHostnameInEhlo: null,
|
||||||
closed: null,
|
closed: null,
|
||||||
color: 'رنگ',
|
color: 'رنگ',
|
||||||
comments: null,
|
comments: null,
|
||||||
@@ -121,6 +122,7 @@ export default {
|
|||||||
date: 'تاریخ',
|
date: 'تاریخ',
|
||||||
deactivateUser_title: null,
|
deactivateUser_title: null,
|
||||||
defaultCardType_title: null,
|
defaultCardType_title: null,
|
||||||
|
defaultFrom: null,
|
||||||
defaultView_title: null,
|
defaultView_title: null,
|
||||||
deleteAllBoardsToBeAbleToDeleteThisProject: null,
|
deleteAllBoardsToBeAbleToDeleteThisProject: null,
|
||||||
deleteAttachment_title: 'حذف پیوست',
|
deleteAttachment_title: 'حذف پیوست',
|
||||||
@@ -184,6 +186,7 @@ export default {
|
|||||||
grid: null,
|
grid: null,
|
||||||
hideCompletedTasks: null,
|
hideCompletedTasks: null,
|
||||||
hideFromProjectListAndFavorites: null,
|
hideFromProjectListAndFavorites: null,
|
||||||
|
host: null,
|
||||||
hours: 'ساعتها',
|
hours: 'ساعتها',
|
||||||
importBoard_title: 'وارد کردن برد',
|
importBoard_title: 'وارد کردن برد',
|
||||||
invalidCurrentPassword: 'رمز عبور فعلی نامعتبر است',
|
invalidCurrentPassword: 'رمز عبور فعلی نامعتبر است',
|
||||||
@@ -227,8 +230,10 @@ export default {
|
|||||||
optional_inline: 'اختیاری',
|
optional_inline: 'اختیاری',
|
||||||
organization: 'سازمان',
|
organization: 'سازمان',
|
||||||
others: null,
|
others: null,
|
||||||
|
passwordIsSet: null,
|
||||||
phone: 'تلفن',
|
phone: 'تلفن',
|
||||||
plankaUsesAppriseToSendNotificationsToOver100PopularServices: null,
|
plankaUsesAppriseToSendNotificationsToOver100PopularServices: null,
|
||||||
|
port: null,
|
||||||
preferences: 'ترجیحات',
|
preferences: 'ترجیحات',
|
||||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||||
'نکته: با فشردن Ctrl-V (Cmd-V در مک) میتوانید پیوست را از کلیپ بورد اضافه کنید.',
|
'نکته: با فشردن Ctrl-V (Cmd-V در مک) میتوانید پیوست را از کلیپ بورد اضافه کنید.',
|
||||||
@@ -237,6 +242,7 @@ export default {
|
|||||||
projectNotFound_title: 'پروژه یافت نشد',
|
projectNotFound_title: 'پروژه یافت نشد',
|
||||||
projectOwner: null,
|
projectOwner: null,
|
||||||
referenceDataAndKnowledgeStorage: null,
|
referenceDataAndKnowledgeStorage: null,
|
||||||
|
rejectUnauthorizedTlsCertificates: null,
|
||||||
removeManager_title: 'حذف مدیر',
|
removeManager_title: 'حذف مدیر',
|
||||||
removeMember_title: 'حذف عضو',
|
removeMember_title: 'حذف عضو',
|
||||||
role: null,
|
role: null,
|
||||||
@@ -263,6 +269,7 @@ export default {
|
|||||||
shared: null,
|
shared: null,
|
||||||
sharedWithMe_title: null,
|
sharedWithMe_title: null,
|
||||||
showOnFrontOfCard: null,
|
showOnFrontOfCard: null,
|
||||||
|
smtp: null,
|
||||||
sortList_title: 'مرتبسازی لیست',
|
sortList_title: 'مرتبسازی لیست',
|
||||||
stopwatch: 'کرنومتر',
|
stopwatch: 'کرنومتر',
|
||||||
story: null,
|
story: null,
|
||||||
@@ -274,6 +281,7 @@ export default {
|
|||||||
taskList_title: null,
|
taskList_title: null,
|
||||||
team: null,
|
team: null,
|
||||||
terms: null,
|
terms: null,
|
||||||
|
testLog_title: null,
|
||||||
thereIsNoPreviewAvailableForThisAttachment: 'پیش نمایشی برای این پیوست موجود نیست.',
|
thereIsNoPreviewAvailableForThisAttachment: 'پیش نمایشی برای این پیوست موجود نیست.',
|
||||||
time: 'زمان',
|
time: 'زمان',
|
||||||
title: 'عنوان',
|
title: 'عنوان',
|
||||||
@@ -287,6 +295,7 @@ export default {
|
|||||||
uploadFailedNotEnoughStorageSpace: null,
|
uploadFailedNotEnoughStorageSpace: null,
|
||||||
uploadedImages: null,
|
uploadedImages: null,
|
||||||
url: null,
|
url: null,
|
||||||
|
useSecureConnection: null,
|
||||||
userActions_title: 'اقدامات کاربر',
|
userActions_title: 'اقدامات کاربر',
|
||||||
userAddedCardToList: null,
|
userAddedCardToList: null,
|
||||||
userAddedThisCardToList: '<0>{{user}}</0> این کارت را به {{list}} اضافه کرد',
|
userAddedThisCardToList: '<0>{{user}}</0> این کارت را به {{list}} اضافه کرد',
|
||||||
@@ -424,6 +433,7 @@ export default {
|
|||||||
restoreToList: null,
|
restoreToList: null,
|
||||||
returnToBoard: null,
|
returnToBoard: null,
|
||||||
save: 'ذخیره',
|
save: 'ذخیره',
|
||||||
|
sendTestEmail: null,
|
||||||
showActive: null,
|
showActive: null,
|
||||||
showAllAttachments: 'نمایش همه پیوستها ({{hidden}} مخفی)',
|
showAllAttachments: 'نمایش همه پیوستها ({{hidden}} مخفی)',
|
||||||
showCardsWithThisUser: null,
|
showCardsWithThisUser: null,
|
||||||
|
|||||||
@@ -111,6 +111,7 @@ export default {
|
|||||||
'Tämän listan kortit ovat valmiita ja voidaan arkistoida.',
|
'Tämän listan kortit ovat valmiita ja voidaan arkistoida.',
|
||||||
cardsOnThisListAreReadyToBeWorkedOn: 'Tämän listan kortit ovat valmiita työstettäväksi.',
|
cardsOnThisListAreReadyToBeWorkedOn: 'Tämän listan kortit ovat valmiita työstettäväksi.',
|
||||||
clickHereOrRefreshPageToUpdate: '<0>Päivitä tästä</0> tai lataa sivu uudelleen.',
|
clickHereOrRefreshPageToUpdate: '<0>Päivitä tästä</0> tai lataa sivu uudelleen.',
|
||||||
|
clientHostnameInEhlo: null,
|
||||||
closed: 'Suljettu',
|
closed: 'Suljettu',
|
||||||
color: 'Väri',
|
color: 'Väri',
|
||||||
comments: 'Kommentit',
|
comments: 'Kommentit',
|
||||||
@@ -133,6 +134,7 @@ export default {
|
|||||||
date: 'Päivämäärä',
|
date: 'Päivämäärä',
|
||||||
deactivateUser_title: 'Poista käyttäjä käytöstä',
|
deactivateUser_title: 'Poista käyttäjä käytöstä',
|
||||||
defaultCardType_title: 'Oletuskorttityyppi',
|
defaultCardType_title: 'Oletuskorttityyppi',
|
||||||
|
defaultFrom: null,
|
||||||
defaultView_title: 'Oletusnäkymä',
|
defaultView_title: 'Oletusnäkymä',
|
||||||
deleteAllBoardsToBeAbleToDeleteThisProject:
|
deleteAllBoardsToBeAbleToDeleteThisProject:
|
||||||
'Poista kaikki taulut, jotta voit poistaa tämän projektin',
|
'Poista kaikki taulut, jotta voit poistaa tämän projektin',
|
||||||
@@ -197,6 +199,7 @@ export default {
|
|||||||
grid: 'Ruudukko',
|
grid: 'Ruudukko',
|
||||||
hideCompletedTasks: null,
|
hideCompletedTasks: null,
|
||||||
hideFromProjectListAndFavorites: 'Piilota projektilistasta ja suosikeista',
|
hideFromProjectListAndFavorites: 'Piilota projektilistasta ja suosikeista',
|
||||||
|
host: null,
|
||||||
hours: 'Tunnit',
|
hours: 'Tunnit',
|
||||||
importBoard_title: 'Tuo taulu',
|
importBoard_title: 'Tuo taulu',
|
||||||
invalidCurrentPassword: 'Virheellinen nykyinen salasana',
|
invalidCurrentPassword: 'Virheellinen nykyinen salasana',
|
||||||
@@ -240,9 +243,11 @@ export default {
|
|||||||
optional_inline: 'valinnainen',
|
optional_inline: 'valinnainen',
|
||||||
organization: 'Organisaatio',
|
organization: 'Organisaatio',
|
||||||
others: 'Muut',
|
others: 'Muut',
|
||||||
|
passwordIsSet: null,
|
||||||
phone: 'Puhelin',
|
phone: 'Puhelin',
|
||||||
plankaUsesAppriseToSendNotificationsToOver100PopularServices:
|
plankaUsesAppriseToSendNotificationsToOver100PopularServices:
|
||||||
'PLANKA käyttää <1><0>Apprise</0></1> lähettääkseen ilmoituksia yli 100 suosittuun palveluun.',
|
'PLANKA käyttää <1><0>Apprise</0></1> lähettääkseen ilmoituksia yli 100 suosittuun palveluun.',
|
||||||
|
port: null,
|
||||||
preferences: 'Asetukset',
|
preferences: 'Asetukset',
|
||||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||||
'Vinkki: paina Ctrl-V (tai Cmd-V Macilla) lisätäksesi liitteen leikepöydältä.',
|
'Vinkki: paina Ctrl-V (tai Cmd-V Macilla) lisätäksesi liitteen leikepöydältä.',
|
||||||
@@ -251,6 +256,7 @@ export default {
|
|||||||
projectNotFound_title: 'Projektia ei löytynyt',
|
projectNotFound_title: 'Projektia ei löytynyt',
|
||||||
projectOwner: 'Projektin omistaja',
|
projectOwner: 'Projektin omistaja',
|
||||||
referenceDataAndKnowledgeStorage: 'Viitetiedot ja tietovarasto.',
|
referenceDataAndKnowledgeStorage: 'Viitetiedot ja tietovarasto.',
|
||||||
|
rejectUnauthorizedTlsCertificates: null,
|
||||||
removeManager_title: 'Poista ylläpitäjä',
|
removeManager_title: 'Poista ylläpitäjä',
|
||||||
removeMember_title: 'Poista jäsen',
|
removeMember_title: 'Poista jäsen',
|
||||||
role: 'Rooli',
|
role: 'Rooli',
|
||||||
@@ -277,6 +283,7 @@ export default {
|
|||||||
shared: 'Jaettu',
|
shared: 'Jaettu',
|
||||||
sharedWithMe_title: 'Jaettu kanssani',
|
sharedWithMe_title: 'Jaettu kanssani',
|
||||||
showOnFrontOfCard: 'Näytä kortin etupuolella',
|
showOnFrontOfCard: 'Näytä kortin etupuolella',
|
||||||
|
smtp: null,
|
||||||
sortList_title: 'Lajittele lista',
|
sortList_title: 'Lajittele lista',
|
||||||
stopwatch: 'Ajastin',
|
stopwatch: 'Ajastin',
|
||||||
story: 'Tarina',
|
story: 'Tarina',
|
||||||
@@ -288,6 +295,7 @@ export default {
|
|||||||
taskList_title: 'Tehtävälista',
|
taskList_title: 'Tehtävälista',
|
||||||
team: 'Tiimi',
|
team: 'Tiimi',
|
||||||
terms: null,
|
terms: null,
|
||||||
|
testLog_title: null,
|
||||||
thereIsNoPreviewAvailableForThisAttachment: 'Tälle liitteelle ei ole esikatselua saatavilla.',
|
thereIsNoPreviewAvailableForThisAttachment: 'Tälle liitteelle ei ole esikatselua saatavilla.',
|
||||||
time: 'Aika',
|
time: 'Aika',
|
||||||
title: 'Otsikko',
|
title: 'Otsikko',
|
||||||
@@ -301,6 +309,7 @@ export default {
|
|||||||
uploadFailedNotEnoughStorageSpace: null,
|
uploadFailedNotEnoughStorageSpace: null,
|
||||||
uploadedImages: 'Ladatut kuvat',
|
uploadedImages: 'Ladatut kuvat',
|
||||||
url: null,
|
url: null,
|
||||||
|
useSecureConnection: null,
|
||||||
userActions_title: 'Käyttäjän toiminnot',
|
userActions_title: 'Käyttäjän toiminnot',
|
||||||
userAddedCardToList: '<0>{{user}}</0> lisäsi <2>{{card}}</2> listaan {{list}}',
|
userAddedCardToList: '<0>{{user}}</0> lisäsi <2>{{card}}</2> listaan {{list}}',
|
||||||
userAddedThisCardToList: '<0>{{user}}</0> lisäsi tämän kortin listaan {{list}}',
|
userAddedThisCardToList: '<0>{{user}}</0> lisäsi tämän kortin listaan {{list}}',
|
||||||
@@ -445,6 +454,7 @@ export default {
|
|||||||
restoreToList: 'Palauta listaan {{list}}',
|
restoreToList: 'Palauta listaan {{list}}',
|
||||||
returnToBoard: 'Palaa tauluun',
|
returnToBoard: 'Palaa tauluun',
|
||||||
save: 'Tallenna',
|
save: 'Tallenna',
|
||||||
|
sendTestEmail: null,
|
||||||
showActive: 'Näytä aktiiviset',
|
showActive: 'Näytä aktiiviset',
|
||||||
showAllAttachments: 'Näytä kaikki liitteet ({{hidden}} piilotettu)',
|
showAllAttachments: 'Näytä kaikki liitteet ({{hidden}} piilotettu)',
|
||||||
showCardsWithThisUser: 'Näytä kortit, joissa tämä käyttäjä',
|
showCardsWithThisUser: 'Näytä kortit, joissa tämä käyttäjä',
|
||||||
|
|||||||
@@ -118,6 +118,7 @@ export default {
|
|||||||
cardsOnThisListAreReadyToBeWorkedOn: 'Les cartes de cette liste sont prêtes à être traitées.',
|
cardsOnThisListAreReadyToBeWorkedOn: 'Les cartes de cette liste sont prêtes à être traitées.',
|
||||||
clickHereOrRefreshPageToUpdate:
|
clickHereOrRefreshPageToUpdate:
|
||||||
'<0>Cliquez ici</0> ou rafraîchissez la page pour mettre à jour.',
|
'<0>Cliquez ici</0> ou rafraîchissez la page pour mettre à jour.',
|
||||||
|
clientHostnameInEhlo: null,
|
||||||
closed: 'Fermé',
|
closed: 'Fermé',
|
||||||
color: 'Couleur',
|
color: 'Couleur',
|
||||||
comments: 'Commentaires',
|
comments: 'Commentaires',
|
||||||
@@ -141,6 +142,7 @@ export default {
|
|||||||
date: 'Date',
|
date: 'Date',
|
||||||
deactivateUser_title: 'Désactiver l’utilisateur',
|
deactivateUser_title: 'Désactiver l’utilisateur',
|
||||||
defaultCardType_title: 'Type de carte par défaut',
|
defaultCardType_title: 'Type de carte par défaut',
|
||||||
|
defaultFrom: null,
|
||||||
defaultView_title: 'Vue par défaut',
|
defaultView_title: 'Vue par défaut',
|
||||||
deleteAllBoardsToBeAbleToDeleteThisProject:
|
deleteAllBoardsToBeAbleToDeleteThisProject:
|
||||||
'Supprimer tous les tableaux pour pouvoir supprimer ce projet.',
|
'Supprimer tous les tableaux pour pouvoir supprimer ce projet.',
|
||||||
@@ -205,6 +207,7 @@ export default {
|
|||||||
grid: 'Grille',
|
grid: 'Grille',
|
||||||
hideCompletedTasks: null,
|
hideCompletedTasks: null,
|
||||||
hideFromProjectListAndFavorites: 'Masquer de la liste des projets et des favoris',
|
hideFromProjectListAndFavorites: 'Masquer de la liste des projets et des favoris',
|
||||||
|
host: null,
|
||||||
hours: 'Heures',
|
hours: 'Heures',
|
||||||
importBoard_title: 'Importer un tableau',
|
importBoard_title: 'Importer un tableau',
|
||||||
invalidCurrentPassword: 'Mot de passe actuel invalide',
|
invalidCurrentPassword: 'Mot de passe actuel invalide',
|
||||||
@@ -248,9 +251,11 @@ export default {
|
|||||||
optional_inline: 'optionnel',
|
optional_inline: 'optionnel',
|
||||||
organization: 'Organisation',
|
organization: 'Organisation',
|
||||||
others: 'Autres',
|
others: 'Autres',
|
||||||
|
passwordIsSet: null,
|
||||||
phone: 'Téléphone',
|
phone: 'Téléphone',
|
||||||
plankaUsesAppriseToSendNotificationsToOver100PopularServices:
|
plankaUsesAppriseToSendNotificationsToOver100PopularServices:
|
||||||
'PLANKA utilise <1><0>Apprise</0></1> pour envoyer des notifications vers plus de 100 services populaires.',
|
'PLANKA utilise <1><0>Apprise</0></1> pour envoyer des notifications vers plus de 100 services populaires.',
|
||||||
|
port: null,
|
||||||
preferences: 'Préférences',
|
preferences: 'Préférences',
|
||||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||||
'Conseil: appuyer sur Ctrl-V (Cmd-V sur Mac) pour ajouter une pièce jointe depuis le presse-papiers',
|
'Conseil: appuyer sur Ctrl-V (Cmd-V sur Mac) pour ajouter une pièce jointe depuis le presse-papiers',
|
||||||
@@ -259,6 +264,7 @@ export default {
|
|||||||
projectNotFound_title: 'Projet introuvable',
|
projectNotFound_title: 'Projet introuvable',
|
||||||
projectOwner: 'Propriétaire de projet',
|
projectOwner: 'Propriétaire de projet',
|
||||||
referenceDataAndKnowledgeStorage: 'Stockage de données de référence et de connaissances.',
|
referenceDataAndKnowledgeStorage: 'Stockage de données de référence et de connaissances.',
|
||||||
|
rejectUnauthorizedTlsCertificates: null,
|
||||||
removeManager_title: 'Supprimer le responsable',
|
removeManager_title: 'Supprimer le responsable',
|
||||||
removeMember_title: 'Supprimer le membre',
|
removeMember_title: 'Supprimer le membre',
|
||||||
role: 'Rôle',
|
role: 'Rôle',
|
||||||
@@ -285,6 +291,7 @@ export default {
|
|||||||
shared: 'Partagé',
|
shared: 'Partagé',
|
||||||
sharedWithMe_title: 'Partagé avec moi',
|
sharedWithMe_title: 'Partagé avec moi',
|
||||||
showOnFrontOfCard: 'Afficher sur le devant de la carte',
|
showOnFrontOfCard: 'Afficher sur le devant de la carte',
|
||||||
|
smtp: null,
|
||||||
sortList_title: 'Trier la liste',
|
sortList_title: 'Trier la liste',
|
||||||
stopwatch: 'Minuteur',
|
stopwatch: 'Minuteur',
|
||||||
story: 'Story',
|
story: 'Story',
|
||||||
@@ -296,6 +303,7 @@ export default {
|
|||||||
taskList_title: 'Liste de tâches',
|
taskList_title: 'Liste de tâches',
|
||||||
team: "Mes projets d'équipe",
|
team: "Mes projets d'équipe",
|
||||||
terms: null,
|
terms: null,
|
||||||
|
testLog_title: null,
|
||||||
thereIsNoPreviewAvailableForThisAttachment:
|
thereIsNoPreviewAvailableForThisAttachment:
|
||||||
"Il n'y a pas d'aperçu disponible pour cette pièce jointe.",
|
"Il n'y a pas d'aperçu disponible pour cette pièce jointe.",
|
||||||
time: 'Temps',
|
time: 'Temps',
|
||||||
@@ -310,6 +318,7 @@ export default {
|
|||||||
uploadFailedNotEnoughStorageSpace: null,
|
uploadFailedNotEnoughStorageSpace: null,
|
||||||
uploadedImages: 'Images téléchargées',
|
uploadedImages: 'Images téléchargées',
|
||||||
url: 'URL',
|
url: 'URL',
|
||||||
|
useSecureConnection: null,
|
||||||
userActions_title: "Actions de l'utilisateur",
|
userActions_title: "Actions de l'utilisateur",
|
||||||
userAddedCardToList: '<0>{{user}}</0> a ajouté <2>{{card}}</2> à {{list}}',
|
userAddedCardToList: '<0>{{user}}</0> a ajouté <2>{{card}}</2> à {{list}}',
|
||||||
userAddedThisCardToList: '<0>{{user}}</0> a ajouté cette carte à {{list}}',
|
userAddedThisCardToList: '<0>{{user}}</0> a ajouté cette carte à {{list}}',
|
||||||
@@ -449,6 +458,7 @@ export default {
|
|||||||
restoreToList: 'Restauré dans {{list}}',
|
restoreToList: 'Restauré dans {{list}}',
|
||||||
returnToBoard: 'Retourner au tableau',
|
returnToBoard: 'Retourner au tableau',
|
||||||
save: 'Sauvegarder',
|
save: 'Sauvegarder',
|
||||||
|
sendTestEmail: null,
|
||||||
showActive: 'Voir les actifs',
|
showActive: 'Voir les actifs',
|
||||||
showAllAttachments: 'Afficher toutes les pièces jointes ({{hidden}} masquées)',
|
showAllAttachments: 'Afficher toutes les pièces jointes ({{hidden}} masquées)',
|
||||||
showCardsWithThisUser: 'Voir les cartes avec cet utilisateur',
|
showCardsWithThisUser: 'Voir les cartes avec cet utilisateur',
|
||||||
|
|||||||
@@ -108,6 +108,7 @@ export default {
|
|||||||
cardsOnThisListAreReadyToBeWorkedOn: 'A listán lévő kártyák készen állnak a munkára.',
|
cardsOnThisListAreReadyToBeWorkedOn: 'A listán lévő kártyák készen állnak a munkára.',
|
||||||
clickHereOrRefreshPageToUpdate:
|
clickHereOrRefreshPageToUpdate:
|
||||||
'<0>Kattintson ide</0> vagy frissítse az oldalt a frissítéshez.',
|
'<0>Kattintson ide</0> vagy frissítse az oldalt a frissítéshez.',
|
||||||
|
clientHostnameInEhlo: null,
|
||||||
closed: 'Lezárt',
|
closed: 'Lezárt',
|
||||||
color: 'Szín',
|
color: 'Szín',
|
||||||
comments: 'Megjegyzések',
|
comments: 'Megjegyzések',
|
||||||
@@ -130,6 +131,7 @@ export default {
|
|||||||
date: 'Dátum',
|
date: 'Dátum',
|
||||||
deactivateUser_title: 'Felhasználó inaktiválása',
|
deactivateUser_title: 'Felhasználó inaktiválása',
|
||||||
defaultCardType_title: 'Alapértelmezett kártyatípus',
|
defaultCardType_title: 'Alapértelmezett kártyatípus',
|
||||||
|
defaultFrom: null,
|
||||||
defaultView_title: 'Alapértelmezett nézet',
|
defaultView_title: 'Alapértelmezett nézet',
|
||||||
deleteAllBoardsToBeAbleToDeleteThisProject:
|
deleteAllBoardsToBeAbleToDeleteThisProject:
|
||||||
'A projekt törléséhez törölni kell az összes táblát.',
|
'A projekt törléséhez törölni kell az összes táblát.',
|
||||||
@@ -194,6 +196,7 @@ export default {
|
|||||||
grid: 'Rács',
|
grid: 'Rács',
|
||||||
hideCompletedTasks: 'Befejezett feladatok elrejtése',
|
hideCompletedTasks: 'Befejezett feladatok elrejtése',
|
||||||
hideFromProjectListAndFavorites: 'Elrejtés a projektlistából és a kedvencekből',
|
hideFromProjectListAndFavorites: 'Elrejtés a projektlistából és a kedvencekből',
|
||||||
|
host: null,
|
||||||
hours: 'Órák',
|
hours: 'Órák',
|
||||||
importBoard_title: 'Tábla importálása',
|
importBoard_title: 'Tábla importálása',
|
||||||
invalidCurrentPassword: 'Érvénytelen jelenlegi jelszó',
|
invalidCurrentPassword: 'Érvénytelen jelenlegi jelszó',
|
||||||
@@ -238,9 +241,11 @@ export default {
|
|||||||
optional_inline: 'opcionális',
|
optional_inline: 'opcionális',
|
||||||
organization: 'Szervezet',
|
organization: 'Szervezet',
|
||||||
others: 'Egyebek',
|
others: 'Egyebek',
|
||||||
|
passwordIsSet: null,
|
||||||
phone: 'Telefon',
|
phone: 'Telefon',
|
||||||
plankaUsesAppriseToSendNotificationsToOver100PopularServices:
|
plankaUsesAppriseToSendNotificationsToOver100PopularServices:
|
||||||
'A PLANKA az Apprise szolgáltatást használja több mint 100 népszerű szolgáltatás értesítéseinek küldésére.',
|
'A PLANKA az Apprise szolgáltatást használja több mint 100 népszerű szolgáltatás értesítéseinek küldésére.',
|
||||||
|
port: null,
|
||||||
preferences: 'Beállítások',
|
preferences: 'Beállítások',
|
||||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||||
'Tipp: nyomja meg a Ctrl-V (Cmd-V a Mac-en) billentyűkombinációt a vágólapról történő melléklet hozzáadásához.',
|
'Tipp: nyomja meg a Ctrl-V (Cmd-V a Mac-en) billentyűkombinációt a vágólapról történő melléklet hozzáadásához.',
|
||||||
@@ -249,6 +254,7 @@ export default {
|
|||||||
projectNotFound_title: 'Projekt nem található',
|
projectNotFound_title: 'Projekt nem található',
|
||||||
projectOwner: 'Projekt tulajdonos',
|
projectOwner: 'Projekt tulajdonos',
|
||||||
referenceDataAndKnowledgeStorage: 'Referenciaadatok és tudástár.',
|
referenceDataAndKnowledgeStorage: 'Referenciaadatok és tudástár.',
|
||||||
|
rejectUnauthorizedTlsCertificates: null,
|
||||||
removeManager_title: 'Menedzser eltávolítása',
|
removeManager_title: 'Menedzser eltávolítása',
|
||||||
removeMember_title: 'Tag eltávolítása',
|
removeMember_title: 'Tag eltávolítása',
|
||||||
role: 'Szerepkör',
|
role: 'Szerepkör',
|
||||||
@@ -275,6 +281,7 @@ export default {
|
|||||||
shared: 'Megosztott',
|
shared: 'Megosztott',
|
||||||
sharedWithMe_title: 'Velem megosztva',
|
sharedWithMe_title: 'Velem megosztva',
|
||||||
showOnFrontOfCard: 'Megjelenítés a kártya borítóján',
|
showOnFrontOfCard: 'Megjelenítés a kártya borítóján',
|
||||||
|
smtp: null,
|
||||||
sortList_title: 'Rendezés listában',
|
sortList_title: 'Rendezés listában',
|
||||||
stopwatch: 'Stopper',
|
stopwatch: 'Stopper',
|
||||||
story: 'Story',
|
story: 'Story',
|
||||||
@@ -286,6 +293,7 @@ export default {
|
|||||||
taskList_title: 'Feladatlista',
|
taskList_title: 'Feladatlista',
|
||||||
team: 'Csapat',
|
team: 'Csapat',
|
||||||
terms: 'Felhasználási feltételek',
|
terms: 'Felhasználási feltételek',
|
||||||
|
testLog_title: null,
|
||||||
thereIsNoPreviewAvailableForThisAttachment: 'Nincs elérhető előnézet ehhez a melléklethez.',
|
thereIsNoPreviewAvailableForThisAttachment: 'Nincs elérhető előnézet ehhez a melléklethez.',
|
||||||
time: 'Idő',
|
time: 'Idő',
|
||||||
title: 'Cím',
|
title: 'Cím',
|
||||||
@@ -299,6 +307,7 @@ export default {
|
|||||||
uploadFailedNotEnoughStorageSpace: 'Feltöltési hiba: nincs elég szabad tárhely',
|
uploadFailedNotEnoughStorageSpace: 'Feltöltési hiba: nincs elég szabad tárhely',
|
||||||
uploadedImages: 'Feltöltött képek',
|
uploadedImages: 'Feltöltött képek',
|
||||||
url: 'URL',
|
url: 'URL',
|
||||||
|
useSecureConnection: null,
|
||||||
userActions_title: 'Felhasználói műveletek',
|
userActions_title: 'Felhasználói műveletek',
|
||||||
userAddedCardToList:
|
userAddedCardToList:
|
||||||
'<0>{{user}}</0> hozzáadta a(z) <2>{{card}}</2> kártyát ehhez a listához: {{list}}',
|
'<0>{{user}}</0> hozzáadta a(z) <2>{{card}}</2> kártyát ehhez a listához: {{list}}',
|
||||||
@@ -446,6 +455,7 @@ export default {
|
|||||||
restoreToList: 'Visszaállítás ide: {{list}}',
|
restoreToList: 'Visszaállítás ide: {{list}}',
|
||||||
returnToBoard: 'Vissza a táblához',
|
returnToBoard: 'Vissza a táblához',
|
||||||
save: 'Mentés',
|
save: 'Mentés',
|
||||||
|
sendTestEmail: null,
|
||||||
showActive: 'Aktívak megjelenítése',
|
showActive: 'Aktívak megjelenítése',
|
||||||
showAllAttachments: 'Összes melléklet megjelenítése ({{hidden}} rejtve)',
|
showAllAttachments: 'Összes melléklet megjelenítése ({{hidden}} rejtve)',
|
||||||
showCardsWithThisUser: 'Kártyák megjelenítése ezzel a felhasználóval',
|
showCardsWithThisUser: 'Kártyák megjelenítése ezzel a felhasználóval',
|
||||||
|
|||||||
@@ -101,6 +101,7 @@ export default {
|
|||||||
cardsOnThisListAreCompleteAndReadyToBeArchived: null,
|
cardsOnThisListAreCompleteAndReadyToBeArchived: null,
|
||||||
cardsOnThisListAreReadyToBeWorkedOn: null,
|
cardsOnThisListAreReadyToBeWorkedOn: null,
|
||||||
clickHereOrRefreshPageToUpdate: null,
|
clickHereOrRefreshPageToUpdate: null,
|
||||||
|
clientHostnameInEhlo: null,
|
||||||
closed: null,
|
closed: null,
|
||||||
color: 'Warna',
|
color: 'Warna',
|
||||||
comments: null,
|
comments: null,
|
||||||
@@ -123,6 +124,7 @@ export default {
|
|||||||
date: 'Tanggal',
|
date: 'Tanggal',
|
||||||
deactivateUser_title: null,
|
deactivateUser_title: null,
|
||||||
defaultCardType_title: null,
|
defaultCardType_title: null,
|
||||||
|
defaultFrom: null,
|
||||||
defaultView_title: null,
|
defaultView_title: null,
|
||||||
deleteAllBoardsToBeAbleToDeleteThisProject: null,
|
deleteAllBoardsToBeAbleToDeleteThisProject: null,
|
||||||
deleteAttachment_title: 'Hapus Lampiran',
|
deleteAttachment_title: 'Hapus Lampiran',
|
||||||
@@ -186,6 +188,7 @@ export default {
|
|||||||
grid: null,
|
grid: null,
|
||||||
hideCompletedTasks: null,
|
hideCompletedTasks: null,
|
||||||
hideFromProjectListAndFavorites: null,
|
hideFromProjectListAndFavorites: null,
|
||||||
|
host: null,
|
||||||
hours: 'Jam',
|
hours: 'Jam',
|
||||||
importBoard_title: 'Impor Papan',
|
importBoard_title: 'Impor Papan',
|
||||||
invalidCurrentPassword: 'Kata sandi saat ini tidak valid',
|
invalidCurrentPassword: 'Kata sandi saat ini tidak valid',
|
||||||
@@ -229,8 +232,10 @@ export default {
|
|||||||
optional_inline: 'opsional',
|
optional_inline: 'opsional',
|
||||||
organization: 'Organisasi',
|
organization: 'Organisasi',
|
||||||
others: null,
|
others: null,
|
||||||
|
passwordIsSet: null,
|
||||||
phone: 'Ponsel',
|
phone: 'Ponsel',
|
||||||
plankaUsesAppriseToSendNotificationsToOver100PopularServices: null,
|
plankaUsesAppriseToSendNotificationsToOver100PopularServices: null,
|
||||||
|
port: null,
|
||||||
preferences: 'Preferensi',
|
preferences: 'Preferensi',
|
||||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||||
'Tip: tekan Ctrl-V (Cmd-V di Mac) untuk menambahkan lampiran dari papan klip.',
|
'Tip: tekan Ctrl-V (Cmd-V di Mac) untuk menambahkan lampiran dari papan klip.',
|
||||||
@@ -239,6 +244,7 @@ export default {
|
|||||||
projectNotFound_title: 'Proyek Tidak Ditemukan',
|
projectNotFound_title: 'Proyek Tidak Ditemukan',
|
||||||
projectOwner: null,
|
projectOwner: null,
|
||||||
referenceDataAndKnowledgeStorage: null,
|
referenceDataAndKnowledgeStorage: null,
|
||||||
|
rejectUnauthorizedTlsCertificates: null,
|
||||||
removeManager_title: 'Hapus Manager',
|
removeManager_title: 'Hapus Manager',
|
||||||
removeMember_title: 'Hapus Anggota',
|
removeMember_title: 'Hapus Anggota',
|
||||||
role: null,
|
role: null,
|
||||||
@@ -265,6 +271,7 @@ export default {
|
|||||||
shared: null,
|
shared: null,
|
||||||
sharedWithMe_title: null,
|
sharedWithMe_title: null,
|
||||||
showOnFrontOfCard: null,
|
showOnFrontOfCard: null,
|
||||||
|
smtp: null,
|
||||||
sortList_title: null,
|
sortList_title: null,
|
||||||
stopwatch: 'Stopwatch',
|
stopwatch: 'Stopwatch',
|
||||||
story: null,
|
story: null,
|
||||||
@@ -276,6 +283,7 @@ export default {
|
|||||||
taskList_title: null,
|
taskList_title: null,
|
||||||
team: null,
|
team: null,
|
||||||
terms: null,
|
terms: null,
|
||||||
|
testLog_title: null,
|
||||||
thereIsNoPreviewAvailableForThisAttachment:
|
thereIsNoPreviewAvailableForThisAttachment:
|
||||||
'Tidak ada pratinjau yang tersedia untuk lampiran ini.',
|
'Tidak ada pratinjau yang tersedia untuk lampiran ini.',
|
||||||
time: 'Waktu',
|
time: 'Waktu',
|
||||||
@@ -290,6 +298,7 @@ export default {
|
|||||||
uploadFailedNotEnoughStorageSpace: null,
|
uploadFailedNotEnoughStorageSpace: null,
|
||||||
uploadedImages: null,
|
uploadedImages: null,
|
||||||
url: null,
|
url: null,
|
||||||
|
useSecureConnection: null,
|
||||||
userActions_title: 'Aksi Pengguna',
|
userActions_title: 'Aksi Pengguna',
|
||||||
userAddedCardToList: null,
|
userAddedCardToList: null,
|
||||||
userAddedThisCardToList: '<0>{{user}}</0> menambahkan kartu ini ke {{list}}',
|
userAddedThisCardToList: '<0>{{user}}</0> menambahkan kartu ini ke {{list}}',
|
||||||
@@ -426,6 +435,7 @@ export default {
|
|||||||
restoreToList: null,
|
restoreToList: null,
|
||||||
returnToBoard: null,
|
returnToBoard: null,
|
||||||
save: 'Simpan',
|
save: 'Simpan',
|
||||||
|
sendTestEmail: null,
|
||||||
showActive: null,
|
showActive: null,
|
||||||
showAllAttachments: 'Tampilkan semua lampiran ({{hidden}} tersembunyi)',
|
showAllAttachments: 'Tampilkan semua lampiran ({{hidden}} tersembunyi)',
|
||||||
showCardsWithThisUser: null,
|
showCardsWithThisUser: null,
|
||||||
|
|||||||
@@ -116,6 +116,7 @@ export default {
|
|||||||
cardsOnThisListAreReadyToBeWorkedOn:
|
cardsOnThisListAreReadyToBeWorkedOn:
|
||||||
'Le schede in questa lista sono pronte per essere lavorate.',
|
'Le schede in questa lista sono pronte per essere lavorate.',
|
||||||
clickHereOrRefreshPageToUpdate: '<0>Clicca qui</0> o ricarica la pagina per aggiornare.',
|
clickHereOrRefreshPageToUpdate: '<0>Clicca qui</0> o ricarica la pagina per aggiornare.',
|
||||||
|
clientHostnameInEhlo: null,
|
||||||
closed: 'Chiuso',
|
closed: 'Chiuso',
|
||||||
color: 'Colore',
|
color: 'Colore',
|
||||||
comments: 'Commenti',
|
comments: 'Commenti',
|
||||||
@@ -139,6 +140,7 @@ export default {
|
|||||||
date: 'Data',
|
date: 'Data',
|
||||||
deactivateUser_title: 'Disattiva utente',
|
deactivateUser_title: 'Disattiva utente',
|
||||||
defaultCardType_title: 'Tipo di scheda predefinito',
|
defaultCardType_title: 'Tipo di scheda predefinito',
|
||||||
|
defaultFrom: null,
|
||||||
defaultView_title: 'Vista predefinita',
|
defaultView_title: 'Vista predefinita',
|
||||||
deleteAllBoardsToBeAbleToDeleteThisProject:
|
deleteAllBoardsToBeAbleToDeleteThisProject:
|
||||||
'Elimina tutte le bacheche per poter eliminare questo progetto.',
|
'Elimina tutte le bacheche per poter eliminare questo progetto.',
|
||||||
@@ -203,6 +205,7 @@ export default {
|
|||||||
grid: 'Griglia',
|
grid: 'Griglia',
|
||||||
hideCompletedTasks: 'Nascondi task completate',
|
hideCompletedTasks: 'Nascondi task completate',
|
||||||
hideFromProjectListAndFavorites: 'Nascondi dalla lista dei progetti e dai preferiti',
|
hideFromProjectListAndFavorites: 'Nascondi dalla lista dei progetti e dai preferiti',
|
||||||
|
host: null,
|
||||||
hours: 'Ore',
|
hours: 'Ore',
|
||||||
importBoard_title: 'Importa board',
|
importBoard_title: 'Importa board',
|
||||||
invalidCurrentPassword: 'Password corrente non valida',
|
invalidCurrentPassword: 'Password corrente non valida',
|
||||||
@@ -247,9 +250,11 @@ export default {
|
|||||||
optional_inline: 'opzionale',
|
optional_inline: 'opzionale',
|
||||||
organization: 'Organizazzione',
|
organization: 'Organizazzione',
|
||||||
others: 'Altri',
|
others: 'Altri',
|
||||||
|
passwordIsSet: null,
|
||||||
phone: 'Telefono',
|
phone: 'Telefono',
|
||||||
plankaUsesAppriseToSendNotificationsToOver100PopularServices:
|
plankaUsesAppriseToSendNotificationsToOver100PopularServices:
|
||||||
'PLANKA utilizza <1><0>Apprise</0></1> per inviare notifiche a oltre 100 servizi popolari.',
|
'PLANKA utilizza <1><0>Apprise</0></1> per inviare notifiche a oltre 100 servizi popolari.',
|
||||||
|
port: null,
|
||||||
preferences: 'Preferenze',
|
preferences: 'Preferenze',
|
||||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||||
'Consiglio: premi Ctrl-V (Cmd-V on Mac) per aggiungere un allegato dalla clipboard.',
|
'Consiglio: premi Ctrl-V (Cmd-V on Mac) per aggiungere un allegato dalla clipboard.',
|
||||||
@@ -258,6 +263,7 @@ export default {
|
|||||||
projectNotFound_title: 'Progetto non trovato',
|
projectNotFound_title: 'Progetto non trovato',
|
||||||
projectOwner: 'Proprietario del progetto',
|
projectOwner: 'Proprietario del progetto',
|
||||||
referenceDataAndKnowledgeStorage: 'Dati di riferimento e di archiviazione',
|
referenceDataAndKnowledgeStorage: 'Dati di riferimento e di archiviazione',
|
||||||
|
rejectUnauthorizedTlsCertificates: null,
|
||||||
removeManager_title: 'Rimuovi manager',
|
removeManager_title: 'Rimuovi manager',
|
||||||
removeMember_title: 'Rimuovi membro',
|
removeMember_title: 'Rimuovi membro',
|
||||||
role: 'Ruolo',
|
role: 'Ruolo',
|
||||||
@@ -284,6 +290,7 @@ export default {
|
|||||||
shared: 'Condiviso',
|
shared: 'Condiviso',
|
||||||
sharedWithMe_title: 'Condiviso con me',
|
sharedWithMe_title: 'Condiviso con me',
|
||||||
showOnFrontOfCard: 'Mostra davanti alla scheda',
|
showOnFrontOfCard: 'Mostra davanti alla scheda',
|
||||||
|
smtp: null,
|
||||||
sortList_title: 'Ordina',
|
sortList_title: 'Ordina',
|
||||||
stopwatch: 'Timer',
|
stopwatch: 'Timer',
|
||||||
story: 'Storia',
|
story: 'Storia',
|
||||||
@@ -295,6 +302,7 @@ export default {
|
|||||||
taskList_title: 'Lista di task',
|
taskList_title: 'Lista di task',
|
||||||
team: 'Team',
|
team: 'Team',
|
||||||
terms: 'Ho letto e accetto i termini e condizioni.',
|
terms: 'Ho letto e accetto i termini e condizioni.',
|
||||||
|
testLog_title: null,
|
||||||
thereIsNoPreviewAvailableForThisAttachment:
|
thereIsNoPreviewAvailableForThisAttachment:
|
||||||
'Non è disponibile alcuna anteprima per questo allegato.',
|
'Non è disponibile alcuna anteprima per questo allegato.',
|
||||||
time: 'Tempo',
|
time: 'Tempo',
|
||||||
@@ -310,6 +318,7 @@ export default {
|
|||||||
'Caricamento fallito: spazio di archiviazione insufficiente.',
|
'Caricamento fallito: spazio di archiviazione insufficiente.',
|
||||||
uploadedImages: 'Immagini caricate',
|
uploadedImages: 'Immagini caricate',
|
||||||
url: 'URL',
|
url: 'URL',
|
||||||
|
useSecureConnection: null,
|
||||||
userActions_title: 'Azioni utente',
|
userActions_title: 'Azioni utente',
|
||||||
userAddedCardToList: '<0>{{user}}</0> ha aggiunto <2>{{card}}</2> a {{list}}',
|
userAddedCardToList: '<0>{{user}}</0> ha aggiunto <2>{{card}}</2> a {{list}}',
|
||||||
userAddedThisCardToList: '<0>{{user}}</0> ha aggiunto questa task a {{list}}',
|
userAddedThisCardToList: '<0>{{user}}</0> ha aggiunto questa task a {{list}}',
|
||||||
@@ -450,6 +459,7 @@ export default {
|
|||||||
restoreToList: 'Ripristina a {{list}}',
|
restoreToList: 'Ripristina a {{list}}',
|
||||||
returnToBoard: 'Torna alla bacheca',
|
returnToBoard: 'Torna alla bacheca',
|
||||||
save: 'Salva',
|
save: 'Salva',
|
||||||
|
sendTestEmail: null,
|
||||||
showActive: 'Mostra attivi',
|
showActive: 'Mostra attivi',
|
||||||
showAllAttachments: 'Mostra tutti gli allegati ({{hidden}} nascosti)',
|
showAllAttachments: 'Mostra tutti gli allegati ({{hidden}} nascosti)',
|
||||||
showCardsWithThisUser: 'Mostra schede con questo utente',
|
showCardsWithThisUser: 'Mostra schede con questo utente',
|
||||||
|
|||||||
@@ -101,6 +101,7 @@ export default {
|
|||||||
cardsOnThisListAreCompleteAndReadyToBeArchived: null,
|
cardsOnThisListAreCompleteAndReadyToBeArchived: null,
|
||||||
cardsOnThisListAreReadyToBeWorkedOn: null,
|
cardsOnThisListAreReadyToBeWorkedOn: null,
|
||||||
clickHereOrRefreshPageToUpdate: null,
|
clickHereOrRefreshPageToUpdate: null,
|
||||||
|
clientHostnameInEhlo: null,
|
||||||
closed: null,
|
closed: null,
|
||||||
color: '色',
|
color: '色',
|
||||||
comments: null,
|
comments: null,
|
||||||
@@ -123,6 +124,7 @@ export default {
|
|||||||
date: '日付',
|
date: '日付',
|
||||||
deactivateUser_title: null,
|
deactivateUser_title: null,
|
||||||
defaultCardType_title: null,
|
defaultCardType_title: null,
|
||||||
|
defaultFrom: null,
|
||||||
defaultView_title: null,
|
defaultView_title: null,
|
||||||
deleteAllBoardsToBeAbleToDeleteThisProject: null,
|
deleteAllBoardsToBeAbleToDeleteThisProject: null,
|
||||||
deleteAttachment_title: '添付ファイルを削除',
|
deleteAttachment_title: '添付ファイルを削除',
|
||||||
@@ -186,6 +188,7 @@ export default {
|
|||||||
grid: null,
|
grid: null,
|
||||||
hideCompletedTasks: null,
|
hideCompletedTasks: null,
|
||||||
hideFromProjectListAndFavorites: null,
|
hideFromProjectListAndFavorites: null,
|
||||||
|
host: null,
|
||||||
hours: '時間',
|
hours: '時間',
|
||||||
importBoard_title: 'インポートボード',
|
importBoard_title: 'インポートボード',
|
||||||
invalidCurrentPassword: '現在のパスワードが無効',
|
invalidCurrentPassword: '現在のパスワードが無効',
|
||||||
@@ -229,8 +232,10 @@ export default {
|
|||||||
optional_inline: '任意',
|
optional_inline: '任意',
|
||||||
organization: '組織',
|
organization: '組織',
|
||||||
others: null,
|
others: null,
|
||||||
|
passwordIsSet: null,
|
||||||
phone: '電話番号',
|
phone: '電話番号',
|
||||||
plankaUsesAppriseToSendNotificationsToOver100PopularServices: null,
|
plankaUsesAppriseToSendNotificationsToOver100PopularServices: null,
|
||||||
|
port: null,
|
||||||
preferences: '環境設定',
|
preferences: '環境設定',
|
||||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||||
'ヒント: Ctrl-V(MacではCmd-V)を押して、クリップボードから添付ファイルを追加します。',
|
'ヒント: Ctrl-V(MacではCmd-V)を押して、クリップボードから添付ファイルを追加します。',
|
||||||
@@ -239,6 +244,7 @@ export default {
|
|||||||
projectNotFound_title: 'プロジェクトがありません',
|
projectNotFound_title: 'プロジェクトがありません',
|
||||||
projectOwner: null,
|
projectOwner: null,
|
||||||
referenceDataAndKnowledgeStorage: null,
|
referenceDataAndKnowledgeStorage: null,
|
||||||
|
rejectUnauthorizedTlsCertificates: null,
|
||||||
removeManager_title: 'マネージャーを削除',
|
removeManager_title: 'マネージャーを削除',
|
||||||
removeMember_title: 'メンバーを削除',
|
removeMember_title: 'メンバーを削除',
|
||||||
role: null,
|
role: null,
|
||||||
@@ -265,6 +271,7 @@ export default {
|
|||||||
shared: null,
|
shared: null,
|
||||||
sharedWithMe_title: null,
|
sharedWithMe_title: null,
|
||||||
showOnFrontOfCard: null,
|
showOnFrontOfCard: null,
|
||||||
|
smtp: null,
|
||||||
sortList_title: null,
|
sortList_title: null,
|
||||||
stopwatch: 'タイマー',
|
stopwatch: 'タイマー',
|
||||||
story: null,
|
story: null,
|
||||||
@@ -276,6 +283,7 @@ export default {
|
|||||||
taskList_title: null,
|
taskList_title: null,
|
||||||
team: null,
|
team: null,
|
||||||
terms: null,
|
terms: null,
|
||||||
|
testLog_title: null,
|
||||||
thereIsNoPreviewAvailableForThisAttachment: 'この添付ファイルにはプレビューがありません。',
|
thereIsNoPreviewAvailableForThisAttachment: 'この添付ファイルにはプレビューがありません。',
|
||||||
time: '時間',
|
time: '時間',
|
||||||
title: 'タイトル',
|
title: 'タイトル',
|
||||||
@@ -289,6 +297,7 @@ export default {
|
|||||||
uploadFailedNotEnoughStorageSpace: null,
|
uploadFailedNotEnoughStorageSpace: null,
|
||||||
uploadedImages: null,
|
uploadedImages: null,
|
||||||
url: null,
|
url: null,
|
||||||
|
useSecureConnection: null,
|
||||||
userActions_title: 'ユーザーのアクション',
|
userActions_title: 'ユーザーのアクション',
|
||||||
userAddedCardToList: null,
|
userAddedCardToList: null,
|
||||||
userAddedThisCardToList: '<0>{{user}}</0> 様が {{list}} をこのカードに追加しました',
|
userAddedThisCardToList: '<0>{{user}}</0> 様が {{list}} をこのカードに追加しました',
|
||||||
@@ -426,6 +435,7 @@ export default {
|
|||||||
restoreToList: null,
|
restoreToList: null,
|
||||||
returnToBoard: null,
|
returnToBoard: null,
|
||||||
save: '保存',
|
save: '保存',
|
||||||
|
sendTestEmail: null,
|
||||||
showActive: null,
|
showActive: null,
|
||||||
showAllAttachments: '全ての添付ファイルを表示する({{hidden}} 非表示)',
|
showAllAttachments: '全ての添付ファイルを表示する({{hidden}} 非表示)',
|
||||||
showCardsWithThisUser: null,
|
showCardsWithThisUser: null,
|
||||||
|
|||||||
@@ -99,6 +99,7 @@ export default {
|
|||||||
cardsOnThisListAreCompleteAndReadyToBeArchived: null,
|
cardsOnThisListAreCompleteAndReadyToBeArchived: null,
|
||||||
cardsOnThisListAreReadyToBeWorkedOn: null,
|
cardsOnThisListAreReadyToBeWorkedOn: null,
|
||||||
clickHereOrRefreshPageToUpdate: null,
|
clickHereOrRefreshPageToUpdate: null,
|
||||||
|
clientHostnameInEhlo: null,
|
||||||
closed: null,
|
closed: null,
|
||||||
color: '색상',
|
color: '색상',
|
||||||
comments: null,
|
comments: null,
|
||||||
@@ -121,6 +122,7 @@ export default {
|
|||||||
date: '날짜',
|
date: '날짜',
|
||||||
deactivateUser_title: null,
|
deactivateUser_title: null,
|
||||||
defaultCardType_title: null,
|
defaultCardType_title: null,
|
||||||
|
defaultFrom: null,
|
||||||
defaultView_title: null,
|
defaultView_title: null,
|
||||||
deleteAllBoardsToBeAbleToDeleteThisProject: null,
|
deleteAllBoardsToBeAbleToDeleteThisProject: null,
|
||||||
deleteAttachment_title: '첨부 파일 삭제',
|
deleteAttachment_title: '첨부 파일 삭제',
|
||||||
@@ -184,6 +186,7 @@ export default {
|
|||||||
grid: null,
|
grid: null,
|
||||||
hideCompletedTasks: null,
|
hideCompletedTasks: null,
|
||||||
hideFromProjectListAndFavorites: null,
|
hideFromProjectListAndFavorites: null,
|
||||||
|
host: null,
|
||||||
hours: '시간',
|
hours: '시간',
|
||||||
importBoard_title: '보드 가져오기',
|
importBoard_title: '보드 가져오기',
|
||||||
invalidCurrentPassword: '잘못된 현재 비밀번호',
|
invalidCurrentPassword: '잘못된 현재 비밀번호',
|
||||||
@@ -227,8 +230,10 @@ export default {
|
|||||||
optional_inline: '선택 사항',
|
optional_inline: '선택 사항',
|
||||||
organization: '조직',
|
organization: '조직',
|
||||||
others: null,
|
others: null,
|
||||||
|
passwordIsSet: null,
|
||||||
phone: '전화',
|
phone: '전화',
|
||||||
plankaUsesAppriseToSendNotificationsToOver100PopularServices: null,
|
plankaUsesAppriseToSendNotificationsToOver100PopularServices: null,
|
||||||
|
port: null,
|
||||||
preferences: '환경 설정',
|
preferences: '환경 설정',
|
||||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||||
'팁: Ctrl-V (Mac에서는 Cmd-V)를 눌러 클립보드에서 첨부 파일을 추가하세요.',
|
'팁: Ctrl-V (Mac에서는 Cmd-V)를 눌러 클립보드에서 첨부 파일을 추가하세요.',
|
||||||
@@ -237,6 +242,7 @@ export default {
|
|||||||
projectNotFound_title: '프로젝트를 찾을 수 없음',
|
projectNotFound_title: '프로젝트를 찾을 수 없음',
|
||||||
projectOwner: null,
|
projectOwner: null,
|
||||||
referenceDataAndKnowledgeStorage: null,
|
referenceDataAndKnowledgeStorage: null,
|
||||||
|
rejectUnauthorizedTlsCertificates: null,
|
||||||
removeManager_title: '관리자 제거',
|
removeManager_title: '관리자 제거',
|
||||||
removeMember_title: '멤버 제거',
|
removeMember_title: '멤버 제거',
|
||||||
role: null,
|
role: null,
|
||||||
@@ -263,6 +269,7 @@ export default {
|
|||||||
shared: null,
|
shared: null,
|
||||||
sharedWithMe_title: null,
|
sharedWithMe_title: null,
|
||||||
showOnFrontOfCard: null,
|
showOnFrontOfCard: null,
|
||||||
|
smtp: null,
|
||||||
sortList_title: '목록 정렬',
|
sortList_title: '목록 정렬',
|
||||||
stopwatch: '스톱워치',
|
stopwatch: '스톱워치',
|
||||||
story: null,
|
story: null,
|
||||||
@@ -274,6 +281,7 @@ export default {
|
|||||||
taskList_title: null,
|
taskList_title: null,
|
||||||
team: null,
|
team: null,
|
||||||
terms: null,
|
terms: null,
|
||||||
|
testLog_title: null,
|
||||||
thereIsNoPreviewAvailableForThisAttachment:
|
thereIsNoPreviewAvailableForThisAttachment:
|
||||||
'이 첨부 파일에 대한 미리보기를 사용할 수 없습니다.',
|
'이 첨부 파일에 대한 미리보기를 사용할 수 없습니다.',
|
||||||
time: '시간',
|
time: '시간',
|
||||||
@@ -288,6 +296,7 @@ export default {
|
|||||||
uploadFailedNotEnoughStorageSpace: null,
|
uploadFailedNotEnoughStorageSpace: null,
|
||||||
uploadedImages: null,
|
uploadedImages: null,
|
||||||
url: null,
|
url: null,
|
||||||
|
useSecureConnection: null,
|
||||||
userActions_title: '사용자 작업',
|
userActions_title: '사용자 작업',
|
||||||
userAddedCardToList: null,
|
userAddedCardToList: null,
|
||||||
userAddedThisCardToList: '<0>{{user}}</0>님이 이 카드를 {{list}}에 추가했습니다',
|
userAddedThisCardToList: '<0>{{user}}</0>님이 이 카드를 {{list}}에 추가했습니다',
|
||||||
@@ -425,6 +434,7 @@ export default {
|
|||||||
restoreToList: null,
|
restoreToList: null,
|
||||||
returnToBoard: null,
|
returnToBoard: null,
|
||||||
save: '저장',
|
save: '저장',
|
||||||
|
sendTestEmail: null,
|
||||||
showActive: null,
|
showActive: null,
|
||||||
showAllAttachments: '모든 첨부 파일 보기 ({{hidden}} 숨김)',
|
showAllAttachments: '모든 첨부 파일 보기 ({{hidden}} 숨김)',
|
||||||
showCardsWithThisUser: null,
|
showCardsWithThisUser: null,
|
||||||
|
|||||||
@@ -101,6 +101,7 @@ export default {
|
|||||||
cardsOnThisListAreCompleteAndReadyToBeArchived: null,
|
cardsOnThisListAreCompleteAndReadyToBeArchived: null,
|
||||||
cardsOnThisListAreReadyToBeWorkedOn: null,
|
cardsOnThisListAreReadyToBeWorkedOn: null,
|
||||||
clickHereOrRefreshPageToUpdate: null,
|
clickHereOrRefreshPageToUpdate: null,
|
||||||
|
clientHostnameInEhlo: null,
|
||||||
closed: null,
|
closed: null,
|
||||||
color: 'Kleur',
|
color: 'Kleur',
|
||||||
comments: null,
|
comments: null,
|
||||||
@@ -123,6 +124,7 @@ export default {
|
|||||||
date: 'Datum',
|
date: 'Datum',
|
||||||
deactivateUser_title: null,
|
deactivateUser_title: null,
|
||||||
defaultCardType_title: null,
|
defaultCardType_title: null,
|
||||||
|
defaultFrom: null,
|
||||||
defaultView_title: null,
|
defaultView_title: null,
|
||||||
deleteAllBoardsToBeAbleToDeleteThisProject: null,
|
deleteAllBoardsToBeAbleToDeleteThisProject: null,
|
||||||
deleteAttachment_title: 'Bijlage verwijderen',
|
deleteAttachment_title: 'Bijlage verwijderen',
|
||||||
@@ -186,6 +188,7 @@ export default {
|
|||||||
grid: null,
|
grid: null,
|
||||||
hideCompletedTasks: null,
|
hideCompletedTasks: null,
|
||||||
hideFromProjectListAndFavorites: null,
|
hideFromProjectListAndFavorites: null,
|
||||||
|
host: null,
|
||||||
hours: 'Uren',
|
hours: 'Uren',
|
||||||
importBoard_title: 'Bord importeren',
|
importBoard_title: 'Bord importeren',
|
||||||
invalidCurrentPassword: 'Ongeldig huidig wachtwoord',
|
invalidCurrentPassword: 'Ongeldig huidig wachtwoord',
|
||||||
@@ -229,8 +232,10 @@ export default {
|
|||||||
optional_inline: 'optioneel',
|
optional_inline: 'optioneel',
|
||||||
organization: 'Organisatie',
|
organization: 'Organisatie',
|
||||||
others: null,
|
others: null,
|
||||||
|
passwordIsSet: null,
|
||||||
phone: 'Telefoon',
|
phone: 'Telefoon',
|
||||||
plankaUsesAppriseToSendNotificationsToOver100PopularServices: null,
|
plankaUsesAppriseToSendNotificationsToOver100PopularServices: null,
|
||||||
|
port: null,
|
||||||
preferences: 'Voorkeuren',
|
preferences: 'Voorkeuren',
|
||||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||||
'Tip: druk op Ctrl-V (Cmd-V op Mac) om een bijlage van het klembord toe te voegen.',
|
'Tip: druk op Ctrl-V (Cmd-V op Mac) om een bijlage van het klembord toe te voegen.',
|
||||||
@@ -239,6 +244,7 @@ export default {
|
|||||||
projectNotFound_title: 'Project niet gevonden',
|
projectNotFound_title: 'Project niet gevonden',
|
||||||
projectOwner: null,
|
projectOwner: null,
|
||||||
referenceDataAndKnowledgeStorage: null,
|
referenceDataAndKnowledgeStorage: null,
|
||||||
|
rejectUnauthorizedTlsCertificates: null,
|
||||||
removeManager_title: 'Manager verwijderen',
|
removeManager_title: 'Manager verwijderen',
|
||||||
removeMember_title: 'Lid verwijderen',
|
removeMember_title: 'Lid verwijderen',
|
||||||
role: null,
|
role: null,
|
||||||
@@ -265,6 +271,7 @@ export default {
|
|||||||
shared: null,
|
shared: null,
|
||||||
sharedWithMe_title: null,
|
sharedWithMe_title: null,
|
||||||
showOnFrontOfCard: null,
|
showOnFrontOfCard: null,
|
||||||
|
smtp: null,
|
||||||
sortList_title: null,
|
sortList_title: null,
|
||||||
stopwatch: 'Stopwatch',
|
stopwatch: 'Stopwatch',
|
||||||
story: null,
|
story: null,
|
||||||
@@ -276,6 +283,7 @@ export default {
|
|||||||
taskList_title: null,
|
taskList_title: null,
|
||||||
team: null,
|
team: null,
|
||||||
terms: null,
|
terms: null,
|
||||||
|
testLog_title: null,
|
||||||
thereIsNoPreviewAvailableForThisAttachment:
|
thereIsNoPreviewAvailableForThisAttachment:
|
||||||
'Er is geen voorbeeld beschikbaar voor deze bijlage.',
|
'Er is geen voorbeeld beschikbaar voor deze bijlage.',
|
||||||
time: 'Tijd',
|
time: 'Tijd',
|
||||||
@@ -290,6 +298,7 @@ export default {
|
|||||||
uploadFailedNotEnoughStorageSpace: null,
|
uploadFailedNotEnoughStorageSpace: null,
|
||||||
uploadedImages: null,
|
uploadedImages: null,
|
||||||
url: null,
|
url: null,
|
||||||
|
useSecureConnection: null,
|
||||||
userActions_title: 'Gebruikersacties',
|
userActions_title: 'Gebruikersacties',
|
||||||
userAddedCardToList: null,
|
userAddedCardToList: null,
|
||||||
userAddedThisCardToList: '<0>{{user}}</0> heeft deze kaart toegevoegd aan {{list}}',
|
userAddedThisCardToList: '<0>{{user}}</0> heeft deze kaart toegevoegd aan {{list}}',
|
||||||
@@ -427,6 +436,7 @@ export default {
|
|||||||
restoreToList: null,
|
restoreToList: null,
|
||||||
returnToBoard: null,
|
returnToBoard: null,
|
||||||
save: 'Opslaan',
|
save: 'Opslaan',
|
||||||
|
sendTestEmail: null,
|
||||||
showActive: null,
|
showActive: null,
|
||||||
showAllAttachments: 'Alle bijlagen weergeven ({{hidden}} verbergen)',
|
showAllAttachments: 'Alle bijlagen weergeven ({{hidden}} verbergen)',
|
||||||
showCardsWithThisUser: null,
|
showCardsWithThisUser: null,
|
||||||
|
|||||||
@@ -108,6 +108,7 @@ export default {
|
|||||||
'Karty na tej liście są ukończone i gotowe do zarchiwizowania.',
|
'Karty na tej liście są ukończone i gotowe do zarchiwizowania.',
|
||||||
cardsOnThisListAreReadyToBeWorkedOn: 'Karty na tej liście są gotowe do pracy nad nimi.',
|
cardsOnThisListAreReadyToBeWorkedOn: 'Karty na tej liście są gotowe do pracy nad nimi.',
|
||||||
clickHereOrRefreshPageToUpdate: '<0>Naciśnij tutaj</0> lub odśwież stronę, by zaktualizować.',
|
clickHereOrRefreshPageToUpdate: '<0>Naciśnij tutaj</0> lub odśwież stronę, by zaktualizować.',
|
||||||
|
clientHostnameInEhlo: null,
|
||||||
closed: 'Zamknięte',
|
closed: 'Zamknięte',
|
||||||
color: 'Kolor',
|
color: 'Kolor',
|
||||||
comments: 'Komentarze',
|
comments: 'Komentarze',
|
||||||
@@ -130,6 +131,7 @@ export default {
|
|||||||
date: 'Data',
|
date: 'Data',
|
||||||
deactivateUser_title: 'Dezaktywuj Użytkownika',
|
deactivateUser_title: 'Dezaktywuj Użytkownika',
|
||||||
defaultCardType_title: 'Domyślny Typ Karty',
|
defaultCardType_title: 'Domyślny Typ Karty',
|
||||||
|
defaultFrom: null,
|
||||||
defaultView_title: 'Domyślny Widok',
|
defaultView_title: 'Domyślny Widok',
|
||||||
deleteAllBoardsToBeAbleToDeleteThisProject: null,
|
deleteAllBoardsToBeAbleToDeleteThisProject: null,
|
||||||
deleteAttachment_title: 'Usuń Załącznik',
|
deleteAttachment_title: 'Usuń Załącznik',
|
||||||
@@ -193,6 +195,7 @@ export default {
|
|||||||
grid: 'Siatka',
|
grid: 'Siatka',
|
||||||
hideCompletedTasks: null,
|
hideCompletedTasks: null,
|
||||||
hideFromProjectListAndFavorites: 'Ukryj z listy projektów i ulubionych',
|
hideFromProjectListAndFavorites: 'Ukryj z listy projektów i ulubionych',
|
||||||
|
host: null,
|
||||||
hours: 'Godzin',
|
hours: 'Godzin',
|
||||||
importBoard_title: 'Importuj Tablicę',
|
importBoard_title: 'Importuj Tablicę',
|
||||||
invalidCurrentPassword: 'Błędne obecne hasło',
|
invalidCurrentPassword: 'Błędne obecne hasło',
|
||||||
@@ -236,9 +239,11 @@ export default {
|
|||||||
optional_inline: 'opcjonalny',
|
optional_inline: 'opcjonalny',
|
||||||
organization: 'Organizacja',
|
organization: 'Organizacja',
|
||||||
others: 'Inne',
|
others: 'Inne',
|
||||||
|
passwordIsSet: null,
|
||||||
phone: 'Telefon',
|
phone: 'Telefon',
|
||||||
plankaUsesAppriseToSendNotificationsToOver100PopularServices:
|
plankaUsesAppriseToSendNotificationsToOver100PopularServices:
|
||||||
'PLANKA używa <1><0>Apprise</0></1> do wysyłania powiadomień do ponad 100 popularnych serwisów.',
|
'PLANKA używa <1><0>Apprise</0></1> do wysyłania powiadomień do ponad 100 popularnych serwisów.',
|
||||||
|
port: null,
|
||||||
preferences: 'Preferencje',
|
preferences: 'Preferencje',
|
||||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
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.',
|
||||||
@@ -247,6 +252,7 @@ export default {
|
|||||||
projectNotFound_title: 'Projektu Nie Znaleziono',
|
projectNotFound_title: 'Projektu Nie Znaleziono',
|
||||||
projectOwner: 'Właściciel projektu',
|
projectOwner: 'Właściciel projektu',
|
||||||
referenceDataAndKnowledgeStorage: 'Odnoś się do danych i przechowuj wiedzę',
|
referenceDataAndKnowledgeStorage: 'Odnoś się do danych i przechowuj wiedzę',
|
||||||
|
rejectUnauthorizedTlsCertificates: null,
|
||||||
removeManager_title: 'Usuń Zarządcę',
|
removeManager_title: 'Usuń Zarządcę',
|
||||||
removeMember_title: 'Usuń Członka',
|
removeMember_title: 'Usuń Członka',
|
||||||
role: 'Rola',
|
role: 'Rola',
|
||||||
@@ -273,6 +279,7 @@ export default {
|
|||||||
shared: 'Udostępniane',
|
shared: 'Udostępniane',
|
||||||
sharedWithMe_title: 'Udostępniane Dla Mnie',
|
sharedWithMe_title: 'Udostępniane Dla Mnie',
|
||||||
showOnFrontOfCard: 'Pokazuj na przodzie karty',
|
showOnFrontOfCard: 'Pokazuj na przodzie karty',
|
||||||
|
smtp: null,
|
||||||
sortList_title: 'Sortowanie Listy',
|
sortList_title: 'Sortowanie Listy',
|
||||||
stopwatch: 'Stoper',
|
stopwatch: 'Stoper',
|
||||||
story: 'Scenorys',
|
story: 'Scenorys',
|
||||||
@@ -284,6 +291,7 @@ export default {
|
|||||||
taskList_title: 'Lista Zadań',
|
taskList_title: 'Lista Zadań',
|
||||||
team: 'Zespół',
|
team: 'Zespół',
|
||||||
terms: null,
|
terms: null,
|
||||||
|
testLog_title: null,
|
||||||
thereIsNoPreviewAvailableForThisAttachment: 'Brak podglądu dostępnego dla tego załącznika.',
|
thereIsNoPreviewAvailableForThisAttachment: 'Brak podglądu dostępnego dla tego załącznika.',
|
||||||
time: 'Czas',
|
time: 'Czas',
|
||||||
title: 'Tytuł',
|
title: 'Tytuł',
|
||||||
@@ -297,6 +305,7 @@ export default {
|
|||||||
uploadFailedNotEnoughStorageSpace: null,
|
uploadFailedNotEnoughStorageSpace: null,
|
||||||
uploadedImages: 'Wgrane obrazy',
|
uploadedImages: 'Wgrane obrazy',
|
||||||
url: null,
|
url: null,
|
||||||
|
useSecureConnection: null,
|
||||||
userActions_title: 'Akcje Użytkownika',
|
userActions_title: 'Akcje Użytkownika',
|
||||||
userAddedCardToList: '<0>{{user}}</0> dodał <2>{{card}}</2> do {{list}}',
|
userAddedCardToList: '<0>{{user}}</0> dodał <2>{{card}}</2> do {{list}}',
|
||||||
userAddedThisCardToList: '<0>{{user}}</0> dodał tę kartę do {{list}}',
|
userAddedThisCardToList: '<0>{{user}}</0> dodał tę kartę do {{list}}',
|
||||||
@@ -437,6 +446,7 @@ export default {
|
|||||||
restoreToList: 'Przywróć na {{list}}',
|
restoreToList: 'Przywróć na {{list}}',
|
||||||
returnToBoard: 'Przywróć do tablicy',
|
returnToBoard: 'Przywróć do tablicy',
|
||||||
save: 'Zapisz',
|
save: 'Zapisz',
|
||||||
|
sendTestEmail: null,
|
||||||
showActive: 'Pokaż aktywne',
|
showActive: 'Pokaż aktywne',
|
||||||
showAllAttachments: 'Pokaż wszystkie załączniki ({{hidden}} są ukryte)',
|
showAllAttachments: 'Pokaż wszystkie załączniki ({{hidden}} są ukryte)',
|
||||||
showCardsWithThisUser: 'Pokaż karty z tym użytkownikiem',
|
showCardsWithThisUser: 'Pokaż karty z tym użytkownikiem',
|
||||||
|
|||||||
@@ -116,6 +116,7 @@ export default {
|
|||||||
cardsOnThisListAreReadyToBeWorkedOn:
|
cardsOnThisListAreReadyToBeWorkedOn:
|
||||||
'Os cartões nesta lista estão prontos para serem trabalhados.',
|
'Os cartões nesta lista estão prontos para serem trabalhados.',
|
||||||
clickHereOrRefreshPageToUpdate: '<0>Clique aqui</0> ou atualize a página para atualizar.',
|
clickHereOrRefreshPageToUpdate: '<0>Clique aqui</0> ou atualize a página para atualizar.',
|
||||||
|
clientHostnameInEhlo: null,
|
||||||
closed: 'Fechado',
|
closed: 'Fechado',
|
||||||
color: 'Cor',
|
color: 'Cor',
|
||||||
comments: 'Comentários',
|
comments: 'Comentários',
|
||||||
@@ -139,6 +140,7 @@ export default {
|
|||||||
date: 'Data',
|
date: 'Data',
|
||||||
deactivateUser_title: 'Desativar Usuário',
|
deactivateUser_title: 'Desativar Usuário',
|
||||||
defaultCardType_title: 'Tipo de Cartão Padrão',
|
defaultCardType_title: 'Tipo de Cartão Padrão',
|
||||||
|
defaultFrom: null,
|
||||||
defaultView_title: 'Visualização Padrão',
|
defaultView_title: 'Visualização Padrão',
|
||||||
deleteAllBoardsToBeAbleToDeleteThisProject:
|
deleteAllBoardsToBeAbleToDeleteThisProject:
|
||||||
'Excluir todos os quadros para poder excluir este projeto',
|
'Excluir todos os quadros para poder excluir este projeto',
|
||||||
@@ -203,6 +205,7 @@ export default {
|
|||||||
grid: 'Grade',
|
grid: 'Grade',
|
||||||
hideCompletedTasks: 'Ocultar tarefas concluídas',
|
hideCompletedTasks: 'Ocultar tarefas concluídas',
|
||||||
hideFromProjectListAndFavorites: 'Ocultar da lista de projetos e favoritos',
|
hideFromProjectListAndFavorites: 'Ocultar da lista de projetos e favoritos',
|
||||||
|
host: null,
|
||||||
hours: 'Horas',
|
hours: 'Horas',
|
||||||
importBoard_title: 'Importar Quadro',
|
importBoard_title: 'Importar Quadro',
|
||||||
invalidCurrentPassword: 'Senha atual inválida',
|
invalidCurrentPassword: 'Senha atual inválida',
|
||||||
@@ -247,9 +250,11 @@ export default {
|
|||||||
optional_inline: 'opcional',
|
optional_inline: 'opcional',
|
||||||
organization: 'Organização',
|
organization: 'Organização',
|
||||||
others: 'Outros',
|
others: 'Outros',
|
||||||
|
passwordIsSet: null,
|
||||||
phone: 'Telefone',
|
phone: 'Telefone',
|
||||||
plankaUsesAppriseToSendNotificationsToOver100PopularServices:
|
plankaUsesAppriseToSendNotificationsToOver100PopularServices:
|
||||||
'PLANKA usa <1><0>Apprise</0></1> para enviar notificações para mais de 100 serviços populares.',
|
'PLANKA usa <1><0>Apprise</0></1> para enviar notificações para mais de 100 serviços populares.',
|
||||||
|
port: null,
|
||||||
preferences: 'Preferências',
|
preferences: 'Preferências',
|
||||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||||
'Dica: pressione Ctrl-V (Cmd-V no Mac) para adicionar um anexo da área de transferência.',
|
'Dica: pressione Ctrl-V (Cmd-V no Mac) para adicionar um anexo da área de transferência.',
|
||||||
@@ -258,6 +263,7 @@ export default {
|
|||||||
projectNotFound_title: 'Projeto não encontrado',
|
projectNotFound_title: 'Projeto não encontrado',
|
||||||
projectOwner: 'Proprietário do projeto',
|
projectOwner: 'Proprietário do projeto',
|
||||||
referenceDataAndKnowledgeStorage: 'Armazenamento de dados de referência e conhecimento.',
|
referenceDataAndKnowledgeStorage: 'Armazenamento de dados de referência e conhecimento.',
|
||||||
|
rejectUnauthorizedTlsCertificates: null,
|
||||||
removeManager_title: 'Remover Gerente',
|
removeManager_title: 'Remover Gerente',
|
||||||
removeMember_title: 'Remover Membro',
|
removeMember_title: 'Remover Membro',
|
||||||
role: 'Função',
|
role: 'Função',
|
||||||
@@ -284,6 +290,7 @@ export default {
|
|||||||
shared: 'Compartilhado',
|
shared: 'Compartilhado',
|
||||||
sharedWithMe_title: 'Compartilhado Comigo',
|
sharedWithMe_title: 'Compartilhado Comigo',
|
||||||
showOnFrontOfCard: 'Mostrar na frente do cartão',
|
showOnFrontOfCard: 'Mostrar na frente do cartão',
|
||||||
|
smtp: null,
|
||||||
sortList_title: 'Ordenar Lista',
|
sortList_title: 'Ordenar Lista',
|
||||||
stopwatch: 'Cronômetro',
|
stopwatch: 'Cronômetro',
|
||||||
story: 'História',
|
story: 'História',
|
||||||
@@ -295,6 +302,7 @@ export default {
|
|||||||
taskList_title: 'Lista de Tarefas',
|
taskList_title: 'Lista de Tarefas',
|
||||||
team: 'Equipe',
|
team: 'Equipe',
|
||||||
terms: null,
|
terms: null,
|
||||||
|
testLog_title: null,
|
||||||
thereIsNoPreviewAvailableForThisAttachment:
|
thereIsNoPreviewAvailableForThisAttachment:
|
||||||
'Não há pré-visualização disponível para este anexo.',
|
'Não há pré-visualização disponível para este anexo.',
|
||||||
time: 'Tempo',
|
time: 'Tempo',
|
||||||
@@ -309,6 +317,7 @@ export default {
|
|||||||
uploadFailedNotEnoughStorageSpace: null,
|
uploadFailedNotEnoughStorageSpace: null,
|
||||||
uploadedImages: 'Imagens enviadas',
|
uploadedImages: 'Imagens enviadas',
|
||||||
url: 'URL',
|
url: 'URL',
|
||||||
|
useSecureConnection: null,
|
||||||
userActions_title: 'Ações do Usuário',
|
userActions_title: 'Ações do Usuário',
|
||||||
userAddedCardToList: '<0>{{user}}</0> adicionou <2>{{card}}</2> à {{list}}',
|
userAddedCardToList: '<0>{{user}}</0> adicionou <2>{{card}}</2> à {{list}}',
|
||||||
userAddedThisCardToList: '<0>{{user}}</0> adicionou este cartão a {{list}}',
|
userAddedThisCardToList: '<0>{{user}}</0> adicionou este cartão a {{list}}',
|
||||||
@@ -449,6 +458,7 @@ export default {
|
|||||||
restoreToList: 'Restaurar para {{list}}',
|
restoreToList: 'Restaurar para {{list}}',
|
||||||
returnToBoard: 'Voltar ao quadro',
|
returnToBoard: 'Voltar ao quadro',
|
||||||
save: 'Salvar',
|
save: 'Salvar',
|
||||||
|
sendTestEmail: null,
|
||||||
showActive: 'Mostrar ativos',
|
showActive: 'Mostrar ativos',
|
||||||
showAllAttachments: 'Mostrar todos os anexos ({{hidden}} ocultos)',
|
showAllAttachments: 'Mostrar todos os anexos ({{hidden}} ocultos)',
|
||||||
showCardsWithThisUser: 'Mostrar cartões com este usuário',
|
showCardsWithThisUser: 'Mostrar cartões com este usuário',
|
||||||
|
|||||||
@@ -102,6 +102,7 @@ export default {
|
|||||||
cardsOnThisListAreCompleteAndReadyToBeArchived: null,
|
cardsOnThisListAreCompleteAndReadyToBeArchived: null,
|
||||||
cardsOnThisListAreReadyToBeWorkedOn: null,
|
cardsOnThisListAreReadyToBeWorkedOn: null,
|
||||||
clickHereOrRefreshPageToUpdate: null,
|
clickHereOrRefreshPageToUpdate: null,
|
||||||
|
clientHostnameInEhlo: null,
|
||||||
closed: null,
|
closed: null,
|
||||||
color: 'Cor',
|
color: 'Cor',
|
||||||
comments: null,
|
comments: null,
|
||||||
@@ -124,6 +125,7 @@ export default {
|
|||||||
date: 'Data',
|
date: 'Data',
|
||||||
deactivateUser_title: null,
|
deactivateUser_title: null,
|
||||||
defaultCardType_title: null,
|
defaultCardType_title: null,
|
||||||
|
defaultFrom: null,
|
||||||
defaultView_title: null,
|
defaultView_title: null,
|
||||||
deleteAllBoardsToBeAbleToDeleteThisProject: null,
|
deleteAllBoardsToBeAbleToDeleteThisProject: null,
|
||||||
deleteAttachment_title: 'Eliminar Anexo',
|
deleteAttachment_title: 'Eliminar Anexo',
|
||||||
@@ -187,6 +189,7 @@ export default {
|
|||||||
grid: null,
|
grid: null,
|
||||||
hideCompletedTasks: null,
|
hideCompletedTasks: null,
|
||||||
hideFromProjectListAndFavorites: null,
|
hideFromProjectListAndFavorites: null,
|
||||||
|
host: null,
|
||||||
hours: 'Horas',
|
hours: 'Horas',
|
||||||
importBoard_title: 'Importar Quadro',
|
importBoard_title: 'Importar Quadro',
|
||||||
invalidCurrentPassword: 'Palavra-passe atual inválida',
|
invalidCurrentPassword: 'Palavra-passe atual inválida',
|
||||||
@@ -230,8 +233,10 @@ export default {
|
|||||||
optional_inline: 'opcional',
|
optional_inline: 'opcional',
|
||||||
organization: 'Organização',
|
organization: 'Organização',
|
||||||
others: null,
|
others: null,
|
||||||
|
passwordIsSet: null,
|
||||||
phone: 'Telefone',
|
phone: 'Telefone',
|
||||||
plankaUsesAppriseToSendNotificationsToOver100PopularServices: null,
|
plankaUsesAppriseToSendNotificationsToOver100PopularServices: null,
|
||||||
|
port: null,
|
||||||
preferences: 'Preferências',
|
preferences: 'Preferências',
|
||||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||||
'Dica: prima Ctrl-V (Cmd-V no Mac) para adicionar um anexo da área de transferência.',
|
'Dica: prima Ctrl-V (Cmd-V no Mac) para adicionar um anexo da área de transferência.',
|
||||||
@@ -240,6 +245,7 @@ export default {
|
|||||||
projectNotFound_title: 'Projeto não encontrado',
|
projectNotFound_title: 'Projeto não encontrado',
|
||||||
projectOwner: null,
|
projectOwner: null,
|
||||||
referenceDataAndKnowledgeStorage: null,
|
referenceDataAndKnowledgeStorage: null,
|
||||||
|
rejectUnauthorizedTlsCertificates: null,
|
||||||
removeManager_title: 'Remover Gestor',
|
removeManager_title: 'Remover Gestor',
|
||||||
removeMember_title: 'Remover Membro',
|
removeMember_title: 'Remover Membro',
|
||||||
role: null,
|
role: null,
|
||||||
@@ -266,6 +272,7 @@ export default {
|
|||||||
shared: null,
|
shared: null,
|
||||||
sharedWithMe_title: null,
|
sharedWithMe_title: null,
|
||||||
showOnFrontOfCard: null,
|
showOnFrontOfCard: null,
|
||||||
|
smtp: null,
|
||||||
sortList_title: null,
|
sortList_title: null,
|
||||||
stopwatch: 'Cronómetro',
|
stopwatch: 'Cronómetro',
|
||||||
story: null,
|
story: null,
|
||||||
@@ -277,6 +284,7 @@ export default {
|
|||||||
taskList_title: null,
|
taskList_title: null,
|
||||||
team: null,
|
team: null,
|
||||||
terms: null,
|
terms: null,
|
||||||
|
testLog_title: null,
|
||||||
thereIsNoPreviewAvailableForThisAttachment:
|
thereIsNoPreviewAvailableForThisAttachment:
|
||||||
'Não há pré-visualização disponível para este anexo.',
|
'Não há pré-visualização disponível para este anexo.',
|
||||||
time: 'Tempo',
|
time: 'Tempo',
|
||||||
@@ -291,6 +299,7 @@ export default {
|
|||||||
uploadFailedNotEnoughStorageSpace: null,
|
uploadFailedNotEnoughStorageSpace: null,
|
||||||
uploadedImages: null,
|
uploadedImages: null,
|
||||||
url: null,
|
url: null,
|
||||||
|
useSecureConnection: null,
|
||||||
userActions_title: 'Ações do Utilizador',
|
userActions_title: 'Ações do Utilizador',
|
||||||
userAddedCardToList: null,
|
userAddedCardToList: null,
|
||||||
userAddedThisCardToList: '<0>{{user}}</0> adicionou este cartão à {{list}}',
|
userAddedThisCardToList: '<0>{{user}}</0> adicionou este cartão à {{list}}',
|
||||||
@@ -428,6 +437,7 @@ export default {
|
|||||||
restoreToList: null,
|
restoreToList: null,
|
||||||
returnToBoard: null,
|
returnToBoard: null,
|
||||||
save: 'Guardar',
|
save: 'Guardar',
|
||||||
|
sendTestEmail: null,
|
||||||
showActive: null,
|
showActive: null,
|
||||||
showAllAttachments: 'Mostrar todos os anexos ({{hidden}} ocultos)',
|
showAllAttachments: 'Mostrar todos os anexos ({{hidden}} ocultos)',
|
||||||
showCardsWithThisUser: null,
|
showCardsWithThisUser: null,
|
||||||
|
|||||||
@@ -101,6 +101,7 @@ export default {
|
|||||||
cardsOnThisListAreCompleteAndReadyToBeArchived: null,
|
cardsOnThisListAreCompleteAndReadyToBeArchived: null,
|
||||||
cardsOnThisListAreReadyToBeWorkedOn: null,
|
cardsOnThisListAreReadyToBeWorkedOn: null,
|
||||||
clickHereOrRefreshPageToUpdate: null,
|
clickHereOrRefreshPageToUpdate: null,
|
||||||
|
clientHostnameInEhlo: null,
|
||||||
closed: null,
|
closed: null,
|
||||||
color: 'Culoarea',
|
color: 'Culoarea',
|
||||||
comments: null,
|
comments: null,
|
||||||
@@ -123,6 +124,7 @@ export default {
|
|||||||
date: 'Data',
|
date: 'Data',
|
||||||
deactivateUser_title: null,
|
deactivateUser_title: null,
|
||||||
defaultCardType_title: null,
|
defaultCardType_title: null,
|
||||||
|
defaultFrom: null,
|
||||||
defaultView_title: null,
|
defaultView_title: null,
|
||||||
deleteAllBoardsToBeAbleToDeleteThisProject: null,
|
deleteAllBoardsToBeAbleToDeleteThisProject: null,
|
||||||
deleteAttachment_title: 'Ștergeți atașamentul',
|
deleteAttachment_title: 'Ștergeți atașamentul',
|
||||||
@@ -186,6 +188,7 @@ export default {
|
|||||||
grid: null,
|
grid: null,
|
||||||
hideCompletedTasks: null,
|
hideCompletedTasks: null,
|
||||||
hideFromProjectListAndFavorites: null,
|
hideFromProjectListAndFavorites: null,
|
||||||
|
host: null,
|
||||||
hours: 'Ore',
|
hours: 'Ore',
|
||||||
importBoard_title: 'Import Tabla',
|
importBoard_title: 'Import Tabla',
|
||||||
invalidCurrentPassword: 'Parolă actuală nevalidă',
|
invalidCurrentPassword: 'Parolă actuală nevalidă',
|
||||||
@@ -229,8 +232,10 @@ export default {
|
|||||||
optional_inline: 'optional',
|
optional_inline: 'optional',
|
||||||
organization: 'Organizatia',
|
organization: 'Organizatia',
|
||||||
others: null,
|
others: null,
|
||||||
|
passwordIsSet: null,
|
||||||
phone: 'Telefon',
|
phone: 'Telefon',
|
||||||
plankaUsesAppriseToSendNotificationsToOver100PopularServices: null,
|
plankaUsesAppriseToSendNotificationsToOver100PopularServices: null,
|
||||||
|
port: null,
|
||||||
preferences: 'Preferințe',
|
preferences: 'Preferințe',
|
||||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||||
'Sfat: apăsați Ctrl-V (Cmd-V pe Mac) pentru a adăuga un atașament din clipboard.',
|
'Sfat: apăsați Ctrl-V (Cmd-V pe Mac) pentru a adăuga un atașament din clipboard.',
|
||||||
@@ -239,6 +244,7 @@ export default {
|
|||||||
projectNotFound_title: 'Proiectul nu a fost găsit',
|
projectNotFound_title: 'Proiectul nu a fost găsit',
|
||||||
projectOwner: null,
|
projectOwner: null,
|
||||||
referenceDataAndKnowledgeStorage: null,
|
referenceDataAndKnowledgeStorage: null,
|
||||||
|
rejectUnauthorizedTlsCertificates: null,
|
||||||
removeManager_title: 'Eliminați Manager',
|
removeManager_title: 'Eliminați Manager',
|
||||||
removeMember_title: 'Eliminați membru',
|
removeMember_title: 'Eliminați membru',
|
||||||
role: null,
|
role: null,
|
||||||
@@ -265,6 +271,7 @@ export default {
|
|||||||
shared: null,
|
shared: null,
|
||||||
sharedWithMe_title: null,
|
sharedWithMe_title: null,
|
||||||
showOnFrontOfCard: null,
|
showOnFrontOfCard: null,
|
||||||
|
smtp: null,
|
||||||
sortList_title: null,
|
sortList_title: null,
|
||||||
stopwatch: 'Cronometru',
|
stopwatch: 'Cronometru',
|
||||||
story: null,
|
story: null,
|
||||||
@@ -276,6 +283,7 @@ export default {
|
|||||||
taskList_title: null,
|
taskList_title: null,
|
||||||
team: null,
|
team: null,
|
||||||
terms: null,
|
terms: null,
|
||||||
|
testLog_title: null,
|
||||||
thereIsNoPreviewAvailableForThisAttachment:
|
thereIsNoPreviewAvailableForThisAttachment:
|
||||||
'Nu există nicio previzualizare disponibilă pentru acest atașament.',
|
'Nu există nicio previzualizare disponibilă pentru acest atașament.',
|
||||||
time: 'Timp',
|
time: 'Timp',
|
||||||
@@ -290,6 +298,7 @@ export default {
|
|||||||
uploadFailedNotEnoughStorageSpace: null,
|
uploadFailedNotEnoughStorageSpace: null,
|
||||||
uploadedImages: null,
|
uploadedImages: null,
|
||||||
url: null,
|
url: null,
|
||||||
|
useSecureConnection: null,
|
||||||
userActions_title: 'Acțiunile utilizatorului',
|
userActions_title: 'Acțiunile utilizatorului',
|
||||||
userAddedCardToList: null,
|
userAddedCardToList: null,
|
||||||
userAddedThisCardToList: '<0>{{user}}</0> a adăugat acest card în {{list}}',
|
userAddedThisCardToList: '<0>{{user}}</0> a adăugat acest card în {{list}}',
|
||||||
@@ -427,6 +436,7 @@ export default {
|
|||||||
restoreToList: null,
|
restoreToList: null,
|
||||||
returnToBoard: null,
|
returnToBoard: null,
|
||||||
save: 'Salveaza',
|
save: 'Salveaza',
|
||||||
|
sendTestEmail: null,
|
||||||
showActive: null,
|
showActive: null,
|
||||||
showAllAttachments: 'Afișați toate atașamentele ({{hidden}} ascunse)',
|
showAllAttachments: 'Afișați toate atașamentele ({{hidden}} ascunse)',
|
||||||
showCardsWithThisUser: null,
|
showCardsWithThisUser: null,
|
||||||
|
|||||||
@@ -114,6 +114,7 @@ export default {
|
|||||||
'Карточки в этом списке завершены и готовы к архивированию.',
|
'Карточки в этом списке завершены и готовы к архивированию.',
|
||||||
cardsOnThisListAreReadyToBeWorkedOn: 'Карточки в этом списке готовы к работе.',
|
cardsOnThisListAreReadyToBeWorkedOn: 'Карточки в этом списке готовы к работе.',
|
||||||
clickHereOrRefreshPageToUpdate: '<0>Нажмите здесь</0> или обновите страницу для обновления.',
|
clickHereOrRefreshPageToUpdate: '<0>Нажмите здесь</0> или обновите страницу для обновления.',
|
||||||
|
clientHostnameInEhlo: null,
|
||||||
closed: 'Закрыто',
|
closed: 'Закрыто',
|
||||||
color: 'Цвет',
|
color: 'Цвет',
|
||||||
comments: 'Комментарии',
|
comments: 'Комментарии',
|
||||||
@@ -136,6 +137,7 @@ export default {
|
|||||||
date: 'Дата',
|
date: 'Дата',
|
||||||
deactivateUser_title: 'Деактивировать пользователя',
|
deactivateUser_title: 'Деактивировать пользователя',
|
||||||
defaultCardType_title: 'Тип карточки по умолчанию',
|
defaultCardType_title: 'Тип карточки по умолчанию',
|
||||||
|
defaultFrom: null,
|
||||||
defaultView_title: 'Вид по умолчанию',
|
defaultView_title: 'Вид по умолчанию',
|
||||||
deleteAllBoardsToBeAbleToDeleteThisProject:
|
deleteAllBoardsToBeAbleToDeleteThisProject:
|
||||||
'Удалите все доски, чтобы иметь возможность удалить этот проект',
|
'Удалите все доски, чтобы иметь возможность удалить этот проект',
|
||||||
@@ -200,6 +202,7 @@ export default {
|
|||||||
grid: 'Сетка',
|
grid: 'Сетка',
|
||||||
hideCompletedTasks: null,
|
hideCompletedTasks: null,
|
||||||
hideFromProjectListAndFavorites: 'Скрыть из списка проектов и избранного',
|
hideFromProjectListAndFavorites: 'Скрыть из списка проектов и избранного',
|
||||||
|
host: null,
|
||||||
hours: 'Часы',
|
hours: 'Часы',
|
||||||
importBoard_title: 'Импорт доски',
|
importBoard_title: 'Импорт доски',
|
||||||
invalidCurrentPassword: 'Неверный текущий пароль',
|
invalidCurrentPassword: 'Неверный текущий пароль',
|
||||||
@@ -243,9 +246,11 @@ export default {
|
|||||||
optional_inline: 'необязательно',
|
optional_inline: 'необязательно',
|
||||||
organization: 'Организация',
|
organization: 'Организация',
|
||||||
others: 'Другие',
|
others: 'Другие',
|
||||||
|
passwordIsSet: null,
|
||||||
phone: 'Телефон',
|
phone: 'Телефон',
|
||||||
plankaUsesAppriseToSendNotificationsToOver100PopularServices:
|
plankaUsesAppriseToSendNotificationsToOver100PopularServices:
|
||||||
'PLANKA использует <1><0>Apprise</0></1> для отправки уведомлений в более чем 100 популярных сервисов.',
|
'PLANKA использует <1><0>Apprise</0></1> для отправки уведомлений в более чем 100 популярных сервисов.',
|
||||||
|
port: null,
|
||||||
preferences: 'Предпочтения',
|
preferences: 'Предпочтения',
|
||||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||||
'Совет: нажмите Ctrl-V (Cmd-V на Mac), чтобы добавить вложение из буфера обмена.',
|
'Совет: нажмите Ctrl-V (Cmd-V на Mac), чтобы добавить вложение из буфера обмена.',
|
||||||
@@ -254,6 +259,7 @@ export default {
|
|||||||
projectNotFound_title: 'Проект не найден',
|
projectNotFound_title: 'Проект не найден',
|
||||||
projectOwner: 'Владелец проекта',
|
projectOwner: 'Владелец проекта',
|
||||||
referenceDataAndKnowledgeStorage: 'Хранение справочных данных и знаний',
|
referenceDataAndKnowledgeStorage: 'Хранение справочных данных и знаний',
|
||||||
|
rejectUnauthorizedTlsCertificates: null,
|
||||||
removeManager_title: 'Удалить менеджера',
|
removeManager_title: 'Удалить менеджера',
|
||||||
removeMember_title: 'Удаление участника',
|
removeMember_title: 'Удаление участника',
|
||||||
role: 'Роль',
|
role: 'Роль',
|
||||||
@@ -280,6 +286,7 @@ export default {
|
|||||||
shared: 'Общий',
|
shared: 'Общий',
|
||||||
sharedWithMe_title: 'Общий со мной',
|
sharedWithMe_title: 'Общий со мной',
|
||||||
showOnFrontOfCard: 'Показать на лицевой стороне карточки',
|
showOnFrontOfCard: 'Показать на лицевой стороне карточки',
|
||||||
|
smtp: null,
|
||||||
sortList_title: 'Сортировка списка',
|
sortList_title: 'Сортировка списка',
|
||||||
stopwatch: 'Секундомер',
|
stopwatch: 'Секундомер',
|
||||||
story: 'История',
|
story: 'История',
|
||||||
@@ -291,6 +298,7 @@ export default {
|
|||||||
taskList_title: 'Список задач',
|
taskList_title: 'Список задач',
|
||||||
team: 'Команда',
|
team: 'Команда',
|
||||||
terms: null,
|
terms: null,
|
||||||
|
testLog_title: null,
|
||||||
thereIsNoPreviewAvailableForThisAttachment: 'Предпросмотр для этого вложения недоступен.',
|
thereIsNoPreviewAvailableForThisAttachment: 'Предпросмотр для этого вложения недоступен.',
|
||||||
time: 'Время',
|
time: 'Время',
|
||||||
title: 'Название',
|
title: 'Название',
|
||||||
@@ -304,6 +312,7 @@ export default {
|
|||||||
uploadFailedNotEnoughStorageSpace: null,
|
uploadFailedNotEnoughStorageSpace: null,
|
||||||
uploadedImages: 'Загруженные изображения',
|
uploadedImages: 'Загруженные изображения',
|
||||||
url: null,
|
url: null,
|
||||||
|
useSecureConnection: null,
|
||||||
userActions_title: 'Действия с пользователем',
|
userActions_title: 'Действия с пользователем',
|
||||||
userAddedCardToList: null,
|
userAddedCardToList: null,
|
||||||
userAddedThisCardToList: '<0>{{user}}</0> добавил(а) эту карточку в {{list}}',
|
userAddedThisCardToList: '<0>{{user}}</0> добавил(а) эту карточку в {{list}}',
|
||||||
@@ -441,6 +450,7 @@ export default {
|
|||||||
restoreToList: 'Восстановить в {{list}}',
|
restoreToList: 'Восстановить в {{list}}',
|
||||||
returnToBoard: 'Вернуться на доску',
|
returnToBoard: 'Вернуться на доску',
|
||||||
save: 'Сохранить',
|
save: 'Сохранить',
|
||||||
|
sendTestEmail: null,
|
||||||
showActive: 'Показать активные',
|
showActive: 'Показать активные',
|
||||||
showAllAttachments: 'Показать все вложения ({{hidden}} скрыто)',
|
showAllAttachments: 'Показать все вложения ({{hidden}} скрыто)',
|
||||||
showCardsWithThisUser: 'Показать карточки с этим пользователем',
|
showCardsWithThisUser: 'Показать карточки с этим пользователем',
|
||||||
|
|||||||
@@ -101,6 +101,7 @@ export default {
|
|||||||
cardsOnThisListAreCompleteAndReadyToBeArchived: null,
|
cardsOnThisListAreCompleteAndReadyToBeArchived: null,
|
||||||
cardsOnThisListAreReadyToBeWorkedOn: null,
|
cardsOnThisListAreReadyToBeWorkedOn: null,
|
||||||
clickHereOrRefreshPageToUpdate: null,
|
clickHereOrRefreshPageToUpdate: null,
|
||||||
|
clientHostnameInEhlo: null,
|
||||||
closed: null,
|
closed: null,
|
||||||
color: 'Farba',
|
color: 'Farba',
|
||||||
comments: null,
|
comments: null,
|
||||||
@@ -123,6 +124,7 @@ export default {
|
|||||||
date: 'Dátum',
|
date: 'Dátum',
|
||||||
deactivateUser_title: null,
|
deactivateUser_title: null,
|
||||||
defaultCardType_title: null,
|
defaultCardType_title: null,
|
||||||
|
defaultFrom: null,
|
||||||
defaultView_title: null,
|
defaultView_title: null,
|
||||||
deleteAllBoardsToBeAbleToDeleteThisProject: null,
|
deleteAllBoardsToBeAbleToDeleteThisProject: null,
|
||||||
deleteAttachment_title: 'Zmazať prílohu',
|
deleteAttachment_title: 'Zmazať prílohu',
|
||||||
@@ -186,6 +188,7 @@ export default {
|
|||||||
grid: null,
|
grid: null,
|
||||||
hideCompletedTasks: null,
|
hideCompletedTasks: null,
|
||||||
hideFromProjectListAndFavorites: null,
|
hideFromProjectListAndFavorites: null,
|
||||||
|
host: null,
|
||||||
hours: 'Hodiny',
|
hours: 'Hodiny',
|
||||||
importBoard_title: null,
|
importBoard_title: null,
|
||||||
invalidCurrentPassword: 'Neplatné aktuálne heslo',
|
invalidCurrentPassword: 'Neplatné aktuálne heslo',
|
||||||
@@ -229,8 +232,10 @@ export default {
|
|||||||
optional_inline: 'voliteľné',
|
optional_inline: 'voliteľné',
|
||||||
organization: 'Spoločnosť',
|
organization: 'Spoločnosť',
|
||||||
others: null,
|
others: null,
|
||||||
|
passwordIsSet: null,
|
||||||
phone: 'Telefón',
|
phone: 'Telefón',
|
||||||
plankaUsesAppriseToSendNotificationsToOver100PopularServices: null,
|
plankaUsesAppriseToSendNotificationsToOver100PopularServices: null,
|
||||||
|
port: null,
|
||||||
preferences: 'Voľby',
|
preferences: 'Voľby',
|
||||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
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.',
|
||||||
@@ -239,6 +244,7 @@ export default {
|
|||||||
projectNotFound_title: 'Projekt neexistuje',
|
projectNotFound_title: 'Projekt neexistuje',
|
||||||
projectOwner: null,
|
projectOwner: null,
|
||||||
referenceDataAndKnowledgeStorage: null,
|
referenceDataAndKnowledgeStorage: null,
|
||||||
|
rejectUnauthorizedTlsCertificates: null,
|
||||||
removeManager_title: 'Odstrániť správcu',
|
removeManager_title: 'Odstrániť správcu',
|
||||||
removeMember_title: 'Odstrániť člena',
|
removeMember_title: 'Odstrániť člena',
|
||||||
role: null,
|
role: null,
|
||||||
@@ -265,6 +271,7 @@ export default {
|
|||||||
shared: null,
|
shared: null,
|
||||||
sharedWithMe_title: null,
|
sharedWithMe_title: null,
|
||||||
showOnFrontOfCard: null,
|
showOnFrontOfCard: null,
|
||||||
|
smtp: null,
|
||||||
sortList_title: null,
|
sortList_title: null,
|
||||||
stopwatch: 'Časovač',
|
stopwatch: 'Časovač',
|
||||||
story: null,
|
story: null,
|
||||||
@@ -276,6 +283,7 @@ export default {
|
|||||||
taskList_title: null,
|
taskList_title: null,
|
||||||
team: null,
|
team: null,
|
||||||
terms: null,
|
terms: null,
|
||||||
|
testLog_title: null,
|
||||||
thereIsNoPreviewAvailableForThisAttachment: null,
|
thereIsNoPreviewAvailableForThisAttachment: null,
|
||||||
time: 'Čas',
|
time: 'Čas',
|
||||||
title: 'Názov',
|
title: 'Názov',
|
||||||
@@ -289,6 +297,7 @@ export default {
|
|||||||
uploadFailedNotEnoughStorageSpace: null,
|
uploadFailedNotEnoughStorageSpace: null,
|
||||||
uploadedImages: null,
|
uploadedImages: null,
|
||||||
url: null,
|
url: null,
|
||||||
|
useSecureConnection: null,
|
||||||
userActions_title: 'Akcie na používateľovi',
|
userActions_title: 'Akcie na používateľovi',
|
||||||
userAddedCardToList: null,
|
userAddedCardToList: null,
|
||||||
userAddedThisCardToList: '<0>{{user}}</0> pridal kartu do {{list}}',
|
userAddedThisCardToList: '<0>{{user}}</0> pridal kartu do {{list}}',
|
||||||
@@ -426,6 +435,7 @@ export default {
|
|||||||
restoreToList: null,
|
restoreToList: null,
|
||||||
returnToBoard: null,
|
returnToBoard: null,
|
||||||
save: 'Uložiť',
|
save: 'Uložiť',
|
||||||
|
sendTestEmail: null,
|
||||||
showActive: null,
|
showActive: null,
|
||||||
showAllAttachments: 'Zozbraziť všetky prílohy ({{hidden}} skryté)',
|
showAllAttachments: 'Zozbraziť všetky prílohy ({{hidden}} skryté)',
|
||||||
showCardsWithThisUser: null,
|
showCardsWithThisUser: null,
|
||||||
|
|||||||
@@ -101,6 +101,7 @@ export default {
|
|||||||
cardsOnThisListAreCompleteAndReadyToBeArchived: null,
|
cardsOnThisListAreCompleteAndReadyToBeArchived: null,
|
||||||
cardsOnThisListAreReadyToBeWorkedOn: null,
|
cardsOnThisListAreReadyToBeWorkedOn: null,
|
||||||
clickHereOrRefreshPageToUpdate: null,
|
clickHereOrRefreshPageToUpdate: null,
|
||||||
|
clientHostnameInEhlo: null,
|
||||||
closed: null,
|
closed: null,
|
||||||
color: 'Боја',
|
color: 'Боја',
|
||||||
comments: null,
|
comments: null,
|
||||||
@@ -123,6 +124,7 @@ export default {
|
|||||||
date: 'Датум',
|
date: 'Датум',
|
||||||
deactivateUser_title: null,
|
deactivateUser_title: null,
|
||||||
defaultCardType_title: null,
|
defaultCardType_title: null,
|
||||||
|
defaultFrom: null,
|
||||||
defaultView_title: null,
|
defaultView_title: null,
|
||||||
deleteAllBoardsToBeAbleToDeleteThisProject: null,
|
deleteAllBoardsToBeAbleToDeleteThisProject: null,
|
||||||
deleteAttachment_title: 'Обриши прилог',
|
deleteAttachment_title: 'Обриши прилог',
|
||||||
@@ -186,6 +188,7 @@ export default {
|
|||||||
grid: null,
|
grid: null,
|
||||||
hideCompletedTasks: null,
|
hideCompletedTasks: null,
|
||||||
hideFromProjectListAndFavorites: null,
|
hideFromProjectListAndFavorites: null,
|
||||||
|
host: null,
|
||||||
hours: 'Сати',
|
hours: 'Сати',
|
||||||
importBoard_title: 'Увези таблу',
|
importBoard_title: 'Увези таблу',
|
||||||
invalidCurrentPassword: 'Неисправна тренутна лозинка',
|
invalidCurrentPassword: 'Неисправна тренутна лозинка',
|
||||||
@@ -229,8 +232,10 @@ export default {
|
|||||||
optional_inline: 'опционо',
|
optional_inline: 'опционо',
|
||||||
organization: 'Организација',
|
organization: 'Организација',
|
||||||
others: null,
|
others: null,
|
||||||
|
passwordIsSet: null,
|
||||||
phone: 'Телефон',
|
phone: 'Телефон',
|
||||||
plankaUsesAppriseToSendNotificationsToOver100PopularServices: null,
|
plankaUsesAppriseToSendNotificationsToOver100PopularServices: null,
|
||||||
|
port: null,
|
||||||
preferences: 'Својства',
|
preferences: 'Својства',
|
||||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||||
'Савет: притисни Ctrl-V (Cmd-V на Меку) да би додао прилог са бележнице.',
|
'Савет: притисни Ctrl-V (Cmd-V на Меку) да би додао прилог са бележнице.',
|
||||||
@@ -239,6 +244,7 @@ export default {
|
|||||||
projectNotFound_title: 'Пројекат није пронађен',
|
projectNotFound_title: 'Пројекат није пронађен',
|
||||||
projectOwner: null,
|
projectOwner: null,
|
||||||
referenceDataAndKnowledgeStorage: null,
|
referenceDataAndKnowledgeStorage: null,
|
||||||
|
rejectUnauthorizedTlsCertificates: null,
|
||||||
removeManager_title: 'Уклони руководиоца',
|
removeManager_title: 'Уклони руководиоца',
|
||||||
removeMember_title: 'Уклони члана',
|
removeMember_title: 'Уклони члана',
|
||||||
role: null,
|
role: null,
|
||||||
@@ -265,6 +271,7 @@ export default {
|
|||||||
shared: null,
|
shared: null,
|
||||||
sharedWithMe_title: null,
|
sharedWithMe_title: null,
|
||||||
showOnFrontOfCard: null,
|
showOnFrontOfCard: null,
|
||||||
|
smtp: null,
|
||||||
sortList_title: 'Сложи списак',
|
sortList_title: 'Сложи списак',
|
||||||
stopwatch: 'Штоперица',
|
stopwatch: 'Штоперица',
|
||||||
story: null,
|
story: null,
|
||||||
@@ -276,6 +283,7 @@ export default {
|
|||||||
taskList_title: null,
|
taskList_title: null,
|
||||||
team: null,
|
team: null,
|
||||||
terms: null,
|
terms: null,
|
||||||
|
testLog_title: null,
|
||||||
thereIsNoPreviewAvailableForThisAttachment: 'Нема прегледа доступног за овај прилог.',
|
thereIsNoPreviewAvailableForThisAttachment: 'Нема прегледа доступног за овај прилог.',
|
||||||
time: 'Време',
|
time: 'Време',
|
||||||
title: 'Наслов',
|
title: 'Наслов',
|
||||||
@@ -289,6 +297,7 @@ export default {
|
|||||||
uploadFailedNotEnoughStorageSpace: null,
|
uploadFailedNotEnoughStorageSpace: null,
|
||||||
uploadedImages: null,
|
uploadedImages: null,
|
||||||
url: null,
|
url: null,
|
||||||
|
useSecureConnection: null,
|
||||||
userActions_title: 'Корисничке радње',
|
userActions_title: 'Корисничке радње',
|
||||||
userAddedCardToList: null,
|
userAddedCardToList: null,
|
||||||
userAddedThisCardToList: '<0>{{user}}</0> је додао ову картицу на {{list}}',
|
userAddedThisCardToList: '<0>{{user}}</0> је додао ову картицу на {{list}}',
|
||||||
@@ -426,6 +435,7 @@ export default {
|
|||||||
restoreToList: null,
|
restoreToList: null,
|
||||||
returnToBoard: null,
|
returnToBoard: null,
|
||||||
save: 'Сачувај',
|
save: 'Сачувај',
|
||||||
|
sendTestEmail: null,
|
||||||
showActive: null,
|
showActive: null,
|
||||||
showAllAttachments: 'Прикажи све ({{hidden}} сакривене прилоге)',
|
showAllAttachments: 'Прикажи све ({{hidden}} сакривене прилоге)',
|
||||||
showCardsWithThisUser: null,
|
showCardsWithThisUser: null,
|
||||||
|
|||||||
@@ -98,6 +98,7 @@ export default {
|
|||||||
cardsOnThisListAreCompleteAndReadyToBeArchived: null,
|
cardsOnThisListAreCompleteAndReadyToBeArchived: null,
|
||||||
cardsOnThisListAreReadyToBeWorkedOn: null,
|
cardsOnThisListAreReadyToBeWorkedOn: null,
|
||||||
clickHereOrRefreshPageToUpdate: null,
|
clickHereOrRefreshPageToUpdate: null,
|
||||||
|
clientHostnameInEhlo: null,
|
||||||
closed: null,
|
closed: null,
|
||||||
color: 'Boja',
|
color: 'Boja',
|
||||||
comments: null,
|
comments: null,
|
||||||
@@ -120,6 +121,7 @@ export default {
|
|||||||
date: 'Datum',
|
date: 'Datum',
|
||||||
deactivateUser_title: null,
|
deactivateUser_title: null,
|
||||||
defaultCardType_title: null,
|
defaultCardType_title: null,
|
||||||
|
defaultFrom: null,
|
||||||
defaultView_title: null,
|
defaultView_title: null,
|
||||||
deleteAllBoardsToBeAbleToDeleteThisProject: null,
|
deleteAllBoardsToBeAbleToDeleteThisProject: null,
|
||||||
deleteAttachment_title: 'Obriši prilog',
|
deleteAttachment_title: 'Obriši prilog',
|
||||||
@@ -183,6 +185,7 @@ export default {
|
|||||||
grid: null,
|
grid: null,
|
||||||
hideCompletedTasks: null,
|
hideCompletedTasks: null,
|
||||||
hideFromProjectListAndFavorites: null,
|
hideFromProjectListAndFavorites: null,
|
||||||
|
host: null,
|
||||||
hours: 'Sati',
|
hours: 'Sati',
|
||||||
importBoard_title: 'Uvezi tablu',
|
importBoard_title: 'Uvezi tablu',
|
||||||
invalidCurrentPassword: 'Neispravna trenutna lozinka',
|
invalidCurrentPassword: 'Neispravna trenutna lozinka',
|
||||||
@@ -226,8 +229,10 @@ export default {
|
|||||||
optional_inline: 'opciono',
|
optional_inline: 'opciono',
|
||||||
organization: 'Organizacija',
|
organization: 'Organizacija',
|
||||||
others: null,
|
others: null,
|
||||||
|
passwordIsSet: null,
|
||||||
phone: 'Telefon',
|
phone: 'Telefon',
|
||||||
plankaUsesAppriseToSendNotificationsToOver100PopularServices: null,
|
plankaUsesAppriseToSendNotificationsToOver100PopularServices: null,
|
||||||
|
port: null,
|
||||||
preferences: 'Svojstva',
|
preferences: 'Svojstva',
|
||||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||||
'Savet: pritisni Ctrl-V (Cmd-V na Meku) da bi dodao prilog sa beležnice.',
|
'Savet: pritisni Ctrl-V (Cmd-V na Meku) da bi dodao prilog sa beležnice.',
|
||||||
@@ -236,6 +241,7 @@ export default {
|
|||||||
projectNotFound_title: 'Projekat nije pronađen',
|
projectNotFound_title: 'Projekat nije pronađen',
|
||||||
projectOwner: null,
|
projectOwner: null,
|
||||||
referenceDataAndKnowledgeStorage: null,
|
referenceDataAndKnowledgeStorage: null,
|
||||||
|
rejectUnauthorizedTlsCertificates: null,
|
||||||
removeManager_title: 'Ukloni rukovodioca',
|
removeManager_title: 'Ukloni rukovodioca',
|
||||||
removeMember_title: 'Ukloni člana',
|
removeMember_title: 'Ukloni člana',
|
||||||
role: null,
|
role: null,
|
||||||
@@ -262,6 +268,7 @@ export default {
|
|||||||
shared: null,
|
shared: null,
|
||||||
sharedWithMe_title: null,
|
sharedWithMe_title: null,
|
||||||
showOnFrontOfCard: null,
|
showOnFrontOfCard: null,
|
||||||
|
smtp: null,
|
||||||
sortList_title: 'Složi spisak',
|
sortList_title: 'Složi spisak',
|
||||||
stopwatch: 'Štoperica',
|
stopwatch: 'Štoperica',
|
||||||
story: null,
|
story: null,
|
||||||
@@ -273,6 +280,7 @@ export default {
|
|||||||
taskList_title: null,
|
taskList_title: null,
|
||||||
team: null,
|
team: null,
|
||||||
terms: null,
|
terms: null,
|
||||||
|
testLog_title: null,
|
||||||
thereIsNoPreviewAvailableForThisAttachment: 'Nema pregleda dostupnog za ovaj prilog.',
|
thereIsNoPreviewAvailableForThisAttachment: 'Nema pregleda dostupnog za ovaj prilog.',
|
||||||
time: 'Vreme',
|
time: 'Vreme',
|
||||||
title: 'Naslov',
|
title: 'Naslov',
|
||||||
@@ -286,6 +294,7 @@ export default {
|
|||||||
uploadFailedNotEnoughStorageSpace: null,
|
uploadFailedNotEnoughStorageSpace: null,
|
||||||
uploadedImages: null,
|
uploadedImages: null,
|
||||||
url: null,
|
url: null,
|
||||||
|
useSecureConnection: null,
|
||||||
userActions_title: 'Korisničke radnje',
|
userActions_title: 'Korisničke radnje',
|
||||||
userAddedCardToList: null,
|
userAddedCardToList: null,
|
||||||
userAddedThisCardToList: '<0>{{user}}</0> je dodao ovu karticu na {{list}}',
|
userAddedThisCardToList: '<0>{{user}}</0> je dodao ovu karticu na {{list}}',
|
||||||
@@ -423,6 +432,7 @@ export default {
|
|||||||
restoreToList: null,
|
restoreToList: null,
|
||||||
returnToBoard: null,
|
returnToBoard: null,
|
||||||
save: 'Sačuvaj',
|
save: 'Sačuvaj',
|
||||||
|
sendTestEmail: null,
|
||||||
showActive: null,
|
showActive: null,
|
||||||
showAllAttachments: 'Prikaži sve ({{hidden}} sakrivene priloge)',
|
showAllAttachments: 'Prikaži sve ({{hidden}} sakrivene priloge)',
|
||||||
showCardsWithThisUser: null,
|
showCardsWithThisUser: null,
|
||||||
|
|||||||
@@ -100,6 +100,7 @@ export default {
|
|||||||
cardsOnThisListAreCompleteAndReadyToBeArchived: null,
|
cardsOnThisListAreCompleteAndReadyToBeArchived: null,
|
||||||
cardsOnThisListAreReadyToBeWorkedOn: null,
|
cardsOnThisListAreReadyToBeWorkedOn: null,
|
||||||
clickHereOrRefreshPageToUpdate: null,
|
clickHereOrRefreshPageToUpdate: null,
|
||||||
|
clientHostnameInEhlo: null,
|
||||||
closed: null,
|
closed: null,
|
||||||
color: 'Färg',
|
color: 'Färg',
|
||||||
comments: null,
|
comments: null,
|
||||||
@@ -122,6 +123,7 @@ export default {
|
|||||||
date: 'Datum',
|
date: 'Datum',
|
||||||
deactivateUser_title: null,
|
deactivateUser_title: null,
|
||||||
defaultCardType_title: null,
|
defaultCardType_title: null,
|
||||||
|
defaultFrom: null,
|
||||||
defaultView_title: null,
|
defaultView_title: null,
|
||||||
deleteAllBoardsToBeAbleToDeleteThisProject: null,
|
deleteAllBoardsToBeAbleToDeleteThisProject: null,
|
||||||
deleteAttachment_title: 'Ta bort bilaga',
|
deleteAttachment_title: 'Ta bort bilaga',
|
||||||
@@ -185,6 +187,7 @@ export default {
|
|||||||
grid: null,
|
grid: null,
|
||||||
hideCompletedTasks: null,
|
hideCompletedTasks: null,
|
||||||
hideFromProjectListAndFavorites: null,
|
hideFromProjectListAndFavorites: null,
|
||||||
|
host: null,
|
||||||
hours: 'Timmar',
|
hours: 'Timmar',
|
||||||
importBoard_title: null,
|
importBoard_title: null,
|
||||||
invalidCurrentPassword: 'Ogiltigt nuvarande lösenord',
|
invalidCurrentPassword: 'Ogiltigt nuvarande lösenord',
|
||||||
@@ -228,8 +231,10 @@ export default {
|
|||||||
optional_inline: 'valfri',
|
optional_inline: 'valfri',
|
||||||
organization: 'Organisation',
|
organization: 'Organisation',
|
||||||
others: null,
|
others: null,
|
||||||
|
passwordIsSet: null,
|
||||||
phone: 'Telefon',
|
phone: 'Telefon',
|
||||||
plankaUsesAppriseToSendNotificationsToOver100PopularServices: null,
|
plankaUsesAppriseToSendNotificationsToOver100PopularServices: null,
|
||||||
|
port: null,
|
||||||
preferences: 'Preferenser',
|
preferences: 'Preferenser',
|
||||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
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.',
|
||||||
@@ -238,6 +243,7 @@ export default {
|
|||||||
projectNotFound_title: 'Projekt hittades inte',
|
projectNotFound_title: 'Projekt hittades inte',
|
||||||
projectOwner: null,
|
projectOwner: null,
|
||||||
referenceDataAndKnowledgeStorage: null,
|
referenceDataAndKnowledgeStorage: null,
|
||||||
|
rejectUnauthorizedTlsCertificates: null,
|
||||||
removeManager_title: 'Ta bort projektledare',
|
removeManager_title: 'Ta bort projektledare',
|
||||||
removeMember_title: 'Ta bort medlem',
|
removeMember_title: 'Ta bort medlem',
|
||||||
role: null,
|
role: null,
|
||||||
@@ -264,6 +270,7 @@ export default {
|
|||||||
shared: null,
|
shared: null,
|
||||||
sharedWithMe_title: null,
|
sharedWithMe_title: null,
|
||||||
showOnFrontOfCard: null,
|
showOnFrontOfCard: null,
|
||||||
|
smtp: null,
|
||||||
sortList_title: null,
|
sortList_title: null,
|
||||||
stopwatch: 'Timer',
|
stopwatch: 'Timer',
|
||||||
story: null,
|
story: null,
|
||||||
@@ -275,6 +282,7 @@ export default {
|
|||||||
taskList_title: null,
|
taskList_title: null,
|
||||||
team: null,
|
team: null,
|
||||||
terms: null,
|
terms: null,
|
||||||
|
testLog_title: null,
|
||||||
thereIsNoPreviewAvailableForThisAttachment: null,
|
thereIsNoPreviewAvailableForThisAttachment: null,
|
||||||
time: 'Tid',
|
time: 'Tid',
|
||||||
title: 'Titel',
|
title: 'Titel',
|
||||||
@@ -288,6 +296,7 @@ export default {
|
|||||||
uploadFailedNotEnoughStorageSpace: null,
|
uploadFailedNotEnoughStorageSpace: null,
|
||||||
uploadedImages: null,
|
uploadedImages: null,
|
||||||
url: null,
|
url: null,
|
||||||
|
useSecureConnection: null,
|
||||||
userActions_title: 'Användaråtgärder',
|
userActions_title: 'Användaråtgärder',
|
||||||
userAddedCardToList: null,
|
userAddedCardToList: null,
|
||||||
userAddedThisCardToList: '<0>{{user}}</0> lade till detta kort i {{list}}',
|
userAddedThisCardToList: '<0>{{user}}</0> lade till detta kort i {{list}}',
|
||||||
@@ -425,6 +434,7 @@ export default {
|
|||||||
restoreToList: null,
|
restoreToList: null,
|
||||||
returnToBoard: null,
|
returnToBoard: null,
|
||||||
save: 'Spara',
|
save: 'Spara',
|
||||||
|
sendTestEmail: null,
|
||||||
showActive: null,
|
showActive: null,
|
||||||
showAllAttachments: 'Visa alla bilagor ({{hidden}} dolda)',
|
showAllAttachments: 'Visa alla bilagor ({{hidden}} dolda)',
|
||||||
showCardsWithThisUser: null,
|
showCardsWithThisUser: null,
|
||||||
|
|||||||
@@ -98,6 +98,7 @@ export default {
|
|||||||
cardsOnThisListAreCompleteAndReadyToBeArchived: null,
|
cardsOnThisListAreCompleteAndReadyToBeArchived: null,
|
||||||
cardsOnThisListAreReadyToBeWorkedOn: null,
|
cardsOnThisListAreReadyToBeWorkedOn: null,
|
||||||
clickHereOrRefreshPageToUpdate: null,
|
clickHereOrRefreshPageToUpdate: null,
|
||||||
|
clientHostnameInEhlo: null,
|
||||||
closed: null,
|
closed: null,
|
||||||
color: 'renk',
|
color: 'renk',
|
||||||
comments: null,
|
comments: null,
|
||||||
@@ -120,6 +121,7 @@ export default {
|
|||||||
date: 'tarih',
|
date: 'tarih',
|
||||||
deactivateUser_title: null,
|
deactivateUser_title: null,
|
||||||
defaultCardType_title: null,
|
defaultCardType_title: null,
|
||||||
|
defaultFrom: null,
|
||||||
defaultView_title: null,
|
defaultView_title: null,
|
||||||
deleteAllBoardsToBeAbleToDeleteThisProject: null,
|
deleteAllBoardsToBeAbleToDeleteThisProject: null,
|
||||||
deleteAttachment_title: 'Eki Sil',
|
deleteAttachment_title: 'Eki Sil',
|
||||||
@@ -183,6 +185,7 @@ export default {
|
|||||||
grid: null,
|
grid: null,
|
||||||
hideCompletedTasks: null,
|
hideCompletedTasks: null,
|
||||||
hideFromProjectListAndFavorites: null,
|
hideFromProjectListAndFavorites: null,
|
||||||
|
host: null,
|
||||||
hours: 'saat',
|
hours: 'saat',
|
||||||
importBoard_title: null,
|
importBoard_title: null,
|
||||||
invalidCurrentPassword: 'Mevcut şifre yanlış',
|
invalidCurrentPassword: 'Mevcut şifre yanlış',
|
||||||
@@ -226,8 +229,10 @@ export default {
|
|||||||
optional_inline: 'İsteğe bağlı',
|
optional_inline: 'İsteğe bağlı',
|
||||||
organization: 'Organizasyon',
|
organization: 'Organizasyon',
|
||||||
others: null,
|
others: null,
|
||||||
|
passwordIsSet: null,
|
||||||
phone: 'telefon',
|
phone: 'telefon',
|
||||||
plankaUsesAppriseToSendNotificationsToOver100PopularServices: null,
|
plankaUsesAppriseToSendNotificationsToOver100PopularServices: null,
|
||||||
|
port: null,
|
||||||
preferences: 'Tercihler',
|
preferences: 'Tercihler',
|
||||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
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.',
|
||||||
@@ -236,6 +241,7 @@ export default {
|
|||||||
projectNotFound_title: 'Proje bulunamadı',
|
projectNotFound_title: 'Proje bulunamadı',
|
||||||
projectOwner: null,
|
projectOwner: null,
|
||||||
referenceDataAndKnowledgeStorage: null,
|
referenceDataAndKnowledgeStorage: null,
|
||||||
|
rejectUnauthorizedTlsCertificates: null,
|
||||||
removeManager_title: 'Yöneticiyi Kaldır',
|
removeManager_title: 'Yöneticiyi Kaldır',
|
||||||
removeMember_title: 'Üyeyi Kaldır',
|
removeMember_title: 'Üyeyi Kaldır',
|
||||||
role: null,
|
role: null,
|
||||||
@@ -262,6 +268,7 @@ export default {
|
|||||||
shared: null,
|
shared: null,
|
||||||
sharedWithMe_title: null,
|
sharedWithMe_title: null,
|
||||||
showOnFrontOfCard: null,
|
showOnFrontOfCard: null,
|
||||||
|
smtp: null,
|
||||||
sortList_title: null,
|
sortList_title: null,
|
||||||
stopwatch: 'kronometre',
|
stopwatch: 'kronometre',
|
||||||
story: null,
|
story: null,
|
||||||
@@ -273,6 +280,7 @@ export default {
|
|||||||
taskList_title: null,
|
taskList_title: null,
|
||||||
team: null,
|
team: null,
|
||||||
terms: null,
|
terms: null,
|
||||||
|
testLog_title: null,
|
||||||
thereIsNoPreviewAvailableForThisAttachment: 'Bu ek için önizleme mevcut değil.',
|
thereIsNoPreviewAvailableForThisAttachment: 'Bu ek için önizleme mevcut değil.',
|
||||||
time: 'zaman',
|
time: 'zaman',
|
||||||
title: 'başlık',
|
title: 'başlık',
|
||||||
@@ -286,6 +294,7 @@ export default {
|
|||||||
uploadFailedNotEnoughStorageSpace: null,
|
uploadFailedNotEnoughStorageSpace: null,
|
||||||
uploadedImages: null,
|
uploadedImages: null,
|
||||||
url: null,
|
url: null,
|
||||||
|
useSecureConnection: null,
|
||||||
userActions_title: 'Kullanıcı İşlemleri',
|
userActions_title: 'Kullanıcı İşlemleri',
|
||||||
userAddedCardToList: null,
|
userAddedCardToList: null,
|
||||||
userAddedThisCardToList: '<0>{{user}}</0> bu kartı {{list}} listesine ekledi',
|
userAddedThisCardToList: '<0>{{user}}</0> bu kartı {{list}} listesine ekledi',
|
||||||
@@ -423,6 +432,7 @@ export default {
|
|||||||
restoreToList: null,
|
restoreToList: null,
|
||||||
returnToBoard: null,
|
returnToBoard: null,
|
||||||
save: 'Kaydet',
|
save: 'Kaydet',
|
||||||
|
sendTestEmail: null,
|
||||||
showActive: null,
|
showActive: null,
|
||||||
showAllAttachments: 'Tüm ekleri göster ({{hidden}} gizli)',
|
showAllAttachments: 'Tüm ekleri göster ({{hidden}} gizli)',
|
||||||
showCardsWithThisUser: null,
|
showCardsWithThisUser: null,
|
||||||
|
|||||||
@@ -111,6 +111,7 @@ export default {
|
|||||||
'Картки з цього списку завершені і готові до архівування.',
|
'Картки з цього списку завершені і готові до архівування.',
|
||||||
cardsOnThisListAreReadyToBeWorkedOn: 'Картки з цього списку готові до роботи.',
|
cardsOnThisListAreReadyToBeWorkedOn: 'Картки з цього списку готові до роботи.',
|
||||||
clickHereOrRefreshPageToUpdate: '<0>Натисніть тут</0> або оновіть сторінку для оновлення.',
|
clickHereOrRefreshPageToUpdate: '<0>Натисніть тут</0> або оновіть сторінку для оновлення.',
|
||||||
|
clientHostnameInEhlo: null,
|
||||||
closed: 'Закрито',
|
closed: 'Закрито',
|
||||||
color: 'Колір',
|
color: 'Колір',
|
||||||
comments: 'Коментарі',
|
comments: 'Коментарі',
|
||||||
@@ -134,6 +135,7 @@ export default {
|
|||||||
date: 'Дата',
|
date: 'Дата',
|
||||||
deactivateUser_title: 'Деактивувати користувача',
|
deactivateUser_title: 'Деактивувати користувача',
|
||||||
defaultCardType_title: 'Тип картки за замовчуванням',
|
defaultCardType_title: 'Тип картки за замовчуванням',
|
||||||
|
defaultFrom: null,
|
||||||
defaultView_title: 'Вигляд за замовчуванням',
|
defaultView_title: 'Вигляд за замовчуванням',
|
||||||
deleteAllBoardsToBeAbleToDeleteThisProject:
|
deleteAllBoardsToBeAbleToDeleteThisProject:
|
||||||
'Видаліть усі дошки, щоб мати змогу видалити цей проект',
|
'Видаліть усі дошки, щоб мати змогу видалити цей проект',
|
||||||
@@ -198,6 +200,7 @@ export default {
|
|||||||
grid: 'Сітка',
|
grid: 'Сітка',
|
||||||
hideCompletedTasks: 'Приховати виконані завдання',
|
hideCompletedTasks: 'Приховати виконані завдання',
|
||||||
hideFromProjectListAndFavorites: 'Приховати зі списку проектів та обраного',
|
hideFromProjectListAndFavorites: 'Приховати зі списку проектів та обраного',
|
||||||
|
host: null,
|
||||||
hours: 'Години',
|
hours: 'Години',
|
||||||
importBoard_title: 'Імпортувати Дошку',
|
importBoard_title: 'Імпортувати Дошку',
|
||||||
invalidCurrentPassword: 'Невірний поточний пароль',
|
invalidCurrentPassword: 'Невірний поточний пароль',
|
||||||
@@ -242,9 +245,11 @@ export default {
|
|||||||
optional_inline: 'опціонально',
|
optional_inline: 'опціонально',
|
||||||
organization: 'Організація',
|
organization: 'Організація',
|
||||||
others: 'Інші',
|
others: 'Інші',
|
||||||
|
passwordIsSet: null,
|
||||||
phone: 'Телефон',
|
phone: 'Телефон',
|
||||||
plankaUsesAppriseToSendNotificationsToOver100PopularServices:
|
plankaUsesAppriseToSendNotificationsToOver100PopularServices:
|
||||||
'PLANKA використовує <1><0>Apprise</0></1> для надсилання сповіщень на понад 100 популярних сервісів.',
|
'PLANKA використовує <1><0>Apprise</0></1> для надсилання сповіщень на понад 100 популярних сервісів.',
|
||||||
|
port: null,
|
||||||
preferences: 'Уподобання',
|
preferences: 'Уподобання',
|
||||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||||
'Порада: натисніть Ctrl-V (⌘V на Mac), щоб додати вкладення з буфера обміну.',
|
'Порада: натисніть Ctrl-V (⌘V на Mac), щоб додати вкладення з буфера обміну.',
|
||||||
@@ -253,6 +258,7 @@ export default {
|
|||||||
projectNotFound_title: 'Проект не знайдено',
|
projectNotFound_title: 'Проект не знайдено',
|
||||||
projectOwner: 'Власник проекту',
|
projectOwner: 'Власник проекту',
|
||||||
referenceDataAndKnowledgeStorage: 'Довідкові дані та сховище знань.',
|
referenceDataAndKnowledgeStorage: 'Довідкові дані та сховище знань.',
|
||||||
|
rejectUnauthorizedTlsCertificates: null,
|
||||||
removeManager_title: 'Видалити Менеджера',
|
removeManager_title: 'Видалити Менеджера',
|
||||||
removeMember_title: 'Видалити Учасника',
|
removeMember_title: 'Видалити Учасника',
|
||||||
role: 'Роль',
|
role: 'Роль',
|
||||||
@@ -279,6 +285,7 @@ export default {
|
|||||||
shared: 'Спільне',
|
shared: 'Спільне',
|
||||||
sharedWithMe_title: 'Поділіться зі мною',
|
sharedWithMe_title: 'Поділіться зі мною',
|
||||||
showOnFrontOfCard: 'Показати на лицьовій стороні картки',
|
showOnFrontOfCard: 'Показати на лицьовій стороні картки',
|
||||||
|
smtp: null,
|
||||||
sortList_title: 'Сортування списку',
|
sortList_title: 'Сортування списку',
|
||||||
stopwatch: 'Секундомір',
|
stopwatch: 'Секундомір',
|
||||||
story: 'Історія',
|
story: 'Історія',
|
||||||
@@ -290,6 +297,7 @@ export default {
|
|||||||
taskList_title: 'Список завдань',
|
taskList_title: 'Список завдань',
|
||||||
team: 'Команда',
|
team: 'Команда',
|
||||||
terms: null,
|
terms: null,
|
||||||
|
testLog_title: null,
|
||||||
thereIsNoPreviewAvailableForThisAttachment: 'Для цього вкладення немає доступного перегляду.',
|
thereIsNoPreviewAvailableForThisAttachment: 'Для цього вкладення немає доступного перегляду.',
|
||||||
time: 'Час',
|
time: 'Час',
|
||||||
title: 'Назва',
|
title: 'Назва',
|
||||||
@@ -303,6 +311,7 @@ export default {
|
|||||||
uploadFailedNotEnoughStorageSpace: null,
|
uploadFailedNotEnoughStorageSpace: null,
|
||||||
uploadedImages: 'Завантажені зображення',
|
uploadedImages: 'Завантажені зображення',
|
||||||
url: 'Посилання',
|
url: 'Посилання',
|
||||||
|
useSecureConnection: null,
|
||||||
userActions_title: 'Дії користувача',
|
userActions_title: 'Дії користувача',
|
||||||
userAddedCardToList: '<0>{{user}}</0> додав(ла) <2>{{card}}</2> до {{list}}',
|
userAddedCardToList: '<0>{{user}}</0> додав(ла) <2>{{card}}</2> до {{list}}',
|
||||||
userAddedThisCardToList: '<0>{{user}}</0> додав(ла) цю картку до {{list}}',
|
userAddedThisCardToList: '<0>{{user}}</0> додав(ла) цю картку до {{list}}',
|
||||||
@@ -443,6 +452,7 @@ export default {
|
|||||||
restoreToList: 'Відновити до {{list}}',
|
restoreToList: 'Відновити до {{list}}',
|
||||||
returnToBoard: 'Повернутися до дошки',
|
returnToBoard: 'Повернутися до дошки',
|
||||||
save: 'Зберегти',
|
save: 'Зберегти',
|
||||||
|
sendTestEmail: null,
|
||||||
showActive: 'Показати активний',
|
showActive: 'Показати активний',
|
||||||
showAllAttachments: 'Показати всі вкладення ({{hidden}} приховані)',
|
showAllAttachments: 'Показати всі вкладення ({{hidden}} приховані)',
|
||||||
showCardsWithThisUser: 'Показати картки з цим користувачем',
|
showCardsWithThisUser: 'Показати картки з цим користувачем',
|
||||||
|
|||||||
@@ -97,6 +97,7 @@ export default {
|
|||||||
cardsOnThisListAreCompleteAndReadyToBeArchived: null,
|
cardsOnThisListAreCompleteAndReadyToBeArchived: null,
|
||||||
cardsOnThisListAreReadyToBeWorkedOn: null,
|
cardsOnThisListAreReadyToBeWorkedOn: null,
|
||||||
clickHereOrRefreshPageToUpdate: null,
|
clickHereOrRefreshPageToUpdate: null,
|
||||||
|
clientHostnameInEhlo: null,
|
||||||
closed: null,
|
closed: null,
|
||||||
color: 'Rang',
|
color: 'Rang',
|
||||||
comments: null,
|
comments: null,
|
||||||
@@ -119,6 +120,7 @@ export default {
|
|||||||
date: 'Sana',
|
date: 'Sana',
|
||||||
deactivateUser_title: null,
|
deactivateUser_title: null,
|
||||||
defaultCardType_title: null,
|
defaultCardType_title: null,
|
||||||
|
defaultFrom: null,
|
||||||
defaultView_title: null,
|
defaultView_title: null,
|
||||||
deleteAllBoardsToBeAbleToDeleteThisProject: null,
|
deleteAllBoardsToBeAbleToDeleteThisProject: null,
|
||||||
deleteAttachment_title: "Ilovani O'chirish",
|
deleteAttachment_title: "Ilovani O'chirish",
|
||||||
@@ -182,6 +184,7 @@ export default {
|
|||||||
grid: null,
|
grid: null,
|
||||||
hideCompletedTasks: null,
|
hideCompletedTasks: null,
|
||||||
hideFromProjectListAndFavorites: null,
|
hideFromProjectListAndFavorites: null,
|
||||||
|
host: null,
|
||||||
hours: 'Soat',
|
hours: 'Soat',
|
||||||
importBoard_title: null,
|
importBoard_title: null,
|
||||||
invalidCurrentPassword: 'Hozirgi parol xato',
|
invalidCurrentPassword: 'Hozirgi parol xato',
|
||||||
@@ -225,8 +228,10 @@ export default {
|
|||||||
optional_inline: 'ixtiyoriy',
|
optional_inline: 'ixtiyoriy',
|
||||||
organization: 'Tashkilot',
|
organization: 'Tashkilot',
|
||||||
others: null,
|
others: null,
|
||||||
|
passwordIsSet: null,
|
||||||
phone: 'Telefon',
|
phone: 'Telefon',
|
||||||
plankaUsesAppriseToSendNotificationsToOver100PopularServices: null,
|
plankaUsesAppriseToSendNotificationsToOver100PopularServices: null,
|
||||||
|
port: null,
|
||||||
preferences: 'Afzalliklar',
|
preferences: 'Afzalliklar',
|
||||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
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.",
|
||||||
@@ -235,6 +240,7 @@ export default {
|
|||||||
projectNotFound_title: 'Loyiha Topilmadi',
|
projectNotFound_title: 'Loyiha Topilmadi',
|
||||||
projectOwner: null,
|
projectOwner: null,
|
||||||
referenceDataAndKnowledgeStorage: null,
|
referenceDataAndKnowledgeStorage: null,
|
||||||
|
rejectUnauthorizedTlsCertificates: null,
|
||||||
removeManager_title: "Boshqaruvchini O'chirish",
|
removeManager_title: "Boshqaruvchini O'chirish",
|
||||||
removeMember_title: "A'zoni O'chirish",
|
removeMember_title: "A'zoni O'chirish",
|
||||||
role: null,
|
role: null,
|
||||||
@@ -261,6 +267,7 @@ export default {
|
|||||||
shared: null,
|
shared: null,
|
||||||
sharedWithMe_title: null,
|
sharedWithMe_title: null,
|
||||||
showOnFrontOfCard: null,
|
showOnFrontOfCard: null,
|
||||||
|
smtp: null,
|
||||||
sortList_title: null,
|
sortList_title: null,
|
||||||
stopwatch: 'Taymer',
|
stopwatch: 'Taymer',
|
||||||
story: null,
|
story: null,
|
||||||
@@ -272,6 +279,7 @@ export default {
|
|||||||
taskList_title: null,
|
taskList_title: null,
|
||||||
team: null,
|
team: null,
|
||||||
terms: null,
|
terms: null,
|
||||||
|
testLog_title: null,
|
||||||
thereIsNoPreviewAvailableForThisAttachment: null,
|
thereIsNoPreviewAvailableForThisAttachment: null,
|
||||||
time: 'Vaqt',
|
time: 'Vaqt',
|
||||||
title: 'Sarlavha',
|
title: 'Sarlavha',
|
||||||
@@ -285,6 +293,7 @@ export default {
|
|||||||
uploadFailedNotEnoughStorageSpace: null,
|
uploadFailedNotEnoughStorageSpace: null,
|
||||||
uploadedImages: null,
|
uploadedImages: null,
|
||||||
url: null,
|
url: null,
|
||||||
|
useSecureConnection: null,
|
||||||
userActions_title: 'Foydalanuvchi Amallari',
|
userActions_title: 'Foydalanuvchi Amallari',
|
||||||
userAddedCardToList: null,
|
userAddedCardToList: null,
|
||||||
userAddedThisCardToList: "Ushbu kartani {{list}} ga<0>{{user}}</0> qo'shdi",
|
userAddedThisCardToList: "Ushbu kartani {{list}} ga<0>{{user}}</0> qo'shdi",
|
||||||
@@ -422,6 +431,7 @@ export default {
|
|||||||
restoreToList: null,
|
restoreToList: null,
|
||||||
returnToBoard: null,
|
returnToBoard: null,
|
||||||
save: 'Saqlash',
|
save: 'Saqlash',
|
||||||
|
sendTestEmail: null,
|
||||||
showActive: null,
|
showActive: null,
|
||||||
showAllAttachments: "Barcha ilovalarni ko'rsatish ({{hidden}} yashirilgan)",
|
showAllAttachments: "Barcha ilovalarni ko'rsatish ({{hidden}} yashirilgan)",
|
||||||
showCardsWithThisUser: null,
|
showCardsWithThisUser: null,
|
||||||
|
|||||||
@@ -98,6 +98,7 @@ export default {
|
|||||||
cardsOnThisListAreCompleteAndReadyToBeArchived: '此列表中的卡片已完成并准备归档',
|
cardsOnThisListAreCompleteAndReadyToBeArchived: '此列表中的卡片已完成并准备归档',
|
||||||
cardsOnThisListAreReadyToBeWorkedOn: '此列表中的卡片已准备就绪可开始工作',
|
cardsOnThisListAreReadyToBeWorkedOn: '此列表中的卡片已准备就绪可开始工作',
|
||||||
clickHereOrRefreshPageToUpdate: '<0>点击此处</0>或刷新页面更新',
|
clickHereOrRefreshPageToUpdate: '<0>点击此处</0>或刷新页面更新',
|
||||||
|
clientHostnameInEhlo: null,
|
||||||
closed: '已关闭',
|
closed: '已关闭',
|
||||||
color: '颜色',
|
color: '颜色',
|
||||||
comments: '评论',
|
comments: '评论',
|
||||||
@@ -120,6 +121,7 @@ export default {
|
|||||||
date: '日期',
|
date: '日期',
|
||||||
deactivateUser_title: '停用用户',
|
deactivateUser_title: '停用用户',
|
||||||
defaultCardType_title: '默认卡片类型',
|
defaultCardType_title: '默认卡片类型',
|
||||||
|
defaultFrom: null,
|
||||||
defaultView_title: '默认视图',
|
defaultView_title: '默认视图',
|
||||||
deleteAllBoardsToBeAbleToDeleteThisProject: '删除所有面板后方可删除此项目',
|
deleteAllBoardsToBeAbleToDeleteThisProject: '删除所有面板后方可删除此项目',
|
||||||
deleteAttachment_title: '删除附件',
|
deleteAttachment_title: '删除附件',
|
||||||
@@ -183,6 +185,7 @@ export default {
|
|||||||
grid: '网格',
|
grid: '网格',
|
||||||
hideCompletedTasks: null,
|
hideCompletedTasks: null,
|
||||||
hideFromProjectListAndFavorites: '从项目列表和收藏中隐藏',
|
hideFromProjectListAndFavorites: '从项目列表和收藏中隐藏',
|
||||||
|
host: null,
|
||||||
hours: '小时',
|
hours: '小时',
|
||||||
importBoard_title: '导入面板',
|
importBoard_title: '导入面板',
|
||||||
invalidCurrentPassword: '当前密码错误',
|
invalidCurrentPassword: '当前密码错误',
|
||||||
@@ -226,9 +229,11 @@ export default {
|
|||||||
optional_inline: '可选的',
|
optional_inline: '可选的',
|
||||||
organization: '组织机构',
|
organization: '组织机构',
|
||||||
others: '其他',
|
others: '其他',
|
||||||
|
passwordIsSet: null,
|
||||||
phone: '电话',
|
phone: '电话',
|
||||||
plankaUsesAppriseToSendNotificationsToOver100PopularServices:
|
plankaUsesAppriseToSendNotificationsToOver100PopularServices:
|
||||||
'PLANKA使用<1><0>Apprise</0></1>向100多个流行服务发送通知',
|
'PLANKA使用<1><0>Apprise</0></1>向100多个流行服务发送通知',
|
||||||
|
port: null,
|
||||||
preferences: '偏好',
|
preferences: '偏好',
|
||||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||||
'提示: 按下 Ctrl-V (Mac: Cmd-V) 从剪切板添加附件',
|
'提示: 按下 Ctrl-V (Mac: Cmd-V) 从剪切板添加附件',
|
||||||
@@ -237,6 +242,7 @@ export default {
|
|||||||
projectNotFound_title: '项目未找到',
|
projectNotFound_title: '项目未找到',
|
||||||
projectOwner: '项目所有者',
|
projectOwner: '项目所有者',
|
||||||
referenceDataAndKnowledgeStorage: '参考数据和知识存储',
|
referenceDataAndKnowledgeStorage: '参考数据和知识存储',
|
||||||
|
rejectUnauthorizedTlsCertificates: null,
|
||||||
removeManager_title: '删除管理员',
|
removeManager_title: '删除管理员',
|
||||||
removeMember_title: '删除成员',
|
removeMember_title: '删除成员',
|
||||||
role: '角色',
|
role: '角色',
|
||||||
@@ -263,6 +269,7 @@ export default {
|
|||||||
shared: '共享',
|
shared: '共享',
|
||||||
sharedWithMe_title: '与我共享',
|
sharedWithMe_title: '与我共享',
|
||||||
showOnFrontOfCard: '在卡片正面显示',
|
showOnFrontOfCard: '在卡片正面显示',
|
||||||
|
smtp: null,
|
||||||
sortList_title: '排序列表',
|
sortList_title: '排序列表',
|
||||||
stopwatch: '计时器',
|
stopwatch: '计时器',
|
||||||
story: '故事',
|
story: '故事',
|
||||||
@@ -274,6 +281,7 @@ export default {
|
|||||||
taskList_title: '任务列表',
|
taskList_title: '任务列表',
|
||||||
team: '团队',
|
team: '团队',
|
||||||
terms: null,
|
terms: null,
|
||||||
|
testLog_title: null,
|
||||||
thereIsNoPreviewAvailableForThisAttachment: '此附件无法预览',
|
thereIsNoPreviewAvailableForThisAttachment: '此附件无法预览',
|
||||||
time: '时间',
|
time: '时间',
|
||||||
title: '标题',
|
title: '标题',
|
||||||
@@ -287,6 +295,7 @@ export default {
|
|||||||
uploadFailedNotEnoughStorageSpace: null,
|
uploadFailedNotEnoughStorageSpace: null,
|
||||||
uploadedImages: '已上传图片',
|
uploadedImages: '已上传图片',
|
||||||
url: '网址',
|
url: '网址',
|
||||||
|
useSecureConnection: null,
|
||||||
userActions_title: '用户操作',
|
userActions_title: '用户操作',
|
||||||
userAddedCardToList: '<0>{{user}}</0> 将 <2>{{card}}</2> 添加到 {{list}}',
|
userAddedCardToList: '<0>{{user}}</0> 将 <2>{{card}}</2> 添加到 {{list}}',
|
||||||
userAddedThisCardToList: '<0>{{user}}</0> 向列表 {{list}} 添加了该卡片',
|
userAddedThisCardToList: '<0>{{user}}</0> 向列表 {{list}} 添加了该卡片',
|
||||||
@@ -424,6 +433,7 @@ export default {
|
|||||||
restoreToList: '恢复到 {{list}}',
|
restoreToList: '恢复到 {{list}}',
|
||||||
returnToBoard: '返回面板',
|
returnToBoard: '返回面板',
|
||||||
save: '保存',
|
save: '保存',
|
||||||
|
sendTestEmail: null,
|
||||||
showActive: '显示活跃',
|
showActive: '显示活跃',
|
||||||
showAllAttachments: '显示所有的附件 ({{hidden}} 隐藏)',
|
showAllAttachments: '显示所有的附件 ({{hidden}} 隐藏)',
|
||||||
showCardsWithThisUser: '显示包含此用户的卡片',
|
showCardsWithThisUser: '显示包含此用户的卡片',
|
||||||
|
|||||||
@@ -95,6 +95,7 @@ export default {
|
|||||||
cardsOnThisListAreCompleteAndReadyToBeArchived: null,
|
cardsOnThisListAreCompleteAndReadyToBeArchived: null,
|
||||||
cardsOnThisListAreReadyToBeWorkedOn: null,
|
cardsOnThisListAreReadyToBeWorkedOn: null,
|
||||||
clickHereOrRefreshPageToUpdate: null,
|
clickHereOrRefreshPageToUpdate: null,
|
||||||
|
clientHostnameInEhlo: null,
|
||||||
closed: null,
|
closed: null,
|
||||||
color: '顏色',
|
color: '顏色',
|
||||||
comments: null,
|
comments: null,
|
||||||
@@ -117,6 +118,7 @@ export default {
|
|||||||
date: '日期',
|
date: '日期',
|
||||||
deactivateUser_title: null,
|
deactivateUser_title: null,
|
||||||
defaultCardType_title: null,
|
defaultCardType_title: null,
|
||||||
|
defaultFrom: null,
|
||||||
defaultView_title: null,
|
defaultView_title: null,
|
||||||
deleteAllBoardsToBeAbleToDeleteThisProject: null,
|
deleteAllBoardsToBeAbleToDeleteThisProject: null,
|
||||||
deleteAttachment_title: '刪除附件',
|
deleteAttachment_title: '刪除附件',
|
||||||
@@ -180,6 +182,7 @@ export default {
|
|||||||
grid: null,
|
grid: null,
|
||||||
hideCompletedTasks: null,
|
hideCompletedTasks: null,
|
||||||
hideFromProjectListAndFavorites: null,
|
hideFromProjectListAndFavorites: null,
|
||||||
|
host: null,
|
||||||
hours: '小時',
|
hours: '小時',
|
||||||
importBoard_title: '導入看板',
|
importBoard_title: '導入看板',
|
||||||
invalidCurrentPassword: '當前密碼錯誤',
|
invalidCurrentPassword: '當前密碼錯誤',
|
||||||
@@ -223,8 +226,10 @@ export default {
|
|||||||
optional_inline: '可選的',
|
optional_inline: '可選的',
|
||||||
organization: '組織機構',
|
organization: '組織機構',
|
||||||
others: null,
|
others: null,
|
||||||
|
passwordIsSet: null,
|
||||||
phone: '電話',
|
phone: '電話',
|
||||||
plankaUsesAppriseToSendNotificationsToOver100PopularServices: null,
|
plankaUsesAppriseToSendNotificationsToOver100PopularServices: null,
|
||||||
|
port: null,
|
||||||
preferences: '偏好設定',
|
preferences: '偏好設定',
|
||||||
pressPasteShortcutToAddAttachmentFromClipboard:
|
pressPasteShortcutToAddAttachmentFromClipboard:
|
||||||
'提示: 按下 Ctrl-V (Mac: Cmd-V) 從剪貼簿添加附件',
|
'提示: 按下 Ctrl-V (Mac: Cmd-V) 從剪貼簿添加附件',
|
||||||
@@ -233,6 +238,7 @@ export default {
|
|||||||
projectNotFound_title: '專案未找到',
|
projectNotFound_title: '專案未找到',
|
||||||
projectOwner: null,
|
projectOwner: null,
|
||||||
referenceDataAndKnowledgeStorage: null,
|
referenceDataAndKnowledgeStorage: null,
|
||||||
|
rejectUnauthorizedTlsCertificates: null,
|
||||||
removeManager_title: '刪除管理員',
|
removeManager_title: '刪除管理員',
|
||||||
removeMember_title: '刪除成員',
|
removeMember_title: '刪除成員',
|
||||||
role: null,
|
role: null,
|
||||||
@@ -259,6 +265,7 @@ export default {
|
|||||||
shared: null,
|
shared: null,
|
||||||
sharedWithMe_title: null,
|
sharedWithMe_title: null,
|
||||||
showOnFrontOfCard: null,
|
showOnFrontOfCard: null,
|
||||||
|
smtp: null,
|
||||||
sortList_title: null,
|
sortList_title: null,
|
||||||
stopwatch: '碼表',
|
stopwatch: '碼表',
|
||||||
story: null,
|
story: null,
|
||||||
@@ -270,6 +277,7 @@ export default {
|
|||||||
taskList_title: null,
|
taskList_title: null,
|
||||||
team: null,
|
team: null,
|
||||||
terms: null,
|
terms: null,
|
||||||
|
testLog_title: null,
|
||||||
thereIsNoPreviewAvailableForThisAttachment: '此附件無法預覽',
|
thereIsNoPreviewAvailableForThisAttachment: '此附件無法預覽',
|
||||||
time: '時間',
|
time: '時間',
|
||||||
title: '標題',
|
title: '標題',
|
||||||
@@ -283,6 +291,7 @@ export default {
|
|||||||
uploadFailedNotEnoughStorageSpace: null,
|
uploadFailedNotEnoughStorageSpace: null,
|
||||||
uploadedImages: null,
|
uploadedImages: null,
|
||||||
url: null,
|
url: null,
|
||||||
|
useSecureConnection: null,
|
||||||
userActions_title: '使用者操作',
|
userActions_title: '使用者操作',
|
||||||
userAddedCardToList: null,
|
userAddedCardToList: null,
|
||||||
userAddedThisCardToList: '<0>{{user}}</0> 向列表 {{list}} 添加了該卡片',
|
userAddedThisCardToList: '<0>{{user}}</0> 向列表 {{list}} 添加了該卡片',
|
||||||
@@ -419,6 +428,7 @@ export default {
|
|||||||
restoreToList: null,
|
restoreToList: null,
|
||||||
returnToBoard: null,
|
returnToBoard: null,
|
||||||
save: '保存',
|
save: '保存',
|
||||||
|
sendTestEmail: null,
|
||||||
showActive: null,
|
showActive: null,
|
||||||
showAllAttachments: '顯示所有附件 ({{hidden}} 隱藏)',
|
showAllAttachments: '顯示所有附件 ({{hidden}} 隱藏)',
|
||||||
showCardsWithThisUser: null,
|
showCardsWithThisUser: null,
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import ActionTypes from '../constants/ActionTypes';
|
|||||||
|
|
||||||
const initialState = {
|
const initialState = {
|
||||||
isInitializing: true,
|
isInitializing: true,
|
||||||
config: null,
|
bootstrap: null,
|
||||||
};
|
};
|
||||||
|
|
||||||
// eslint-disable-next-line default-param-last
|
// eslint-disable-next-line default-param-last
|
||||||
@@ -16,13 +16,13 @@ export default (state = initialState, { type, payload }) => {
|
|||||||
case ActionTypes.SOCKET_RECONNECT_HANDLE:
|
case ActionTypes.SOCKET_RECONNECT_HANDLE:
|
||||||
return {
|
return {
|
||||||
...state,
|
...state,
|
||||||
config: payload.config,
|
bootstrap: payload.bootstrap,
|
||||||
};
|
};
|
||||||
case ActionTypes.LOGIN_INITIALIZE:
|
case ActionTypes.LOGIN_INITIALIZE:
|
||||||
return {
|
return {
|
||||||
...state,
|
...state,
|
||||||
isInitializing: false,
|
isInitializing: false,
|
||||||
config: payload.config,
|
bootstrap: payload.bootstrap,
|
||||||
};
|
};
|
||||||
case ActionTypes.AUTHENTICATE__SUCCESS:
|
case ActionTypes.AUTHENTICATE__SUCCESS:
|
||||||
case ActionTypes.WITH_OIDC_AUTHENTICATE__SUCCESS:
|
case ActionTypes.WITH_OIDC_AUTHENTICATE__SUCCESS:
|
||||||
@@ -36,16 +36,16 @@ export default (state = initialState, { type, payload }) => {
|
|||||||
...state,
|
...state,
|
||||||
isInitializing: false,
|
isInitializing: false,
|
||||||
};
|
};
|
||||||
case ActionTypes.CORE_INITIALIZE__CONFIG_FETCH:
|
case ActionTypes.CORE_INITIALIZE__BOOTSTRAP_FETCH:
|
||||||
return {
|
return {
|
||||||
...state,
|
...state,
|
||||||
config: payload.config,
|
bootstrap: payload.bootstrap,
|
||||||
};
|
};
|
||||||
case ActionTypes.USER_UPDATE_HANDLE:
|
case ActionTypes.USER_UPDATE_HANDLE:
|
||||||
if (payload.config) {
|
if (payload.bootstrap) {
|
||||||
return {
|
return {
|
||||||
...state,
|
...state,
|
||||||
config: payload.config,
|
bootstrap: payload.bootstrap,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ const initialState = {
|
|||||||
isFavoritesEnabled: false,
|
isFavoritesEnabled: false,
|
||||||
isEditModeEnabled: false,
|
isEditModeEnabled: false,
|
||||||
modal: null,
|
modal: null,
|
||||||
|
config: null,
|
||||||
boardId: null,
|
boardId: null,
|
||||||
cardId: null,
|
cardId: null,
|
||||||
recentCardId: null,
|
recentCardId: null,
|
||||||
@@ -70,13 +71,30 @@ export default (state = initialState, { type, payload }) => {
|
|||||||
...state,
|
...state,
|
||||||
isContentFetching: true,
|
isContentFetching: true,
|
||||||
};
|
};
|
||||||
case ActionTypes.CORE_INITIALIZE:
|
case ActionTypes.SOCKET_RECONNECT_HANDLE:
|
||||||
return {
|
case ActionTypes.USER_UPDATE_HANDLE:
|
||||||
|
if (payload.config) {
|
||||||
|
return {
|
||||||
|
...state,
|
||||||
|
config: payload.config,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return state;
|
||||||
|
case ActionTypes.CORE_INITIALIZE: {
|
||||||
|
const nextState = {
|
||||||
...state,
|
...state,
|
||||||
isFavoritesEnabled: payload.user.enableFavoritesByDefault,
|
isFavoritesEnabled: payload.user.enableFavoritesByDefault,
|
||||||
homeView: payload.user.defaultHomeView,
|
homeView: payload.user.defaultHomeView,
|
||||||
projectsOrder: payload.user.defaultProjectsOrder,
|
projectsOrder: payload.user.defaultProjectsOrder,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if (payload.config) {
|
||||||
|
nextState.config = payload.config;
|
||||||
|
}
|
||||||
|
|
||||||
|
return nextState;
|
||||||
|
}
|
||||||
case ActionTypes.FAVORITES_TOGGLE:
|
case ActionTypes.FAVORITES_TOGGLE:
|
||||||
return {
|
return {
|
||||||
...state,
|
...state,
|
||||||
@@ -102,6 +120,27 @@ export default (state = initialState, { type, payload }) => {
|
|||||||
...state,
|
...state,
|
||||||
modal: payload,
|
modal: payload,
|
||||||
};
|
};
|
||||||
|
case ActionTypes.CONFIG_UPDATE:
|
||||||
|
return {
|
||||||
|
...state,
|
||||||
|
config: {
|
||||||
|
...state.config,
|
||||||
|
...payload.data,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
case ActionTypes.CONFIG_UPDATE__SUCCESS:
|
||||||
|
return {
|
||||||
|
...state,
|
||||||
|
config: {
|
||||||
|
...state.config,
|
||||||
|
...payload.config,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
case ActionTypes.CONFIG_UPDATE_HANDLE:
|
||||||
|
return {
|
||||||
|
...state,
|
||||||
|
config: payload.config,
|
||||||
|
};
|
||||||
case ActionTypes.PROJECTS_SEARCH:
|
case ActionTypes.PROJECTS_SEARCH:
|
||||||
return {
|
return {
|
||||||
...state,
|
...state,
|
||||||
|
|||||||
@@ -8,9 +8,11 @@ import { combineReducers } from 'redux';
|
|||||||
import authenticateForm from './authenticate-form';
|
import authenticateForm from './authenticate-form';
|
||||||
import userCreateForm from './user-create-form';
|
import userCreateForm from './user-create-form';
|
||||||
import projectCreateForm from './project-create-form';
|
import projectCreateForm from './project-create-form';
|
||||||
|
import smtpTest from './smtp-test';
|
||||||
|
|
||||||
export default combineReducers({
|
export default combineReducers({
|
||||||
authenticateForm,
|
authenticateForm,
|
||||||
userCreateForm,
|
userCreateForm,
|
||||||
projectCreateForm,
|
projectCreateForm,
|
||||||
|
smtpTest,
|
||||||
});
|
});
|
||||||
|
|||||||
35
client/src/reducers/ui/smtp-test.js
Normal file
35
client/src/reducers/ui/smtp-test.js
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
/*!
|
||||||
|
* Copyright (c) 2024 PLANKA Software GmbH
|
||||||
|
* Licensed under the Fair Use License: https://github.com/plankanban/planka/blob/master/LICENSE.md
|
||||||
|
*/
|
||||||
|
|
||||||
|
import ActionTypes from '../../constants/ActionTypes';
|
||||||
|
|
||||||
|
const initialState = {
|
||||||
|
isLoading: false,
|
||||||
|
logs: null,
|
||||||
|
error: null,
|
||||||
|
};
|
||||||
|
|
||||||
|
// eslint-disable-next-line default-param-last
|
||||||
|
export default (state = initialState, { type, payload }) => {
|
||||||
|
switch (type) {
|
||||||
|
case ActionTypes.SMTP_CONFIG_TEST:
|
||||||
|
return {
|
||||||
|
...state,
|
||||||
|
isLoading: true,
|
||||||
|
};
|
||||||
|
case ActionTypes.SMTP_CONFIG_TEST__SUCCESS:
|
||||||
|
return {
|
||||||
|
...initialState,
|
||||||
|
logs: payload.logs,
|
||||||
|
};
|
||||||
|
case ActionTypes.SMTP_CONFIG_TEST__FAILURE:
|
||||||
|
return {
|
||||||
|
...initialState,
|
||||||
|
error: payload.error,
|
||||||
|
};
|
||||||
|
default:
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -21,14 +21,14 @@ export default function* coreSaga() {
|
|||||||
|
|
||||||
yield take(ActionTypes.LOGOUT);
|
yield take(ActionTypes.LOGOUT);
|
||||||
|
|
||||||
const oidcConfig = yield select(selectors.selectOidcConfig);
|
const oidcBootstrap = yield select(selectors.selectOidcBootstrap);
|
||||||
|
|
||||||
if (oidcConfig && oidcConfig.endSessionUrl !== null) {
|
if (oidcBootstrap && oidcBootstrap.endSessionUrl !== null) {
|
||||||
const currentUser = yield select(selectors.selectCurrentUser);
|
const currentUser = yield select(selectors.selectCurrentUser);
|
||||||
|
|
||||||
if (!currentUser || currentUser.isSsoUser) {
|
if (!currentUser || currentUser.isSsoUser) {
|
||||||
// Redirect the user to the IDP to log out.
|
// Redirect the user to the IDP to log out.
|
||||||
window.location.href = oidcConfig.endSessionUrl;
|
window.location.href = oidcBootstrap.endSessionUrl;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,8 +18,11 @@ export function* fetchCore() {
|
|||||||
included: { notificationServices: notificationServices1 },
|
included: { notificationServices: notificationServices1 },
|
||||||
} = yield call(request, api.getCurrentUser, true);
|
} = yield call(request, api.getCurrentUser, true);
|
||||||
|
|
||||||
|
let config;
|
||||||
let webhooks;
|
let webhooks;
|
||||||
|
|
||||||
if (user.role === UserRoles.ADMIN) {
|
if (user.role === UserRoles.ADMIN) {
|
||||||
|
({ item: config } = yield call(request, api.getConfig));
|
||||||
({ items: webhooks } = yield call(request, api.getWebhooks));
|
({ items: webhooks } = yield call(request, api.getWebhooks));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -105,6 +108,7 @@ export function* fetchCore() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
config,
|
||||||
user,
|
user,
|
||||||
board,
|
board,
|
||||||
webhooks,
|
webhooks,
|
||||||
|
|||||||
49
client/src/sagas/core/services/config.js
Normal file
49
client/src/sagas/core/services/config.js
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
/*!
|
||||||
|
* Copyright (c) 2024 PLANKA Software GmbH
|
||||||
|
* Licensed under the Fair Use License: https://github.com/plankanban/planka/blob/master/LICENSE.md
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { call, put } from 'redux-saga/effects';
|
||||||
|
|
||||||
|
import request from '../request';
|
||||||
|
import actions from '../../../actions';
|
||||||
|
import api from '../../../api';
|
||||||
|
|
||||||
|
export function* updateConfig(data) {
|
||||||
|
yield put(actions.updateConfig(data));
|
||||||
|
|
||||||
|
let config;
|
||||||
|
try {
|
||||||
|
({ item: config } = yield call(request, api.updateConfig, data));
|
||||||
|
} catch (error) {
|
||||||
|
yield put(actions.updateConfig.failure(error));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
yield put(actions.updateConfig.success(config));
|
||||||
|
}
|
||||||
|
|
||||||
|
export function* handleConfigUpdate(config) {
|
||||||
|
yield put(actions.handleConfigUpdate(config));
|
||||||
|
}
|
||||||
|
|
||||||
|
export function* testSmtpConfig() {
|
||||||
|
yield put(actions.testSmtpConfig());
|
||||||
|
|
||||||
|
let logs;
|
||||||
|
try {
|
||||||
|
({
|
||||||
|
included: { logs },
|
||||||
|
} = yield call(request, api.testSmtpConfig));
|
||||||
|
} catch (error) {
|
||||||
|
yield put(actions.testSmtpConfig.failure(error));
|
||||||
|
}
|
||||||
|
|
||||||
|
yield put(actions.testSmtpConfig.success(logs));
|
||||||
|
}
|
||||||
|
|
||||||
|
export default {
|
||||||
|
updateConfig,
|
||||||
|
handleConfigUpdate,
|
||||||
|
testSmtpConfig,
|
||||||
|
};
|
||||||
@@ -14,11 +14,12 @@ import i18n from '../../../i18n';
|
|||||||
import { removeAccessToken } from '../../../utils/access-token-storage';
|
import { removeAccessToken } from '../../../utils/access-token-storage';
|
||||||
|
|
||||||
export function* initializeCore() {
|
export function* initializeCore() {
|
||||||
const { item: config } = yield call(request, api.getConfig); // TODO: handle error
|
const { item: bootstrap } = yield call(request, api.getBootstrap); // TODO: handle error
|
||||||
|
|
||||||
yield put(actions.initializeCore.fetchConfig(config));
|
yield put(actions.initializeCore.fetchBootstrap(bootstrap));
|
||||||
|
|
||||||
const {
|
const {
|
||||||
|
config,
|
||||||
user,
|
user,
|
||||||
board,
|
board,
|
||||||
webhooks,
|
webhooks,
|
||||||
@@ -49,6 +50,7 @@ export function* initializeCore() {
|
|||||||
|
|
||||||
yield put(
|
yield put(
|
||||||
actions.initializeCore(
|
actions.initializeCore(
|
||||||
|
config,
|
||||||
user,
|
user,
|
||||||
board,
|
board,
|
||||||
webhooks,
|
webhooks,
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import router from './router';
|
|||||||
import socket from './socket';
|
import socket from './socket';
|
||||||
import core from './core';
|
import core from './core';
|
||||||
import modals from './modals';
|
import modals from './modals';
|
||||||
|
import config from './config';
|
||||||
import webhooks from './webhooks';
|
import webhooks from './webhooks';
|
||||||
import users from './users';
|
import users from './users';
|
||||||
import projects from './projects';
|
import projects from './projects';
|
||||||
@@ -34,6 +35,7 @@ export default {
|
|||||||
...socket,
|
...socket,
|
||||||
...core,
|
...core,
|
||||||
...modals,
|
...modals,
|
||||||
|
...config,
|
||||||
...webhooks,
|
...webhooks,
|
||||||
...users,
|
...users,
|
||||||
...projects,
|
...projects,
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ export function* handleSocketReconnect() {
|
|||||||
|
|
||||||
yield put(actions.handleSocketReconnect.fetchCore(currentUserId, boardId));
|
yield put(actions.handleSocketReconnect.fetchCore(currentUserId, boardId));
|
||||||
|
|
||||||
|
let bootstrap;
|
||||||
let config;
|
let config;
|
||||||
let user;
|
let user;
|
||||||
let board;
|
let board;
|
||||||
@@ -47,7 +48,7 @@ export function* handleSocketReconnect() {
|
|||||||
let notificationServices;
|
let notificationServices;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
({ item: config } = yield call(request, api.getConfig));
|
({ item: bootstrap } = yield call(request, api.getBootstrap));
|
||||||
|
|
||||||
({
|
({
|
||||||
user,
|
user,
|
||||||
@@ -80,6 +81,7 @@ export function* handleSocketReconnect() {
|
|||||||
|
|
||||||
yield put(
|
yield put(
|
||||||
actions.handleSocketReconnect(
|
actions.handleSocketReconnect(
|
||||||
|
bootstrap,
|
||||||
config,
|
config,
|
||||||
user,
|
user,
|
||||||
board,
|
board,
|
||||||
|
|||||||
@@ -68,6 +68,7 @@ export function* handleUserUpdate(user) {
|
|||||||
const currentUser = yield select(selectors.selectCurrentUser);
|
const currentUser = yield select(selectors.selectCurrentUser);
|
||||||
const isCurrentUser = user.id === currentUser.id;
|
const isCurrentUser = user.id === currentUser.id;
|
||||||
|
|
||||||
|
let bootstrap;
|
||||||
let config;
|
let config;
|
||||||
let board;
|
let board;
|
||||||
let webhooks;
|
let webhooks;
|
||||||
@@ -102,6 +103,7 @@ export function* handleUserUpdate(user) {
|
|||||||
({ items: users1 } = yield call(request, api.getUsers));
|
({ items: users1 } = yield call(request, api.getUsers));
|
||||||
|
|
||||||
if (user.role === UserRoles.ADMIN) {
|
if (user.role === UserRoles.ADMIN) {
|
||||||
|
({ item: bootstrap } = yield call(request, api.getBootstrap));
|
||||||
({ item: config } = yield call(request, api.getConfig));
|
({ item: config } = yield call(request, api.getConfig));
|
||||||
({ items: webhooks } = yield call(request, api.getWebhooks));
|
({ items: webhooks } = yield call(request, api.getWebhooks));
|
||||||
|
|
||||||
@@ -164,6 +166,7 @@ export function* handleUserUpdate(user) {
|
|||||||
user,
|
user,
|
||||||
projectIds,
|
projectIds,
|
||||||
boardIds,
|
boardIds,
|
||||||
|
bootstrap,
|
||||||
config,
|
config,
|
||||||
board,
|
board,
|
||||||
webhooks,
|
webhooks,
|
||||||
@@ -248,10 +251,10 @@ export function* updateUserPassword(id, data) {
|
|||||||
yield put(actions.updateUserPassword(id, data));
|
yield put(actions.updateUserPassword(id, data));
|
||||||
|
|
||||||
let user;
|
let user;
|
||||||
let accessTokens;
|
let accessToken;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
({ item: user, included: { accessTokens } = {} } = yield call(
|
({ item: user, included: { accessToken } = {} } = yield call(
|
||||||
request,
|
request,
|
||||||
api.updateUserPassword,
|
api.updateUserPassword,
|
||||||
id,
|
id,
|
||||||
@@ -262,8 +265,6 @@ export function* updateUserPassword(id, data) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const accessToken = accessTokens && accessTokens[0];
|
|
||||||
|
|
||||||
if (accessToken) {
|
if (accessToken) {
|
||||||
yield call(setAccessToken, accessToken);
|
yield call(setAccessToken, accessToken);
|
||||||
}
|
}
|
||||||
|
|||||||
21
client/src/sagas/core/watchers/config.js
Normal file
21
client/src/sagas/core/watchers/config.js
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
/*!
|
||||||
|
* Copyright (c) 2024 PLANKA Software GmbH
|
||||||
|
* Licensed under the Fair Use License: https://github.com/plankanban/planka/blob/master/LICENSE.md
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { all, takeEvery } from 'redux-saga/effects';
|
||||||
|
|
||||||
|
import services from '../services';
|
||||||
|
import EntryActionTypes from '../../../constants/EntryActionTypes';
|
||||||
|
|
||||||
|
export default function* configWatchers() {
|
||||||
|
yield all([
|
||||||
|
takeEvery(EntryActionTypes.CONFIG_UPDATE, ({ payload: { data } }) =>
|
||||||
|
services.updateConfig(data),
|
||||||
|
),
|
||||||
|
takeEvery(EntryActionTypes.CONFIG_UPDATE_HANDLE, ({ payload: { config } }) =>
|
||||||
|
services.handleConfigUpdate(config),
|
||||||
|
),
|
||||||
|
takeEvery(EntryActionTypes.SMTP_CONFIG_TEST, () => services.testSmtpConfig()),
|
||||||
|
]);
|
||||||
|
}
|
||||||
@@ -7,6 +7,7 @@ import router from './router';
|
|||||||
import socket from './socket';
|
import socket from './socket';
|
||||||
import core from './core';
|
import core from './core';
|
||||||
import modals from './modals';
|
import modals from './modals';
|
||||||
|
import config from './config';
|
||||||
import webhooks from './webhooks';
|
import webhooks from './webhooks';
|
||||||
import users from './users';
|
import users from './users';
|
||||||
import projects from './projects';
|
import projects from './projects';
|
||||||
@@ -34,6 +35,7 @@ export default [
|
|||||||
socket,
|
socket,
|
||||||
core,
|
core,
|
||||||
modals,
|
modals,
|
||||||
|
config,
|
||||||
webhooks,
|
webhooks,
|
||||||
users,
|
users,
|
||||||
projects,
|
projects,
|
||||||
|
|||||||
@@ -29,6 +29,18 @@ const createSocketEventsChannel = () =>
|
|||||||
emit(entryActions.handleConfigUpdate(item));
|
emit(entryActions.handleConfigUpdate(item));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const handleWebhookCreate = ({ item }) => {
|
||||||
|
emit(entryActions.handleWebhookCreate(item));
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleWebhookUpdate = ({ item }) => {
|
||||||
|
emit(entryActions.handleWebhookUpdate(item));
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleWebhookDelete = ({ item }) => {
|
||||||
|
emit(entryActions.handleWebhookDelete(item));
|
||||||
|
};
|
||||||
|
|
||||||
const handleUserCreate = ({ item }) => {
|
const handleUserCreate = ({ item }) => {
|
||||||
emit(entryActions.handleUserCreate(item));
|
emit(entryActions.handleUserCreate(item));
|
||||||
};
|
};
|
||||||
@@ -280,6 +292,10 @@ const createSocketEventsChannel = () =>
|
|||||||
|
|
||||||
socket.on('configUpdate', handleConfigUpdate);
|
socket.on('configUpdate', handleConfigUpdate);
|
||||||
|
|
||||||
|
socket.on('webhookCreate', handleWebhookCreate);
|
||||||
|
socket.on('webhookUpdate', handleWebhookUpdate);
|
||||||
|
socket.on('webhookDelete', handleWebhookDelete);
|
||||||
|
|
||||||
socket.on('userCreate', handleUserCreate);
|
socket.on('userCreate', handleUserCreate);
|
||||||
socket.on('userUpdate', handleUserUpdate);
|
socket.on('userUpdate', handleUserUpdate);
|
||||||
socket.on('userDelete', handleUserDelete);
|
socket.on('userDelete', handleUserDelete);
|
||||||
@@ -370,6 +386,10 @@ const createSocketEventsChannel = () =>
|
|||||||
|
|
||||||
socket.off('configUpdate', handleConfigUpdate);
|
socket.off('configUpdate', handleConfigUpdate);
|
||||||
|
|
||||||
|
socket.off('webhookCreate', handleWebhookCreate);
|
||||||
|
socket.off('webhookUpdate', handleWebhookUpdate);
|
||||||
|
socket.off('webhookDelete', handleWebhookDelete);
|
||||||
|
|
||||||
socket.off('userCreate', handleUserCreate);
|
socket.off('userCreate', handleUserCreate);
|
||||||
socket.off('userUpdate', handleUserUpdate);
|
socket.off('userUpdate', handleUserUpdate);
|
||||||
socket.off('userDelete', handleUserDelete);
|
socket.off('userDelete', handleUserDelete);
|
||||||
|
|||||||
@@ -16,9 +16,9 @@ import Paths from '../../../constants/Paths';
|
|||||||
import AccessTokenSteps from '../../../constants/AccessTokenSteps';
|
import AccessTokenSteps from '../../../constants/AccessTokenSteps';
|
||||||
|
|
||||||
export function* initializeLogin() {
|
export function* initializeLogin() {
|
||||||
const { item: config } = yield call(api.getConfig); // TODO: handle error
|
const { item: bootstrap } = yield call(api.getBootstrap); // TODO: handle error
|
||||||
|
|
||||||
yield put(actions.initializeLogin(config));
|
yield put(actions.initializeLogin(bootstrap));
|
||||||
}
|
}
|
||||||
|
|
||||||
export function* authenticate(data) {
|
export function* authenticate(data) {
|
||||||
@@ -42,7 +42,7 @@ export function* authenticate(data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function* authenticateWithOidc() {
|
export function* authenticateWithOidc() {
|
||||||
const oidcConfig = yield select(selectors.selectOidcConfig);
|
const oidcBootstrap = yield select(selectors.selectOidcBootstrap);
|
||||||
|
|
||||||
const state = nanoid();
|
const state = nanoid();
|
||||||
window.localStorage.setItem('oidc-state', state);
|
window.localStorage.setItem('oidc-state', state);
|
||||||
@@ -50,7 +50,7 @@ export function* authenticateWithOidc() {
|
|||||||
const nonce = nanoid();
|
const nonce = nanoid();
|
||||||
window.localStorage.setItem('oidc-nonce', nonce);
|
window.localStorage.setItem('oidc-nonce', nonce);
|
||||||
|
|
||||||
let redirectUrl = `${oidcConfig.authorizationUrl}`;
|
let redirectUrl = `${oidcBootstrap.authorizationUrl}`;
|
||||||
redirectUrl += `&state=${encodeURIComponent(state)}`;
|
redirectUrl += `&state=${encodeURIComponent(state)}`;
|
||||||
redirectUrl += `&nonce=${encodeURIComponent(nonce)}`;
|
redirectUrl += `&nonce=${encodeURIComponent(nonce)}`;
|
||||||
|
|
||||||
|
|||||||
@@ -49,9 +49,9 @@ export function* handleLocationChange() {
|
|||||||
|
|
||||||
switch (pathsMatch.pattern.path) {
|
switch (pathsMatch.pattern.path) {
|
||||||
case Paths.LOGIN: {
|
case Paths.LOGIN: {
|
||||||
const oidcConfig = yield select(selectors.selectOidcConfig);
|
const oidcBootstrap = yield select(selectors.selectOidcBootstrap);
|
||||||
|
|
||||||
if (oidcConfig) {
|
if (oidcBootstrap) {
|
||||||
const params = new URLSearchParams(window.location.search);
|
const params = new URLSearchParams(window.location.search);
|
||||||
|
|
||||||
if (params.has('authenticateWithOidc')) {
|
if (params.has('authenticateWithOidc')) {
|
||||||
|
|||||||
@@ -7,11 +7,11 @@ export const selectIsSocketDisconnected = ({ socket: { isDisconnected } }) => is
|
|||||||
|
|
||||||
export const selectIsInitializing = ({ common: { isInitializing } }) => isInitializing;
|
export const selectIsInitializing = ({ common: { isInitializing } }) => isInitializing;
|
||||||
|
|
||||||
export const selectConfig = ({ common: { config } }) => config;
|
export const selectBootstrap = ({ common: { bootstrap } }) => bootstrap;
|
||||||
|
|
||||||
export const selectOidcConfig = (state) => selectConfig(state).oidc;
|
export const selectOidcBootstrap = (state) => selectBootstrap(state).oidc;
|
||||||
|
|
||||||
export const selectActiveUsersLimit = (state) => selectConfig(state).activeUsersLimit;
|
export const selectActiveUsersLimit = (state) => selectBootstrap(state).activeUsersLimit;
|
||||||
|
|
||||||
export const selectAccessToken = ({ auth: { accessToken } }) => accessToken;
|
export const selectAccessToken = ({ auth: { accessToken } }) => accessToken;
|
||||||
|
|
||||||
@@ -21,14 +21,17 @@ export const selectUserCreateForm = ({ ui: { userCreateForm } }) => userCreateFo
|
|||||||
|
|
||||||
export const selectProjectCreateForm = ({ ui: { projectCreateForm } }) => projectCreateForm;
|
export const selectProjectCreateForm = ({ ui: { projectCreateForm } }) => projectCreateForm;
|
||||||
|
|
||||||
|
export const selectSmtpTest = ({ ui: { smtpTest } }) => smtpTest;
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
selectIsSocketDisconnected,
|
selectIsSocketDisconnected,
|
||||||
selectIsInitializing,
|
selectIsInitializing,
|
||||||
selectConfig,
|
selectBootstrap,
|
||||||
selectOidcConfig,
|
selectOidcBootstrap,
|
||||||
selectActiveUsersLimit,
|
selectActiveUsersLimit,
|
||||||
selectAccessToken,
|
selectAccessToken,
|
||||||
selectAuthenticateForm,
|
selectAuthenticateForm,
|
||||||
selectUserCreateForm,
|
selectUserCreateForm,
|
||||||
selectProjectCreateForm,
|
selectProjectCreateForm,
|
||||||
|
selectSmtpTest,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -11,6 +11,8 @@ export const selectIsFavoritesEnabled = ({ core: { isFavoritesEnabled } }) => is
|
|||||||
|
|
||||||
export const selectIsEditModeEnabled = ({ core: { isEditModeEnabled } }) => isEditModeEnabled;
|
export const selectIsEditModeEnabled = ({ core: { isEditModeEnabled } }) => isEditModeEnabled;
|
||||||
|
|
||||||
|
export const selectConfig = ({ core: { config } }) => config;
|
||||||
|
|
||||||
export const selectRecentCardId = ({ core: { recentCardId } }) => recentCardId;
|
export const selectRecentCardId = ({ core: { recentCardId } }) => recentCardId;
|
||||||
|
|
||||||
export const selectPrevCardId = ({ core: { prevCardIds } }) => prevCardIds.at(-1);
|
export const selectPrevCardId = ({ core: { prevCardIds } }) => prevCardIds.at(-1);
|
||||||
@@ -29,6 +31,7 @@ export default {
|
|||||||
selectIsLogouting,
|
selectIsLogouting,
|
||||||
selectIsFavoritesEnabled,
|
selectIsFavoritesEnabled,
|
||||||
selectIsEditModeEnabled,
|
selectIsEditModeEnabled,
|
||||||
|
selectConfig,
|
||||||
selectRecentCardId,
|
selectRecentCardId,
|
||||||
selectPrevCardId,
|
selectPrevCardId,
|
||||||
selectHomeView,
|
selectHomeView,
|
||||||
|
|||||||
@@ -76,14 +76,15 @@ services:
|
|||||||
# - OIDC_ENFORCED=true
|
# - OIDC_ENFORCED=true
|
||||||
|
|
||||||
# Email Notifications (https://nodemailer.com/smtp/)
|
# Email Notifications (https://nodemailer.com/smtp/)
|
||||||
|
# These values override and disable configuration in the UI if set.
|
||||||
# - SMTP_HOST=
|
# - SMTP_HOST=
|
||||||
# - SMTP_PORT=587
|
# - SMTP_PORT=587
|
||||||
# - SMTP_NAME=
|
# - SMTP_NAME=
|
||||||
# - SMTP_SECURE=true
|
# - SMTP_SECURE=true
|
||||||
|
# - SMTP_TLS_REJECT_UNAUTHORIZED=false
|
||||||
# - SMTP_USER=
|
# - SMTP_USER=
|
||||||
# - SMTP_PASSWORD=
|
# - SMTP_PASSWORD=
|
||||||
# - SMTP_FROM="Demo Demo" <demo@demo.demo>
|
# - SMTP_FROM="Demo Demo" <demo@demo.demo>
|
||||||
# - SMTP_TLS_REJECT_UNAUTHORIZED=false
|
|
||||||
|
|
||||||
# Using Gravatar directly exposes user IPs and hashed emails to a third party (GDPR risk).
|
# Using Gravatar directly exposes user IPs and hashed emails to a third party (GDPR risk).
|
||||||
# Use a proxy you control for privacy, or leave commented out or empty to disable.
|
# Use a proxy you control for privacy, or leave commented out or empty to disable.
|
||||||
|
|||||||
@@ -94,16 +94,17 @@ services:
|
|||||||
# - OIDC_ENFORCED=true
|
# - OIDC_ENFORCED=true
|
||||||
|
|
||||||
# Email Notifications (https://nodemailer.com/smtp/)
|
# Email Notifications (https://nodemailer.com/smtp/)
|
||||||
|
# These values override and disable configuration in the UI if set.
|
||||||
# - SMTP_HOST=
|
# - SMTP_HOST=
|
||||||
# - SMTP_PORT=587
|
# - SMTP_PORT=587
|
||||||
# - SMTP_NAME=
|
# - SMTP_NAME=
|
||||||
# - SMTP_SECURE=true
|
# - SMTP_SECURE=true
|
||||||
|
# - SMTP_TLS_REJECT_UNAUTHORIZED=false
|
||||||
# - SMTP_USER=
|
# - SMTP_USER=
|
||||||
# - SMTP_PASSWORD=
|
# - SMTP_PASSWORD=
|
||||||
# Optionally store in secrets - then SMTP_PASSWORD should not be set
|
# Optionally store in secrets - then SMTP_PASSWORD should not be set
|
||||||
# - SMTP_PASSWORD__FILE=/run/secrets/smtp_password
|
# - SMTP_PASSWORD__FILE=/run/secrets/smtp_password
|
||||||
# - SMTP_FROM="Demo Demo" <demo@demo.demo>
|
# - SMTP_FROM="Demo Demo" <demo@demo.demo>
|
||||||
# - SMTP_TLS_REJECT_UNAUTHORIZED=false
|
|
||||||
|
|
||||||
# Using Gravatar directly exposes user IPs and hashed emails to a third party (GDPR risk).
|
# Using Gravatar directly exposes user IPs and hashed emails to a third party (GDPR risk).
|
||||||
# Use a proxy you control for privacy, or leave commented out or empty to disable.
|
# Use a proxy you control for privacy, or leave commented out or empty to disable.
|
||||||
|
|||||||
@@ -67,14 +67,15 @@ SECRET_KEY=notsecretkey
|
|||||||
# OIDC_ENFORCED=true
|
# OIDC_ENFORCED=true
|
||||||
|
|
||||||
# Email Notifications (https://nodemailer.com/smtp/)
|
# Email Notifications (https://nodemailer.com/smtp/)
|
||||||
|
# These values override and disable configuration in the UI if set.
|
||||||
# SMTP_HOST=
|
# SMTP_HOST=
|
||||||
# SMTP_PORT=587
|
# SMTP_PORT=587
|
||||||
# SMTP_NAME=
|
# SMTP_NAME=
|
||||||
# SMTP_SECURE=true
|
# SMTP_SECURE=true
|
||||||
|
# SMTP_TLS_REJECT_UNAUTHORIZED=false
|
||||||
# SMTP_USER=
|
# SMTP_USER=
|
||||||
# SMTP_PASSWORD=
|
# SMTP_PASSWORD=
|
||||||
# SMTP_FROM="Demo Demo" <demo@demo.demo>
|
# SMTP_FROM="Demo Demo" <demo@demo.demo>
|
||||||
# SMTP_TLS_REJECT_UNAUTHORIZED=false
|
|
||||||
|
|
||||||
# Using Gravatar directly exposes user IPs and hashed emails to a third party (GDPR risk).
|
# Using Gravatar directly exposes user IPs and hashed emails to a third party (GDPR risk).
|
||||||
# Use a proxy you control for privacy, or leave commented out or empty to disable.
|
# Use a proxy you control for privacy, or leave commented out or empty to disable.
|
||||||
|
|||||||
72
server/api/controllers/bootstrap/show.js
Normal file
72
server/api/controllers/bootstrap/show.js
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
/*!
|
||||||
|
* Copyright (c) 2024 PLANKA Software GmbH
|
||||||
|
* Licensed under the Fair Use License: https://github.com/plankanban/planka/blob/master/LICENSE.md
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @swagger
|
||||||
|
* /bootstrap:
|
||||||
|
* get:
|
||||||
|
* summary: Get application bootstrap
|
||||||
|
* description: Retrieves the application bootstrap.
|
||||||
|
* tags:
|
||||||
|
* - Bootstrap
|
||||||
|
* operationId: getBootstrap
|
||||||
|
* responses:
|
||||||
|
* 200:
|
||||||
|
* description: Bootstrap retrieved successfully
|
||||||
|
* content:
|
||||||
|
* application/json:
|
||||||
|
* schema:
|
||||||
|
* type: object
|
||||||
|
* required:
|
||||||
|
* - oidc
|
||||||
|
* - version
|
||||||
|
* properties:
|
||||||
|
* oidc:
|
||||||
|
* type: object
|
||||||
|
* required:
|
||||||
|
* - authorizationUrl
|
||||||
|
* - endSessionUrl
|
||||||
|
* - isEnforced
|
||||||
|
* nullable: true
|
||||||
|
* description: OpenID Connect configuration (null if not configured)
|
||||||
|
* properties:
|
||||||
|
* authorizationUrl:
|
||||||
|
* type: string
|
||||||
|
* format: uri
|
||||||
|
* description: OIDC authorization URL for initiating authentication
|
||||||
|
* example: https://oidc.example.com/auth
|
||||||
|
* endSessionUrl:
|
||||||
|
* type: string
|
||||||
|
* format: uri
|
||||||
|
* nullable: true
|
||||||
|
* description: OIDC end session URL for logout (null if not supported by provider)
|
||||||
|
* example: https://oidc.example.com/logout
|
||||||
|
* isEnforced:
|
||||||
|
* type: boolean
|
||||||
|
* description: Whether OIDC authentication is enforced (users must use OIDC to login)
|
||||||
|
* example: false
|
||||||
|
* activeUsersLimit:
|
||||||
|
* type: number
|
||||||
|
* nullable: true
|
||||||
|
* description: Maximum number of active users allowed (conditionally added for admins if configured)
|
||||||
|
* example: 100
|
||||||
|
* version:
|
||||||
|
* type: string
|
||||||
|
* description: Current version of the PLANKA application
|
||||||
|
* example: 2.0.0
|
||||||
|
* security: []
|
||||||
|
*/
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
async fn() {
|
||||||
|
const { currentUser } = this.req;
|
||||||
|
|
||||||
|
const oidc = await sails.hooks.oidc.getBootstrap();
|
||||||
|
|
||||||
|
return {
|
||||||
|
item: sails.helpers.bootstrap.presentOne(oidc, currentUser),
|
||||||
|
};
|
||||||
|
},
|
||||||
|
};
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
* /config:
|
* /config:
|
||||||
* get:
|
* get:
|
||||||
* summary: Get application configuration
|
* summary: Get application configuration
|
||||||
* description: Retrieves the application configuration.
|
* description: Retrieves the application configuration. Requires admin privileges.
|
||||||
* tags:
|
* tags:
|
||||||
* - Config
|
* - Config
|
||||||
* operationId: getConfig
|
* operationId: getConfig
|
||||||
@@ -24,39 +24,14 @@
|
|||||||
* properties:
|
* properties:
|
||||||
* item:
|
* item:
|
||||||
* $ref: '#/components/schemas/Config'
|
* $ref: '#/components/schemas/Config'
|
||||||
* security: []
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
async fn() {
|
async fn() {
|
||||||
const { currentUser } = this.req;
|
const config = await Config.qm.getOneMain();
|
||||||
|
|
||||||
const oidcClient = await sails.hooks.oidc.getClient();
|
|
||||||
|
|
||||||
let oidc = null;
|
|
||||||
if (oidcClient) {
|
|
||||||
const authorizationUrlParams = {
|
|
||||||
scope: sails.config.custom.oidcScopes,
|
|
||||||
};
|
|
||||||
|
|
||||||
if (!sails.config.custom.oidcUseDefaultResponseMode) {
|
|
||||||
authorizationUrlParams.response_mode = sails.config.custom.oidcResponseMode;
|
|
||||||
}
|
|
||||||
|
|
||||||
oidc = {
|
|
||||||
authorizationUrl: oidcClient.authorizationUrl(authorizationUrlParams),
|
|
||||||
endSessionUrl: oidcClient.issuer.end_session_endpoint ? oidcClient.endSessionUrl({}) : null,
|
|
||||||
isEnforced: sails.config.custom.oidcEnforced,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
item: sails.helpers.config.presentOne(
|
item: sails.helpers.config.presentOne(config),
|
||||||
{
|
|
||||||
oidc,
|
|
||||||
},
|
|
||||||
currentUser,
|
|
||||||
),
|
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
117
server/api/controllers/config/test-smtp.js
Normal file
117
server/api/controllers/config/test-smtp.js
Normal file
@@ -0,0 +1,117 @@
|
|||||||
|
/*!
|
||||||
|
* Copyright (c) 2024 PLANKA Software GmbH
|
||||||
|
* Licensed under the Fair Use License: https://github.com/plankanban/planka/blob/master/LICENSE.md
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @swagger
|
||||||
|
* /config/test-smtp:
|
||||||
|
* post:
|
||||||
|
* summary: Test SMTP configuration
|
||||||
|
* description: Sends a test email to verify the SMTP is configured correctly. Only available when SMTP is configured via the UI.
|
||||||
|
* tags:
|
||||||
|
* - Config
|
||||||
|
* operationId: testSmtpConfig
|
||||||
|
* responses:
|
||||||
|
* 200:
|
||||||
|
* description: Test email sent successfully
|
||||||
|
* content:
|
||||||
|
* application/json:
|
||||||
|
* schema:
|
||||||
|
* type: object
|
||||||
|
* required:
|
||||||
|
* - item
|
||||||
|
* properties:
|
||||||
|
* item:
|
||||||
|
* $ref: '#/components/schemas/Config'
|
||||||
|
* 401:
|
||||||
|
* $ref: '#/components/responses/Unauthorized'
|
||||||
|
* 403:
|
||||||
|
* $ref: '#/components/responses/Forbidden'
|
||||||
|
*/
|
||||||
|
|
||||||
|
const Errors = {
|
||||||
|
NOT_AVAILABLE: {
|
||||||
|
notAvailable: 'Not available',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
exits: {
|
||||||
|
notAvailable: {
|
||||||
|
responseType: 'forbidden',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
async fn() {
|
||||||
|
const { currentUser } = this.req;
|
||||||
|
|
||||||
|
if (sails.config.custom.smtpHost) {
|
||||||
|
return Errors.NOT_AVAILABLE;
|
||||||
|
}
|
||||||
|
|
||||||
|
const { transporter, config } = await sails.helpers.utils.makeSmtpTransporter({
|
||||||
|
connectionTimeout: 5000,
|
||||||
|
greetingTimeout: 5000,
|
||||||
|
socketTimeout: 10000,
|
||||||
|
dnsTimeout: 3000,
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!transporter) {
|
||||||
|
return Errors.NOT_AVAILABLE;
|
||||||
|
}
|
||||||
|
|
||||||
|
const logs = [];
|
||||||
|
try {
|
||||||
|
logs.push('📧 Sending test email...');
|
||||||
|
/* eslint-disable no-underscore-dangle */
|
||||||
|
const info = await transporter.sendMail({
|
||||||
|
to: currentUser.email,
|
||||||
|
subject: this.req.i18n.__('Test Title'),
|
||||||
|
text: this.req.i18n.__('This is a test text message!'),
|
||||||
|
html: this.req.i18n.__('This is a <i>test</i> <b>html</b> <code>message</code>!'),
|
||||||
|
});
|
||||||
|
/* eslint-enable no-underscore-dangle */
|
||||||
|
logs.push('✅ Email sent successfully!', '');
|
||||||
|
|
||||||
|
logs.push(`📬 Message ID: ${info.messageId}`);
|
||||||
|
if (info.response) {
|
||||||
|
logs.push(`📤 Server response: ${info.response.trim()}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
logs.push('', '🎉 Your configuration is working correctly!');
|
||||||
|
} catch (error) {
|
||||||
|
logs.push('❌ Failed to send email!', '');
|
||||||
|
|
||||||
|
if (error.code) {
|
||||||
|
logs.push(`⚠️ Error code: ${error.code}`);
|
||||||
|
}
|
||||||
|
logs.push(`💬 Reason: ${error.message.trim()}`);
|
||||||
|
|
||||||
|
if (error.code === 'EDNS') {
|
||||||
|
logs.push('', '💡 Hint: Check your host setting.');
|
||||||
|
} else if (error.code === 'ETIMEDOUT') {
|
||||||
|
logs.push('', '💡 Hint: Check your host and port settings.');
|
||||||
|
} else if (error.code === 'EAUTH') {
|
||||||
|
logs.push('', '💡 Hint: Check your username and password.');
|
||||||
|
} else if (error.code === 'ESOCKET') {
|
||||||
|
if (error.message.includes('ECONNREFUSED') || error.message.includes('ETIMEDOUT')) {
|
||||||
|
logs.push('', '💡 Hint: Check your host and port settings.');
|
||||||
|
} else if (error.message.includes('wrong version number')) {
|
||||||
|
logs.push('', '💡 Hint: Try toggling "Use secure connection".');
|
||||||
|
} else if (error.message.includes('certificate')) {
|
||||||
|
logs.push('', '💡 Hint: Try toggling "Reject unauthorized TLS certificates".');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
transporter.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
item: sails.helpers.config.presentOne(config),
|
||||||
|
included: {
|
||||||
|
logs,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
},
|
||||||
|
};
|
||||||
151
server/api/controllers/config/update.js
Normal file
151
server/api/controllers/config/update.js
Normal file
@@ -0,0 +1,151 @@
|
|||||||
|
/*!
|
||||||
|
* Copyright (c) 2024 PLANKA Software GmbH
|
||||||
|
* Licensed under the Fair Use License: https://github.com/plankanban/planka/blob/master/LICENSE.md
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @swagger
|
||||||
|
* /config:
|
||||||
|
* patch:
|
||||||
|
* summary: Update application configuration
|
||||||
|
* description: Updates the application configuration. Requires admin privileges.
|
||||||
|
* tags:
|
||||||
|
* - Config
|
||||||
|
* operationId: updateConfig
|
||||||
|
* requestBody:
|
||||||
|
* required: true
|
||||||
|
* content:
|
||||||
|
* application/json:
|
||||||
|
* schema:
|
||||||
|
* type: object
|
||||||
|
* properties:
|
||||||
|
* smtpHost:
|
||||||
|
* type: string
|
||||||
|
* maxLength: 256
|
||||||
|
* nullable: true
|
||||||
|
* description: Hostname or IP address of the SMTP server
|
||||||
|
* example: smtp.example.com
|
||||||
|
* smtpHost:
|
||||||
|
* type: number
|
||||||
|
* minimum: 0
|
||||||
|
* maximum: 65535
|
||||||
|
* nullable: true
|
||||||
|
* description: Port number of the SMTP server
|
||||||
|
* example: 587
|
||||||
|
* smtpName:
|
||||||
|
* type: string
|
||||||
|
* maxLength: 256
|
||||||
|
* nullable: true
|
||||||
|
* description: Client hostname used in the EHLO command for SMTP
|
||||||
|
* example: localhost
|
||||||
|
* smtpSecure:
|
||||||
|
* type: boolean
|
||||||
|
* description: Whether to use a secure connection for SMTP
|
||||||
|
* example: false
|
||||||
|
* smtpTlsRejectUnauthorized:
|
||||||
|
* type: boolean
|
||||||
|
* description: Whether to reject unauthorized or self-signed TLS certificates for SMTP connections
|
||||||
|
* example: true
|
||||||
|
* smtpUser:
|
||||||
|
* type: string
|
||||||
|
* maxLength: 256
|
||||||
|
* nullable: true
|
||||||
|
* description: Username for authenticating with the SMTP server
|
||||||
|
* example: no-reply@example.com
|
||||||
|
* smtpPassword:
|
||||||
|
* type: string
|
||||||
|
* maxLength: 256
|
||||||
|
* nullable: true
|
||||||
|
* description: Password for authenticating with the SMTP server
|
||||||
|
* example: SecurePassword123!
|
||||||
|
* smtpFrom:
|
||||||
|
* type: string
|
||||||
|
* maxLength: 256
|
||||||
|
* nullable: true
|
||||||
|
* description: Default "from" used for outgoing SMTP emails
|
||||||
|
* example: no-reply@example.com
|
||||||
|
* responses:
|
||||||
|
* 200:
|
||||||
|
* description: Configuration updated successfully
|
||||||
|
* content:
|
||||||
|
* application/json:
|
||||||
|
* schema:
|
||||||
|
* type: object
|
||||||
|
* required:
|
||||||
|
* - item
|
||||||
|
* properties:
|
||||||
|
* item:
|
||||||
|
* $ref: '#/components/schemas/Config'
|
||||||
|
*/
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
inputs: {
|
||||||
|
smtpHost: {
|
||||||
|
type: 'string',
|
||||||
|
isNotEmptyString: true,
|
||||||
|
maxLength: 256,
|
||||||
|
allowNull: true,
|
||||||
|
},
|
||||||
|
smtpPort: {
|
||||||
|
type: 'number',
|
||||||
|
min: 0,
|
||||||
|
max: 65535,
|
||||||
|
allowNull: true,
|
||||||
|
},
|
||||||
|
smtpName: {
|
||||||
|
type: 'string',
|
||||||
|
isNotEmptyString: true,
|
||||||
|
maxLength: 256,
|
||||||
|
allowNull: true,
|
||||||
|
},
|
||||||
|
smtpSecure: {
|
||||||
|
type: 'boolean',
|
||||||
|
},
|
||||||
|
smtpTlsRejectUnauthorized: {
|
||||||
|
type: 'boolean',
|
||||||
|
},
|
||||||
|
smtpUser: {
|
||||||
|
type: 'string',
|
||||||
|
isNotEmptyString: true,
|
||||||
|
maxLength: 256,
|
||||||
|
allowNull: true,
|
||||||
|
},
|
||||||
|
smtpPassword: {
|
||||||
|
type: 'string',
|
||||||
|
isNotEmptyString: true,
|
||||||
|
maxLength: 256,
|
||||||
|
allowNull: true,
|
||||||
|
},
|
||||||
|
smtpFrom: {
|
||||||
|
type: 'string',
|
||||||
|
isNotEmptyString: true,
|
||||||
|
maxLength: 256,
|
||||||
|
allowNull: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
async fn(inputs) {
|
||||||
|
const { currentUser } = this.req;
|
||||||
|
|
||||||
|
const values = _.pick(inputs, [
|
||||||
|
'smtpHost',
|
||||||
|
'smtpPort',
|
||||||
|
'smtpName',
|
||||||
|
'smtpSecure',
|
||||||
|
'smtpTlsRejectUnauthorized',
|
||||||
|
'smtpUser',
|
||||||
|
'smtpPassword',
|
||||||
|
'smtpFrom',
|
||||||
|
]);
|
||||||
|
|
||||||
|
const config = await sails.helpers.config.updateMain.with({
|
||||||
|
values,
|
||||||
|
actorUser: currentUser,
|
||||||
|
request: this.req,
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
item: sails.helpers.config.presentOne(config),
|
||||||
|
};
|
||||||
|
},
|
||||||
|
};
|
||||||
@@ -84,10 +84,17 @@ module.exports = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
await sails.helpers.notificationServices.testOne.with({
|
/* eslint-disable no-underscore-dangle */
|
||||||
record: notificationService,
|
await sails.helpers.utils.sendNotifications.with({
|
||||||
i18n: this.req.i18n,
|
services: [_.pick(notificationService, ['url', 'format'])],
|
||||||
|
title: this.req.i18n.__('Test Title'),
|
||||||
|
bodyByFormat: {
|
||||||
|
text: this.req.i18n.__('This is a test text message!'),
|
||||||
|
markdown: this.req.i18n.__('This is a *test* **markdown** `message`!'),
|
||||||
|
html: this.req.i18n.__('This is a <i>test</i> <b>html</b> <code>message</code>!'),
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
/* eslint-enable no-underscore-dangle */
|
||||||
|
|
||||||
return {
|
return {
|
||||||
item: notificationService,
|
item: notificationService,
|
||||||
|
|||||||
@@ -54,14 +54,12 @@
|
|||||||
* included:
|
* included:
|
||||||
* type: object
|
* type: object
|
||||||
* required:
|
* required:
|
||||||
* - accessTokens
|
* - accessToken
|
||||||
* properties:
|
* properties:
|
||||||
* accessTokens:
|
* accessToken:
|
||||||
* type: array
|
* type: string
|
||||||
* description: New acces tokens (when updating own password)
|
* description: New acces tokens (when updating own password)
|
||||||
* items:
|
* example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ4...
|
||||||
* type: string
|
|
||||||
* example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ4...
|
|
||||||
* 400:
|
* 400:
|
||||||
* $ref: '#/components/responses/ValidationError'
|
* $ref: '#/components/responses/ValidationError'
|
||||||
* 401:
|
* 401:
|
||||||
@@ -180,7 +178,7 @@ module.exports = {
|
|||||||
return {
|
return {
|
||||||
item: sails.helpers.users.presentOne(user, currentUser),
|
item: sails.helpers.users.presentOne(user, currentUser),
|
||||||
included: {
|
included: {
|
||||||
accessTokens: [accessToken],
|
accessToken,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -154,9 +154,9 @@ module.exports = {
|
|||||||
await sails.helpers.notifications.createOne.with({
|
await sails.helpers.notifications.createOne.with({
|
||||||
values: {
|
values: {
|
||||||
action,
|
action,
|
||||||
|
userId: action.data.user.id,
|
||||||
type: action.type,
|
type: action.type,
|
||||||
data: action.data,
|
data: action.data,
|
||||||
userId: action.data.user.id,
|
|
||||||
creatorUser: values.user,
|
creatorUser: values.user,
|
||||||
card: values.card,
|
card: values.card,
|
||||||
},
|
},
|
||||||
@@ -179,24 +179,20 @@ module.exports = {
|
|||||||
|
|
||||||
const notifiableUserIds = _.union(cardSubscriptionUserIds, boardSubscriptionUserIds);
|
const notifiableUserIds = _.union(cardSubscriptionUserIds, boardSubscriptionUserIds);
|
||||||
|
|
||||||
await Promise.all(
|
await sails.helpers.notifications.createMany.with({
|
||||||
notifiableUserIds.map((userId) =>
|
arrayOfValues: notifiableUserIds.map((userId) => ({
|
||||||
sails.helpers.notifications.createOne.with({
|
userId,
|
||||||
values: {
|
action,
|
||||||
userId,
|
type: action.type,
|
||||||
action,
|
data: action.data,
|
||||||
type: action.type,
|
creatorUser: values.user,
|
||||||
data: action.data,
|
card: values.card,
|
||||||
creatorUser: values.user,
|
})),
|
||||||
card: values.card,
|
project: inputs.project,
|
||||||
},
|
board: inputs.board,
|
||||||
project: inputs.project,
|
list: inputs.list,
|
||||||
board: inputs.board,
|
webhooks: inputs.webhooks,
|
||||||
list: inputs.list,
|
});
|
||||||
webhooks: inputs.webhooks,
|
|
||||||
}),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
29
server/api/helpers/bootstrap/present-one.js
Normal file
29
server/api/helpers/bootstrap/present-one.js
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
/*!
|
||||||
|
* Copyright (c) 2024 PLANKA Software GmbH
|
||||||
|
* Licensed under the Fair Use License: https://github.com/plankanban/planka/blob/master/LICENSE.md
|
||||||
|
*/
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
sync: true,
|
||||||
|
|
||||||
|
inputs: {
|
||||||
|
oidc: {
|
||||||
|
type: 'ref',
|
||||||
|
},
|
||||||
|
user: {
|
||||||
|
type: 'ref',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
fn(inputs) {
|
||||||
|
const data = {
|
||||||
|
oidc: inputs.oidc,
|
||||||
|
version: sails.config.custom.version,
|
||||||
|
};
|
||||||
|
if (inputs.user && inputs.user.role === User.Roles.ADMIN) {
|
||||||
|
data.activeUsersLimit = sails.config.custom.activeUsersLimit;
|
||||||
|
}
|
||||||
|
|
||||||
|
return data;
|
||||||
|
},
|
||||||
|
};
|
||||||
@@ -124,29 +124,25 @@ module.exports = {
|
|||||||
boardSubscriptionUserIds,
|
boardSubscriptionUserIds,
|
||||||
);
|
);
|
||||||
|
|
||||||
await Promise.all(
|
await sails.helpers.notifications.createMany.with({
|
||||||
notifiableUserIds.map((userId) =>
|
webhooks,
|
||||||
sails.helpers.notifications.createOne.with({
|
arrayOfValues: notifiableUserIds.map((userId) => ({
|
||||||
webhooks,
|
userId,
|
||||||
values: {
|
comment,
|
||||||
userId,
|
type: mentionUserIdsSet.has(userId)
|
||||||
comment,
|
? Notification.Types.MENTION_IN_COMMENT
|
||||||
type: mentionUserIdsSet.has(userId)
|
: Notification.Types.COMMENT_CARD,
|
||||||
? Notification.Types.MENTION_IN_COMMENT
|
data: {
|
||||||
: Notification.Types.COMMENT_CARD,
|
card: _.pick(values.card, ['name']),
|
||||||
data: {
|
text: comment.text,
|
||||||
card: _.pick(values.card, ['name']),
|
},
|
||||||
text: comment.text,
|
creatorUser: values.user,
|
||||||
},
|
card: values.card,
|
||||||
creatorUser: values.user,
|
})),
|
||||||
card: values.card,
|
project: inputs.project,
|
||||||
},
|
board: inputs.board,
|
||||||
project: inputs.project,
|
list: inputs.list,
|
||||||
board: inputs.board,
|
});
|
||||||
list: inputs.list,
|
|
||||||
}),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
if (values.user.subscribeToCardWhenCommenting) {
|
if (values.user.subscribeToCardWhenCommenting) {
|
||||||
let cardSubscription;
|
let cardSubscription;
|
||||||
|
|||||||
@@ -11,20 +11,17 @@ module.exports = {
|
|||||||
type: 'ref',
|
type: 'ref',
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
user: {
|
|
||||||
type: 'ref',
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
|
|
||||||
fn(inputs) {
|
fn(inputs) {
|
||||||
const data = {
|
if (sails.config.custom.smtpHost) {
|
||||||
...inputs.record,
|
return _.omit(inputs.record, Config.SMTP_FIELD_NAMES);
|
||||||
version: sails.config.custom.version,
|
|
||||||
};
|
|
||||||
if (inputs.user && inputs.user.role === User.Roles.ADMIN) {
|
|
||||||
data.activeUsersLimit = sails.config.custom.activeUsersLimit;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return data;
|
if (inputs.record.smtpPassword) {
|
||||||
|
return _.omit(inputs.record, 'smtpPassword');
|
||||||
|
}
|
||||||
|
|
||||||
|
return inputs.record;
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
53
server/api/helpers/config/update-main.js
Normal file
53
server/api/helpers/config/update-main.js
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
/*!
|
||||||
|
* Copyright (c) 2024 PLANKA Software GmbH
|
||||||
|
* Licensed under the Fair Use License: https://github.com/plankanban/planka/blob/master/LICENSE.md
|
||||||
|
*/
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
inputs: {
|
||||||
|
values: {
|
||||||
|
type: 'json',
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
actorUser: {
|
||||||
|
type: 'ref',
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
request: {
|
||||||
|
type: 'ref',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
async fn(inputs) {
|
||||||
|
const { values } = inputs;
|
||||||
|
|
||||||
|
const config = await Config.qm.updateOneMain(values);
|
||||||
|
|
||||||
|
const configRelatedUserIds = await sails.helpers.users.getAllIds(User.Roles.ADMIN);
|
||||||
|
|
||||||
|
configRelatedUserIds.forEach((userId) => {
|
||||||
|
sails.sockets.broadcast(
|
||||||
|
`user:${userId}`,
|
||||||
|
'configUpdate',
|
||||||
|
{
|
||||||
|
item: sails.helpers.config.presentOne(config),
|
||||||
|
},
|
||||||
|
inputs.request,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
const webhooks = await Webhook.qm.getAll();
|
||||||
|
|
||||||
|
// TODO: with prevData?
|
||||||
|
sails.helpers.utils.sendWebhooks.with({
|
||||||
|
webhooks,
|
||||||
|
event: Webhook.Events.CONFIG_UPDATE,
|
||||||
|
buildData: () => ({
|
||||||
|
item: sails.helpers.config.presentOne(config),
|
||||||
|
}),
|
||||||
|
user: inputs.actorUser,
|
||||||
|
});
|
||||||
|
|
||||||
|
return config;
|
||||||
|
},
|
||||||
|
};
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
/*!
|
|
||||||
* Copyright (c) 2024 PLANKA Software GmbH
|
|
||||||
* Licensed under the Fair Use License: https://github.com/plankanban/planka/blob/master/LICENSE.md
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* eslint-disable no-underscore-dangle */
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
inputs: {
|
|
||||||
record: {
|
|
||||||
type: 'ref',
|
|
||||||
required: true,
|
|
||||||
},
|
|
||||||
i18n: {
|
|
||||||
type: 'ref',
|
|
||||||
required: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
async fn(inputs) {
|
|
||||||
const { i18n } = inputs;
|
|
||||||
|
|
||||||
await sails.helpers.utils.sendNotifications.with({
|
|
||||||
services: [_.pick(inputs.record, ['url', 'format'])],
|
|
||||||
title: i18n.__('Test Title'),
|
|
||||||
bodyByFormat: {
|
|
||||||
text: i18n.__('This is a test text message!'),
|
|
||||||
markdown: i18n.__('This is a *test* **markdown** `message`!'),
|
|
||||||
html: i18n.__('This is a <i>test</i> <b>html</b> <code>message</code>'),
|
|
||||||
},
|
|
||||||
});
|
|
||||||
},
|
|
||||||
};
|
|
||||||
358
server/api/helpers/notifications/create-many.js
Normal file
358
server/api/helpers/notifications/create-many.js
Normal file
@@ -0,0 +1,358 @@
|
|||||||
|
/*!
|
||||||
|
* Copyright (c) 2024 PLANKA Software GmbH
|
||||||
|
* Licensed under the Fair Use License: https://github.com/plankanban/planka/blob/master/LICENSE.md
|
||||||
|
*/
|
||||||
|
|
||||||
|
const escapeMarkdown = require('escape-markdown');
|
||||||
|
const escapeHtml = require('escape-html');
|
||||||
|
|
||||||
|
const { mentionMarkupToText } = require('../../../utils/mentions');
|
||||||
|
|
||||||
|
const buildTitle = (notification, t) => {
|
||||||
|
switch (notification.type) {
|
||||||
|
case Notification.Types.MOVE_CARD:
|
||||||
|
return t('Card Moved');
|
||||||
|
case Notification.Types.COMMENT_CARD:
|
||||||
|
return t('New Comment');
|
||||||
|
case Notification.Types.ADD_MEMBER_TO_CARD:
|
||||||
|
return t('You Were Added to Card');
|
||||||
|
case Notification.Types.MENTION_IN_COMMENT:
|
||||||
|
return t('You Were Mentioned in Comment');
|
||||||
|
default:
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const buildBodyByFormat = (board, card, notification, actorUser, t) => {
|
||||||
|
const markdownCardLink = `[${escapeMarkdown(card.name)}](${sails.config.custom.baseUrl}/cards/${card.id})`;
|
||||||
|
const htmlCardLink = `<a href="${sails.config.custom.baseUrl}/cards/${card.id}">${escapeHtml(card.name)}</a>`;
|
||||||
|
|
||||||
|
switch (notification.type) {
|
||||||
|
case Notification.Types.MOVE_CARD: {
|
||||||
|
const fromListName = sails.helpers.lists.makeName(notification.data.fromList);
|
||||||
|
const toListName = sails.helpers.lists.makeName(notification.data.toList);
|
||||||
|
|
||||||
|
return {
|
||||||
|
text: t(
|
||||||
|
'%s moved %s from %s to %s on %s',
|
||||||
|
actorUser.name,
|
||||||
|
card.name,
|
||||||
|
fromListName,
|
||||||
|
toListName,
|
||||||
|
board.name,
|
||||||
|
),
|
||||||
|
markdown: t(
|
||||||
|
'%s moved %s from %s to %s on %s',
|
||||||
|
escapeMarkdown(actorUser.name),
|
||||||
|
markdownCardLink,
|
||||||
|
`**${escapeMarkdown(fromListName)}**`,
|
||||||
|
`**${escapeMarkdown(toListName)}**`,
|
||||||
|
escapeMarkdown(board.name),
|
||||||
|
),
|
||||||
|
html: t(
|
||||||
|
'%s moved %s from %s to %s on %s',
|
||||||
|
escapeHtml(actorUser.name),
|
||||||
|
htmlCardLink,
|
||||||
|
`<b>${escapeHtml(fromListName)}</b>`,
|
||||||
|
`<b>${escapeHtml(toListName)}</b>`,
|
||||||
|
escapeHtml(board.name),
|
||||||
|
),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
case Notification.Types.COMMENT_CARD: {
|
||||||
|
const commentText = _.truncate(mentionMarkupToText(notification.data.text));
|
||||||
|
|
||||||
|
return {
|
||||||
|
text: `${t(
|
||||||
|
'%s left a new comment to %s on %s',
|
||||||
|
actorUser.name,
|
||||||
|
card.name,
|
||||||
|
board.name,
|
||||||
|
)}:\n${commentText}`,
|
||||||
|
markdown: `${t(
|
||||||
|
'%s left a new comment to %s on %s',
|
||||||
|
escapeMarkdown(actorUser.name),
|
||||||
|
markdownCardLink,
|
||||||
|
escapeMarkdown(board.name),
|
||||||
|
)}:\n\n*${escapeMarkdown(commentText)}*`,
|
||||||
|
html: `${t(
|
||||||
|
'%s left a new comment to %s on %s',
|
||||||
|
escapeHtml(actorUser.name),
|
||||||
|
htmlCardLink,
|
||||||
|
escapeHtml(board.name),
|
||||||
|
)}:\n\n<i>${escapeHtml(commentText)}</i>`,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
case Notification.Types.ADD_MEMBER_TO_CARD:
|
||||||
|
return {
|
||||||
|
text: t('%s added you to %s on %s', actorUser.name, card.name, board.name),
|
||||||
|
markdown: t(
|
||||||
|
'%s added you to %s on %s',
|
||||||
|
escapeMarkdown(actorUser.name),
|
||||||
|
markdownCardLink,
|
||||||
|
escapeMarkdown(board.name),
|
||||||
|
),
|
||||||
|
html: t(
|
||||||
|
'%s added you to %s on %s',
|
||||||
|
escapeHtml(actorUser.name),
|
||||||
|
htmlCardLink,
|
||||||
|
escapeHtml(board.name),
|
||||||
|
),
|
||||||
|
};
|
||||||
|
case Notification.Types.MENTION_IN_COMMENT: {
|
||||||
|
const commentText = _.truncate(mentionMarkupToText(notification.data.text));
|
||||||
|
|
||||||
|
return {
|
||||||
|
text: `${t(
|
||||||
|
'%s mentioned you in %s on %s',
|
||||||
|
actorUser.name,
|
||||||
|
card.name,
|
||||||
|
board.name,
|
||||||
|
)}:\n${commentText}`,
|
||||||
|
markdown: `${t(
|
||||||
|
'%s mentioned you in %s on %s',
|
||||||
|
escapeMarkdown(actorUser.name),
|
||||||
|
markdownCardLink,
|
||||||
|
escapeMarkdown(board.name),
|
||||||
|
)}:\n\n*${escapeMarkdown(commentText)}*`,
|
||||||
|
html: `${t(
|
||||||
|
'%s mentioned you in %s on %s',
|
||||||
|
escapeHtml(actorUser.name),
|
||||||
|
htmlCardLink,
|
||||||
|
escapeHtml(board.name),
|
||||||
|
)}:\n\n<i>${escapeHtml(commentText)}</i>`,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const buildAndSendNotifications = async (services, board, card, notification, actorUser, t) => {
|
||||||
|
await sails.helpers.utils.sendNotifications(
|
||||||
|
services,
|
||||||
|
buildTitle(notification, t),
|
||||||
|
buildBodyByFormat(board, card, notification, actorUser, t),
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
// TODO: use templates (views) to build html
|
||||||
|
const buildEmail = (board, card, notification, actorUser, notifiableUser, t) => {
|
||||||
|
const cardLink = `<a href="${sails.config.custom.baseUrl}/cards/${card.id}">${escapeHtml(card.name)}</a>`;
|
||||||
|
const boardLink = `<a href="${sails.config.custom.baseUrl}/boards/${board.id}">${escapeHtml(board.name)}</a>`;
|
||||||
|
|
||||||
|
let html;
|
||||||
|
switch (notification.type) {
|
||||||
|
case Notification.Types.MOVE_CARD: {
|
||||||
|
const fromListName = sails.helpers.lists.makeName(notification.data.fromList);
|
||||||
|
const toListName = sails.helpers.lists.makeName(notification.data.toList);
|
||||||
|
|
||||||
|
html = `<p>${t(
|
||||||
|
'%s moved %s from %s to %s on %s',
|
||||||
|
escapeHtml(actorUser.name),
|
||||||
|
cardLink,
|
||||||
|
escapeHtml(fromListName),
|
||||||
|
escapeHtml(toListName),
|
||||||
|
boardLink,
|
||||||
|
)}</p>`;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case Notification.Types.COMMENT_CARD:
|
||||||
|
html = `<p>${t(
|
||||||
|
'%s left a new comment to %s on %s',
|
||||||
|
escapeHtml(actorUser.name),
|
||||||
|
cardLink,
|
||||||
|
boardLink,
|
||||||
|
)}</p><p>${escapeHtml(mentionMarkupToText(notification.data.text))}</p>`;
|
||||||
|
|
||||||
|
break;
|
||||||
|
case Notification.Types.ADD_MEMBER_TO_CARD:
|
||||||
|
html = `<p>${t(
|
||||||
|
'%s added you to %s on %s',
|
||||||
|
escapeHtml(actorUser.name),
|
||||||
|
cardLink,
|
||||||
|
boardLink,
|
||||||
|
)}</p>`;
|
||||||
|
|
||||||
|
break;
|
||||||
|
case Notification.Types.MENTION_IN_COMMENT:
|
||||||
|
html = `<p>${t(
|
||||||
|
'%s mentioned you in %s on %s',
|
||||||
|
escapeHtml(actorUser.name),
|
||||||
|
cardLink,
|
||||||
|
boardLink,
|
||||||
|
)}</p><p>${escapeHtml(mentionMarkupToText(notification.data.text))}</p>`;
|
||||||
|
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return null; // TODO: throw error?
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
html,
|
||||||
|
to: notifiableUser.email,
|
||||||
|
subject: buildTitle(notification, t),
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
const sendEmails = async (transporter, emails) => {
|
||||||
|
await Promise.all(
|
||||||
|
emails.map((email) =>
|
||||||
|
sails.helpers.utils.sendEmail.with({
|
||||||
|
...email,
|
||||||
|
transporter,
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
transporter.close();
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
inputs: {
|
||||||
|
arrayOfValues: {
|
||||||
|
type: 'ref',
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
project: {
|
||||||
|
type: 'ref',
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
board: {
|
||||||
|
type: 'ref',
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
list: {
|
||||||
|
type: 'ref',
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
webhooks: {
|
||||||
|
type: 'ref',
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
async fn(inputs) {
|
||||||
|
const { arrayOfValues } = inputs;
|
||||||
|
|
||||||
|
const ids = await sails.helpers.utils.generateIds(arrayOfValues.length);
|
||||||
|
const valuesById = {};
|
||||||
|
|
||||||
|
const notifications = await Notification.qm.create(
|
||||||
|
arrayOfValues.map((values) => {
|
||||||
|
const id = ids.shift();
|
||||||
|
|
||||||
|
const isCommentRelated =
|
||||||
|
values.type === Notification.Types.COMMENT_CARD ||
|
||||||
|
values.type === Notification.Types.MENTION_IN_COMMENT;
|
||||||
|
|
||||||
|
const nextValues = {
|
||||||
|
...values,
|
||||||
|
id,
|
||||||
|
creatorUserId: values.creatorUser.id,
|
||||||
|
boardId: values.card.boardId,
|
||||||
|
cardId: values.card.id,
|
||||||
|
};
|
||||||
|
|
||||||
|
if (isCommentRelated) {
|
||||||
|
nextValues.commentId = values.comment.id;
|
||||||
|
} else {
|
||||||
|
nextValues.actionId = values.action.id;
|
||||||
|
}
|
||||||
|
|
||||||
|
valuesById[id] = { ...nextValues }; // FIXME: hack
|
||||||
|
return nextValues;
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
|
||||||
|
notifications.forEach((notification) => {
|
||||||
|
const values = valuesById[notification.id];
|
||||||
|
|
||||||
|
sails.sockets.broadcast(`user:${notification.userId}`, 'notificationCreate', {
|
||||||
|
item: notification,
|
||||||
|
included: {
|
||||||
|
users: [sails.helpers.users.presentOne(values.creatorUser, {})], // FIXME: hack
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
sails.helpers.utils.sendWebhooks.with({
|
||||||
|
webhooks: inputs.webhooks,
|
||||||
|
event: Webhook.Events.NOTIFICATION_CREATE,
|
||||||
|
buildData: () => ({
|
||||||
|
item: notification,
|
||||||
|
included: {
|
||||||
|
projects: [inputs.project],
|
||||||
|
boards: [inputs.board],
|
||||||
|
lists: [inputs.list],
|
||||||
|
cards: [values.card],
|
||||||
|
...(notification.commentId
|
||||||
|
? {
|
||||||
|
comments: [values.comment],
|
||||||
|
}
|
||||||
|
: {
|
||||||
|
actions: [values.action],
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
user: values.creatorUser,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
const notificationsByUserId = _.groupBy(notifications, 'userId');
|
||||||
|
const userIds = Object.keys(notificationsByUserId);
|
||||||
|
|
||||||
|
const notificationServices = await NotificationService.qm.getByUserIds(userIds);
|
||||||
|
const { transporter } = await sails.helpers.utils.makeSmtpTransporter();
|
||||||
|
|
||||||
|
if (notificationServices.length > 0 || transporter) {
|
||||||
|
const users = await User.qm.getByIds(userIds);
|
||||||
|
const userById = _.keyBy(users, 'id');
|
||||||
|
|
||||||
|
const notificationServicesByUserId = _.groupBy(notificationServices, 'userId');
|
||||||
|
|
||||||
|
Object.keys(notificationsByUserId).forEach(async (userId) => {
|
||||||
|
const notifiableUser = userById[userId];
|
||||||
|
const t = sails.helpers.utils.makeTranslator(notifiableUser.language);
|
||||||
|
|
||||||
|
const emails = notificationsByUserId[userId].flatMap((notification) => {
|
||||||
|
const values = valuesById[notification.id];
|
||||||
|
|
||||||
|
if (notificationServicesByUserId[userId]) {
|
||||||
|
const services = notificationServicesByUserId[userId].map((notificationService) =>
|
||||||
|
_.pick(notificationService, ['url', 'format']),
|
||||||
|
);
|
||||||
|
|
||||||
|
buildAndSendNotifications(
|
||||||
|
services,
|
||||||
|
inputs.board,
|
||||||
|
values.card,
|
||||||
|
notification,
|
||||||
|
values.creatorUser,
|
||||||
|
t,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (transporter) {
|
||||||
|
return buildEmail(
|
||||||
|
inputs.board,
|
||||||
|
values.card,
|
||||||
|
notification,
|
||||||
|
values.creatorUser,
|
||||||
|
notifiableUser,
|
||||||
|
t,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return [];
|
||||||
|
});
|
||||||
|
|
||||||
|
if (emails.length > 0) {
|
||||||
|
sendEmails(transporter, emails);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return notifications;
|
||||||
|
},
|
||||||
|
};
|
||||||
@@ -137,7 +137,15 @@ const buildAndSendNotifications = async (services, board, card, notification, ac
|
|||||||
};
|
};
|
||||||
|
|
||||||
// TODO: use templates (views) to build html
|
// TODO: use templates (views) to build html
|
||||||
const buildAndSendEmail = async (board, card, notification, actorUser, notifiableUser, t) => {
|
const buildAndSendEmail = async (
|
||||||
|
transporter,
|
||||||
|
board,
|
||||||
|
card,
|
||||||
|
notification,
|
||||||
|
actorUser,
|
||||||
|
notifiableUser,
|
||||||
|
t,
|
||||||
|
) => {
|
||||||
const cardLink = `<a href="${sails.config.custom.baseUrl}/cards/${card.id}">${escapeHtml(card.name)}</a>`;
|
const cardLink = `<a href="${sails.config.custom.baseUrl}/cards/${card.id}">${escapeHtml(card.name)}</a>`;
|
||||||
const boardLink = `<a href="${sails.config.custom.baseUrl}/boards/${board.id}">${escapeHtml(board.name)}</a>`;
|
const boardLink = `<a href="${sails.config.custom.baseUrl}/boards/${board.id}">${escapeHtml(board.name)}</a>`;
|
||||||
|
|
||||||
@@ -164,7 +172,7 @@ const buildAndSendEmail = async (board, card, notification, actorUser, notifiabl
|
|||||||
escapeHtml(actorUser.name),
|
escapeHtml(actorUser.name),
|
||||||
cardLink,
|
cardLink,
|
||||||
boardLink,
|
boardLink,
|
||||||
)}</p><p>${escapeHtml(notification.data.text)}</p>`;
|
)}</p><p>${escapeHtml(mentionMarkupToText(notification.data.text))}</p>`;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case Notification.Types.ADD_MEMBER_TO_CARD:
|
case Notification.Types.ADD_MEMBER_TO_CARD:
|
||||||
@@ -182,7 +190,7 @@ const buildAndSendEmail = async (board, card, notification, actorUser, notifiabl
|
|||||||
escapeHtml(actorUser.name),
|
escapeHtml(actorUser.name),
|
||||||
cardLink,
|
cardLink,
|
||||||
boardLink,
|
boardLink,
|
||||||
)}</p><p>${escapeHtml(notification.data.text)}</p>`;
|
)}</p><p>${escapeHtml(mentionMarkupToText(notification.data.text))}</p>`;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -190,10 +198,13 @@ const buildAndSendEmail = async (board, card, notification, actorUser, notifiabl
|
|||||||
}
|
}
|
||||||
|
|
||||||
await sails.helpers.utils.sendEmail.with({
|
await sails.helpers.utils.sendEmail.with({
|
||||||
|
transporter,
|
||||||
html,
|
html,
|
||||||
to: notifiableUser.email,
|
to: notifiableUser.email,
|
||||||
subject: buildTitle(notification, t),
|
subject: buildTitle(notification, t),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
transporter.close();
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
@@ -223,10 +234,6 @@ module.exports = {
|
|||||||
async fn(inputs) {
|
async fn(inputs) {
|
||||||
const { values } = inputs;
|
const { values } = inputs;
|
||||||
|
|
||||||
if (values.user) {
|
|
||||||
values.userId = values.user.id;
|
|
||||||
}
|
|
||||||
|
|
||||||
const isCommentRelated =
|
const isCommentRelated =
|
||||||
values.type === Notification.Types.COMMENT_CARD ||
|
values.type === Notification.Types.COMMENT_CARD ||
|
||||||
values.type === Notification.Types.MENTION_IN_COMMENT;
|
values.type === Notification.Types.MENTION_IN_COMMENT;
|
||||||
@@ -274,9 +281,10 @@ module.exports = {
|
|||||||
});
|
});
|
||||||
|
|
||||||
const notificationServices = await NotificationService.qm.getByUserId(notification.userId);
|
const notificationServices = await NotificationService.qm.getByUserId(notification.userId);
|
||||||
|
const { transporter } = await sails.helpers.utils.makeSmtpTransporter();
|
||||||
|
|
||||||
if (notificationServices.length > 0 || sails.hooks.smtp.isEnabled()) {
|
if (notificationServices.length > 0 || transporter) {
|
||||||
const notifiableUser = values.user || (await User.qm.getOneById(notification.userId));
|
const notifiableUser = await User.qm.getOneById(notification.userId);
|
||||||
const t = sails.helpers.utils.makeTranslator(notifiableUser.language);
|
const t = sails.helpers.utils.makeTranslator(notifiableUser.language);
|
||||||
|
|
||||||
if (notificationServices.length > 0) {
|
if (notificationServices.length > 0) {
|
||||||
@@ -294,8 +302,9 @@ module.exports = {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sails.hooks.smtp.isEnabled()) {
|
if (transporter) {
|
||||||
buildAndSendEmail(
|
buildAndSendEmail(
|
||||||
|
transporter,
|
||||||
inputs.board,
|
inputs.board,
|
||||||
values.card,
|
values.card,
|
||||||
notification,
|
notification,
|
||||||
|
|||||||
61
server/api/helpers/utils/make-smtp-transporter.js
Normal file
61
server/api/helpers/utils/make-smtp-transporter.js
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
/*!
|
||||||
|
* Copyright (c) 2024 PLANKA Software GmbH
|
||||||
|
* Licensed under the Fair Use License: https://github.com/plankanban/planka/blob/master/LICENSE.md
|
||||||
|
*/
|
||||||
|
|
||||||
|
const nodemailer = require('nodemailer');
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
inputs: {
|
||||||
|
defaultOptions: {
|
||||||
|
type: 'json',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
async fn(inputs) {
|
||||||
|
let config;
|
||||||
|
let sourceConfig;
|
||||||
|
|
||||||
|
if (sails.config.custom.smtpHost) {
|
||||||
|
sourceConfig = sails.config.custom;
|
||||||
|
} else {
|
||||||
|
config = await Config.qm.getOneMain();
|
||||||
|
|
||||||
|
if (config.smtpHost) {
|
||||||
|
sourceConfig = config;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!sourceConfig) {
|
||||||
|
return {
|
||||||
|
config,
|
||||||
|
transporter: null,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
const transporter = nodemailer.createTransport(
|
||||||
|
{
|
||||||
|
...inputs.defaultOptions,
|
||||||
|
host: sourceConfig.smtpHost,
|
||||||
|
port: sourceConfig.smtpPort,
|
||||||
|
name: sourceConfig.smtpName,
|
||||||
|
secure: sourceConfig.smtpSecure,
|
||||||
|
auth: sourceConfig.smtpUser && {
|
||||||
|
user: sourceConfig.smtpUser,
|
||||||
|
pass: sourceConfig.smtpPassword,
|
||||||
|
},
|
||||||
|
tls: {
|
||||||
|
rejectUnauthorized: sourceConfig.smtpTlsRejectUnauthorized,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
from: sourceConfig.smtpFrom,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
return {
|
||||||
|
transporter,
|
||||||
|
config,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
};
|
||||||
@@ -5,6 +5,10 @@
|
|||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
inputs: {
|
inputs: {
|
||||||
|
transporter: {
|
||||||
|
type: 'ref',
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
to: {
|
to: {
|
||||||
type: 'string',
|
type: 'string',
|
||||||
required: true,
|
required: true,
|
||||||
@@ -20,13 +24,8 @@ module.exports = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
async fn(inputs) {
|
async fn(inputs) {
|
||||||
const transporter = sails.hooks.smtp.getTransporter(); // TODO: check if enabled?
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const info = await transporter.sendMail({
|
const info = await inputs.transporter.sendMail(inputs);
|
||||||
...inputs,
|
|
||||||
from: sails.config.custom.smtpFrom,
|
|
||||||
});
|
|
||||||
|
|
||||||
sails.log.info(`Email sent: ${info.messageId}`);
|
sails.log.info(`Email sent: ${info.messageId}`);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
@@ -59,6 +59,28 @@ module.exports = function defineOidcHook(sails) {
|
|||||||
return client;
|
return client;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
async getBootstrap() {
|
||||||
|
const instance = await this.getClient();
|
||||||
|
|
||||||
|
if (!instance) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const authorizationUrlParams = {
|
||||||
|
scope: sails.config.custom.oidcScopes,
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!sails.config.custom.oidcUseDefaultResponseMode) {
|
||||||
|
authorizationUrlParams.response_mode = sails.config.custom.oidcResponseMode;
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
authorizationUrl: instance.authorizationUrl(authorizationUrlParams),
|
||||||
|
endSessionUrl: instance.issuer.end_session_endpoint ? instance.endSessionUrl({}) : null,
|
||||||
|
isEnforced: sails.config.custom.oidcEnforced,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
isEnabled() {
|
isEnabled() {
|
||||||
return !!sails.config.custom.oidcIssuer;
|
return !!sails.config.custom.oidcIssuer;
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -9,6 +9,37 @@ const defaultFind = (criteria) => Notification.find(criteria).sort('id DESC');
|
|||||||
|
|
||||||
/* Query methods */
|
/* Query methods */
|
||||||
|
|
||||||
|
const create = (arrayOfValues) =>
|
||||||
|
sails.getDatastore().transaction(async (db) => {
|
||||||
|
const notifications = await Notification.createEach(arrayOfValues).fetch().usingConnection(db);
|
||||||
|
const userIds = sails.helpers.utils.mapRecords(notifications, 'userId', true, true);
|
||||||
|
|
||||||
|
if (userIds.length > 0) {
|
||||||
|
const queryValues = [];
|
||||||
|
const inValues = userIds.map((userId) => {
|
||||||
|
queryValues.push(userId);
|
||||||
|
return `$${queryValues.length}`;
|
||||||
|
});
|
||||||
|
|
||||||
|
queryValues.push(LIMIT);
|
||||||
|
|
||||||
|
const query = `
|
||||||
|
WITH exceeded_notification AS (
|
||||||
|
SELECT id, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY id DESC) AS rank
|
||||||
|
FROM notification
|
||||||
|
WHERE user_id IN (${inValues.join(', ')}) AND is_read = FALSE
|
||||||
|
)
|
||||||
|
UPDATE notification
|
||||||
|
SET is_read = TRUE
|
||||||
|
WHERE id IN (SELECT id FROM exceeded_notification WHERE rank > $${queryValues.length})
|
||||||
|
`;
|
||||||
|
|
||||||
|
await sails.sendNativeQuery(query, queryValues).usingConnection(db);
|
||||||
|
}
|
||||||
|
|
||||||
|
return notifications;
|
||||||
|
});
|
||||||
|
|
||||||
const createOne = (values) => {
|
const createOne = (values) => {
|
||||||
if (values.userId) {
|
if (values.userId) {
|
||||||
return sails.getDatastore().transaction(async (db) => {
|
return sails.getDatastore().transaction(async (db) => {
|
||||||
@@ -26,7 +57,7 @@ const createOne = (values) => {
|
|||||||
)
|
)
|
||||||
UPDATE notification
|
UPDATE notification
|
||||||
SET is_read = TRUE
|
SET is_read = TRUE
|
||||||
WHERE id in (SELECT id FROM exceeded_notification)
|
WHERE id IN (SELECT id FROM exceeded_notification)
|
||||||
`;
|
`;
|
||||||
|
|
||||||
await sails.sendNativeQuery(query, [values.userId, LIMIT]).usingConnection(db);
|
await sails.sendNativeQuery(query, [values.userId, LIMIT]).usingConnection(db);
|
||||||
@@ -66,6 +97,7 @@ const updateOne = (criteria, values) => Notification.updateOne(criteria).set({ .
|
|||||||
const delete_ = (criteria) => Notification.destroy(criteria).fetch();
|
const delete_ = (criteria) => Notification.destroy(criteria).fetch();
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
|
create,
|
||||||
createOne,
|
createOne,
|
||||||
getByIds,
|
getByIds,
|
||||||
getUnreadByUserId,
|
getUnreadByUserId,
|
||||||
|
|||||||
@@ -14,6 +14,11 @@ const getByUserId = (userId) =>
|
|||||||
userId,
|
userId,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const getByUserIds = (userIds) =>
|
||||||
|
defaultFind({
|
||||||
|
userId: userIds,
|
||||||
|
});
|
||||||
|
|
||||||
const getByBoardId = (boardId) =>
|
const getByBoardId = (boardId) =>
|
||||||
defaultFind({
|
defaultFind({
|
||||||
boardId,
|
boardId,
|
||||||
@@ -36,6 +41,7 @@ const deleteOne = (criteria) => NotificationService.destroyOne(criteria);
|
|||||||
module.exports = {
|
module.exports = {
|
||||||
createOne,
|
createOne,
|
||||||
getByUserId,
|
getByUserId,
|
||||||
|
getByUserIds,
|
||||||
getByBoardId,
|
getByBoardId,
|
||||||
getByBoardIds,
|
getByBoardIds,
|
||||||
getOneById,
|
getOneById,
|
||||||
|
|||||||
@@ -1,55 +0,0 @@
|
|||||||
/*!
|
|
||||||
* Copyright (c) 2024 PLANKA Software GmbH
|
|
||||||
* Licensed under the Fair Use License: https://github.com/plankanban/planka/blob/master/LICENSE.md
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* smtp hook
|
|
||||||
*
|
|
||||||
* @description :: A hook definition. Extends Sails by adding shadow routes, implicit actions,
|
|
||||||
* and/or initialization logic.
|
|
||||||
* @docs :: https://sailsjs.com/docs/concepts/extending-sails/hooks
|
|
||||||
*/
|
|
||||||
|
|
||||||
const nodemailer = require('nodemailer');
|
|
||||||
|
|
||||||
module.exports = function defineSmtpHook(sails) {
|
|
||||||
let transporter = null;
|
|
||||||
|
|
||||||
return {
|
|
||||||
/**
|
|
||||||
* Runs when this Sails app loads/lifts.
|
|
||||||
*/
|
|
||||||
|
|
||||||
async initialize() {
|
|
||||||
if (!this.isEnabled()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
sails.log.info('Initializing custom hook (`smtp`)');
|
|
||||||
|
|
||||||
transporter = nodemailer.createTransport({
|
|
||||||
pool: true,
|
|
||||||
host: sails.config.custom.smtpHost,
|
|
||||||
port: sails.config.custom.smtpPort,
|
|
||||||
name: sails.config.custom.smtpName,
|
|
||||||
secure: sails.config.custom.smtpSecure,
|
|
||||||
auth: sails.config.custom.smtpUser && {
|
|
||||||
user: sails.config.custom.smtpUser,
|
|
||||||
pass: sails.config.custom.smtpPassword,
|
|
||||||
},
|
|
||||||
tls: {
|
|
||||||
rejectUnauthorized: sails.config.custom.smtpTlsRejectUnauthorized,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
getTransporter() {
|
|
||||||
return transporter;
|
|
||||||
},
|
|
||||||
|
|
||||||
isEnabled() {
|
|
||||||
return !!sails.config.custom.smtpHost;
|
|
||||||
},
|
|
||||||
};
|
|
||||||
};
|
|
||||||
@@ -17,54 +17,131 @@
|
|||||||
* Config:
|
* Config:
|
||||||
* type: object
|
* type: object
|
||||||
* required:
|
* required:
|
||||||
* - version
|
* - id
|
||||||
* - oidc
|
* - isInitialized
|
||||||
* properties:
|
* properties:
|
||||||
* version:
|
* id:
|
||||||
* type: string
|
* type: string
|
||||||
* description: Current version of the PLANKA application
|
* description: Unique identifier for the config (always set to '1')
|
||||||
* example: 2.0.0
|
* example: 1
|
||||||
* activeUsersLimit:
|
* smtpHost:
|
||||||
|
* type: string
|
||||||
|
* nullable: true
|
||||||
|
* description: Hostname or IP address of the SMTP server
|
||||||
|
* example: smtp.example.com
|
||||||
|
* smtpPort:
|
||||||
* type: number
|
* type: number
|
||||||
* nullable: true
|
* nullable: true
|
||||||
* description: Maximum number of active users allowed (conditionally added for admins if configured)
|
* description: Port number of the SMTP server
|
||||||
* example: 100
|
* example: 587
|
||||||
* oidc:
|
* smtpName:
|
||||||
* type: object
|
* type: string
|
||||||
* required:
|
|
||||||
* - authorizationUrl
|
|
||||||
* - endSessionUrl
|
|
||||||
* - isEnforced
|
|
||||||
* nullable: true
|
* nullable: true
|
||||||
* description: OpenID Connect configuration (null if not configured)
|
* description: Client hostname used in the EHLO command for SMTP
|
||||||
* properties:
|
* example: localhost
|
||||||
* authorizationUrl:
|
* smtpSecure:
|
||||||
* type: string
|
* type: boolean
|
||||||
* format: uri
|
* description: Whether to use a secure connection for SMTP
|
||||||
* description: OIDC authorization URL for initiating authentication
|
* example: false
|
||||||
* example: https://oidc.example.com/auth
|
* smtpTlsRejectUnauthorized:
|
||||||
* endSessionUrl:
|
* type: boolean
|
||||||
* type: string
|
* description: Whether to reject unauthorized or self-signed TLS certificates for SMTP connections
|
||||||
* format: uri
|
* example: true
|
||||||
* nullable: true
|
* smtpUser:
|
||||||
* description: OIDC end session URL for logout (null if not supported by provider)
|
* type: string
|
||||||
* example: https://oidc.example.com/logout
|
* nullable: true
|
||||||
* isEnforced:
|
* description: Username for authenticating with the SMTP server
|
||||||
* type: boolean
|
* example: no-reply@example.com
|
||||||
* description: Whether OIDC authentication is enforced (users must use OIDC to login)
|
* smtpPassword:
|
||||||
* example: false
|
* type: string
|
||||||
|
* nullable: true
|
||||||
|
* description: Password for authenticating with the SMTP server
|
||||||
|
* example: SecurePassword123!
|
||||||
|
* smtpFrom:
|
||||||
|
* type: string
|
||||||
|
* nullable: true
|
||||||
|
* description: Default "from" used for outgoing SMTP emails
|
||||||
|
* example: no-reply@example.com
|
||||||
|
* isInitialized:
|
||||||
|
* type: boolean
|
||||||
|
* description: Whether the PLANKA instance has been initialized
|
||||||
|
* example: true
|
||||||
|
* createdAt:
|
||||||
|
* type: string
|
||||||
|
* format: date-time
|
||||||
|
* nullable: true
|
||||||
|
* description: When the config was created
|
||||||
|
* example: 2024-01-01T00:00:00.000Z
|
||||||
|
* updatedAt:
|
||||||
|
* type: string
|
||||||
|
* format: date-time
|
||||||
|
* nullable: true
|
||||||
|
* description: When the config was last updated
|
||||||
|
* example: 2024-01-01T00:00:00.000Z
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const MAIN_ID = '1';
|
const MAIN_ID = '1';
|
||||||
|
|
||||||
|
const SMTP_FIELD_NAMES = [
|
||||||
|
'smtpHost',
|
||||||
|
'smtpPort',
|
||||||
|
'smtpName',
|
||||||
|
'smtpSecure',
|
||||||
|
'smtpTlsRejectUnauthorized',
|
||||||
|
'smtpUser',
|
||||||
|
'smtpPassword',
|
||||||
|
'smtpFrom',
|
||||||
|
];
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
MAIN_ID,
|
MAIN_ID,
|
||||||
|
SMTP_FIELD_NAMES,
|
||||||
|
|
||||||
attributes: {
|
attributes: {
|
||||||
// ╔═╗╦═╗╦╔╦╗╦╔╦╗╦╦ ╦╔═╗╔═╗
|
// ╔═╗╦═╗╦╔╦╗╦╔╦╗╦╦ ╦╔═╗╔═╗
|
||||||
// ╠═╝╠╦╝║║║║║ ║ ║╚╗╔╝║╣ ╚═╗
|
// ╠═╝╠╦╝║║║║║ ║ ║╚╗╔╝║╣ ╚═╗
|
||||||
// ╩ ╩╚═╩╩ ╩╩ ╩ ╩ ╚╝ ╚═╝╚═╝
|
// ╩ ╩╚═╩╩ ╩╩ ╩ ╩ ╚╝ ╚═╝╚═╝
|
||||||
|
|
||||||
|
smtpHost: {
|
||||||
|
type: 'string',
|
||||||
|
allowNull: true,
|
||||||
|
columnName: 'smtp_host',
|
||||||
|
},
|
||||||
|
smtpPort: {
|
||||||
|
type: 'number',
|
||||||
|
allowNull: true,
|
||||||
|
columnName: 'smtp_port',
|
||||||
|
},
|
||||||
|
smtpName: {
|
||||||
|
type: 'string',
|
||||||
|
allowNull: true,
|
||||||
|
columnName: 'smtp_name',
|
||||||
|
},
|
||||||
|
smtpSecure: {
|
||||||
|
type: 'boolean',
|
||||||
|
required: true,
|
||||||
|
columnName: 'smtp_secure',
|
||||||
|
},
|
||||||
|
smtpTlsRejectUnauthorized: {
|
||||||
|
type: 'boolean',
|
||||||
|
required: true,
|
||||||
|
columnName: 'smtp_tls_reject_unauthorized',
|
||||||
|
},
|
||||||
|
smtpUser: {
|
||||||
|
type: 'string',
|
||||||
|
allowNull: true,
|
||||||
|
columnName: 'smtp_user',
|
||||||
|
},
|
||||||
|
smtpPassword: {
|
||||||
|
type: 'string',
|
||||||
|
allowNull: true,
|
||||||
|
columnName: 'smtp_password',
|
||||||
|
},
|
||||||
|
smtpFrom: {
|
||||||
|
type: 'string',
|
||||||
|
allowNull: true,
|
||||||
|
columnName: 'smtp_from',
|
||||||
|
},
|
||||||
isInitialized: {
|
isInitialized: {
|
||||||
type: 'boolean',
|
type: 'boolean',
|
||||||
required: true,
|
required: true,
|
||||||
|
|||||||
@@ -107,6 +107,8 @@ const Events = {
|
|||||||
COMMENT_UPDATE: 'commentUpdate',
|
COMMENT_UPDATE: 'commentUpdate',
|
||||||
COMMENT_DELETE: 'commentDelete',
|
COMMENT_DELETE: 'commentDelete',
|
||||||
|
|
||||||
|
CONFIG_UPDATE: 'configUpdate',
|
||||||
|
|
||||||
CUSTOM_FIELD_CREATE: 'customFieldCreate',
|
CUSTOM_FIELD_CREATE: 'customFieldCreate',
|
||||||
CUSTOM_FIELD_UPDATE: 'customFieldUpdate',
|
CUSTOM_FIELD_UPDATE: 'customFieldUpdate',
|
||||||
CUSTOM_FIELD_DELETE: 'customFieldDelete',
|
CUSTOM_FIELD_DELETE: 'customFieldDelete',
|
||||||
|
|||||||
@@ -102,10 +102,10 @@ module.exports.custom = {
|
|||||||
smtpPort: process.env.SMTP_PORT || 587,
|
smtpPort: process.env.SMTP_PORT || 587,
|
||||||
smtpName: process.env.SMTP_NAME,
|
smtpName: process.env.SMTP_NAME,
|
||||||
smtpSecure: process.env.SMTP_SECURE === 'true',
|
smtpSecure: process.env.SMTP_SECURE === 'true',
|
||||||
|
smtpTlsRejectUnauthorized: process.env.SMTP_TLS_REJECT_UNAUTHORIZED !== 'false',
|
||||||
smtpUser: process.env.SMTP_USER,
|
smtpUser: process.env.SMTP_USER,
|
||||||
smtpPassword: process.env.SMTP_PASSWORD,
|
smtpPassword: process.env.SMTP_PASSWORD,
|
||||||
smtpFrom: process.env.SMTP_FROM,
|
smtpFrom: process.env.SMTP_FROM,
|
||||||
smtpTlsRejectUnauthorized: process.env.SMTP_TLS_REJECT_UNAUTHORIZED !== 'false',
|
|
||||||
|
|
||||||
gravatarBaseUrl: process.env.GRAVATAR_BASE_URL,
|
gravatarBaseUrl: process.env.GRAVATAR_BASE_URL,
|
||||||
};
|
};
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user