From 1fcd6f392ad9a66ba13cef592df18da579c5ac95 Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 18 Nov 2024 09:43:46 +0100 Subject: [PATCH 1/6] Sort roles in role dropdown according to backend (#11916) * Sort roles in role dropdown according to backend * Add changelog item --- .../unreleased/bugfix-fix-order-in-roles-drop-down | 7 +++++++ .../SideBar/Shares/Collaborators/RoleDropdown.vue | 10 ++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 changelog/unreleased/bugfix-fix-order-in-roles-drop-down diff --git a/changelog/unreleased/bugfix-fix-order-in-roles-drop-down b/changelog/unreleased/bugfix-fix-order-in-roles-drop-down new file mode 100644 index 00000000000..cfd22976ad3 --- /dev/null +++ b/changelog/unreleased/bugfix-fix-order-in-roles-drop-down @@ -0,0 +1,7 @@ +Bugfix: Fix order in roles drop down + +We've fixed an issue where the order of roles in the roles drop down was not correct. +Now the roles are sorted as delegated by the backend. + +https://github.com/owncloud/web/pull/11916 +https://github.com/owncloud/web/issues/11915 \ No newline at end of file diff --git a/packages/web-app-files/src/components/SideBar/Shares/Collaborators/RoleDropdown.vue b/packages/web-app-files/src/components/SideBar/Shares/Collaborators/RoleDropdown.vue index 5dc51434101..a01e6645512 100644 --- a/packages/web-app-files/src/components/SideBar/Shares/Collaborators/RoleDropdown.vue +++ b/packages/web-app-files/src/components/SideBar/Shares/Collaborators/RoleDropdown.vue @@ -144,10 +144,14 @@ export default defineComponent({ const availableInternalRoles = inject>('availableInternalShareRoles') const availableExternalRoles = inject>('availableExternalShareRoles') const availableRoles = computed(() => { + let roles = availableInternalRoles if (props.isExternal) { - return unref(availableExternalRoles) + roles = availableExternalRoles } - return unref(availableInternalRoles) + + return [...unref(roles)].sort( + (role1, role2) => role1['@libre.graph.weight'] - role2['@libre.graph.weight'] + ) }) let initialSelectedRole: ShareRole @@ -295,6 +299,7 @@ export default defineComponent({ &:first-child { margin-top: 0; } + &:last-child { margin-bottom: 0; } @@ -312,6 +317,7 @@ export default defineComponent({ } } } + &-role-select-btn { max-width: 100%; } From 54c72d043a453ce27316ed896374d05b46a6c66c Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 18 Nov 2024 11:56:26 +0100 Subject: [PATCH 2/6] Sort roles in role dropdown according to backend (#11922) * Sort roles in role dropdown according to backend * Enhance chanelog item * fix: external role sorting --------- Co-authored-by: Jannik Stehle --- .../bugfix-fix-order-in-roles-drop-down | 1 + .../Shares/Collaborators/RoleDropdown.vue | 17 +++++++++++++---- .../src/components/SideBar/FileSideBar.vue | 14 ++++++++++++-- 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/changelog/unreleased/bugfix-fix-order-in-roles-drop-down b/changelog/unreleased/bugfix-fix-order-in-roles-drop-down index cfd22976ad3..5f19c58a452 100644 --- a/changelog/unreleased/bugfix-fix-order-in-roles-drop-down +++ b/changelog/unreleased/bugfix-fix-order-in-roles-drop-down @@ -4,4 +4,5 @@ We've fixed an issue where the order of roles in the roles drop down was not cor Now the roles are sorted as delegated by the backend. https://github.com/owncloud/web/pull/11916 +https://github.com/owncloud/web/pull/11922 https://github.com/owncloud/web/issues/11915 \ No newline at end of file diff --git a/packages/web-app-files/src/components/SideBar/Shares/Collaborators/RoleDropdown.vue b/packages/web-app-files/src/components/SideBar/Shares/Collaborators/RoleDropdown.vue index a01e6645512..7d632c7243a 100644 --- a/packages/web-app-files/src/components/SideBar/Shares/Collaborators/RoleDropdown.vue +++ b/packages/web-app-files/src/components/SideBar/Shares/Collaborators/RoleDropdown.vue @@ -81,7 +81,8 @@ import { computed, ref, unref, - Ref + Ref, + watch } from 'vue' import { useAbility, useUserStore } from '@ownclouders/web-pkg' import { Resource } from '@ownclouders/web-client' @@ -149,9 +150,7 @@ export default defineComponent({ roles = availableExternalRoles } - return [...unref(roles)].sort( - (role1, role2) => role1['@libre.graph.weight'] - role2['@libre.graph.weight'] - ) + return unref(roles) }) let initialSelectedRole: ShareRole @@ -187,6 +186,16 @@ export default defineComponent({ emit('optionChange', unref(selectedRole)) } + watch( + () => props.isExternal, + () => { + if (!unref(hasExistingShareRole)) { + // when no role exists and the external flag changes, we need to reset the selected role + selectedRole.value = unref(availableRoles)[0] + } + } + ) + return { ability, user, diff --git a/packages/web-pkg/src/components/SideBar/FileSideBar.vue b/packages/web-pkg/src/components/SideBar/FileSideBar.vue index 60badec2e55..8984219e9e1 100644 --- a/packages/web-pkg/src/components/SideBar/FileSideBar.vue +++ b/packages/web-pkg/src/components/SideBar/FileSideBar.vue @@ -225,7 +225,12 @@ export default defineComponent({ const rolesArray = Object.values(sharesStore.graphRoles) availableInternalShareRoles.value = - rolesArray.filter((r) => allowedRoles?.map(({ id }) => id).includes(r.id)) || [] + allowedRoles?.map((r) => { + return { + ...r, + icon: rolesArray.find((role) => role.id === r.id)?.icon + } + }) || [] // load external share roles if (appsStore.isAppEnabled('open-cloud-mesh')) { @@ -243,7 +248,12 @@ export default defineComponent({ ) availableExternalShareRoles.value = - rolesArray.filter((r) => allowedRoles?.map(({ id }) => id).includes(r.id)) || [] + allowedRoles?.map((r) => { + return { + ...r, + icon: rolesArray.find((role) => role.id === r.id)?.icon + } + }) || [] } // use cache for indirect shares From 2a66c466a1630bdd436ac0706857b2973030691f Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 18 Nov 2024 14:51:52 +0100 Subject: [PATCH 3/6] fix: handle create from template via different editors (#11923) * fix: handle create from template via different editors * Add changelog item --- ...low-create-template-with-different-editors | 6 +++++ .../src/extensions/createFromTemplate.ts | 27 ++++++++++--------- packages/web-app-external/src/index.ts | 2 +- 3 files changed, 22 insertions(+), 13 deletions(-) create mode 100644 changelog/unreleased/bugfix-allow-create-template-with-different-editors diff --git a/changelog/unreleased/bugfix-allow-create-template-with-different-editors b/changelog/unreleased/bugfix-allow-create-template-with-different-editors new file mode 100644 index 00000000000..bed4637109f --- /dev/null +++ b/changelog/unreleased/bugfix-allow-create-template-with-different-editors @@ -0,0 +1,6 @@ +Bugfix: Allow create template with different editors + +We've fixed a bug where it was not possible to create a template with different editors. + +https://github.com/owncloud/web/pull/11923 +https://github.com/owncloud/web/issues/11873 \ No newline at end of file diff --git a/packages/web-app-external/src/extensions/createFromTemplate.ts b/packages/web-app-external/src/extensions/createFromTemplate.ts index 4726c217323..ce8c6ddc2d6 100644 --- a/packages/web-app-external/src/extensions/createFromTemplate.ts +++ b/packages/web-app-external/src/extensions/createFromTemplate.ts @@ -1,5 +1,6 @@ import { ActionExtension, + ApplicationInformation, contextRouteNameKey, contextRouteParamsKey, contextRouteQueryKey, @@ -19,7 +20,9 @@ import { extractNameWithoutExtension, Resource } from '@ownclouders/web-client' import { useCreateFileHandler } from '../composables' import { useGettext } from 'vue3-gettext' -export const useActionExtensionCreateFromTemplate = (): ActionExtension => { +export const useActionExtensionCreateFromTemplate = ( + appInfo: ApplicationInformation +): ActionExtension => { const appProviderService = useAppProviderService() const spacesStore = useSpacesStore() const clientService = useClientService() @@ -32,7 +35,7 @@ export const useActionExtensionCreateFromTemplate = (): ActionExtension => { const action: FileAction = { name: 'create-from-template', category: 'context', - label: () => $gettext('Create from template'), + label: () => $gettext('Create from template via %{ name }', { name: appInfo.name }), icon: 'swap-box', hasPriority: true, isVisible: ({ resources }) => { @@ -52,7 +55,11 @@ export const useActionExtensionCreateFromTemplate = (): ActionExtension => { } return appProviderService.templateMimeTypes.some( - (mimeType) => mimeType.mime_type === template.mimeType + (mimeType) => + mimeType.mime_type === template.mimeType && + mimeType.app_providers.some( + (appProvider) => appProvider.name == appInfo.name && !!appProvider.target_ext + ) ) }, handler: async ({ resources }) => { @@ -63,25 +70,21 @@ export const useActionExtensionCreateFromTemplate = (): ActionExtension => { const templateMimeType = appProviderService.templateMimeTypes.find( (mimeType) => mimeType.mime_type === template.mimeType ) - const firstApp = templateMimeType.app_providers.find( - (appProvider) => !!appProvider.target_ext + const app = templateMimeType.app_providers.find( + (appProvider) => !!appProvider.target_ext && appProvider.name === appInfo.name ) let fileName = extractNameWithoutExtension({ name: template.name, extension: template.extension - } as Resource) + `.${firstApp.target_ext}` + } as Resource) + `.${app.target_ext}` try { const { resource: personalSpaceRoot, children: existingResources } = await existingResourcesPromise if (existingResources.some((f) => f.name === fileName)) { - fileName = resolveFileNameDuplicate( - fileName, - firstApp.target_ext, - unref(existingResources) - ) + fileName = resolveFileNameDuplicate(fileName, app.target_ext, unref(existingResources)) } const createdFile = await createFileHandler({ @@ -90,7 +93,7 @@ export const useActionExtensionCreateFromTemplate = (): ActionExtension => { currentFolder: personalSpaceRoot }) - const routeName = `external-${firstApp.name.toLowerCase()}-apps` + const routeName = `external-${app.name.toLowerCase()}-apps` const routeOptions = getEditorRouteOpts( routeName, spacesStore.personalSpace, diff --git a/packages/web-app-external/src/index.ts b/packages/web-app-external/src/index.ts index 68ce8c84c75..1b04465967b 100644 --- a/packages/web-app-external/src/index.ts +++ b/packages/web-app-external/src/index.ts @@ -86,7 +86,7 @@ export default defineWebApplication({ } ] - const actionCreateFromTemplate = useActionExtensionCreateFromTemplate() + const actionCreateFromTemplate = useActionExtensionCreateFromTemplate(appInfo) const extensions = computed(() => { return [actionCreateFromTemplate] }) From 6b98e93d3db0ebe0b20f83c659de442eb2be7e8f Mon Sep 17 00:00:00 2001 From: Jannik Stehle <50302941+JammingBen@users.noreply.github.com> Date: Mon, 18 Nov 2024 16:07:40 +0100 Subject: [PATCH 4/6] fix: show extension actions in right sidebar actions panel (#11924) --- .../bugfix-extension-actions-right-sidebar | 6 ++++++ .../actions/files/useFileActions.ts | 18 +++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 changelog/unreleased/bugfix-extension-actions-right-sidebar diff --git a/changelog/unreleased/bugfix-extension-actions-right-sidebar b/changelog/unreleased/bugfix-extension-actions-right-sidebar new file mode 100644 index 00000000000..95b9ba5584f --- /dev/null +++ b/changelog/unreleased/bugfix-extension-actions-right-sidebar @@ -0,0 +1,6 @@ +Bugfix: Extension actions in right sidebar + +Extension actions (e.g. "Extract here") are now correctly showing in the actions panel of the right sidebar. + +https://github.com/owncloud/web/pull/11924 +https://github.com/owncloud/web/issues/11898 diff --git a/packages/web-pkg/src/composables/actions/files/useFileActions.ts b/packages/web-pkg/src/composables/actions/files/useFileActions.ts index 8752758e66d..a79a5b4cb2b 100644 --- a/packages/web-pkg/src/composables/actions/files/useFileActions.ts +++ b/packages/web-pkg/src/composables/actions/files/useFileActions.ts @@ -1,4 +1,5 @@ import kebabCase from 'lodash-es/kebabCase' +import isNil from 'lodash-es/isNil' import { isShareSpaceResource } from '@ownclouders/web-client' import { routeToContextQuery } from '../../appDefaults' import { isLocationTrashActive } from '../../../router' @@ -98,6 +99,13 @@ export const useFileActions = () => { return contextActionExtensions.map((extension) => extension.action) }) + const extensionActions = computed(() => { + return requestExtensions({ + id: 'global.files.context-actions', + extensionType: 'action' + }).map((e) => e.action) + }) + const editorActions = computed(() => { if (unref(isEmbedModeEnabled)) { return [] @@ -260,7 +268,15 @@ export const useFileActions = () => { ? [] : unref(systemActions).filter(filterCallback) - return [...primaryActions, ...secondaryActions] + return [ + ...primaryActions, + ...secondaryActions, + ...unref(extensionActions).filter( + (a) => + a.isVisible(options as FileActionOptions) && + (a.category === 'actions' || isNil(a.category)) + ) + ] } return { From 780875a9c95af20271897bec55282510205f89aa Mon Sep 17 00:00:00 2001 From: Jannik Stehle Date: Tue, 19 Nov 2024 08:59:28 +0100 Subject: [PATCH 5/6] fix: unique request ids for upload- and worker-requests --- .../unreleased/bugfix-unique-request-ids | 6 +++ .../src/composables/upload/useUpload.ts | 40 ++++++++++++++----- .../deleteWorker/useDeleteWorker.ts | 5 ++- .../webWorkers/pasteWorker/usePasteWorker.ts | 5 ++- .../restoreWorker/useRestoreWorker.ts | 5 ++- 5 files changed, 49 insertions(+), 12 deletions(-) create mode 100644 changelog/unreleased/bugfix-unique-request-ids diff --git a/changelog/unreleased/bugfix-unique-request-ids b/changelog/unreleased/bugfix-unique-request-ids new file mode 100644 index 00000000000..d64ef732144 --- /dev/null +++ b/changelog/unreleased/bugfix-unique-request-ids @@ -0,0 +1,6 @@ +Bugfix: Unique request ids + +We've fixed an issue where the request ids for upload- and worker-requests were not unique. + +https://github.com/owncloud/web/pull/11929 +https://github.com/owncloud/web/issues/11925 diff --git a/packages/web-pkg/src/composables/upload/useUpload.ts b/packages/web-pkg/src/composables/upload/useUpload.ts index 3a2d773b97a..f9d69fcaf1f 100644 --- a/packages/web-pkg/src/composables/upload/useUpload.ts +++ b/packages/web-pkg/src/composables/upload/useUpload.ts @@ -1,10 +1,12 @@ import { computed, unref, watch } from 'vue' +import { v4 as uuidV4 } from 'uuid' import { UppyService } from '../../services/uppy/uppyService' -import { useCapabilityStore } from '../piniaStores' +import { useAuthStore, useCapabilityStore } from '../piniaStores' import { TusOptions } from '@uppy/tus' import { XHRUploadOptions } from '@uppy/xhr-upload' import { UppyFile } from '@uppy/core' -import { useRequestHeaders } from '../requestHeaders' +import { useClientService } from '../clientService' +import { useGettext } from 'vue3-gettext' interface UploadOptions { uppyService: UppyService @@ -12,18 +14,38 @@ interface UploadOptions { export function useUpload(options: UploadOptions) { const capabilityStore = useCapabilityStore() - const { headers } = useRequestHeaders() + const authStore = useAuthStore() + const clientService = useClientService() + const language = useGettext() const isTusSupported = computed(() => capabilityStore.tusMaxChunkSize > 0) + const getHeaders = () => { + const headers: Record = {} + + if (authStore.publicLinkPassword) { + headers['Authorization'] = + 'Basic ' + + Buffer.from(['public', authStore.publicLinkPassword].join(':')).toString('base64') + } else if (authStore.accessToken && !authStore.publicLinkPassword) { + headers['Authorization'] = 'Bearer ' + authStore.accessToken + } + + headers['X-Request-ID'] = uuidV4() + headers['Accept-Language'] = language.current + headers['Initiator-ID'] = clientService.initiatorId + return headers + } + const tusOptions = computed(() => { const options: TusOptions = { onBeforeRequest: (req, file) => new Promise((resolve) => { - req.setHeader('Authorization', unref(headers).Authorization) - req.setHeader('X-Request-ID', unref(headers)['X-Request-ID']) - req.setHeader('Accept-Language', unref(headers)['Accept-Language']) - req.setHeader('Initiator-ID', unref(headers)['Initiator-ID']) + const headers = getHeaders() + req.setHeader('Authorization', headers.Authorization) + req.setHeader('X-Request-ID', headers['X-Request-ID']) + req.setHeader('Accept-Language', headers['Accept-Language']) + req.setHeader('Initiator-ID', headers['Initiator-ID']) if (file?.isRemote) { req.setHeader('x-oc-mtime', (file?.data?.lastModified / 1000).toString()) } @@ -37,7 +59,7 @@ export function useUpload(options: UploadOptions) { // FIXME: remove if cloud upload still works without this ;(options as any)['headers'] = (file: UppyFile) => { if (!!file.xhrUpload || file?.isRemote) { - return { 'x-oc-mtime': file?.data?.lastModified / 1000, ...unref(headers) } + return { 'x-oc-mtime': file?.data?.lastModified / 1000, ...getHeaders() } } } @@ -50,7 +72,7 @@ export function useUpload(options: UploadOptions) { endpoint: '', headers: (file) => ({ 'x-oc-mtime': file?.data?.lastModified / 1000, - ...unref(headers) + ...getHeaders() }) } }) diff --git a/packages/web-pkg/src/composables/webWorkers/deleteWorker/useDeleteWorker.ts b/packages/web-pkg/src/composables/webWorkers/deleteWorker/useDeleteWorker.ts index 0d2bb9dd2e7..ccac9f32368 100644 --- a/packages/web-pkg/src/composables/webWorkers/deleteWorker/useDeleteWorker.ts +++ b/packages/web-pkg/src/composables/webWorkers/deleteWorker/useDeleteWorker.ts @@ -85,7 +85,10 @@ export const useDeleteWorker = ({ resources, concurrentRequests, baseUrl: configStore.serverUrl, - headers: unref(headers) + headers: { + ...unref(headers), + 'X-Request-ID': undefined // is being generated by the dav client in the worker + } } }) } diff --git a/packages/web-pkg/src/composables/webWorkers/pasteWorker/usePasteWorker.ts b/packages/web-pkg/src/composables/webWorkers/pasteWorker/usePasteWorker.ts index 96f6123f1bd..db7bb258190 100644 --- a/packages/web-pkg/src/composables/webWorkers/pasteWorker/usePasteWorker.ts +++ b/packages/web-pkg/src/composables/webWorkers/pasteWorker/usePasteWorker.ts @@ -66,7 +66,10 @@ export const usePasteWorker = () => { data: { transferData, baseUrl: configStore.serverUrl, - headers: unref(headers) + headers: { + ...unref(headers), + 'X-Request-ID': undefined // is being generated by the dav client in the worker + } } }) } diff --git a/packages/web-pkg/src/composables/webWorkers/restoreWorker/useRestoreWorker.ts b/packages/web-pkg/src/composables/webWorkers/restoreWorker/useRestoreWorker.ts index f879ad5638f..6e140af3be9 100644 --- a/packages/web-pkg/src/composables/webWorkers/restoreWorker/useRestoreWorker.ts +++ b/packages/web-pkg/src/composables/webWorkers/restoreWorker/useRestoreWorker.ts @@ -84,7 +84,10 @@ export const useRestoreWorker = () => { resources, missingFolderPaths, baseUrl: configStore.serverUrl, - headers: unref(headers) + headers: { + ...unref(headers), + 'X-Request-ID': undefined // is being generated by the dav client in the worker + } } }) } From 64415c917a27c9eafee54f3570563e9b9882166f Mon Sep 17 00:00:00 2001 From: Jannik Stehle Date: Tue, 19 Nov 2024 09:44:54 +0100 Subject: [PATCH 6/6] feat: pick translations for external app from master --- packages/web-app-external/l10n/translations.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/web-app-external/l10n/translations.json b/packages/web-app-external/l10n/translations.json index ad30b9e837d..a3c72f403c1 100644 --- a/packages/web-app-external/l10n/translations.json +++ b/packages/web-app-external/l10n/translations.json @@ -1 +1 @@ -{"af":{},"ar":{},"bs":{},"bg":{"\"%{appName}\" app content area":"Област на съдържанието на приложението \"%{appName}\".","An error occurred":"Възникна грешка","One moment please…":"Един момент, моля...","Open in %{app}":"Отваряне в %{app}","This file is currently being processed and is not yet available for use. Please try again shortly.":"Този файл в момента се обработва и все още не е на разположение за използване. Моля, опитайте отново след малко.","You are being redirected.":"Вие сте пренасочени."},"cs":{"\"%{appName}\" app content area":"Oblast obsahu aplikace \"%{appName}\"","An error occurred":"Objevila se chyba","This file is currently being processed and is not yet available for use. Please try again shortly.":"Tento soubor se právě zpracovává a zatím není k dispozici pro použití. Zkuste to za chvíli znovu."},"de":{"\"%{appName}\" app content area":"\"%{appName}\" Inhaltsbereich","An error occurred":"Ein Fehler ist aufgetreten.","Cannot open file in edit mode as it is read-only":"Datei kann nicht im Bearbeitungsmodus geöffnet werden, da sie schreibgeschützt ist.","Create from template":"Aus Vorlage erstellen","External":"Extern","Failed to create document from template":"Dokumenterstellung aus Vorlage fehlgeschlagen","One moment please…":"Einen Moment bitte ...","Open in %{app}":"In %{app} öffnen","Redirecting to external app":"Weiterleiten zu externer App","This file is currently being processed and is not yet available for use. Please try again shortly.":"Diese Datei wird derzeit bearbeitet und kann noch nicht verwendet werden. Bitte in Kürze erneut versuchen.","You are being redirected.":"Sie werden weitergeleitet."},"el":{},"es":{"\"%{appName}\" app content area":"\"%{appName}\" área de contenido de la aplicación","An error occurred":"Ocurrió un error","Cannot open file in edit mode as it is read-only":"No se puede abrir el archivo en modo edición porque es de solo lectura.","External":"Externo","One moment please…":"Espere un momento, por favor…","Open in %{app}":"Abrir en %{app}","Redirecting to external app":"Redireccionando a una aplicación externa","This file is currently being processed and is not yet available for use. Please try again shortly.":"Este archivo está siendo procesado y aún no está disponible para su uso. Vuelva a intentarlo más tarde.","You are being redirected.":"Está siendo redirigido."},"et":{},"fr":{"\"%{appName}\" app content area":"Zone de contenu de l'application \"%{appName}\"","An error occurred":"Une erreur est survenue","One moment please…":"Veuillez patienter …","Open in %{app}":"Ouvrir avec %{app}","You are being redirected.":"Vous allez être redirigé ..."},"gl":{},"he":{"\"%{appName}\" app content area":"אזור תוכן היישום „%{appName}”","An error occurred":"אירעה שגיאה","One moment please…":"רק רגע בבקשה…","Open in %{app}":"פתיחה ב־%{app}","This file is currently being processed and is not yet available for use. Please try again shortly.":"הקובץ הזה עובר עיבוד ועדיין אינו זמין לשימוש. נא לנסות שוב בעוד זמן קצר.","You are being redirected.":"מתבצעת הפניה."},"hr":{},"id":{},"it":{"\"%{appName}\" app content area":"Area del contenuto dell'app \"%{appName}\"","An error occurred":"Si è verificato un errore","One moment please…":"Ancora un momento...","This file is currently being processed and is not yet available for use. Please try again shortly.":"Questo file non è al momento disponibile perché viene processato. Si prega di riprovare più tardi.","You are being redirected.":"Reindirizzamento in corso."},"ja":{},"nl":{"\"%{appName}\" app content area":"\"%{appName}\"-app inhoudsgebied","An error occurred":"Er is een fout opgetreden","One moment please…":"Een ogenblik geduld alstublieft...","Open in %{app}":"Openen in %{app}","This file is currently being processed and is not yet available for use. Please try again shortly.":"Dit bestand wordt momenteel verwerkt en is nog niet beschikbaar voor gebruik. Probeer het binnenkort opnieuw.","You are being redirected.":"U wordt doorgestuurd."},"pl":{"\"%{appName}\" app content area":"Zawartość aplikacji \"%{appName}\"","An error occurred":"Wystąpił błąd","One moment please…":"Proszę czekać…","Open in %{app}":"Otwórz w %{app}","This file is currently being processed and is not yet available for use. Please try again shortly.":"Ten plik jest obecnie przetwarzany i nie jest jeszcze gotowy do użycia, Spróbuj ponownie za chwilę.","You are being redirected.":"Jesteś przekierowywany."},"pt":{},"ka":{},"ko":{"\"%{appName}\" app content area":"\"%{appName}\" 앱 내용 영역","An error occurred":"오류가 발생했습니다","Cannot open file in edit mode as it is read-only":"읽기 전용 파일이기에 편집할 수 없음","One moment please…":"잠시 기다려주세요...","Open in %{app}":"%{app}에서 열기","This file is currently being processed and is not yet available for use. Please try again shortly.":"이 파일은 현재 처리 중이며 아직 사용할 수 없습니다. 잠시 후 다시 시도하십시오.","You are being redirected.":"리디렉션되고 있습니다."},"ro":{},"ru":{"\"%{appName}\" app content area":"Область контента \"%{appName}\"","An error occurred":"Произошла ошибка","Cannot open file in edit mode as it is read-only":"Невозможно открыть файл в режиме редактирования, так как он доступен только для чтения","Create from template":"Создать из шаблона","External":"Внешние","Failed to create document from template":"Не удалось создать документ из шаблона","One moment please…":"Один момент, пожалуйста…","Open in %{app}":"Открыть в %{app}","Redirecting to external app":"Перенаправление внешнему приложению","This file is currently being processed and is not yet available for use. Please try again shortly.":"Этот файл находится в процессе обработки и пока недоступен для использования. Пожалуйста, повторите попытку в ближайшее время.","You are being redirected.":"Вы будете перенаправлены."},"si":{},"sk":{"\"%{appName}\" app content area":"Oblasť obsahu \"%{appName}\""},"sq":{"\"%{appName}\" app content area":"Zonë lënde aplikacioni “%{appName}”","An error occurred":"Ndodhi një gabim","Cannot open file in edit mode as it is read-only":"S’mund të hapet kartelë nën mënyrën përpunim, ngaqë është vetëm-lexim","Create from template":"Krijoje prej gjedheje","External":"I jashtëm","Failed to create document from template":"S’u arrit të krijohej dokument prej gjedheje","One moment please…":"Një sekondë, ju lutemi…","Open in %{app}":"Hape me %{app}","Redirecting to external app":"Po bëhet ridrejtim te aplikacion i jashtëm","This file is currently being processed and is not yet available for use. Please try again shortly.":"Kjo kartelë aktualisht po përpunohet dhe s’është ende gati për përdorim. Ju lutemi, riprovoni pas pak.","You are being redirected.":"Po bëhet ridrejtimi juaj."},"sv":{"\"%{appName}\" app content area":"\"%{appName}\" app innehållsyta","An error occurred":"Ett fel uppstod","Cannot open file in edit mode as it is read-only":"Kan inte öppna filen i redigeringsläge pågrund av att den är i läs-läge","This file is currently being processed and is not yet available for use. Please try again shortly.":"Den här filen används för tillfället och är inte tillgänglig. Försök igen senare."},"ta":{},"sr":{},"tr":{"\"%{appName}\" app content area":"\"%{appName}\" uygulama içerik alanı","An error occurred":"Bir hata oluştu","One moment please…":"Bir dakika lütfen...","Open in %{app}":"%{app}'da aç","This file is currently being processed and is not yet available for use. Please try again shortly.":"Bu dosya şu anda işleniyor ve henüz kullanıma uygun değil. Lütfen kısa süre sonra tekrar deneyin.","You are being redirected.":"Yönlendiriliyorsunuz."},"ug":{},"uk":{"\"%{appName}\" app content area":"Робоча область програми \"%{appName}\".","An error occurred":"Виникла помилка","Cannot open file in edit mode as it is read-only":"Неможливо відкрити файл у режимі редагування, оскільки він доступний лише для читання","External":"Зовнішній","One moment please…":"Будь ласка, хвилиночку…","Open in %{app}":"Відкрити в %{app}","This file is currently being processed and is not yet available for use. Please try again shortly.":"Цей файл зараз обробляється і ще не доступний для використання. Спробуйте ще раз незабаром.","You are being redirected.":"Вас буде перенаправлено."},"zh":{"\"%{appName}\" app content area":"\"%{appName}\" 应用内容区域","An error occurred":"发生错误","Cannot open file in edit mode as it is read-only":"无法以编辑模式打开文件,因为它是只读的","External":"外部","One moment please…":"请稍等...","Open in %{app}":"在 %{app} 中打开","Redirecting to external app":"重定向至外部应用程序","This file is currently being processed and is not yet available for use. Please try again shortly.":"该文件当前正在处理中,不可使用。 请稍后重试。","You are being redirected.":"正在重定向。"}} \ No newline at end of file +{"af":{},"ar":{},"bs":{},"cs":{"\"%{appName}\" app content area":"Oblast obsahu aplikace \"%{appName}\"","An error occurred":"Objevila se chyba","This file is currently being processed and is not yet available for use. Please try again shortly.":"Tento soubor se právě zpracovává a zatím není k dispozici pro použití. Zkuste to za chvíli znovu."},"bg":{"\"%{appName}\" app content area":"Област на съдържанието на приложението \"%{appName}\".","An error occurred":"Възникна грешка","One moment please…":"Един момент, моля...","Open in %{app}":"Отваряне в %{app}","This file is currently being processed and is not yet available for use. Please try again shortly.":"Този файл в момента се обработва и все още не е на разположение за използване. Моля, опитайте отново след малко.","You are being redirected.":"Вие сте пренасочени."},"el":{},"de":{"\"%{appName}\" app content area":"\"%{appName}\" Inhaltsbereich","An error occurred":"Ein Fehler ist aufgetreten.","Cannot open file in edit mode as it is read-only":"Datei kann nicht im Bearbeitungsmodus geöffnet werden, da sie schreibgeschützt ist.","Create from template via %{ name }":"Aus Vorlage erstellen via %{ name } ","External":"Extern","Failed to create document from template":"Dokumenterstellung aus Vorlage fehlgeschlagen","One moment please…":"Einen Moment bitte ...","Open in %{app}":"In %{app} öffnen","Redirecting to external app":"Weiterleiten zu externer App","This file is currently being processed and is not yet available for use. Please try again shortly.":"Diese Datei wird derzeit bearbeitet und kann noch nicht verwendet werden. Bitte in Kürze erneut versuchen.","You are being redirected.":"Sie werden weitergeleitet."},"es":{"\"%{appName}\" app content area":"\"%{appName}\" área de contenido de la aplicación","An error occurred":"Ocurrió un error","Cannot open file in edit mode as it is read-only":"No se puede abrir el archivo en modo edición porque es de solo lectura.","External":"Externo","One moment please…":"Espere un momento, por favor…","Open in %{app}":"Abrir en %{app}","Redirecting to external app":"Redireccionando a una aplicación externa","This file is currently being processed and is not yet available for use. Please try again shortly.":"Este archivo está siendo procesado y aún no está disponible para su uso. Vuelva a intentarlo más tarde.","You are being redirected.":"Está siendo redirigido."},"et":{},"fr":{"\"%{appName}\" app content area":"Zone de contenu de l'application \"%{appName}\"","An error occurred":"Une erreur est survenue","One moment please…":"Veuillez patienter …","Open in %{app}":"Ouvrir avec %{app}","You are being redirected.":"Vous allez être redirigé ..."},"gl":{},"he":{"\"%{appName}\" app content area":"אזור תוכן היישום „%{appName}”","An error occurred":"אירעה שגיאה","One moment please…":"רק רגע בבקשה…","Open in %{app}":"פתיחה ב־%{app}","This file is currently being processed and is not yet available for use. Please try again shortly.":"הקובץ הזה עובר עיבוד ועדיין אינו זמין לשימוש. נא לנסות שוב בעוד זמן קצר.","You are being redirected.":"מתבצעת הפניה."},"it":{"\"%{appName}\" app content area":"Area del contenuto dell'app \"%{appName}\"","An error occurred":"Si è verificato un errore","One moment please…":"Ancora un momento...","This file is currently being processed and is not yet available for use. Please try again shortly.":"Questo file non è al momento disponibile perché viene processato. Si prega di riprovare più tardi.","You are being redirected.":"Reindirizzamento in corso."},"id":{},"hr":{},"ja":{"External":"外部"},"nl":{"\"%{appName}\" app content area":"\"%{appName}\"-app inhoudsgebied","An error occurred":"Er is een fout opgetreden","One moment please…":"Een ogenblik geduld alstublieft...","Open in %{app}":"Openen in %{app}","This file is currently being processed and is not yet available for use. Please try again shortly.":"Dit bestand wordt momenteel verwerkt en is nog niet beschikbaar voor gebruik. Probeer het binnenkort opnieuw.","You are being redirected.":"U wordt doorgestuurd."},"ka":{},"ko":{"\"%{appName}\" app content area":"\"%{appName}\" 앱 내용 영역","An error occurred":"오류가 발생했습니다","Cannot open file in edit mode as it is read-only":"읽기 전용 파일이기에 편집할 수 없음","One moment please…":"잠시 기다려주세요...","Open in %{app}":"%{app}에서 열기","This file is currently being processed and is not yet available for use. Please try again shortly.":"이 파일은 현재 처리 중이며 아직 사용할 수 없습니다. 잠시 후 다시 시도하십시오.","You are being redirected.":"리디렉션되고 있습니다."},"pl":{"\"%{appName}\" app content area":"Zawartość aplikacji \"%{appName}\"","An error occurred":"Wystąpił błąd","One moment please…":"Proszę czekać…","Open in %{app}":"Otwórz w %{app}","This file is currently being processed and is not yet available for use. Please try again shortly.":"Ten plik jest obecnie przetwarzany i nie jest jeszcze gotowy do użycia, Spróbuj ponownie za chwilę.","You are being redirected.":"Jesteś przekierowywany."},"pt":{},"ru":{"\"%{appName}\" app content area":"Область контента \"%{appName}\"","An error occurred":"Произошла ошибка","Cannot open file in edit mode as it is read-only":"Невозможно открыть файл в режиме редактирования, так как он доступен только для чтения","External":"Внешние","Failed to create document from template":"Не удалось создать документ из шаблона","One moment please…":"Один момент, пожалуйста…","Open in %{app}":"Открыть в %{app}","Redirecting to external app":"Перенаправление внешнему приложению","This file is currently being processed and is not yet available for use. Please try again shortly.":"Этот файл находится в процессе обработки и пока недоступен для использования. Пожалуйста, повторите попытку в ближайшее время.","You are being redirected.":"Вы будете перенаправлены."},"ro":{},"sk":{"\"%{appName}\" app content area":"Oblasť obsahu \"%{appName}\""},"si":{},"sq":{"\"%{appName}\" app content area":"Zonë lënde aplikacioni “%{appName}”","An error occurred":"Ndodhi një gabim","Cannot open file in edit mode as it is read-only":"S’mund të hapet kartelë nën mënyrën përpunim, ngaqë është vetëm-lexim","Create from template via %{ name }":"Krijoje prej gjedheje përmes %{ name }","External":"I jashtëm","Failed to create document from template":"S’u arrit të krijohej dokument prej gjedheje","One moment please…":"Një sekondë, ju lutemi…","Open in %{app}":"Hape me %{app}","Redirecting to external app":"Po bëhet ridrejtim te aplikacion i jashtëm","This file is currently being processed and is not yet available for use. Please try again shortly.":"Kjo kartelë aktualisht po përpunohet dhe s’është ende gati për përdorim. Ju lutemi, riprovoni pas pak.","You are being redirected.":"Po bëhet ridrejtimi juaj."},"sr":{},"ta":{},"sv":{"\"%{appName}\" app content area":"\"%{appName}\" app innehållsyta","An error occurred":"Ett fel uppstod","Cannot open file in edit mode as it is read-only":"Kan inte öppna filen i redigeringsläge pågrund av att den är i läs-läge","This file is currently being processed and is not yet available for use. Please try again shortly.":"Den här filen används för tillfället och är inte tillgänglig. Försök igen senare."},"tr":{"\"%{appName}\" app content area":"\"%{appName}\" uygulama içerik alanı","An error occurred":"Bir hata oluştu","One moment please…":"Bir dakika lütfen...","Open in %{app}":"%{app}'da aç","This file is currently being processed and is not yet available for use. Please try again shortly.":"Bu dosya şu anda işleniyor ve henüz kullanıma uygun değil. Lütfen kısa süre sonra tekrar deneyin.","You are being redirected.":"Yönlendiriliyorsunuz."},"zh":{"\"%{appName}\" app content area":"\"%{appName}\" 应用内容区域","An error occurred":"发生错误","Cannot open file in edit mode as it is read-only":"无法以编辑模式打开文件,因为它是只读的","External":"外部","One moment please…":"请稍等...","Open in %{app}":"在 %{app} 中打开","Redirecting to external app":"重定向至外部应用程序","This file is currently being processed and is not yet available for use. Please try again shortly.":"该文件当前正在处理中,不可使用。 请稍后重试。","You are being redirected.":"正在重定向。"},"ug":{},"uk":{"\"%{appName}\" app content area":"Робоча область програми \"%{appName}\".","An error occurred":"Виникла помилка","Cannot open file in edit mode as it is read-only":"Неможливо відкрити файл у режимі редагування, оскільки він доступний лише для читання","External":"Зовнішній","One moment please…":"Будь ласка, хвилиночку…","Open in %{app}":"Відкрити в %{app}","This file is currently being processed and is not yet available for use. Please try again shortly.":"Цей файл зараз обробляється і ще не доступний для використання. Спробуйте ще раз незабаром.","You are being redirected.":"Вас буде перенаправлено."}} \ No newline at end of file