feat(i18n): translate five more systems, and unify the permission labels
CI / Build & test (Node 20) (push) Canceled after 0s
CI / Build & test (Node 24) (push) Canceled after 0s
CI / Build & test (push) Canceled after 0s
CodeQL / Analyze (javascript-typescript) (push) Canceled after 0s
Security / Secret scan (gitleaks) (push) Canceled after 0s
Security / Dependency scan (OSV-Scanner) (push) Canceled after 0s
Security / IaC/config scan (Trivy) (push) Canceled after 0s
Security / License compliance scan (Trivy) (push) Canceled after 0s
OpenSSF Scorecard / Scorecard analysis (push) Canceled after 0s
CI / Build & test (Node 20) (push) Canceled after 0s
CI / Build & test (Node 24) (push) Canceled after 0s
CI / Build & test (push) Canceled after 0s
CodeQL / Analyze (javascript-typescript) (push) Canceled after 0s
Security / Secret scan (gitleaks) (push) Canceled after 0s
Security / Dependency scan (OSV-Scanner) (push) Canceled after 0s
Security / IaC/config scan (Trivy) (push) Canceled after 0s
Security / License compliance scan (Trivy) (push) Canceled after 0s
OpenSSF Scorecard / Scorecard analysis (push) Canceled after 0s
- Space settings > Overview — identity, icon, banner, transfer, delete - Space settings > Members and Bans - Space settings > Roles, including the whole permission table - Category settings — rename, privacy, overrides, delete - Instance settings > General — name, discovery, GIF search The permission labels were duplicated: the roles panel carried one English list and the channel/category override editors carried another. Both now read a single `perm.*` set, so renaming a permission lands in all three at once instead of one and a half. This removes the `channel.perm.*` keys added two commits ago rather than adding a third copy beside them. Same pattern as before for anything chosen outside the render: the roles panel's permission groups and the category's override definitions hold keys and resolve them where they render. The category delete dialog emphasises the category name, so its sentence is split around the placeholder rather than interpolated. Dictionary is at 723 keys, en and pt-BR at exact parity. Verified: web build (tsc + vite), 490 web tests. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -255,20 +255,6 @@ export const en = {
|
||||
'channel.delete.irreversible': 'This action cannot be undone.',
|
||||
'channel.delete.failed': 'Failed to delete channel',
|
||||
|
||||
// Channel permissions — override editor labels
|
||||
'channel.perm.viewChannel': 'View Channel',
|
||||
'channel.perm.sendMessages': 'Send Messages',
|
||||
'channel.perm.manageMessages': 'Manage Messages',
|
||||
'channel.perm.attachFiles': 'Attach Files',
|
||||
'channel.perm.readHistory': 'Read Message History',
|
||||
'channel.perm.addReactions': 'Add Reactions',
|
||||
'channel.perm.connect': 'Connect',
|
||||
'channel.perm.speak': 'Speak',
|
||||
'channel.perm.stream': 'Stream',
|
||||
'channel.perm.muteMembers': 'Mute Members',
|
||||
'channel.perm.deafenMembers': 'Deafen Members',
|
||||
'channel.perm.moveMembers': 'Move Members',
|
||||
'channel.perm.disconnectMembers': 'Disconnect Members',
|
||||
// Friends — tabs and lists
|
||||
'friends.title': 'Friends',
|
||||
'friends.tab.online': 'Online',
|
||||
@@ -665,6 +651,159 @@ export const en = {
|
||||
'error.title': 'Something went wrong',
|
||||
'error.tryAgain': 'Try Again',
|
||||
'error.reload': 'Reload Page',
|
||||
// Permission labels — shared by the roles panel and the channel/category
|
||||
// override editors, so a rename lands in all three at once.
|
||||
'perm.group.general': 'General',
|
||||
'perm.group.text': 'Text',
|
||||
'perm.group.voice': 'Voice',
|
||||
'perm.administrator': 'Administrator',
|
||||
'perm.viewChannel': 'View Channel',
|
||||
'perm.viewChannels': 'View Channels',
|
||||
'perm.manageChannels': 'Manage Channels',
|
||||
'perm.manageRoles': 'Manage Roles',
|
||||
'perm.manageSpace': 'Manage Space',
|
||||
'perm.createInvite': 'Create Invite',
|
||||
'perm.kickMembers': 'Kick Members',
|
||||
'perm.banMembers': 'Ban Members',
|
||||
'perm.sendMessages': 'Send Messages',
|
||||
'perm.manageMessages': 'Manage Messages',
|
||||
'perm.attachFiles': 'Attach Files',
|
||||
'perm.readHistory': 'Read Message History',
|
||||
'perm.addReactions': 'Add Reactions',
|
||||
'perm.connect': 'Connect',
|
||||
'perm.speak': 'Speak',
|
||||
'perm.stream': 'Stream',
|
||||
'perm.muteMembers': 'Mute Members',
|
||||
'perm.deafenMembers': 'Deafen Members',
|
||||
'perm.moveMembers': 'Move Members',
|
||||
'perm.disconnectMembers': 'Disconnect Members',
|
||||
|
||||
// Space settings — overview
|
||||
'space.overview.title': 'Overview',
|
||||
'space.overview.identity': 'Space Identity',
|
||||
'space.overview.icon': 'Space Icon',
|
||||
'space.overview.iconAlt': 'Space icon',
|
||||
'space.overview.iconColor': 'Icon Color',
|
||||
'space.overview.banner': 'Space Banner',
|
||||
'space.overview.bannerAlt': 'Space banner',
|
||||
'space.overview.bannerUpload': 'Upload banner (16:9)',
|
||||
'space.overview.bannerRemove': 'Remove banner',
|
||||
'space.overview.remove': 'Remove',
|
||||
'space.overview.name': 'Space Name',
|
||||
'space.overview.save': 'Save',
|
||||
'space.overview.saving': 'Saving...',
|
||||
'space.overview.discard': 'Discard',
|
||||
'space.overview.saved': 'Settings saved',
|
||||
'space.overview.saveFailed': 'Failed to save',
|
||||
'space.overview.iconFailed': 'Failed to upload icon',
|
||||
'space.overview.bannerFailed': 'Failed to upload banner',
|
||||
'space.overview.cropIcon': 'Crop Space Icon',
|
||||
'space.overview.cropBanner': 'Crop Space Banner',
|
||||
'space.overview.danger': 'Danger Zone',
|
||||
'space.overview.transfer.description': 'Transfer ownership to another member. You will become a regular member.',
|
||||
'space.overview.transfer.button': 'Transfer Ownership',
|
||||
'space.overview.transfer.confirm': 'Transfer ownership to',
|
||||
'space.overview.transfer.search': 'Search members...',
|
||||
'space.overview.transfer.empty': 'No members found',
|
||||
'space.overview.transfer.back': 'Back',
|
||||
'space.overview.transfer.cancel': 'Cancel',
|
||||
'space.overview.transfer.submit': 'Transfer',
|
||||
'space.overview.transfer.transferring': 'Transferring...',
|
||||
'space.overview.transfer.failed': 'Failed to transfer ownership',
|
||||
'space.overview.delete.description': 'Permanently delete this space and all its data. This cannot be undone.',
|
||||
'space.overview.delete': 'Delete Space',
|
||||
'space.overview.delete.confirm': 'Click again to confirm deletion',
|
||||
'space.overview.delete.failed': 'Failed to delete space',
|
||||
|
||||
// Space settings — members and bans
|
||||
'space.members.title': 'Members',
|
||||
'space.members.description': 'Manage members of this space. Click a member to edit their roles.',
|
||||
'space.members.count': 'Members ({count})',
|
||||
'space.members.noRoles': 'No roles',
|
||||
'space.members.save': 'Save',
|
||||
'space.members.cancel': 'Cancel',
|
||||
'space.members.kick': 'Kick',
|
||||
'space.members.ban': 'Ban',
|
||||
'space.members.kick.title': 'Kick {name}',
|
||||
'space.members.kick.description': 'They can rejoin with an invite link.',
|
||||
'space.members.ban.title': 'Ban {name}',
|
||||
'space.members.ban.description': 'They will be permanently banned from this space until unbanned.',
|
||||
'space.members.rolesFailed': 'Failed to update roles',
|
||||
'space.members.kickFailed': 'Failed to kick member',
|
||||
'space.members.banFailed': 'Failed to ban member',
|
||||
'space.bans.title': 'Bans',
|
||||
'space.bans.count': 'Bans ({count})',
|
||||
'space.bans.description': 'Banned users cannot rejoin this space until unbanned.',
|
||||
'space.bans.loading': 'Loading bans...',
|
||||
'space.bans.empty': 'No banned users',
|
||||
'space.bans.by': 'Banned by {moderator} on {date}',
|
||||
'space.bans.unban': 'Unban',
|
||||
'space.bans.loadFailed': 'Failed to load bans',
|
||||
'space.bans.unbanFailed': 'Failed to unban user',
|
||||
|
||||
// Space settings — roles
|
||||
'space.roles.title': 'Roles',
|
||||
'space.roles.description': 'Roles define what permissions members have. Higher roles take priority.',
|
||||
'space.roles.create': 'Create Role',
|
||||
'space.roles.creating': 'Creating...',
|
||||
'space.roles.createFailed': 'Failed to create role',
|
||||
'space.roles.created': 'Role created — customize it below',
|
||||
'space.roles.back': 'Back to roles',
|
||||
'space.roles.identity': 'Identity',
|
||||
'space.roles.name': 'Role Name',
|
||||
'space.roles.name.empty': 'Role name cannot be empty',
|
||||
'space.roles.color': 'Role Color',
|
||||
'space.roles.save': 'Save',
|
||||
'space.roles.saving': 'Saving...',
|
||||
'space.roles.saved': 'Role saved',
|
||||
'space.roles.saveFailed': 'Failed to save role',
|
||||
'space.roles.discard': 'Discard',
|
||||
'space.roles.copy': 'Copy Role',
|
||||
'space.roles.copying': 'Copying...',
|
||||
'space.roles.copyFailed': 'Failed to copy role',
|
||||
'space.roles.delete': 'Delete Role',
|
||||
'space.roles.deleting': 'Deleting...',
|
||||
'space.roles.deleteConfirm': 'Confirm?',
|
||||
'space.roles.deleteFailed': 'Failed to delete role',
|
||||
|
||||
// Category settings
|
||||
'category.settings.title': 'Category Settings',
|
||||
'category.tab.overview': 'Overview',
|
||||
'category.tab.permissions': 'Permissions',
|
||||
'category.label': 'Category',
|
||||
'category.private.title': 'Private Category',
|
||||
'category.private.description': 'Only selected members and roles will be able to view channels in this category.',
|
||||
'category.private.note': 'This category is hidden from members without explicit access. Channels inside inherit this restriction unless they explicitly override it.',
|
||||
'category.private.loadFailed': 'Failed to load category overrides',
|
||||
'category.private.updateFailed': 'Failed to update category privacy',
|
||||
'category.renameFailed': 'Failed to rename category',
|
||||
'category.danger': 'Danger Zone',
|
||||
'category.delete': 'Delete Category',
|
||||
'category.delete.title': 'Delete "{name}"?',
|
||||
'category.delete.body': 'This will permanently delete the {name} category. Channels inside it will be moved to the top level. This action cannot be undone.',
|
||||
'category.delete.failed': 'Failed to delete category',
|
||||
|
||||
// Instance settings — general
|
||||
'instance.general.title': 'General',
|
||||
'instance.general.description': 'Configure your Backspace instance. These settings affect all users.',
|
||||
'instance.general.loading': 'Loading settings...',
|
||||
'instance.general.name': 'Instance Name',
|
||||
'instance.general.name.description': 'The name shown on the login page and to federated instances.',
|
||||
'instance.general.discovery': 'Discovery',
|
||||
'instance.general.discovery.title': 'Space Discovery',
|
||||
'instance.general.discovery.description': 'Allow spaces to appear in the public Explore page',
|
||||
'instance.general.gif': 'GIF Search',
|
||||
'instance.general.gif.description': 'Enable GIF search powered by Klipy. Get a free API key from the Klipy developer portal.',
|
||||
'instance.general.gif.keySaved': 'Key saved — enter new key to replace',
|
||||
'instance.general.gif.keyPlaceholder': 'Klipy API key',
|
||||
'instance.general.gif.enabled': 'Enabled',
|
||||
'instance.general.gif.notConfigured': 'Not configured',
|
||||
'instance.general.gif.clearKey': 'Clear key',
|
||||
'instance.general.save': 'Save',
|
||||
'instance.general.saving': 'Saving...',
|
||||
'instance.general.reset': 'Reset',
|
||||
'instance.general.saved': 'Settings saved',
|
||||
'instance.general.saveFailed': 'Failed to save',
|
||||
} as const;
|
||||
|
||||
export type TranslationKey = keyof typeof en;
|
||||
|
||||
Reference in New Issue
Block a user