From c5d1f2f9ffddaa1c2b79111538513dd9eb6915e3 Mon Sep 17 00:00:00 2001 From: kramo Date: Tue, 5 Aug 2025 16:01:31 +0200 Subject: [PATCH] fix(l10n): Less jargon in source strings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This removes: - “enable” for settings - “settings” for settings sections - “all” when there is no obvious subset of items - “show” and “open” for navigation actions - “changes” for applying/discarding - “to clipboard” when copying - Explaining things that cannot happen - Explaining things twice, right below each other - Unnecessary technical jargon - Text that sounds like marketing copy and serves no other purpose Signed-off-by: kramo --- .../src/components/PersonalSettings.vue | 4 +- apps/files/src/actions/sidebarAction.spec.ts | 2 +- apps/files/src/actions/sidebarAction.ts | 2 +- .../FilesListTableHeaderActions.vue | 6 +- .../src/components/FilesNavigationSearch.vue | 8 +-- apps/files/src/filters/TypeFilter.ts | 2 +- apps/files/src/utils/actionUtils.ts | 6 +- apps/files/src/utils/davUtils.ts | 2 +- apps/files/src/views/FilesList.vue | 6 +- apps/files/src/views/Settings.vue | 60 +++++++++---------- .../src/actions/setReminderCustomAction.ts | 4 +- .../src/components/SetCustomReminderModal.vue | 2 +- .../NewFileRequestDialogFinish.vue | 4 +- .../src/components/SharingEntryInternal.vue | 7 +-- .../src/components/SharingEntryLink.vue | 2 +- .../src/components/SharingInput.vue | 2 +- .../src/files_actions/sharingStatusAction.ts | 2 +- apps/files_sharing/src/views/SharingTab.vue | 21 ++++--- .../src/components/SystemTagPicker.vue | 4 +- .../PublicPageMenuLinkEntry.vue | 2 +- .../files_sharing/share-status-action.cy.ts | 2 +- 21 files changed, 75 insertions(+), 75 deletions(-) diff --git a/apps/federatedfilesharing/src/components/PersonalSettings.vue b/apps/federatedfilesharing/src/components/PersonalSettings.vue index 7906d4c31d8..e58031d5653 100644 --- a/apps/federatedfilesharing/src/components/PersonalSettings.vue +++ b/apps/federatedfilesharing/src/components/PersonalSettings.vue @@ -156,14 +156,14 @@ export default { ` }, copyLinkTooltip() { - return this.isCopied ? t('federatedfilesharing', 'Cloud ID copied to the clipboard') : t('federatedfilesharing', 'Copy to clipboard') + return this.isCopied ? t('federatedfilesharing', 'Cloud ID copied') : t('federatedfilesharing', 'Copy') }, }, methods: { async copyCloudId(): Promise { try { await navigator.clipboard.writeText(this.cloudId) - showSuccess(t('federatedfilesharing', 'Cloud ID copied to the clipboard')) + showSuccess(t('federatedfilesharing', 'Cloud ID copied')) } catch (e) { // no secure context or really old browser - need a fallback window.prompt(t('federatedfilesharing', 'Clipboard not available. Please copy the cloud ID manually.'), this.reference) diff --git a/apps/files/src/actions/sidebarAction.spec.ts b/apps/files/src/actions/sidebarAction.spec.ts index 75ed8c97b47..9085bf595ad 100644 --- a/apps/files/src/actions/sidebarAction.spec.ts +++ b/apps/files/src/actions/sidebarAction.spec.ts @@ -17,7 +17,7 @@ describe('Open sidebar action conditions tests', () => { test('Default values', () => { expect(action).toBeInstanceOf(FileAction) expect(action.id).toBe('details') - expect(action.displayName([], view)).toBe('Open details') + expect(action.displayName([], view)).toBe('Details') expect(action.iconSvgInline([], view)).toMatch(//) expect(action.default).toBeUndefined() expect(action.order).toBe(-50) diff --git a/apps/files/src/actions/sidebarAction.ts b/apps/files/src/actions/sidebarAction.ts index 0b8ad91741e..8f020b4ee8d 100644 --- a/apps/files/src/actions/sidebarAction.ts +++ b/apps/files/src/actions/sidebarAction.ts @@ -16,7 +16,7 @@ export const ACTION_DETAILS = 'details' export const action = new FileAction({ id: ACTION_DETAILS, - displayName: () => t('files', 'Open details'), + displayName: () => t('files', 'Details'), iconSvgInline: () => InformationSvg, // Sidebar currently supports user folder only, /files/USER diff --git a/apps/files/src/components/FilesListTableHeaderActions.vue b/apps/files/src/components/FilesListTableHeaderActions.vue index 53b7e7ef21b..6a808355c58 100644 --- a/apps/files/src/components/FilesListTableHeaderActions.vue +++ b/apps/files/src/components/FilesListTableHeaderActions.vue @@ -305,16 +305,16 @@ export default defineComponent({ return } - showError(this.t('files', '"{displayName}" failed on some elements', { displayName })) + showError(this.t('files', '{displayName}: failed on some elements', { displayName })) return } // Show success message and clear selection - showSuccess(this.t('files', '"{displayName}" batch action executed successfully', { displayName })) + showSuccess(this.t('files', '{displayName}: done', { displayName })) this.selectionStore.reset() } catch (e) { logger.error('Error while executing action', { action, e }) - showError(this.t('files', '"{displayName}" action failed', { displayName })) + showError(this.t('files', '{displayName}: failed', { displayName })) } finally { // Remove loading markers this.loading = null diff --git a/apps/files/src/components/FilesNavigationSearch.vue b/apps/files/src/components/FilesNavigationSearch.vue index e34d4bf0971..0890dffcb39 100644 --- a/apps/files/src/components/FilesNavigationSearch.vue +++ b/apps/files/src/components/FilesNavigationSearch.vue @@ -55,9 +55,9 @@ const isSearchView = computed(() => currentView.value.id === VIEW_ID) */ const searchLabel = computed(() => { if (searchStore.scope === 'globally') { - return t('files', 'Search globally by filename …') + return t('files', 'Search everywhere …') } - return t('files', 'Search here by filename …') + return t('files', 'Search here …') }) @@ -72,13 +72,13 @@ const searchLabel = computed(() => { - {{ t('files', 'Filter and search from this location') }} + {{ t('files', 'Search here') }} - {{ t('files', 'Search globally') }} + {{ t('files', 'Search everywhere') }} diff --git a/apps/files/src/filters/TypeFilter.ts b/apps/files/src/filters/TypeFilter.ts index 94b109ea7a4..3170e22b260 100644 --- a/apps/files/src/filters/TypeFilter.ts +++ b/apps/files/src/filters/TypeFilter.ts @@ -73,7 +73,7 @@ const getTypePresets = async () => [ { id: 'image', // TRANSLATORS: This is for filtering files, e.g. PNG or JPEG, so photos, drawings, or images in general - label: t('files', 'Photos and images'), + label: t('files', 'Images'), icon: svgImage, mime: ['image'], }, diff --git a/apps/files/src/utils/actionUtils.ts b/apps/files/src/utils/actionUtils.ts index f6d43727c29..adacf621b4c 100644 --- a/apps/files/src/utils/actionUtils.ts +++ b/apps/files/src/utils/actionUtils.ts @@ -59,13 +59,13 @@ export const executeAction = async (action: FileAction) => { } if (success) { - showSuccess(t('files', '"{displayName}" action executed successfully', { displayName })) + showSuccess(t('files', '{displayName}: done', { displayName })) return } - showError(t('files', '"{displayName}" action failed', { displayName })) + showError(t('files', '{displayName}: failed', { displayName })) } catch (error) { logger.error('Error while executing action', { action, error }) - showError(t('files', '"{displayName}" action failed', { displayName })) + showError(t('files', '{displayName}: failed', { displayName })) } finally { // Reset the loading marker Vue.set(currentNode, 'status', undefined) diff --git a/apps/files/src/utils/davUtils.ts b/apps/files/src/utils/davUtils.ts index d8dc12d069d..54c1a6ea966 100644 --- a/apps/files/src/utils/davUtils.ts +++ b/apps/files/src/utils/davUtils.ts @@ -29,7 +29,7 @@ export function humanizeWebDAVError(error: unknown) { } else if (status === 403) { return t('files', 'This operation is forbidden') } else if (status === 500) { - return t('files', 'This directory is unavailable, please check the logs or contact the administrator') + return t('files', 'This folder is unavailable, please try again later or contact the administration') } else if (status === 503) { return t('files', 'Storage is temporarily not available') } diff --git a/apps/files/src/views/FilesList.vue b/apps/files/src/views/FilesList.vue index 3f993e24958..f9e517e92ee 100644 --- a/apps/files/src/views/FilesList.vue +++ b/apps/files/src/views/FilesList.vue @@ -816,13 +816,13 @@ export default defineComponent({ } if (success) { - showSuccess(t('files', '"{displayName}" action executed successfully', { displayName })) + showSuccess(t('files', '{displayName}: done', { displayName })) return } - showError(t('files', '"{displayName}" action failed', { displayName })) + showError(t('files', '{displayName}: failed', { displayName })) } catch (error) { logger.error('Error while executing action', { action, error }) - showError(t('files', '"{displayName}" action failed', { displayName })) + showError(t('files', '{displayName}: failed', { displayName })) } finally { this.loadingAction = null } diff --git a/apps/files/src/views/Settings.vue b/apps/files/src/views/Settings.vue index 0838d308af9..bfac8e0b3d6 100644 --- a/apps/files/src/views/Settings.vue +++ b/apps/files/src/views/Settings.vue @@ -8,7 +8,7 @@ :name="t('files', 'Files settings')" @update:open="onClose"> - +
@@ -42,12 +42,12 @@ - {{ t('files', 'Enable folder tree') }} + {{ t('files', 'Folder tree') }} - - + + @@ -58,16 +58,16 @@ @update:checked="setConfig('show_mime_column', $event)"> {{ t('files', 'Show file type column') }} + + {{ t('files', 'Show file extensions') }} + {{ t('files', 'Crop image previews') }} - - {{ t('files', 'Show files extensions') }} - @@ -85,7 +85,7 @@ :label="t('files', 'WebDAV URL')" :show-trailing-button="true" :success="webdavUrlCopied" - :trailing-button-label="t('files', 'Copy to clipboard')" + :trailing-button-label="t('files', 'Copy')" :value="webdavUrl" class="webdav-url-input" readonly="readonly" @@ -101,7 +101,7 @@ :href="webdavDocs" target="_blank" rel="noreferrer noopener"> - {{ t('files', 'Use this address to access your Files via WebDAV.') }} ↗ + {{ t('files', 'How to access files using WebDAV') }} ↗
@@ -113,22 +113,20 @@
- {{ t('files', 'Prevent warning dialogs from open or reenable them.') }} - {{ t('files', 'Show a warning dialog when changing a file extension.') }} + {{ t('files', 'Warn before changing a file extension') }} - {{ t('files', 'Show a warning dialog when deleting files.') }} + {{ t('files', 'Warn before deleting files') }} - {{ t('files', 'Speed up your Files experience with these quick shortcuts.') }}

{{ t('files', 'Actions') }}

@@ -137,7 +135,7 @@ a
- {{ t('files', 'Open the actions menu for a file') }} + {{ t('files', 'File actions') }}
@@ -145,7 +143,7 @@ F2
- {{ t('files', 'Rename a file') }} + {{ t('files', 'Rename') }}
@@ -153,7 +151,7 @@ Del
- {{ t('files', 'Delete a file') }} + {{ t('files', 'Delete') }}
@@ -161,7 +159,7 @@ s
- {{ t('files', 'Favorite or remove a file from favorites') }} + {{ t('files', 'Add or remove favorite') }}
@@ -169,7 +167,7 @@ t
- {{ t('files', 'Manage tags for a file') }} + {{ t('files', 'Manage tags') }}
@@ -189,7 +187,7 @@ ESC
- {{ t('files', 'Deselect all files') }} + {{ t('files', 'Deselect all') }}
@@ -197,7 +195,7 @@ Ctrl + Space
- {{ t('files', 'Select or deselect a file') }} + {{ t('files', 'Select or deselect') }}
@@ -205,7 +203,7 @@ Ctrl + Shift + Space
- {{ t('files', 'Select a range of files') }} + {{ t('files', 'Select a range') }}
@@ -217,7 +215,7 @@ Alt +
- {{ t('files', 'Navigate to the parent folder') }} + {{ t('files', 'Go to parent folder') }}
@@ -225,7 +223,7 @@
- {{ t('files', 'Navigate to the file above') }} + {{ t('files', 'Go to file above') }}
@@ -233,7 +231,7 @@
- {{ t('files', 'Navigate to the file below') }} + {{ t('files', 'Go to file below') }}
@@ -241,7 +239,7 @@
- {{ t('files', 'Navigate to the file on the left (in grid mode)') }} + {{ t('files', 'Go left in grid') }}
@@ -249,7 +247,7 @@
- {{ t('files', 'Navigate to the file on the right (in grid mode)') }} + {{ t('files', 'Go right in grid') }}
@@ -261,7 +259,7 @@ V
- {{ t('files', 'Toggle the grid view') }} + {{ t('files', 'Toggle grid view') }}
@@ -269,7 +267,7 @@ D
- {{ t('files', 'Open the sidebar for a file') }} + {{ t('files', 'Open file sidebar') }}
@@ -400,7 +398,7 @@ export default { await navigator.clipboard.writeText(this.webdavUrl) this.webdavUrlCopied = true - showSuccess(t('files', 'WebDAV URL copied to clipboard')) + showSuccess(t('files', 'WebDAV URL copied')) setTimeout(() => { this.webdavUrlCopied = false }, 5000) diff --git a/apps/files_reminders/src/actions/setReminderCustomAction.ts b/apps/files_reminders/src/actions/setReminderCustomAction.ts index cfaa1ad169f..ea21293ee52 100644 --- a/apps/files_reminders/src/actions/setReminderCustomAction.ts +++ b/apps/files_reminders/src/actions/setReminderCustomAction.ts @@ -14,8 +14,8 @@ import { pickCustomDate } from '../services/customPicker' export const action = new FileAction({ id: 'set-reminder-custom', - displayName: () => t('files_reminders', 'Set custom reminder'), - title: () => t('files_reminders', 'Set reminder at custom date & time'), + displayName: () => t('files_reminders', 'Custom reminder'), + title: () => t('files_reminders', 'Reminder at custom date & time'), iconSvgInline: () => CalendarClockSvg, enabled: (nodes: Node[], view: View) => { diff --git a/apps/files_reminders/src/components/SetCustomReminderModal.vue b/apps/files_reminders/src/components/SetCustomReminderModal.vue index 339c4e96d83..59c0886a009 100644 --- a/apps/files_reminders/src/components/SetCustomReminderModal.vue +++ b/apps/files_reminders/src/components/SetCustomReminderModal.vue @@ -106,7 +106,7 @@ export default Vue.extend({ }, label(): string { - return t('files_reminders', 'Set reminder at custom date & time') + return t('files_reminders', 'Reminder at custom date & time') }, clearAriaLabel(): string { diff --git a/apps/files_sharing/src/components/NewFileRequestDialog/NewFileRequestDialogFinish.vue b/apps/files_sharing/src/components/NewFileRequestDialog/NewFileRequestDialogFinish.vue index 499fd773edc..7826aab581e 100644 --- a/apps/files_sharing/src/components/NewFileRequestDialog/NewFileRequestDialogFinish.vue +++ b/apps/files_sharing/src/components/NewFileRequestDialog/NewFileRequestDialogFinish.vue @@ -16,7 +16,7 @@ :label="t('files_sharing', 'Share link')" :readonly="true" :show-trailing-button="true" - :trailing-button-label="t('files_sharing', 'Copy to clipboard')" + :trailing-button-label="t('files_sharing', 'Copy')" data-cy-file-request-dialog-fieldset="link" @click="copyShareLink" @trailing-button-click="copyShareLink"> @@ -140,7 +140,7 @@ export default defineComponent({ await navigator.clipboard.writeText(this.shareLink) - showSuccess(t('files_sharing', 'Link copied to clipboard')) + showSuccess(t('files_sharing', 'Link copied')) this.isCopied = true event.target?.select?.() diff --git a/apps/files_sharing/src/components/SharingEntryInternal.vue b/apps/files_sharing/src/components/SharingEntryInternal.vue index 2ad1256fa82..027d2a3d5c3 100644 --- a/apps/files_sharing/src/components/SharingEntryInternal.vue +++ b/apps/files_sharing/src/components/SharingEntryInternal.vue @@ -83,14 +83,11 @@ export default { } return t('files_sharing', 'Cannot copy, please copy the link manually') } - return t('files_sharing', 'Copy internal link to clipboard') + return t('files_sharing', 'Copy internal link') }, internalLinkSubtitle() { - if (this.fileInfo.type === 'dir') { - return t('files_sharing', 'Only works for people with access to this folder') - } - return t('files_sharing', 'Only works for people with access to this file') + return t('files_sharing', 'For people who already have access') }, }, diff --git a/apps/files_sharing/src/components/SharingEntryLink.vue b/apps/files_sharing/src/components/SharingEntryLink.vue index 6a456fa0a15..6865af1b864 100644 --- a/apps/files_sharing/src/components/SharingEntryLink.vue +++ b/apps/files_sharing/src/components/SharingEntryLink.vue @@ -550,7 +550,7 @@ export default { } return t('files_sharing', 'Cannot copy, please copy the link manually') } - return t('files_sharing', 'Copy public link of "{title}" to clipboard', { title: this.title }) + return t('files_sharing', 'Copy public link of "{title}"', { title: this.title }) }, /** diff --git a/apps/files_sharing/src/components/SharingInput.vue b/apps/files_sharing/src/components/SharingInput.vue index 46bacef0c6c..6fb33aba6b2 100644 --- a/apps/files_sharing/src/components/SharingInput.vue +++ b/apps/files_sharing/src/components/SharingInput.vue @@ -264,7 +264,7 @@ export default { lookupEntry.push({ id: 'global-lookup', isNoUser: true, - displayName: t('files_sharing', 'Search globally'), + displayName: t('files_sharing', 'Search everywhere'), lookup: true, }) } diff --git a/apps/files_sharing/src/files_actions/sharingStatusAction.ts b/apps/files_sharing/src/files_actions/sharingStatusAction.ts index 2dfd8467c5b..18fa46d2781 100644 --- a/apps/files_sharing/src/files_actions/sharingStatusAction.ts +++ b/apps/files_sharing/src/files_actions/sharingStatusAction.ts @@ -53,7 +53,7 @@ export const action = new FileAction({ const sharees = node.attributes.sharees?.sharee as { id: string, 'display-name': string, type: ShareType }[] | undefined if (!sharees) { // No sharees so just show the default message to create a new share - return t('files_sharing', 'Show sharing options') + return t('files_sharing', 'Sharing options') } const sharee = [sharees].flat()[0] // the property is sometimes weirdly normalized, so we need to compensate diff --git a/apps/files_sharing/src/views/SharingTab.vue b/apps/files_sharing/src/views/SharingTab.vue index 9900d6c562d..bba8f0b2edb 100644 --- a/apps/files_sharing/src/views/SharingTab.vue +++ b/apps/files_sharing/src/views/SharingTab.vue @@ -230,9 +230,9 @@ export default { shareDetailsData: {}, returnFocusElement: null, - internalSharesHelpText: t('files_sharing', 'Use this method to share files with individuals or teams within your organization. If the recipient already has access to the share but cannot locate it, you can send them the internal share link for easy access.'), - externalSharesHelpText: t('files_sharing', 'Use this method to share files with individuals or organizations outside your organization. Files and folders can be shared via public share links and email addresses. You can also share to other Nextcloud accounts hosted on different instances using their federated cloud ID.'), - additionalSharesHelpText: t('files_sharing', 'Shares that are not part of the internal or external shares. This can be shares from apps or other sources.'), + internalSharesHelpText: t('files_sharing', 'Share files within your organization. Recipients who can already view the file can also use this link for easy access.'), + externalSharesHelpText: t('files_sharing', 'Share files with others outside your organization via public links and email addresses. You can also share to Nextcloud accounts on other instances using their federated cloud ID.'), + additionalSharesHelpText: t('files_sharing', 'Shares from apps or other sources which are not included in internal or external shares.'), } }, @@ -269,17 +269,22 @@ export default { internalShareInputPlaceholder() { return this.config.showFederatedSharesAsInternal && this.config.isFederationEnabled - ? t('files_sharing', 'Share with accounts, teams, federated cloud IDs') - : t('files_sharing', 'Share with accounts and teams') + // TRANSLATORS: Type as in with a keyboard + ? t('files_sharing', 'Type names, teams, federated cloud IDs') + // TRANSLATORS: Type as in with a keyboard + : t('files_sharing', 'Type names or teams') }, externalShareInputPlaceholder() { if (!this.isLinkSharingAllowed) { - return this.config.isFederationEnabled ? t('files_sharing', 'Federated cloud ID') : '' + // TRANSLATORS: Type as in with a keyboard + return this.config.isFederationEnabled ? t('files_sharing', 'Type a federated cloud ID') : '' } return !this.config.showFederatedSharesAsInternal && !this.config.isFederationEnabled - ? t('files_sharing', 'Email') - : t('files_sharing', 'Email, federated cloud ID') + // TRANSLATORS: Type as in with a keyboard + ? t('files_sharing', 'Type an email') + // TRANSLATORS: Type as in with a keyboard + : t('files_sharing', 'Type an email or federated cloud ID') }, }, methods: { diff --git a/apps/systemtags/src/components/SystemTagPicker.vue b/apps/systemtags/src/components/SystemTagPicker.vue index 50a5f182fe7..83294701c75 100644 --- a/apps/systemtags/src/components/SystemTagPicker.vue +++ b/apps/systemtags/src/components/SystemTagPicker.vue @@ -95,7 +95,7 @@
- {{ canEditOrCreateTag ? t('systemtags', 'Select or create tags to apply to all selected files'): t('systemtags', 'Select tags to apply to all selected files') }} + {{ t('systemtags', 'Choose tags for the selected files') }} @@ -113,7 +113,7 @@ - {{ t('systemtags', 'Apply changes') }} + {{ t('systemtags', 'Apply') }} diff --git a/core/src/components/PublicPageMenu/PublicPageMenuLinkEntry.vue b/core/src/components/PublicPageMenu/PublicPageMenuLinkEntry.vue index 54645e9ce48..5f3a4883d6d 100644 --- a/core/src/components/PublicPageMenu/PublicPageMenuLinkEntry.vue +++ b/core/src/components/PublicPageMenu/PublicPageMenuLinkEntry.vue @@ -33,7 +33,7 @@ const emit = defineEmits<{ async function copyLink() { try { await window.navigator.clipboard.writeText(props.href) - showSuccess(t('core', 'Direct link copied to clipboard')) + showSuccess(t('core', 'Direct link copied')) } catch { // No secure context -> fallback to dialog window.prompt(t('core', 'Please copy the link manually:'), props.href) diff --git a/cypress/e2e/files_sharing/share-status-action.cy.ts b/cypress/e2e/files_sharing/share-status-action.cy.ts index c88f117ddc8..f02ec676573 100644 --- a/cypress/e2e/files_sharing/share-status-action.cy.ts +++ b/cypress/e2e/files_sharing/share-status-action.cy.ts @@ -40,7 +40,7 @@ describe('files_sharing: Sharing status action', { testIsolation: true }, () => getRowForFile('folder') .should('be.visible') .find('[data-cy-files-list-row-actions]') - .findByRole('button', { name: /Show sharing options/ }) + .findByRole('button', { name: /Sharing options/ }) .should('be.visible') .click()