diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index b33b13524c..089a4a664d 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -19336,9 +19336,6 @@ importers: '@hcengineering/core': specifier: workspace:^0.7.26 version: link:../../foundations/core/packages/core - '@hcengineering/export': - specifier: workspace:^0.7.0 - version: link:../export '@hcengineering/login': specifier: workspace:^0.7.0 version: link:../login @@ -21215,6 +21212,12 @@ importers: ../../plugins/export-resources: dependencies: + '@hcengineering/attachment': + specifier: workspace:^0.7.0 + version: link:../attachment + '@hcengineering/collaborator-client': + specifier: workspace:^0.7.18 + version: link:../../foundations/core/packages/collaborator-client '@hcengineering/converter': specifier: workspace:^0.7.0 version: link:../converter @@ -21239,6 +21242,12 @@ importers: '@hcengineering/presentation': specifier: workspace:^0.7.0 version: link:../../packages/presentation + '@hcengineering/text': + specifier: workspace:^0.7.19 + version: link:../../foundations/core/packages/text + '@hcengineering/text-editor-resources': + specifier: workspace:^0.7.0 + version: link:../text-editor-resources '@hcengineering/theme': specifier: workspace:^0.7.0 version: link:../../packages/theme diff --git a/foundations/core/packages/text-markdown/src/__tests__/robustness.test.ts b/foundations/core/packages/text-markdown/src/__tests__/robustness.test.ts new file mode 100644 index 0000000000..d61e05f88e --- /dev/null +++ b/foundations/core/packages/text-markdown/src/__tests__/robustness.test.ts @@ -0,0 +1,306 @@ +// +// Copyright © 2026 TraceX SAS. +// +// Licensed under the PolyForm Shield License 1.0.0 (the "License"); +// you may not use this file except in compliance with the License. You may +// obtain a copy of the License at https://polyformproject.org/licenses/shield/1.0.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// + +// Regression tests for the "Export to Markdown" crash on controlled documents: +// editor-only node/mark types (QMS inline review comments, notes, highlight, +// inline files, the drawing board) used to make the whole serializer throw, +// producing either a failed request or, once caught upstream, no file at all. +// These tests lock in the fix: known editor-only types degrade gracefully to +// sensible Markdown, and any *other* unrecognized type is dropped instead of +// aborting the export. +// +// Test fixtures below are plain object literals (not annotated as MarkupNode): +// MarkupNodeType/MarkupMarkType are real TS enums, so a literal like `type: +// 'node-uuid'` cannot be assigned directly to a MarkupNode-typed variable. +// Cast at the call site instead (`markup as MarkupNode`), matching the existing +// convention in markdown.test.ts. + +import { MarkupNode } from '@hcengineering/text-core' +import { markupToMarkdown } from '..' + +const options = { refUrl: 'ref://', imageUrl: 'http://localhost/' } + +describe('markupToMarkdown - editor-only / QMS node & mark types', () => { + it('does not throw on a QMS inline-review-comment mark (node-uuid) and keeps the text', () => { + const markup = { + type: 'doc', + content: [ + { + type: 'paragraph', + content: [ + { + type: 'text', + text: 'flagged during review', + marks: [{ type: 'node-uuid', attrs: { 'node-uuid': 'abc-123' } }] + } + ] + } + ] + } as unknown as MarkupNode + + expect(() => markupToMarkdown(markup, options)).not.toThrow() + expect(markupToMarkdown(markup, options)).toContain('flagged during review') + }) + + it('does not throw on a threaded inline-comment mark and keeps the text', () => { + const markup = { + type: 'doc', + content: [ + { + type: 'paragraph', + content: [ + { + type: 'text', + text: 'commented text', + marks: [{ type: 'inline-comment', attrs: { thread: 'xyz' } }] + } + ] + } + ] + } as unknown as MarkupNode + + expect(markupToMarkdown(markup, options)).toEqual('commented text') + }) + + it('renders a highlight mark as ...', () => { + const markup = { + type: 'doc', + content: [ + { + type: 'paragraph', + content: [ + { + type: 'text', + text: 'important', + marks: [{ type: 'highlight' }] + } + ] + } + ] + } as unknown as MarkupNode + + expect(markupToMarkdown(markup, options)).toEqual('important') + }) + + it('renders a note mark without dropping the underlying text', () => { + const markup = { + type: 'doc', + content: [ + { + type: 'paragraph', + content: [ + { + type: 'text', + text: 'careful here', + marks: [{ type: 'note', attrs: { kind: 'warning', title: 'double-check this value' } }] + } + ] + } + ] + } as unknown as MarkupNode + + const result = markupToMarkdown(markup, options) + expect(result).toContain('careful here') + expect(result).toContain('double-check this value') + }) + + it('renders a note mark with no title without throwing', () => { + const markup = { + type: 'doc', + content: [ + { + type: 'paragraph', + content: [ + { + type: 'text', + text: 'plain note', + marks: [{ type: 'note', attrs: { kind: 'neutral' } }] + } + ] + } + ] + } as unknown as MarkupNode + + expect(markupToMarkdown(markup, options)).toEqual('plain note') + }) + + it('renders an inline file attachment as a download link', () => { + const markup = { + type: 'doc', + content: [ + { + type: 'paragraph', + content: [ + { + type: 'file', + attrs: { + 'file-id': 'blob123', + 'data-file-name': 'spec.pdf', + 'data-file-type': 'application/pdf' + } + } + ] + } + ] + } as unknown as MarkupNode + + const result = markupToMarkdown(markup, options) + expect(result).toEqual('[spec.pdf](http://localhost/blob123?file=blob123)') + }) + + it('renders a drawing board as a placeholder instead of throwing', () => { + const markup = { + type: 'doc', + content: [{ type: 'drawingBoard', attrs: { id: 'board1' } }] + } as unknown as MarkupNode + + expect(() => markupToMarkdown(markup, options)).not.toThrow() + expect(markupToMarkdown(markup, options)).toContain('[drawing]') + }) +}) + +describe('markupToMarkdown - unknown node/mark fallback', () => { + it('does not throw on a completely unrecognized node type and preserves nested text', () => { + const markup = { + type: 'doc', + content: [ + { + type: 'someFutureNodeType', + content: [ + { + type: 'paragraph', + content: [{ type: 'text', text: 'nested text should survive', marks: [] }] + } + ] + } + ] + } as unknown as MarkupNode + + expect(() => markupToMarkdown(markup, options)).not.toThrow() + expect(markupToMarkdown(markup, options)).toContain('nested text should survive') + }) + + it('does not throw on a completely unrecognized leaf node type with no content', () => { + const markup = { + type: 'doc', + content: [ + { + type: 'paragraph', + content: [ + { type: 'text', text: 'before ', marks: [] }, + { type: 'someFutureLeafType', attrs: { foo: 'bar' } }, + { type: 'text', text: ' after', marks: [] } + ] + } + ] + } as unknown as MarkupNode + + expect(() => markupToMarkdown(markup, options)).not.toThrow() + const result = markupToMarkdown(markup, options) + expect(result).toContain('before') + expect(result).toContain('after') + }) + + it('does not throw on a completely unrecognized mark type and preserves the text', () => { + const markup = { + type: 'doc', + content: [ + { + type: 'paragraph', + content: [ + { + type: 'text', + text: 'styled by a future mark', + marks: [{ type: 'someFutureMarkType', attrs: { color: 'red' } }] + } + ] + } + ] + } as unknown as MarkupNode + + expect(() => markupToMarkdown(markup, options)).not.toThrow() + expect(markupToMarkdown(markup, options)).toEqual('styled by a future mark') + }) + + it('does not throw when an unknown mark is combined with a known mixable mark', () => { + // Regression for the active-marks reorder path, which used to dereference + // `this.marks[type].mixable` without checking the mark was recognized. + const markup = { + type: 'doc', + content: [ + { + type: 'paragraph', + content: [ + { + type: 'text', + text: 'unknown only', + marks: [{ type: 'someFutureMarkType' }] + }, + { + type: 'text', + text: 'unknown and bold', + marks: [{ type: 'someFutureMarkType' }, { type: 'bold' }] + } + ] + } + ] + } as unknown as MarkupNode + + expect(() => markupToMarkdown(markup, options)).not.toThrow() + }) +}) + +describe('markupToMarkdown - full controlled document does not crash on export', () => { + it('exports a document mixing QMS review marks, notes, highlight, a file and a drawing board', () => { + const markup = { + type: 'doc', + content: [ + { + type: 'paragraph', + content: [ + { type: 'text', text: 'Reviewer left a comment here: ', marks: [] }, + { type: 'text', text: 'flagged text', marks: [{ type: 'node-uuid', attrs: { 'node-uuid': 'abc-123' } }] }, + { type: 'text', text: ' and this is ', marks: [] }, + { type: 'text', text: 'highlighted', marks: [{ type: 'highlight' }] }, + { type: 'text', text: ' plus a ', marks: [] }, + { + type: 'text', + text: 'note', + marks: [{ type: 'note', attrs: { kind: 'warning', title: 'careful here' } }] + }, + { type: 'text', text: ' and a thread ', marks: [] }, + { type: 'text', text: 'comment', marks: [{ type: 'inline-comment', attrs: { thread: 'xyz' } }] }, + { type: 'text', text: '.', marks: [] } + ] + }, + { + type: 'file', + attrs: { 'file-id': 'blob123', 'data-file-name': 'spec.pdf', 'data-file-type': 'application/pdf' } + }, + { type: 'drawingBoard', attrs: { id: 'board1' } } + ] + } as unknown as MarkupNode + + let result = '' + expect(() => { + result = markupToMarkdown(markup, options) + }).not.toThrow() + + // The old behavior was either a thrown exception (surfaced as a failed export) or, + // once nothing threw the error handling forward, an empty download. Assert the + // export actually produced non-empty, meaningful content instead. + expect(result.length).toBeGreaterThan(0) + expect(result).toContain('flagged text') + expect(result).toContain('highlighted') + expect(result).toContain('spec.pdf') + }) +}) diff --git a/foundations/core/packages/text-markdown/src/serializer.ts b/foundations/core/packages/text-markdown/src/serializer.ts index e32921dff1..19ccb24da1 100644 --- a/foundations/core/packages/text-markdown/src/serializer.ts +++ b/foundations/core/packages/text-markdown/src/serializer.ts @@ -282,6 +282,25 @@ export const storeNodes: Record = { // Slashes are escaped to prevent autolink creation state.write(state.htmlEsc(embedUrl).replace(/\//g, '/')) state.write('') + }, + file: (state, node) => { + // Inline file attachment (FileNode, `file-id` style). Render as a download link, + // reusing the same file-id -> URL scheme as the `image` node. + const attrs = nodeAttrs(node) + const fileId = attrs['file-id'] + const name = (attrs['data-file-name'] as string) ?? (attrs['data-file-href'] as string) ?? 'file' + if (fileId != null) { + state.write('[' + state.esc(`${name}`) + '](' + state.imageUrl + `${fileId}` + `?file=${fileId}` + ')') + } else if (attrs['data-file-href'] != null) { + state.write('[' + state.esc(`${name}`) + '](' + state.esc(`${attrs['data-file-href']}`) + ')') + } else { + state.write(state.esc(`${name}`)) + } + }, + drawingBoard: (state, node) => { + // Freehand drawing board has no meaningful text representation in Markdown. + state.write('*[drawing]*') + state.closeBlock(node) } } @@ -436,6 +455,40 @@ export const storeMarks: Record = { mixable: true, expelEnclosingWhitespace: false, escape: true + }, + highlight: { + open: '', + close: '', + mixable: true, + expelEnclosingWhitespace: true, + escape: true + }, + // QMS/review-only marks below carry no visual formatting of their own (they attach + // review metadata - a comment thread id, a note - to a run of text). Passing them + // through as no-ops keeps the underlying text intact instead of aborting the export. + note: { + open: '', + close: (state, mark) => { + const title = mark.attrs?.title + return title !== undefined && title !== null && title !== '' ? ` _(note: ${state.esc(`${title}`)})_` : '' + }, + mixable: false, + expelEnclosingWhitespace: false, + escape: false + }, + 'node-uuid': { + open: '', + close: '', + mixable: true, + expelEnclosingWhitespace: false, + escape: false + }, + 'inline-comment': { + open: '', + close: '', + mixable: true, + expelEnclosingWhitespace: false, + escape: false } } @@ -554,10 +607,18 @@ export class MarkdownState implements IState { // :: (Node) // Render the given node as a block. render (node: MarkupNode, parent: MarkupNode, index: number): void { - if (this.nodes[node.type] === undefined) { - throw new Error('Token type `' + node.type + '` not supported by Markdown renderer') + const processor = this.nodes[node.type] + if (processor === undefined) { + // Unknown node type (e.g. an editor-only node not recognized by this serializer). + // Rather than aborting the whole export, drop the wrapper and render its children, + // if any, so the surrounding document still converts. + console.warn(`[text-markdown] Unsupported node type "${node.type}", rendering its content only`) + if (nodeContent(node).length > 0) { + this.renderContent(node) + } + return } - this.nodes[node.type](this, node, parent, index) + processor(this, node, parent, index) } // :: (Node) @@ -571,7 +632,7 @@ export class MarkdownState implements IState { reorderMixableMark (state: InlineState, mark: MarkupMark, i: number, len: number): void { for (let j = 0; j < state.active.length; j++) { const other = state.active[j] - if (!this.marks[other.type].mixable || this.checkSwitchMarks(i, j, state, mark, other, len)) { + if (!(this.marks[other.type]?.mixable ?? false) || this.checkSwitchMarks(i, j, state, mark, other, len)) { break } } @@ -873,7 +934,10 @@ export class MarkdownState implements IState { if (value === undefined) { const info = this.marks[mark.type] if (info == null) { - throw new Error(`No info for mark ${mark.type}`) + // Unknown mark type - drop the formatting rather than aborting the export; + // the underlying text still comes through untouched. + console.warn(`[text-markdown] Unsupported mark type "${mark.type}", ignoring`) + return '' } value = open ? info.open : info.close } diff --git a/models/card/src/actions.ts b/models/card/src/actions.ts index 0260182c10..b8cccd5ba1 100644 --- a/models/card/src/actions.ts +++ b/models/card/src/actions.ts @@ -158,6 +158,55 @@ export function createActions (builder: Builder): void { card.action.ExportTable ) + // Export/import of a single card's rich-text `content` (round-tripping through Word/Markdown), + // sharing the same popups/logic used for controlled documents. Distinct label from ExportTable + // above (that one exports card fields as CSV/JSON) to avoid two ambiguous "Export" menu items. + createAction( + builder, + { + action: view.actionImpl.ShowPopup, + actionPopup: exportPlugin.component.DocumentExportFormatPopup, + actionProps: { + component: exportPlugin.component.DocumentExportFormatPopup, + element: 'top', + fillProps: { _object: 'value' } + }, + label: exportPlugin.string.ExportDocumentContent, + icon: exportPlugin.icon.Export, + input: 'focus', + category: card.category.Card, + target: card.class.Card, + context: { + mode: ['context', 'browser'], + group: 'tools' + } + }, + card.action.ExportDocumentContent + ) + + createAction( + builder, + { + action: view.actionImpl.ShowPopup, + actionPopup: exportPlugin.component.DocumentImportFormatPopup, + actionProps: { + component: exportPlugin.component.DocumentImportFormatPopup, + element: 'top', + fillProps: { _object: 'value' } + }, + label: exportPlugin.string.ImportDocumentContent, + icon: exportPlugin.icon.Export, + input: 'focus', + category: card.category.Card, + target: card.class.Card, + context: { + mode: ['context', 'browser'], + group: 'tools' + } + }, + card.action.ImportDocumentContent + ) + createAction(builder, { action: view.actionImpl.ShowPopup, actionProps: { diff --git a/models/card/src/plugin.ts b/models/card/src/plugin.ts index de6638e57c..4fc1813140 100644 --- a/models/card/src/plugin.ts +++ b/models/card/src/plugin.ts @@ -41,7 +41,9 @@ export default mergeIds(cardId, card, { PublicLink: '' as Ref>, Duplicate: '' as Ref>, CreateChild: '' as Ref, - ExportTable: '' as Ref> + ExportTable: '' as Ref>, + ExportDocumentContent: '' as Ref>, + ImportDocumentContent: '' as Ref> }, category: { Card: '' as Ref, diff --git a/models/controlled-documents/src/index.ts b/models/controlled-documents/src/index.ts index 763490c036..d9ed19de83 100644 --- a/models/controlled-documents/src/index.ts +++ b/models/controlled-documents/src/index.ts @@ -518,9 +518,9 @@ export function createModel (builder: Builder): void { builder, { action: view.actionImpl.ShowPopup, - actionPopup: documents.component.ExportFormatPopup, + actionPopup: exportPlugin.component.DocumentExportFormatPopup, actionProps: { - component: documents.component.ExportFormatPopup, + component: exportPlugin.component.DocumentExportFormatPopup, element: 'top', fillProps: { _object: 'value' } }, @@ -538,9 +538,9 @@ export function createModel (builder: Builder): void { builder, { action: view.actionImpl.ShowPopup, - actionPopup: documents.component.ImportFormatPopup, + actionPopup: exportPlugin.component.DocumentImportFormatPopup, actionProps: { - component: documents.component.ImportFormatPopup, + component: exportPlugin.component.DocumentImportFormatPopup, element: 'top', fillProps: { _object: 'value' } }, diff --git a/plugins/controlled-documents-assets/lang/cs.json b/plugins/controlled-documents-assets/lang/cs.json index f3de9cf697..b62454fa61 100644 --- a/plugins/controlled-documents-assets/lang/cs.json +++ b/plugins/controlled-documents-assets/lang/cs.json @@ -2,14 +2,6 @@ "string": { "Export": "Exportovat", "Import": "Importovat", - "ImportingDocument": "Import dokumentu", - "ConvertingDocument": "Převod dokumentu…", - "ImportingFromWord": "Import z Wordu", - "ConvertingWordDocument": "Převod dokumentu…", - "DocumentConverted": "Dokument převeden", - "ImportFailed": "Import selhal", - "ReviewImportedChanges": "Zkontrolovat importované změny", - "Apply": "Použít", "ExportToWord": "Exportovat do Wordu", "ImportFromWord": "Importovat z Wordu", "ID": "ID", @@ -46,7 +38,6 @@ "Document": "Dokument", "NewDocumentDialogClose": "Chcete zavřít toto dialogové okno?", "NewDocumentCloseNote": "Všechny změny budou ztraceny", - "Cancel": "Zrušit", "EditorPlaceholder": "Začněte psát...", "Version": "Verze", "TemplateVersion": "Verze šablony", @@ -66,32 +57,24 @@ "Approval": "Schválení", "Reviewer": "Revizor", "Approver": "Schvalovatel", - "DeleteCategory": "Smazat kategorii?", "DeleteCategoryHint": "Tuto akci nelze vrátit zpět.", "DeleteCategoryWarning": "Tuto kategorii nelze smazat, protože se používá.", - "Latest": "Aktuální", "Draft": "Koncept", - "Reviewers": "Revizoři", - "ViewMode": "Zobrazení", "EditMode": "Úpravy", "ComparisonMode": "Porovnání", - "Compare": "Porovnat:", "Against": "Proti:", "RemovedAttachments": "Odebrané přílohy", "Restore": "Obnovit", - "ComparisonModeNotSupported": "Porovnávací režim není podporován.", - "CreateDraft": "Vytvořit koncept", "SendForApproval": "Odeslat ke schválení", "SendForReview": "Odeslat k revizi", "CompleteReview": "Dokončit revizi", - "Approve": "Schválit", "Reject": "Zamítnout", "ConfirmApproval": "Potvrdit schválení", @@ -108,7 +91,6 @@ "AddApprovalDescription4": "pokud je plánováno školení, musí mít školení stav 'Vydané'", "NoApprovalsDescription": "Pro tuto verzi dokumentu nejsou žádná schválení", "CurrentVersion": "Aktuální verze", - "DocumentTemplate": "Šablona", "DocumentTemplates": "Šablony", "DocumentCode": "Kód dokumentu", @@ -129,19 +111,16 @@ "ShowResolved": "Zobrazit vyřešené komentáře", "Ordering": "Řazení", "Title": "Název", - "Effective": "Účinný", "Archived": "Archivováno", "Deleted": "Smazáno", "MetaAbstract": "Abstrakt", - "ContentTab": "Obsah", "TeamTab": "Tým", "MetaTab": "Metadata", "ChangeControlTab": "Řízení změn", "ReleaseTab": "Vydání", "HistoryTab": "Historie", - "ModificationDate": "Upraveno dne", "Modified": "Upraveno", "Owner": "Vlastník", @@ -149,7 +128,6 @@ "Unassigned": "Nepřiřazeno", "Untitled": "Bez názvu", "Copy": "Kopírovat", - "AccessWorkarea": "Přístup do pracovní oblasti", "EffectiveLibrary": "Knihovna účinných dokumentů", "WorkingLibrary": "Knihovna pracovních dokumentů", @@ -159,10 +137,8 @@ "ReassignOwnershipToAnotherUser": "Převést vlastnictví na jiného uživatele", "MakeDocumentEffective": "Učinit dokument účinným", "CreateDraftQmsTemplates": "Vytvořit koncept QMS šablon", - "ChangeControl": "Řízení změn", "ReviewInterval": "Interval revize", - "SelectReviewers": "Vybrat revizory", "SelectApprovers": "Vybrat schvalovatele", "RequestsToReviewTheDoc": "žádá vás o revizi dokumentu", @@ -171,19 +147,15 @@ "Template": "Šablona", "GeneralInfo": "Obecné informace", "InProgress": "Probíhá", - "EditDescription": "Upravit popis", "EditGuidance": "Upravit pokyny", - "NewDocument": "Nový dokument", "NewDocumentCategory": "Nová kategorie", "NewDocumentTemplate": "Nová šablona", - "LocationStepTitle": "Umístění", "TemplateStepTitle": "Šablona", "InfoStepTitle": "Informace", "TeamStepTitle": "Tým", - "TitleAndDescr": "Název a popis", "Reason": "Důvod", "AbstractPlaceholder": "O čem je tento dokument? Kdo ho bude potřebovat a kdy? ...", @@ -192,17 +164,13 @@ "NewTemplatePlaceholder": "O čem je tato šablona? Popište, jak ji správně používat...", "CustomReason": "Vlastní důvod", "ReasonPlaceholder": "Specifikujte důvod...", - "EditDocument": "Upravit dokument", - "Key": "Klíč", "CommentsSequence": "Sekvence komentářů", - "Email": "Email", "Password": "Heslo", "FieldIsEmpty": "{field} je prázdné", "ValidatingCredentials": "Ověřování přihlašovacích údajů...", - "GeneralDocumentation": "Obecná dokumentace", "TechnicalDocumentation": "Technická dokumentace", "UnsortedTemplates": "Nezařazené šablony", @@ -210,39 +178,29 @@ "Projects": "Projekty", "ExternalSpace": "Prostor projektu", "DocumentSpaceType": "Typ prostoru dokumentů", - "EffectiveImmediately": "Ihned po schválení", "EffectiveOn": "Platnost od", - "PeriodicReviewToBeCompleted": "Periodická revize musí být dokončena do", "MonthsAfterEffectiveDate": "měsíců od data účinnosti", "ToBePassedWithin": "Musí být splněno do", "AttemptsAnd": "pokusů a", "DaysAfterEffectiveDate": "dní od data účinnosti", - "Index": "Index", "Path": "Cesta", - "CreateChildDocument": "Vytvořit podřízený dokument", "CreateChildTemplate": "Vytvořit podřízenou šablonu", - "All": "Vše", - "Space": "Prostor", "SelectParent": "Vyberte nadřazený objekt pro váš dokument", - "PrefixInUse": "Tato předpona již používá", "CodeInUse": "Tento kód již používá", "ChangeCode": "Změnit kód", "ChangePrefix": "Změnit předponu", - "MarkDocAsDeleted": "Označení dokumentu jako smazaného", "MarkDocsAsDeleted": "Označení více dokumentů jako smazaných", "MarkDocAsDeletedConfirm": "Opravdu chcete označit následující dokumenty jako smazané: {titles}?", - "ArchiveDocs": "Archivovat {count, plural, =0 {dokument} other {dokumenty}}", "ArchiveDocsConfirm": "Opravdu chcete archivovat následující dokumenty: {titles}?", - "DocumentInHierarchy": "Dokument v hierarchii", "FirstDraftVersion": "Toto je první konceptová verze dokumentu. Historie zatím není k dispozici.", "FirstOrNotAvailable": "Toto je první dostupná verze dokumentu. Historie zatím není k dispozici nebo není dostupná.", @@ -304,26 +262,20 @@ "DeleteDocumentCategoryDescription": "Uděluje uživatelům možnost smazat kategorii dokumentů", "ConfigLabel": "Řízené dokumenty", "ConfigDescription": "Rozšíření pro správu řízených dokumentů", - "Transfer": "Přenos", "TransferWarning": "Někteří členové týmu mohou po této akci ztratit možnost prohlížet nebo upravovat tento dokument.", "TransferDocuments": "Přenos řízených dokumentů", "TransferDocumentsHint": "Dokumenty, které mají být přeneseny do vybraného prostoru:", - "CreateFolder": "Vytvořit novou složku", "RenameFolder": "Přejmenovat složku", "CreateChildFolder": "Vytvořit podsložku", - "Obsolete": "Zastaralé", "MakeDocumentObsolete": "Označit jako zastaralé", "MakeDocumentObsoleteDialog": "Označit {count, plural, one {dokument jako zastaralý} other {dokumenty jako zastaralé}}", "MakeDocumentObsoleteConfirm": "Opravdu chcete označit následující dokumenty jako zastaralé: {titles}?", - "LatestVersionHint": "nejnovější", - "CannotDeleteFolder": "Složku nelze smazat", "CannotDeleteFolderHint": "Před odstraněním složky prosím přesuňte všechny podřízené dokumenty na jiné místo.", - "AllDocumentSpaces": "Všechny dokumentové prostory" }, "controlledDocStates": { @@ -335,4 +287,4 @@ "Rejected": "Zamítnuto", "ToReview": "K revizi" } -} \ No newline at end of file +} diff --git a/plugins/controlled-documents-assets/lang/de.json b/plugins/controlled-documents-assets/lang/de.json index df6b969a5b..a98374f6a5 100644 --- a/plugins/controlled-documents-assets/lang/de.json +++ b/plugins/controlled-documents-assets/lang/de.json @@ -2,14 +2,6 @@ "string": { "Export": "Exportieren", "Import": "Importieren", - "ImportingDocument": "Dokument wird importiert", - "ConvertingDocument": "Dokument wird konvertiert…", - "ImportingFromWord": "Import aus Word", - "ConvertingWordDocument": "Dokument wird konvertiert…", - "DocumentConverted": "Dokument konvertiert", - "ImportFailed": "Import fehlgeschlagen", - "ReviewImportedChanges": "Importierte Änderungen prüfen", - "Apply": "Übernehmen", "ExportToWord": "Nach Word exportieren", "ImportFromWord": "Aus Word importieren", "ID": "ID", @@ -46,7 +38,6 @@ "Document": "Dokument", "NewDocumentDialogClose": "Möchten Sie diesen Dialog schließen?", "NewDocumentCloseNote": "Alle Änderungen gehen verloren", - "Cancel": "Abbrechen", "EditorPlaceholder": "Tippen Sie, um mit der Bearbeitung zu beginnen...", "Version": "Version", "TemplateVersion": "Vorlagenversion", @@ -67,32 +58,24 @@ "Approval": "Genehmigung", "Reviewer": "Prüfer", "Approver": "Genehmiger", - "DeleteCategory": "Kategorie löschen?", "DeleteCategoryHint": "Diese Aktion kann nicht rückgängig gemacht werden", "DeleteCategoryWarning": "Die Kategorie kann nicht gelöscht werden, da sie in Verwendung ist", - "Latest": "Aktuell", "Draft": "Entwurf", - "Reviewers": "Prüfer", - "ViewMode": "Ansicht", "EditMode": "Bearbeitung", "ComparisonMode": "Vergleich", - "Compare": "Vergleichen:", "Against": "Mit:", "RemovedAttachments": "Entfernte Anhänge", "Restore": "Wiederherstellen", - "ComparisonModeNotSupported": "Vergleichsmodus wird nicht unterstützt.", - "CreateDraft": "Entwurf erstellen", "SendForApproval": "Zur Genehmigung senden", "SendForReview": "Zur Prüfung senden", "CompleteReview": "Prüfung abschließen", - "Approve": "Genehmigen", "Reject": "Ablehnen", "ConfirmApproval": "Genehmigung bestätigen", @@ -107,7 +90,6 @@ "AddApprovalDescription4": "wenn Schulung geplant ist, hat die Schulung den Status 'Freigegeben'", "NoApprovalsDescription": "Es gibt keine Genehmigungen für diese Version des Dokuments", "CurrentVersion": "Aktuelle Version", - "DocumentTemplate": "Vorlage", "DocumentTemplates": "Vorlagen", "DocumentCode": "Dokumentencode", @@ -128,19 +110,16 @@ "ShowResolved": "Gelöste Kommentare anzeigen", "Ordering": "Sortierung", "Title": "Titel", - "Effective": "Gültig", "Archived": "Archiviert", "Deleted": "Gelöscht", "MetaAbstract": "Zusammenfassung", - "ContentTab": "Inhalt", "TeamTab": "Team", "MetaTab": "Metadaten", "ChangeControlTab": "Änderungskontrolle", "ReleaseTab": "Freigabe", "HistoryTab": "Historie", - "ModificationDate": "Geändert am", "Modified": "Geändert", "Owner": "Besitzer", @@ -148,7 +127,6 @@ "Unassigned": "Nicht zugewiesen", "Untitled": "Ohne Titel", "Copy": "Kopie", - "AccessWorkarea": "Arbeitsbereich zugreifen", "EffectiveLibrary": "Gültige Bibliothek", "WorkingLibrary": "Arbeitsbibliothek", @@ -158,10 +136,8 @@ "ReassignOwnershipToAnotherUser": "Besitz an anderen Benutzer übertragen", "MakeDocumentEffective": "Dokument gültig machen", "CreateDraftQmsTemplates": "QMS-Vorlagenentwürfe erstellen", - "ChangeControl": "Änderungskontrolle", "ReviewInterval": "Prüfungsintervall", - "SelectReviewers": "Prüfer auswählen", "SelectApprovers": "Genehmiger auswählen", "RequestsToReviewTheDoc": "bittet Sie, das Dokument zu prüfen", @@ -170,19 +146,15 @@ "Template": "Vorlage", "GeneralInfo": "Allgemeine Informationen", "InProgress": "In Bearbeitung", - "EditDescription": "Beschreibung bearbeiten", "EditGuidance": "Anleitung bearbeiten", - "NewDocument": "Neues Dokument", "NewDocumentCategory": "Neue Kategorie", "NewDocumentTemplate": "Neue Vorlage", - "LocationStepTitle": "Standort", "TemplateStepTitle": "Vorlage", "InfoStepTitle": "Info", "TeamStepTitle": "Team", - "TitleAndDescr": "Titel und Beschreibung", "Reason": "Grund", "AbstractPlaceholder": "Worum geht es in diesem Dokument? Wer wird es wann benötigen? ...", @@ -191,17 +163,13 @@ "NewTemplatePlaceholder": "Worum geht es in dieser Vorlage? Beschreiben Sie, wie sie richtig verwendet wird...", "CustomReason": "Benutzerdefiniert", "ReasonPlaceholder": "Geben Sie den Grund an...", - "EditDocument": "Dokument bearbeiten", - "Key": "Schlüssel", "CommentsSequence": "Kommentarreihenfolge", - "Email": "E-Mail", "Password": "Passwort", "FieldIsEmpty": "{field} ist leer", "ValidatingCredentials": "Anmeldedaten werden überprüft...", - "GeneralDocumentation": "Allgemeine Dokumentation", "TechnicalDocumentation": "Technische Dokumentation", "UnsortedTemplates": "Unsortierte Vorlagen", @@ -209,53 +177,39 @@ "Projects": "Projekte", "ExternalSpace": "Projektbereich", "DocumentSpaceType": "Dokumentenbereichstyp", - "EffectiveImmediately": "Sofort nach Genehmigung", "EffectiveOn": "Gültig ab", - "PeriodicReviewToBeCompleted": "Regelmäßige Überprüfung muss abgeschlossen sein innerhalb von", "MonthsAfterEffectiveDate": "Monaten nach dem Gültigkeitsdatum", "ToBePassedWithin": "Muss bestanden werden innerhalb von", "AttemptsAnd": "Versuchen und", "DaysAfterEffectiveDate": "Tagen nach dem Gültigkeitsdatum", - "Index": "Index", "Path": "Pfad", - "CreateChildDocument": "Unterdokument erstellen", "CreateChildTemplate": "Untervorlage erstellen", - "All": "Alle", - "Space": "Bereich", "SelectParent": "Wählen Sie das übergeordnete Objekt für Ihr Dokument", - "PrefixInUse": "Dieses Präfix wird bereits verwendet von", "CodeInUse": "Dieser Code wird bereits verwendet von", "ChangeCode": "Code ändern", "ChangePrefix": "Präfix ändern", - "MarkDocAsDeleted": "Dokument als gelöscht markieren", "MarkDocsAsDeleted": "Mehrere Dokumente als gelöscht markieren", "MarkDocAsDeletedConfirm": "Möchten Sie die folgenden Dokumente wirklich als gelöscht markieren: {titles}?", - "ArchiveDocs": "{count, plural, =0 {Dokument} other {Dokumente}} archivieren", "ArchiveDocsConfirm": "Möchten Sie die folgenden Dokumente wirklich archivieren: {titles}?", - "DocumentInHierarchy": "Dokument in Hierarchie", "FirstDraftVersion": "Dies ist die erste Entwurfsversion des Dokuments. Es gibt noch keine Historie.", "FirstOrNotAvailable": "Dies ist die erste verfügbare Version des Dokuments. Es gibt noch keine Versionshistorie oder sie ist nicht verfügbar.", - "EffectiveDocumentLifecycle": "Effektiver Dokumentenlebenszyklus", - "ReasonAndImpact": "Grund & Auswirkung", "ImpactAnalysis": "Auswirkungsanalyse", "ImpactedDocuments": "Betroffene Dokumente", - "CreateDocumentFailed": "Dokument konnte nicht erstellt werden", "CreateDocumentTemplateFailed": "Vorlage konnte nicht erstellt werden", "TryAgain": "Bitte versuchen Sie es erneut", - "DescribeChanges": "Beschreiben Sie, was geändert wurde...", "DescribeReason": "Beschreiben Sie, warum es geändert wurde...", "DescribeImpact": "Hat Auswirkungen auf...", @@ -280,17 +234,13 @@ "Of": " von ", "CreatedFromTemplate": "Erstellt aus Vorlage: ", "UncontrolledCopy": "Unkontrollierte Kopie", - "ViewAll": "Alle anzeigen", "Readonly": "Schreibgeschützt", - "NewDocumentSpace": "Neuer Dokumentenbereich", "EditDocumentSpace": "Dokumentenbereich bearbeiten", - "DocSpaceDescriptionPlaceholder": "Beschreiben Sie Ihren Bereich...", "Members": "Mitglieder", "CreateOrgSpace": "Organisationsbereich erstellen", - "ReviewDocumentPermission": "Dokument prüfen", "ReviewDocumentDescription": "Gewährt Benutzern die Möglichkeit, ein Dokument zu prüfen", "ApproveDocumentPermission": "Dokument genehmigen", @@ -303,7 +253,6 @@ "CreateDocumentDescription": "Gewährt Benutzern die Möglichkeit, ein Dokument zu erstellen", "UpdateDocumentOwnerPermission": "Dokumentenbesitzer aktualisieren", "UpdateDocumentOwnerDescription": "Gewährt Benutzern die Möglichkeit, einen Dokumentenbesitzer zu aktualisieren", - "CreateDocumentCategoryPermission": "Dokumentenkategorie erstellen", "CreateDocumentCategoryDescription": "Gewährt Benutzern die Möglichkeit, eine Dokumentenkategorie zu erstellen", "UpdateDocumentCategoryPermission": "Dokumentenkategorie aktualisieren", @@ -312,26 +261,20 @@ "DeleteDocumentCategoryDescription": "Gewährt Benutzern die Möglichkeit, eine Dokumentenkategorie zu löschen", "ConfigLabel": "Kontrollierte Dokumente", "ConfigDescription": "Erweiterung zur Verwaltung kontrollierter Dokumente", - "Transfer": "Übertragung", "TransferWarning": "Einige Teammitglieder können dieses Dokument nach dieser Aktion möglicherweise nicht mehr anzeigen oder bearbeiten.", "TransferDocuments": "Übertragung kontrollierter Dokumente", "TransferDocumentsHint": "Dokumente, die in den ausgewählten Bereich übertragen werden sollen:", - "CreateFolder": "Neuen Ordner erstellen", "RenameFolder": "Ordner umbenennen", "CreateChildFolder": "Unterordner erstellen", - "Obsolete": "Veraltet", "MakeDocumentObsolete": "Als veraltet markieren", "MakeDocumentObsoleteDialog": "{count, plural, one {Dokument als veraltet markieren} other {Dokumente als veraltet markieren}}", "MakeDocumentObsoleteConfirm": "Möchten Sie die folgenden Dokumente wirklich als veraltet markieren: {titles}?", - "LatestVersionHint": "neueste", - "CannotDeleteFolder": "Der Ordner kann nicht gelöscht werden", "CannotDeleteFolderHint": "Bitte verschieben Sie alle untergeordneten Dokumente an einen anderen Ort, bevor Sie den Ordner löschen.", - "AllDocumentSpaces": "Alle Dokumentbereiche" }, "controlledDocStates": { diff --git a/plugins/controlled-documents-assets/lang/en.json b/plugins/controlled-documents-assets/lang/en.json index d4deae23f6..e33ba4108e 100644 --- a/plugins/controlled-documents-assets/lang/en.json +++ b/plugins/controlled-documents-assets/lang/en.json @@ -2,14 +2,6 @@ "string": { "Export": "Export", "Import": "Import", - "ImportingDocument": "Importing document", - "ConvertingDocument": "Converting document…", - "ImportingFromWord": "Importing from Word", - "ConvertingWordDocument": "Converting document…", - "DocumentConverted": "Document converted", - "ImportFailed": "Import failed", - "ReviewImportedChanges": "Review imported changes", - "Apply": "Apply", "ExportToWord": "Export to Word", "ImportFromWord": "Import from Word", "ID": "ID", @@ -46,7 +38,6 @@ "Document": "Document", "NewDocumentDialogClose": "Do you want to close this dialog?", "NewDocumentCloseNote": "All changes will be lost", - "Cancel": "Cancel", "EditorPlaceholder": "type to start editing...", "Version": "Version", "TemplateVersion": "Template version", @@ -67,32 +58,24 @@ "Approval": "Approval", "Reviewer": "Reviewer", "Approver": "Approver", - "DeleteCategory": "Delete category?", "DeleteCategoryHint": "That action cannot be undone", "DeleteCategoryWarning": "The category cannot be deleted because it is in use", - "Latest": "Actual", "Draft": "Draft", - "Reviewers": "Reviewers", - "ViewMode": "Viewing", "EditMode": "Editing", "ComparisonMode": "Comparing", - "Compare": "Compare:", "Against": "Against:", "RemovedAttachments": "Removed attachments", "Restore": "Restore", - "ComparisonModeNotSupported": "Comparison mode is not supported.", - "CreateDraft": "Create Draft", "SendForApproval": "Send for approval", "SendForReview": "Send for review", "CompleteReview": "Complete review", - "Approve": "Approve", "Reject": "Reject", "ConfirmApproval": "Confirm approval", @@ -109,7 +92,6 @@ "AddApprovalDescription4": "if training is planned, the training has status 'Released'", "NoApprovalsDescription": "There are no approvals for this version of document", "CurrentVersion": "Current version", - "DocumentTemplate": "Template", "DocumentTemplates": "Templates", "DocumentCode": "Document code", @@ -130,24 +112,20 @@ "ShowResolved": "Show resolved comments", "Ordering": "Ordering", "Title": "Title", - "Effective": "Effective", "Archived": "Archived", "Deleted": "Deleted", "MetaAbstract": "Abstract", - "Obsolete": "Obsolete", "MakeDocumentObsolete": "Mark as obsolete", "MakeDocumentObsoleteDialog": "Mark {count, plural, =0 {document} other {documents}} as obsolete", "MakeDocumentObsoleteConfirm": "Do you really want to mark the following documents as obsolete: {titles}?", - "ContentTab": "Content", "TeamTab": "Team", "MetaTab": "Metadata", "ChangeControlTab": "Change control", "ReleaseTab": "Release", "HistoryTab": "History", - "ModificationDate": "Modified at", "Modified": "Modified", "Owner": "Owner", @@ -155,7 +133,6 @@ "Unassigned": "Unassigned", "Untitled": "Untitled", "Copy": "copy", - "AccessWorkarea": "Access Workarea", "EffectiveLibrary": "Effective library", "WorkingLibrary": "Working library", @@ -165,10 +142,8 @@ "ReassignOwnershipToAnotherUser": "Reassign ownership to another user", "MakeDocumentEffective": "Make document effective", "CreateDraftQmsTemplates": "Create draft QMS templates", - "ChangeControl": "Change Control", "ReviewInterval": "Review interval", - "SelectReviewers": "Select reviewers", "SelectApprovers": "Select approvers", "RequestsToReviewTheDoc": "requests you to review the document", @@ -177,19 +152,15 @@ "Template": "Template", "GeneralInfo": "General Info", "InProgress": "In progress", - "EditDescription": "Edit description", "EditGuidance": "Edit guidance", - "NewDocument": "New document", "NewDocumentCategory": "New category", "NewDocumentTemplate": "New template", - "LocationStepTitle": "Location", "TemplateStepTitle": "Template", "InfoStepTitle": "Info", "TeamStepTitle": "Team", - "TitleAndDescr": "Title and description", "Reason": "Reason", "AbstractPlaceholder": "What is this document about? Who will need it and when? ...", @@ -198,17 +169,13 @@ "NewTemplatePlaceholder": "What is this template about? Describe how to properly use it...", "CustomReason": "Custom", "ReasonPlaceholder": "Specify the reason...", - "EditDocument": "Edit document", - "Key": "Key", "CommentsSequence": "Comments sequence", - "Email": "Email", "Password": "Password", "FieldIsEmpty": "{field} is empty", "ValidatingCredentials": "Validating credentials...", - "GeneralDocumentation": "General documentation", "TechnicalDocumentation": "Technical documentation", "UnsortedTemplates": "Unsorted templates", @@ -216,53 +183,39 @@ "Projects": "Projects", "ExternalSpace": "Project space", "DocumentSpaceType": "Documents space type", - "EffectiveImmediately": "Immediately upon approval", "EffectiveOn": "Make effective on", - "PeriodicReviewToBeCompleted": "Periodic review to be completed within", "MonthsAfterEffectiveDate": "months after its effective date", "ToBePassedWithin": "To be passed within", "AttemptsAnd": "attempts and", "DaysAfterEffectiveDate": "days after effective date", - "Index": "Index", "Path": "Path", - "CreateChildDocument": "Create child document", "CreateChildTemplate": "Create child template", - "All": "All", - "Space": "Space", "SelectParent": "Select the parent object for your document", - "PrefixInUse": "This prefix is already in use by", "CodeInUse": "This code is already in use by", "ChangeCode": "Change Code", "ChangePrefix": "Change Prefix", - "MarkDocAsDeleted": "Marking document as deleted", "MarkDocsAsDeleted": "Marking multiple documents as deleted", "MarkDocAsDeletedConfirm": "Do you really want to mark the following documents as deleted: {titles}?", - "ArchiveDocs": "Archive {count, plural, =0 {document} other {documents}}", "ArchiveDocsConfirm": "Do you really want to archive the following documents: {titles}?", - "DocumentInHierarchy": "Document in hierarchy", "FirstDraftVersion": "This is the first draft version of the document. There's no history yet.", "FirstOrNotAvailable": "This is the first available version of the document. There's no history yet or it's not available.", - "EffectiveDocumentLifecycle": "Effective document lifecycle", - "ReasonAndImpact": "Reason & Impact", "ImpactAnalysis": "Impact analysis", "ImpactedDocuments": "Impacted documents", - "CreateDocumentFailed": "Failed to create document", "CreateDocumentTemplateFailed": "Failed to create template", "TryAgain": "Please try again", - "DescribeChanges": "Describe what was changed...", "DescribeReason": "Describe why it was changed...", "DescribeImpact": "Has an impact on...", @@ -287,17 +240,13 @@ "Of": " of ", "CreatedFromTemplate": "Created from template: ", "UncontrolledCopy": "Uncontrolled copy", - "ViewAll": "View all", "Readonly": "Readonly", - "NewDocumentSpace": "New documents space", "EditDocumentSpace": "Edit documents space", - "DocSpaceDescriptionPlaceholder": "Describe your space...", "Members": "Members", "CreateOrgSpace": "Create organisation space", - "ReviewDocumentPermission": "Review document", "ReviewDocumentDescription": "Grants users ability to review a document", "ApproveDocumentPermission": "Approve document", @@ -310,7 +259,6 @@ "CreateDocumentDescription": "Grants users ability to create a document", "UpdateDocumentOwnerPermission": "Update document owner", "UpdateDocumentOwnerDescription": "Grants users ability to update a document owner", - "CreateDocumentCategoryPermission": "Create document category", "CreateDocumentCategoryDescription": "Grants users ability to create a document category", "UpdateDocumentCategoryPermission": "Update document category", @@ -319,21 +267,16 @@ "DeleteDocumentCategoryDescription": "Grants users ability to delete a document category", "ConfigLabel": "Controlled Documents", "ConfigDescription": "Extension to manage controlled documents", - "Transfer": "Transfer", "TransferWarning": "Some team members may lose the ability to view or edit this document after this action.", "TransferDocuments": "Transfer controlled documents", "TransferDocumentsHint": "Documents to be transferred to the selected space:", - "CreateFolder": "Create new folder", "RenameFolder": "Rename folder", "CreateChildFolder": "Create child folder", - "LatestVersionHint": "latest", - "CannotDeleteFolder": "The folder cannot be deleted", "CannotDeleteFolderHint": "Please move all child documents to another location before deleting the folder.", - "AllDocumentSpaces": "All document spaces" }, "controlledDocStates": { diff --git a/plugins/controlled-documents-assets/lang/es.json b/plugins/controlled-documents-assets/lang/es.json index 4edab76044..7a490f1480 100644 --- a/plugins/controlled-documents-assets/lang/es.json +++ b/plugins/controlled-documents-assets/lang/es.json @@ -2,14 +2,6 @@ "string": { "Export": "Exportar", "Import": "Importar", - "ImportingDocument": "Importando el documento", - "ConvertingDocument": "Convirtiendo el documento…", - "ImportingFromWord": "Importando desde Word", - "ConvertingWordDocument": "Convirtiendo el documento…", - "DocumentConverted": "Documento convertido", - "ImportFailed": "Error de importación", - "ReviewImportedChanges": "Revisar los cambios importados", - "Apply": "Aplicar", "ExportToWord": "Exportar a Word", "ImportFromWord": "Importar desde Word", "ID": "ID", @@ -46,7 +38,6 @@ "Document": "Documento", "NewDocumentDialogClose": "¿Deseas cerrar este diálogo?", "NewDocumentCloseNote": "Todos los cambios se perderán", - "Cancel": "Cancelar", "EditorPlaceholder": "escribe para comenzar a editar...", "Version": "Versión", "TemplateVersion": "Versión de plantilla", @@ -67,32 +58,24 @@ "Approval": "Aprobación", "Reviewer": "Revisor", "Approver": "Aprobador", - "DeleteCategory": "¿Eliminar categoría?", "DeleteCategoryHint": "Esa acción no se puede deshacer", "DeleteCategoryWarning": "La categoría no se puede eliminar porque está en uso", - "Latest": "Actual", "Draft": "Borrador", - "Reviewers": "Revisores", - "ViewMode": "Visualizando", "EditMode": "Editando", "ComparisonMode": "Comparando", - "Compare": "Comparar:", "Against": "Contra:", "RemovedAttachments": "Adjuntos eliminados", "Restore": "Restaurar", - "ComparisonModeNotSupported": "El modo de comparación no está soportado.", - "CreateDraft": "Crear Borrador", "SendForApproval": "Enviar para aprobación", "SendForReview": "Enviar para revisión", "CompleteReview": "Completar revisión", - "Approve": "Aprobar", "Reject": "Rechazar", "ConfirmApproval": "Confirmar aprobación", @@ -109,7 +92,6 @@ "AddApprovalDescription4": "si se planifica capacitación, la capacitación tiene estado 'Publicado'", "NoApprovalsDescription": "No hay aprobaciones para esta versión del documento", "CurrentVersion": "Versión actual", - "DocumentTemplate": "Plantilla", "DocumentTemplates": "Plantillas", "DocumentCode": "Código de documento", @@ -130,24 +112,20 @@ "ShowResolved": "Mostrar comentarios resueltos", "Ordering": "Ordenamiento", "Title": "Título", - "Effective": "Efectivo", "Archived": "Archivado", "Deleted": "Eliminado", "MetaAbstract": "Resumen", - "Obsolete": "Obsoleto", "MakeDocumentObsolete": "Marcar como obsoleto", "MakeDocumentObsoleteDialog": "Marcar {count, plural, =0 {documento} other {documentos}} como obsoleto", "MakeDocumentObsoleteConfirm": "¿Realmente deseas marcar los siguientes documentos como obsoletos: {titles}?", - "ContentTab": "Contenido", "TeamTab": "Equipo", "MetaTab": "Metadatos", "ChangeControlTab": "Control de cambios", "ReleaseTab": "Publicación", "HistoryTab": "Historial", - "ModificationDate": "Modificado en", "Modified": "Modificado", "Owner": "Propietario", @@ -155,7 +133,6 @@ "Unassigned": "Sin asignar", "Untitled": "Sin título", "Copy": "copia", - "AccessWorkarea": "Acceder al Área de trabajo", "EffectiveLibrary": "Biblioteca efectiva", "WorkingLibrary": "Biblioteca de trabajo", @@ -165,10 +142,8 @@ "ReassignOwnershipToAnotherUser": "Reasignar propiedad a otro usuario", "MakeDocumentEffective": "Hacer documento efectivo", "CreateDraftQmsTemplates": "Crear borradores de plantillas QMS", - "ChangeControl": "Control de Cambios", "ReviewInterval": "Intervalo de revisión", - "SelectReviewers": "Seleccionar revisores", "SelectApprovers": "Seleccionar aprobadores", "RequestsToReviewTheDoc": "te solicita revisar el documento", @@ -177,19 +152,15 @@ "Template": "Plantilla", "GeneralInfo": "Información General", "InProgress": "En progreso", - "EditDescription": "Editar descripción", "EditGuidance": "Editar guía", - "NewDocument": "Nuevo documento", "NewDocumentCategory": "Nueva categoría", "NewDocumentTemplate": "Nueva plantilla", - "LocationStepTitle": "Ubicación", "TemplateStepTitle": "Plantilla", "InfoStepTitle": "Información", "TeamStepTitle": "Equipo", - "TitleAndDescr": "Título y descripción", "Reason": "Motivo", "AbstractPlaceholder": "¿De qué trata este documento? ¿Quién lo necesitará y cuándo? ...", @@ -198,17 +169,13 @@ "NewTemplatePlaceholder": "¿De qué trata esta plantilla? Describe cómo usarla correctamente...", "CustomReason": "Personalizado", "ReasonPlaceholder": "Especifica el motivo...", - "EditDocument": "Editar documento", - "Key": "Clave", "CommentsSequence": "Secuencia de comentarios", - "Email": "Correo electrónico", "Password": "Contraseña", "FieldIsEmpty": "{field} está vacío", "ValidatingCredentials": "Validando credenciales...", - "GeneralDocumentation": "Documentación general", "TechnicalDocumentation": "Documentación técnica", "UnsortedTemplates": "Plantillas sin clasificar", @@ -216,53 +183,39 @@ "Projects": "Proyectos", "ExternalSpace": "Espacio de proyecto", "DocumentSpaceType": "Tipo de espacio de documentos", - "EffectiveImmediately": "Inmediatamente tras la aprobación", "EffectiveOn": "Hacer efectivo el", - "PeriodicReviewToBeCompleted": "Revisión periódica a completar dentro de", "MonthsAfterEffectiveDate": "meses después de su fecha efectiva", "ToBePassedWithin": "A completar dentro de", "AttemptsAnd": "intentos y", "DaysAfterEffectiveDate": "días después de la fecha efectiva", - "Index": "Índice", "Path": "Ruta", - "CreateChildDocument": "Crear documento hijo", "CreateChildTemplate": "Crear plantilla hija", - "All": "Todos", - "Space": "Espacio", "SelectParent": "Selecciona el objeto padre para tu documento", - "PrefixInUse": "Este prefijo ya está en uso por", "CodeInUse": "Este código ya está en uso por", "ChangeCode": "Cambiar Código", "ChangePrefix": "Cambiar Prefijo", - "MarkDocAsDeleted": "Marcar documento como eliminado", "MarkDocsAsDeleted": "Marcar múltiples documentos como eliminados", "MarkDocAsDeletedConfirm": "¿Realmente deseas marcar los siguientes documentos como eliminados: {titles}?", - "ArchiveDocs": "Archivar {count, plural, =0 {documento} other {documentos}}", "ArchiveDocsConfirm": "¿Realmente deseas archivar los siguientes documentos: {titles}?", - "DocumentInHierarchy": "Documento en jerarquía", "FirstDraftVersion": "Esta es la primera versión borrador del documento. Aún no hay historial.", "FirstOrNotAvailable": "Esta es la primera versión disponible del documento. Aún no hay historial o no está disponible.", - "EffectiveDocumentLifecycle": "Ciclo de vida del documento efectivo", - "ReasonAndImpact": "Motivo e Impacto", "ImpactAnalysis": "Análisis de impacto", "ImpactedDocuments": "Documentos impactados", - "CreateDocumentFailed": "Error al crear documento", "CreateDocumentTemplateFailed": "Error al crear plantilla", "TryAgain": "Por favor intenta de nuevo", - "DescribeChanges": "Describe qué se cambió...", "DescribeReason": "Describe por qué se cambió...", "DescribeImpact": "Tiene un impacto en...", @@ -287,17 +240,13 @@ "Of": " de ", "CreatedFromTemplate": "Creado desde plantilla: ", "UncontrolledCopy": "Copia no controlada", - "ViewAll": "Ver todo", "Readonly": "Solo lectura", - "NewDocumentSpace": "Nuevo espacio de documentos", "EditDocumentSpace": "Editar espacio de documentos", - "DocSpaceDescriptionPlaceholder": "Describe tu espacio...", "Members": "Miembros", "CreateOrgSpace": "Crear espacio de organización", - "ReviewDocumentPermission": "Revisar documento", "ReviewDocumentDescription": "Otorga a los usuarios la capacidad de revisar un documento", "ApproveDocumentPermission": "Aprobar documento", @@ -310,7 +259,6 @@ "CreateDocumentDescription": "Otorga a los usuarios la capacidad de crear un documento", "UpdateDocumentOwnerPermission": "Actualizar propietario del documento", "UpdateDocumentOwnerDescription": "Otorga a los usuarios la capacidad de actualizar el propietario de un documento", - "CreateDocumentCategoryPermission": "Crear categoría de documento", "CreateDocumentCategoryDescription": "Otorga a los usuarios la capacidad de crear una categoría de documento", "UpdateDocumentCategoryPermission": "Actualizar categoría de documento", @@ -319,21 +267,16 @@ "DeleteDocumentCategoryDescription": "Otorga a los usuarios la capacidad de eliminar una categoría de documento", "ConfigLabel": "Documentos Controlados", "ConfigDescription": "Extensión para gestionar documentos controlados", - "Transfer": "Transferir", "TransferWarning": "Algunos miembros del equipo pueden perder la capacidad de ver o editar este documento después de esta acción.", "TransferDocuments": "Transferir documentos controlados", "TransferDocumentsHint": "Documentos a transferir al espacio seleccionado:", - "CreateFolder": "Crear nueva carpeta", "RenameFolder": "Renombrar carpeta", "CreateChildFolder": "Crear carpeta hija", - "LatestVersionHint": "última", - "CannotDeleteFolder": "La carpeta no se puede eliminar", "CannotDeleteFolderHint": "Por favor mueve todos los documentos hijos a otra ubicación antes de eliminar la carpeta.", - "AllDocumentSpaces": "Todos los espacios de documentos" }, "controlledDocStates": { @@ -346,4 +289,3 @@ "ToReview": "A Revisar" } } - diff --git a/plugins/controlled-documents-assets/lang/fr.json b/plugins/controlled-documents-assets/lang/fr.json index 33e7562dcc..25077d28c1 100644 --- a/plugins/controlled-documents-assets/lang/fr.json +++ b/plugins/controlled-documents-assets/lang/fr.json @@ -2,14 +2,6 @@ "string": { "Export": "Exporter", "Import": "Importer", - "ImportingDocument": "Import du document", - "ConvertingDocument": "Conversion du document…", - "ImportingFromWord": "Import depuis Word", - "ConvertingWordDocument": "Conversion du document…", - "DocumentConverted": "Document converti", - "ImportFailed": "Échec de l'import", - "ReviewImportedChanges": "Vérifier les modifications importées", - "Apply": "Appliquer", "ExportToWord": "Exporter vers Word", "ImportFromWord": "Importer depuis Word", "ID": "ID", @@ -46,7 +38,6 @@ "Document": "Document", "NewDocumentDialogClose": "Voulez-vous fermer cette fenêtre ?", "NewDocumentCloseNote": "Tous les changements seront perdus", - "Cancel": "Annuler", "EditorPlaceholder": "tapez pour commencer à éditer...", "Version": "Version", "TemplateVersion": "Version du modèle", @@ -273,26 +264,20 @@ "DeleteDocumentCategoryDescription": "Accorde aux utilisateurs la capacité de supprimer une catégorie de document", "ConfigLabel": "Documents contrôlés", "ConfigDescription": "Extension pour gérer les documents contrôlés", - "Transfer": "Transfert", "TransferWarning": "Certains membres de l'équipe peuvent perdre la possibilité de visualiser ou de modifier ce document après cette action.", "TransferDocuments": "Transférer des documents contrôlés", "TransferDocumentsHint": "Documents à transférer dans l'espace sélectionné:", - "CreateFolder": "Créer un nouveau dossier", "RenameFolder": "Renommer le dossier", "CreateChildFolder": "Créer un sous-dossier", - "Obsolete": "Obsolète", "MakeDocumentObsolete": "Marquer comme obsolète", "MakeDocumentObsoleteDialog": "Marquer {count, plural, one {le document comme obsolète} other {les documents comme obsolètes}}", "MakeDocumentObsoleteConfirm": "Voulez-vous vraiment marquer les documents suivants comme obsolètes : {titles} ?", - "LatestVersionHint": "dernier", - "CannotDeleteFolder": "Le dossier ne peut pas être supprimé", "CannotDeleteFolderHint": "Veuillez déplacer tous les documents enfants vers un autre emplacement avant de supprimer le dossier.", - "AllDocumentSpaces": "Tous les espaces de documents" }, "controlledDocStates": { @@ -304,4 +289,4 @@ "Rejected": "Rejeté", "ToReview": "À réviser" } -} \ No newline at end of file +} diff --git a/plugins/controlled-documents-assets/lang/it.json b/plugins/controlled-documents-assets/lang/it.json index 810464ba40..453306f1e3 100644 --- a/plugins/controlled-documents-assets/lang/it.json +++ b/plugins/controlled-documents-assets/lang/it.json @@ -2,14 +2,6 @@ "string": { "Export": "Esporta", "Import": "Importa", - "ImportingDocument": "Importazione del documento", - "ConvertingDocument": "Conversione del documento…", - "ImportingFromWord": "Importazione da Word", - "ConvertingWordDocument": "Conversione del documento…", - "DocumentConverted": "Documento convertito", - "ImportFailed": "Importazione non riuscita", - "ReviewImportedChanges": "Rivedi le modifiche importate", - "Apply": "Applica", "ExportToWord": "Esporta in Word", "ImportFromWord": "Importa da Word", "ID": "ID", @@ -46,7 +38,6 @@ "Document": "Documento", "NewDocumentDialogClose": "Vuoi chiudere questo dialogo?", "NewDocumentCloseNote": "Tutte le modifiche saranno perse", - "Cancel": "Annulla", "EditorPlaceholder": "digita per iniziare a modificare...", "Version": "Versione", "TemplateVersion": "Versione del modello", @@ -270,26 +261,20 @@ "DeleteDocumentCategoryDescription": "Concede agli utenti la possibilità di eliminare una categoria di documento", "ConfigLabel": "Documenti controllati", "ConfigDescription": "Estensione per gestire documenti controllati", - "Transfer": "Trasferimento", "TransferWarning": "Alcuni membri del team potrebbero perdere la possibilità di visualizzare o modificare il documento dopo questa azione.", "TransferDocuments": "Trasferimento di documenti controllati", "TransferDocumentsHint": "Documenti da trasferire nello spazio selezionato:", - "CreateFolder": "Crea nuova cartella", "RenameFolder": "Rinomina cartella", "CreateChildFolder": "Crea sottocartella", - "Obsolete": "Obsoleto", "MakeDocumentObsolete": "Segna come obsoleto", "MakeDocumentObsoleteDialog": "Segna {count, plural, one {il documento come obsoleto} other {i documenti come obsoleti}}", "MakeDocumentObsoleteConfirm": "Vuoi davvero segnare i seguenti documenti come obsoleti: {titles}?", - "LatestVersionHint": "ultimo", - "CannotDeleteFolder": "Impossibile eliminare la cartella", "CannotDeleteFolderHint": "Sposta tutti i documenti figli in un'altra posizione prima di eliminare la cartella.", - "AllDocumentSpaces": "Tutti gli spazi documenti" }, "controlledDocStates": { diff --git a/plugins/controlled-documents-assets/lang/ja.json b/plugins/controlled-documents-assets/lang/ja.json index 66f1df875b..a0e9b311f0 100644 --- a/plugins/controlled-documents-assets/lang/ja.json +++ b/plugins/controlled-documents-assets/lang/ja.json @@ -2,14 +2,6 @@ "string": { "Export": "エクスポート", "Import": "インポート", - "ImportingDocument": "ドキュメントをインポート中", - "ConvertingDocument": "ドキュメントを変換中…", - "ImportingFromWord": "Wordからインポート中", - "ConvertingWordDocument": "ドキュメントを変換中…", - "DocumentConverted": "ドキュメントを変換しました", - "ImportFailed": "インポートに失敗しました", - "ReviewImportedChanges": "インポートした変更を確認", - "Apply": "適用", "ExportToWord": "Wordにエクスポート", "ImportFromWord": "Wordからインポート", "ID": "ID", @@ -45,7 +37,6 @@ "Document": "ドキュメント", "NewDocumentDialogClose": "このダイアログを閉じますか?", "NewDocumentCloseNote": "すべての変更は失われます", - "Cancel": "キャンセル", "EditorPlaceholder": "入力して編集を開始...", "Version": "バージョン", "TemplateVersion": "テンプレートバージョン", diff --git a/plugins/controlled-documents-assets/lang/ko.json b/plugins/controlled-documents-assets/lang/ko.json index f65cbf5a98..1e0d3c8ce4 100644 --- a/plugins/controlled-documents-assets/lang/ko.json +++ b/plugins/controlled-documents-assets/lang/ko.json @@ -1,299 +1,290 @@ { - "string": { + "string": { "Export": "내보내기", "Import": "가져오기", - "ImportingDocument": "문서 가져오는 중", - "ConvertingDocument": "문서 변환 중…", - "ImportingFromWord": "Word에서 가져오는 중", - "ConvertingWordDocument": "문서 변환 중…", - "DocumentConverted": "문서 변환 완료", - "ImportFailed": "가져오기 실패", - "ReviewImportedChanges": "가져온 변경사항 검토", - "Apply": "적용", "ExportToWord": "Word로 내보내기", "ImportFromWord": "Word에서 가져오기", - "ID": "ID", - "Code": "코드", - "Number": "번호", - "Category": "카테고리", - "CollaborativeDocument": "공동 편집 문서", - "ControlledDocument": "관리 문서", - "Requests": "요청", - "EffectiveDate": "발효일", - "PlannedEffectiveDate": "예정 발효일", - "Rank": "순위", - "DocumentRequest": "요청", - "DocumentReviewRequest": "문서 검토 요청", - "DocumentApprovalRequest": "문서 승인 요청", - "ControlledStatus": "관리 상태", - "Categories": "카테고리", - "Guidance": "안내", - "Required": "필수", - "Description": "설명", - "Major": "메이저", - "Minor": "마이너", - "Patch": "패치", - "ValidationWorkflow": "검증 워크플로", - "Creator": "생성자", - "ChangeOwner": "문서 소유자 변경", - "ChangeOwnerHintBeginning": "", - "ChangeOwnerHintEnd": "의 소유 권한을 다른 사용자에게 이전합니다.", - "ChangeOwnerWarning": "이 작업 후에는 이 문서를 편집할 수 없습니다.", - "SelectOwner": "새 소유자 선택", - "CreateDocument": "새 문서 생성", - "CreateTemplate": "새 템플릿 생성", - "Documents": "문서", - "Document": "문서", - "NewDocumentDialogClose": "이 대화 상자를 닫으시겠습니까?", - "NewDocumentCloseNote": "모든 변경 사항이 손실됩니다", - "Cancel": "취소", - "EditorPlaceholder": "입력하여 편집 시작...", - "Version": "버전", - "TemplateVersion": "템플릿 버전", - "VersionValue": "v{major}.{minor}", - "SearchDocument": "문서 검색...", - "CreateEnVersion": "검토용 버전 생성", - "Approvers": "승인자", - "ExternalApprovers": "외부 승인자", - "CoAuthors": "공동 작성자", - "Status": "상태", - "TemplateName": "템플릿 이름", - "DocumentApplication": "관리 문서", - "MyDocuments": "내 문서", - "Library": "라이브러리", - "Labels": "라벨", - "Author": "작성자", - "Review": "검토", - "Approval": "승인", - "Reviewer": "검토자", - "Approver": "승인자", - "DeleteCategory": "카테고리를 삭제하시겠습니까?", - "DeleteCategoryHint": "이 작업은 되돌릴 수 없습니다", - "DeleteCategoryWarning": "사용 중이므로 카테고리를 삭제할 수 없습니다", - "Latest": "최신", - "Draft": "초안", - "Reviewers": "검토자", - "ViewMode": "보기 중", - "EditMode": "편집 중", - "ComparisonMode": "비교 중", - "Compare": "비교:", - "Against": "대상:", - "RemovedAttachments": "삭제된 첨부 파일", - "Restore": "복원", - "ComparisonModeNotSupported": "비교 모드는 지원되지 않습니다.", - "CreateDraft": "초안 생성", - "SendForApproval": "승인 요청", - "SendForReview": "검토 요청", - "CompleteReview": "검토 완료하기", - "Approve": "승인", - "Reject": "반려", - "ConfirmApproval": "승인 확인", - "ConfirmRejection": "반려 확인", - "ProvideRejectionReason": "반려 사유 입력...", - "RejectionReason": "반려 사유", - "ConfirmReviewCompletion": "검토 완료 확인", - "ConfirmApprovalSubmission": "승인 요청 확인", - "ConfirmReviewSubmission": "검토 요청 확인", - "AddApprovalTitle": "승인자에게 문서 전송", - "AddApprovalDescription1": "승인 요청을 위해 문서가 다음 요건을 충족해야 합니다:", - "AddApprovalDescription2": "상태가 '초안' 또는 '검토 완료'", - "AddApprovalDescription3": "미해결 댓글 없음", - "AddApprovalDescription4": "교육훈련이 계획된 경우, 교육훈련 상태가 '릴리스됨'", - "NoApprovalsDescription": "이 버전의 문서에는 승인 내역이 없습니다", - "CurrentVersion": "현재 버전", - "DocumentTemplate": "템플릿", - "DocumentTemplates": "템플릿", - "DocumentCode": "문서 코드", - "TemplateCode": "템플릿 코드", - "DocumentCodePlaceholder": "DOC-1", - "DocumentPrefixPlaceholder": "DOC", - "DocumentPrefix": "문서 접두사", - "DocumentTemplateCreateLabel": "템플릿", - "DocumentCategoryCreateLabel": "카테고리", - "CreateDocumentCategory": "카테고리 생성", - "DocumentCategoryAlreadyExists": "이미 존재하는 카테고리입니다: \"{title}\". ", - "DocumentCategoryCodeAlreadyExists": "이미 사용 중인 코드입니다: \"{code}\". ", - "AttachmentsMax": "허용되는 최대 첨부 파일 수", - "Resolve": "해결", - "Unresolve": "미해결", - "Pending": "대기 중", - "Resolved": "해결됨", - "ShowResolved": "해결된 댓글 표시", - "Ordering": "순서", - "Title": "제목", - "Effective": "유효", - "Archived": "보관됨", - "Deleted": "삭제됨", - "MetaAbstract": "개요", - "Obsolete": "폐기", - "MakeDocumentObsolete": "폐기로 표시", - "MakeDocumentObsoleteDialog": "{count, plural, =0 {문서} other {문서}} 폐기로 표시", - "MakeDocumentObsoleteConfirm": "정말 다음 문서를 폐기로 표시하시겠습니까: {titles}?", - "ContentTab": "콘텐츠", - "TeamTab": "팀", - "MetaTab": "메타데이터", - "ChangeControlTab": "변경 관리", - "ReleaseTab": "릴리스", - "HistoryTab": "이력", - "ModificationDate": "수정일", - "Modified": "수정됨", - "Owner": "소유자", - "AssignedTo": "담당자", - "Unassigned": "미할당", - "Untitled": "제목 없음", - "Copy": "복사", - "AccessWorkarea": "작업 영역 접근", - "EffectiveLibrary": "유효 라이브러리", - "WorkingLibrary": "작업 라이브러리", - "CreateDraftQmsDocuments": "QMS 문서 초안 생성", - "OwnDocumentAskReviewGetApproval": "QMS 문서를 소유하고, 검토를 요청하여 승인 받기", - "ApproveDocuments": "문서 승인", - "ReassignOwnershipToAnotherUser": "다른 사용자에게 소유권 재할당", - "MakeDocumentEffective": "문서 발효 처리", - "CreateDraftQmsTemplates": "QMS 템플릿 초안 생성", - "ChangeControl": "변경 관리", - "ReviewInterval": "검토 주기", - "SelectReviewers": "검토자 선택", - "SelectApprovers": "승인자 선택", - "RequestsToReviewTheDoc": "님이 문서 검토를 요청합니다", - "RequestsToApproveTheDoc": "님이 문서 승인을 요청합니다", - "Parent": "상위", - "Template": "템플릿", - "GeneralInfo": "기본 정보", - "InProgress": "진행 중", - "EditDescription": "설명 편집", - "EditGuidance": "안내 편집", - "NewDocument": "새 문서", - "NewDocumentCategory": "새 카테고리", - "NewDocumentTemplate": "새 템플릿", - "LocationStepTitle": "위치", - "TemplateStepTitle": "템플릿", - "InfoStepTitle": "정보", - "TeamStepTitle": "팀", - "TitleAndDescr": "제목 및 설명", - "Reason": "사유", - "AbstractPlaceholder": "이 문서는 어떤 내용인가요? 누가 언제 필요로 하나요? ...", - "NewDocCreation": "새 문서 생성", - "NewTemplateCreation": "새 템플릿 생성", - "NewTemplatePlaceholder": "이 템플릿은 어떤 내용인가요? 올바른 사용 방법을 설명하세요...", - "CustomReason": "사용자 지정", - "ReasonPlaceholder": "사유 입력...", - "EditDocument": "문서 편집", - "Key": "키", - "CommentsSequence": "댓글 시퀀스", - "Email": "이메일", - "Password": "비밀번호", - "FieldIsEmpty": "{field}이(가) 비어 있습니다", - "ValidatingCredentials": "인증 정보 확인 중...", - "GeneralDocumentation": "사내 문서", - "TechnicalDocumentation": "기술 문서", - "UnsortedTemplates": "분류되지 않은 템플릿", - "Project": "프로젝트", - "Projects": "프로젝트", - "ExternalSpace": "프로젝트 스페이스", - "DocumentSpaceType": "문서 스페이스 유형", - "EffectiveImmediately": "승인 즉시", - "EffectiveOn": "발효일 지정", - "PeriodicReviewToBeCompleted": "정기 검토 완료 기한", - "MonthsAfterEffectiveDate": "발효일로부터 개월 후", - "ToBePassedWithin": "통과 기한", - "AttemptsAnd": "회 시도 및", - "DaysAfterEffectiveDate": "발효일로부터의 일수", - "Index": "인덱스", - "Path": "경로", - "CreateChildDocument": "하위 문서 생성", - "CreateChildTemplate": "하위 템플릿 생성", - "All": "전체", - "Space": "스페이스", - "SelectParent": "문서의 상위 객체 선택", - "PrefixInUse": "이 접두사는 이미 사용 중입니다:", - "CodeInUse": "이 코드는 이미 사용 중입니다:", - "ChangeCode": "코드 변경", - "ChangePrefix": "접두사 변경", - "MarkDocAsDeleted": "문서를 삭제됨으로 표시", - "MarkDocsAsDeleted": "여러 문서를 삭제됨으로 표시", - "MarkDocAsDeletedConfirm": "정말 다음 문서를 삭제됨으로 표시하시겠습니까: {titles}?", - "ArchiveDocs": "{count, plural, =0 {문서} other {문서}} 보관", - "ArchiveDocsConfirm": "정말 다음 문서를 보관하시겠습니까: {titles}?", - "DocumentInHierarchy": "계층 내 문서", - "FirstDraftVersion": "이 문서의 첫 번째 초안 버전입니다. 아직 이력이 없습니다.", - "FirstOrNotAvailable": "이 문서의 첫 번째 사용 가능한 버전입니다. 아직 이력이 없거나 사용할 수 없습니다.", - "EffectiveDocumentLifecycle": "유효 문서 라이프사이클", - "ReasonAndImpact": "사유 및 영향", - "ImpactAnalysis": "영향 분석", - "ImpactedDocuments": "영향받는 문서", - "CreateDocumentFailed": "문서 생성에 실패했습니다", - "CreateDocumentTemplateFailed": "템플릿 생성에 실패했습니다", - "TryAgain": "다시 시도해 주세요", - "DescribeChanges": "변경 내용 설명...", - "DescribeReason": "변경 사유 설명...", - "DescribeImpact": "영향 범위 설명...", - "AddDocument": "문서 추가", - "NoDocuments": "문서 없음", - "SysTemplate": "시스템 템플릿", - "DocumentTrainingDueDays": "기한(일)", - "DocumentTrainingEnabled": "활성화됨", - "Own": "소유", - "Snapshot": "스냅샷", - "Snapshots": "스냅샷", - "ControlledSnapshot": "관리 스냅샷", - "Name": "이름", - "DraftRevision": "초안 리비전", - "CreateNewDraft": "새 버전 초안 작성", - "RestoreDraft": "초안 복원", - "ChangeSeverity": "심각도 변경", - "Reference": "참조", - "History": "이력", - "Signatories": "서명자", - "Page": "페이지 ", - "Of": " / ", - "CreatedFromTemplate": "템플릿에서 생성: ", - "ViewAll": "모두 보기", - "Readonly": "읽기 전용", - "NewDocumentSpace": "새 문서 스페이스", - "EditDocumentSpace": "문서 스페이스 편집", - "DocSpaceDescriptionPlaceholder": "스페이스 설명...", - "Members": "멤버", - "CreateOrgSpace": "조직 스페이스 생성", - "ReviewDocumentPermission": "문서 검토", - "ReviewDocumentDescription": "사용자에게 문서를 검토할 권한을 부여", - "ApproveDocumentPermission": "문서 승인", - "ApproveDocumentDescription": "사용자에게 문서를 승인할 권한을 부여", - "ArchiveDocumentPermission": "문서 보관", - "ArchiveDocumentDescription": "사용자에게 문서를 보관할 권한을 부여", - "CoAuthorDocumentPermission": "문서 공동 작성", - "CoAuthorDocumentDescription": "사용자에게 문서를 공동 작성할 권한을 부여", - "CreateDocumentPermission": "문서 생성", - "CreateDocumentDescription": "사용자에게 문서를 생성할 권한을 부여", - "UpdateDocumentOwnerPermission": "문서 소유자 업데이트", - "UpdateDocumentOwnerDescription": "사용자에게 문서 소유자를 업데이트할 권한을 부여", - "CreateDocumentCategoryPermission": "문서 카테고리 생성", - "CreateDocumentCategoryDescription": "사용자에게 문서 카테고리를 생성할 권한을 부여", - "UpdateDocumentCategoryPermission": "문서 카테고리 업데이트", - "UpdateDocumentCategoryDescription": "사용자에게 문서 카테고리를 업데이트할 권한을 부여", - "DeleteDocumentCategoryPermission": "문서 카테고리 삭제", - "DeleteDocumentCategoryDescription": "사용자에게 문서 카테고리를 삭제할 권한을 부여", - "ConfigLabel": "관리 문서", - "ConfigDescription": "관리 문서 관리용 확장 기능", - "Transfer": "이전", - "TransferWarning": "이 작업 후에는 일부 팀원이 이 문서를 보거나 편집할 수 없게 될 수 있습니다.", - "TransferDocuments": "관리 문서 이전", - "TransferDocumentsHint": "선택한 스페이스로 이전할 문서:", - "CreateFolder": "새 폴더 생성", - "RenameFolder": "폴더 이름 변경", - "CreateChildFolder": "하위 폴더 생성", - "LatestVersionHint": "최신", - "CannotDeleteFolder": "폴더를 삭제할 수 없습니다", - "CannotDeleteFolderHint": "폴더를 삭제하기 전에 모든 하위 문서를 다른 위치로 이동하세요.", - "AllDocumentSpaces": "모든 문서 스페이스" - }, - "controlledDocStates": { - "Empty": "", - "Approved": "승인됨", - "InApproval": "승인 중", - "InReview": "검토 중", - "Reviewed": "검토 완료", - "Rejected": "반려됨", - "ToReview": "검토 대기" - } + "ID": "ID", + "Code": "코드", + "Number": "번호", + "Category": "카테고리", + "CollaborativeDocument": "공동 편집 문서", + "ControlledDocument": "관리 문서", + "Requests": "요청", + "EffectiveDate": "발효일", + "PlannedEffectiveDate": "예정 발효일", + "Rank": "순위", + "DocumentRequest": "요청", + "DocumentReviewRequest": "문서 검토 요청", + "DocumentApprovalRequest": "문서 승인 요청", + "ControlledStatus": "관리 상태", + "Categories": "카테고리", + "Guidance": "안내", + "Required": "필수", + "Description": "설명", + "Major": "메이저", + "Minor": "마이너", + "Patch": "패치", + "ValidationWorkflow": "검증 워크플로", + "Creator": "생성자", + "ChangeOwner": "문서 소유자 변경", + "ChangeOwnerHintBeginning": "", + "ChangeOwnerHintEnd": "의 소유 권한을 다른 사용자에게 이전합니다.", + "ChangeOwnerWarning": "이 작업 후에는 이 문서를 편집할 수 없습니다.", + "SelectOwner": "새 소유자 선택", + "CreateDocument": "새 문서 생성", + "CreateTemplate": "새 템플릿 생성", + "Documents": "문서", + "Document": "문서", + "NewDocumentDialogClose": "이 대화 상자를 닫으시겠습니까?", + "NewDocumentCloseNote": "모든 변경 사항이 손실됩니다", + "EditorPlaceholder": "입력하여 편집 시작...", + "Version": "버전", + "TemplateVersion": "템플릿 버전", + "VersionValue": "v{major}.{minor}", + "SearchDocument": "문서 검색...", + "CreateEnVersion": "검토용 버전 생성", + "Approvers": "승인자", + "ExternalApprovers": "외부 승인자", + "CoAuthors": "공동 작성자", + "Status": "상태", + "TemplateName": "템플릿 이름", + "DocumentApplication": "관리 문서", + "MyDocuments": "내 문서", + "Library": "라이브러리", + "Labels": "라벨", + "Author": "작성자", + "Review": "검토", + "Approval": "승인", + "Reviewer": "검토자", + "Approver": "승인자", + "DeleteCategory": "카테고리를 삭제하시겠습니까?", + "DeleteCategoryHint": "이 작업은 되돌릴 수 없습니다", + "DeleteCategoryWarning": "사용 중이므로 카테고리를 삭제할 수 없습니다", + "Latest": "최신", + "Draft": "초안", + "Reviewers": "검토자", + "ViewMode": "보기 중", + "EditMode": "편집 중", + "ComparisonMode": "비교 중", + "Compare": "비교:", + "Against": "대상:", + "RemovedAttachments": "삭제된 첨부 파일", + "Restore": "복원", + "ComparisonModeNotSupported": "비교 모드는 지원되지 않습니다.", + "CreateDraft": "초안 생성", + "SendForApproval": "승인 요청", + "SendForReview": "검토 요청", + "CompleteReview": "검토 완료하기", + "Approve": "승인", + "Reject": "반려", + "ConfirmApproval": "승인 확인", + "ConfirmRejection": "반려 확인", + "ProvideRejectionReason": "반려 사유 입력...", + "RejectionReason": "반려 사유", + "ConfirmReviewCompletion": "검토 완료 확인", + "ConfirmApprovalSubmission": "승인 요청 확인", + "ConfirmReviewSubmission": "검토 요청 확인", + "AddApprovalTitle": "승인자에게 문서 전송", + "AddApprovalDescription1": "승인 요청을 위해 문서가 다음 요건을 충족해야 합니다:", + "AddApprovalDescription2": "상태가 '초안' 또는 '검토 완료'", + "AddApprovalDescription3": "미해결 댓글 없음", + "AddApprovalDescription4": "교육훈련이 계획된 경우, 교육훈련 상태가 '릴리스됨'", + "NoApprovalsDescription": "이 버전의 문서에는 승인 내역이 없습니다", + "CurrentVersion": "현재 버전", + "DocumentTemplate": "템플릿", + "DocumentTemplates": "템플릿", + "DocumentCode": "문서 코드", + "TemplateCode": "템플릿 코드", + "DocumentCodePlaceholder": "DOC-1", + "DocumentPrefixPlaceholder": "DOC", + "DocumentPrefix": "문서 접두사", + "DocumentTemplateCreateLabel": "템플릿", + "DocumentCategoryCreateLabel": "카테고리", + "CreateDocumentCategory": "카테고리 생성", + "DocumentCategoryAlreadyExists": "이미 존재하는 카테고리입니다: \"{title}\". ", + "DocumentCategoryCodeAlreadyExists": "이미 사용 중인 코드입니다: \"{code}\". ", + "AttachmentsMax": "허용되는 최대 첨부 파일 수", + "Resolve": "해결", + "Unresolve": "미해결", + "Pending": "대기 중", + "Resolved": "해결됨", + "ShowResolved": "해결된 댓글 표시", + "Ordering": "순서", + "Title": "제목", + "Effective": "유효", + "Archived": "보관됨", + "Deleted": "삭제됨", + "MetaAbstract": "개요", + "Obsolete": "폐기", + "MakeDocumentObsolete": "폐기로 표시", + "MakeDocumentObsoleteDialog": "{count, plural, =0 {문서} other {문서}} 폐기로 표시", + "MakeDocumentObsoleteConfirm": "정말 다음 문서를 폐기로 표시하시겠습니까: {titles}?", + "ContentTab": "콘텐츠", + "TeamTab": "팀", + "MetaTab": "메타데이터", + "ChangeControlTab": "변경 관리", + "ReleaseTab": "릴리스", + "HistoryTab": "이력", + "ModificationDate": "수정일", + "Modified": "수정됨", + "Owner": "소유자", + "AssignedTo": "담당자", + "Unassigned": "미할당", + "Untitled": "제목 없음", + "Copy": "복사", + "AccessWorkarea": "작업 영역 접근", + "EffectiveLibrary": "유효 라이브러리", + "WorkingLibrary": "작업 라이브러리", + "CreateDraftQmsDocuments": "QMS 문서 초안 생성", + "OwnDocumentAskReviewGetApproval": "QMS 문서를 소유하고, 검토를 요청하여 승인 받기", + "ApproveDocuments": "문서 승인", + "ReassignOwnershipToAnotherUser": "다른 사용자에게 소유권 재할당", + "MakeDocumentEffective": "문서 발효 처리", + "CreateDraftQmsTemplates": "QMS 템플릿 초안 생성", + "ChangeControl": "변경 관리", + "ReviewInterval": "검토 주기", + "SelectReviewers": "검토자 선택", + "SelectApprovers": "승인자 선택", + "RequestsToReviewTheDoc": "님이 문서 검토를 요청합니다", + "RequestsToApproveTheDoc": "님이 문서 승인을 요청합니다", + "Parent": "상위", + "Template": "템플릿", + "GeneralInfo": "기본 정보", + "InProgress": "진행 중", + "EditDescription": "설명 편집", + "EditGuidance": "안내 편집", + "NewDocument": "새 문서", + "NewDocumentCategory": "새 카테고리", + "NewDocumentTemplate": "새 템플릿", + "LocationStepTitle": "위치", + "TemplateStepTitle": "템플릿", + "InfoStepTitle": "정보", + "TeamStepTitle": "팀", + "TitleAndDescr": "제목 및 설명", + "Reason": "사유", + "AbstractPlaceholder": "이 문서는 어떤 내용인가요? 누가 언제 필요로 하나요? ...", + "NewDocCreation": "새 문서 생성", + "NewTemplateCreation": "새 템플릿 생성", + "NewTemplatePlaceholder": "이 템플릿은 어떤 내용인가요? 올바른 사용 방법을 설명하세요...", + "CustomReason": "사용자 지정", + "ReasonPlaceholder": "사유 입력...", + "EditDocument": "문서 편집", + "Key": "키", + "CommentsSequence": "댓글 시퀀스", + "Email": "이메일", + "Password": "비밀번호", + "FieldIsEmpty": "{field}이(가) 비어 있습니다", + "ValidatingCredentials": "인증 정보 확인 중...", + "GeneralDocumentation": "사내 문서", + "TechnicalDocumentation": "기술 문서", + "UnsortedTemplates": "분류되지 않은 템플릿", + "Project": "프로젝트", + "Projects": "프로젝트", + "ExternalSpace": "프로젝트 스페이스", + "DocumentSpaceType": "문서 스페이스 유형", + "EffectiveImmediately": "승인 즉시", + "EffectiveOn": "발효일 지정", + "PeriodicReviewToBeCompleted": "정기 검토 완료 기한", + "MonthsAfterEffectiveDate": "발효일로부터 개월 후", + "ToBePassedWithin": "통과 기한", + "AttemptsAnd": "회 시도 및", + "DaysAfterEffectiveDate": "발효일로부터의 일수", + "Index": "인덱스", + "Path": "경로", + "CreateChildDocument": "하위 문서 생성", + "CreateChildTemplate": "하위 템플릿 생성", + "All": "전체", + "Space": "스페이스", + "SelectParent": "문서의 상위 객체 선택", + "PrefixInUse": "이 접두사는 이미 사용 중입니다:", + "CodeInUse": "이 코드는 이미 사용 중입니다:", + "ChangeCode": "코드 변경", + "ChangePrefix": "접두사 변경", + "MarkDocAsDeleted": "문서를 삭제됨으로 표시", + "MarkDocsAsDeleted": "여러 문서를 삭제됨으로 표시", + "MarkDocAsDeletedConfirm": "정말 다음 문서를 삭제됨으로 표시하시겠습니까: {titles}?", + "ArchiveDocs": "{count, plural, =0 {문서} other {문서}} 보관", + "ArchiveDocsConfirm": "정말 다음 문서를 보관하시겠습니까: {titles}?", + "DocumentInHierarchy": "계층 내 문서", + "FirstDraftVersion": "이 문서의 첫 번째 초안 버전입니다. 아직 이력이 없습니다.", + "FirstOrNotAvailable": "이 문서의 첫 번째 사용 가능한 버전입니다. 아직 이력이 없거나 사용할 수 없습니다.", + "EffectiveDocumentLifecycle": "유효 문서 라이프사이클", + "ReasonAndImpact": "사유 및 영향", + "ImpactAnalysis": "영향 분석", + "ImpactedDocuments": "영향받는 문서", + "CreateDocumentFailed": "문서 생성에 실패했습니다", + "CreateDocumentTemplateFailed": "템플릿 생성에 실패했습니다", + "TryAgain": "다시 시도해 주세요", + "DescribeChanges": "변경 내용 설명...", + "DescribeReason": "변경 사유 설명...", + "DescribeImpact": "영향 범위 설명...", + "AddDocument": "문서 추가", + "NoDocuments": "문서 없음", + "SysTemplate": "시스템 템플릿", + "DocumentTrainingDueDays": "기한(일)", + "DocumentTrainingEnabled": "활성화됨", + "Own": "소유", + "Snapshot": "스냅샷", + "Snapshots": "스냅샷", + "ControlledSnapshot": "관리 스냅샷", + "Name": "이름", + "DraftRevision": "초안 리비전", + "CreateNewDraft": "새 버전 초안 작성", + "RestoreDraft": "초안 복원", + "ChangeSeverity": "심각도 변경", + "Reference": "참조", + "History": "이력", + "Signatories": "서명자", + "Page": "페이지 ", + "Of": " / ", + "CreatedFromTemplate": "템플릿에서 생성: ", + "ViewAll": "모두 보기", + "Readonly": "읽기 전용", + "NewDocumentSpace": "새 문서 스페이스", + "EditDocumentSpace": "문서 스페이스 편집", + "DocSpaceDescriptionPlaceholder": "스페이스 설명...", + "Members": "멤버", + "CreateOrgSpace": "조직 스페이스 생성", + "ReviewDocumentPermission": "문서 검토", + "ReviewDocumentDescription": "사용자에게 문서를 검토할 권한을 부여", + "ApproveDocumentPermission": "문서 승인", + "ApproveDocumentDescription": "사용자에게 문서를 승인할 권한을 부여", + "ArchiveDocumentPermission": "문서 보관", + "ArchiveDocumentDescription": "사용자에게 문서를 보관할 권한을 부여", + "CoAuthorDocumentPermission": "문서 공동 작성", + "CoAuthorDocumentDescription": "사용자에게 문서를 공동 작성할 권한을 부여", + "CreateDocumentPermission": "문서 생성", + "CreateDocumentDescription": "사용자에게 문서를 생성할 권한을 부여", + "UpdateDocumentOwnerPermission": "문서 소유자 업데이트", + "UpdateDocumentOwnerDescription": "사용자에게 문서 소유자를 업데이트할 권한을 부여", + "CreateDocumentCategoryPermission": "문서 카테고리 생성", + "CreateDocumentCategoryDescription": "사용자에게 문서 카테고리를 생성할 권한을 부여", + "UpdateDocumentCategoryPermission": "문서 카테고리 업데이트", + "UpdateDocumentCategoryDescription": "사용자에게 문서 카테고리를 업데이트할 권한을 부여", + "DeleteDocumentCategoryPermission": "문서 카테고리 삭제", + "DeleteDocumentCategoryDescription": "사용자에게 문서 카테고리를 삭제할 권한을 부여", + "ConfigLabel": "관리 문서", + "ConfigDescription": "관리 문서 관리용 확장 기능", + "Transfer": "이전", + "TransferWarning": "이 작업 후에는 일부 팀원이 이 문서를 보거나 편집할 수 없게 될 수 있습니다.", + "TransferDocuments": "관리 문서 이전", + "TransferDocumentsHint": "선택한 스페이스로 이전할 문서:", + "CreateFolder": "새 폴더 생성", + "RenameFolder": "폴더 이름 변경", + "CreateChildFolder": "하위 폴더 생성", + "LatestVersionHint": "최신", + "CannotDeleteFolder": "폴더를 삭제할 수 없습니다", + "CannotDeleteFolderHint": "폴더를 삭제하기 전에 모든 하위 문서를 다른 위치로 이동하세요.", + "AllDocumentSpaces": "모든 문서 스페이스" + }, + "controlledDocStates": { + "Empty": "", + "Approved": "승인됨", + "InApproval": "승인 중", + "InReview": "검토 중", + "Reviewed": "검토 완료", + "Rejected": "반려됨", + "ToReview": "검토 대기" + } } diff --git a/plugins/controlled-documents-assets/lang/pl.json b/plugins/controlled-documents-assets/lang/pl.json index df848a7922..cc8cfb98c3 100644 --- a/plugins/controlled-documents-assets/lang/pl.json +++ b/plugins/controlled-documents-assets/lang/pl.json @@ -2,14 +2,6 @@ "string": { "Export": "Eksportuj", "Import": "Importuj", - "ImportingDocument": "Importowanie dokumentu", - "ConvertingDocument": "Konwertowanie dokumentu…", - "ImportingFromWord": "Importowanie z Word", - "ConvertingWordDocument": "Konwertowanie dokumentu…", - "DocumentConverted": "Dokument przekonwertowany", - "ImportFailed": "Import nie powiódł się", - "ReviewImportedChanges": "Przejrzyj zaimportowane zmiany", - "Apply": "Zastosuj", "ExportToWord": "Eksportuj do Word", "ImportFromWord": "Importuj z Word", "ID": "Identyfikator", @@ -46,7 +38,6 @@ "Document": "Dokument", "NewDocumentDialogClose": "Czy chcesz zamknąć to okno?", "NewDocumentCloseNote": "Wszystkie zmiany zostaną utracone", - "Cancel": "Anuluj", "EditorPlaceholder": "rozpocznij edycję...", "Version": "Wersja", "TemplateVersion": "Wersja szablonu", @@ -67,32 +58,24 @@ "Approval": "Zatwierdzenie", "Reviewer": "Recenzent", "Approver": "Zatwierdzający", - "DeleteCategory": "Usunąć kategorię?", "DeleteCategoryHint": "Tej akcji nie można cofnąć", "DeleteCategoryWarning": "Tej kategorii nie można usunąć, ponieważ jest używana", - "Latest": "Aktualny", "Draft": "Szkic", - "Reviewers": "Recenzenci", - "ViewMode": "Przegląd w trakcie", "EditMode": "Edycja", "ComparisonMode": "Porównywanie", - "Compare": "Porównaj:", "Against": "Z:", "RemovedAttachments": "Usunięte załączniki", "Restore": "Przywróć", - "ComparisonModeNotSupported": "Tryb porównania nie jest obsługiwany.", - "CreateDraft": "Utwórz szkic", "SendForApproval": "Wyślij do zatwierdzenia", "SendForReview": "Wyślij do recenzji", "CompleteReview": "Zakończ recenzję", - "Approve": "Zatwierdź", "Reject": "Odrzuć", "ConfirmApproval": "Utrzymaj zatwierdzenie", @@ -109,7 +92,6 @@ "AddApprovalDescription4": "jeśli planowane jest szkolenie, szkolenie ma status 'Opublikowane'", "NoApprovalsDescription": "Nikt nie zatwierdził tej wersji dokumentu", "CurrentVersion": "Aktualna wersja", - "DocumentTemplate": "Szablon", "DocumentTemplates": "Szablony", "DocumentCode": "Kod dokumentu", @@ -130,24 +112,20 @@ "ShowResolved": "Pokaż rozwiązane komentarze", "Ordering": "Porządkowanie", "Title": "Tytuł", - "Effective": "Aktualny", "Archived": "Zarchiwizowany", "Deleted": "Usunięty", "MetaAbstract": "Streszczenie", - "Obsolete": "Przestarzały", "MakeDocumentObsolete": "Oznacz jako przestarzały", "MakeDocumentObsoleteDialog": "Oznacz {count, plural, =0 {dokument} other {dokumenty}} jako przestarzałe", "MakeDocumentObsoleteConfirm": "Czy naprawdę chcesz oznaczyć następujące dokumenty jako przestarzałe: {titles}?", - "ContentTab": "Zawartość", "TeamTab": "Zespół", "MetaTab": "Metadane", "ChangeControlTab": "Kontrola zmian", "ReleaseTab": "Wydanie", "HistoryTab": "Historia", - "ModificationDate": "Zmodyfikowano o", "Modified": "Zmodyfikowany", "Owner": "Właściciel", @@ -155,7 +133,6 @@ "Unassigned": "Nieprzypisany", "Untitled": "Bez nazwy", "Copy": "kopiuj", - "AccessWorkarea": "Dostęp do obszaru roboczego", "EffectiveLibrary": "Biblioteka aktualnych dokumentów", "WorkingLibrary": "Biblioteka robocza", @@ -165,10 +142,8 @@ "ReassignOwnershipToAnotherUser": "Przepisz własność na innego użytkownika", "MakeDocumentEffective": "Uczyń dokument aktualnym", "CreateDraftQmsTemplates": "Utwórz szkice szablonów dla systemu zarządzania jakością", - "ChangeControl": "Kontrola zmian", "ReviewInterval": "Interwał recenzji", - "SelectReviewers": "Wybierz recenzentów", "SelectApprovers": "Wybierz zatwierdzających", "RequestsToReviewTheDoc": "prosi cię o recenzję dokumentu", @@ -177,19 +152,15 @@ "Template": "Szablon", "GeneralInfo": "Informacje ogólne", "InProgress": "W trakcie", - "EditDescription": "Edytuj opis", "EditGuidance": "Edytuj wskazówki", - "NewDocument": "Nowy dokument", "NewDocumentCategory": "Nowa kategoria", "NewDocumentTemplate": "Nowy szablon", - "LocationStepTitle": "Lokalizacja", "TemplateStepTitle": "Szablon", "InfoStepTitle": "Informacje", "TeamStepTitle": "Zespół", - "TitleAndDescr": "Tytuł i opis", "Reason": "Powód", "AbstractPlaceholder": "O czym jest ten dokument? Kto będzie go potrzebować i kiedy? ...", @@ -198,17 +169,13 @@ "NewTemplatePlaceholder": "O czym jest ten szablon? Opisz, jak prawidłowo go używać...", "CustomReason": "Niestandardowy", "ReasonPlaceholder": "Określ powód...", - "EditDocument": "Edytuj dokument", - "Key": "Klucz", "CommentsSequence": "Sekwencja komentarzy", - "Email": "E-mail", "Password": "Hasło", "FieldIsEmpty": "Pole {field} jest puste", "ValidatingCredentials": "Sprawdzanie poświadczeń...", - "GeneralDocumentation": "Dokumentacja ogólna", "TechnicalDocumentation": "Dokumentacja techniczna", "UnsortedTemplates": "Nieposortowane szablony", @@ -216,53 +183,39 @@ "Projects": "Projekty", "ExternalSpace": "Przestrzeń projektu", "DocumentSpaceType": "Typ przestrzeni dokumentów", - "EffectiveImmediately": "Natychmiast po zatwierdzeniu", "EffectiveOn": "Uczyń aktualnym dnia", - "PeriodicReviewToBeCompleted": "Okresowa recenzja do zakończenia w ciągu", "MonthsAfterEffectiveDate": "miesięcy po dacie wejścia w życie", "ToBePassedWithin": "Należy zaliczyć w", "AttemptsAnd": "próbach oraz w ciągu", "DaysAfterEffectiveDate": "dni od daty wejścia w życie", - "Index": "Spis treści", "Path": "Ścieżka", - "CreateChildDocument": "Utwórz poddokument", "CreateChildTemplate": "Utwórz szablon podrzędny", - "All": "Wszystkie", - "Space": "Przestrzeń", "SelectParent": "Wybierz obiekt nadrzędny dla swojego dokumentu", - "PrefixInUse": "Ten przedrostek jest już używany przez", "CodeInUse": "Ten kod jest już używany przez", "ChangeCode": "Zmień kod", "ChangePrefix": "Zmień przedrostek", - "MarkDocAsDeleted": "Oznaczanie dokumentu jako usuniętego", "MarkDocsAsDeleted": "Oznaczanie wielu dokumentów jako usuniętych", "MarkDocAsDeletedConfirm": "Czy naprawdę chcesz oznaczyć następujące dokumenty jako usunięte: {titles}?", - "ArchiveDocs": "Zarchiwizuj {count, plural, =1 {dokument} other {dokumenty}}", "ArchiveDocsConfirm": "Czy naprawdę chcesz zarchiwizować następujące dokumenty: {titles}?", - "DocumentInHierarchy": "Dokument w hierarchii", "FirstDraftVersion": "To jest pierwsza wersja szkicu dokumentu. Nie ma jeszcze historii.", "FirstOrNotAvailable": "To jest pierwsza dostępna wersja dokumentu. Nie ma jeszcze historii lub nie jest dostępna.", - "EffectiveDocumentLifecycle": "Cykl życia aktualnego dokumentu", - "ReasonAndImpact": "Powód i wpływ", "ImpactAnalysis": "Analiza wpływu", "ImpactedDocuments": "Dokumenty dotknięte", - "CreateDocumentFailed": "Nie udało się utworzyć dokumentu", "CreateDocumentTemplateFailed": "Nie udało się utworzyć szablonu", "TryAgain": "Spróbuj ponownie", - "DescribeChanges": "Opisz, co zostało zmienione...", "DescribeReason": "Opisz, dlaczego to zostało zmienione...", "DescribeImpact": "Wpływa na...", @@ -286,17 +239,13 @@ "Page": "Strona ", "Of": " z ", "CreatedFromTemplate": "Utworzony z szablonu: ", - "ViewAll": "Zobacz wszystkie", "Readonly": "Tylko do odczytu", - "NewDocumentSpace": "Nowa przestrzeń dokumentów", "EditDocumentSpace": "Edytuj przestrzeń dokumentów", - "DocSpaceDescriptionPlaceholder": "Opisz swoją przestrzeń...", "Members": "Członkowie", "CreateOrgSpace": "Utwórz przestrzeń organizacji", - "ReviewDocumentPermission": "Recenzuj dokumenty", "ReviewDocumentDescription": "Umożliwia użytkownikom recenzowanie dokumentów", "ApproveDocumentPermission": "Zatwierdzaj dokumenty", @@ -309,7 +258,6 @@ "CreateDocumentDescription": "Umożliwia użytkownikom tworzenie dokumentów", "UpdateDocumentOwnerPermission": "Aktualizuj właściciela dokumentu", "UpdateDocumentOwnerDescription": "Umożliwia użytkownikom aktualizację właściciela dokumentu", - "CreateDocumentCategoryPermission": "Utwórz kategorię dokumentu", "CreateDocumentCategoryDescription": "Umożliwia użytkownikom tworzenie kategorii dokumentów", "UpdateDocumentCategoryPermission": "Aktualizuj kategorię dokumentu", @@ -318,21 +266,16 @@ "DeleteDocumentCategoryDescription": "Umożliwia użytkownikom usuwanie kategorii dokumentów", "ConfigLabel": "Dokumenty autoryzowane", "ConfigDescription": "Rozszerzenie do zarządzania autoryzacją dokumentów", - "Transfer": "Przenieś", "TransferWarning": "Niektórzy członkowie zespołu mogą utracić możliwość przeglądania lub edycji tego dokumentu po tej akcji.", "TransferDocuments": "Przenieś dokumenty autoryzowane", "TransferDocumentsHint": "Dokumenty do przeniesienia do wybranej przestrzeni:", - "CreateFolder": "Utwórz nowy folder", "RenameFolder": "Zmień nazwę folderu", "CreateChildFolder": "Utwórz podfolder", - "LatestVersionHint": "najnowsza", - "CannotDeleteFolder": "Folder nie może zostać usunięty", "CannotDeleteFolderHint": "Przenieś wszystkie dokumenty podrzędne do innej lokalizacji przed usunięciem folderu.", - "AllDocumentSpaces": "Wszystkie przestrzenie dokumentów" }, "controlledDocStates": { diff --git a/plugins/controlled-documents-assets/lang/pt-br.json b/plugins/controlled-documents-assets/lang/pt-br.json index 241e11c7ad..c6ebf7bf18 100644 --- a/plugins/controlled-documents-assets/lang/pt-br.json +++ b/plugins/controlled-documents-assets/lang/pt-br.json @@ -2,14 +2,6 @@ "string": { "Export": "Exportar", "Import": "Importar", - "ImportingDocument": "Importando o documento", - "ConvertingDocument": "Convertendo o documento…", - "ImportingFromWord": "Importando do Word", - "ConvertingWordDocument": "Convertendo o documento…", - "DocumentConverted": "Documento convertido", - "ImportFailed": "Falha na importação", - "ReviewImportedChanges": "Revisar as alterações importadas", - "Apply": "Aplicar", "ExportToWord": "Exportar para Word", "ImportFromWord": "Importar do Word", "ID": "ID", @@ -46,7 +38,6 @@ "Document": "Documento", "NewDocumentDialogClose": "Deseja fechar este diálogo?", "NewDocumentCloseNote": "Todas as alterações serão perdidas", - "Cancel": "Cancelar", "EditorPlaceholder": "Digite para começar a editar...", "Version": "Versão", "TemplateVersion": "Versão do modelo", diff --git a/plugins/controlled-documents-assets/lang/pt.json b/plugins/controlled-documents-assets/lang/pt.json index 976e6b4cfe..c6ebf7bf18 100644 --- a/plugins/controlled-documents-assets/lang/pt.json +++ b/plugins/controlled-documents-assets/lang/pt.json @@ -2,14 +2,6 @@ "string": { "Export": "Exportar", "Import": "Importar", - "ImportingDocument": "A importar o documento", - "ConvertingDocument": "A converter o documento…", - "ImportingFromWord": "A importar do Word", - "ConvertingWordDocument": "A converter o documento…", - "DocumentConverted": "Documento convertido", - "ImportFailed": "Falha na importação", - "ReviewImportedChanges": "Rever as alterações importadas", - "Apply": "Aplicar", "ExportToWord": "Exportar para Word", "ImportFromWord": "Importar do Word", "ID": "ID", @@ -46,7 +38,6 @@ "Document": "Documento", "NewDocumentDialogClose": "Deseja fechar este diálogo?", "NewDocumentCloseNote": "Todas as alterações serão perdidas", - "Cancel": "Cancelar", "EditorPlaceholder": "Digite para começar a editar...", "Version": "Versão", "TemplateVersion": "Versão do modelo", diff --git a/plugins/controlled-documents-assets/lang/ru.json b/plugins/controlled-documents-assets/lang/ru.json index 9aa21cf628..65613cd882 100644 --- a/plugins/controlled-documents-assets/lang/ru.json +++ b/plugins/controlled-documents-assets/lang/ru.json @@ -2,14 +2,6 @@ "string": { "Export": "Экспорт", "Import": "Импорт", - "ImportingDocument": "Импорт документа", - "ConvertingDocument": "Конвертация документа…", - "ImportingFromWord": "Импорт из Word", - "ConvertingWordDocument": "Конвертация документа…", - "DocumentConverted": "Документ сконвертирован", - "ImportFailed": "Ошибка импорта", - "ReviewImportedChanges": "Просмотрите импортированные изменения", - "Apply": "Применить", "ExportToWord": "Экспорт в Word", "ImportFromWord": "Импорт из Word", "ID": "ID", @@ -46,7 +38,6 @@ "Document": "Документ", "NewDocumentDialogClose": "Вы действительно хотите закрыть окно?", "NewDocumentCloseNote": "Все внесенные изменения будут потеряны", - "Cancel": "Отмена", "EditorPlaceholder": "введите для начала...", "Version": "Версия", "TemplateVersion": "Версия шаблона", @@ -67,32 +58,24 @@ "Approval": "Утверждение", "Reviewer": "Рецензент", "Approver": "Утверждающий", - "DeleteCategory": "Удалить категорию?", "DeleteCategoryHint": "Это действие не может быть отменено", "DeleteCategoryWarning": "Эта категория используется, поэтому не может быть удалена", - "Latest": "Актуально", "Draft": "Рабочая копия", - "Reviewers": "Рецензенты", - "ViewMode": "Просмотр", "EditMode": "Редактирование", "ComparisonMode": "Сравнение", - "Compare": "Сравнить:", "Against": "с:", "RemovedAttachments": "Удалённые вложения", "Restore": "Восстановить", - "ComparisonModeNotSupported": "Сравнение не поддерживается.", - "CreateDraft": "Создать рабочую копию", "SendForApproval": "Попросить утверждения", "SendForReview": "Попросить рецензию", "CompleteReview": "Закончить рецензию", - "Approve": "Утвердить", "Reject": "Отказать", "ConfirmApproval": "Подтвердите согласие", @@ -109,7 +92,6 @@ "AddApprovalDescription4": "если запланирован тренинг, то этот тренинг должен иметь статус 'Опубликован'", "NoApprovalsDescription": "Нет утверждений для этой версии документа", "CurrentVersion": "Текущая версия", - "DocumentTemplate": "Шаблон", "DocumentTemplates": "Шаблоны", "DocumentCode": "Код документа", @@ -130,19 +112,16 @@ "ShowResolved": "Показать выполненные", "Ordering": "Сортировка", "Title": "Заголовок", - "Effective": "Актуальная", "Archived": "Архивированный", "Deleted": "Удаленный", "MetaAbstract": "Описание", - "ContentTab": "Документ", "TeamTab": "Команда", "MetaTab": "Метаданные", "ChangeControlTab": "Контроль изменений", "ReleaseTab": "Выпуск", "HistoryTab": "История", - "ModificationDate": "Модифицированно", "Modified": "Модифицированно", "Owner": "Владелец", @@ -150,7 +129,6 @@ "Unassigned": "Не назначено", "Untitled": "Без названия", "Copy": "копия", - "AccessWorkarea": "Доступ к рабочей области", "EffectiveLibrary": "Действующая библиотека", "WorkingLibrary": "Рабочая библиотека", @@ -160,10 +138,8 @@ "ReassignOwnershipToAnotherUser": "Переназначение права владения другому пользователю", "MakeDocumentEffective": "Сделать документ действующим", "CreateDraftQmsTemplates": "Создание черновых QMS шаблонов", - "ChangeControl": "Контроль Изменений", "ReviewInterval": "Интервал ревью", - "SelectReviewers": "Выберите рецензентов", "SelectApprovers": "Выберите утверждающих", "RequestsToReviewTheDoc": "запрашивает у вас рецензию на документ", @@ -172,19 +148,15 @@ "Template": "Шаблон", "GeneralInfo": "Общая информация", "InProgress": "Выполняется", - "EditDescription": "Редактировать описание", "EditGuidance": "Редактировать руководство", - "NewDocument": "Новый документ", "NewDocumentCategory": "Новая категория", "NewDocumentTemplate": "Новый шаблон", - "LocationStepTitle": "Расположение", "TemplateStepTitle": "Шаблон", "InfoStepTitle": "Инфо", "TeamStepTitle": "Команда", - "TitleAndDescr": "Заголовок и описание", "Reason": "Причина", "AbstractPlaceholder": "О чем этот документ? Кто будет его использовать и как? ...", @@ -193,17 +165,13 @@ "NewTemplatePlaceholder": "О чем этот шаблон? Опишите как правильно его использовать...", "CustomReason": "Другая", "ReasonPlaceholder": "Укажите причину...", - "EditDocument": "Редактировать документ", - "Key": "Ключ", "CommentsSequence": "Последовательность комментариев", - "Email": "Email", "Password": "Пароль", "FieldIsEmpty": "{field} не задан", "ValidatingCredentials": "Проверка информации...", - "GeneralDocumentation": "Общая документация", "TechnicalDocumentation": "Техническая документация", "UnsortedTemplates": "Несортированные шаблоны", @@ -211,59 +179,45 @@ "Projects": "Проекты", "ExternalSpace": "Пространства проектов", "DocumentSpaceType": "Тип пространства документов", - "EffectiveImmediately": "Сразу после утверждения", "EffectiveOn": "Сделать эффективным:", - "PeriodicReviewToBeCompleted": "Периодическое ревью документа в течение", "MonthsAfterEffectiveDate": "месяцев после даты, когда документ стал эффективным", "ToBePassedWithin": "Пройти в течение", "AttemptsAnd": "попыток и", "DaysAfterEffectiveDate": "дней после даты, когда документ стал эффективным", - "Index": "Индекс", "Path": "Путь", - "CreateChildDocument": "Создать дочерний документ", "CreateChildTemplate": "Создать дочерний шаблон", - "All": "Все", - "Space": "Пространство", "SelectParent": "Выберите родительский объект для Вашего документа", - "PrefixInUse": "Этот префикс уже используется", "CodeInUse": "Этот код уже используется", "ChangeCode": "Изменить код", "ChangePrefix": "Изменить префикс", - "MarkDocAsDeleted": "Пометить документ как удаленный", "MarkDocsAsDeleted": "Пометить несколько документов как удаленные", "MarkDocAsDeletedConfirm": "Вы действительно хотите пометить следующие документы как удаленные: {titles}?", "ArchiveDocs": "Архивировать {count, plural, =0 {документ} other {документы}}", "ArchiveDocsConfirm": "Вы действительно хотите архивировать следующие документы: {titles}?", - "DocumentInHierarchy": "Документ в иерархии", - "FirstDraftVersion": "Это первая рабочая копия документа. Для него пока нет истории.", + "FirstDraftVersion": "Это первая рабочая копия документа. Для него пока нет истории.", "FirstOrNotAvailable": "Это первая доступная версия документа. История еще не создана или недоступна.", - "EffectiveDocumentLifecycle": "Эффективный жизненный цикл документа", - "ReasonAndImpact": "Причина и Воздействие", "ImpactAnalysis": "Анализ воздействия", "ImpactedDocuments": "Подверженные документы", - "CreateDocumentFailed": "Ошибка при создании документа", "CreateDocumentTemplateFailed": "Ошибка при создании шаблона", "TryAgain": "Пожалуйста, попробуйте снова", - "DescribeChanges": "Опишите, что поменялось...", "DescribeReason": "Опишите, почему это поменялось...", "DescribeImpact": "Воздействует на...", "AddDocument": "Добавить документ", "NoDocuments": "Нет документов", "SysTemplate": "Системный шаблон", - "DocumentTrainingDueDays": "Срок", "DocumentTrainingEnabled": "Включен", "Own": "Собственный", @@ -282,17 +236,13 @@ "Of": " из ", "CreatedFromTemplate": "Создан из шаблона: ", "UncontrolledCopy": "Неконтролируемая копия", - "ViewAll": "Показать все", "Readonly": "Только для чтения", - "NewDocumentSpace": "Новое пространство документов", "EditDocumentSpace": "Редактировать пространство документов", - "DocSpaceDescriptionPlaceholder": "Опишите Ваше пространство...", "Members": "Участники", "CreateOrgSpace": "Создать пространство организации", - "ReviewDocumentPermission": "Рецензировать документ", "ReviewDocumentDescription": "Предоставляет пользователям разрешение рецензировать документ", "ApproveDocumentPermission": "Утверждать документ", @@ -305,7 +255,6 @@ "CreateDocumentDescription": "Предоставляет пользователям разрешение создавать документ", "UpdateDocumentOwnerPermission": "Изменять владельца документа", "UpdateDocumentOwnerDescription": "Предоставляет пользователям разрешение изменять владельца документа", - "CreateDocumentCategoryPermission": "Создавать категорию", "CreateDocumentCategoryDescription": "Предоставляет пользователям разрешение создавать категорию", "UpdateDocumentCategoryPermission": "Обновлять категорию", @@ -314,26 +263,20 @@ "DeleteDocumentCategoryDescription": "Предоставляет пользователям разрешение удалять категорию", "ConfigLabel": "Управляемые Документы", "ConfigDescription": "Расширение для управления управляемыми документами", - "Transfer": "Трансфер", "TransferWarning": "После этого действия некоторые члены команды могут потерять возможность просматривать или редактировать этот документ.", "TransferDocuments": "Трансфер управляемых документов", "TransferDocumentsHint": "Документы, которые будут перенесены в выбранное пространство:", - "CreateFolder": "Создать новую папку", "RenameFolder": "Переименовать папку", "CreateChildFolder": "Создать подпапку", - "Obsolete": "Устаревший", "MakeDocumentObsolete": "Пометить как устаревшее", "MakeDocumentObsoleteDialog": "Пометить {count, plural, one {документ как устаревший} other {документы как устаревшие}}", "MakeDocumentObsoleteConfirm": "Вы действительно хотите пометить следующие документы как устаревшие: {titles}?", - "LatestVersionHint": "последняя", - "CannotDeleteFolder": "Папка не может быть удалена", "CannotDeleteFolderHint": "Пожалуйста, переместите все дочерние документы в другое место перед удалением папки.", - "AllDocumentSpaces": "Все пространства документов" }, "controlledDocStates": { diff --git a/plugins/controlled-documents-assets/lang/tr.json b/plugins/controlled-documents-assets/lang/tr.json index b573ff98e9..5341cca335 100644 --- a/plugins/controlled-documents-assets/lang/tr.json +++ b/plugins/controlled-documents-assets/lang/tr.json @@ -2,14 +2,6 @@ "string": { "Export": "Dışa aktar", "Import": "İçe aktar", - "ImportingDocument": "Belge içe aktarılıyor", - "ConvertingDocument": "Belge dönüştürülüyor…", - "ImportingFromWord": "Word'den içe aktarılıyor", - "ConvertingWordDocument": "Belge dönüştürülüyor…", - "DocumentConverted": "Belge dönüştürüldü", - "ImportFailed": "İçe aktarma başarısız", - "ReviewImportedChanges": "İçe aktarılan değişiklikleri gözden geçir", - "Apply": "Uygula", "ExportToWord": "Word'e aktar", "ImportFromWord": "Word'den içe aktar", "ID": "ID", @@ -46,7 +38,6 @@ "Document": "Doküman", "NewDocumentDialogClose": "Bu diyalogu kapatmak istiyor musunuz?", "NewDocumentCloseNote": "Tüm değişiklikler kaybolacak", - "Cancel": "İptal", "EditorPlaceholder": "düzenlemeye başlamak için yazın...", "Version": "Sürüm", "TemplateVersion": "Şablon sürümü", diff --git a/plugins/controlled-documents-assets/lang/zh.json b/plugins/controlled-documents-assets/lang/zh.json index 9315824d7c..78a8b2ed34 100644 --- a/plugins/controlled-documents-assets/lang/zh.json +++ b/plugins/controlled-documents-assets/lang/zh.json @@ -2,14 +2,6 @@ "string": { "Export": "导出", "Import": "导入", - "ImportingDocument": "正在导入文档", - "ConvertingDocument": "正在转换文档…", - "ImportingFromWord": "正在从 Word 导入", - "ConvertingWordDocument": "正在转换文档…", - "DocumentConverted": "文档已转换", - "ImportFailed": "导入失败", - "ReviewImportedChanges": "查看导入的更改", - "Apply": "应用", "ExportToWord": "导出为 Word", "ImportFromWord": "从 Word 导入", "ID": "ID", @@ -46,7 +38,6 @@ "Document": "文档", "NewDocumentDialogClose": "您想要关闭此对话框吗?", "NewDocumentCloseNote": "所有更改将会丢失", - "Cancel": "取消", "EditorPlaceholder": "开始编辑...", "Version": "版本", "TemplateVersion": "模板版本", @@ -67,32 +58,24 @@ "Approval": "批准", "Reviewer": "审查人", "Approver": "批准人", - "DeleteCategory": "删除类别?", "DeleteCategoryHint": "此操作无法撤销", "DeleteCategoryWarning": "该类别正在使用,无法删除", - "Latest": "最新", "Draft": "草稿", - "Reviewers": "审查人", - "ViewMode": "查看", "EditMode": "编辑", "ComparisonMode": "比较", - "Compare": "比较:", "Against": "对比:", "RemovedAttachments": "已移除的附件", "Restore": "恢复", - "ComparisonModeNotSupported": "不支持比较模式。", - "CreateDraft": "创建草稿", "SendForApproval": "发送批准", "SendForReview": "发送审查", "CompleteReview": "完成审查", - "Approve": "批准", "Reject": "拒绝", "ConfirmApproval": "确认批准", @@ -107,7 +90,6 @@ "AddApprovalDescription4": "如果计划培训,培训的状态为 '已发布'", "NoApprovalsDescription": "此版本的文档没有获得批准", "CurrentVersion": "当前版本", - "DocumentTemplate": "模板", "DocumentTemplates": "模板", "DocumentCode": "文档代码", @@ -128,19 +110,16 @@ "ShowResolved": "显示已解决的评论", "Ordering": "排序", "Title": "标题", - "Effective": "生效", "Archived": "已归档", "Deleted": "已删除", "MetaAbstract": "摘要", - "ContentTab": "内容", "TeamTab": "团队", "MetaTab": "元数据", "ChangeControlTab": "变更控制", "ReleaseTab": "发布", "HistoryTab": "历史", - "ModificationDate": "修改日期", "Modified": "已修改", "Owner": "所有者", @@ -148,7 +127,6 @@ "Unassigned": "未分配", "Untitled": "无标题", "Copy": "复制", - "AccessWorkarea": "访问工作区", "EffectiveLibrary": "有效的文库", "WorkingLibrary": "工作文库", @@ -158,10 +136,8 @@ "ReassignOwnershipToAnotherUser": "重新分配所有权给其他用户", "MakeDocumentEffective": "使文档生效", "CreateDraftQmsTemplates": "创建 QMS 模板草稿", - "ChangeControl": "变更控制", "ReviewInterval": "审查间隔", - "SelectReviewers": "选择审查人", "SelectApprovers": "选择批准人", "RequestsToReviewTheDoc": "请求您审查文档", @@ -170,19 +146,15 @@ "Template": "模板", "GeneralInfo": "常规信息", "InProgress": "进行中", - "EditDescription": "编辑描述", "EditGuidance": "编辑指导", - "NewDocument": "新文档", "NewDocumentCategory": "新类别", "NewDocumentTemplate": "新模板", - "LocationStepTitle": "位置", "TemplateStepTitle": "模板", "InfoStepTitle": "信息", "TeamStepTitle": "团队", - "TitleAndDescr": "标题和描述", "Reason": "原因", "AbstractPlaceholder": "这份文档是关于什么的?谁需要它以及何时需要?...", @@ -191,17 +163,13 @@ "NewTemplatePlaceholder": "这个模板是关于什么的?描述如何正确使用它...", "CustomReason": "自定义", "ReasonPlaceholder": "指定原因...", - "EditDocument": "编辑文档", - "Key": "键", "CommentsSequence": "评论顺序", - "Email": "电子邮件", "Password": "密码", "FieldIsEmpty": "{field} 为空", "ValidatingCredentials": "验证凭据...", - "GeneralDocumentation": "常规文档", "TechnicalDocumentation": "技术文档", "UnsortedTemplates": "未整理模板", @@ -209,52 +177,39 @@ "Projects": "项目", "ExternalSpace": "项目空间", "DocumentSpaceType": "文档空间类型", - "EffectiveImmediately": "批准后立即生效", "EffectiveOn": "生效自", - "PeriodicReviewToBeCompleted": "定期审查需在以下时间内完成", "MonthsAfterEffectiveDate": "在生效日期后的几个月内", "ToBePassedWithin": "需在以下时间内完成", "AttemptsAnd": "尝试并", "DaysAfterEffectiveDate": "在生效日期后的几天内", - "Index": "索引", "Path": "路径", - "CreateChildDocument": "创建子文档", "CreateChildTemplate": "创建子模板", - "All": "全部", - "Space": "空间", "SelectParent": "为您的文档选择父级对象", - "PrefixInUse": "此前缀已被使用", "CodeInUse": "此代码已被使用", "ChangeCode": "更改代码", "ChangePrefix": "更改前缀", - "MarkDocAsDeleted": "标记文档为已删除", "MarkDocsAsDeleted": "标记多个文档为已删除", "MarkDocAsDeletedConfirm": "您真的想将以下文档标记为已删除吗:{titles}?", "ArchiveDocs": "归档 {count, plural, =0 {文档} other {文档}}", "ArchiveDocsConfirm": "您真的想将以下文档归档吗:{titles}?", - "DocumentInHierarchy": "层级中的文档", "FirstDraftVersion": "这是文档的第一个草稿版本。尚无历史记录。", "FirstOrNotAvailable": "这是文档的第一个可用版本。尚无历史记录或不可用。", - "EffectiveDocumentLifecycle": "有效的文档生命周期", - "ReasonAndImpact": "原因与影响", "ImpactAnalysis": "影响分析", "ImpactedDocuments": "受影响的文档", - "CreateDocumentFailed": "创建文档失败", "CreateDocumentTemplateFailed": "创建模板失败", "TryAgain": "请重试", - "DescribeChanges": "描述更改内容...", "DescribeReason": "描述更改原因...", "DescribeImpact": "影响到...", @@ -279,17 +234,13 @@ "Of": " 共 ", "CreatedFromTemplate": "从模板创建:", "UncontrolledCopy": "非受控副本", - "ViewAll": "查看全部", "Readonly": "只读", - "NewDocumentSpace": "新文档空间", "EditDocumentSpace": "编辑文档空间", - "DocSpaceDescriptionPlaceholder": "描述您的空间...", "Members": "成员", "CreateOrgSpace": "创建组织空间", - "ReviewDocumentPermission": "审查文档", "ReviewDocumentDescription": "授予用户审查文档的权限", "ApproveDocumentPermission": "批准文档", @@ -302,7 +253,6 @@ "CreateDocumentDescription": "授予用户创建文档的权限", "UpdateDocumentOwnerPermission": "更新文档所有者", "UpdateDocumentOwnerDescription": "授予用户更新文档所有者的权限", - "CreateDocumentCategoryPermission": "创建文档类别", "CreateDocumentCategoryDescription": "授予用户创建文档类别的权限", "UpdateDocumentCategoryPermission": "更新文档类别", @@ -311,26 +261,20 @@ "DeleteDocumentCategoryDescription": "授予用户删除文档类别的权限", "ConfigLabel": "受控文档", "ConfigDescription": "用于管理受控文档的扩展", - "Transfer": "转让", "TransferWarning": "执行此操作后,某些团队成员可能会失去查看或编辑此文档的能力", "TransferDocuments": "移交受控文件", "TransferDocumentsHint": "要转移到所选空间的文件:", - "CreateFolder": "创建新文件夹", "RenameFolder": "重命名文件夹", "CreateChildFolder": "创建子文件夹", - "Obsolete": "已过时", "MakeDocumentObsolete": "标记为过时", "MakeDocumentObsoleteDialog": "标记 {count, plural, one {文档为过时} other {文档为过时}}", "MakeDocumentObsoleteConfirm": "您确定要将以下文档标记为过时吗:{titles}?", - "LatestVersionHint": "最新", - "CannotDeleteFolder": "无法删除文件夹", "CannotDeleteFolderHint": "请在删除文件夹之前将所有子文档移动到其他位置。", - "AllDocumentSpaces": "所有文档空间" }, "controlledDocStates": { diff --git a/plugins/controlled-documents-resources/package.json b/plugins/controlled-documents-resources/package.json index 2cc0b0906c..1a07f5659b 100644 --- a/plugins/controlled-documents-resources/package.json +++ b/plugins/controlled-documents-resources/package.json @@ -59,7 +59,6 @@ "@hcengineering/text": "workspace:^0.7.19", "@hcengineering/text-editor": "workspace:^0.7.0", "@hcengineering/text-editor-resources": "workspace:^0.7.0", - "@hcengineering/export": "workspace:^0.7.0", "@hcengineering/collaborator-client": "workspace:^0.7.18", "@hcengineering/activity": "workspace:^0.7.0", "@hcengineering/request": "workspace:^0.7.0", diff --git a/plugins/controlled-documents-resources/src/components/document/ExportFormatPopup.svelte b/plugins/controlled-documents-resources/src/components/document/ExportFormatPopup.svelte deleted file mode 100644 index 13f0990ec6..0000000000 --- a/plugins/controlled-documents-resources/src/components/document/ExportFormatPopup.svelte +++ /dev/null @@ -1,39 +0,0 @@ - - - - { - const format = evt.detail - if (typeof format === 'string' && doc !== undefined) { - void exportDocument(doc, format) - } - dispatch('close') - }} -/> diff --git a/plugins/controlled-documents-resources/src/components/document/ImportFormatPopup.svelte b/plugins/controlled-documents-resources/src/components/document/ImportFormatPopup.svelte deleted file mode 100644 index ca8543b073..0000000000 --- a/plugins/controlled-documents-resources/src/components/document/ImportFormatPopup.svelte +++ /dev/null @@ -1,39 +0,0 @@ - - - - { - const format = evt.detail - if (typeof format === 'string' && doc !== undefined) { - void importDocument(doc, format) - } - dispatch('close') - }} -/> diff --git a/plugins/controlled-documents-resources/src/docxActions.ts b/plugins/controlled-documents-resources/src/docxActions.ts deleted file mode 100644 index d717699f3b..0000000000 --- a/plugins/controlled-documents-resources/src/docxActions.ts +++ /dev/null @@ -1,158 +0,0 @@ -// -// Copyright © 2026 TraceX SAS. -// -// Licensed under the PolyForm Shield License 1.0.0 (the "License"); -// you may not use this file except in compliance with the License. You may -// obtain a copy of the License at https://polyformproject.org/licenses/shield/1.0.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// -// See the License for the specific language governing permissions and -// limitations under the License. -// - -import attachment from '@hcengineering/attachment' -import { getClient as getCollaboratorClient } from '@hcengineering/collaborator-client' -import { makeDocCollabId } from '@hcengineering/core' -import { type ControlledDocument } from '@hcengineering/controlled-documents' -import exportPlugin from '@hcengineering/export' -import { getMetadata, getResource, setPlatformStatus, translate, unknownError } from '@hcengineering/platform' -import presentation from '@hcengineering/presentation' -import { jsonToMarkup, type MarkupNode } from '@hcengineering/text' -import { showPopup, withProgress } from '@hcengineering/ui' -import { getCurrentLanguage } from '@hcengineering/theme' - -import ImportDocxPopup from './components/document/ImportDocxPopup.svelte' -import plugin from './plugin' - -function getExportBaseUrl (): string { - const url = getMetadata(exportPlugin.metadata.ExportUrl) - if (url === undefined || url === '') { - throw new Error('Export service URL (export.metadata.ExportUrl) is not configured') - } - return url -} - -function getToken (): string { - return getMetadata(presentation.metadata.Token) ?? '' -} - -function authHeaders (): Record { - return { - Authorization: `Bearer ${getToken()}`, - 'Content-Type': 'application/json' - } -} - -/** Export a document's body in the given format ('docx' | 'md') and download it. */ -export async function exportDocument (doc: ControlledDocument, format: string): Promise { - const response = await fetch(`${getExportBaseUrl()}/document-export`, { - method: 'POST', - headers: authHeaders(), - body: JSON.stringify({ _class: doc._class, _id: doc._id, format }) - }) - if (!response.ok) { - throw new Error('Failed to export document') - } - - const blob = await response.blob() - const contentDisposition = response.headers.get('Content-Disposition') - const filename = contentDisposition?.match(/filename="([^"]*)"/)?.[1] ?? `${doc.title ?? 'document'}.${format}` - - // Attach the anchor to the DOM before click() (detached anchors are ignored by some - // browsers) and defer the revoke — revoking synchronously drops the blob mid-read. - const url = window.URL.createObjectURL(blob) - const anchor = document.createElement('a') - anchor.style.display = 'none' - anchor.href = url - anchor.download = filename - document.body.appendChild(anchor) - anchor.click() - setTimeout(() => { - document.body.removeChild(anchor) - window.URL.revokeObjectURL(url) - }, 10000) -} - -/** Import an edited document ('docx' | 'md'): convert, preview the diff, apply. */ -export async function importDocument (doc: ControlledDocument, format: string): Promise { - const accept = format === 'md' ? '.md,.markdown' : '.docx' - const file = await pickFile(accept) - if (file === undefined) { - return - } - - const lang = getCurrentLanguage() - let converted: { current: MarkupNode, candidate: MarkupNode } - try { - // Conversion can take a while with no incremental progress, so a shared - // long-running-task toast shows a spinner until it settles. - converted = await withProgress( - { - title: await translate(plugin.string.ImportingDocument, {}, lang), - message: await translate(plugin.string.ConvertingDocument, {}, lang), - done: await translate(plugin.string.DocumentConverted, {}, lang), - failed: await translate(plugin.string.ImportFailed, {}, lang) - }, - async () => { - const uploadFile = await getResource(attachment.helper.UploadFile) - const { uuid } = await uploadFile(file) - - const diffResponse = await fetch(`${getExportBaseUrl()}/document-import`, { - method: 'POST', - headers: authHeaders(), - body: JSON.stringify({ blobId: uuid, _class: doc._class, _id: doc._id, format }) - }) - if (!diffResponse.ok) { - throw new Error('Failed to convert document') - } - return (await diffResponse.json()) as { current: MarkupNode, candidate: MarkupNode } - } - ) - } catch { - // The progress toast already surfaced the failure. - return - } - - showPopup(ImportDocxPopup, { current: converted.current, candidate: converted.candidate }, undefined, (apply) => { - if (apply === true) { - void applyImportedContent(doc, converted.candidate).catch((err) => { - void setPlatformStatus(unknownError(err)) - }) - } - }) -} - -async function applyImportedContent (doc: ControlledDocument, markup: MarkupNode): Promise { - // NOTE: writes into the current (Draft) document's content. Creating a brand-new - // version/snapshot before applying (createNewDraftForControlledDoc + snapshot) is a - // follow-up — it needs project/version resolution owned by the CD "new draft" flow. - // - // The write goes through the collaborator (updateMarkup), NOT a raw content-blob - // write: the editor and collaborator serve the live Y.Doc, and a document that has - // ever been opened has a Y.Doc blob that takes precedence over the JSON content blob. - // Only updateMarkup updates that live Y.Doc, so the change actually becomes visible. - const token = getMetadata(presentation.metadata.Token) ?? '' - const collaboratorUrl = getMetadata(presentation.metadata.CollaboratorUrl) ?? '' - const workspace = getMetadata(presentation.metadata.WorkspaceUuid) - if (workspace === undefined || collaboratorUrl === '') { - throw new Error('Collaborator service is not configured') - } - - const collaborator = getCollaboratorClient(workspace, token, collaboratorUrl) - await collaborator.updateMarkup(makeDocCollabId(doc, 'content'), jsonToMarkup(markup)) -} - -async function pickFile (accept: string): Promise { - return await new Promise((resolve) => { - const input = document.createElement('input') - input.type = 'file' - input.accept = accept - input.onchange = () => { - resolve(input.files?.[0]) - } - input.click() - }) -} diff --git a/plugins/controlled-documents-resources/src/index.ts b/plugins/controlled-documents-resources/src/index.ts index 97d2e7984a..4f9e39176e 100644 --- a/plugins/controlled-documents-resources/src/index.ts +++ b/plugins/controlled-documents-resources/src/index.ts @@ -42,8 +42,6 @@ import QmsTemplateWizard from './components/create-doc/QmsTemplateWizard.svelte' import DocumentStatusTag from './components/document/common/DocumentStatusTag.svelte' import AddCommentPopup from './components/document/popups/AddCommentPopup.svelte' import ChangeOwnerPopup from './components/document/popups/ChangeOwnerPopup.svelte' -import ExportFormatPopup from './components/document/ExportFormatPopup.svelte' -import ImportFormatPopup from './components/document/ImportFormatPopup.svelte' import DocumentCommentsPopup from './components/document/popups/DocumentCommentsPopup.svelte' import DocumentPresenter from './components/document/presenters/DocumentPresenter.svelte' import OwnerPresenter from './components/document/presenters/OwnerPresenter.svelte' @@ -403,8 +401,6 @@ export default async (): Promise => ({ AddCommentPopup, DocumentCommentsPopup, ChangeOwnerPopup, - ExportFormatPopup, - ImportFormatPopup, DeleteCategoryPopup, Projects, ProjectPresenter, diff --git a/plugins/controlled-documents-resources/src/plugin.ts b/plugins/controlled-documents-resources/src/plugin.ts index b6f87b0a9f..ccc7141443 100644 --- a/plugins/controlled-documents-resources/src/plugin.ts +++ b/plugins/controlled-documents-resources/src/plugin.ts @@ -50,15 +50,6 @@ export default mergeIds(documentsId, documents, { string: { ID: '' as IntlString, ValidationWorkflow: '' as IntlString, - Cancel: '' as IntlString, - ReviewImportedChanges: '' as IntlString, - Apply: '' as IntlString, - ImportingFromWord: '' as IntlString, - ImportingDocument: '' as IntlString, - ConvertingDocument: '' as IntlString, - ConvertingWordDocument: '' as IntlString, - DocumentConverted: '' as IntlString, - ImportFailed: '' as IntlString, NewDocumentDialogClose: '' as IntlString, NewDocumentCloseNote: '' as IntlString, CreateDocumentCategory: '' as IntlString, diff --git a/plugins/controlled-documents/src/plugin.ts b/plugins/controlled-documents/src/plugin.ts index 6a33d385dc..0a8f161f82 100644 --- a/plugins/controlled-documents/src/plugin.ts +++ b/plugins/controlled-documents/src/plugin.ts @@ -108,9 +108,7 @@ export const documentsPlugin = plugin(documentsId, { DocumentVersionPresenter: '' as AnyComponent, DeleteCategoryPopup: '' as AnyComponent, DocumentIcon: '' as AnyComponent, - CreateFolder: '' as AnyComponent, - ExportFormatPopup: '' as AnyComponent, - ImportFormatPopup: '' as AnyComponent + CreateFolder: '' as AnyComponent }, action: { ChangeDocumentOwner: '' as Ref>, diff --git a/plugins/export-assets/lang/cs.json b/plugins/export-assets/lang/cs.json index dc0fb2aa01..fd25681799 100644 --- a/plugins/export-assets/lang/cs.json +++ b/plugins/export-assets/lang/cs.json @@ -59,6 +59,19 @@ "ExportMarkdown": "Markdown", "ExportScopeSelected": "Vybrané ({count})", "ExportScopeLoaded": "Načtené na této stránce ({count})", - "ExportFileName": "Název souboru" + "ExportFileName": "Název souboru", + "ExportFormatWord": "Word (.docx)", + "ExportFormatMarkdown": "Markdown (.md)", + "ExportDocumentContent": "Exportovat obsah", + "ImportDocumentContent": "Importovat obsah", + "ExportingDocumentContent": "Export dokumentu…", + "DocumentContentExported": "Dokument exportován", + "DocumentContentExportFailed": "Export selhal", + "ImportingDocumentContent": "Import dokumentu", + "ConvertingDocumentContent": "Převod dokumentu…", + "DocumentContentConverted": "Dokument převeden", + "DocumentContentImportFailed": "Import selhal", + "ReviewDocumentContentChanges": "Zkontrolovat importované změny", + "ApplyDocumentContentChanges": "Použít" } } diff --git a/plugins/export-assets/lang/de.json b/plugins/export-assets/lang/de.json index d9901d594f..e9250c616a 100644 --- a/plugins/export-assets/lang/de.json +++ b/plugins/export-assets/lang/de.json @@ -59,6 +59,19 @@ "ExportMarkdown": "Markdown", "ExportScopeSelected": "Ausgewählte ({count})", "ExportScopeLoaded": "Auf dieser Seite geladen ({count})", - "ExportFileName": "Dateiname" + "ExportFileName": "Dateiname", + "ExportFormatWord": "Word (.docx)", + "ExportFormatMarkdown": "Markdown (.md)", + "ExportDocumentContent": "Inhalt exportieren", + "ImportDocumentContent": "Inhalt importieren", + "ExportingDocumentContent": "Dokument wird exportiert…", + "DocumentContentExported": "Dokument exportiert", + "DocumentContentExportFailed": "Export fehlgeschlagen", + "ImportingDocumentContent": "Dokument wird importiert", + "ConvertingDocumentContent": "Dokument wird konvertiert…", + "DocumentContentConverted": "Dokument konvertiert", + "DocumentContentImportFailed": "Import fehlgeschlagen", + "ReviewDocumentContentChanges": "Importierte Änderungen prüfen", + "ApplyDocumentContentChanges": "Übernehmen" } } diff --git a/plugins/export-assets/lang/en.json b/plugins/export-assets/lang/en.json index 9386c8e01c..ca0aaa24de 100644 --- a/plugins/export-assets/lang/en.json +++ b/plugins/export-assets/lang/en.json @@ -59,6 +59,20 @@ "ExportMarkdown": "Markdown", "ExportScopeSelected": "Selected ({count})", "ExportScopeLoaded": "Loaded on this page ({count})", - "ExportFileName": "File name" + "ExportFileName": "File name", + + "ExportFormatWord": "Word (.docx)", + "ExportFormatMarkdown": "Markdown (.md)", + "ExportDocumentContent": "Export content", + "ImportDocumentContent": "Import content", + "ExportingDocumentContent": "Exporting document…", + "DocumentContentExported": "Document exported", + "DocumentContentExportFailed": "Export failed", + "ImportingDocumentContent": "Importing document", + "ConvertingDocumentContent": "Converting document…", + "DocumentContentConverted": "Document converted", + "DocumentContentImportFailed": "Import failed", + "ReviewDocumentContentChanges": "Review imported changes", + "ApplyDocumentContentChanges": "Apply" } } diff --git a/plugins/export-assets/lang/es.json b/plugins/export-assets/lang/es.json index e1dcfe2aa2..5fcaabc9d3 100644 --- a/plugins/export-assets/lang/es.json +++ b/plugins/export-assets/lang/es.json @@ -59,6 +59,19 @@ "ExportMarkdown": "Markdown", "ExportScopeSelected": "Seleccionados ({count})", "ExportScopeLoaded": "Cargados en esta página ({count})", - "ExportFileName": "Nombre del archivo" + "ExportFileName": "Nombre del archivo", + "ExportFormatWord": "Word (.docx)", + "ExportFormatMarkdown": "Markdown (.md)", + "ExportDocumentContent": "Exportar contenido", + "ImportDocumentContent": "Importar contenido", + "ExportingDocumentContent": "Exportando el documento…", + "DocumentContentExported": "Documento exportado", + "DocumentContentExportFailed": "Error de exportación", + "ImportingDocumentContent": "Importando el documento", + "ConvertingDocumentContent": "Convirtiendo el documento…", + "DocumentContentConverted": "Documento convertido", + "DocumentContentImportFailed": "Error de importación", + "ReviewDocumentContentChanges": "Revisar los cambios importados", + "ApplyDocumentContentChanges": "Aplicar" } } diff --git a/plugins/export-assets/lang/fr.json b/plugins/export-assets/lang/fr.json index 7bb68d31c0..1dd1f25850 100644 --- a/plugins/export-assets/lang/fr.json +++ b/plugins/export-assets/lang/fr.json @@ -59,6 +59,19 @@ "ExportMarkdown": "Markdown", "ExportScopeSelected": "Sélectionnés ({count})", "ExportScopeLoaded": "Chargés sur cette page ({count})", - "ExportFileName": "Nom du fichier" + "ExportFileName": "Nom du fichier", + "ExportFormatWord": "Word (.docx)", + "ExportFormatMarkdown": "Markdown (.md)", + "ExportDocumentContent": "Exporter le contenu", + "ImportDocumentContent": "Importer le contenu", + "ExportingDocumentContent": "Export du document…", + "DocumentContentExported": "Document exporté", + "DocumentContentExportFailed": "Échec de l'export", + "ImportingDocumentContent": "Import du document", + "ConvertingDocumentContent": "Conversion du document…", + "DocumentContentConverted": "Document converti", + "DocumentContentImportFailed": "Échec de l'import", + "ReviewDocumentContentChanges": "Vérifier les modifications importées", + "ApplyDocumentContentChanges": "Appliquer" } } diff --git a/plugins/export-assets/lang/it.json b/plugins/export-assets/lang/it.json index 453d606473..01531ed938 100644 --- a/plugins/export-assets/lang/it.json +++ b/plugins/export-assets/lang/it.json @@ -59,6 +59,19 @@ "ExportMarkdown": "Markdown", "ExportScopeSelected": "Selezionati ({count})", "ExportScopeLoaded": "Caricati in questa pagina ({count})", - "ExportFileName": "Nome file" + "ExportFileName": "Nome file", + "ExportFormatWord": "Word (.docx)", + "ExportFormatMarkdown": "Markdown (.md)", + "ExportDocumentContent": "Esporta contenuto", + "ImportDocumentContent": "Importa contenuto", + "ExportingDocumentContent": "Esportazione del documento…", + "DocumentContentExported": "Documento esportato", + "DocumentContentExportFailed": "Esportazione non riuscita", + "ImportingDocumentContent": "Importazione del documento", + "ConvertingDocumentContent": "Conversione del documento…", + "DocumentContentConverted": "Documento convertito", + "DocumentContentImportFailed": "Importazione non riuscita", + "ReviewDocumentContentChanges": "Rivedi le modifiche importate", + "ApplyDocumentContentChanges": "Applica" } } diff --git a/plugins/export-assets/lang/ja.json b/plugins/export-assets/lang/ja.json index 0960aabcf0..59926fdf65 100644 --- a/plugins/export-assets/lang/ja.json +++ b/plugins/export-assets/lang/ja.json @@ -59,6 +59,19 @@ "ExportMarkdown": "Markdown", "ExportScopeSelected": "選択項目 ({count})", "ExportScopeLoaded": "このページに読み込み済み ({count})", - "ExportFileName": "ファイル名" + "ExportFileName": "ファイル名", + "ExportFormatWord": "Word (.docx)", + "ExportFormatMarkdown": "Markdown (.md)", + "ExportDocumentContent": "コンテンツをエクスポート", + "ImportDocumentContent": "コンテンツをインポート", + "ExportingDocumentContent": "ドキュメントをエクスポート中…", + "DocumentContentExported": "ドキュメントをエクスポートしました", + "DocumentContentExportFailed": "エクスポートに失敗しました", + "ImportingDocumentContent": "ドキュメントをインポート中", + "ConvertingDocumentContent": "ドキュメントを変換中…", + "DocumentContentConverted": "ドキュメントを変換しました", + "DocumentContentImportFailed": "インポートに失敗しました", + "ReviewDocumentContentChanges": "インポートした変更を確認", + "ApplyDocumentContentChanges": "適用" } } diff --git a/plugins/export-assets/lang/ko.json b/plugins/export-assets/lang/ko.json index bae168b477..60ec10593e 100644 --- a/plugins/export-assets/lang/ko.json +++ b/plugins/export-assets/lang/ko.json @@ -59,6 +59,19 @@ "ExportMarkdown": "Markdown", "ExportScopeSelected": "선택한 항목 ({count})", "ExportScopeLoaded": "이 페이지에 불러온 항목 ({count})", - "ExportFileName": "파일 이름" + "ExportFileName": "파일 이름", + "ExportFormatWord": "Word (.docx)", + "ExportFormatMarkdown": "Markdown (.md)", + "ExportDocumentContent": "콘텐츠 내보내기", + "ImportDocumentContent": "콘텐츠 가져오기", + "ExportingDocumentContent": "문서 내보내는 중…", + "DocumentContentExported": "문서 내보내기 완료", + "DocumentContentExportFailed": "내보내기 실패", + "ImportingDocumentContent": "문서 가져오는 중", + "ConvertingDocumentContent": "문서 변환 중…", + "DocumentContentConverted": "문서 변환 완료", + "DocumentContentImportFailed": "가져오기 실패", + "ReviewDocumentContentChanges": "가져온 변경사항 검토", + "ApplyDocumentContentChanges": "적용" } } diff --git a/plugins/export-assets/lang/pl.json b/plugins/export-assets/lang/pl.json index 9db712cd53..572cf1878b 100644 --- a/plugins/export-assets/lang/pl.json +++ b/plugins/export-assets/lang/pl.json @@ -57,6 +57,19 @@ "ExportMarkdown": "Markdown", "ExportScopeSelected": "Wybrane ({count})", "ExportScopeLoaded": "Załadowane na tej stronie ({count})", - "ExportFileName": "Nazwa pliku" + "ExportFileName": "Nazwa pliku", + "ExportFormatWord": "Word (.docx)", + "ExportFormatMarkdown": "Markdown (.md)", + "ExportDocumentContent": "Eksportuj zawartość", + "ImportDocumentContent": "Importuj zawartość", + "ExportingDocumentContent": "Eksportowanie dokumentu…", + "DocumentContentExported": "Dokument wyeksportowany", + "DocumentContentExportFailed": "Eksport nie powiódł się", + "ImportingDocumentContent": "Importowanie dokumentu", + "ConvertingDocumentContent": "Konwertowanie dokumentu…", + "DocumentContentConverted": "Dokument przekonwertowany", + "DocumentContentImportFailed": "Import nie powiódł się", + "ReviewDocumentContentChanges": "Przejrzyj zaimportowane zmiany", + "ApplyDocumentContentChanges": "Zastosuj" } } diff --git a/plugins/export-assets/lang/pt-br.json b/plugins/export-assets/lang/pt-br.json index 7655ab653f..663152258a 100644 --- a/plugins/export-assets/lang/pt-br.json +++ b/plugins/export-assets/lang/pt-br.json @@ -60,6 +60,19 @@ "ExportMarkdown": "Markdown", "ExportScopeSelected": "Selecionados ({count})", "ExportScopeLoaded": "Carregados nesta página ({count})", - "ExportFileName": "Nome do arquivo" + "ExportFileName": "Nome do arquivo", + "ExportFormatWord": "Word (.docx)", + "ExportFormatMarkdown": "Markdown (.md)", + "ExportDocumentContent": "Exportar conteúdo", + "ImportDocumentContent": "Importar conteúdo", + "ExportingDocumentContent": "Exportando o documento…", + "DocumentContentExported": "Documento exportado", + "DocumentContentExportFailed": "Falha na exportação", + "ImportingDocumentContent": "Importando o documento", + "ConvertingDocumentContent": "Convertendo o documento…", + "DocumentContentConverted": "Documento convertido", + "DocumentContentImportFailed": "Falha na importação", + "ReviewDocumentContentChanges": "Revisar as alterações importadas", + "ApplyDocumentContentChanges": "Aplicar" } } diff --git a/plugins/export-assets/lang/pt.json b/plugins/export-assets/lang/pt.json index 2d275dab00..4f925e7a35 100644 --- a/plugins/export-assets/lang/pt.json +++ b/plugins/export-assets/lang/pt.json @@ -59,6 +59,19 @@ "ExportMarkdown": "Markdown", "ExportScopeSelected": "Selecionados ({count})", "ExportScopeLoaded": "Carregados nesta página ({count})", - "ExportFileName": "Nome do ficheiro" + "ExportFileName": "Nome do ficheiro", + "ExportFormatWord": "Word (.docx)", + "ExportFormatMarkdown": "Markdown (.md)", + "ExportDocumentContent": "Exportar conteúdo", + "ImportDocumentContent": "Importar conteúdo", + "ExportingDocumentContent": "A exportar o documento…", + "DocumentContentExported": "Documento exportado", + "DocumentContentExportFailed": "Falha na exportação", + "ImportingDocumentContent": "A importar o documento", + "ConvertingDocumentContent": "A converter o documento…", + "DocumentContentConverted": "Documento convertido", + "DocumentContentImportFailed": "Falha na importação", + "ReviewDocumentContentChanges": "Rever as alterações importadas", + "ApplyDocumentContentChanges": "Aplicar" } } diff --git a/plugins/export-assets/lang/ru.json b/plugins/export-assets/lang/ru.json index 4b1c3c7813..50fee0247a 100644 --- a/plugins/export-assets/lang/ru.json +++ b/plugins/export-assets/lang/ru.json @@ -59,6 +59,20 @@ "ExportMarkdown": "Markdown", "ExportScopeSelected": "Выделенные ({count})", "ExportScopeLoaded": "Загруженные на странице ({count})", - "ExportFileName": "Имя файла" + "ExportFileName": "Имя файла", + + "ExportFormatWord": "Word (.docx)", + "ExportFormatMarkdown": "Markdown (.md)", + "ExportDocumentContent": "Экспорт содержимого", + "ImportDocumentContent": "Импорт содержимого", + "ExportingDocumentContent": "Экспорт документа…", + "DocumentContentExported": "Документ экспортирован", + "DocumentContentExportFailed": "Ошибка экспорта", + "ImportingDocumentContent": "Импорт документа", + "ConvertingDocumentContent": "Конвертация документа…", + "DocumentContentConverted": "Документ сконвертирован", + "DocumentContentImportFailed": "Ошибка импорта", + "ReviewDocumentContentChanges": "Просмотрите импортированные изменения", + "ApplyDocumentContentChanges": "Применить" } } diff --git a/plugins/export-assets/lang/tr.json b/plugins/export-assets/lang/tr.json index c5fa556e50..86c32fdbd3 100644 --- a/plugins/export-assets/lang/tr.json +++ b/plugins/export-assets/lang/tr.json @@ -59,6 +59,19 @@ "ExportMarkdown": "Markdown", "ExportScopeSelected": "Seçili ({count})", "ExportScopeLoaded": "Bu sayfada yüklü ({count})", - "ExportFileName": "Dosya adı" + "ExportFileName": "Dosya adı", + "ExportFormatWord": "Word (.docx)", + "ExportFormatMarkdown": "Markdown (.md)", + "ExportDocumentContent": "İçeriği dışa aktar", + "ImportDocumentContent": "İçeriği içe aktar", + "ExportingDocumentContent": "Belge dışa aktarılıyor…", + "DocumentContentExported": "Belge dışa aktarıldı", + "DocumentContentExportFailed": "Dışa aktarma başarısız", + "ImportingDocumentContent": "Belge içe aktarılıyor", + "ConvertingDocumentContent": "Belge dönüştürülüyor…", + "DocumentContentConverted": "Belge dönüştürüldü", + "DocumentContentImportFailed": "İçe aktarma başarısız", + "ReviewDocumentContentChanges": "İçe aktarılan değişiklikleri gözden geçir", + "ApplyDocumentContentChanges": "Uygula" } } diff --git a/plugins/export-assets/lang/zh.json b/plugins/export-assets/lang/zh.json index 96794e765b..8558d98af9 100644 --- a/plugins/export-assets/lang/zh.json +++ b/plugins/export-assets/lang/zh.json @@ -59,6 +59,19 @@ "ExportMarkdown": "Markdown", "ExportScopeSelected": "已选 ({count})", "ExportScopeLoaded": "本页已加载 ({count})", - "ExportFileName": "文件名" + "ExportFileName": "文件名", + "ExportFormatWord": "Word (.docx)", + "ExportFormatMarkdown": "Markdown (.md)", + "ExportDocumentContent": "导出内容", + "ImportDocumentContent": "导入内容", + "ExportingDocumentContent": "正在导出文档…", + "DocumentContentExported": "文档已导出", + "DocumentContentExportFailed": "导出失败", + "ImportingDocumentContent": "正在导入文档", + "ConvertingDocumentContent": "正在转换文档…", + "DocumentContentConverted": "文档已转换", + "DocumentContentImportFailed": "导入失败", + "ReviewDocumentContentChanges": "查看导入的更改", + "ApplyDocumentContentChanges": "应用" } } diff --git a/plugins/export-resources/package.json b/plugins/export-resources/package.json index 56bca0ad9e..499df9f320 100644 --- a/plugins/export-resources/package.json +++ b/plugins/export-resources/package.json @@ -49,6 +49,10 @@ "@hcengineering/theme": "workspace:^0.7.0", "@hcengineering/view": "workspace:^0.7.0", "@hcengineering/view-resources": "workspace:^0.7.0", - "@hcengineering/converter": "workspace:^0.7.0" + "@hcengineering/converter": "workspace:^0.7.0", + "@hcengineering/attachment": "workspace:^0.7.0", + "@hcengineering/collaborator-client": "workspace:^0.7.18", + "@hcengineering/text": "workspace:^0.7.19", + "@hcengineering/text-editor-resources": "workspace:^0.7.0" } } diff --git a/plugins/export-resources/src/document/actions.ts b/plugins/export-resources/src/document/actions.ts new file mode 100644 index 0000000000..7fc301ca5e --- /dev/null +++ b/plugins/export-resources/src/document/actions.ts @@ -0,0 +1,172 @@ +// +// Copyright © 2026 TraceX SAS. +// +// Licensed under the PolyForm Shield License 1.0.0 (the "License"); +// you may not use this file except in compliance with the License. You may +// obtain a copy of the License at https://polyformproject.org/licenses/shield/1.0.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// + +// Shared export/import of a Doc's collaborative "content" field (round-tripping through +// Word/Markdown via the pod-export service). Originally written for controlled documents, +// generalized so it can be reused for any class whose content is a collaborative markup +// field named `content` (e.g. Card) — see server-side `exportDocumentHandler` in +// services/export/pod-export, which resolves the field generically by that name. + +import attachment from '@hcengineering/attachment' +import { getClient as getCollaboratorClient } from '@hcengineering/collaborator-client' +import { type Doc, makeDocCollabId } from '@hcengineering/core' +import exportPlugin from '@hcengineering/export' +import { getMetadata, getResource, setPlatformStatus, translate, unknownError } from '@hcengineering/platform' +import presentation from '@hcengineering/presentation' +import { jsonToMarkup, type MarkupNode } from '@hcengineering/text' +import { showPopup, withProgress } from '@hcengineering/ui' +import { getCurrentLanguage } from '@hcengineering/theme' + +import { downloadBlob, fileNameFromResponse } from '../download' +import DocumentImportDiffPopup from './components/DocumentImportDiffPopup.svelte' + +function getExportBaseUrl (): string { + const url = getMetadata(exportPlugin.metadata.ExportUrl) + if (url === undefined || url === '') { + throw new Error('Export service URL (export.metadata.ExportUrl) is not configured') + } + return url +} + +function getToken (): string { + return getMetadata(presentation.metadata.Token) ?? '' +} + +function authHeaders (): Record { + return { + Authorization: `Bearer ${getToken()}`, + 'Content-Type': 'application/json' + } +} + +async function readErrorMessage (response: Response): Promise { + const body = await response.json().catch((): undefined => undefined) + return typeof body?.message === 'string' && body.message.length > 0 ? body.message : undefined +} + +/** Any object with a collaborative `content` blob field, addressable as a doc (Card, ControlledDocument, ...). */ +export type DocumentContentTarget = Pick & { title?: string } + +/** Export a doc's `content` field in the given format ('docx' | 'md') and download it. */ +export async function exportDocumentContent (doc: DocumentContentTarget, format: string): Promise { + const lang = getCurrentLanguage() + try { + // The conversion can take a while with no incremental progress, so a shared + // long-running-task toast shows a spinner until it settles and surfaces failures + // (e.g. content the exporter can't convert) instead of silently doing nothing. + await withProgress( + { + title: await translate(exportPlugin.string.ExportingDocumentContent, {}, lang), + done: await translate(exportPlugin.string.DocumentContentExported, {}, lang), + failed: await translate(exportPlugin.string.DocumentContentExportFailed, {}, lang) + }, + async () => { + const response = await fetch(`${getExportBaseUrl()}/document-export`, { + method: 'POST', + headers: authHeaders(), + body: JSON.stringify({ _class: doc._class, _id: doc._id, format }) + }) + if (!response.ok) { + const message = await readErrorMessage(response) + throw new Error(message ?? `Failed to export document (${response.status})`) + } + + const blob = await response.blob() + const filename = fileNameFromResponse(response, `${doc.title ?? 'document'}.${format}`) + downloadBlob(blob, filename) + } + ) + } catch { + // The progress toast already surfaced the failure. + } +} + +/** Import an edited doc's `content` field ('docx' | 'md'): convert, preview the diff, apply. */ +export async function importDocumentContent (doc: DocumentContentTarget, format: string): Promise { + const accept = format === 'md' ? '.md,.markdown' : '.docx' + const file = await pickFile(accept) + if (file === undefined) { + return + } + + const lang = getCurrentLanguage() + let converted: { current: MarkupNode, candidate: MarkupNode } + try { + converted = await withProgress( + { + title: await translate(exportPlugin.string.ImportingDocumentContent, {}, lang), + message: await translate(exportPlugin.string.ConvertingDocumentContent, {}, lang), + done: await translate(exportPlugin.string.DocumentContentConverted, {}, lang), + failed: await translate(exportPlugin.string.DocumentContentImportFailed, {}, lang) + }, + async () => { + const uploadFile = await getResource(attachment.helper.UploadFile) + const { uuid } = await uploadFile(file) + + const diffResponse = await fetch(`${getExportBaseUrl()}/document-import`, { + method: 'POST', + headers: authHeaders(), + body: JSON.stringify({ blobId: uuid, _class: doc._class, _id: doc._id, format }) + }) + if (!diffResponse.ok) { + const message = await readErrorMessage(diffResponse) + throw new Error(message ?? 'Failed to convert document') + } + return (await diffResponse.json()) as { current: MarkupNode, candidate: MarkupNode } + } + ) + } catch { + // The progress toast already surfaced the failure. + return + } + + showPopup( + DocumentImportDiffPopup, + { current: converted.current, candidate: converted.candidate }, + undefined, + (apply) => { + if (apply === true) { + void applyImportedDocumentContent(doc, converted.candidate).catch((err) => { + void setPlatformStatus(unknownError(err)) + }) + } + } + ) +} + +async function applyImportedDocumentContent (doc: DocumentContentTarget, markup: MarkupNode): Promise { + // The write goes through the collaborator (updateMarkup), NOT a raw content-blob write: + // the editor and collaborator serve the live Y.Doc, and a document that has ever been + // opened has a Y.Doc blob that takes precedence over the JSON content blob. Only + // updateMarkup updates that live Y.Doc, so the change actually becomes visible. + const token = getMetadata(presentation.metadata.Token) ?? '' + const collaboratorUrl = getMetadata(presentation.metadata.CollaboratorUrl) ?? '' + const workspace = getMetadata(presentation.metadata.WorkspaceUuid) + if (workspace === undefined || collaboratorUrl === '') { + throw new Error('Collaborator service is not configured') + } + + const collaborator = getCollaboratorClient(workspace, token, collaboratorUrl) + await collaborator.updateMarkup(makeDocCollabId(doc as unknown as Doc, 'content'), jsonToMarkup(markup)) +} + +async function pickFile (accept: string): Promise { + return await new Promise((resolve) => { + const input = document.createElement('input') + input.type = 'file' + input.accept = accept + input.onchange = () => { + resolve(input.files?.[0]) + } + input.click() + }) +} diff --git a/plugins/export-resources/src/document/components/DocumentExportFormatPopup.svelte b/plugins/export-resources/src/document/components/DocumentExportFormatPopup.svelte new file mode 100644 index 0000000000..0106dec5f9 --- /dev/null +++ b/plugins/export-resources/src/document/components/DocumentExportFormatPopup.svelte @@ -0,0 +1,47 @@ + + + +{#await getFormats() then formats} + { + const format = evt.detail + if (typeof format === 'string' && doc !== undefined) { + void exportDocumentContent(doc, format) + } + dispatch('close') + }} + /> +{/await} diff --git a/plugins/controlled-documents-resources/src/components/document/ImportDocxPopup.svelte b/plugins/export-resources/src/document/components/DocumentImportDiffPopup.svelte similarity index 78% rename from plugins/controlled-documents-resources/src/components/document/ImportDocxPopup.svelte rename to plugins/export-resources/src/document/components/DocumentImportDiffPopup.svelte index e518e34c94..355bc9148b 100644 --- a/plugins/controlled-documents-resources/src/components/document/ImportDocxPopup.svelte +++ b/plugins/export-resources/src/document/components/DocumentImportDiffPopup.svelte @@ -11,10 +11,10 @@ -->
-
+
diff --git a/plugins/export-resources/src/document/components/DocumentImportFormatPopup.svelte b/plugins/export-resources/src/document/components/DocumentImportFormatPopup.svelte new file mode 100644 index 0000000000..1201aa269b --- /dev/null +++ b/plugins/export-resources/src/document/components/DocumentImportFormatPopup.svelte @@ -0,0 +1,47 @@ + + + +{#await getFormats() then formats} + { + const format = evt.detail + if (typeof format === 'string' && doc !== undefined) { + void importDocumentContent(doc, format) + } + dispatch('close') + }} + /> +{/await} diff --git a/plugins/export-resources/src/download.ts b/plugins/export-resources/src/download.ts index ce060c5264..3891a1d7cc 100644 --- a/plugins/export-resources/src/download.ts +++ b/plugins/export-resources/src/download.ts @@ -25,10 +25,14 @@ export function downloadBlob (blob: Blob, fileName: string): void { anchor.style.display = 'none' anchor.href = url anchor.download = fileName + // Attach the anchor to the DOM before click() (detached anchors are ignored by some + // browsers) and defer the revoke — revoking synchronously drops the blob mid-read. document.body.appendChild(anchor) anchor.click() - window.URL.revokeObjectURL(url) - document.body.removeChild(anchor) + setTimeout(() => { + document.body.removeChild(anchor) + window.URL.revokeObjectURL(url) + }, 10000) } /** diff --git a/plugins/export-resources/src/index.ts b/plugins/export-resources/src/index.ts index a772c3d902..a71dfbdbbd 100644 --- a/plugins/export-resources/src/index.ts +++ b/plugins/export-resources/src/index.ts @@ -24,6 +24,8 @@ import ExportToWorkspaceModal from './components/ExportToWorkspaceModal.svelte' import ExportResultPanel from './components/ExportResultPanel.svelte' import ExportTableDialog from './components/ExportTableDialog.svelte' import { exportTableAction } from './actionImpl' +import DocumentExportFormatPopup from './document/components/DocumentExportFormatPopup.svelte' +import DocumentImportFormatPopup from './document/components/DocumentImportFormatPopup.svelte' export { default as ExportButton } from './components/ExportButton.svelte' export { default as ExportSettings } from './components/ExportSettings.svelte' @@ -34,6 +36,10 @@ export { exportTableAction } from './actionImpl' export { downloadBlob, fileNameFromResponse } from './download' export { buildTable, exportTable, type TableExportFormat, type TableExportScope } from './tableExport' export * from './serializers' +export { default as DocumentExportFormatPopup } from './document/components/DocumentExportFormatPopup.svelte' +export { default as DocumentImportFormatPopup } from './document/components/DocumentImportFormatPopup.svelte' +export { default as DocumentImportDiffPopup } from './document/components/DocumentImportDiffPopup.svelte' +export { exportDocumentContent, importDocumentContent, type DocumentContentTarget } from './document/actions' export async function getExportResultTitle (_client: Client, _ref: Ref, doc?: Doc): Promise { const record = doc as ExportResultRecord | undefined @@ -62,7 +68,9 @@ export default async (): Promise => ({ ExportSettings, ExportToWorkspaceModal, ExportResultPanel, - ExportTableDialog + ExportTableDialog, + DocumentExportFormatPopup, + DocumentImportFormatPopup }, function: { ExportResultTitleProvider: getExportResultTitle diff --git a/plugins/export/src/plugin.ts b/plugins/export/src/plugin.ts index 9cf314e67c..1d181a4c84 100644 --- a/plugins/export/src/plugin.ts +++ b/plugins/export/src/plugin.ts @@ -45,14 +45,31 @@ export const exportPlugin = plugin(exportId, { ExportedDocumentClass: '' as IntlString, Import: '' as IntlString, ImportedDocuments: '' as IntlString, - ExportResultRecordTitle: '' as IntlString + ExportResultRecordTitle: '' as IntlString, + + // Shared markup->docx/md content export & import (used by controlled documents, cards, ...). + ExportFormatWord: '' as IntlString, + ExportFormatMarkdown: '' as IntlString, + ExportDocumentContent: '' as IntlString, + ImportDocumentContent: '' as IntlString, + ExportingDocumentContent: '' as IntlString, + DocumentContentExported: '' as IntlString, + DocumentContentExportFailed: '' as IntlString, + ImportingDocumentContent: '' as IntlString, + ConvertingDocumentContent: '' as IntlString, + DocumentContentConverted: '' as IntlString, + DocumentContentImportFailed: '' as IntlString, + ReviewDocumentContentChanges: '' as IntlString, + ApplyDocumentContentChanges: '' as IntlString }, component: { ExportButton: '' as AnyComponent, ExportSettings: '' as AnyComponent, ExportToWorkspaceModal: '' as AnyComponent, ExportResultPanel: '' as AnyComponent, - ExportTableDialog: '' as AnyComponent + ExportTableDialog: '' as AnyComponent, + DocumentExportFormatPopup: '' as AnyComponent, + DocumentImportFormatPopup: '' as AnyComponent }, actionImpl: { ExportTable: '' as ViewAction> diff --git a/services/github/pod-github/src/markdown/__tests__/textmodel.test.ts b/services/github/pod-github/src/markdown/__tests__/textmodel.test.ts index 5f87b733c3..fc2597a2c0 100644 --- a/services/github/pod-github/src/markdown/__tests__/textmodel.test.ts +++ b/services/github/pod-github/src/markdown/__tests__/textmodel.test.ts @@ -844,7 +844,7 @@ A list of closed updated issues` expect(msg).toEqual('* test1 \\\n *Italic*\n* test2 **BOLD**') }) - it('check serialize throw unsupported', () => { + it('check serialize skips unsupported node types', () => { const node: MarkupNode = { content: [ { @@ -869,9 +869,10 @@ A list of closed updated issues` ], type: MarkupNodeType.doc } - expect(() => serializeMessage(node, 'ref://', 'http://')).toThrowError( - 'Token type `textqwe` not supported by Markdown renderer' - ) + // Unknown node types no longer abort the whole export (see "Fix MD export"), + // they are dropped and rendering continues with the rest of the document. + expect(() => serializeMessage(node, 'ref://', 'http://')).not.toThrow() + expect(serializeMessage(node, 'ref://', 'http://')).toEqual('* test1 ') }) it('check markdown state', () => {