From bb0bb608e333103aa985be0d12861bf54862806a Mon Sep 17 00:00:00 2001 From: mirivlad Date: Thu, 4 Jun 2026 03:44:25 +0800 Subject: [PATCH] chore: sync english locale keys --- frontend/src/lib/i18n/locales/en.js | 385 ++++++++++++++++++++++------ frontend/src/lib/i18n/locales/ru.js | 1 - internal/i18n/locales/en.json | 292 +++++++++++++++++++-- 3 files changed, 575 insertions(+), 103 deletions(-) diff --git a/frontend/src/lib/i18n/locales/en.js b/frontend/src/lib/i18n/locales/en.js index 5a0cab1..4c56329 100644 --- a/frontend/src/lib/i18n/locales/en.js +++ b/frontend/src/lib/i18n/locales/en.js @@ -2,6 +2,7 @@ export default { 'nav.today': 'Today', 'nav.inbox': 'Inbox', 'nav.activity': 'Activity', + 'nav.journal': 'Journal', 'nav.clients': 'Clients', 'nav.projects': 'Projects', 'nav.recipes': 'Recipes', @@ -10,6 +11,11 @@ export default { 'nav.sections': 'Sections', 'nav.cases': 'Cases', 'nav.noCases': 'No cases', + 'nav.sync': 'Sync', + 'nav.syncSettings': 'Sync settings', + 'nav.syncNow': 'Sync now', + 'nav.selectPrompt': 'Select a section or case', + 'nav.brand': 'Verstak', 'nav.system': 'System', 'nav.workspace': 'Workspace', 'nav.noNodes': 'No nodes', @@ -17,16 +23,12 @@ export default { 'nav.createInside': 'Create inside', 'nav.createNode': 'Create element', 'nav.moveToRoot': 'Move to root', - 'nav.selectPrompt': 'Select a section or case', - 'nav.brand': 'Verstak', - 'tab.overview': 'Overview', 'tab.notes': 'Notes', 'tab.files': 'Files', 'tab.actions': 'Actions', 'tab.worklog': 'Work Log', 'tab.activity': 'Activity', - 'common.save': 'Save', 'common.cancel': 'Cancel', 'common.delete': 'Delete', @@ -39,14 +41,31 @@ export default { 'common.error': 'Error:', 'common.yes': 'Yes', 'common.ok': 'OK', + 'common.copy': 'Copy', + 'common.cut': 'Cut', + 'common.paste': 'Paste', + 'common.duplicate': 'Duplicate', 'common.run': 'Run', - 'common.name': 'Name', + 'common.test': 'Test', + 'common.all': 'All', + 'common.open': 'Open', + 'common.no': 'No', + 'common.date': 'Date', + 'common.search': 'Search', + 'common.testAgain': 'Check', + 'common.connect': 'Connect', + 'common.disconnect': 'Disconnect', 'common.settings': 'Settings', - + 'common.name': 'Name', + 'common.type': 'Type', + 'common.section': 'Section', + 'common.created': 'Created', + 'common.empty': 'None', + 'common.newName': 'New name', 'welcome.title': 'Verstak', 'welcome.selectSection': 'Select a section in the sidebar.', + 'welcome.createCase': 'Or create a new case with the + button.', 'welcome.addCase': 'Add case', - 'event.noteCreated': 'Note created', 'event.noteUpdated': 'Note updated', 'event.fileAdded': 'File added', @@ -54,43 +73,11 @@ export default { 'event.fileRenamed': 'File renamed', 'event.fileCopied': 'File copied', 'event.fileMoved': 'File moved', + 'event.folderAdded': 'Folder added', + 'event.folderDeleted': 'Folder deleted', + 'event.folderRenamed': 'Folder renamed', 'event.caseCreated': 'Case created', - - 'action.openUrl': 'Open URL', - 'action.openFile': 'Open file', - 'action.openFolder': 'Open folder', - 'action.runCommand': 'Run command', - 'action.runScript': 'Run script', - 'action.openTerminal': 'Open terminal', - 'action.launchApp': 'Launch app', - - 'note.add': '+ Add note', - 'note.noNotes': 'No notes', - 'note.title': 'Note title', - 'note.placeholder': 'Start writing...', - - 'file.addFile': '+ Add file', - 'file.addFolder': '+ Add folder', - 'file.preview': 'Preview', - 'file.openExternal': 'Open in external program', - 'file.openFolder': 'Open folder', - 'file.showInExplorer': 'Show in explorer', - 'file.delete': 'Delete', - 'file.pickSingle': 'Select file', - 'file.pickDirectory': 'Select folder', - - 'sync.title': 'Sync', - 'sync.settings': 'Sync settings', - 'sync.status': 'Status', - 'sync.server': 'Server', - 'sync.device': 'Device', - 'sync.connected': 'Connected', - 'sync.notConnected': 'Not connected', - 'sync.disabled': 'Disabled', - 'sync.status.error': 'Sync error', - 'sync.conflictsCount': 'Conflicts: {count}', - 'sync.applyErrorsCount': 'Apply errors: {count}', - + 'event.caseUpdated': 'Case updated', 'kind.project': 'Project', 'kind.client': 'Client', 'kind.document': 'Document', @@ -100,33 +87,61 @@ export default { 'kind.file': 'File', 'kind.archive': 'Archive', 'kind.case': 'Case', - - 'template.optionNone': 'Empty case', - 'template.optional': 'Template (optional)', - 'template.none.desc': 'No template, simple container node', - 'template.folder': 'Folder', - 'template.folder.desc': 'A folder to group items inside a workspace', - 'template.project': 'Project', - 'template.project.desc': 'A distinct project or task with files, notes and work log', - 'template.client': 'Client', - 'template.client.desc': 'An organization or person for whom work is performed', - 'template.document': 'Document', - 'template.document.desc': 'A document with description, notes and files', - 'template.recipe': 'Recipe', - 'template.recipe.desc': 'A repeatable procedure or instruction', - 'template.note': 'Note', - 'template.file': 'File', - 'template.select': 'Select type', - - 'case.new': 'New case', - 'case.namePlaceholder': 'Case name', - - 'error.generic': 'An error occurred', - 'error.invalidCredentials': 'Invalid username or password', - 'error.vaultNotOpen': 'Vault not open', - - 'worklog.suggestions': 'Suggestions for today', - 'worklog.apply': 'Apply', + 'action.openUrl': 'Open URL', + 'action.openFile': 'Open file', + 'action.openFolder': 'Open folder', + 'action.runCommand': 'Run command', + 'action.runScript': 'Run script', + 'action.openTerminal': 'Open terminal', + 'action.launchApp': 'Launch app', + 'action.addAction': '+ Add action', + 'action.newAction': 'New action', + 'action.noActions': 'No actions yet', + 'action.run': 'Run', + 'action.dataUrl': 'URL', + 'action.dataPath': 'Path', + 'action.dataCommand': 'Command', + 'action.urlPlaceholder': 'https://example.com', + 'action.pathPlaceholder': '/path/to/file', + 'action.commandPlaceholder': 'command', + 'action.namePlaceholder': 'Example: Open website', + 'note.add': '+ Add note', + 'note.new': 'New note', + 'note.title': 'Note title', + 'note.noNotes': 'No notes', + 'note.createFirst': 'Create the first note for this case.', + 'note.placeholder': 'Start writing...', + 'note.unsavedTitle': 'Unsaved changes', + 'note.unsavedMessage': 'Close the editor? All unsaved changes will be lost.', + 'note.unsavedClose': 'Close', + 'file.addFile': '+ Add file', + 'file.addFolder': '+ Add folder', + 'file.newFile': '+ New file', + 'file.addFileSimple': 'Add file', + 'file.addFolderSimple': 'Add folder', + 'file.noFiles': 'No files in this folder yet', + 'file.noFilesCase': 'No files in this project yet', + 'file.hint': 'Add a file or folder to store project materials.', + 'file.root': 'Files', + 'file.preview': 'Preview', + 'file.openExternal': 'Open in external program', + 'file.openFolder': 'Open folder', + 'file.showInExplorer': 'Show in explorer', + 'file.more': 'More', + 'file.delete': 'Delete', + 'file.ariaFolder': 'Folder', + 'file.ariaFile': 'File', + 'file.scanning': 'Scanning...', + 'file.pickSingle': 'Select file', + 'file.pickMultiple': 'Select files', + 'file.pickDirectory': 'Select folder', + 'file.importTitle': 'Add to', + 'file.importFiles': 'Files:', + 'file.importFolders': 'Folders:', + 'file.importSize': 'Size:', + 'file.importCopy': 'Copy', + 'file.importLink': 'Link', + 'file.selectCaseFirst': 'Select a case before adding files', 'worklog.title': 'Work Log', 'worklog.whatDone': 'What was done', 'worklog.minutes': 'Min', @@ -141,15 +156,50 @@ export default { 'worklog.sourceSuggestionNoEvents': 'From suggestion, but related events missing', 'worklog.sourceManual': 'Manual entry', 'worklog.sourceUnknown': 'Unknown source', - - 'common.all': 'All', - 'common.no': 'No', - 'common.open': 'Open', - 'common.date': 'Date', - 'common.search': 'Search', - - 'nav.journal': 'Journal', - + 'worklog.suggestions': 'Suggestions for today', + 'worklog.apply': 'Apply', + 'sync.title': 'Sync', + 'sync.settings': 'Sync settings', + 'sync.status': 'Status', + 'sync.server': 'Server', + 'sync.device': 'Device', + 'sync.deviceId': 'Device ID', + 'sync.unpushed': 'Unpushed', + 'sync.lastSync': 'Last sync', + 'sync.revoked': 'Revoked', + 'sync.connected': 'Connected', + 'sync.notConnected': 'Not connected', + 'sync.disabled': 'Disabled', + 'sync.serverUrl': 'Server URL', + 'sync.serverUrlPlaceholder': 'https://example.com:47732', + 'sync.username': 'Username', + 'sync.usernamePlaceholder': 'username', + 'sync.password': 'Password', + 'sync.passwordPlaceholder': 'password', + 'sync.interval': 'Auto sync (min)', + 'sync.saveInterval': 'Save interval', + 'sync.syncNow': 'Sync now', + 'sync.disconnect': 'Disconnect', + 'sync.connect': 'Connect', + 'sync.test': 'Check', + 'sync.settingsSaved': 'interval saved', + 'today.title': 'Today', + 'today.changedCases': 'Changed today', + 'today.timeline': 'Timeline for today', + 'today.empty': 'Nothing happened today yet', + 'today.emptyHint': 'Cases, notes, files, and actions you worked with today will appear here.', + 'today.plural.case_one': 'case', + 'today.plural.case_few': 'cases', + 'today.plural.case_many': 'cases', + 'today.plural.note_one': 'note', + 'today.plural.note_few': 'notes', + 'today.plural.note_many': 'notes', + 'today.plural.file_one': 'file', + 'today.plural.file_few': 'files', + 'today.plural.file_many': 'files', + 'today.plural.event_one': 'event', + 'today.plural.event_few': 'events', + 'today.plural.event_many': 'events', 'journal.title': 'Work Log', 'journal.empty': 'No entries for the selected period', 'journal.dateFrom': 'From', @@ -177,7 +227,6 @@ export default { 'journal.filterHeading': 'Filters', 'journal.exportHeading': 'Export Report', 'journal.reset': 'Reset', - 'suggest.title': 'Suggestions', 'suggest.apply': 'Log', 'suggest.dismiss': 'Dismiss', @@ -189,4 +238,180 @@ export default { 'suggest.edit': 'Edit', 'suggest.noSuggestions': 'No suggestions', 'suggest.detectedEvents': 'What was detected', + 'activity.title': 'Activity', + 'activity.empty': 'No activity recorded yet', + 'activity.perCaseEmpty': 'No activity recorded yet', + 'overview.type': 'Type', + 'overview.section': 'Section', + 'overview.created': 'Created', + 'overview.newNote': 'New note', + 'overview.addFile': 'Add file', + 'overview.addAction': 'Add action', + 'overview.logTime': 'Log time', + 'overview.recentNotes': 'Recent notes', + 'overview.recentEntries': 'Recent entries', + 'rename.title': 'Rename', + 'rename.emptyError': 'Name cannot be empty', + 'rename.invalidError': 'Invalid name', + 'delete.confirmTitle': 'Delete', + 'delete.confirmMessage': 'Delete', + 'delete.folder': 'folder', + 'delete.file': 'file', + 'template.optionNone': 'Empty case', + 'template.optional': 'Template (optional)', + 'template.none.desc': 'No template, simple container node', + 'template.folder': 'Folder', + 'template.folder.desc': 'A folder to group items inside a workspace', + 'template.project': 'Project', + 'template.project.desc': 'A distinct project or task with files, notes and work log', + 'template.client': 'Client', + 'template.client.desc': 'An organization or person for whom work is performed', + 'template.document': 'Document', + 'template.document.desc': 'A document with description, notes and files', + 'template.recipe': 'Recipe', + 'template.recipe.desc': 'A repeatable procedure or instruction', + 'template.note': 'Note', + 'template.file': 'File', + 'template.select': 'Select type', + 'mime.jpeg': 'JPEG image', + 'mime.png': 'PNG image', + 'mime.gif': 'GIF image', + 'mime.webp': 'WebP image', + 'mime.svg': 'SVG image', + 'mime.bmp': 'BMP image', + 'mime.tiff': 'TIFF image', + 'mime.avif': 'AVIF image', + 'mime.pdf': 'PDF document', + 'mime.word': 'Word document', + 'mime.excel': 'Excel spreadsheet', + 'mime.ppt': 'PowerPoint presentation', + 'mime.zip': 'ZIP archive', + 'mime.gzip': 'GZIP archive', + 'mime.tar': 'TAR archive', + 'mime.sevenz': '7z archive', + 'mime.rar': 'RAR archive', + 'mime.text': 'Text file', + 'mime.html': 'HTML file', + 'mime.css': 'CSS file', + 'mime.js': 'JavaScript file', + 'mime.json': 'JSON file', + 'mime.xml': 'XML file', + 'mime.yaml': 'YAML file', + 'mime.binary': 'Binary file', + 'mime.executable': 'Executable file', + 'mime.folder': 'Folder', + 'mime.unknown': 'Unknown', + 'mime.file': 'File', + 'error.nameEmpty': 'Name cannot be empty', + 'error.nameInvalid': 'Invalid name', + 'error.selectCaseFirst': 'Select a case first', + 'error.vaultNotOpen': 'Vault not open', + 'delete.files': 'files ({count})', + 'file.namePrompt': 'Enter file name:', + 'file.pdfUnavailable': 'PDF preview is unavailable.', + 'file.previewUnavailable': 'Preview is unavailable for this file type.', + 'case.new': 'New case', + 'case.namePlaceholder': 'Case name', + 'settings.title': 'Settings', + 'settings.general': 'General', + 'settings.generalDesc': 'Basic interface settings.', + 'settings.workspace': 'Workspace', + 'settings.workspaceDesc': 'Manage data storage.', + 'settings.appearance': 'Appearance', + 'settings.localization': 'Localization', + 'settings.templates': 'Templates', + 'settings.plugins': 'Plugins', + 'settings.files': 'Files', + 'settings.activity': 'Activity', + 'settings.sync': 'Sync', + 'settings.backup': 'Backups', + 'settings.close': 'Close settings', + 'settings.noPlugins': 'No plugins installed yet.', + 'settings.openPluginsDir': 'Open plugins folder', + 'settings.activityStub': 'Activity tracking settings will be here.', + 'settings.backupStub': 'Backup settings will be here.', + 'settings.theme': 'Interface theme', + 'settings.themeSystem': 'System', + 'settings.themeLight': 'Light', + 'settings.themeDark': 'Dark', + 'settings.language': 'Interface language', + 'settings.langRu': 'Russian', + 'settings.langEn': 'English', + 'settings.langSoon': 'coming soon', + 'settings.save': 'Save settings', + 'settings.saved': 'Settings saved', + 'settings.vaultPath': 'Workspace path', + 'settings.noVaultInfo': 'No workspace information.', + 'settings.vaultInfo': 'Workspace information', + 'settings.openVault': 'Open vault folder', + 'settings.changeVault': 'Change path', + 'settings.checkIntegrity': 'Check integrity', + 'settings.templatesDesc': 'Enable or disable templates for creating items.', + 'settings.templateEnabled': 'Enabled', + 'settings.templateDisabled': 'Disabled', + 'settings.filesStub': 'File storage settings will be here.', + 'settings.syncEnabled': 'Sync enabled', + 'settings.syncDisabled': 'Sync disabled', + 'settings.syncDesc': 'Configure connection to the sync server.', + 'settings.serverUrl': 'Server URL', + 'settings.deviceName': 'Device name', + 'settings.deviceId': 'Device ID', + 'settings.lastSync': 'Last sync', + 'settings.lastError': 'Last error', + 'settings.pendingChanges': 'Pending changes', + 'settings.checkConnection': 'Check connection', + 'settings.syncNow': 'Sync now', + 'settings.reconnect': 'Reconnect', + 'settings.disconnect': 'Disconnect device', + 'settings.resetKey': 'Reset key', + 'settings.confirmDisconnect': 'Are you sure you want to disconnect this device?', + 'settings.confirmDisconnectDesc': 'Sync will stop. Reconnecting will require username and password.', + 'settings.confirmResetKey': 'Reset sync key?', + 'settings.confirmResetKeyDesc': 'The current device key will be removed. Reconnection will be required.', + 'settings.connected': 'Connected', + 'settings.disconnected': 'Disconnected', + 'settings.notConfigured': 'Not configured', + 'settings.error': 'Error', + 'settings.revoked': 'Revoked', + 'settings.status': 'Status', + 'firstrun.title': 'Welcome to Verstak', + 'firstrun.desc': 'Verstak stores data in a local workspace called a vault.', + 'firstrun.pathLabel': 'Vault path', + 'firstrun.defaultPath': 'Default path', + 'firstrun.browse': 'Choose folder', + 'firstrun.create': 'Create workspace', + 'firstrun.quit': 'Quit', + 'firstrun.pathExists': 'The folder exists. A new vault will be created.', + 'firstrun.pathHasVault': 'Existing vault found. It will be connected.', + 'firstrun.pathNew': 'The path does not exist. A new vault will be created.', + 'firstrun.errorNoWrite': 'No write permission for the selected folder.', + 'firstrun.creating': 'Creating workspace...', + 'firstrun.created': 'Workspace created!', + 'recovery.title': 'Workspace not found', + 'recovery.expected': 'Expected path', + 'recovery.choose': 'Choose another vault', + 'recovery.create': 'Create new vault', + 'recovery.settings': 'Open settings', + 'recovery.quit': 'Quit', + 'recovery.createConfirm': 'A new empty workspace will be created. The old path in settings will be replaced.', + 'recovery.createConfirmTitle': 'Create a new workspace?', + 'sync.status.connected': 'Sync available', + 'sync.status.disconnected': 'Server unavailable', + 'sync.status.disabled': 'Sync is not configured', + 'sync.status.syncing': 'Syncing...', + 'sync.status.error': 'Sync error', + 'sync.changes': 'changes', + 'sync.details': 'Details', + 'sync.configure': 'Configure', + 'sync.retry': 'Retry', + 'sync.run': 'Sync', + 'sync.running': 'Syncing...', + 'sync.conflictsCount': 'Conflicts: {count}', + 'sync.applyErrorsCount': 'Apply errors: {count}', + 'error.generic': 'An error occurred', + 'error.invalidCredentials': 'Invalid username or password', + 'error.accountBlocked': 'Account blocked', + 'error.emailNotConfirmed': 'Email not confirmed', + 'error.tokenInvalid': 'Invalid or expired token', + 'error.tokenExpired': 'Token expired', } diff --git a/frontend/src/lib/i18n/locales/ru.js b/frontend/src/lib/i18n/locales/ru.js index d6cb2ba..5134c23 100644 --- a/frontend/src/lib/i18n/locales/ru.js +++ b/frontend/src/lib/i18n/locales/ru.js @@ -326,7 +326,6 @@ export default { 'error.nameInvalid': 'Недопустимое имя', 'error.selectCaseFirst': 'Сначала выберите дело', 'error.vaultNotOpen': 'Хранилище не открыто', - 'common.open': 'Открыть', 'delete.files': 'файлов ({count})', 'file.namePrompt': 'Введите имя файла:', 'file.pdfUnavailable': 'Предпросмотр PDF недоступен.', diff --git a/internal/i18n/locales/en.json b/internal/i18n/locales/en.json index 634f057..140dc43 100644 --- a/internal/i18n/locales/en.json +++ b/internal/i18n/locales/en.json @@ -7,25 +7,21 @@ "nav.recipes": "Recipes", "nav.documents": "Documents", "nav.archive": "Archive", - "nav.journal": "Work Log", "nav.sections": "Sections", "nav.cases": "Cases", "nav.noCases": "No cases", + "nav.journal": "Work Log", "nav.sync": "Sync", "nav.syncSettings": "Sync settings", "nav.syncNow": "Sync now", "nav.selectPrompt": "Select a section or case", "nav.brand": "Verstak", - "nav.createNode": "Create node", - "nav.moveToRoot": "Move to root", - "tab.overview": "Overview", "tab.notes": "Notes", "tab.files": "Files", "tab.actions": "Actions", "tab.worklog": "Work Log", "tab.activity": "Activity", - "common.save": "Save", "common.cancel": "Cancel", "common.delete": "Delete", @@ -38,14 +34,26 @@ "common.error": "Error:", "common.yes": "Yes", "common.ok": "OK", + "common.copy": "Copy", + "common.cut": "Cut", + "common.paste": "Paste", + "common.duplicate": "Duplicate", "common.run": "Run", - "common.name": "Name", + "common.test": "Test", + "common.testAgain": "Check", + "common.connect": "Connect", + "common.disconnect": "Disconnect", "common.settings": "Settings", - + "common.name": "Name", + "common.type": "Type", + "common.section": "Section", + "common.created": "Created", + "common.empty": "None", + "common.newName": "New name", "welcome.title": "Verstak", "welcome.selectSection": "Select a section in the sidebar.", + "welcome.createCase": "Or create a new case with the + button.", "welcome.addCase": "Add case", - "event.noteCreated": "Note created", "event.noteUpdated": "Note updated", "event.fileAdded": "File added", @@ -53,8 +61,17 @@ "event.fileRenamed": "File renamed", "event.fileCopied": "File copied", "event.fileMoved": "File moved", + "event.folderAdded": "Folder added", + "event.folderDeleted": "Folder deleted", + "event.folderRenamed": "Folder renamed", "event.caseCreated": "Case created", - + "event.caseUpdated": "Case updated", + "kind.project": "Project", + "kind.client": "Client", + "kind.document": "Document", + "kind.recipe": "Recipe", + "kind.archive": "Archive", + "kind.case": "Case", "action.openUrl": "Open URL", "action.openFile": "Open file", "action.openFolder": "Open folder", @@ -62,73 +79,304 @@ "action.runScript": "Run script", "action.openTerminal": "Open terminal", "action.launchApp": "Launch app", - + "action.addAction": "+ Add action", + "action.newAction": "New action", + "action.noActions": "No actions yet", + "action.run": "Run", + "action.dataUrl": "URL", + "action.dataPath": "Path", + "action.dataCommand": "Command", + "action.urlPlaceholder": "https://example.com", + "action.pathPlaceholder": "/path/to/file", + "action.commandPlaceholder": "command", + "action.namePlaceholder": "Example: Open website", "note.add": "+ Add note", - "note.noNotes": "No notes", + "note.new": "New note", "note.title": "Note title", + "note.noNotes": "No notes", + "note.createFirst": "Create the first note for this case.", "note.placeholder": "Start writing...", - + "note.unsavedTitle": "Unsaved changes", + "note.unsavedMessage": "Close the editor? All unsaved changes will be lost.", + "note.unsavedClose": "Close", "file.addFile": "+ Add file", "file.addFolder": "+ Add folder", + "file.newFile": "+ New file", + "file.addFileSimple": "Add file", + "file.addFolderSimple": "Add folder", + "file.noFiles": "No files in this folder yet", + "file.noFilesCase": "No files in this project yet", + "file.hint": "Add a file or folder to store project materials.", + "file.root": "Files", "file.preview": "Preview", "file.openExternal": "Open in external program", "file.openFolder": "Open folder", + "file.showInExplorer": "Show in explorer", + "file.more": "More", "file.delete": "Delete", + "file.ariaFolder": "Folder", + "file.ariaFile": "File", + "file.scanning": "Scanning...", "file.pickSingle": "Select file", + "file.pickMultiple": "Select files", "file.pickDirectory": "Select folder", - + "file.importTitle": "Add to", + "file.importFiles": "Files:", + "file.importFolders": "Folders:", + "file.importSize": "Size:", + "file.importCopy": "Copy", + "file.importLink": "Link", + "file.selectCaseFirst": "Select a case before adding files", + "worklog.title": "Work Log", + "worklog.whatDone": "What was done", + "worklog.minutes": "Min", + "worklog.min": "min", + "worklog.log": "Log", + "worklog.empty": "No work entries yet", "sync.title": "Sync", "sync.settings": "Sync settings", "sync.status": "Status", "sync.server": "Server", "sync.device": "Device", + "sync.deviceId": "Device ID", + "sync.unpushed": "Unpushed", + "sync.lastSync": "Last sync", + "sync.revoked": "Revoked", "sync.connected": "Connected", "sync.notConnected": "Not connected", "sync.disabled": "Disabled", - + "sync.serverUrl": "Server URL", + "sync.serverUrlPlaceholder": "https://example.com:47732", + "sync.username": "Username", + "sync.usernamePlaceholder": "username", + "sync.password": "Password", + "sync.passwordPlaceholder": "password", + "sync.autoSync": "Auto sync (min, 0 = disabled)", + "sync.saveInterval": "Save interval", + "sync.syncNow": "Sync now", + "sync.disconnect": "Disconnect", + "sync.connect": "Connect", + "sync.test": "Check", + "sync.settingsSaved": "interval saved", + "today.title": "Today", + "today.changedCases": "Changed today", + "today.timeline": "Timeline for today", + "today.empty": "Nothing happened today yet", + "today.emptyHint": "Cases, notes, files, and actions you worked with today will appear here.", + "today.plural.case_one": "case", + "today.plural.case_few": "cases", + "today.plural.case_many": "cases", + "today.plural.note_one": "note", + "today.plural.note_few": "notes", + "today.plural.note_many": "notes", + "today.plural.file_one": "file", + "today.plural.file_few": "files", + "today.plural.file_many": "files", + "today.plural.event_one": "event", + "today.plural.event_few": "events", + "today.plural.event_many": "events", + "activity.title": "Activity", + "activity.empty": "No activity recorded yet", + "activity.perCaseEmpty": "No activity recorded yet", + "overview.type": "Type", + "overview.section": "Section", + "overview.created": "Created", + "overview.newNote": "New note", + "overview.addFile": "Add file", + "overview.addAction": "Add action", + "overview.logTime": "Log time", + "overview.recentNotes": "Recent notes", + "overview.recentEntries": "Recent entries", + "rename.title": "Rename", + "rename.emptyError": "Name cannot be empty", + "rename.invalidError": "Invalid name", + "delete.confirmTitle": "Delete", + "delete.confirmMessage": "Delete", + "delete.folder": "folder", + "delete.file": "file", + "template.optionNone": "Empty case", + "template.optional": "Template (optional)", + "mime.jpeg": "JPEG image", + "mime.png": "PNG image", + "mime.gif": "GIF image", + "mime.webp": "WebP image", + "mime.svg": "SVG image", + "mime.bmp": "BMP image", + "mime.tiff": "TIFF image", + "mime.avif": "AVIF image", + "mime.pdf": "PDF document", + "mime.word": "Word document", + "mime.excel": "Excel spreadsheet", + "mime.ppt": "PowerPoint presentation", + "mime.zip": "ZIP archive", + "mime.gzip": "GZIP archive", + "mime.tar": "TAR archive", + "mime.sevenz": "7z archive", + "mime.rar": "RAR archive", + "mime.text": "Text file", + "mime.html": "HTML file", + "mime.css": "CSS file", + "mime.js": "JavaScript file", + "mime.json": "JSON file", + "mime.xml": "XML file", + "mime.yaml": "YAML file", + "mime.binary": "Binary file", + "mime.executable": "Executable file", + "mime.folder": "Folder", + "mime.unknown": "Unknown", + "mime.file": "File", + "server.register": "Register", + "server.registerTitle": "Verstak Sync - Register", "server.registerBtn": "Register", + "server.login": "Login", + "server.loginTitle": "Verstak Sync - Login", "server.loginBtn": "Log in", "server.logout": "Log out", "server.username": "Username", + "server.usernameOrEmail": "Username or email", "server.email": "Email", "server.password": "Password", + "server.passwordConfirm": "Confirm password", + "server.passwordHint": "At least 8 characters: Latin letters and digits", + "server.forgotPassword": "Forgot password?", + "server.adminLink": "Administrator?", + "server.alreadyHaveAccount": "Already have an account?", + "server.backToLogin": "← Remembered your password?", + "server.goHome": "Home", + "server.needEmail": "Email is required", + "server.allFieldsRequired": "All fields are required", + "server.passwordsDoNotMatch": "Passwords do not match", + "server.resetPasswordTitle": "Verstak Sync - Password recovery", + "server.resetPassword": "Password recovery", + "server.resetInstruction": "Enter the email used during registration", + "server.sendLink": "Send link", + "server.emailSentTitle": "Verstak Sync - Email sent", + "server.emailSent": "✓ Email sent", + "server.emailSentMessage": "If the email is registered, a password reset link will be sent to it.", + "server.newPasswordTitle": "Verstak Sync - New password", + "server.newPassword": "New password", + "server.passwordChanged": "✓ Password changed", + "server.passwordChangedMessage": "You can now log in with the new password.", "server.save": "Save", + "server.emailConfirmed": "✓ Email confirmed", + "server.emailConfirmedMessage": "Your email has been confirmed. You can now log in.", + "server.registrationSuccess": "✓ Registration successful", + "server.registrationEmailSent": "A confirmation email has been sent to your address.", + "server.registrationCheckEmail": "Follow the link in the email to activate your account.", + "server.registrationAutoSuccess": "✓ Registration successful", + "server.registrationAutoMessage": "You can log in; email confirmation is not required.", "server.back": "← Back", - - "admin.devices": "Devices", + "server.dashboard": "← Dashboard", + "server.users": "Users", + "server.adminPwdHint": "At least 8 characters, Latin letters and digits", + "server.newPasswordResult": "New password: %s\nSend it to the user.", + "admin.login": "Verstak Sync - Admin Login", + "admin.dashboard": "Verstak Sync - Admin", "admin.users": "Users", + "admin.usersHeading": "Users", + "admin.username": "Username", + "admin.email": "Email", + "admin.password": "Password", + "admin.loginBtn": "Log in", + "admin.devices": "Devices", + "admin.deviceCount": "Devices:", + "admin.opsCount": "Operations:", "admin.smtp": "SMTP Settings", + "admin.smtpTitle": "SMTP (for emails)", + "admin.smtpServer": "Server", + "admin.smtpPort": "Port", + "admin.smtpType": "Type", + "admin.smtpNoEncryption": "No encryption", + "admin.smtpUsername": "Username", + "admin.smtpPassword": "Password", + "admin.smtpFrom": "From", + "admin.smtpServerURL": "Server URL", + "admin.smtpSave": "Save SMTP", + "admin.smtpTest": "Test", + "admin.smtpTesting": "Testing...", + "admin.smtpPassed": "✓ Test passed", + "admin.smtpFailed": "Failed", "admin.healthCheck": "Health check", + "admin.healthLoading": "Loading...", + "admin.noDevices": "No devices", + "admin.device": "Device", + "admin.user": "User", + "admin.version": "Version", "admin.status": "Status", "admin.active": "Active", "admin.revoked": "Revoked", - + "admin.lastSeen": "Activity", + "admin.revoke": "Revoke", + "admin.revokeConfirm": "Revoke device?", + "admin.filterPlaceholder": "Filter by username...", + "admin.actions": "Actions", + "admin.confirmed": "Confirmed", + "admin.unconfirmed": "Unconfirmed", + "admin.blocked": "Blocked", + "admin.unblock": "Unblock", + "admin.block": "Block", + "admin.resetPassword": "Password reset", + "admin.resetPasswordConfirm": "Reset password?", + "admin.resetPasswordMessage": "The user will not be able to log in with the old password.", + "admin.resetBtn": "Reset", + "admin.editUser": "Edit user", + "admin.editBtn": "Save", + "admin.deleteUser": "Delete user?", + "admin.deleteUserMessage": "User \"%s\" and all their devices will be deleted.", + "admin.deleteBtn": "Delete", + "admin.resultTitle": "Result", + "admin.confirmTitle": "Confirmation", + "admin.modalCancel": "Cancel", + "admin.modalConfirm": "Yes", + "admin.noUsers": "No users", + "admin.unblockUserTitle": "Unblock user?", + "admin.unblockUserMessage": "The user will be able to log in again.", + "admin.blockUserTitle": "Block user?", + "admin.blockUserMessage": "The user will not be able to log in.", + "admin.unblockBtn": "Unblock", + "admin.blockBtn": "Block", + "userDashboard.title": "Verstak Sync", + "userDashboard.devices": "Devices", + "userDashboard.connectNew": "Connect new device", + "userDashboard.connectNewHint": "Open the Verstak desktop client, go to sync settings, and enter the server URL, username, and password.", + "userDashboard.noDevices": "No connected devices.
Connect a device from the Verstak desktop client.", + "userDashboard.device": "Device", + "userDashboard.status": "Status", + "userDashboard.connected": "Connected", + "userDashboard.lastSeen": "Activity", + "userDashboard.version": "Version", + "userDashboard.active": "Active", + "userDashboard.revoked": "Revoked", + "userDashboard.revoke": "Revoke", + "userDashboard.revokeConfirm": "Revoke device? It will stop syncing.", + "userDashboard.revokePrompt": "Enter your password to confirm:", + "userDashboard.logout": "Log out", + "error.nameEmpty": "Name cannot be empty", + "error.nameInvalid": "Invalid name", + "error.selectCaseFirst": "Select a case first", "error.generic": "An error occurred", "error.invalidCredentials": "Invalid username or password", "error.accountBlocked": "Account blocked", "error.emailNotConfirmed": "Email not confirmed", "error.tokenInvalid": "Invalid or expired token", "error.tokenExpired": "Token expired", - "server.emailConfirmSubject": "Confirm your Verstak Sync account", "server.emailConfirmBody": "Welcome to Verstak Sync!\n\nPlease confirm your email by clicking:\n%s\n\nIf you did not register, ignore this message.", "server.emailResetSubject": "Verstak Sync password reset", "server.emailResetBody": "Reset your Verstak Sync password:\n\n%s\n\nThis link expires in 1 hour.", - "nav.system": "System", "nav.workspace": "Workspace", "nav.noNodes": "No nodes", "nav.openFolder": "Open folder", "nav.createInside": "Create inside", - + "nav.createNode": "Create node", + "nav.moveToRoot": "Move to root", "template.folder": "Folder", "template.project": "Project", "template.client": "Client", "template.document": "Document", "template.recipe": "Recipe", - "common.archive": "Archive", - "migrate.dryRun": "Dry run", "migrate.foldersCreated": "Folders created", "migrate.templatesSet": "Templates set",