pgkiln 0.38.0 → 0.40.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/SECURITY.md +3 -0
- package/db/migrations/093_workspace_preferences.sql +34 -0
- package/db/migrations/094_task_vacation_expiry.sql +182 -0
- package/docs/apex-feature-parity.md +8 -8
- package/docs/guide/03-builder.md +62 -2
- package/docs/guide/04-pages-and-regions.md +27 -5
- package/docs/guide/06-processing.md +27 -1
- package/docs/guide/12-development.md +15 -6
- package/docs/guide/13-rest-api.md +3 -1
- package/examples/hr/hr_56_more_charts.sql +57 -0
- package/examples/hr/hr_57_task_policies.sql +18 -0
- package/examples/hr/hr_58_facet_charts.sql +17 -0
- package/package.json +1 -1
- package/public/app.css +30 -0
- package/public/sw.js +2 -1
- package/src/app.ts +2 -0
- package/src/automations.ts +6 -0
- package/src/blueprint-from-app.ts +240 -0
- package/src/builder/blueprints.ts +31 -1
- package/src/builder/components.ts +7 -0
- package/src/builder/home.ts +3 -2
- package/src/builder/region-settings.ts +13 -5
- package/src/builder/sql-utilities.ts +278 -0
- package/src/builder/sql.ts +3 -1
- package/src/builder/ui.ts +16 -3
- package/src/builder/workspace-backups.ts +78 -0
- package/src/builder/workspaces.ts +83 -1
- package/src/cli/replace.ts +2 -0
- package/src/i18n/ar.ts +25 -0
- package/src/i18n/cs.ts +25 -0
- package/src/i18n/da.ts +25 -0
- package/src/i18n/de.ts +25 -0
- package/src/i18n/el.ts +25 -0
- package/src/i18n/es.ts +25 -0
- package/src/i18n/fi.ts +25 -0
- package/src/i18n/fr.ts +25 -0
- package/src/i18n/he.ts +25 -0
- package/src/i18n/it.ts +25 -0
- package/src/i18n/ja.ts +25 -0
- package/src/i18n/ko.ts +25 -0
- package/src/i18n/nb.ts +25 -0
- package/src/i18n/pl.ts +25 -0
- package/src/i18n/pt.ts +25 -0
- package/src/i18n/ru.ts +25 -0
- package/src/i18n/sv.ts +25 -0
- package/src/i18n/tr.ts +25 -0
- package/src/i18n/uk.ts +25 -0
- package/src/i18n/zh.ts +25 -0
- package/src/i18n.ts +50 -0
- package/src/runtime/charts.ts +154 -5
- package/src/runtime/facet-state.ts +3 -0
- package/src/runtime/facets.ts +25 -0
- package/src/runtime/rest.ts +8 -2
- package/src/runtime/tasks.ts +62 -4
- package/src/session.ts +5 -0
- package/src/workflow.ts +6 -4
|
@@ -29,7 +29,9 @@ export const DEFAULT_WORKSPACE = 1;
|
|
|
29
29
|
export async function loadWorkspaces(s: Session) {
|
|
30
30
|
const rows = (
|
|
31
31
|
await owner.query<WorkspaceRef>(
|
|
32
|
-
`select w.id, w.name, w.message, w.banner_label, w.banner_color, w.isolated,
|
|
32
|
+
`select w.id, w.name, w.message, w.banner_label, w.banner_color, w.isolated, w.sql_workshop, w.rest_services,
|
|
33
|
+
coalesce((select json_agg(json_build_object('label', l.label, 'url', l.url, 'description', l.description) order by l.position, lower(l.label))
|
|
34
|
+
from meta.workspace_link l where l.workspace_id = w.id), '[]') as links,
|
|
33
35
|
exists (select 1 from meta.developer d where d.username = $1 and d.is_admin)
|
|
34
36
|
or exists (select 1 from meta.workspace_member m where m.workspace_id = w.id and m.username = $1 and m.is_admin) as admin
|
|
35
37
|
from meta.workspace w
|
|
@@ -206,6 +208,40 @@ function serviceRegion(s: Session, w: { id: number; message: string | null; bann
|
|
|
206
208
|
<div class="buttons"><button class="btn">Save</button></div></form>`, '', 'service');
|
|
207
209
|
}
|
|
208
210
|
|
|
211
|
+
/** (093) Workspace preferences: the SQL Workshop and the applications' REST modules on or off. */
|
|
212
|
+
function preferencesRegion(s: Session, w: { id: number; sql_workshop: boolean; rest_services: boolean }) {
|
|
213
|
+
const check = (name: string, on: boolean, label: string, help: string) =>
|
|
214
|
+
html`<div class="field"><label class="check"><input type="checkbox" name="${name}" value="true"${on ? raw(' checked') : ''}> ${label}</label><small class="help">${help}</small></div>`;
|
|
215
|
+
return region('Workspace preferences', html`<form method="post" action="${BASE}/workspaces/${w.id}/preferences">${csrf(s)}
|
|
216
|
+
${check('sql_workshop', w.sql_workshop, 'Enable the SQL Workshop', 'Off: SQL Commands, the Object Browser, SQL scripts, data loading and unloading, Quick SQL, the query builder, DDL, Compare and AI are refused while this workspace is current, for every developer.')}
|
|
217
|
+
${check('rest_services', w.rest_services, 'Enable RESTful services', 'Off: the REST modules of this workspace\'s applications answer 404 (Not found) at /a/<alias>/rest/…; they can still be edited.')}
|
|
218
|
+
<div class="buttons"><button class="btn">Save preferences</button></div></form>`, '', 'preferences');
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/** (093) Extension links: links to other tools in the builder's Extensions menu. */
|
|
222
|
+
function linksRegion(s: Session, w: { id: number }, links: { id: number; label: string; url: string; description: string | null; position: number }[]) {
|
|
223
|
+
return region('Extension links', html`<p class="muted u-mt0">Links to other tools this workspace's developers use (monitoring, a wiki, a ticket system), in the builder's <strong>Extensions</strong> menu while the workspace is current. They open in a new tab.</p>
|
|
224
|
+
<div class="table-wrap"><table class="report report-reflow">
|
|
225
|
+
<thead><tr><th>Label</th><th>URL</th><th class="num">Order</th><th></th></tr></thead>
|
|
226
|
+
<tbody>${links.length
|
|
227
|
+
? links.map((l) => html`<tr><td data-label="Label">${l.label}${l.description ? html` <span class="muted">${l.description}</span>` : ''}</td>
|
|
228
|
+
<td data-label="URL" class="u-break"><a href="${l.url}" target="_blank" rel="noopener noreferrer">${l.url}</a></td>
|
|
229
|
+
<td class="num" data-label="Order">${l.position}</td>
|
|
230
|
+
<td><form method="post" action="${BASE}/workspaces/${w.id}/links/${l.id}/delete">${csrf(s)}<button class="btn btn-sm btn-danger" data-confirm="Delete the link ${l.label}?">Delete</button></form></td></tr>`)
|
|
231
|
+
: html`<tr><td colspan="4" class="empty">No extension links.</td></tr>`}</tbody></table></div>
|
|
232
|
+
<form method="post" action="${BASE}/workspaces/${w.id}/links" class="u-mt1">${csrf(s)}
|
|
233
|
+
<div class="form-grid">
|
|
234
|
+
${input('label', 'Label', '', { required: true, placeholder: 'Monitoring' })}
|
|
235
|
+
${input('url', 'URL', '', { required: true, type: 'url', placeholder: 'https://grafana.example.com', help: 'http:// or https://' })}
|
|
236
|
+
${input('description', 'Description', '')}
|
|
237
|
+
${input('position', 'Order', '0', { type: 'number' })}
|
|
238
|
+
</div>
|
|
239
|
+
<div class="buttons"><button class="btn">${icon('plus')} Add link</button></div></form>`, '', 'links');
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
const LINK_LABEL = /^\S(.{0,58}\S)?$/;
|
|
243
|
+
const LINK_URL = /^https?:\/\/[^\s<>"]+$/;
|
|
244
|
+
|
|
209
245
|
export async function workspaceRoutes(app: FastifyInstance) {
|
|
210
246
|
// switch the current workspace (any of the developer's own)
|
|
211
247
|
app.post(`${BASE}/workspace`, async (req: Req, reply) => {
|
|
@@ -293,6 +329,7 @@ export async function workspaceRoutes(app: FastifyInstance) {
|
|
|
293
329
|
),
|
|
294
330
|
]);
|
|
295
331
|
const roles = rolesQ;
|
|
332
|
+
const links = (await owner.query('select id, label, url, description, position from meta.workspace_link where workspace_id = $1 order by position, lower(label)', [w.id])).rows;
|
|
296
333
|
const main = html`
|
|
297
334
|
<div class="title-row"><h1>${w.name}</h1></div>
|
|
298
335
|
<div class="columns wide-left">
|
|
@@ -316,6 +353,7 @@ export async function workspaceRoutes(app: FastifyInstance) {
|
|
|
316
353
|
<div class="buttons"><button class="btn">Save developers</button></div></form>`)}
|
|
317
354
|
</div>
|
|
318
355
|
${serviceRegion(s, w)}
|
|
356
|
+
<div class="columns">${preferencesRegion(s, w)}${linksRegion(s, w, links)}</div>
|
|
319
357
|
${full ? isolationRegion(s, w, roles.rows) : region('Isolation', html`<p class="u-mt0">${w.isolated ? 'Isolated: its applications and SQL run on database logins of its own.' : 'Shared.'} Administrators change it.</p>`)}
|
|
320
358
|
${!full ? '' : region('Applications', html`<div class="table-wrap"><table class="report report-reflow">
|
|
321
359
|
<thead><tr><th>Application</th><th>Move to</th></tr></thead>
|
|
@@ -494,6 +532,50 @@ export async function workspaceRoutes(app: FastifyInstance) {
|
|
|
494
532
|
return back(reply, s, `${BASE}/workspaces/${req.params.id}`);
|
|
495
533
|
});
|
|
496
534
|
|
|
535
|
+
// (093) workspace preferences
|
|
536
|
+
app.post(`${BASE}/workspaces/:id(^\\d{1,9}$)/preferences`, async (req: Req, reply) => {
|
|
537
|
+
const s = await developer(req, reply);
|
|
538
|
+
if (!s || !(await workspaceAdminOnly(s, reply, req.params.id))) return;
|
|
539
|
+
const sql = req.body?.sql_workshop === 'true';
|
|
540
|
+
const rest = req.body?.rest_services === 'true';
|
|
541
|
+
const r = await owner.query('update meta.workspace set sql_workshop = $2, rest_services = $3 where id = $1', [req.params.id, sql, rest]);
|
|
542
|
+
if (!r.rowCount) return reply.code(404).send('Not found');
|
|
543
|
+
await logActivity({ appId: null, username: s.username, event: 'workspace', ip: clientIp(req), detail: `workspace ${req.params.id}: SQL Workshop ${sql ? 'on' : 'off'}, RESTful services ${rest ? 'on' : 'off'}` });
|
|
544
|
+
flash(s, 'Preferences saved.');
|
|
545
|
+
return back(reply, s, `${BASE}/workspaces/${req.params.id}`);
|
|
546
|
+
});
|
|
547
|
+
|
|
548
|
+
// (093) extension links
|
|
549
|
+
app.post(`${BASE}/workspaces/:id(^\\d{1,9}$)/links`, async (req: Req, reply) => {
|
|
550
|
+
const s = await developer(req, reply);
|
|
551
|
+
if (!s || !(await workspaceAdminOnly(s, reply, req.params.id))) return;
|
|
552
|
+
const label = String(req.body?.label ?? '').trim();
|
|
553
|
+
const url = String(req.body?.url ?? '').trim();
|
|
554
|
+
const description = String(req.body?.description ?? '').trim();
|
|
555
|
+
const position = Number(req.body?.position || 0);
|
|
556
|
+
try {
|
|
557
|
+
if (!LINK_LABEL.test(label)) throw new Error('The label is 1 to 60 characters.');
|
|
558
|
+
if (!LINK_URL.test(url) || url.length > 2000 || !URL.canParse(url)) throw new Error('The URL starts with http:// or https://.');
|
|
559
|
+
if (description.length > 500) throw new Error('The description is at most 500 characters.');
|
|
560
|
+
if (!Number.isInteger(position) || Math.abs(position) > 100000) throw new Error('The order is a whole number.');
|
|
561
|
+
await owner.query('insert into meta.workspace_link (workspace_id, label, url, description, position) values ($1, $2, $3, $4, $5)', [req.params.id, label, url, description || null, position]);
|
|
562
|
+
await logActivity({ appId: null, username: s.username, event: 'workspace', ip: clientIp(req), detail: `workspace ${req.params.id}: extension link ${label}` });
|
|
563
|
+
flash(s, `Link ${label} added.`);
|
|
564
|
+
} catch (e) {
|
|
565
|
+
const err = e as { code?: string; message: string };
|
|
566
|
+
flash(s, err.code === '23505' ? `There is a link ${label} already.` : err.code === '23503' ? 'Not found.' : err.code ? 'The link was not saved.' : err.message, 'error');
|
|
567
|
+
}
|
|
568
|
+
return back(reply, s, `${BASE}/workspaces/${req.params.id}#links`);
|
|
569
|
+
});
|
|
570
|
+
|
|
571
|
+
app.post(`${BASE}/workspaces/:id(^\\d{1,9}$)/links/:lid(^\\d{1,9}$)/delete`, async (req: Req, reply) => {
|
|
572
|
+
const s = await developer(req, reply);
|
|
573
|
+
if (!s || !(await workspaceAdminOnly(s, reply, req.params.id))) return;
|
|
574
|
+
const r = await owner.query('delete from meta.workspace_link where id = $2 and workspace_id = $1', [req.params.id, req.params.lid]);
|
|
575
|
+
flash(s, r.rowCount ? 'Link deleted.' : 'Not found.', r.rowCount ? 'ok' : 'error');
|
|
576
|
+
return back(reply, s, `${BASE}/workspaces/${req.params.id}#links`);
|
|
577
|
+
});
|
|
578
|
+
|
|
497
579
|
// (091) workspace utilization: its applications, their size and use, its schemas' storage
|
|
498
580
|
app.get(`${BASE}/workspaces/:id(^\\d{1,9}$)/utilization`, async (req: Req, reply) => {
|
|
499
581
|
const s = await developer(req, reply);
|
package/src/cli/replace.ts
CHANGED
|
@@ -57,6 +57,8 @@ export const KEPT = ['app_access', 'api_client', 'session', 'sso_pending', 'save
|
|
|
57
57
|
'workspace_app',
|
|
58
58
|
// (092) the application's group in the App Builder
|
|
59
59
|
'app_group_member',
|
|
60
|
+
// (094) users' vacation rules (user data, like the tasks)
|
|
61
|
+
'task_vacation',
|
|
60
62
|
// (074) push notifications: the app's VAPID keys, users' devices, queued notifications
|
|
61
63
|
'push_key', 'push_subscription', 'push_message',
|
|
62
64
|
// (082) the application's backups, (084) users' feedback
|
package/src/i18n/ar.ts
CHANGED
|
@@ -265,6 +265,20 @@ export const ar: Record<MessageKey, string> = {
|
|
|
265
265
|
'tasks.done.delegate': "تم التفويض.",
|
|
266
266
|
'tasks.done.cancel': "أُلغيت المهمة.",
|
|
267
267
|
'tasks.done.comment': "أُضيف التعليق.",
|
|
268
|
+
'tasks.expired': "منتهية",
|
|
269
|
+
'tasks.event.expired': "منتهية (لم يُتخذ قرار في الوقت المحدد)",
|
|
270
|
+
'tasks.event.renewed': "مدّد الموعد النهائي",
|
|
271
|
+
'tasks.event.escalated': "صعّد المهمة",
|
|
272
|
+
'tasks.vacation': "قاعدة الإجازة",
|
|
273
|
+
'tasks.vacation_help': "أثناء غيابك، يمكن للمستخدم الذي تحدده هنا التعامل مع مهامك.",
|
|
274
|
+
'tasks.vacation_to': "البديل",
|
|
275
|
+
'tasks.vacation_from': "من",
|
|
276
|
+
'tasks.vacation_until': "حتى",
|
|
277
|
+
'tasks.vacation_save': "حفظ قاعدة الإجازة",
|
|
278
|
+
'tasks.vacation_clear': "إزالة قاعدة الإجازة",
|
|
279
|
+
'tasks.vacation_active': "يتولى {user} مهامك من {from} حتى {until}.",
|
|
280
|
+
'tasks.done.vacation': "تم حفظ قاعدة الإجازة.",
|
|
281
|
+
'tasks.done.vacation_clear': "تمت إزالة قاعدة الإجازة.",
|
|
268
282
|
'login.remember': "إبقائي مسجّلًا لمدة {days} يوم",
|
|
269
283
|
'error.document_unavailable': "هذا المستند غير متاح.",
|
|
270
284
|
'login.sso_continue': "جارٍ إكمال تسجيل الدخول…",
|
|
@@ -476,6 +490,17 @@ export const ar: Record<MessageKey, string> = {
|
|
|
476
490
|
'chart.polar': "قطبي",
|
|
477
491
|
'chart.no_gantt': "يحتاج مخطط جانت إلى عمود تسميات وتاريخ بداية وتاريخ نهاية (يمكن ترك النهاية فارغة للمعالم).",
|
|
478
492
|
'chart.today': "اليوم",
|
|
493
|
+
'chart.range': "نطاق",
|
|
494
|
+
'chart.boxplot': "مخطط صندوقي",
|
|
495
|
+
'chart.stock': "أسهم",
|
|
496
|
+
'chart.no_range': "يحتاج مخطط النطاق إلى عمود تسميات وعمودين رقميين: الأدنى والأعلى.",
|
|
497
|
+
'chart.no_boxplot': "يحتاج المخطط الصندوقي إلى عمود تسميات وإما عمود رقمي واحد (صف لكل قيمة) أو خمسة: الحد الأدنى والربيع الأول والوسيط والربيع الثالث والحد الأقصى.",
|
|
498
|
+
'chart.no_stock': "يحتاج مخطط الأسهم إلى عمود تسميات (التاريخ) وأربعة أعمدة رقمية: الافتتاح والأعلى والأدنى والإغلاق.",
|
|
499
|
+
'chart.min': "الحد الأدنى",
|
|
500
|
+
'chart.q1': "الربيع الأول",
|
|
501
|
+
'chart.median': "الوسيط",
|
|
502
|
+
'chart.q3': "الربيع الثالث",
|
|
503
|
+
'chart.max': "الحد الأقصى",
|
|
479
504
|
'chart.no_bubble': "يحتاج المخطط الفقاعي إلى عمود تسميات وثلاثة أعمدة رقمية: x وy والحجم.",
|
|
480
505
|
'chart.no_radar': "يحتاج المخطط الراداري إلى ثلاثة صفوف على الأقل، صف لكل محور.",
|
|
481
506
|
'chart.status_good': "ضمن الهدف",
|
package/src/i18n/cs.ts
CHANGED
|
@@ -265,6 +265,20 @@ export const cs: Record<MessageKey, string> = {
|
|
|
265
265
|
'tasks.done.delegate': "Předáno.",
|
|
266
266
|
'tasks.done.cancel': "Úkol byl zrušen.",
|
|
267
267
|
'tasks.done.comment': "Komentář byl přidán.",
|
|
268
|
+
'tasks.expired': "propadlo",
|
|
269
|
+
'tasks.event.expired': "propadlo (nerozhodnuto včas)",
|
|
270
|
+
'tasks.event.renewed': "prodloužil lhůtu",
|
|
271
|
+
'tasks.event.escalated': "eskaloval úkol",
|
|
272
|
+
'tasks.vacation': "Pravidlo pro dovolenou",
|
|
273
|
+
'tasks.vacation_help': "Během vaší nepřítomnosti může zde uvedený uživatel vyřizovat vaše úkoly.",
|
|
274
|
+
'tasks.vacation_to': "Zástupce",
|
|
275
|
+
'tasks.vacation_from': "Od",
|
|
276
|
+
'tasks.vacation_until': "Do",
|
|
277
|
+
'tasks.vacation_save': "Uložit pravidlo pro dovolenou",
|
|
278
|
+
'tasks.vacation_clear': "Odebrat pravidlo pro dovolenou",
|
|
279
|
+
'tasks.vacation_active': "{user} vyřizuje vaše úkoly od {from} do {until}.",
|
|
280
|
+
'tasks.done.vacation': "Pravidlo pro dovolenou bylo uloženo.",
|
|
281
|
+
'tasks.done.vacation_clear': "Pravidlo pro dovolenou bylo odebráno.",
|
|
268
282
|
'login.remember': "Zůstat přihlášen {days} dní",
|
|
269
283
|
'error.document_unavailable': "Tento dokument není k dispozici.",
|
|
270
284
|
'login.sso_continue': "Dokončování přihlášení…",
|
|
@@ -476,6 +490,17 @@ export const cs: Record<MessageKey, string> = {
|
|
|
476
490
|
'chart.polar': "Polární",
|
|
477
491
|
'chart.no_gantt': "Ganttův diagram vyžaduje sloupec popisků, počáteční a koncové datum (milníky mohou konec vynechat).",
|
|
478
492
|
'chart.today': "Dnes",
|
|
493
|
+
'chart.range': "Rozsah",
|
|
494
|
+
'chart.boxplot': "Krabicový graf",
|
|
495
|
+
'chart.stock': "Burzovní",
|
|
496
|
+
'chart.no_range': "Graf rozsahu potřebuje sloupec popisků a dva číselné sloupce: dolní a horní hodnotu.",
|
|
497
|
+
'chart.no_boxplot': "Krabicový graf potřebuje sloupec popisků a buď jeden číselný sloupec (řádek pro každou hodnotu), nebo pět: minimum, první kvartil, medián, třetí kvartil a maximum.",
|
|
498
|
+
'chart.no_stock': "Burzovní graf potřebuje sloupec popisků (datum) a čtyři číselné sloupce: otevření, maximum, minimum a uzavření.",
|
|
499
|
+
'chart.min': "Minimum",
|
|
500
|
+
'chart.q1': "První kvartil",
|
|
501
|
+
'chart.median': "Medián",
|
|
502
|
+
'chart.q3': "Třetí kvartil",
|
|
503
|
+
'chart.max': "Maximum",
|
|
479
504
|
'chart.no_bubble': "Bublinový graf vyžaduje sloupec popisků a tři číselné sloupce: x, y a velikost.",
|
|
480
505
|
'chart.no_radar': "Paprskový graf vyžaduje alespoň tři řádky, jeden na osu.",
|
|
481
506
|
'chart.status_good': "V cíli",
|
package/src/i18n/da.ts
CHANGED
|
@@ -265,6 +265,20 @@ export const da: Record<MessageKey, string> = {
|
|
|
265
265
|
'tasks.done.delegate': "Uddelegeret.",
|
|
266
266
|
'tasks.done.cancel': "Opgaven er annulleret.",
|
|
267
267
|
'tasks.done.comment': "Kommentaren er tilføjet.",
|
|
268
|
+
'tasks.expired': "udløbet",
|
|
269
|
+
'tasks.event.expired': "udløbet (ingen beslutning i tide)",
|
|
270
|
+
'tasks.event.renewed': "forlængede fristen",
|
|
271
|
+
'tasks.event.escalated': "eskalerede opgaven",
|
|
272
|
+
'tasks.vacation': "Ferieregel",
|
|
273
|
+
'tasks.vacation_help': "Mens du er væk, må brugeren, du angiver her, håndtere dine opgaver.",
|
|
274
|
+
'tasks.vacation_to': "Stedfortræder",
|
|
275
|
+
'tasks.vacation_from': "Fra",
|
|
276
|
+
'tasks.vacation_until': "Til og med",
|
|
277
|
+
'tasks.vacation_save': "Gem ferieregel",
|
|
278
|
+
'tasks.vacation_clear': "Fjern ferieregel",
|
|
279
|
+
'tasks.vacation_active': "{user} håndterer dine opgaver fra {from} til og med {until}.",
|
|
280
|
+
'tasks.done.vacation': "Ferieregel gemt.",
|
|
281
|
+
'tasks.done.vacation_clear': "Ferieregel fjernet.",
|
|
268
282
|
'login.remember': "Hold mig logget ind i {days} dage",
|
|
269
283
|
'error.document_unavailable': "Dokumentet er ikke tilgængeligt.",
|
|
270
284
|
'login.sso_continue': "Gennemfører login…",
|
|
@@ -476,6 +490,17 @@ export const da: Record<MessageKey, string> = {
|
|
|
476
490
|
'chart.polar': "Polær",
|
|
477
491
|
'chart.no_gantt': "Et Gantt-diagram kræver en etiketkolonne, en startdato og en slutdato (milepæle kan lade slutningen være tom).",
|
|
478
492
|
'chart.today': "I dag",
|
|
493
|
+
'chart.range': "Interval",
|
|
494
|
+
'chart.boxplot': "Boksplot",
|
|
495
|
+
'chart.stock': "Aktie",
|
|
496
|
+
'chart.no_range': "Et intervaldiagram kræver en etiketkolonne og to numeriske kolonner: lav og høj.",
|
|
497
|
+
'chart.no_boxplot': "Et boksplot kræver en etiketkolonne og enten én numerisk kolonne (en række pr. værdi) eller fem: minimum, første kvartil, median, tredje kvartil og maksimum.",
|
|
498
|
+
'chart.no_stock': "Et aktiediagram kræver en etiketkolonne (datoen) og fire numeriske kolonner: åbning, høj, lav og lukning.",
|
|
499
|
+
'chart.min': "Minimum",
|
|
500
|
+
'chart.q1': "Første kvartil",
|
|
501
|
+
'chart.median': "Median",
|
|
502
|
+
'chart.q3': "Tredje kvartil",
|
|
503
|
+
'chart.max': "Maksimum",
|
|
479
504
|
'chart.no_bubble': "Et boblediagram kræver en etiketkolonne og tre talkolonner: x, y og størrelse.",
|
|
480
505
|
'chart.no_radar': "Et radardiagram kræver mindst tre rækker, én pr. akse.",
|
|
481
506
|
'chart.status_good': "På mål",
|
package/src/i18n/de.ts
CHANGED
|
@@ -265,6 +265,20 @@ export const de: Record<MessageKey, string> = {
|
|
|
265
265
|
'tasks.done.delegate': 'Delegiert.',
|
|
266
266
|
'tasks.done.cancel': 'Aufgabe abgebrochen.',
|
|
267
267
|
'tasks.done.comment': 'Kommentar hinzugefügt.',
|
|
268
|
+
'tasks.expired': 'abgelaufen',
|
|
269
|
+
'tasks.event.expired': 'abgelaufen (nicht rechtzeitig entschieden)',
|
|
270
|
+
'tasks.event.renewed': 'verlängerte die Frist',
|
|
271
|
+
'tasks.event.escalated': 'eskalierte die Aufgabe',
|
|
272
|
+
'tasks.vacation': 'Abwesenheitsregel',
|
|
273
|
+
'tasks.vacation_help': 'Während Sie abwesend sind, darf die hier genannte Person Ihre Aufgaben bearbeiten.',
|
|
274
|
+
'tasks.vacation_to': 'Vertretung',
|
|
275
|
+
'tasks.vacation_from': 'Von',
|
|
276
|
+
'tasks.vacation_until': 'Bis',
|
|
277
|
+
'tasks.vacation_save': 'Abwesenheitsregel speichern',
|
|
278
|
+
'tasks.vacation_clear': 'Abwesenheitsregel entfernen',
|
|
279
|
+
'tasks.vacation_active': '{user} bearbeitet Ihre Aufgaben von {from} bis {until}.',
|
|
280
|
+
'tasks.done.vacation': 'Abwesenheitsregel gespeichert.',
|
|
281
|
+
'tasks.done.vacation_clear': 'Abwesenheitsregel entfernt.',
|
|
268
282
|
'login.remember': '{days} Tage angemeldet bleiben',
|
|
269
283
|
'error.document_unavailable': 'Dieses Dokument ist nicht verfügbar.',
|
|
270
284
|
'login.sso_continue': 'Anmeldung wird abgeschlossen…',
|
|
@@ -437,6 +451,17 @@ export const de: Record<MessageKey, string> = {
|
|
|
437
451
|
'chart.polar': 'Polar',
|
|
438
452
|
'chart.no_gantt': 'Ein Gantt-Diagramm benötigt eine Beschriftungsspalte, ein Startdatum und ein Enddatum (Meilensteine dürfen das Ende leer lassen).',
|
|
439
453
|
'chart.today': 'Heute',
|
|
454
|
+
'chart.range': 'Bereich',
|
|
455
|
+
'chart.boxplot': 'Boxplot',
|
|
456
|
+
'chart.stock': 'Kurs',
|
|
457
|
+
'chart.no_range': 'Ein Bereichsdiagramm benötigt eine Beschriftungsspalte und zwei numerische Spalten: Tief und Hoch.',
|
|
458
|
+
'chart.no_boxplot': 'Ein Boxplot benötigt eine Beschriftungsspalte und entweder eine numerische Spalte (eine Zeile pro Wert) oder fünf: Minimum, erstes Quartil, Median, drittes Quartil und Maximum.',
|
|
459
|
+
'chart.no_stock': 'Ein Kursdiagramm benötigt eine Beschriftungsspalte (das Datum) und vier numerische Spalten: Eröffnung, Hoch, Tief und Schluss.',
|
|
460
|
+
'chart.min': 'Minimum',
|
|
461
|
+
'chart.q1': 'Erstes Quartil',
|
|
462
|
+
'chart.median': 'Median',
|
|
463
|
+
'chart.q3': 'Drittes Quartil',
|
|
464
|
+
'chart.max': 'Maximum',
|
|
440
465
|
'chart.no_bubble': 'Ein Blasendiagramm benötigt eine Beschriftungsspalte und drei numerische Spalten: x, y und Größe.',
|
|
441
466
|
'chart.no_radar': 'Ein Netzdiagramm benötigt mindestens drei Zeilen, eine pro Achse.',
|
|
442
467
|
'chart.status_good': 'Im Ziel',
|
package/src/i18n/el.ts
CHANGED
|
@@ -265,6 +265,20 @@ export const el: Record<MessageKey, string> = {
|
|
|
265
265
|
'tasks.done.delegate': "Ανατέθηκε.",
|
|
266
266
|
'tasks.done.cancel': "Η εργασία ακυρώθηκε.",
|
|
267
267
|
'tasks.done.comment': "Το σχόλιο προστέθηκε.",
|
|
268
|
+
'tasks.expired': "έληξε",
|
|
269
|
+
'tasks.event.expired': "έληξε (καμία απόφαση εγκαίρως)",
|
|
270
|
+
'tasks.event.renewed': "παρέτεινε την προθεσμία",
|
|
271
|
+
'tasks.event.escalated': "κλιμάκωσε την εργασία",
|
|
272
|
+
'tasks.vacation': "Κανόνας άδειας",
|
|
273
|
+
'tasks.vacation_help': "Όσο λείπετε, ο χρήστης που ορίζετε εδώ μπορεί να χειρίζεται τις εργασίες σας.",
|
|
274
|
+
'tasks.vacation_to': "Αναπληρωτής",
|
|
275
|
+
'tasks.vacation_from': "Από",
|
|
276
|
+
'tasks.vacation_until': "Έως",
|
|
277
|
+
'tasks.vacation_save': "Αποθήκευση κανόνα άδειας",
|
|
278
|
+
'tasks.vacation_clear': "Κατάργηση κανόνα άδειας",
|
|
279
|
+
'tasks.vacation_active': "Ο χρήστης {user} χειρίζεται τις εργασίες σας από {from} έως {until}.",
|
|
280
|
+
'tasks.done.vacation': "Ο κανόνας άδειας αποθηκεύτηκε.",
|
|
281
|
+
'tasks.done.vacation_clear': "Ο κανόνας άδειας καταργήθηκε.",
|
|
268
282
|
'login.remember': "Να παραμείνω συνδεδεμένος για {days} ημέρες",
|
|
269
283
|
'error.document_unavailable': "Αυτό το έγγραφο δεν είναι διαθέσιμο.",
|
|
270
284
|
'login.sso_continue': "Ολοκλήρωση σύνδεσης…",
|
|
@@ -476,6 +490,17 @@ export const el: Record<MessageKey, string> = {
|
|
|
476
490
|
'chart.polar': "Πολικό",
|
|
477
491
|
'chart.no_gantt': "Ένα γράφημα Gantt χρειάζεται στήλη ετικετών, ημερομηνία έναρξης και ημερομηνία λήξης (τα ορόσημα μπορούν να αφήσουν κενή τη λήξη).",
|
|
478
492
|
'chart.today': "Σήμερα",
|
|
493
|
+
'chart.range': "Εύρος",
|
|
494
|
+
'chart.boxplot': "Θηκόγραμμα",
|
|
495
|
+
'chart.stock': "Μετοχές",
|
|
496
|
+
'chart.no_range': "Ένα γράφημα εύρους χρειάζεται μια στήλη ετικετών και δύο αριθμητικές στήλες: χαμηλή και υψηλή.",
|
|
497
|
+
'chart.no_boxplot': "Ένα θηκόγραμμα χρειάζεται μια στήλη ετικετών και είτε μία αριθμητική στήλη (μία γραμμή ανά τιμή) είτε πέντε: ελάχιστο, πρώτο τεταρτημόριο, διάμεσο, τρίτο τεταρτημόριο και μέγιστο.",
|
|
498
|
+
'chart.no_stock': "Ένα γράφημα μετοχών χρειάζεται μια στήλη ετικετών (την ημερομηνία) και τέσσερις αριθμητικές στήλες: άνοιγμα, υψηλό, χαμηλό και κλείσιμο.",
|
|
499
|
+
'chart.min': "Ελάχιστο",
|
|
500
|
+
'chart.q1': "Πρώτο τεταρτημόριο",
|
|
501
|
+
'chart.median': "Διάμεσος",
|
|
502
|
+
'chart.q3': "Τρίτο τεταρτημόριο",
|
|
503
|
+
'chart.max': "Μέγιστο",
|
|
479
504
|
'chart.no_bubble': "Ένα γράφημα φυσαλίδων χρειάζεται στήλη ετικετών και τρεις αριθμητικές στήλες: x, y και μέγεθος.",
|
|
480
505
|
'chart.no_radar': "Ένα γράφημα ραντάρ χρειάζεται τουλάχιστον τρεις γραμμές, μία ανά άξονα.",
|
|
481
506
|
'chart.status_good': "Εντός στόχου",
|
package/src/i18n/es.ts
CHANGED
|
@@ -265,6 +265,20 @@ export const es: Record<MessageKey, string> = {
|
|
|
265
265
|
'tasks.done.delegate': 'Delegada.',
|
|
266
266
|
'tasks.done.cancel': 'Tarea cancelada.',
|
|
267
267
|
'tasks.done.comment': 'Comentario añadido.',
|
|
268
|
+
'tasks.expired': 'vencida',
|
|
269
|
+
'tasks.event.expired': 'vencida (sin decisión a tiempo)',
|
|
270
|
+
'tasks.event.renewed': 'amplió el plazo',
|
|
271
|
+
'tasks.event.escalated': 'escaló la tarea',
|
|
272
|
+
'tasks.vacation': 'Regla de vacaciones',
|
|
273
|
+
'tasks.vacation_help': 'Mientras esté ausente, el usuario que indique aquí puede gestionar sus tareas.',
|
|
274
|
+
'tasks.vacation_to': 'Sustituto',
|
|
275
|
+
'tasks.vacation_from': 'Desde',
|
|
276
|
+
'tasks.vacation_until': 'Hasta',
|
|
277
|
+
'tasks.vacation_save': 'Guardar regla de vacaciones',
|
|
278
|
+
'tasks.vacation_clear': 'Eliminar regla de vacaciones',
|
|
279
|
+
'tasks.vacation_active': '{user} gestiona sus tareas desde el {from} hasta el {until}.',
|
|
280
|
+
'tasks.done.vacation': 'Regla de vacaciones guardada.',
|
|
281
|
+
'tasks.done.vacation_clear': 'Regla de vacaciones eliminada.',
|
|
268
282
|
'login.remember': 'Mantener la sesión iniciada durante {days} días',
|
|
269
283
|
'error.document_unavailable': 'Este documento no está disponible.',
|
|
270
284
|
'login.sso_continue': 'Completando el inicio de sesión…',
|
|
@@ -437,6 +451,17 @@ export const es: Record<MessageKey, string> = {
|
|
|
437
451
|
'chart.polar': 'Polar',
|
|
438
452
|
'chart.no_gantt': 'Un diagrama de Gantt necesita una columna de etiqueta, una fecha de inicio y una fecha de fin (los hitos pueden dejar el fin vacío).',
|
|
439
453
|
'chart.today': 'Hoy',
|
|
454
|
+
'chart.range': 'Rango',
|
|
455
|
+
'chart.boxplot': 'Diagrama de caja',
|
|
456
|
+
'chart.stock': 'Bursátil',
|
|
457
|
+
'chart.no_range': 'Un gráfico de rango necesita una columna de etiquetas y dos columnas numéricas: mínimo y máximo.',
|
|
458
|
+
'chart.no_boxplot': 'Un diagrama de caja necesita una columna de etiquetas y una columna numérica (una fila por valor) o cinco: mínimo, primer cuartil, mediana, tercer cuartil y máximo.',
|
|
459
|
+
'chart.no_stock': 'Un gráfico bursátil necesita una columna de etiquetas (la fecha) y cuatro columnas numéricas: apertura, máximo, mínimo y cierre.',
|
|
460
|
+
'chart.min': 'Mínimo',
|
|
461
|
+
'chart.q1': 'Primer cuartil',
|
|
462
|
+
'chart.median': 'Mediana',
|
|
463
|
+
'chart.q3': 'Tercer cuartil',
|
|
464
|
+
'chart.max': 'Máximo',
|
|
440
465
|
'chart.no_bubble': 'Un gráfico de burbujas necesita una columna de etiquetas y tres columnas numéricas: x, y y tamaño.',
|
|
441
466
|
'chart.no_radar': 'Un gráfico de radar necesita al menos tres filas, una por eje.',
|
|
442
467
|
'chart.status_good': 'En el objetivo',
|
package/src/i18n/fi.ts
CHANGED
|
@@ -265,6 +265,20 @@ export const fi: Record<MessageKey, string> = {
|
|
|
265
265
|
'tasks.done.delegate': "Delegoitu.",
|
|
266
266
|
'tasks.done.cancel': "Tehtävä peruttu.",
|
|
267
267
|
'tasks.done.comment': "Kommentti lisätty.",
|
|
268
|
+
'tasks.expired': "vanhentunut",
|
|
269
|
+
'tasks.event.expired': "vanhentunut (ei päätöstä ajoissa)",
|
|
270
|
+
'tasks.event.renewed': "pidensi määräaikaa",
|
|
271
|
+
'tasks.event.escalated': "eskaloi tehtävän",
|
|
272
|
+
'tasks.vacation': "Lomasääntö",
|
|
273
|
+
'tasks.vacation_help': "Poissaolosi aikana tässä nimeämäsi käyttäjä voi käsitellä tehtäväsi.",
|
|
274
|
+
'tasks.vacation_to': "Sijainen",
|
|
275
|
+
'tasks.vacation_from': "Alkaen",
|
|
276
|
+
'tasks.vacation_until': "Asti",
|
|
277
|
+
'tasks.vacation_save': "Tallenna lomasääntö",
|
|
278
|
+
'tasks.vacation_clear': "Poista lomasääntö",
|
|
279
|
+
'tasks.vacation_active': "{user} käsittelee tehtäväsi {from}–{until}.",
|
|
280
|
+
'tasks.done.vacation': "Lomasääntö tallennettu.",
|
|
281
|
+
'tasks.done.vacation_clear': "Lomasääntö poistettu.",
|
|
268
282
|
'login.remember': "Pidä minut kirjautuneena {days} päivää",
|
|
269
283
|
'error.document_unavailable': "Tämä asiakirja ei ole saatavilla.",
|
|
270
284
|
'login.sso_continue': "Viimeistellään kirjautumista…",
|
|
@@ -476,6 +490,17 @@ export const fi: Record<MessageKey, string> = {
|
|
|
476
490
|
'chart.polar': "Polaari",
|
|
477
491
|
'chart.no_gantt': "Gantt-kaavio tarvitsee otsikkosarakkeen, alkupäivän ja loppupäivän (virstanpylväiden loppu voi olla tyhjä).",
|
|
478
492
|
'chart.today': "Tänään",
|
|
493
|
+
'chart.range': "Vaihteluväli",
|
|
494
|
+
'chart.boxplot': "Laatikkokaavio",
|
|
495
|
+
'chart.stock': "Kurssi",
|
|
496
|
+
'chart.no_range': "Vaihteluvälikaavio tarvitsee otsikkosarakkeen ja kaksi numeerista saraketta: alin ja ylin.",
|
|
497
|
+
'chart.no_boxplot': "Laatikkokaavio tarvitsee otsikkosarakkeen ja joko yhden numeerisen sarakkeen (rivi arvoa kohden) tai viisi: minimi, ensimmäinen kvartiili, mediaani, kolmas kvartiili ja maksimi.",
|
|
498
|
+
'chart.no_stock': "Kurssikaavio tarvitsee otsikkosarakkeen (päivämäärä) ja neljä numeerista saraketta: avaus, ylin, alin ja päätös.",
|
|
499
|
+
'chart.min': "Minimi",
|
|
500
|
+
'chart.q1': "Ensimmäinen kvartiili",
|
|
501
|
+
'chart.median': "Mediaani",
|
|
502
|
+
'chart.q3': "Kolmas kvartiili",
|
|
503
|
+
'chart.max': "Maksimi",
|
|
479
504
|
'chart.no_bubble': "Kuplakaavio tarvitsee otsikkosarakkeen ja kolme lukusaraketta: x, y ja koko.",
|
|
480
505
|
'chart.no_radar': "Sädekaavio tarvitsee vähintään kolme riviä, yhden kullekin akselille.",
|
|
481
506
|
'chart.status_good': "Tavoitteessa",
|
package/src/i18n/fr.ts
CHANGED
|
@@ -265,6 +265,20 @@ export const fr: Record<MessageKey, string> = {
|
|
|
265
265
|
'tasks.done.delegate': 'Déléguée.',
|
|
266
266
|
'tasks.done.cancel': 'Tâche annulée.',
|
|
267
267
|
'tasks.done.comment': 'Commentaire ajouté.',
|
|
268
|
+
'tasks.expired': 'expirée',
|
|
269
|
+
'tasks.event.expired': 'expirée (pas de décision à temps)',
|
|
270
|
+
'tasks.event.renewed': 'a prolongé l’échéance',
|
|
271
|
+
'tasks.event.escalated': 'a escaladé la tâche',
|
|
272
|
+
'tasks.vacation': 'Règle d’absence',
|
|
273
|
+
'tasks.vacation_help': 'Pendant votre absence, l’utilisateur nommé ici peut traiter vos tâches.',
|
|
274
|
+
'tasks.vacation_to': 'Remplaçant',
|
|
275
|
+
'tasks.vacation_from': 'Du',
|
|
276
|
+
'tasks.vacation_until': 'Au',
|
|
277
|
+
'tasks.vacation_save': 'Enregistrer la règle d’absence',
|
|
278
|
+
'tasks.vacation_clear': 'Supprimer la règle d’absence',
|
|
279
|
+
'tasks.vacation_active': '{user} traite vos tâches du {from} au {until}.',
|
|
280
|
+
'tasks.done.vacation': 'Règle d’absence enregistrée.',
|
|
281
|
+
'tasks.done.vacation_clear': 'Règle d’absence supprimée.',
|
|
268
282
|
'login.remember': 'Rester connecté pendant {days} jours',
|
|
269
283
|
'error.document_unavailable': 'Ce document n’est pas disponible.',
|
|
270
284
|
'login.sso_continue': 'Finalisation de la connexion…',
|
|
@@ -437,6 +451,17 @@ export const fr: Record<MessageKey, string> = {
|
|
|
437
451
|
'chart.polar': 'Polaire',
|
|
438
452
|
'chart.no_gantt': 'Un diagramme de Gantt nécessite une colonne de libellé, une date de début et une date de fin (les jalons peuvent laisser la fin vide).',
|
|
439
453
|
'chart.today': 'Aujourd’hui',
|
|
454
|
+
'chart.range': 'Plage',
|
|
455
|
+
'chart.boxplot': 'Boîte à moustaches',
|
|
456
|
+
'chart.stock': 'Boursier',
|
|
457
|
+
'chart.no_range': 'Un graphique de plage nécessite une colonne de libellés et deux colonnes numériques : bas et haut.',
|
|
458
|
+
'chart.no_boxplot': 'Une boîte à moustaches nécessite une colonne de libellés et soit une colonne numérique (une ligne par valeur), soit cinq : minimum, premier quartile, médiane, troisième quartile et maximum.',
|
|
459
|
+
'chart.no_stock': 'Un graphique boursier nécessite une colonne de libellés (la date) et quatre colonnes numériques : ouverture, haut, bas et clôture.',
|
|
460
|
+
'chart.min': 'Minimum',
|
|
461
|
+
'chart.q1': 'Premier quartile',
|
|
462
|
+
'chart.median': 'Médiane',
|
|
463
|
+
'chart.q3': 'Troisième quartile',
|
|
464
|
+
'chart.max': 'Maximum',
|
|
440
465
|
'chart.no_bubble': 'Un graphique à bulles nécessite une colonne de libellé et trois colonnes numériques : x, y et taille.',
|
|
441
466
|
'chart.no_radar': 'Un graphique radar nécessite au moins trois lignes, une par axe.',
|
|
442
467
|
'chart.status_good': 'Objectif atteint',
|
package/src/i18n/he.ts
CHANGED
|
@@ -265,6 +265,20 @@ export const he: Record<MessageKey, string> = {
|
|
|
265
265
|
'tasks.done.delegate': "הואצל.",
|
|
266
266
|
'tasks.done.cancel': "המשימה בוטלה.",
|
|
267
267
|
'tasks.done.comment': "ההערה נוספה.",
|
|
268
|
+
'tasks.expired': "פג תוקף",
|
|
269
|
+
'tasks.event.expired': "פג תוקף (לא התקבלה החלטה בזמן)",
|
|
270
|
+
'tasks.event.renewed': "האריך את המועד",
|
|
271
|
+
'tasks.event.escalated': "הסלים את המשימה",
|
|
272
|
+
'tasks.vacation': "כלל חופשה",
|
|
273
|
+
'tasks.vacation_help': "בזמן היעדרותך, המשתמש שתציין כאן יכול לטפל במשימות שלך.",
|
|
274
|
+
'tasks.vacation_to': "ממלא מקום",
|
|
275
|
+
'tasks.vacation_from': "מתאריך",
|
|
276
|
+
'tasks.vacation_until': "עד תאריך",
|
|
277
|
+
'tasks.vacation_save': "שמירת כלל החופשה",
|
|
278
|
+
'tasks.vacation_clear': "הסרת כלל החופשה",
|
|
279
|
+
'tasks.vacation_active': "{user} מטפל במשימות שלך מ-{from} עד {until}.",
|
|
280
|
+
'tasks.done.vacation': "כלל החופשה נשמר.",
|
|
281
|
+
'tasks.done.vacation_clear': "כלל החופשה הוסר.",
|
|
268
282
|
'login.remember': "להשאיר אותי מחובר {days} ימים",
|
|
269
283
|
'error.document_unavailable': "המסמך אינו זמין.",
|
|
270
284
|
'login.sso_continue': "משלים את הכניסה…",
|
|
@@ -476,6 +490,17 @@ export const he: Record<MessageKey, string> = {
|
|
|
476
490
|
'chart.polar': "קוטבי",
|
|
477
491
|
'chart.no_gantt': "תרשים גאנט צריך עמודת תוויות, תאריך התחלה ותאריך סיום (באבני דרך הסיום יכול להישאר ריק).",
|
|
478
492
|
'chart.today': "היום",
|
|
493
|
+
'chart.range': "טווח",
|
|
494
|
+
'chart.boxplot': "תרשים קופסה",
|
|
495
|
+
'chart.stock': "מניות",
|
|
496
|
+
'chart.no_range': "תרשים טווח צריך עמודת תוויות ושתי עמודות מספריות: נמוך וגבוה.",
|
|
497
|
+
'chart.no_boxplot': "תרשים קופסה צריך עמודת תוויות ועמודה מספרית אחת (שורה לכל ערך) או חמש: מינימום, רבעון ראשון, חציון, רבעון שלישי ומקסימום.",
|
|
498
|
+
'chart.no_stock': "תרשים מניות צריך עמודת תוויות (התאריך) וארבע עמודות מספריות: פתיחה, גבוה, נמוך וסגירה.",
|
|
499
|
+
'chart.min': "מינימום",
|
|
500
|
+
'chart.q1': "רבעון ראשון",
|
|
501
|
+
'chart.median': "חציון",
|
|
502
|
+
'chart.q3': "רבעון שלישי",
|
|
503
|
+
'chart.max': "מקסימום",
|
|
479
504
|
'chart.no_bubble': "תרשים בועות צריך עמודת תוויות ושלוש עמודות מספריות: x, y וגודל.",
|
|
480
505
|
'chart.no_radar': "תרשים מכ\"ם צריך לפחות שלוש שורות, אחת לכל ציר.",
|
|
481
506
|
'chart.status_good': "ביעד",
|
package/src/i18n/it.ts
CHANGED
|
@@ -265,6 +265,20 @@ export const it: Record<MessageKey, string> = {
|
|
|
265
265
|
'tasks.done.delegate': "Delegato.",
|
|
266
266
|
'tasks.done.cancel': "Compito annullato.",
|
|
267
267
|
'tasks.done.comment': "Commento aggiunto.",
|
|
268
|
+
'tasks.expired': "scaduta",
|
|
269
|
+
'tasks.event.expired': "scaduta (nessuna decisione in tempo)",
|
|
270
|
+
'tasks.event.renewed': "ha prorogato la scadenza",
|
|
271
|
+
'tasks.event.escalated': "ha inoltrato l’attività a un livello superiore",
|
|
272
|
+
'tasks.vacation': "Regola per le assenze",
|
|
273
|
+
'tasks.vacation_help': "Mentre sei assente, l’utente indicato qui può gestire le tue attività.",
|
|
274
|
+
'tasks.vacation_to': "Sostituto",
|
|
275
|
+
'tasks.vacation_from': "Dal",
|
|
276
|
+
'tasks.vacation_until': "Al",
|
|
277
|
+
'tasks.vacation_save': "Salva la regola per le assenze",
|
|
278
|
+
'tasks.vacation_clear': "Rimuovi la regola per le assenze",
|
|
279
|
+
'tasks.vacation_active': "{user} gestisce le tue attività dal {from} al {until}.",
|
|
280
|
+
'tasks.done.vacation': "Regola per le assenze salvata.",
|
|
281
|
+
'tasks.done.vacation_clear': "Regola per le assenze rimossa.",
|
|
268
282
|
'login.remember': "Mantieni l'accesso per {days} giorni",
|
|
269
283
|
'error.document_unavailable': "Questo documento non è disponibile.",
|
|
270
284
|
'login.sso_continue': "Completamento dell'accesso…",
|
|
@@ -476,6 +490,17 @@ export const it: Record<MessageKey, string> = {
|
|
|
476
490
|
'chart.polar': "Polare",
|
|
477
491
|
'chart.no_gantt': "Un diagramma di Gantt richiede una colonna di etichette, una data di inizio e una di fine (le milestone possono lasciare vuota la fine).",
|
|
478
492
|
'chart.today': "Oggi",
|
|
493
|
+
'chart.range': "Intervallo",
|
|
494
|
+
'chart.boxplot': "Box plot",
|
|
495
|
+
'chart.stock': "Azionario",
|
|
496
|
+
'chart.no_range': "Un grafico a intervalli richiede una colonna di etichette e due colonne numeriche: minimo e massimo.",
|
|
497
|
+
'chart.no_boxplot': "Un box plot richiede una colonna di etichette e una colonna numerica (una riga per valore) oppure cinque: minimo, primo quartile, mediana, terzo quartile e massimo.",
|
|
498
|
+
'chart.no_stock': "Un grafico azionario richiede una colonna di etichette (la data) e quattro colonne numeriche: apertura, massimo, minimo e chiusura.",
|
|
499
|
+
'chart.min': "Minimo",
|
|
500
|
+
'chart.q1': "Primo quartile",
|
|
501
|
+
'chart.median': "Mediana",
|
|
502
|
+
'chart.q3': "Terzo quartile",
|
|
503
|
+
'chart.max': "Massimo",
|
|
479
504
|
'chart.no_bubble': "Un grafico a bolle richiede una colonna di etichette e tre colonne numeriche: x, y e dimensione.",
|
|
480
505
|
'chart.no_radar': "Un grafico radar richiede almeno tre righe, una per asse.",
|
|
481
506
|
'chart.status_good': "Nell'obiettivo",
|
package/src/i18n/ja.ts
CHANGED
|
@@ -265,6 +265,20 @@ export const ja: Record<MessageKey, string> = {
|
|
|
265
265
|
'tasks.done.delegate': "委任しました。",
|
|
266
266
|
'tasks.done.cancel': "タスクをキャンセルしました。",
|
|
267
267
|
'tasks.done.comment': "コメントを追加しました。",
|
|
268
|
+
'tasks.expired': "期限切れ",
|
|
269
|
+
'tasks.event.expired': "期限切れ(期限内に決定なし)",
|
|
270
|
+
'tasks.event.renewed': "期限を延長しました",
|
|
271
|
+
'tasks.event.escalated': "エスカレーションしました",
|
|
272
|
+
'tasks.vacation': "不在ルール",
|
|
273
|
+
'tasks.vacation_help': "不在の間、ここで指定したユーザーがあなたのタスクを処理できます。",
|
|
274
|
+
'tasks.vacation_to': "代理人",
|
|
275
|
+
'tasks.vacation_from': "開始日",
|
|
276
|
+
'tasks.vacation_until': "終了日",
|
|
277
|
+
'tasks.vacation_save': "不在ルールを保存",
|
|
278
|
+
'tasks.vacation_clear': "不在ルールを削除",
|
|
279
|
+
'tasks.vacation_active': "{from} から {until} まで {user} があなたのタスクを処理します。",
|
|
280
|
+
'tasks.done.vacation': "不在ルールを保存しました。",
|
|
281
|
+
'tasks.done.vacation_clear': "不在ルールを削除しました。",
|
|
268
282
|
'login.remember': "{days} 日間サインインしたままにする",
|
|
269
283
|
'error.document_unavailable': "このドキュメントは利用できません。",
|
|
270
284
|
'login.sso_continue': "サインインを完了しています…",
|
|
@@ -476,6 +490,17 @@ export const ja: Record<MessageKey, string> = {
|
|
|
476
490
|
'chart.polar': "極座標",
|
|
477
491
|
'chart.no_gantt': "ガントチャートにはラベルの列、開始日、終了日が必要です (マイルストーンは終了日を空にできます)。",
|
|
478
492
|
'chart.today': "今日",
|
|
493
|
+
'chart.range': "範囲",
|
|
494
|
+
'chart.boxplot': "箱ひげ図",
|
|
495
|
+
'chart.stock': "株価",
|
|
496
|
+
'chart.no_range': "範囲グラフには、ラベル列と 2 つの数値列(下限と上限)が必要です。",
|
|
497
|
+
'chart.no_boxplot': "箱ひげ図には、ラベル列と、1 つの数値列(値ごとに 1 行)または 5 つの数値列(最小値、第 1 四分位数、中央値、第 3 四分位数、最大値)が必要です。",
|
|
498
|
+
'chart.no_stock': "株価グラフには、ラベル列(日付)と 4 つの数値列(始値、高値、安値、終値)が必要です。",
|
|
499
|
+
'chart.min': "最小値",
|
|
500
|
+
'chart.q1': "第 1 四分位数",
|
|
501
|
+
'chart.median': "中央値",
|
|
502
|
+
'chart.q3': "第 3 四分位数",
|
|
503
|
+
'chart.max': "最大値",
|
|
479
504
|
'chart.no_bubble': "バブルチャートにはラベルの列と 3 つの数値列 (x、y、サイズ) が必要です。",
|
|
480
505
|
'chart.no_radar': "レーダーチャートには軸ごとに 1 行、少なくとも 3 行が必要です。",
|
|
481
506
|
'chart.status_good': "目標どおり",
|
package/src/i18n/ko.ts
CHANGED
|
@@ -265,6 +265,20 @@ export const ko: Record<MessageKey, string> = {
|
|
|
265
265
|
'tasks.done.delegate': "위임했습니다.",
|
|
266
266
|
'tasks.done.cancel': "작업을 취소했습니다.",
|
|
267
267
|
'tasks.done.comment': "댓글을 추가했습니다.",
|
|
268
|
+
'tasks.expired': "만료됨",
|
|
269
|
+
'tasks.event.expired': "만료됨(기한 내 결정 없음)",
|
|
270
|
+
'tasks.event.renewed': "기한을 연장함",
|
|
271
|
+
'tasks.event.escalated': "작업을 에스컬레이션함",
|
|
272
|
+
'tasks.vacation': "휴가 규칙",
|
|
273
|
+
'tasks.vacation_help': "부재 중에는 여기에서 지정한 사용자가 내 작업을 처리할 수 있습니다.",
|
|
274
|
+
'tasks.vacation_to': "대리인",
|
|
275
|
+
'tasks.vacation_from': "시작일",
|
|
276
|
+
'tasks.vacation_until': "종료일",
|
|
277
|
+
'tasks.vacation_save': "휴가 규칙 저장",
|
|
278
|
+
'tasks.vacation_clear': "휴가 규칙 삭제",
|
|
279
|
+
'tasks.vacation_active': "{from}부터 {until}까지 {user}님이 내 작업을 처리합니다.",
|
|
280
|
+
'tasks.done.vacation': "휴가 규칙을 저장했습니다.",
|
|
281
|
+
'tasks.done.vacation_clear': "휴가 규칙을 삭제했습니다.",
|
|
268
282
|
'login.remember': "{days}일 동안 로그인 유지",
|
|
269
283
|
'error.document_unavailable': "이 문서를 사용할 수 없습니다.",
|
|
270
284
|
'login.sso_continue': "로그인을 완료하는 중…",
|
|
@@ -476,6 +490,17 @@ export const ko: Record<MessageKey, string> = {
|
|
|
476
490
|
'chart.polar': "극좌표",
|
|
477
491
|
'chart.no_gantt': "간트 차트에는 레이블 열, 시작 날짜, 종료 날짜가 필요합니다(마일스톤은 종료를 비워 둘 수 있음).",
|
|
478
492
|
'chart.today': "오늘",
|
|
493
|
+
'chart.range': "범위",
|
|
494
|
+
'chart.boxplot': "상자 그림",
|
|
495
|
+
'chart.stock': "주가",
|
|
496
|
+
'chart.no_range': "범위 차트에는 레이블 열과 두 개의 숫자 열(최저값과 최고값)이 필요합니다.",
|
|
497
|
+
'chart.no_boxplot': "상자 그림에는 레이블 열과 숫자 열 하나(값마다 한 행) 또는 다섯 개(최솟값, 제1사분위수, 중앙값, 제3사분위수, 최댓값)가 필요합니다.",
|
|
498
|
+
'chart.no_stock': "주가 차트에는 레이블 열(날짜)과 네 개의 숫자 열(시가, 고가, 저가, 종가)이 필요합니다.",
|
|
499
|
+
'chart.min': "최솟값",
|
|
500
|
+
'chart.q1': "제1사분위수",
|
|
501
|
+
'chart.median': "중앙값",
|
|
502
|
+
'chart.q3': "제3사분위수",
|
|
503
|
+
'chart.max': "최댓값",
|
|
479
504
|
'chart.no_bubble': "거품형 차트에는 레이블 열과 숫자 열 세 개(x, y, 크기)가 필요합니다.",
|
|
480
505
|
'chart.no_radar': "방사형 차트에는 축마다 한 행씩, 최소 세 행이 필요합니다.",
|
|
481
506
|
'chart.status_good': "목표 달성",
|