Ghost/core/server/translations/en.json
Hannah Wolfe 02ca986ed7 🎨 Improve theme validation error messaging (#7253)
refs #7204

- Adds a new ThemeValidationError class
- This error has a top level message, but will also contain all the individual errors within the `errorDetails` property
- Updated the API error handling to return `errorDetails` if it is present
2016-08-24 14:45:54 +02:00

573 lines
29 KiB
JSON

{
"common": {
"mail": {
"title": "Ghost at {domain}"
},
"seeLinkForInstructions": "See {link} for instructions.",
"time": {
"seconds": "seconds"
},
"api": {
"authentication": {
"sampleBlogDescription": "Thoughts, stories and ideas.",
"mail": {
"resetPassword": "Reset Password",
"checkEmailForInstructions": "Check your email for further instructions.",
"passwordChanged": "Password changed successfully.",
"invitationAccepted": "Invitation accepted.",
"yourNewGhostBlog": "Your New Ghost Blog"
}
},
"mail": {
"testGhostEmail": "Test Ghost Email"
},
"users": {
"mail": {
"invitedByName": "{invitedByName} has invited you to join {blogName}"
}
},
"clients": {
"clientNotFound": "Client not found"
}
}
},
"errors": {
"apps": {
"failedToParseActiveAppsSettings": {
"error": "Failed to parse activeApps setting value: {message}",
"context": "Your apps will not be loaded.",
"help": "Check your settings table for typos in the activeApps value. It should look like: [\"app-1\", \"app2\"] (double quotes required)."
},
"appWillNotBeLoaded": {
"error": "The app will not be loaded",
"help": "Check with the app creator, or read the app documentation for more details on app requirements"
},
"permissionsErrorLoadingApp": {
"error": "Error loading app named {name}; problem reading permissions: {message}"
},
"noInstallMethodLoadingApp": {
"error": "Error loading app named {name}; no install() method defined."
},
"noActivateMethodLoadingApp": {
"error": "Error loading app named {name}; no activate() method defined."
},
"accessResourceWithoutPermission": {
"error": "The App \"{name}\" attempted to perform an action or access a resource ({perm}.{method}) without permission."
},
"mustProvideAppName": {
"error": "Must provide an app name for api context"
},
"mustProvideAppPermissions": {
"error": "Must provide app permissions"
},
"unsafeAppRequire": {
"error": "Unsafe App require: {msg}"
}
},
"middleware": {
"api": {
"versionMismatch": "Request for version {requestVersion} does not match current version {currentVersion}."
},
"auth": {
"clientAuthenticationFailed": "Client Authentication Failed",
"clientCredentialsNotProvided": "Client credentials were not provided",
"clientCredentialsNotValid": "Client credentials were not valid",
"forInformationRead": "For information on how to fix this, please read {url}.",
"accessDenied": "Access denied.",
"pleaseSignIn": "Please Sign In"
},
"oauth": {
"invalidClient": "Invalid client.",
"invalidRefreshToken": "Invalid refresh token.",
"refreshTokenExpired": "Refresh token expired."
},
"privateblogging": {
"wrongPassword": "Wrong password"
},
"spamprevention": {
"tooManyAttempts": "Too many attempts.",
"noUsername": "No username.",
"noPassword": "No password entered",
"tooManySigninAttempts": {
"error": "Only {rateSigninAttempts} tries per IP address every {rateSigninPeriod} seconds.",
"context": "Too many login attempts."
},
"tryAgainLater": " Please try again later",
"waitOneHour": " Please wait 1 hour.",
"noEmail": "No email.",
"forgottenPasswordEmail": {
"error": "Only {rfa} forgotten password attempts per email every {rfp} seconds.",
"context": "Forgotten password reset attempt failed"
},
"forgottenPasswordIp": {
"error": "Only {rfa} tries per IP address every {rfp} seconds.",
"context": "Forgotten password reset attempt failed"
}
},
"themehandler": {
"missingTheme": "The currently active theme \"{theme}\" is missing."
}
},
"utils": {
"parsepackagejson": {
"couldNotReadPackage": "Could not read package.json file",
"nameOrVersionMissing": "\"name\" or \"version\" is missing from theme package.json file.",
"willBeRequired": "This will be required in future. Please see {url}",
"themeFileIsMalformed": "Theme package.json file is malformed"
},
"validatethemes": {
"themeWithNoPackage": {
"message": "Found a theme with no package.json file",
"context": "Theme name: {name}",
"help": "This will be required in future. Please see {url}"
},
"malformedPackage": {
"message": "Found a malformed package.json",
"context": "Theme name: {name}",
"help": "Valid package.json will be required in future. Please see {url}"
}
}
},
"config": {
"couldNotLocateConfigFile": {
"error": "Could not locate a configuration file.",
"help": "Please check your deployment for config.js or config.example.js."
},
"couldNotOpenForReading": {
"error": "Could not open {file} for read.",
"help": "Please check your deployment for config.js or config.example.js."
},
"couldNotOpenForWriting": {
"error": "Could not open {file} for write.",
"help": "Please check your deployment for config.js or config.example.js."
},
"invalidUrlInConfig": {
"error": "invalid site url",
"description": "Your site url in config.js is invalid.",
"help": "Please make sure this is a valid url before restarting"
},
"urlCannotContainGhostSubdir": {
"error": "ghost subdirectory not allowed",
"description": "Your site url in config.js cannot contain a subdirectory called ghost.",
"help": "Please rename the subdirectory before restarting"
},
"urlCannotContainPrivateSubdir": {
"error": "private subdirectory not allowed",
"description": "Your site url in config.js cannot contain a subdirectory called private.",
"help": "Please rename the subdirectory before restarting"
},
"dbConfigInvalid": {
"error": "invalid database configuration",
"description": "Your database configuration in config.js is invalid.",
"help": "Please make sure this is a valid Bookshelf database configuration"
},
"deprecatedProperty": {
"error": "The configuration property [{property}] has been deprecated.",
"explanation": "This will be removed in a future version, please update your config.js file.",
"help": "Please check {url} for the most up-to-date example."
},
"invalidServerValues": {
"error": "invalid server configuration",
"description": "Your server values (socket, or host and port) in config.js are invalid.",
"help": "Please provide them before restarting."
}
},
"general": {
"maintenance": "Ghost is currently undergoing maintenance, please wait a moment then retry.",
"moreInfo": "\nMore info: {info}",
"requiredOnFuture": "This will be required in future. Please see {link}"
},
"httpServer": {
"addressInUse": {
"error": "(EADDRINUSE) Cannot start Ghost.",
"context": "Port {port} is already in use by another program.",
"help": "Is another Ghost instance already running?"
},
"otherError": {
"error": "(Code: {errorNumber})",
"context": "There was an error starting your server.",
"help": "Please use the error code above to search for a solution."
}
},
"mail": {
"incompleteMessageData": {
"error": "Error: Incomplete message data."
},
"failedSendingEmail": {
"error": "Error: Failed to send email"
},
"noMailServerAtAddress": {
"error": " - no mail server found at {domain}"
},
"messageNotSent": {
"error": "Error: Message could not be sent"
}
},
"models": {
"subscriber": {
"notEnoughPermission": "You do not have permission to perform this action"
},
"post": {
"untitled": "(Untitled)",
"valueCannotBeBlank": "Value in {key} cannot be blank.",
"isAlreadyPublished": "Your post is already published, please reload your page.",
"expectedPublishedAtInFuture": "Date must be at least {cannotScheduleAPostBeforeInMinutes} minutes in the future.",
"noUserFound": "No user found",
"notEnoughPermission": "You do not have permission to perform this action",
"tagUpdates": {
"error": "Unable to save tags.",
"help": "Your post was saved, but your tags were not updated."
}
},
"role": {
"notEnoughPermission": "You do not have permission to perform this action"
},
"settings": {
"valueCannotBeBlank": "Value in [settings.key] cannot be blank.",
"unableToFindSetting": "Unable to find setting to update: {key}",
"unableToFindDefaultSetting": "Unable to find default setting: {key}"
},
"user": {
"missingContext": "missing context",
"onlyOneRolePerUserSupported": "Only one role per user is supported at the moment.",
"methodDoesNotSupportOwnerRole": "This method does not support assigning the owner role",
"passwordDoesNotComplyLength": "Your password must be at least 8 characters long.",
"notEnoughPermission": "You do not have permission to perform this action",
"noUserWithEnteredEmailAddr": "There is no user with that email address.",
"userIsInactive": "The user with that email address is inactive.",
"incorrectPasswordAttempts": "Your password is incorrect. <br /> {remaining} attempt{s} remaining!",
"userUpdateError": {
"context": "Error thrown from user update during login",
"help": "Visit and save your profile after logging in to check for problems."
},
"incorrectPassword": "Your password is incorrect.",
"accountLocked": "Your account is locked. Please reset your password to log in again by clicking the \"Forgotten password?\" link!",
"newPasswordsDoNotMatch": "Your new passwords do not match",
"passwordRequiredForOperation": "Password is required for this operation",
"invalidTokenStructure": "Invalid token structure",
"invalidTokenExpiration": "Invalid token expiration",
"expiredToken": "Expired token",
"tokenLocked": "Token locked",
"invalidToken": "Invalid token",
"userNotFound": "User not found",
"onlyOwnerCanTransferOwnerRole": "Only owners are able to transfer the owner role.",
"onlyAdmCanBeAssignedOwnerRole": "Only administrators can be assigned the owner role."
},
"base": {
"index": {
"missingContext": "missing context"
},
"token": {
"noUserFound": "No user found",
"tokenNotFound": "Token not found"
}
},
"plugins": {
"filter": {
"errorParsing": "Error parsing filter",
"forInformationRead": "For more information on how to use filter, see {url}"
}
}
},
"permissions": {
"noActionsMapFound": {
"error": "No actions map found, ensure you have loaded permissions into database and then call permissions.init() before use."
},
"applyStatusRules": {
"error": "You do not have permission to retrieve {docName} with that status"
},
"noPermissionToAction": "You do not have permission to perform this action"
},
"update-check": {
"checkingForUpdatesFailed": {
"error": "Checking for updates failed, your blog will continue to function.",
"help": "If you get this error repeatedly, please seek help from {url}."
},
"unableToDecodeUpdateResponse": {
"error": "Unable to decode update response"
}
},
"api": {
"authentication": {
"setupUnableToRun": "Database missing fixture data. Please reset database and try again.",
"setupMustBeCompleted": "Setup must be completed before making this request.",
"noEmailProvided": "No email provided.",
"invalidEmailReceived": "The server did not receive a valid email",
"setupAlreadyCompleted": "Setup has already been completed.",
"unableToSendWelcomeEmail": "Unable to send welcome email, your blog will continue to function.",
"checkEmailConfigInstructions": "Please see {url} for instructions on configuring email.",
"notLoggedIn": "You are not logged in.",
"notTheBlogOwner": "You are not the blog owner.",
"invalidTokenTypeHint": "Invalid token_type_hint given.",
"invalidTokenProvided": "Invalid token provided",
"tokenRevocationFailed": "Token revocation failed"
},
"clients": {
"clientNotFound": "Client not found."
},
"configuration": {
"invalidKey": "Invalid key"
},
"db": {
"missingFile": "Please select a database file to import.",
"invalidFile": "Unsupported file. Please try any of the following formats: {extensions}",
"noPermissionToExportData": "You do not have permission to export data (no rights).",
"noPermissionToImportData": "You do not have permission to import data (no rights)."
},
"mail": {
"noPermissionToSendEmail": "You do not have permission to send mail.",
"cannotFindCurrentUser": "Could not find the current user"
},
"notifications": {
"noPermissionToBrowseNotif": "You do not have permission to browse notifications.",
"noPermissionToAddNotif": "You do not have permission to add notifications.",
"noPermissionToDestroyNotif": "You do not have permission to destroy notifications.",
"noPermissionToDismissNotif": "You do not have permission to dismiss this notification.",
"notificationDoesNotExist": "Notification does not exist."
},
"posts": {
"postNotFound": "Post not found."
},
"job": {
"notFound": "Job not found.",
"publishInThePast": "Use the force flag to publish a post in the past."
},
"settings": {
"problemFindingSetting": "Problem finding setting: {key}",
"accessCoreSettingFromExtReq": "Attempted to access core setting from external request",
"invalidJsonInLabs": "Error: Invalid JSON in settings.labs",
"labsColumnCouldNotBeParsed": "The column with key \"labs\" could not be parsed as JSON",
"tryUpdatingLabs": "Please try updating a setting on the labs page, or manually editing your DB",
"noPermissionToEditSettings": "You do not have permission to edit settings.",
"noPermissionToReadSettings": "You do not have permission to read settings."
},
"slugs": {
"couldNotGenerateSlug": "Could not generate slug.",
"unknownSlugType": "Unknown slug type '{type}'."
},
"subscribers": {
"missingFile": "Please select a csv.",
"invalidFile": "Please select a valid CSV file to import.",
"subscriberNotFound": "Subscriber not found.",
"subscriberAlreadyExists": "Email address is already subscribed."
},
"tags": {
"tagNotFound": "Tag not found."
},
"themes": {
"noPermissionToBrowseThemes": "You do not have permission to browse themes.",
"noPermissionToEditThemes": "You do not have permission to edit themes.",
"themeDoesNotExist": "Theme does not exist.",
"invalidTheme": "Theme is not compatible or contains errors.",
"missingFile": "Please select a theme.",
"invalidFile": "Please select a valid zip file.",
"overrideCasper": "Please rename your zip, it's not allowed to override the default casper theme.",
"destroyCasper": "Deleting the default casper theme is not allowed."
},
"images": {
"missingFile": "Please select an image.",
"invalidFile": "Please select a valid image."
},
"users": {
"userNotFound": "User not found.",
"cannotChangeOwnRole": "You cannot change your own role.",
"cannotChangeOwnersRole": "Cannot change Owner's role",
"noPermissionToEditUser": "You do not have permission to edit this user",
"notAllowedToCreateOwner": "Not allowed to create an owner user.",
"noPermissionToAddUser": "You do not have permission to add this user",
"noEmailProvided": "No email provided.",
"userAlreadyRegistered": "User is already registered.",
"errorSendingEmail": {
"error": "Error sending email: {message}",
"help": "Please check your email settings and resend the invitation."
},
"noPermissionToDestroyUser": "You do not have permission to destroy this user.",
"noPermissionToChangeUsersPwd": "You do not have permission to change the password for this user"
},
"utils": {
"noPermissionToCall": "You do not have permission to {method} {docName}",
"noRootKeyProvided": "No root key ('{docName}') provided.",
"invalidIdProvided": "Invalid id provided."
}
},
"data": {
"export": {
"errorExportingData": "Error exporting data"
},
"import": {
"dataImporter": {
"unableToFindOwner": "Unable to find an owner"
},
"index": {
"duplicateEntryFound": "Duplicate entry found. Multiple values of '{value}' found for {offendingProperty}."
},
"utils": {
"dataLinkedToUnknownUser": "Attempting to import data linked to unknown user id {userToMap}"
}
},
"importer": {
"index": {
"couldNotCleanUpFile": {
"error": "Import could not clean up file ",
"context": "Your blog will continue to work as expected"
},
"unsupportedRoonExport": "Your zip file looks like an old format Roon export, please re-export your Roon blog and try again.",
"noContentToImport": "Zip did not include any content to import.",
"invalidZipStructure": "Invalid zip file structure.",
"invalidZipFileBaseDirectory": "Invalid zip file: base directory read failed",
"zipContainsMultipleDataFormats": "Zip file contains multiple data formats. Please split up and import separately."
},
"handlers": {
"json": {
"invalidJsonFormat": "Invalid JSON format, expected `{ db: [exportedData] }`",
"apiDbImportContent": "API DB import content",
"checkImportJsonIsValid": "check that the import file is valid JSON.",
"failedToParseImportJson": "Failed to parse the import JSON file."
}
}
},
"versioning": {
"index": {
"dbVersionNotRecognized": "Database version is not recognized",
"databaseNotPopulated": "Database is not populated.",
"cannotMigrate": {
"error": "Unable to upgrade from version 0.4.2 or earlier.",
"context": "Please upgrade to 0.7.1 first."
}
}
},
"xml": {
"xmlrpc": {
"pingUpdateFailed": {
"error": "Pinging services for updates on your blog failed, your blog will continue to function.",
"help": "If you get this error repeatedly, please seek help on {url}."
}
}
}
},
"errors": {
"noMessageSupplied": "no message supplied",
"error": "\nERROR:",
"warning": "\nWarning:",
"anErrorOccurred": "An error occurred",
"unknownErrorOccurred": "An unknown error occurred.",
"unknownError": "Unknown Error",
"unknownApiError": "Unknown API Error",
"databaseIsReadOnly": "Your database is in read only mode. Visitors can read your blog, but you can't log in or add posts.",
"checkDatabase": "Check your database file and make sure that file owner and permissions are correct.",
"notEnoughPermission": "You do not have permission to perform this action",
"errorWhilstRenderingError": "Error whilst rendering error page",
"errorTemplateHasError": "Error template has an error",
"oopsErrorTemplateHasError": "Oops, seems there is an error in the error template.",
"encounteredError": "Encountered the error: ",
"whilstTryingToRender": "whilst trying to render an error page for the error: ",
"renderingErrorPage": "Rendering Error Page",
"caughtProcessingError": "Ghost caught a processing error in the middleware layer.",
"pageNotFound": "Page not found"
}
},
"warnings": {
"index": {
"usingDirectMethodToSendEmail": "Ghost is attempting to use a direct method to send email. \nIt is recommended that you explicitly configure an email service.",
"unableToSendEmail": "Ghost is currently unable to send email."
},
"helpers": {
"helperNotAvailable": "The \\{\\{{helperName}\\}\\} helper is not available.",
"apiMustBeEnabled": "The {flagName} labs flag must be enabled if you wish to use the \\{\\{{helperName}\\}\\} helper.",
"seeLink": "See {url}",
"foreach": {
"iteratorNeeded": "Need to pass an iterator to #foreach"
},
"get": {
"mustBeCalledAsBlock": "Get helper must be called as a block",
"invalidResource": "Invalid resource given to get helper",
"helperNotAvailable": "The \\{\\{get\\}\\} helper is not available.",
"apiMustBeEnabled": "Public API access must be enabled if you wish to use the \\{\\{get\\}\\} helper.",
"seeLink": "See {url}"
},
"has": {
"invalidAttribute": "Invalid or no attribute given to has helper"
},
"index": {
"missingHelper": "Missing helper: '{arg}'"
},
"is": {
"invalidAttribute": "Invalid or no attribute given to is helper"
},
"navigation": {
"invalidData": "navigation data is not an object or is a function",
"valuesMustBeDefined": "All values must be defined for label, url and current",
"valuesMustBeString": "Invalid value, Url and Label must be strings"
},
"page_url": {
"isDeprecated": "Warning: pageUrl is deprecated, please use page_url instead\nThe helper pageUrl has been replaced with page_url in Ghost 0.4.2, and will be removed entirely in Ghost 0.6\nIn your theme's pagination.hbs file, pageUrl should be renamed to page_url"
},
"pagination": {
"invalidData": "pagination data is not an object or is a function",
"valuesMustBeDefined": "All values must be defined for page, pages, limit and total",
"nextPrevValuesMustBeNumeric": "Invalid value, Next/Prev must be a number",
"valuesMustBeNumeric": "Invalid value, check page, pages, limit and total are numbers"
},
"plural": {
"valuesMustBeDefined": "All values must be defined for empty, singular and plural"
},
"template": {
"templateNotFound": "Template {name} not found."
}
}
},
"notices": {
"controllers": {
"newVersionAvailable": "Ghost {version} is available! Hot Damn. {link} to upgrade."
},
"index": {
"welcomeToGhost": "Welcome to Ghost.",
"youAreRunningUnderEnvironment": "You're running under the <strong> {environment} </strong> environment.",
"yourURLisSetTo": "Your URL is set to <strong> {url} </strong>."
},
"httpServer": {
"cantTouchThis": "Can't touch this",
"ghostIsRunning": "Ghost is running...",
"yourBlogIsAvailableOn": "\nYour blog is now available on {url}",
"ctrlCToShutDown": "\nCtrl+C to shut down",
"ghostIsRunningIn": "Ghost is running in {env}...",
"listeningOn": "\nListening on",
"urlConfiguredAs": "\nUrl configured as: {url}",
"ghostHasShutdown": "\nGhost has shut down",
"yourBlogIsNowOffline": "\nYour blog is now offline",
"ghostWasRunningFor": "\nGhost was running for",
"ghostIsClosingConnections": "Ghost is closing connections"
},
"mail": {
"messageSent": "Message sent. Double check inbox and spam folder!"
},
"api": {
"users": {
"pwdChangedSuccessfully": "Password changed successfully."
}
},
"data": {
"fixtures": {
"canSafelyDelete": "<!-- You can safely delete this line if your theme does not require jQuery -->\n",
"jQueryRemoved": "jQuery has been removed from Ghost core and is now being loaded from the jQuery Foundation's CDN.",
"canBeChanged": "This can be changed or removed in your <strong>Code Injection</strong> settings area."
},
"utils": {
"index": {
"noSupportForDatabase": "No support for database client {client}"
}
},
"validation": {
"index": {
"valueCannotBeBlank": "Value in [{tableName}.{columnKey}] cannot be blank.",
"valueMustBeBoolean": "Value in [settings.key] must be one of true, false, 0 or 1.",
"valueExceedsMaxLength": "Value in [{tableName}.{columnKey}] exceeds maximum length of {maxlength} characters.",
"valueIsNotInteger": "Value in [{tableName}.{columnKey}] is not an integer.",
"themeCannotBeActivated": "{themeName} cannot be activated because it is not currently installed.",
"validationFailed": "Validation ({validationName}) failed for {key}"
}
}
}
}
}