feat(i18n): extract untranslated frontend strings

pull/7976/head
Vladislav 3 months ago
parent 249758e3f9
commit 71c45e0c55

@ -60,6 +60,7 @@
"admin.api.revokedHint": "This key has been revoked and can no longer be used.",
"admin.api.subtitle": "Manage keys to access the API",
"admin.api.title": "API Access",
"admin.api.switchStateFailed": "Failed to switch API state.",
"admin.api.toggleStateDisabledSuccess": "API has been disabled successfully.",
"admin.api.toggleStateEnabledSuccess": "API has been enabled successfully.",
"admin.approval.title": "Approvals",
@ -109,12 +110,16 @@
"admin.auth.strategyStateLocked": "and cannot be disabled.",
"admin.auth.subtitle": "Configure the authentication settings of your wiki",
"admin.auth.title": "Authentication",
"admin.auth.deleteStrategy": "Delete Strategy",
"admin.auth.saveFailed": "Failed to save authentication configuration.",
"admin.auth.vendor": "Vendor",
"admin.auth.vendorWebsite": "Website",
"admin.blocks.add": "Add Block",
"admin.blocks.builtin": "Built-in",
"admin.blocks.custom": "Custom",
"admin.blocks.fetchFailed": "Failed to fetch blocks state.",
"admin.blocks.isEnabled": "Enabled",
"admin.blocks.saveFailed": "Failed to save blocks state.",
"admin.blocks.saveSuccess": "Blocks state saved successfully.",
"admin.blocks.subtitle": "Manage dynamic components available for use inside pages.",
"admin.blocks.title": "Content Blocks",
@ -182,6 +187,9 @@
"admin.editors.markdownName": "Markdown Editor",
"admin.editors.redirectDescription": "Create redirections to other pages / external links.",
"admin.editors.redirectName": "Redirection",
"admin.editors.fetchFailed": "Failed to fetch editors state.",
"admin.editors.invalidConfigCall": "Invalid call to config:",
"admin.editors.saveFailed": "Failed to save editors state.",
"admin.editors.saveSuccess": "Editors state saved successfully.",
"admin.editors.subtitle": "Manage editors and their configuration",
"admin.editors.title": "Editors",
@ -209,6 +217,8 @@
"admin.flags.experimental.label": "Experimental Features",
"admin.flags.getTokenHint": "Copy your current authentication token for use in GraphQL API testing.",
"admin.flags.getTokenLabel": "Get Current Token",
"admin.flags.tokenCopyFailed": "Failed to copy current token to clipboard.",
"admin.flags.tokenCopySuccess": "Current token copied to clipboard.",
"admin.flags.saveSuccess": "Flags have been updated successfully.",
"admin.flags.sqlLog.hint": "Log all queries made to the database to console.",
"admin.flags.sqlLog.label": "SQL Query Logging",
@ -251,6 +261,7 @@
"admin.general.displaySiteTitleHint": "Should the site title be displayed next to the logo? If your logo isn't square and contain your brand name, turn this option off.",
"admin.general.favicon": "Favicon",
"admin.general.faviconHint": "Favicon image file, in SVG, PNG, JPG, WEBP or GIF format. Must be a square image.",
"admin.general.faviconUploadFailed": "Failed to upload site favicon.",
"admin.general.faviconUploadSuccess": "Site Favicon uploaded successfully.",
"admin.general.features": "Features",
"admin.general.footerCopyright": "Footer / Copyright",
@ -260,6 +271,7 @@
"admin.general.logo": "Logo",
"admin.general.logoUpl": "Site Logo",
"admin.general.logoUplHint": "Logo image file, in SVG, PNG, JPG, WEBP or GIF format.",
"admin.general.logoUploadFailed": "Failed to upload site logo.",
"admin.general.logoUploadSuccess": "Site logo uploaded successfully.",
"admin.general.pageCasing": "Case Sensitive Paths",
"admin.general.pageCasingHint": "Treat paths with different casing as distinct pages.",
@ -273,6 +285,7 @@
"admin.general.reasonForChangeOff": "Off",
"admin.general.reasonForChangeOptional": "Optional",
"admin.general.reasonForChangeRequired": "Required",
"admin.general.saveFailed": "Failed to save general configuration.",
"admin.general.saveSuccess": "Site configuration saved successfully.",
"admin.general.searchAllowFollow": "Allow Search Engines to Follow Links",
"admin.general.searchAllowFollowHint": "This sets the meta-robots property to follow or nofollow.",
@ -319,8 +332,11 @@
"admin.groups.exportRules": "Export Rules",
"admin.groups.exportRulesNoneError": "This group has no rule to export!",
"admin.groups.filterUsers": "Filter...",
"admin.groups.fetchDetailsFailed": "Failed to fetch group details.",
"admin.groups.fetchUsersFailed": "Failed to fetch group users.",
"admin.groups.general": "General",
"admin.groups.importFailed": "Something went wrong while importing this file. Making sure it is a valid rules JSON file.",
"admin.groups.invalidRulesFormat": "Invalid rules format.",
"admin.groups.importModeAdd": "Add to Existing",
"admin.groups.importModeReplace": "Replace All",
"admin.groups.importModeText": "Do you want to replace all existing rules with these ones or add these rules to the existing ones?",
@ -328,6 +344,7 @@
"admin.groups.importRules": "Import Rules",
"admin.groups.importSuccess": "Rules imported successfully!",
"admin.groups.info": "Group Info",
"admin.groups.newRule": "New Rule",
"admin.groups.name": "Group Name",
"admin.groups.nameHint": "Name of the group",
"admin.groups.overview": "Overview",
@ -338,7 +355,45 @@
"admin.groups.redirectOnLoginHint": "The path / URL where the user will be redirected upon successful login. Leave empty to use the site-defined value.",
"admin.groups.redirectOnLogout": "Redirect on Logout",
"admin.groups.redirectOnLogoutHint": "The path / URL where the user will be redirected upon logout. Leave empty to use the site-defined value.",
"admin.groups.loadFailed": "Failed to load groups state.",
"admin.groups.refreshSuccess": "Groups refreshed successfully.",
"admin.groups.permissions.accessAdminHint": "Can access the administration area.",
"admin.groups.permissions.manageUsersHint": "Can create and manage users, except users with administrative permissions.",
"admin.groups.permissions.manageGroupsHint": "Can create and manage groups, assign permissions, and manage page rules, except manage:system.",
"admin.groups.permissions.manageNavigationHint": "Can manage site navigation.",
"admin.groups.permissions.manageThemeHint": "Can modify site theme settings.",
"admin.groups.permissions.manageSitesHint": "Can create and manage sites.",
"admin.groups.permissions.manageSystemHint": "Can manage and access everything. Root administrator.",
"admin.groups.permissions.readPagesTitle": "Read Pages",
"admin.groups.permissions.readPagesHint": "Can view and search pages.",
"admin.groups.permissions.writePagesTitle": "Write Pages",
"admin.groups.permissions.writePagesHint": "Can create and edit pages.",
"admin.groups.permissions.reviewPagesTitle": "Review Pages",
"admin.groups.permissions.reviewPagesHint": "Can review and approve edits submitted by users.",
"admin.groups.permissions.managePagesTitle": "Manage Pages",
"admin.groups.permissions.managePagesHint": "Can move existing pages to other locations the user has write access to.",
"admin.groups.permissions.deletePagesTitle": "Delete Pages",
"admin.groups.permissions.deletePagesHint": "Can delete existing pages.",
"admin.groups.permissions.useCssTitle": "Use CSS",
"admin.groups.permissions.useCssHint": "Can insert CSS styles in pages.",
"admin.groups.permissions.useJavaScriptTitle": "Use JavaScript",
"admin.groups.permissions.useJavaScriptHint": "Can insert JavaScript in pages.",
"admin.groups.permissions.viewPageSourceTitle": "View Page Source",
"admin.groups.permissions.viewPageSourceHint": "Can view page source.",
"admin.groups.permissions.viewPageHistoryTitle": "View Page History",
"admin.groups.permissions.viewPageHistoryHint": "Can view previous versions of pages.",
"admin.groups.permissions.viewAssetsTitle": "View Assets",
"admin.groups.permissions.viewAssetsHint": "Can view and use assets, such as images and files, in pages.",
"admin.groups.permissions.uploadAssetsTitle": "Upload Assets",
"admin.groups.permissions.uploadAssetsHint": "Can upload new assets, such as images and files.",
"admin.groups.permissions.manageAssetsTitle": "Manage Assets",
"admin.groups.permissions.manageAssetsHint": "Can edit and delete existing assets, such as images and files.",
"admin.groups.permissions.readCommentsTitle": "Read Comments",
"admin.groups.permissions.readCommentsHint": "Can view page comments.",
"admin.groups.permissions.writeCommentsTitle": "Write Comments",
"admin.groups.permissions.writeCommentsHint": "Can post new comments on pages.",
"admin.groups.permissions.manageCommentsTitle": "Manage Comments",
"admin.groups.permissions.manageCommentsHint": "Can edit and delete existing page comments.",
"admin.groups.ruleAllow": "Allow",
"admin.groups.ruleDeny": "Deny",
"admin.groups.ruleForceAllow": "Force Allow",
@ -371,9 +426,11 @@
"admin.instances.activeListeners": "Active Listeners",
"admin.instances.firstSeen": "First Seen",
"admin.instances.lastSeen": "Last Seen",
"admin.instances.loadFailed": "Failed to load instances list.",
"admin.instances.subtitle": "View a list of active instances",
"admin.instances.title": "Instances",
"admin.locale.active": "Active Locales",
"admin.locale.activeHint": "The list of locale packs currently enabled for this site.",
"admin.locale.activeNamespaces": "Active Namespaces",
"admin.locale.autoUpdate.hint": "Automatically download updates to this locale as they become available.",
"admin.locale.autoUpdate.hintWithNS": "Automatically download updates to all namespaced locales enabled below.",
@ -401,11 +458,13 @@
"admin.locale.settings": "Locale Settings",
"admin.locale.sideload": "Sideload Locale Package",
"admin.locale.sideloadHelp": "If you are not connected to the internet or cannot download locale files using the method above, you can instead sideload packages manually by uploading them below.",
"admin.locale.saveSuccess": "Locale settings saved successfully.",
"admin.locale.subtitle": "Set localization options for your wiki",
"admin.locale.title": "Locale",
"admin.logging.title": "Logging",
"admin.login.background": "Background Image",
"admin.login.backgroundHint": "Specify an image to use as the login background. PNG and JPG are supported, 1920x1080 recommended. Leave empty for default.",
"admin.login.bgUploadFailed": "Failed to upload login background image.",
"admin.login.bgUploadSuccess": "Login background image uploaded successfully.",
"admin.login.bypassScreen": "Bypass Login Screen",
"admin.login.bypassScreenHint": "Should the user be redirected automatically to the first authentication provider. Has no effect if the first provider is a username/password provider type.",
@ -418,6 +477,7 @@
"admin.login.logoutRedirectHint": "Optionally redirect the user to a specific page when he/she logouts. This can be overridden at the group level.",
"admin.login.providers": "Login Providers",
"admin.login.providersVisbleWarning": "Note that you can always temporarily show all hidden providers by adding ?all=1 to the url. This is useful to login as local admin while hiding it from normal users.",
"admin.login.saveFailed": "Failed to save login configuration.",
"admin.login.saveSuccess": "Login configuration saved successfully.",
"admin.login.subtitle": "Configure the login user experience of your wiki site",
"admin.login.title": "Login",
@ -435,6 +495,7 @@
"admin.mail.dkimPrivateKeyHint": "Private key for the selector in PEM format",
"admin.mail.dkimUse": "Use DKIM",
"admin.mail.dkimUseHint": "Should DKIM be used when sending emails.",
"admin.mail.fetchConfigFailed": "Failed to fetch mail configuration.",
"admin.mail.saveSuccess": "Configuration saved successfully.",
"admin.mail.sendTestSuccess": "A test email was sent successfully.",
"admin.mail.sender": "Sender",
@ -472,6 +533,7 @@
"admin.metrics.endpoint": "The metrics endpoint can be scraped at {endpoint}",
"admin.metrics.endpointWarning": "Note that this override any page at this path.",
"admin.metrics.refreshSuccess": "Metrics endpoint state has been refreshed.",
"admin.metrics.switchStateFailed": "Failed to switch metrics endpoint state.",
"admin.metrics.subtitle": "Manage the Prometheus metrics endpoint",
"admin.metrics.title": "Metrics",
"admin.metrics.toggleStateDisabledSuccess": "Metrics endpoint disabled successfully.",
@ -506,6 +568,7 @@
"admin.navigation.navType.searchQuery": "Search Query",
"admin.navigation.noItemsText": "Click the Add button to add your first navigation item.",
"admin.navigation.noSelectionText": "Select a navigation item on the left.",
"admin.navigation.refreshSuccess": "Navigation has been refreshed.",
"admin.navigation.saveSuccess": "Navigation saved successfully.",
"admin.navigation.selectPageButton": "Select Page...",
"admin.navigation.sourceLocale": "Source Locale",
@ -517,7 +580,25 @@
"admin.navigation.untitled": "Untitled {kind}",
"admin.navigation.visibilityMode.all": "Visible to everyone",
"admin.navigation.visibilityMode.restricted": "Visible to select groups...",
"admin.pages.locale": "Locale",
"admin.pages.localeAll": "All Locales",
"admin.pages.none": "No pages to display.",
"admin.pages.publishState": "Publish State",
"admin.pages.publishStateAll": "All Publishing States",
"admin.pages.publishStatePublished": "Published",
"admin.pages.publishStateUnpublished": "Not Published",
"admin.pages.recycleBin": "Recycle Bin",
"admin.pages.refreshSuccess": "Page list has been refreshed.",
"admin.pages.searchPlaceholder": "Search Pages...",
"admin.pages.subtitle": "Manage pages",
"admin.pages.title": "Pages",
"admin.pages.visualize": "Visualize",
"admin.pages.visualizeEmpty": "Looks like there's no data yet to graph!",
"admin.pages.visualizeModeHierarchicalRadial": "Hierarchical Radial",
"admin.pages.visualizeModeRelationalRadial": "Relational Radial",
"admin.pages.visualizeModeTree": "Hierarchical Tree",
"admin.pages.visualizeSubtitle": "Dendrogram representation of your pages",
"admin.pages.visualizeTitle": "Visualize Pages",
"admin.rendering.subtitle": "Configure the content rendering pipeline",
"admin.rendering.title": "Rendering",
"admin.scheduler.active": "Active",
@ -535,9 +616,12 @@
"admin.scheduler.failed": "Failed",
"admin.scheduler.failedNone": "There are no recently failed job to display.",
"admin.scheduler.interrupted": "Interrupted",
"admin.scheduler.loadFailed": "Failed to load scheduler jobs.",
"admin.scheduler.pending": "Pending",
"admin.scheduler.result": "Result",
"admin.scheduler.retryJob": "Retry Job",
"admin.scheduler.cancelJobFailed": "Failed to cancel job.",
"admin.scheduler.retryJobFailed": "Failed to retry job.",
"admin.scheduler.retryJobSuccess": "Job has been rescheduled and will execute shortly.",
"admin.scheduler.schedule": "Schedule",
"admin.scheduler.scheduled": "Scheduled",
@ -560,9 +644,12 @@
"admin.search.highlighting": "Enable Term Highlighting",
"admin.search.highlightingHint": "Whether to show the highlighted terms in search results. There is a slight performance impact when enabled.",
"admin.search.indexRebuildSuccess": "Index rebuilt successfully.",
"admin.search.loadFailed": "Failed to load search engine state.",
"admin.search.listRefreshSuccess": "List of search engines has been refreshed.",
"admin.search.rebuildIndex": "Rebuild Index",
"admin.search.rebuildFailed": "Failed to rebuild search index.",
"admin.search.rebuildInitSuccess": "A search index rebuild has been initiated and will start shortly.",
"admin.search.saveFailed": "Failed to save search engine configuration.",
"admin.search.saveSuccess": "Search engine configuration saved successfully",
"admin.search.searchEngine": "Search Engine",
"admin.search.subtitle": "Configure the search capabilities of your wiki",
@ -602,6 +689,7 @@
"admin.security.maxUploadSize": "Max Upload Size",
"admin.security.maxUploadSizeHint": "The maximum size for a single file. Final value in base 2.",
"admin.security.maxUploadSizeSuffix": "bytes",
"admin.security.saveFailed": "Failed to save security configuration.",
"admin.security.saveSuccess": "Security configuration updated successfully.",
"admin.security.scanSVG": "Scan and Sanitize SVG Uploads",
"admin.security.scanSVGHint": "Should SVG uploads be scanned for vulnerabilities and stripped of any potentially unsafe content.",
@ -689,6 +777,7 @@
"admin.storage.contentTypeLargeFilesThreshold": "Size Threshold",
"admin.storage.contentTypeOthers": "Others",
"admin.storage.contentTypeOthersHint": "Any other file types that don't match the other categories.",
"admin.storage.loadFailed": "Failed to load storage targets.",
"admin.storage.contentTypePages": "Pages",
"admin.storage.contentTypePagesHint": "Page content source, in Markdown, HTML or JSON format depending on the editor.",
"admin.storage.contentTypes": "Content Types",
@ -786,6 +875,9 @@
"admin.system.checkUpdate": "Check / Upgrade",
"admin.system.checkingForUpdates": "Checking for Updates...",
"admin.system.client": "Client",
"admin.system.copyInfoFailed": "Failed to copy system info.",
"admin.system.copyInfoSuccess": "System info copied successfully.",
"admin.system.copySystemInfo": "Copy System Info",
"admin.system.clientCookies": "Cookies Support",
"admin.system.clientCookiesHint": "Whether cookies are enabled on this browser.",
"admin.system.clientLanguage": "Primary Language",
@ -883,6 +975,7 @@
"admin.theme.fonts": "Fonts",
"admin.theme.headHtmlInjection": "Head HTML Injection",
"admin.theme.headHtmlInjectionHint": "HTML code to be injected just before the closing head tag. Usually for script tags.",
"admin.theme.fetchFailed": "Failed to fetch theme configuration.",
"admin.theme.headerColor": "Header Color",
"admin.theme.headerColorHint": "The background color for the site top header. Does not apply to the administration area.",
"admin.theme.iconset": "Icon Set",
@ -894,6 +987,7 @@
"admin.theme.reduceMotion": "Reduce Motion",
"admin.theme.reduceMotionHint": "Disable most site animations. This setting is automatically enforced when the reduced motion flag is enabled on the user OS.",
"admin.theme.resetDefaults": "Reset Defaults",
"admin.theme.saveFailed": "Failed to save theme configuration.",
"admin.theme.saveSuccess": "Theme configuration saved successfully!",
"admin.theme.secondaryColor": "Secondary Color",
"admin.theme.secondaryColorHint": "The alternate color for secondary action buttons and for some other elements.",
@ -937,6 +1031,8 @@
"admin.users.dateFormat": "Date Format",
"admin.users.dateFormatHint": "How dates should be formatted when displayed to the user.",
"admin.users.defaults": "Manage User Defaults",
"admin.users.defaultsLoadFailed": "Failed to load user defaults.",
"admin.users.defaultsSaveFailed": "Failed to save user defaults.",
"admin.users.defaultsSaveSuccess": "User defaults saved successfully.",
"admin.users.delete": "Delete User",
"admin.users.deleteConfirmForeignNotice": "Note that you cannot delete a user that already created content. You must instead either deactivate the user or delete all content that was created by that user.",
@ -951,6 +1047,7 @@
"admin.users.emailInvalid": "Email address is invalid.",
"admin.users.emailMissing": "Email address is missing.",
"admin.users.extendedMetadata": "Extended Metadata",
"admin.users.fetchDetailsFailed": "Failed to fetch user details.",
"admin.users.groupAlreadyAssigned": "User is already assigned to this group.",
"admin.users.groupAssign": "Assign",
"admin.users.groupAssignNotice": "Note that you cannot assign users to the Administrators or Guests groups from this panel.",
@ -1054,6 +1151,7 @@
"admin.utilities.contentSubtitle": "Various tools for pages",
"admin.utilities.contentTitle": "Content",
"admin.utilities.disconnectWS": "Disconnect WebSocket Sessions",
"admin.utilities.disconnectWSFailed": "Failed to disconnect WS connections.",
"admin.utilities.disconnectWSHint": "Force all active websocket connections to be closed.",
"admin.utilities.disconnectWSSuccess": "All active websocket connections have been terminated.",
"admin.utilities.export": "Export",
@ -1092,6 +1190,7 @@
"admin.webhooks.deleteConfirmWarn": "This action cannot be undone!",
"admin.webhooks.deleteSuccess": "Webhook deleted successfully.",
"admin.webhooks.edit": "Edit Webhook",
"admin.webhooks.fetchConfigFailed": "Failed to fetch webhook configuration.",
"admin.webhooks.eventCreatePage": "Create a new page",
"admin.webhooks.eventDeleteAsset": "Delete an asset",
"admin.webhooks.eventDeleteComment": "Delete a comment",
@ -1164,6 +1263,7 @@
"auth.errors.passwordTooShort": "Password is too short.",
"auth.errors.passwordsNotMatch": "Passwords do not match.",
"auth.errors.register": "One or more fields are invalid.",
"auth.errors.unexpectedResponse": "Unexpected authentication response.",
"auth.errors.tfaMissing": "Missing or incomplete security code.",
"auth.errors.tooManyAttempts": "Too many attempts!",
"auth.errors.tooManyAttemptsMsg": "You've made too many failed attempts in a short period of time, please try again {time}.",
@ -1178,6 +1278,7 @@
"auth.forgotPasswordLink": "Forgot Password",
"auth.forgotPasswordLoading": "Requesting password reset...",
"auth.forgotPasswordSubtitle": "Enter your email address to receive the instructions to reset your password:",
"auth.forgotPasswordUnavailable": "Forgot password is not implemented yet.",
"auth.forgotPasswordSuccess": "Check your emails for password reset instructions!",
"auth.forgotPasswordTitle": "Forgot your password",
"auth.genericError": "Authentication is unavailable.",
@ -1236,6 +1337,7 @@
"common.actions.discardChanges": "Discard Changes",
"common.actions.download": "Download",
"common.actions.duplicate": "Duplicate",
"common.actions.email": "Email",
"common.actions.edit": "Edit",
"common.actions.exit": "Exit",
"common.actions.fetch": "Fetch",
@ -1244,6 +1346,8 @@
"common.actions.goback": "Go Back",
"common.actions.howItWorks": "How it works",
"common.actions.insert": "Insert",
"common.actions.pick": "Pick...",
"common.actions.viewAll": "View All",
"common.actions.login": "Login",
"common.actions.manage": "Manage",
"common.actions.move": "Move",
@ -1306,6 +1410,7 @@
"common.duration.years": "Year(s)",
"common.error.generic.hint": "Oops, something went wrong...",
"common.error.generic.title": "Unexpected Error",
"common.error.notImplemented": "Not implemented yet.",
"common.error.notfound.hint": "That page doesn't exist or is not available.",
"common.error.notfound.title": "Not Found",
"common.error.title": "Error",
@ -1314,10 +1419,15 @@
"common.error.unexpected": "An unexpected error occurred.",
"common.error.unknownsite.hint": "There's no wiki site at this host.",
"common.error.unknownsite.title": "Unknown Site",
"common.field.basic": "Basic",
"common.field.createdOn": "Created On",
"common.field.created": "Created",
"common.field.id": "ID",
"common.field.json": "JSON",
"common.field.lastUpdated": "Last Updated",
"common.field.name": "Name",
"common.field.none": "None",
"common.field.path": "Path",
"common.field.task": "Task",
"common.field.title": "Title",
"common.footerCopyright": "© {year} {company}. All rights reserved.",
@ -1332,6 +1442,7 @@
"common.header.delete": "Delete",
"common.header.duplicate": "Duplicate",
"common.header.edit": "Edit",
"common.header.editNavigation": "Edit Navigation",
"common.header.history": "History",
"common.header.home": "Home",
"common.header.imagesFiles": "Images & Files",
@ -1343,6 +1454,8 @@
"common.header.newPage": "New Page",
"common.header.pageActions": "Page Actions",
"common.header.profile": "Profile",
"common.header.bookmarks": "Bookmarks",
"common.header.browse": "Browse",
"common.header.search": "Search...",
"common.header.searchClose": "Close",
"common.header.searchCopyLink": "Copy Search Link",
@ -1352,8 +1465,10 @@
"common.header.searchNoResult": "No pages matching your query.",
"common.header.searchResultsCount": "Found {total} results",
"common.header.siteMap": "Site Map",
"common.header.switchLocale": "Switch Locale",
"common.header.view": "View",
"common.header.viewSource": "View Source",
"common.locale.loadFailed": "Failed to load locale strings for {locale}.",
"common.license.alr": "All Rights Reserved",
"common.license.cc0": "Public Domain",
"common.license.ccby": " Creative Commons Attribution License",
@ -1381,10 +1496,14 @@
"common.page.global": "Global",
"common.page.id": "ID {id}",
"common.page.lastEditedBy": "Last edited by",
"common.page.lastModifiedOn": "Last modified on",
"common.page.loading": "Loading Page...",
"common.page.noEditorSpecified": "No editor specified.",
"common.page.print": "Print",
"common.page.printFormat": "Print Format",
"common.page.private": "Private",
"common.page.published": "Published",
"common.page.rate": "Rate this page",
"common.page.returnNormalView": "Return to Normal View",
"common.page.share": "Share",
"common.page.tags": "Tags",
@ -1392,6 +1511,7 @@
"common.page.toc": "Table of Contents",
"common.page.unpublished": "Unpublished",
"common.page.unpublishedWarning": "This page is not published.",
"common.page.watch": "Watch Page",
"common.page.versionId": "Version ID {id}",
"common.page.viewingSource": "Viewing source of page {path}",
"common.page.viewingSourceVersion": "Viewing source as of {date} of page {path}",
@ -1494,7 +1614,16 @@
"editor.markup.header": "Header",
"editor.markup.headerLevel": "Header {level}",
"editor.markup.heading": "Heading {level}",
"editor.markup.increaseHeaderLevel": "Increase Header Level",
"editor.markup.inlineCode": "Inline Code",
"editor.markup.fromClipboard": "From Clipboard...",
"editor.markup.fromFileManager": "From File Manager...",
"editor.markup.fromRemoteURL": "From Remote URL...",
"editor.markup.clipboardError": "Unable to read from clipboard.",
"editor.markup.clipboardReadDenied": "Not allowed to read clipboard.",
"editor.markup.clipboardUnsupported": "No supported content found in the clipboard.",
"editor.markup.fetchConfigFailed": "Failed to fetch markdown editor configuration.",
"editor.markup.fetchUserSettingsFailed": "Failed to fetch markdown editor settings.",
"editor.markup.insertAssets": "Insert Assets",
"editor.markup.insertBlock": "Insert Block",
"editor.markup.insertCodeBlock": "Insert Code Block",
@ -1509,9 +1638,11 @@
"editor.markup.insertVideoAudio": "Insert Video / Audio",
"editor.markup.italic": "Italic",
"editor.markup.keyboardKey": "Keyboard Key",
"editor.markup.markdown": "Markdown",
"editor.markup.markdownFormattingHelp": "Markdown Formatting Help",
"editor.markup.noSelectionError": "Text must be selected first!",
"editor.markup.orderedList": "Ordered List",
"editor.markup.decreaseHeaderLevel": "Decrease Header Level",
"editor.markup.strikethrough": "Strikethrough",
"editor.markup.subscript": "Subscript",
"editor.markup.superscript": "Superscript",
@ -1519,8 +1650,12 @@
"editor.markup.taskList": "Task List",
"editor.markup.taskListChecked": "Checked List Item",
"editor.markup.taskListUnchecked": "Unchecked List Item",
"editor.markup.toggleBold": "Toggle Bold",
"editor.markup.toggleItalic": "Toggle Italic",
"editor.markup.togglePreviewPane": "Hide / Show Preview Pane",
"editor.markup.toggleSpellcheck": "Toggle Spellcheck",
"editor.markup.saveConfigFailed": "Failed to save markdown editor configuration.",
"editor.markup.saveUserSettingsFailed": "Failed to save markdown editor settings.",
"editor.markup.unorderedList": "Unordered List",
"editor.page": "Page",
"editor.pageData.data": "Data",
@ -1548,8 +1683,13 @@
"editor.pageData.templateStructure": "Structure",
"editor.pageData.templateTitle": "Template Title",
"editor.pageData.templateUntitled": "Untitled Template",
"editor.pageData.attributeBoolean": "Attribute Boolean",
"editor.pageData.attributeNumber": "Attribute Number",
"editor.pageData.attributeText": "Attribute Text",
"editor.pageData.title": "Page Data",
"editor.pageData.visual": "Visual",
"editor.pageData.uniqueKey": "Unique Key",
"editor.pageData.yaml": "YAML",
"editor.pageRel.button": "Button Appearance",
"editor.pageRel.caption": "Caption (optional)",
"editor.pageRel.center": "Center",
@ -1671,6 +1811,9 @@
"fileman.epsFileType": "EPS Image",
"fileman.exeFileType": "Windows Executable",
"fileman.flacFileType": "FLAC Audio File",
"fileman.fetchAssetDataFailed": "Failed to fetch asset data.",
"fileman.fetchFolderDataFailed": "Failed to fetch folder data.",
"fileman.fetchingFolderContents": "Fetching folder contents...",
"fileman.folderChildrenCount": "Empty folder | 1 child | {count} children",
"fileman.folderCreate": "New Folder",
"fileman.folderFileName": "Path Name",
@ -1709,7 +1852,12 @@
"fileman.renameAssetSuccess": "Asset renamed successfully",
"fileman.renameFolderInvalidData": "One or more fields are invalid.",
"fileman.renameFolderSuccess": "Folder renamed successfully.",
"fileman.browseUsing": "Browse using...",
"fileman.compactList": "Compact List",
"fileman.copyURLFailed": "Failed to copy URL to clipboard.",
"fileman.loadTreeFailed": "Failed to load folder tree.",
"fileman.searchFolder": "Search folder...",
"fileman.showFolders": "Show Folders",
"fileman.svgFileType": "Scalable Vector Graphic",
"fileman.tarFileType": "TAR Archive",
"fileman.tgzFileType": "Gzipped TAR Archive",
@ -1718,6 +1866,7 @@
"fileman.ttfFileType": "TrueType Font File",
"fileman.txtFileType": "Text Document",
"fileman.unknownFileType": "{type} file",
"fileman.uploadFailed": "Failed to upload file.",
"fileman.uploadSuccess": "File(s) uploaded successfully.",
"fileman.viewOptions": "View Options",
"fileman.wavFileType": "WAV Audio File",
@ -1733,10 +1882,25 @@
"folderDeleteDialog.deleteSuccess": "Folder has been deleted successfully.",
"folderDeleteDialog.folderId": "Folder ID {id}",
"folderDeleteDialog.title": "Confirm Delete Folder",
"headerSearch.operatorExact": "\"foo bar\" matches the exact phrase foo bar.",
"headerSearch.operatorExclude": "!foo or -bar excludes foo and bar.",
"headerSearch.operatorOr": "foo,bar or foo|bar searches for foo OR bar.",
"headerSearch.operatorStartsWith": "bana* matches any term starting with bana, such as banana.",
"headerSearch.operators": "Search Operators",
"headerSearch.placeholder": "Search...",
"headerSearch.popularTags": "Popular Tags",
"headerSearch.pressEnter": "Press Enter",
"history.restore.confirmButton": "Restore",
"history.restore.confirmText": "Are you sure you want to restore this page content as it was on {date}? This version will be copied on top of the current history. As such, newer versions will still be preserved.",
"history.restore.confirmTitle": "Restore page version?",
"history.restore.success": "Page version restored succesfully!",
"iconPicker.docsHint": "Learn how to use icons in the {docsLink}.",
"iconPicker.iconTab": "Icon",
"iconPicker.imageTab": "Image",
"iconPicker.iconName": "Icon Name",
"iconPicker.referenceHint": "View the {referenceLink} for all possible options.",
"iconPicker.referenceLink": "Icon Pack reference",
"iconPicker.useIconsLink": "the documentation",
"navEdit.clearItems": "Clear All Items",
"navEdit.editMenuItems": "Edit Menu Items",
"navEdit.emptyMenuText": "Click the Add button to add your first menu item.",
@ -1746,6 +1910,20 @@
"navEdit.label": "Label",
"navEdit.labelHint": "Text to display on the menu item.",
"navEdit.link": "Link",
"navEdit.mode.hide.hint": "Completely hide the left sidebar navigation.",
"navEdit.mode.hide.label": "Hide",
"navEdit.mode.hideCurrent.hint": "Completely hide the left sidebar navigation only for this path.",
"navEdit.mode.hideCurrent.label": "Hide Current Only",
"navEdit.mode.hideDescendants.hint": "Completely hide the left sidebar navigation for this path and all descendants.",
"navEdit.mode.hideDescendants.label": "Hide Current + Descendants",
"navEdit.mode.inherit.hint": "Use the menu items and settings from the parent path.",
"navEdit.mode.inherit.label": "Inherit",
"navEdit.mode.override.hint": "Set menu items and settings for this path and all descendants.",
"navEdit.mode.override.label": "Override Current + Descendants",
"navEdit.mode.overrideExact.hint": "Set menu items and settings only for this path.",
"navEdit.mode.overrideExact.label": "Override Current Only",
"navEdit.mode.show.hint": "Show the left sidebar navigation menu items.",
"navEdit.mode.show.label": "Show",
"navEdit.nestItem": "Nest Item",
"navEdit.nestingWarn": "The previous menu item must be a normal link or another nested link. Invalid nested items will be shown in red.",
"navEdit.noSelection": "Select a menu item from the left to start editing.",
@ -1767,10 +1945,38 @@
"pageDeleteDialog.deleteSuccess": "Page deleted successfully.",
"pageDeleteDialog.pageId": "Page ID {id}",
"pageDeleteDialog.title": "Confirm Page Deletion",
"page.notify.createFailed": "Failed to create page.",
"page.notify.createHomeFailed": "Failed to create homepage.",
"page.notify.createHomeSuccess": "Homepage created successfully.",
"page.notify.moveSuccess": "Page moved successfully.",
"page.notify.reloadFailed": "Failed to reload page state.",
"page.notify.renameSuccess": "Page renamed successfully.",
"page.notify.reverted": "Page has been reverted to the last saved state.",
"page.notify.saveFailed": "Failed to save page changes.",
"page.notify.saveSuccess": "Page saved successfully.",
"pageActions.convertPage": "Convert Page",
"pageActions.duplicatePage": "Duplicate Page",
"pageActions.noPendingAssetUploads": "There are no assets pending uploads.",
"pageActions.pendingAssetUploads": "Pending Asset Uploads",
"pageActions.pendingAssetUploadsHint": "Assets pasted or dropped onto this page will be kept here until the page is saved.",
"pageActions.renameMovePage": "Rename / Move Page",
"pageActions.viewBacklinks": "View Backlinks",
"pageDuplicateDialog.title": "Duplicate and Save As...",
"pageNewMenu.newApiDocumentation": "New API Documentation",
"pageNewMenu.newAsciiDocPage": "New AsciiDoc Page",
"pageNewMenu.newBlogPage": "New Blog Page",
"pageNewMenu.newDiscussionSpace": "New Discussion Space",
"pageNewMenu.newFolder": "New Folder",
"pageNewMenu.newMarkdownPage": "New Markdown Page",
"pageNewMenu.newPage": "New Page",
"pageNewMenu.newRedirection": "New Redirection",
"pageNewMenu.uploadMediaAsset": "Upload Media Asset",
"pageRenameDialog.title": "Rename / Move to...",
"pageSaveDialog.displayModePath": "Browse Using Paths",
"pageSaveDialog.displayModeTitle": "Browse Using Titles",
"pageSaveDialog.displayOptions": "Display Options",
"pageSaveDialog.loadTreeFailed": "Failed to load folder tree.",
"pageSaveDialog.pathName": "Path Name",
"pageSaveDialog.title": "Save As...",
"profile.accessibility": "Accessibility",
"profile.activity": "Activity",
@ -1866,6 +2072,7 @@
"renderPageDialog.success": "Page rerendered successfully.",
"search.editorAny": "Any editor",
"search.emptyQuery": "Enter a query in the search field above and press Enter.",
"search.failedQuery": "Failed to perform search query.",
"search.filterEditor": "Editor",
"search.filterLocale": "Locale(s)",
"search.filterLocaleDisplay": "Any locale | {n} locale only | {count} locales selected",
@ -1907,5 +2114,8 @@
"welcome.homeDefault.description": "Welcome to my wiki!",
"welcome.homeDefault.title": "Home",
"welcome.subtitle": "Let's get started...",
"welcome.title": "Welcome to Wiki.js!"
"welcome.title": "Welcome to Wiki.js!",
"welcome.usingAsciiDocEditor": "Using the AsciiDoc Editor",
"welcome.usingMarkdownEditor": "Using the Markdown Editor",
"welcome.usingVisualEditor": "Using the Visual Editor"
}

@ -65,7 +65,7 @@ async function applyLocale (locale) {
} catch (err) {
$q.notify({
type: 'negative',
message: `Failed to load ${locale} locale strings.`,
message: i18n.t('common.locale.loadFailed', { locale }),
caption: err.message
})
}

@ -236,7 +236,7 @@ async function create () {
onDialogOK()
})
} else {
throw new Error(resp?.data?.createApiKey?.operation?.message || 'An unexpected error occured.')
throw new Error(resp?.data?.createApiKey?.operation?.message || t('common.error.unexpected'))
}
} catch (err) {
$q.notify({

@ -91,7 +91,7 @@ async function confirm () {
})
onDialogOK()
} else {
throw new Error(resp?.data?.revokeApiKey?.operation?.message || 'An unexpected error occured.')
throw new Error(resp?.data?.revokeApiKey?.operation?.message || t('common.error.unexpected'))
}
} catch (err) {
$q.notify({

@ -96,7 +96,7 @@ async function confirm () {
})
onDialogOK()
} else {
throw new Error(resp?.data?.deleteAsset?.operation?.message || 'An unexpected error occured.')
throw new Error(resp?.data?.deleteAsset?.operation?.message || t('common.error.unexpected'))
}
} catch (err) {
$q.notify({

@ -115,7 +115,7 @@ async function rename () {
})
onDialogOK()
} else {
throw new Error(resp?.data?.renameAsset?.operation?.message || 'An unexpected error occured.')
throw new Error(resp?.data?.renameAsset?.operation?.message || t('common.error.unexpected'))
}
} catch (err) {
$q.notify({
@ -150,7 +150,7 @@ onMounted(async () => {
}
})
if (resp?.data?.assetById?.id !== props.assetId) {
throw new Error('Failed to fetch asset data.')
throw new Error(t('fileman.fetchAssetDataFailed'))
}
state.path = resp.data.assetById.fileName
} catch (err) {

@ -510,7 +510,7 @@ function switchTo (screen) {
break
}
default: {
throw new Error('Invalid Screen')
throw new Error(t('common.error.unexpected'))
}
}
}
@ -576,7 +576,7 @@ async function handleLoginResponse (resp) {
$q.loading.hide()
$q.notify({
type: 'negative',
message: 'Unexpected Authentication Response'
message: t('auth.errors.unexpectedResponse')
})
}
}
@ -705,7 +705,7 @@ async function forgotPassword () {
// TODO: Implement forgot password
$q.notify({
type: 'negative',
message: 'Not implemented yet.'
message: t('auth.forgotPasswordUnavailable')
})
} catch (err) {
$q.notify({

@ -48,7 +48,7 @@ q-dialog(ref='dialogRef', @hide='onDialogHide')
@click='randomizePassword'
)
q-icon(name='las la-dice-d6')
.q-pl-xs.text-caption: strong Generate
.q-pl-xs.text-caption: strong {{ t('common.actions.generate') }}
q-item
blueprint-icon(icon='good-pincode')
q-item-section
@ -235,7 +235,7 @@ async function save () {
})
onDialogOK()
} else {
throw new Error(resp?.data?.changePassword?.operation?.message || 'An unexpected error occured.')
throw new Error(resp?.data?.changePassword?.operation?.message || t('common.error.unexpected'))
}
} catch (err) {
$q.notify({

@ -94,7 +94,7 @@ async function check () {
state.latest = resp.latest
state.latestDate = DateTime.fromISO(resp.latestDate).toFormat(userStore.preferredDateFormat)
} else {
throw new Error(resp?.message || 'An unexpected error occured.')
throw new Error(resp?.message || t('common.error.unexpected'))
}
} catch (err) {
$q.notify({

@ -26,7 +26,7 @@
q-item-section(side)
q-icon(name='las la-folder-open', color='positive')
q-item-section
q-item-label From File Manager...
q-item-label {{ t('editor.markup.fromFileManager') }}
q-item(
clickable
@click='getAssetFromClipboard'
@ -35,7 +35,7 @@
q-item-section(side)
q-icon(name='las la-clipboard', color='brown')
q-item-section
q-item-label From Clipboard...
q-item-label {{ t('editor.markup.fromClipboard') }}
q-item(
clickable
@click='notImplemented'
@ -44,7 +44,7 @@
q-item-section(side)
q-icon(name='las la-cloud-download-alt', color='blue')
q-item-section
q-item-label From Remote URL...
q-item-label {{ t('editor.markup.fromRemoteURL') }}
q-tooltip(anchor='center right' self='center left') {{ t('editor.markup.insertAssets') }}
q-btn(
icon='mdi-code-json'
@ -103,7 +103,7 @@
)
q-tooltip(anchor='center right' self='center left') {{ t('editor.markup.insertHorizontalBar') }}
q-space
span.editor-markdown-type Markdown
span.editor-markdown-type {{ t('editor.markup.markdown') }}
.editor-markdown-mid
//--------------------------------------------------------
//- TOP TOOLBAR
@ -506,7 +506,7 @@ async function getAssetFromClipboard () {
name: 'clipboard-read'
})
if (permission.state === 'denied') {
throw new Error('Not allowed to read clipboard.')
throw new Error(t('editor.markup.clipboardReadDenied'))
}
const clipboardContents = await navigator.clipboard.read()
let hasValidItem = false
@ -522,12 +522,12 @@ async function getAssetFromClipboard () {
}
}
if (!hasValidItem) {
throw new Error('No supported content found in the Clipboard.')
throw new Error(t('editor.markup.clipboardUnsupported'))
}
} catch (err) {
return $q.notify({
type: 'negative',
message: 'Unable to copy from Clipboard',
message: t('editor.markup.clipboardError'),
caption: err.message
})
}
@ -592,7 +592,7 @@ onMounted(async () => {
contextMenuOrder: 0,
id: 'markdown.extension.editing.toggleBold',
keybindings: [monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyB],
label: 'Toggle bold',
label: t('editor.markup.toggleBold'),
precondition: '',
run (ed) {
toggleMarkup({ start: '**' })
@ -604,7 +604,7 @@ onMounted(async () => {
contextMenuOrder: 0,
id: 'markdown.extension.editing.toggleItalic',
keybindings: [monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyI],
label: 'Toggle italic',
label: t('editor.markup.toggleItalic'),
precondition: '',
run (ed) {
toggleMarkup({ start: '*' })
@ -614,7 +614,7 @@ onMounted(async () => {
editor.addAction({
id: 'markdown.extension.editing.increaseHeaderLevel',
keybindings: [monaco.KeyMod.CtrlCmd | monaco.KeyMod.Alt | monaco.KeyCode.RightArrow],
label: 'Increase Header Level',
label: t('editor.markup.increaseHeaderLevel'),
precondition: '',
run (ed) {
let lvl = getHeaderLevel()
@ -625,7 +625,7 @@ onMounted(async () => {
editor.addAction({
id: 'markdown.extension.editing.decreaseHeaderLevel',
keybindings: [monaco.KeyMod.CtrlCmd | monaco.KeyMod.Alt | monaco.KeyCode.LeftArrow],
label: 'Decrease Header Level',
label: t('editor.markup.decreaseHeaderLevel'),
precondition: '',
run (ed) {
let lvl = getHeaderLevel()
@ -637,7 +637,7 @@ onMounted(async () => {
editor.addAction({
id: 'save',
keybindings: [monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyS],
label: 'Save',
label: t('common.actions.save'),
precondition: '',
run (ed) {
}
@ -754,7 +754,7 @@ onBeforeUnmount(() => {
function notImplemented () {
$q.notify({
type: 'negative',
message: 'Not implemented'
message: t('common.error.notImplemented')
})
}
</script>

@ -353,7 +353,7 @@ async function load () {
} catch (err) {
$q.notify({
type: 'negative',
message: 'Failed to fetch markdown editor configuration.'
message: t('editor.markup.fetchConfigFailed')
})
}
$q.loading.hide()
@ -398,12 +398,12 @@ async function save () {
editorStore.$patch({ configIsLoaded: false })
close()
} else {
throw new Error(respRaw?.data?.updateSite?.operation?.message || 'An unexpected error occured.')
throw new Error(respRaw?.data?.updateSite?.operation?.message || t('common.error.unexpected'))
}
} catch (err) {
$q.notify({
type: 'negative',
message: 'Failed to save Markdown editor config',
message: t('editor.markup.saveConfigFailed'),
caption: err.message
})
}

@ -141,7 +141,7 @@ async function load () {
} catch (err) {
$q.notify({
type: 'negative',
message: 'Failed to fetch Markdown editor settings.'
message: t('editor.markup.fetchUserSettingsFailed')
})
}
$q.loading.hide()
@ -179,12 +179,12 @@ async function save () {
})
close()
} else {
throw new Error(respRaw?.data?.saveUserEditorSettings?.operation?.message || 'An unexpected error occured.')
throw new Error(respRaw?.data?.saveUserEditorSettings?.operation?.message || t('common.error.unexpected'))
}
} catch (err) {
$q.notify({
type: 'negative',
message: 'Failed to save Markdown editor settings.',
message: t('editor.markup.saveUserSettingsFailed'),
caption: err.message
})
}

@ -134,7 +134,7 @@ q-layout.fileman(view='hHh lpR lFr', container)
q-item(clickable)
q-item-section(side)
q-icon(name='las la-list', color='grey', size='xs')
q-item-section.q-pr-sm Browse using...
q-item-section.q-pr-sm {{ t('fileman.browseUsing') }}
q-item-section(side)
q-icon(name='las la-angle-right', color='grey', size='xs')
q-menu(
@ -149,7 +149,7 @@ q-layout.fileman(view='hHh lpR lFr', container)
:color='state.displayMode === `path` ? `positive` : `grey`'
size='xs'
)
q-item-section.q-pr-sm Browse Using Paths
q-item-section.q-pr-sm {{ t('pageSaveDialog.displayModePath') }}
q-item(clickable, @click='state.displayMode = `title`')
q-item-section(side)
q-icon(
@ -157,7 +157,7 @@ q-layout.fileman(view='hHh lpR lFr', container)
:color='state.displayMode === `title` ? `positive` : `grey`'
size='xs'
)
q-item-section.q-pr-sm Browse Using Titles
q-item-section.q-pr-sm {{ t('pageSaveDialog.displayModeTitle') }}
q-item(clickable, @click='state.isCompact = !state.isCompact')
q-item-section(side)
q-icon(
@ -165,7 +165,7 @@ q-layout.fileman(view='hHh lpR lFr', container)
:color='state.isCompact ? `positive` : `grey`'
size='xs'
)
q-item-section.q-pr-sm Compact List
q-item-section.q-pr-sm {{ t('fileman.compactList') }}
q-item(clickable, @click='state.shouldShowFolders = !state.shouldShowFolders')
q-item-section(side)
q-icon(
@ -173,7 +173,7 @@ q-layout.fileman(view='hHh lpR lFr', container)
:color='state.shouldShowFolders ? `positive` : `grey`'
size='xs'
)
q-item-section.q-pr-sm Show Folders
q-item-section.q-pr-sm {{ t('fileman.showFolders') }}
q-btn.q-mr-sm(
flat
dense
@ -221,10 +221,10 @@ q-layout.fileman(view='hHh lpR lFr', container)
)
.fileman-loadinglist(v-if='state.fileListLoading')
q-spinner.q-mr-sm(color='primary', size='64px', :thickness='1')
span.text-primary Fetching folder contents...
span.text-primary {{ t('fileman.fetchingFolderContents') }}
.fileman-emptylist(v-else-if='files.length < 1')
img(src='/_assets/icons/carbon-copy-empty-box.svg')
span This folder is empty.
span {{ t('common.pageSelector.folderEmptyWarning') }}
q-list.fileman-filelist(
v-else
:class='state.isCompact && `is-compact`'
@ -689,7 +689,7 @@ async function loadTree ({ parentId = null, parentPath = null, types, initLoad =
} catch (err) {
$q.notify({
type: 'negative',
message: 'Failed to load folder tree.',
message: t('fileman.loadTreeFailed'),
caption: err.message
})
}
@ -900,7 +900,7 @@ async function uploadNewFiles () {
}
})
if (!resp?.data?.uploadAssets?.operation?.succeeded) {
throw new Error(resp?.data?.uploadAssets?.operation?.message || 'An unexpected error occured.')
throw new Error(resp?.data?.uploadAssets?.operation?.message || t('common.error.unexpected'))
}
}
state.uploadPercentage = 100
@ -912,7 +912,7 @@ async function uploadNewFiles () {
} catch (err) {
$q.notify({
type: 'negative',
message: 'Failed to upload file.',
message: t('fileman.uploadFailed'),
caption: err.message
})
}
@ -995,7 +995,7 @@ async function copyItemURL (item) {
} catch (err) {
$q.notify({
type: 'negative',
message: 'Failed to copy URL to clipboard.',
message: t('fileman.copyURLFailed'),
caption: err.message
})
}

@ -177,7 +177,7 @@ async function create () {
})
onDialogOK()
} else {
throw new Error(resp?.data?.createFolder?.operation?.message || 'An unexpected error occured.')
throw new Error(resp?.data?.createFolder?.operation?.message || t('common.error.unexpected'))
}
} catch (err) {
$q.notify({

@ -96,7 +96,7 @@ async function confirm () {
})
onDialogOK()
} else {
throw new Error(resp?.data?.deleteFolder?.operation?.message || 'An unexpected error occured.')
throw new Error(resp?.data?.deleteFolder?.operation?.message || t('common.error.unexpected'))
}
} catch (err) {
$q.notify({

@ -173,7 +173,7 @@ async function rename () {
})
onDialogOK()
} else {
throw new Error(resp?.data?.renameFolder?.operation?.message || 'An unexpected error occured.')
throw new Error(resp?.data?.renameFolder?.operation?.message || t('common.error.unexpected'))
}
} catch (err) {
$q.notify({
@ -210,7 +210,7 @@ onMounted(async () => {
}
})
if (resp?.data?.folderById?.id !== props.folderId) {
throw new Error('Failed to fetch folder data.')
throw new Error(t('fileman.fetchFolderDataFailed'))
}
state.path = resp.data.folderById.fileName
state.title = resp.data.folderById.title

@ -112,7 +112,7 @@ async function create () {
})
onDialogOK()
} else {
throw new Error(resp?.data?.createGroup?.operation?.message || 'An unexpected error occured.')
throw new Error(resp?.data?.createGroup?.operation?.message || t('common.error.unexpected'))
}
} catch (err) {
$q.notify({

@ -84,7 +84,7 @@ async function confirm () {
})
onDialogOK()
} else {
throw new Error(resp?.data?.deleteGroup?.operation?.message || 'An unexpected error occured.')
throw new Error(resp?.data?.deleteGroup?.operation?.message || t('common.error.unexpected'))
}
} catch (err) {
$q.notify({

@ -174,7 +174,7 @@ q-layout(view='hHh lpR fFf', container)
unelevated
color='primary'
icon='las la-plus'
label='New Rule'
:label='t(`admin.groups.newRule`)'
@click='newRule'
)
q-separator
@ -597,49 +597,49 @@ const usersHeaders = [
const permissions = [
{
permission: 'access:admin',
hint: 'Can access the administration area.',
hint: t('admin.groups.permissions.accessAdminHint'),
warning: false,
restrictedForSystem: true,
disabled: false
},
{
permission: 'manage:users',
hint: 'Can create / manage users (but not users with administrative permissions)',
hint: t('admin.groups.permissions.manageUsersHint'),
warning: false,
restrictedForSystem: true,
disabled: false
},
{
permission: 'manage:groups',
hint: 'Can create / manage groups and assign permissions (but not manage:system) / page rules',
hint: t('admin.groups.permissions.manageGroupsHint'),
warning: true,
restrictedForSystem: true,
disabled: false
},
{
permission: 'manage:navigation',
hint: 'Can manage site navigation',
hint: t('admin.groups.permissions.manageNavigationHint'),
warning: false,
restrictedForSystem: true,
disabled: false
},
{
permission: 'manage:theme',
hint: 'Can modify site theme settings',
hint: t('admin.groups.permissions.manageThemeHint'),
warning: false,
restrictedForSystem: true,
disabled: false
},
{
permission: 'manage:sites',
hint: 'Can create / manage sites',
hint: t('admin.groups.permissions.manageSitesHint'),
warning: true,
restrictedForSystem: true,
disabled: false
},
{
permission: 'manage:system',
hint: 'Can manage and access everything. Root administrator.',
hint: t('admin.groups.permissions.manageSystemHint'),
warning: true,
restrictedForSystem: true,
disabled: true
@ -649,120 +649,120 @@ const permissions = [
const rules = [
{
permission: 'read:pages',
title: 'Read Pages',
hint: 'Can view and search pages.',
title: t('admin.groups.permissions.readPagesTitle'),
hint: t('admin.groups.permissions.readPagesHint'),
warning: false,
restrictedForSystem: false,
disabled: false
},
{
permission: 'write:pages',
title: 'Write Pages',
hint: 'Can create and edit pages.',
title: t('admin.groups.permissions.writePagesTitle'),
hint: t('admin.groups.permissions.writePagesHint'),
warning: false,
restrictedForSystem: true,
disabled: false
},
{
permission: 'review:pages',
title: 'Review Pages',
hint: 'Can review and approve edits submitted by users.',
title: t('admin.groups.permissions.reviewPagesTitle'),
hint: t('admin.groups.permissions.reviewPagesHint'),
warning: false,
restrictedForSystem: true,
disabled: false
},
{
permission: 'manage:pages',
title: 'Manage Pages',
hint: 'Can move existing pages to other locations the user has write access to.',
title: t('admin.groups.permissions.managePagesTitle'),
hint: t('admin.groups.permissions.managePagesHint'),
warning: false,
restrictedForSystem: true,
disabled: false
},
{
permission: 'delete:pages',
title: 'Delete Pages',
hint: 'Can delete existing pages.',
title: t('admin.groups.permissions.deletePagesTitle'),
hint: t('admin.groups.permissions.deletePagesHint'),
warning: false,
restrictedForSystem: true,
disabled: false
},
{
permission: 'write:styles',
title: 'Use CSS',
hint: 'Can insert CSS styles in pages.',
title: t('admin.groups.permissions.useCssTitle'),
hint: t('admin.groups.permissions.useCssHint'),
warning: false,
restrictedForSystem: true,
disabled: false
},
{
permission: 'write:scripts',
title: 'Use JavaScript',
hint: 'Can insert JavaScript in pages.',
title: t('admin.groups.permissions.useJavaScriptTitle'),
hint: t('admin.groups.permissions.useJavaScriptHint'),
warning: false,
restrictedForSystem: true,
disabled: false
},
{
permission: 'read:source',
title: 'View Page Source',
hint: 'Can view pages source.',
title: t('admin.groups.permissions.viewPageSourceTitle'),
hint: t('admin.groups.permissions.viewPageSourceHint'),
warning: false,
restrictedForSystem: false,
disabled: false
},
{
permission: 'read:history',
title: 'View Page History',
hint: 'Can view previous versions of pages.',
title: t('admin.groups.permissions.viewPageHistoryTitle'),
hint: t('admin.groups.permissions.viewPageHistoryHint'),
warning: false,
restrictedForSystem: false,
disabled: false
},
{
permission: 'read:assets',
title: 'View Assets',
hint: 'Can view / use assets (such as images and files) in pages.',
title: t('admin.groups.permissions.viewAssetsTitle'),
hint: t('admin.groups.permissions.viewAssetsHint'),
warning: false,
restrictedForSystem: false,
disabled: false
},
{
permission: 'write:assets',
title: 'Upload Assets',
hint: 'Can upload new assets (such as images and files).',
title: t('admin.groups.permissions.uploadAssetsTitle'),
hint: t('admin.groups.permissions.uploadAssetsHint'),
warning: false,
restrictedForSystem: true,
disabled: false
},
{
permission: 'manage:assets',
title: 'Manage Assets',
hint: 'Can edit and delete existing assets (such as images and files).',
title: t('admin.groups.permissions.manageAssetsTitle'),
hint: t('admin.groups.permissions.manageAssetsHint'),
warning: false,
restrictedForSystem: true,
disabled: false
},
{
permission: 'read:comments',
title: 'Read Comments',
hint: 'Can view page comments.',
title: t('admin.groups.permissions.readCommentsTitle'),
hint: t('admin.groups.permissions.readCommentsHint'),
warning: false,
restrictedForSystem: false,
disabled: false
},
{
permission: 'write:comments',
title: 'Write Comments',
hint: 'Can post new comments on pages.',
title: t('admin.groups.permissions.writeCommentsTitle'),
hint: t('admin.groups.permissions.writeCommentsHint'),
warning: false,
restrictedForSystem: false,
disabled: false
},
{
permission: 'manage:comments',
title: 'Manage Comments',
hint: 'Can edit and delete existing page comments.',
title: t('admin.groups.permissions.manageCommentsTitle'),
hint: t('admin.groups.permissions.manageCommentsHint'),
warning: false,
restrictedForSystem: true,
disabled: false
@ -902,7 +902,7 @@ async function fetchGroup () {
state.group = cloneDeep(resp.data.groupById)
state.usersTotal = state.group.userCount ?? 0
} else {
throw new Error('An unexpected error occured while fetching group details.')
throw new Error(t('admin.groups.fetchDetailsFailed'))
}
} catch (err) {
$q.notify({
@ -952,7 +952,7 @@ async function importRules () {
const rulesRaw = await blob.text()
const rules = JSON.parse(rulesRaw)
if (!Array.isArray(rules) || rules.length < 1) {
throw new Error('Invalid Rules Format')
throw new Error(t('admin.groups.invalidRulesFormat'))
}
$q.dialog({
title: t('admin.groups.importModeTitle'),
@ -1040,7 +1040,7 @@ async function refreshUsers () {
state.usersTotal = resp.data.groupById.userCount ?? 0
state.users = cloneDeep(resp.data.groupById.users)
} else {
throw new Error('An unexpected error occured while fetching group users.')
throw new Error(t('admin.groups.fetchUsersFailed'))
}
} catch (err) {
$q.notify({

@ -43,9 +43,9 @@ q-header.bg-header.text-white.site-header(
dense
icon='las la-plus-circle'
color='blue-4'
aria-label='Create New Page'
:aria-label='t(`common.header.newPage`)'
)
q-tooltip Create New Page
q-tooltip {{ t('common.header.newPage') }}
new-menu
q-btn.q-ml-md(
v-if='userStore.can(`browse:fileman`)'
@ -54,10 +54,10 @@ q-header.bg-header.text-white.site-header(
dense
icon='las la-folder-open'
color='positive'
aria-label='File Manager'
:aria-label='t(`fileman.title`)'
@click='openFileManager'
)
q-tooltip File Manager
q-tooltip {{ t('fileman.title') }}
q-btn.q-ml-md(
v-if='userStore.can(`access:admin`)'
flat

@ -12,7 +12,7 @@ q-toolbar(
rounded
ref='searchField'
style='width: 100%;'
label='Search...'
:label='t(`headerSearch.placeholder`)'
@keyup.enter='onSearchEnter'
@focus='state.searchIsFocused = true'
@blur='checkSearchFocus'
@ -37,7 +37,7 @@ q-toolbar(
)
q-badge.q-mr-sm(
v-else-if='siteStore.search && siteStore.search !== siteStore.searchLastQuery'
label='Press Enter'
:label='t(`headerSearch.pressEnter`)'
color='grey-7'
outline
@click='searchField.focus()'
@ -55,11 +55,11 @@ q-toolbar(
)
template(v-if='siteStore.tagsLoaded && siteStore.tags.length > 0')
.searchpanel-header
span Popular Tags
span {{ t('headerSearch.popularTags') }}
q-space
q-btn.acrylic-btn(
flat
label='View All'
:label='t(`common.actions.viewAll`)'
rounded
size='xs'
)
@ -75,11 +75,11 @@ q-toolbar(
clickable
@click='addTag(tag)'
) {{ tag }}
.searchpanel-header Search Operators
.searchpanel-tip #[code !foo] or #[code -bar] to exclude "foo" and "bar".
.searchpanel-tip #[code bana*] for to match any term starting with "bana" (e.g. banana).
.searchpanel-tip #[code foo,bar] or #[code foo|bar] to search for "foo" OR "bar".
.searchpanel-tip #[code "foo bar"] to match exactly the phrase "foo bar".
.searchpanel-header {{ t('headerSearch.operators') }}
.searchpanel-tip {{ t('headerSearch.operatorExclude') }}
.searchpanel-tip {{ t('headerSearch.operatorStartsWith') }}
.searchpanel-tip {{ t('headerSearch.operatorOr') }}
.searchpanel-tip {{ t('headerSearch.operatorExact') }}
</template>
<script setup>

@ -9,12 +9,12 @@ q-card.icon-picker(flat, style='width: 400px')
q-tab(
name='icon'
icon='las la-icons'
label='Icon'
:label='t(`iconPicker.iconTab`)'
)
q-tab(
name='img'
icon='las la-image'
label='Image'
:label='t(`iconPicker.imageTab`)'
)
q-separator
q-tab-panels(
@ -56,7 +56,7 @@ q-card.icon-picker(flat, style='width: 400px')
q-input.q-mt-md(
v-model='state.selIcon'
outlined
label='Icon Name'
:label='t(`iconPicker.iconName`)'
dense
)
.row.q-gutter-md.q-mt-none
@ -72,19 +72,23 @@ q-card.icon-picker(flat, style='width: 400px')
size='64px'
)
.col
.text-caption Learn how to #[a(href='https://docs.requarks.io') use icons].
.text-caption.q-mt-sm View #[a(:href='iconPackRefWebsite', target='_blank') Icon Pack reference] for all possible options.
i18n-t.text-caption(keypath='iconPicker.docsHint' tag='div')
template(#docsLink)
a(href='https://docs.requarks.io', target='_blank', rel='noopener noreferrer') {{ t('iconPicker.useIconsLink') }}
i18n-t.text-caption.q-mt-sm(keypath='iconPicker.referenceHint' tag='div')
template(#referenceLink)
a(:href='iconPackRefWebsite', target='_blank', rel='noopener noreferrer') {{ t('iconPicker.referenceLink') }}
q-tab-panel(name='img')
.row.q-gutter-sm
q-btn.col(
label='Browse...'
:label='t(`common.actions.browse`)'
color='secondary'
icon='las la-file-image'
unelevated
no-caps
)
q-btn.col(
label='Upload...'
:label='t(`common.actions.upload`)'
color='secondary'
icon='las la-upload'
unelevated
@ -105,14 +109,14 @@ q-card.icon-picker(flat, style='width: 400px')
q-space
q-btn(
icon='las la-times'
label='Discard'
:label='t(`common.actions.discard`)'
outline
color='grey-7'
v-close-popup
)
q-btn(
icon='las la-check'
label='Apply'
:label='t(`common.actions.apply`)'
unelevated
color='secondary'
@click='apply'
@ -121,6 +125,7 @@ q-card.icon-picker(flat, style='width: 400px')
</template>
<script setup>
import { useI18n } from 'vue-i18n'
import { find } from 'lodash-es'
import { computed, onMounted, reactive } from 'vue'
@ -137,6 +142,10 @@ const props = defineProps({
const emit = defineEmits(['update:modelValue'])
// I18N
const { t } = useI18n()
// DATA
const state = reactive({

@ -9,45 +9,45 @@ q-card(style='min-width: 350px')
q-item-section(side)
q-radio(v-model='state.mode', val='inherit')
q-item-section
q-item-label Show
q-item-label(caption) Show the left sidebar navigaiton menu items.
q-item-label {{ t('navEdit.mode.show.label') }}
q-item-label(caption) {{ t('navEdit.mode.show.hint') }}
q-item(tag='label')
q-item-section(side)
q-radio(v-model='state.mode', val='hide')
q-item-section
q-item-label Hide
q-item-label(caption) Completely hide the left sidebar navigation.
q-item-label {{ t('navEdit.mode.hide.label') }}
q-item-label(caption) {{ t('navEdit.mode.hide.hint') }}
template(v-else)
q-item(tag='label')
q-item-section(side)
q-radio(v-model='state.mode', val='inherit')
q-item-section
q-item-label Inherit
q-item-label(caption) Use the menu items and settings from the parent path.
q-item-label {{ t('navEdit.mode.inherit.label') }}
q-item-label(caption) {{ t('navEdit.mode.inherit.hint') }}
q-item(tag='label')
q-item-section(side)
q-radio(v-model='state.mode', val='override')
q-item-section
q-item-label Override Current + Descendants
q-item-label(caption) Set menu items and settings for this path and all descendants.
q-item-label {{ t('navEdit.mode.override.label') }}
q-item-label(caption) {{ t('navEdit.mode.override.hint') }}
q-item(tag='label')
q-item-section(side)
q-radio(v-model='state.mode', val='overrideExact')
q-item-section
q-item-label Override Current Only
q-item-label(caption) Set menu items and settings only for this path.
q-item-label {{ t('navEdit.mode.overrideExact.label') }}
q-item-label(caption) {{ t('navEdit.mode.overrideExact.hint') }}
q-item(tag='label')
q-item-section(side)
q-radio(v-model='state.mode', val='hide')
q-item-section
q-item-label Hide Current + Descendants
q-item-label(caption) Completely hide the left sidebar navigation for this path and all descendants.
q-item-label {{ t('navEdit.mode.hideDescendants.label') }}
q-item-label(caption) {{ t('navEdit.mode.hideDescendants.hint') }}
q-item(tag='label')
q-item-section(side)
q-radio(v-model='state.mode', val='hideExact')
q-item-section
q-item-label Hide Current Only
q-item-label(caption) Completely hide the left sidebar navigation only for this path.
q-item-label {{ t('navEdit.mode.hideCurrent.label') }}
q-item-label(caption) {{ t('navEdit.mode.hideCurrent.hint') }}
template(v-if='canEditMenuItems')
q-separator(inset)
@ -190,7 +190,7 @@ async function save () {
props.menuHideHandler()
} else {
throw new Error(resp?.data?.updateNavigation?.operation?.message || 'Unexpected error occured.')
throw new Error(resp?.data?.updateNavigation?.operation?.message || t('common.error.unexpected'))
}
} catch (err) {
$q.notify({

@ -5,26 +5,26 @@
flat
icon='las la-pen-nib'
:color='editorStore.isActive ? `white` : `deep-orange-9`'
aria-label='Page Properties'
:aria-label='t(`editor.props.pageProperties`)'
@click='togglePageProperties'
)
q-tooltip(anchor='center left' self='center right') Page Properties
q-tooltip(anchor='center left' self='center right') {{ t('editor.props.pageProperties') }}
q-btn.q-py-md(
v-if='flagsStore.experimental'
flat
icon='las la-project-diagram'
:color='editorStore.isActive ? `white` : `deep-orange-9`'
aria-label='Page Data'
:aria-label='t(`editor.pageData.title`)'
@click='togglePageData'
disable
)
q-tooltip(anchor='center left' self='center right') Page Data
q-tooltip(anchor='center left' self='center right') {{ t('editor.pageData.title') }}
q-btn.q-py-md(
v-if='editorStore.isActive'
flat
color='white'
:text-color='hasPendingAssets ? `white` : `deep-orange-3`'
aria-label='Pending Asset Uploads'
:aria-label='t(`pageActions.pendingAssetUploads`)'
)
q-icon(name='mdi-image-sync-outline')
q-badge.page-actions-pending-badge(
@ -35,7 +35,7 @@
floating
)
strong {{ editorStore.pendingAssets.length * 1 }}
q-tooltip(anchor='center left' self='center right') Pending Asset Uploads
q-tooltip(anchor='center left' self='center right') {{ t('pageActions.pendingAssetUploads') }}
q-menu(
ref='menuPendingAssets'
anchor='top left'
@ -45,8 +45,8 @@
q-card(style='width: 450px;')
q-card-section.card-header
q-icon(name='img:/_assets/icons/color-data-pending.svg', left, size='sm')
span Pending Asset Uploads
q-card-section(v-if='!hasPendingAssets') There are no assets pending uploads.
span {{ t('pageActions.pendingAssetUploads') }}
q-card-section(v-if='!hasPendingAssets') {{ t('pageActions.noPendingAssetUploads') }}
q-list(v-else, separator)
q-item(
v-for='item of editorStore.pendingAssets'
@ -65,33 +65,33 @@
@click='removePendingAsset(item)'
)
q-card-section.card-actions
em.text-caption Assets that are pasted or dropped onto this page will be held here until the page is saved.
em.text-caption {{ t('pageActions.pendingAssetUploadsHint') }}
q-separator.q-my-sm(inset)
q-btn.q-py-md(
flat
icon='las la-history'
:color='editorStore.isActive ? `white` : `grey`'
aria-label='Page History'
:aria-label='t(`common.header.history`)'
@click='notImplemented'
)
q-tooltip(anchor='center left' self='center right') Page History
q-tooltip(anchor='center left' self='center right') {{ t('common.header.history') }}
q-btn.q-py-md(
flat
icon='las la-code'
:color='editorStore.isActive ? `white` : `grey`'
aria-label='Page Source'
:aria-label='t(`common.header.viewSource`)'
@click='viewPageSource'
)
q-tooltip(anchor='center left' self='center right') Page Source
q-tooltip(anchor='center left' self='center right') {{ t('common.header.viewSource') }}
template(v-if='!(editorStore.isActive && editorStore.mode === `create`)')
q-separator.q-my-sm(inset)
q-btn.q-py-sm(
flat
icon='las la-ellipsis-h'
:color='editorStore.isActive ? `deep-orange-2` : `grey`'
aria-label='Page Actions'
:aria-label='t(`common.header.pageActions`)'
)
q-tooltip(anchor='center left' self='center right') Page Actions
q-tooltip(anchor='center left' self='center right') {{ t('common.header.pageActions') }}
q-menu.translucent-menu(
anchor='top left'
self='top right'
@ -103,17 +103,17 @@
q-item-section.items-center(avatar)
q-icon(color='deep-orange-9', name='las la-atom', size='sm')
q-item-section
q-item-label Convert Page
q-item-label {{ t('pageActions.convertPage') }}
q-item(clickable, v-if='userStore.can(`edit:pages`)', @click='rerenderPage')
q-item-section.items-center(avatar)
q-icon(color='deep-orange-9', name='las la-magic', size='sm')
q-item-section
q-item-label Rerender Page
q-item-label {{ t('common.actions.rerender') }}
q-item(clickable, disabled)
q-item-section.items-center(avatar)
q-icon(color='deep-orange-9', name='las la-sun', size='sm')
q-item-section
q-item-label View Backlinks
q-item-label {{ t('pageActions.viewBacklinks') }}
q-space
template(v-if='!(editorStore.isActive && editorStore.mode === `create`)')
q-btn.q-py-sm(
@ -121,29 +121,29 @@
flat
icon='las la-copy'
:color='editorStore.isActive ? `deep-orange-2` : `grey`'
aria-label='Duplicate Page'
:aria-label='t(`pageActions.duplicatePage`)'
@click='duplicatePage'
)
q-tooltip(anchor='center left' self='center right') Duplicate Page
q-tooltip(anchor='center left' self='center right') {{ t('pageActions.duplicatePage') }}
q-btn.q-py-sm(
v-if='userStore.can(`manage:pages`)'
flat
icon='las la-share'
:color='editorStore.isActive ? `deep-orange-2` : `grey`'
aria-label='Rename / Move Page'
:aria-label='t(`pageActions.renameMovePage`)'
@click='renamePage'
)
q-tooltip(anchor='center left' self='center right') Rename / Move Page
q-tooltip(anchor='center left' self='center right') {{ t('pageActions.renameMovePage') }}
q-btn.q-py-sm(
v-if='userStore.can(`delete:pages`)'
flat
icon='las la-trash'
:color='editorStore.isActive ? `deep-orange-2` : `grey`'
aria-label='Delete Page'
:aria-label='t(`common.page.delete`)'
@click='deletePage'
:class='editorStore.isActive ? `q-pb-md` : ``'
)
q-tooltip(anchor='center left' self='center right') Delete Page
q-tooltip(anchor='center left' self='center right') {{ t('common.page.delete') }}
span.page-actions-mode(v-else) {{ t('common.actions.newPage') }}
</template>
@ -250,13 +250,13 @@ function renamePage () {
await pageStore.pageRename({ id: pageStore.id, title: renamedPageOpts.title })
$q.notify({
type: 'positive',
message: 'Page renamed successfully.'
message: t('page.notify.renameSuccess')
})
} else {
await pageStore.pageMove({ id: pageStore.id, path: renamedPageOpts.path, title: renamedPageOpts.title })
$q.notify({
type: 'positive',
message: 'Page moved successfully.'
message: t('page.notify.moveSuccess')
})
}
} catch (err) {
@ -291,7 +291,7 @@ function removePendingAsset (item) {
function notImplemented () {
$q.notify({
type: 'negative',
message: 'Not implemented'
message: t('common.error.notImplemented')
})
}
</script>

@ -41,11 +41,11 @@ q-card.page-data-dialog(style='width: 750px;')
)
q-tab(
name='visual'
label='Visual'
:label='t(`editor.pageData.visual`)'
)
q-tab(
name='code'
label='YAML'
:label='t(`editor.pageData.yaml`)'
)
q-scroll-area(
:thumb-style='siteStore.thumbStyle'
@ -55,14 +55,14 @@ q-card.page-data-dialog(style='width: 750px;')
q-card-section(v-if='state.mode === `visual`')
.q-gutter-sm
q-input(
label='Attribute Text'
:label='t(`editor.pageData.attributeText`)'
dense
outlined
)
template(v-slot:before)
q-icon(name='las la-font', color='primary')
q-input(
label='Attribute Number'
:label='t(`editor.pageData.attributeNumber`)'
dense
outlined
type='number'
@ -71,7 +71,7 @@ q-card.page-data-dialog(style='width: 750px;')
q-icon(name='las la-infinity', color='primary')
.q-py-xs
q-checkbox(
label='Attribute Boolean'
:label='t(`editor.pageData.attributeBoolean`)'
color='primary'
dense
size='lg'
@ -92,7 +92,7 @@ q-card.page-data-dialog(style='width: 750px;')
<script setup>
import { useI18n } from 'vue-i18n'
import { useQuasar } from 'quasar'
import { nextTick, onMounted, reactive, ref, watch } from 'vue'
import { computed, nextTick, onMounted, reactive, ref, watch } from 'vue'
import PageDataTemplateDialog from './PageDataTemplateDialog.vue'
@ -121,19 +121,19 @@ const state = reactive({
mode: 'visual'
})
const templates = [
const templates = computed(() => ([
{
id: '',
label: 'None',
label: t('common.field.none'),
data: []
},
...siteStore.pageDataTemplates,
{
id: 'basic',
label: 'Basic',
label: t('common.field.basic'),
data: []
}
]
]))
// METHODS

@ -96,7 +96,7 @@ async function confirm () {
})
onDialogOK()
} else {
throw new Error(resp?.data?.deletePage?.operation?.message || 'An unexpected error occured.')
throw new Error(resp?.data?.deletePage?.operation?.message || t('common.error.unexpected'))
}
} catch (err) {
$q.notify({

@ -80,29 +80,29 @@
dense
icon='las la-bell'
color='grey'
aria-label='Watch Page'
:aria-label='t(`common.page.watch`)'
@click='notImplemented'
)
q-tooltip Watch Page
q-tooltip {{ t('common.page.watch') }}
q-btn.q-ml-md(
v-if='userStore.authenticated'
flat
dense
icon='las la-bookmark'
color='grey'
aria-label='Bookmark Page'
:aria-label='t(`common.page.bookmark`)'
@click='notImplemented'
)
q-tooltip Bookmark Page
q-tooltip {{ t('common.page.bookmark') }}
q-btn.q-ml-md(
v-if='siteStore.theme.showSharingMenu'
flat
dense
icon='las la-share-alt'
color='grey'
aria-label='Share'
:aria-label='t(`common.page.share`)'
)
q-tooltip Share
q-tooltip {{ t('common.page.share') }}
social-sharing-menu
q-btn.q-ml-md(
v-if='siteStore.theme.showPrintBtn'
@ -110,10 +110,10 @@
dense
icon='las la-print'
color='grey'
aria-label='Print'
:aria-label='t(`common.page.print`)'
@click='printPage'
)
q-tooltip Print
q-tooltip {{ t('common.page.print') }}
template(v-if='editorStore.isActive')
q-btn.q-ml-md.acrylic-btn(
icon='las la-question-circle'
@ -261,13 +261,13 @@ async function discardChanges () {
if (hadPendingChanges) {
$q.notify({
type: 'positive',
message: 'Page has been reverted to the last saved state.'
message: t('page.notify.reverted')
})
}
} catch (err) {
$q.notify({
type: 'negative',
message: 'Failed to reload page state.'
message: t('page.notify.reloadFailed')
})
}
$q.loading.hide()
@ -298,7 +298,7 @@ async function saveChangesCommit (closeAfter = false) {
await pageStore.pageSave()
$q.notify({
type: 'positive',
message: 'Page saved successfully.'
message: t('page.notify.saveSuccess')
})
if (closeAfter) {
editorStore.$patch({
@ -309,7 +309,7 @@ async function saveChangesCommit (closeAfter = false) {
} catch (err) {
$q.notify({
type: 'negative',
message: 'Failed to save page changes.',
message: t('page.notify.saveFailed'),
caption: err.message
})
}
@ -325,7 +325,7 @@ async function createPage () {
await pageStore.pageSave()
$q.notify({
type: 'positive',
message: 'Homepage created successfully.'
message: t('page.notify.createHomeSuccess')
})
editorStore.$patch({
isActive: false
@ -334,7 +334,7 @@ async function createPage () {
} catch (err) {
$q.notify({
type: 'negative',
message: 'Failed to create homepage.',
message: t('page.notify.createHomeFailed'),
caption: err.message
})
}
@ -363,7 +363,7 @@ async function createPage () {
await pageStore.pageSave()
$q.notify({
type: 'positive',
message: 'Page created successfully.'
message: t('editor.save.createSuccess')
})
editorStore.$patch({
isActive: false
@ -371,7 +371,7 @@ async function createPage () {
} catch (err) {
$q.notify({
type: 'negative',
message: 'Failed to create page.',
message: t('page.notify.createFailed'),
caption: err.message
})
}
@ -403,7 +403,7 @@ function printPage () {
function notImplemented () {
$q.notify({
type: 'negative',
message: 'Not implemented'
message: t('common.error.notImplemented')
})
}
</script>

@ -11,14 +11,14 @@ q-menu.translucent-menu(
v-if='siteStore.editors.wysiwyg && flagsStore.experimental'
)
blueprint-icon(icon='google-presentation')
q-item-section.q-pr-sm New Page
q-item-section.q-pr-sm {{ t('pageNewMenu.newPage') }}
q-item(
clickable
@click='create(`markdown`)'
v-if='siteStore.editors.markdown'
)
blueprint-icon(icon='markdown')
q-item-section.q-pr-sm New Markdown Page
q-item-section.q-pr-sm {{ t('pageNewMenu.newMarkdownPage') }}
template(v-if='flagsStore.experimental')
q-item(
clickable
@ -26,31 +26,31 @@ q-menu.translucent-menu(
v-if='siteStore.editors.asciidoc'
)
blueprint-icon(icon='asciidoc')
q-item-section.q-pr-sm New AsciiDoc Page
q-item-section.q-pr-sm {{ t('pageNewMenu.newAsciiDocPage') }}
q-item(
clickable
@click='create(`channel`)'
)
blueprint-icon(icon='chat')
q-item-section.q-pr-sm New Discussion Space
q-item-section.q-pr-sm {{ t('pageNewMenu.newDiscussionSpace') }}
q-item(
clickable
@click='create(`blog`)'
)
blueprint-icon(icon='typewriter-with-paper')
q-item-section.q-pr-sm New Blog Page
q-item-section.q-pr-sm {{ t('pageNewMenu.newBlogPage') }}
q-item(
clickable
@click='create(`api`)'
)
blueprint-icon(icon='api')
q-item-section.q-pr-sm New API Documentation
q-item-section.q-pr-sm {{ t('pageNewMenu.newApiDocumentation') }}
q-item(
clickable
@click='create(`redirect`)'
)
blueprint-icon(icon='advance')
q-item-section.q-pr-sm New Redirection
q-item-section.q-pr-sm {{ t('pageNewMenu.newRedirection') }}
template(v-if='props.hideAssetBtn === false')
q-separator.q-my-sm(inset)
q-item(
@ -58,7 +58,7 @@ q-menu.translucent-menu(
@click='openFileManager'
)
blueprint-icon(icon='add-image')
q-item-section.q-pr-sm Upload Media Asset
q-item-section.q-pr-sm {{ t('pageNewMenu.uploadMediaAsset') }}
template(v-if='props.showNewFolder')
q-separator.q-my-sm(inset)
q-item(
@ -66,7 +66,7 @@ q-menu.translucent-menu(
@click='newFolder'
)
blueprint-icon(icon='add-folder')
q-item-section.q-pr-sm New Folder
q-item-section.q-pr-sm {{ t('pageNewMenu.newFolder') }}
</template>
<script setup>

@ -2,7 +2,7 @@
q-layout(view='hHh lpR fFf', container)
q-header.card-header.q-px-md.q-py-sm
q-icon(name='img:/_assets/icons/fluent-code.svg', left, size='md')
span Page Source
span {{ t('common.header.viewSource') }}
q-space
transition(name='syncing')
q-spinner-tail.q-mr-sm(

@ -71,7 +71,7 @@ async function rerenderPage () {
})
onDialogOK()
} else {
throw new Error(resp?.data?.rerenderPage?.operation?.message || 'An unexpected error occured.')
throw new Error(resp?.data?.rerenderPage?.operation?.message || t('common.error.unexpected'))
}
} catch (err) {
$q.notify({

@ -124,7 +124,7 @@ async function load () {
state.tfaQRImage = resp.data.setupTFA.tfaQRImage
state.isInit = true
} else {
throw new Error(resp?.data?.setupTFA?.operation?.message || 'An unexpected error occured.')
throw new Error(resp?.data?.setupTFA?.operation?.message || t('common.error.unexpected'))
}
} catch (err) {
$q.notify({

@ -103,7 +103,7 @@ async function confirm () {
})
onDialogOK()
} else {
throw new Error(t(`admin.sites.${resp?.error}`, resp?.message || 'An unexpected error occured.'))
throw new Error(t(`admin.sites.${resp?.error}`, resp?.message || t('common.error.unexpected')))
}
} catch (err) {
$q.notify({

@ -125,7 +125,7 @@ async function create () {
await adminStore.fetchSites()
onDialogOK()
} else {
throw new Error(t(`admin.sites.${resp?.error}`, resp?.message || 'An unexpected error occured.'))
throw new Error(t(`admin.sites.${resp?.error}`, resp?.message || t('common.error.unexpected')))
}
} catch (err) {
$q.notify({

@ -88,7 +88,7 @@ async function confirm () {
})
onDialogOK()
} else {
throw new Error(t(`admin.sites.${resp?.error}`, resp?.message || 'An unexpected error occured.'))
throw new Error(t(`admin.sites.${resp?.error}`, resp?.message || t('common.error.unexpected')))
}
} catch (err) {
$q.notify({

@ -10,11 +10,11 @@ q-menu(
q-item(clickable, ref='copyUrlButton')
q-item-section.items-center(avatar)
q-icon(color='grey', name='las la-clipboard', size='sm')
q-item-section.q-pr-md Copy URL
q-item-section.q-pr-md {{ t('common.actions.copyURL') }}
q-item(clickable, tag='a', :href='`mailto:?subject=` + encodeURIComponent(props.title) + `&body=` + encodeURIComponent(urlFormatted) + `%0D%0A%0D%0A` + encodeURIComponent(props.description)', target='_blank')
q-item-section.items-center(avatar)
q-icon(color='grey', name='las la-envelope', size='sm')
q-item-section.q-pr-md Email
q-item-section.q-pr-md {{ t('common.actions.email') }}
</template>
<script setup>
@ -32,7 +32,7 @@ const props = defineProps({
},
title: {
type: String,
default: 'Untitled Page'
default: ''
},
description: {
type: String,
@ -89,14 +89,14 @@ function menuShown (ev) {
clip.on('success', () => {
$q.notify({
message: 'URL copied successfully',
message: t('common.clipboard.success'),
icon: 'las la-clipboard'
})
})
clip.on('error', () => {
$q.notify({
type: 'negative',
message: 'Failed to copy to clipboard'
message: t('common.clipboard.failure')
})
})
}

@ -49,7 +49,7 @@ q-dialog(ref='dialogRef', @hide='onDialogHide')
q-item-section
q-input(
v-model='state.title'
label='Page Title'
:label='t(`editor.props.title`)'
dense
outlined
autofocus
@ -60,7 +60,7 @@ q-dialog(ref='dialogRef', @hide='onDialogHide')
q-item-section
q-input(
v-model='state.path'
label='Path Name'
:label='t(`pageSaveDialog.pathName`)'
dense
outlined
@focus='state.pathDirty = true; state.currentFileId = null'
@ -74,7 +74,7 @@ q-dialog(ref='dialogRef', @hide='onDialogHide')
padding='xs sm'
flat
)
q-tooltip(anchor='center right' self='center left') Display Options
q-tooltip(anchor='center right' self='center left') {{ t('pageSaveDialog.displayOptions') }}
q-menu(
auto-close
transition-show='jump-down'
@ -367,7 +367,7 @@ async function loadTree ({ parentId = null, parentPath = null, types, initLoad =
} catch (err) {
$q.notify({
type: 'negative',
message: 'Failed to load folder tree.',
message: t('pageSaveDialog.loadTreeFailed'),
caption: err.message
})
}

@ -96,7 +96,7 @@ onMounted(async () => {
}
})
if (!resp?.data?.uploadAssets?.operation?.succeeded) {
throw new Error(resp?.data?.uploadAssets?.operation?.message || 'An unexpected error occured.')
throw new Error(resp?.data?.uploadAssets?.operation?.message || t('common.error.unexpected'))
}
pageStore.content = pageStore.content.replaceAll(item.blobUrl, `/${item.fileName}`)
URL.revokeObjectURL(item.blobUrl)

@ -34,7 +34,7 @@ q-dialog(ref='dialogRef', @hide='onDialogHide')
@click='randomizePassword'
)
q-icon(name='las la-dice-d6')
.q-pl-xs.text-caption: strong Generate
.q-pl-xs.text-caption: strong {{ t('common.actions.generate') }}
q-item(tag='label', v-ripple)
blueprint-icon(icon='password-reset')
q-item-section
@ -206,7 +206,7 @@ async function save () {
mustChangePassword: state.userMustChangePassword
})
} else {
throw new Error(resp?.data?.changeUserPassword?.operation?.message || 'An unexpected error occured.')
throw new Error(resp?.data?.changeUserPassword?.operation?.message || t('common.error.unexpected'))
}
} catch (err) {
$q.notify({

@ -64,7 +64,7 @@ q-dialog(ref='dialogRef', @hide='onDialogHide')
@click='randomizePassword'
)
q-icon(name='las la-dice-d6')
.q-pl-xs.text-caption: strong Generate
.q-pl-xs.text-caption: strong {{ t('common.actions.generate') }}
q-item
blueprint-icon(icon='team')
q-item-section
@ -378,7 +378,7 @@ async function create () {
onDialogOK()
}
} else {
throw new Error(resp?.data?.createUser?.operation?.message || 'An unexpected error occured.')
throw new Error(resp?.data?.createUser?.operation?.message || t('common.error.unexpected'))
}
} catch (err) {
$q.notify({

@ -170,7 +170,7 @@ async function save () {
} catch (err) {
$q.notify({
type: 'negative',
message: 'Failed to save user defaults.',
message: t('admin.users.defaultsSaveFailed'),
caption: err.message
})
}
@ -201,7 +201,7 @@ onMounted(async () => {
} catch (err) {
$q.notify({
type: 'negative',
message: 'Failed to load user defaults',
message: t('admin.users.defaultsLoadFailed'),
caption: err.message
})
}

@ -449,7 +449,7 @@ q-layout(view='hHh lpR fFf', container)
span {{t('admin.users.invalidJSON')}}
q-badge.q-py-xs(
v-else
label='JSON'
:label='t(`common.field.json`)'
color='positive'
)
q-item
@ -676,7 +676,7 @@ async function fetchUser () {
if (resp?.data?.userById) {
state.user = cloneDeep(resp.data.userById)
} else {
throw new Error('An unexpected error occured while fetching user details.')
throw new Error(t('admin.users.fetchDetailsFailed'))
}
} catch (err) {
$q.notify({
@ -786,7 +786,7 @@ async function save (patch, { silent, keepOpen } = { silent: false, keepOpen: fa
close()
}
} else {
throw new Error(resp?.data?.updateUser?.operation?.message || 'An unexpected error occured.')
throw new Error(resp?.data?.updateUser?.operation?.message || t('common.error.unexpected'))
}
} catch (err) {
$q.notify({

@ -93,7 +93,7 @@ async function confirm () {
})
onDialogOK()
} else {
throw new Error(resp?.data?.deleteHook?.operation?.message || 'An unexpected error occured.')
throw new Error(resp?.data?.deleteHook?.operation?.message || t('common.error.unexpected'))
}
} catch (err) {
$q.notify({

@ -308,7 +308,7 @@ async function fetchHook (id) {
if (resp?.data?.hookById) {
state.hook = cloneDeep(resp.data.hookById)
} else {
throw new Error('Failed to fetch webhook configuration.')
throw new Error(t('admin.webhooks.fetchConfigFailed'))
}
} catch (err) {
$q.notify({
@ -363,7 +363,7 @@ async function create () {
})
onDialogOK()
} else {
throw new Error(resp?.data?.createHook?.operation?.message || 'An unexpected error occured.')
throw new Error(resp?.data?.createHook?.operation?.message || t('common.error.unexpected'))
}
} catch (err) {
$q.notify({
@ -418,7 +418,7 @@ async function save () {
})
onDialogOK()
} else {
throw new Error(resp?.data?.updateHook?.operation?.message || 'An unexpected error occured.')
throw new Error(resp?.data?.updateHook?.operation?.message || t('common.error.unexpected'))
}
} catch (err) {
$q.notify({

@ -26,7 +26,7 @@
v-if='flagsStore.experimental && siteStore.editors.wysiwyg'
)
blueprint-icon(icon='google-presentation')
q-item-section.q-pr-sm Using the Visual Editor
q-item-section.q-pr-sm {{ t('welcome.usingVisualEditor') }}
q-item-section(side): q-icon(name='mdi-chevron-right')
q-item(
clickable
@ -34,7 +34,7 @@
v-if='siteStore.editors.markdown'
)
blueprint-icon(icon='markdown')
q-item-section.q-pr-sm Using the Markdown Editor
q-item-section.q-pr-sm {{ t('welcome.usingMarkdownEditor') }}
q-item-section(side): q-icon(name='mdi-chevron-right')
q-item(
clickable
@ -42,7 +42,7 @@
v-if='flagsStore.experimental && siteStore.editors.asciidoc'
)
blueprint-icon(icon='asciidoc')
q-item-section.q-pr-sm Using the AsciiDoc Editor
q-item-section.q-pr-sm {{ t('welcome.usingAsciiDocEditor') }}
q-item-section(side): q-icon(name='mdi-chevron-right')
q-btn(
push

@ -12,33 +12,33 @@ q-layout(view='hHh Lpr lff')
flat
icon='las la-globe'
color='white'
aria-label='Switch Locale'
:aria-label='t(`common.header.switchLocale`)'
)
locale-selector-menu(anchor='top right' self='top left')
q-tooltip(anchor='center right' self='center left') Switch Locale
q-tooltip(anchor='center right' self='center left') {{ t('common.header.switchLocale') }}
q-btn.q-py-md(
flat
icon='las la-sitemap'
color='white'
aria-label='Browse'
:aria-label='t(`common.header.browse`)'
@click='notImplemented'
)
q-tooltip(anchor='center right' self='center left') Browse
q-tooltip(anchor='center right' self='center left') {{ t('common.header.browse') }}
q-separator.q-my-sm(inset, dark)
q-btn.q-py-md(
flat
icon='las la-bookmark'
color='white'
aria-label='Bookmarks'
:aria-label='t(`common.header.bookmarks`)'
@click='notImplemented'
)
q-tooltip(anchor='center right' self='center left') Bookmarks
q-tooltip(anchor='center right' self='center left') {{ t('common.header.bookmarks') }}
q-space
q-btn.q-py-xs(
flat
icon='las la-dharmachakra'
color='white'
aria-label='Edit Nav'
:aria-label='t(`common.header.editNavigation`)'
size='sm'
)
q-menu(
@ -50,7 +50,7 @@ q-layout(view='hHh Lpr lff')
:menu-hide-handler='navEditMenuMini.hide'
:update-position-handler='navEditMenuMini.updatePosition'
)
q-tooltip(anchor='center right' self='center left') Edit Nav
q-tooltip(anchor='center right' self='center left') {{ t('common.header.editNavigation') }}
template(v-else)
.sidebar-actions.flex.items-stretch
q-btn.q-px-sm.col(
@ -71,8 +71,8 @@ q-layout(view='hHh Lpr lff')
icon='las la-sitemap'
color='blue-7'
text-color='custom-color'
label='Browse'
aria-label='Browse'
:label='t(`common.header.browse`)'
:aria-label='t(`common.header.browse`)'
size='sm'
@click='notImplemented'
)
@ -83,7 +83,7 @@ q-layout(view='hHh Lpr lff')
)
q-btn.col(
icon='las la-dharmachakra'
label='Edit Nav'
:label='t(`common.header.editNavigation`)'
flat
)
q-menu(
@ -99,7 +99,7 @@ q-layout(view='hHh Lpr lff')
q-separator(vertical)
q-btn.col(
icon='las la-bookmark'
label='Bookmarks'
:label='t(`common.header.bookmarks`)'
flat
@click='notImplemented'
)
@ -190,7 +190,7 @@ const isSidebarMini = computed(() => {
function notImplemented () {
$q.notify({
type: 'negative',
message: 'Not implemented'
message: t('common.error.notImplemented')
})
}

@ -204,12 +204,12 @@ async function globalSwitch () {
})
await load()
} else {
throw new Error(resp?.data?.setApiState?.operation?.message || 'An unexpected error occurred.')
throw new Error(resp?.data?.setApiState?.operation?.message || t('common.error.unexpected'))
}
} catch (err) {
$q.notify({
type: 'negative',
message: 'Failed to switch API state.',
message: t('admin.api.switchStateFailed'),
caption: err.message
})
}

@ -301,7 +301,7 @@ q-page.admin-mail
flat
color='negative'
:disable='state.strategy.strategy.key === `local`'
label='Delete Strategy'
:label='t(`admin.auth.deleteStrategy`)'
@click='deleteStrategy(state.strategy.id)'
)
</template>
@ -564,7 +564,7 @@ async function save () {
} catch (err) {
$q.notify({
type: 'negative',
message: 'Failed to save site theme config',
message: t('admin.auth.saveFailed'),
caption: err.message
})
}

@ -158,7 +158,7 @@ async function load () {
} catch (err) {
$q.notify({
type: 'negative',
message: 'Failed to fetch blocks state.'
message: t('admin.blocks.fetchFailed')
})
}
$q.loading.hide()
@ -197,12 +197,12 @@ async function save () {
message: t('admin.blocks.saveSuccess')
})
} else {
throw new Error(respRaw?.data?.setBlocksState?.operation?.message || 'An unexpected error occured.')
throw new Error(respRaw?.data?.setBlocksState?.operation?.message || t('common.error.unexpected'))
}
} catch (err) {
$q.notify({
type: 'negative',
message: 'Failed to save site blocks state',
message: t('admin.blocks.saveFailed'),
caption: err.message
})
}

@ -206,7 +206,7 @@ async function load () {
} catch (err) {
$q.notify({
type: 'negative',
message: 'Failed to fetch editors state.'
message: t('admin.editors.fetchFailed')
})
}
$q.loading.hide()
@ -260,12 +260,12 @@ async function save () {
message: t('admin.editors.saveSuccess')
})
} else {
throw new Error(respRaw?.data?.updateSite?.operation?.message || 'An unexpected error occured.')
throw new Error(respRaw?.data?.updateSite?.operation?.message || t('common.error.unexpected'))
}
} catch (err) {
$q.notify({
type: 'negative',
message: 'Failed to save site editors config',
message: t('admin.editors.saveFailed'),
caption: err.message
})
}
@ -288,7 +288,7 @@ function openConfig (editorId) {
default: {
$q.notify({
type: 'negative',
message: 'Invalid Editor Config Call'
message: t('admin.editors.invalidConfigCall')
})
}
}

@ -195,7 +195,7 @@ async function install (ext) {
ext.isInstalled = true
// this.$forceUpdate()
} else {
throw new Error(respRaw.data?.installExtension?.operation?.message || 'An unexpected error occured')
throw new Error(respRaw.data?.installExtension?.operation?.message || t('common.error.unexpected'))
}
} catch (err) {
$q.notify({

@ -214,7 +214,7 @@ async function save () {
message: t('admin.flags.saveSuccess')
})
} else {
throw new Error(resp?.data?.updateSystemFlags?.operation?.message || 'An unexpected error occured.')
throw new Error(resp?.data?.updateSystemFlags?.operation?.message || t('common.error.unexpected'))
}
} catch (err) {
$q.notify({
@ -238,14 +238,14 @@ onMounted(async () => {
clip.on('success', () => {
$q.notify({
type: 'positive',
message: 'Token copied successfully',
message: t('admin.flags.tokenCopySuccess'),
icon: 'las la-clipboard'
})
})
clip.on('error', () => {
$q.notify({
type: 'negative',
message: 'Failed to copy token'
message: t('admin.flags.tokenCopyFailed')
})
})
})

@ -283,7 +283,7 @@ q-page.admin-general
q-item-label(caption) {{t(`admin.general.logoUplHint`)}}
q-item-section.col-auto
q-btn(
label='Upload'
:label='t(`common.actions.upload`)'
unelevated
icon='las la-upload'
color='primary'
@ -331,7 +331,7 @@ q-page.admin-general
q-item-label(caption) {{t(`admin.general.faviconHint`)}}
q-item-section.col-auto
q-btn(
label='Upload'
:label='t(`common.actions.upload`)'
unelevated
icon='las la-upload'
color='primary'
@ -697,7 +697,7 @@ async function save () {
} catch (err) {
$q.notify({
type: 'negative',
message: 'Failed to save site configuration.',
message: t('admin.general.saveFailed'),
caption: err.message
})
}
@ -743,12 +743,12 @@ async function uploadLogo () {
})
state.assetTimestamp = (new Date()).toISOString()
} else {
throw new Error(resp?.data?.uploadSiteLogo?.operation?.message || 'An unexpected error occured.')
throw new Error(resp?.data?.uploadSiteLogo?.operation?.message || t('common.error.unexpected'))
}
} catch (err) {
$q.notify({
type: 'negative',
message: 'Failed to upload site logo.',
message: t('admin.general.logoUploadFailed'),
caption: err.message
})
}
@ -797,12 +797,12 @@ async function uploadFavicon () {
})
state.assetTimestamp = (new Date()).toISOString()
} else {
throw new Error(resp?.data?.uploadSiteFavicon?.operation?.message || 'An unexpected error occured.')
throw new Error(resp?.data?.uploadSiteFavicon?.operation?.message || t('common.error.unexpected'))
}
} catch (err) {
$q.notify({
type: 'negative',
message: 'Failed to upload site favicon.',
message: t('admin.general.faviconUploadFailed'),
caption: err.message
})
}

@ -210,7 +210,7 @@ async function load () {
} catch (err) {
$q.notify({
type: 'negative',
message: 'Failed to load groups.',
message: t('admin.groups.loadFailed'),
caption: err.message
})
}

@ -181,7 +181,7 @@ async function load () {
} catch (err) {
$q.notify({
type: 'negative',
message: 'Failed to load list of instances.',
message: t('admin.instances.loadFailed'),
caption: err.message
})
}

@ -81,7 +81,7 @@ q-page.admin-locale
q-card.q-pb-sm.q-mt-md
q-card-section
.text-subtitle1 {{t('admin.locale.active')}}
.text-caption(:class='$q.dark.isActive ? `text-grey-4` : `text-grey-7`') Select the locales that can be used on this site.
.text-caption(:class='$q.dark.isActive ? `text-grey-4` : `text-grey-7`') {{ t('admin.locale.activeHint') }}
q-item(
v-for='lc of state.locales'
@ -246,7 +246,7 @@ async function save () {
if (resp.succeeded) {
$q.notify({
type: 'positive',
message: 'Locale settings updated successfully.'
message: t('admin.locale.saveSuccess')
})
} else {
$q.notify({

@ -50,7 +50,7 @@ q-page.admin-login
q-item-label(caption) {{t(`admin.login.backgroundHint`)}}
q-item-section.col-auto
q-btn(
label='Upload'
:label='t(`common.actions.upload`)'
unelevated
icon='las la-upload'
color='primary'
@ -309,7 +309,7 @@ async function save () {
} catch (err) {
$q.notify({
type: 'negative',
message: 'Failed to save login configuration.',
message: t('admin.login.saveFailed'),
caption: err.message
})
}
@ -359,12 +359,12 @@ async function uploadBg () {
message: t('admin.login.bgUploadSuccess')
})
} else {
throw new Error(resp?.data?.uploadSiteLoginBg?.operation?.message || 'An unexpected error occured.')
throw new Error(resp?.data?.uploadSiteLoginBg?.operation?.message || t('common.error.unexpected'))
}
} catch (err) {
$q.notify({
type: 'negative',
message: 'Failed to upload login background image.',
message: t('admin.login.bgUploadFailed'),
caption: err.message
})
}

@ -396,14 +396,14 @@ async function load () {
fetchPolicy: 'network-only'
})
if (!resp?.data?.mailConfig) {
throw new Error('Failed to fetch mail config.')
throw new Error(t('admin.mail.fetchConfigFailed'))
}
state.config = cloneDeep(resp.data.mailConfig)
adminStore.info.isMailConfigured = state.config?.host?.length > 2
} catch (err) {
$q.notify({
type: 'negative',
message: 'Failed to fetch mail config',
message: t('admin.mail.fetchConfigFailed'),
caption: err.message
})
}
@ -519,7 +519,7 @@ async function sendTest () {
}
})
if (!resp?.data?.sendMailTest?.operation?.succeeded) {
throw new Error(resp?.data?.sendMailTest?.operation?.message || 'An unexpected error occurred.')
throw new Error(resp?.data?.sendMailTest?.operation?.message || t('common.error.unexpected'))
}
state.testEmail = ''

@ -165,12 +165,12 @@ async function globalSwitch () {
})
await load()
} else {
throw new Error(resp?.data?.setMetricsState?.operation?.message || 'An unexpected error occurred.')
throw new Error(resp?.data?.setMetricsState?.operation?.message || t('common.error.unexpected'))
}
} catch (err) {
$q.notify({
type: 'negative',
message: 'Failed to switch metrics endpoint state.',
message: t('admin.metrics.switchStateFailed'),
caption: err.message
})
}

@ -499,12 +499,12 @@ async function save () {
})
if (resp?.data.navigation.updateTree.responseResult.succeeded && resp?.data.navigation.updateConfig.responseResult.succeeded) {
this.$store.commit('showNotification', {
message: t('navigation.saveSuccess'),
message: t('admin.navigation.saveSuccess'),
style: 'success',
icon: 'check'
})
} else {
throw new Error(resp?.data.navigation.updateTree.operation.message || 'An unexpected error occurred.')
throw new Error(resp?.data.navigation.updateTree.operation.message || t('common.error.unexpected'))
}
} catch (err) {
this.$store.commit('pushGraphError', err)
@ -516,7 +516,7 @@ async function refresh () {
load()
state.current = {}
this.$store.commit('showNotification', {
message: 'Navigation has been refreshed.',
message: t('admin.navigation.refreshSuccess'),
style: 'success',
icon: 'cached'
})

@ -3,19 +3,19 @@
v-layout(row wrap)
v-flex(xs12)
.admin-header
img.animated.fadeInUp(src='/_assets/svg/icon-file.svg', alt='Page', style='width: 80px;')
img.animated.fadeInUp(src='/_assets/svg/icon-file.svg', :alt='$t(`admin.pages.title`)', style='width: 80px;')
.admin-header-title
.headline.blue--text.text--darken-2.animated.fadeInLeft Pages
.subtitle-1.grey--text.animated.fadeInLeft.wait-p2s Manage pages
.headline.blue--text.text--darken-2.animated.fadeInLeft {{ $t('admin.pages.title') }}
.subtitle-1.grey--text.animated.fadeInLeft.wait-p2s {{ $t('admin.pages.subtitle') }}
v-spacer
v-btn.animated.fadeInDown.wait-p1s(icon, color='grey', outlined, @click='refresh')
v-icon.grey--text mdi-refresh
v-btn.animated.fadeInDown.mx-3(color='primary', outlined, @click='recyclebin', disabled)
v-icon(left) mdi-delete-outline
span Recycle Bin
span {{ $t('admin.pages.recycleBin') }}
v-btn.animated.fadeInDown(color='primary', depressed, large, to='pages/visualize')
v-icon(left) mdi-graph
span Visualize
span {{ $t('admin.pages.visualize') }}
v-card.mt-3.animated.fadeInUp
.pa-2.d-flex.align-center(:class='$vuetify.theme.dark ? `grey darken-3-d5` : `grey lighten-3`')
v-text-field(
@ -23,7 +23,7 @@
flat
v-model='search'
prepend-inner-icon='mdi-file-search-outline'
label='Search Pages...'
:label='$t(`admin.pages.searchPlaceholder`)'
hide-details
dense
style='max-width: 400px;'
@ -34,7 +34,7 @@
flat
hide-details
dense
label='Locale'
:label='$t(`admin.pages.locale`)'
:items='langs'
v-model='selectedLang'
style='max-width: 250px;'
@ -44,7 +44,7 @@
flat
hide-details
dense
label='Publish State'
:label='$t(`admin.pages.publishState`)'
:items='states'
v-model='selectedState'
style='max-width: 250px;'
@ -74,7 +74,7 @@
td {{ props.item.createdAt | moment('calendar') }}
td {{ props.item.updatedAt | moment('calendar') }}
template(slot='no-data')
v-alert.ma-3(icon='mdi-alert', :value='true', outlined) No pages to display.
v-alert.ma-3(icon='mdi-alert', :value='true', outlined) {{ $t('admin.pages.none') }}
.text-center.py-2.animated.fadeInDown(v-if='this.pageTotal > 1')
v-pagination(v-model='pagination', :length='pageTotal')
</template>
@ -89,25 +89,22 @@ export default {
selectedPage: {},
pagination: 1,
pages: [],
headers: [
{ text: 'ID', value: 'id', width: 80, sortable: true },
{ text: 'Title', value: 'title' },
{ text: 'Path', value: 'path' },
{ text: 'Created', value: 'createdAt', width: 250 },
{ text: 'Last Updated', value: 'updatedAt', width: 250 }
],
search: '',
selectedLang: null,
selectedState: null,
states: [
{ text: 'All Publishing States', value: null },
{ text: 'Published', value: true },
{ text: 'Not Published', value: false }
],
loading: false
}
},
computed: {
headers () {
return [
{ text: this.$t('common.field.id'), value: 'id', width: 80, sortable: true },
{ text: this.$t('common.field.title'), value: 'title' },
{ text: this.$t('common.field.path'), value: 'path' },
{ text: this.$t('common.field.created'), value: 'createdAt', width: 250 },
{ text: this.$t('common.field.lastUpdated'), value: 'updatedAt', width: 250 }
]
},
pageTotal () {
return Math.ceil(this.filteredPages.length / 15)
},
@ -122,9 +119,16 @@ export default {
return true
})
},
states () {
return [
{ text: this.$t('admin.pages.publishStateAll'), value: null },
{ text: this.$t('admin.pages.publishStatePublished'), value: true },
{ text: this.$t('admin.pages.publishStateUnpublished'), value: false }
]
},
langs () {
return _.concat({
text: 'All Locales',
text: this.$t('admin.pages.localeAll'),
value: null
}, _.uniqBy(this.pages, 'locale').map(pg => ({
text: pg.locale,
@ -136,7 +140,7 @@ export default {
async refresh() {
await this.$apollo.queries.pages.refetch()
this.$store.commit('showNotification', {
message: 'Page list has been refreshed.',
message: this.$t('admin.pages.refreshSuccess'),
style: 'success',
icon: 'cached'
})

@ -3,10 +3,10 @@
v-layout(row wrap)
v-flex(xs12)
.admin-header
img.animated.fadeInUp(src='/_assets/svg/icon-venn-diagram.svg', alt='Visualize Pages', style='width: 80px;')
img.animated.fadeInUp(src='/_assets/svg/icon-venn-diagram.svg', :alt='$t(`admin.pages.visualizeTitle`)', style='width: 80px;')
.admin-header-title
.headline.blue--text.text--darken-2.animated.fadeInLeft Visualize Pages
.subtitle-1.grey--text.animated.fadeInLeft.wait-p2s Dendrogram representation of your pages
.headline.blue--text.text--darken-2.animated.fadeInLeft {{ $t('admin.pages.visualizeTitle') }}
.subtitle-1.grey--text.animated.fadeInLeft.wait-p2s {{ $t('admin.pages.visualizeSubtitle') }}
v-spacer
v-select.mx-5.animated.fadeInDown.wait-p1s(
v-if='locales.length > 0'
@ -22,15 +22,15 @@
v-btn-toggle.animated.fadeInDown(v-model='graphMode', color='primary', dense, rounded)
v-btn.px-5(value='htree')
v-icon(left, :color='graphMode === `htree` ? `primary` : `grey darken-3`') mdi-sitemap
span.text-none Hierarchical Tree
span.text-none {{ $t('admin.pages.visualizeModeTree') }}
v-btn.px-5(value='hradial')
v-icon(left, :color='graphMode === `hradial` ? `primary` : `grey darken-3`') mdi-chart-donut-variant
span.text-none Hierarchical Radial
span.text-none {{ $t('admin.pages.visualizeModeHierarchicalRadial') }}
v-btn.px-5(value='rradial')
v-icon(left, :color='graphMode === `rradial` ? `primary` : `grey darken-3`') mdi-blur-radial
span.text-none Relational Radial
span.text-none {{ $t('admin.pages.visualizeModeRelationalRadial') }}
.admin-pages-visualize-svg(ref='svgContainer', v-show='pages.length >= 1')
v-alert(v-if='pages.length < 1', outlined, type='warning', style='max-width: 650px; margin: 0 auto;') Looks like there's no data yet to graph!
v-alert(v-if='pages.length < 1', outlined, type='warning', style='max-width: 650px; margin: 0 auto;') {{ $t('admin.pages.visualizeEmpty') }}
</template>
<script>

@ -555,7 +555,7 @@ async function load () {
} catch (err) {
$q.notify({
type: 'negative',
message: 'Failed to load scheduled jobs.',
message: t('admin.scheduler.loadFailed'),
caption: err.message
})
}
@ -587,12 +587,12 @@ async function cancelJob (jobId) {
message: t('admin.scheduler.cancelJobSuccess')
})
} else {
throw new Error(resp?.data?.cancelJob?.operation?.message || 'An unexpected error occured.')
throw new Error(resp?.data?.cancelJob?.operation?.message || t('common.error.unexpected'))
}
} catch (err) {
$q.notify({
type: 'negative',
message: 'Failed to cancel job.',
message: t('admin.scheduler.cancelJobFailed'),
caption: err.message
})
}
@ -624,12 +624,12 @@ async function retryJob (jobId) {
message: t('admin.scheduler.retryJobSuccess')
})
} else {
throw new Error(resp?.data?.retryJob?.operation?.message || 'An unexpected error occured.')
throw new Error(resp?.data?.retryJob?.operation?.message || t('common.error.unexpected'))
}
} catch (err) {
$q.notify({
type: 'negative',
message: 'Failed to retry the job.',
message: t('admin.scheduler.retryJobFailed'),
caption: err.message
})
}

@ -143,7 +143,7 @@ async function load () {
} catch (err) {
$q.notify({
type: 'negative',
message: 'Failed to load search config',
message: t('admin.search.loadFailed'),
caption: err.message
})
}
@ -186,7 +186,7 @@ async function save () {
} catch (err) {
$q.notify({
type: 'negative',
message: 'Failed to save search config',
message: t('admin.search.saveFailed'),
caption: err.message
})
}
@ -221,7 +221,7 @@ async function rebuild () {
} catch (err) {
$q.notify({
type: 'negative',
message: 'Failed to initiate a search index rebuild',
message: t('admin.search.rebuildFailed'),
caption: err.message
})
}

@ -505,7 +505,7 @@ async function save () {
} catch (err) {
$q.notify({
type: 'negative',
message: 'Failed to save security config',
message: t('admin.security.saveFailed'),
caption: err.message
})
}

@ -803,7 +803,7 @@ async function load () {
} catch (err) {
$q.notify({
type: 'negative',
message: 'Failed to load storage configuration.',
message: t('admin.storage.loadFailed'),
caption: err.message,
timeout: 20000
})
@ -870,7 +870,7 @@ async function save ({ silent }) {
})
}
} else {
throw new Error(resp?.data?.updateStorageTargets?.operation?.message || 'Unexpected error')
throw new Error(resp?.data?.updateStorageTargets?.operation?.message || t('common.error.unexpected'))
}
} catch (err) {
$q.notify({
@ -991,7 +991,7 @@ async function setupDestroy () {
})
}, 2000)
} else {
throw new Error(resp?.data?.destroyStorageTargetSetup?.operation?.message || 'Unexpected error')
throw new Error(resp?.data?.destroyStorageTargetSetup?.operation?.message || t('common.error.unexpected'))
}
} catch (err) {
$q.notify({
@ -1137,7 +1137,7 @@ async function setupGitHubStep (step, code) {
}
}
} else {
throw new Error(resp?.data?.setupStorageTarget?.operation?.message || 'Unexpected error')
throw new Error(resp?.data?.setupStorageTarget?.operation?.message || t('common.error.unexpected'))
}
} catch (err) {
$q.loading.hide()

@ -30,7 +30,7 @@ q-page.admin-system
ref='copySysInfoBtn'
flat
icon='mdi-clipboard-text-outline'
label='Copy System Info'
:label='t(`admin.system.copySystemInfo`)'
color='primary'
:disabled='state.loading > 0'
)
@ -324,14 +324,14 @@ Total RAM: ${state.info.ramTotal}`
clip.on('success', () => {
$q.notify({
type: 'positive',
message: 'Info copied successfully',
message: t('admin.system.copyInfoSuccess'),
icon: 'las la-clipboard'
})
})
clip.on('error', () => {
$q.notify({
type: 'negative',
message: 'Failed to copy system info'
message: t('admin.system.copyInfoFailed')
})
})
})

@ -153,7 +153,7 @@ export default {
})
this.refresh()
} else {
throw new Error(_.get(resp, 'data.pages.deleteTag.responseResult.message', 'An unexpected error occurred.'))
throw new Error(_.get(resp, 'data.pages.deleteTag.responseResult.message', this.$t('common.error.unexpected')))
}
} catch (err) {
this.$store.commit('pushGraphError', err)
@ -193,7 +193,7 @@ export default {
})
this.current.updatedAt = new Date()
} else {
throw new Error(_.get(resp, 'data.pages.updateTag.responseResult.message', 'An unexpected error occurred.'))
throw new Error(_.get(resp, 'data.pages.updateTag.responseResult.message', this.$t('common.error.unexpected')))
}
} catch (err) {
this.$store.commit('pushGraphError', err)

@ -85,7 +85,7 @@ q-page.admin-theme
text-color='white'
)
q-icon(name='las la-fill', size='xs', left)
span Pick...
span {{ t('common.actions.pick') }}
q-menu
q-color(
v-model='state.config[`color` + startCase(cl)]'
@ -705,13 +705,13 @@ async function load () {
fetchPolicy: 'network-only'
})
if (!resp?.data?.siteById?.theme) {
throw new Error('Failed to fetch theme config.')
throw new Error(t('admin.theme.fetchFailed'))
}
state.config = cloneDeep(resp.data.siteById.theme)
} catch (err) {
$q.notify({
type: 'negative',
message: 'Failed to fetch site theme config'
message: t('admin.theme.fetchFailed')
})
}
$q.loading.hide()
@ -777,12 +777,12 @@ async function save () {
message: t('admin.theme.saveSuccess')
})
} else {
throw new Error(respRaw?.data?.updateSite?.operation?.message || 'An unexpected error occured.')
throw new Error(respRaw?.data?.updateSite?.operation?.message || t('common.error.unexpected'))
}
} catch (err) {
$q.notify({
type: 'negative',
message: 'Failed to save site theme config',
message: t('admin.theme.saveFailed'),
caption: err.message
})
}

@ -192,7 +192,7 @@ async function disconnectWS () {
} catch (err) {
$q.notify({
type: 'negative',
message: 'Failed to disconnect WS connections.',
message: t('admin.utilities.disconnectWSFailed'),
caption: err.message
})
}

@ -81,7 +81,7 @@ q-page.admin-webhooks
q-btn.acrylic-btn.q-mr-sm(
color='indigo'
icon='las la-pen'
label='Edit'
:label='t(`common.actions.edit`)'
flat
no-caps
@click='editHook(hook.id)'

@ -10,7 +10,7 @@
v-if='error.showHomeBtn'
push
color='primary'
label='Go to home'
:label='t(`common.newpage.goback`)'
icon='las la-home'
to='/'
)
@ -18,7 +18,7 @@
v-if='error.showLoginBtn'
push
color='primary'
label='Login As...'
:label='t(`common.unauthorized.login`)'
icon='las la-sign-in-alt'
to='/login'
)

@ -12,8 +12,8 @@ q-page.column
q-icon(
name='las la-angle-right'
)
q-breadcrumbs-el(icon='las la-home', to='/', aria-label='Home')
q-tooltip Home
q-breadcrumbs-el(icon='las la-home', to='/', :aria-label='t(`common.header.home`)')
q-tooltip {{ t('common.header.home') }}
q-breadcrumbs-el(
v-for='brd of pageStore.breadcrumbs'
:key='brd.id'
@ -24,9 +24,9 @@ q-page.column
)
.col-auto.flex.items-center.justify-end
template(v-if='!pageStore.publishState === `draft`')
.text-caption.text-accent: strong Unpublished
.text-caption.text-accent: strong {{ t('common.page.unpublished') }}
q-separator.q-mx-sm(vertical)
.text-caption.text-grey-6 Last modified on #[strong {{lastModified}}]
.text-caption.text-grey-6 {{ t('common.page.lastModifiedOn') }} #[strong {{lastModified}}]
page-header
.page-container.row.no-wrap.items-stretch(style='flex: 1 1 100%;')
.col(
@ -92,7 +92,7 @@ q-page.column
//- TOC
.q-pa-md.flex.items-center
q-icon.q-mr-sm(name='las la-stream', color='grey')
.text-caption.text-grey-7 Contents
.text-caption.text-grey-7 {{ t('common.page.toc') }}
.q-px-md.q-pb-sm
q-tree.page-toc(
:nodes='pageStore.toc'
@ -111,7 +111,7 @@ q-page.column
)
.flex.items-center
q-icon.q-mr-sm(name='las la-tags', color='grey')
.text-caption.text-grey-7 Tags
.text-caption.text-grey-7 {{ t('common.page.tags') }}
q-space
transition(name='fade')
q-btn(
@ -121,7 +121,7 @@ q-page.column
icon='las la-pen'
color='deep-orange-9'
flat
label='Edit'
:label='t(`common.actions.edit`)'
no-caps
@click='state.tagEditMode = !state.tagEditMode'
)
@ -131,7 +131,7 @@ q-page.column
//- Rating
.q-pa-md.flex.items-center
q-icon.q-mr-sm(name='las la-star-half-alt', color='grey')
.text-caption.text-grey-7 Rate this page
.text-caption.text-grey-7 {{ t('common.page.rate') }}
.q-px-md
q-rating(
v-if='siteStore.features.ratingsMode === `stars`'
@ -277,7 +277,7 @@ watch(() => route.path, async (newValue) => {
if (!route.params.editor) {
$q.notify({
type: 'negative',
message: 'No editor specified!'
message: t('common.page.noEditorSpecified')
})
return router.replace('/')
}
@ -335,7 +335,7 @@ watch(() => route.path, async (newValue) => {
} else {
$q.notify({
type: 'negative',
message: 'This page does not exist (yet)!'
message: t('common.newpage.title')
})
}
} else {

@ -238,7 +238,7 @@ function disableTfa (strategyId) {
$q.notify({
type: 'negative',
message: t('profile.authDisableTfaFailed'),
caption: err.message ?? 'An unexpected error occured.'
caption: err.message ?? t('common.error.unexpected')
})
}
await fetchAuthMethods()
@ -355,7 +355,7 @@ async function setupPasskey () {
$q.notify({
type: 'negative',
message: t('profile.passkeysSetupFailed'),
caption: err.message ?? 'An unexpected error occured.'
caption: err.message ?? t('common.error.unexpected')
})
}
await fetchAuthMethods()
@ -401,7 +401,7 @@ async function deactivatePasskey (pkey) {
$q.notify({
type: 'negative',
message: t('profile.passkeysDeactivateFailed'),
caption: err.message ?? 'An unexpected error occured.'
caption: err.message ?? t('common.error.unexpected')
})
}
await fetchAuthMethods()

@ -131,7 +131,7 @@ async function uploadImage () {
hasAvatar: true
})
} else {
throw new Error(resp?.data?.uploadUserAvatar?.operation?.message || 'An unexpected error occured.')
throw new Error(resp?.data?.uploadUserAvatar?.operation?.message || t('common.error.unexpected'))
}
} catch (err) {
$q.notify({
@ -178,7 +178,7 @@ async function clearImage () {
hasAvatar: false
})
} else {
throw new Error(resp?.data?.uploadUserAvatar?.operation?.message || 'An unexpected error occured.')
throw new Error(resp?.data?.uploadUserAvatar?.operation?.message || t('common.error.unexpected'))
}
} catch (err) {
$q.notify({

@ -298,7 +298,7 @@ async function save () {
})
userStore.$patch(state.config)
} else {
throw new Error(respRaw.data?.updateProfile?.operation?.message || 'An unexpected error occured')
throw new Error(respRaw.data?.updateProfile?.operation?.message || t('common.error.unexpected'))
}
} catch (err) {
$q.notify({

@ -250,9 +250,9 @@ const orderByOptions = computed(() => {
const editors = computed(() => {
return [
{ label: t('search.editorAny'), value: '' },
{ label: 'AsciiDoc', value: 'asciidoc' },
{ label: 'Markdown', value: 'markdown' },
{ label: 'Visual Editor', value: 'wysiwyg' }
{ label: t('admin.editors.asciidocName'), value: 'asciidoc' },
{ label: t('admin.editors.markdownName'), value: 'markdown' },
{ label: t('admin.editors.wysiwygName'), value: 'wysiwyg' }
]
})
@ -402,7 +402,7 @@ async function performSearch () {
fetchPolicy: 'network-only'
})
if (!resp?.data?.searchPages) {
throw new Error('Unexpected error')
throw new Error(t('common.error.unexpected'))
}
state.results = cloneDeep(resp.data.searchPages.results).map(r => { r.tags.sort(); return r })
state.total = resp.data.searchPages.totalHits
@ -410,7 +410,7 @@ async function performSearch () {
} catch (err) {
$q.notify({
type: 'negative',
message: 'Failed to perform search query.',
message: t('search.failedQuery'),
caption: err.message
})
}

Loading…
Cancel
Save