From 1873a6f62a032bc94ea2a3220c6ab5a4290c5fed Mon Sep 17 00:00:00 2001 From: Martin Muzatko Date: Tue, 28 Aug 2018 11:23:59 +0200 Subject: [PATCH 01/81] Migrated to Vuepress --- docs/.vuepress/config.js | 50 + docs/3.x.x/en/guides/filters.md | 4 +- docs/3.x.x/en/guides/restapi.md | 119 ++ .../en/plugin-development/ui-components.md | 1236 ----------------- docs/package.json | 15 + 5 files changed, 187 insertions(+), 1237 deletions(-) create mode 100644 docs/.vuepress/config.js create mode 100644 docs/3.x.x/en/guides/restapi.md create mode 100644 docs/package.json diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js new file mode 100644 index 0000000000..910a12d1db --- /dev/null +++ b/docs/.vuepress/config.js @@ -0,0 +1,50 @@ +module.exports = { + themeConfig: { + sidebar: [ + '/3.x.x/en/', + { + title: 'advanced', + children: [ + '/3.x.x/en/advanced/customize-admin', + '/3.x.x/en/advanced/hooks', + '/3.x.x/en/advanced/logging', + '/3.x.x/en/advanced/middlewares', + '/3.x.x/en/advanced/usage-tracking', + ] + }, + { + title: 'api-reference', + children: [ + '/3.x.x/en/api-reference/reference', + ] + }, + '/3.x.x/en/cli/CLI', + '/3.x.x/en/concepts/concepts', + '/3.x.x/en/configurations/configurations', + { + title: 'Getting started', + children: [ + '/3.x.x/en/getting-started/installation', + '/3.x.x/en/getting-started/quick-start', + ] + }, + { + title: 'Guides', + children: [ + '/3.x.x/en/guides/authentication', + '/3.x.x/en/guides/controllers', + '/3.x.x/en/guides/deployment', + '/3.x.x/en/guides/email', + '/3.x.x/en/guides/filters', + '/3.x.x/en/guides/graphql', + '/3.x.x/en/guides/i18n', + '/3.x.x/en/guides/models', + '/3.x.x/en/guides/policies', + '/3.x.x/en/guides/public-assets', + '/3.x.x/en/guides/requests', + '/3.x.x/en/guides/requests', + ] + }, + ], + }, +} diff --git a/docs/3.x.x/en/guides/filters.md b/docs/3.x.x/en/guides/filters.md index 351a6f5a5b..eb50d62173 100644 --- a/docs/3.x.x/en/guides/filters.md +++ b/docs/3.x.x/en/guides/filters.md @@ -2,7 +2,9 @@ See the [filters' concepts](../concepts/concepts.md#filters) for details. -> Note: by default, the filters can only be used from `find` endpoints generated by the Content Type Builder and the [CLI](../cli/CLI.md). If you need to implement a filters system somewhere else, read the [programmatic usage](#programmatic-usage) section. +::: tip Note +by default, the filters can only be used from `find` endpoints generated by the Content Type Builder and the [CLI](../cli/CLI.md). If you need to implement a filters system somewhere else, read the [programmatic usage](#programmatic-usage) section. +::: ## Available operators diff --git a/docs/3.x.x/en/guides/restapi.md b/docs/3.x.x/en/guides/restapi.md new file mode 100644 index 0000000000..351a6f5a5b --- /dev/null +++ b/docs/3.x.x/en/guides/restapi.md @@ -0,0 +1,119 @@ +# Filters + +See the [filters' concepts](../concepts/concepts.md#filters) for details. + +> Note: by default, the filters can only be used from `find` endpoints generated by the Content Type Builder and the [CLI](../cli/CLI.md). If you need to implement a filters system somewhere else, read the [programmatic usage](#programmatic-usage) section. + +## Available operators + +The available operators are separated in four different categories: + - [Filters](#filters) + - [Sort](#sort) + - [Limit](#limit) + - [Start](#start) + +### Filters + +Easily filter results according to fields values. + + - `=`: Equals + - `_ne`: Not equals + - `_lt`: Lower than + - `_gt`: Greater than + - `_lte`: Lower than or equal to + - `_gte`: Greater than or equal to + - `_contains`: Contains + - `_containss`: Contains case sensitive + +#### Examples + +Find users having `John` as first name. + +`GET /user?firstName=John` + +Find products having a price equal or greater than `3`. + +`GET /product?price_gte=3` + +### Sort + +Sort according to a specific field. + +#### Example + +Sort users by email. + + - ASC: `GET /user?_sort=email:asc` + - DESC: `GET /user?_sort=email:desc` + +### Limit + +Limit the size of the returned results. + +#### Example + +Limit the result length to 30. + +`GET /user?_limit=30` + +### Start + +Skip a specific number of entries (especially useful for pagination). + +#### Example + +Get the second page of results. + +`GET /user?_start=10&_limit=10` + +## Programmatic usage + +Requests system can be implemented in custom code sections. + +### Extracting requests filters + +To extract the filters from an JavaScript object or a request, you need to call the [`strapi.utils.models.convertParams` helper](../api-reference/reference.md#strapiutils). + +> Note: The returned objects is formatted according to the ORM used by the model. + +#### Example + +**Path —** `./api/user/controllers/User.js`. + +```js +// Define a list of params. +const params = { + '_limit': 20, + '_sort': 'email' +}; + +// Convert params. +const formattedParams = strapi.utils.models.convertParams('user', params); // { limit: 20, sort: 'email' } +``` + +### Query usage + +#### Example + +**Path —** `./api/user/controllers/User.js`. + +```js +module.exports = { + + find: async (ctx) => { + // Convert params. + const formattedParams = strapi.utils.models.convertParams('user', ctx.request.query); + + // Get the list of users according to the request query. + const filteredUsers = await User + .find() + .where(formattedParams.where) + .sort(formattedParams.sort) + .skip(formattedParams.start) + .limit(formattedParams.limit); + + // Finally, send the results to the client. + ctx.body = filteredUsers; + }; +}; +``` diff --git a/docs/3.x.x/en/plugin-development/ui-components.md b/docs/3.x.x/en/plugin-development/ui-components.md index 639d50a8f9..e69de29bb2 100644 --- a/docs/3.x.x/en/plugin-development/ui-components.md +++ b/docs/3.x.x/en/plugin-development/ui-components.md @@ -1,1236 +0,0 @@ -# UI components - -Strapi provides built-in UI Components to make development faster. - -## Button - -Button library based on bootstrap classes. - -{% center %} ![Buttons img](../assets/buttons.png) {% endcenter %} - -### Usage - -| Property | Type | Required | Description | -| -------- | ---- | -------- | ----------- | -| `children`| node | no | Ex: `` | -| `className` | any | no | Sets a custom className. Ex: `` | -| `secondary`| bool | no | [Bootstrap className](https://v4-alpha.getbootstrap.com/components/buttons/) | -| `secondaryHotline` | bool | no | Sets className | -| `secondaryHotlineAdd` | bool | no | Inserts fontAwesone plus icon inside the button. Ex: `` | -| `type` | string | no | Sets the button type | - -### Example - - **Path —** `./plugins/my-plugin/admin/src/translations/en.json`. -```json -{ - "myPlugin.button.label": "Add a new" -} -``` - - -**Path —** `./plugins/my-plugin/admin/src/components/Foo/index.js`. -```js -// Make sure you don't have any other component called Button otherwise it will -// import the one from your ./components folder instead. -import React from 'react'; - -import Button from 'components/Button'; -import styles from './styles.scss'; - -function Foo() { - // Define your buttons - const buttons = [ - { - kind: 'primaryAddShape', - label: 'myPlugin.button.label', - labelValues: { - foo: 'Bar', - }, - onClick: () => console.log('Click'), - }, - ]; - - return ( -
- {buttons.map(buttonProps =>
- ); - - // Same as - // return ( - //
- //
- // ); -} - -// Will display a primaryAddShape button with label: 'Add a new Bar' -export default Foo; -``` - -*** - -## ExtendComponent - -ExtendComponent allows a plugin to inject components into another one. - -> Refer to the use cases [documentation](./frontend-use-cases.md#inject-design) to see how to use it. - -*** - -## Ico - -Ico components that works with fontAwesome. - -### Usage - -| Property | Type | Required | Description | -| -------- | ---- | -------- | ----------- | -| `icoType` | string | no (default: `trash`) | fontAwesome ico name. Ex: | -| `onClick` | func | no | Function executed onClick. | - -### Example - -```js -import React from 'react'; -import Ico from 'components/Ico'; -import PopUpWarning from 'components/PopUpWarning'; -import styles from 'styles'; - -class FooPage extends React.Component { - constructor(props) { - super(props); - this.state = { showModal: false }; - } - - handleClick = () => this.setState({ showModal: true }); - - render () { - return ( -
- - this.setState({ showModal: false })} - toggleModal={() => this.setState({ showModal: false })} - /> -
- ); - } -} - -export default FooPage; -``` - -*** - -## IcoContainer - -Container containing icons, generally used for editing or deleting data. - -### Usage -| Property | Type | Required | Description | -| -------- | ---- | -------- | ----------- | -| icons | array | no | Array containing icons' props. | - -### Example - -```js -import React from 'react'; -import IcoContainer from 'components/IcoContainer'; -import PopUpWarning from 'components/PopUpWarning'; -import styles from 'styles'; - -class FooPage extends React.Component { - constructor(props) { - super(props); - this.state = { showModal: false }; - } - - handleClick = () => this.setState({ showModal: true }); - - render() { - const icons = [ - { icoType: 'pencil', onClick: () => console.log('click on pencil icon') }, - { icoType: 'trash', onClick: this.handleClick }, - ]; - - return ( -
- - this.setState({ showModal: false })} - toggleModal={() => this.setState({ showModal: false })} - /> -
- ); - } -} - -export default FooPage; -``` - -*** - -## InputsIndex - -Strapi provides a built-in input library which includes : - - All kind of inputs - - Front-End validations - - Error highlight - - i18n - - -### Usage - -| Property | Type | Required | Description | -| -------- | ---- | -------- | ----------- | -| `addon` | string | no | Allows to add a string addon in your input, based on [Bootstrap](https://v4-alpha.getbootstrap.com/components/input-group/#basic-example). Ex: `` | -| `addRequiredInputDesign` | bool | no | Allows to add an asterix on the input. Ex: `` | -| `customBootstrapClass` | string | no | Allows to override the input bootstrap col system. Ex: `` | -| customInputs | Object | no | Allows to add a new input type | -| `deactivateErrorHighlight` | bool | no | Prevents from displaying error highlight in the input: Ex: `` | -| `didCheckErrors` | bool | no | Use this props to display errors after submitting a form. Ex: `` | -| `disabled` | bool | no | Disable the input. Ex: `` | -| `errors` | array | no | Allows to display custom error messages. Ex: `` | -| `inputDescription` | string | no | Allows to add an input description that is displayed like [bootstrap](https://v4-alpha.getbootstrap.com/components/forms/#defining-states). | -| `label` | string | yes | Displays the input's label with i18n. | -| `linkContent` | object | no | Allows to display a link within the input's description. Ex: {% raw %} ``` ``` {% endraw %} | -| `name` | string | yes | The key to update your reducer. | -| `noErrorsDescription` | bool | no | Prevents from displaying built-in errors. | -| `onBlur` | func or bool | no | Overrides the default onBlur behavior. If bool passed to the component it will disabled the input validations checking. | -| `onChange` | func | yes | Sets your reducer state. | -| `onFocus` | func | no | Adds an onFocus event to the input. | -| `placeholder` | string | no | Allows to set a placeholder. | -| `selectOptions` | array | no | Options for the select. | -| `tabIndex` | string | no | Sets the order in which the inputs are focused on tab key press. | -| `title` | string | no | This props can only be used for checkboxes, it allows to add a title on top of the input, the label will be on the right side of the checkbox. | -| `validations` | object | yes | Allows to have the built-in input's validations. If set to {} the validations will be ignored. Ex: {% raw %} ``` ``` {% endraw %} | -| `value` | string or bool or number | yes | The input's value. | - -### Example - -**Path —** `./plugins/my-plugin/admin/src/containers/FooPage/index.js`. -```js -import React from 'react'; -// Make sure you don't have a component called Input inside your ./components folder -// It will import the one in your components folder instead. -import Input from 'components/InputsIndex'; - -const CustomInput = (props) => { - return ( -
- Some custom input -
- ); -} - -class FooPage extends React.Component { - constructor(props) { - super(props); - this.state { - data: { - foo: 'bar', - }, - error: false, - errors: [], - }; - } - - handleChange = ({ target }) => { - const value = target.type === 'number' ? Number(target.value) : target.value; - const error = target.value.length === 0; - const data = { - [target.name]: value, - } - if (error) { - this.setState({ error: true, errors: [{ id: 'This input is required ' }] }); - } else { - this.setState({ data, error: false, errors: [] }); - } - } - - render() { - const inputs = [ - { - label: 'This is a string input', - name: 'foo', - type: 'string', - validations: { required: true }, - value: this.state.data.foo, - }, - { - label: 'This is a custom input', - name: 'custom', - type: 'newType', - validations: {}, - value: '', - } - ] - return ( -
- {inputs.map(input => ( - - ))} -
- ); - } -} - -// ... - -export default FooPage; -``` - -#### Example with property linkContent and i18n - -**Path —** `./plugins/my-plugin/admin/src/translations/en.json`. -```json -{ - "form.input.inputDescription": "Content type name should be singular", - "form.input.label": "Name", - "form.input.linkContent.description": "check out our documentation" -} -``` - -**Path —** `./plugins/my-plugin/admin/src/translations/fr.json`. -```json -{ - "form.input.inputDescription": "Le nom des modèles doit être au singulier", - "form.input.label": "Nom", - "form.input.linkContent.description": "regardez la documentation." -} -``` - -**Path —** `./plugins/my-plugin/admin/src/containers/FooPage/index.js`. -```js -import React from 'react'; - -// ... - -class FooPage extends React.Component { - // ... - render () { - return ( -
- -
- ); - } -} - -// ... - -export default FooPage; -``` - -*** - -## InputDescription - -Component that allows to put a description under an input, it works with or without i18n - -| Property | Type | Required | Description | -| -------- | ---- | -------- | ----------- | -| children | node | no | Anything that is wrapped inside the Description | -| className | string | no | custom className for the Description | -| message | func or string or object | no | Define the content of the Description | -| style | object | no | Label style property | - - -### Usage - -**Path -** `my-plugin/admin/src/translations.en.json`. - -```json -{ - "Email.inputDescription": "Don't know how to set variables, {documentationLink}", - "Tel.inputDescription": "Make sure to provide a phone number where you can be reached" -} -``` -**Path -** `my-plugin/admin/src/components/Foo/index.js`; - -```js -import React from 'react'; -import InputText from 'components/InputText'; -import InputDescription from 'components/InputDescription'; - -import styles from './styles.scss'; - -function Foo({ onChange, value }) { - return ( -
- - {/* Usage without i18n, custom className and style */} - - - {/* Usage with function */} - - Don,t know how to set variables, check out our doc!} - /> - - {/* Usage with i18n and rich text formatting */} - - check out our doc! - } - }} - /> - - {/* Usage with i18n only */} - - -
- ); -} - -export default Foo; -``` - -*** - -## InputAddon - -| Property | Type | Required | Description | -| -------- | ---- | -------- | ----------- | -| addon | string | no | Sets the input's addon. Works with i18n | -| autoFocus | bool | no | Sets the input's autoFocus | -| className | string | no | custom className for the input | -| deactivateErrorHighlight | bool | no | Allow to deactivate the red border on the input when there is an error | -| disabled | bool | no | Disables the input | -| errors | array | no | Sets the red border on the input | -| onBlur | func | no | Function executed when the user leaves the input | -| onFocus | func | no | Function executed when the user enters the input | -| name | string | yes | The name of the input | -| placeholder | string | no | Input's placeholder, works with i18n | -| style | object | no | Input's style property | -| tabIndex | string | no | Input's tabIndex | -| value | string or number | yes | Input's value | - -*** - -## InputDate - -Please refer to the [InputText documentation](#InputText); - -*** - -## InputEmail - -Please refer to the [InputText documentation](#InputText); - -*** - -## InputNumber - -InputNumber component. - -| Property | Type | Required | Description | -| -------- | ---- | -------- | ----------- | -| autoFocus | bool | no | Sets the input's autoFocus | -| className | string | no | custom className for the input | -| deactivateErrorHighlight | bool | no | Allow to deactivate the red border on the input when there is an error | -| disabled | bool | no | Disables the input | -| errors | array | no | Sets the red border on the input | -| onBlur | func | no | Function executed when the user leaves the input | -| onFocus | func | no | Function executed when the user enters the input | -| name | string | yes | The name of the input | -| placeholder | string | no | Input's placeholder, works with i18n | -| style | object | no | Input's style property | -| tabIndex | string | no | Input's tabIndex | -| value | string or number | yes | Input's value | - -*** - -## InputSearch - -InputSearch component. - -| Property | Type | Required | Description | -| -------- | ---- | -------- | ----------- | -| autoFocus | bool | no | Sets the input's autoFocus | -| className | string | no | custom className for the input | -| deactivateErrorHighlight | bool | no | Allow to deactivate the red border on the input when there is an error | -| disabled | bool | no | Disables the input | -| error | bool | no | Sets the red border on the input | -| onBlur | func | no | Function executed when the user leaves the input | -| onChange | func | yes | Handler to modify the input's value | -| onFocus | func | no | Function executed when the user enters the input | -| name | string | yes | The name of the input | -| placeholder | string | no | Input's placeholder, works with i18n | -| style | object | no | Input's style property | -| tabIndex | string | no | Input's tabIndex | -| value | string | yes | Input's value | - -*** - -## InputSelect - -InputSelect component. - -| Property | Type | Required | Description | -| -------- | ---- | -------- | ----------- | -| autoFocus | bool | no | Sets the input's autoFocus | -| className | string | no | custom className for the input | -| deactivateErrorHighlight | bool | no | Allow to deactivate the red border on the input when there is an error | -| disabled | bool | no | Disables the input | -| errors | array | no | Sets the red border on the input | -| onBlur | func | no | Function executed when the user leaves the input | -| onFocus | func | no | Function executed when the user enters the input | -| name | string | yes | The name of the input | -| placeholder | string | no | Input's placeholder, works with i18n | -| selectOptions | array of objects | yes | Options for the select. | -| style | object | no | Input's style property | -| tabIndex | string | no | Input's tabIndex | -| value | string or number | yes | Input's value | - -*** - -## InputText - -InputText Component - -| Property | Type | Required | Description | -| -------- | ---- | -------- | ----------- | -| autoFocus | bool | no | Sets the input's autoFocus | -| className | string | no | custom className for the input | -| deactivateErrorHighlight | bool | no | Allow to deactivate the red border on the input when there is an error | -| disabled | bool | no | Disables the input | -| error | bool | no | Sets the red border on the input | -| onBlur | func | no | Function executed when the user leaves the input | -| onChange | func | yes | Handler to modify the input's value | -| onFocus | func | no | Function executed when the user enters the input | -| name | string | yes | The name of the input | -| placeholder | string | no | Input's placeholder, works with i18n | -| style | object | no | Input's style property | -| tabIndex | string | no | Input's tabIndex | -| value | string | yes | Input's value | - -*** - -## InputTextArea - -InputTextArea Component - -| Property | Type | Required | Description | -| -------- | ---- | -------- | ----------- | -| autoFocus | bool | no | Sets the input's autoFocus | -| className | string | no | custom className for the input | -| deactivateErrorHighlight | bool | no | Allow to deactivate the red border on the input when there is an error | -| disabled | bool | no | Disables the input | -| error | bool | no | Sets the red border on the input | -| onBlur | func | no | Function executed when the user leaves the input | -| onChange | func | yes | Handler to modify the input's value | -| onFocus | func | no | Function executed when the user enters the input | -| name | string | yes | The name of the input | -| placeholder | string | no | Input's placeholder, works with i18n | -| style | object | no | Input's style property | -| tabIndex | string | no | Input's tabIndex | -| value | string | yes | Input's value | - -*** - -## InputToggle - -Input type: 'toggle' component - -| Property | Type | Required | Description | -| -------- | ---- | -------- | ----------- | -| autoFocus | bool | no | Sets the input's autoFocus | -| className | string | no | custom className for the input | -| deactivateErrorHighlight | bool | no | Allow to deactivate the red border on the input when there is an error | -| disabled | bool | no | Disables the input | -| error | bool | no | Sets the red border on the input | -| onChange | func | yes | Handler to modify the input's value | -| name | string | yes | The name of the input | -| style | object | no | Input's style property | -| tabIndex | string | no | Input's tabIndex | -| value | bool | yes | Input's value | - -*** - -## InputAddonWithErrors - -| Property | Type | Required | Description | -| -------- | ---- | -------- | ----------- | -| addon | string | no | Sets the input's addon. Works with i18n | -| autoFocus | bool | no | Sets the input's autoFocus | -| className | string | no | Overrides the container className | -| customBootstrapClass | string | no | Allows to override the input bootstrap col system | -| deactivateErrorHighlight | bool | no | Allow to deactivate the red border on the input when there is an error | -| didCheckErrors | bool | no | Use this props to display errors after submitting a form. | -| disabled | bool | no | Disables the input | -| errors | array | no | Array of errors | -| errorsClassName | string | no | Overrides the InputErrors' className | -| errorsStyle | object | no | Overrides the InputErrors' style | -| inputClassName | string | no | Overrides the InputText's className | -| inputDescriptionClassName | string | no | Overrides the InputDescription's className | -| inputDescriptionStyle | object | no | Overrides the InputDescription's style| -| inputStyle | object | no | Overrides the InputText's style | -| labelClassName | string | no | Overrides the Label's className | -| labelStyle | object | no | Overrides the Label's style | -| onBlur | func | no | Function executed when the user leaves the input | -| onChange | func | yes | Handler to modify the input's value | -| onFocus | func | no | Function executed when the user enters the input | -| name | string | yes | The name of the input | -| noErrorsDescription | bool | no | Remove the input's errors description | -| placeholder | string | no | Input's placeholder, works with i18n | -| style | object | no | Overrides the container style | -| tabIndex | string | no | Input's tabIndex | -| validations | object | no | Input's validations | -| value | string | yes | Input's value | - -### Usage - -Please refer to the [InputTextWithErrors](#InputTextWithErrors) documentation. - -*** - -## InputDateWithErrors - -Please refer to the [InputTextWithErrors](#InputTextWithErrors) documentation. - -*** - -## InputEmailWithErrors - -Please refer to the [InputTextWithErrors](#InputTextWithErrors) documentation. - -*** - -## InputNumberWithErrors - -Please refer to the [InputTextWithErrors](#InputTextWithErrors) documentation. - -*** - -## InputSearchWithErrors - -Please refer to the [InputTextWithErrors](#InputTextWithErrors) documentation. - -*** - -## InputSelectWithErrors - -Component integrates Label, InputSelect, InputDescription and InputErrors. - -| Property | Type | Required | Description | -| -------- | ---- | -------- | ----------- | -| autoFocus | bool | no | Sets the input's autoFocus | -| className | string | no | Overrides the container className | -| customBootstrapClass | string | no | Allows to override the input bootstrap col system | -| deactivateErrorHighlight | bool | no | Allow to deactivate the red border on the input when there is an error | -| didCheckErrors | bool | no | Use this props to display errors after submitting a form. | -| disabled | bool | no | Disables the input | -| errors | array | no | Array of errors | -| errorsClassName | string | no | Overrides the InputErrors' className | -| errorsStyle | object | no | Overrides the InputErrors' style | -| inputClassName | string | no | Overrides the InputText's className | -| inputDescriptionClassName | string | no | Overrides the InputDescription's className | -| inputDescriptionStyle | object | no | Overrides the InputDescription's style| -| inputStyle | object | no | Overrides the InputText's style | -| labelClassName | string | no | Overrides the Label's className | -| labelStyle | object | no | Overrides the Label's style | -| onBlur | func | no | Function executed when the user leaves the input | -| onChange | func | yes | Handler to modify the input's value | -| onFocus | func | no | Function executed when the user enters the input | -| name | string | yes | The name of the input | -| placeholder | string | no | Input's placeholder, works with i18n | -| style | object | no | Overrides the container style | -| selectOptions | array of objects | yes | Options for the select. | -| tabIndex | string | no | Input's tabIndex | -| value | string | yes | Input's value | - -### Usage - -Please refer to the [InputTextWithErrors](#InputTextWithErrors) documentation. - -*** - -## InputTextWithErrors - -Component integrates Label, InputText, InputDescription and InputErrors. - -| Property | Type | Required | Description | -| -------- | ---- | -------- | ----------- | -| autoFocus | bool | no | Sets the input's autoFocus | -| className | string | no | Overrides the container className | -| customBootstrapClass | string | no | Allows to override the input bootstrap col system | -| deactivateErrorHighlight | bool | no | Allow to deactivate the red border on the input when there is an error | -| didCheckErrors | bool | no | Use this props to display errors after submitting a form. | -| disabled | bool | no | Disables the input | -| errors | array | no | Array of errors | -| errorsClassName | string | no | Overrides the InputErrors' className | -| errorsStyle | object | no | Overrides the InputErrors' style | -| inputClassName | string | no | Overrides the InputText's className | -| inputDescriptionClassName | string | no | Overrides the InputDescription's className | -| inputDescriptionStyle | object | no | Overrides the InputDescription's style| -| inputStyle | object | no | Overrides the InputText's style | -| labelClassName | string | no | Overrides the Label's className | -| labelStyle | object | no | Overrides the Label's style | -| onBlur | func | no | Function executed when the user leaves the input | -| onChange | func | yes | Handler to modify the input's value | -| onFocus | func | no | Function executed when the user enters the input | -| name | string | yes | The name of the input | -| noErrorsDescription | bool | no | Remove the input's errors description | -| placeholder | string | no | Input's placeholder, works with i18n | -| style | object | no | Overrides the container style | -| tabIndex | string | no | Input's tabIndex | -| validations | object | no | Input's validations | -| value | string | yes | Input's value | - - -### Usage - -**Path -** `my-plugin/admin/src/translations.en.json`. -```json -{ - "inputFoo.label": "This is a label, {foo}", - "inputFoo.description": "Awesome description {bar}" -} -``` - -**Path -** `my-plugin/admin/src/components/Foo/index.js`. - -```js - import React from 'react'; - - class Foo extends React.Component { - state = { didCheckErrors: false, errors: [], foo: '' }; - - handleChange = ({ target }) => this.setState({ [target.name]: target.value }); - - handleSubmit = () => { - const errors = []; - - if (this.state.value.length === 0) { - errors.push({ id: 'components.Input.error.validation.required' }); - } - - this.setState({ didCheckErrors: !this.state.didCheckErrors, errors }); - } - - render() { - const { didCheckErrors, errors, foo } = this.state; - const inputDescription = { - id: 'my-plugin.inputFoo.description', - params: { bar: 'Something' }, - }; - - // This can also works (it's the same behavior for the label) - // const inputDescription = () => Something; - // const inputDescription = 'Something'; - return ( -
-
-
- Click me } - }} - value={foo} - validations={{ required: true }} - /> - -
-
-
- ) - } - } -``` - -*** - -## InputToggleWithErrors - -Component integrates Label, InputToggle, InputDescription and InputErrors. - -| Property | Type | Required | Description | -| -------- | ---- | -------- | ----------- | -| autoFocus | bool | no | Sets the input's autoFocus | -| className | string | no | Overrides the container className | -| customBootstrapClass | string | no | Allows to override the input bootstrap col system | -| deactivateErrorHighlight | bool | no | Allow to deactivate the red border on the input when there is an error | -| didCheckErrors | bool | no | Use this props to display errors after submitting a form. | -| disabled | bool | no | Disables the input | -| errors | array | no | Array of errors | -| errorsClassName | string | no | Overrides the InputErrors' className | -| errorsStyle | object | no | Overrides the InputErrors' style | -| inputClassName | string | no | Overrides the InputText's className | -| inputDescription | string or object or func | no | Sets the input's description | -| inputDescriptionClassName | string | no | Overrides the InputDescription's className | -| inputDescriptionStyle | object | no | Overrides the InputDescription's style| -| inputStyle | object | no | Overrides the InputText's style | -| label | string or func or object | no sets the input's label | -| labelClassName | string | no | Overrides the Label's className | -| labelStyle | object | no | Overrides the Label's style | -| name | string | yes | The name of the input | -| noErrorsDescription | bool | no | Remove the input's errors description | -| onChange | func | yes | Handler to modify the input's value | -| style | object | no | Overrides the container style | -| tabIndex | string | no | Input's tabIndex | -| validations | object | no | Input's validations | -| value | string | yes | Input's value | - -### Usage - -Please refer to the [InputTextWithErrors](#InputTextWithErrors) documentation. - -*** - -### InputTextAreaWithErrors - -Component integrates Label, InputTextArea, InputDescription and InputErrors. - -| Property | Type | Required | Description | -| -------- | ---- | -------- | ----------- | -| autoFocus | bool | no | Sets the input's autoFocus | -| className | string | no | Overrides the container className | -| customBootstrapClass | string | no | Allows to override the input bootstrap col system | -| deactivateErrorHighlight | bool | no | Allow to deactivate the red border on the input when there is an error | -| didCheckErrors | bool | no | Use this props to display errors after submitting a form. | -| disabled | bool | no | Disables the input | -| errors | array | no | Array of errors | -| errorsClassName | string | no | Overrides the InputErrors' className | -| errorsStyle | object | no | Overrides the InputErrors' style | -| inputClassName | string | no | Overrides the InputText's className | -| inputDescriptionClassName | string | no | Overrides the InputDescription's className | -| inputDescriptionStyle | object | no | Overrides the InputDescription's style| -| inputStyle | object | no | Overrides the InputText's style | -| labelClassName | string | no | Overrides the Label's className | -| labelStyle | object | no | Overrides the Label's style | -| onBlur | func | no | Function executed when the user leaves the input | -| onChange | func | yes | Handler to modify the input's value | -| onFocus | func | no | Function executed when the user enters the input | -| name | string | yes | The name of the input | -| noErrorsDescription | bool | no | Remove the input's errors description | -| placeholder | string | no | Input's placeholder, works with i18n | -| style | object | no | Overrides the container style | -| tabIndex | string | no | Input's tabIndex | -| validations | object | no | Input's validations | -| value | string | yes | Input's value | - -### Usage - -Please refer to the [InputTextWithErrors](#InputTextWithErrors) documentation. - -*** - -## Label - -Label component that integrates FormattedMessage if needed - -| Property | Type | Required | Description | -| -------- | ---- | -------- | ----------- | -| children | node | no | Anything that is wrapped inside the Label | -| className | string | no | custom className for the Label | -| htmlFor | string | no | Represents the id of the element the label is bound to | -| message | func or string or object | no | Define the content of the label | -| style | object | no | Label style property | - - -### Usage - -**Path -** `my-plugin/admin/src/translations.en.json`. - -```json -{ - "foo.label": "This is {bar} label", - "tel.label": "Enter your phone number" -} -``` - -**Path -** `my-plugin/admin/src/components/Foo/index.js`; - -```js -import React from 'react'; -import Label from 'components/Label'; - -import styles from './styles.scss'; - -export default function Foo(props) { - return ( -
- {/* Example without i18n */} -
- ); -} -``` - - -*** - -## OverlayBlocker - -The OverlayBlocker is a React component that is very useful to block user interactions when the strapi server is restarting in order to avoid front-end errors. This component is automatically displayed when the server needs to restart. You need to disable it in order to override the current design (once disabled it won't show on the other plugins so it's really important to enable it back when the component is unmounting). - -### Usage - -| Property | Type | Required | Description | -| -------- | ---- | -------- | ----------- | -| children | node | no | Anything that is wrapped inside the OverlayBlocker | -| isOpen | bool | no | If set to `true` it will display the component | - -### Example - -In this example we'll have a button that when clicked will display the OverlayBlocker for 5 seconds thus 'freezes' the admin so the user can't navigate (it simulates a very long server restart). - -**Path -** `./plugins/my-plugin/admin/src/containers/FooPage/constants.js`. -```js -export const ON_BUTTON_CLICK = 'MyPlugin/FooPage/ON_BUTTON_CLICK'; -export const RESET_SHOW_OVERLAY_PROP = 'MyPlugin/FooPage/RESET_SHOW_OVERLAY_PROP'; -``` - -**Path -** `./plugins/my-plugin/admin/src/containers/FooPage/actions.js`. -```js -import { ON_BUTTON_CLICK, RESET_SHOW_OVERLAY_PROP } from './constants'; - -export function onButtonClick() { - return { - type: ON_BUTTON_CLICK, - }; -} - -export function resetShowOverlayProp() { - return { - type: RESET_SHOW_OVERLAY_PROP, - }; -} -``` - -**Path -** `./plugins/my-plugin/admin/src/containers/FooPage/index.js`. -```js -import React from 'react'; -import PropTypes from 'prop-types'; -import { connect } from 'react-redux'; -import { bindActionCreators, compose } from 'redux'; - -// Design -import Button from 'components/Button'; -import OverlayBlocker from 'components/OverlayBlocker'; - -// Utils -import injectSaga from 'utils/injectSaga'; -import injectReducer from 'utils/injectReducer'; - -// Actions -import { onButtonClick } from './actions'; - -// Reducer -import reducer from './reducer'; - -// Saga -import saga from './saga'; - -// Selectors (see the documentation to see how to use selectors) -import makeSelectFooPage from './selectors'; - - -export class FooPage extends React.Component { - componentDidMount() { - // Disable the AdminPage OverlayBlocker in order to give it a custom design (children) - this.context.disableGlobalOverlayBlocker(); - } - - componentWillUnmount() { - // Enable the AdminPage OverlayBlocker so it is displayed when the server is restarting in the other plugins - this.context.enableGlobalOverlayBlocker(); - } - - render() { - return ( -
- -
-

The app is now blocked for 5 seconds

-
- - -
- ); - } -} - -// Use context to disable or enable the OverlayBlocker -FooPage.contextTypes = { - disableGlobalOverlayBlocker: PropTypes.func.isRequired, - enableGlobalOverlayBlocker: PropTypes.func.isRequired, -}; - -FooPage.propTypes = { - onButtonClick: PropTypes.func.isRequired, - showOverlayBlocker: PropTypes.bool.isRequired, -}; - -const mapStateToProps = makeSelectFooPage(); - -function mapDispatchToProps(dispatch) { - return bindActionCreators( - { - onButtonClick, - }, - dispatch, - ); -} - -const withConnect = connect(mapStateToProps, mapDispatchToProps); -const withReducer = injectReducer({ key: 'fooPage', reducer }); -const withSaga = injectSaga({ key: 'fooPage', saga }); - -export default compose( - withReducer, - withSaga, - withConnect, -)(FooPage); - -``` -**Path -** `./plugins/my-plugin/admin/src/containers/FooPage/reducer.js`. -```js -import { fromJS } from 'immutable'; -import { ON_BUTTON_CLICK, RESET_SHOW_OVERLAY_PROP } from './constants'; - -const initialState = fromJS({ - showOverlayBlocker: false, -}); - -function fooPageReducer(state = initialState, action) { - switch (action.type) { - case ON_BUTTON_CLICK: - return state.set('showOverlayBlocker', true); - case RESET_SHOW_OVERLAY_PROP: - return state.set('showOverlayBlocker', false); - default: - return state; - } -} - -export default fooPageReducer; -``` - -**Path -** `./plugins/my-plugin/admin/src/containers/FooPage/saga.js`. -```js -import { - fork, - put, - takeLatest, -} from 'redux-saga/effects'; - -import { resetShowOverlayProp } from './actions'; - -import { ON_BUTTON_CLICK } from './constants'; - -export function* buttonClicked() { - try { - // Start the timer - yield new Promise(resolve => { - setTimeout(() => { - resolve(); - }, 5000); - }); - - yield put(resetShowOverlayProp()); - } catch(err) { - yield put(resetShowOverlayProp()); - } -} - -export default function* defaultSaga() { - yield fork(takeLatest, ON_BUTTON_CLICK, buttonClicked); -} -``` - -*** - -## PopUp Warning - -PopUp warning library based on [reactstrap](https://reactstrap.github.io/components/modals/). - -{% center %} ![PopUp warning img](../assets/popup-warning.png) {% endcenter %} - -### Usage - -| Property | Type | Required | Description | -| -------- | ---- | -------- | ----------- | -| content | object | no | Used to set the confirm button, cancel button, title, body messages. | -| onConfirm | func | yes | Function executed when the user clicks on the `Confirm button`. | -| isOpen | bool | yes | Show or hide the popup. | -| onlyConfirmButton | bool | yes | Display only the confirm button (`primary`) with `width: 100%`. | -| popUpWarningType | string | yes | Sets the popup body icon. Available types: `danger`, `info`, `notFound`, `success`, `warning` | -| toggleModal | func | yes | Function to toggle the modal. | - - -### Example - -**Path —** `./plugins/my-plugin/admin/src/translations/en.json`. -```json -{ - "popup.danger.button.cancel": "Cancel...", - "popup.danger.button.confirm": "Confirm../", - "popup.danger.message": "Are you sure you want to delete this item?!", - "popup.danger.title": "Please confirm...." -} -``` - -**Path —** `./plugins/my-plugin/admin/src/translations/fr.json`. -```json -{ - "popup.danger.button.cancel": "Annuler...", - "popup.danger.button.label": "Je confirme...", - "popup.danger.message": "Êtes-vous certain de vouloir supprimer ce message?!", - "popup.danger.title": "Merci de confirmer..." -} -``` - -**Path —** `./plugins/my-plugin/admin/src/containers/FooPage/index.js`. -```js -// ... - -import Button from 'components/Button'; -import PopUpWarning from 'components/PopUpWarning'; - -// ... - -class FooPage extends React.Component { - constructor(props) { - super(props); - this.state = { - isOpen: false, - }; - } - - handlePopUpConfirm = () => { - // Some logic Here - this.setState({ isOpen: false }); - } - - render() { - const popupContent = { - cancel: 'my-plugin.popup.danger.button.cancel', - confirm: 'my-plugin.popup.danger.button.confirm', - message: 'my-plugin.popup.danger.message', - title: 'my-plugin.popup.danger.title', - }; - - return ( -
-
- ); - - // Equivalent without custom messages - - // return ( - //
- //
- // ); - } -} - -export default FooPage; -``` diff --git a/docs/package.json b/docs/package.json new file mode 100644 index 0000000000..149e5d6cc0 --- /dev/null +++ b/docs/package.json @@ -0,0 +1,15 @@ +{ + "name": "docs", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "dependencies": { + "directory-tree": "^2.1.0", + "vuepress": "^0.14.2" + } +} From 08bd24c01e1cd033bed9e7261c8b0f1629fe69de Mon Sep 17 00:00:00 2001 From: Martin Muzatko Date: Tue, 28 Aug 2018 11:23:59 +0200 Subject: [PATCH 02/81] Migrated to Vuepress From 2f2ad5180468fd6796c06d2c786a193cf413bca1 Mon Sep 17 00:00:00 2001 From: uyouthe Date: Mon, 10 Sep 2018 20:59:33 +0300 Subject: [PATCH 03/81] Font-family declarations fixed --- .../src/components/DownloadInfo/styles.scss | 2 +- .../src/components/LeftMenuFooter/styles.scss | 2 +- .../admin/src/components/Sub/styles.scss | 3 +- .../admin/src/containers/HomePage/styles.scss | 5 +- .../src/containers/LocaleToggle/styles.scss | 2 +- .../admin/src/styles/base/fonts.scss | 56 +++++++++---------- .../components/BlockerComponent/styles.scss | 4 +- .../lib/src/components/Button/styles.scss | 4 +- .../EmptyAttributesBlock/styles.scss | 2 +- .../lib/src/components/HeaderNav/styles.scss | 2 +- .../lib/src/components/InputAddon/styles.scss | 4 +- .../InputCheckboxWithErrors/styles.scss | 4 +- .../lib/src/components/InputDate/styles.scss | 2 +- .../components/InputDescription/styles.scss | 2 +- .../lib/src/components/InputEmail/styles.scss | 6 +- .../components/InputFileDetails/styles.scss | 2 +- .../src/components/InputNumber/styles.scss | 2 +- .../src/components/InputPassword/styles.scss | 2 +- .../src/components/InputSearch/styles.scss | 2 +- .../src/components/InputSelect/styles.scss | 2 +- .../lib/src/components/InputText/styles.scss | 2 +- .../src/components/InputTextArea/styles.scss | 2 +- .../InputTextAreaWithErrors/styles.scss | 2 +- .../src/components/InputToggle/styles.scss | 2 +- .../src/components/OverlayBlocker/styles.scss | 2 +- .../lib/src/components/PageFooter/styles.scss | 2 +- .../src/components/PopUpWarning/styles.scss | 6 +- .../src/components/CustomButton/index.js | 2 +- .../EmptyAttributesView/styles.scss | 2 +- .../InputJSONWithErrors/styles.scss | 2 +- .../components/Wysiwyg/componentsStyles.scss | 6 +- .../admin/src/components/Wysiwyg/styles.scss | 4 +- .../WysiwygBottomControls/styles.scss | 2 +- .../components/WysiwygWithErrors/styles.scss | 2 +- .../admin/src/containers/ListPage/styles.scss | 2 +- .../src/components/ContentHeader/styles.scss | 4 +- .../EmptyContentTypeView/styles.scss | 2 +- .../InputCheckboxWithNestedInputs/styles.scss | 4 +- .../admin/src/components/List/styles.scss | 2 +- .../src/components/PluginLeftMenu/styles.scss | 2 +- .../PluginLeftMenuSection/styles.scss | 2 +- .../src/components/PopUpForm/styles.scss | 10 ++-- .../src/components/PopUpRelations/styles.scss | 12 ++-- .../src/components/RelationBox/styles.scss | 4 +- .../src/components/TableList/styles.scss | 2 +- .../admin/src/components/Button/styles.scss | 4 +- .../src/components/ContentHeader/styles.scss | 4 +- .../src/components/HeaderNav/styles.scss | 2 +- .../src/components/InputEnum/styles.scss | 2 +- .../src/components/InputSelect/styles.scss | 10 ++-- .../src/components/InputToggle/styles.scss | 2 +- .../admin/src/components/List/styles.scss | 14 ++--- .../PluginLeftMenuSection/styles.scss | 2 +- .../components/WithFormSection/styles.scss | 4 +- .../src/components/WithInput/styles.scss | 10 ++-- .../admin/src/containers/HomePage/styles.scss | 2 +- .../src/components/HeaderNav/styles.scss | 2 +- .../InputSearchContainer/styles.scss | 4 +- .../admin/src/components/List/styles.scss | 2 +- .../admin/src/components/Plugins/styles.scss | 2 +- .../src/components/PopUpForm/styles.scss | 8 +-- .../admin/src/containers/AuthPage/styles.scss | 2 +- 62 files changed, 136 insertions(+), 134 deletions(-) diff --git a/packages/strapi-admin/admin/src/components/DownloadInfo/styles.scss b/packages/strapi-admin/admin/src/components/DownloadInfo/styles.scss index 0f235ed3f9..d8c51a7aae 100644 --- a/packages/strapi-admin/admin/src/components/DownloadInfo/styles.scss +++ b/packages/strapi-admin/admin/src/components/DownloadInfo/styles.scss @@ -9,7 +9,7 @@ padding-top: 3rem; // color: #F64D0A; text-align: center; - font-family: Lato; + font-family: 'Lato', sans-serif; font-size: 1.3rem; > img { width: 2.5rem; diff --git a/packages/strapi-admin/admin/src/components/LeftMenuFooter/styles.scss b/packages/strapi-admin/admin/src/components/LeftMenuFooter/styles.scss index ad1f464c5d..92a2efa3cc 100755 --- a/packages/strapi-admin/admin/src/components/LeftMenuFooter/styles.scss +++ b/packages/strapi-admin/admin/src/components/LeftMenuFooter/styles.scss @@ -11,7 +11,7 @@ padding-left: 15px; padding-right: 15px; line-height: 3rem; - font-family: 'Lato'; + font-family: 'Lato', sans-serif; background-color: rgba(255, 255, 255, .02); font-size: 1rem; font-weight: 400; diff --git a/packages/strapi-admin/admin/src/components/Sub/styles.scss b/packages/strapi-admin/admin/src/components/Sub/styles.scss index 017804a472..8ad24c8340 100644 --- a/packages/strapi-admin/admin/src/components/Sub/styles.scss +++ b/packages/strapi-admin/admin/src/components/Sub/styles.scss @@ -10,7 +10,8 @@ > span { text-decoration: none; - font-family: Lato-Bold; + font-family: 'Lato', sans-serif; +font-weight: bold; font-size: 20px; color: #333740; letter-spacing: 0; diff --git a/packages/strapi-admin/admin/src/containers/HomePage/styles.scss b/packages/strapi-admin/admin/src/containers/HomePage/styles.scss index 6c8c72d2fd..ebdd52216f 100644 --- a/packages/strapi-admin/admin/src/containers/HomePage/styles.scss +++ b/packages/strapi-admin/admin/src/containers/HomePage/styles.scss @@ -9,13 +9,14 @@ line-height: 18px; text-decoration: none; > span { - font-family: Lato-Bold; + font-family: 'Lato', sans-serif; +font-weight: bold; font-size: 16px; color: #333740; letter-spacing: 0; } > p { - font-family: Lato-Regular; + font-family: 'Lato', sans-serif; font-size: 13px; color: #919BAE; letter-spacing: 0; diff --git a/packages/strapi-admin/admin/src/containers/LocaleToggle/styles.scss b/packages/strapi-admin/admin/src/containers/LocaleToggle/styles.scss index 712c17fb73..7d4afde11d 100755 --- a/packages/strapi-admin/admin/src/containers/LocaleToggle/styles.scss +++ b/packages/strapi-admin/admin/src/containers/LocaleToggle/styles.scss @@ -40,7 +40,7 @@ span { color: #333740; font-size: 11px; - font-family: Lato; + font-family: 'Lato', sans-serif; font-weight: 600; letter-spacing: 0.5; text-transform: uppercase; diff --git a/packages/strapi-admin/admin/src/styles/base/fonts.scss b/packages/strapi-admin/admin/src/styles/base/fonts.scss index 3bec2f5316..40d614afff 100755 --- a/packages/strapi-admin/admin/src/styles/base/fonts.scss +++ b/packages/strapi-admin/admin/src/styles/base/fonts.scss @@ -1,6 +1,6 @@ /* Lato (hairline, regular) */ @font-face { - font-family: Lato; + font-family: 'Lato', sans-serif; font-weight: 100; font-style: normal; text-rendering: optimizeLegibility; @@ -8,7 +8,7 @@ } /* Lato (hairline, italic) */ @font-face { - font-family: Lato; + font-family: 'Lato', sans-serif; font-weight: 100; font-style: italic; text-rendering: optimizeLegibility; @@ -16,7 +16,7 @@ } /* Lato (thin, regular) */ @font-face { - font-family: Lato; + font-family: 'Lato', sans-serif; font-weight: 200; font-style: normal; text-rendering: optimizeLegibility; @@ -24,7 +24,7 @@ } /* Lato (thin, italic) */ @font-face { - font-family: Lato; + font-family: 'Lato', sans-serif; font-weight: 200; font-style: italic; text-rendering: optimizeLegibility; @@ -32,7 +32,7 @@ } /* Lato (light, regular) */ @font-face { - font-family: Lato; + font-family: 'Lato', sans-serif; font-weight: 300; font-style: normal; text-rendering: optimizeLegibility; @@ -40,7 +40,7 @@ } /* Lato (light, italic) */ @font-face { - font-family: Lato; + font-family: 'Lato', sans-serif; font-weight: 300; font-style: italic; text-rendering: optimizeLegibility; @@ -48,7 +48,7 @@ } /* Lato (normal, regular) */ @font-face { - font-family: Lato; + font-family: 'Lato', sans-serif; font-weight: 400; font-style: normal; text-rendering: optimizeLegibility; @@ -56,7 +56,7 @@ } /* Lato (normal, italic) */ @font-face { - font-family: Lato; + font-family: 'Lato', sans-serif; font-weight: 400; font-style: italic; text-rendering: optimizeLegibility; @@ -64,7 +64,7 @@ } /* Lato (medium, regular) */ @font-face { - font-family: "Lato Medium"; + font-family: 'Lato', sans-serif; font-weight: 400; font-style: normal; text-rendering: optimizeLegibility; @@ -72,7 +72,7 @@ } /* Lato (medium, italic) */ @font-face { - font-family: "Lato Medium"; + font-family: 'Lato', sans-serif; font-weight: 400; font-style: italic; text-rendering: optimizeLegibility; @@ -80,7 +80,7 @@ } /* Lato (semibold, regular) */ @font-face { - font-family: Lato; + font-family: 'Lato', sans-serif; font-weight: 500; font-style: normal; text-rendering: optimizeLegibility; @@ -88,7 +88,7 @@ } /* Lato (semibold, italic) */ @font-face { - font-family: Lato; + font-family: 'Lato', sans-serif; font-weight: 500; font-style: italic; text-rendering: optimizeLegibility; @@ -96,7 +96,7 @@ } /* Lato (bold, regular) */ @font-face { - font-family: Lato; + font-family: 'Lato', sans-serif; font-weight: 600; font-style: normal; text-rendering: optimizeLegibility; @@ -104,7 +104,7 @@ } /* Lato (bold, italic) */ @font-face { - font-family: Lato; + font-family: 'Lato', sans-serif; font-weight: 600; font-style: italic; text-rendering: optimizeLegibility; @@ -112,7 +112,7 @@ } /* Lato (heavy, regular) */ @font-face { - font-family: Lato; + font-family: 'Lato', sans-serif; font-weight: 800; font-style: normal; text-rendering: optimizeLegibility; @@ -120,7 +120,7 @@ } /* Lato (heavy, italic) */ @font-face { - font-family: Lato; + font-family: 'Lato', sans-serif; font-weight: 800; font-style: italic; text-rendering: optimizeLegibility; @@ -128,7 +128,7 @@ } /* Lato (black, regular) */ @font-face { - font-family: Lato; + font-family: 'Lato', sans-serif; font-weight: 900; font-style: normal; text-rendering: optimizeLegibility; @@ -136,7 +136,7 @@ } /* Lato (black, italic) */ @font-face { - font-family: Lato; + font-family: 'Lato', sans-serif; font-weight: 900; font-style: italic; text-rendering: optimizeLegibility; @@ -157,7 +157,7 @@ /* OpenSans (light, regular) */ @font-face { - font-family: 'OpenSans'; + font-family: 'OpenSans', sans-serif; font-weight: 300; font-style: normal; text-rendering: optimizeLegibility; @@ -165,7 +165,7 @@ } /* OpenSans (light, italic) */ @font-face { - font-family: 'OpenSans'; + font-family: 'OpenSans', sans-serif; font-weight: 300; font-style: italic; text-rendering: optimizeLegibility; @@ -173,7 +173,7 @@ } /* OpenSans (normal, regular) */ @font-face { - font-family: 'OpenSans'; + font-family: 'OpenSans', sans-serif; font-weight: 400; font-style: normal; text-rendering: optimizeLegibility; @@ -181,7 +181,7 @@ } /* OpenSans (normal, italic) */ @font-face { - font-family: 'OpenSans'; + font-family: 'OpenSans', sans-serif; font-weight: 400; font-style: italic; text-rendering: optimizeLegibility; @@ -189,7 +189,7 @@ } /* OpenSans (semibold, regular) */ @font-face { - font-family: 'OpenSans'; + font-family: 'OpenSans', sans-serif; font-weight: 500; font-style: normal; text-rendering: optimizeLegibility; @@ -197,7 +197,7 @@ } /* OpenSans (semibold, italic) */ @font-face { - font-family: 'OpenSans'; + font-family: 'OpenSans', sans-serif; font-weight: 500; font-style: italic; text-rendering: optimizeLegibility; @@ -205,7 +205,7 @@ } /* OpenSans (bold, regular) */ @font-face { - font-family: 'OpenSans'; + font-family: 'OpenSans', sans-serif; font-weight: 600; font-style: normal; text-rendering: optimizeLegibility; @@ -213,7 +213,7 @@ } /* OpenSans (bold, italic) */ @font-face { - font-family: 'OpenSans'; + font-family: 'OpenSans', sans-serif; font-weight: 600; font-style: italic; text-rendering: optimizeLegibility; @@ -221,7 +221,7 @@ } /* OpenSans (heavy, regular) */ @font-face { - font-family: 'OpenSans'; + font-family: 'OpenSans', sans-serif; font-weight: 800; font-style: normal; text-rendering: optimizeLegibility; @@ -229,7 +229,7 @@ } /* OpenSans (heavy, italic) */ @font-face { - font-family: 'OpenSans'; + font-family: 'OpenSans', sans-serif; font-weight: 800; font-style: italic; text-rendering: optimizeLegibility; diff --git a/packages/strapi-helper-plugin/lib/src/components/BlockerComponent/styles.scss b/packages/strapi-helper-plugin/lib/src/components/BlockerComponent/styles.scss index b8112563ca..f3c8c32a70 100644 --- a/packages/strapi-helper-plugin/lib/src/components/BlockerComponent/styles.scss +++ b/packages/strapi-helper-plugin/lib/src/components/BlockerComponent/styles.scss @@ -5,7 +5,7 @@ .header { display: flex; justify-content: center; - font-family: Lato; + font-family: 'Lato', sans-serif; > div { padding-top: 2.5rem; > h4 { @@ -77,7 +77,7 @@ margin-right: 13px; } cursor: pointer; - font-family: Lato; + font-family: 'Lato', sans-serif; -webkit-font-smoothing: antialiased; &:focus { outline: 0; diff --git a/packages/strapi-helper-plugin/lib/src/components/Button/styles.scss b/packages/strapi-helper-plugin/lib/src/components/Button/styles.scss index 1d52efe957..d54755b052 100755 --- a/packages/strapi-helper-plugin/lib/src/components/Button/styles.scss +++ b/packages/strapi-helper-plugin/lib/src/components/Button/styles.scss @@ -29,7 +29,7 @@ white-space: nowrap; margin-right: 1.8rem; cursor: pointer; - font-family: Lato; + font-family: 'Lato', sans-serif; -webkit-font-smoothing: antialiased; &:focus { outline: 0; @@ -155,7 +155,7 @@ padding: 0; border-radius: 0.3rem; letter-spacing: .5rem; - font-family: Lato; + font-family: 'Lato', sans-serif; cursor: not-allowed; opacity: .65; &:focus { diff --git a/packages/strapi-helper-plugin/lib/src/components/EmptyAttributesBlock/styles.scss b/packages/strapi-helper-plugin/lib/src/components/EmptyAttributesBlock/styles.scss index bfcc71f833..8d43bca861 100644 --- a/packages/strapi-helper-plugin/lib/src/components/EmptyAttributesBlock/styles.scss +++ b/packages/strapi-helper-plugin/lib/src/components/EmptyAttributesBlock/styles.scss @@ -7,7 +7,7 @@ background-repeat: repeat; text-align: center; font-size: 1.4rem; - font-family: Lato; + font-family: 'Lato', sans-serif; box-shadow: 2px 2px 4px #E3E9F3; } diff --git a/packages/strapi-helper-plugin/lib/src/components/HeaderNav/styles.scss b/packages/strapi-helper-plugin/lib/src/components/HeaderNav/styles.scss index cf9656eaf8..19de406980 100644 --- a/packages/strapi-helper-plugin/lib/src/components/HeaderNav/styles.scss +++ b/packages/strapi-helper-plugin/lib/src/components/HeaderNav/styles.scss @@ -30,7 +30,7 @@ border-radius: 2px 0 0 0; background-color: darken(#F5F5F5, 50%); text-decoration: none !important; - font-family: Lato; + font-family: 'Lato', sans-serif; font-size: 1.3rem; color: #333740 !important; line-height: 1.6rem; diff --git a/packages/strapi-helper-plugin/lib/src/components/InputAddon/styles.scss b/packages/strapi-helper-plugin/lib/src/components/InputAddon/styles.scss index 00d170af56..cb0f86ef0f 100644 --- a/packages/strapi-helper-plugin/lib/src/components/InputAddon/styles.scss +++ b/packages/strapi-helper-plugin/lib/src/components/InputAddon/styles.scss @@ -9,7 +9,7 @@ color: rgba(16, 22, 34, 0.5); line-height: 3.2rem; font-size: 1.3rem; - font-family: 'Lato'; + font-family: 'Lato', sans-serif; font-weight: 600!important; -moz-appearance: none; -webkit-appearance: none; @@ -45,7 +45,7 @@ border-radius: 0.25rem; line-height: 3.4rem; font-size: 1.3rem; - font-family: 'Lato' !important; + font-family: 'Lato', sans-serif !important; box-shadow: 0px 1px 1px rgba(104, 118, 142, 0.05); &:focus { border-color: #78caff; diff --git a/packages/strapi-helper-plugin/lib/src/components/InputCheckboxWithErrors/styles.scss b/packages/strapi-helper-plugin/lib/src/components/InputCheckboxWithErrors/styles.scss index 04c86505b7..d59158f80a 100644 --- a/packages/strapi-helper-plugin/lib/src/components/InputCheckboxWithErrors/styles.scss +++ b/packages/strapi-helper-plugin/lib/src/components/InputCheckboxWithErrors/styles.scss @@ -1,7 +1,7 @@ .container { margin-bottom: 1.5rem; font-size: 1.3rem; - font-family: 'Lato'; + font-family: 'Lato', sans-serif; } .inputCheckboxDescriptionContainer { @@ -12,7 +12,7 @@ > small { color: #9EA7B8; - font-family: 'Lato'; + font-family: 'Lato', sans-serif; font-size: 1.2rem; } } diff --git a/packages/strapi-helper-plugin/lib/src/components/InputDate/styles.scss b/packages/strapi-helper-plugin/lib/src/components/InputDate/styles.scss index 1d3cb5d61e..38a3c453d5 100644 --- a/packages/strapi-helper-plugin/lib/src/components/InputDate/styles.scss +++ b/packages/strapi-helper-plugin/lib/src/components/InputDate/styles.scss @@ -7,6 +7,6 @@ border-radius: 0.25rem; line-height: 3.4rem; font-size: 1.3rem; - font-family: 'Lato' !important; + font-family: 'Lato', sans-serif !important; box-shadow: 0px 1px 1px rgba(104, 118, 142, 0.05); } diff --git a/packages/strapi-helper-plugin/lib/src/components/InputDescription/styles.scss b/packages/strapi-helper-plugin/lib/src/components/InputDescription/styles.scss index aad2ec0fda..bf4e7e89c7 100644 --- a/packages/strapi-helper-plugin/lib/src/components/InputDescription/styles.scss +++ b/packages/strapi-helper-plugin/lib/src/components/InputDescription/styles.scss @@ -5,7 +5,7 @@ > small { color: #9EA7B8; - font-family: 'Lato'; + font-family: 'Lato', sans-serif; font-size: 1.2rem; } } diff --git a/packages/strapi-helper-plugin/lib/src/components/InputEmail/styles.scss b/packages/strapi-helper-plugin/lib/src/components/InputEmail/styles.scss index 2e2c98315e..7479929b24 100644 --- a/packages/strapi-helper-plugin/lib/src/components/InputEmail/styles.scss +++ b/packages/strapi-helper-plugin/lib/src/components/InputEmail/styles.scss @@ -9,7 +9,7 @@ color: rgba(16, 22, 34, 0.5); line-height: 3.2rem; font-size: 1.3rem; - font-family: 'Lato'; + font-family: 'Lato', sans-serif; font-weight: 600!important; text-transform: capitalize; -moz-appearance: none; @@ -21,7 +21,7 @@ color: #B3B5B9; font-size: 16px; font-weight: 900; - font-family: Lato; + font-family: 'Lato', sans-serif; } & + input { @@ -43,7 +43,7 @@ border-radius: 0.25rem; line-height: 3.4rem; font-size: 1.3rem; - font-family: 'Lato' !important; + font-family: 'Lato', sans-serif !important; box-shadow: 0px 1px 1px rgba(104, 118, 142, 0.05); &:focus { border-color: #78caff; diff --git a/packages/strapi-helper-plugin/lib/src/components/InputFileDetails/styles.scss b/packages/strapi-helper-plugin/lib/src/components/InputFileDetails/styles.scss index 86d3f4b501..cae9293da0 100644 --- a/packages/strapi-helper-plugin/lib/src/components/InputFileDetails/styles.scss +++ b/packages/strapi-helper-plugin/lib/src/components/InputFileDetails/styles.scss @@ -68,7 +68,7 @@ .positionContainer { margin-left: 10px; color: #333740; - font-family: Lato; + font-family: 'Lato', sans-serif; -webkit-font-smoothing: antialiased; > span:first-child { font-size: 13px; diff --git a/packages/strapi-helper-plugin/lib/src/components/InputNumber/styles.scss b/packages/strapi-helper-plugin/lib/src/components/InputNumber/styles.scss index 2d64a09287..eb29b27a16 100644 --- a/packages/strapi-helper-plugin/lib/src/components/InputNumber/styles.scss +++ b/packages/strapi-helper-plugin/lib/src/components/InputNumber/styles.scss @@ -7,6 +7,6 @@ border-radius: 0.25rem; line-height: 3.4rem; font-size: 1.3rem; - font-family: 'Lato' !important; + font-family: 'Lato', sans-serif !important; box-shadow: 0px 1px 1px rgba(104, 118, 142, 0.05); } diff --git a/packages/strapi-helper-plugin/lib/src/components/InputPassword/styles.scss b/packages/strapi-helper-plugin/lib/src/components/InputPassword/styles.scss index f67c0defee..33d0bfc856 100644 --- a/packages/strapi-helper-plugin/lib/src/components/InputPassword/styles.scss +++ b/packages/strapi-helper-plugin/lib/src/components/InputPassword/styles.scss @@ -7,7 +7,7 @@ border-radius: 0.25rem; line-height: 3.4rem; font-size: 1.3rem; - font-family: 'Lato' !important; + font-family: 'Lato', sans-serif !important; box-shadow: 0px 1px 1px rgba(104, 118, 142, 0.05); } diff --git a/packages/strapi-helper-plugin/lib/src/components/InputSearch/styles.scss b/packages/strapi-helper-plugin/lib/src/components/InputSearch/styles.scss index 46b72d659d..bd3112ba2a 100644 --- a/packages/strapi-helper-plugin/lib/src/components/InputSearch/styles.scss +++ b/packages/strapi-helper-plugin/lib/src/components/InputSearch/styles.scss @@ -43,7 +43,7 @@ border-radius: 0.25rem; line-height: 3.4rem; font-size: 1.3rem; - font-family: 'Lato' !important; + font-family: 'Lato', sans-serif !important; box-shadow: 0px 1px 1px rgba(104, 118, 142, 0.05); &:focus { border-color: #78caff; diff --git a/packages/strapi-helper-plugin/lib/src/components/InputSelect/styles.scss b/packages/strapi-helper-plugin/lib/src/components/InputSelect/styles.scss index 7aa4ac9c3f..61ee8a808f 100644 --- a/packages/strapi-helper-plugin/lib/src/components/InputSelect/styles.scss +++ b/packages/strapi-helper-plugin/lib/src/components/InputSelect/styles.scss @@ -10,7 +10,7 @@ border-radius: 0.25rem; line-height: 3.2rem; font-size: 1.3rem; - font-family: 'Lato' !important; + font-family: 'Lato', sans-serif !important; -moz-appearance: none; -webkit-appearance: none; box-shadow: 0px 1px 1px rgba(104, 118, 142, 0.05); diff --git a/packages/strapi-helper-plugin/lib/src/components/InputText/styles.scss b/packages/strapi-helper-plugin/lib/src/components/InputText/styles.scss index 4a30c12c8a..38dd06acf6 100644 --- a/packages/strapi-helper-plugin/lib/src/components/InputText/styles.scss +++ b/packages/strapi-helper-plugin/lib/src/components/InputText/styles.scss @@ -7,6 +7,6 @@ border-radius: 0.25rem; line-height: 3.4rem; font-size: 1.3rem; - font-family: 'Lato' !important; + font-family: 'Lato', sans-serif !important; box-shadow: 0px 1px 1px rgba(104, 118, 142, 0.05); } diff --git a/packages/strapi-helper-plugin/lib/src/components/InputTextArea/styles.scss b/packages/strapi-helper-plugin/lib/src/components/InputTextArea/styles.scss index b187f2f40f..561622736a 100644 --- a/packages/strapi-helper-plugin/lib/src/components/InputTextArea/styles.scss +++ b/packages/strapi-helper-plugin/lib/src/components/InputTextArea/styles.scss @@ -7,6 +7,6 @@ border-radius: 0.25rem; line-height: 1.8rem; font-size: 1.3rem; - font-family: 'Lato' !important; + font-family: 'Lato', sans-serif !important; box-shadow: 0px 1px 1px rgba(104, 118, 142, 0.05); } diff --git a/packages/strapi-helper-plugin/lib/src/components/InputTextAreaWithErrors/styles.scss b/packages/strapi-helper-plugin/lib/src/components/InputTextAreaWithErrors/styles.scss index efc097e070..688351a1c9 100644 --- a/packages/strapi-helper-plugin/lib/src/components/InputTextAreaWithErrors/styles.scss +++ b/packages/strapi-helper-plugin/lib/src/components/InputTextAreaWithErrors/styles.scss @@ -1,5 +1,5 @@ .containerTextArea { margin-bottom: 1.5rem; font-size: 1.3rem; - font-family: 'Lato'; + font-family: 'Lato', sans-serif; } diff --git a/packages/strapi-helper-plugin/lib/src/components/InputToggle/styles.scss b/packages/strapi-helper-plugin/lib/src/components/InputToggle/styles.scss index 8c257908a4..7639008538 100644 --- a/packages/strapi-helper-plugin/lib/src/components/InputToggle/styles.scss +++ b/packages/strapi-helper-plugin/lib/src/components/InputToggle/styles.scss @@ -37,7 +37,7 @@ font-weight: 600; font-size: 1.2rem; letter-spacing: 0.1rem; - font-family: Lato; + font-family: 'Lato', sans-serif; line-height: 3.4rem; cursor: pointer; &:first-of-type { diff --git a/packages/strapi-helper-plugin/lib/src/components/OverlayBlocker/styles.scss b/packages/strapi-helper-plugin/lib/src/components/OverlayBlocker/styles.scss index e365f100cf..01f7c855be 100644 --- a/packages/strapi-helper-plugin/lib/src/components/OverlayBlocker/styles.scss +++ b/packages/strapi-helper-plugin/lib/src/components/OverlayBlocker/styles.scss @@ -86,7 +86,7 @@ border: none; background: linear-gradient(315deg, #0097F6 0%, #005EEA 100%); color: white; - font-family: Lato; + font-family: 'Lato', sans-serif; font-weight: 600; -webkit-font-smoothing: antialiased; cursor: pointer; diff --git a/packages/strapi-helper-plugin/lib/src/components/PageFooter/styles.scss b/packages/strapi-helper-plugin/lib/src/components/PageFooter/styles.scss index 934156eed0..f2073ac5ce 100644 --- a/packages/strapi-helper-plugin/lib/src/components/PageFooter/styles.scss +++ b/packages/strapi-helper-plugin/lib/src/components/PageFooter/styles.scss @@ -29,7 +29,7 @@ border-radius: 0.25rem; line-height: 29px; font-size: 1.3rem; - font-family: 'Lato' !important; + font-family: 'Lato', sans-serif !important; -moz-appearance: none; -webkit-appearance: none; } diff --git a/packages/strapi-helper-plugin/lib/src/components/PopUpWarning/styles.scss b/packages/strapi-helper-plugin/lib/src/components/PopUpWarning/styles.scss index 4616bcf0b8..a91f2ce961 100644 --- a/packages/strapi-helper-plugin/lib/src/components/PopUpWarning/styles.scss +++ b/packages/strapi-helper-plugin/lib/src/components/PopUpWarning/styles.scss @@ -12,7 +12,7 @@ > h5 { width: 100%; text-align: center; - font-family: Lato; + font-family: 'Lato', sans-serif; font-weight: bold!important; font-size: 1.8rem!important; } @@ -61,7 +61,7 @@ padding: .1rem; color: #F64D0A; text-align: center; - font-family: Lato; + font-family: 'Lato', sans-serif; font-size: 1.3rem; > img { @@ -92,7 +92,7 @@ border-radius: 0.3rem; background-color: transparent; text-transform: capitalize; - font-family: Lato; + font-family: 'Lato', sans-serif; cursor: pointer; > i { diff --git a/packages/strapi-plugin-content-manager/admin/src/components/CustomButton/index.js b/packages/strapi-plugin-content-manager/admin/src/components/CustomButton/index.js index c7c29ae4dc..7356ee06ae 100644 --- a/packages/strapi-plugin-content-manager/admin/src/components/CustomButton/index.js +++ b/packages/strapi-plugin-content-manager/admin/src/components/CustomButton/index.js @@ -11,7 +11,7 @@ const CustomButton = styled.button` line-height: 28px; font-size: 13px; font-weight: 500; - font-family: Lato; + font-family: 'Lato', sans-serif; -webkit-font-smoothing-antialiased; cursor: pointer; &:hover { diff --git a/packages/strapi-plugin-content-manager/admin/src/components/EmptyAttributesView/styles.scss b/packages/strapi-plugin-content-manager/admin/src/components/EmptyAttributesView/styles.scss index d4e09b31c1..53f1186ce1 100644 --- a/packages/strapi-plugin-content-manager/admin/src/components/EmptyAttributesView/styles.scss +++ b/packages/strapi-plugin-content-manager/admin/src/components/EmptyAttributesView/styles.scss @@ -10,7 +10,7 @@ background-repeat: repeat; text-align: center; font-size: 1.4rem; - font-family: Lato; + font-family: 'Lato', sans-serif; box-shadow: 2px 2px 4px #E3E9F3; } diff --git a/packages/strapi-plugin-content-manager/admin/src/components/InputJSONWithErrors/styles.scss b/packages/strapi-plugin-content-manager/admin/src/components/InputJSONWithErrors/styles.scss index ee2da47dc1..f3f0b734f3 100644 --- a/packages/strapi-plugin-content-manager/admin/src/components/InputJSONWithErrors/styles.scss +++ b/packages/strapi-plugin-content-manager/admin/src/components/InputJSONWithErrors/styles.scss @@ -1,5 +1,5 @@ .containerJSON { margin-bottom: 1.6rem; font-size: 1.3rem; - font-family: 'Lato'; + font-family: 'Lato', sans-serif; } diff --git a/packages/strapi-plugin-content-manager/admin/src/components/Wysiwyg/componentsStyles.scss b/packages/strapi-plugin-content-manager/admin/src/components/Wysiwyg/componentsStyles.scss index 8bfa287dfa..4e68f0348d 100644 --- a/packages/strapi-plugin-content-manager/admin/src/components/Wysiwyg/componentsStyles.scss +++ b/packages/strapi-plugin-content-manager/admin/src/components/Wysiwyg/componentsStyles.scss @@ -6,14 +6,14 @@ font-size: 16px; background-color: #fff; line-height: 24px !important; - font-family: "OpenSans"; + font-family: 'OpenSans', sans-serif; cursor: text; // TODO define rules for header's margin h1, h2, h3, h4, h5, h6 { margin: 0; line-height: 24px !important; - font-family: "OpenSans"; + font-family: 'OpenSans', sans-serif; } h1 { @@ -155,7 +155,7 @@ h1+.editorParagraph{ background-color: #FAFAFB; line-height: 30px; font-size: 12px; - font-family: Lato; + font-family: 'Lato', sans-serif; background-color: #fff; border-bottom: 1px solid #F3F4F4; line-height: 49px; diff --git a/packages/strapi-plugin-content-manager/admin/src/components/Wysiwyg/styles.scss b/packages/strapi-plugin-content-manager/admin/src/components/Wysiwyg/styles.scss index 400028c10d..7ec5fa502d 100644 --- a/packages/strapi-plugin-content-manager/admin/src/components/Wysiwyg/styles.scss +++ b/packages/strapi-plugin-content-manager/admin/src/components/Wysiwyg/styles.scss @@ -70,7 +70,7 @@ .editorBlockquote { border-left: 5px solid #eee; - font-family: Lato; + font-family: 'Lato', sans-serif; font-style: italic; margin: 16px 0; padding: 10px 20px; @@ -80,7 +80,7 @@ margin-bottom: 0!important; padding: 5px; background-color: rgba(0, 0, 0, 0.05); - font-family: Lato; + font-family: 'Lato', sans-serif; } diff --git a/packages/strapi-plugin-content-manager/admin/src/components/WysiwygBottomControls/styles.scss b/packages/strapi-plugin-content-manager/admin/src/components/WysiwygBottomControls/styles.scss index c4d10ab7f1..9da1b2bc2c 100644 --- a/packages/strapi-plugin-content-manager/admin/src/components/WysiwygBottomControls/styles.scss +++ b/packages/strapi-plugin-content-manager/admin/src/components/WysiwygBottomControls/styles.scss @@ -7,7 +7,7 @@ background-color: #FAFAFB; line-height: 30px; font-size: 13px; - font-family: Lato; + font-family: 'Lato', sans-serif; border-top: 1px dashed #e3e4e4; > div:first-child { diff --git a/packages/strapi-plugin-content-manager/admin/src/components/WysiwygWithErrors/styles.scss b/packages/strapi-plugin-content-manager/admin/src/components/WysiwygWithErrors/styles.scss index 6be2e04f9e..c1ab563cfa 100644 --- a/packages/strapi-plugin-content-manager/admin/src/components/WysiwygWithErrors/styles.scss +++ b/packages/strapi-plugin-content-manager/admin/src/components/WysiwygWithErrors/styles.scss @@ -1,7 +1,7 @@ .containerWysiwyg { margin-bottom: 1.6rem; font-size: 1.3rem; - font-family: 'Lato'; + font-family: 'Lato', sans-serif; } .wysLoader { diff --git a/packages/strapi-plugin-content-manager/admin/src/containers/ListPage/styles.scss b/packages/strapi-plugin-content-manager/admin/src/containers/ListPage/styles.scss index c4c8a18f83..f637b9e52a 100644 --- a/packages/strapi-plugin-content-manager/admin/src/containers/ListPage/styles.scss +++ b/packages/strapi-plugin-content-manager/admin/src/containers/ListPage/styles.scss @@ -26,7 +26,7 @@ .listPageDropdownWrapper { display: flex; justify-content: flex-end; - font-family: Lato; + font-family: 'Lato', sans-serif; margin-top: -2px; -webkit-font-smoothing: antialiased; diff --git a/packages/strapi-plugin-content-type-builder/admin/src/components/ContentHeader/styles.scss b/packages/strapi-plugin-content-type-builder/admin/src/components/ContentHeader/styles.scss index 8ff27cbabd..926eb436bc 100644 --- a/packages/strapi-plugin-content-type-builder/admin/src/components/ContentHeader/styles.scss +++ b/packages/strapi-plugin-content-type-builder/admin/src/components/ContentHeader/styles.scss @@ -1,14 +1,14 @@ .contentHeader { /* stylelint-disable */ position: relative; margin: 2.3rem 0rem 3.3rem 0rem; - font-family: Lato; + font-family: 'Lato', sans-serif; display: flex; justify-content: space-between; } .title { color: #333740; - font-family: Lato; + font-family: 'Lato', sans-serif; font-size: 2.4rem; line-height: 2.9rem; font-weight: 600; diff --git a/packages/strapi-plugin-content-type-builder/admin/src/components/EmptyContentTypeView/styles.scss b/packages/strapi-plugin-content-type-builder/admin/src/components/EmptyContentTypeView/styles.scss index ede68ad92b..9e8e73913d 100644 --- a/packages/strapi-plugin-content-type-builder/admin/src/components/EmptyContentTypeView/styles.scss +++ b/packages/strapi-plugin-content-type-builder/admin/src/components/EmptyContentTypeView/styles.scss @@ -8,7 +8,7 @@ background-repeat: repeat; text-align: center; font-size: 1.4rem; - font-family: Lato; + font-family: 'Lato', sans-serif; box-shadow: 2px 2px 4px #E3E9F3; > img { position: absolute; diff --git a/packages/strapi-plugin-content-type-builder/admin/src/components/InputCheckboxWithNestedInputs/styles.scss b/packages/strapi-plugin-content-type-builder/admin/src/components/InputCheckboxWithNestedInputs/styles.scss index 44d08921d2..558fa08e5f 100644 --- a/packages/strapi-plugin-content-type-builder/admin/src/components/InputCheckboxWithNestedInputs/styles.scss +++ b/packages/strapi-plugin-content-type-builder/admin/src/components/InputCheckboxWithNestedInputs/styles.scss @@ -1,6 +1,6 @@ .inputCheckboxWithNestedInputs { /* stylelint-disable */ font-size: 1.3rem; - font-family: Lato; + font-family: 'Lato', sans-serif; margin-bottom: 1.5rem; -webkit-font-smoothing: antialiased; > div { @@ -34,7 +34,7 @@ > small { -webkit-font-smoothing: antialiased; color: #9EA7B8; - font-family: Lato; + font-family: 'Lato', sans-serif; font-size: 1.2rem; } } diff --git a/packages/strapi-plugin-content-type-builder/admin/src/components/List/styles.scss b/packages/strapi-plugin-content-type-builder/admin/src/components/List/styles.scss index e72099042a..336bad5f9e 100644 --- a/packages/strapi-plugin-content-type-builder/admin/src/components/List/styles.scss +++ b/packages/strapi-plugin-content-type-builder/admin/src/components/List/styles.scss @@ -14,7 +14,7 @@ .titleContainer { color: #333740; - font-family: Lato; + font-family: 'Lato', sans-serif; font-size: 1.8rem; font-weight: bold; line-height: 2.2rem; diff --git a/packages/strapi-plugin-content-type-builder/admin/src/components/PluginLeftMenu/styles.scss b/packages/strapi-plugin-content-type-builder/admin/src/components/PluginLeftMenu/styles.scss index 0e683aa906..399c842684 100644 --- a/packages/strapi-plugin-content-type-builder/admin/src/components/PluginLeftMenu/styles.scss +++ b/packages/strapi-plugin-content-type-builder/admin/src/components/PluginLeftMenu/styles.scss @@ -16,7 +16,7 @@ line-height: 1.3rem; color: #919BAE; letter-spacing: 0.1rem; - font-family: Lato; + font-family: 'Lato', sans-serif; font-size: 1.1rem; font-weight: bold; text-transform: uppercase; diff --git a/packages/strapi-plugin-content-type-builder/admin/src/components/PluginLeftMenuSection/styles.scss b/packages/strapi-plugin-content-type-builder/admin/src/components/PluginLeftMenuSection/styles.scss index 216c3d865f..1396afc3f6 100644 --- a/packages/strapi-plugin-content-type-builder/admin/src/components/PluginLeftMenuSection/styles.scss +++ b/packages/strapi-plugin-content-type-builder/admin/src/components/PluginLeftMenuSection/styles.scss @@ -8,7 +8,7 @@ line-height: 1.3rem; color: #919BAE; letter-spacing: 0.1rem; - font-family: Lato; + font-family: 'Lato', sans-serif; font-size: 1.1rem; font-weight: bold; text-transform: uppercase; diff --git a/packages/strapi-plugin-content-type-builder/admin/src/components/PopUpForm/styles.scss b/packages/strapi-plugin-content-type-builder/admin/src/components/PopUpForm/styles.scss index ab8e55f79d..0b64a2e3c7 100644 --- a/packages/strapi-plugin-content-type-builder/admin/src/components/PopUpForm/styles.scss +++ b/packages/strapi-plugin-content-type-builder/admin/src/components/PopUpForm/styles.scss @@ -27,7 +27,7 @@ text-transform: capitalize; margin-right: 1.8rem; cursor: pointer; - font-family: Lato; + font-family: 'Lato', sans-serif; &:focus { outline: 0; } @@ -77,7 +77,7 @@ } .popUpForm { - font-family: Lato; + font-family: 'Lato', sans-serif; } .popUpFormHeader { @@ -121,7 +121,7 @@ border-radius: 3px; color: white!important; line-height: 1.6rem; - font-family: Lato!important; + font-family: 'Lato', sans-serif !important; font-weight: 600; cursor: pointer; -webkit-font-smoothing: antialiased; @@ -137,7 +137,7 @@ .secondary { min-width: 100px; - font-family: Lato; + font-family: 'Lato', sans-serif; color: #F64D0A; border: 0.1rem solid #F64D0A; cursor: pointer; @@ -201,7 +201,7 @@ border: none!important; border-radius: 3px; color: white; - font-family: Lato!important; + font-family: 'Lato', sans-serif !important; font-weight: 600; &:focus { outline: 0; diff --git a/packages/strapi-plugin-content-type-builder/admin/src/components/PopUpRelations/styles.scss b/packages/strapi-plugin-content-type-builder/admin/src/components/PopUpRelations/styles.scss index 3c6942f28c..b4ce3b385a 100644 --- a/packages/strapi-plugin-content-type-builder/admin/src/components/PopUpRelations/styles.scss +++ b/packages/strapi-plugin-content-type-builder/admin/src/components/PopUpRelations/styles.scss @@ -42,7 +42,7 @@ text-transform: capitalize; margin-right: 1.8rem; cursor: pointer; - font-family: Lato; + font-family: 'Lato', sans-serif; &:focus { outline: 0; } @@ -123,15 +123,15 @@ } .popUpRelations { - font-family: Lato; + font-family: 'Lato', sans-serif; } .primary { height: 3rem; - font-family: Lato!important; + font-family: 'Lato', sans-serif !important; margin-left: 1.9rem!important; cursor: pointer; - font-family: Lato; + font-family: 'Lato', sans-serif; &:focus { outline: 0; } @@ -185,7 +185,7 @@ .secondary { min-width: 100px; - font-family: Lato; + font-family: 'Lato', sans-serif; color: #F64D0A; border: 0.1rem solid #F64D0A; cursor: pointer; @@ -215,7 +215,7 @@ border: none!important; border-radius: 3px; color: white; - font-family: Lato!important; + font-family: 'Lato', sans-serif !important; font-weight: 600; &:focus { outline: 0; diff --git a/packages/strapi-plugin-content-type-builder/admin/src/components/RelationBox/styles.scss b/packages/strapi-plugin-content-type-builder/admin/src/components/RelationBox/styles.scss index b3cea87196..669ec31b63 100644 --- a/packages/strapi-plugin-content-type-builder/admin/src/components/RelationBox/styles.scss +++ b/packages/strapi-plugin-content-type-builder/admin/src/components/RelationBox/styles.scss @@ -88,7 +88,7 @@ padding: 0; border-radius: 0; border: none; - font-family: Lato; + font-family: 'Lato', sans-serif; box-shadow: 0 2px 4px rgba(203, 211, 224, .5); > div { @@ -101,7 +101,7 @@ cursor: pointer; border-bottom: 1px solid #F6F6F6; font-size: 1.3rem; - font-family: Lato; + font-family: 'Lato', sans-serif; font-weight: 400; text-transform: capitalize; color: #323740; diff --git a/packages/strapi-plugin-content-type-builder/admin/src/components/TableList/styles.scss b/packages/strapi-plugin-content-type-builder/admin/src/components/TableList/styles.scss index 6eac935dc9..ad739319f5 100644 --- a/packages/strapi-plugin-content-type-builder/admin/src/components/TableList/styles.scss +++ b/packages/strapi-plugin-content-type-builder/admin/src/components/TableList/styles.scss @@ -1,7 +1,7 @@ .tableListContainer { /* stylelint-disable */ padding: 2rem 0 0rem 0; background: #FFFFFF; - font-family: Lato; + font-family: 'Lato', sans-serif; box-shadow: 0 2px 4px #E3E9F3; } diff --git a/packages/strapi-plugin-settings-manager/admin/src/components/Button/styles.scss b/packages/strapi-plugin-settings-manager/admin/src/components/Button/styles.scss index 50d7b9cd22..d7b3d4d3b3 100755 --- a/packages/strapi-plugin-settings-manager/admin/src/components/Button/styles.scss +++ b/packages/strapi-plugin-settings-manager/admin/src/components/Button/styles.scss @@ -5,7 +5,7 @@ text-transform: capitalize; margin-right: 1.8rem; cursor: pointer; - font-family: Lato; + font-family: 'Lato', sans-serif; &:focus { outline: 0; } @@ -91,7 +91,7 @@ line-height: 3.2rem; border-radius: 0.3rem; letter-spacing: 1rem; - font-family: Lato; + font-family: 'Lato', sans-serif; cursor: not-allowed; position: relative; opacity: .65; diff --git a/packages/strapi-plugin-settings-manager/admin/src/components/ContentHeader/styles.scss b/packages/strapi-plugin-settings-manager/admin/src/components/ContentHeader/styles.scss index 8368944d72..08aa3a94d8 100755 --- a/packages/strapi-plugin-settings-manager/admin/src/components/ContentHeader/styles.scss +++ b/packages/strapi-plugin-settings-manager/admin/src/components/ContentHeader/styles.scss @@ -1,12 +1,12 @@ .contentHeader { /* stylelint-disable */ position: relative; margin: 2.4rem 4rem 3.3rem 4rem; - font-family: Lato; + font-family: 'Lato', sans-serif; } .title { color: #333740; - font-family: Lato; + font-family: 'Lato', sans-serif; font-size: 2.4rem; line-height: 2.9rem; font-weight: 600; diff --git a/packages/strapi-plugin-settings-manager/admin/src/components/HeaderNav/styles.scss b/packages/strapi-plugin-settings-manager/admin/src/components/HeaderNav/styles.scss index 0ca47990fc..1f85e838ca 100755 --- a/packages/strapi-plugin-settings-manager/admin/src/components/HeaderNav/styles.scss +++ b/packages/strapi-plugin-settings-manager/admin/src/components/HeaderNav/styles.scss @@ -29,7 +29,7 @@ $linkcolour: #F5F5F5; border-radius: 2px 0 0 0; background-color: darken($linkcolour, 50%); text-decoration: none !important; - font-family: Lato; + font-family: 'Lato', sans-serif; font-size: 1.3rem; color: #333740 !important; line-height: 1.6rem; diff --git a/packages/strapi-plugin-settings-manager/admin/src/components/InputEnum/styles.scss b/packages/strapi-plugin-settings-manager/admin/src/components/InputEnum/styles.scss index bb4252eaf7..a760351feb 100755 --- a/packages/strapi-plugin-settings-manager/admin/src/components/InputEnum/styles.scss +++ b/packages/strapi-plugin-settings-manager/admin/src/components/InputEnum/styles.scss @@ -43,7 +43,7 @@ .active { -webkit-font-smoothing: antialiased; background: linear-gradient(315deg, #0097F6 0%, #005EEA 100%); - font-family: Lato!important; + font-family: 'Lato', sans-serif !important; font-weight: 800; color: white !important; } diff --git a/packages/strapi-plugin-settings-manager/admin/src/components/InputSelect/styles.scss b/packages/strapi-plugin-settings-manager/admin/src/components/InputSelect/styles.scss index f5f0dc4667..e5a326fa7c 100755 --- a/packages/strapi-plugin-settings-manager/admin/src/components/InputSelect/styles.scss +++ b/packages/strapi-plugin-settings-manager/admin/src/components/InputSelect/styles.scss @@ -1,6 +1,6 @@ .inputSelect { /* stylelint-disable */ font-size: 1.3rem; - font-family: Lato; + font-family: 'Lato', sans-serif; > label { text-transform: capitalize; @@ -9,7 +9,7 @@ } > select { font-size: 1.3rem; - font-family: Lato; + font-family: 'Lato', sans-serif; color: #333740; height: 3.5rem!important; border-radius: 0rem!important; @@ -21,7 +21,7 @@ .requiredClass { > label:after { color: red; - font-family: Lato; + font-family: 'Lato', sans-serif; font-weight: bold; margin-left: 5px; content: "*"; @@ -32,7 +32,7 @@ .input { margin-bottom: 1.5rem; font-size: 1.3rem; - font-family: Lato; + font-family: 'Lato', sans-serif; -webkit-font-smoothing: antialiased; > label { margin-bottom: 0; @@ -51,7 +51,7 @@ -moz-appearance: none; -webkit-appearance: none; font-size: 1.3rem; - font-family: Lato !important; + font-family: 'Lato', sans-serif !important; background-position: right -1px center; background-repeat: no-repeat; background-image: url('../../assets/images/background_input.svg'); diff --git a/packages/strapi-plugin-settings-manager/admin/src/components/InputToggle/styles.scss b/packages/strapi-plugin-settings-manager/admin/src/components/InputToggle/styles.scss index f209a5149b..3824ba8e70 100755 --- a/packages/strapi-plugin-settings-manager/admin/src/components/InputToggle/styles.scss +++ b/packages/strapi-plugin-settings-manager/admin/src/components/InputToggle/styles.scss @@ -24,7 +24,7 @@ font-weight: 600; font-size: 1.2rem; letter-spacing: 0.1rem; - font-family: Lato; + font-family: 'Lato', sans-serif; cursor: pointer; &:first-of-type { border-right: none; diff --git a/packages/strapi-plugin-settings-manager/admin/src/components/List/styles.scss b/packages/strapi-plugin-settings-manager/admin/src/components/List/styles.scss index 5307203cc9..a3ba0a397c 100755 --- a/packages/strapi-plugin-settings-manager/admin/src/components/List/styles.scss +++ b/packages/strapi-plugin-settings-manager/admin/src/components/List/styles.scss @@ -23,7 +23,7 @@ .titleContainer { color: #333740; - font-family: Lato; + font-family: 'Lato', sans-serif; font-size: 1.8rem; font-weight: bold; line-height: 2.2rem; @@ -144,7 +144,7 @@ button { } .italicText { - font-family: Lato; + font-family: 'Lato', sans-serif; color: #49515A; font-style: italic; height: 100%; @@ -154,17 +154,17 @@ button { } .normal { - font-family: Lato; + font-family: 'Lato', sans-serif; color: #1C5DE7; cursor: pointer; } .primary { height: 3rem; - font-family: Lato!important; + font-family: 'Lato', sans-serif !important; margin-left: 1.9rem!important; cursor: pointer; - font-family: Lato; + font-family: 'Lato', sans-serif; &:focus { outline: 0; } @@ -185,7 +185,7 @@ button { } .secondary { - font-family: Lato; + font-family: 'Lato', sans-serif; color: #F64D0A; border: 0.1rem solid #F64D0A; background-color: transparent; @@ -271,7 +271,7 @@ button { padding-top: 1.6rem; padding-bottom: 1rem; > h4 { - font-family: Lato; + font-family: 'Lato', sans-serif; font-weight: bold!important; font-size: 1.8rem!important; diff --git a/packages/strapi-plugin-settings-manager/admin/src/components/PluginLeftMenuSection/styles.scss b/packages/strapi-plugin-settings-manager/admin/src/components/PluginLeftMenuSection/styles.scss index 216c3d865f..1396afc3f6 100755 --- a/packages/strapi-plugin-settings-manager/admin/src/components/PluginLeftMenuSection/styles.scss +++ b/packages/strapi-plugin-settings-manager/admin/src/components/PluginLeftMenuSection/styles.scss @@ -8,7 +8,7 @@ line-height: 1.3rem; color: #919BAE; letter-spacing: 0.1rem; - font-family: Lato; + font-family: 'Lato', sans-serif; font-size: 1.1rem; font-weight: bold; text-transform: uppercase; diff --git a/packages/strapi-plugin-settings-manager/admin/src/components/WithFormSection/styles.scss b/packages/strapi-plugin-settings-manager/admin/src/components/WithFormSection/styles.scss index 12cd8e572a..a544a3228f 100755 --- a/packages/strapi-plugin-settings-manager/admin/src/components/WithFormSection/styles.scss +++ b/packages/strapi-plugin-settings-manager/admin/src/components/WithFormSection/styles.scss @@ -5,7 +5,7 @@ .sectionHeader { color: #787E8F; - font-family: Lato; + font-family: 'Lato', sans-serif; font-size: 1.1rem; font-weight: bold; line-height: 1.3rem; @@ -36,6 +36,6 @@ .sectionDescription { margin: .1rem 0; color: #8B91A0; - font-family: Lato; + font-family: 'Lato', sans-serif; font-size: 1.1rem; } diff --git a/packages/strapi-plugin-settings-manager/admin/src/components/WithInput/styles.scss b/packages/strapi-plugin-settings-manager/admin/src/components/WithInput/styles.scss index 061d223047..e3304712db 100755 --- a/packages/strapi-plugin-settings-manager/admin/src/components/WithInput/styles.scss +++ b/packages/strapi-plugin-settings-manager/admin/src/components/WithInput/styles.scss @@ -1,7 +1,7 @@ .inputNumber { /* stylelint-disable */ // margin-bottom: .3rem; font-size: 1.3rem; - font-family: Lato; + font-family: 'Lato', sans-serif; > label { font-weight: 500; text-transform: capitalize; @@ -21,14 +21,14 @@ height: 3.4rem; line-height: 3.4rem; font-size: 1.3rem; - font-family: Lato!important; + font-family: 'Lato', sans-serif !important; background-size: 0!important; } } .inputText { /* stylelint-disable */ - font-family: Lato!important; + font-family: 'Lato', sans-serif !important; font-size: 1.3rem; > label { font-size: 1.3rem; @@ -49,7 +49,7 @@ border-radius: 0.25rem; border: 1px solid #E3E9F3; line-height: 3.4rem; - font-family: Lato!important; + font-family: 'Lato', sans-serif !important; font-size: 1.3rem; background-size: 0!important; } @@ -69,7 +69,7 @@ .requiredClass { > label:after { color: red; - font-family: Lato; + font-family: 'Lato', sans-serif; font-weight: bold; margin-left: 5px; content: "*"; diff --git a/packages/strapi-plugin-upload/admin/src/containers/HomePage/styles.scss b/packages/strapi-plugin-upload/admin/src/containers/HomePage/styles.scss index fc269b5952..96471e001b 100755 --- a/packages/strapi-plugin-upload/admin/src/containers/HomePage/styles.scss +++ b/packages/strapi-plugin-upload/admin/src/containers/HomePage/styles.scss @@ -1,6 +1,6 @@ .homePageUpload { padding-right: 20px; - font-family: Lato !important; + font-family: 'Lato', sans-serif !important; } .entriesWrapper { diff --git a/packages/strapi-plugin-users-permissions/admin/src/components/HeaderNav/styles.scss b/packages/strapi-plugin-users-permissions/admin/src/components/HeaderNav/styles.scss index 816e446ee9..21a2a9a0c0 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/components/HeaderNav/styles.scss +++ b/packages/strapi-plugin-users-permissions/admin/src/components/HeaderNav/styles.scss @@ -30,7 +30,7 @@ border-radius: 2px 0 0 0; background-color: darken(#F5F5F5, 50%); text-decoration: none !important; - font-family: Lato; + font-family: 'Lato', sans-serif; font-size: 1.3rem; color: #333740 !important; line-height: 1.6rem; diff --git a/packages/strapi-plugin-users-permissions/admin/src/components/InputSearchContainer/styles.scss b/packages/strapi-plugin-users-permissions/admin/src/components/InputSearchContainer/styles.scss index 090aa16762..e507857b54 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/components/InputSearchContainer/styles.scss +++ b/packages/strapi-plugin-users-permissions/admin/src/components/InputSearchContainer/styles.scss @@ -12,7 +12,7 @@ color: #B3B5B9; line-height: 3.2rem; font-size: 1.3rem; - font-family: 'Lato'; + font-family: 'Lato', sans-serif; font-weight: 600!important; text-transform: capitalize; -moz-appearance: none; @@ -53,7 +53,7 @@ border-bottom-right-radius: 0; line-height: 3.4rem; font-size: 1.3rem; - font-family: 'Lato' !important; + font-family: 'Lato', sans-serif !important; box-shadow: 0px 2px 1px rgba(104, 118, 142, 0.05); &:focus { border-color: #78caff; diff --git a/packages/strapi-plugin-users-permissions/admin/src/components/List/styles.scss b/packages/strapi-plugin-users-permissions/admin/src/components/List/styles.scss index 02f613cdaa..6a756e7cac 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/components/List/styles.scss +++ b/packages/strapi-plugin-users-permissions/admin/src/components/List/styles.scss @@ -14,7 +14,7 @@ flex: 2; width: 20%; color: #333740; - font-family: Lato; + font-family: 'Lato', sans-serif; font-size: 1.8rem; font-weight: 600; line-height: 2.2rem; diff --git a/packages/strapi-plugin-users-permissions/admin/src/components/Plugins/styles.scss b/packages/strapi-plugin-users-permissions/admin/src/components/Plugins/styles.scss index d6b1f49e8d..472216066c 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/components/Plugins/styles.scss +++ b/packages/strapi-plugin-users-permissions/admin/src/components/Plugins/styles.scss @@ -31,7 +31,7 @@ > div:first-child { margin-bottom: 2px; color: #333740; - font-family: Lato; + font-family: 'Lato', sans-serif; font-size: 1.8rem; font-weight: 600; line-height: 2.1rem; diff --git a/packages/strapi-plugin-users-permissions/admin/src/components/PopUpForm/styles.scss b/packages/strapi-plugin-users-permissions/admin/src/components/PopUpForm/styles.scss index f5919b4cb0..c56e8e80db 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/components/PopUpForm/styles.scss +++ b/packages/strapi-plugin-users-permissions/admin/src/components/PopUpForm/styles.scss @@ -24,7 +24,7 @@ text-transform: capitalize; margin-right: 1.8rem; cursor: pointer; - font-family: Lato; + font-family: 'Lato', sans-serif; &:focus { outline: 0; } @@ -90,10 +90,10 @@ .primary { height: 3rem; - font-family: Lato!important; + font-family: 'Lato', sans-serif !important; margin-left: 1.9rem!important; cursor: pointer; - font-family: Lato; + font-family: 'Lato', sans-serif; &:focus { outline: 0; } @@ -148,7 +148,7 @@ .secondary { min-width: 100px; - font-family: Lato; + font-family: 'Lato', sans-serif; color: #F64D0A; border: 0.1rem solid #F64D0A; cursor: pointer; diff --git a/packages/strapi-plugin-users-permissions/admin/src/containers/AuthPage/styles.scss b/packages/strapi-plugin-users-permissions/admin/src/containers/AuthPage/styles.scss index ccf7b004a7..f582a3b980 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/containers/AuthPage/styles.scss +++ b/packages/strapi-plugin-users-permissions/admin/src/containers/AuthPage/styles.scss @@ -15,7 +15,7 @@ background-image: url('../../assets/images/background_empty.svg'); background-position-x: center; font-size: 1.4rem; - font-family: Lato; + font-family: 'Lato', sans-serif; } .errorsContainer { From 4c0b26ea6a47f07b6009e0944826e422d2d3da94 Mon Sep 17 00:00:00 2001 From: uyouthe Date: Wed, 12 Sep 2018 22:24:30 +0300 Subject: [PATCH 04/81] Indentation fixed --- packages/strapi-admin/admin/src/components/Sub/styles.scss | 2 +- packages/strapi-admin/admin/src/containers/HomePage/styles.scss | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/strapi-admin/admin/src/components/Sub/styles.scss b/packages/strapi-admin/admin/src/components/Sub/styles.scss index 8ad24c8340..9eebf649dc 100644 --- a/packages/strapi-admin/admin/src/components/Sub/styles.scss +++ b/packages/strapi-admin/admin/src/components/Sub/styles.scss @@ -11,7 +11,7 @@ > span { text-decoration: none; font-family: 'Lato', sans-serif; -font-weight: bold; + font-weight: bold; font-size: 20px; color: #333740; letter-spacing: 0; diff --git a/packages/strapi-admin/admin/src/containers/HomePage/styles.scss b/packages/strapi-admin/admin/src/containers/HomePage/styles.scss index ebdd52216f..34a24ec150 100644 --- a/packages/strapi-admin/admin/src/containers/HomePage/styles.scss +++ b/packages/strapi-admin/admin/src/containers/HomePage/styles.scss @@ -10,7 +10,7 @@ text-decoration: none; > span { font-family: 'Lato', sans-serif; -font-weight: bold; + font-weight: bold; font-size: 16px; color: #333740; letter-spacing: 0; From 5128157c8f7a97b15056ca655f9d7b2d11f230cb Mon Sep 17 00:00:00 2001 From: Anthony Guimard Date: Wed, 19 Sep 2018 02:41:31 -0400 Subject: [PATCH 05/81] Fix drag drop image not saved in WYSIWYG. In order to fix this issue we have to invoke the sendData method just before updating the state of the WYSIWYG otherwhise the sendData method is not triggered because currentState === updatedState. --- .../admin/src/components/Wysiwyg/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/strapi-plugin-content-manager/admin/src/components/Wysiwyg/index.js b/packages/strapi-plugin-content-manager/admin/src/components/Wysiwyg/index.js index eeead5e30c..e279108efa 100644 --- a/packages/strapi-plugin-content-manager/admin/src/components/Wysiwyg/index.js +++ b/packages/strapi-plugin-content-manager/admin/src/components/Wysiwyg/index.js @@ -627,8 +627,8 @@ class Wysiwyg extends React.Component { newEditorState = EditorState.push(newEditorState, newContentState); const updatedSelection = updateSelection(this.getSelection(), nextBlocks, 2); - this.setState({ editorState: EditorState.acceptSelection(newEditorState, updatedSelection) }); this.sendData(newEditorState); + this.setState({ editorState: EditorState.acceptSelection(newEditorState, updatedSelection) }); }) .catch(() => { this.setState({ editorState: EditorState.undo(this.getEditorState()) }); From 992828744f4d345acf7e2e752dfe1565f0cf397d Mon Sep 17 00:00:00 2001 From: Martin Muzatko Date: Fri, 21 Sep 2018 09:39:47 +0200 Subject: [PATCH 06/81] moved the language folders of docs into their correct location for vuepress --- docs/1.x.x/LANGS.md | 5 -- docs/1.x.x/{en => }/README.md | 0 docs/1.x.x/{en => }/SUMMARY.md | 0 docs/1.x.x/{en => }/admin.md | 0 docs/1.x.x/{en => }/blueprints.md | 0 docs/1.x.x/book.json | 42 ----------------- docs/1.x.x/{en => }/cli.md | 0 docs/1.x.x/{en => }/configuration.md | 0 docs/1.x.x/{en => }/context.md | 0 docs/1.x.x/{en => }/customization.md | 0 docs/1.x.x/{en => }/email.md | 0 docs/1.x.x/{en => }/graphql.md | 0 docs/1.x.x/{en => }/internationalization.md | 0 docs/1.x.x/{en => }/introduction.md | 0 docs/1.x.x/{en => }/logging.md | 0 docs/1.x.x/{en => }/models.md | 0 docs/1.x.x/{en => }/queries.md | 0 docs/1.x.x/{en => }/request.md | 0 docs/1.x.x/{en => }/response.md | 0 docs/1.x.x/{en => }/router.md | 0 docs/1.x.x/{en => }/services.md | 0 docs/1.x.x/{en => }/sessions.md | 0 docs/1.x.x/{en => }/styles/website.css | 0 docs/1.x.x/{en => }/testing.md | 0 docs/1.x.x/{en => }/upload.md | 0 docs/1.x.x/{en => }/users.md | 0 docs/1.x.x/{en => }/views.md | 0 docs/3.x.x/LANGS.md | 5 -- docs/3.x.x/{en => }/README.md | 10 +--- docs/3.x.x/{en => }/SUMMARY.md | 0 .../{en => }/advanced/customize-admin.md | 0 docs/3.x.x/{en => }/advanced/hooks.md | 0 docs/3.x.x/{en => }/advanced/logging.md | 0 docs/3.x.x/{en => }/advanced/middlewares.md | 0 .../3.x.x/{en => }/advanced/usage-tracking.md | 0 .../3.x.x/{en => }/api-reference/reference.md | 0 docs/3.x.x/{en => }/assets/buttons.png | Bin .../assets/getting-started_add_entry.png | Bin .../assets/getting-started_allow_access.png | Bin .../getting-started_create_content_type.png | Bin .../assets/getting-started_list_fields.png | Bin .../getting-started_manage_role_home.png | Bin .../getting-started_no_content_type.png | Bin .../assets/getting-started_no_entry.png | Bin .../assets/getting-started_register.png | Bin .../assets/getting-started_with_entry.png | Bin docs/3.x.x/{en => }/assets/popup-warning.png | Bin docs/3.x.x/{en => }/assets/terminal_new.png | Bin docs/3.x.x/{en => }/assets/terminal_start.png | Bin docs/3.x.x/book.json | 43 ------------------ docs/3.x.x/{en => }/cli/CLI.md | 0 docs/3.x.x/{en => }/concepts/concepts.md | 0 .../{en => }/configurations/configurations.md | 0 .../{en => }/getting-started/installation.md | 0 .../{en => }/getting-started/quick-start.md | 0 docs/3.x.x/{en => }/guides/authentication.md | 0 docs/3.x.x/{en => }/guides/controllers.md | 0 docs/3.x.x/{en => }/guides/deployment.md | 0 docs/3.x.x/{en => }/guides/email.md | 0 docs/3.x.x/{en => }/guides/filters.md | 0 docs/3.x.x/{en => }/guides/graphql.md | 0 docs/3.x.x/{en => }/guides/i18n.md | 0 docs/3.x.x/{en => }/guides/models.md | 0 docs/3.x.x/{en => }/guides/policies.md | 0 docs/3.x.x/{en => }/guides/public-assets.md | 0 docs/3.x.x/{en => }/guides/requests.md | 0 docs/3.x.x/{en => }/guides/responses.md | 0 docs/3.x.x/{en => }/guides/restapi.md | 0 docs/3.x.x/{en => }/guides/routing.md | 0 docs/3.x.x/{en => }/guides/services.md | 0 docs/3.x.x/{en => }/guides/upload.md | 0 .../migration-guide-alpha-10-to-alpha-11.md | 0 .../migration-guide-alpha-11-to-alpha-12.md | 0 .../migration-guide-alpha-7-4-to-alpha-8.md | 0 .../migration-guide-alpha-8-to-alpha-9.md | 0 .../migration-guide-alpha-9-to-alpha-10.md | 0 .../{en => }/migration/migration-guide.md | 0 .../plugin-development/backend-development.md | 0 .../frontend-development.md | 0 .../plugin-development/frontend-use-cases.md | 0 .../plugin-development/plugin-architecture.md | 0 .../plugin-development/plugin-left-menu.md | 0 .../plugin-development/quick-start.md | 0 .../plugin-development/ui-components.md | 0 .../{en => }/plugin-development/utils.md | 0 docs/3.x.x/{en => }/styles/website.css | 0 docs/3.x.x/{en => }/tutorials/README.md | 0 87 files changed, 2 insertions(+), 103 deletions(-) delete mode 100644 docs/1.x.x/LANGS.md rename docs/1.x.x/{en => }/README.md (100%) rename docs/1.x.x/{en => }/SUMMARY.md (100%) rename docs/1.x.x/{en => }/admin.md (100%) mode change 100755 => 100644 rename docs/1.x.x/{en => }/blueprints.md (100%) mode change 100755 => 100644 delete mode 100644 docs/1.x.x/book.json rename docs/1.x.x/{en => }/cli.md (100%) mode change 100755 => 100644 rename docs/1.x.x/{en => }/configuration.md (100%) mode change 100755 => 100644 rename docs/1.x.x/{en => }/context.md (100%) mode change 100755 => 100644 rename docs/1.x.x/{en => }/customization.md (100%) mode change 100755 => 100644 rename docs/1.x.x/{en => }/email.md (100%) mode change 100755 => 100644 rename docs/1.x.x/{en => }/graphql.md (100%) mode change 100755 => 100644 rename docs/1.x.x/{en => }/internationalization.md (100%) mode change 100755 => 100644 rename docs/1.x.x/{en => }/introduction.md (100%) mode change 100755 => 100644 rename docs/1.x.x/{en => }/logging.md (100%) mode change 100755 => 100644 rename docs/1.x.x/{en => }/models.md (100%) mode change 100755 => 100644 rename docs/1.x.x/{en => }/queries.md (100%) mode change 100755 => 100644 rename docs/1.x.x/{en => }/request.md (100%) mode change 100755 => 100644 rename docs/1.x.x/{en => }/response.md (100%) mode change 100755 => 100644 rename docs/1.x.x/{en => }/router.md (100%) mode change 100755 => 100644 rename docs/1.x.x/{en => }/services.md (100%) mode change 100755 => 100644 rename docs/1.x.x/{en => }/sessions.md (100%) mode change 100755 => 100644 rename docs/1.x.x/{en => }/styles/website.css (100%) rename docs/1.x.x/{en => }/testing.md (100%) mode change 100755 => 100644 rename docs/1.x.x/{en => }/upload.md (100%) mode change 100755 => 100644 rename docs/1.x.x/{en => }/users.md (100%) mode change 100755 => 100644 rename docs/1.x.x/{en => }/views.md (100%) mode change 100755 => 100644 delete mode 100644 docs/3.x.x/LANGS.md rename docs/3.x.x/{en => }/README.md (86%) rename docs/3.x.x/{en => }/SUMMARY.md (100%) rename docs/3.x.x/{en => }/advanced/customize-admin.md (100%) rename docs/3.x.x/{en => }/advanced/hooks.md (100%) rename docs/3.x.x/{en => }/advanced/logging.md (100%) rename docs/3.x.x/{en => }/advanced/middlewares.md (100%) rename docs/3.x.x/{en => }/advanced/usage-tracking.md (100%) rename docs/3.x.x/{en => }/api-reference/reference.md (100%) rename docs/3.x.x/{en => }/assets/buttons.png (100%) rename docs/3.x.x/{en => }/assets/getting-started_add_entry.png (100%) rename docs/3.x.x/{en => }/assets/getting-started_allow_access.png (100%) rename docs/3.x.x/{en => }/assets/getting-started_create_content_type.png (100%) rename docs/3.x.x/{en => }/assets/getting-started_list_fields.png (100%) rename docs/3.x.x/{en => }/assets/getting-started_manage_role_home.png (100%) rename docs/3.x.x/{en => }/assets/getting-started_no_content_type.png (100%) rename docs/3.x.x/{en => }/assets/getting-started_no_entry.png (100%) rename docs/3.x.x/{en => }/assets/getting-started_register.png (100%) rename docs/3.x.x/{en => }/assets/getting-started_with_entry.png (100%) rename docs/3.x.x/{en => }/assets/popup-warning.png (100%) rename docs/3.x.x/{en => }/assets/terminal_new.png (100%) rename docs/3.x.x/{en => }/assets/terminal_start.png (100%) delete mode 100644 docs/3.x.x/book.json rename docs/3.x.x/{en => }/cli/CLI.md (100%) rename docs/3.x.x/{en => }/concepts/concepts.md (100%) rename docs/3.x.x/{en => }/configurations/configurations.md (100%) rename docs/3.x.x/{en => }/getting-started/installation.md (100%) rename docs/3.x.x/{en => }/getting-started/quick-start.md (100%) rename docs/3.x.x/{en => }/guides/authentication.md (100%) rename docs/3.x.x/{en => }/guides/controllers.md (100%) rename docs/3.x.x/{en => }/guides/deployment.md (100%) rename docs/3.x.x/{en => }/guides/email.md (100%) rename docs/3.x.x/{en => }/guides/filters.md (100%) rename docs/3.x.x/{en => }/guides/graphql.md (100%) rename docs/3.x.x/{en => }/guides/i18n.md (100%) rename docs/3.x.x/{en => }/guides/models.md (100%) rename docs/3.x.x/{en => }/guides/policies.md (100%) rename docs/3.x.x/{en => }/guides/public-assets.md (100%) rename docs/3.x.x/{en => }/guides/requests.md (100%) rename docs/3.x.x/{en => }/guides/responses.md (100%) rename docs/3.x.x/{en => }/guides/restapi.md (100%) rename docs/3.x.x/{en => }/guides/routing.md (100%) rename docs/3.x.x/{en => }/guides/services.md (100%) rename docs/3.x.x/{en => }/guides/upload.md (100%) rename docs/3.x.x/{en => }/migration/migration-guide-alpha-10-to-alpha-11.md (100%) rename docs/3.x.x/{en => }/migration/migration-guide-alpha-11-to-alpha-12.md (100%) rename docs/3.x.x/{en => }/migration/migration-guide-alpha-7-4-to-alpha-8.md (100%) rename docs/3.x.x/{en => }/migration/migration-guide-alpha-8-to-alpha-9.md (100%) rename docs/3.x.x/{en => }/migration/migration-guide-alpha-9-to-alpha-10.md (100%) rename docs/3.x.x/{en => }/migration/migration-guide.md (100%) rename docs/3.x.x/{en => }/plugin-development/backend-development.md (100%) rename docs/3.x.x/{en => }/plugin-development/frontend-development.md (100%) rename docs/3.x.x/{en => }/plugin-development/frontend-use-cases.md (100%) rename docs/3.x.x/{en => }/plugin-development/plugin-architecture.md (100%) rename docs/3.x.x/{en => }/plugin-development/plugin-left-menu.md (100%) rename docs/3.x.x/{en => }/plugin-development/quick-start.md (100%) rename docs/3.x.x/{en => }/plugin-development/ui-components.md (100%) rename docs/3.x.x/{en => }/plugin-development/utils.md (100%) rename docs/3.x.x/{en => }/styles/website.css (100%) rename docs/3.x.x/{en => }/tutorials/README.md (100%) diff --git a/docs/1.x.x/LANGS.md b/docs/1.x.x/LANGS.md deleted file mode 100644 index 50d5bc24d5..0000000000 --- a/docs/1.x.x/LANGS.md +++ /dev/null @@ -1,5 +0,0 @@ - -# Languages - -* [English](en/) - diff --git a/docs/1.x.x/en/README.md b/docs/1.x.x/README.md similarity index 100% rename from docs/1.x.x/en/README.md rename to docs/1.x.x/README.md diff --git a/docs/1.x.x/en/SUMMARY.md b/docs/1.x.x/SUMMARY.md similarity index 100% rename from docs/1.x.x/en/SUMMARY.md rename to docs/1.x.x/SUMMARY.md diff --git a/docs/1.x.x/en/admin.md b/docs/1.x.x/admin.md old mode 100755 new mode 100644 similarity index 100% rename from docs/1.x.x/en/admin.md rename to docs/1.x.x/admin.md diff --git a/docs/1.x.x/en/blueprints.md b/docs/1.x.x/blueprints.md old mode 100755 new mode 100644 similarity index 100% rename from docs/1.x.x/en/blueprints.md rename to docs/1.x.x/blueprints.md diff --git a/docs/1.x.x/book.json b/docs/1.x.x/book.json deleted file mode 100644 index 721ef358dd..0000000000 --- a/docs/1.x.x/book.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "title": "Strapi documentation", - "author": "Strapi", - "gitbook": "3.2.2", - "plugins": [ - "edit-link", - "anchorjs", - "-search", - "-fontsettings", - "-sharing", - "versions", - "ga", - "github", - "feathers-collapsible-menu" - ], - "pluginsConfig": { - "edit-link": { - "label": "Edit This Page", - "base": "https://github.com/strapi/strapi/tree/master/docs/1.x.x" - }, - "ga": { - "token": "UA-54313258-1" - }, - "github": { - "url": "https://github.com/strapi/strapi" - }, - "versions": { - "options": [ - { - "value": "/documentation/1.x.x/", - "text": "Versions 1.x.x", - "selected": true - }, - { - "value": "/documentation/3.x.x/", - "text": "Versions 3.x.x", - "selected": false - } - ] - } - } -} diff --git a/docs/1.x.x/en/cli.md b/docs/1.x.x/cli.md old mode 100755 new mode 100644 similarity index 100% rename from docs/1.x.x/en/cli.md rename to docs/1.x.x/cli.md diff --git a/docs/1.x.x/en/configuration.md b/docs/1.x.x/configuration.md old mode 100755 new mode 100644 similarity index 100% rename from docs/1.x.x/en/configuration.md rename to docs/1.x.x/configuration.md diff --git a/docs/1.x.x/en/context.md b/docs/1.x.x/context.md old mode 100755 new mode 100644 similarity index 100% rename from docs/1.x.x/en/context.md rename to docs/1.x.x/context.md diff --git a/docs/1.x.x/en/customization.md b/docs/1.x.x/customization.md old mode 100755 new mode 100644 similarity index 100% rename from docs/1.x.x/en/customization.md rename to docs/1.x.x/customization.md diff --git a/docs/1.x.x/en/email.md b/docs/1.x.x/email.md old mode 100755 new mode 100644 similarity index 100% rename from docs/1.x.x/en/email.md rename to docs/1.x.x/email.md diff --git a/docs/1.x.x/en/graphql.md b/docs/1.x.x/graphql.md old mode 100755 new mode 100644 similarity index 100% rename from docs/1.x.x/en/graphql.md rename to docs/1.x.x/graphql.md diff --git a/docs/1.x.x/en/internationalization.md b/docs/1.x.x/internationalization.md old mode 100755 new mode 100644 similarity index 100% rename from docs/1.x.x/en/internationalization.md rename to docs/1.x.x/internationalization.md diff --git a/docs/1.x.x/en/introduction.md b/docs/1.x.x/introduction.md old mode 100755 new mode 100644 similarity index 100% rename from docs/1.x.x/en/introduction.md rename to docs/1.x.x/introduction.md diff --git a/docs/1.x.x/en/logging.md b/docs/1.x.x/logging.md old mode 100755 new mode 100644 similarity index 100% rename from docs/1.x.x/en/logging.md rename to docs/1.x.x/logging.md diff --git a/docs/1.x.x/en/models.md b/docs/1.x.x/models.md old mode 100755 new mode 100644 similarity index 100% rename from docs/1.x.x/en/models.md rename to docs/1.x.x/models.md diff --git a/docs/1.x.x/en/queries.md b/docs/1.x.x/queries.md old mode 100755 new mode 100644 similarity index 100% rename from docs/1.x.x/en/queries.md rename to docs/1.x.x/queries.md diff --git a/docs/1.x.x/en/request.md b/docs/1.x.x/request.md old mode 100755 new mode 100644 similarity index 100% rename from docs/1.x.x/en/request.md rename to docs/1.x.x/request.md diff --git a/docs/1.x.x/en/response.md b/docs/1.x.x/response.md old mode 100755 new mode 100644 similarity index 100% rename from docs/1.x.x/en/response.md rename to docs/1.x.x/response.md diff --git a/docs/1.x.x/en/router.md b/docs/1.x.x/router.md old mode 100755 new mode 100644 similarity index 100% rename from docs/1.x.x/en/router.md rename to docs/1.x.x/router.md diff --git a/docs/1.x.x/en/services.md b/docs/1.x.x/services.md old mode 100755 new mode 100644 similarity index 100% rename from docs/1.x.x/en/services.md rename to docs/1.x.x/services.md diff --git a/docs/1.x.x/en/sessions.md b/docs/1.x.x/sessions.md old mode 100755 new mode 100644 similarity index 100% rename from docs/1.x.x/en/sessions.md rename to docs/1.x.x/sessions.md diff --git a/docs/1.x.x/en/styles/website.css b/docs/1.x.x/styles/website.css similarity index 100% rename from docs/1.x.x/en/styles/website.css rename to docs/1.x.x/styles/website.css diff --git a/docs/1.x.x/en/testing.md b/docs/1.x.x/testing.md old mode 100755 new mode 100644 similarity index 100% rename from docs/1.x.x/en/testing.md rename to docs/1.x.x/testing.md diff --git a/docs/1.x.x/en/upload.md b/docs/1.x.x/upload.md old mode 100755 new mode 100644 similarity index 100% rename from docs/1.x.x/en/upload.md rename to docs/1.x.x/upload.md diff --git a/docs/1.x.x/en/users.md b/docs/1.x.x/users.md old mode 100755 new mode 100644 similarity index 100% rename from docs/1.x.x/en/users.md rename to docs/1.x.x/users.md diff --git a/docs/1.x.x/en/views.md b/docs/1.x.x/views.md old mode 100755 new mode 100644 similarity index 100% rename from docs/1.x.x/en/views.md rename to docs/1.x.x/views.md diff --git a/docs/3.x.x/LANGS.md b/docs/3.x.x/LANGS.md deleted file mode 100644 index 50d5bc24d5..0000000000 --- a/docs/3.x.x/LANGS.md +++ /dev/null @@ -1,5 +0,0 @@ - -# Languages - -* [English](en/) - diff --git a/docs/3.x.x/en/README.md b/docs/3.x.x/README.md similarity index 86% rename from docs/3.x.x/en/README.md rename to docs/3.x.x/README.md index eaac1d37a2..bf918349dd 100644 --- a/docs/3.x.x/en/README.md +++ b/docs/3.x.x/README.md @@ -1,19 +1,13 @@ -{% center %} -![Logo](https://cldup.com/7umchwdUBh.png) +![Logo](https://cldup.com/7umchwdUBh.png) ### API creation made simple, secure and fast. The most advanced open-source Content Management Framework to build powerful API with no effort. -
[![npm version](https://img.shields.io/npm/v/strapi.svg)](https://www.npmjs.org/package/strapi) [![npm downloads](https://img.shields.io/npm/dm/strapi.svg)](https://www.npmjs.org/package/strapi) [![Build status](https://travis-ci.org/strapi/strapi.svg?branch=master)](https://travis-ci.org/strapi/strapi) [![Slack status](http://strapi-slack.herokuapp.com/badge.svg)](http://slack.strapi.io) - - Deploy - - -{% endcenter %} +[![Heroku Deploy](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy?template=https://github.com/strapi/strapi-heroku-app) ## v3@alpha.13 is available! We've been working on a major update for Strapi during the past months, rewriting the core framework and the dashboard. diff --git a/docs/3.x.x/en/SUMMARY.md b/docs/3.x.x/SUMMARY.md similarity index 100% rename from docs/3.x.x/en/SUMMARY.md rename to docs/3.x.x/SUMMARY.md diff --git a/docs/3.x.x/en/advanced/customize-admin.md b/docs/3.x.x/advanced/customize-admin.md similarity index 100% rename from docs/3.x.x/en/advanced/customize-admin.md rename to docs/3.x.x/advanced/customize-admin.md diff --git a/docs/3.x.x/en/advanced/hooks.md b/docs/3.x.x/advanced/hooks.md similarity index 100% rename from docs/3.x.x/en/advanced/hooks.md rename to docs/3.x.x/advanced/hooks.md diff --git a/docs/3.x.x/en/advanced/logging.md b/docs/3.x.x/advanced/logging.md similarity index 100% rename from docs/3.x.x/en/advanced/logging.md rename to docs/3.x.x/advanced/logging.md diff --git a/docs/3.x.x/en/advanced/middlewares.md b/docs/3.x.x/advanced/middlewares.md similarity index 100% rename from docs/3.x.x/en/advanced/middlewares.md rename to docs/3.x.x/advanced/middlewares.md diff --git a/docs/3.x.x/en/advanced/usage-tracking.md b/docs/3.x.x/advanced/usage-tracking.md similarity index 100% rename from docs/3.x.x/en/advanced/usage-tracking.md rename to docs/3.x.x/advanced/usage-tracking.md diff --git a/docs/3.x.x/en/api-reference/reference.md b/docs/3.x.x/api-reference/reference.md similarity index 100% rename from docs/3.x.x/en/api-reference/reference.md rename to docs/3.x.x/api-reference/reference.md diff --git a/docs/3.x.x/en/assets/buttons.png b/docs/3.x.x/assets/buttons.png similarity index 100% rename from docs/3.x.x/en/assets/buttons.png rename to docs/3.x.x/assets/buttons.png diff --git a/docs/3.x.x/en/assets/getting-started_add_entry.png b/docs/3.x.x/assets/getting-started_add_entry.png similarity index 100% rename from docs/3.x.x/en/assets/getting-started_add_entry.png rename to docs/3.x.x/assets/getting-started_add_entry.png diff --git a/docs/3.x.x/en/assets/getting-started_allow_access.png b/docs/3.x.x/assets/getting-started_allow_access.png similarity index 100% rename from docs/3.x.x/en/assets/getting-started_allow_access.png rename to docs/3.x.x/assets/getting-started_allow_access.png diff --git a/docs/3.x.x/en/assets/getting-started_create_content_type.png b/docs/3.x.x/assets/getting-started_create_content_type.png similarity index 100% rename from docs/3.x.x/en/assets/getting-started_create_content_type.png rename to docs/3.x.x/assets/getting-started_create_content_type.png diff --git a/docs/3.x.x/en/assets/getting-started_list_fields.png b/docs/3.x.x/assets/getting-started_list_fields.png similarity index 100% rename from docs/3.x.x/en/assets/getting-started_list_fields.png rename to docs/3.x.x/assets/getting-started_list_fields.png diff --git a/docs/3.x.x/en/assets/getting-started_manage_role_home.png b/docs/3.x.x/assets/getting-started_manage_role_home.png similarity index 100% rename from docs/3.x.x/en/assets/getting-started_manage_role_home.png rename to docs/3.x.x/assets/getting-started_manage_role_home.png diff --git a/docs/3.x.x/en/assets/getting-started_no_content_type.png b/docs/3.x.x/assets/getting-started_no_content_type.png similarity index 100% rename from docs/3.x.x/en/assets/getting-started_no_content_type.png rename to docs/3.x.x/assets/getting-started_no_content_type.png diff --git a/docs/3.x.x/en/assets/getting-started_no_entry.png b/docs/3.x.x/assets/getting-started_no_entry.png similarity index 100% rename from docs/3.x.x/en/assets/getting-started_no_entry.png rename to docs/3.x.x/assets/getting-started_no_entry.png diff --git a/docs/3.x.x/en/assets/getting-started_register.png b/docs/3.x.x/assets/getting-started_register.png similarity index 100% rename from docs/3.x.x/en/assets/getting-started_register.png rename to docs/3.x.x/assets/getting-started_register.png diff --git a/docs/3.x.x/en/assets/getting-started_with_entry.png b/docs/3.x.x/assets/getting-started_with_entry.png similarity index 100% rename from docs/3.x.x/en/assets/getting-started_with_entry.png rename to docs/3.x.x/assets/getting-started_with_entry.png diff --git a/docs/3.x.x/en/assets/popup-warning.png b/docs/3.x.x/assets/popup-warning.png similarity index 100% rename from docs/3.x.x/en/assets/popup-warning.png rename to docs/3.x.x/assets/popup-warning.png diff --git a/docs/3.x.x/en/assets/terminal_new.png b/docs/3.x.x/assets/terminal_new.png similarity index 100% rename from docs/3.x.x/en/assets/terminal_new.png rename to docs/3.x.x/assets/terminal_new.png diff --git a/docs/3.x.x/en/assets/terminal_start.png b/docs/3.x.x/assets/terminal_start.png similarity index 100% rename from docs/3.x.x/en/assets/terminal_start.png rename to docs/3.x.x/assets/terminal_start.png diff --git a/docs/3.x.x/book.json b/docs/3.x.x/book.json deleted file mode 100644 index 85956d2fc6..0000000000 --- a/docs/3.x.x/book.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "title": "Strapi documentation", - "author": "Strapi", - "gitbook": "3.2.2", - "plugins": [ - "edit-link", - "anchorjs", - "search", - "-fontsettings", - "-sharing", - "versions", - "ga", - "github", - "feathers-collapsible-menu", - "block-align" - ], - "pluginsConfig": { - "edit-link": { - "label": "Edit This Page", - "base": "https://github.com/strapi/strapi/tree/master/docs/3.x.x" - }, - "ga": { - "token": "UA-54313258-1" - }, - "github": { - "url": "https://github.com/strapi/strapi" - }, - "versions": { - "options": [ - { - "value": "/documentation/1.x.x/", - "text": "Versions 1.x.x", - "selected": false - }, - { - "value": "/documentation/3.x.x/", - "text": "Versions 3.x.x", - "selected": true - } - ] - } - } -} diff --git a/docs/3.x.x/en/cli/CLI.md b/docs/3.x.x/cli/CLI.md similarity index 100% rename from docs/3.x.x/en/cli/CLI.md rename to docs/3.x.x/cli/CLI.md diff --git a/docs/3.x.x/en/concepts/concepts.md b/docs/3.x.x/concepts/concepts.md similarity index 100% rename from docs/3.x.x/en/concepts/concepts.md rename to docs/3.x.x/concepts/concepts.md diff --git a/docs/3.x.x/en/configurations/configurations.md b/docs/3.x.x/configurations/configurations.md similarity index 100% rename from docs/3.x.x/en/configurations/configurations.md rename to docs/3.x.x/configurations/configurations.md diff --git a/docs/3.x.x/en/getting-started/installation.md b/docs/3.x.x/getting-started/installation.md similarity index 100% rename from docs/3.x.x/en/getting-started/installation.md rename to docs/3.x.x/getting-started/installation.md diff --git a/docs/3.x.x/en/getting-started/quick-start.md b/docs/3.x.x/getting-started/quick-start.md similarity index 100% rename from docs/3.x.x/en/getting-started/quick-start.md rename to docs/3.x.x/getting-started/quick-start.md diff --git a/docs/3.x.x/en/guides/authentication.md b/docs/3.x.x/guides/authentication.md similarity index 100% rename from docs/3.x.x/en/guides/authentication.md rename to docs/3.x.x/guides/authentication.md diff --git a/docs/3.x.x/en/guides/controllers.md b/docs/3.x.x/guides/controllers.md similarity index 100% rename from docs/3.x.x/en/guides/controllers.md rename to docs/3.x.x/guides/controllers.md diff --git a/docs/3.x.x/en/guides/deployment.md b/docs/3.x.x/guides/deployment.md similarity index 100% rename from docs/3.x.x/en/guides/deployment.md rename to docs/3.x.x/guides/deployment.md diff --git a/docs/3.x.x/en/guides/email.md b/docs/3.x.x/guides/email.md similarity index 100% rename from docs/3.x.x/en/guides/email.md rename to docs/3.x.x/guides/email.md diff --git a/docs/3.x.x/en/guides/filters.md b/docs/3.x.x/guides/filters.md similarity index 100% rename from docs/3.x.x/en/guides/filters.md rename to docs/3.x.x/guides/filters.md diff --git a/docs/3.x.x/en/guides/graphql.md b/docs/3.x.x/guides/graphql.md similarity index 100% rename from docs/3.x.x/en/guides/graphql.md rename to docs/3.x.x/guides/graphql.md diff --git a/docs/3.x.x/en/guides/i18n.md b/docs/3.x.x/guides/i18n.md similarity index 100% rename from docs/3.x.x/en/guides/i18n.md rename to docs/3.x.x/guides/i18n.md diff --git a/docs/3.x.x/en/guides/models.md b/docs/3.x.x/guides/models.md similarity index 100% rename from docs/3.x.x/en/guides/models.md rename to docs/3.x.x/guides/models.md diff --git a/docs/3.x.x/en/guides/policies.md b/docs/3.x.x/guides/policies.md similarity index 100% rename from docs/3.x.x/en/guides/policies.md rename to docs/3.x.x/guides/policies.md diff --git a/docs/3.x.x/en/guides/public-assets.md b/docs/3.x.x/guides/public-assets.md similarity index 100% rename from docs/3.x.x/en/guides/public-assets.md rename to docs/3.x.x/guides/public-assets.md diff --git a/docs/3.x.x/en/guides/requests.md b/docs/3.x.x/guides/requests.md similarity index 100% rename from docs/3.x.x/en/guides/requests.md rename to docs/3.x.x/guides/requests.md diff --git a/docs/3.x.x/en/guides/responses.md b/docs/3.x.x/guides/responses.md similarity index 100% rename from docs/3.x.x/en/guides/responses.md rename to docs/3.x.x/guides/responses.md diff --git a/docs/3.x.x/en/guides/restapi.md b/docs/3.x.x/guides/restapi.md similarity index 100% rename from docs/3.x.x/en/guides/restapi.md rename to docs/3.x.x/guides/restapi.md diff --git a/docs/3.x.x/en/guides/routing.md b/docs/3.x.x/guides/routing.md similarity index 100% rename from docs/3.x.x/en/guides/routing.md rename to docs/3.x.x/guides/routing.md diff --git a/docs/3.x.x/en/guides/services.md b/docs/3.x.x/guides/services.md similarity index 100% rename from docs/3.x.x/en/guides/services.md rename to docs/3.x.x/guides/services.md diff --git a/docs/3.x.x/en/guides/upload.md b/docs/3.x.x/guides/upload.md similarity index 100% rename from docs/3.x.x/en/guides/upload.md rename to docs/3.x.x/guides/upload.md diff --git a/docs/3.x.x/en/migration/migration-guide-alpha-10-to-alpha-11.md b/docs/3.x.x/migration/migration-guide-alpha-10-to-alpha-11.md similarity index 100% rename from docs/3.x.x/en/migration/migration-guide-alpha-10-to-alpha-11.md rename to docs/3.x.x/migration/migration-guide-alpha-10-to-alpha-11.md diff --git a/docs/3.x.x/en/migration/migration-guide-alpha-11-to-alpha-12.md b/docs/3.x.x/migration/migration-guide-alpha-11-to-alpha-12.md similarity index 100% rename from docs/3.x.x/en/migration/migration-guide-alpha-11-to-alpha-12.md rename to docs/3.x.x/migration/migration-guide-alpha-11-to-alpha-12.md diff --git a/docs/3.x.x/en/migration/migration-guide-alpha-7-4-to-alpha-8.md b/docs/3.x.x/migration/migration-guide-alpha-7-4-to-alpha-8.md similarity index 100% rename from docs/3.x.x/en/migration/migration-guide-alpha-7-4-to-alpha-8.md rename to docs/3.x.x/migration/migration-guide-alpha-7-4-to-alpha-8.md diff --git a/docs/3.x.x/en/migration/migration-guide-alpha-8-to-alpha-9.md b/docs/3.x.x/migration/migration-guide-alpha-8-to-alpha-9.md similarity index 100% rename from docs/3.x.x/en/migration/migration-guide-alpha-8-to-alpha-9.md rename to docs/3.x.x/migration/migration-guide-alpha-8-to-alpha-9.md diff --git a/docs/3.x.x/en/migration/migration-guide-alpha-9-to-alpha-10.md b/docs/3.x.x/migration/migration-guide-alpha-9-to-alpha-10.md similarity index 100% rename from docs/3.x.x/en/migration/migration-guide-alpha-9-to-alpha-10.md rename to docs/3.x.x/migration/migration-guide-alpha-9-to-alpha-10.md diff --git a/docs/3.x.x/en/migration/migration-guide.md b/docs/3.x.x/migration/migration-guide.md similarity index 100% rename from docs/3.x.x/en/migration/migration-guide.md rename to docs/3.x.x/migration/migration-guide.md diff --git a/docs/3.x.x/en/plugin-development/backend-development.md b/docs/3.x.x/plugin-development/backend-development.md similarity index 100% rename from docs/3.x.x/en/plugin-development/backend-development.md rename to docs/3.x.x/plugin-development/backend-development.md diff --git a/docs/3.x.x/en/plugin-development/frontend-development.md b/docs/3.x.x/plugin-development/frontend-development.md similarity index 100% rename from docs/3.x.x/en/plugin-development/frontend-development.md rename to docs/3.x.x/plugin-development/frontend-development.md diff --git a/docs/3.x.x/en/plugin-development/frontend-use-cases.md b/docs/3.x.x/plugin-development/frontend-use-cases.md similarity index 100% rename from docs/3.x.x/en/plugin-development/frontend-use-cases.md rename to docs/3.x.x/plugin-development/frontend-use-cases.md diff --git a/docs/3.x.x/en/plugin-development/plugin-architecture.md b/docs/3.x.x/plugin-development/plugin-architecture.md similarity index 100% rename from docs/3.x.x/en/plugin-development/plugin-architecture.md rename to docs/3.x.x/plugin-development/plugin-architecture.md diff --git a/docs/3.x.x/en/plugin-development/plugin-left-menu.md b/docs/3.x.x/plugin-development/plugin-left-menu.md similarity index 100% rename from docs/3.x.x/en/plugin-development/plugin-left-menu.md rename to docs/3.x.x/plugin-development/plugin-left-menu.md diff --git a/docs/3.x.x/en/plugin-development/quick-start.md b/docs/3.x.x/plugin-development/quick-start.md similarity index 100% rename from docs/3.x.x/en/plugin-development/quick-start.md rename to docs/3.x.x/plugin-development/quick-start.md diff --git a/docs/3.x.x/en/plugin-development/ui-components.md b/docs/3.x.x/plugin-development/ui-components.md similarity index 100% rename from docs/3.x.x/en/plugin-development/ui-components.md rename to docs/3.x.x/plugin-development/ui-components.md diff --git a/docs/3.x.x/en/plugin-development/utils.md b/docs/3.x.x/plugin-development/utils.md similarity index 100% rename from docs/3.x.x/en/plugin-development/utils.md rename to docs/3.x.x/plugin-development/utils.md diff --git a/docs/3.x.x/en/styles/website.css b/docs/3.x.x/styles/website.css similarity index 100% rename from docs/3.x.x/en/styles/website.css rename to docs/3.x.x/styles/website.css diff --git a/docs/3.x.x/en/tutorials/README.md b/docs/3.x.x/tutorials/README.md similarity index 100% rename from docs/3.x.x/en/tutorials/README.md rename to docs/3.x.x/tutorials/README.md From 989b867714884eefcd919388e31d4b18e83c1206 Mon Sep 17 00:00:00 2001 From: cyril lopez Date: Tue, 25 Sep 2018 15:01:06 +0200 Subject: [PATCH 07/81] Split admin entry point between dev and prod --- packages/strapi-admin/admin/src/app.js | 175 +----------------- packages/strapi-admin/admin/src/appDev.js | 43 +++++ .../admin/src/config/manifest.json | 2 +- .../strapi-admin/admin/src/configureStore.js | 61 ++++++ .../strapi-admin/admin/src/createStore.js | 15 ++ .../strapi-admin/admin/src/intlPolyfill.js | 19 ++ packages/strapi-admin/admin/src/renderApp.js | 26 +++ packages/strapi-admin/admin/src/strapi.js | 97 ++++++++++ packages/strapi-admin/package.json | 2 +- .../internals/webpack/webpack.dev.babel.js | 2 +- .../package.json | 2 +- .../package.json | 2 +- packages/strapi-plugin-email/package.json | 2 +- packages/strapi-plugin-graphql/package.json | 2 +- .../package.json | 2 +- packages/strapi-plugin-upload/package.json | 2 +- .../package.json | 2 +- packages/strapi/bin/strapi.js | 0 18 files changed, 278 insertions(+), 178 deletions(-) create mode 100644 packages/strapi-admin/admin/src/appDev.js create mode 100644 packages/strapi-admin/admin/src/configureStore.js create mode 100644 packages/strapi-admin/admin/src/createStore.js create mode 100644 packages/strapi-admin/admin/src/intlPolyfill.js create mode 100644 packages/strapi-admin/admin/src/renderApp.js create mode 100644 packages/strapi-admin/admin/src/strapi.js mode change 100644 => 100755 packages/strapi/bin/strapi.js diff --git a/packages/strapi-admin/admin/src/app.js b/packages/strapi-admin/admin/src/app.js index 83a6e8debd..aaa3af8f61 100644 --- a/packages/strapi-admin/admin/src/app.js +++ b/packages/strapi-admin/admin/src/app.js @@ -1,91 +1,24 @@ /** * app.js * - * This is the entry file for the application, only setup and boilerplate + * This is the entry file for the application when running the build * code. */ /* eslint-disable */ -import './public-path'; import 'babel-polyfill'; -/* eslint-disable no-console */ -// Import all the third party stuff -import { Provider } from 'react-redux'; -import React from 'react'; -import ReactDOM from 'react-dom'; -import { ConnectedRouter } from 'react-router-redux'; -import createHistory from 'history/createBrowserHistory'; -import { merge, isFunction } from 'lodash'; +import { findIndex } from 'lodash'; import 'sanitize.css/sanitize.css'; import 'whatwg-fetch'; - -import LanguageProvider from 'containers/LanguageProvider'; - -import App from 'containers/App'; -import { showNotification } from 'containers/NotificationProvider/actions'; import { - freezeApp, - pluginLoaded, - unfreezeApp, unsetHasUserPlugin, - updatePlugin, } from 'containers/App/actions'; +import { basename, store } from './createStore'; +import './intlPolyfill'; +import './public-path'; +import './strapi'; -import auth from 'utils/auth'; -import configureStore from './store'; -import { translationMessages, languages } from './i18n'; -import { findIndex } from 'lodash'; - -const plugins = (() => { - try { - return require('./config/plugins.json'); - } catch (e) { - return []; - } -})(); -/* eslint-enable */ - -// Create redux store with history -const basename = strapi.remoteURL.replace(window.location.origin, ''); -const history = createHistory({ - basename, -}); -const store = configureStore({}, history); - -const render = (translatedMessages) => { - ReactDOM.render( - - - - - - - , - document.getElementById('app') - ); -}; - -// Hot reloadable translation json files -if (module.hot) { - // modules.hot.accept does not accept dynamic dependencies, - // have to be constants at compile-time - module.hot.accept('./i18n', () => { - render(translationMessages); - }); -} - -// Chunked polyfill for browsers without Intl support -window.onload = function onLoad() { - if (!window.Intl) { - Promise.all([ - System.import('intl'), - System.import('intl/locale-data/jsonp/en.js'), - System.import('intl/locale-data/jsonp/fr.js'), - ]).then(() => render(translationMessages)); - } else { - render(translationMessages); - } -}; +const dispatch = store.dispatch; // Don't inject plugins in development mode. if (window.location.port !== '4000') { @@ -131,102 +64,8 @@ if (window.location.port !== '4000') { .catch(err => { console.log(err); // eslint-disable-line no-console }); -} else if (findIndex(plugins, ['id', 'users-permissions']) === -1) { - store.dispatch(unsetHasUserPlugin()); } -// const isPluginAllowedToRegister = (plugin) => true; -const isPluginAllowedToRegister = (plugin) => plugin.id === 'users-permissions' || plugin.id === 'email' || auth.getToken(); - -/** - * Register a plugin - * - * @param params - */ -const registerPlugin = (plugin) => { - // Merge admin translation messages - merge(translationMessages, plugin.translationMessages); - - plugin.leftMenuSections = plugin.leftMenuSections || []; - const shouldAllowRegister = isPluginAllowedToRegister(plugin) !== null; - - switch (true) { - // Execute bootstrap function and check if plugin can be rendered - case isFunction(plugin.bootstrap) && isFunction(plugin.pluginRequirements) && shouldAllowRegister: - plugin.pluginRequirements(plugin) - .then(plugin => { - return plugin.bootstrap(plugin); - }) - .then(plugin => { - store.dispatch(pluginLoaded(plugin)); - }); - break; - // Check if plugin can be rendered - case isFunction(plugin.pluginRequirements): - plugin.pluginRequirements(plugin).then(plugin => { - store.dispatch(pluginLoaded(plugin)); - }); - break; - // Execute bootstrap function - case isFunction(plugin.bootstrap) && shouldAllowRegister: - plugin.bootstrap(plugin).then(plugin => { - store.dispatch(pluginLoaded(plugin)); - }); - break; - default: - store.dispatch(pluginLoaded(plugin)); - } -}; - -const displayNotification = (message, status) => { - store.dispatch(showNotification(message, status)); -}; - -const lockApp = () => { - store.dispatch(freezeApp()); -}; - -const unlockApp = () => { - store.dispatch(unfreezeApp()); -}; - -/** - * Public Strapi object exposed to the `window` object - */ - -window.strapi = Object.assign(window.strapi || {}, { - mode: process.env.MODE || 'host', - registerPlugin, - notification: { - success: (message) => { - displayNotification(message, 'success'); - }, - warning: (message) => { - displayNotification(message, 'warning'); - }, - error: (message) => { - displayNotification(message, 'error'); - }, - info: (message) => { - displayNotification(message, 'info'); - }, - }, - refresh: (pluginId) => ({ - translationMessages: (translationMessagesUpdated) => { - render(merge({}, translationMessages, translationMessagesUpdated)); - }, - leftMenuSections: (leftMenuSectionsUpdated) => { - store.dispatch(updatePlugin(pluginId, 'leftMenuSections', leftMenuSectionsUpdated)); - }, - }), - router: history, - languages, - currentLanguage: window.localStorage.getItem('strapi-admin-language') || window.navigator.language || window.navigator.userLanguage || 'en', - lockApp, - unlockApp, -}); - -const dispatch = store.dispatch; export { dispatch, }; diff --git a/packages/strapi-admin/admin/src/appDev.js b/packages/strapi-admin/admin/src/appDev.js new file mode 100644 index 0000000000..53e7c0915d --- /dev/null +++ b/packages/strapi-admin/admin/src/appDev.js @@ -0,0 +1,43 @@ +/** + * appDev.js + * + * This is then entry file for the application in development + * + */ + +import { findIndex } from 'lodash'; +import { + unsetHasUserPlugin, +} from 'containers/App/actions'; +import 'babel-polyfill'; +import 'sanitize.css/sanitize.css'; +import { store } from './createStore'; +import render from './renderApp'; +import './intlPolyfill'; +import './strapi'; + +const dispatch = store.dispatch; +const plugins = (() => { + try { + return require('./config/plugins.json'); + } catch (e) { + return []; + } +})(); + +// Hot reloadable translation json files +if (module.hot) { + // modules.hot.accept does not accept dynamic dependencies, + // have to be constants at compile-time + module.hot.accept('./i18n', () => { + render(translationMessages); + }); +} + +if (findIndex(plugins, ['id', 'users-permissions']) === -1) { + store.dispatch(unsetHasUserPlugin()); +} + +export { + dispatch, +}; diff --git a/packages/strapi-admin/admin/src/config/manifest.json b/packages/strapi-admin/admin/src/config/manifest.json index 5568650931..dbcd91b1f5 100644 --- a/packages/strapi-admin/admin/src/config/manifest.json +++ b/packages/strapi-admin/admin/src/config/manifest.json @@ -1 +1 @@ -{"name":"vendor_lib","content":{"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_export.js":{"id":0,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_an-object.js":{"id":1,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_global.js":{"id":2,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_fails.js":{"id":3,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_is-object.js":{"id":4,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_wks.js":{"id":5,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_descriptors.js":{"id":6,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_object-dp.js":{"id":7,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_to-length.js":{"id":8,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_to-object.js":{"id":9,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_a-function.js":{"id":10,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_hide.js":{"id":11,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_redefine.js":{"id":12,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_string-html.js":{"id":13,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_has.js":{"id":14,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_to-iobject.js":{"id":15,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_object-gopd.js":{"id":16,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_object-gpo.js":{"id":17,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_core.js":{"id":18,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_ctx.js":{"id":19,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_cof.js":{"id":20,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_strict-method.js":{"id":21,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/react/index.js":{"id":22,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_to-primitive.js":{"id":23,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_defined.js":{"id":24,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_to-integer.js":{"id":25,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_object-sap.js":{"id":26,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_array-methods.js":{"id":27,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_typed-array.js":{"id":28,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_metadata.js":{"id":29,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/prop-types/index.js":{"id":30,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_meta.js":{"id":31,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_library.js":{"id":32,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_add-to-unscopables.js":{"id":33,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_property-desc.js":{"id":34,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_uid.js":{"id":35,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_object-keys.js":{"id":36,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_to-absolute-index.js":{"id":37,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_object-create.js":{"id":38,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_object-gopn.js":{"id":39,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_set-species.js":{"id":40,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_an-instance.js":{"id":41,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_for-of.js":{"id":42,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_redefine-all.js":{"id":43,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_set-to-string-tag.js":{"id":44,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_string-trim.js":{"id":45,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_iterators.js":{"id":46,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_validate-collection.js":{"id":47,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_iobject.js":{"id":48,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_object-pie.js":{"id":49,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_classof.js":{"id":50,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/react-dom/index.js":{"id":51,"meta":{}},"./strapi-helper-plugin/node_modules/webpack/buildin/global.js":{"id":52,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_shared.js":{"id":53,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_array-includes.js":{"id":54,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_object-gops.js":{"id":55,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_is-array.js":{"id":56,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_is-regexp.js":{"id":57,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_iter-detect.js":{"id":58,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_flags.js":{"id":59,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_fix-re-wks.js":{"id":60,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_species-constructor.js":{"id":61,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_user-agent.js":{"id":62,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_collection.js":{"id":63,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_typed.js":{"id":64,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_object-forced-pam.js":{"id":65,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_set-collection-of.js":{"id":66,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_set-collection-from.js":{"id":67,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_dom-create.js":{"id":68,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_wks-define.js":{"id":69,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_shared-key.js":{"id":70,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_enum-bug-keys.js":{"id":71,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_html.js":{"id":72,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_set-proto.js":{"id":73,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_string-ws.js":{"id":74,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_inherit-if-required.js":{"id":75,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_string-repeat.js":{"id":76,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_math-sign.js":{"id":77,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_math-expm1.js":{"id":78,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_string-at.js":{"id":79,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_iter-define.js":{"id":80,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_iter-create.js":{"id":81,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_string-context.js":{"id":82,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_fails-is-regexp.js":{"id":83,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_is-array-iter.js":{"id":84,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_create-property.js":{"id":85,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/core.get-iterator-method.js":{"id":86,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_array-species-create.js":{"id":87,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_array-fill.js":{"id":88,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.array.iterator.js":{"id":89,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_task.js":{"id":90,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_microtask.js":{"id":91,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_new-promise-capability.js":{"id":92,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_typed-buffer.js":{"id":93,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/object-assign/index.js":{"id":94,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/intl-messageformat/src/main.js":{"id":95,"meta":{"harmonyModule":true},"exports":["default"]},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/intl-messageformat/src/utils.js":{"id":96,"meta":{"harmonyModule":true},"exports":["hop","extend"]},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/react-transition-group/Transition.js":{"id":97,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/react-lifecycles-compat/react-lifecycles-compat.cjs.js":{"id":98,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/react-transition-group/utils/PropTypes.js":{"id":99,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/react-transition-group/TransitionGroup.js":{"id":100,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_ie8-dom-define.js":{"id":101,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_wks-ext.js":{"id":102,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_object-keys-internal.js":{"id":103,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_object-dps.js":{"id":104,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_object-gopn-ext.js":{"id":105,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_object-assign.js":{"id":106,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_bind.js":{"id":107,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_invoke.js":{"id":108,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_parse-int.js":{"id":109,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_parse-float.js":{"id":110,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_a-number-value.js":{"id":111,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_is-integer.js":{"id":112,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_math-log1p.js":{"id":113,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_math-fround.js":{"id":114,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_iter-call.js":{"id":115,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_array-reduce.js":{"id":116,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_array-copy-within.js":{"id":117,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_iter-step.js":{"id":118,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.regexp.flags.js":{"id":119,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_perform.js":{"id":120,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_promise-resolve.js":{"id":121,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.map.js":{"id":122,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_collection-strong.js":{"id":123,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.set.js":{"id":124,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.weak-map.js":{"id":125,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_collection-weak.js":{"id":126,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_to-index.js":{"id":127,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_own-keys.js":{"id":128,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_flatten-into-array.js":{"id":129,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_string-pad.js":{"id":130,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_object-to-array.js":{"id":131,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_collection-to-json.js":{"id":132,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_array-from-iterable.js":{"id":133,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_math-scale.js":{"id":134,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/react/cjs/react.production.min.js":{"id":136,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/react-dom/cjs/react-dom.production.min.js":{"id":137,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/schedule/index.js":{"id":138,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/schedule/cjs/schedule.production.min.js":{"id":139,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/react-intl/lib/index.es.js":{"id":140,"meta":{"harmonyModule":true},"exports":["addLocaleData","intlShape","injectIntl","defineMessages","IntlProvider","FormattedDate","FormattedTime","FormattedRelative","FormattedNumber","FormattedPlural","FormattedMessage","FormattedHTMLMessage"]},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/intl-messageformat/src/core.js":{"id":142,"meta":{"harmonyModule":true},"exports":["default"]},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/intl-messageformat/src/es5.js":{"id":143,"meta":{"harmonyModule":true},"exports":["defineProperty","objCreate"]},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/intl-messageformat/src/compiler.js":{"id":144,"meta":{"harmonyModule":true},"exports":["default"]},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/intl-messageformat-parser/src/parser.js":{"id":145,"meta":{"harmonyModule":true},"exports":["default"]},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/intl-messageformat/src/en.js":{"id":146,"meta":{"harmonyModule":true},"exports":["default"]},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/intl-relativeformat/src/main.js":{"id":147,"meta":{"harmonyModule":true},"exports":["default"]},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/intl-relativeformat/src/core.js":{"id":148,"meta":{"harmonyModule":true},"exports":["default"]},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/intl-relativeformat/src/diff.js":{"id":149,"meta":{"harmonyModule":true},"exports":["default"]},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/intl-relativeformat/src/es5.js":{"id":150,"meta":{"harmonyModule":true},"exports":["defineProperty","objCreate","arrIndexOf","isArray","dateNow"]},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/intl-relativeformat/src/en.js":{"id":151,"meta":{"harmonyModule":true},"exports":["default"]},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/prop-types/factoryWithThrowingShims.js":{"id":152,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/prop-types/lib/ReactPropTypesSecret.js":{"id":153,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/invariant/browser.js":{"id":154,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/intl-format-cache/src/memoizer.js":{"id":155,"meta":{"harmonyModule":true},"exports":["default"]},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/intl-format-cache/src/es5.js":{"id":156,"meta":{"harmonyModule":true},"exports":["bind","defineProperty","objCreate"]},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/reactstrap/dist/reactstrap.es.js":{"id":157,"meta":{"harmonyModule":true},"exports":["Alert","Container","Row","Col","Navbar","NavbarBrand","NavbarToggler","Nav","NavItem","NavDropdown","NavLink","Breadcrumb","BreadcrumbItem","Button","ButtonDropdown","ButtonGroup","ButtonToolbar","Dropdown","DropdownItem","DropdownMenu","DropdownToggle","Fade","Badge","Card","CardLink","CardGroup","CardDeck","CardColumns","CardBody","CardBlock","CardFooter","CardHeader","CardImg","CardImgOverlay","Carousel","UncontrolledCarousel","CarouselControl","CarouselItem","CarouselIndicators","CarouselCaption","CardSubtitle","CardText","CardTitle","Popover","PopoverContent","PopoverBody","PopoverTitle","PopoverHeader","Progress","Modal","ModalHeader","ModalBody","ModalFooter","PopperContent","PopperTargetHelper","Tooltip","Table","ListGroup","Form","FormFeedback","FormGroup","FormText","Input","InputGroup","InputGroupAddon","InputGroupButton","InputGroupButtonDropdown","InputGroupText","Label","Media","Pagination","PaginationItem","PaginationLink","TabContent","TabPane","Jumbotron","Collapse","ListGroupItem","ListGroupItemText","ListGroupItemHeading","UncontrolledAlert","UncontrolledButtonDropdown","UncontrolledDropdown","UncontrolledNavDropdown","UncontrolledTooltip","Util"]},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/classnames/index.js":{"id":158,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/lodash.isfunction/index.js":{"id":159,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/lodash.isobject/index.js":{"id":160,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/react-popper/dist/react-popper.js":{"id":161,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/lodash.tonumber/index.js":{"id":162,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/react-transition-group/index.js":{"id":163,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/react-transition-group/CSSTransition.js":{"id":164,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/dom-helpers/class/addClass.js":{"id":165,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/dom-helpers/class/hasClass.js":{"id":166,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/dom-helpers/class/removeClass.js":{"id":167,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/react-transition-group/ReplaceTransition.js":{"id":168,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/react-transition-group/utils/ChildMapping.js":{"id":169,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/immutable/dist/immutable.js":{"id":170,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/lodash/lodash.js":{"id":171,"meta":{}},"./strapi-helper-plugin/node_modules/webpack/buildin/module.js":{"id":172,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/babel-polyfill/lib/index.js":{"id":173,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/shim.js":{"id":174,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.symbol.js":{"id":175,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_enum-keys.js":{"id":176,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.object.create.js":{"id":177,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.object.define-property.js":{"id":178,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.object.define-properties.js":{"id":179,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.object.get-own-property-descriptor.js":{"id":180,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.object.get-prototype-of.js":{"id":181,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.object.keys.js":{"id":182,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.object.get-own-property-names.js":{"id":183,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.object.freeze.js":{"id":184,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.object.seal.js":{"id":185,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.object.prevent-extensions.js":{"id":186,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.object.is-frozen.js":{"id":187,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.object.is-sealed.js":{"id":188,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.object.is-extensible.js":{"id":189,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.object.assign.js":{"id":190,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.object.is.js":{"id":191,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_same-value.js":{"id":192,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.object.set-prototype-of.js":{"id":193,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.object.to-string.js":{"id":194,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.function.bind.js":{"id":195,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.function.name.js":{"id":196,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.function.has-instance.js":{"id":197,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.parse-int.js":{"id":198,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.parse-float.js":{"id":199,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.number.constructor.js":{"id":200,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.number.to-fixed.js":{"id":201,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.number.to-precision.js":{"id":202,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.number.epsilon.js":{"id":203,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.number.is-finite.js":{"id":204,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.number.is-integer.js":{"id":205,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.number.is-nan.js":{"id":206,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.number.is-safe-integer.js":{"id":207,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.number.max-safe-integer.js":{"id":208,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.number.min-safe-integer.js":{"id":209,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.number.parse-float.js":{"id":210,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.number.parse-int.js":{"id":211,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.math.acosh.js":{"id":212,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.math.asinh.js":{"id":213,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.math.atanh.js":{"id":214,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.math.cbrt.js":{"id":215,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.math.clz32.js":{"id":216,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.math.cosh.js":{"id":217,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.math.expm1.js":{"id":218,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.math.fround.js":{"id":219,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.math.hypot.js":{"id":220,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.math.imul.js":{"id":221,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.math.log10.js":{"id":222,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.math.log1p.js":{"id":223,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.math.log2.js":{"id":224,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.math.sign.js":{"id":225,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.math.sinh.js":{"id":226,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.math.tanh.js":{"id":227,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.math.trunc.js":{"id":228,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.string.from-code-point.js":{"id":229,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.string.raw.js":{"id":230,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.string.trim.js":{"id":231,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.string.iterator.js":{"id":232,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.string.code-point-at.js":{"id":233,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.string.ends-with.js":{"id":234,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.string.includes.js":{"id":235,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.string.repeat.js":{"id":236,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.string.starts-with.js":{"id":237,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.string.anchor.js":{"id":238,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.string.big.js":{"id":239,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.string.blink.js":{"id":240,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.string.bold.js":{"id":241,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.string.fixed.js":{"id":242,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.string.fontcolor.js":{"id":243,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.string.fontsize.js":{"id":244,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.string.italics.js":{"id":245,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.string.link.js":{"id":246,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.string.small.js":{"id":247,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.string.strike.js":{"id":248,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.string.sub.js":{"id":249,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.string.sup.js":{"id":250,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.date.now.js":{"id":251,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.date.to-json.js":{"id":252,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.date.to-iso-string.js":{"id":253,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_date-to-iso-string.js":{"id":254,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.date.to-string.js":{"id":255,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.date.to-primitive.js":{"id":256,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_date-to-primitive.js":{"id":257,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.array.is-array.js":{"id":258,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.array.from.js":{"id":259,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.array.of.js":{"id":260,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.array.join.js":{"id":261,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.array.slice.js":{"id":262,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.array.sort.js":{"id":263,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.array.for-each.js":{"id":264,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_array-species-constructor.js":{"id":265,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.array.map.js":{"id":266,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.array.filter.js":{"id":267,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.array.some.js":{"id":268,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.array.every.js":{"id":269,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.array.reduce.js":{"id":270,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.array.reduce-right.js":{"id":271,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.array.index-of.js":{"id":272,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.array.last-index-of.js":{"id":273,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.array.copy-within.js":{"id":274,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.array.fill.js":{"id":275,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.array.find.js":{"id":276,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.array.find-index.js":{"id":277,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.array.species.js":{"id":278,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.regexp.constructor.js":{"id":279,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.regexp.to-string.js":{"id":280,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.regexp.match.js":{"id":281,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.regexp.replace.js":{"id":282,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.regexp.search.js":{"id":283,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.regexp.split.js":{"id":284,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.promise.js":{"id":285,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.weak-set.js":{"id":286,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.typed.array-buffer.js":{"id":287,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.typed.data-view.js":{"id":288,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.typed.int8-array.js":{"id":289,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.typed.uint8-array.js":{"id":290,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.typed.uint8-clamped-array.js":{"id":291,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.typed.int16-array.js":{"id":292,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.typed.uint16-array.js":{"id":293,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.typed.int32-array.js":{"id":294,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.typed.uint32-array.js":{"id":295,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.typed.float32-array.js":{"id":296,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.typed.float64-array.js":{"id":297,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.reflect.apply.js":{"id":298,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.reflect.construct.js":{"id":299,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.reflect.define-property.js":{"id":300,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.reflect.delete-property.js":{"id":301,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.reflect.enumerate.js":{"id":302,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.reflect.get.js":{"id":303,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.reflect.get-own-property-descriptor.js":{"id":304,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.reflect.get-prototype-of.js":{"id":305,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.reflect.has.js":{"id":306,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.reflect.is-extensible.js":{"id":307,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.reflect.own-keys.js":{"id":308,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.reflect.prevent-extensions.js":{"id":309,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.reflect.set.js":{"id":310,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.reflect.set-prototype-of.js":{"id":311,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.array.includes.js":{"id":312,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.array.flat-map.js":{"id":313,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.array.flatten.js":{"id":314,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.string.at.js":{"id":315,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.string.pad-start.js":{"id":316,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.string.pad-end.js":{"id":317,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.string.trim-left.js":{"id":318,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.string.trim-right.js":{"id":319,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.string.match-all.js":{"id":320,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.symbol.async-iterator.js":{"id":321,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.symbol.observable.js":{"id":322,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.object.get-own-property-descriptors.js":{"id":323,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.object.values.js":{"id":324,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.object.entries.js":{"id":325,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.object.define-getter.js":{"id":326,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.object.define-setter.js":{"id":327,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.object.lookup-getter.js":{"id":328,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.object.lookup-setter.js":{"id":329,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.map.to-json.js":{"id":330,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.set.to-json.js":{"id":331,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.map.of.js":{"id":332,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.set.of.js":{"id":333,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.weak-map.of.js":{"id":334,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.weak-set.of.js":{"id":335,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.map.from.js":{"id":336,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.set.from.js":{"id":337,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.weak-map.from.js":{"id":338,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.weak-set.from.js":{"id":339,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.global.js":{"id":340,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.system.global.js":{"id":341,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.error.is-error.js":{"id":342,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.math.clamp.js":{"id":343,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.math.deg-per-rad.js":{"id":344,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.math.degrees.js":{"id":345,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.math.fscale.js":{"id":346,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.math.iaddh.js":{"id":347,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.math.isubh.js":{"id":348,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.math.imulh.js":{"id":349,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.math.rad-per-deg.js":{"id":350,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.math.radians.js":{"id":351,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.math.scale.js":{"id":352,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.math.umulh.js":{"id":353,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.math.signbit.js":{"id":354,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.promise.finally.js":{"id":355,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.promise.try.js":{"id":356,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.reflect.define-metadata.js":{"id":357,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.reflect.delete-metadata.js":{"id":358,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.reflect.get-metadata.js":{"id":359,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.reflect.get-metadata-keys.js":{"id":360,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.reflect.get-own-metadata.js":{"id":361,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.reflect.get-own-metadata-keys.js":{"id":362,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.reflect.has-metadata.js":{"id":363,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.reflect.has-own-metadata.js":{"id":364,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.reflect.metadata.js":{"id":365,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.asap.js":{"id":366,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.observable.js":{"id":367,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/web.timers.js":{"id":368,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/web.immediate.js":{"id":369,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/web.dom.iterable.js":{"id":370,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/babel-polyfill/node_modules/regenerator-runtime/runtime.js":{"id":371,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/fn/regexp/escape.js":{"id":372,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/core.regexp.escape.js":{"id":373,"meta":{}},"./strapi-admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_replacer.js":{"id":374,"meta":{}}}} \ No newline at end of file +{"name":"vendor_lib","content":{"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_export.js":{"id":0,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_an-object.js":{"id":1,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_global.js":{"id":2,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_fails.js":{"id":3,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_is-object.js":{"id":4,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_wks.js":{"id":5,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_descriptors.js":{"id":6,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_object-dp.js":{"id":7,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_to-length.js":{"id":8,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_to-object.js":{"id":9,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_a-function.js":{"id":10,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_hide.js":{"id":11,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_redefine.js":{"id":12,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_string-html.js":{"id":13,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_has.js":{"id":14,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_to-iobject.js":{"id":15,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_object-gopd.js":{"id":16,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_object-gpo.js":{"id":17,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_core.js":{"id":18,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_ctx.js":{"id":19,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_cof.js":{"id":20,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_strict-method.js":{"id":21,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/react/index.js":{"id":22,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_to-primitive.js":{"id":23,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_defined.js":{"id":24,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_to-integer.js":{"id":25,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_object-sap.js":{"id":26,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_array-methods.js":{"id":27,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_typed-array.js":{"id":28,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_metadata.js":{"id":29,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/prop-types/index.js":{"id":30,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_meta.js":{"id":31,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_library.js":{"id":32,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_add-to-unscopables.js":{"id":33,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_property-desc.js":{"id":34,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_uid.js":{"id":35,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_object-keys.js":{"id":36,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_to-absolute-index.js":{"id":37,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_object-create.js":{"id":38,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_object-gopn.js":{"id":39,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_set-species.js":{"id":40,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_an-instance.js":{"id":41,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_for-of.js":{"id":42,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_redefine-all.js":{"id":43,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_set-to-string-tag.js":{"id":44,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_string-trim.js":{"id":45,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_iterators.js":{"id":46,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_validate-collection.js":{"id":47,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_iobject.js":{"id":48,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_object-pie.js":{"id":49,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_classof.js":{"id":50,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/react-dom/index.js":{"id":51,"meta":{}},"../../repositories/strapi/packages/strapi-helper-plugin/node_modules/webpack/buildin/global.js":{"id":52,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_shared.js":{"id":53,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_array-includes.js":{"id":54,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_object-gops.js":{"id":55,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_is-array.js":{"id":56,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_is-regexp.js":{"id":57,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_iter-detect.js":{"id":58,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_flags.js":{"id":59,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_fix-re-wks.js":{"id":60,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_species-constructor.js":{"id":61,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_user-agent.js":{"id":62,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_collection.js":{"id":63,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_typed.js":{"id":64,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_object-forced-pam.js":{"id":65,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_set-collection-of.js":{"id":66,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_set-collection-from.js":{"id":67,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_dom-create.js":{"id":68,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_wks-define.js":{"id":69,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_shared-key.js":{"id":70,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_enum-bug-keys.js":{"id":71,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_html.js":{"id":72,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_set-proto.js":{"id":73,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_string-ws.js":{"id":74,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_inherit-if-required.js":{"id":75,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_string-repeat.js":{"id":76,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_math-sign.js":{"id":77,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_math-expm1.js":{"id":78,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_string-at.js":{"id":79,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_iter-define.js":{"id":80,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_iter-create.js":{"id":81,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_string-context.js":{"id":82,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_fails-is-regexp.js":{"id":83,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_is-array-iter.js":{"id":84,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_create-property.js":{"id":85,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/core.get-iterator-method.js":{"id":86,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_array-species-create.js":{"id":87,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_array-fill.js":{"id":88,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.array.iterator.js":{"id":89,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_task.js":{"id":90,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_microtask.js":{"id":91,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_new-promise-capability.js":{"id":92,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_typed-buffer.js":{"id":93,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/object-assign/index.js":{"id":94,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/intl-messageformat/src/main.js":{"id":95,"meta":{"harmonyModule":true},"exports":["default"]},"./admin/node_modules/strapi-helper-plugin/node_modules/intl-messageformat/src/utils.js":{"id":96,"meta":{"harmonyModule":true},"exports":["hop","extend"]},"./admin/node_modules/strapi-helper-plugin/node_modules/react-transition-group/Transition.js":{"id":97,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/react-lifecycles-compat/react-lifecycles-compat.cjs.js":{"id":98,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/react-transition-group/utils/PropTypes.js":{"id":99,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/react-transition-group/TransitionGroup.js":{"id":100,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_ie8-dom-define.js":{"id":101,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_wks-ext.js":{"id":102,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_object-keys-internal.js":{"id":103,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_object-dps.js":{"id":104,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_object-gopn-ext.js":{"id":105,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_object-assign.js":{"id":106,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_bind.js":{"id":107,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_invoke.js":{"id":108,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_parse-int.js":{"id":109,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_parse-float.js":{"id":110,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_a-number-value.js":{"id":111,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_is-integer.js":{"id":112,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_math-log1p.js":{"id":113,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_math-fround.js":{"id":114,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_iter-call.js":{"id":115,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_array-reduce.js":{"id":116,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_array-copy-within.js":{"id":117,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_iter-step.js":{"id":118,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.regexp.flags.js":{"id":119,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_perform.js":{"id":120,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_promise-resolve.js":{"id":121,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.map.js":{"id":122,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_collection-strong.js":{"id":123,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.set.js":{"id":124,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.weak-map.js":{"id":125,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_collection-weak.js":{"id":126,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_to-index.js":{"id":127,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_own-keys.js":{"id":128,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_flatten-into-array.js":{"id":129,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_string-pad.js":{"id":130,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_object-to-array.js":{"id":131,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_collection-to-json.js":{"id":132,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_array-from-iterable.js":{"id":133,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_math-scale.js":{"id":134,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/react/cjs/react.production.min.js":{"id":136,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/react-dom/cjs/react-dom.production.min.js":{"id":137,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/schedule/index.js":{"id":138,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/schedule/cjs/schedule.production.min.js":{"id":139,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/react-intl/lib/index.es.js":{"id":140,"meta":{"harmonyModule":true},"exports":["addLocaleData","intlShape","injectIntl","defineMessages","IntlProvider","FormattedDate","FormattedTime","FormattedRelative","FormattedNumber","FormattedPlural","FormattedMessage","FormattedHTMLMessage"]},"./admin/node_modules/strapi-helper-plugin/node_modules/intl-messageformat/src/core.js":{"id":142,"meta":{"harmonyModule":true},"exports":["default"]},"./admin/node_modules/strapi-helper-plugin/node_modules/intl-messageformat/src/es5.js":{"id":143,"meta":{"harmonyModule":true},"exports":["defineProperty","objCreate"]},"./admin/node_modules/strapi-helper-plugin/node_modules/intl-messageformat/src/compiler.js":{"id":144,"meta":{"harmonyModule":true},"exports":["default"]},"./admin/node_modules/strapi-helper-plugin/node_modules/intl-messageformat-parser/src/parser.js":{"id":145,"meta":{"harmonyModule":true},"exports":["default"]},"./admin/node_modules/strapi-helper-plugin/node_modules/intl-messageformat/src/en.js":{"id":146,"meta":{"harmonyModule":true},"exports":["default"]},"./admin/node_modules/strapi-helper-plugin/node_modules/intl-relativeformat/src/main.js":{"id":147,"meta":{"harmonyModule":true},"exports":["default"]},"./admin/node_modules/strapi-helper-plugin/node_modules/intl-relativeformat/src/core.js":{"id":148,"meta":{"harmonyModule":true},"exports":["default"]},"./admin/node_modules/strapi-helper-plugin/node_modules/intl-relativeformat/src/diff.js":{"id":149,"meta":{"harmonyModule":true},"exports":["default"]},"./admin/node_modules/strapi-helper-plugin/node_modules/intl-relativeformat/src/es5.js":{"id":150,"meta":{"harmonyModule":true},"exports":["defineProperty","objCreate","arrIndexOf","isArray","dateNow"]},"./admin/node_modules/strapi-helper-plugin/node_modules/intl-relativeformat/src/en.js":{"id":151,"meta":{"harmonyModule":true},"exports":["default"]},"./admin/node_modules/strapi-helper-plugin/node_modules/prop-types/factoryWithThrowingShims.js":{"id":152,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/prop-types/lib/ReactPropTypesSecret.js":{"id":153,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js":{"id":154,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/invariant/browser.js":{"id":155,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/intl-format-cache/src/memoizer.js":{"id":156,"meta":{"harmonyModule":true},"exports":["default"]},"./admin/node_modules/strapi-helper-plugin/node_modules/intl-format-cache/src/es5.js":{"id":157,"meta":{"harmonyModule":true},"exports":["bind","defineProperty","objCreate"]},"./admin/node_modules/strapi-helper-plugin/node_modules/reactstrap/dist/reactstrap.es.js":{"id":158,"meta":{"harmonyModule":true},"exports":["Alert","Container","Row","Col","Navbar","NavbarBrand","NavbarToggler","Nav","NavItem","NavDropdown","NavLink","Breadcrumb","BreadcrumbItem","Button","ButtonDropdown","ButtonGroup","ButtonToolbar","Dropdown","DropdownItem","DropdownMenu","DropdownToggle","Fade","Badge","Card","CardLink","CardGroup","CardDeck","CardColumns","CardBody","CardBlock","CardFooter","CardHeader","CardImg","CardImgOverlay","Carousel","UncontrolledCarousel","CarouselControl","CarouselItem","CarouselIndicators","CarouselCaption","CardSubtitle","CardText","CardTitle","Popover","PopoverContent","PopoverBody","PopoverTitle","PopoverHeader","Progress","Modal","ModalHeader","ModalBody","ModalFooter","PopperContent","PopperTargetHelper","Tooltip","Table","ListGroup","Form","FormFeedback","FormGroup","FormText","Input","InputGroup","InputGroupAddon","InputGroupButton","InputGroupButtonDropdown","InputGroupText","Label","Media","Pagination","PaginationItem","PaginationLink","TabContent","TabPane","Jumbotron","Collapse","ListGroupItem","ListGroupItemText","ListGroupItemHeading","UncontrolledAlert","UncontrolledButtonDropdown","UncontrolledDropdown","UncontrolledNavDropdown","UncontrolledTooltip","Util"]},"./admin/node_modules/strapi-helper-plugin/node_modules/classnames/index.js":{"id":159,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/lodash.isfunction/index.js":{"id":160,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/lodash.isobject/index.js":{"id":161,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/react-popper/dist/react-popper.js":{"id":162,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/lodash.tonumber/index.js":{"id":163,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/react-transition-group/index.js":{"id":164,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/react-transition-group/CSSTransition.js":{"id":165,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/dom-helpers/class/addClass.js":{"id":166,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/dom-helpers/class/hasClass.js":{"id":167,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/dom-helpers/class/removeClass.js":{"id":168,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/react-transition-group/ReplaceTransition.js":{"id":169,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/react-transition-group/utils/ChildMapping.js":{"id":170,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/immutable/dist/immutable.js":{"id":171,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/lodash/lodash.js":{"id":172,"meta":{}},"../../repositories/strapi/packages/strapi-helper-plugin/node_modules/webpack/buildin/module.js":{"id":173,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/babel-polyfill/lib/index.js":{"id":174,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/shim.js":{"id":175,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.symbol.js":{"id":176,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_enum-keys.js":{"id":177,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.object.create.js":{"id":178,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.object.define-property.js":{"id":179,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.object.define-properties.js":{"id":180,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.object.get-own-property-descriptor.js":{"id":181,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.object.get-prototype-of.js":{"id":182,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.object.keys.js":{"id":183,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.object.get-own-property-names.js":{"id":184,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.object.freeze.js":{"id":185,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.object.seal.js":{"id":186,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.object.prevent-extensions.js":{"id":187,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.object.is-frozen.js":{"id":188,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.object.is-sealed.js":{"id":189,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.object.is-extensible.js":{"id":190,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.object.assign.js":{"id":191,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.object.is.js":{"id":192,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_same-value.js":{"id":193,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.object.set-prototype-of.js":{"id":194,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.object.to-string.js":{"id":195,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.function.bind.js":{"id":196,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.function.name.js":{"id":197,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.function.has-instance.js":{"id":198,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.parse-int.js":{"id":199,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.parse-float.js":{"id":200,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.number.constructor.js":{"id":201,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.number.to-fixed.js":{"id":202,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.number.to-precision.js":{"id":203,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.number.epsilon.js":{"id":204,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.number.is-finite.js":{"id":205,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.number.is-integer.js":{"id":206,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.number.is-nan.js":{"id":207,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.number.is-safe-integer.js":{"id":208,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.number.max-safe-integer.js":{"id":209,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.number.min-safe-integer.js":{"id":210,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.number.parse-float.js":{"id":211,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.number.parse-int.js":{"id":212,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.math.acosh.js":{"id":213,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.math.asinh.js":{"id":214,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.math.atanh.js":{"id":215,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.math.cbrt.js":{"id":216,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.math.clz32.js":{"id":217,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.math.cosh.js":{"id":218,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.math.expm1.js":{"id":219,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.math.fround.js":{"id":220,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.math.hypot.js":{"id":221,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.math.imul.js":{"id":222,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.math.log10.js":{"id":223,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.math.log1p.js":{"id":224,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.math.log2.js":{"id":225,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.math.sign.js":{"id":226,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.math.sinh.js":{"id":227,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.math.tanh.js":{"id":228,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.math.trunc.js":{"id":229,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.string.from-code-point.js":{"id":230,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.string.raw.js":{"id":231,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.string.trim.js":{"id":232,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.string.iterator.js":{"id":233,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.string.code-point-at.js":{"id":234,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.string.ends-with.js":{"id":235,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.string.includes.js":{"id":236,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.string.repeat.js":{"id":237,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.string.starts-with.js":{"id":238,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.string.anchor.js":{"id":239,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.string.big.js":{"id":240,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.string.blink.js":{"id":241,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.string.bold.js":{"id":242,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.string.fixed.js":{"id":243,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.string.fontcolor.js":{"id":244,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.string.fontsize.js":{"id":245,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.string.italics.js":{"id":246,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.string.link.js":{"id":247,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.string.small.js":{"id":248,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.string.strike.js":{"id":249,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.string.sub.js":{"id":250,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.string.sup.js":{"id":251,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.date.now.js":{"id":252,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.date.to-json.js":{"id":253,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.date.to-iso-string.js":{"id":254,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_date-to-iso-string.js":{"id":255,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.date.to-string.js":{"id":256,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.date.to-primitive.js":{"id":257,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_date-to-primitive.js":{"id":258,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.array.is-array.js":{"id":259,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.array.from.js":{"id":260,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.array.of.js":{"id":261,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.array.join.js":{"id":262,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.array.slice.js":{"id":263,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.array.sort.js":{"id":264,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.array.for-each.js":{"id":265,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_array-species-constructor.js":{"id":266,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.array.map.js":{"id":267,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.array.filter.js":{"id":268,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.array.some.js":{"id":269,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.array.every.js":{"id":270,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.array.reduce.js":{"id":271,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.array.reduce-right.js":{"id":272,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.array.index-of.js":{"id":273,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.array.last-index-of.js":{"id":274,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.array.copy-within.js":{"id":275,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.array.fill.js":{"id":276,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.array.find.js":{"id":277,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.array.find-index.js":{"id":278,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.array.species.js":{"id":279,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.regexp.constructor.js":{"id":280,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.regexp.to-string.js":{"id":281,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.regexp.match.js":{"id":282,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.regexp.replace.js":{"id":283,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.regexp.search.js":{"id":284,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.regexp.split.js":{"id":285,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.promise.js":{"id":286,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.weak-set.js":{"id":287,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.typed.array-buffer.js":{"id":288,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.typed.data-view.js":{"id":289,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.typed.int8-array.js":{"id":290,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.typed.uint8-array.js":{"id":291,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.typed.uint8-clamped-array.js":{"id":292,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.typed.int16-array.js":{"id":293,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.typed.uint16-array.js":{"id":294,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.typed.int32-array.js":{"id":295,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.typed.uint32-array.js":{"id":296,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.typed.float32-array.js":{"id":297,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.typed.float64-array.js":{"id":298,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.reflect.apply.js":{"id":299,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.reflect.construct.js":{"id":300,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.reflect.define-property.js":{"id":301,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.reflect.delete-property.js":{"id":302,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.reflect.enumerate.js":{"id":303,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.reflect.get.js":{"id":304,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.reflect.get-own-property-descriptor.js":{"id":305,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.reflect.get-prototype-of.js":{"id":306,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.reflect.has.js":{"id":307,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.reflect.is-extensible.js":{"id":308,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.reflect.own-keys.js":{"id":309,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.reflect.prevent-extensions.js":{"id":310,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.reflect.set.js":{"id":311,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es6.reflect.set-prototype-of.js":{"id":312,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.array.includes.js":{"id":313,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.array.flat-map.js":{"id":314,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.array.flatten.js":{"id":315,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.string.at.js":{"id":316,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.string.pad-start.js":{"id":317,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.string.pad-end.js":{"id":318,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.string.trim-left.js":{"id":319,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.string.trim-right.js":{"id":320,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.string.match-all.js":{"id":321,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.symbol.async-iterator.js":{"id":322,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.symbol.observable.js":{"id":323,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.object.get-own-property-descriptors.js":{"id":324,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.object.values.js":{"id":325,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.object.entries.js":{"id":326,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.object.define-getter.js":{"id":327,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.object.define-setter.js":{"id":328,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.object.lookup-getter.js":{"id":329,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.object.lookup-setter.js":{"id":330,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.map.to-json.js":{"id":331,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.set.to-json.js":{"id":332,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.map.of.js":{"id":333,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.set.of.js":{"id":334,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.weak-map.of.js":{"id":335,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.weak-set.of.js":{"id":336,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.map.from.js":{"id":337,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.set.from.js":{"id":338,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.weak-map.from.js":{"id":339,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.weak-set.from.js":{"id":340,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.global.js":{"id":341,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.system.global.js":{"id":342,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.error.is-error.js":{"id":343,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.math.clamp.js":{"id":344,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.math.deg-per-rad.js":{"id":345,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.math.degrees.js":{"id":346,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.math.fscale.js":{"id":347,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.math.iaddh.js":{"id":348,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.math.isubh.js":{"id":349,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.math.imulh.js":{"id":350,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.math.rad-per-deg.js":{"id":351,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.math.radians.js":{"id":352,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.math.scale.js":{"id":353,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.math.umulh.js":{"id":354,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.math.signbit.js":{"id":355,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.promise.finally.js":{"id":356,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.promise.try.js":{"id":357,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.reflect.define-metadata.js":{"id":358,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.reflect.delete-metadata.js":{"id":359,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.reflect.get-metadata.js":{"id":360,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.reflect.get-metadata-keys.js":{"id":361,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.reflect.get-own-metadata.js":{"id":362,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.reflect.get-own-metadata-keys.js":{"id":363,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.reflect.has-metadata.js":{"id":364,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.reflect.has-own-metadata.js":{"id":365,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.reflect.metadata.js":{"id":366,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.asap.js":{"id":367,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/es7.observable.js":{"id":368,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/web.timers.js":{"id":369,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/web.immediate.js":{"id":370,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/web.dom.iterable.js":{"id":371,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/babel-polyfill/node_modules/regenerator-runtime/runtime.js":{"id":372,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/fn/regexp/escape.js":{"id":373,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/core.regexp.escape.js":{"id":374,"meta":{}},"./admin/node_modules/strapi-helper-plugin/node_modules/core-js/modules/_replacer.js":{"id":375,"meta":{}}}} \ No newline at end of file diff --git a/packages/strapi-admin/admin/src/configureStore.js b/packages/strapi-admin/admin/src/configureStore.js new file mode 100644 index 0000000000..9e98513d44 --- /dev/null +++ b/packages/strapi-admin/admin/src/configureStore.js @@ -0,0 +1,61 @@ +/** + * Create the store with dynamic reducers + */ + +import { createStore, applyMiddleware, compose } from 'redux'; +import { fromJS } from 'immutable'; +import { routerMiddleware } from 'react-router-redux'; +import createSagaMiddleware from 'redux-saga'; +import createReducer from './reducers'; + +const sagaMiddleware = createSagaMiddleware(); + +export default function configureStore(initialState = {}, history) { + // Create the store with two middlewares + // 1. sagaMiddleware: Makes redux-sagas work + // 2. routerMiddleware: Syncs the location/URL path to the state + const middlewares = [ + sagaMiddleware, + routerMiddleware(history), + ]; + + const enhancers = [ + applyMiddleware(...middlewares), + ]; + + // If Redux DevTools Extension is installed use it, otherwise use Redux compose + /* eslint-disable no-underscore-dangle */ + const composeEnhancers = + process.env.NODE_ENV !== 'production' && + typeof window === 'object' && + window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ + ? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({ + // TODO Try to remove when `react-router-redux` is out of beta, LOCATION_CHANGE should not be fired more than once after hot reloading + // Prevent recomputing reducers for `replaceReducer` + shouldHotReload: false, + name: `Strapi - Dashboard`, + }) + : compose; + /* eslint-enable */ + + const store = createStore( + createReducer(), + fromJS(initialState), + composeEnhancers(...enhancers) + ); + + // Extensions + store.runSaga = sagaMiddleware.run; + store.injectedReducers = {}; // Reducer registry + store.injectedSagas = {}; // Saga registry + + // Make reducers hot reloadable, see http://mxs.is/googmo + /* istanbul ignore next */ + if (module.hot) { + module.hot.accept('./reducers', () => { + store.replaceReducer(createReducer(store.injectedReducers)); + }); + } + + return store; +} diff --git a/packages/strapi-admin/admin/src/createStore.js b/packages/strapi-admin/admin/src/createStore.js new file mode 100644 index 0000000000..15d73a3599 --- /dev/null +++ b/packages/strapi-admin/admin/src/createStore.js @@ -0,0 +1,15 @@ +/** + * Common configuration for the app in both dev an prod mode + */ + +import createHistory from 'history/createBrowserHistory'; +import './public-path'; +import configureStore from './configureStore'; + +const basename = strapi.remoteURL.replace(window.location.origin, ''); +const history = createHistory({ + basename, +}); +const store = configureStore({}, history); + +export { basename, history, store }; \ No newline at end of file diff --git a/packages/strapi-admin/admin/src/intlPolyfill.js b/packages/strapi-admin/admin/src/intlPolyfill.js new file mode 100644 index 0000000000..9fb314c013 --- /dev/null +++ b/packages/strapi-admin/admin/src/intlPolyfill.js @@ -0,0 +1,19 @@ +/** + * Common configuration for the app in both dev an prod mode + */ +import { translationMessages } from './i18n'; +import './public-path'; +import render from './renderApp'; + +// Chunked polyfill for browsers without Intl support +window.onload = function onLoad() { + if (!window.Intl) { + Promise.all([ + System.import('intl'), + System.import('intl/locale-data/jsonp/en.js'), + System.import('intl/locale-data/jsonp/fr.js'), + ]).then(() => render(translationMessages)); + } else { + render(translationMessages); + } +}; \ No newline at end of file diff --git a/packages/strapi-admin/admin/src/renderApp.js b/packages/strapi-admin/admin/src/renderApp.js new file mode 100644 index 0000000000..da4ad9eb68 --- /dev/null +++ b/packages/strapi-admin/admin/src/renderApp.js @@ -0,0 +1,26 @@ +/** + * Common configuration for the app in both dev an prod mode + */ + +import { Provider } from 'react-redux'; +import React from 'react'; +import ReactDOM from 'react-dom'; +import { ConnectedRouter } from 'react-router-redux'; +import LanguageProvider from 'containers/LanguageProvider'; +import App from 'containers/App'; +import { history, store } from './createStore'; + +const render = (translatedMessages) => { + ReactDOM.render( + + + + + + + , + document.getElementById('app') + ); +}; + +export default render; \ No newline at end of file diff --git a/packages/strapi-admin/admin/src/strapi.js b/packages/strapi-admin/admin/src/strapi.js new file mode 100644 index 0000000000..365f16e092 --- /dev/null +++ b/packages/strapi-admin/admin/src/strapi.js @@ -0,0 +1,97 @@ +/** + * Common configuration for the app in both dev an prod mode + */ + +import { merge, isFunction } from 'lodash'; +import { + freezeApp, + pluginLoaded, + unfreezeApp, + updatePlugin, +} from 'containers/App/actions'; +import auth from 'utils/auth'; +import { history, store } from './createStore'; +import { translationMessages, languages } from './i18n'; +import './public-path'; + +const isPluginAllowedToRegister = (plugin) => plugin.id === 'users-permissions' || plugin.id === 'email' || auth.getToken(); +/** + * Register a plugin + * + * @param params + */ +const registerPlugin = (plugin) => { + // Merge admin translation messages + merge(translationMessages, plugin.translationMessages); + + plugin.leftMenuSections = plugin.leftMenuSections || []; + const shouldAllowRegister = isPluginAllowedToRegister(plugin) !== null; + + switch (true) { + // Execute bootstrap function and check if plugin can be rendered + case isFunction(plugin.bootstrap) && isFunction(plugin.pluginRequirements) && shouldAllowRegister: + plugin.pluginRequirements(plugin) + .then(plugin => { + return plugin.bootstrap(plugin); + }) + .then(plugin => { + store.dispatch(pluginLoaded(plugin)); + }); + break; + // Check if plugin can be rendered + case isFunction(plugin.pluginRequirements): + plugin.pluginRequirements(plugin).then(plugin => { + store.dispatch(pluginLoaded(plugin)); + }); + break; + // Execute bootstrap function + case isFunction(plugin.bootstrap) && shouldAllowRegister: + plugin.bootstrap(plugin).then(plugin => { + store.dispatch(pluginLoaded(plugin)); + }); + break; + default: + store.dispatch(pluginLoaded(plugin)); + } +}; +const displayNotification = (message, status) => { + store.dispatch(showNotification(message, status)); +}; +const lockApp = () => { + store.dispatch(freezeApp()); +}; +const unlockApp = () => { + store.dispatch(unfreezeApp()); +}; + +window.strapi = Object.assign(window.strapi || {}, { + node: process.env.MODE || 'host', + registerPlugin, + notification: { + success: (message) => { + displayNotification(message, 'success'); + }, + warning: (message) => { + displayNotification(message, 'warning'); + }, + error: (message) => { + displayNotification(message, 'error'); + }, + info: (message) => { + displayNotification(message, 'info'); + }, + }, + refresh: (pluginId) => ({ + translationMessages: (translationMessagesUpdated) => { + render(merge({}, translationMessages, translationMessagesUpdated)); + }, + leftMenuSections: (leftMenuSectionsUpdated) => { + store.dispatch(updatePlugin(pluginId, 'leftMenuSections', leftMenuSectionsUpdated)); + }, + }), + router: history, + languages, + currentLanguage: window.localStorage.getItem('strapi-admin-language') || window.navigator.language || window.navigator.userLanguage || 'en', + lockApp, + unlockApp, +}); \ No newline at end of file diff --git a/packages/strapi-admin/package.json b/packages/strapi-admin/package.json index ea981d3377..783bb85517 100644 --- a/packages/strapi-admin/package.json +++ b/packages/strapi-admin/package.json @@ -51,4 +51,4 @@ "npm": ">= 5.0.0" }, "license": "MIT" -} \ No newline at end of file +} diff --git a/packages/strapi-helper-plugin/lib/internals/webpack/webpack.dev.babel.js b/packages/strapi-helper-plugin/lib/internals/webpack/webpack.dev.babel.js index c309f9b0cc..74fae158b6 100644 --- a/packages/strapi-helper-plugin/lib/internals/webpack/webpack.dev.babel.js +++ b/packages/strapi-helper-plugin/lib/internals/webpack/webpack.dev.babel.js @@ -88,7 +88,7 @@ module.exports = require('./webpack.base.babel')({ { main: [ `webpack-hot-middleware/client?path=http://localhost:${port}/__webpack_hmr`, - path.join(appPath, 'admin', 'admin', 'src', 'app.js'), + path.join(appPath, 'admin', 'admin', 'src', 'appDev.js'), ], }, plugins.src.reduce((acc, current) => { diff --git a/packages/strapi-plugin-content-manager/package.json b/packages/strapi-plugin-content-manager/package.json index 47aa89a1f8..0937a40e64 100644 --- a/packages/strapi-plugin-content-manager/package.json +++ b/packages/strapi-plugin-content-manager/package.json @@ -52,4 +52,4 @@ "npm": ">= 5.0.0" }, "license": "MIT" -} \ No newline at end of file +} diff --git a/packages/strapi-plugin-content-type-builder/package.json b/packages/strapi-plugin-content-type-builder/package.json index 8729f98025..ead681af93 100644 --- a/packages/strapi-plugin-content-type-builder/package.json +++ b/packages/strapi-plugin-content-type-builder/package.json @@ -51,4 +51,4 @@ "npm": ">= 5.0.0" }, "license": "MIT" -} \ No newline at end of file +} diff --git a/packages/strapi-plugin-email/package.json b/packages/strapi-plugin-email/package.json index 188549644d..e9b12d0228 100644 --- a/packages/strapi-plugin-email/package.json +++ b/packages/strapi-plugin-email/package.json @@ -49,4 +49,4 @@ "npm": ">= 5.0.0" }, "license": "MIT" -} \ No newline at end of file +} diff --git a/packages/strapi-plugin-graphql/package.json b/packages/strapi-plugin-graphql/package.json index 1666a298af..e82f95b88d 100644 --- a/packages/strapi-plugin-graphql/package.json +++ b/packages/strapi-plugin-graphql/package.json @@ -49,4 +49,4 @@ "npm": ">= 5.3.0" }, "license": "MIT" -} +} \ No newline at end of file diff --git a/packages/strapi-plugin-settings-manager/package.json b/packages/strapi-plugin-settings-manager/package.json index 8ddb4ad3c4..3ce2b8a942 100644 --- a/packages/strapi-plugin-settings-manager/package.json +++ b/packages/strapi-plugin-settings-manager/package.json @@ -48,4 +48,4 @@ "npm": ">= 5.0.0" }, "license": "MIT" -} \ No newline at end of file +} diff --git a/packages/strapi-plugin-upload/package.json b/packages/strapi-plugin-upload/package.json index 441465812a..5dd3c04aad 100644 --- a/packages/strapi-plugin-upload/package.json +++ b/packages/strapi-plugin-upload/package.json @@ -47,4 +47,4 @@ "npm": ">= 3.0.0" }, "license": "MIT" -} \ No newline at end of file +} diff --git a/packages/strapi-plugin-users-permissions/package.json b/packages/strapi-plugin-users-permissions/package.json index 95ed4e2dae..e7dc948e2a 100644 --- a/packages/strapi-plugin-users-permissions/package.json +++ b/packages/strapi-plugin-users-permissions/package.json @@ -55,4 +55,4 @@ "npm": ">= 5.0.0" }, "license": "MIT" -} \ No newline at end of file +} diff --git a/packages/strapi/bin/strapi.js b/packages/strapi/bin/strapi.js old mode 100644 new mode 100755 From d96b888cc65e3bec8c5b67ae5cd279f3ae5055f1 Mon Sep 17 00:00:00 2001 From: cyril lopez Date: Tue, 25 Sep 2018 17:11:14 +0200 Subject: [PATCH 08/81] Improve login --- packages/strapi-admin/admin/src/app.js | 5 +- packages/strapi-admin/admin/src/appDev.js | 5 +- .../admin/src/containers/AdminPage/actions.js | 47 ++-------- .../src/containers/AdminPage/constants.js | 8 +- .../admin/src/containers/AdminPage/index.js | 90 +++++++++---------- .../admin/src/containers/AdminPage/reducer.js | 20 ++--- .../admin/src/containers/AdminPage/saga.js | 46 +++++----- .../admin/src/containers/App/actions.js | 8 ++ .../admin/src/containers/App/constants.js | 1 + .../admin/src/containers/App/reducer.js | 9 +- .../admin/src/containers/App/selectors.js | 12 +++ packages/strapi-admin/admin/src/strapi.js | 1 + 12 files changed, 116 insertions(+), 136 deletions(-) diff --git a/packages/strapi-admin/admin/src/app.js b/packages/strapi-admin/admin/src/app.js index aaa3af8f61..7a53201557 100644 --- a/packages/strapi-admin/admin/src/app.js +++ b/packages/strapi-admin/admin/src/app.js @@ -11,6 +11,7 @@ import { findIndex } from 'lodash'; import 'sanitize.css/sanitize.css'; import 'whatwg-fetch'; import { + getAppPluginsSucceeded, unsetHasUserPlugin, } from 'containers/App/actions'; import { basename, store } from './createStore'; @@ -27,8 +28,10 @@ if (window.location.port !== '4000') { return response.json(); }) .then(plugins => { + dispatch(getAppPluginsSucceeded(plugins)); + if (findIndex(plugins, ['id', 'users-permissions']) === -1) { - store.dispatch(unsetHasUserPlugin()); + dispatch(unsetHasUserPlugin()); } const $body = document.getElementsByTagName('body')[0]; diff --git a/packages/strapi-admin/admin/src/appDev.js b/packages/strapi-admin/admin/src/appDev.js index 53e7c0915d..14dff854a3 100644 --- a/packages/strapi-admin/admin/src/appDev.js +++ b/packages/strapi-admin/admin/src/appDev.js @@ -7,6 +7,7 @@ import { findIndex } from 'lodash'; import { + getAppPluginsSucceeded, unsetHasUserPlugin, } from 'containers/App/actions'; import 'babel-polyfill'; @@ -25,6 +26,8 @@ const plugins = (() => { } })(); +dispatch(getAppPluginsSucceeded(plugins)); + // Hot reloadable translation json files if (module.hot) { // modules.hot.accept does not accept dynamic dependencies, @@ -35,7 +38,7 @@ if (module.hot) { } if (findIndex(plugins, ['id', 'users-permissions']) === -1) { - store.dispatch(unsetHasUserPlugin()); + dispatch(unsetHasUserPlugin()); } export { diff --git a/packages/strapi-admin/admin/src/containers/AdminPage/actions.js b/packages/strapi-admin/admin/src/containers/AdminPage/actions.js index 49f048f2b4..c4e04c7f0c 100644 --- a/packages/strapi-admin/admin/src/containers/AdminPage/actions.js +++ b/packages/strapi-admin/admin/src/containers/AdminPage/actions.js @@ -4,50 +4,19 @@ * */ import { - GET_CURR_ENV_SUCCEEDED, - GET_GA_STATUS, - GET_GA_STATUS_SUCCEEDED, - GET_LAYOUT, - GET_LAYOUT_SUCCEEDED, - GET_STRAPI_VERSION_SUCCEEDED, + GET_ADMIN_DATA, + GET_ADMIN_DATA_SUCCEEDED, } from './constants'; -export function getCurrEnvSucceeded(currentEnvironment) { +export function getAdminData() { return { - type: GET_CURR_ENV_SUCCEEDED, - currentEnvironment, + type: GET_ADMIN_DATA, }; } -export function getGaStatus() { +export function getAdminDataSucceeded(data) { return { - type: GET_GA_STATUS, + type: GET_ADMIN_DATA_SUCCEEDED, + data, }; -} - -export function getGaStatusSucceeded(allowGa) { - return { - type: GET_GA_STATUS_SUCCEEDED, - allowGa, - }; -} - -export function getLayout() { - return { - type: GET_LAYOUT, - }; -} - -export function getLayoutSucceeded(layout) { - return { - type: GET_LAYOUT_SUCCEEDED, - layout, - }; -} - -export function getStrapiVersionSucceeded(strapiVersion) { - return { - type: GET_STRAPI_VERSION_SUCCEEDED, - strapiVersion, - }; -} +} \ No newline at end of file diff --git a/packages/strapi-admin/admin/src/containers/AdminPage/constants.js b/packages/strapi-admin/admin/src/containers/AdminPage/constants.js index f76be27052..f39d32f359 100644 --- a/packages/strapi-admin/admin/src/containers/AdminPage/constants.js +++ b/packages/strapi-admin/admin/src/containers/AdminPage/constants.js @@ -4,9 +4,5 @@ * */ -export const GET_CURR_ENV_SUCCEEDED = 'app/Admin/GET_CURR_ENV_SUCCEEDED'; -export const GET_GA_STATUS = 'app/Admin/GET_GA_STATUS'; -export const GET_GA_STATUS_SUCCEEDED = 'app/Admin/GET_GA_STATUS_SUCCEEDED'; -export const GET_LAYOUT = 'app/Admin/GET_LAYOUT'; -export const GET_LAYOUT_SUCCEEDED = 'app/Admin/GET_LAYOUT_SUCCEEDED'; -export const GET_STRAPI_VERSION_SUCCEEDED = 'app/Admin/GET_STRAPI_VERSION_SUCCEEDED'; +export const GET_ADMIN_DATA = 'app/Admin/GET_ADMIN_DATA'; +export const GET_ADMIN_DATA_SUCCEEDED = 'app/Admin/GET_ADMIN_DATA_SUCCEEDED'; \ No newline at end of file diff --git a/packages/strapi-admin/admin/src/containers/AdminPage/index.js b/packages/strapi-admin/admin/src/containers/AdminPage/index.js index 5824914ba8..1f78e78e77 100644 --- a/packages/strapi-admin/admin/src/containers/AdminPage/index.js +++ b/packages/strapi-admin/admin/src/containers/AdminPage/index.js @@ -16,21 +16,17 @@ import { connect } from 'react-redux'; import { createStructuredSelector } from 'reselect'; import { Switch, Route } from 'react-router-dom'; import { get, includes, isFunction, map, omit } from 'lodash'; -import { compose } from 'redux'; - +import { bindActionCreators, compose } from 'redux'; // Actions required for disabling and enabling the OverlayBlocker import { disableGlobalOverlayBlocker, enableGlobalOverlayBlocker } from 'actions/overlayBlocker'; - import { pluginLoaded, updatePlugin } from 'containers/App/actions'; import { makeSelectBlockApp, + makeSelectIsAppLoading, makeSelectShowGlobalAppBlocker, selectHasUserPlugin, selectPlugins, } from 'containers/App/selectors'; - -import { hideNotification } from 'containers/NotificationProvider/actions'; - // Design import ComingSoonPage from 'containers/ComingSoonPage'; import Content from 'containers/Content'; @@ -41,21 +37,19 @@ import HomePage from 'containers/HomePage/Loadable'; import InstallPluginPage from 'containers/InstallPluginPage/Loadable'; import LeftMenu from 'containers/LeftMenu'; import ListPluginsPage from 'containers/ListPluginsPage/Loadable'; +import LoadingIndicatorPage from 'components/LoadingIndicatorPage'; import Logout from 'components/Logout'; import NotFoundPage from 'containers/NotFoundPage/Loadable'; import OverlayBlocker from 'components/OverlayBlocker'; import PluginPage from 'containers/PluginPage'; - // Utils import auth from 'utils/auth'; import injectReducer from 'utils/injectReducer'; import injectSaga from 'utils/injectSaga'; - -import { getGaStatus, getLayout } from './actions'; +import { getAdminData } from './actions'; import reducer from './reducer'; import saga from './saga'; import selectAdminPage from './selectors'; - import styles from './styles.scss'; const PLUGINS_TO_BLOCK_PRODUCTION = ['content-type-builder', 'settings-manager']; @@ -72,30 +66,30 @@ export class AdminPage extends React.Component { }); componentDidMount() { + this.props.getAdminData(); this.checkLogin(this.props); - this.props.getGaStatus(); - this.props.getLayout(); ReactGA.initialize('UA-54313258-9'); } - componentWillReceiveProps(nextProps) { - if (nextProps.location.pathname !== this.props.location.pathname) { - this.checkLogin(nextProps); + componentDidUpdate(prevProps) { + const { adminPage: { allowGa }, location: { pathname }, plugins } = this.props; - if (nextProps.adminPage.allowGa) { - ReactGA.pageview(nextProps.location.pathname); + if (prevProps.location.pathname !== pathname) { + this.checkLogin(this.props); + + if (allowGa) { + ReactGA.pageview(pathname); } } - if ( - get(nextProps.plugins.toJS(), ['users-permissions', 'hasAdminUser']) !== - get(this.props.plugins.toJS(), ['users-permissions', 'hasAdminUser']) - ) { - this.checkLogin(nextProps, true); + const hasAdminPath = ['users-permissions', 'hasAdminUser']; + + if (get(prevProps.plugins.toJS(), hasAdminPath) !== get(plugins.toJS(), hasAdminPath)) { + this.checkLogin(this.props, true); } - if (!this.hasUserPluginLoaded(this.props) && this.hasUserPluginLoaded(nextProps)) { - this.checkLogin(nextProps); + if (!this.hasUserPluginLoaded(prevProps) && this.hasUserPluginLoaded(this.props)) { + this.checkLogin(this.props); } } @@ -162,8 +156,18 @@ export class AdminPage extends React.Component { shouldDisplayLogout = () => auth.getToken() && this.props.hasUserPlugin && this.isUrlProtected(this.props); + shouldCheckTokenValidity = () => { + return this.hasUserPlugin() && auth.getToken() !== null; + } + showLeftMenu = () => !includes(this.props.location.pathname, 'users-permissions/auth/'); + showLoading = () => { + const { isAppLoading, adminPage: { isLoading } } = this.props; + + return isAppLoading || isLoading; + } + retrievePlugins = () => { const { adminPage: { currentEnvironment }, @@ -185,8 +189,8 @@ export class AdminPage extends React.Component { const header = this.showLeftMenu() ?
: ''; const style = this.showLeftMenu() ? {} : { width: '100%' }; - if (adminPage.isLoading) { - return
; + if (this.showLoading()) { + return ; } return ( @@ -244,8 +248,6 @@ AdminPage.propTypes = { blockApp: PropTypes.bool.isRequired, disableGlobalOverlayBlocker: PropTypes.func.isRequired, enableGlobalOverlayBlocker: PropTypes.func.isRequired, - getGaStatus: PropTypes.func.isRequired, - getLayout: PropTypes.func.isRequired, hasUserPlugin: PropTypes.bool, history: PropTypes.object.isRequired, location: PropTypes.object.isRequired, @@ -257,37 +259,25 @@ AdminPage.propTypes = { const mapStateToProps = createStructuredSelector({ adminPage: selectAdminPage(), + // appPlugins: makeSelectAppPlugins(), blockApp: makeSelectBlockApp(), hasUserPlugin: selectHasUserPlugin(), + isAppLoading: makeSelectIsAppLoading(), plugins: selectPlugins(), showGlobalAppBlocker: makeSelectShowGlobalAppBlocker(), }); function mapDispatchToProps(dispatch) { - return { - disableGlobalOverlayBlocker: () => { - dispatch(disableGlobalOverlayBlocker()); - }, - enableGlobalOverlayBlocker: () => { - dispatch(enableGlobalOverlayBlocker()); - }, - getGaStatus: () => { - dispatch(getGaStatus()); - }, - getLayout: () => { - dispatch(getLayout()); - }, - onHideNotification: id => { - dispatch(hideNotification(id)); - }, - pluginLoaded: plugin => { - dispatch(pluginLoaded(plugin)); - }, - updatePlugin: (pluginId, updatedKey, updatedValue) => { - dispatch(updatePlugin(pluginId, updatedKey, updatedValue)); + return bindActionCreators( + { + disableGlobalOverlayBlocker, + enableGlobalOverlayBlocker, + getAdminData, + pluginLoaded, + updatePlugin, }, dispatch, - }; + ); } const withConnect = connect(mapStateToProps, mapDispatchToProps); diff --git a/packages/strapi-admin/admin/src/containers/AdminPage/reducer.js b/packages/strapi-admin/admin/src/containers/AdminPage/reducer.js index b32fd475dd..56b8a1bad4 100644 --- a/packages/strapi-admin/admin/src/containers/AdminPage/reducer.js +++ b/packages/strapi-admin/admin/src/containers/AdminPage/reducer.js @@ -7,10 +7,7 @@ import { fromJS, Map } from 'immutable'; import { - GET_CURR_ENV_SUCCEEDED, - GET_GA_STATUS_SUCCEEDED, - GET_LAYOUT_SUCCEEDED, - GET_STRAPI_VERSION_SUCCEEDED, + GET_ADMIN_DATA_SUCCEEDED, } from './constants'; const initialState = fromJS({ @@ -23,16 +20,13 @@ const initialState = fromJS({ function adminPageReducer(state = initialState, action) { switch (action.type) { - case GET_CURR_ENV_SUCCEEDED: + case GET_ADMIN_DATA_SUCCEEDED: return state - .update('isLoading', () => false) - .update('currentEnvironment', () => action.currentEnvironment); - case GET_GA_STATUS_SUCCEEDED: - return state.update('allowGa', () => action.allowGa); - case GET_LAYOUT_SUCCEEDED: - return state.update('layout', () => Map(action.layout)); - case GET_STRAPI_VERSION_SUCCEEDED: - return state.update('strapiVersion', () => action.strapiVersion); + .update('allowGa', () => action.data.allowGa) + .update('currentEnvironment', () => action.data.currentEnvironment) + .update('layout', () => Map(action.data.layout)) + .update('strapiVersion', () => action.data.strapiVersion) + .update('isLoading', () => false); default: return state; } diff --git a/packages/strapi-admin/admin/src/containers/AdminPage/saga.js b/packages/strapi-admin/admin/src/containers/AdminPage/saga.js index 6bb488aeb9..b922a1705c 100644 --- a/packages/strapi-admin/admin/src/containers/AdminPage/saga.js +++ b/packages/strapi-admin/admin/src/containers/AdminPage/saga.js @@ -1,42 +1,38 @@ -import { fork, call, put, takeLatest } from 'redux-saga/effects'; +import { all, fork, call, put, select, takeLatest } from 'redux-saga/effects'; +import auth from 'utils/auth'; import request from 'utils/request'; - +import { makeSelectAppPlugins } from 'containers/App/selectors'; import { - getCurrEnvSucceeded, - getGaStatusSucceeded, - getLayoutSucceeded, - getStrapiVersionSucceeded, + getAdminDataSucceeded, } from './actions'; -import { GET_GA_STATUS, GET_LAYOUT } from './constants'; +import { GET_ADMIN_DATA } from './constants'; -function* getGaStatus() { +function* getData() { try { - const [{ allowGa }, { strapiVersion }, { currentEnvironment }] = yield [ + const appPlugins = yield select(makeSelectAppPlugins()); + const hasUserPlugin = appPlugins.indexOf('users-permissions') !== -1; + + if (hasUserPlugin && auth.getToken() !== null) { + yield call(request, `${strapi.backendURL}/users/me`, { method: 'GET' }); + } + + const [{ allowGa }, { strapiVersion }, { currentEnvironment }, { layout }] = yield all([ call(request, '/admin/gaConfig', { method: 'GET' }), call(request, '/admin/strapiVersion', { method: 'GET' }), call(request, '/admin/currentEnvironment', { method: 'GET' }), - ]; + call(request, '/admin/layout', { method: 'GET' }), + ]); + yield put(getAdminDataSucceeded({ allowGa, strapiVersion, currentEnvironment, layout })); - yield put(getCurrEnvSucceeded(currentEnvironment)); - yield put(getGaStatusSucceeded(allowGa)); - yield put(getStrapiVersionSucceeded(strapiVersion)); } catch(err) { - strapi.notification.error('notification.error'); - } -} - -function* getLayout() { - try { - const layout = yield call(request, '/admin/layout', { method: 'GET' }); - yield put(getLayoutSucceeded(layout)); - } catch(err) { - strapi.notification.error('notification.error.layout'); + console.log(err); // eslint-disable-line no-console } } function* defaultSaga() { - yield fork(takeLatest, GET_GA_STATUS, getGaStatus); - yield fork(takeLatest, GET_LAYOUT, getLayout); + yield all([ + fork(takeLatest, GET_ADMIN_DATA, getData), + ]); } export default defaultSaga; diff --git a/packages/strapi-admin/admin/src/containers/App/actions.js b/packages/strapi-admin/admin/src/containers/App/actions.js index ebb9411621..9682fdbb17 100644 --- a/packages/strapi-admin/admin/src/containers/App/actions.js +++ b/packages/strapi-admin/admin/src/containers/App/actions.js @@ -6,6 +6,7 @@ import { FREEZE_APP, + GET_APP_PLUGINS_SUCCEEDED, LOAD_PLUGIN, PLUGIN_DELETED, PLUGIN_LOADED, @@ -20,6 +21,13 @@ export function freezeApp() { }; } +export function getAppPluginsSucceeded(plugins) { + return { + type: GET_APP_PLUGINS_SUCCEEDED, + appPlugins: plugins.map(plugin => plugin.id), + }; +} + export function loadPlugin(newPlugin) { return { type: LOAD_PLUGIN, diff --git a/packages/strapi-admin/admin/src/containers/App/constants.js b/packages/strapi-admin/admin/src/containers/App/constants.js index 80c3ddfd2f..10ce89cdb0 100644 --- a/packages/strapi-admin/admin/src/containers/App/constants.js +++ b/packages/strapi-admin/admin/src/containers/App/constants.js @@ -5,6 +5,7 @@ */ export const FREEZE_APP = 'app/App/FREEZE_APP'; +export const GET_APP_PLUGINS_SUCCEEDED = 'app/App/GET_APP_PLUGINS_SUCCEEDED'; export const LOAD_PLUGIN = 'app/App/LOAD_PLUGIN'; export const PLUGIN_LOADED = 'app/App/PLUGIN_LOADED'; export const PLUGIN_DELETED = 'app/App/PLUGIN_DELETED'; diff --git a/packages/strapi-admin/admin/src/containers/App/reducer.js b/packages/strapi-admin/admin/src/containers/App/reducer.js index 43358c898f..f15f7612eb 100644 --- a/packages/strapi-admin/admin/src/containers/App/reducer.js +++ b/packages/strapi-admin/admin/src/containers/App/reducer.js @@ -4,10 +4,11 @@ import { ENABLE_GLOBAL_OVERLAY_BLOCKER, } from 'constants/overlayBlocker'; -import { fromJS } from 'immutable'; +import { fromJS, List } from 'immutable'; import { FREEZE_APP, + GET_APP_PLUGINS_SUCCEEDED, PLUGIN_DELETED, PLUGIN_LOADED, UNFREEZE_APP, @@ -16,8 +17,10 @@ import { } from './constants'; const initialState = fromJS({ + appPlugins: List([]), blockApp: false, hasUserPlugin: true, + isAppLoading: true, plugins: {}, showGlobalAppBlocker: true, }); @@ -30,6 +33,10 @@ function appReducer(state = initialState, action) { return state.set('showGlobalAppBlocker', true); case FREEZE_APP: return state.set('blockApp', true); + case GET_APP_PLUGINS_SUCCEEDED: + return state + .update('appPlugins', () => List(action.appPlugins)) + .update('isAppLoading', () => false); case PLUGIN_LOADED: return state.setIn(['plugins', action.plugin.id], fromJS(action.plugin)); case UPDATE_PLUGIN: diff --git a/packages/strapi-admin/admin/src/containers/App/selectors.js b/packages/strapi-admin/admin/src/containers/App/selectors.js index db4e8913e4..87270d44ea 100644 --- a/packages/strapi-admin/admin/src/containers/App/selectors.js +++ b/packages/strapi-admin/admin/src/containers/App/selectors.js @@ -29,10 +29,22 @@ const makeSelectBlockApp = () => createSelector( (appState) => appState.get('blockApp'), ); +const makeSelectIsAppLoading = () => createSelector( + selectApp(), + appState => appState.get('isAppLoading'), +); + +const makeSelectAppPlugins = () => createSelector( + selectApp(), + appState => appState.get('appPlugins'), +); + export { selectApp, selectHasUserPlugin, selectPlugins, + makeSelectAppPlugins, makeSelectBlockApp, + makeSelectIsAppLoading, makeSelectShowGlobalAppBlocker, }; diff --git a/packages/strapi-admin/admin/src/strapi.js b/packages/strapi-admin/admin/src/strapi.js index 365f16e092..843ab7d672 100644 --- a/packages/strapi-admin/admin/src/strapi.js +++ b/packages/strapi-admin/admin/src/strapi.js @@ -9,6 +9,7 @@ import { unfreezeApp, updatePlugin, } from 'containers/App/actions'; +import { showNotification } from 'containers/NotificationProvider/actions'; import auth from 'utils/auth'; import { history, store } from './createStore'; import { translationMessages, languages } from './i18n'; From 01f88c43dca518f40f8d916fdc62149b55d0b864 Mon Sep 17 00:00:00 2001 From: cyril lopez Date: Tue, 25 Sep 2018 17:38:38 +0200 Subject: [PATCH 09/81] Change register condition --- packages/strapi-admin/admin/src/strapi.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/strapi-admin/admin/src/strapi.js b/packages/strapi-admin/admin/src/strapi.js index 843ab7d672..2910693a8f 100644 --- a/packages/strapi-admin/admin/src/strapi.js +++ b/packages/strapi-admin/admin/src/strapi.js @@ -15,7 +15,7 @@ import { history, store } from './createStore'; import { translationMessages, languages } from './i18n'; import './public-path'; -const isPluginAllowedToRegister = (plugin) => plugin.id === 'users-permissions' || plugin.id === 'email' || auth.getToken(); +const isPluginAllowedToRegister = (plugin) => plugin.id === 'users-permissions' || plugin.id === 'email' || auth.getToken() !== null; /** * Register a plugin * From c49cc5f97b6b3889411be2004149911c7e1015be Mon Sep 17 00:00:00 2001 From: cyril lopez Date: Wed, 26 Sep 2018 14:43:10 +0200 Subject: [PATCH 10/81] Check auth on aws --- .../admin/src/containers/AdminPage/index.js | 17 +++++++++++------ packages/strapi-admin/admin/src/strapi.js | 6 +++--- .../strapi-plugin-content-manager/package.json | 2 +- .../package.json | 2 +- packages/strapi-plugin-email/package.json | 2 +- .../strapi-plugin-settings-manager/package.json | 2 +- packages/strapi-plugin-upload/package.json | 2 +- .../package.json | 2 +- 8 files changed, 20 insertions(+), 15 deletions(-) diff --git a/packages/strapi-admin/admin/src/containers/AdminPage/index.js b/packages/strapi-admin/admin/src/containers/AdminPage/index.js index 1f78e78e77..7e0b3ca377 100644 --- a/packages/strapi-admin/admin/src/containers/AdminPage/index.js +++ b/packages/strapi-admin/admin/src/containers/AdminPage/index.js @@ -21,6 +21,7 @@ import { bindActionCreators, compose } from 'redux'; import { disableGlobalOverlayBlocker, enableGlobalOverlayBlocker } from 'actions/overlayBlocker'; import { pluginLoaded, updatePlugin } from 'containers/App/actions'; import { + makeSelectAppPlugins, makeSelectBlockApp, makeSelectIsAppLoading, makeSelectShowGlobalAppBlocker, @@ -146,6 +147,12 @@ export class AdminPage extends React.Component { } }; + hasUserPluginInstalled = () => { + const { appPlugins } = this.props; + + return appPlugins.indexOf('users-permissions') !== -1; + } + hasUserPluginLoaded = props => typeof get(props.plugins.toJS(), ['users-permissions', 'hasAdminUser']) !== 'undefined'; @@ -156,16 +163,12 @@ export class AdminPage extends React.Component { shouldDisplayLogout = () => auth.getToken() && this.props.hasUserPlugin && this.isUrlProtected(this.props); - shouldCheckTokenValidity = () => { - return this.hasUserPlugin() && auth.getToken() !== null; - } - showLeftMenu = () => !includes(this.props.location.pathname, 'users-permissions/auth/'); showLoading = () => { const { isAppLoading, adminPage: { isLoading } } = this.props; - return isAppLoading || isLoading; + return isAppLoading || isLoading || (this.hasUserPluginInstalled() && !this.hasUserPluginLoaded(this.props)); } retrievePlugins = () => { @@ -189,6 +192,8 @@ export class AdminPage extends React.Component { const header = this.showLeftMenu() ?
: ''; const style = this.showLeftMenu() ? {} : { width: '100%' }; + console.log('new build'); + if (this.showLoading()) { return ; } @@ -259,7 +264,7 @@ AdminPage.propTypes = { const mapStateToProps = createStructuredSelector({ adminPage: selectAdminPage(), - // appPlugins: makeSelectAppPlugins(), + appPlugins: makeSelectAppPlugins(), blockApp: makeSelectBlockApp(), hasUserPlugin: selectHasUserPlugin(), isAppLoading: makeSelectIsAppLoading(), diff --git a/packages/strapi-admin/admin/src/strapi.js b/packages/strapi-admin/admin/src/strapi.js index 2910693a8f..29aa8c7fc4 100644 --- a/packages/strapi-admin/admin/src/strapi.js +++ b/packages/strapi-admin/admin/src/strapi.js @@ -10,12 +10,12 @@ import { updatePlugin, } from 'containers/App/actions'; import { showNotification } from 'containers/NotificationProvider/actions'; -import auth from 'utils/auth'; +// import auth from 'utils/auth'; import { history, store } from './createStore'; import { translationMessages, languages } from './i18n'; import './public-path'; -const isPluginAllowedToRegister = (plugin) => plugin.id === 'users-permissions' || plugin.id === 'email' || auth.getToken() !== null; +const isPluginAllowedToRegister = (plugin) => plugin.id === 'users-permissions' || plugin.id === 'email'; /** * Register a plugin * @@ -26,7 +26,7 @@ const registerPlugin = (plugin) => { merge(translationMessages, plugin.translationMessages); plugin.leftMenuSections = plugin.leftMenuSections || []; - const shouldAllowRegister = isPluginAllowedToRegister(plugin) !== null; + const shouldAllowRegister = isPluginAllowedToRegister(plugin); switch (true) { // Execute bootstrap function and check if plugin can be rendered diff --git a/packages/strapi-plugin-content-manager/package.json b/packages/strapi-plugin-content-manager/package.json index 0937a40e64..47aa89a1f8 100644 --- a/packages/strapi-plugin-content-manager/package.json +++ b/packages/strapi-plugin-content-manager/package.json @@ -52,4 +52,4 @@ "npm": ">= 5.0.0" }, "license": "MIT" -} +} \ No newline at end of file diff --git a/packages/strapi-plugin-content-type-builder/package.json b/packages/strapi-plugin-content-type-builder/package.json index ead681af93..8729f98025 100644 --- a/packages/strapi-plugin-content-type-builder/package.json +++ b/packages/strapi-plugin-content-type-builder/package.json @@ -51,4 +51,4 @@ "npm": ">= 5.0.0" }, "license": "MIT" -} +} \ No newline at end of file diff --git a/packages/strapi-plugin-email/package.json b/packages/strapi-plugin-email/package.json index e9b12d0228..188549644d 100644 --- a/packages/strapi-plugin-email/package.json +++ b/packages/strapi-plugin-email/package.json @@ -49,4 +49,4 @@ "npm": ">= 5.0.0" }, "license": "MIT" -} +} \ No newline at end of file diff --git a/packages/strapi-plugin-settings-manager/package.json b/packages/strapi-plugin-settings-manager/package.json index 3ce2b8a942..8ddb4ad3c4 100644 --- a/packages/strapi-plugin-settings-manager/package.json +++ b/packages/strapi-plugin-settings-manager/package.json @@ -48,4 +48,4 @@ "npm": ">= 5.0.0" }, "license": "MIT" -} +} \ No newline at end of file diff --git a/packages/strapi-plugin-upload/package.json b/packages/strapi-plugin-upload/package.json index 5dd3c04aad..441465812a 100644 --- a/packages/strapi-plugin-upload/package.json +++ b/packages/strapi-plugin-upload/package.json @@ -47,4 +47,4 @@ "npm": ">= 3.0.0" }, "license": "MIT" -} +} \ No newline at end of file diff --git a/packages/strapi-plugin-users-permissions/package.json b/packages/strapi-plugin-users-permissions/package.json index e7dc948e2a..95ed4e2dae 100644 --- a/packages/strapi-plugin-users-permissions/package.json +++ b/packages/strapi-plugin-users-permissions/package.json @@ -55,4 +55,4 @@ "npm": ">= 5.0.0" }, "license": "MIT" -} +} \ No newline at end of file From 77d9677c03169e3bf51113c3900b764a01ea30b4 Mon Sep 17 00:00:00 2001 From: cyril lopez Date: Wed, 26 Sep 2018 15:07:53 +0200 Subject: [PATCH 11/81] Fix proptypes --- packages/strapi-admin/admin/src/app.js | 1 + .../strapi-admin/admin/src/containers/AdminPage/index.js | 7 ++++--- .../strapi-admin/admin/src/containers/App/selectors.js | 2 +- packages/strapi-admin/package.json | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/strapi-admin/admin/src/app.js b/packages/strapi-admin/admin/src/app.js index 7a53201557..daf4949bbd 100644 --- a/packages/strapi-admin/admin/src/app.js +++ b/packages/strapi-admin/admin/src/app.js @@ -20,6 +20,7 @@ import './public-path'; import './strapi'; const dispatch = store.dispatch; +// console.log(process.env); // Don't inject plugins in development mode. if (window.location.port !== '4000') { diff --git a/packages/strapi-admin/admin/src/containers/AdminPage/index.js b/packages/strapi-admin/admin/src/containers/AdminPage/index.js index 7e0b3ca377..f556ed6cc2 100644 --- a/packages/strapi-admin/admin/src/containers/AdminPage/index.js +++ b/packages/strapi-admin/admin/src/containers/AdminPage/index.js @@ -192,8 +192,6 @@ export class AdminPage extends React.Component { const header = this.showLeftMenu() ?
: ''; const style = this.showLeftMenu() ? {} : { width: '100%' }; - console.log('new build'); - if (this.showLoading()) { return ; } @@ -245,16 +243,20 @@ AdminPage.contextTypes = { AdminPage.defaultProps = { adminPage: {}, + appPlugins: [], hasUserPlugin: true, + isAppLoading: true, }; AdminPage.propTypes = { adminPage: PropTypes.object, + appPlugins: PropTypes.array, blockApp: PropTypes.bool.isRequired, disableGlobalOverlayBlocker: PropTypes.func.isRequired, enableGlobalOverlayBlocker: PropTypes.func.isRequired, hasUserPlugin: PropTypes.bool, history: PropTypes.object.isRequired, + isAppLoading: PropTypes.bool, location: PropTypes.object.isRequired, pluginLoaded: PropTypes.func.isRequired, plugins: PropTypes.object.isRequired, @@ -291,4 +293,3 @@ const withSaga = injectSaga({ key: 'adminPage', saga }); export default compose(withReducer, withSaga, withConnect)(AdminPage); -// export default connect(mapStateToProps, mapDispatchToProps)(AdminPage); diff --git a/packages/strapi-admin/admin/src/containers/App/selectors.js b/packages/strapi-admin/admin/src/containers/App/selectors.js index 87270d44ea..23f8460b9f 100644 --- a/packages/strapi-admin/admin/src/containers/App/selectors.js +++ b/packages/strapi-admin/admin/src/containers/App/selectors.js @@ -36,7 +36,7 @@ const makeSelectIsAppLoading = () => createSelector( const makeSelectAppPlugins = () => createSelector( selectApp(), - appState => appState.get('appPlugins'), + appState => appState.get('appPlugins').toJS(), ); export { diff --git a/packages/strapi-admin/package.json b/packages/strapi-admin/package.json index 783bb85517..ea981d3377 100644 --- a/packages/strapi-admin/package.json +++ b/packages/strapi-admin/package.json @@ -51,4 +51,4 @@ "npm": ">= 5.0.0" }, "license": "MIT" -} +} \ No newline at end of file From 070f398044319bf7f6f797307fa95ea00ac6f786 Mon Sep 17 00:00:00 2001 From: Jim LAURIE Date: Wed, 26 Sep 2018 15:15:48 +0200 Subject: [PATCH 12/81] Reorder translation keys --- .../admin/src/translations/ar.json | 166 +-- .../admin/src/translations/de.json | 304 ++-- .../admin/src/translations/en.json | 197 ++- .../admin/src/translations/es.json | 196 ++- .../admin/src/translations/fr.json | 187 ++- .../admin/src/translations/it.json | 166 +-- .../admin/src/translations/ko.json | 196 ++- .../admin/src/translations/nl.json | 196 ++- .../admin/src/translations/pl.json | 189 ++- .../admin/src/translations/pt-BR.json | 196 ++- .../admin/src/translations/pt.json | 299 ++-- .../admin/src/translations/ru.json | 303 ++-- .../admin/src/translations/tr.json | 196 ++- .../admin/src/translations/zh-Hans.json | 192 ++- .../admin/src/translations/zh.json | 160 +- .../admin/src/translations/ar.json | 166 +-- .../admin/src/translations/de.json | 164 +-- .../admin/src/translations/en.json | 188 ++- .../admin/src/translations/es.json | 158 +- .../admin/src/translations/fr.json | 181 +-- .../admin/src/translations/it.json | 206 ++- .../admin/src/translations/ko.json | 158 +- .../admin/src/translations/nl.json | 158 +- .../admin/src/translations/pl.json | 118 +- .../admin/src/translations/pt-BR.json | 162 +-- .../admin/src/translations/pt.json | 173 +-- .../admin/src/translations/ru.json | 209 ++- .../admin/src/translations/tr.json | 160 +- .../admin/src/translations/zh-Hans.json | 76 +- .../admin/src/translations/zh.json | 77 +- .../admin/src/translations/ar.json | 202 +-- .../admin/src/translations/de.json | 224 ++- .../admin/src/translations/en.json | 228 ++- .../admin/src/translations/es.json | 228 ++- .../admin/src/translations/fr.json | 232 ++- .../admin/src/translations/it.json | 310 ++-- .../admin/src/translations/ko.json | 215 ++- .../admin/src/translations/nl.json | 228 ++- .../admin/src/translations/pl.json | 226 ++- .../admin/src/translations/pt-BR.json | 220 ++- .../admin/src/translations/pt.json | 341 ++--- .../admin/src/translations/ru.json | 228 ++- .../admin/src/translations/tr.json | 229 ++- .../admin/src/translations/zh-Hans.json | 222 ++- .../admin/src/translations/zh.json | 210 ++- .../admin/src/translations/ar.json | 6 +- .../admin/src/translations/de.json | 13 +- .../admin/src/translations/en.json | 13 +- .../admin/src/translations/es.json | 13 +- .../admin/src/translations/fr.json | 13 +- .../admin/src/translations/it.json | 15 +- .../admin/src/translations/ko.json | 13 +- .../admin/src/translations/nl.json | 13 +- .../admin/src/translations/pl.json | 6 +- .../admin/src/translations/pt-BR.json | 11 +- .../admin/src/translations/pt.json | 24 +- .../admin/src/translations/ru.json | 21 +- .../admin/src/translations/tr.json | 13 +- .../admin/src/translations/zh-Hans.json | 6 +- .../admin/src/translations/zh.json | 6 +- .../admin/src/translations/ar.json | 233 ++- .../admin/src/translations/de.json | 232 ++- .../admin/src/translations/en.json | 235 ++- .../admin/src/translations/es.json | 232 ++- .../admin/src/translations/fr.json | 237 ++- .../admin/src/translations/it.json | 268 ++-- .../admin/src/translations/ko.json | 232 ++- .../admin/src/translations/nl.json | 232 ++- .../admin/src/translations/pl.json | 232 ++- .../admin/src/translations/pt-BR.json | 232 ++- .../admin/src/translations/pt.json | 1284 ++++++++--------- .../admin/src/translations/ru.json | 232 ++- .../admin/src/translations/tr.json | 232 ++- .../admin/src/translations/zh-Hans.json | 230 ++- .../admin/src/translations/zh.json | 227 ++- .../admin/src/translations/ar.json | 26 +- .../admin/src/translations/de.json | 31 +- .../admin/src/translations/en.json | 26 +- .../admin/src/translations/es.json | 26 +- .../admin/src/translations/fr.json | 26 +- .../admin/src/translations/it.json | 52 +- .../admin/src/translations/ko.json | 26 +- .../admin/src/translations/nl.json | 26 +- .../admin/src/translations/pl.json | 26 +- .../admin/src/translations/pt-BR.json | 24 +- .../admin/src/translations/pt.json | 63 +- .../admin/src/translations/ru.json | 63 +- .../admin/src/translations/tr.json | 26 +- .../admin/src/translations/zh-Hans.json | 26 +- .../admin/src/translations/zh.json | 20 +- .../admin/src/translations/ar.json | 199 ++- .../admin/src/translations/de.json | 199 ++- .../admin/src/translations/en.json | 213 ++- .../admin/src/translations/es.json | 197 ++- .../admin/src/translations/fr.json | 199 ++- .../admin/src/translations/it.json | 166 +-- .../admin/src/translations/ko.json | 197 ++- .../admin/src/translations/nl.json | 197 ++- .../admin/src/translations/pl.json | 195 ++- .../admin/src/translations/pt-BR.json | 195 ++- .../admin/src/translations/ru.json | 319 ++-- .../admin/src/translations/tr.json | 197 ++- .../admin/src/translations/zh-Hans.json | 199 ++- .../admin/src/translations/zh.json | 219 ++- 104 files changed, 7664 insertions(+), 9510 deletions(-) diff --git a/packages/strapi-admin/admin/src/translations/ar.json b/packages/strapi-admin/admin/src/translations/ar.json index 49f84146af..6202ac2ee8 100644 --- a/packages/strapi-admin/admin/src/translations/ar.json +++ b/packages/strapi-admin/admin/src/translations/ar.json @@ -1,53 +1,69 @@ { - "app.components.Button.save": "حفظ", + "Analytics": "إحصائيات", + "Content Manager": "مدير محتوى", + "Content Type Builder": "منشئ نوع المحتوى", + "Email": "البريد الإلكتروني", + "Files Upload": "رفع الملفات", + "HomePage.notification.newsLetter.success": "لقد اشتركت بنجاح في النشرة الإخبارية", + "New entry": "إدخال جديد", + "Password": "كلمة السر", + "Provider": "مزود", + "ResetPasswordToken": "إعادة تعيين كلمة المرور", + "Role": "قاعدة", + "Roles & Permissions": "الأدوار والصلاحية", + "Settings Manager": "مدير الإعدادات", + "Username": "اسم المستخدم", + "Users": "المستخدمين", + "Users & Permissions": "المستخدمين والصلاحيات", + "app.components.BlockLink.code": "امثلة للشفرة", + "app.components.BlockLink.code.content": "تعلم من خلال اختبار مشاريع حقيقية طورت من المجتمع.", + "app.components.BlockLink.documentation": "قراءة المستندات", + "app.components.BlockLink.documentation.content": "اكتشاف المفاهيم والأدلة المرجعية والبرامج التعليمية.", "app.components.Button.cancel": "الغاء", + "app.components.Button.save": "حفظ", "app.components.ComingSoonPage.comingSoon": "قادم قريبًا", "app.components.ComingSoonPage.featuresNotAvailable": "هذه الميزة تحت التطوير.", "app.components.DownloadInfo.download": "التنزيل قيد التقدم...", "app.components.DownloadInfo.text": "قد يستغرق هذا دقيقة. شكرا لصبرك.", "app.components.EmptyAttributes.title": "لا يوجد اي حقول بعد", - "app.components.HomePage.welcome": "مرحبًا في لوحتك!", - "app.components.HomePage.welcome.again": "مرحبًا ", - "app.components.HomePage.cta": "تأكيد", + "app.components.HomePage.button.blog": "اظهار المزيد على المدونة", + "app.components.HomePage.button.quickStart": "بداء الشرح السريع", "app.components.HomePage.community": "البحث عن المجتمع في الويب", - "app.components.HomePage.newsLetter": "اشترك في النشرة الإخبارية للحصول على اخر الاخبار حول Strapi", "app.components.HomePage.community.content": "ناقش مع أعضاء الفريق والمساهمين والمطورين على قنوات مختلفة.", "app.components.HomePage.create": "انشاء اول نوع محتوى لك", + "app.components.HomePage.createBlock.content.first": "الـ ", + "app.components.HomePage.createBlock.content.second": " سيساعدك المكون الإضافي في تحديد بنية البيانات لطرازاتك. إذا كنت جديدًا هنا ، فننصحك بشدة باتباع نهجنا ", + "app.components.HomePage.createBlock.content.tutorial": " شرح.", + "app.components.HomePage.cta": "تأكيد", + "app.components.HomePage.newsLetter": "اشترك في النشرة الإخبارية للحصول على اخر الاخبار حول Strapi", + "app.components.HomePage.support": "ادعمنا", + "app.components.HomePage.support.content": "عن طريق شراء تي شيرت، وسوف تتيح لنا مواصلة عملنا في هذا المشروع لتعطيك أفضل تجربة ممكنة!", + "app.components.HomePage.support.link": "احصل على التي شيرت الخاص بك الان", + "app.components.HomePage.welcome": "مرحبًا في لوحتك!", + "app.components.HomePage.welcome.again": "مرحبًا ", "app.components.HomePage.welcomeBlock.content": "نحن سعداء بوجودك كأحد أفراد المجتمع. نحن نبحث باستمرار عن ردود الفعل لا تتردد في مراسلتنا على الخاص ", "app.components.HomePage.welcomeBlock.content.again": "نأمل أن تحقق تقدمًا في مشروعك ... لا تتردد في قراءة عن اخر إصدار جديد من Strapi. نحن نبذل قصارى جهدنا لتحسين المنتج بناء على ملاحظاتك.", "app.components.HomePage.welcomeBlock.content.issues": "issues.", "app.components.HomePage.welcomeBlock.content.raise": " أو رفع ", - "app.components.HomePage.createBlock.content.first": "الـ ", - "app.components.HomePage.createBlock.content.second": " سيساعدك المكون الإضافي في تحديد بنية البيانات لطرازاتك. إذا كنت جديدًا هنا ، فننصحك بشدة باتباع نهجنا ", - "app.components.HomePage.createBlock.content.tutorial": " شرح.", - "app.components.HomePage.button.quickStart": "بداء الشرح السريع", - "app.components.HomePage.button.blog": "اظهار المزيد على المدونة", - "app.components.HomePage.support": "ادعمنا", - "app.components.HomePage.support.content": "عن طريق شراء تي شيرت، وسوف تتيح لنا مواصلة عملنا في هذا المشروع لتعطيك أفضل تجربة ممكنة!", - "app.components.HomePage.support.link": "احصل على التي شيرت الخاص بك الان", - "app.components.BlockLink.documentation": "قراءة المستندات", - "app.components.BlockLink.documentation.content": "اكتشاف المفاهيم والأدلة المرجعية والبرامج التعليمية.", - "app.components.BlockLink.code": "امثلة للشفرة", - "app.components.BlockLink.code.content": "تعلم من خلال اختبار مشاريع حقيقية طورت من المجتمع.", - "app.components.InputFile.newFile": "إضافة ملف جديد", - "app.components.InputFileDetails.open": "فتح في نافذة جديدة", - "app.components.InputFileDetails.remove": "حذف هذا الملف", - "app.components.InputFileDetails.originalName": "الاسم الاصلي:", - "app.components.InputFileDetails.size": "الحجم:", "app.components.ImgPreview.hint": "اسحب الملف واسقطة في هذه المساحة او في {browse} لرفعة", "app.components.ImgPreview.hint.browse": "المتصفح", - "app.components.InstallPluginPage.helmet": "السوق - الإضافات", - "app.components.InstallPluginPage.title": "السوق - الإضافات", - "app.components.InstallPluginPage.description": "قم بتوسيع التطبيق الخاص بك دون عناء.", - "app.components.InstallPluginPage.plugin.support-us.description": "ادعمنا عن طريق شراء تي شيرت، وسوف تتيح لنا مواصلة عملنا في هذا المشروع لتعطيك أفضل تجربة ممكنة!", + "app.components.InputFile.newFile": "إضافة ملف جديد", + "app.components.InputFileDetails.open": "فتح في نافذة جديدة", + "app.components.InputFileDetails.originalName": "الاسم الاصلي:", + "app.components.InputFileDetails.remove": "حذف هذا الملف", + "app.components.InputFileDetails.size": "الحجم:", "app.components.InstallPluginPage.InputSearch.label": " ", "app.components.InstallPluginPage.InputSearch.placeholder": "ابحث عن إضافة... (مثل: authentication)", + "app.components.InstallPluginPage.description": "قم بتوسيع التطبيق الخاص بك دون عناء.", + "app.components.InstallPluginPage.helmet": "السوق - الإضافات", + "app.components.InstallPluginPage.plugin.support-us.description": "ادعمنا عن طريق شراء تي شيرت، وسوف تتيح لنا مواصلة عملنا في هذا المشروع لتعطيك أفضل تجربة ممكنة!", + "app.components.InstallPluginPage.title": "السوق - الإضافات", "app.components.InstallPluginPopup.downloads": "تنزيل", - "app.components.InstallPluginPopup.navLink.description": "الوصف", - "app.components.InstallPluginPopup.navLink.screenshots": "لقطات الشاشة", "app.components.InstallPluginPopup.navLink.avis": "avis", - "app.components.InstallPluginPopup.navLink.faq": "الاسئلة الاكثر شيوعًا", "app.components.InstallPluginPopup.navLink.changelog": "التغييرات", + "app.components.InstallPluginPopup.navLink.description": "الوصف", + "app.components.InstallPluginPopup.navLink.faq": "الاسئلة الاكثر شيوعًا", + "app.components.InstallPluginPopup.navLink.screenshots": "لقطات الشاشة", "app.components.InstallPluginPopup.noDescription": "لا يوجد وصف متوفر", "app.components.LeftMenuFooter.poweredBy": "مندعوم من ", "app.components.LeftMenuLinkContainer.configuration": "التهيئة", @@ -56,86 +72,70 @@ "app.components.LeftMenuLinkContainer.listPlugins": "الإضافات", "app.components.LeftMenuLinkContainer.noPluginsInstalled": "لا توجد إضافات مثبته بعد", "app.components.LeftMenuLinkContainer.plugins": "إضافات", + "app.components.ListPluginsPage.description": "قائمة الإضافيات المثبتة في المشروع.", "app.components.ListPluginsPage.helmet.title": "قائمة الإضافات", "app.components.ListPluginsPage.title": "الإضافات", - "app.components.ListPluginsPage.description": "قائمة الإضافيات المثبتة في المشروع.", - "app.components.listPluginsPage.deletePlugin.error": "حدث خطأ أثناء إلغاء تثبيت الإضافة", - "app.components.listPlugins.title.singular": "{number} إضافة مثبته", - "app.components.listPlugins.title.plural": "{number} إضافات مثبته", - "app.components.listPlugins.title.none": "لا يوجد اي إضافات مثبته", - "app.components.listPlugins.button": "إضافة إضافة جديدة", - "app.components.NotFoundPage.description": "لا يوجد", "app.components.NotFoundPage.back": "العودة للرئيسية", + "app.components.NotFoundPage.description": "لا يوجد", "app.components.Official": "الرسمية", - "app.components.PluginCard.compatible": "متوافق مع تطبيقك", - "app.components.PluginCard.compatibleCommunity": "متوافق مع المجتمع", "app.components.PluginCard.Button.label.download": "تنزيل", "app.components.PluginCard.Button.label.install": "مثبت", "app.components.PluginCard.Button.label.support": "ادعمنا", - "app.components.PluginCard.price.free": "مجانا", + "app.components.PluginCard.compatible": "متوافق مع تطبيقك", + "app.components.PluginCard.compatibleCommunity": "متوافق مع المجتمع", "app.components.PluginCard.more-details": "المزيد من التفاصيل", - "app.utils.placeholder.defaultMessage": " ", + "app.components.PluginCard.price.free": "مجانا", + "app.components.listPlugins.button": "إضافة إضافة جديدة", + "app.components.listPlugins.title.none": "لا يوجد اي إضافات مثبته", + "app.components.listPlugins.title.plural": "{number} إضافات مثبته", + "app.components.listPlugins.title.singular": "{number} إضافة مثبته", + "app.components.listPluginsPage.deletePlugin.error": "حدث خطأ أثناء إلغاء تثبيت الإضافة", "app.utils.SelectOption.defaultMessage": " ", "app.utils.defaultMessage": " ", - "components.AutoReloadBlocker.header": "مطلوب ميزة إعادة التحميل لهذه الإضافة.", + "app.utils.placeholder.defaultMessage": " ", "components.AutoReloadBlocker.description": "افتح الملف التالي وقم بتمكين الميزة.", + "components.AutoReloadBlocker.header": "مطلوب ميزة إعادة التحميل لهذه الإضافة.", "components.ErrorBoundary.title": "هناك خطأ ما...", - "components.OverlayBlocker.title": "في انتظار إعادة التشغيل...", - "components.OverlayBlocker.description": "أنت تستخدم ميزة تحتاج إلى إعادة تشغيل الخادم. يرجى الانتظار حتى يعود الخادم.", - "components.PageFooter.select": "إدخالات لكل صفحة", - "components.ProductionBlocker.header": "هذه الإضافة متاحة فقط في التطوير.", - "components.ProductionBlocker.description": "لأغراض السلامة ، يتعين علينا تعطيل هذه الإضافة في بيئات أخرى.", - "components.popUpWarning.button.cancel": "الغاء", - "components.popUpWarning.button.confirm": "تأكيد", - "components.popUpWarning.title": "ارجو التأكيد", - "components.popUpWarning.message": "هل انت متاكد من حذف هذا؟", - "components.Input.error.validation.email": "هذا ليس بريد الإكتروني", - "components.Input.error.validation.required": "هذه القيمة مطلوبة.", - "components.Input.error.validation.regex": "هذه القمية لا تطابق regex.", - "components.Input.error.validation.max": "هذه القيمة عالية جدًا.", - "components.Input.error.validation.min": "هذه القيمة قليلة جدًا.", - "components.Input.error.validation.maxLength": "هذه القيمة طويلة جدًا.", - "components.Input.error.validation.minLength": "هذه القيمة قصيرة جدًا.", - "components.Input.error.contentTypeName.taken": "هذه الاسم مستخدم مسبقًا", - "components.Input.error.attribute.taken": "اسم الحقل هذا مستخدم مسبقًا", "components.Input.error.attribute.key.taken": "هذه القيمة موجودة مسبقًا", "components.Input.error.attribute.sameKeyAndName": "لا تتطابق", - "components.Input.error.validation.minSupMax": "لا يمكن أن تكون متفوقة", + "components.Input.error.attribute.taken": "اسم الحقل هذا مستخدم مسبقًا", + "components.Input.error.contentTypeName.taken": "هذه الاسم مستخدم مسبقًا", "components.Input.error.custom-error": "{errorMessage} ", + "components.Input.error.validation.email": "هذا ليس بريد الإكتروني", "components.Input.error.validation.json": "لا يتطابق مع صيغة JSON", + "components.Input.error.validation.max": "هذه القيمة عالية جدًا.", + "components.Input.error.validation.maxLength": "هذه القيمة طويلة جدًا.", + "components.Input.error.validation.min": "هذه القيمة قليلة جدًا.", + "components.Input.error.validation.minLength": "هذه القيمة قصيرة جدًا.", + "components.Input.error.validation.minSupMax": "لا يمكن أن تكون متفوقة", + "components.Input.error.validation.regex": "هذه القمية لا تطابق regex.", + "components.Input.error.validation.required": "هذه القيمة مطلوبة.", "components.ListRow.empty": "لا توجد بيانات ليتم عرضها.", + "components.OverlayBlocker.description": "أنت تستخدم ميزة تحتاج إلى إعادة تشغيل الخادم. يرجى الانتظار حتى يعود الخادم.", + "components.OverlayBlocker.title": "في انتظار إعادة التشغيل...", + "components.PageFooter.select": "إدخالات لكل صفحة", + "components.ProductionBlocker.description": "لأغراض السلامة ، يتعين علينا تعطيل هذه الإضافة في بيئات أخرى.", + "components.ProductionBlocker.header": "هذه الإضافة متاحة فقط في التطوير.", + "components.Wysiwyg.ToggleMode.markdown": "التبديل الى markdown", + "components.Wysiwyg.ToggleMode.preview": "التبديل الى المعاينة", "components.Wysiwyg.collapse": "تقليص", - "components.Wysiwyg.selectOptions.title": "إضافة عنوان", "components.Wysiwyg.selectOptions.H1": "العنوان H1", "components.Wysiwyg.selectOptions.H2": "العنوان H2", "components.Wysiwyg.selectOptions.H3": "العنوان H3", "components.Wysiwyg.selectOptions.H4": "العنوان H4", "components.Wysiwyg.selectOptions.H5": "العنوان H5", "components.Wysiwyg.selectOptions.H6": "العنوان H6", - "components.Wysiwyg.ToggleMode.markdown": "التبديل الى markdown", - "components.Wysiwyg.ToggleMode.preview": "التبديل الى المعاينة", + "components.Wysiwyg.selectOptions.title": "إضافة عنوان", "components.WysiwygBottomControls.charactersIndicators": "الأحرف", + "components.WysiwygBottomControls.fullscreen": "توسيع", "components.WysiwygBottomControls.uploadFiles": "اسحب الملفات وأفلتها ، والصقها من الحافظة أو {browse}.", "components.WysiwygBottomControls.uploadFiles.browse": "حددهم", - "components.WysiwygBottomControls.fullscreen": "توسيع", - "HomePage.notification.newsLetter.success": "لقد اشتركت بنجاح في النشرة الإخبارية", + "components.popUpWarning.button.cancel": "الغاء", + "components.popUpWarning.button.confirm": "تأكيد", + "components.popUpWarning.message": "هل انت متاكد من حذف هذا؟", + "components.popUpWarning.title": "ارجو التأكيد", "notification.error": "حدث خطأ", "notification.error.layout": "تعذّر استرداد التنسيق", - "Users & Permissions": "المستخدمين والصلاحيات", - "Content Manager": "مدير محتوى", - "Content Type Builder": "منشئ نوع المحتوى", - "Files Upload": "رفع الملفات", - "Roles & Permissions": "الأدوار والصلاحية", - "Settings Manager": "مدير الإعدادات", - "Email": "البريد الإلكتروني", - "Password": "كلمة السر", - "Username": "اسم المستخدم", - "Provider": "مزود", - "ResetPasswordToken": "إعادة تعيين كلمة المرور", - "Role": "قاعدة", - "New entry": "إدخال جديد", - "request.error.model.unknown": "هذا النموذج غير موجود", - "Users": "المستخدمين", - "Analytics": "إحصائيات", - "request.error.model.unknow": "هذا النموذج غير موجود" -} + "request.error.model.unknow": "هذا النموذج غير موجود", + "request.error.model.unknown": "هذا النموذج غير موجود" +} \ No newline at end of file diff --git a/packages/strapi-admin/admin/src/translations/de.json b/packages/strapi-admin/admin/src/translations/de.json index e302899aba..f80d7221e4 100644 --- a/packages/strapi-admin/admin/src/translations/de.json +++ b/packages/strapi-admin/admin/src/translations/de.json @@ -1,166 +1,140 @@ { - "app.components.Button.save": "Speichern", - "app.components.Button.cancel": "Abbrechen", - - "app.components.BlockLink.documentation": "Lese die Dokumentation", - "app.components.BlockLink.documentation.content": "Entdecke die Konzepte, Referenzanleitungen und Tutorials.", - "app.components.BlockLink.code": "Code Beispiele", - "app.components.BlockLink.code.content": "Lerne durch das Testen realer Projekte, die die Community entwickelt haben.", - - "app.components.ComingSoonPage.comingSoon": "Bald verfügbar", - "app.components.ComingSoonPage.featuresNotAvailable": "Dieses Feature ist derzeit noch in aktiver Entwicklung.", - - "app.components.DownloadInfo.download": "Download wird ausgeführt...", - "app.components.DownloadInfo.text": "Dies könnte kurz dauern. Danke für deine Geduld.", - - "app.components.HomePage.welcome": "Willkommen an Bord!", - "app.components.HomePage.welcome.again": "Willkommen", - "app.components.HomePage.create": "Erstelle deinen ersten Inhaltstyp", - "app.components.HomePage.welcomeBlock.content": "Wir freuen uns, dich als Mitglied der Community zu haben. Wir sind offen für Feedback, senden uns einfach eine direkt Nachricht in\u0020", - "app.components.HomePage.welcomeBlock.content.issues": "Ticket.", - "app.components.HomePage.welcomeBlock.content.raise": "\u0020oder eröffne\u0020", - "app.components.HomePage.createBlock.content.first": "Das\u0020", - "app.components.HomePage.createBlock.content.second": "\u0020Plugin wird dir helfen, die Datenstruktur deiner Modelle zu definieren. Wenn du neu hier bist, empfehlen wir dir unser\u0020", - "app.components.HomePage.createBlock.content.tutorial": "\u0020Tutorial.", - "app.components.HomePage.welcomeBlock.content.again": "Wir hoffen, dass du Fortschritte bei deinem Projekt machst.... Lese das Neueste über Strapi. Wir geben unser Bestes, um das Produkt auf der Grundlage deines Feedbacks zu verbessern.", - "app.components.HomePage.cta": "BESTÄTIGEN", - "app.components.HomePage.community": "Finde die Community im Web", - "app.components.HomePage.community.content": "Diskutiere mit Teammitgliedern, Mitwirkenden und Entwicklern auf verschiedenen Kanälen.", - "app.components.HomePage.newsLetter": "Abonniere den Newsletter, um sich über Strapi zu informieren.", - "app.components.HomePage.button.quickStart" : "STARTE DAS QUICK-START-TUTORIAL", - "app.components.HomePage.button.blog": "MEHR DAZU IM BLOG", - "app.components.HomePage.support": "UNTERSTÜTZE UNS", - "app.components.HomePage.support.content": "Durch den Kauf des T-Shirts können wir unsere Arbeit am Projekt fortsetzen, um Ihnen das bestmögliche Erlebnis zu bieten!", - "app.components.HomePage.support.link": "HOLE DIR JETZT DEIN T-SHIRT", - - "app.components.InputFile.newFile": "Neue Datei hinzufügen", - "app.components.InputFileDetails.open": "In einem neuen Tab öffnen", - "app.components.InputFileDetails.remove": "Entferne diese Datei", - "app.components.InputFileDetails.originalName": "Original Name:", - "app.components.InputFileDetails.size": "Größe:", - - "app.components.ImgPreview.hint": "Ziehe eine Datei hierher oder {browse} eine Datei zum hochladen aus", - "app.components.ImgPreview.hint.browse": "wähle", - - "app.components.InstallPluginPage.helmet": "Marktplatz - Plugins", - "app.components.InstallPluginPage.title": "Marktplatz - Plugins", - "app.components.InstallPluginPage.description": "Erweitere problemlos deine App.", - "app.components.InstallPluginPage.plugin.support-us.description": "Unterstütze uns durch den Kauf eines Strapi T-Shirts. Das erlaubt uns, weiter an dem Projekt arbeiten zu können und es so gut wie nur möglich zu gestalten!", - "app.components.InstallPluginPage.InputSearch.label": " ", - "app.components.InstallPluginPage.InputSearch.placeholder": "Suche nach einem Plugin... (z.B.: Authentifizierung)", - "app.components.InstallPluginPopup.downloads": "herunterladen", - "app.components.InstallPluginPopup.navLink.description": "Beschreibung", - "app.components.InstallPluginPopup.navLink.screenshots": "Screenshots", - "app.components.InstallPluginPopup.navLink.avis": "avis", - "app.components.InstallPluginPopup.navLink.faq": "faq", - "app.components.InstallPluginPopup.navLink.changelog": "Änderungsprotokoll", - "app.components.InstallPluginPopup.noDescription": "Keine Beschreibung verfügbar", - - "app.components.LeftMenuFooter.poweredBy": "Stolz präsentiert von ", - "app.components.LeftMenuLinkContainer.configuration": "Konfiguration", - "app.components.LeftMenuLinkContainer.general": "Allgemein", - "app.components.LeftMenuLinkContainer.installNewPlugin": "Marktplatz", - "app.components.LeftMenuLinkContainer.listPlugins": "Plugins", - "app.components.LeftMenuLinkContainer.noPluginsInstalled": "Bisher sind keine Plugins installiert", - "app.components.LeftMenuLinkContainer.plugins": "Plugins", - - "app.components.ListPluginsPage.helmet.title": "Plugins anzeigen", - "app.components.ListPluginsPage.title": "Plugins", - "app.components.ListPluginsPage.description": "Liste aller im Projekt installierten Plugins.", - "app.components.listPluginsPage.deletePlugin.error": "Bei der Entfernung des Plugins ist ein Fehler aufgetreten", - "app.components.listPlugins.title.singular": "{number} Plugin ist installiert", - "app.components.listPlugins.title.plural": "{number} Plugins sind installiert", - "app.components.listPlugins.title.none": "Es ist kein Plugin installiert", - "app.components.listPlugins.button": "Neues Plugin hinzufügen", - - "app.components.NotFoundPage.description": "Nicht gefunden", - "app.components.NotFoundPage.back": "Zurück zur Homepage", - - "app.components.Official": "Offiziell", - - "app.components.PluginCard.compatible": "Mit der App kompatibel", - "app.components.PluginCard.compatibleCommunity": "Mit der Community kompatibel", - "app.components.PluginCard.Button.label.download": "Download", - "app.components.PluginCard.Button.label.install": "Bereits installiert", - "app.components.PluginCard.Button.label.support": "Unterstütze uns", - "app.components.PluginCard.price.free": "Umsonst", - "app.components.PluginCard.more-details": "Mehr Details", - - "app.utils.placeholder.defaultMessage": "\u0020", - "app.utils.SelectOption.defaultMessage": "\u0020", - "app.utils.defaultMessage": "", - - - "components.AutoReloadBlocker.header": "Dieses Plugin benötigt das Neuladen-Feature.", - "components.AutoReloadBlocker.description": "Öffne die folgende Datei und aktiviere das Feature.", - - "components.ErrorBoundary.title": "Etwas ist falsch gelaufen...", - - "components.OverlayBlocker.title": "Auf Neustart warten...", - "components.OverlayBlocker.description": "Du verwendest ein Feature, das einen Neustart des Servers erfordert. Bitte warte, bis der Server wieder gestartet wurde.", - - "components.PageFooter.select": "Einträge pro Seite", - - "components.ProductionBlocker.header": "Dieses Plugin ist nur in der Entwicklungsumgebung verfügbar.", - "components.ProductionBlocker.description": "Aus Sicherheitsgründen müssen wir dieses Plugin in anderen Umgebungen deaktivieren.", - - "components.popUpWarning.button.cancel": "Abbrechen", - "components.popUpWarning.button.confirm": "Bestätigen", - "components.popUpWarning.title": "Bitte bestätigen", - "components.popUpWarning.message": "Bist du sicher, dass du dies löschen möchtest?", - - "components.Input.error.validation.email": "Das ist keine gültige E-Mail-Adresse", - "components.Input.error.validation.required": "Die Eingabe dieses Wertes ist erforderlich.", - "components.Input.error.validation.regex": "Dieser Wert entspricht nicht dem RegEx.", - "components.Input.error.validation.max": "Dieser Wert ist zu hoch.", - "components.Input.error.validation.min": "Dieser Wert ist zu niedrig.", - "components.Input.error.validation.maxLength": "Dieser Wert ist zu lang.", - "components.Input.error.validation.minLength": "Dieser Wert ist zu kurz.", - "components.Input.error.validation.json": "Dies entspricht nicht dem JSON-Format.", - "components.Input.error.contentTypeName.taken": "Dieser Name existiert bereits", - "components.Input.error.attribute.taken": "Dieser Feldname ist bereits vergeben", - "components.Input.error.attribute.key.taken": "Dieser Wert existiert bereits", - "components.Input.error.attribute.sameKeyAndName": "Darf nicht gleich sein", - "components.Input.error.validation.minSupMax": "Darf nicht höher sein", - "components.Input.error.custom-error": "{errorMessage} ", - - "components.ListRow.empty": "Es gibt keine Daten.", - - "components.Wysiwyg.collapse": "Verkleinern", - "components.Wysiwyg.selectOptions.title": "Füge einen Überschrift hinzu", - "components.Wysiwyg.selectOptions.H1": "Überschrift H1", - "components.Wysiwyg.selectOptions.H2": "Überschrift H2", - "components.Wysiwyg.selectOptions.H3": "Überschrift H3", - "components.Wysiwyg.selectOptions.H4": "Überschrift H4", - "components.Wysiwyg.selectOptions.H5": "Überschrift H5", - "components.Wysiwyg.selectOptions.H6": "Überschrift H6", - "components.Wysiwyg.ToggleMode.markdown": "Wechsel zu Markdown", - "components.Wysiwyg.ToggleMode.preview": "Wechsel zur Vorschau", - "components.WysiwygBottomControls.charactersIndicators": "Zeichen", - "components.WysiwygBottomControls.uploadFiles": "Ziehe eine Datei hierher, {browse} eine Datei zum hochladen aus oder füge sie aus der Zwischenablage ein.", - "components.WysiwygBottomControls.uploadFiles.browse": "wähle", - "components.WysiwygBottomControls.fullscreen": "Vergrößern", - - "HomePage.notification.newsLetter.success": "Newsletter erfolgreich abonniert", - - "notification.error": "Ein Fehler ist aufgetreten", - "notification.error.layout": "Das Layout konnte nicht abgerufen werden.", - - "Analytics": "Analytics", - "Auth & Permissions": "Authentifizierung & Berechtigungen", - "Content Manager": "Inhalts-Manager", - "Content Type Builder": "Inhaltstyp-Manager", - "Files Upload": "Dateien hochladen", - "Settings Manager": "Einstellungs-Manager", - "Email": "E-Mail", - "Password": "Passwort", - "Users": "Benutzer", - "Username": "Benutzername", - "Users & Permissions": "Benutzer & Berechtigungen", - "Provider": "Methode", - "ResetPasswordToken": "Passwort-Token zurücksetzen", - "Role": "Rolle", - "Roles & Permissions" : "Rollen & Berechtigungen", - "New entry": "Neuer Eintrag", - "request.error.model.unknown": "Dieses Schema existiert nicht" - } + "Analytics": "Analytics", + "Auth & Permissions": "Authentifizierung & Berechtigungen", + "Content Manager": "Inhalts-Manager", + "Content Type Builder": "Inhaltstyp-Manager", + "Email": "E-Mail", + "Files Upload": "Dateien hochladen", + "HomePage.notification.newsLetter.success": "Newsletter erfolgreich abonniert", + "New entry": "Neuer Eintrag", + "Password": "Passwort", + "Provider": "Methode", + "ResetPasswordToken": "Passwort-Token zurücksetzen", + "Role": "Rolle", + "Roles & Permissions": "Rollen & Berechtigungen", + "Settings Manager": "Einstellungs-Manager", + "Username": "Benutzername", + "Users": "Benutzer", + "Users & Permissions": "Benutzer & Berechtigungen", + "app.components.BlockLink.code": "Code Beispiele", + "app.components.BlockLink.code.content": "Lerne durch das Testen realer Projekte, die die Community entwickelt haben.", + "app.components.BlockLink.documentation": "Lese die Dokumentation", + "app.components.BlockLink.documentation.content": "Entdecke die Konzepte, Referenzanleitungen und Tutorials.", + "app.components.Button.cancel": "Abbrechen", + "app.components.Button.save": "Speichern", + "app.components.ComingSoonPage.comingSoon": "Bald verfügbar", + "app.components.ComingSoonPage.featuresNotAvailable": "Dieses Feature ist derzeit noch in aktiver Entwicklung.", + "app.components.DownloadInfo.download": "Download wird ausgeführt...", + "app.components.DownloadInfo.text": "Dies könnte kurz dauern. Danke für deine Geduld.", + "app.components.HomePage.button.blog": "MEHR DAZU IM BLOG", + "app.components.HomePage.button.quickStart": "STARTE DAS QUICK-START-TUTORIAL", + "app.components.HomePage.community": "Finde die Community im Web", + "app.components.HomePage.community.content": "Diskutiere mit Teammitgliedern, Mitwirkenden und Entwicklern auf verschiedenen Kanälen.", + "app.components.HomePage.create": "Erstelle deinen ersten Inhaltstyp", + "app.components.HomePage.createBlock.content.first": "Das ", + "app.components.HomePage.createBlock.content.second": " Plugin wird dir helfen, die Datenstruktur deiner Modelle zu definieren. Wenn du neu hier bist, empfehlen wir dir unser ", + "app.components.HomePage.createBlock.content.tutorial": " Tutorial.", + "app.components.HomePage.cta": "BESTÄTIGEN", + "app.components.HomePage.newsLetter": "Abonniere den Newsletter, um sich über Strapi zu informieren.", + "app.components.HomePage.support": "UNTERSTÜTZE UNS", + "app.components.HomePage.support.content": "Durch den Kauf des T-Shirts können wir unsere Arbeit am Projekt fortsetzen, um Ihnen das bestmögliche Erlebnis zu bieten!", + "app.components.HomePage.support.link": "HOLE DIR JETZT DEIN T-SHIRT", + "app.components.HomePage.welcome": "Willkommen an Bord!", + "app.components.HomePage.welcome.again": "Willkommen", + "app.components.HomePage.welcomeBlock.content": "Wir freuen uns, dich als Mitglied der Community zu haben. Wir sind offen für Feedback, senden uns einfach eine direkt Nachricht in ", + "app.components.HomePage.welcomeBlock.content.again": "Wir hoffen, dass du Fortschritte bei deinem Projekt machst.... Lese das Neueste über Strapi. Wir geben unser Bestes, um das Produkt auf der Grundlage deines Feedbacks zu verbessern.", + "app.components.HomePage.welcomeBlock.content.issues": "Ticket.", + "app.components.HomePage.welcomeBlock.content.raise": " oder eröffne ", + "app.components.ImgPreview.hint": "Ziehe eine Datei hierher oder {browse} eine Datei zum hochladen aus", + "app.components.ImgPreview.hint.browse": "wähle", + "app.components.InputFile.newFile": "Neue Datei hinzufügen", + "app.components.InputFileDetails.open": "In einem neuen Tab öffnen", + "app.components.InputFileDetails.originalName": "Original Name:", + "app.components.InputFileDetails.remove": "Entferne diese Datei", + "app.components.InputFileDetails.size": "Größe:", + "app.components.InstallPluginPage.InputSearch.label": " ", + "app.components.InstallPluginPage.InputSearch.placeholder": "Suche nach einem Plugin... (z.B.: Authentifizierung)", + "app.components.InstallPluginPage.description": "Erweitere problemlos deine App.", + "app.components.InstallPluginPage.helmet": "Marktplatz - Plugins", + "app.components.InstallPluginPage.plugin.support-us.description": "Unterstütze uns durch den Kauf eines Strapi T-Shirts. Das erlaubt uns, weiter an dem Projekt arbeiten zu können und es so gut wie nur möglich zu gestalten!", + "app.components.InstallPluginPage.title": "Marktplatz - Plugins", + "app.components.InstallPluginPopup.downloads": "herunterladen", + "app.components.InstallPluginPopup.navLink.avis": "avis", + "app.components.InstallPluginPopup.navLink.changelog": "Änderungsprotokoll", + "app.components.InstallPluginPopup.navLink.description": "Beschreibung", + "app.components.InstallPluginPopup.navLink.faq": "faq", + "app.components.InstallPluginPopup.navLink.screenshots": "Screenshots", + "app.components.InstallPluginPopup.noDescription": "Keine Beschreibung verfügbar", + "app.components.LeftMenuFooter.poweredBy": "Stolz präsentiert von ", + "app.components.LeftMenuLinkContainer.configuration": "Konfiguration", + "app.components.LeftMenuLinkContainer.general": "Allgemein", + "app.components.LeftMenuLinkContainer.installNewPlugin": "Marktplatz", + "app.components.LeftMenuLinkContainer.listPlugins": "Plugins", + "app.components.LeftMenuLinkContainer.noPluginsInstalled": "Bisher sind keine Plugins installiert", + "app.components.LeftMenuLinkContainer.plugins": "Plugins", + "app.components.ListPluginsPage.description": "Liste aller im Projekt installierten Plugins.", + "app.components.ListPluginsPage.helmet.title": "Plugins anzeigen", + "app.components.ListPluginsPage.title": "Plugins", + "app.components.NotFoundPage.back": "Zurück zur Homepage", + "app.components.NotFoundPage.description": "Nicht gefunden", + "app.components.Official": "Offiziell", + "app.components.PluginCard.Button.label.download": "Download", + "app.components.PluginCard.Button.label.install": "Bereits installiert", + "app.components.PluginCard.Button.label.support": "Unterstütze uns", + "app.components.PluginCard.compatible": "Mit der App kompatibel", + "app.components.PluginCard.compatibleCommunity": "Mit der Community kompatibel", + "app.components.PluginCard.more-details": "Mehr Details", + "app.components.PluginCard.price.free": "Umsonst", + "app.components.listPlugins.button": "Neues Plugin hinzufügen", + "app.components.listPlugins.title.none": "Es ist kein Plugin installiert", + "app.components.listPlugins.title.plural": "{number} Plugins sind installiert", + "app.components.listPlugins.title.singular": "{number} Plugin ist installiert", + "app.components.listPluginsPage.deletePlugin.error": "Bei der Entfernung des Plugins ist ein Fehler aufgetreten", + "app.utils.SelectOption.defaultMessage": " ", + "app.utils.defaultMessage": "", + "app.utils.placeholder.defaultMessage": " ", + "components.AutoReloadBlocker.description": "Öffne die folgende Datei und aktiviere das Feature.", + "components.AutoReloadBlocker.header": "Dieses Plugin benötigt das Neuladen-Feature.", + "components.ErrorBoundary.title": "Etwas ist falsch gelaufen...", + "components.Input.error.attribute.key.taken": "Dieser Wert existiert bereits", + "components.Input.error.attribute.sameKeyAndName": "Darf nicht gleich sein", + "components.Input.error.attribute.taken": "Dieser Feldname ist bereits vergeben", + "components.Input.error.contentTypeName.taken": "Dieser Name existiert bereits", + "components.Input.error.custom-error": "{errorMessage} ", + "components.Input.error.validation.email": "Das ist keine gültige E-Mail-Adresse", + "components.Input.error.validation.json": "Dies entspricht nicht dem JSON-Format.", + "components.Input.error.validation.max": "Dieser Wert ist zu hoch.", + "components.Input.error.validation.maxLength": "Dieser Wert ist zu lang.", + "components.Input.error.validation.min": "Dieser Wert ist zu niedrig.", + "components.Input.error.validation.minLength": "Dieser Wert ist zu kurz.", + "components.Input.error.validation.minSupMax": "Darf nicht höher sein", + "components.Input.error.validation.regex": "Dieser Wert entspricht nicht dem RegEx.", + "components.Input.error.validation.required": "Die Eingabe dieses Wertes ist erforderlich.", + "components.ListRow.empty": "Es gibt keine Daten.", + "components.OverlayBlocker.description": "Du verwendest ein Feature, das einen Neustart des Servers erfordert. Bitte warte, bis der Server wieder gestartet wurde.", + "components.OverlayBlocker.title": "Auf Neustart warten...", + "components.PageFooter.select": "Einträge pro Seite", + "components.ProductionBlocker.description": "Aus Sicherheitsgründen müssen wir dieses Plugin in anderen Umgebungen deaktivieren.", + "components.ProductionBlocker.header": "Dieses Plugin ist nur in der Entwicklungsumgebung verfügbar.", + "components.Wysiwyg.ToggleMode.markdown": "Wechsel zu Markdown", + "components.Wysiwyg.ToggleMode.preview": "Wechsel zur Vorschau", + "components.Wysiwyg.collapse": "Verkleinern", + "components.Wysiwyg.selectOptions.H1": "Überschrift H1", + "components.Wysiwyg.selectOptions.H2": "Überschrift H2", + "components.Wysiwyg.selectOptions.H3": "Überschrift H3", + "components.Wysiwyg.selectOptions.H4": "Überschrift H4", + "components.Wysiwyg.selectOptions.H5": "Überschrift H5", + "components.Wysiwyg.selectOptions.H6": "Überschrift H6", + "components.Wysiwyg.selectOptions.title": "Füge einen Überschrift hinzu", + "components.WysiwygBottomControls.charactersIndicators": "Zeichen", + "components.WysiwygBottomControls.fullscreen": "Vergrößern", + "components.WysiwygBottomControls.uploadFiles": "Ziehe eine Datei hierher, {browse} eine Datei zum hochladen aus oder füge sie aus der Zwischenablage ein.", + "components.WysiwygBottomControls.uploadFiles.browse": "wähle", + "components.popUpWarning.button.cancel": "Abbrechen", + "components.popUpWarning.button.confirm": "Bestätigen", + "components.popUpWarning.message": "Bist du sicher, dass du dies löschen möchtest?", + "components.popUpWarning.title": "Bitte bestätigen", + "notification.error": "Ein Fehler ist aufgetreten", + "notification.error.layout": "Das Layout konnte nicht abgerufen werden.", + "request.error.model.unknown": "Dieses Schema existiert nicht" +} \ No newline at end of file diff --git a/packages/strapi-admin/admin/src/translations/en.json b/packages/strapi-admin/admin/src/translations/en.json index 5e5e54c33e..18a5504516 100644 --- a/packages/strapi-admin/admin/src/translations/en.json +++ b/packages/strapi-admin/admin/src/translations/en.json @@ -1,64 +1,70 @@ { - "app.components.Button.save": "Save", + "Analytics": "Analytics", + "Content Manager": "Content Manager", + "Content Type Builder": "Content Type Builder", + "Email": "Email", + "Files Upload": "Files Upload", + "HomePage.notification.newsLetter.success": "Successfully subscribed to the newsletter", + "New entry": "New entry", + "Password": "Password", + "Provider": "Provider", + "ResetPasswordToken": "Reset Password Token", + "Role": "Role", + "Roles & Permissions": "Roles & Permission", + "Settings Manager": "Settings Manager", + "Username": "Username", + "Users": "Users", + "Users & Permissions": "Users & Permissions", + "app.components.BlockLink.code": "Code examples", + "app.components.BlockLink.code.content": "Learn by testing real projects developed the community.", + "app.components.BlockLink.documentation": "Read the documentation", + "app.components.BlockLink.documentation.content": "Discover the concepts, reference guides and tutorials.", "app.components.Button.cancel": "Cancel", - + "app.components.Button.save": "Save", "app.components.ComingSoonPage.comingSoon": "Coming soon", "app.components.ComingSoonPage.featuresNotAvailable": "This feature is still under active development.", - "app.components.DownloadInfo.download": "Download in progress...", "app.components.DownloadInfo.text": "This could take a minute. Thanks for your patience.", - "app.components.EmptyAttributes.title": "There are no fields yet", - - "app.components.HomePage.welcome": "Welcome on board!", - "app.components.HomePage.welcome.again": "Welcome ", - "app.components.HomePage.cta": "CONFIRM", + "app.components.HomePage.button.blog": "SEE MORE ON THE BLOG", + "app.components.HomePage.button.quickStart": "START THE QUICK START TUTORIAL", "app.components.HomePage.community": "Find the community on the web", - "app.components.HomePage.newsLetter": "Subscribe to the newsletter to get in touch about Strapi", "app.components.HomePage.community.content": "Discuss with team members, contributors and developers on different channels.", "app.components.HomePage.create": "Create your first Content Type", - "app.components.HomePage.welcomeBlock.content": "We are happy to have you as one of community member. We are constantly looking for feedback so feel free to send us DM on\u0020", - "app.components.HomePage.welcomeBlock.content.again": "We hope you are making progress on your project... Feel free to read the latest new about Strapi. We are giving our best to improve the product based on your feedback.", - "app.components.HomePage.welcomeBlock.content.issues": "issues.", - "app.components.HomePage.welcomeBlock.content.raise": "\u0020or raise\u0020", - "app.components.HomePage.createBlock.content.first": "The\u0020", - "app.components.HomePage.createBlock.content.second": "\u0020plugin will help you to define the data structure of your models. If you’re new here, we highly recommend you to follow our\u0020", - "app.components.HomePage.createBlock.content.tutorial": "\u0020tutorial.", - "app.components.HomePage.button.quickStart": "START THE QUICK START TUTORIAL", - "app.components.HomePage.button.blog": "SEE MORE ON THE BLOG", + "app.components.HomePage.createBlock.content.first": "The ", + "app.components.HomePage.createBlock.content.second": " plugin will help you to define the data structure of your models. If you’re new here, we highly recommend you to follow our ", + "app.components.HomePage.createBlock.content.tutorial": " tutorial.", + "app.components.HomePage.cta": "CONFIRM", + "app.components.HomePage.newsLetter": "Subscribe to the newsletter to get in touch about Strapi", "app.components.HomePage.support": "SUPPORT US", "app.components.HomePage.support.content": "By buying the T-shirt, it will allow us to continue our work on the project to give you the best possible experience!", "app.components.HomePage.support.link": "GET YOUR T-SHIRT NOW", - - "app.components.BlockLink.documentation": "Read the documentation", - "app.components.BlockLink.documentation.content": "Discover the concepts, reference guides and tutorials.", - "app.components.BlockLink.code": "Code examples", - "app.components.BlockLink.code.content": "Learn by testing real projects developed the community.", - - - "app.components.InputFile.newFile": "Add new file", - "app.components.InputFileDetails.open": "Open in a new tab", - "app.components.InputFileDetails.remove": "Remove this file", - "app.components.InputFileDetails.originalName": "Original name:", - "app.components.InputFileDetails.size": "Size:", - + "app.components.HomePage.welcome": "Welcome on board!", + "app.components.HomePage.welcome.again": "Welcome ", + "app.components.HomePage.welcomeBlock.content": "We are happy to have you as one of community member. We are constantly looking for feedback so feel free to send us DM on ", + "app.components.HomePage.welcomeBlock.content.again": "We hope you are making progress on your project... Feel free to read the latest new about Strapi. We are giving our best to improve the product based on your feedback.", + "app.components.HomePage.welcomeBlock.content.issues": "issues.", + "app.components.HomePage.welcomeBlock.content.raise": " or raise ", "app.components.ImgPreview.hint": "Drag & drop your file into this area or {browse} for a file to upload", "app.components.ImgPreview.hint.browse": "browse", - - "app.components.InstallPluginPage.helmet": "Marketplace - Plugins", - "app.components.InstallPluginPage.title": "Marketplace - Plugins", - "app.components.InstallPluginPage.description": "Extend your app effortlessly.", - "app.components.InstallPluginPage.plugin.support-us.description": "Support us by buying the Strapi T-shirt. That will allow us to keep working on the project and try giving you the best possible experience!", + "app.components.InputFile.newFile": "Add new file", + "app.components.InputFileDetails.open": "Open in a new tab", + "app.components.InputFileDetails.originalName": "Original name:", + "app.components.InputFileDetails.remove": "Remove this file", + "app.components.InputFileDetails.size": "Size:", "app.components.InstallPluginPage.InputSearch.label": " ", "app.components.InstallPluginPage.InputSearch.placeholder": "Search for a plugin... (ex: authentication)", + "app.components.InstallPluginPage.description": "Extend your app effortlessly.", + "app.components.InstallPluginPage.helmet": "Marketplace - Plugins", + "app.components.InstallPluginPage.plugin.support-us.description": "Support us by buying the Strapi T-shirt. That will allow us to keep working on the project and try giving you the best possible experience!", + "app.components.InstallPluginPage.title": "Marketplace - Plugins", "app.components.InstallPluginPopup.downloads": "download", - "app.components.InstallPluginPopup.navLink.description": "Description", - "app.components.InstallPluginPopup.navLink.screenshots": "Screenshots", "app.components.InstallPluginPopup.navLink.avis": "avis", - "app.components.InstallPluginPopup.navLink.faq": "faq", "app.components.InstallPluginPopup.navLink.changelog": "changelog", + "app.components.InstallPluginPopup.navLink.description": "Description", + "app.components.InstallPluginPopup.navLink.faq": "faq", + "app.components.InstallPluginPopup.navLink.screenshots": "Screenshots", "app.components.InstallPluginPopup.noDescription": "No description available", - "app.components.LeftMenuFooter.poweredBy": "Powered by ", "app.components.LeftMenuLinkContainer.configuration": "Configurations", "app.components.LeftMenuLinkContainer.general": "General", @@ -66,102 +72,69 @@ "app.components.LeftMenuLinkContainer.listPlugins": "Plugins", "app.components.LeftMenuLinkContainer.noPluginsInstalled": "No plugins installed yet", "app.components.LeftMenuLinkContainer.plugins": "Plugins", - + "app.components.ListPluginsPage.description": "List of the installed plugins in the project.", "app.components.ListPluginsPage.helmet.title": "List plugins", "app.components.ListPluginsPage.title": "Plugins", - "app.components.ListPluginsPage.description": "List of the installed plugins in the project.", - "app.components.listPluginsPage.deletePlugin.error": "An error occurred while uninstalling the plugin", - "app.components.listPlugins.title.singular": "{number} plugin is installed", - "app.components.listPlugins.title.plural": "{number} plugins are installed", - "app.components.listPlugins.title.none": "No plugins installed", - "app.components.listPlugins.button": "Add New Plugin", - - "app.components.NotFoundPage.description": "Not Found", "app.components.NotFoundPage.back": "Back to homepage", - + "app.components.NotFoundPage.description": "Not Found", "app.components.Official": "Official", - - "app.components.PluginCard.compatible": "Compatible with your app", - "app.components.PluginCard.compatibleCommunity": "Compatible with the community", "app.components.PluginCard.Button.label.download": "Download", "app.components.PluginCard.Button.label.install": "Already installed", "app.components.PluginCard.Button.label.support": "Support us", - "app.components.PluginCard.price.free": "Free", + "app.components.PluginCard.compatible": "Compatible with your app", + "app.components.PluginCard.compatibleCommunity": "Compatible with the community", "app.components.PluginCard.more-details": "More details", - - "app.utils.placeholder.defaultMessage": "\u0020", - "app.utils.SelectOption.defaultMessage": "\u0020", - "app.utils.defaultMessage": "\u0020", - - "components.AutoReloadBlocker.header": "Reload feature is required for this plugin.", + "app.components.PluginCard.price.free": "Free", + "app.components.listPlugins.button": "Add New Plugin", + "app.components.listPlugins.title.none": "No plugins installed", + "app.components.listPlugins.title.plural": "{number} plugins are installed", + "app.components.listPlugins.title.singular": "{number} plugin is installed", + "app.components.listPluginsPage.deletePlugin.error": "An error occurred while uninstalling the plugin", + "app.utils.SelectOption.defaultMessage": " ", + "app.utils.defaultMessage": " ", + "app.utils.placeholder.defaultMessage": " ", "components.AutoReloadBlocker.description": "Open the following file and enable the feature.", - + "components.AutoReloadBlocker.header": "Reload feature is required for this plugin.", "components.ErrorBoundary.title": "Something went wrong...", - - "components.OverlayBlocker.title": "Waiting for restart...", - "components.OverlayBlocker.description": "You're using a feature that needs the server to restart. Please wait until the server is up.", - - "components.PageFooter.select": "entries per page", - - "components.ProductionBlocker.header": "This plugin is only available in development.", - "components.ProductionBlocker.description": "For safety purposes we have to disable this plugin in other environments.", - - "components.popUpWarning.button.cancel": "Cancel", - "components.popUpWarning.button.confirm": "Confirm", - "components.popUpWarning.title": "Please confirm", - "components.popUpWarning.message": "Are you sure you want to delete this?", - - "components.Input.error.validation.email": "This is not an email", - "components.Input.error.validation.required": "This value is required.", - "components.Input.error.validation.regex": "The value not match the regex.", - "components.Input.error.validation.max": "The value is too high.", - "components.Input.error.validation.min": "The value is too low.", - "components.Input.error.validation.maxLength": "The value is too long.", - "components.Input.error.validation.minLength": "The value is too short.", - "components.Input.error.contentTypeName.taken": "This name already exists", - "components.Input.error.attribute.taken": "This field name already exists", "components.Input.error.attribute.key.taken": "This value already exists", "components.Input.error.attribute.sameKeyAndName": "Can't be equal", - "components.Input.error.validation.minSupMax": "Can't be superior", + "components.Input.error.attribute.taken": "This field name already exists", + "components.Input.error.contentTypeName.taken": "This name already exists", "components.Input.error.custom-error": "{errorMessage} ", + "components.Input.error.validation.email": "This is not an email", "components.Input.error.validation.json": "This doesn't match the JSON format", - + "components.Input.error.validation.max": "The value is too high.", + "components.Input.error.validation.maxLength": "The value is too long.", + "components.Input.error.validation.min": "The value is too low.", + "components.Input.error.validation.minLength": "The value is too short.", + "components.Input.error.validation.minSupMax": "Can't be superior", + "components.Input.error.validation.regex": "The value not match the regex.", + "components.Input.error.validation.required": "This value is required.", "components.ListRow.empty": "There is no data to be shown.", - + "components.OverlayBlocker.description": "You're using a feature that needs the server to restart. Please wait until the server is up.", + "components.OverlayBlocker.title": "Waiting for restart...", + "components.PageFooter.select": "entries per page", + "components.ProductionBlocker.description": "For safety purposes we have to disable this plugin in other environments.", + "components.ProductionBlocker.header": "This plugin is only available in development.", + "components.Wysiwyg.ToggleMode.markdown": "Switch to markdown", + "components.Wysiwyg.ToggleMode.preview": "Switch to preview", "components.Wysiwyg.collapse": "Collapse", - "components.Wysiwyg.selectOptions.title": "Add a title", "components.Wysiwyg.selectOptions.H1": "Title H1", "components.Wysiwyg.selectOptions.H2": "Title H2", "components.Wysiwyg.selectOptions.H3": "Title H3", "components.Wysiwyg.selectOptions.H4": "Title H4", "components.Wysiwyg.selectOptions.H5": "Title H5", "components.Wysiwyg.selectOptions.H6": "Title H6", - "components.Wysiwyg.ToggleMode.markdown": "Switch to markdown", - "components.Wysiwyg.ToggleMode.preview": "Switch to preview", + "components.Wysiwyg.selectOptions.title": "Add a title", "components.WysiwygBottomControls.charactersIndicators": "characters", + "components.WysiwygBottomControls.fullscreen": "Expand", "components.WysiwygBottomControls.uploadFiles": "Drag & drop files, paste from the clipboard or {browse}.", "components.WysiwygBottomControls.uploadFiles.browse": "select them", - "components.WysiwygBottomControls.fullscreen": "Expand", - - "HomePage.notification.newsLetter.success": "Successfully subscribed to the newsletter", - + "components.popUpWarning.button.cancel": "Cancel", + "components.popUpWarning.button.confirm": "Confirm", + "components.popUpWarning.message": "Are you sure you want to delete this?", + "components.popUpWarning.title": "Please confirm", "notification.error": "An error occurred", "notification.error.layout": "Couldn't retrieve the layout", - - "Users & Permissions": "Users & Permissions", - "Content Manager": "Content Manager", - "Content Type Builder": "Content Type Builder", - "Files Upload": "Files Upload", - "Roles & Permissions": "Roles & Permission", - "Settings Manager": "Settings Manager", - "Email": "Email", - "Password": "Password", - "Username": "Username", - "Provider": "Provider", - "ResetPasswordToken": "Reset Password Token", - "Role": "Role", - "New entry": "New entry", - "request.error.model.unknown": "This model doesn't exist", - "Users": "Users", - "Analytics": "Analytics" -} + "request.error.model.unknown": "This model doesn't exist" +} \ No newline at end of file diff --git a/packages/strapi-admin/admin/src/translations/es.json b/packages/strapi-admin/admin/src/translations/es.json index 6da3497017..3252b9958a 100644 --- a/packages/strapi-admin/admin/src/translations/es.json +++ b/packages/strapi-admin/admin/src/translations/es.json @@ -1,62 +1,69 @@ { - "app.components.Button.save": "Guardar", + "Analytics": "Analytics", + "Content Manager": "Gestor de Contenidos", + "Content Type Builder": "Constructor de Tipos de Contenido", + "Email": "Email", + "Files Upload": "Carga de archivos", + "HomePage.notification.newsLetter.success": "Suscribirse con éxito al boletín de noticias", + "New entry": "Entrada nueva", + "Password": "Contraseña", + "Provider": "Proveedor", + "ResetPasswordToken": "Restablecer Token de Contraseña", + "Role": "Rol", + "Roles & Permissions": "Roles y Permisos", + "Settings Manager": "Gestor de ajustes", + "Username": "Nombre de usuario", + "Users": "Usuarios", + "Users & Permissions": "Usuarios y permisos", + "app.components.BlockLink.code": "Ejemplos de código", + "app.components.BlockLink.code.content": "Aprenda probando proyectos reales desarrollados por la comunidad.", + "app.components.BlockLink.documentation": "Lea la documentación", + "app.components.BlockLink.documentation.content": "Descubra los conceptos, guías de referencia y tutoriales.", "app.components.Button.cancel": "Cancelar", - + "app.components.Button.save": "Guardar", "app.components.ComingSoonPage.comingSoon": "Próximamente", "app.components.ComingSoonPage.featuresNotAvailable": "Esta característica está aún en desarrollo.", - "app.components.DownloadInfo.download": "Descarga en curso...", "app.components.DownloadInfo.text": "Esto puede tardar un minuto. Gracias por su paciencia.", - - "app.components.HomePage.welcome": "¡Bienvenido a bordo!", - "app.components.HomePage.welcome.again": "Bienvenido ", - "app.components.HomePage.cta": "CONFIRMAR", + "app.components.HomePage.button.blog": "VER MÁS EN EL BLOG", + "app.components.HomePage.button.quickStart": "INICIAR EL TUTORIAL DE INICIO RÁPIDO", "app.components.HomePage.community": "Encuentra la comunidad en la web", - "app.components.HomePage.newsLetter": "Suscríbase al boletín de noticias para ponerse en contacto con Strapi", "app.components.HomePage.community.content": "Discutir con los miembros del equipo, colaboradores y desarrolladores en diferentes canales.", "app.components.HomePage.create": "Crea tu primer Tipo de Contenido", - "app.components.HomePage.welcomeBlock.content": "Estamos felices de tenerlo como miembro de la comunidad. Estamos constantemente en busca de comentarios así que no dude en enviarnos un DM en\u0020", - "app.components.HomePage.welcomeBlock.content.again": "Esperamos que estés progresando en tu proyecto.... Siéntase libre de leer las últimas novedades sobre Strapi. Estamos dando lo mejor de nosotros mismos para mejorar el producto basándonos en sus comentarios.", - "app.components.HomePage.welcomeBlock.content.issues": "problema.", - "app.components.HomePage.welcomeBlock.content.raise": "\u0020o reportar cualquier\u0020", - "app.components.HomePage.createBlock.content.first": "El\u0020", - "app.components.HomePage.createBlock.content.second": "\u0020le ayudará a definir la estructura de datos de sus modelos. Si eres nuevo aquí, te recomendamos encarecidamente que sigas nuestro\u0020", - "app.components.HomePage.createBlock.content.tutorial": "\u0020", - "app.components.HomePage.button.quickStart": "INICIAR EL TUTORIAL DE INICIO RÁPIDO", - "app.components.HomePage.button.blog": "VER MÁS EN EL BLOG", + "app.components.HomePage.createBlock.content.first": "El ", + "app.components.HomePage.createBlock.content.second": " le ayudará a definir la estructura de datos de sus modelos. Si eres nuevo aquí, te recomendamos encarecidamente que sigas nuestro ", + "app.components.HomePage.createBlock.content.tutorial": " ", + "app.components.HomePage.cta": "CONFIRMAR", + "app.components.HomePage.newsLetter": "Suscríbase al boletín de noticias para ponerse en contacto con Strapi", "app.components.HomePage.support": "APÓYANOS", "app.components.HomePage.support.content": "¡Al comprar la camiseta, nos permitirá continuar nuestro trabajo en el proyecto para darle la mejor experiencia posible!", "app.components.HomePage.support.link": "CONSIGUE TU CAMISETA AHORA", - - "app.components.BlockLink.documentation": "Lea la documentación", - "app.components.BlockLink.documentation.content": "Descubra los conceptos, guías de referencia y tutoriales.", - "app.components.BlockLink.code": "Ejemplos de código", - "app.components.BlockLink.code.content": "Aprenda probando proyectos reales desarrollados por la comunidad.", - - - "app.components.InputFile.newFile": "Añadir nuevo archivo", - "app.components.InputFileDetails.open": "Abrir en una nueva pestaña", - "app.components.InputFileDetails.remove": "Eliminar este archivo", - "app.components.InputFileDetails.originalName": "Nombre original:", - "app.components.InputFileDetails.size": "Tamaño:", - + "app.components.HomePage.welcome": "¡Bienvenido a bordo!", + "app.components.HomePage.welcome.again": "Bienvenido ", + "app.components.HomePage.welcomeBlock.content": "Estamos felices de tenerlo como miembro de la comunidad. Estamos constantemente en busca de comentarios así que no dude en enviarnos un DM en ", + "app.components.HomePage.welcomeBlock.content.again": "Esperamos que estés progresando en tu proyecto.... Siéntase libre de leer las últimas novedades sobre Strapi. Estamos dando lo mejor de nosotros mismos para mejorar el producto basándonos en sus comentarios.", + "app.components.HomePage.welcomeBlock.content.issues": "problema.", + "app.components.HomePage.welcomeBlock.content.raise": " o reportar cualquier ", "app.components.ImgPreview.hint": "Arrastre y suelte el archivo en esta área o {browse} para cargar un archivo.", "app.components.ImgPreview.hint.browse": "buscar", - - "app.components.InstallPluginPage.helmet": "Tienda - Plugins", - "app.components.InstallPluginPage.title": "Tienda - Plugins", - "app.components.InstallPluginPage.description": "Extienda su aplicación sin esfuerzo.", - "app.components.InstallPluginPage.plugin.support-us.description": "¡Apóyanos comprando la camiseta Strapi. Eso nos permitirá seguir trabajando en el proyecto y tratar de darle la mejor experiencia posible!", + "app.components.InputFile.newFile": "Añadir nuevo archivo", + "app.components.InputFileDetails.open": "Abrir en una nueva pestaña", + "app.components.InputFileDetails.originalName": "Nombre original:", + "app.components.InputFileDetails.remove": "Eliminar este archivo", + "app.components.InputFileDetails.size": "Tamaño:", "app.components.InstallPluginPage.InputSearch.label": " ", "app.components.InstallPluginPage.InputSearch.placeholder": "Buscar un plugin... (ej: autenticación)", + "app.components.InstallPluginPage.description": "Extienda su aplicación sin esfuerzo.", + "app.components.InstallPluginPage.helmet": "Tienda - Plugins", + "app.components.InstallPluginPage.plugin.support-us.description": "¡Apóyanos comprando la camiseta Strapi. Eso nos permitirá seguir trabajando en el proyecto y tratar de darle la mejor experiencia posible!", + "app.components.InstallPluginPage.title": "Tienda - Plugins", "app.components.InstallPluginPopup.downloads": "descargar", - "app.components.InstallPluginPopup.navLink.description": "Descripción", - "app.components.InstallPluginPopup.navLink.screenshots": "Capturas de pantalla", "app.components.InstallPluginPopup.navLink.avis": "opinión", - "app.components.InstallPluginPopup.navLink.faq": "preguntas frecuentes", "app.components.InstallPluginPopup.navLink.changelog": "changelog", + "app.components.InstallPluginPopup.navLink.description": "Descripción", + "app.components.InstallPluginPopup.navLink.faq": "preguntas frecuentes", + "app.components.InstallPluginPopup.navLink.screenshots": "Capturas de pantalla", "app.components.InstallPluginPopup.noDescription": "No hay descripción disponible", - "app.components.LeftMenuFooter.poweredBy": "Potenciado por ", "app.components.LeftMenuLinkContainer.configuration": "Configuraciones", "app.components.LeftMenuLinkContainer.general": "General", @@ -64,102 +71,69 @@ "app.components.LeftMenuLinkContainer.listPlugins": "Plugins", "app.components.LeftMenuLinkContainer.noPluginsInstalled": "No hay plugins instalados todavía", "app.components.LeftMenuLinkContainer.plugins": "Plugins", - + "app.components.ListPluginsPage.description": "Lista de los plugins instalados en el proyecto.", "app.components.ListPluginsPage.helmet.title": "Lista de plugins", "app.components.ListPluginsPage.title": "Plugins", - "app.components.ListPluginsPage.description": "Lista de los plugins instalados en el proyecto.", - "app.components.listPluginsPage.deletePlugin.error": "Se ha producido un error al desinstalar el plugin", - "app.components.listPlugins.title.singular": "{number} plugin está instalado", - "app.components.listPlugins.title.plural": "{number} plugins están instalados", - "app.components.listPlugins.title.none": "No hay plugins instalados", - "app.components.listPlugins.button": "Añadir nuevo plugin", - - "app.components.NotFoundPage.description": "No encontrado", "app.components.NotFoundPage.back": "Volver a la página de inicio", - + "app.components.NotFoundPage.description": "No encontrado", "app.components.Official": "Oficial", - - "app.components.PluginCard.compatible": "Compatible con su aplicación", - "app.components.PluginCard.compatibleCommunity": "Compatible con la comunidad", "app.components.PluginCard.Button.label.download": "Descargar", "app.components.PluginCard.Button.label.install": "Ya instalado", "app.components.PluginCard.Button.label.support": "Apóyenos", - "app.components.PluginCard.price.free": "Gratuito", + "app.components.PluginCard.compatible": "Compatible con su aplicación", + "app.components.PluginCard.compatibleCommunity": "Compatible con la comunidad", "app.components.PluginCard.more-details": "Más detalles", - - "app.utils.placeholder.defaultMessage": "\u0020", - "app.utils.SelectOption.defaultMessage": "\u0020", - "app.utils.defaultMessage": "\u0020", - - "components.AutoReloadBlocker.header": "Es necesario recargar para este plugin.", + "app.components.PluginCard.price.free": "Gratuito", + "app.components.listPlugins.button": "Añadir nuevo plugin", + "app.components.listPlugins.title.none": "No hay plugins instalados", + "app.components.listPlugins.title.plural": "{number} plugins están instalados", + "app.components.listPlugins.title.singular": "{number} plugin está instalado", + "app.components.listPluginsPage.deletePlugin.error": "Se ha producido un error al desinstalar el plugin", + "app.utils.SelectOption.defaultMessage": " ", + "app.utils.defaultMessage": " ", + "app.utils.placeholder.defaultMessage": " ", "components.AutoReloadBlocker.description": "Abra el siguiente archivo y habilite la función.", - + "components.AutoReloadBlocker.header": "Es necesario recargar para este plugin.", "components.ErrorBoundary.title": "Algo salió mal...", - - "components.OverlayBlocker.title": "Esperando el reinicio...", - "components.OverlayBlocker.description": "Está utilizando una función que necesita que el servidor se reinicie. Por favor, espere hasta que el servidor esté listo..", - - "components.PageFooter.select": "entradas por página", - - "components.ProductionBlocker.header": "Este plugin sólo está disponible en entornos de desarrollo.", - "components.ProductionBlocker.description": "Por razones de seguridad tenemos que desactivar este plugin en otros entornos.", - - "components.popUpWarning.button.cancel": "Cancelar", - "components.popUpWarning.button.confirm": "Confirmar", - "components.popUpWarning.title": "Por favor, confirme", - "components.popUpWarning.message": "¿Estás seguro de que quieres borrar esto?", - - "components.Input.error.validation.email": "Esto no es un email", - "components.Input.error.validation.required": "Este valor es obligatorio.", - "components.Input.error.validation.regex": "El valor no coincide con el de regex.", - "components.Input.error.validation.max": "El valor es demasiado alto.", - "components.Input.error.validation.min": "El valor es demasiado bajo.", - "components.Input.error.validation.maxLength": "El valor es demasiado largo.", - "components.Input.error.validation.minLength": "El valor es demasiado corto.", - "components.Input.error.contentTypeName.taken": "Este nombre ya existe", - "components.Input.error.attribute.taken": "Este nombre de campo ya existe", "components.Input.error.attribute.key.taken": "Este valor ya existe", "components.Input.error.attribute.sameKeyAndName": "No puede ser igual", - "components.Input.error.validation.minSupMax": "No puede ser superior", + "components.Input.error.attribute.taken": "Este nombre de campo ya existe", + "components.Input.error.contentTypeName.taken": "Este nombre ya existe", "components.Input.error.custom-error": "{errorMessage} ", + "components.Input.error.validation.email": "Esto no es un email", "components.Input.error.validation.json": "Esto no coincide con el formato JSON", - + "components.Input.error.validation.max": "El valor es demasiado alto.", + "components.Input.error.validation.maxLength": "El valor es demasiado largo.", + "components.Input.error.validation.min": "El valor es demasiado bajo.", + "components.Input.error.validation.minLength": "El valor es demasiado corto.", + "components.Input.error.validation.minSupMax": "No puede ser superior", + "components.Input.error.validation.regex": "El valor no coincide con el de regex.", + "components.Input.error.validation.required": "Este valor es obligatorio.", "components.ListRow.empty": "No hay datos que mostrar.", - + "components.OverlayBlocker.description": "Está utilizando una función que necesita que el servidor se reinicie. Por favor, espere hasta que el servidor esté listo..", + "components.OverlayBlocker.title": "Esperando el reinicio...", + "components.PageFooter.select": "entradas por página", + "components.ProductionBlocker.description": "Por razones de seguridad tenemos que desactivar este plugin en otros entornos.", + "components.ProductionBlocker.header": "Este plugin sólo está disponible en entornos de desarrollo.", + "components.Wysiwyg.ToggleMode.markdown": "Cambiar a markdown", + "components.Wysiwyg.ToggleMode.preview": "Cambiar a vista previa", "components.Wysiwyg.collapse": "Contraer menú", - "components.Wysiwyg.selectOptions.title": "Añadir un título", "components.Wysiwyg.selectOptions.H1": "Título H1", "components.Wysiwyg.selectOptions.H2": "Título H2", "components.Wysiwyg.selectOptions.H3": "Título H3", "components.Wysiwyg.selectOptions.H4": "Título H4", "components.Wysiwyg.selectOptions.H5": "Título H5", "components.Wysiwyg.selectOptions.H6": "Título H6", - "components.Wysiwyg.ToggleMode.markdown": "Cambiar a markdown", - "components.Wysiwyg.ToggleMode.preview": "Cambiar a vista previa", + "components.Wysiwyg.selectOptions.title": "Añadir un título", "components.WysiwygBottomControls.charactersIndicators": "caracteres", + "components.WysiwygBottomControls.fullscreen": "Expandir", "components.WysiwygBottomControls.uploadFiles": "Arrastrar y soltar archivos, pegar desde el portapapeles o {browse}.", "components.WysiwygBottomControls.uploadFiles.browse": "seleccionarlos", - "components.WysiwygBottomControls.fullscreen": "Expandir", - - "HomePage.notification.newsLetter.success": "Suscribirse con éxito al boletín de noticias", - + "components.popUpWarning.button.cancel": "Cancelar", + "components.popUpWarning.button.confirm": "Confirmar", + "components.popUpWarning.message": "¿Estás seguro de que quieres borrar esto?", + "components.popUpWarning.title": "Por favor, confirme", "notification.error": "Se ha producido un error", "notification.error.layout": "No se pudo recuperar el esquema", - - "Users & Permissions": "Usuarios y permisos", - "Content Manager": "Gestor de Contenidos", - "Content Type Builder": "Constructor de Tipos de Contenido", - "Files Upload": "Carga de archivos", - "Roles & Permissions": "Roles y Permisos", - "Settings Manager": "Gestor de ajustes", - "Email": "Email", - "Password": "Contraseña", - "Username": "Nombre de usuario", - "Provider": "Proveedor", - "ResetPasswordToken": "Restablecer Token de Contraseña", - "Role": "Rol", - "New entry": "Entrada nueva", - "request.error.model.unknown": "Este modelo no existe", - "Users": "Usuarios", - "Analytics": "Analytics" -} + "request.error.model.unknown": "Este modelo no existe" +} \ No newline at end of file diff --git a/packages/strapi-admin/admin/src/translations/fr.json b/packages/strapi-admin/admin/src/translations/fr.json index 021f620fa7..cdcab735b1 100644 --- a/packages/strapi-admin/admin/src/translations/fr.json +++ b/packages/strapi-admin/admin/src/translations/fr.json @@ -1,62 +1,71 @@ { - "app.components.Button.save": "Save", + "Analytics": "Statistiques", + "Auth & Permissions": "Auth & Permissions", + "Content Manager": "Content Manager", + "Content Type Builder": "Content Type Builder", + "Email": "Email", + "Files Upload": "Téléversement de fichiers", + "HomePage.notification.newsLetter.success": "Vous avez souscrit à la newsletter", + "New entry": "Nouvelle entrée", + "Password": "Mot de passe", + "Provider": "Provider", + "ResetPasswordToken": "ResetPasswordToken", + "Role": "Rôle", + "Roles & Permissions": "Rôles et autorisations", + "Settings Manager": "Settings Manager", + "Username": "Nom d'utilisateur", + "Users": "Utilisateurs", + "Users & Permissions": "Utilisateurs et autorisations", + "app.components.BlockLink.code": "Apps d'exemple", + "app.components.BlockLink.code.content": "Apprenez en testant les projets développés par la communauté.", + "app.components.BlockLink.documentation": "Voir la documentation", + "app.components.BlockLink.documentation.content": "Découvrez les concepts, guides et tutoriaux.", "app.components.Button.cancel": "Cancel", - + "app.components.Button.save": "Save", "app.components.ComingSoonPage.comingSoon": "Bientôt disponible", "app.components.ComingSoonPage.featuresNotAvailable": "Cette fonctionnalité est toujours en cours de développement.", - "app.components.DownloadInfo.download": "Téléchargement en cours...", "app.components.DownloadInfo.text": "Cela peut prendre une minute. Merci de patienter.", "app.components.EmptyAttributes.title": "Il n'y a pas encore de champ", - - "app.components.HomePage.welcome": "Bienvenue à bord!", - "app.components.HomePage.welcome.again": "Bienvenue ", - "app.components.HomePage.cta": "CONFIRMEZ", + "app.components.HomePage.button.blog": "VOIR PLUS D'ARTICLES SUR LE BLOG", + "app.components.HomePage.button.quickStart": "VOIR LE QUICK START TUTORIEL", "app.components.HomePage.community": "Rejoignez la communauté", "app.components.HomePage.community.content": "Discutez avec les membres de l'équipe, contributeurs et développeurs sur différent supports.", "app.components.HomePage.create": "Créez votre premier Content Type", - "app.components.HomePage.welcomeBlock.content": "Nous sommes heureux de vous compter parmi nos membres. Nous sommes à l'écoute de vos retours alors, n'hésitez pas à nous envoyer des DM sur\u0020", - "app.components.HomePage.welcomeBlock.content.again": "Nous espérons que votre projet avance bien... Découvrez les derniers articles à propos de Strapi. Nous faisons de notre mieux pour améliorer le produit selon vos retours.", - "app.components.HomePage.welcomeBlock.content.issues": "issues", - "app.components.HomePage.welcomeBlock.content.raise": "\u0020ou soumetez des\u0020", - "app.components.HomePage.createBlock.content.first": "Le\u0020", - "app.components.HomePage.createBlock.content.second": "\u0020plugin vous permet de définir la structure de vos modèles. Nous vous conseillons fortement de suivre notre\u0020", - "app.components.HomePage.createBlock.content.tutorial": "\u0020tutoriel.", - "app.components.HomePage.button.quickStart": "VOIR LE QUICK START TUTORIEL", - "app.components.HomePage.button.blog": "VOIR PLUS D'ARTICLES SUR LE BLOG", + "app.components.HomePage.createBlock.content.first": "Le ", + "app.components.HomePage.createBlock.content.second": " plugin vous permet de définir la structure de vos modèles. Nous vous conseillons fortement de suivre notre ", + "app.components.HomePage.createBlock.content.tutorial": " tutoriel.", + "app.components.HomePage.cta": "CONFIRMEZ", + "app.components.HomePage.newsLetter": "Inscrivez-vous à la newsletter pour être contacté à propos de Strapi", "app.components.HomePage.support": "SUPPORT US", "app.components.HomePage.support.content": "En achetant notre T-shirt, vous nous aidez à poursuivre à maintenir le projet pour que nous puissions vous donner la meilleure expérience possible!", "app.components.HomePage.support.link": "OBTENEZ VOTRE T-SHIRT!", - "app.components.HomePage.newsLetter": "Inscrivez-vous à la newsletter pour être contacté à propos de Strapi", - - "app.components.BlockLink.documentation": "Voir la documentation", - "app.components.BlockLink.documentation.content": "Découvrez les concepts, guides et tutoriaux.", - "app.components.BlockLink.code": "Apps d'exemple", - "app.components.BlockLink.code.content": "Apprenez en testant les projets développés par la communauté.", - + "app.components.HomePage.welcome": "Bienvenue à bord!", + "app.components.HomePage.welcome.again": "Bienvenue ", + "app.components.HomePage.welcomeBlock.content": "Nous sommes heureux de vous compter parmi nos membres. Nous sommes à l'écoute de vos retours alors, n'hésitez pas à nous envoyer des DM sur ", + "app.components.HomePage.welcomeBlock.content.again": "Nous espérons que votre projet avance bien... Découvrez les derniers articles à propos de Strapi. Nous faisons de notre mieux pour améliorer le produit selon vos retours.", + "app.components.HomePage.welcomeBlock.content.issues": "issues", + "app.components.HomePage.welcomeBlock.content.raise": " ou soumetez des ", "app.components.ImgPreview.hint": "Drag & drop dans cette zone ou {browse} un fichier à télécharger", "app.components.ImgPreview.hint.browse": "recherchez", - "app.components.InputFile.newFile": "Ajouter un nouveau fichier", - "app.components.InputFileDetails.remove": "Supprimer ce fichier", "app.components.InputFileDetails.open": "Ouvrir dans une nouvelle fenêtre", "app.components.InputFileDetails.originalName": "Nom d'origine:", + "app.components.InputFileDetails.remove": "Supprimer ce fichier", "app.components.InputFileDetails.size": "Taille:", - - "app.components.InstallPluginPage.helmet": "Marketplace - Plugins", - "app.components.InstallPluginPage.title": "Marketplace - Plugins", - "app.components.InstallPluginPage.description": "Améliorez votre app sans efforts", - "app.components.InstallPluginPage.plugin.support-us.description": "Soutenez-nous en achetant un Strapi tee shirt. Cela nous aidera a continuer de travailler sur le projet pour vous donner la meilleure expérience possible!", "app.components.InstallPluginPage.InputSearch.label": " ", "app.components.InstallPluginPage.InputSearch.placeholder": "Recherchez un plugin... (ex: authentification)", + "app.components.InstallPluginPage.description": "Améliorez votre app sans efforts", + "app.components.InstallPluginPage.helmet": "Marketplace - Plugins", + "app.components.InstallPluginPage.plugin.support-us.description": "Soutenez-nous en achetant un Strapi tee shirt. Cela nous aidera a continuer de travailler sur le projet pour vous donner la meilleure expérience possible!", + "app.components.InstallPluginPage.title": "Marketplace - Plugins", "app.components.InstallPluginPopup.downloads": "téléchargements", - "app.components.InstallPluginPopup.navLink.description": "Description", - "app.components.InstallPluginPopup.navLink.screenshots": "Screenshots", "app.components.InstallPluginPopup.navLink.avis": "avis", - "app.components.InstallPluginPopup.navLink.faq": "faq", "app.components.InstallPluginPopup.navLink.changelog": "changelog", + "app.components.InstallPluginPopup.navLink.description": "Description", + "app.components.InstallPluginPopup.navLink.faq": "faq", + "app.components.InstallPluginPopup.navLink.screenshots": "Screenshots", "app.components.InstallPluginPopup.noDescription": "Aucune description disponible", - "app.components.LeftMenuFooter.poweredBy": "Propulsé par ", "app.components.LeftMenuLinkContainer.configuration": "Configurations", "app.components.LeftMenuLinkContainer.general": "Général", @@ -64,103 +73,69 @@ "app.components.LeftMenuLinkContainer.listPlugins": "Plugins", "app.components.LeftMenuLinkContainer.noPluginsInstalled": "Aucun plugin installé", "app.components.LeftMenuLinkContainer.plugins": "Plugins", - + "app.components.ListPluginsPage.description": "Liste des plugins installés dans le projet.", "app.components.ListPluginsPage.helmet.title": "List plugins", "app.components.ListPluginsPage.title": "Plugins", - "app.components.ListPluginsPage.description": "Liste des plugins installés dans le projet.", - "app.components.listPluginsPage.deletePlugin.error": "Une erreur est survenue pendant la désintallation", - "app.components.listPlugins.title.singular": "{number} est disponible", - "app.components.listPlugins.title.plural": "{number} sont disponibles", - "app.components.listPlugins.title.none": "Aucun plugin n'est installé", - "app.components.listPlugins.button": "Ajouter un Nouveau Plugin", - - "app.components.NotFoundPage.description": "Page introuvable", "app.components.NotFoundPage.back": "Retourner à la page d'accueil", - + "app.components.NotFoundPage.description": "Page introuvable", "app.components.Official": "Officiel", - - "app.components.PluginCard.compatible": "Compatble avec votre app", - "app.components.PluginCard.compatibleCommunity": "Compatble avec la communauté", "app.components.PluginCard.Button.label.download": "Télécharger", "app.components.PluginCard.Button.label.install": "Déjà installé", "app.components.PluginCard.Button.label.support": "Nous soutenir", - "app.components.PluginCard.price.free": "Gratuit", + "app.components.PluginCard.compatible": "Compatble avec votre app", + "app.components.PluginCard.compatibleCommunity": "Compatble avec la communauté", "app.components.PluginCard.more-details": "Plus de détails", - - "app.utils.placeholder.defaultMessage": "\u0020", - "app.utils.SelectOption.defaultMessage": "\u0020", - "app.utils.defaultMessage": "\u0020", - - "components.AutoReloadBlocker.header": "L'autoReload doit être activé pour ce plugin.", + "app.components.PluginCard.price.free": "Gratuit", + "app.components.listPlugins.button": "Ajouter un Nouveau Plugin", + "app.components.listPlugins.title.none": "Aucun plugin n'est installé", + "app.components.listPlugins.title.plural": "{number} sont disponibles", + "app.components.listPlugins.title.singular": "{number} est disponible", + "app.components.listPluginsPage.deletePlugin.error": "Une erreur est survenue pendant la désintallation", + "app.utils.SelectOption.defaultMessage": " ", + "app.utils.defaultMessage": " ", + "app.utils.placeholder.defaultMessage": " ", "components.AutoReloadBlocker.description": "Ouvrez le fichier suivant pour activer cette fonctionnalité.", - - "components.OverlayBlocker.title": "Le serveur est en train de redémarrer", - "components.OverlayBlocker.description": "Vous utilisez une fonctionnalité qui nécessite le redémarrage du server. Merci d'attendre que celui-ci ait redémarré.", - + "components.AutoReloadBlocker.header": "L'autoReload doit être activé pour ce plugin.", "components.ErrorBoundary.title": "Une erreur est survenue...", - - "components.PageFooter.select": "entrées par page", - - "components.ProductionBlocker.header": "Ce plugin est disponible uniquement en développement.", - "components.ProductionBlocker.description": "Pour des raisons de sécurité il est désactivé dans les autres environnements.", - - "components.popUpWarning.button.cancel": "Annuler", - "components.popUpWarning.button.confirm": "Confirmer", - "components.popUpWarning.title": "Merci de confirmer", - "components.popUpWarning.message": "Etes-vous sure de vouloir le supprimer?", - - "components.Input.error.validation.email": "Le format n'est pas de type email", - "components.Input.error.validation.required": "Ce champ est obligatoire.", - "components.Input.error.validation.regex": "La valeur ne correspond pas au format attendu.", - "components.Input.error.validation.max": "La valeur est trop grande.", - "components.Input.error.validation.min": "La valeur est trop basse.", - "components.Input.error.validation.maxLength": "La valeur est trop longue.", - "components.Input.error.validation.minLength": "La valeur est trop courte.", - "components.Input.error.contentTypeName.taken": "Ce nom existe déjà", - "components.Input.error.attribute.taken": "Ce champ existe déjà", "components.Input.error.attribute.key.taken": "Cette valeur existe déjà", "components.Input.error.attribute.sameKeyAndName": "Ne peuvent pas être égaux", - "components.Input.error.validation.minSupMax": "Ne peut pas être plus grand", + "components.Input.error.attribute.taken": "Ce champ existe déjà", + "components.Input.error.contentTypeName.taken": "Ce nom existe déjà", "components.Input.error.custom-error": "{errorMessage} ", + "components.Input.error.validation.email": "Le format n'est pas de type email", "components.Input.error.validation.json": "Le format JSON n'est pas respecté", - + "components.Input.error.validation.max": "La valeur est trop grande.", + "components.Input.error.validation.maxLength": "La valeur est trop longue.", + "components.Input.error.validation.min": "La valeur est trop basse.", + "components.Input.error.validation.minLength": "La valeur est trop courte.", + "components.Input.error.validation.minSupMax": "Ne peut pas être plus grand", + "components.Input.error.validation.regex": "La valeur ne correspond pas au format attendu.", + "components.Input.error.validation.required": "Ce champ est obligatoire.", "components.ListRow.empty": "Il n'y a pas de données à afficher.", - + "components.OverlayBlocker.description": "Vous utilisez une fonctionnalité qui nécessite le redémarrage du server. Merci d'attendre que celui-ci ait redémarré.", + "components.OverlayBlocker.title": "Le serveur est en train de redémarrer", + "components.PageFooter.select": "entrées par page", + "components.ProductionBlocker.description": "Pour des raisons de sécurité il est désactivé dans les autres environnements.", + "components.ProductionBlocker.header": "Ce plugin est disponible uniquement en développement.", + "components.Wysiwyg.ToggleMode.markdown": "Retour au markdown", + "components.Wysiwyg.ToggleMode.preview": "Voir la preview", "components.Wysiwyg.collapse": "Fermer", - "components.Wysiwyg.selectOptions.title": "Ajouter un titre", "components.Wysiwyg.selectOptions.H1": "Titre H1", "components.Wysiwyg.selectOptions.H2": "Titre H2", "components.Wysiwyg.selectOptions.H3": "Titre H3", "components.Wysiwyg.selectOptions.H4": "Titre H4", "components.Wysiwyg.selectOptions.H5": "Titre H5", "components.Wysiwyg.selectOptions.H6": "Titre H6", - "components.Wysiwyg.ToggleMode.markdown": "Retour au markdown", - "components.Wysiwyg.ToggleMode.preview": "Voir la preview", + "components.Wysiwyg.selectOptions.title": "Ajouter un titre", "components.WysiwygBottomControls.charactersIndicators": "charactères", + "components.WysiwygBottomControls.fullscreen": "Plein écran", "components.WysiwygBottomControls.uploadFiles": "Ajouter des fichiers en les 'droppant', {browse}, ou en les collant depuis le presse-papier", "components.WysiwygBottomControls.uploadFiles.browse": "en les selectionnant", - "components.WysiwygBottomControls.fullscreen": "Plein écran", - - "HomePage.notification.newsLetter.success": "Vous avez souscrit à la newsletter", - + "components.popUpWarning.button.cancel": "Annuler", + "components.popUpWarning.button.confirm": "Confirmer", + "components.popUpWarning.message": "Etes-vous sure de vouloir le supprimer?", + "components.popUpWarning.title": "Merci de confirmer", "notification.error": "Une erreur est survenue", "notification.error.layout": "Impossible de récupérer le layout de l'admin", - - "Analytics": "Statistiques", - "Auth & Permissions": "Auth & Permissions", - "Content Manager": "Content Manager", - "Content Type Builder": "Content Type Builder", - "Files Upload": "Téléversement de fichiers", - "Settings Manager": "Settings Manager", - "Email": "Email", - "Password": "Mot de passe", - "Username": "Nom d'utilisateur", - "Users": "Utilisateurs", - "Users & Permissions": "Utilisateurs et autorisations", - "Provider": "Provider", - "ResetPasswordToken": "ResetPasswordToken", - "Role": "Rôle", - "Roles & Permissions": "Rôles et autorisations", - "New entry": "Nouvelle entrée", "request.error.model.unknown": "Le model n'existe pas" -} +} \ No newline at end of file diff --git a/packages/strapi-admin/admin/src/translations/it.json b/packages/strapi-admin/admin/src/translations/it.json index b2fbabb75f..fde596172f 100644 --- a/packages/strapi-admin/admin/src/translations/it.json +++ b/packages/strapi-admin/admin/src/translations/it.json @@ -1,52 +1,68 @@ { - "app.components.Button.save": "Salva", + "Analytics": "Analytics", + "Content Manager": "Gestione Contenuti", + "Content Type Builder": "Generatore di Tipo Contenuti", + "Email": "Email", + "Files Upload": "Caricamento Files", + "HomePage.notification.newsLetter.success": "Iscritto con successo alla newsletter", + "New entry": "Nuovo elemento", + "Password": "Password", + "Provider": "Provider", + "ResetPasswordToken": "Reimposta Token Password", + "Role": "Ruolo", + "Roles & Permissions": "Ruoli e Permessi", + "Settings Manager": "Gestione Impostazioni", + "Username": "Username", + "Users": "Utenti", + "Users & Permissions": "Utenti & Permessi", + "app.components.BlockLink.code": "Esempi di codice", + "app.components.BlockLink.code.content": "Impara testando progetti reali sviluppati dalla comunità.", + "app.components.BlockLink.documentation": "Leggi la documentazione", + "app.components.BlockLink.documentation.content": "Scopri concetti, guide di riferimento ed esercitazioni.", "app.components.Button.cancel": "Annulla", + "app.components.Button.save": "Salva", "app.components.ComingSoonPage.comingSoon": "In arrivo", "app.components.ComingSoonPage.featuresNotAvailable": "Questa funzionalità è ancora sotto sviluppo attivo.", "app.components.DownloadInfo.download": "Download in corso...", "app.components.DownloadInfo.text": "Potrebbe volerci un minuto. Grazie della pazienza.", - "app.components.HomePage.welcome": "Benvenuto a bordo!", - "app.components.HomePage.welcome.again": "Benvenuto ", - "app.components.HomePage.cta": "CONFERMA", + "app.components.HomePage.button.blog": "LEGGI DI PIÙ SUL BLOG", + "app.components.HomePage.button.quickStart": "INIZIA IL TUTORIAL QUICK START", "app.components.HomePage.community": "Trova la community sul web", - "app.components.HomePage.newsLetter": "Iscriviti alla newsletter per tenerti in contatto con Strapi", "app.components.HomePage.community.content": "Discuti con i membri del team, i contributori e gli sviluppatori tramite diversi canali.", "app.components.HomePage.create": "Crea il tuo primo Tipo Di Contenuto", + "app.components.HomePage.createBlock.content.first": "Il ", + "app.components.HomePage.createBlock.content.second": " è un plugin che ti aiuterà a definire la struttura dati dei tuoi modelli. Se sei nuovo qui, ti consigliamo vivamente di seguire il nostro ", + "app.components.HomePage.createBlock.content.tutorial": " tutorial.", + "app.components.HomePage.cta": "CONFERMA", + "app.components.HomePage.newsLetter": "Iscriviti alla newsletter per tenerti in contatto con Strapi", + "app.components.HomePage.support": "SUPPORTACI", + "app.components.HomePage.support.content": "Comprando la T-shirt, ci permetti di continuare a lavorare sul progetto per darti l'esperienza migliore possibile!", + "app.components.HomePage.support.link": "OTTIENI LA TUA T-SHIRT ORA", + "app.components.HomePage.welcome": "Benvenuto a bordo!", + "app.components.HomePage.welcome.again": "Benvenuto ", "app.components.HomePage.welcomeBlock.content": "Siamo felici di averti come membro della comunità. Siamo costantemente alla ricerca di feedback, quindi sentitevi liberi di inviarci messaggi diretti su ", "app.components.HomePage.welcomeBlock.content.again": "Speriamo che tu stia facendo progressi sul tuo progetto ... Sentiti libero di leggere l'ultima novità riguardo Strapi. Stiamo dando il massimo per migliorare il prodotto in base al tuo feedback.", "app.components.HomePage.welcomeBlock.content.issues": "problemi.", "app.components.HomePage.welcomeBlock.content.raise": " o solleva ", - "app.components.HomePage.createBlock.content.first": "Il ", - "app.components.HomePage.createBlock.content.second": " è un plugin che ti aiuterà a definire la struttura dati dei tuoi modelli. Se sei nuovo qui, ti consigliamo vivamente di seguire il nostro ", - "app.components.HomePage.createBlock.content.tutorial": " tutorial.", - "app.components.HomePage.button.quickStart": "INIZIA IL TUTORIAL QUICK START", - "app.components.HomePage.button.blog": "LEGGI DI PIÙ SUL BLOG", - "app.components.HomePage.support": "SUPPORTACI", - "app.components.HomePage.support.content": "Comprando la T-shirt, ci permetti di continuare a lavorare sul progetto per darti l'esperienza migliore possibile!", - "app.components.HomePage.support.link": "OTTIENI LA TUA T-SHIRT ORA", - "app.components.BlockLink.documentation": "Leggi la documentazione", - "app.components.BlockLink.documentation.content": "Scopri concetti, guide di riferimento ed esercitazioni.", - "app.components.BlockLink.code": "Esempi di codice", - "app.components.BlockLink.code.content": "Impara testando progetti reali sviluppati dalla comunità.", - "app.components.InputFile.newFile": "Aggiungi nuovo file", - "app.components.InputFileDetails.open": "Apri in una nuova tab", - "app.components.InputFileDetails.remove": "Rimuovi questo file", - "app.components.InputFileDetails.originalName": "Nome originale:", - "app.components.InputFileDetails.size": "Dimensione:", "app.components.ImgPreview.hint": "Trascina il tuo file in quest'area o {browse} un file da caricare.", "app.components.ImgPreview.hint.browse": "cerca", - "app.components.InstallPluginPage.helmet": "Marketplace - Plugins", - "app.components.InstallPluginPage.title": "Marketplace - Plugins", - "app.components.InstallPluginPage.description": "Estendi la tua app senza sforzi.", - "app.components.InstallPluginPage.plugin.support-us.description": "Supportaci comprando la T-Shirt di Strapi. Questo ci permetterà di continuare a lavorare sul progetto e darti la migliore esperienza possibile!", + "app.components.InputFile.newFile": "Aggiungi nuovo file", + "app.components.InputFileDetails.open": "Apri in una nuova tab", + "app.components.InputFileDetails.originalName": "Nome originale:", + "app.components.InputFileDetails.remove": "Rimuovi questo file", + "app.components.InputFileDetails.size": "Dimensione:", "app.components.InstallPluginPage.InputSearch.label": " ", "app.components.InstallPluginPage.InputSearch.placeholder": "Cerca un plugin... (es: authentication)", + "app.components.InstallPluginPage.description": "Estendi la tua app senza sforzi.", + "app.components.InstallPluginPage.helmet": "Marketplace - Plugins", + "app.components.InstallPluginPage.plugin.support-us.description": "Supportaci comprando la T-Shirt di Strapi. Questo ci permetterà di continuare a lavorare sul progetto e darti la migliore esperienza possibile!", + "app.components.InstallPluginPage.title": "Marketplace - Plugins", "app.components.InstallPluginPopup.downloads": "download", - "app.components.InstallPluginPopup.navLink.description": "Descrizione", - "app.components.InstallPluginPopup.navLink.screenshots": "Screenshots", "app.components.InstallPluginPopup.navLink.avis": "avis", - "app.components.InstallPluginPopup.navLink.faq": "faq", "app.components.InstallPluginPopup.navLink.changelog": "changelog", + "app.components.InstallPluginPopup.navLink.description": "Descrizione", + "app.components.InstallPluginPopup.navLink.faq": "faq", + "app.components.InstallPluginPopup.navLink.screenshots": "Screenshots", "app.components.InstallPluginPopup.noDescription": "Nessuna descrizione disponibile", "app.components.LeftMenuFooter.poweredBy": "Offerto da ", "app.components.LeftMenuLinkContainer.configuration": "Configurazioni", @@ -55,86 +71,70 @@ "app.components.LeftMenuLinkContainer.listPlugins": "Plugins", "app.components.LeftMenuLinkContainer.noPluginsInstalled": "Nessun plugin ancora installato", "app.components.LeftMenuLinkContainer.plugins": "Plugins", + "app.components.ListPluginsPage.description": "Lista dei plugin installati nel progetto.", "app.components.ListPluginsPage.helmet.title": "Lista plugin", "app.components.ListPluginsPage.title": "Plugins", - "app.components.ListPluginsPage.description": "Lista dei plugin installati nel progetto.", - "app.components.listPluginsPage.deletePlugin.error": "Si è verificato un errore durante l'installazione del plugin", - "app.components.listPlugins.title.singular": "{number} plugin installato", - "app.components.listPlugins.title.plural": "{number} plugin installati", - "app.components.listPlugins.title.none": "Nessun plugin installato", - "app.components.listPlugins.button": "Aggiungi Nuovo Plugin", - "app.components.NotFoundPage.description": "Non trovato", "app.components.NotFoundPage.back": "Torna alla home", + "app.components.NotFoundPage.description": "Non trovato", "app.components.Official": "Ufficiale", - "app.components.PluginCard.compatible": "Compatibile con la tua app", - "app.components.PluginCard.compatibleCommunity": "Compatibile con la comunità", "app.components.PluginCard.Button.label.download": "Download", "app.components.PluginCard.Button.label.install": "Già installato", "app.components.PluginCard.Button.label.support": "Supportaci", - "app.components.PluginCard.price.free": "Gratis", + "app.components.PluginCard.compatible": "Compatibile con la tua app", + "app.components.PluginCard.compatibleCommunity": "Compatibile con la comunità", "app.components.PluginCard.more-details": "Più dettagli", - "app.utils.placeholder.defaultMessage": " ", + "app.components.PluginCard.price.free": "Gratis", + "app.components.listPlugins.button": "Aggiungi Nuovo Plugin", + "app.components.listPlugins.title.none": "Nessun plugin installato", + "app.components.listPlugins.title.plural": "{number} plugin installati", + "app.components.listPlugins.title.singular": "{number} plugin installato", + "app.components.listPluginsPage.deletePlugin.error": "Si è verificato un errore durante l'installazione del plugin", "app.utils.SelectOption.defaultMessage": " ", "app.utils.defaultMessage": " ", - "components.AutoReloadBlocker.header": "Ricarica funzionalità è richiesto per questo plugin.", + "app.utils.placeholder.defaultMessage": " ", "components.AutoReloadBlocker.description": "Apri il seguente file e abilita la funzione.", + "components.AutoReloadBlocker.header": "Ricarica funzionalità è richiesto per questo plugin.", "components.ErrorBoundary.title": "Qualcosa è andato storto...", - "components.OverlayBlocker.title": "Attendendo il riavvio...", - "components.OverlayBlocker.description": "Stai utilizzando una funzionalità che necessita del riavvio del server. Per favore, attendi che il server ritorni attivo.", - "components.PageFooter.select": "elementi per pagina", - "components.ProductionBlocker.header": "Questo plugin è disponibile solo in sviluppo.", - "components.ProductionBlocker.description": "Per ragioni di sicurezza dobbiamo disabilitare questo plugin in altri ambienti.", - "components.popUpWarning.button.cancel": "Annulla", - "components.popUpWarning.button.confirm": "Conferma", - "components.popUpWarning.title": "Per favore conferma", - "components.popUpWarning.message": "Sei sicuro di volerlo cancellare?", - "components.Input.error.validation.email": "Non è un'email", - "components.Input.error.validation.json" : "Formato JSON non corrispondente", - "components.Input.error.validation.required": "Valore obbligatorio.", - "components.Input.error.validation.regex": "Questo valore non coincide con il regex.", - "components.Input.error.validation.max": "Valore troppo alto.", - "components.Input.error.validation.min": "Valore troppo basso.", - "components.Input.error.validation.maxLength": "Valore troppo lungo.", - "components.Input.error.validation.minLength": "Valore troppo corto.", - "components.Input.error.contentTypeName.taken": "Nome già esistente", - "components.Input.error.attribute.taken": "Nome campo già esistente", "components.Input.error.attribute.key.taken": "Valore già esistente", "components.Input.error.attribute.sameKeyAndName": "Non può essere uguale", - "components.Input.error.validation.minSupMax": "Non può essere superiore a", + "components.Input.error.attribute.taken": "Nome campo già esistente", + "components.Input.error.contentTypeName.taken": "Nome già esistente", "components.Input.error.custom-error": "{errorMessage} ", + "components.Input.error.validation.email": "Non è un'email", + "components.Input.error.validation.json": "Formato JSON non corrispondente", + "components.Input.error.validation.max": "Valore troppo alto.", + "components.Input.error.validation.maxLength": "Valore troppo lungo.", + "components.Input.error.validation.min": "Valore troppo basso.", + "components.Input.error.validation.minLength": "Valore troppo corto.", + "components.Input.error.validation.minSupMax": "Non può essere superiore a", + "components.Input.error.validation.regex": "Questo valore non coincide con il regex.", + "components.Input.error.validation.required": "Valore obbligatorio.", "components.ListRow.empty": "Non ci sono dati da mostrare.", + "components.OverlayBlocker.description": "Stai utilizzando una funzionalità che necessita del riavvio del server. Per favore, attendi che il server ritorni attivo.", + "components.OverlayBlocker.title": "Attendendo il riavvio...", + "components.PageFooter.select": "elementi per pagina", + "components.ProductionBlocker.description": "Per ragioni di sicurezza dobbiamo disabilitare questo plugin in altri ambienti.", + "components.ProductionBlocker.header": "Questo plugin è disponibile solo in sviluppo.", + "components.Wysiwyg.ToggleMode.markdown": "Passa a Markdown", + "components.Wysiwyg.ToggleMode.preview": "Passa a Anteprima", "components.Wysiwyg.collapse": "Chiudi", - "components.Wysiwyg.selectOptions.title": "Aggiungi un titolo", "components.Wysiwyg.selectOptions.H1": "Titolo H1", "components.Wysiwyg.selectOptions.H2": "Titolo H2", "components.Wysiwyg.selectOptions.H3": "Titolo H3", "components.Wysiwyg.selectOptions.H4": "Titolo H4", "components.Wysiwyg.selectOptions.H5": "Titolo H5", "components.Wysiwyg.selectOptions.H6": "Titolo H6", - "components.Wysiwyg.ToggleMode.markdown": "Passa a Markdown", - "components.Wysiwyg.ToggleMode.preview": "Passa a Anteprima", + "components.Wysiwyg.selectOptions.title": "Aggiungi un titolo", "components.WysiwygBottomControls.charactersIndicators": "lettere", + "components.WysiwygBottomControls.fullscreen": "Espandi", "components.WysiwygBottomControls.uploadFiles": "Trascina file, incolla dagli appunti o {browse}.", "components.WysiwygBottomControls.uploadFiles.browse": "selezionali", - "components.WysiwygBottomControls.fullscreen": "Espandi", - "HomePage.notification.newsLetter.success": "Iscritto con successo alla newsletter", + "components.popUpWarning.button.cancel": "Annulla", + "components.popUpWarning.button.confirm": "Conferma", + "components.popUpWarning.message": "Sei sicuro di volerlo cancellare?", + "components.popUpWarning.title": "Per favore conferma", "notification.error": "Si è verificato un errore", "notification.error.layout": "Non è stato possibile recuperare il layout", - "request.error.model.unknown" : "Questo modello non esiste", - "Users & Permissions": "Utenti & Permessi", - "Content Manager": "Gestione Contenuti", - "Content Type Builder": "Generatore di Tipo Contenuti", - "Settings Manager": "Gestione Impostazioni", - "Email": "Email", - "Files Upload" : "Caricamento Files", - "Password": "Password", - "Username": "Username", - "Provider": "Provider", - "ResetPasswordToken": "Reimposta Token Password", - "Role": "Ruolo", - "Roles & Permissions" : "Ruoli e Permessi", - "New entry": "Nuovo elemento", "request.error.model.unknow": "Questo modello non esiste", - "Users": "Utenti", - "Analytics": "Analytics" -} + "request.error.model.unknown": "Questo modello non esiste" +} \ No newline at end of file diff --git a/packages/strapi-admin/admin/src/translations/ko.json b/packages/strapi-admin/admin/src/translations/ko.json index f38ae8f19d..50f7c3321b 100644 --- a/packages/strapi-admin/admin/src/translations/ko.json +++ b/packages/strapi-admin/admin/src/translations/ko.json @@ -1,62 +1,69 @@ { - "app.components.Button.save": "저장", + "Analytics": "통계", + "Content Manager": "콘텐츠 관리", + "Content Type Builder": "콘텐츠 타입 빌더", + "Email": "이메일", + "Files Upload": "파일 업로드", + "HomePage.notification.newsLetter.success": "뉴스레터 구독을 완료했습니다.", + "New entry": "새 항목", + "Password": "패스워드", + "Provider": "프로바이더(provider)", + "ResetPasswordToken": "패스워트 토큰 재설정", + "Role": "역할", + "Roles & Permissions": "역할(roles) & 권한(permissions)", + "Settings Manager": "설정 관리", + "Username": "사용자 이름(Username)", + "Users": "User", + "Users & Permissions": "사용자 & 권한(permissions)", + "app.components.BlockLink.code": "코드 샘플", + "app.components.BlockLink.code.content": "실제 개발된 프로젝트를 테스팅해보고 코드를 확인해 보세요.", + "app.components.BlockLink.documentation": "도큐먼트 바로가기", + "app.components.BlockLink.documentation.content": "컨셉, 레퍼런드, 가이드나 튜토리얼을 확인해 보세요.", "app.components.Button.cancel": "취소", - + "app.components.Button.save": "저장", "app.components.ComingSoonPage.comingSoon": "Coming soon", "app.components.ComingSoonPage.featuresNotAvailable": "아직 개발 중인 기능입니다.", - "app.components.DownloadInfo.download": "다운로드 중...", "app.components.DownloadInfo.text": "조금만 기다려 주세요.", - - "app.components.HomePage.welcome": "환영합니다!", - "app.components.HomePage.welcome.again": "반갑습니다. ", - "app.components.HomePage.cta": "확인", + "app.components.HomePage.button.blog": "블로그 보기", + "app.components.HomePage.button.quickStart": "퀵 스타트 튜토리얼 바로가기", "app.components.HomePage.community": "커뮤니티를 찾아보세요!", - "app.components.HomePage.newsLetter": "strapi 뉴스레터 구독", "app.components.HomePage.community.content": "strapi 팀원들과 의견을 교환하세요. 참여자 채널과 개발자 채널을 확인하세요.", "app.components.HomePage.create": "첫번째 콘텐츠 만들기", - "app.components.HomePage.welcomeBlock.content": "strapi를 사용해 주셔서 감사합니다. 불편한 점은 메일, slack 혹은 github issue 등을 통해 알려주세요.\u0020", - "app.components.HomePage.welcomeBlock.content.again": "프로젝트 진행상황을 확인하세요. 최신 strapi에 대한 정보를 언제든지 자유롭게 읽을 수 있습니다. 우리는 여러분의 의견에 귀 기울이고 제품을 개선하기 위해 최선을 다하고 있습니다.", - "app.components.HomePage.welcomeBlock.content.issues": "이슈", - "app.components.HomePage.welcomeBlock.content.raise": ",\u0020", - "app.components.HomePage.createBlock.content.first": "이\u0020", - "app.components.HomePage.createBlock.content.second": "\u0020플러그인은 모델의 데이터 구조 정의를 도와줍니다. strapi를 처음 접했다면 튜토리얼을 통해 사용법을 알아보세요.\u0020", - "app.components.HomePage.createBlock.content.tutorial": "\u0020", - "app.components.HomePage.button.quickStart": "퀵 스타트 튜토리얼 바로가기", - "app.components.HomePage.button.blog": "블로그 보기", + "app.components.HomePage.createBlock.content.first": "이 ", + "app.components.HomePage.createBlock.content.second": " 플러그인은 모델의 데이터 구조 정의를 도와줍니다. strapi를 처음 접했다면 튜토리얼을 통해 사용법을 알아보세요. ", + "app.components.HomePage.createBlock.content.tutorial": " ", + "app.components.HomePage.cta": "확인", + "app.components.HomePage.newsLetter": "strapi 뉴스레터 구독", "app.components.HomePage.support": "SUPPORT US", "app.components.HomePage.support.content": "티셔츠를 구매하세요! 이를 통해 우리는 여러분에게 최고의 경험을 주기 위한 프로젝트 개발에 전념할 수 있습니다.", "app.components.HomePage.support.link": "지금 바로 구매하기", - - "app.components.BlockLink.documentation": "도큐먼트 바로가기", - "app.components.BlockLink.documentation.content": "컨셉, 레퍼런드, 가이드나 튜토리얼을 확인해 보세요.", - "app.components.BlockLink.code": "코드 샘플", - "app.components.BlockLink.code.content": "실제 개발된 프로젝트를 테스팅해보고 코드를 확인해 보세요.", - - - "app.components.InputFile.newFile": "파일 추가", - "app.components.InputFileDetails.open": "새 탭으로 열기", - "app.components.InputFileDetails.remove": "파일 삭제", - "app.components.InputFileDetails.originalName": "원래 파일 이름:", - "app.components.InputFileDetails.size": "크기:", - + "app.components.HomePage.welcome": "환영합니다!", + "app.components.HomePage.welcome.again": "반갑습니다. ", + "app.components.HomePage.welcomeBlock.content": "strapi를 사용해 주셔서 감사합니다. 불편한 점은 메일, slack 혹은 github issue 등을 통해 알려주세요. ", + "app.components.HomePage.welcomeBlock.content.again": "프로젝트 진행상황을 확인하세요. 최신 strapi에 대한 정보를 언제든지 자유롭게 읽을 수 있습니다. 우리는 여러분의 의견에 귀 기울이고 제품을 개선하기 위해 최선을 다하고 있습니다.", + "app.components.HomePage.welcomeBlock.content.issues": "이슈", + "app.components.HomePage.welcomeBlock.content.raise": ", ", "app.components.ImgPreview.hint": "파일을 끌어 놓거나 {browse} 하세요.", "app.components.ImgPreview.hint.browse": "선택", - - "app.components.InstallPluginPage.helmet": "마켓플레이스 - 플러그인", - "app.components.InstallPluginPage.title": "마켓플레이스 - 플러그인", - "app.components.InstallPluginPage.description": "빠르고 간단하게 기능을 확장해 보세요.", - "app.components.InstallPluginPage.plugin.support-us.description": "티셔츠를 구매하세요! 이를 통해 우리는 여러분에게 최고의 경험을 주기 위한 프로젝트 개발에 전념할 수 있습니다.", + "app.components.InputFile.newFile": "파일 추가", + "app.components.InputFileDetails.open": "새 탭으로 열기", + "app.components.InputFileDetails.originalName": "원래 파일 이름:", + "app.components.InputFileDetails.remove": "파일 삭제", + "app.components.InputFileDetails.size": "크기:", "app.components.InstallPluginPage.InputSearch.label": " ", "app.components.InstallPluginPage.InputSearch.placeholder": "플러그인 검색 중... (예: authentication)", + "app.components.InstallPluginPage.description": "빠르고 간단하게 기능을 확장해 보세요.", + "app.components.InstallPluginPage.helmet": "마켓플레이스 - 플러그인", + "app.components.InstallPluginPage.plugin.support-us.description": "티셔츠를 구매하세요! 이를 통해 우리는 여러분에게 최고의 경험을 주기 위한 프로젝트 개발에 전념할 수 있습니다.", + "app.components.InstallPluginPage.title": "마켓플레이스 - 플러그인", "app.components.InstallPluginPopup.downloads": "다운로드", - "app.components.InstallPluginPopup.navLink.description": "설명", - "app.components.InstallPluginPopup.navLink.screenshots": "스크린샷", "app.components.InstallPluginPopup.navLink.avis": "avis", - "app.components.InstallPluginPopup.navLink.faq": "FAQ", "app.components.InstallPluginPopup.navLink.changelog": "변경사항", + "app.components.InstallPluginPopup.navLink.description": "설명", + "app.components.InstallPluginPopup.navLink.faq": "FAQ", + "app.components.InstallPluginPopup.navLink.screenshots": "스크린샷", "app.components.InstallPluginPopup.noDescription": "상세 설명 없음", - "app.components.LeftMenuFooter.poweredBy": "Powered by ", "app.components.LeftMenuLinkContainer.configuration": "환경설정", "app.components.LeftMenuLinkContainer.general": "General", @@ -64,102 +71,69 @@ "app.components.LeftMenuLinkContainer.listPlugins": "플러그인", "app.components.LeftMenuLinkContainer.noPluginsInstalled": "설치된 플러그인이 없습니다.", "app.components.LeftMenuLinkContainer.plugins": "Plugins", - + "app.components.ListPluginsPage.description": "이 프로젝트에 설치된 플러그인 목록입니다.", "app.components.ListPluginsPage.helmet.title": "플러그인 목록", "app.components.ListPluginsPage.title": "플러그인", - "app.components.ListPluginsPage.description": "이 프로젝트에 설치된 플러그인 목록입니다.", - "app.components.listPluginsPage.deletePlugin.error": "플러그인을 제거하는데 에러가 발생했습니다.", - "app.components.listPlugins.title.singular": "{number}개의 플러그인이 설치됐습니다.", - "app.components.listPlugins.title.plural": "{number}개의 플러그인이 설치됐습니다.", - "app.components.listPlugins.title.none": "설치된 플러그인이 없습니다.", - "app.components.listPlugins.button": "새로운 플러그인 추가하기", - - "app.components.NotFoundPage.description": "찾을 수 없는 페이지입니다.", "app.components.NotFoundPage.back": "홈으로 돌아가기", - + "app.components.NotFoundPage.description": "찾을 수 없는 페이지입니다.", "app.components.Official": "공식", - - "app.components.PluginCard.compatible": "이 애플리케이션에 호환됩니다.", - "app.components.PluginCard.compatibleCommunity": "션뮤니티에 호환됩니다.", "app.components.PluginCard.Button.label.download": "다운로드", "app.components.PluginCard.Button.label.install": "설치됨", "app.components.PluginCard.Button.label.support": "도움 필요", - "app.components.PluginCard.price.free": "무료", + "app.components.PluginCard.compatible": "이 애플리케이션에 호환됩니다.", + "app.components.PluginCard.compatibleCommunity": "션뮤니티에 호환됩니다.", "app.components.PluginCard.more-details": "[더보기]", - - "app.utils.placeholder.defaultMessage": "\u0020", - "app.utils.SelectOption.defaultMessage": "\u0020", - "app.utils.defaultMessage": "\u0020", - - "components.AutoReloadBlocker.header": "이 플러그인은 리로드 기능이 필요합니다.", + "app.components.PluginCard.price.free": "무료", + "app.components.listPlugins.button": "새로운 플러그인 추가하기", + "app.components.listPlugins.title.none": "설치된 플러그인이 없습니다.", + "app.components.listPlugins.title.plural": "{number}개의 플러그인이 설치됐습니다.", + "app.components.listPlugins.title.singular": "{number}개의 플러그인이 설치됐습니다.", + "app.components.listPluginsPage.deletePlugin.error": "플러그인을 제거하는데 에러가 발생했습니다.", + "app.utils.SelectOption.defaultMessage": " ", + "app.utils.defaultMessage": " ", + "app.utils.placeholder.defaultMessage": " ", "components.AutoReloadBlocker.description": "다음 파일을 열고 이 기능을 사용하세요.", - + "components.AutoReloadBlocker.header": "이 플러그인은 리로드 기능이 필요합니다.", "components.ErrorBoundary.title": "에러가 발생했습니다.", - - "components.OverlayBlocker.title": "재시작하고 있습니다...", - "components.OverlayBlocker.description": "이 기능은 서버를 재시작해야 합니다. 서버가 시작될 때까지 잠시만 기다려주세요.", - - "components.PageFooter.select": "항목 수 / 페이지", - - "components.ProductionBlocker.header": "이 플러그인은 개발 모드에서만 사용할 수 있습니다.", - "components.ProductionBlocker.description": "이 플러그인은 안전을 위해 다른 환경에서 사용할 수 없습니다.", - - "components.popUpWarning.button.cancel": "취소", - "components.popUpWarning.button.confirm": "확인", - "components.popUpWarning.title": "확인", - "components.popUpWarning.message": "삭제하시겠습니까?", - - "components.Input.error.validation.email": "올바른 이메일 주소가 아닙니다.", - "components.Input.error.validation.required": "내용을 입력해 주세요.", - "components.Input.error.validation.regex": "입력한 내용이 형식에 맞지 않습니다.", - "components.Input.error.validation.max": "입력한 내용이 너무 큽니다.", - "components.Input.error.validation.min": "입력한 내용이 너무 작습니다.", - "components.Input.error.validation.maxLength": "입력한 내용이 너무 깁니다.", - "components.Input.error.validation.minLength": "입력한 내용이 너무 짧습니다.", - "components.Input.error.contentTypeName.taken": "이미 사용중인 이름입니다.", - "components.Input.error.attribute.taken": "이미 사용중인 이름입니다.", "components.Input.error.attribute.key.taken": "이미 사용중인 키입니다.", "components.Input.error.attribute.sameKeyAndName": "같은 값을 사용할 수 없습니다.", - "components.Input.error.validation.minSupMax": "이 보다 더 클 수 없습니다.", + "components.Input.error.attribute.taken": "이미 사용중인 이름입니다.", + "components.Input.error.contentTypeName.taken": "이미 사용중인 이름입니다.", "components.Input.error.custom-error": "{errorMessage} ", + "components.Input.error.validation.email": "올바른 이메일 주소가 아닙니다.", "components.Input.error.validation.json": "JSON 형식이 아닙니다.", - + "components.Input.error.validation.max": "입력한 내용이 너무 큽니다.", + "components.Input.error.validation.maxLength": "입력한 내용이 너무 깁니다.", + "components.Input.error.validation.min": "입력한 내용이 너무 작습니다.", + "components.Input.error.validation.minLength": "입력한 내용이 너무 짧습니다.", + "components.Input.error.validation.minSupMax": "이 보다 더 클 수 없습니다.", + "components.Input.error.validation.regex": "입력한 내용이 형식에 맞지 않습니다.", + "components.Input.error.validation.required": "내용을 입력해 주세요.", "components.ListRow.empty": "데이터가 없습니다.", - + "components.OverlayBlocker.description": "이 기능은 서버를 재시작해야 합니다. 서버가 시작될 때까지 잠시만 기다려주세요.", + "components.OverlayBlocker.title": "재시작하고 있습니다...", + "components.PageFooter.select": "항목 수 / 페이지", + "components.ProductionBlocker.description": "이 플러그인은 안전을 위해 다른 환경에서 사용할 수 없습니다.", + "components.ProductionBlocker.header": "이 플러그인은 개발 모드에서만 사용할 수 있습니다.", + "components.Wysiwyg.ToggleMode.markdown": "마크다운", + "components.Wysiwyg.ToggleMode.preview": "미리보기", "components.Wysiwyg.collapse": "병합", - "components.Wysiwyg.selectOptions.title": "제목", "components.Wysiwyg.selectOptions.H1": "제목 H1", "components.Wysiwyg.selectOptions.H2": "제목 H2", "components.Wysiwyg.selectOptions.H3": "제목 H3", "components.Wysiwyg.selectOptions.H4": "제목 H4", "components.Wysiwyg.selectOptions.H5": "제목 H5", "components.Wysiwyg.selectOptions.H6": "제목 H6", - "components.Wysiwyg.ToggleMode.markdown": "마크다운", - "components.Wysiwyg.ToggleMode.preview": "미리보기", + "components.Wysiwyg.selectOptions.title": "제목", "components.WysiwygBottomControls.charactersIndicators": "문자 표시기", + "components.WysiwygBottomControls.fullscreen": "전체화면", "components.WysiwygBottomControls.uploadFiles": "파일을 끌어 놓으세요. 혹은 클립보드에서 붙혀넣거나 {browse} 하세요.", "components.WysiwygBottomControls.uploadFiles.browse": "선택", - "components.WysiwygBottomControls.fullscreen": "전체화면", - - "HomePage.notification.newsLetter.success": "뉴스레터 구독을 완료했습니다.", - + "components.popUpWarning.button.cancel": "취소", + "components.popUpWarning.button.confirm": "확인", + "components.popUpWarning.message": "삭제하시겠습니까?", + "components.popUpWarning.title": "확인", "notification.error": "에러가 발생했습니다.", "notification.error.layout": "레이아웃을 가져올 수 없습니다.", - - "Users & Permissions": "사용자 & 권한(permissions)", - "Content Manager": "콘텐츠 관리", - "Content Type Builder": "콘텐츠 타입 빌더", - "Files Upload": "파일 업로드", - "Roles & Permissions": "역할(roles) & 권한(permissions)", - "Settings Manager": "설정 관리", - "Email": "이메일", - "Password": "패스워드", - "Username": "사용자 이름(Username)", - "Provider": "프로바이더(provider)", - "ResetPasswordToken": "패스워트 토큰 재설정", - "Role": "역할", - "New entry": "새 항목", - "request.error.model.unknown": "모델이 없습니다.", - "Users": "User", - "Analytics": "통계" -} + "request.error.model.unknown": "모델이 없습니다." +} \ No newline at end of file diff --git a/packages/strapi-admin/admin/src/translations/nl.json b/packages/strapi-admin/admin/src/translations/nl.json index 005d34dc4a..17aa71870b 100644 --- a/packages/strapi-admin/admin/src/translations/nl.json +++ b/packages/strapi-admin/admin/src/translations/nl.json @@ -1,62 +1,69 @@ { - "app.components.Button.save": "Opslaan", + "Analytics": "Analytics", + "Content Manager": "Inhoud Manager", + "Content Type Builder": "Content Type Bouwer", + "Email": "E-mail", + "Files Upload": "Bestand Upload", + "HomePage.notification.newsLetter.success": "Succesvol geabonneerd op de nieuwsbrief", + "New entry": "Nieuwe inzending", + "Password": "Wachtwoord", + "Provider": "Leverancier", + "ResetPasswordToken": "Wachtwoord Reset Token", + "Role": "Rol", + "Roles & Permissions": "Rollen & Permissies", + "Settings Manager": "Instellingen Manager", + "Username": "Gebruikersnaam", + "Users": "Gebruikers", + "Users & Permissions": "Gebruikers & Permissies", + "app.components.BlockLink.code": "Code voorbeelden", + "app.components.BlockLink.code.content": "Leer door echte projecten gemaakt door de community te testen", + "app.components.BlockLink.documentation": "Lees de documentatie", + "app.components.BlockLink.documentation.content": "Ontdek de concepten, referentie handleidingen en tutorials.", "app.components.Button.cancel": "Annuleren", - + "app.components.Button.save": "Opslaan", "app.components.ComingSoonPage.comingSoon": "Binnenkort beschikbaar", "app.components.ComingSoonPage.featuresNotAvailable": "Deze feature is nog in ontwikkeling", - "app.components.DownloadInfo.download": "Aan het downloaden...", "app.components.DownloadInfo.text": "Dit kan even duren. Bedankt voor je geduld.", - - "app.components.HomePage.welcome": "Welkom aan boord!", - "app.components.HomePage.welcome.again": "Welkom ", - "app.components.HomePage.cta": "AKKOORD", + "app.components.HomePage.button.blog": "LEES MEER OP DE BLOG", + "app.components.HomePage.button.quickStart": "START DE SNELLE START HANDLEIDING", "app.components.HomePage.community": "Vind de community op het web", - "app.components.HomePage.newsLetter": "Abonneer op de nieuwsbrief om contact te houden met Strapi", "app.components.HomePage.community.content": "Bespreek met teamleden, bijdragers en ontwikkelaars op verschillende kanalen.", "app.components.HomePage.create": "Creëer je eerste Content Type", - "app.components.HomePage.welcomeBlock.content": "We zijn blij met jou als community lid. Wij zijn constant op zoek naar feedback dus stuur gerust een DM op\u0020", - "app.components.HomePage.welcomeBlock.content.again": "We hopen dat je voortgang boekt met je project... Je kant altijd het laatste nieuws van Strapi lezen. We doen ons best om het product te verbeteren met jouw feedback.", - "app.components.HomePage.welcomeBlock.content.issues": "problemen.", - "app.components.HomePage.welcomeBlock.content.raise": "\u0020of verhogen\u0020", - "app.components.HomePage.createBlock.content.first": "De\u0020", - "app.components.HomePage.createBlock.content.second": "\u0020plugin kan je helpen om de data structuur van je models aan te geven. Als je nieuw bent hier raden we je aan om onze\u0020 te volgen", - "app.components.HomePage.createBlock.content.tutorial": "\u0020handleiding.", - "app.components.HomePage.button.quickStart": "START DE SNELLE START HANDLEIDING", - "app.components.HomePage.button.blog": "LEES MEER OP DE BLOG", + "app.components.HomePage.createBlock.content.first": "De ", + "app.components.HomePage.createBlock.content.second": " plugin kan je helpen om de data structuur van je models aan te geven. Als je nieuw bent hier raden we je aan om onze te volgen", + "app.components.HomePage.createBlock.content.tutorial": " handleiding.", + "app.components.HomePage.cta": "AKKOORD", + "app.components.HomePage.newsLetter": "Abonneer op de nieuwsbrief om contact te houden met Strapi", "app.components.HomePage.support": "STEUN ONS", "app.components.HomePage.support.content": "Door een T-shirt te kopen kunnen we doorgaan met ons werk aan het project om jou de beste ervaring te geven!", "app.components.HomePage.support.link": "KOOP NU EEN T-SHIRT", - - "app.components.BlockLink.documentation": "Lees de documentatie", - "app.components.BlockLink.documentation.content": "Ontdek de concepten, referentie handleidingen en tutorials.", - "app.components.BlockLink.code": "Code voorbeelden", - "app.components.BlockLink.code.content": "Leer door echte projecten gemaakt door de community te testen", - - - "app.components.InputFile.newFile": "Nieuw bestand toevoegen", - "app.components.InputFileDetails.open": "Openen in nieuw tabblad", - "app.components.InputFileDetails.remove": "Verwijder dit bestand", - "app.components.InputFileDetails.originalName": "Orginele naam:", - "app.components.InputFileDetails.size": "Grootte:", - + "app.components.HomePage.welcome": "Welkom aan boord!", + "app.components.HomePage.welcome.again": "Welkom ", + "app.components.HomePage.welcomeBlock.content": "We zijn blij met jou als community lid. Wij zijn constant op zoek naar feedback dus stuur gerust een DM op ", + "app.components.HomePage.welcomeBlock.content.again": "We hopen dat je voortgang boekt met je project... Je kant altijd het laatste nieuws van Strapi lezen. We doen ons best om het product te verbeteren met jouw feedback.", + "app.components.HomePage.welcomeBlock.content.issues": "problemen.", + "app.components.HomePage.welcomeBlock.content.raise": " of verhogen ", "app.components.ImgPreview.hint": "Sleep je bestand in dit gedeelte of {browse} voor een bestand om te uploaden", "app.components.ImgPreview.hint.browse": "blader", - - "app.components.InstallPluginPage.helmet": "Marktplaats - Extensies", - "app.components.InstallPluginPage.title": "Marktplaats - Extensies", - "app.components.InstallPluginPage.description": "Breid je app zonder moeite uit.", - "app.components.InstallPluginPage.plugin.support-us.description": "Steun ons door een Strapi T-shirt te kopen. Hierdoor kunnen wij doorwerken aan het project en jou de best mogelijke ervaring bieden!", + "app.components.InputFile.newFile": "Nieuw bestand toevoegen", + "app.components.InputFileDetails.open": "Openen in nieuw tabblad", + "app.components.InputFileDetails.originalName": "Orginele naam:", + "app.components.InputFileDetails.remove": "Verwijder dit bestand", + "app.components.InputFileDetails.size": "Grootte:", "app.components.InstallPluginPage.InputSearch.label": " ", "app.components.InstallPluginPage.InputSearch.placeholder": "Zoek naar een extensie... (bijv. authenticatie)", + "app.components.InstallPluginPage.description": "Breid je app zonder moeite uit.", + "app.components.InstallPluginPage.helmet": "Marktplaats - Extensies", + "app.components.InstallPluginPage.plugin.support-us.description": "Steun ons door een Strapi T-shirt te kopen. Hierdoor kunnen wij doorwerken aan het project en jou de best mogelijke ervaring bieden!", + "app.components.InstallPluginPage.title": "Marktplaats - Extensies", "app.components.InstallPluginPopup.downloads": "download", - "app.components.InstallPluginPopup.navLink.description": "Beschrijving", - "app.components.InstallPluginPopup.navLink.screenshots": "Schermopnames", "app.components.InstallPluginPopup.navLink.avis": "avis", - "app.components.InstallPluginPopup.navLink.faq": "faq", "app.components.InstallPluginPopup.navLink.changelog": "logboek", + "app.components.InstallPluginPopup.navLink.description": "Beschrijving", + "app.components.InstallPluginPopup.navLink.faq": "faq", + "app.components.InstallPluginPopup.navLink.screenshots": "Schermopnames", "app.components.InstallPluginPopup.noDescription": "Geen beschrijving beschikbaar", - "app.components.LeftMenuFooter.poweredBy": "Mogelijk gemaakt door ", "app.components.LeftMenuLinkContainer.configuration": "Configuraties", "app.components.LeftMenuLinkContainer.general": "Algemeen", @@ -64,102 +71,69 @@ "app.components.LeftMenuLinkContainer.listPlugins": "Extensies", "app.components.LeftMenuLinkContainer.noPluginsInstalled": "Nog geen extensies geïnstalleerd", "app.components.LeftMenuLinkContainer.plugins": "Extensies", - + "app.components.ListPluginsPage.description": "Lijst van alle plugins voor dit project", "app.components.ListPluginsPage.helmet.title": "Alle extensies", "app.components.ListPluginsPage.title": "Extensies", - "app.components.ListPluginsPage.description": "Lijst van alle plugins voor dit project", - "app.components.listPluginsPage.deletePlugin.error": "Er is een fout opgetreden tijdens het verwijderen van de plugin", - "app.components.listPlugins.title.singular": "{number} extensie is geïnstalleerd", - "app.components.listPlugins.title.plural": "{number} extensies zijn geïnstalleerd", - "app.components.listPlugins.title.none": "Geen extensies geïnstalleerd", - "app.components.listPlugins.button": "Nieuwe extensie toevoegen", - - "app.components.NotFoundPage.description": "Niets gevonden", "app.components.NotFoundPage.back": "Terug naar home pagina", - + "app.components.NotFoundPage.description": "Niets gevonden", "app.components.Official": "Officieel", - - "app.components.PluginCard.compatible": "Geschikt voor jouw app", - "app.components.PluginCard.compatibleCommunity": "Geschikt voor de community", "app.components.PluginCard.Button.label.download": "Download", "app.components.PluginCard.Button.label.install": "Al geïnstalleerd", "app.components.PluginCard.Button.label.support": "Steun ons", - "app.components.PluginCard.price.free": "Gratis", + "app.components.PluginCard.compatible": "Geschikt voor jouw app", + "app.components.PluginCard.compatibleCommunity": "Geschikt voor de community", "app.components.PluginCard.more-details": "Meer details", - - "app.utils.placeholder.defaultMessage": "\u0020", - "app.utils.SelectOption.defaultMessage": "\u0020", - "app.utils.defaultMessage": "\u0020", - - "components.AutoReloadBlocker.header": "De herlaad feature is nodig voor deze extensie", + "app.components.PluginCard.price.free": "Gratis", + "app.components.listPlugins.button": "Nieuwe extensie toevoegen", + "app.components.listPlugins.title.none": "Geen extensies geïnstalleerd", + "app.components.listPlugins.title.plural": "{number} extensies zijn geïnstalleerd", + "app.components.listPlugins.title.singular": "{number} extensie is geïnstalleerd", + "app.components.listPluginsPage.deletePlugin.error": "Er is een fout opgetreden tijdens het verwijderen van de plugin", + "app.utils.SelectOption.defaultMessage": " ", + "app.utils.defaultMessage": " ", + "app.utils.placeholder.defaultMessage": " ", "components.AutoReloadBlocker.description": "Open het volgende bestand en ze deze feature aan.", - + "components.AutoReloadBlocker.header": "De herlaad feature is nodig voor deze extensie", "components.ErrorBoundary.title": "Er is iets fout gegaan...", - - "components.OverlayBlocker.title": "Wachten op herstart...", - "components.OverlayBlocker.description": "Je gebruikt een feature waardoor de server opnieuw op moet starten. Een moment geduld terwijl de server opnieuw opstart.", - - "components.PageFooter.select": "inzendingen per pagina", - - "components.ProductionBlocker.header": "Deze extensie is alleen beschikbaar in ontwikkel modus", - "components.ProductionBlocker.description": "Om veiligheids redenen hebben we deze extensie uitgeschakeld in andere omgevingen.", - - "components.popUpWarning.button.cancel": "Annuleren", - "components.popUpWarning.button.confirm": "Akkoord", - "components.popUpWarning.title": "Ga a.u.b. akkoord", - "components.popUpWarning.message": "Weet je zeker dat je dit wilt verwijderen?", - - "components.Input.error.validation.email": "Dit is geen email", - "components.Input.error.validation.required": "Deze waarde is verplicht.", - "components.Input.error.validation.regex": "De ingevoerde waarde komt niet overeen met de regex.", - "components.Input.error.validation.max": "De waarde is te hoog.", - "components.Input.error.validation.min": "De waarde is te laag.", - "components.Input.error.validation.maxLength": "De waarde is te lang.", - "components.Input.error.validation.minLength": "De waarde is te kort.", - "components.Input.error.contentTypeName.taken": "Deze naam bestaat al", - "components.Input.error.attribute.taken": "Deze veld naam bestaat al", "components.Input.error.attribute.key.taken": "Deze waarde bestaat al.", "components.Input.error.attribute.sameKeyAndName": "Mag niet gelijk zijn.", - "components.Input.error.validation.minSupMax": "Mag niet superieur zijn.", + "components.Input.error.attribute.taken": "Deze veld naam bestaat al", + "components.Input.error.contentTypeName.taken": "Deze naam bestaat al", "components.Input.error.custom-error": "{errorMessage} ", + "components.Input.error.validation.email": "Dit is geen email", "components.Input.error.validation.json": "Dit komt niet overeen met het JSON formaat", - + "components.Input.error.validation.max": "De waarde is te hoog.", + "components.Input.error.validation.maxLength": "De waarde is te lang.", + "components.Input.error.validation.min": "De waarde is te laag.", + "components.Input.error.validation.minLength": "De waarde is te kort.", + "components.Input.error.validation.minSupMax": "Mag niet superieur zijn.", + "components.Input.error.validation.regex": "De ingevoerde waarde komt niet overeen met de regex.", + "components.Input.error.validation.required": "Deze waarde is verplicht.", "components.ListRow.empty": "Er is geen data beschikbaar.", - + "components.OverlayBlocker.description": "Je gebruikt een feature waardoor de server opnieuw op moet starten. Een moment geduld terwijl de server opnieuw opstart.", + "components.OverlayBlocker.title": "Wachten op herstart...", + "components.PageFooter.select": "inzendingen per pagina", + "components.ProductionBlocker.description": "Om veiligheids redenen hebben we deze extensie uitgeschakeld in andere omgevingen.", + "components.ProductionBlocker.header": "Deze extensie is alleen beschikbaar in ontwikkel modus", + "components.Wysiwyg.ToggleMode.markdown": "Overschakelen naar markdown", + "components.Wysiwyg.ToggleMode.preview": "Overschakelen naar voorbeeld", "components.Wysiwyg.collapse": "Inklappen", - "components.Wysiwyg.selectOptions.title": "Voeg een titel toe", "components.Wysiwyg.selectOptions.H1": "H1 titel", "components.Wysiwyg.selectOptions.H2": "H2 titel", "components.Wysiwyg.selectOptions.H3": "H3 titel", "components.Wysiwyg.selectOptions.H4": "H4 titel", "components.Wysiwyg.selectOptions.H5": "H5 titel", "components.Wysiwyg.selectOptions.H6": "H6 titel", - "components.Wysiwyg.ToggleMode.markdown": "Overschakelen naar markdown", - "components.Wysiwyg.ToggleMode.preview": "Overschakelen naar voorbeeld", + "components.Wysiwyg.selectOptions.title": "Voeg een titel toe", "components.WysiwygBottomControls.charactersIndicators": "karakters", + "components.WysiwygBottomControls.fullscreen": "Uitklappen", "components.WysiwygBottomControls.uploadFiles": "Sleep bestanden, plak ze of {browse}.", "components.WysiwygBottomControls.uploadFiles.browse": "selecteer ze", - "components.WysiwygBottomControls.fullscreen": "Uitklappen", - - "HomePage.notification.newsLetter.success": "Succesvol geabonneerd op de nieuwsbrief", - + "components.popUpWarning.button.cancel": "Annuleren", + "components.popUpWarning.button.confirm": "Akkoord", + "components.popUpWarning.message": "Weet je zeker dat je dit wilt verwijderen?", + "components.popUpWarning.title": "Ga a.u.b. akkoord", "notification.error": "Er is een fout opgetreden", "notification.error.layout": "Kon de opzet niet laden", - - "Users & Permissions": "Gebruikers & Permissies", - "Content Manager": "Inhoud Manager", - "Content Type Builder": "Content Type Bouwer", - "Files Upload": "Bestand Upload", - "Roles & Permissions": "Rollen & Permissies", - "Settings Manager": "Instellingen Manager", - "Email": "E-mail", - "Password": "Wachtwoord", - "Username": "Gebruikersnaam", - "Provider": "Leverancier", - "ResetPasswordToken": "Wachtwoord Reset Token", - "Role": "Rol", - "New entry": "Nieuwe inzending", - "request.error.model.unknown": "Dit model bestaat niet", - "Users": "Gebruikers", - "Analytics": "Analytics" -} + "request.error.model.unknown": "Dit model bestaat niet" +} \ No newline at end of file diff --git a/packages/strapi-admin/admin/src/translations/pl.json b/packages/strapi-admin/admin/src/translations/pl.json index 3ba75ca5e6..eb9135bb06 100644 --- a/packages/strapi-admin/admin/src/translations/pl.json +++ b/packages/strapi-admin/admin/src/translations/pl.json @@ -1,62 +1,67 @@ { - "app.components.Button.save": "Zapisz", + "Analytics": "Analityka", + "Content Manager": "Treści", + "Content Type Builder": "Modele", + "Email": "Email", + "HomePage.notification.newsLetter.success": "Pomyślnie zapisano do biuletynu", + "New entry": "Nowy wpis", + "Password": "Hasło", + "Provider": "Dostawca", + "ResetPasswordToken": "Token resetu hasła", + "Role": "Rola", + "Settings Manager": "Ustawienia", + "Username": "Nazwa użytkownika", + "Users": "Użytkownicy", + "Users & Permissions": "Użytkownicy & Uprawnienia", + "app.components.BlockLink.code": "Przykłady", + "app.components.BlockLink.code.content": "Ucz się poprzez testowanie prawdziwych projektów opracowanych przez społeczność.", + "app.components.BlockLink.documentation": "Dokumentacja", + "app.components.BlockLink.documentation.content": "Odkryj koncepcje, odniesienia i poradniki.", "app.components.Button.cancel": "Anuluj", - + "app.components.Button.save": "Zapisz", "app.components.ComingSoonPage.comingSoon": "Wkrótce", "app.components.ComingSoonPage.featuresNotAvailable": "Ta funkcjonalność wciąż jest w fazie tworzenia.", - "app.components.DownloadInfo.download": "Pobieranie w toku...", "app.components.DownloadInfo.text": "To może chwilę potrwać. Dziękujemy za cierpliwość.", - - "app.components.HomePage.welcome": "Witaj na pokładzie!", - "app.components.HomePage.welcome.again": "Witaj ", - "app.components.HomePage.cta": "POTWIERDŹ", + "app.components.HomePage.button.blog": "ZOBACZ WIĘCEJ NA BLOGU", + "app.components.HomePage.button.quickStart": "ROZPOCZNIJ PORADNIK – SZYBKI START", "app.components.HomePage.community": "Odkryj internetową społeczność", - "app.components.HomePage.newsLetter": "Zapisz się do biuletynu aby być na bieżąco ze Strapi.", "app.components.HomePage.community.content": "Dyskutuj z członkami zespołu, współtwórcami i programistami na różnych kanałach.", "app.components.HomePage.create": "Stwórz swoją pierwszą zawartość", - "app.components.HomePage.welcomeBlock.content": "Cieszymy się, że należysz do naszej społeczności. Nieustannie poszukujemy opinii więc nie krępuj się wysyłać nam bezpośrednich wiadomości poprzez\u0020", - "app.components.HomePage.welcomeBlock.content.again": "Mamy nadzieję, że robisz postępy w swoim projekcie... Zapraszamy do zapoznania się z najnowszymi informacjami na temat Strapi. Dajemy z siebie wszystko, aby ulepszyć produkt w oparciu o twoją opinię.", - "app.components.HomePage.welcomeBlock.content.issues": "problemów.", - "app.components.HomePage.welcomeBlock.content.raise": "\u0020czy też poruszać\u0020", - "app.components.HomePage.createBlock.content.first": "Wtyczka\u0020", - "app.components.HomePage.createBlock.content.second": "\u0020pomoże ci zdefiniować strukturę danych twoich modeli. Jeśli dopiero rozpoczynasz przygodę ze Strapi, zalecamy zapoznać się z poradnikiem\u0020", - "app.components.HomePage.createBlock.content.tutorial": "\u0020.", - "app.components.HomePage.button.quickStart": "ROZPOCZNIJ PORADNIK – SZYBKI START", - "app.components.HomePage.button.blog": "ZOBACZ WIĘCEJ NA BLOGU", + "app.components.HomePage.createBlock.content.first": "Wtyczka ", + "app.components.HomePage.createBlock.content.second": " pomoże ci zdefiniować strukturę danych twoich modeli. Jeśli dopiero rozpoczynasz przygodę ze Strapi, zalecamy zapoznać się z poradnikiem ", + "app.components.HomePage.createBlock.content.tutorial": " .", + "app.components.HomePage.cta": "POTWIERDŹ", + "app.components.HomePage.newsLetter": "Zapisz się do biuletynu aby być na bieżąco ze Strapi.", "app.components.HomePage.support": "WESPRZYJ NAS", "app.components.HomePage.support.content": "Dzięki temu będziemy mogli kontynuować naszą pracę, a tobie zapewniać coraz to lepsze wrażenia podczas korzystania z projektu.", "app.components.HomePage.support.link": "ZDOBĄDŹ KOSZULKĘ TERAZ", - - "app.components.BlockLink.documentation": "Dokumentacja", - "app.components.BlockLink.documentation.content": "Odkryj koncepcje, odniesienia i poradniki.", - "app.components.BlockLink.code": "Przykłady", - "app.components.BlockLink.code.content": "Ucz się poprzez testowanie prawdziwych projektów opracowanych przez społeczność.", - - - "app.components.InputFile.newFile": "Dodaj nowy plik", - "app.components.InputFileDetails.open": "Otwórz w nowej karcie", - "app.components.InputFileDetails.remove": "Usuń ten plik", - "app.components.InputFileDetails.originalName": "Oryginalna nazwa:", - "app.components.InputFileDetails.size": "Rozmiar:", - + "app.components.HomePage.welcome": "Witaj na pokładzie!", + "app.components.HomePage.welcome.again": "Witaj ", + "app.components.HomePage.welcomeBlock.content": "Cieszymy się, że należysz do naszej społeczności. Nieustannie poszukujemy opinii więc nie krępuj się wysyłać nam bezpośrednich wiadomości poprzez ", + "app.components.HomePage.welcomeBlock.content.again": "Mamy nadzieję, że robisz postępy w swoim projekcie... Zapraszamy do zapoznania się z najnowszymi informacjami na temat Strapi. Dajemy z siebie wszystko, aby ulepszyć produkt w oparciu o twoją opinię.", + "app.components.HomePage.welcomeBlock.content.issues": "problemów.", + "app.components.HomePage.welcomeBlock.content.raise": " czy też poruszać ", "app.components.ImgPreview.hint": "Przeciągnij i upuść plik w tym obszarze lub {browse}, aby przesłać plik", "app.components.ImgPreview.hint.browse": "przeglądaj", - - "app.components.InstallPluginPage.helmet": "Sklep – Wtyczki", - "app.components.InstallPluginPage.title": "Sklep – Wtyczki", - "app.components.InstallPluginPage.description": "Rozszerz swoją aplikację bez wysiłku", - "app.components.InstallPluginPage.plugin.support-us.description": "Wesprzyj nas kupując koszulkę Strapi. Pozwoli nam to kontynuuować pracę nad projektem i wzbogacanie go, tak aby dać ci jak najlepsze wrażenia.", + "app.components.InputFile.newFile": "Dodaj nowy plik", + "app.components.InputFileDetails.open": "Otwórz w nowej karcie", + "app.components.InputFileDetails.originalName": "Oryginalna nazwa:", + "app.components.InputFileDetails.remove": "Usuń ten plik", + "app.components.InputFileDetails.size": "Rozmiar:", "app.components.InstallPluginPage.InputSearch.label": " ", "app.components.InstallPluginPage.InputSearch.placeholder": "Wyszukaj wtyczkę... (np: authentication)", + "app.components.InstallPluginPage.description": "Rozszerz swoją aplikację bez wysiłku", + "app.components.InstallPluginPage.helmet": "Sklep – Wtyczki", + "app.components.InstallPluginPage.plugin.support-us.description": "Wesprzyj nas kupując koszulkę Strapi. Pozwoli nam to kontynuuować pracę nad projektem i wzbogacanie go, tak aby dać ci jak najlepsze wrażenia.", + "app.components.InstallPluginPage.title": "Sklep – Wtyczki", "app.components.InstallPluginPopup.downloads": "pobierz", - "app.components.InstallPluginPopup.navLink.description": "Opis", - "app.components.InstallPluginPopup.navLink.screenshots": "Zrzuty ekranu", "app.components.InstallPluginPopup.navLink.avis": "avis", - "app.components.InstallPluginPopup.navLink.faq": "faq", "app.components.InstallPluginPopup.navLink.changelog": "dziennik zmian", + "app.components.InstallPluginPopup.navLink.description": "Opis", + "app.components.InstallPluginPopup.navLink.faq": "faq", + "app.components.InstallPluginPopup.navLink.screenshots": "Zrzuty ekranu", "app.components.InstallPluginPopup.noDescription": "Brak dostępnego opisu", - "app.components.LeftMenuFooter.poweredBy": "Dumnie wspierane przez ", "app.components.LeftMenuLinkContainer.configuration": "Konfiguracje", "app.components.LeftMenuLinkContainer.general": "Ogólne", @@ -64,96 +69,68 @@ "app.components.LeftMenuLinkContainer.listPlugins": "Wtyczki", "app.components.LeftMenuLinkContainer.noPluginsInstalled": "Brak zainstalowanych wtyczek", "app.components.LeftMenuLinkContainer.plugins": "Wtyczki", - + "app.components.ListPluginsPage.description": "Lista zainstalowanych wtyczek w projekcie.", "app.components.ListPluginsPage.helmet.title": "Lista wtyczek", "app.components.ListPluginsPage.title": "Wtyczki", - "app.components.ListPluginsPage.description": "Lista zainstalowanych wtyczek w projekcie.", - "app.components.listPluginsPage.deletePlugin.error": "Wystąpił błąd podczas dezinstalacji wtyczki", - "app.components.listPlugins.title.singular": "{number} wtyczka jest zainstalowana", - "app.components.listPlugins.title.plural": "{number} wtyczek jest zainstalowanych", - "app.components.listPlugins.title.none": "Żadna wtyczka nie jest zainstalowana", - "app.components.listPlugins.button": "Dodaj nową wtyczkę", - - "app.components.NotFoundPage.description": "Nie znaleziono", "app.components.NotFoundPage.back": "Powrót do strony głównej", - + "app.components.NotFoundPage.description": "Nie znaleziono", "app.components.Official": "Oficjalna", - - "app.components.PluginCard.compatible": "Kompatybilna z twoją aplikacją", - "app.components.PluginCard.compatibleCommunity": "Kompatybilna ze społecznością", "app.components.PluginCard.Button.label.download": "Pobierz", "app.components.PluginCard.Button.label.install": "Zainstalowana", "app.components.PluginCard.Button.label.support": "Wesprzyj nas", - "app.components.PluginCard.price.free": "Darmowa", + "app.components.PluginCard.compatible": "Kompatybilna z twoją aplikacją", + "app.components.PluginCard.compatibleCommunity": "Kompatybilna ze społecznością", "app.components.PluginCard.more-details": "Więcej szczegółów", - - "app.utils.placeholder.defaultMessage": "\u0020", - "app.utils.SelectOption.defaultMessage": "\u0020", - "app.utils.defaultMessage": "\u0020", - - "components.AutoReloadBlocker.header": "Do tej wtyczki wymagana jest funkcja przeładowania.", + "app.components.PluginCard.price.free": "Darmowa", + "app.components.listPlugins.button": "Dodaj nową wtyczkę", + "app.components.listPlugins.title.none": "Żadna wtyczka nie jest zainstalowana", + "app.components.listPlugins.title.plural": "{number} wtyczek jest zainstalowanych", + "app.components.listPlugins.title.singular": "{number} wtyczka jest zainstalowana", + "app.components.listPluginsPage.deletePlugin.error": "Wystąpił błąd podczas dezinstalacji wtyczki", + "app.utils.SelectOption.defaultMessage": " ", + "app.utils.defaultMessage": " ", + "app.utils.placeholder.defaultMessage": " ", "components.AutoReloadBlocker.description": "Otwórz następujący plik i włącz funkcjonalność.", - + "components.AutoReloadBlocker.header": "Do tej wtyczki wymagana jest funkcja przeładowania.", "components.ErrorBoundary.title": "Coś poszło nie tak...", - - "components.OverlayBlocker.title": "Oczekiwanie na ponowne uruchomienie...", - "components.OverlayBlocker.description": "Używasz funkcjonalności która wymaga ponownego uruchomienia serwera. Poczekaj proszę aż aplikacja znów będzie aktywna.", - "components.PageFooter.select": "elementów na stronę", - "components.ProductionBlocker.header": "Ta wtyczka jest dostępna tylko w wersji deweloperskiej.", - "components.ProductionBlocker.description": "Ze względów bezpieczeństwa wtyczka jest wyłączona w innych środowiskach.", - - "components.popUpWarning.button.cancel": "Nie", - "components.popUpWarning.button.confirm": "Tak", - "components.popUpWarning.title": "Potwierdzenie", - "components.popUpWarning.message": "Czy na pewno chcesz to usunąć?", - - "components.Input.error.validation.email": "To nie jest email", - "components.Input.error.validation.required": "Wpisanie wartości dla tego atrybutu jest wymagane.", - "components.Input.error.validation.regex": "Wartość nie jest zgodna z wymaganym wzorcem.", - "components.Input.error.validation.max": "Wartość jest za wysoka.", - "components.Input.error.validation.min": "Wartość jest za niska.", - "components.Input.error.validation.maxLength": "Wartość jest za długa.", - "components.Input.error.validation.minLength": "Wartość jest za krótka.", - "components.Input.error.contentTypeName.taken": "Ta nazwa już istnieje", - "components.Input.error.attribute.taken": "Ta nazwa pola już istnieje", "components.Input.error.attribute.key.taken": "Ta wartość już istnieje", "components.Input.error.attribute.sameKeyAndName": "Nie mogą być takie same", - "components.Input.error.validation.minSupMax": "Nie może być większa", + "components.Input.error.attribute.taken": "Ta nazwa pola już istnieje", + "components.Input.error.contentTypeName.taken": "Ta nazwa już istnieje", "components.Input.error.custom-error": "{errorMessage} ", - + "components.Input.error.validation.email": "To nie jest email", + "components.Input.error.validation.max": "Wartość jest za wysoka.", + "components.Input.error.validation.maxLength": "Wartość jest za długa.", + "components.Input.error.validation.min": "Wartość jest za niska.", + "components.Input.error.validation.minLength": "Wartość jest za krótka.", + "components.Input.error.validation.minSupMax": "Nie może być większa", + "components.Input.error.validation.regex": "Wartość nie jest zgodna z wymaganym wzorcem.", + "components.Input.error.validation.required": "Wpisanie wartości dla tego atrybutu jest wymagane.", "components.ListRow.empty": "Nie ma żadnych danych do wyświetlenia.", - + "components.OverlayBlocker.description": "Używasz funkcjonalności która wymaga ponownego uruchomienia serwera. Poczekaj proszę aż aplikacja znów będzie aktywna.", + "components.OverlayBlocker.title": "Oczekiwanie na ponowne uruchomienie...", + "components.PageFooter.select": "elementów na stronę", + "components.ProductionBlocker.description": "Ze względów bezpieczeństwa wtyczka jest wyłączona w innych środowiskach.", + "components.ProductionBlocker.header": "Ta wtyczka jest dostępna tylko w wersji deweloperskiej.", + "components.Wysiwyg.ToggleMode.markdown": "Przełącz na markdown", + "components.Wysiwyg.ToggleMode.preview": "Przełącz na pogląd", "components.Wysiwyg.collapse": "Zwiń", - "components.Wysiwyg.selectOptions.title": "Dodaj tytuł", "components.Wysiwyg.selectOptions.H1": "Tytuł H1", "components.Wysiwyg.selectOptions.H2": "Tytuł H2", "components.Wysiwyg.selectOptions.H3": "Tytuł H3", "components.Wysiwyg.selectOptions.H4": "Tytuł H4", "components.Wysiwyg.selectOptions.H5": "Tytuł H5", "components.Wysiwyg.selectOptions.H6": "Tytuł H6", - "components.Wysiwyg.ToggleMode.markdown": "Przełącz na markdown", - "components.Wysiwyg.ToggleMode.preview": "Przełącz na pogląd", + "components.Wysiwyg.selectOptions.title": "Dodaj tytuł", "components.WysiwygBottomControls.charactersIndicators": "znaków", + "components.WysiwygBottomControls.fullscreen": "Rozszerz", "components.WysiwygBottomControls.uploadFiles": "Przeciągnij i upuść pliki, wklej ze schowka lub {browse}.", "components.WysiwygBottomControls.uploadFiles.browse": "je wybierz", - "components.WysiwygBottomControls.fullscreen": "Rozszerz", - "HomePage.notification.newsLetter.success": "Pomyślnie zapisano do biuletynu", - + "components.popUpWarning.button.cancel": "Nie", + "components.popUpWarning.button.confirm": "Tak", + "components.popUpWarning.message": "Czy na pewno chcesz to usunąć?", + "components.popUpWarning.title": "Potwierdzenie", "notification.error": "Wystąpił błąd", "notification.error.layout": "Nie można pobrać układu", - - "Users & Permissions": "Użytkownicy & Uprawnienia", - "Content Manager": "Treści", - "Content Type Builder": "Modele", - "Settings Manager": "Ustawienia", - "Email": "Email", - "Password": "Hasło", - "Username": "Nazwa użytkownika", - "Provider": "Dostawca", - "ResetPasswordToken": "Token resetu hasła", - "Role": "Rola", - "New entry": "Nowy wpis", - "request.error.model.unknown": "Ten model nie istnieje", - "Users": "Użytkownicy", - "Analytics": "Analityka" -} + "request.error.model.unknown": "Ten model nie istnieje" +} \ No newline at end of file diff --git a/packages/strapi-admin/admin/src/translations/pt-BR.json b/packages/strapi-admin/admin/src/translations/pt-BR.json index 641d549341..f2908c6b9b 100644 --- a/packages/strapi-admin/admin/src/translations/pt-BR.json +++ b/packages/strapi-admin/admin/src/translations/pt-BR.json @@ -1,62 +1,69 @@ { - "app.components.Button.save": "Salvar", + "Analytics": "Monitoramento", + "Content Manager": "Gestão de conteúdo", + "Content Type Builder": "Construtor de Conteúdo", + "Email": "E-mail", + "Files Upload": "Enviar arquivos", + "HomePage.notification.newsLetter.success": "Newsletter assinado com sucesso", + "New entry": "Novo registro", + "Password": "Senha", + "Provider": "Provedor", + "ResetPasswordToken": "Redefinir o token de senha", + "Role": "Nível", + "Roles & Permissions": "Papéis e permissões", + "Settings Manager": "Gerenciador de configurações", + "Username": "Nome de usuário", + "Users": "Usuários", + "Users & Permissions": "Usuários & Permissões", + "app.components.BlockLink.code": "Códigos de Exemplo", + "app.components.BlockLink.code.content": "Aprenda testando projetos reais desenvolvidos por nossa comunidade.", + "app.components.BlockLink.documentation": "Leia a documentação", + "app.components.BlockLink.documentation.content": "Descubra os conceitos do Strapi, guias de referência e tutoriais.", "app.components.Button.cancel": "Cancelar", - + "app.components.Button.save": "Salvar", "app.components.ComingSoonPage.comingSoon": "Em breve", "app.components.ComingSoonPage.featuresNotAvailable": "Este recurso está em desenvolvimento", - "app.components.DownloadInfo.download": "Transferência em progresso...", "app.components.DownloadInfo.text": "Isto poderá levar alguns minutos. Obrigado pela sua paciência", - - "app.components.HomePage.welcome": "Bem-vindo(a) a bordo", - "app.components.HomePage.welcome.again": "Bem-vindo(a) ", - "app.components.HomePage.cta": "CONFIRME", + "app.components.HomePage.button.blog": "VEJA MAIS NO BLOG", + "app.components.HomePage.button.quickStart": "INICIAR TUTORIAL (Quick Start)", "app.components.HomePage.community": "Nossa comunidade na web", - "app.components.HomePage.newsLetter": "Assine nosso newsletter para ficar por dentro das novidades sobre o Strapi", "app.components.HomePage.community.content": "Converse com membros da equipe, colaboradores e desenvolvedores em diversos canais.", "app.components.HomePage.create": "Crie o seu primeiro Tipo de Conteúdo", - "app.components.HomePage.welcomeBlock.content": "Estamos muito felizes em tê-lo(a) como um membro da nossa comunidade. Estamos sempre querendo saber sua opinião, então fique a vontade em nos enviar uma mensagem em privado no\u0020", - "app.components.HomePage.welcomeBlock.content.again": "Desejamos que você esteja progredindo em seu projeto... Fique por dentro das últimas novidades sobre o Strapi. Estamos sempre dando o nosso melhor para melhorar o produto sempre baseando-se em sua opinião.", - "app.components.HomePage.welcomeBlock.content.issues": "problemas.", - "app.components.HomePage.welcomeBlock.content.raise": "\u0020ou aponte\u0020", - "app.components.HomePage.createBlock.content.first": "A extensão\u0020", - "app.components.HomePage.createBlock.content.second": "\u0020 irá ajudar-lo definir a estrutura de dados de seus modelos. Se você é novo aqui, nós recomendamos imensamente que você siga o nosso tutorial\u0020", - "app.components.HomePage.createBlock.content.tutorial": "\u0020.", - "app.components.HomePage.button.quickStart": "INICIAR TUTORIAL (Quick Start)", - "app.components.HomePage.button.blog": "VEJA MAIS NO BLOG", + "app.components.HomePage.createBlock.content.first": "A extensão ", + "app.components.HomePage.createBlock.content.second": " irá ajudar-lo definir a estrutura de dados de seus modelos. Se você é novo aqui, nós recomendamos imensamente que você siga o nosso tutorial ", + "app.components.HomePage.createBlock.content.tutorial": " .", + "app.components.HomePage.cta": "CONFIRME", + "app.components.HomePage.newsLetter": "Assine nosso newsletter para ficar por dentro das novidades sobre o Strapi", "app.components.HomePage.support": "AJUDE A MELHORAR O STRAPI", "app.components.HomePage.support.content": "Comprando uma camisa você nos ajuda a continuar o trabalho em nosso projeto e criar a melhor experiência possível para todos!", "app.components.HomePage.support.link": "PEÇA SUA CAMISA AGORA!", - - "app.components.BlockLink.documentation": "Leia a documentação", - "app.components.BlockLink.documentation.content": "Descubra os conceitos do Strapi, guias de referência e tutoriais.", - "app.components.BlockLink.code": "Códigos de Exemplo", - "app.components.BlockLink.code.content": "Aprenda testando projetos reais desenvolvidos por nossa comunidade.", - - - "app.components.InputFile.newFile": "Adicionar um novo arquivo", - "app.components.InputFileDetails.open": "Abrir numa nova aba", - "app.components.InputFileDetails.remove": "Remova este arquivo", - "app.components.InputFileDetails.originalName": "Nome original:", - "app.components.InputFileDetails.size": "Tamanho:", - + "app.components.HomePage.welcome": "Bem-vindo(a) a bordo", + "app.components.HomePage.welcome.again": "Bem-vindo(a) ", + "app.components.HomePage.welcomeBlock.content": "Estamos muito felizes em tê-lo(a) como um membro da nossa comunidade. Estamos sempre querendo saber sua opinião, então fique a vontade em nos enviar uma mensagem em privado no ", + "app.components.HomePage.welcomeBlock.content.again": "Desejamos que você esteja progredindo em seu projeto... Fique por dentro das últimas novidades sobre o Strapi. Estamos sempre dando o nosso melhor para melhorar o produto sempre baseando-se em sua opinião.", + "app.components.HomePage.welcomeBlock.content.issues": "problemas.", + "app.components.HomePage.welcomeBlock.content.raise": " ou aponte ", "app.components.ImgPreview.hint": "Arraste e solte o seu arquivo sobre a área ou {browse} um arquivo para fazer o envio", "app.components.ImgPreview.hint.browse": "selecione", - - "app.components.InstallPluginPage.helmet": "Marketplace - Extensões", - "app.components.InstallPluginPage.title": "Marketplace - Extensões", - "app.components.InstallPluginPage.description": "Extenda seu aplicativo sem esforço.", - "app.components.InstallPluginPage.plugin.support-us.description": "Ajude nosso projeto comprando uma camisa Strapi. Isso nos permite continuar trabalhando em nosso projeto e criar a melhor experiência possível!", + "app.components.InputFile.newFile": "Adicionar um novo arquivo", + "app.components.InputFileDetails.open": "Abrir numa nova aba", + "app.components.InputFileDetails.originalName": "Nome original:", + "app.components.InputFileDetails.remove": "Remova este arquivo", + "app.components.InputFileDetails.size": "Tamanho:", "app.components.InstallPluginPage.InputSearch.label": " ", "app.components.InstallPluginPage.InputSearch.placeholder": "Buscar extensão... (ex: autenticação)", + "app.components.InstallPluginPage.description": "Extenda seu aplicativo sem esforço.", + "app.components.InstallPluginPage.helmet": "Marketplace - Extensões", + "app.components.InstallPluginPage.plugin.support-us.description": "Ajude nosso projeto comprando uma camisa Strapi. Isso nos permite continuar trabalhando em nosso projeto e criar a melhor experiência possível!", + "app.components.InstallPluginPage.title": "Marketplace - Extensões", "app.components.InstallPluginPopup.downloads": "baixar", - "app.components.InstallPluginPopup.navLink.description": "Descrição", - "app.components.InstallPluginPopup.navLink.screenshots": "Telas Capturadas", "app.components.InstallPluginPopup.navLink.avis": "opiniões", - "app.components.InstallPluginPopup.navLink.faq": "perguntas frequentes", "app.components.InstallPluginPopup.navLink.changelog": "changelog", + "app.components.InstallPluginPopup.navLink.description": "Descrição", + "app.components.InstallPluginPopup.navLink.faq": "perguntas frequentes", + "app.components.InstallPluginPopup.navLink.screenshots": "Telas Capturadas", "app.components.InstallPluginPopup.noDescription": "Nenhuma descrição disponível", - "app.components.LeftMenuFooter.poweredBy": "Mantido por ", "app.components.LeftMenuLinkContainer.configuration": "Configurações", "app.components.LeftMenuLinkContainer.general": "Geral", @@ -64,102 +71,69 @@ "app.components.LeftMenuLinkContainer.listPlugins": "Extensões", "app.components.LeftMenuLinkContainer.noPluginsInstalled": "Ainda nehuma extensão instalada", "app.components.LeftMenuLinkContainer.plugins": "Extensões", - + "app.components.ListPluginsPage.description": "Lista de extensões instaladas no projeto.", "app.components.ListPluginsPage.helmet.title": "Lista de extensões", "app.components.ListPluginsPage.title": "Extensões", - "app.components.ListPluginsPage.description": "Lista de extensões instaladas no projeto.", - "app.components.listPluginsPage.deletePlugin.error": "Ocorreu um erro ao desinstalar extensão", - "app.components.listPlugins.title.singular": "{number} extensão instalada", - "app.components.listPlugins.title.plural": "{number} extensões instaladas", - "app.components.listPlugins.title.none": "Nenhuma extensão instalada", - "app.components.listPlugins.button": "Adicionar nova Extensão", - - "app.components.NotFoundPage.description": "Não encontrado", "app.components.NotFoundPage.back": "Voltar à página inicial", - + "app.components.NotFoundPage.description": "Não encontrado", "app.components.Official": "Oficial", - - "app.components.PluginCard.compatible": "Compatível com a sua aplicação", - "app.components.PluginCard.compatibleCommunity": "Compativel com a comunidade", "app.components.PluginCard.Button.label.download": "Baixar", "app.components.PluginCard.Button.label.install": "Já instalado", "app.components.PluginCard.Button.label.support": "Ajude-nos", - "app.components.PluginCard.price.free": "Grátis", + "app.components.PluginCard.compatible": "Compatível com a sua aplicação", + "app.components.PluginCard.compatibleCommunity": "Compativel com a comunidade", "app.components.PluginCard.more-details": "Mais detalhes", - - "app.utils.placeholder.defaultMessage": "\u0020", - "app.utils.SelectOption.defaultMessage": "\u0020", - "app.utils.defaultMessage": "\u0020", - - "components.AutoReloadBlocker.header": "Auto recarregamento é necessário para esta extensão.", + "app.components.PluginCard.price.free": "Grátis", + "app.components.listPlugins.button": "Adicionar nova Extensão", + "app.components.listPlugins.title.none": "Nenhuma extensão instalada", + "app.components.listPlugins.title.plural": "{number} extensões instaladas", + "app.components.listPlugins.title.singular": "{number} extensão instalada", + "app.components.listPluginsPage.deletePlugin.error": "Ocorreu um erro ao desinstalar extensão", + "app.utils.SelectOption.defaultMessage": " ", + "app.utils.defaultMessage": " ", + "app.utils.placeholder.defaultMessage": " ", "components.AutoReloadBlocker.description": "Abra o seguinte arquivo e ative o recurso.", - + "components.AutoReloadBlocker.header": "Auto recarregamento é necessário para esta extensão.", "components.ErrorBoundary.title": "Algo deu errado...", - - "components.OverlayBlocker.title": "Aguardando pela reinicialização...", - "components.OverlayBlocker.description": "Você está usando um recurso que precisa que o servidor seja reiniciado. Por favor, aguarde até que o servidor esteja totalmente reiniciado.", - - "components.PageFooter.select": "registros por página", - - "components.ProductionBlocker.header": "Esta extensão está disponível apenas em modo de desenvolvimento.", - "components.ProductionBlocker.description": "Por motivos de segurança, temos que desativar esta extensão em outros ambientes.", - - "components.popUpWarning.button.cancel": "Cancelar", - "components.popUpWarning.button.confirm": "Confirmar", - "components.popUpWarning.title": "Por favor, confirme", - "components.popUpWarning.message": "Tem certeza que deseja remover isso?", - - "components.Input.error.validation.email": "Isto não é um endereço de e-mail", - "components.Input.error.validation.required": "Este valor é obrigatório.", - "components.Input.error.validation.regex": "O valor não corresponde ao regex.", - "components.Input.error.validation.max": "O valor é muito alto.", - "components.Input.error.validation.min": "O valor é muito baixo.", - "components.Input.error.validation.maxLength": "O valor é muito longo.", - "components.Input.error.validation.minLength": "O valor é muito curto.", - "components.Input.error.contentTypeName.taken": "Este tipo de conteúdo já existe", - "components.Input.error.attribute.taken": "O nome deste campo já existe", "components.Input.error.attribute.key.taken": "Este valor já existe", "components.Input.error.attribute.sameKeyAndName": "Não pode ser igual", - "components.Input.error.validation.minSupMax": "Não pode ser superior", + "components.Input.error.attribute.taken": "O nome deste campo já existe", + "components.Input.error.contentTypeName.taken": "Este tipo de conteúdo já existe", "components.Input.error.custom-error": "{errorMessage} ", + "components.Input.error.validation.email": "Isto não é um endereço de e-mail", "components.Input.error.validation.json": "Isto não corresponde ao formato JSON", - + "components.Input.error.validation.max": "O valor é muito alto.", + "components.Input.error.validation.maxLength": "O valor é muito longo.", + "components.Input.error.validation.min": "O valor é muito baixo.", + "components.Input.error.validation.minLength": "O valor é muito curto.", + "components.Input.error.validation.minSupMax": "Não pode ser superior", + "components.Input.error.validation.regex": "O valor não corresponde ao regex.", + "components.Input.error.validation.required": "Este valor é obrigatório.", "components.ListRow.empty": "Não existe nenhum registro para ser exibido", - + "components.OverlayBlocker.description": "Você está usando um recurso que precisa que o servidor seja reiniciado. Por favor, aguarde até que o servidor esteja totalmente reiniciado.", + "components.OverlayBlocker.title": "Aguardando pela reinicialização...", + "components.PageFooter.select": "registros por página", + "components.ProductionBlocker.description": "Por motivos de segurança, temos que desativar esta extensão em outros ambientes.", + "components.ProductionBlocker.header": "Esta extensão está disponível apenas em modo de desenvolvimento.", + "components.Wysiwyg.ToggleMode.markdown": "Mudar para markdown", + "components.Wysiwyg.ToggleMode.preview": "Pré-visualizar", "components.Wysiwyg.collapse": "Fechar", - "components.Wysiwyg.selectOptions.title": "Adicionar um título", "components.Wysiwyg.selectOptions.H1": "Título H1", "components.Wysiwyg.selectOptions.H2": "Título H2", "components.Wysiwyg.selectOptions.H3": "Título H3", "components.Wysiwyg.selectOptions.H4": "Título H4", "components.Wysiwyg.selectOptions.H5": "Título H5", "components.Wysiwyg.selectOptions.H6": "Título H6", - "components.Wysiwyg.ToggleMode.markdown": "Mudar para markdown", - "components.Wysiwyg.ToggleMode.preview": "Pré-visualizar", + "components.Wysiwyg.selectOptions.title": "Adicionar um título", "components.WysiwygBottomControls.charactersIndicators": "caracteres", + "components.WysiwygBottomControls.fullscreen": "Expandir", "components.WysiwygBottomControls.uploadFiles": "Arraste e solte arquivos, cole na área de transferência ou {browse}.", "components.WysiwygBottomControls.uploadFiles.browse": "Selecione-os", - "components.WysiwygBottomControls.fullscreen": "Expandir", - - "HomePage.notification.newsLetter.success": "Newsletter assinado com sucesso", - + "components.popUpWarning.button.cancel": "Cancelar", + "components.popUpWarning.button.confirm": "Confirmar", + "components.popUpWarning.message": "Tem certeza que deseja remover isso?", + "components.popUpWarning.title": "Por favor, confirme", "notification.error": "Ocorreu um erro", "notification.error.layout": "Não foi possível recuperar o layout", - - "Users & Permissions": "Usuários & Permissões", - "Content Manager": "Gestão de conteúdo", - "Content Type Builder": "Construtor de Conteúdo", - "Files Upload": "Enviar arquivos", - "Roles & Permissions": "Papéis e permissões", - "Settings Manager": "Gerenciador de configurações", - "Email": "E-mail", - "Password": "Senha", - "Username": "Nome de usuário", - "Provider": "Provedor", - "ResetPasswordToken": "Redefinir o token de senha", - "Role": "Nível", - "New entry": "Novo registro", - "request.error.model.unknown": "Este modelo não existe", - "Users": "Usuários", - "Analytics": "Monitoramento" -} + "request.error.model.unknown": "Este modelo não existe" +} \ No newline at end of file diff --git a/packages/strapi-admin/admin/src/translations/pt.json b/packages/strapi-admin/admin/src/translations/pt.json index 4d66288268..6265180f2b 100644 --- a/packages/strapi-admin/admin/src/translations/pt.json +++ b/packages/strapi-admin/admin/src/translations/pt.json @@ -1,164 +1,137 @@ { - "app.components.Button.save": "Guardar", - "app.components.Button.cancel": "Cancelar", - - "app.components.ComingSoonPage.comingSoon": "Em breve", - "app.components.ComingSoonPage.featuresNotAvailable": "Esta funcionalidade continua em desenvolvimento", - - "app.components.DownloadInfo.download": "Transferência em curso...", - "app.components.DownloadInfo.text": "Isto poderá levar alguns minutos. Obrigado pela sua paciência", - - "app.components.HomePage.welcome": "Bem-vindo(a) a bordo", - "app.components.HomePage.welcome.again": "Bem-vindo(a) ", - "app.components.HomePage.cta": "CONFIRME", - "app.components.HomePage.community": "Encontre a comunidade na web", - "app.components.HomePage.newsLetter": "Subscreva-se à newsletter para ficar a par sobre Strapi", - "app.components.HomePage.community.content": "Converse com membros da equipe, colaboradores e desenvolvedores em diferentes canais.", - "app.components.HomePage.create": "Crie o seu primeiro Tipo de Conteúdo", - "app.components.HomePage.welcomeBlock.content": "Estamos felizes em tê-lo como um dos membros da comunidade. Estamos constantemente a procura de feeback então sinta-se à vontade para enviar-nos uma mensagem em privado no\u0020", - "app.components.HomePage.welcomeBlock.content.again": "Esperamos que estejas a progredir em seu projecto... SInta-se à vontade em ler as nossas últimas publicações sobre Strapi. Estamos dando o nosso melhor para amelhorar o produto baseando-se no seu feedback.", - "app.components.HomePage.welcomeBlock.content.issues": "problemas.", - "app.components.HomePage.welcomeBlock.content.raise": "\u0020ou levante\u0020", - "app.components.HomePage.createBlock.content.first": "A\u0020", - "app.components.HomePage.createBlock.content.second": "\u0020extensão irá ajudar-vos a definir a estrutura de dados de seus modelos. Se é novo aqui, nós recomendamos fortemente que você siga o nosso\u0020", - "app.components.HomePage.createBlock.content.tutorial": "\u0020tutorial.", - "app.components.HomePage.button.quickStart": "COMEÇAR UM BREVE TUTORIAL", - "app.components.HomePage.button.blog": "VEJA MAIS NO BLOG", - "app.components.HomePage.support": "SUPORTE-NOS", - "app.components.HomePage.support.content": "Comprando a camisola, permitirá-nos continuar o nosso trabalho no projecto para dar à si a melhor experiência possível!", - "app.components.HomePage.support.link": "OBTENHA A SUA CAMISOLA AGORA", - - "app.components.BlockLink.documentation": "Leia a documentação", - "app.components.BlockLink.documentation.content": "Descubra os conceptos, reference guides and tutorials.", - "app.components.BlockLink.code": "Exemplos de codigos", - "app.components.BlockLink.code.content": "Aprenda testando projetos reais desenvolvidos pela comunidade.", - - - "app.components.InputFile.newFile": "Adicionar um novo arquivo", - "app.components.InputFileDetails.open": "Abrir numa nova aba", - "app.components.InputFileDetails.remove": "Remova este arquivo", - "app.components.InputFileDetails.originalName": "Nome original:", - "app.components.InputFileDetails.size": "Tamanho:", - - "app.components.ImgPreview.hint": "Arraste & solte o seu arquivo nesta area ou {browse} um arquivo para fazer a transferência", - "app.components.ImgPreview.hint.browse": "procure", - - "app.components.InstallPluginPage.helmet": "Marketplace - Extensões", - "app.components.InstallPluginPage.title": "Marketplace - Extensões", - "app.components.InstallPluginPage.description": "Extenda seu aplicativo sem esforço.", - "app.components.InstallPluginPage.plugin.support-us.description": "Apoie-nos comprando a camisola Strapi. Isso permitirá-nos continuar trabalhando no projecto e dar à si a melhor experiência possível!", - "app.components.InstallPluginPage.InputSearch.label": " ", - "app.components.InstallPluginPage.InputSearch.placeholder": "Procurar uma extensão... (ex: autenticação)", - "app.components.InstallPluginPopup.downloads": "transferir", - "app.components.InstallPluginPopup.navLink.description": "Descrição", - "app.components.InstallPluginPopup.navLink.screenshots": "Capturas de ecrã", - "app.components.InstallPluginPopup.navLink.avis": "opiniões", - "app.components.InstallPluginPopup.navLink.faq": "faq", - "app.components.InstallPluginPopup.navLink.changelog": "changelog", - "app.components.InstallPluginPopup.noDescription": "Nenhuma descrição disponível", - - "app.components.LeftMenuFooter.poweredBy": "Destribuído por ", - "app.components.LeftMenuLinkContainer.configuration": "Definições", - "app.components.LeftMenuLinkContainer.general": "Geral", - "app.components.LeftMenuLinkContainer.installNewPlugin": "Loja", - "app.components.LeftMenuLinkContainer.listPlugins": "Extensões", - "app.components.LeftMenuLinkContainer.noPluginsInstalled": "Ainda sem extensões instaladas", - "app.components.LeftMenuLinkContainer.plugins": "Extensões", - - "app.components.ListPluginsPage.helmet.title": "Lista de extensões", - "app.components.ListPluginsPage.title": "Extensões", - "app.components.ListPluginsPage.description": "Lista de extensões instaladas no projecto.", - "app.components.listPluginsPage.deletePlugin.error": "Ocorreu um erro ao desinstalar extensão", - "app.components.listPlugins.title.singular": "{number} de extensão instalada", - "app.components.listPlugins.title.plural": "{number} de extensões instaladas", - "app.components.listPlugins.title.none": "Sem extensões instaladas", - "app.components.listPlugins.button": "Adicionar nova Extensão", - - "app.components.NotFoundPage.description": "Não encontrado", - "app.components.NotFoundPage.back": "Voltar à página inicial", - - "app.components.Official": "Oficial", - - "app.components.PluginCard.compatible": "Compatível com a sua aplicação", - "app.components.PluginCard.compatibleCommunity": "Compativel com a comunidade", - "app.components.PluginCard.Button.label.download": "Transferir", - "app.components.PluginCard.Button.label.install": "Já instalado", - "app.components.PluginCard.Button.label.support": "Suporte-nos", - "app.components.PluginCard.price.free": "Gratuito", - "app.components.PluginCard.more-details": "Mais detalhes", - - "app.utils.placeholder.defaultMessage": "\u0020", - "app.utils.SelectOption.defaultMessage": "\u0020", - "app.utils.defaultMessage": "\u0020", - - "components.AutoReloadBlocker.header": "Recurso de recarga é necessário para esta extensão.", - "components.AutoReloadBlocker.description": "Abra o seguinte arquivo e ative o recurso.", - - "components.ErrorBoundary.title": "Algo deu errado...", - - "components.OverlayBlocker.title": "Aguardando pela reinicialização...", - "components.OverlayBlocker.description": "Você está a usar um recurso que precisa que o servidor seja reiniciado. Por favor, aguarde até que o servidor esteja totalmente reiniciado.", - - "components.PageFooter.select": "entradas por página", - - "components.ProductionBlocker.header": "Esta extensão está disponível apenas em desenvolvimento.", - "components.ProductionBlocker.description": "Por motivos de segurança, temos que desativar esta extensão em outros ambientes.", - - "components.popUpWarning.button.cancel": "Cancelar", - "components.popUpWarning.button.confirm": "Confirmar", - "components.popUpWarning.title": "Por favor, confirme", - "components.popUpWarning.message": "Tem a certeza que pretende apagar isto?", - - "components.Input.error.validation.email": "Isto não é um email", - "components.Input.error.validation.required": "Este valor é obrigatório.", - "components.Input.error.validation.regex": "O valor não corresponde ao regex.", - "components.Input.error.validation.max": "O valor é muito alto.", - "components.Input.error.validation.min": "O valor é muito baixo.", - "components.Input.error.validation.maxLength": "O valor é muito longo.", - "components.Input.error.validation.minLength": "O valor é muito curto.", - "components.Input.error.contentTypeName.taken": "Este nome já existe", - "components.Input.error.attribute.taken": "O nome deste campo já existe", - "components.Input.error.attribute.key.taken": "Este valor já existe", - "components.Input.error.attribute.sameKeyAndName": "Não pode ser igual", - "components.Input.error.validation.minSupMax": "Não pode ser superior", - "components.Input.error.custom-error": "{errorMessage} ", - "components.Input.error.validation.json": "Isto não corresponde com o formato JSON", - - "components.ListRow.empty": "Nenhuma data para ser mostrada.", - - "components.Wysiwyg.collapse": "Colapso", - "components.Wysiwyg.selectOptions.title": "Adicionar um título", - "components.Wysiwyg.selectOptions.H1": "Título H1", - "components.Wysiwyg.selectOptions.H2": "Título H2", - "components.Wysiwyg.selectOptions.H3": "Título H3", - "components.Wysiwyg.selectOptions.H4": "Título H4", - "components.Wysiwyg.selectOptions.H5": "Título H5", - "components.Wysiwyg.selectOptions.H6": "Título H6", - "components.Wysiwyg.ToggleMode.markdown": "Mudar para markdown", - "components.Wysiwyg.ToggleMode.preview": "Mudar para preview", - "components.WysiwygBottomControls.charactersIndicators": "caracteres", - "components.WysiwygBottomControls.uploadFiles": "Arraste e solte arquivos, cole na área de transferência ou {browse}.", - "components.WysiwygBottomControls.uploadFiles.browse": "Selecione-os", - "components.WysiwygBottomControls.fullscreen": "Expandir", - - "HomePage.notification.newsLetter.success": "Subscrito à newslatter com sucesso", - - "notification.error": "Ocorreu um erro", - "notification.error.layout": "Não foi possível recuperar o layout", - - "Users & Permissions": "Utilizador & Permições", - "Content Manager": "Gestor de conteúdo", - "Content Type Builder": "Construtor de Tipo de Conteúdo", - "Settings Manager": "Gerenciador de configurações", - "Email": "Email", - "Password": "Palavra-passe", - "Username": "Nome de utilizador", - "Provider": "Provedor", - "ResetPasswordToken": "Redefinir o token de senha", - "Role": "Função", - "New entry": "Nova entrada", - "request.error.model.unknown": "Este modelo não existe", - "Users": "Utilizadores", - "Analytics": "Analytics" - } - \ No newline at end of file + "Analytics": "Analytics", + "Content Manager": "Gestor de conteúdo", + "Content Type Builder": "Construtor de Tipo de Conteúdo", + "Email": "Email", + "HomePage.notification.newsLetter.success": "Subscrito à newslatter com sucesso", + "New entry": "Nova entrada", + "Password": "Palavra-passe", + "Provider": "Provedor", + "ResetPasswordToken": "Redefinir o token de senha", + "Role": "Função", + "Settings Manager": "Gerenciador de configurações", + "Username": "Nome de utilizador", + "Users": "Utilizadores", + "Users & Permissions": "Utilizador & Permições", + "app.components.BlockLink.code": "Exemplos de codigos", + "app.components.BlockLink.code.content": "Aprenda testando projetos reais desenvolvidos pela comunidade.", + "app.components.BlockLink.documentation": "Leia a documentação", + "app.components.BlockLink.documentation.content": "Descubra os conceptos, reference guides and tutorials.", + "app.components.Button.cancel": "Cancelar", + "app.components.Button.save": "Guardar", + "app.components.ComingSoonPage.comingSoon": "Em breve", + "app.components.ComingSoonPage.featuresNotAvailable": "Esta funcionalidade continua em desenvolvimento", + "app.components.DownloadInfo.download": "Transferência em curso...", + "app.components.DownloadInfo.text": "Isto poderá levar alguns minutos. Obrigado pela sua paciência", + "app.components.HomePage.button.blog": "VEJA MAIS NO BLOG", + "app.components.HomePage.button.quickStart": "COMEÇAR UM BREVE TUTORIAL", + "app.components.HomePage.community": "Encontre a comunidade na web", + "app.components.HomePage.community.content": "Converse com membros da equipe, colaboradores e desenvolvedores em diferentes canais.", + "app.components.HomePage.create": "Crie o seu primeiro Tipo de Conteúdo", + "app.components.HomePage.createBlock.content.first": "A ", + "app.components.HomePage.createBlock.content.second": " extensão irá ajudar-vos a definir a estrutura de dados de seus modelos. Se é novo aqui, nós recomendamos fortemente que você siga o nosso ", + "app.components.HomePage.createBlock.content.tutorial": " tutorial.", + "app.components.HomePage.cta": "CONFIRME", + "app.components.HomePage.newsLetter": "Subscreva-se à newsletter para ficar a par sobre Strapi", + "app.components.HomePage.support": "SUPORTE-NOS", + "app.components.HomePage.support.content": "Comprando a camisola, permitirá-nos continuar o nosso trabalho no projecto para dar à si a melhor experiência possível!", + "app.components.HomePage.support.link": "OBTENHA A SUA CAMISOLA AGORA", + "app.components.HomePage.welcome": "Bem-vindo(a) a bordo", + "app.components.HomePage.welcome.again": "Bem-vindo(a) ", + "app.components.HomePage.welcomeBlock.content": "Estamos felizes em tê-lo como um dos membros da comunidade. Estamos constantemente a procura de feeback então sinta-se à vontade para enviar-nos uma mensagem em privado no ", + "app.components.HomePage.welcomeBlock.content.again": "Esperamos que estejas a progredir em seu projecto... SInta-se à vontade em ler as nossas últimas publicações sobre Strapi. Estamos dando o nosso melhor para amelhorar o produto baseando-se no seu feedback.", + "app.components.HomePage.welcomeBlock.content.issues": "problemas.", + "app.components.HomePage.welcomeBlock.content.raise": " ou levante ", + "app.components.ImgPreview.hint": "Arraste & solte o seu arquivo nesta area ou {browse} um arquivo para fazer a transferência", + "app.components.ImgPreview.hint.browse": "procure", + "app.components.InputFile.newFile": "Adicionar um novo arquivo", + "app.components.InputFileDetails.open": "Abrir numa nova aba", + "app.components.InputFileDetails.originalName": "Nome original:", + "app.components.InputFileDetails.remove": "Remova este arquivo", + "app.components.InputFileDetails.size": "Tamanho:", + "app.components.InstallPluginPage.InputSearch.label": " ", + "app.components.InstallPluginPage.InputSearch.placeholder": "Procurar uma extensão... (ex: autenticação)", + "app.components.InstallPluginPage.description": "Extenda seu aplicativo sem esforço.", + "app.components.InstallPluginPage.helmet": "Marketplace - Extensões", + "app.components.InstallPluginPage.plugin.support-us.description": "Apoie-nos comprando a camisola Strapi. Isso permitirá-nos continuar trabalhando no projecto e dar à si a melhor experiência possível!", + "app.components.InstallPluginPage.title": "Marketplace - Extensões", + "app.components.InstallPluginPopup.downloads": "transferir", + "app.components.InstallPluginPopup.navLink.avis": "opiniões", + "app.components.InstallPluginPopup.navLink.changelog": "changelog", + "app.components.InstallPluginPopup.navLink.description": "Descrição", + "app.components.InstallPluginPopup.navLink.faq": "faq", + "app.components.InstallPluginPopup.navLink.screenshots": "Capturas de ecrã", + "app.components.InstallPluginPopup.noDescription": "Nenhuma descrição disponível", + "app.components.LeftMenuFooter.poweredBy": "Destribuído por ", + "app.components.LeftMenuLinkContainer.configuration": "Definições", + "app.components.LeftMenuLinkContainer.general": "Geral", + "app.components.LeftMenuLinkContainer.installNewPlugin": "Loja", + "app.components.LeftMenuLinkContainer.listPlugins": "Extensões", + "app.components.LeftMenuLinkContainer.noPluginsInstalled": "Ainda sem extensões instaladas", + "app.components.LeftMenuLinkContainer.plugins": "Extensões", + "app.components.ListPluginsPage.description": "Lista de extensões instaladas no projecto.", + "app.components.ListPluginsPage.helmet.title": "Lista de extensões", + "app.components.ListPluginsPage.title": "Extensões", + "app.components.NotFoundPage.back": "Voltar à página inicial", + "app.components.NotFoundPage.description": "Não encontrado", + "app.components.Official": "Oficial", + "app.components.PluginCard.Button.label.download": "Transferir", + "app.components.PluginCard.Button.label.install": "Já instalado", + "app.components.PluginCard.Button.label.support": "Suporte-nos", + "app.components.PluginCard.compatible": "Compatível com a sua aplicação", + "app.components.PluginCard.compatibleCommunity": "Compativel com a comunidade", + "app.components.PluginCard.more-details": "Mais detalhes", + "app.components.PluginCard.price.free": "Gratuito", + "app.components.listPlugins.button": "Adicionar nova Extensão", + "app.components.listPlugins.title.none": "Sem extensões instaladas", + "app.components.listPlugins.title.plural": "{number} de extensões instaladas", + "app.components.listPlugins.title.singular": "{number} de extensão instalada", + "app.components.listPluginsPage.deletePlugin.error": "Ocorreu um erro ao desinstalar extensão", + "app.utils.SelectOption.defaultMessage": " ", + "app.utils.defaultMessage": " ", + "app.utils.placeholder.defaultMessage": " ", + "components.AutoReloadBlocker.description": "Abra o seguinte arquivo e ative o recurso.", + "components.AutoReloadBlocker.header": "Recurso de recarga é necessário para esta extensão.", + "components.ErrorBoundary.title": "Algo deu errado...", + "components.Input.error.attribute.key.taken": "Este valor já existe", + "components.Input.error.attribute.sameKeyAndName": "Não pode ser igual", + "components.Input.error.attribute.taken": "O nome deste campo já existe", + "components.Input.error.contentTypeName.taken": "Este nome já existe", + "components.Input.error.custom-error": "{errorMessage} ", + "components.Input.error.validation.email": "Isto não é um email", + "components.Input.error.validation.json": "Isto não corresponde com o formato JSON", + "components.Input.error.validation.max": "O valor é muito alto.", + "components.Input.error.validation.maxLength": "O valor é muito longo.", + "components.Input.error.validation.min": "O valor é muito baixo.", + "components.Input.error.validation.minLength": "O valor é muito curto.", + "components.Input.error.validation.minSupMax": "Não pode ser superior", + "components.Input.error.validation.regex": "O valor não corresponde ao regex.", + "components.Input.error.validation.required": "Este valor é obrigatório.", + "components.ListRow.empty": "Nenhuma data para ser mostrada.", + "components.OverlayBlocker.description": "Você está a usar um recurso que precisa que o servidor seja reiniciado. Por favor, aguarde até que o servidor esteja totalmente reiniciado.", + "components.OverlayBlocker.title": "Aguardando pela reinicialização...", + "components.PageFooter.select": "entradas por página", + "components.ProductionBlocker.description": "Por motivos de segurança, temos que desativar esta extensão em outros ambientes.", + "components.ProductionBlocker.header": "Esta extensão está disponível apenas em desenvolvimento.", + "components.Wysiwyg.ToggleMode.markdown": "Mudar para markdown", + "components.Wysiwyg.ToggleMode.preview": "Mudar para preview", + "components.Wysiwyg.collapse": "Colapso", + "components.Wysiwyg.selectOptions.H1": "Título H1", + "components.Wysiwyg.selectOptions.H2": "Título H2", + "components.Wysiwyg.selectOptions.H3": "Título H3", + "components.Wysiwyg.selectOptions.H4": "Título H4", + "components.Wysiwyg.selectOptions.H5": "Título H5", + "components.Wysiwyg.selectOptions.H6": "Título H6", + "components.Wysiwyg.selectOptions.title": "Adicionar um título", + "components.WysiwygBottomControls.charactersIndicators": "caracteres", + "components.WysiwygBottomControls.fullscreen": "Expandir", + "components.WysiwygBottomControls.uploadFiles": "Arraste e solte arquivos, cole na área de transferência ou {browse}.", + "components.WysiwygBottomControls.uploadFiles.browse": "Selecione-os", + "components.popUpWarning.button.cancel": "Cancelar", + "components.popUpWarning.button.confirm": "Confirmar", + "components.popUpWarning.message": "Tem a certeza que pretende apagar isto?", + "components.popUpWarning.title": "Por favor, confirme", + "notification.error": "Ocorreu um erro", + "notification.error.layout": "Não foi possível recuperar o layout", + "request.error.model.unknown": "Este modelo não existe" +} \ No newline at end of file diff --git a/packages/strapi-admin/admin/src/translations/ru.json b/packages/strapi-admin/admin/src/translations/ru.json index 6178832419..c70c61fa64 100644 --- a/packages/strapi-admin/admin/src/translations/ru.json +++ b/packages/strapi-admin/admin/src/translations/ru.json @@ -1,166 +1,139 @@ { - "app.components.Button.save": "Сохранить", - "app.components.Button.cancel": "Отменить", - - "app.components.ComingSoonPage.comingSoon": "Скоро", - "app.components.ComingSoonPage.featuresNotAvailable": "Этот функционал все еще находится в стадии активной разработки.", - - "app.components.DownloadInfo.download": "Выполняется загрузка...", - "app.components.DownloadInfo.text": "Это может занять около минуты. Спасибо за ваше терпение.", - - "app.components.HomePage.welcome": "Добро пожаловать!", - "app.components.HomePage.cta": "ПОДТВЕРДИТЬ", - "app.components.HomePage.community": "Найти сообщество в интернете", - "app.components.HomePage.newsLetter": "Подпишитесь на рассылку, чтобы быть в курсе новостей о Strapi", - "app.components.HomePage.community.content": "Обсудите с членами команды и разработчиками в разных каналах", - "app.components.HomePage.create": "Создайте ваш первый Тип Контента", - "app.components.HomePage.welcomeBlock.content": "Мы рады, что вы вступили в сообщество. Нам необходима обратная связь для развития проекта, поэтому не стесняйтесь писать нам\u0020", - "app.components.HomePage.welcomeBlock.content.issues": "проблема.", - "app.components.HomePage.welcomeBlock.content.raise": "\u0020или поднять\u0020", - "app.components.HomePage.welcome.again": "Добро пожаловать", - "app.components.HomePage.welcomeBlock.content.again": "Надеемся у вы делаете успехи в вашем проекте... Следите с последними новостями о Strapi. Мы стараемся изо всех сил, чтобы улучшить продукт основываясь на ваших пожеланиях.", - "app.components.HomePage.createBlock.content.first": "\u0020", - "app.components.HomePage.createBlock.content.second": "\u0020плагин поможет вам создать структуру ваших данных. Если вы новичок, мы настоятельно рекомендуем вам следить за нашими\u0020", - "app.components.HomePage.createBlock.content.tutorial": "\u0020руководство.", - "app.components.HomePage.button.quickStart": "ОЗНАКОМТЕСЬ С РУКОВОДСТВОМ ПО БЫСТРОМУ СТАРТУ", - "app.components.HomePage.button.blog": "СМОТРИТЕ БОЛЬШЕ В БЛОГЕ", - "app.components.HomePage.support": "ПОДДЕРЖИТЕ НАС", - "app.components.HomePage.support.content": "Купите футболку, это поможет нам продолжать работу над проектом, чтобы предоставить вам наилучшее из возможных решений!", - "app.components.HomePage.support.link": "ЗАКАЗАТЬ НАШУ ФУТБОЛКУ СЕЙЧАС", - - "app.components.BlockLink.documentation": "Прочитать документацию", - "app.components.BlockLink.documentation.content": "Ознакомтесь с концепциями, документацией и обучающими материалами.", - "app.components.BlockLink.code": "Примеры кода", - "app.components.BlockLink.code.content": "Обучайтесь на реальных проектах разработанных в сообществе.", - - - "app.components.InputFile.newFile": "Добавить новый файл", - "app.components.InputFileDetails.open": "Открыть в новой вкладке", - "app.components.InputFileDetails.remove": "Удалить этот файл", - "app.components.InputFileDetails.originalName": "Первоначальное название:", - "app.components.InputFileDetails.size": "Размер:", - - "app.components.ImgPreview.hint": "Перетащите файл в эту область или {browse} для загрузки файла", - "app.components.ImgPreview.hint.browse": "просмотреть", - - "app.components.InstallPluginPage.helmet": "Магазин - Плагины", - "app.components.InstallPluginPage.title": "Магазин - Плагины", - "app.components.InstallPluginPage.description": "Расширяйте ваше приложение без усилий.", - "app.components.InstallPluginPage.plugin.support-us.description": "Поддержите нас купив футболку Strapi. Это поможет нам продолжать работу над проектом, чтобы предоставить вам наилучшее из возможных решений!", - "app.components.InstallPluginPage.InputSearch.label": " ", - "app.components.InstallPluginPage.InputSearch.placeholder": "Искать плагин... (ex: authentication)", - "app.components.InstallPluginPopup.downloads": "скачать", - "app.components.InstallPluginPopup.navLink.description": "Описание", - "app.components.InstallPluginPopup.navLink.screenshots": "Скриншоты", - "app.components.InstallPluginPopup.navLink.avis": "avis", - "app.components.InstallPluginPopup.navLink.faq": "faq", - "app.components.InstallPluginPopup.navLink.changelog": "журнал изменений", - "app.components.InstallPluginPopup.noDescription": "Нет описания", - - "app.components.LeftMenuFooter.poweredBy": "С гордостью предоставлено ", - "app.components.LeftMenuLinkContainer.configuration": "Настройки", - "app.components.LeftMenuLinkContainer.general": "Общие", - "app.components.LeftMenuLinkContainer.installNewPlugin": "Магазин", - "app.components.LeftMenuLinkContainer.listPlugins": "Плагины", - "app.components.LeftMenuLinkContainer.noPluginsInstalled": "Нет установленых плагинов", - "app.components.LeftMenuLinkContainer.plugins": "Плагины", - - "app.components.ListPluginsPage.helmet.title": "Список плагинов", - "app.components.ListPluginsPage.title": "Плагины", - "app.components.ListPluginsPage.description": "Список установленых плагинов.", - "app.components.listPluginsPage.deletePlugin.error": "Возникла ошибка при установке плагина", - "app.components.listPlugins.title.singular": "{number} плагин установлен", - "app.components.listPlugins.title.plural": "{number} плагинов установленно", - "app.components.listPlugins.title.none": "Нет установленых плагинов", - "app.components.listPlugins.button": "Добавить новый плагин", - - "app.components.NotFoundPage.description": "Не найдено", - "app.components.NotFoundPage.back": "Вернуться на главную", - - "app.components.Official": "Официальный", - - "app.components.PluginCard.compatible": "Совместимо с вашим приложением", - "app.components.PluginCard.compatibleCommunity": "Совместимо с сообществом", - "app.components.PluginCard.Button.label.download": "Скачать", - "app.components.PluginCard.Button.label.install": "Уже становленно", - "app.components.PluginCard.Button.label.support": "Поддержать нас", - "app.components.PluginCard.price.free": "Бесплатно", - "app.components.PluginCard.more-details": "Больше деталей", - - "app.utils.placeholder.defaultMessage": "\u0020", - "app.utils.SelectOption.defaultMessage": "\u0020", - "app.utils.defaultMessage": "\u0020", - - "components.AutoReloadBlocker.header": "Функционал перезапуска необходим для этого плагина.", - "components.AutoReloadBlocker.description": "Откройте соответствующий файл и активируйте функционал.", - - "components.ErrorBoundary.title": "Что-то пошло не так...", - - "components.OverlayBlocker.title": "Ожидание перезапуска...", - "components.OverlayBlocker.description": "Вы воспользовались функционалом который требует перезапуска сервера. Пожалуста подождете пока подниметься сервер.", - - "components.PageFooter.select": "записей на странице", - - "components.ProductionBlocker.header": "Этот плагин доступен только на стадии разработки.", - "components.ProductionBlocker.description": "Для безопасности мы должны заблокировать его для других вариантов.", - - "components.popUpWarning.button.cancel": "Отменить", - "components.popUpWarning.button.confirm": "Подтвердить", - "components.popUpWarning.title": "Пожалуйста подтвердите", - "components.popUpWarning.message": "Вы уверены, что хотите удалить это?", - - "components.Input.error.validation.email": "Это не адрес электронной почты", - "components.Input.error.validation.required": "Необходимое поле для заполнение.", - "components.Input.error.validation.regex": "Не соответствует регулярному выражению.", - "components.Input.error.validation.max": "Слишком большое.", - "components.Input.error.validation.min": "Слишком маленькое.", - "components.Input.error.validation.maxLength": "Слишком длинное.", - "components.Input.error.validation.minLength": "Слишком короткое.", - "components.Input.error.validation.json": "Не соответствует JSON формату", - "components.Input.error.contentTypeName.taken": "Это название уже существует", - "components.Input.error.attribute.taken": "Поле с таким названием уже существует", - "components.Input.error.attribute.key.taken": "Это значение уже существует", - "components.Input.error.attribute.sameKeyAndName": "Не может быть одинаковым", - "components.Input.error.validation.minSupMax": "Не может быть выше", - "components.Input.error.custom-error": "{errorMessage} ", - - "components.ListRow.empty": "Нет данных для отображения.", - - "components.Wysiwyg.collapse": "Свернуть", - "components.Wysiwyg.selectOptions.title": "Добавить заголовок", - "components.Wysiwyg.selectOptions.H1": "Заголовок H1", - "components.Wysiwyg.selectOptions.H2": "Заголовок H2", - "components.Wysiwyg.selectOptions.H3": "Заголовок H3", - "components.Wysiwyg.selectOptions.H4": "Заголовок H4", - "components.Wysiwyg.selectOptions.H5": "Заголовок H5", - "components.Wysiwyg.selectOptions.H6": "Заголовок H6", - "components.Wysiwyg.ToggleMode.markdown": "Переключить в режим markdown", - "components.Wysiwyg.ToggleMode.preview": "Переключить в режим предпросмотра", - "components.WysiwygBottomControls.charactersIndicators": "букв", - "components.WysiwygBottomControls.uploadFiles": "Перетащите файлы в эту область, добавляйте из буфер обмена или {browse}.", - "components.WysiwygBottomControls.uploadFiles.browse": "выделите их", - "components.WysiwygBottomControls.fullscreen": "Развернуть", - "Files Upload": "Загрузка файлов", - - - "HomePage.notification.newsLetter.success": "Успешная подписка на рассылку новостей", - - "notification.error": "Произошла ошибка", - "notification.error.layout": "Не удалось получить макет", - - "Users & Permissions": "Пользователи & Доступы", - "Roles & Permissions": "Роли и доступы", - "Content Manager": "Редактор контента", - "Content Type Builder": "Конструктор Типов Контента", - "Settings Manager": "Менеджер Настроек", - "Email": "Email", - "Password": "Пароль", - "Username": "Имя пользователя", - "Provider": "Провайдер", - "ResetPasswordToken": "Сбросить токен пароля", - "Role": "Роль", - "New entry": "Новая запись", - "request.error.model.unknown": "Модель данных не существует", - "Users": "Пользователи", - "Analytics": "Аналитика" - } + "Analytics": "Аналитика", + "Content Manager": "Редактор контента", + "Content Type Builder": "Конструктор Типов Контента", + "Email": "Email", + "Files Upload": "Загрузка файлов", + "HomePage.notification.newsLetter.success": "Успешная подписка на рассылку новостей", + "New entry": "Новая запись", + "Password": "Пароль", + "Provider": "Провайдер", + "ResetPasswordToken": "Сбросить токен пароля", + "Role": "Роль", + "Roles & Permissions": "Роли и доступы", + "Settings Manager": "Менеджер Настроек", + "Username": "Имя пользователя", + "Users": "Пользователи", + "Users & Permissions": "Пользователи & Доступы", + "app.components.BlockLink.code": "Примеры кода", + "app.components.BlockLink.code.content": "Обучайтесь на реальных проектах разработанных в сообществе.", + "app.components.BlockLink.documentation": "Прочитать документацию", + "app.components.BlockLink.documentation.content": "Ознакомтесь с концепциями, документацией и обучающими материалами.", + "app.components.Button.cancel": "Отменить", + "app.components.Button.save": "Сохранить", + "app.components.ComingSoonPage.comingSoon": "Скоро", + "app.components.ComingSoonPage.featuresNotAvailable": "Этот функционал все еще находится в стадии активной разработки.", + "app.components.DownloadInfo.download": "Выполняется загрузка...", + "app.components.DownloadInfo.text": "Это может занять около минуты. Спасибо за ваше терпение.", + "app.components.HomePage.button.blog": "СМОТРИТЕ БОЛЬШЕ В БЛОГЕ", + "app.components.HomePage.button.quickStart": "ОЗНАКОМТЕСЬ С РУКОВОДСТВОМ ПО БЫСТРОМУ СТАРТУ", + "app.components.HomePage.community": "Найти сообщество в интернете", + "app.components.HomePage.community.content": "Обсудите с членами команды и разработчиками в разных каналах", + "app.components.HomePage.create": "Создайте ваш первый Тип Контента", + "app.components.HomePage.createBlock.content.first": " ", + "app.components.HomePage.createBlock.content.second": " плагин поможет вам создать структуру ваших данных. Если вы новичок, мы настоятельно рекомендуем вам следить за нашими ", + "app.components.HomePage.createBlock.content.tutorial": " руководство.", + "app.components.HomePage.cta": "ПОДТВЕРДИТЬ", + "app.components.HomePage.newsLetter": "Подпишитесь на рассылку, чтобы быть в курсе новостей о Strapi", + "app.components.HomePage.support": "ПОДДЕРЖИТЕ НАС", + "app.components.HomePage.support.content": "Купите футболку, это поможет нам продолжать работу над проектом, чтобы предоставить вам наилучшее из возможных решений!", + "app.components.HomePage.support.link": "ЗАКАЗАТЬ НАШУ ФУТБОЛКУ СЕЙЧАС", + "app.components.HomePage.welcome": "Добро пожаловать!", + "app.components.HomePage.welcome.again": "Добро пожаловать", + "app.components.HomePage.welcomeBlock.content": "Мы рады, что вы вступили в сообщество. Нам необходима обратная связь для развития проекта, поэтому не стесняйтесь писать нам ", + "app.components.HomePage.welcomeBlock.content.again": "Надеемся у вы делаете успехи в вашем проекте... Следите с последними новостями о Strapi. Мы стараемся изо всех сил, чтобы улучшить продукт основываясь на ваших пожеланиях.", + "app.components.HomePage.welcomeBlock.content.issues": "проблема.", + "app.components.HomePage.welcomeBlock.content.raise": " или поднять ", + "app.components.ImgPreview.hint": "Перетащите файл в эту область или {browse} для загрузки файла", + "app.components.ImgPreview.hint.browse": "просмотреть", + "app.components.InputFile.newFile": "Добавить новый файл", + "app.components.InputFileDetails.open": "Открыть в новой вкладке", + "app.components.InputFileDetails.originalName": "Первоначальное название:", + "app.components.InputFileDetails.remove": "Удалить этот файл", + "app.components.InputFileDetails.size": "Размер:", + "app.components.InstallPluginPage.InputSearch.label": " ", + "app.components.InstallPluginPage.InputSearch.placeholder": "Искать плагин... (ex: authentication)", + "app.components.InstallPluginPage.description": "Расширяйте ваше приложение без усилий.", + "app.components.InstallPluginPage.helmet": "Магазин - Плагины", + "app.components.InstallPluginPage.plugin.support-us.description": "Поддержите нас купив футболку Strapi. Это поможет нам продолжать работу над проектом, чтобы предоставить вам наилучшее из возможных решений!", + "app.components.InstallPluginPage.title": "Магазин - Плагины", + "app.components.InstallPluginPopup.downloads": "скачать", + "app.components.InstallPluginPopup.navLink.avis": "avis", + "app.components.InstallPluginPopup.navLink.changelog": "журнал изменений", + "app.components.InstallPluginPopup.navLink.description": "Описание", + "app.components.InstallPluginPopup.navLink.faq": "faq", + "app.components.InstallPluginPopup.navLink.screenshots": "Скриншоты", + "app.components.InstallPluginPopup.noDescription": "Нет описания", + "app.components.LeftMenuFooter.poweredBy": "С гордостью предоставлено ", + "app.components.LeftMenuLinkContainer.configuration": "Настройки", + "app.components.LeftMenuLinkContainer.general": "Общие", + "app.components.LeftMenuLinkContainer.installNewPlugin": "Магазин", + "app.components.LeftMenuLinkContainer.listPlugins": "Плагины", + "app.components.LeftMenuLinkContainer.noPluginsInstalled": "Нет установленых плагинов", + "app.components.LeftMenuLinkContainer.plugins": "Плагины", + "app.components.ListPluginsPage.description": "Список установленых плагинов.", + "app.components.ListPluginsPage.helmet.title": "Список плагинов", + "app.components.ListPluginsPage.title": "Плагины", + "app.components.NotFoundPage.back": "Вернуться на главную", + "app.components.NotFoundPage.description": "Не найдено", + "app.components.Official": "Официальный", + "app.components.PluginCard.Button.label.download": "Скачать", + "app.components.PluginCard.Button.label.install": "Уже становленно", + "app.components.PluginCard.Button.label.support": "Поддержать нас", + "app.components.PluginCard.compatible": "Совместимо с вашим приложением", + "app.components.PluginCard.compatibleCommunity": "Совместимо с сообществом", + "app.components.PluginCard.more-details": "Больше деталей", + "app.components.PluginCard.price.free": "Бесплатно", + "app.components.listPlugins.button": "Добавить новый плагин", + "app.components.listPlugins.title.none": "Нет установленых плагинов", + "app.components.listPlugins.title.plural": "{number} плагинов установленно", + "app.components.listPlugins.title.singular": "{number} плагин установлен", + "app.components.listPluginsPage.deletePlugin.error": "Возникла ошибка при установке плагина", + "app.utils.SelectOption.defaultMessage": " ", + "app.utils.defaultMessage": " ", + "app.utils.placeholder.defaultMessage": " ", + "components.AutoReloadBlocker.description": "Откройте соответствующий файл и активируйте функционал.", + "components.AutoReloadBlocker.header": "Функционал перезапуска необходим для этого плагина.", + "components.ErrorBoundary.title": "Что-то пошло не так...", + "components.Input.error.attribute.key.taken": "Это значение уже существует", + "components.Input.error.attribute.sameKeyAndName": "Не может быть одинаковым", + "components.Input.error.attribute.taken": "Поле с таким названием уже существует", + "components.Input.error.contentTypeName.taken": "Это название уже существует", + "components.Input.error.custom-error": "{errorMessage} ", + "components.Input.error.validation.email": "Это не адрес электронной почты", + "components.Input.error.validation.json": "Не соответствует JSON формату", + "components.Input.error.validation.max": "Слишком большое.", + "components.Input.error.validation.maxLength": "Слишком длинное.", + "components.Input.error.validation.min": "Слишком маленькое.", + "components.Input.error.validation.minLength": "Слишком короткое.", + "components.Input.error.validation.minSupMax": "Не может быть выше", + "components.Input.error.validation.regex": "Не соответствует регулярному выражению.", + "components.Input.error.validation.required": "Необходимое поле для заполнение.", + "components.ListRow.empty": "Нет данных для отображения.", + "components.OverlayBlocker.description": "Вы воспользовались функционалом который требует перезапуска сервера. Пожалуста подождете пока подниметься сервер.", + "components.OverlayBlocker.title": "Ожидание перезапуска...", + "components.PageFooter.select": "записей на странице", + "components.ProductionBlocker.description": "Для безопасности мы должны заблокировать его для других вариантов.", + "components.ProductionBlocker.header": "Этот плагин доступен только на стадии разработки.", + "components.Wysiwyg.ToggleMode.markdown": "Переключить в режим markdown", + "components.Wysiwyg.ToggleMode.preview": "Переключить в режим предпросмотра", + "components.Wysiwyg.collapse": "Свернуть", + "components.Wysiwyg.selectOptions.H1": "Заголовок H1", + "components.Wysiwyg.selectOptions.H2": "Заголовок H2", + "components.Wysiwyg.selectOptions.H3": "Заголовок H3", + "components.Wysiwyg.selectOptions.H4": "Заголовок H4", + "components.Wysiwyg.selectOptions.H5": "Заголовок H5", + "components.Wysiwyg.selectOptions.H6": "Заголовок H6", + "components.Wysiwyg.selectOptions.title": "Добавить заголовок", + "components.WysiwygBottomControls.charactersIndicators": "букв", + "components.WysiwygBottomControls.fullscreen": "Развернуть", + "components.WysiwygBottomControls.uploadFiles": "Перетащите файлы в эту область, добавляйте из буфер обмена или {browse}.", + "components.WysiwygBottomControls.uploadFiles.browse": "выделите их", + "components.popUpWarning.button.cancel": "Отменить", + "components.popUpWarning.button.confirm": "Подтвердить", + "components.popUpWarning.message": "Вы уверены, что хотите удалить это?", + "components.popUpWarning.title": "Пожалуйста подтвердите", + "notification.error": "Произошла ошибка", + "notification.error.layout": "Не удалось получить макет", + "request.error.model.unknown": "Модель данных не существует" +} \ No newline at end of file diff --git a/packages/strapi-admin/admin/src/translations/tr.json b/packages/strapi-admin/admin/src/translations/tr.json index 0bc2bd7af5..86b2d46078 100644 --- a/packages/strapi-admin/admin/src/translations/tr.json +++ b/packages/strapi-admin/admin/src/translations/tr.json @@ -1,62 +1,69 @@ { - "app.components.Button.save": "Kaydet", + "Analytics": "Analizler", + "Content Manager": "İçerik Yönetimi", + "Content Type Builder": "İçerik Türü Oluşturucusu", + "Email": "E-posta", + "Files Upload": "Dosya yükleme", + "HomePage.notification.newsLetter.success": "Bültene başarıyla abone olundu", + "New entry": "Yeni kayıt", + "Password": "Şifre", + "Provider": "Sağlayıcı", + "ResetPasswordToken": "Şifre sıfırlama anahtarı", + "Role": "Rol", + "Roles & Permissions": "Roller & İzinler", + "Settings Manager": "Yönetici Ayarları", + "Username": "Kullanıcı Adı", + "Users": "Kullanıcılar", + "Users & Permissions": "Kullanıcılar & İzinler", + "app.components.BlockLink.code": "Kod örnekleri", + "app.components.BlockLink.code.content": "Topluluk tarafından geliştirilen gerçek projeleri test ederek öğren.", + "app.components.BlockLink.documentation": "Dokümantasyonu oku", + "app.components.BlockLink.documentation.content": "Kavramları, referans kılavuzlarını ve öğreticileri keşfedin.", "app.components.Button.cancel": "İptal", - + "app.components.Button.save": "Kaydet", "app.components.ComingSoonPage.comingSoon": "Çok Yakında", "app.components.ComingSoonPage.featuresNotAvailable": "Bu özellik geliştirme aşamasındadır.", - "app.components.DownloadInfo.download": "İndirme devam ediyor...", "app.components.DownloadInfo.text": "Bu birkaç dakika sürebilir. Sabrınız için teşekkürler.", - - "app.components.HomePage.welcome": "Panele hoşgeldiniz.", - "app.components.HomePage.welcome.again": "Hoşgeldiniz ", - "app.components.HomePage.cta": "ONAYLA", + "app.components.HomePage.button.blog": "BLOG SAYFASINDA DAHA FAZLASINI GÖRÜN", + "app.components.HomePage.button.quickStart": "HIZLI BAŞLANGIÇ YAP", "app.components.HomePage.community": "Topluluğumuza ulaşın", - "app.components.HomePage.newsLetter": "Strapi hakkında bilgi almak için bültene abone olun", "app.components.HomePage.community.content": "Farklı kanallarda takım üyeleri, katkıda bulunanlar ve geliştiricilere ulaşın.", "app.components.HomePage.create": "İlk içerik tipinizi oluşturun", - "app.components.HomePage.welcomeBlock.content": "Sizi topluluk üyelerinden biri olarak görmekten mutluyuz. Sürekli olarak geri bildirim alabilmemiz için bize doğrudan mesaj göndermeye çekinmeyin\u0020", - "app.components.HomePage.welcomeBlock.content.again": "Projenizde ilerleme kaydedeceğinizi umuyoruz... Strapi ile ilgili en yeni yenilikleri okumaktan çekinmeyin. Ürünü geri bildirimlerinize göre geliştirmek için elimizden geleni yapıyoruz.", - "app.components.HomePage.welcomeBlock.content.issues": "sorunlar", - "app.components.HomePage.welcomeBlock.content.raise": "\u0020yada yükselt\u0020", - "app.components.HomePage.createBlock.content.first": "The\u0020", - "app.components.HomePage.createBlock.content.second": "\u0020eklenti, modelinizin veri yapısını tanımlamanıza yardımcı olacaktır. Burada yeniyseniz, takip etmenizi öneririz\u0020", - "app.components.HomePage.createBlock.content.tutorial": "\u0020öğretici.", - "app.components.HomePage.button.quickStart": "HIZLI BAŞLANGIÇ YAP", - "app.components.HomePage.button.blog": "BLOG SAYFASINDA DAHA FAZLASINI GÖRÜN", + "app.components.HomePage.createBlock.content.first": "The ", + "app.components.HomePage.createBlock.content.second": " eklenti, modelinizin veri yapısını tanımlamanıza yardımcı olacaktır. Burada yeniyseniz, takip etmenizi öneririz ", + "app.components.HomePage.createBlock.content.tutorial": " öğretici.", + "app.components.HomePage.cta": "ONAYLA", + "app.components.HomePage.newsLetter": "Strapi hakkında bilgi almak için bültene abone olun", "app.components.HomePage.support": "BİZİ DESTEKLE", "app.components.HomePage.support.content": "Tişört satın almanız, size mümkün olan en iyi deneyimi sunmak için projemizdeki çalışmalarımıza devam etmemize yardımcı olacak!", "app.components.HomePage.support.link": "ŞİMDİ TİŞÖRTÜNÜZÜ ALIN", - - "app.components.BlockLink.documentation": "Dokümantasyonu oku", - "app.components.BlockLink.documentation.content": "Kavramları, referans kılavuzlarını ve öğreticileri keşfedin.", - "app.components.BlockLink.code": "Kod örnekleri", - "app.components.BlockLink.code.content": "Topluluk tarafından geliştirilen gerçek projeleri test ederek öğren.", - - - "app.components.InputFile.newFile": "Yeni dosya ekle", - "app.components.InputFileDetails.open": "Yeni sekmede aç", - "app.components.InputFileDetails.remove": "Bu dosyayı sil", - "app.components.InputFileDetails.originalName": "Orjinal isim:", - "app.components.InputFileDetails.size": "Boyut:", - + "app.components.HomePage.welcome": "Panele hoşgeldiniz.", + "app.components.HomePage.welcome.again": "Hoşgeldiniz ", + "app.components.HomePage.welcomeBlock.content": "Sizi topluluk üyelerinden biri olarak görmekten mutluyuz. Sürekli olarak geri bildirim alabilmemiz için bize doğrudan mesaj göndermeye çekinmeyin ", + "app.components.HomePage.welcomeBlock.content.again": "Projenizde ilerleme kaydedeceğinizi umuyoruz... Strapi ile ilgili en yeni yenilikleri okumaktan çekinmeyin. Ürünü geri bildirimlerinize göre geliştirmek için elimizden geleni yapıyoruz.", + "app.components.HomePage.welcomeBlock.content.issues": "sorunlar", + "app.components.HomePage.welcomeBlock.content.raise": " yada yükselt ", "app.components.ImgPreview.hint": "Dosyanızı bu alana sürükleyip bırakın ya da bir dosya yüklemek için {browse}", "app.components.ImgPreview.hint.browse": "gözat", - - "app.components.InstallPluginPage.helmet": "Mağaza - Eklentiler", - "app.components.InstallPluginPage.title": "Mağaza - Eklentiler", - "app.components.InstallPluginPage.description": "Uygulamanızı rahatlıkla genişletin.", - "app.components.InstallPluginPage.plugin.support-us.description": "Strapi tişörtünü satın alarak bize destek olun. Bu, projede çalışmaya devam etmemize ve size mümkün olan en iyi deneyimi sunmamızı sağlayacaktır!", + "app.components.InputFile.newFile": "Yeni dosya ekle", + "app.components.InputFileDetails.open": "Yeni sekmede aç", + "app.components.InputFileDetails.originalName": "Orjinal isim:", + "app.components.InputFileDetails.remove": "Bu dosyayı sil", + "app.components.InputFileDetails.size": "Boyut:", "app.components.InstallPluginPage.InputSearch.label": " ", "app.components.InstallPluginPage.InputSearch.placeholder": "Eklenti ara... (örnek: authentication)", + "app.components.InstallPluginPage.description": "Uygulamanızı rahatlıkla genişletin.", + "app.components.InstallPluginPage.helmet": "Mağaza - Eklentiler", + "app.components.InstallPluginPage.plugin.support-us.description": "Strapi tişörtünü satın alarak bize destek olun. Bu, projede çalışmaya devam etmemize ve size mümkün olan en iyi deneyimi sunmamızı sağlayacaktır!", + "app.components.InstallPluginPage.title": "Mağaza - Eklentiler", "app.components.InstallPluginPopup.downloads": "indir", - "app.components.InstallPluginPopup.navLink.description": "Açıklama", - "app.components.InstallPluginPopup.navLink.screenshots": "Ekran Görüntüleri", "app.components.InstallPluginPopup.navLink.avis": "avis", - "app.components.InstallPluginPopup.navLink.faq": "sss", "app.components.InstallPluginPopup.navLink.changelog": "Değişim Günlüğü", + "app.components.InstallPluginPopup.navLink.description": "Açıklama", + "app.components.InstallPluginPopup.navLink.faq": "sss", + "app.components.InstallPluginPopup.navLink.screenshots": "Ekran Görüntüleri", "app.components.InstallPluginPopup.noDescription": "Açıklama bulunmamaktadır.", - "app.components.LeftMenuFooter.poweredBy": "Gururla sunar ", "app.components.LeftMenuLinkContainer.configuration": "Yapılandırma", "app.components.LeftMenuLinkContainer.general": "Genel", @@ -64,102 +71,69 @@ "app.components.LeftMenuLinkContainer.listPlugins": "Eklentiler", "app.components.LeftMenuLinkContainer.noPluginsInstalled": "Yüklenen eklenti bulunmamaktadır.", "app.components.LeftMenuLinkContainer.plugins": "Eklentiler", - + "app.components.ListPluginsPage.description": "Projedeki yüklenen eklentiler.", "app.components.ListPluginsPage.helmet.title": "Eklenti Listesi", "app.components.ListPluginsPage.title": "Etklentiler", - "app.components.ListPluginsPage.description": "Projedeki yüklenen eklentiler.", - "app.components.listPluginsPage.deletePlugin.error": "Eklenti kaldırılırken bir hata oluştu", - "app.components.listPlugins.title.singular": "{number} eklenti yüklü", - "app.components.listPlugins.title.plural": "{number} eklenti yüklü", - "app.components.listPlugins.title.none": "Yüklenen eklenti bulunmamaktadır.", - "app.components.listPlugins.button": "Yeni eklenti ekle", - - "app.components.NotFoundPage.description": "Bulunamadı", "app.components.NotFoundPage.back": "Anasayfaya geri dön", - + "app.components.NotFoundPage.description": "Bulunamadı", "app.components.Official": "Resmi", - - "app.components.PluginCard.compatible": "Uygulamanızla uyumlu", - "app.components.PluginCard.compatibleCommunity": "Toplulukla uyumlu", "app.components.PluginCard.Button.label.download": "İndir", "app.components.PluginCard.Button.label.install": "Zaten yüklenmiş", "app.components.PluginCard.Button.label.support": "Bizi destekleyin", - "app.components.PluginCard.price.free": "Ücretsiz", + "app.components.PluginCard.compatible": "Uygulamanızla uyumlu", + "app.components.PluginCard.compatibleCommunity": "Toplulukla uyumlu", "app.components.PluginCard.more-details": "Daha fazla detay", - - "app.utils.placeholder.defaultMessage": "\u0020", - "app.utils.SelectOption.defaultMessage": "\u0020", - "app.utils.defaultMessage": "\u0020", - - "components.AutoReloadBlocker.header": "Bu eklenti için tekrar yükleme özelliği gerekiyor.", + "app.components.PluginCard.price.free": "Ücretsiz", + "app.components.listPlugins.button": "Yeni eklenti ekle", + "app.components.listPlugins.title.none": "Yüklenen eklenti bulunmamaktadır.", + "app.components.listPlugins.title.plural": "{number} eklenti yüklü", + "app.components.listPlugins.title.singular": "{number} eklenti yüklü", + "app.components.listPluginsPage.deletePlugin.error": "Eklenti kaldırılırken bir hata oluştu", + "app.utils.SelectOption.defaultMessage": " ", + "app.utils.defaultMessage": " ", + "app.utils.placeholder.defaultMessage": " ", "components.AutoReloadBlocker.description": "Aşağıdaki dosyayı açın ve özelliği etkinleştirin.", - + "components.AutoReloadBlocker.header": "Bu eklenti için tekrar yükleme özelliği gerekiyor.", "components.ErrorBoundary.title": "Bir şeyler yanlış gitti...", - - "components.OverlayBlocker.title": "Yeniden başlatılmayı bekliyor...", - "components.OverlayBlocker.description": "Sunucunun yeniden başlatılması gereken bir özellik kullanıyorsunuz. Lütfen sunucu çalışana kadar bekleyin.", - - "components.PageFooter.select": "sayfa başına kayıt", - - "components.ProductionBlocker.header": "Bu eklenti yalnızca geliştirme aşamasında mevcuttur.", - "components.ProductionBlocker.description": "Güvenlik nedeniyle, bu eklentiyi diğer ortamlarda devre dışı bırakmamız gerekir.", - - "components.popUpWarning.button.cancel": "İptal", - "components.popUpWarning.button.confirm": "Onayla", - "components.popUpWarning.title": "Lütfen onaylayın", - "components.popUpWarning.message": "Bunu silmek istediğinizden emin misiniz?", - - "components.Input.error.validation.email": "Geçersiz e-posta adresi.", - "components.Input.error.validation.required": "Zorunlu alandır.", - "components.Input.error.validation.regex": "Regex ile eşleşmiyor.", - "components.Input.error.validation.max": "Değer çok yüksek.", - "components.Input.error.validation.min": "Değer çok az.", - "components.Input.error.validation.maxLength": "Değer çok uzun.", - "components.Input.error.validation.minLength": "Değer çok kısa.", - "components.Input.error.contentTypeName.taken": "Bu isim zaten var.", - "components.Input.error.attribute.taken": "Bu alan ismi zaten var.", "components.Input.error.attribute.key.taken": "Bu değer zaten var.", "components.Input.error.attribute.sameKeyAndName": "Eşit olamaz", - "components.Input.error.validation.minSupMax": "Üstü olamaz", + "components.Input.error.attribute.taken": "Bu alan ismi zaten var.", + "components.Input.error.contentTypeName.taken": "Bu isim zaten var.", "components.Input.error.custom-error": "{errorMessage} ", + "components.Input.error.validation.email": "Geçersiz e-posta adresi.", "components.Input.error.validation.json": "Bu JSON biçimi ile eşleşmiyor", - + "components.Input.error.validation.max": "Değer çok yüksek.", + "components.Input.error.validation.maxLength": "Değer çok uzun.", + "components.Input.error.validation.min": "Değer çok az.", + "components.Input.error.validation.minLength": "Değer çok kısa.", + "components.Input.error.validation.minSupMax": "Üstü olamaz", + "components.Input.error.validation.regex": "Regex ile eşleşmiyor.", + "components.Input.error.validation.required": "Zorunlu alandır.", "components.ListRow.empty": "Gösterilecek veri bulunmamaktadır.", - + "components.OverlayBlocker.description": "Sunucunun yeniden başlatılması gereken bir özellik kullanıyorsunuz. Lütfen sunucu çalışana kadar bekleyin.", + "components.OverlayBlocker.title": "Yeniden başlatılmayı bekliyor...", + "components.PageFooter.select": "sayfa başına kayıt", + "components.ProductionBlocker.description": "Güvenlik nedeniyle, bu eklentiyi diğer ortamlarda devre dışı bırakmamız gerekir.", + "components.ProductionBlocker.header": "Bu eklenti yalnızca geliştirme aşamasında mevcuttur.", + "components.Wysiwyg.ToggleMode.markdown": "Markdown'a geçiş yap", + "components.Wysiwyg.ToggleMode.preview": "Önizleme görünümü", "components.Wysiwyg.collapse": "Daralt", - "components.Wysiwyg.selectOptions.title": "Başlık ekle", "components.Wysiwyg.selectOptions.H1": "H1 başlık", "components.Wysiwyg.selectOptions.H2": "H2 başlık", "components.Wysiwyg.selectOptions.H3": "H3 başlık", "components.Wysiwyg.selectOptions.H4": "H4 başlık", "components.Wysiwyg.selectOptions.H5": "H5 başlık", "components.Wysiwyg.selectOptions.H6": "H6 başlık", - "components.Wysiwyg.ToggleMode.markdown": "Markdown'a geçiş yap", - "components.Wysiwyg.ToggleMode.preview": "Önizleme görünümü", + "components.Wysiwyg.selectOptions.title": "Başlık ekle", "components.WysiwygBottomControls.charactersIndicators": "karakter", + "components.WysiwygBottomControls.fullscreen": "Genişlet", "components.WysiwygBottomControls.uploadFiles": "Dosyanızı bu alana sürükleyip bırakın ya da bir dosya yüklemek için {browse}", "components.WysiwygBottomControls.uploadFiles.browse": "Bunları seç", - "components.WysiwygBottomControls.fullscreen": "Genişlet", - - "HomePage.notification.newsLetter.success": "Bültene başarıyla abone olundu", - + "components.popUpWarning.button.cancel": "İptal", + "components.popUpWarning.button.confirm": "Onayla", + "components.popUpWarning.message": "Bunu silmek istediğinizden emin misiniz?", + "components.popUpWarning.title": "Lütfen onaylayın", "notification.error": "Bir hata oluştu", "notification.error.layout": "Düzen alınamadı", - - "Users & Permissions": "Kullanıcılar & İzinler", - "Content Manager": "İçerik Yönetimi", - "Content Type Builder": "İçerik Türü Oluşturucusu", - "Files Upload": "Dosya yükleme", - "Roles & Permissions": "Roller & İzinler", - "Settings Manager": "Yönetici Ayarları", - "Email": "E-posta", - "Password": "Şifre", - "Username": "Kullanıcı Adı", - "Provider": "Sağlayıcı", - "ResetPasswordToken": "Şifre sıfırlama anahtarı", - "Role": "Rol", - "New entry": "Yeni kayıt", - "request.error.model.unknown": "Bu model bulunmamaktadır.", - "Users": "Kullanıcılar", - "Analytics": "Analizler" -} + "request.error.model.unknown": "Bu model bulunmamaktadır." +} \ No newline at end of file diff --git a/packages/strapi-admin/admin/src/translations/zh-Hans.json b/packages/strapi-admin/admin/src/translations/zh-Hans.json index 1edd3bc6e4..666d0f9b29 100644 --- a/packages/strapi-admin/admin/src/translations/zh-Hans.json +++ b/packages/strapi-admin/admin/src/translations/zh-Hans.json @@ -1,62 +1,67 @@ { - "app.components.Button.save": "保存", + "Analytics": "分析", + "Content Manager": "内容管理", + "Content Type Builder": "内容类型生成器", + "Email": "邮件", + "HomePage.notification.newsLetter.success": "成功订阅简讯", + "New entry": "新入口", + "Password": "密码", + "Provider": "供应商", + "ResetPasswordToken": "密码重置", + "Role": "角色", + "Settings Manager": "管理设置", + "Username": "用户名", + "Users": "用户", + "Users & Permissions": "用户 & 权限", + "app.components.BlockLink.code": "代码示例", + "app.components.BlockLink.code.content": "通过测试社区的真实项目来学习。", + "app.components.BlockLink.documentation": "阅读文档", + "app.components.BlockLink.documentation.content": "发现基本概念,参考指南和教程。", "app.components.Button.cancel": "取消", - + "app.components.Button.save": "保存", "app.components.ComingSoonPage.comingSoon": "即将推出", "app.components.ComingSoonPage.featuresNotAvailable": "这个功能只在活跃开发中", - "app.components.DownloadInfo.download": "正在下载...", "app.components.DownloadInfo.text": "这可能需要几分钟,谢谢你的耐心。", - - "app.components.HomePage.welcome": "欢迎回来", - "app.components.HomePage.welcome.again": "欢迎 ", - "app.components.HomePage.cta": "请确认", + "app.components.HomePage.button.blog": "在博客上看到更多", + "app.components.HomePage.button.quickStart": "快速入门教程", "app.components.HomePage.community": "在网络上找到社区", - "app.components.HomePage.newsLetter": "订阅Strapi简讯", "app.components.HomePage.community.content": "与团队成员、贡献者和开发人员在不同的渠道进行讨论。", "app.components.HomePage.create": "创建第一个Content Type", - "app.components.HomePage.welcomeBlock.content": "我们很高兴有你成为社区成员之一。我们一直在寻找反馈,所以可以随时给我们发送消息。 on\u0020", - "app.components.HomePage.welcomeBlock.content.again": "我们希望你在项目上取得进展。请随意阅读关于Strapi的最新消息。我们将尽最大努力根据您的反馈改进产品。", - "app.components.HomePage.welcomeBlock.content.issues": "issues.", - "app.components.HomePage.welcomeBlock.content.raise": "\u0020or raise\u0020", - "app.components.HomePage.createBlock.content.first": "The\u0020", - "app.components.HomePage.createBlock.content.second": "\u0020插件将帮助您定义模型的数据结构。如果你是刚接触Strapi,我们强烈推荐你跟随我们。\u0020", - "app.components.HomePage.createBlock.content.tutorial": "\u0020tutorial.", - "app.components.HomePage.button.quickStart": "快速入门教程", - "app.components.HomePage.button.blog": "在博客上看到更多", + "app.components.HomePage.createBlock.content.first": "The ", + "app.components.HomePage.createBlock.content.second": " 插件将帮助您定义模型的数据结构。如果你是刚接触Strapi,我们强烈推荐你跟随我们。 ", + "app.components.HomePage.createBlock.content.tutorial": " tutorial.", + "app.components.HomePage.cta": "请确认", + "app.components.HomePage.newsLetter": "订阅Strapi简讯", "app.components.HomePage.support": "支持我们", "app.components.HomePage.support.content": "通过购买T恤来支持我们,它将允许我们继续我们的项目工作,给你最好的体验!", "app.components.HomePage.support.link": "现在购买T恤", - - "app.components.BlockLink.documentation": "阅读文档", - "app.components.BlockLink.documentation.content": "发现基本概念,参考指南和教程。", - "app.components.BlockLink.code": "代码示例", - "app.components.BlockLink.code.content": "通过测试社区的真实项目来学习。", - - - "app.components.InputFile.newFile": "增加新文件", - "app.components.InputFileDetails.open": "在新选项卡中打开", - "app.components.InputFileDetails.remove": "删除这个文件", - "app.components.InputFileDetails.originalName": "原名称:", - "app.components.InputFileDetails.size": "大小:", - + "app.components.HomePage.welcome": "欢迎回来", + "app.components.HomePage.welcome.again": "欢迎 ", + "app.components.HomePage.welcomeBlock.content": "我们很高兴有你成为社区成员之一。我们一直在寻找反馈,所以可以随时给我们发送消息。 on ", + "app.components.HomePage.welcomeBlock.content.again": "我们希望你在项目上取得进展。请随意阅读关于Strapi的最新消息。我们将尽最大努力根据您的反馈改进产品。", + "app.components.HomePage.welcomeBlock.content.issues": "issues.", + "app.components.HomePage.welcomeBlock.content.raise": " or raise ", "app.components.ImgPreview.hint": "将文件拖放到该区域或{browse}以供文件上载", "app.components.ImgPreview.hint.browse": "浏览", - - "app.components.InstallPluginPage.helmet": "市场-插件", - "app.components.InstallPluginPage.title": "市场-插件", - "app.components.InstallPluginPage.description": "轻松地扩展你的应用程序。", - "app.components.InstallPluginPage.plugin.support-us.description": "通过购买Strapi T恤支持我们。这将使我们能够继续致力于这个项目,并尝试给你最好的体验!", + "app.components.InputFile.newFile": "增加新文件", + "app.components.InputFileDetails.open": "在新选项卡中打开", + "app.components.InputFileDetails.originalName": "原名称:", + "app.components.InputFileDetails.remove": "删除这个文件", + "app.components.InputFileDetails.size": "大小:", "app.components.InstallPluginPage.InputSearch.label": " ", "app.components.InstallPluginPage.InputSearch.placeholder": "搜索插件… (ex: authentication)", + "app.components.InstallPluginPage.description": "轻松地扩展你的应用程序。", + "app.components.InstallPluginPage.helmet": "市场-插件", + "app.components.InstallPluginPage.plugin.support-us.description": "通过购买Strapi T恤支持我们。这将使我们能够继续致力于这个项目,并尝试给你最好的体验!", + "app.components.InstallPluginPage.title": "市场-插件", "app.components.InstallPluginPopup.downloads": "下载", - "app.components.InstallPluginPopup.navLink.description": "描述", - "app.components.InstallPluginPopup.navLink.screenshots": "截屏", "app.components.InstallPluginPopup.navLink.avis": "avis", - "app.components.InstallPluginPopup.navLink.faq": "faq", "app.components.InstallPluginPopup.navLink.changelog": "更新日志", + "app.components.InstallPluginPopup.navLink.description": "描述", + "app.components.InstallPluginPopup.navLink.faq": "faq", + "app.components.InstallPluginPopup.navLink.screenshots": "截屏", "app.components.InstallPluginPopup.noDescription": "没有描述", - "app.components.LeftMenuFooter.poweredBy": "技术支持", "app.components.LeftMenuLinkContainer.configuration": "配置", "app.components.LeftMenuLinkContainer.general": "一般", @@ -64,99 +69,68 @@ "app.components.LeftMenuLinkContainer.listPlugins": "插件", "app.components.LeftMenuLinkContainer.noPluginsInstalled": "还没有安装插件", "app.components.LeftMenuLinkContainer.plugins": "插件", - + "app.components.ListPluginsPage.description": "项目中已安装的插件列表", "app.components.ListPluginsPage.helmet.title": "插件列表", "app.components.ListPluginsPage.title": "插件", - "app.components.ListPluginsPage.description": "项目中已安装的插件列表", - "app.components.listPluginsPage.deletePlugin.error": "卸载插件时出错", - "app.components.listPlugins.title.singular": "{number} 个插件已安装", - "app.components.listPlugins.title.plural": "{number} 个插件已安装", - "app.components.listPlugins.title.none": "还没有安装插件", - "app.components.listPlugins.button": "增加新插件", - - "app.components.NotFoundPage.description": "没有找到", "app.components.NotFoundPage.back": "返回主页", - + "app.components.NotFoundPage.description": "没有找到", "app.components.Official": "官方", - - "app.components.PluginCard.compatible": "与你的应用程序兼容", - "app.components.PluginCard.compatibleCommunity": "与社区兼容", "app.components.PluginCard.Button.label.download": "下载", "app.components.PluginCard.Button.label.install": "已下载", "app.components.PluginCard.Button.label.support": "支持我们", - "app.components.PluginCard.price.free": "免费", + "app.components.PluginCard.compatible": "与你的应用程序兼容", + "app.components.PluginCard.compatibleCommunity": "与社区兼容", "app.components.PluginCard.more-details": "更多细节", - - "app.utils.placeholder.defaultMessage": "\u0020", - "app.utils.SelectOption.defaultMessage": "\u0020", - "app.utils.defaultMessage": "\u0020", - - "components.AutoReloadBlocker.header": "这个插件需要重新加载特性。", + "app.components.PluginCard.price.free": "免费", + "app.components.listPlugins.button": "增加新插件", + "app.components.listPlugins.title.none": "还没有安装插件", + "app.components.listPlugins.title.plural": "{number} 个插件已安装", + "app.components.listPlugins.title.singular": "{number} 个插件已安装", + "app.components.listPluginsPage.deletePlugin.error": "卸载插件时出错", + "app.utils.SelectOption.defaultMessage": " ", + "app.utils.defaultMessage": " ", + "app.utils.placeholder.defaultMessage": " ", "components.AutoReloadBlocker.description": "打开下面的文件并启用该特性。", - + "components.AutoReloadBlocker.header": "这个插件需要重新加载特性。", "components.ErrorBoundary.title": "哪里出问题了…", - - "components.OverlayBlocker.title": "等待重新启动...", - "components.OverlayBlocker.description": "这个功能成需要服务器重新启动。请等到服务器启动。", - - "components.PageFooter.select": "每页条目", - - "components.ProductionBlocker.header": "这个插件只能在开发中使用。", - "components.ProductionBlocker.description": "为了安全起见,我们必须在其他环境中禁用这个插件。", - - "components.popUpWarning.button.cancel": "取消", - "components.popUpWarning.button.confirm": "确认", - "components.popUpWarning.title": "请确认", - "components.popUpWarning.message": "确实要删除这个吗?", - - "components.Input.error.validation.email": "这不是电子邮件", - "components.Input.error.validation.required": "这个值是必须的", - "components.Input.error.validation.regex": "格式不正确", - "components.Input.error.validation.max": "超过最大值", - "components.Input.error.validation.min": "低于最小值", - "components.Input.error.validation.maxLength": "超过最大长度", - "components.Input.error.validation.minLength": "低于最小长度", - "components.Input.error.contentTypeName.taken": "此名称已经存在", - "components.Input.error.attribute.taken": "此字段名称已经存在", "components.Input.error.attribute.key.taken": "此值已经存在", "components.Input.error.attribute.sameKeyAndName": "不能相等", - "components.Input.error.validation.minSupMax": "最小值超过最大值了", + "components.Input.error.attribute.taken": "此字段名称已经存在", + "components.Input.error.contentTypeName.taken": "此名称已经存在", "components.Input.error.custom-error": "{errorMessage} ", - + "components.Input.error.validation.email": "这不是电子邮件", + "components.Input.error.validation.max": "超过最大值", + "components.Input.error.validation.maxLength": "超过最大长度", + "components.Input.error.validation.min": "低于最小值", + "components.Input.error.validation.minLength": "低于最小长度", + "components.Input.error.validation.minSupMax": "最小值超过最大值了", + "components.Input.error.validation.regex": "格式不正确", + "components.Input.error.validation.required": "这个值是必须的", "components.ListRow.empty": "没有要显示的数据", - + "components.OverlayBlocker.description": "这个功能成需要服务器重新启动。请等到服务器启动。", + "components.OverlayBlocker.title": "等待重新启动...", + "components.PageFooter.select": "每页条目", + "components.ProductionBlocker.description": "为了安全起见,我们必须在其他环境中禁用这个插件。", + "components.ProductionBlocker.header": "这个插件只能在开发中使用。", + "components.Wysiwyg.ToggleMode.markdown": "编辑", + "components.Wysiwyg.ToggleMode.preview": "预览", "components.Wysiwyg.collapse": "折叠", - "components.Wysiwyg.selectOptions.title": "增加一个标题", "components.Wysiwyg.selectOptions.H1": "Title H1", "components.Wysiwyg.selectOptions.H2": "Title H2", "components.Wysiwyg.selectOptions.H3": "Title H3", "components.Wysiwyg.selectOptions.H4": "Title H4", "components.Wysiwyg.selectOptions.H5": "Title H5", "components.Wysiwyg.selectOptions.H6": "Title H6", - "components.Wysiwyg.ToggleMode.markdown": "编辑", - "components.Wysiwyg.ToggleMode.preview": "预览", + "components.Wysiwyg.selectOptions.title": "增加一个标题", "components.WysiwygBottomControls.charactersIndicators": "characters", + "components.WysiwygBottomControls.fullscreen": "最大化", "components.WysiwygBottomControls.uploadFiles": "拖放文件,从剪贴板粘贴或 {browse}.", "components.WysiwygBottomControls.uploadFiles.browse": "从文件夹选取", - "components.WysiwygBottomControls.fullscreen": "最大化", - - "HomePage.notification.newsLetter.success": "成功订阅简讯", - + "components.popUpWarning.button.cancel": "取消", + "components.popUpWarning.button.confirm": "确认", + "components.popUpWarning.message": "确实要删除这个吗?", + "components.popUpWarning.title": "请确认", "notification.error": "发生了一个错误", "notification.error.layout": "无法获取布局", - - "Users & Permissions": "用户 & 权限", - "Content Manager": "内容管理", - "Content Type Builder": "内容类型生成器", - "Settings Manager": "管理设置", - "Email": "邮件", - "Password": "密码", - "Username": "用户名", - "Provider": "供应商", - "ResetPasswordToken": "密码重置", - "Role": "角色", - "New entry": "新入口", - "request.error.model.unknown": "这个模型已不存在", - "Users": "用户", - "Analytics": "分析" -} + "request.error.model.unknown": "这个模型已不存在" +} \ No newline at end of file diff --git a/packages/strapi-admin/admin/src/translations/zh.json b/packages/strapi-admin/admin/src/translations/zh.json index e851c9fa72..af81295981 100644 --- a/packages/strapi-admin/admin/src/translations/zh.json +++ b/packages/strapi-admin/admin/src/translations/zh.json @@ -1,140 +1,112 @@ { + "Auth & Permissions": "認證 & 權限", + "Content Manager": "內容管理", + "Content Type Builder": "建立和更新資料結構", + "Email": "Email", + "New entry": "新入口", + "Password": "密碼", + "Provider": "供應商", + "ResetPasswordToken": "重設密碼的 Token", + "Role": "權限", + "Settings Manager": "管理設定", + "Username": "使用者名稱", "app.components.ComingSoonPage.comingSoon": "即將推出", "app.components.ComingSoonPage.featuresNotAvailable": "這個功能正在開發中", - "app.components.DownloadInfo.download": "正在下載...", "app.components.DownloadInfo.text": "請稍等幾分鐘,謝謝您的耐心。", - - "app.components.HomePage.welcome": "歡迎回來!", "app.components.HomePage.create": "Create your first Content Type", - "app.components.HomePage.welcomeBlock.content": "We are happy to have you as one of community member. We are constantly looking for feedback so feel free to send us DM on\u0020", + "app.components.HomePage.createBlock.content.first": "The ", + "app.components.HomePage.createBlock.content.second": " plugin will help you to define the data structure of your models. If you’re new here, we highly recommend you to follow our ", + "app.components.HomePage.createBlock.content.tutorial": " tutorial.", + "app.components.HomePage.welcome": "歡迎回來!", + "app.components.HomePage.welcomeBlock.content": "We are happy to have you as one of community member. We are constantly looking for feedback so feel free to send us DM on ", "app.components.HomePage.welcomeBlock.content.issues": "issues", - "app.components.HomePage.welcomeBlock.content.raise": "\u0020or raise\u0020", - "app.components.HomePage.createBlock.content.first": "The\u0020", - "app.components.HomePage.createBlock.content.second": "\u0020plugin will help you to define the data structure of your models. If you’re new here, we highly recommend you to follow our\u0020", - "app.components.HomePage.createBlock.content.tutorial": "\u0020tutorial.", - + "app.components.HomePage.welcomeBlock.content.raise": " or raise ", + "app.components.ImgPreview.hint": "將您要上傳的檔案拖拉到這個框框,或是瀏覽檔案", + "app.components.ImgPreview.hint.browse": "瀏覽", "app.components.InputFile.newFile": "增加新檔案 {browse}", "app.components.InputFileDetails.open": "Open in a new tab", - "app.components.ImgPreview.hint": - "將您要上傳的檔案拖拉到這個框框,或是瀏覽檔案", - "app.components.ImgPreview.hint.browse": "瀏覽", - - "app.components.InstallPluginPage.helmet": "市集 - 擴充功能", - "app.components.InstallPluginPage.title": "市集 - 擴充功能", - "app.components.InstallPluginPage.description": "輕鬆擴充您的應用程式", - "app.components.InstallPluginPage.plugin.support-us.description": - "透過購買 Strapi T-shirt 來支持我們。這些資金將幫助我們繼續努力打造更好的產品和使用者體驗。", "app.components.InstallPluginPage.InputSearch.label": " ", - "app.components.InstallPluginPage.InputSearch.placeholder": - "搜尋擴充功能... (範例: 使用者認證)", + "app.components.InstallPluginPage.InputSearch.placeholder": "搜尋擴充功能... (範例: 使用者認證)", + "app.components.InstallPluginPage.description": "輕鬆擴充您的應用程式", + "app.components.InstallPluginPage.helmet": "市集 - 擴充功能", + "app.components.InstallPluginPage.plugin.support-us.description": "透過購買 Strapi T-shirt 來支持我們。這些資金將幫助我們繼續努力打造更好的產品和使用者體驗。", + "app.components.InstallPluginPage.title": "市集 - 擴充功能", "app.components.InstallPluginPopup.downloads": "下載", - "app.components.InstallPluginPopup.navLink.description": "說明", - "app.components.InstallPluginPopup.navLink.screenshots": "螢幕截圖", "app.components.InstallPluginPopup.navLink.avis": "avis", - "app.components.InstallPluginPopup.navLink.faq": "常見問題", "app.components.InstallPluginPopup.navLink.changelog": "更新紀錄", + "app.components.InstallPluginPopup.navLink.description": "說明", + "app.components.InstallPluginPopup.navLink.faq": "常見問題", + "app.components.InstallPluginPopup.navLink.screenshots": "螢幕截圖", "app.components.InstallPluginPopup.noDescription": "目前沒有說明", - "app.components.LeftMenuFooter.poweredBy": "Powered by ", "app.components.LeftMenuLinkContainer.configuration": "設定", "app.components.LeftMenuLinkContainer.general": "一般", "app.components.LeftMenuLinkContainer.installNewPlugin": "市集", "app.components.LeftMenuLinkContainer.listPlugins": "擴充功能", - "app.components.LeftMenuLinkContainer.noPluginsInstalled": - "目前沒有安裝任何擴充功能", + "app.components.LeftMenuLinkContainer.noPluginsInstalled": "目前沒有安裝任何擴充功能", "app.components.LeftMenuLinkContainer.plugins": "擴充功能", - + "app.components.ListPluginsPage.description": "這個專案安裝的擴充功能列表", "app.components.ListPluginsPage.helmet.title": "擴充功能列表", "app.components.ListPluginsPage.title": "擴充功能", - "app.components.ListPluginsPage.description": "這個專案安裝的擴充功能列表", - "app.components.listPluginsPage.deletePlugin.error": - "解除安裝擴充功能時發生了錯誤", - "app.components.listPlugins.title.singular": "安裝了 {number} 個擴充功能", - "app.components.listPlugins.title.plural": "安裝了 {number} 個擴充功能", - "app.components.listPlugins.title.none": "目前沒有安裝任何擴充功能", - "app.components.listPlugins.button": "安裝新的擴充功能", - - "app.components.NotFoundPage.description": "沒有結果", "app.components.NotFoundPage.back": "回到主頁", - + "app.components.NotFoundPage.description": "沒有結果", "app.components.Official": "官方", - - "app.components.PluginCard.compatible": "相容您的應用程式", - "app.components.PluginCard.compatibleCommunity": "相容社群", "app.components.PluginCard.Button.label.download": "下載", "app.components.PluginCard.Button.label.install": "已經安裝", "app.components.PluginCard.Button.label.support": "幫助我們", - "app.components.PluginCard.price.free": "免費", + "app.components.PluginCard.compatible": "相容您的應用程式", + "app.components.PluginCard.compatibleCommunity": "相容社群", "app.components.PluginCard.more-details": "更多細節", - - "app.utils.placeholder.defaultMessage": "\u0020", - "app.utils.SelectOption.defaultMessage": "\u0020", - "app.utils.defaultMessage": "\u0020", - - "components.AutoReloadBlocker.header": "需要這個擴充功能才能重新整理", + "app.components.PluginCard.price.free": "免費", + "app.components.listPlugins.button": "安裝新的擴充功能", + "app.components.listPlugins.title.none": "目前沒有安裝任何擴充功能", + "app.components.listPlugins.title.plural": "安裝了 {number} 個擴充功能", + "app.components.listPlugins.title.singular": "安裝了 {number} 個擴充功能", + "app.components.listPluginsPage.deletePlugin.error": "解除安裝擴充功能時發生了錯誤", + "app.utils.SelectOption.defaultMessage": " ", + "app.utils.defaultMessage": " ", + "app.utils.placeholder.defaultMessage": " ", "components.AutoReloadBlocker.description": "打開此檔案來安裝功能", - + "components.AutoReloadBlocker.header": "需要這個擴充功能才能重新整理", "components.ErrorBoundary.title": "有錯誤發生...", - - "components.OverlayBlocker.title": "等候回應...", - "components.OverlayBlocker.description": - "您正在使用的功能需要重新啟動,請等到重新啟動完成。", - - "components.PageFooter.select": "個數(頁)", - - "components.ProductionBlocker.header": "這個擴充功能只能在開發環境中使用", - "components.ProductionBlocker.description": - "為了安全起見,我們需要在其他環境關閉這個擴充功能", - - "components.popUpWarning.button.cancel": "取消", - "components.popUpWarning.button.confirm": "確認", - "components.popUpWarning.title": "請確認", - "components.popUpWarning.message": "您確定要刪除這個嗎?", - - "components.Input.error.validation.email": "請輸入有效 Email", - "components.Input.error.validation.required": "此欄位必填", - "components.Input.error.validation.regex": "此欄位沒有對應到 regex", - "components.Input.error.validation.max": "這個數值太高了", - "components.Input.error.validation.min": "這個數值太低了", - "components.Input.error.validation.maxLength": "這個數值太長了", - "components.Input.error.validation.minLength": "這個數值太短了", - "components.Input.error.contentTypeName.taken": "這個名稱已經存在了", - "components.Input.error.attribute.taken": "這個欄位名稱已經存在了", "components.Input.error.attribute.key.taken": "這個數值已經存在了", "components.Input.error.attribute.sameKeyAndName": "不能等於", - "components.Input.error.validation.minSupMax": "不能高過", + "components.Input.error.attribute.taken": "這個欄位名稱已經存在了", + "components.Input.error.contentTypeName.taken": "這個名稱已經存在了", "components.Input.error.custom-error": "{errorMessage} ", - + "components.Input.error.validation.email": "請輸入有效 Email", + "components.Input.error.validation.max": "這個數值太高了", + "components.Input.error.validation.maxLength": "這個數值太長了", + "components.Input.error.validation.min": "這個數值太低了", + "components.Input.error.validation.minLength": "這個數值太短了", + "components.Input.error.validation.minSupMax": "不能高過", + "components.Input.error.validation.regex": "此欄位沒有對應到 regex", + "components.Input.error.validation.required": "此欄位必填", "components.ListRow.empty": "沒有資料可以顯示", - + "components.OverlayBlocker.description": "您正在使用的功能需要重新啟動,請等到重新啟動完成。", + "components.OverlayBlocker.title": "等候回應...", + "components.PageFooter.select": "個數(頁)", + "components.ProductionBlocker.description": "為了安全起見,我們需要在其他環境關閉這個擴充功能", + "components.ProductionBlocker.header": "這個擴充功能只能在開發環境中使用", + "components.Wysiwyg.ToggleMode.markdown": "Switch to markdown", + "components.Wysiwyg.ToggleMode.preview": "Switch to preview", "components.Wysiwyg.collapse": "Collapse", - "components.Wysiwyg.selectOptions.title": "Add a title", "components.Wysiwyg.selectOptions.H1": "Title H1", "components.Wysiwyg.selectOptions.H2": "Title H2", "components.Wysiwyg.selectOptions.H3": "Title H3", "components.Wysiwyg.selectOptions.H4": "Title H4", "components.Wysiwyg.selectOptions.H5": "Title H5", "components.Wysiwyg.selectOptions.H6": "Title H6", - "components.Wysiwyg.ToggleMode.markdown": "Switch to markdown", - "components.Wysiwyg.ToggleMode.preview": "Switch to preview", + "components.Wysiwyg.selectOptions.title": "Add a title", "components.WysiwygBottomControls.charactersIndicators": "characters", + "components.WysiwygBottomControls.fullscreen": "Expand", "components.WysiwygBottomControls.uploadFiles": "Attach files by dragging & dropping, {browse}, or pasting from the clipboard.", "components.WysiwygBottomControls.uploadFiles.browse": "selecting them", - "components.WysiwygBottomControls.fullscreen": "Expand", - + "components.popUpWarning.button.cancel": "取消", + "components.popUpWarning.button.confirm": "確認", + "components.popUpWarning.message": "您確定要刪除這個嗎?", + "components.popUpWarning.title": "請確認", "notification.error": "有錯誤發生了", - - "Auth & Permissions": "認證 & 權限", - "Content Manager": "內容管理", - "Content Type Builder": "建立和更新資料結構", - "Settings Manager": "管理設定", - "Email": "Email", - "Password": "密碼", - "Username": "使用者名稱", - "Provider": "供應商", - "ResetPasswordToken": "重設密碼的 Token", - "Role": "權限", - "New entry": "新入口", "request.error.model.unknown": "這個資料不存在" -} +} \ No newline at end of file diff --git a/packages/strapi-plugin-content-manager/admin/src/translations/ar.json b/packages/strapi-plugin-content-manager/admin/src/translations/ar.json index e3c71f2ac1..72b86d899d 100644 --- a/packages/strapi-plugin-content-manager/admin/src/translations/ar.json +++ b/packages/strapi-plugin-content-manager/admin/src/translations/ar.json @@ -1,114 +1,114 @@ { - "plugin.description.short": "طريقة سريعة لمشاهدة وتحرير وحذف البيانات في قاعدة البيانات الخاصة بك.", - "plugin.description.long": "طريقة سريعة لمشاهدة وتحرير وحذف البيانات في قاعدة البيانات الخاصة بك.", - "containers.Home.pluginHeaderTitle": "مدير المحتوى", - "containers.Home.introduction": "لتعديل الإدخالات انتقل إلى الرابط المحدد في القائمة اليمنى. لا يحتوي هذه الإضافة على طريقة مناسبة لتعديل الإعدادات ولا يزال قيد التطوير.", - "containers.Home.pluginHeaderDescription": "إدارة إدخالاتك من خلال واجهة قوية وجميلة.", - "containers.Edit.submit": "حفظ", - "containers.Edit.editing": "التعديل...", - "containers.Edit.delete": "حذف", - "containers.Edit.reset": "إعادة", - "containers.Edit.returnList": "العودة للقائمة", - "containers.Edit.addAnItem": "اضافة عنصر...", - "containers.Edit.clickToJump": "انقر للانتقال إلى الإدخال", - "containers.Edit.seeDetails": "التفاصيل", - "containers.List.addAnEntry": "مدخل جديد {entity}", - "containers.List.pluginHeaderDescription": "{label} مدخل تم العثور عليه", - "containers.List.pluginHeaderDescription.singular": "{label} مدخل عثر", - "components.LimitSelect.itemsPerPage": "عنصر بالصفحة", - "containers.List.errorFetchRecords": "خطأ", - "containers.ListPage.displayedFields": "اظهار الحقول", - "containers.SettingPage.addField": "اضافة حقل جديد", - "containers.SettingPage.addRelationalField": "إضافة مجال علاقي جديد", - "containers.SettingPage.attributes": "حقول السمات", - "containers.SettingPage.attributes.description": "حدد ترتيب السمات", - "containers.SettingPage.relations": "المجالات العلائقية", - "containers.SettingPage.editSettings.description": "اسحب الحقول وأفلتها لإنشاء التخطيط", - "containers.SettingPage.editSettings.title": "التعديل - الإعدادات", - "containers.SettingPage.listSettings.title": "القائمة — الإعدادات", - "containers.SettingPage.listSettings.description": "تكوين الخيارات لنوع المحتوى هذا", - "containers.SettingPage.pluginHeaderDescription": "قم بتكوين الإعدادات المحددة لنوع المحتوى هذا", - "containers.SettingsPage.pluginHeaderDescription": "تكوين الإعدادات الافتراضية لجميع أنواع المحتوى الخاص بك", - "containers.SettingsPage.Block.generalSettings.description": "تكوين الخيارات الافتراضية لأنواع محتواك", - "containers.SettingsPage.Block.generalSettings.title": "عام", - "containers.SettingsPage.Block.contentType.title": "أنواع المحتوى", - "containers.SettingsPage.Block.contentType.description": "تكوين الإعدادات المحددة", + "EditRelations.title": "البيانات العلائقية", "components.AddFilterCTA.add": "مرشحات", "components.AddFilterCTA.hide": "مرشحات", "components.DraggableAttr.edit": "اضغط لتعديل", - "components.EmptyAttributesBlock.description": "يمكنك تغيير إعداداتك", "components.EmptyAttributesBlock.button": "الذهاب الى صفحة الإعدادات", + "components.EmptyAttributesBlock.description": "يمكنك تغيير إعداداتك", + "components.FilterOptions.FILTER_TYPES.=": "هو", + "components.FilterOptions.FILTER_TYPES._contains": "يحتوي", + "components.FilterOptions.FILTER_TYPES._containss": "يحتوي (حساس لحالة الأحرف)", + "components.FilterOptions.FILTER_TYPES._gt": "اكبر من", + "components.FilterOptions.FILTER_TYPES._gte": "اكبر من او يساوي", + "components.FilterOptions.FILTER_TYPES._lt": "اقل من", + "components.FilterOptions.FILTER_TYPES._lte": "اقل من او يساوي", + "components.FilterOptions.FILTER_TYPES._ne": "ليس", + "components.FilterOptions.button.apply": "تطبيق", "components.FiltersPickWrapper.PluginHeader.actions.apply": "تطبيق", "components.FiltersPickWrapper.PluginHeader.actions.clearAll": "مسح الكل", "components.FiltersPickWrapper.PluginHeader.description": "عيّن الشروط لتطبيقها على ترشيح الإدخالات", "components.FiltersPickWrapper.PluginHeader.title.filter": "مرشحات", "components.FiltersPickWrapper.hide": "اخفاء", - "components.FilterOptions.button.apply": "تطبيق", - "components.FilterOptions.FILTER_TYPES.=": "هو", - "components.FilterOptions.FILTER_TYPES._ne": "ليس", - "components.FilterOptions.FILTER_TYPES._lt": "اقل من", - "components.FilterOptions.FILTER_TYPES._lte": "اقل من او يساوي", - "components.FilterOptions.FILTER_TYPES._gt": "اكبر من", - "components.FilterOptions.FILTER_TYPES._gte": "اكبر من او يساوي", - "components.FilterOptions.FILTER_TYPES._contains": "يحتوي", - "components.FilterOptions.FILTER_TYPES._containss": "يحتوي (حساس لحالة الأحرف)", + "components.LimitSelect.itemsPerPage": "عنصر بالصفحة", "components.Search.placeholder": "البحث عن مدخل...", + "components.TableDelete.delete": "حذف الكل", "components.TableDelete.entries.plural": "{number} مدخلات محددة", "components.TableDelete.entries.singular": "{number} مدخل محدد", - "components.TableDelete.delete": "حذف الكل", "components.TableEmpty.withFilters": "لا يوجد {contentType} مع المرشحات المطبق...", - "components.TableEmpty.withoutFilter": "لا يوجد {contentType}...", "components.TableEmpty.withSearch": "لا يوجد {contentType} مطابق للبحث ({search})...", - "EditRelations.title": "البيانات العلائقية", - "emptyAttributes.title": "لا توجد حقول بعد", - "emptyAttributes.description": "أضف حقلك الأول إلى نوع المحتوى الخاص بك", + "components.TableEmpty.withoutFilter": "لا يوجد {contentType}...", + "containers.Edit.addAnItem": "اضافة عنصر...", + "containers.Edit.clickToJump": "انقر للانتقال إلى الإدخال", + "containers.Edit.delete": "حذف", + "containers.Edit.editing": "التعديل...", + "containers.Edit.reset": "إعادة", + "containers.Edit.returnList": "العودة للقائمة", + "containers.Edit.seeDetails": "التفاصيل", + "containers.Edit.submit": "حفظ", + "containers.Home.introduction": "لتعديل الإدخالات انتقل إلى الرابط المحدد في القائمة اليمنى. لا يحتوي هذه الإضافة على طريقة مناسبة لتعديل الإعدادات ولا يزال قيد التطوير.", + "containers.Home.pluginHeaderDescription": "إدارة إدخالاتك من خلال واجهة قوية وجميلة.", + "containers.Home.pluginHeaderTitle": "مدير المحتوى", + "containers.List.addAnEntry": "مدخل جديد {entity}", + "containers.List.errorFetchRecords": "خطأ", + "containers.List.pluginHeaderDescription": "{label} مدخل تم العثور عليه", + "containers.List.pluginHeaderDescription.singular": "{label} مدخل عثر", + "containers.ListPage.displayedFields": "اظهار الحقول", + "containers.SettingPage.addField": "اضافة حقل جديد", + "containers.SettingPage.addRelationalField": "إضافة مجال علاقي جديد", + "containers.SettingPage.attributes": "حقول السمات", + "containers.SettingPage.attributes.description": "حدد ترتيب السمات", + "containers.SettingPage.editSettings.description": "اسحب الحقول وأفلتها لإنشاء التخطيط", + "containers.SettingPage.editSettings.title": "التعديل - الإعدادات", + "containers.SettingPage.listSettings.description": "تكوين الخيارات لنوع المحتوى هذا", + "containers.SettingPage.listSettings.title": "القائمة — الإعدادات", + "containers.SettingPage.pluginHeaderDescription": "قم بتكوين الإعدادات المحددة لنوع المحتوى هذا", + "containers.SettingPage.relations": "المجالات العلائقية", + "containers.SettingsPage.Block.contentType.description": "تكوين الإعدادات المحددة", + "containers.SettingsPage.Block.contentType.title": "أنواع المحتوى", + "containers.SettingsPage.Block.generalSettings.description": "تكوين الخيارات الافتراضية لأنواع محتواك", + "containers.SettingsPage.Block.generalSettings.title": "عام", + "containers.SettingsPage.pluginHeaderDescription": "تكوين الإعدادات الافتراضية لجميع أنواع المحتوى الخاص بك", "emptyAttributes.button": "انتقل إلى أداة إنشاء نوع المحتوى", - "error.schema.generation": "حدث خطأ أثناء توليد المخطط.", - "error.records.count": "حدث خطأ أثناء إحضار عدد السجلات.", - "error.records.fetch": "حدث خطأ أثناء جلب السجلات.", - "error.record.fetch": "حدث خطأ أثناء تسجيل الجلب.", - "error.record.create": "حدث خطأ أثناء إنشاء السجل.", - "error.record.update": "حدث خطأ أثناء تحديث السجل.", - "error.record.delete": "حدث خطأ أثناء حذف السجل.", - "error.model.fetch": "حدث خطأ أثناء إجراء عملية تكوين النماذج.", - "error.validation.required": "قيمة هذا الحقل مطلوبة.", - "error.validation.regex": "هذه القيمة لا تطابق regex.", - "error.validation.max": "هذه القيمة عالية جدًا.", - "error.validation.min": "هذه القيمة قليل جدًا.", - "error.validation.maxLength": "هذه القيمة طويلة جدًا.", - "error.validation.minLength": "هذه القيمة قصيرة جدًا.", - "error.contentTypeName.taken": "هذا الأسم موجود مسبقًا", - "error.attribute.taken": "اسم الحقل هذا موجود مسبقًا", + "emptyAttributes.description": "أضف حقلك الأول إلى نوع المحتوى الخاص بك", + "emptyAttributes.title": "لا توجد حقول بعد", "error.attribute.key.taken": "هذه القيمة موجودة مسبقًا", "error.attribute.sameKeyAndName": "لا تتطابق", - "error.validation.minSupMax": "لا يمكن أن تكون متفوقة", + "error.attribute.taken": "اسم الحقل هذا موجود مسبقًا", + "error.contentTypeName.taken": "هذا الأسم موجود مسبقًا", + "error.model.fetch": "حدث خطأ أثناء إجراء عملية تكوين النماذج.", + "error.record.create": "حدث خطأ أثناء إنشاء السجل.", + "error.record.delete": "حدث خطأ أثناء حذف السجل.", + "error.record.fetch": "حدث خطأ أثناء تسجيل الجلب.", + "error.record.update": "حدث خطأ أثناء تحديث السجل.", + "error.records.count": "حدث خطأ أثناء إحضار عدد السجلات.", + "error.records.fetch": "حدث خطأ أثناء جلب السجلات.", + "error.schema.generation": "حدث خطأ أثناء توليد المخطط.", "error.validation.json": "هذا ليس JSON", - "form.Input.description": "الوصف", - "form.Input.placeholder": "العنصر النائب", - "form.Input.description.placeholder": "عرض الإسم في الملف الشخصي", - "form.Input.placeholder.placeholder": "قيمتي الرائعة", - "form.Input.disabled": "حقل قابل للتعديل", - "form.Input.label.inputDescription": "تتجاوز هذه القيمة التسمية المعروضة في رأس الجدول", - "form.Input.label": "تسميه", - "form.Input.search": "تفعيل البحث", - "form.Input.search.field": "تفعيل البحث في هذا الحقل", - "form.Input.filters": "تفعيل الترشيح", - "form.Input.sort.field": "تمكين الفرز في هذا الحقل", + "error.validation.max": "هذه القيمة عالية جدًا.", + "error.validation.maxLength": "هذه القيمة طويلة جدًا.", + "error.validation.min": "هذه القيمة قليل جدًا.", + "error.validation.minLength": "هذه القيمة قصيرة جدًا.", + "error.validation.minSupMax": "لا يمكن أن تكون متفوقة", + "error.validation.regex": "هذه القيمة لا تطابق regex.", + "error.validation.required": "قيمة هذا الحقل مطلوبة.", "form.Input.bulkActions": "تمكين الإجراءات المجمعة", + "form.Input.defaultSort": "سمة الفرز الافتراضي", + "form.Input.description": "الوصف", + "form.Input.description.placeholder": "عرض الإسم في الملف الشخصي", + "form.Input.disabled": "حقل قابل للتعديل", + "form.Input.filters": "تفعيل الترشيح", + "form.Input.label": "تسميه", + "form.Input.label.inputDescription": "تتجاوز هذه القيمة التسمية المعروضة في رأس الجدول", "form.Input.pageEntries": "مدخلات في الصفحة", "form.Input.pageEntries.inputDescription": "ملاحظة: يمكنك تجاوز هذه القيمة في صفحة إعدادات نوع المحتوى.", - "form.Input.defaultSort": "سمة الفرز الافتراضي", + "form.Input.placeholder": "العنصر النائب", + "form.Input.placeholder.placeholder": "قيمتي الرائعة", + "form.Input.search": "تفعيل البحث", + "form.Input.search.field": "تفعيل البحث في هذا الحقل", + "form.Input.sort.field": "تمكين الفرز في هذا الحقل", "notification.error.displayedFields": "أنت بحاجة إلى حقل معروض واحد على الأقل", "notification.error.relationship.fetch": "حدث خطأ أثناء جلب العلاقة.", "notification.info.SettingPage.disableSort": "يجب أن يكون لديك سمة واحدة مع الفرز المسموح به", - "success.record.delete": "حُذف", - "success.record.save": "حُفظ", "pageNotFound": "الصفحة غير موجود", + "plugin.description.long": "طريقة سريعة لمشاهدة وتحرير وحذف البيانات في قاعدة البيانات الخاصة بك.", + "plugin.description.short": "طريقة سريعة لمشاهدة وتحرير وحذف البيانات في قاعدة البيانات الخاصة بك.", + "popUpWarning.bodyMessage.contentType.delete": "هل انت متأكد من حذف هذا المدخل؟", + "popUpWarning.bodyMessage.contentType.delete.all": "هل أنت متأكد من أنك تريد حذف هذه الأدخالات؟", "popUpWarning.button.cancel": "الغاء", "popUpWarning.button.confirm": "تأكيد", "popUpWarning.title": "الرجاء التأكيد", - "popUpWarning.bodyMessage.contentType.delete": "هل انت متأكد من حذف هذا المدخل؟", - "popUpWarning.bodyMessage.contentType.delete.all": "هل أنت متأكد من أنك تريد حذف هذه الأدخالات؟", "popUpWarning.warning.cancelAllSettings": "هل أنت متأكد من أنك تريد إلغاء التعديلاتك؟", - "popUpWarning.warning.updateAllSettings": "سيؤدي ذلك إلى تعديل جميع إعداداتك" + "popUpWarning.warning.updateAllSettings": "سيؤدي ذلك إلى تعديل جميع إعداداتك", + "success.record.delete": "حُذف", + "success.record.save": "حُفظ" } \ No newline at end of file diff --git a/packages/strapi-plugin-content-manager/admin/src/translations/de.json b/packages/strapi-plugin-content-manager/admin/src/translations/de.json index 0e57aa0a09..af33e2b32e 100644 --- a/packages/strapi-plugin-content-manager/admin/src/translations/de.json +++ b/packages/strapi-plugin-content-manager/admin/src/translations/de.json @@ -1,118 +1,104 @@ { - "plugin.description.short": "Greife blitzschnell auf alle Daten in der Datenbank zu und änder sie.", - "plugin.description.long": "Greife blitzschnell auf alle Daten in der Datenbank zu und änder sie.", - - "containers.Home.pluginHeaderTitle": "Inhalts-Manager", - "containers.Home.introduction": "Um deine Einträge zu verwalten, klicke auf den entsprechenden Link im Menü links. Dieses Plugin ist noch in aktiver Entwicklung und seine Einstellungen können nicht optimal angepasst werden.", - "containers.Home.pluginHeaderDescription": "Verwalte deine Einträge mithilfe eines mächtigen und wunderschönen Interfaces.", - "containers.Edit.submit": "Speichern", - "containers.Edit.editing": "Bearbeite...", - "containers.Edit.delete": "Löschen", - "containers.Edit.reset": "Abbrechen", - "containers.Edit.returnList": "Zu Liste zurückkehren", - "containers.List.addAnEntry": "Füge {entity} hinzu", - "containers.List.pluginHeaderDescription": "{label} Einträge gefunden", - "containers.List.pluginHeaderDescription.singular": "{label} Eintrag gefunden", - "components.LimitSelect.itemsPerPage": "Einträge pro Seite", - "containers.List.errorFetchRecords": "Fehler", - "containers.SettingPage.addField": "Neues Feld hinzufügen", - "containers.SettingPage.attributes": "Attribut Felder", - "containers.SettingPage.attributes.description": "Reihenfolge der Attribute festlegen", - "containers.SettingPage.listSettings.title": "Liste - Einstellungen", - "containers.SettingPage.listSettings.description": "Konfiguriere die Optionen für diesen Inhaltstyp.", - "containers.SettingPage.pluginHeaderDescription": "Konfiguriere die spezifischen Einstellungen für diesen Inhaltstyp.", - "containers.SettingsPage.Block.generalSettings.description": "Konfiguriere die Standardoptionen für deine Inhaltstypen.", - "containers.SettingsPage.Block.generalSettings.title" : "Allgemeines", - "containers.SettingsPage.Block.contentType.title": "Inhaltstypen", - "containers.SettingsPage.Block.contentType.description": "Konfiguriere die spezifischen Einstellungen.", - "containers.SettingsPage.pluginHeaderDescription": "Konfigurieren Sie die Standardeinstellungen für alle Ihre Inhaltstypen.", - + "EditRelations.title": "Relationale Daten", "components.AddFilterCTA.add": "Filter", "components.AddFilterCTA.hide": "Filter", "components.DraggableAttr.edit": "Klicken zum Bearbeiten", + "components.FilterOptions.FILTER_TYPES.=": "ist", + "components.FilterOptions.FILTER_TYPES._contains": "enthält", + "components.FilterOptions.FILTER_TYPES._containss": "enthält (Groß-/Kleinschreibung beachten)", + "components.FilterOptions.FILTER_TYPES._gt": "ist größer als", + "components.FilterOptions.FILTER_TYPES._gte": "ist größer oder gleich als", + "components.FilterOptions.FILTER_TYPES._lt": "ist kleiner als", + "components.FilterOptions.FILTER_TYPES._lte": "ist kleiner oder gleich als", + "components.FilterOptions.FILTER_TYPES._ne": "ist nicht", + "components.FilterOptions.button.apply": "Anwenden", "components.FiltersPickWrapper.PluginHeader.actions.apply": "Anwenden", "components.FiltersPickWrapper.PluginHeader.actions.clearAll": "Alle löschen", "components.FiltersPickWrapper.PluginHeader.description": "Lege die Bedingungen fest, unter denen die Einträge gefiltert werden sollen.", "components.FiltersPickWrapper.PluginHeader.title.filter": "Filter", "components.FiltersPickWrapper.hide": "Ausblenden", - "components.FilterOptions.button.apply": "Anwenden", - "components.FilterOptions.FILTER_TYPES.=": "ist", - "components.FilterOptions.FILTER_TYPES._ne": "ist nicht", - "components.FilterOptions.FILTER_TYPES._lt": "ist kleiner als", - "components.FilterOptions.FILTER_TYPES._lte": "ist kleiner oder gleich als", - "components.FilterOptions.FILTER_TYPES._gt": "ist größer als", - "components.FilterOptions.FILTER_TYPES._gte": "ist größer oder gleich als", - "components.FilterOptions.FILTER_TYPES._contains": "enthält", - "components.FilterOptions.FILTER_TYPES._containss": "enthält (Groß-/Kleinschreibung beachten)", + "components.LimitSelect.itemsPerPage": "Einträge pro Seite", "components.Search.placeholder": "Suche nach einem Eintrag....", + "components.TableDelete.delete": "Alle löschen", "components.TableDelete.entries.plural": "{number} ausgewählte Einträge", "components.TableDelete.entries.singular": "{number} ausgewählter Eintrag", - "components.TableDelete.delete": "Alle löschen", "components.TableEmpty.withFilters": "Es gibt keinen {contentType} mit den verwendeten Filtern...", - "components.TableEmpty.withoutFilter": "Es gibt keinen {contentType}...", "components.TableEmpty.withSearch": "Es gibt keinen {contentType}, der der Suche entspricht ({search})...", - - "form.Input.label": "Label", - "form.Input.label.inputDescription": "Dieser Wert überschreibt das im Kopf der Tabelle angezeigte Label.", - "form.Input.search": "Suche aktivieren", - "form.Input.search.field": "Suche in diesem Feld aktivieren", - "form.Input.filters": "Filter aktivieren", - "form.Input.sort.field": "Sortierung in diesem Feld aktivieren", - "form.Input.bulkActions": "Bulk-Bearbeitung aktivieren", - "form.Input.pageEntries": "Einträge pro Seite", - "form.Input.pageEntries.inputDescription": "Hinweis: Du kannst diesen Wert auf der Inhaltstypen Einstellungsseite überschreiben.", - "form.Input.defaultSort": "Standard-Sortierattribut", - - "containers.SettingPage.relations": "Relational fields", - + "components.TableEmpty.withoutFilter": "Es gibt keinen {contentType}...", + "containers.Edit.delete": "Löschen", + "containers.Edit.editing": "Bearbeite...", + "containers.Edit.reset": "Abbrechen", + "containers.Edit.returnList": "Zu Liste zurückkehren", + "containers.Edit.submit": "Speichern", + "containers.Home.introduction": "Um deine Einträge zu verwalten, klicke auf den entsprechenden Link im Menü links. Dieses Plugin ist noch in aktiver Entwicklung und seine Einstellungen können nicht optimal angepasst werden.", + "containers.Home.pluginHeaderDescription": "Verwalte deine Einträge mithilfe eines mächtigen und wunderschönen Interfaces.", + "containers.Home.pluginHeaderTitle": "Inhalts-Manager", + "containers.List.addAnEntry": "Füge {entity} hinzu", + "containers.List.errorFetchRecords": "Fehler", + "containers.List.pluginHeaderDescription": "{label} Einträge gefunden", + "containers.List.pluginHeaderDescription.singular": "{label} Eintrag gefunden", + "containers.SettingPage.addField": "Neues Feld hinzufügen", + "containers.SettingPage.attributes": "Attribut Felder", + "containers.SettingPage.attributes.description": "Reihenfolge der Attribute festlegen", "containers.SettingPage.editSettings.description": "Drag & drop the fields to build the layout", "containers.SettingPage.editSettings.title": "Edit — Settings", - - "EditRelations.title": "Relationale Daten", - - "emptyAttributes.title": "Es gibt noch keine Felder", - "emptyAttributes.description": "Füge deinem Inhaltstypen das erste Feld hinzu", + "containers.SettingPage.listSettings.description": "Konfiguriere die Optionen für diesen Inhaltstyp.", + "containers.SettingPage.listSettings.title": "Liste - Einstellungen", + "containers.SettingPage.pluginHeaderDescription": "Konfiguriere die spezifischen Einstellungen für diesen Inhaltstyp.", + "containers.SettingPage.relations": "Relational fields", + "containers.SettingsPage.Block.contentType.description": "Konfiguriere die spezifischen Einstellungen.", + "containers.SettingsPage.Block.contentType.title": "Inhaltstypen", + "containers.SettingsPage.Block.generalSettings.description": "Konfiguriere die Standardoptionen für deine Inhaltstypen.", + "containers.SettingsPage.Block.generalSettings.title": "Allgemeines", + "containers.SettingsPage.pluginHeaderDescription": "Konfigurieren Sie die Standardeinstellungen für alle Ihre Inhaltstypen.", "emptyAttributes.button": "Den Inhaltstyp-Generator öffnen", - - "error.schema.generation": "Bei der Generierung des Schemas ist ein Fehler aufgetreten.", - "error.records.count": "Beim Abruf von count records ist ein Fehler aufgetreten.", - "error.records.fetch": "Beim Abruf von Dokumenten ist ein Fehler aufgetreten.", - "error.record.fetch": "Beim Abruf eines Dokuments ist ein Fehler aufgetreten.", - "error.record.create": "Beim Anlegen eines Dokuments ist ein Fehler aufgetreten.", - "error.record.update": "Beim Aktualisieren eines Dokuments ist ein Fehler aufgetreten.", - "error.record.delete": "Beim Löschen eines Dokuments ist ein Fehler aufgetreten.", - "error.model.fetch": "Beim Abruf von model config fetch ist ein Fehler aufgetreten.", - "error.validation.required": "Dieser Wert ist erforderlich.", - "error.validation.regex": "Dieser Wert entspricht nicht dem RegEx.", - "error.validation.max": "Dieser Wert ist zu hoch.", - "error.validation.min": "Dieser Wert ist zu niedrig.", - "error.validation.maxLength": "Dieser Wert ist zu lang.", - "error.validation.minLength": "Dieser Wert ist zu kurz.", - "error.validation.json": "Dies ist kein JSON", - "error.contentTypeName.taken": "Dieser Name existiert bereits", - "error.attribute.taken": "Dieser Feldname ist bereits vergeben", + "emptyAttributes.description": "Füge deinem Inhaltstypen das erste Feld hinzu", + "emptyAttributes.title": "Es gibt noch keine Felder", "error.attribute.key.taken": "Dieser Wert existiert bereits", "error.attribute.sameKeyAndName": "Darf nicht gleich sein", + "error.attribute.taken": "Dieser Feldname ist bereits vergeben", + "error.contentTypeName.taken": "Dieser Name existiert bereits", + "error.model.fetch": "Beim Abruf von model config fetch ist ein Fehler aufgetreten.", + "error.record.create": "Beim Anlegen eines Dokuments ist ein Fehler aufgetreten.", + "error.record.delete": "Beim Löschen eines Dokuments ist ein Fehler aufgetreten.", + "error.record.fetch": "Beim Abruf eines Dokuments ist ein Fehler aufgetreten.", + "error.record.update": "Beim Aktualisieren eines Dokuments ist ein Fehler aufgetreten.", + "error.records.count": "Beim Abruf von count records ist ein Fehler aufgetreten.", + "error.records.fetch": "Beim Abruf von Dokumenten ist ein Fehler aufgetreten.", + "error.schema.generation": "Bei der Generierung des Schemas ist ein Fehler aufgetreten.", + "error.validation.json": "Dies ist kein JSON", + "error.validation.max": "Dieser Wert ist zu hoch.", + "error.validation.maxLength": "Dieser Wert ist zu lang.", + "error.validation.min": "Dieser Wert ist zu niedrig.", + "error.validation.minLength": "Dieser Wert ist zu kurz.", "error.validation.minSupMax": "Darf nicht höher sein", - - "form.Input.disabled": "Editable field", + "error.validation.regex": "Dieser Wert entspricht nicht dem RegEx.", + "error.validation.required": "Dieser Wert ist erforderlich.", + "form.Input.bulkActions": "Bulk-Bearbeitung aktivieren", + "form.Input.defaultSort": "Standard-Sortierattribut", "form.Input.description": "Description", "form.Input.description.placeholder": "Display name in the profile", - + "form.Input.disabled": "Editable field", + "form.Input.filters": "Filter aktivieren", + "form.Input.label": "Label", + "form.Input.label.inputDescription": "Dieser Wert überschreibt das im Kopf der Tabelle angezeigte Label.", + "form.Input.pageEntries": "Einträge pro Seite", + "form.Input.pageEntries.inputDescription": "Hinweis: Du kannst diesen Wert auf der Inhaltstypen Einstellungsseite überschreiben.", + "form.Input.search": "Suche aktivieren", + "form.Input.search.field": "Suche in diesem Feld aktivieren", + "form.Input.sort.field": "Sortierung in diesem Feld aktivieren", "notification.error.relationship.fetch": "Beim Abruf von Beziehungen ist ein Fehler aufgetreten.", "notification.info.SettingPage.disableSort": "Du musst ein Attribut mit aktivierter Sortierung haben.", - - "success.record.delete": "Gelöscht", - "success.record.save": "Gespeichert", - "pageNotFound": "Seite nicht gefunden", - + "plugin.description.long": "Greife blitzschnell auf alle Daten in der Datenbank zu und änder sie.", + "plugin.description.short": "Greife blitzschnell auf alle Daten in der Datenbank zu und änder sie.", + "popUpWarning.bodyMessage.contentType.delete": "Bist du sicher, dass du diesen Inhaltstyp löschen willst?", + "popUpWarning.bodyMessage.contentType.delete.all": "Bist du sicher, dass du diese Einträge löschen willst?", "popUpWarning.button.cancel": "Abbrechen", "popUpWarning.button.confirm": "Bestätigen", "popUpWarning.title": "Bitte bestätigen", - "popUpWarning.bodyMessage.contentType.delete": "Bist du sicher, dass du diesen Inhaltstyp löschen willst?", - "popUpWarning.bodyMessage.contentType.delete.all": "Bist du sicher, dass du diese Einträge löschen willst?", "popUpWarning.warning.cancelAllSettings": "Bist du sicher, dass du deine Änderungen rückgängig machen willst?", - "popUpWarning.warning.updateAllSettings": "Dadurch werden alle deine Einstellungen geändert." - -} + "popUpWarning.warning.updateAllSettings": "Dadurch werden alle deine Einstellungen geändert.", + "success.record.delete": "Gelöscht", + "success.record.save": "Gespeichert" +} \ No newline at end of file diff --git a/packages/strapi-plugin-content-manager/admin/src/translations/en.json b/packages/strapi-plugin-content-manager/admin/src/translations/en.json index 1aba1f53aa..c1458357d4 100644 --- a/packages/strapi-plugin-content-manager/admin/src/translations/en.json +++ b/packages/strapi-plugin-content-manager/admin/src/translations/en.json @@ -1,134 +1,114 @@ { - "plugin.description.short": "Quick way to see, edit and delete the data in your database.", - "plugin.description.long": "Quick way to see, edit and delete the data in your database.", - "containers.Home.pluginHeaderTitle": "Content Manager", - "containers.Home.introduction": "To edit your entries go to the specific link in the left menu. This plugin doesn't have a proper way to edit settings and it's still under active development.", - "containers.Home.pluginHeaderDescription": "Manage your entries through a powerful and beautiful interface.", - "containers.Edit.submit": "Save", - "containers.Edit.editing": "Editing...", - "containers.Edit.delete": "Delete", - "containers.Edit.reset": "Reset", - "containers.Edit.returnList": "Return to list", - "containers.Edit.addAnItem": "Add an item...", - "containers.Edit.clickToJump": "Click to jump to the entry", - "containers.Edit.seeDetails": "Details", - "containers.List.addAnEntry": "Add New {entity}", - "containers.List.pluginHeaderDescription": "{label} entries found", - "containers.List.pluginHeaderDescription.singular": "{label} entry found", - "components.LimitSelect.itemsPerPage": "Items per page", - "containers.List.errorFetchRecords": "Error", - "containers.ListPage.displayedFields": "Displayed Fields", - - "containers.SettingPage.addField": "Add new field", - "containers.SettingPage.addRelationalField": "Add new relational field", - "containers.SettingPage.attributes": "Attributes fields", - "containers.SettingPage.attributes.description": "Define the order of the attributes", - "containers.SettingPage.relations": "Relational fields", - - "containers.SettingPage.editSettings.description": "Drag & drop the fields to build the layout", - "containers.SettingPage.editSettings.title": "Edit — Settings", - - "containers.SettingPage.listSettings.title": "List — Settings", - "containers.SettingPage.listSettings.description": "Configure the options for this content type", - "containers.SettingPage.pluginHeaderDescription": "Configure the specific settings for this Content Type", - "containers.SettingsPage.pluginHeaderDescription": "Configure the default settings for all your Content types", - "containers.SettingsPage.Block.generalSettings.description": "Configure the default options for your Content Types", - "containers.SettingsPage.Block.generalSettings.title": "General", - "containers.SettingsPage.Block.contentType.title": "Content Types", - "containers.SettingsPage.Block.contentType.description": "Configure the specific settings", - + "EditRelations.title": "Relational data", "components.AddFilterCTA.add": "Filters", "components.AddFilterCTA.hide": "Filters", - "components.DraggableAttr.edit": "Click to edit", - - "components.EmptyAttributesBlock.description": "You can change your settings", "components.EmptyAttributesBlock.button": "Go to settings page", - + "components.EmptyAttributesBlock.description": "You can change your settings", + "components.FilterOptions.FILTER_TYPES.=": "is", + "components.FilterOptions.FILTER_TYPES._contains": "contains", + "components.FilterOptions.FILTER_TYPES._containss": "contains (case sensitive)", + "components.FilterOptions.FILTER_TYPES._gt": "is greater than", + "components.FilterOptions.FILTER_TYPES._gte": "is greater than or equal to", + "components.FilterOptions.FILTER_TYPES._lt": "is lower than", + "components.FilterOptions.FILTER_TYPES._lte": "is lower than or equal to", + "components.FilterOptions.FILTER_TYPES._ne": "is not", + "components.FilterOptions.button.apply": "Apply", "components.FiltersPickWrapper.PluginHeader.actions.apply": "Apply", "components.FiltersPickWrapper.PluginHeader.actions.clearAll": "Clear all", "components.FiltersPickWrapper.PluginHeader.description": "Set the conditions to apply to filter the entries", "components.FiltersPickWrapper.PluginHeader.title.filter": "Filters", "components.FiltersPickWrapper.hide": "Hide", - - "components.FilterOptions.button.apply": "Apply", - "components.FilterOptions.FILTER_TYPES.=": "is", - "components.FilterOptions.FILTER_TYPES._ne": "is not", - "components.FilterOptions.FILTER_TYPES._lt": "is lower than", - "components.FilterOptions.FILTER_TYPES._lte": "is lower than or equal to", - "components.FilterOptions.FILTER_TYPES._gt": "is greater than", - "components.FilterOptions.FILTER_TYPES._gte": "is greater than or equal to", - "components.FilterOptions.FILTER_TYPES._contains": "contains", - "components.FilterOptions.FILTER_TYPES._containss": "contains (case sensitive)", - + "components.LimitSelect.itemsPerPage": "Items per page", "components.Search.placeholder": "Search for an entry...", - + "components.TableDelete.delete": "Delete all", "components.TableDelete.entries.plural": "{number} entries selected", "components.TableDelete.entries.singular": "{number} entry selected", - "components.TableDelete.delete": "Delete all", - - "components.TableEmpty.withFilters": "There is no {contentType} with the applied filters...", - "components.TableEmpty.withoutFilter": "There is no {contentType}...", "components.TableEmpty.withSearch": "There is no {contentType} corresponding to the search ({search})...", - - "EditRelations.title": "Relational data", - - "emptyAttributes.title": "There are no fields yet", - "emptyAttributes.description": "Add your first field to your Content Type", + "components.TableEmpty.withoutFilter": "There is no {contentType}...", + "containers.Edit.addAnItem": "Add an item...", + "containers.Edit.clickToJump": "Click to jump to the entry", + "containers.Edit.delete": "Delete", + "containers.Edit.editing": "Editing...", + "containers.Edit.reset": "Reset", + "containers.Edit.returnList": "Return to list", + "containers.Edit.seeDetails": "Details", + "containers.Edit.submit": "Save", + "containers.Home.introduction": "To edit your entries go to the specific link in the left menu. This plugin doesn't have a proper way to edit settings and it's still under active development.", + "containers.Home.pluginHeaderDescription": "Manage your entries through a powerful and beautiful interface.", + "containers.Home.pluginHeaderTitle": "Content Manager", + "containers.List.addAnEntry": "Add New {entity}", + "containers.List.errorFetchRecords": "Error", + "containers.List.pluginHeaderDescription": "{label} entries found", + "containers.List.pluginHeaderDescription.singular": "{label} entry found", + "containers.ListPage.displayedFields": "Displayed Fields", + "containers.SettingPage.addField": "Add new field", + "containers.SettingPage.addRelationalField": "Add new relational field", + "containers.SettingPage.attributes": "Attributes fields", + "containers.SettingPage.attributes.description": "Define the order of the attributes", + "containers.SettingPage.editSettings.description": "Drag & drop the fields to build the layout", + "containers.SettingPage.editSettings.title": "Edit — Settings", + "containers.SettingPage.listSettings.description": "Configure the options for this content type", + "containers.SettingPage.listSettings.title": "List — Settings", + "containers.SettingPage.pluginHeaderDescription": "Configure the specific settings for this Content Type", + "containers.SettingPage.relations": "Relational fields", + "containers.SettingsPage.Block.contentType.description": "Configure the specific settings", + "containers.SettingsPage.Block.contentType.title": "Content Types", + "containers.SettingsPage.Block.generalSettings.description": "Configure the default options for your Content Types", + "containers.SettingsPage.Block.generalSettings.title": "General", + "containers.SettingsPage.pluginHeaderDescription": "Configure the default settings for all your Content types", "emptyAttributes.button": "Go to content type builder", - - "error.schema.generation": "An error occurred during schema generation.", - "error.records.count": "An error occurred during count records fetch.", - "error.records.fetch": "An error occurred during records fetch.", - "error.record.fetch": "An error occurred during record fetch.", - "error.record.create": "An error occurred during record creation.", - "error.record.update": "An error occurred during record update.", - "error.record.delete": "An error occurred during record deletion.", - "error.model.fetch": "An error occurred during models config fetch.", - "error.validation.required": "This value input is required.", - "error.validation.regex": "The value not match the regex.", - "error.validation.max": "The value is too high.", - "error.validation.min": "The value is too low.", - "error.validation.maxLength": "The value is too long.", - "error.validation.minLength": "The value is too short.", - "error.contentTypeName.taken": "This name already exists", - "error.attribute.taken": "This field name already exists", + "emptyAttributes.description": "Add your first field to your Content Type", + "emptyAttributes.title": "There are no fields yet", "error.attribute.key.taken": "This value already exists", "error.attribute.sameKeyAndName": "Can't be equals", - "error.validation.minSupMax": "Can't be superior", + "error.attribute.taken": "This field name already exists", + "error.contentTypeName.taken": "This name already exists", + "error.model.fetch": "An error occurred during models config fetch.", + "error.record.create": "An error occurred during record creation.", + "error.record.delete": "An error occurred during record deletion.", + "error.record.fetch": "An error occurred during record fetch.", + "error.record.update": "An error occurred during record update.", + "error.records.count": "An error occurred during count records fetch.", + "error.records.fetch": "An error occurred during records fetch.", + "error.schema.generation": "An error occurred during schema generation.", "error.validation.json": "This is not a JSON", - - "form.Input.description": "Description", - "form.Input.placeholder": "Placeholder", - "form.Input.description.placeholder": "Display name in the profile", - "form.Input.placeholder.placeholder": "My awesome value", - "form.Input.disabled": "Editable field", - "form.Input.label.inputDescription": "This value overrides the label displayed in the table's head", - "form.Input.label": "Label", - "form.Input.search": "Enable search", - "form.Input.search.field": "Enable search on this field", - "form.Input.filters": "Enable filters", - "form.Input.sort.field": "Enable sort on this field", + "error.validation.max": "The value is too high.", + "error.validation.maxLength": "The value is too long.", + "error.validation.min": "The value is too low.", + "error.validation.minLength": "The value is too short.", + "error.validation.minSupMax": "Can't be superior", + "error.validation.regex": "The value not match the regex.", + "error.validation.required": "This value input is required.", "form.Input.bulkActions": "Enable bulk actions", + "form.Input.defaultSort": "Default sort attribute", + "form.Input.description": "Description", + "form.Input.description.placeholder": "Display name in the profile", + "form.Input.disabled": "Editable field", + "form.Input.filters": "Enable filters", + "form.Input.label": "Label", + "form.Input.label.inputDescription": "This value overrides the label displayed in the table's head", "form.Input.pageEntries": "Entries per page", "form.Input.pageEntries.inputDescription": "Note: You can override this value in the Content Type settings page.", - "form.Input.defaultSort": "Default sort attribute", - + "form.Input.placeholder": "Placeholder", + "form.Input.placeholder.placeholder": "My awesome value", + "form.Input.search": "Enable search", + "form.Input.search.field": "Enable search on this field", + "form.Input.sort.field": "Enable sort on this field", "notification.error.displayedFields": "You need at least one displayed field", "notification.error.relationship.fetch": "An error occurred during relationship fetch.", "notification.info.SettingPage.disableSort": "You need to have one attribute with the sorting allowed", - - "success.record.delete": "Deleted", - "success.record.save": "Saved", - "pageNotFound": "Page not found", - + "plugin.description.long": "Quick way to see, edit and delete the data in your database.", + "plugin.description.short": "Quick way to see, edit and delete the data in your database.", + "popUpWarning.bodyMessage.contentType.delete": "Are you sure you want to delete this entry?", + "popUpWarning.bodyMessage.contentType.delete.all": "Are you sure you want to delete theses entries?", "popUpWarning.button.cancel": "Cancel", "popUpWarning.button.confirm": "Confirm", "popUpWarning.title": "Please confirm", - "popUpWarning.bodyMessage.contentType.delete": "Are you sure you want to delete this entry?", - "popUpWarning.bodyMessage.contentType.delete.all": "Are you sure you want to delete theses entries?", "popUpWarning.warning.cancelAllSettings": "Are you sure you want to cancel your modifications?", - "popUpWarning.warning.updateAllSettings": "This will modify all your settings" -} + "popUpWarning.warning.updateAllSettings": "This will modify all your settings", + "success.record.delete": "Deleted", + "success.record.save": "Saved" +} \ No newline at end of file diff --git a/packages/strapi-plugin-content-manager/admin/src/translations/es.json b/packages/strapi-plugin-content-manager/admin/src/translations/es.json index a35861d259..237dfb52bc 100644 --- a/packages/strapi-plugin-content-manager/admin/src/translations/es.json +++ b/packages/strapi-plugin-content-manager/admin/src/translations/es.json @@ -1,116 +1,98 @@ { - "plugin.description.short": "Ver, editar y eliminar información de su base de datos de manera rápida.", - "plugin.description.long": "Ver, editar y eliminar información de su base de datos de manera rápida.", - "containers.Home.pluginHeaderTitle": "Gestor de Contenido", - "containers.Home.introduction": "Para editar sus registros vaya al link en específico en el menu de la izquierda. Este plugin no tiene una manera de editar configuraciones y aún esta en continuo desarrollo.", - "containers.Home.pluginHeaderDescription": "Gestiona sus registros en una bella y poderoza interfaz.", - "containers.Edit.submit": "Guardar", - "containers.Edit.editing": "Editando...", - "containers.Edit.delete": "Eliminar", - "containers.Edit.reset": "Reiniciar", - "containers.Edit.returnList": "Regresar a la lista", - "containers.List.addAnEntry": "Agregar nuevo {entity}", - "containers.List.pluginHeaderDescription": "{label} registros encontrados", - "containers.List.pluginHeaderDescription.singular": "{label} registro encontrado", - "components.LimitSelect.itemsPerPage": "registros por página", - "containers.List.errorFetchRecords": "Error", - - "containers.SettingPage.addField": "Agregar nuevo campo", - "containers.SettingPage.attributes": "Campos de atributos", - "containers.SettingPage.attributes.description": "Defina el orden de sus atributos", - - "containers.SettingPage.listSettings.title": "Lista — Configuraciones", - "containers.SettingPage.listSettings.description": "Configura las opciones para este tipo de contenido", - "containers.SettingPage.pluginHeaderDescription": "Configura las opciones específicas para este Tipo de Contenido", - "containers.SettingsPage.pluginHeaderDescription": "Configura las opciones por defecto para todos sus Tipos de Contenido", - "containers.SettingsPage.Block.generalSettings.description": "Configura las opciones por defecto para sus Tipos de Contenido", - "containers.SettingsPage.Block.generalSettings.title": "General", - "containers.SettingsPage.Block.contentType.title": "Tipos de Contenido", - "containers.SettingsPage.Block.contentType.description": "Configuraciones específicas", - + "EditRelations.title": "Datos relacionados", "components.AddFilterCTA.add": "Filtros", "components.AddFilterCTA.hide": "Filtros", - "components.DraggableAttr.edit": "Click para editar", - + "components.FilterOptions.FILTER_TYPES.=": "es", + "components.FilterOptions.FILTER_TYPES._contains": "contiene", + "components.FilterOptions.FILTER_TYPES._containss": "contiene (distinguiendo mayúsculas y minúsculas)", + "components.FilterOptions.FILTER_TYPES._gt": "es mayor que", + "components.FilterOptions.FILTER_TYPES._gte": "es mayor o igual que", + "components.FilterOptions.FILTER_TYPES._lt": "es menor que", + "components.FilterOptions.FILTER_TYPES._lte": "es menor o igual que", + "components.FilterOptions.FILTER_TYPES._ne": "no es", + "components.FilterOptions.button.apply": "Aplicar", "components.FiltersPickWrapper.PluginHeader.actions.apply": "Aplicar", "components.FiltersPickWrapper.PluginHeader.actions.clearAll": "Limpiar todo", "components.FiltersPickWrapper.PluginHeader.description": "Establece las condiciones a aplicar para filtrar registros", "components.FiltersPickWrapper.PluginHeader.title.filter": "Filtros", "components.FiltersPickWrapper.hide": "Ocultar", - - "components.FilterOptions.button.apply": "Aplicar", - "components.FilterOptions.FILTER_TYPES.=": "es", - "components.FilterOptions.FILTER_TYPES._ne": "no es", - "components.FilterOptions.FILTER_TYPES._lt": "es menor que", - "components.FilterOptions.FILTER_TYPES._lte": "es menor o igual que", - "components.FilterOptions.FILTER_TYPES._gt": "es mayor que", - "components.FilterOptions.FILTER_TYPES._gte": "es mayor o igual que", - "components.FilterOptions.FILTER_TYPES._contains": "contiene", - "components.FilterOptions.FILTER_TYPES._containss": "contiene (distinguiendo mayúsculas y minúsculas)", - + "components.LimitSelect.itemsPerPage": "registros por página", "components.Search.placeholder": "Buscar un registro...", - + "components.TableDelete.delete": "Eliminar todo", "components.TableDelete.entries.plural": "{number} registros seleccionados", "components.TableDelete.entries.singular": "{number} registro seleccionado", - "components.TableDelete.delete": "Eliminar todo", - - "components.TableEmpty.withFilters": "No hay {contentType} con los filtros aplicados...", - "components.TableEmpty.withoutFilter": "No hay {contentType}...", "components.TableEmpty.withSearch": "No hay {contentType} que coincida con la búsqueda ({search})...", - - "EditRelations.title": "Datos relacionados", - - "emptyAttributes.title": "Aún no hay campos", - "emptyAttributes.description": "Agregue su primer campo a su Tipo de Contenido", + "components.TableEmpty.withoutFilter": "No hay {contentType}...", + "containers.Edit.delete": "Eliminar", + "containers.Edit.editing": "Editando...", + "containers.Edit.reset": "Reiniciar", + "containers.Edit.returnList": "Regresar a la lista", + "containers.Edit.submit": "Guardar", + "containers.Home.introduction": "Para editar sus registros vaya al link en específico en el menu de la izquierda. Este plugin no tiene una manera de editar configuraciones y aún esta en continuo desarrollo.", + "containers.Home.pluginHeaderDescription": "Gestiona sus registros en una bella y poderoza interfaz.", + "containers.Home.pluginHeaderTitle": "Gestor de Contenido", + "containers.List.addAnEntry": "Agregar nuevo {entity}", + "containers.List.errorFetchRecords": "Error", + "containers.List.pluginHeaderDescription": "{label} registros encontrados", + "containers.List.pluginHeaderDescription.singular": "{label} registro encontrado", + "containers.SettingPage.addField": "Agregar nuevo campo", + "containers.SettingPage.attributes": "Campos de atributos", + "containers.SettingPage.attributes.description": "Defina el orden de sus atributos", + "containers.SettingPage.listSettings.description": "Configura las opciones para este tipo de contenido", + "containers.SettingPage.listSettings.title": "Lista — Configuraciones", + "containers.SettingPage.pluginHeaderDescription": "Configura las opciones específicas para este Tipo de Contenido", + "containers.SettingsPage.Block.contentType.description": "Configuraciones específicas", + "containers.SettingsPage.Block.contentType.title": "Tipos de Contenido", + "containers.SettingsPage.Block.generalSettings.description": "Configura las opciones por defecto para sus Tipos de Contenido", + "containers.SettingsPage.Block.generalSettings.title": "General", + "containers.SettingsPage.pluginHeaderDescription": "Configura las opciones por defecto para todos sus Tipos de Contenido", "emptyAttributes.button": "Ir al creador de Tipos de Contenido", - - "error.schema.generation": "Ocurrió un error durante la generación de esquema.", - "error.records.count": "Ocurrió un error durante la consulta del número de registros.", - "error.records.fetch": "Ocurrió un error durante la consulta de registros.", - "error.record.fetch": "Ocurrió un error durante la consulta del registro.", - "error.record.create": "Ocurrió un error durante la creación del registro.", - "error.record.update": "Ocurrió un error durante la actualización del registro.", - "error.record.delete": "Ocurrió un error durante la eliminación del registro.", - "error.model.fetch": "Ocurrió un error durante la consulta de configuración de modelos.", - "error.validation.required": "Este dato es requerido.", - "error.validation.regex": "El valor no cumple la expresión regular.", - "error.validation.max": "El valor es muy alto.", - "error.validation.min": "El valor es muy bajo.", - "error.validation.maxLength": "El valor es muy largo.", - "error.validation.minLength": "El valor es muy corto.", - "error.contentTypeName.taken": "Este nombre ya existe", - "error.attribute.taken": "Este campo ya existe", + "emptyAttributes.description": "Agregue su primer campo a su Tipo de Contenido", + "emptyAttributes.title": "Aún no hay campos", "error.attribute.key.taken": "Este valor ya existe", "error.attribute.sameKeyAndName": "No pueden ser iguales", - "error.validation.minSupMax": "No puede ser superior", + "error.attribute.taken": "Este campo ya existe", + "error.contentTypeName.taken": "Este nombre ya existe", + "error.model.fetch": "Ocurrió un error durante la consulta de configuración de modelos.", + "error.record.create": "Ocurrió un error durante la creación del registro.", + "error.record.delete": "Ocurrió un error durante la eliminación del registro.", + "error.record.fetch": "Ocurrió un error durante la consulta del registro.", + "error.record.update": "Ocurrió un error durante la actualización del registro.", + "error.records.count": "Ocurrió un error durante la consulta del número de registros.", + "error.records.fetch": "Ocurrió un error durante la consulta de registros.", + "error.schema.generation": "Ocurrió un error durante la generación de esquema.", "error.validation.json": "Este no es un JSON", - - "form.Input.label.inputDescription": "Este valor sobrescribe la etiqueta mostrada en la cabecera de la tabla", - "form.Input.label": "Etiqueta", - "form.Input.search": "Habilitar la búsqueda", - "form.Input.search.field": "Habilitar la búsqueda para este campo", - "form.Input.filters": "Habilitar filtros", - "form.Input.sort.field": "Habilitar ordenado para este campo", + "error.validation.max": "El valor es muy alto.", + "error.validation.maxLength": "El valor es muy largo.", + "error.validation.min": "El valor es muy bajo.", + "error.validation.minLength": "El valor es muy corto.", + "error.validation.minSupMax": "No puede ser superior", + "error.validation.regex": "El valor no cumple la expresión regular.", + "error.validation.required": "Este dato es requerido.", "form.Input.bulkActions": "Habilitar acciones en bloque", + "form.Input.defaultSort": "Atributo para ordenar por defecto", + "form.Input.filters": "Habilitar filtros", + "form.Input.label": "Etiqueta", + "form.Input.label.inputDescription": "Este valor sobrescribe la etiqueta mostrada en la cabecera de la tabla", "form.Input.pageEntries": "Registros por página", "form.Input.pageEntries.inputDescription": "Nota: Puede sobrescribir este valor en la página de configuraciones para Tipo de Contenido.", - "form.Input.defaultSort": "Atributo para ordenar por defecto", - + "form.Input.search": "Habilitar la búsqueda", + "form.Input.search.field": "Habilitar la búsqueda para este campo", + "form.Input.sort.field": "Habilitar ordenado para este campo", "notification.error.relationship.fetch": "Ocurrió un error durante la consulta de la relación.", "notification.info.SettingPage.disableSort": "Necesita tener un habilidato el ordenado en un atributo", - - "success.record.delete": "Eliminado", - "success.record.save": "Guardado", - "pageNotFound": "Página no encontrada", - + "plugin.description.long": "Ver, editar y eliminar información de su base de datos de manera rápida.", + "plugin.description.short": "Ver, editar y eliminar información de su base de datos de manera rápida.", + "popUpWarning.bodyMessage.contentType.delete": "¿Está seguro de querer eliminar este registro?", + "popUpWarning.bodyMessage.contentType.delete.all": "¿Está seguro de querer eliminar estos registros?", "popUpWarning.button.cancel": "Cancelar", "popUpWarning.button.confirm": "Confirmar", "popUpWarning.title": "Favor de confirmar", - "popUpWarning.bodyMessage.contentType.delete": "¿Está seguro de querer eliminar este registro?", - "popUpWarning.bodyMessage.contentType.delete.all": "¿Está seguro de querer eliminar estos registros?", "popUpWarning.warning.cancelAllSettings": "¿Está seguro de querer cancelar sus cambios?", - "popUpWarning.warning.updateAllSettings": "Esto modificará todas sus configuraciones" -} + "popUpWarning.warning.updateAllSettings": "Esto modificará todas sus configuraciones", + "success.record.delete": "Eliminado", + "success.record.save": "Guardado" +} \ No newline at end of file diff --git a/packages/strapi-plugin-content-manager/admin/src/translations/fr.json b/packages/strapi-plugin-content-manager/admin/src/translations/fr.json index 5c62316897..f537f0481f 100644 --- a/packages/strapi-plugin-content-manager/admin/src/translations/fr.json +++ b/packages/strapi-plugin-content-manager/admin/src/translations/fr.json @@ -1,135 +1,114 @@ { - "plugin.description.short": "Visualisez, modifiez et supprimez les données de votre base de données.", - "plugin.description.long": "Visualisez, modifiez et supprimez les données de votre base de données.", - "containers.Home.pluginHeaderTitle": "Type de contenu", - "containers.Home.pluginHeaderDescription": "Créer et modifier votre type de contenu", - "containers.Home.introduction": "Pour éditer du contenu, choisissez un type de données dans le menu de gauche.", - "containers.Edit.submit": "Valider", - "containers.Edit.editing": "Édition en cours...", - "containers.Edit.delete": "Supprimer", - "containers.Edit.reset": "Annuler", - "containers.Edit.returnList": "Retourner à la liste", - "containers.Edit.addAnItem": "Ajouter un élément...", - "containers.Edit.clickToJump": "Cliquer pour voir l'entrée", - "containers.Edit.seeDetails": "Détails", - "containers.List.addAnEntry": "Ajouter {entity}", - "containers.List.pluginHeaderDescription": "{label} entrées trouvées", - "containers.List.pluginHeaderDescription.singular": "{label} entrée trouvée", - "components.LimitSelect.itemsPerPage": "Éléments par page", - "containers.List.errorFetchRecords": "Erreur", - "containers.SettingsPage.Block.contentType.title": "Types de contenu", - "containers.SettingsPage.Block.contentType.description": "Configurer les paramètres spécifiques", - "containers.ListPage.displayedFields": "Champs affichés", - - "containers.SettingPage.addField": "Ajouter un nouveau champs", - "containers.SettingPage.addRelationalField": "Ajouter un nouveau champs relationnel", - "containers.SettingPage.attributes": "Attributs", - "containers.SettingPage.attributes.description": "Organiser les attributs du modèle", - "containers.SettingPage.relations": "Champs relationnels", - - "containers.SettingPage.pluginHeaderDescription": "Configurez les paramètres de ce modèle", - - "containers.SettingPage.editSettings.description": "Glissez & déposez les champs pour construire le layout", - "containers.SettingPage.editSettings.title": "Edit — Paramètres", - - "containers.SettingPage.listSettings.title": "Liste — Paramètres", - "containers.SettingPage.listSettings.description": "Configurez les options de ce modèle", - - "containers.SettingsPage.pluginHeaderDescription": "Configurez les paramètres par défaut de vos modèles", - "containers.SettingsPage.Block.generalSettings.description": "Configurez les options par défault de vos modèles", - "containers.SettingsPage.Block.generalSettings.title": "Général", - + "EditRelations.title": "Données associées", "components.AddFilterCTA.add": "Filtres", "components.AddFilterCTA.hide": "Filtres", - "components.DraggableAttr.edit": "Clicquez pour modifier", - - "components.EmptyAttributesBlock.description": "Vous pouvez modifiez vos paramètres", "components.EmptyAttributesBlock.button": "Voir la page des configurations", - + "components.EmptyAttributesBlock.description": "Vous pouvez modifiez vos paramètres", + "components.FilterOptions.FILTER_TYPES.=": "est", + "components.FilterOptions.FILTER_TYPES._contains": "contient", + "components.FilterOptions.FILTER_TYPES._containss": "contient (sensible à la casse)", + "components.FilterOptions.FILTER_TYPES._gt": "supérieur à", + "components.FilterOptions.FILTER_TYPES._gte": "supérieur ou égal à", + "components.FilterOptions.FILTER_TYPES._lt": "inférieur à", + "components.FilterOptions.FILTER_TYPES._lte": "inférieur ou égal à", + "components.FilterOptions.FILTER_TYPES._ne": "n'est pas", + "components.FilterOptions.button.apply": "Appliquer", "components.FiltersPickWrapper.PluginHeader.actions.apply": "Appliquer", "components.FiltersPickWrapper.PluginHeader.actions.clearAll": "Tout supprimer", "components.FiltersPickWrapper.PluginHeader.description": "Définissez les conditions des filtres à appliquer", "components.FiltersPickWrapper.PluginHeader.title.filter": "Filtres", "components.FiltersPickWrapper.hide": "Fermer", - + "components.LimitSelect.itemsPerPage": "Éléments par page", "components.Search.placeholder": "Rechercher une entrée...", - + "components.TableDelete.delete": "Tout supprimer", "components.TableDelete.entries.plural": "{number} entrées sélectionnées", "components.TableDelete.entries.singular": "{number} entrée sélectionnée", - "components.TableDelete.delete": "Tout supprimer", - "components.TableEmpty.withFilters": "Aucun {contentType} n'a été trouvé avec ces filtres...", - "components.TableEmpty.withoutFilter": "Aucun {contentType} n'a été trouvé...", "components.TableEmpty.withSearch": "Aucun {contentType} n'a été trouvé avec cette recherche ({search})...", - - "components.FilterOptions.button.apply": "Appliquer", - "components.FilterOptions.FILTER_TYPES.=": "est", - "components.FilterOptions.FILTER_TYPES._ne": "n'est pas", - "components.FilterOptions.FILTER_TYPES._lt": "inférieur à", - "components.FilterOptions.FILTER_TYPES._lte": "inférieur ou égal à", - "components.FilterOptions.FILTER_TYPES._gt": "supérieur à", - "components.FilterOptions.FILTER_TYPES._gte": "supérieur ou égal à", - "components.FilterOptions.FILTER_TYPES._contains": "contient", - "components.FilterOptions.FILTER_TYPES._containss": "contient (sensible à la casse)", - - "EditRelations.title": "Données associées", - - "emptyAttributes.title": "Il n'y a pas encore de champs", - "emptyAttributes.description": "Ajoutez votre premier champ a votre modèle", + "components.TableEmpty.withoutFilter": "Aucun {contentType} n'a été trouvé...", + "containers.Edit.addAnItem": "Ajouter un élément...", + "containers.Edit.clickToJump": "Cliquer pour voir l'entrée", + "containers.Edit.delete": "Supprimer", + "containers.Edit.editing": "Édition en cours...", + "containers.Edit.reset": "Annuler", + "containers.Edit.returnList": "Retourner à la liste", + "containers.Edit.seeDetails": "Détails", + "containers.Edit.submit": "Valider", + "containers.Home.introduction": "Pour éditer du contenu, choisissez un type de données dans le menu de gauche.", + "containers.Home.pluginHeaderDescription": "Créer et modifier votre type de contenu", + "containers.Home.pluginHeaderTitle": "Type de contenu", + "containers.List.addAnEntry": "Ajouter {entity}", + "containers.List.errorFetchRecords": "Erreur", + "containers.List.pluginHeaderDescription": "{label} entrées trouvées", + "containers.List.pluginHeaderDescription.singular": "{label} entrée trouvée", + "containers.ListPage.displayedFields": "Champs affichés", + "containers.SettingPage.addField": "Ajouter un nouveau champs", + "containers.SettingPage.addRelationalField": "Ajouter un nouveau champs relationnel", + "containers.SettingPage.attributes": "Attributs", + "containers.SettingPage.attributes.description": "Organiser les attributs du modèle", + "containers.SettingPage.editSettings.description": "Glissez & déposez les champs pour construire le layout", + "containers.SettingPage.editSettings.title": "Edit — Paramètres", + "containers.SettingPage.listSettings.description": "Configurez les options de ce modèle", + "containers.SettingPage.listSettings.title": "Liste — Paramètres", + "containers.SettingPage.pluginHeaderDescription": "Configurez les paramètres de ce modèle", + "containers.SettingPage.relations": "Champs relationnels", + "containers.SettingsPage.Block.contentType.description": "Configurer les paramètres spécifiques", + "containers.SettingsPage.Block.contentType.title": "Types de contenu", + "containers.SettingsPage.Block.generalSettings.description": "Configurez les options par défault de vos modèles", + "containers.SettingsPage.Block.generalSettings.title": "Général", + "containers.SettingsPage.pluginHeaderDescription": "Configurez les paramètres par défaut de vos modèles", "emptyAttributes.button": "Ouvrir le Content Type Builder", - - "error.schema.generation": "Une erreur est survenue lors de la génération du schéma.", - "error.records.count": "Une erreur est survenue lors de la réception du nombre d'entrées.", - "error.records.fetch": "Une erreur est survenue lors de la réception des entrées.", - "error.record.fetch": "Une erreur est survenue lors de la réception de l'entrée.", - "error.record.create": "Une erreur est survenue lors de la création de l'entrée.", - "error.record.update": "Une erreur est survenue lors de la modification de l'entrée.", - "error.record.delete": "Une erreur est survenue lors de la suppression de l'entrée.", - "error.model.fetch": "Une erreur est survenue lors de la réception des modèles.", - "error.validation.required": "Ce champ est obligatoire.", - "error.validation.regex": "La valeur ne correspond pas au format attendu.", - "error.validation.max": "La valeur est trop grande.", - "error.validation.min": "La valeur est trop basse.", - "error.validation.maxLength": "La valeur est trop longue.", - "error.validation.minLength": "La valeur est trop courte.", - "error.contentTypeName.taken": "Ce nom existe déjà", - "error.attribute.taken": "Ce champ existe déjà", + "emptyAttributes.description": "Ajoutez votre premier champ a votre modèle", + "emptyAttributes.title": "Il n'y a pas encore de champs", "error.attribute.key.taken": "Cette valeur existe déjà", "error.attribute.sameKeyAndName": "Ne peuvent pas être égaux", - "error.validation.minSupMax": "Ne peut pas être plus grand", + "error.attribute.taken": "Ce champ existe déjà", + "error.contentTypeName.taken": "Ce nom existe déjà", + "error.model.fetch": "Une erreur est survenue lors de la réception des modèles.", + "error.record.create": "Une erreur est survenue lors de la création de l'entrée.", + "error.record.delete": "Une erreur est survenue lors de la suppression de l'entrée.", + "error.record.fetch": "Une erreur est survenue lors de la réception de l'entrée.", + "error.record.update": "Une erreur est survenue lors de la modification de l'entrée.", + "error.records.count": "Une erreur est survenue lors de la réception du nombre d'entrées.", + "error.records.fetch": "Une erreur est survenue lors de la réception des entrées.", + "error.schema.generation": "Une erreur est survenue lors de la génération du schéma.", "error.validation.json": "Le format JSON n'est pas respecté", - + "error.validation.max": "La valeur est trop grande.", + "error.validation.maxLength": "La valeur est trop longue.", + "error.validation.min": "La valeur est trop basse.", + "error.validation.minLength": "La valeur est trop courte.", + "error.validation.minSupMax": "Ne peut pas être plus grand", + "error.validation.regex": "La valeur ne correspond pas au format attendu.", + "error.validation.required": "Ce champ est obligatoire.", + "form.Input.bulkActions": "Autoriser les actions groupées", + "form.Input.defaultSort": "Attribut de tri par défault", "form.Input.description": "Description", - "form.Input.placeholder": "Placeholder", "form.Input.description.placeholder": "Afficher le nom dans le profile", - "form.Input.placeholder.placeholder": "Mon super placeholder", "form.Input.disabled": "Champ editable", + "form.Input.filters": "Autoriser les filtres", "form.Input.label": "Label", "form.Input.label.inputDescription": "Cette valeur modifie celle du champs de la table", - "form.Input.search": "Autoriser la search", - "form.Input.search.field": "Autoriser la search sur ce champs", - "form.Input.filters": "Autoriser les filtres", - "form.Input.sort.field": "Autoriser le tri sur ce champs", - "form.Input.bulkActions": "Autoriser les actions groupées", "form.Input.pageEntries": "Nombre d'entrées par page", "form.Input.pageEntries.inputDescription": "Note: Vous pouvez modifier ces valeurs par modèle", - "form.Input.defaultSort": "Attribut de tri par défault", - + "form.Input.placeholder": "Placeholder", + "form.Input.placeholder.placeholder": "Mon super placeholder", + "form.Input.search": "Autoriser la search", + "form.Input.search.field": "Autoriser la search sur ce champs", + "form.Input.sort.field": "Autoriser le tri sur ce champs", "notification.error.displayedFields": "Vous devez avoir au moins un champ d'affiché", "notification.error.relationship.fetch": "Une erreur est survenue en récupérant les relations.", "notification.info.SettingPage.disableSort": "Vous devez avoir au moins un attribut de tri par défaut", - - "success.record.delete": "Supprimé", - "success.record.save": "Sauvegardé", - + "pageNotFound": "Page non trouvée", + "plugin.description.long": "Visualisez, modifiez et supprimez les données de votre base de données.", + "plugin.description.short": "Visualisez, modifiez et supprimez les données de votre base de données.", + "popUpWarning.bodyMessage.contentType.delete": "Êtes-vous sûr de vouloir supprimer cette entrée ?", + "popUpWarning.bodyMessage.contentType.delete.all": "Êtes-vous sûr de vouloir supprimer ces entrées ?", "popUpWarning.button.cancel": "Annuler", "popUpWarning.button.confirm": "Confirmer", "popUpWarning.title": "Confirmation requise", - "popUpWarning.bodyMessage.contentType.delete": "Êtes-vous sûr de vouloir supprimer cette entrée ?", - "popUpWarning.bodyMessage.contentType.delete.all": "Êtes-vous sûr de vouloir supprimer ces entrées ?", "popUpWarning.warning.cancelAllSettings": "Êtes-vous sûr de vouloir vos modifications?", "popUpWarning.warning.updateAllSettings": "Cela modifiera tous vos précédents paramètres.", - - "pageNotFound" : "Page non trouvée" -} + "success.record.delete": "Supprimé", + "success.record.save": "Sauvegardé" +} \ No newline at end of file diff --git a/packages/strapi-plugin-content-manager/admin/src/translations/it.json b/packages/strapi-plugin-content-manager/admin/src/translations/it.json index bcaef795b0..615c08a2a7 100644 --- a/packages/strapi-plugin-content-manager/admin/src/translations/it.json +++ b/packages/strapi-plugin-content-manager/admin/src/translations/it.json @@ -1,115 +1,101 @@ { - "plugin.description.short": "Veloce modo di vedere, modificare e cancellare i dati presenti nel database.", - "plugin.description.long": "Veloce modo di vedere, modificare e cancellare i dati presenti nel database.", - "containers.Home.pluginHeaderTitle": "Content Manager", - "containers.Home.introduction": "Per modificare le voci, visitare il link nel menu di sinistra. Questo plugin non ha un suo modo corretto di modificare le impostazioni ed è ancora in fase di sviluppo attivo.", - "containers.Home.pluginHeaderDescription": "Gestire le voci attraverso un potente e bella interfaccia.", - "containers.Edit.submit": "Salva", - "containers.Edit.editing": "Modificando...", - "containers.Edit.delete": "Elimina", - "containers.Edit.reset": "Resetta", - "containers.Edit.returnList": "Tornare alla lista", - "containers.List.addAnEntry": "Aggiungi un Nuovo {entity}", - "containers.List.pluginHeaderDescription": "{label} voci non trovato", - "containers.List.pluginHeaderDescription.singular": "{label} voce trovati", - "components.LimitSelect.itemsPerPage": "Elementi per pagina", - "containers.List.errorFetchRecords": "Errore", - "containers.SettingPage.addField" : "Aggiungi un nuovo campo", - "containers.SettingPage.attributes" : "Attributi", - "containers.SettingPage.attributes.description" : "Definisci l'ordine degli attributi", - "containers.SettingPage.listSettings.title" : "Lista — Impostazioni", - "containers.SettingPage.listSettings.description" : "Configura le opzioni per questo Tipo di Contenuto", - "containers.SettingPage.pluginHeaderDescription" : "Configura le impostazioni specifiche per questo Tipo di Contenuto", - "containers.SettingsPage.pluginHeaderDescription" : "Configura le impostazioni di default per tutti i tuoi Tipi di Contenuto", - "containers.SettingsPage.Block.generalSettings.description" : "Configura le opzioni di default per i Tipi di Contenuto", - "containers.SettingsPage.Block.generalSettings.title" : "Generali", - "containers.SettingsPage.Block.contentType.title" : "Tipi di Contenuto", - "containers.SettingsPage.Block.contentType.description" : "Configura le impostazioni specifiche", - - "components.AddFilterCTA.add": "Filtri", - "components.AddFilterCTA.hide": "Filtri", - "components.DraggableAttr.edit" : "Clicca per modificare", - "components.FilterOptions.button.apply": "Applica", - "components.FiltersPickWrapper.PluginHeader.actions.apply": "Applica", - "components.FiltersPickWrapper.PluginHeader.actions.clearAll": "Cancella tutto", - "components.FiltersPickWrapper.PluginHeader.description": "Impostare le condizioni da applicare per filtrare le voci", - "components.FiltersPickWrapper.PluginHeader.title.filter": "Filtri", - "components.FiltersPickWrapper.hide": "Nascondi", - "components.FilterOptions.FILTER_TYPES.=": "si", - "components.FilterOptions.FILTER_TYPES._ne": "non è", - "components.FilterOptions.FILTER_TYPES._lt": "è inferiore", - "components.FilterOptions.FILTER_TYPES._lte": "è inferiore o uguale a", - "components.FilterOptions.FILTER_TYPES._gt": "è maggiore di", - "components.FilterOptions.FILTER_TYPES._gte": "è maggiore o uguale a", - "components.FilterOptions.FILTER_TYPES._contains": "contiene", - "components.FilterOptions.FILTER_TYPES._containss": "contiene (maiuscole e minuscole)", - - "components.Search.placeholder": "Ricerca di una voce...", - - "components.TableDelete.entries.plural": "{number} voci selezionate", - "components.TableDelete.entries.singular": "{number} voce selezionata", - "components.TableDelete.delete": "Eliminare tutti", - - "components.TableEmpty.withFilters": "Non vi è alcun {contentType} con l'applicazione di filtri...", - "components.TableEmpty.withoutFilter": "Non vi è alcun {contentType}...", - "components.TableEmpty.withSearch": "Non vi è alcun {contentType} corrispondente alla ricerca ({search})...", - "EditRelations.title": "Dati relazionali", - - "emptyAttributes.title": "Non ci sono ancora campi", - "emptyAttributes.description": "Aggiungi il tuo primo campo per il Tipo di Contenuto", + "components.AddFilterCTA.add": "Filtri", + "components.AddFilterCTA.hide": "Filtri", + "components.DraggableAttr.edit": "Clicca per modificare", + "components.FilterOptions.FILTER_TYPES.=": "si", + "components.FilterOptions.FILTER_TYPES._contains": "contiene", + "components.FilterOptions.FILTER_TYPES._containss": "contiene (maiuscole e minuscole)", + "components.FilterOptions.FILTER_TYPES._gt": "è maggiore di", + "components.FilterOptions.FILTER_TYPES._gte": "è maggiore o uguale a", + "components.FilterOptions.FILTER_TYPES._lt": "è inferiore", + "components.FilterOptions.FILTER_TYPES._lte": "è inferiore o uguale a", + "components.FilterOptions.FILTER_TYPES._ne": "non è", + "components.FilterOptions.button.apply": "Applica", + "components.FiltersPickWrapper.PluginHeader.actions.apply": "Applica", + "components.FiltersPickWrapper.PluginHeader.actions.clearAll": "Cancella tutto", + "components.FiltersPickWrapper.PluginHeader.description": "Impostare le condizioni da applicare per filtrare le voci", + "components.FiltersPickWrapper.PluginHeader.title.filter": "Filtri", + "components.FiltersPickWrapper.hide": "Nascondi", + "components.LimitSelect.itemsPerPage": "Elementi per pagina", + "components.Search.placeholder": "Ricerca di una voce...", + "components.TableDelete.delete": "Eliminare tutti", + "components.TableDelete.entries.plural": "{number} voci selezionate", + "components.TableDelete.entries.singular": "{number} voce selezionata", + "components.TableEmpty.withFilters": "Non vi è alcun {contentType} con l'applicazione di filtri...", + "components.TableEmpty.withSearch": "Non vi è alcun {contentType} corrispondente alla ricerca ({search})...", + "components.TableEmpty.withoutFilter": "Non vi è alcun {contentType}...", + "containers.Edit.delete": "Elimina", + "containers.Edit.editing": "Modificando...", + "containers.Edit.reset": "Resetta", + "containers.Edit.returnList": "Tornare alla lista", + "containers.Edit.submit": "Salva", + "containers.Home.introduction": "Per modificare le voci, visitare il link nel menu di sinistra. Questo plugin non ha un suo modo corretto di modificare le impostazioni ed è ancora in fase di sviluppo attivo.", + "containers.Home.pluginHeaderDescription": "Gestire le voci attraverso un potente e bella interfaccia.", + "containers.Home.pluginHeaderTitle": "Content Manager", + "containers.List.addAnEntry": "Aggiungi un Nuovo {entity}", + "containers.List.errorFetchRecords": "Errore", + "containers.List.pluginHeaderDescription": "{label} voci non trovato", + "containers.List.pluginHeaderDescription.singular": "{label} voce trovati", + "containers.SettingPage.addField": "Aggiungi un nuovo campo", + "containers.SettingPage.attributes": "Attributi", + "containers.SettingPage.attributes.description": "Definisci l'ordine degli attributi", + "containers.SettingPage.listSettings.description": "Configura le opzioni per questo Tipo di Contenuto", + "containers.SettingPage.listSettings.title": "Lista — Impostazioni", + "containers.SettingPage.pluginHeaderDescription": "Configura le impostazioni specifiche per questo Tipo di Contenuto", + "containers.SettingsPage.Block.contentType.description": "Configura le impostazioni specifiche", + "containers.SettingsPage.Block.contentType.title": "Tipi di Contenuto", + "containers.SettingsPage.Block.generalSettings.description": "Configura le opzioni di default per i Tipi di Contenuto", + "containers.SettingsPage.Block.generalSettings.title": "Generali", + "containers.SettingsPage.pluginHeaderDescription": "Configura le impostazioni di default per tutti i tuoi Tipi di Contenuto", "emptyAttributes.button": "Vai al generatori di contenuti", - - "error.schema.generation": "Si è verificato un errore durante la generazione dello schema.", - "error.records.count": "Si è verificato un errore durante il conteggio dei record.", - "error.records.fetch": "Si è verificato un errore durante il caricamento dei record.", - "error.record.fetch": "Si è verificato un errore durante la registrazione.", - "error.record.create": "Si è verificato un errore durante la creazione del record.", - "error.record.update": "Si è verificato un errore durante l'aggiornamento del record.", - "error.record.delete": "Si è verificato un errore durante la cancellazione del record.", - "error.model.fetch": "Si è verificato un errore durante il caricamento dei modelli di configurazione.", - "error.validation.required": "Questo valore è richiesto.", - "error.validation.regex": "Il valore non corrisponde alla regex.", - "error.validation.json" : "Non è un JSON", - "error.validation.max": "Il valore è troppo alto.", - "error.validation.min": "Il valore è troppo basso.", - "error.validation.maxLength": "Il valore è troppo lungo.", - "error.validation.minLength": "Il valore è troppo breve.", - "error.contentTypeName.taken": "Questo nome esiste già", - "error.attribute.taken": "Questo campo nome esiste già", - "error.attribute.key.taken": "Questo valore esiste già", - "error.attribute.sameKeyAndName": "Non può essere uguale", - "error.validation.minSupMax": "Non può essere superiore", - - "form.Input.description": "Description", - "form.Input.description.placeholder": "Display name in the profile", - "form.Input.disabled": "Editable field", - - "form.Input.label.inputDescription" : "Questo valore sovrascrive l'etichetta mostrata nell'intestazione della tabella", - "form.Input.label" : "Etichetta", - "form.Input.search" : "Abilita ricerca", - "form.Input.search.field" : "Abilita la ricerca su questo campo", - "form.Input.filters" : "Abilita filtri", - "form.Input.sort.field" : "Abilita ordinamento su questo campo", - "form.Input.bulkActions" : "Abilita caricamento", - "form.Input.pageEntries" : "Righe per pagina", - "form.Input.pageEntries.inputDescription" : "Attenzione: Puoi sovrascrivere questo valore nella pagina delle impostazioni del Tipo di Contenuto", - "form.Input.defaultSort" : "Attributo di ordinamento di default", - + "emptyAttributes.description": "Aggiungi il tuo primo campo per il Tipo di Contenuto", + "emptyAttributes.title": "Non ci sono ancora campi", + "error.attribute.key.taken": "Questo valore esiste già", + "error.attribute.sameKeyAndName": "Non può essere uguale", + "error.attribute.taken": "Questo campo nome esiste già", + "error.contentTypeName.taken": "Questo nome esiste già", + "error.model.fetch": "Si è verificato un errore durante il caricamento dei modelli di configurazione.", + "error.record.create": "Si è verificato un errore durante la creazione del record.", + "error.record.delete": "Si è verificato un errore durante la cancellazione del record.", + "error.record.fetch": "Si è verificato un errore durante la registrazione.", + "error.record.update": "Si è verificato un errore durante l'aggiornamento del record.", + "error.records.count": "Si è verificato un errore durante il conteggio dei record.", + "error.records.fetch": "Si è verificato un errore durante il caricamento dei record.", + "error.schema.generation": "Si è verificato un errore durante la generazione dello schema.", + "error.validation.json": "Non è un JSON", + "error.validation.max": "Il valore è troppo alto.", + "error.validation.maxLength": "Il valore è troppo lungo.", + "error.validation.min": "Il valore è troppo basso.", + "error.validation.minLength": "Il valore è troppo breve.", + "error.validation.minSupMax": "Non può essere superiore", + "error.validation.regex": "Il valore non corrisponde alla regex.", + "error.validation.required": "Questo valore è richiesto.", + "form.Input.bulkActions": "Abilita caricamento", + "form.Input.defaultSort": "Attributo di ordinamento di default", + "form.Input.description": "Description", + "form.Input.description.placeholder": "Display name in the profile", + "form.Input.disabled": "Editable field", + "form.Input.filters": "Abilita filtri", + "form.Input.label": "Etichetta", + "form.Input.label.inputDescription": "Questo valore sovrascrive l'etichetta mostrata nell'intestazione della tabella", + "form.Input.pageEntries": "Righe per pagina", + "form.Input.pageEntries.inputDescription": "Attenzione: Puoi sovrascrivere questo valore nella pagina delle impostazioni del Tipo di Contenuto", + "form.Input.search": "Abilita ricerca", + "form.Input.search.field": "Abilita la ricerca su questo campo", + "form.Input.sort.field": "Abilita ordinamento su questo campo", "notification.error.relationship.fetch": "Si è verificato un errore durante il rapporto di recupero.", - "notification.info.SettingPage.disableSort" : "E' necessario un attributo con l'ordinamento abilitato", - - "success.record.delete": "Eliminato", - "success.record.save": "Salvato", - + "notification.info.SettingPage.disableSort": "E' necessario un attributo con l'ordinamento abilitato", "pageNotFound": "Pagina non trovata", - - "popUpWarning.button.cancel": "Annulla", - "popUpWarning.button.confirm": "Conferma", - "popUpWarning.title": "Si prega di confermare", - "popUpWarning.bodyMessage.contentType.delete": "Sei sicuro di voler cancellare questa voce?", - "popUpWarning.bodyMessage.contentType.delete.all": "Sei sicuro di voler eliminare queste voci?", - "popUpWarning.warning.cancelAllSettings" : "Sei sicuro di voler cancellare le tue modifiche?", - "popUpWarning.warning.updateAllSettings" : "Questa operazione modificherà tutte le tue impostazioni" - -} + "plugin.description.long": "Veloce modo di vedere, modificare e cancellare i dati presenti nel database.", + "plugin.description.short": "Veloce modo di vedere, modificare e cancellare i dati presenti nel database.", + "popUpWarning.bodyMessage.contentType.delete": "Sei sicuro di voler cancellare questa voce?", + "popUpWarning.bodyMessage.contentType.delete.all": "Sei sicuro di voler eliminare queste voci?", + "popUpWarning.button.cancel": "Annulla", + "popUpWarning.button.confirm": "Conferma", + "popUpWarning.title": "Si prega di confermare", + "popUpWarning.warning.cancelAllSettings": "Sei sicuro di voler cancellare le tue modifiche?", + "popUpWarning.warning.updateAllSettings": "Questa operazione modificherà tutte le tue impostazioni", + "success.record.delete": "Eliminato", + "success.record.save": "Salvato" +} \ No newline at end of file diff --git a/packages/strapi-plugin-content-manager/admin/src/translations/ko.json b/packages/strapi-plugin-content-manager/admin/src/translations/ko.json index e545c3cff5..a592db650b 100644 --- a/packages/strapi-plugin-content-manager/admin/src/translations/ko.json +++ b/packages/strapi-plugin-content-manager/admin/src/translations/ko.json @@ -1,116 +1,98 @@ { - "plugin.description.short": "데이터를 쉽게 확인 하고 수정, 삭제 할 수 있습니다.", - "plugin.description.long": "데이터를 쉽게 확인 하고 수정, 삭제 할 수 있습니다.", - "containers.Home.pluginHeaderTitle": "콘텐츠 관리", - "containers.Home.introduction": "항목을 수정하려면 왼편 링크를 클릭하세요. 이 플러그인은 설정을 편집할 수 있는 방법을 개발 중입니다.", - "containers.Home.pluginHeaderDescription": "쉽고 강력한 UI를 통해 항목들을 관리 하세요.", - "containers.Edit.submit": "저장", - "containers.Edit.editing": "수정 중...", - "containers.Edit.delete": "삭제", - "containers.Edit.reset": "재설정", - "containers.Edit.returnList": "목록", - "containers.List.addAnEntry": "{entity} 항목 추가", - "containers.List.pluginHeaderDescription": "{label}개 항목", - "containers.List.pluginHeaderDescription.singular": "{label}개 항목", - "components.LimitSelect.itemsPerPage": "항목 수 / 페이지", - "containers.List.errorFetchRecords": "에러", - - "containers.SettingPage.addField": "새 필드 추가", - "containers.SettingPage.attributes": "속성", - "containers.SettingPage.attributes.description": "속성의 순서를 지정합니다", - - "containers.SettingPage.listSettings.title": "목록 — 설정", - "containers.SettingPage.listSettings.description": "이 콘텐츠 유형의 옵션을 구성합니다.", - "containers.SettingPage.pluginHeaderDescription": "이 콘텐츠 유형에 특정한 설정을 구성합니다.", - "containers.SettingsPage.pluginHeaderDescription": "모든 콘텐츠 유형에 대한 기본 설정을 구성합니다.", - "containers.SettingsPage.Block.generalSettings.description": "콘텐츠 유형에 대한 기본 옵션을 구성합니다.", - "containers.SettingsPage.Block.generalSettings.title": "일반", - "containers.SettingsPage.Block.contentType.title": "콘텐츠 유형", - "containers.SettingsPage.Block.contentType.description": "특정 설정을 구성합니다.", - + "EditRelations.title": "관계 데이터", "components.AddFilterCTA.add": "필터", "components.AddFilterCTA.hide": "필터", - "components.DraggableAttr.edit": "클릭하여 수정", - + "components.FilterOptions.FILTER_TYPES.=": "같음", + "components.FilterOptions.FILTER_TYPES._contains": "포함", + "components.FilterOptions.FILTER_TYPES._containss": "포함(대소문자 구분)", + "components.FilterOptions.FILTER_TYPES._gt": "큼", + "components.FilterOptions.FILTER_TYPES._gte": "크거나 같음", + "components.FilterOptions.FILTER_TYPES._lt": "작음", + "components.FilterOptions.FILTER_TYPES._lte": "작거나 같음", + "components.FilterOptions.FILTER_TYPES._ne": "같지 않음", + "components.FilterOptions.button.apply": "적용", "components.FiltersPickWrapper.PluginHeader.actions.apply": "적용", "components.FiltersPickWrapper.PluginHeader.actions.clearAll": "모두 재설정", "components.FiltersPickWrapper.PluginHeader.description": "필터링 조건을 설정하세요.", "components.FiltersPickWrapper.PluginHeader.title.filter": "필터", "components.FiltersPickWrapper.hide": "숨김", - - "components.FilterOptions.button.apply": "적용", - "components.FilterOptions.FILTER_TYPES.=": "같음", - "components.FilterOptions.FILTER_TYPES._ne": "같지 않음", - "components.FilterOptions.FILTER_TYPES._lt": "작음", - "components.FilterOptions.FILTER_TYPES._lte": "작거나 같음", - "components.FilterOptions.FILTER_TYPES._gt": "큼", - "components.FilterOptions.FILTER_TYPES._gte": "크거나 같음", - "components.FilterOptions.FILTER_TYPES._contains": "포함", - "components.FilterOptions.FILTER_TYPES._containss": "포함(대소문자 구분)", - + "components.LimitSelect.itemsPerPage": "항목 수 / 페이지", "components.Search.placeholder": "검색 중입니다...", - + "components.TableDelete.delete": "모두 삭제", "components.TableDelete.entries.plural": "{number}개 항목 선택 됨", "components.TableDelete.entries.singular": "{number}개 항목 선택 됨", - "components.TableDelete.delete": "모두 삭제", - - "components.TableEmpty.withFilters": "필터 조건에 맞는 {contentType} 목록이 없습니다.", - "components.TableEmpty.withoutFilter": "{contentType} 목록이 없습니다.", "components.TableEmpty.withSearch": "\"{search}\" 검색. {contentType} 목록이 없습니다.", - - "EditRelations.title": "관계 데이터", - - "emptyAttributes.title": "아직 필드가 없습니다.", - "emptyAttributes.description": "첫번째 필드를 추가하세요.", + "components.TableEmpty.withoutFilter": "{contentType} 목록이 없습니다.", + "containers.Edit.delete": "삭제", + "containers.Edit.editing": "수정 중...", + "containers.Edit.reset": "재설정", + "containers.Edit.returnList": "목록", + "containers.Edit.submit": "저장", + "containers.Home.introduction": "항목을 수정하려면 왼편 링크를 클릭하세요. 이 플러그인은 설정을 편집할 수 있는 방법을 개발 중입니다.", + "containers.Home.pluginHeaderDescription": "쉽고 강력한 UI를 통해 항목들을 관리 하세요.", + "containers.Home.pluginHeaderTitle": "콘텐츠 관리", + "containers.List.addAnEntry": "{entity} 항목 추가", + "containers.List.errorFetchRecords": "에러", + "containers.List.pluginHeaderDescription": "{label}개 항목", + "containers.List.pluginHeaderDescription.singular": "{label}개 항목", + "containers.SettingPage.addField": "새 필드 추가", + "containers.SettingPage.attributes": "속성", + "containers.SettingPage.attributes.description": "속성의 순서를 지정합니다", + "containers.SettingPage.listSettings.description": "이 콘텐츠 유형의 옵션을 구성합니다.", + "containers.SettingPage.listSettings.title": "목록 — 설정", + "containers.SettingPage.pluginHeaderDescription": "이 콘텐츠 유형에 특정한 설정을 구성합니다.", + "containers.SettingsPage.Block.contentType.description": "특정 설정을 구성합니다.", + "containers.SettingsPage.Block.contentType.title": "콘텐츠 유형", + "containers.SettingsPage.Block.generalSettings.description": "콘텐츠 유형에 대한 기본 옵션을 구성합니다.", + "containers.SettingsPage.Block.generalSettings.title": "일반", + "containers.SettingsPage.pluginHeaderDescription": "모든 콘텐츠 유형에 대한 기본 설정을 구성합니다.", "emptyAttributes.button": "콘텐츠 유형 빌더", - - "error.schema.generation": "스키마를 생성하는 도중 에러가 발생했습니다.", - "error.records.count": "데이터 수를 가져오는 도중 에러가 발생했습니다.", - "error.records.fetch": "데이터를 가져오는 도중 에러가 발생했습니다.", - "error.record.fetch": "데이터를 가져오는 도중 에러가 발생했습니다.", - "error.record.create": "데이터를 생성하는 도중 에러가 발생했습니다.", - "error.record.update": "데이터를 업데이트하는 도중 에러가 발생했습니다.", - "error.record.delete": "데이터를 삭제하는 도중 에러가 발생했습니다.", - "error.model.fetch": "모델 설정을 가져오는 도중 에러가 발생했습니다.", - "error.validation.required": "내용을 입력해 주세요.", - "error.validation.regex": "입력한 내용이 맞지 않습니다.", - "error.validation.max": "입력한 내용이 너무 큽니다.", - "error.validation.min": "입력한 내용이 너무 작습니다.", - "error.validation.maxLength": "입력한 내용이 너무 깁니다.", - "error.validation.minLength": "입력한 내용이 너무 짧습니다.", - "error.contentTypeName.taken": "이미 사용중인 이름입니다.", - "error.attribute.taken": "이미 사용중인 이름입니다.", + "emptyAttributes.description": "첫번째 필드를 추가하세요.", + "emptyAttributes.title": "아직 필드가 없습니다.", "error.attribute.key.taken": "이미 사용중인 키입니다.", "error.attribute.sameKeyAndName": "같은 값을 사용할 수 없습니다.", - "error.validation.minSupMax": "이 보다 더 클 수 없습니다.", + "error.attribute.taken": "이미 사용중인 이름입니다.", + "error.contentTypeName.taken": "이미 사용중인 이름입니다.", + "error.model.fetch": "모델 설정을 가져오는 도중 에러가 발생했습니다.", + "error.record.create": "데이터를 생성하는 도중 에러가 발생했습니다.", + "error.record.delete": "데이터를 삭제하는 도중 에러가 발생했습니다.", + "error.record.fetch": "데이터를 가져오는 도중 에러가 발생했습니다.", + "error.record.update": "데이터를 업데이트하는 도중 에러가 발생했습니다.", + "error.records.count": "데이터 수를 가져오는 도중 에러가 발생했습니다.", + "error.records.fetch": "데이터를 가져오는 도중 에러가 발생했습니다.", + "error.schema.generation": "스키마를 생성하는 도중 에러가 발생했습니다.", "error.validation.json": "JSON 형식이 아닙니다.", - - "form.Input.label.inputDescription": "이 값은 테이블 머리에 표시된 라벨을 덮어씌웁니다.", - "form.Input.label": "라벨", - "form.Input.search": "검색 활성화", - "form.Input.search.field": "이 필드에 검색 활성화", - "form.Input.filters": "필더 활성화", - "form.Input.sort.field": "이 필드에 정렬 활성화", + "error.validation.max": "입력한 내용이 너무 큽니다.", + "error.validation.maxLength": "입력한 내용이 너무 깁니다.", + "error.validation.min": "입력한 내용이 너무 작습니다.", + "error.validation.minLength": "입력한 내용이 너무 짧습니다.", + "error.validation.minSupMax": "이 보다 더 클 수 없습니다.", + "error.validation.regex": "입력한 내용이 맞지 않습니다.", + "error.validation.required": "내용을 입력해 주세요.", "form.Input.bulkActions": "대규모 액션 활성화", + "form.Input.defaultSort": "기본 정렬 속성", + "form.Input.filters": "필더 활성화", + "form.Input.label": "라벨", + "form.Input.label.inputDescription": "이 값은 테이블 머리에 표시된 라벨을 덮어씌웁니다.", "form.Input.pageEntries": "페이지 당 요소", "form.Input.pageEntries.inputDescription": "참고 : 콘텐츠 유형 설정에서 이 값을 덮어씌울 수 있습니다.", - "form.Input.defaultSort": "기본 정렬 속성", - + "form.Input.search": "검색 활성화", + "form.Input.search.field": "이 필드에 검색 활성화", + "form.Input.sort.field": "이 필드에 정렬 활성화", "notification.error.relationship.fetch": "데이터 관계를 가져오는 도중 에러가 발생했습니다.", "notification.info.SettingPage.disableSort": "정렬이 활성화된 한 개의 속성이 필요합니다.", - - "success.record.delete": "삭제", - "success.record.save": "저장", - "pageNotFound": "페이지를 찾을 수 없습니다.", - + "plugin.description.long": "데이터를 쉽게 확인 하고 수정, 삭제 할 수 있습니다.", + "plugin.description.short": "데이터를 쉽게 확인 하고 수정, 삭제 할 수 있습니다.", + "popUpWarning.bodyMessage.contentType.delete": "삭제하시겠습니까?", + "popUpWarning.bodyMessage.contentType.delete.all": "모두 삭제하시겠습니까?", "popUpWarning.button.cancel": "취소", "popUpWarning.button.confirm": "확인", "popUpWarning.title": "확인", - "popUpWarning.bodyMessage.contentType.delete": "삭제하시겠습니까?", - "popUpWarning.bodyMessage.contentType.delete.all": "모두 삭제하시겠습니까?", "popUpWarning.warning.cancelAllSettings": "수정 사항을 취소하시겠습니까?", - "popUpWarning.warning.updateAllSettings": "모든 설정에 적용됩니다." -} + "popUpWarning.warning.updateAllSettings": "모든 설정에 적용됩니다.", + "success.record.delete": "삭제", + "success.record.save": "저장" +} \ No newline at end of file diff --git a/packages/strapi-plugin-content-manager/admin/src/translations/nl.json b/packages/strapi-plugin-content-manager/admin/src/translations/nl.json index 8608fcbaed..0baf49e66f 100644 --- a/packages/strapi-plugin-content-manager/admin/src/translations/nl.json +++ b/packages/strapi-plugin-content-manager/admin/src/translations/nl.json @@ -1,116 +1,98 @@ { - "plugin.description.short": "Snelle manier om data te zien, aan te passen en verwijderen in je database.", - "plugin.description.long": "Snelle manier om data te zien, aan te passen en verwijderen in je database", - "containers.Home.pluginHeaderTitle": "Inhoud Manager", - "containers.Home.introduction": "Om items aan te passen klik je op de link in het menu links boven. Deze plugin heeft nog geen goede manier om instellingen aan te passen en is nog in ontwikkeling.", - "containers.Home.pluginHeaderDescription": "Onderhoud je data via een krachtig en mooie interface.", - "containers.Edit.submit": "Opslaan", - "containers.Edit.editing": "Aanpassen...", - "containers.Edit.delete": "Verwijderen", - "containers.Edit.reset": "Resetten", - "containers.Edit.returnList": "Terug naar lijst", - "containers.List.addAnEntry": "Nieuwe {entity}", - "containers.List.pluginHeaderDescription": "{label} item gevonden", - "containers.List.pluginHeaderDescription.singular": "{label} items gevonden", - "components.LimitSelect.itemsPerPage": "Items per pagina", - "containers.List.errorFetchRecords": "Fout", - - "containers.SettingPage.addField": "Nieuw veld toevoegen", - "containers.SettingPage.attributes": "Attribuut velden", - "containers.SettingPage.attributes.description": "Geef de volgorde van de attributen aan", - - "containers.SettingPage.listSettings.title": "Lijst — Instellingen", - "containers.SettingPage.listSettings.description": "Stel de opties voor dit Content Type in", - "containers.SettingPage.pluginHeaderDescription": "Stel de specifieke instellingen voor dit Content Type in", - "containers.SettingsPage.pluginHeaderDescription": "Stel de standaard instellingen voor alle Content Types in", - "containers.SettingsPage.Block.generalSettings.description": "Stel de standaard instellingen voor jouw Content Types in", - "containers.SettingsPage.Block.generalSettings.title": "Algemeen", - "containers.SettingsPage.Block.contentType.title": "Content Types", - "containers.SettingsPage.Block.contentType.description": "Configureer de specifieke instellingen", - + "EditRelations.title": "Gerelateerde data", "components.AddFilterCTA.add": "Filters", "components.AddFilterCTA.hide": "Filters", - "components.DraggableAttr.edit": "Klik om aan te passen", - + "components.FilterOptions.FILTER_TYPES.=": "is", + "components.FilterOptions.FILTER_TYPES._contains": "bevat", + "components.FilterOptions.FILTER_TYPES._containss": "bevat (hoofdletter gevoelig)", + "components.FilterOptions.FILTER_TYPES._gt": "is groter dan", + "components.FilterOptions.FILTER_TYPES._gte": "is groter dan of gelijk aan", + "components.FilterOptions.FILTER_TYPES._lt": "is lager dan", + "components.FilterOptions.FILTER_TYPES._lte": "is lager dan of gelijk aan", + "components.FilterOptions.FILTER_TYPES._ne": "is niet", + "components.FilterOptions.button.apply": "Toepassen", "components.FiltersPickWrapper.PluginHeader.actions.apply": "Toepassen", "components.FiltersPickWrapper.PluginHeader.actions.clearAll": "Alles legen", "components.FiltersPickWrapper.PluginHeader.description": "Maak de conditionele logica om de items te kunnen filteren", "components.FiltersPickWrapper.PluginHeader.title.filter": "Filters", "components.FiltersPickWrapper.hide": "Verbergen", - - "components.FilterOptions.button.apply": "Toepassen", - "components.FilterOptions.FILTER_TYPES.=": "is", - "components.FilterOptions.FILTER_TYPES._ne": "is niet", - "components.FilterOptions.FILTER_TYPES._lt": "is lager dan", - "components.FilterOptions.FILTER_TYPES._lte": "is lager dan of gelijk aan", - "components.FilterOptions.FILTER_TYPES._gt": "is groter dan", - "components.FilterOptions.FILTER_TYPES._gte": "is groter dan of gelijk aan", - "components.FilterOptions.FILTER_TYPES._contains": "bevat", - "components.FilterOptions.FILTER_TYPES._containss": "bevat (hoofdletter gevoelig)", - + "components.LimitSelect.itemsPerPage": "Items per pagina", "components.Search.placeholder": "Zoek naar een item...", - + "components.TableDelete.delete": "Alles verwijderen", "components.TableDelete.entries.plural": "{number} items geselecteerd", "components.TableDelete.entries.singular": "{number} item geselecteerd", - "components.TableDelete.delete": "Alles verwijderen", - - "components.TableEmpty.withFilters": "Er is geen {contentType} met de gekozen filters...", - "components.TableEmpty.withoutFilter": "Er is geen {contentType}...", "components.TableEmpty.withSearch": "Er is geen {contentType} passend bij de zoekopdracht ({search})...", - - "EditRelations.title": "Gerelateerde data", - - "emptyAttributes.title": "Er zijn nog geen velden", - "emptyAttributes.description": "Voeg je eerste veld toe aan je Content Type", + "components.TableEmpty.withoutFilter": "Er is geen {contentType}...", + "containers.Edit.delete": "Verwijderen", + "containers.Edit.editing": "Aanpassen...", + "containers.Edit.reset": "Resetten", + "containers.Edit.returnList": "Terug naar lijst", + "containers.Edit.submit": "Opslaan", + "containers.Home.introduction": "Om items aan te passen klik je op de link in het menu links boven. Deze plugin heeft nog geen goede manier om instellingen aan te passen en is nog in ontwikkeling.", + "containers.Home.pluginHeaderDescription": "Onderhoud je data via een krachtig en mooie interface.", + "containers.Home.pluginHeaderTitle": "Inhoud Manager", + "containers.List.addAnEntry": "Nieuwe {entity}", + "containers.List.errorFetchRecords": "Fout", + "containers.List.pluginHeaderDescription": "{label} item gevonden", + "containers.List.pluginHeaderDescription.singular": "{label} items gevonden", + "containers.SettingPage.addField": "Nieuw veld toevoegen", + "containers.SettingPage.attributes": "Attribuut velden", + "containers.SettingPage.attributes.description": "Geef de volgorde van de attributen aan", + "containers.SettingPage.listSettings.description": "Stel de opties voor dit Content Type in", + "containers.SettingPage.listSettings.title": "Lijst — Instellingen", + "containers.SettingPage.pluginHeaderDescription": "Stel de specifieke instellingen voor dit Content Type in", + "containers.SettingsPage.Block.contentType.description": "Configureer de specifieke instellingen", + "containers.SettingsPage.Block.contentType.title": "Content Types", + "containers.SettingsPage.Block.generalSettings.description": "Stel de standaard instellingen voor jouw Content Types in", + "containers.SettingsPage.Block.generalSettings.title": "Algemeen", + "containers.SettingsPage.pluginHeaderDescription": "Stel de standaard instellingen voor alle Content Types in", "emptyAttributes.button": "Naar de content type bouwer", - - "error.schema.generation": "Er is een fout opgetreden tijdens het maken van het schema", - "error.records.count": "Er is een fout opgetreden tijdens het tellen van de opgehaalde gegevens", - "error.records.fetch": "Er is een fout opgetreden tijdens het ophalen van de gegevens", - "error.record.fetch": "Er is een fout opgetreden tijdens het ophalen van het item.", - "error.record.create": "Er is een fout opgetreden tijdens het maken van het item.", - "error.record.update": "Er is een fout opgetreden tijdens het opslaan van het item.", - "error.record.delete": "Er is een fout opgetreden tijdens het verwijderen van het item.", - "error.model.fetch": "Er is een fout opgetreden tijdens het ophalen van de models.", - "error.validation.required": "Deze gegevens zijn verplicht.", - "error.validation.regex": "De waarde is niet gelijk aan de regex.", - "error.validation.max": "De waarde is te hoog.", - "error.validation.min": "De waarde is te laag.", - "error.validation.maxLength": "De waarde is te lang.", - "error.validation.minLength": "De waarde is te kort.", - "error.contentTypeName.taken": "Deze naam bestaat al.", - "error.attribute.taken": "Dit veld naam bestaat al.", + "emptyAttributes.description": "Voeg je eerste veld toe aan je Content Type", + "emptyAttributes.title": "Er zijn nog geen velden", "error.attribute.key.taken": "Deze waarde bestaat al.", "error.attribute.sameKeyAndName": "Mag niet gelijk zijn.", - "error.validation.minSupMax": "Mag niet superieur zijn.", + "error.attribute.taken": "Dit veld naam bestaat al.", + "error.contentTypeName.taken": "Deze naam bestaat al.", + "error.model.fetch": "Er is een fout opgetreden tijdens het ophalen van de models.", + "error.record.create": "Er is een fout opgetreden tijdens het maken van het item.", + "error.record.delete": "Er is een fout opgetreden tijdens het verwijderen van het item.", + "error.record.fetch": "Er is een fout opgetreden tijdens het ophalen van het item.", + "error.record.update": "Er is een fout opgetreden tijdens het opslaan van het item.", + "error.records.count": "Er is een fout opgetreden tijdens het tellen van de opgehaalde gegevens", + "error.records.fetch": "Er is een fout opgetreden tijdens het ophalen van de gegevens", + "error.schema.generation": "Er is een fout opgetreden tijdens het maken van het schema", "error.validation.json": "Dit is geen JSON", - - "form.Input.label.inputDescription": "Deze waarde overschrijft het label welke weergegeven wordt in het tabel hoofd", - "form.Input.label": "Label", - "form.Input.search": "Zoeken inschakelen", - "form.Input.search.field": "Schakel zoeken in voor dit veld", - "form.Input.filters": "Filters inschakelen", - "form.Input.sort.field": "Sorteren inschakelen voor dit veld", + "error.validation.max": "De waarde is te hoog.", + "error.validation.maxLength": "De waarde is te lang.", + "error.validation.min": "De waarde is te laag.", + "error.validation.minLength": "De waarde is te kort.", + "error.validation.minSupMax": "Mag niet superieur zijn.", + "error.validation.regex": "De waarde is niet gelijk aan de regex.", + "error.validation.required": "Deze gegevens zijn verplicht.", "form.Input.bulkActions": "Bulk acties inschakelen", + "form.Input.defaultSort": "Standaard sorteer attribuut", + "form.Input.filters": "Filters inschakelen", + "form.Input.label": "Label", + "form.Input.label.inputDescription": "Deze waarde overschrijft het label welke weergegeven wordt in het tabel hoofd", "form.Input.pageEntries": "Items per pagina", "form.Input.pageEntries.inputDescription": "Hint: Je kunt deze waarde overschrijven in de Content Type instellingen pagina", - "form.Input.defaultSort": "Standaard sorteer attribuut", - + "form.Input.search": "Zoeken inschakelen", + "form.Input.search.field": "Schakel zoeken in voor dit veld", + "form.Input.sort.field": "Sorteren inschakelen voor dit veld", "notification.error.relationship.fetch": "Er is een fout opgetreden tijdens het ophalen van de relaties.", "notification.info.SettingPage.disableSort": "Je moet één attribuut hebben met sorteren ingeschakeld", - - "success.record.delete": "Verwijderd", - "success.record.save": "Opgeslagen", - "pageNotFound": "Pagina niet gevonden", - + "plugin.description.long": "Snelle manier om data te zien, aan te passen en verwijderen in je database", + "plugin.description.short": "Snelle manier om data te zien, aan te passen en verwijderen in je database.", + "popUpWarning.bodyMessage.contentType.delete": "Weet je zeker dat je dit item wilt verwijderen?", + "popUpWarning.bodyMessage.contentType.delete.all": "Weet je zeker dat je deze items wilt verwijderen?", "popUpWarning.button.cancel": "Annuleren", "popUpWarning.button.confirm": "Akkoord", "popUpWarning.title": "Ga a.u.b. akkoord", - "popUpWarning.bodyMessage.contentType.delete": "Weet je zeker dat je dit item wilt verwijderen?", - "popUpWarning.bodyMessage.contentType.delete.all": "Weet je zeker dat je deze items wilt verwijderen?", "popUpWarning.warning.cancelAllSettings": "Weet je zeker dat je je wijzigingen wilt annuleren?", - "popUpWarning.warning.updateAllSettings": "Dit zal al je instellingen aanpassen" -} + "popUpWarning.warning.updateAllSettings": "Dit zal al je instellingen aanpassen", + "success.record.delete": "Verwijderd", + "success.record.save": "Opgeslagen" +} \ No newline at end of file diff --git a/packages/strapi-plugin-content-manager/admin/src/translations/pl.json b/packages/strapi-plugin-content-manager/admin/src/translations/pl.json index 48cd023bbf..d34f843f36 100644 --- a/packages/strapi-plugin-content-manager/admin/src/translations/pl.json +++ b/packages/strapi-plugin-content-manager/admin/src/translations/pl.json @@ -1,93 +1,77 @@ { - "plugin.description.short": "Szybki sposób na przeglądanie, zmianę i usuwanie elementów z twojej bazy danych.", - "plugin.description.long": "Szybki sposób na przeglądanie, zmianę i usuwanie elementów z twojej bazy danych.", - "containers.Home.pluginHeaderTitle": "Treści", - "containers.Home.introduction": "Aby edytować wpisy przejdź do odpowiedniego linku w menu po lewej. Ta wtyczka nie ma odpowiedniego sposobu na edytowanie ustawień i nadal jest w trakcie rozwijania.", - "containers.Home.pluginHeaderDescription": "Zarządzaj swoimi danymi za pomocą potężnego i pięknego interfejsu.", - "containers.Edit.submit": "Zapisz", - "containers.Edit.editing": "Edytowanie...", - "containers.Edit.delete": "Usuń", - "containers.Edit.reset": "Wyczyść", - "containers.Edit.returnList": "Wróć do listy", - "containers.List.addAnEntry": "{entity}", - "containers.List.pluginHeaderDescription": "{label} elementów znalezionych", - "containers.List.pluginHeaderDescription.singular": "{label} element znaleziony", - "components.LimitSelect.itemsPerPage": "Elementów na stronę", - "containers.List.errorFetchRecords": "Błąd", - - "containers.SettingPage.relations": "Relational fields", - - "containers.SettingPage.editSettings.description": "Drag & drop the fields to build the layout", - "containers.SettingPage.editSettings.title": "Edit — Settings", - + "EditRelations.title": "Relacje", "components.AddFilterCTA.add": "Filtry", "components.AddFilterCTA.hide": "Filtry", + "components.FilterOptions.FILTER_TYPES.=": "jest identyczne z", + "components.FilterOptions.FILTER_TYPES._contains": "zawiera", + "components.FilterOptions.FILTER_TYPES._containss": "zawiera (rozróżnianie wielkości liter)", + "components.FilterOptions.FILTER_TYPES._gt": "jest większe od", + "components.FilterOptions.FILTER_TYPES._gte": "jest większe od lub równe", + "components.FilterOptions.FILTER_TYPES._lt": "jest mniejsze od", + "components.FilterOptions.FILTER_TYPES._lte": "jest mniejsze od lub równe", + "components.FilterOptions.FILTER_TYPES._ne": "jest różne od", "components.FilterOptions.button.apply": "Zastosuj", "components.FiltersPickWrapper.PluginHeader.actions.apply": "Zastosuj", "components.FiltersPickWrapper.PluginHeader.actions.clearAll": "Wyczyść", "components.FiltersPickWrapper.PluginHeader.description": "Ustawianie warunków filtrowania elementów.", "components.FiltersPickWrapper.PluginHeader.title.filter": "Filtry", "components.FiltersPickWrapper.hide": "Ukryj", - - "components.FilterOptions.FILTER_TYPES.=": "jest identyczne z", - "components.FilterOptions.FILTER_TYPES._ne": "jest różne od", - "components.FilterOptions.FILTER_TYPES._lt": "jest mniejsze od", - "components.FilterOptions.FILTER_TYPES._lte": "jest mniejsze od lub równe", - "components.FilterOptions.FILTER_TYPES._gt": "jest większe od", - "components.FilterOptions.FILTER_TYPES._gte": "jest większe od lub równe", - "components.FilterOptions.FILTER_TYPES._contains": "zawiera", - "components.FilterOptions.FILTER_TYPES._containss": "zawiera (rozróżnianie wielkości liter)", - + "components.LimitSelect.itemsPerPage": "Elementów na stronę", "components.Search.placeholder": "Szukaj elementu...", - + "components.TableDelete.delete": "Usuń", "components.TableDelete.entries.plural": "{number} wybrane elementy", "components.TableDelete.entries.singular": "{number} wybrany element", - "components.TableDelete.delete": "Usuń", - - "components.TableEmpty.withFilters": "Nie istnieją elementy {contentType} zgodne z zastosowanymi filtrami...", - "components.TableEmpty.withoutFilter": "Nie istnieją jeszcze elementy związane z {contentType}... Stwórz pierwszy jak najszybciej!", "components.TableEmpty.withSearch": "Nie istnieją elementy {contentType} zgodne z wyszukiwaną frazą ({search})...", - - "EditRelations.title": "Relacje", - - "emptyAttributes.title": "Nie ma jeszcze żadnych atrybutów", - "emptyAttributes.description": "Dodaj swoje pierwszy atrybut do modelu", + "components.TableEmpty.withoutFilter": "Nie istnieją jeszcze elementy związane z {contentType}... Stwórz pierwszy jak najszybciej!", + "containers.Edit.delete": "Usuń", + "containers.Edit.editing": "Edytowanie...", + "containers.Edit.reset": "Wyczyść", + "containers.Edit.returnList": "Wróć do listy", + "containers.Edit.submit": "Zapisz", + "containers.Home.introduction": "Aby edytować wpisy przejdź do odpowiedniego linku w menu po lewej. Ta wtyczka nie ma odpowiedniego sposobu na edytowanie ustawień i nadal jest w trakcie rozwijania.", + "containers.Home.pluginHeaderDescription": "Zarządzaj swoimi danymi za pomocą potężnego i pięknego interfejsu.", + "containers.Home.pluginHeaderTitle": "Treści", + "containers.List.addAnEntry": "{entity}", + "containers.List.errorFetchRecords": "Błąd", + "containers.List.pluginHeaderDescription": "{label} elementów znalezionych", + "containers.List.pluginHeaderDescription.singular": "{label} element znaleziony", + "containers.SettingPage.editSettings.description": "Drag & drop the fields to build the layout", + "containers.SettingPage.editSettings.title": "Edit — Settings", + "containers.SettingPage.relations": "Relational fields", "emptyAttributes.button": "Przejdź do konstruktora modeli", - - "error.schema.generation": "Wystąpił błąd podczas generowania schematu.", - "error.records.count": "Wystąpił błąd podczas liczenia rekordów.", - "error.records.fetch": "Wystąpił błąd podczas pobierania rekordów.", - "error.record.fetch": "Wystąpił błąd podczas pobierania rekordu.", - "error.record.create": "Wystąpił błąd podczas tworzenia rekordu.", - "error.record.update": "Wystąpił błąd podczas zmiany rekordu.", - "error.record.delete": "Wystąpił błąd podczas usuwania rekordu.", - "error.model.fetch": "Wystąpił błąd podczas pobierania konfiguracji modelów.", - "error.validation.required": "Wpisanie wartości dla tego atrybutu jest wymagane.", - "error.validation.regex": "Wartość nie jest zgodna z wymaganym wzorcem.", - "error.validation.max": "Wartość jest za wysoka.", - "error.validation.min": "Wartość jest za niska.", - "error.validation.maxLength": "Wartość jest za długa.", - "error.validation.minLength": "Wartość jest za krótka.", - "error.contentTypeName.taken": "Ta nazwa już istnieje", - "error.attribute.taken": "Atrybut o tej nazwie już istnieje", + "emptyAttributes.description": "Dodaj swoje pierwszy atrybut do modelu", + "emptyAttributes.title": "Nie ma jeszcze żadnych atrybutów", "error.attribute.key.taken": "Ta wartość już istnieje", "error.attribute.sameKeyAndName": "Nie mogą być takie same", + "error.attribute.taken": "Atrybut o tej nazwie już istnieje", + "error.contentTypeName.taken": "Ta nazwa już istnieje", + "error.model.fetch": "Wystąpił błąd podczas pobierania konfiguracji modelów.", + "error.record.create": "Wystąpił błąd podczas tworzenia rekordu.", + "error.record.delete": "Wystąpił błąd podczas usuwania rekordu.", + "error.record.fetch": "Wystąpił błąd podczas pobierania rekordu.", + "error.record.update": "Wystąpił błąd podczas zmiany rekordu.", + "error.records.count": "Wystąpił błąd podczas liczenia rekordów.", + "error.records.fetch": "Wystąpił błąd podczas pobierania rekordów.", + "error.schema.generation": "Wystąpił błąd podczas generowania schematu.", + "error.validation.max": "Wartość jest za wysoka.", + "error.validation.maxLength": "Wartość jest za długa.", + "error.validation.min": "Wartość jest za niska.", + "error.validation.minLength": "Wartość jest za krótka.", "error.validation.minSupMax": "Nie może być większa", - + "error.validation.regex": "Wartość nie jest zgodna z wymaganym wzorcem.", + "error.validation.required": "Wpisanie wartości dla tego atrybutu jest wymagane.", "form.Input.description": "Description", "form.Input.description.placeholder": "Display name in the profile", "form.Input.disabled": "Editable field", - "notification.error.relationship.fetch": "Wystąpił błąd podczas pobierania relacji.", - - "success.record.delete": "Usunięto", - "success.record.save": "Zapisano", - "pageNotFound": "Strona nie znaleziona", - + "plugin.description.long": "Szybki sposób na przeglądanie, zmianę i usuwanie elementów z twojej bazy danych.", + "plugin.description.short": "Szybki sposób na przeglądanie, zmianę i usuwanie elementów z twojej bazy danych.", + "popUpWarning.bodyMessage.contentType.delete": "Czy na pewno chcesz usunąć ten wpis?", "popUpWarning.button.cancel": "Nie", "popUpWarning.button.confirm": "Tak", "popUpWarning.title": "Potwierdzenie", - "popUpWarning.bodyMessage.contentType.delete": "Czy na pewno chcesz usunąć ten wpis?" -} + "success.record.delete": "Usunięto", + "success.record.save": "Zapisano" +} \ No newline at end of file diff --git a/packages/strapi-plugin-content-manager/admin/src/translations/pt-BR.json b/packages/strapi-plugin-content-manager/admin/src/translations/pt-BR.json index 894459631e..54dbc6badf 100644 --- a/packages/strapi-plugin-content-manager/admin/src/translations/pt-BR.json +++ b/packages/strapi-plugin-content-manager/admin/src/translations/pt-BR.json @@ -1,121 +1,101 @@ { - "plugin.description.short": "Maneira rápida de ver, editar e excluir os dados em seu banco de dados.", - "plugin.description.long": "Maneira rápida de ver, editar e excluir os dados em seu banco de dados.", - "containers.Home.pluginHeaderTitle": "Gestão de conteúdos", - "containers.Home.introduction": "Para editar seus registros, acesse o link específico no menu à esquerda. Esta extensão não permite editar configurações, ainda está em desenvolvimento.", - "containers.Home.pluginHeaderDescription": "Gerencie seus registros através de uma interface poderosa e elegante.", - "containers.Edit.submit": "Salvar", - "containers.Edit.editing": "Editando...", - "containers.Edit.delete": "Remove", - "containers.Edit.reset": "Reiniciar", - "containers.Edit.returnList": "Retornar à lista", - "containers.List.addAnEntry": "Adicionar Novo {entity}", - "containers.List.pluginHeaderDescription": "{label} registros encontrados", - "containers.List.pluginHeaderDescription.singular": "{label} registro encontrado", - "components.LimitSelect.itemsPerPage": "Registros por página", - "containers.List.errorFetchRecords": "Erro", - - "containers.SettingPage.relations": "Relational fields", - - "containers.SettingPage.editSettings.description": "Drag & drop the fields to build the layout", - "containers.SettingPage.editSettings.title": "Edit — Settings", - - "containers.SettingPage.addField": "Adicionar campo", - "containers.SettingPage.attributes": "Atributos", - "containers.SettingPage.attributes.description": "Define a ordem dos atributos", - - "containers.SettingPage.listSettings.title": "Lista — Configurações", - "containers.SettingPage.listSettings.description": "Configure as opções para este Tipo de Conteúdo", - "containers.SettingPage.pluginHeaderDescription": "Defina as configurações específicas para este Tipo de Conteúdo", - "containers.SettingsPage.pluginHeaderDescription": "Configure as opções padrões para todos os seus Tipos de Conteúdo", - "containers.SettingsPage.Block.generalSettings.description": "Configure as opções padrões para seu Tipo de Conteúdo", - "containers.SettingsPage.Block.generalSettings.title": "Geral", - "containers.SettingsPage.Block.contentType.title": "Tipos de Conteúdo", - "containers.SettingsPage.Block.contentType.description": "Defina as configurações específicas", - + "EditRelations.title": "Dados relacionais", "components.AddFilterCTA.add": "Filtros", "components.AddFilterCTA.hide": "Filtros", - "components.DraggableAttr.edit": "Clique para editar", - + "components.FilterOptions.FILTER_TYPES.=": "é", + "components.FilterOptions.FILTER_TYPES._contains": "contém", + "components.FilterOptions.FILTER_TYPES._containss": "contém (case sensitive)", + "components.FilterOptions.FILTER_TYPES._gt": "é maior que", + "components.FilterOptions.FILTER_TYPES._gte": "é maior que ou igual à", + "components.FilterOptions.FILTER_TYPES._lt": "é menor que", + "components.FilterOptions.FILTER_TYPES._lte": "é menor que ou igual à", + "components.FilterOptions.FILTER_TYPES._ne": "não é", "components.FilterOptions.button.apply": "Aplicar", "components.FiltersPickWrapper.PluginHeader.actions.apply": "Aplicar", "components.FiltersPickWrapper.PluginHeader.actions.clearAll": "Limpar tudo", "components.FiltersPickWrapper.PluginHeader.description": "Definir as condições a serem aplicadas para filtrar os registros", "components.FiltersPickWrapper.PluginHeader.title.filter": "Filtros", "components.FiltersPickWrapper.hide": "Esconder", - - "components.FilterOptions.FILTER_TYPES.=": "é", - "components.FilterOptions.FILTER_TYPES._ne": "não é", - "components.FilterOptions.FILTER_TYPES._lt": "é menor que", - "components.FilterOptions.FILTER_TYPES._lte": "é menor que ou igual à", - "components.FilterOptions.FILTER_TYPES._gt": "é maior que", - "components.FilterOptions.FILTER_TYPES._gte": "é maior que ou igual à", - "components.FilterOptions.FILTER_TYPES._contains": "contém", - "components.FilterOptions.FILTER_TYPES._containss": "contém (case sensitive)", - + "components.LimitSelect.itemsPerPage": "Registros por página", "components.Search.placeholder": "Buscar registro...", - + "components.TableDelete.delete": "Remove tudo", "components.TableDelete.entries.plural": "{number} registros selecionados", "components.TableDelete.entries.singular": "{number} registro selecionado", - "components.TableDelete.delete": "Remove tudo", - - "components.TableEmpty.withFilters": "Nenhum {contentType} com os filtros aplicados...", - "components.TableEmpty.withoutFilter": "Nenhum {contentType}...", "components.TableEmpty.withSearch": "Nenhum {contentType} encontrado na pesquisa ({search})...", - - "EditRelations.title": "Dados relacionais", - - "emptyAttributes.title": "Nenhum campo", - "emptyAttributes.description": "Adicione seu primeiro campo ao seu Tipo de Conteúdo", + "components.TableEmpty.withoutFilter": "Nenhum {contentType}...", + "containers.Edit.delete": "Remove", + "containers.Edit.editing": "Editando...", + "containers.Edit.reset": "Reiniciar", + "containers.Edit.returnList": "Retornar à lista", + "containers.Edit.submit": "Salvar", + "containers.Home.introduction": "Para editar seus registros, acesse o link específico no menu à esquerda. Esta extensão não permite editar configurações, ainda está em desenvolvimento.", + "containers.Home.pluginHeaderDescription": "Gerencie seus registros através de uma interface poderosa e elegante.", + "containers.Home.pluginHeaderTitle": "Gestão de conteúdos", + "containers.List.addAnEntry": "Adicionar Novo {entity}", + "containers.List.errorFetchRecords": "Erro", + "containers.List.pluginHeaderDescription": "{label} registros encontrados", + "containers.List.pluginHeaderDescription.singular": "{label} registro encontrado", + "containers.SettingPage.addField": "Adicionar campo", + "containers.SettingPage.attributes": "Atributos", + "containers.SettingPage.attributes.description": "Define a ordem dos atributos", + "containers.SettingPage.editSettings.description": "Drag & drop the fields to build the layout", + "containers.SettingPage.editSettings.title": "Edit — Settings", + "containers.SettingPage.listSettings.description": "Configure as opções para este Tipo de Conteúdo", + "containers.SettingPage.listSettings.title": "Lista — Configurações", + "containers.SettingPage.pluginHeaderDescription": "Defina as configurações específicas para este Tipo de Conteúdo", + "containers.SettingPage.relations": "Relational fields", + "containers.SettingsPage.Block.contentType.description": "Defina as configurações específicas", + "containers.SettingsPage.Block.contentType.title": "Tipos de Conteúdo", + "containers.SettingsPage.Block.generalSettings.description": "Configure as opções padrões para seu Tipo de Conteúdo", + "containers.SettingsPage.Block.generalSettings.title": "Geral", + "containers.SettingsPage.pluginHeaderDescription": "Configure as opções padrões para todos os seus Tipos de Conteúdo", "emptyAttributes.button": "Ir para o construtor de conteúdo", - - "error.schema.generation": "Ocorreu um erro durante a geração dos esquemas.", - "error.records.count": "Ocorreu um erro durante a contagem de registros da buscar.", - "error.records.fetch": "Ocorreu um erro durante os registros de busca.", - "error.record.fetch": "Ocorreu um erro durante o registro de busca.", - "error.record.create": "Ocorreu um erro durante a criação de registro.", - "error.record.update": "Ocorreu um erro durante a atualização do registro.", - "error.record.delete": "Ocorreu um erro durante a remoção do registro.", - "error.model.fetch": "Ocorreu um erro durante a configuração dos modelos de busca.", - "error.validation.required": "O valor deste registro é obrigatório.", - "error.validation.regex": "Este valor não corresponde ao regex.", - "error.validation.max": "O valor é muito alto.", - "error.validation.min": "O valor é muito baixo.", - "error.validation.maxLength": "O valor é muito logo.", - "error.validation.minLength": "O valor é muito curto.", - "error.contentTypeName.taken": "Este nome já existe", - "error.attribute.taken": "O nome deste campo já existe", + "emptyAttributes.description": "Adicione seu primeiro campo ao seu Tipo de Conteúdo", + "emptyAttributes.title": "Nenhum campo", "error.attribute.key.taken": "Este valor já existe", "error.attribute.sameKeyAndName": "Não pode ser igual", - "error.validation.minSupMax": "Não pode ser superior", + "error.attribute.taken": "O nome deste campo já existe", + "error.contentTypeName.taken": "Este nome já existe", + "error.model.fetch": "Ocorreu um erro durante a configuração dos modelos de busca.", + "error.record.create": "Ocorreu um erro durante a criação de registro.", + "error.record.delete": "Ocorreu um erro durante a remoção do registro.", + "error.record.fetch": "Ocorreu um erro durante o registro de busca.", + "error.record.update": "Ocorreu um erro durante a atualização do registro.", + "error.records.count": "Ocorreu um erro durante a contagem de registros da buscar.", + "error.records.fetch": "Ocorreu um erro durante os registros de busca.", + "error.schema.generation": "Ocorreu um erro durante a geração dos esquemas.", "error.validation.json": "Isto não corresponde com o formato JSON", - - "form.Input.label.inputDescription": "Este valor substitui o rótulo apresentado no cabeçalho da tabela", - "form.Input.label": "Rótulo", - "form.Input.search": "Habilitar busca", - "form.Input.search.field": "Habilitar busca neste campo", - "form.Input.filters": "Habilitar filtros", - "form.Input.sort.field": "Habilitar ordenação neste campo", + "error.validation.max": "O valor é muito alto.", + "error.validation.maxLength": "O valor é muito logo.", + "error.validation.min": "O valor é muito baixo.", + "error.validation.minLength": "O valor é muito curto.", + "error.validation.minSupMax": "Não pode ser superior", + "error.validation.regex": "Este valor não corresponde ao regex.", + "error.validation.required": "O valor deste registro é obrigatório.", "form.Input.bulkActions": "Habilitar ações em lote", + "form.Input.defaultSort": "Atributo de ordenação padrão", + "form.Input.filters": "Habilitar filtros", + "form.Input.label": "Rótulo", + "form.Input.label.inputDescription": "Este valor substitui o rótulo apresentado no cabeçalho da tabela", "form.Input.pageEntries": "Entradas por página", "form.Input.pageEntries.inputDescription": "Nota: Você pode substituir este valor na página de configurações do Tipo de Conteúdo.", - "form.Input.defaultSort": "Atributo de ordenação padrão", - + "form.Input.search": "Habilitar busca", + "form.Input.search.field": "Habilitar busca neste campo", + "form.Input.sort.field": "Habilitar ordenação neste campo", "notification.error.relationship.fetch": "Ocorreu um erro durante a busca da relação.", "notification.info.SettingPage.disableSort": "Você precisa de um atributo com permissão de ordenação", - - "success.record.delete": "Removido", - "success.record.save": "Salvo", - "pageNotFound": "Página não encontrada", - + "plugin.description.long": "Maneira rápida de ver, editar e excluir os dados em seu banco de dados.", + "plugin.description.short": "Maneira rápida de ver, editar e excluir os dados em seu banco de dados.", + "popUpWarning.bodyMessage.contentType.delete": "Tem a certeza de que deseja remover este registro?", + "popUpWarning.bodyMessage.contentType.delete.all": "Tem a certeza de que deseja remover estes registros?", "popUpWarning.button.cancel": "Cancelar", "popUpWarning.button.confirm": "Confirmar", "popUpWarning.title": "Por favor, confirme", - "popUpWarning.bodyMessage.contentType.delete": "Tem a certeza de que deseja remover este registro?", - "popUpWarning.bodyMessage.contentType.delete.all": "Tem a certeza de que deseja remover estes registros?", "popUpWarning.warning.cancelAllSettings": "Você tem certeza de que deseja cancelar suas modificações?", - "popUpWarning.warning.updateAllSettings": "Isto irá modificar todas as suas configurações" + "popUpWarning.warning.updateAllSettings": "Isto irá modificar todas as suas configurações", + "success.record.delete": "Removido", + "success.record.save": "Salvo" } \ No newline at end of file diff --git a/packages/strapi-plugin-content-manager/admin/src/translations/pt.json b/packages/strapi-plugin-content-manager/admin/src/translations/pt.json index fcc43b0b2d..42c5bf1baa 100644 --- a/packages/strapi-plugin-content-manager/admin/src/translations/pt.json +++ b/packages/strapi-plugin-content-manager/admin/src/translations/pt.json @@ -1,96 +1,79 @@ { - "plugin.description.short": "Maneira rápida de ver, editar e excluir os dados em sua base de dados.", - "plugin.description.long": "Maneira rápida de ver, editar e excluir os dados em sua base de dados.", - "containers.Home.pluginHeaderTitle": "Gestor de conteúdos", - "containers.Home.introduction": "Para editar suas entradas, acesse o link específico no menu à esquerda. Esta extensão não tem uma maneira correcta de editar configurações e ainda está em desenvolvimento activo.", - "containers.Home.pluginHeaderDescription": "Gerencie suas entradas através de uma interface poderosa e bonita.", - "containers.Edit.submit": "Guardar", - "containers.Edit.editing": "Editando...", - "containers.Edit.delete": "Apagar", - "containers.Edit.reset": "Restabelecer", - "containers.Edit.returnList": "Retornar à lista", - "containers.List.addAnEntry": "Adicionar Novo {entity}", - "containers.List.pluginHeaderDescription": "{label} entradas encontradas", - "containers.List.pluginHeaderDescription.singular": "{label} entrada encontrada", - "components.LimitSelect.itemsPerPage": "Itens por página", - "containers.List.errorFetchRecords": "Erro", - - "containers.SettingPage.relations": "Relational fields", - - "containers.SettingPage.editSettings.description": "Drag & drop the fields to build the layout", - "containers.SettingPage.editSettings.title": "Edit — Settings", - - "components.AddFilterCTA.add": "Filtros", - "components.AddFilterCTA.hide": "Filtros", - "components.FilterOptions.button.apply": "Aplicar", - "components.FiltersPickWrapper.PluginHeader.actions.apply": "Aplicar", - "components.FiltersPickWrapper.PluginHeader.actions.clearAll": "Limpar tudo", - "components.FiltersPickWrapper.PluginHeader.description": "Definir as condições a serem aplicadas para filtrar as entradas", - "components.FiltersPickWrapper.PluginHeader.title.filter": "Filtros", - "components.FiltersPickWrapper.hide": "Esconder", - - "components.FilterOptions.FILTER_TYPES.=": "é", - "components.FilterOptions.FILTER_TYPES._ne": "não é", - "components.FilterOptions.FILTER_TYPES._lt": "é menor que", - "components.FilterOptions.FILTER_TYPES._lte": "é menor que ou igual à", - "components.FilterOptions.FILTER_TYPES._gt": "é maior que", - "components.FilterOptions.FILTER_TYPES._gte": "é maior que ou igual à", - "components.FilterOptions.FILTER_TYPES._contains": "contém", - "components.FilterOptions.FILTER_TYPES._containss": "contém (case sensitive)", - - "components.Search.placeholder": "Procurar por uma entrada...", - - "components.TableDelete.entries.plural": "{number} entradas selecionadas", - "components.TableDelete.entries.singular": "{number} entrada selecionada", - "components.TableDelete.delete": "Apagar tudo", - - - "components.TableEmpty.withFilters": "Não há {contentType} com os filtros aplicados...", - "components.TableEmpty.withoutFilter": "Não há {contentType}...", - "components.TableEmpty.withSearch": "Não há {contentType} correspondente à pesquisa ({search})...", - - "EditRelations.title": "Dados relacionais", - - "emptyAttributes.title": "Ainda não há campos", - "emptyAttributes.description": "Adicione seu primeiro campo ao seu Tipo de Conteúdo", - "emptyAttributes.button": "Ir para o construtor de tipo de conteúdo", - - "error.schema.generation": "Ocorreu um erro durante a geração de esquemas.", - "error.records.count": "Ocorreu um erro durante a contagem de registros à buscar.", - "error.records.fetch": "Ocorreu um erro durante os registros de busca.", - "error.record.fetch": "Ocorreu um erro durante o registro de busca.", - "error.record.create": "Ocorreu um erro durante a criação de registro.", - "error.record.update": "Ocorreu um erro durante a actualização do registro.", - "error.record.delete": "Ocorreu um erro durante a exclusão do registro.", - "error.model.fetch": "Ocorreu um erro durante a configuração dos modelos de busca.", - "error.validation.required": "O valor desta entrada é obrigatória.", - "error.validation.regex": "Este valor não corresponde ao regex.", - "error.validation.max": "O valor é muito alto.", - "error.validation.min": "O valor é muito baixo.", - "error.validation.maxLength": "O valor é muito logo.", - "error.validation.minLength": "O valor é muito curto.", - "error.contentTypeName.taken": "Este nome já existe", - "error.attribute.taken": "O nome deste campo já existe", - "error.attribute.key.taken": "Este valor já existe", - "error.attribute.sameKeyAndName": "Não pode ser igual", - "error.validation.minSupMax": "Não pode ser superior", - "error.validation.json": "Isto não corresponde com o formato JSON", - - "form.Input.description": "Description", - "form.Input.description.placeholder": "Display name in the profile", - "form.Input.disabled": "Editable field", - - "notification.error.relationship.fetch": "Ocorreu um erro durante a busca da relação.", - - "success.record.delete": "Apagado", - "success.record.save": "Guardado", - - "pageNotFound": "Página não encontrada", - - "popUpWarning.button.cancel": "Cancelar", - "popUpWarning.button.confirm": "Confirmar", - "popUpWarning.title": "Por favor, confirme", - "popUpWarning.bodyMessage.contentType.delete": "Tem a certeza de que pretende apagar esta entrada?", - "popUpWarning.bodyMessage.contentType.delete.all": "Tem a certeza de que pretende apagar estas entradas?" - } - \ No newline at end of file + "EditRelations.title": "Dados relacionais", + "components.AddFilterCTA.add": "Filtros", + "components.AddFilterCTA.hide": "Filtros", + "components.FilterOptions.FILTER_TYPES.=": "é", + "components.FilterOptions.FILTER_TYPES._contains": "contém", + "components.FilterOptions.FILTER_TYPES._containss": "contém (case sensitive)", + "components.FilterOptions.FILTER_TYPES._gt": "é maior que", + "components.FilterOptions.FILTER_TYPES._gte": "é maior que ou igual à", + "components.FilterOptions.FILTER_TYPES._lt": "é menor que", + "components.FilterOptions.FILTER_TYPES._lte": "é menor que ou igual à", + "components.FilterOptions.FILTER_TYPES._ne": "não é", + "components.FilterOptions.button.apply": "Aplicar", + "components.FiltersPickWrapper.PluginHeader.actions.apply": "Aplicar", + "components.FiltersPickWrapper.PluginHeader.actions.clearAll": "Limpar tudo", + "components.FiltersPickWrapper.PluginHeader.description": "Definir as condições a serem aplicadas para filtrar as entradas", + "components.FiltersPickWrapper.PluginHeader.title.filter": "Filtros", + "components.FiltersPickWrapper.hide": "Esconder", + "components.LimitSelect.itemsPerPage": "Itens por página", + "components.Search.placeholder": "Procurar por uma entrada...", + "components.TableDelete.delete": "Apagar tudo", + "components.TableDelete.entries.plural": "{number} entradas selecionadas", + "components.TableDelete.entries.singular": "{number} entrada selecionada", + "components.TableEmpty.withFilters": "Não há {contentType} com os filtros aplicados...", + "components.TableEmpty.withSearch": "Não há {contentType} correspondente à pesquisa ({search})...", + "components.TableEmpty.withoutFilter": "Não há {contentType}...", + "containers.Edit.delete": "Apagar", + "containers.Edit.editing": "Editando...", + "containers.Edit.reset": "Restabelecer", + "containers.Edit.returnList": "Retornar à lista", + "containers.Edit.submit": "Guardar", + "containers.Home.introduction": "Para editar suas entradas, acesse o link específico no menu à esquerda. Esta extensão não tem uma maneira correcta de editar configurações e ainda está em desenvolvimento activo.", + "containers.Home.pluginHeaderDescription": "Gerencie suas entradas através de uma interface poderosa e bonita.", + "containers.Home.pluginHeaderTitle": "Gestor de conteúdos", + "containers.List.addAnEntry": "Adicionar Novo {entity}", + "containers.List.errorFetchRecords": "Erro", + "containers.List.pluginHeaderDescription": "{label} entradas encontradas", + "containers.List.pluginHeaderDescription.singular": "{label} entrada encontrada", + "containers.SettingPage.editSettings.description": "Drag & drop the fields to build the layout", + "containers.SettingPage.editSettings.title": "Edit — Settings", + "containers.SettingPage.relations": "Relational fields", + "emptyAttributes.button": "Ir para o construtor de tipo de conteúdo", + "emptyAttributes.description": "Adicione seu primeiro campo ao seu Tipo de Conteúdo", + "emptyAttributes.title": "Ainda não há campos", + "error.attribute.key.taken": "Este valor já existe", + "error.attribute.sameKeyAndName": "Não pode ser igual", + "error.attribute.taken": "O nome deste campo já existe", + "error.contentTypeName.taken": "Este nome já existe", + "error.model.fetch": "Ocorreu um erro durante a configuração dos modelos de busca.", + "error.record.create": "Ocorreu um erro durante a criação de registro.", + "error.record.delete": "Ocorreu um erro durante a exclusão do registro.", + "error.record.fetch": "Ocorreu um erro durante o registro de busca.", + "error.record.update": "Ocorreu um erro durante a actualização do registro.", + "error.records.count": "Ocorreu um erro durante a contagem de registros à buscar.", + "error.records.fetch": "Ocorreu um erro durante os registros de busca.", + "error.schema.generation": "Ocorreu um erro durante a geração de esquemas.", + "error.validation.json": "Isto não corresponde com o formato JSON", + "error.validation.max": "O valor é muito alto.", + "error.validation.maxLength": "O valor é muito logo.", + "error.validation.min": "O valor é muito baixo.", + "error.validation.minLength": "O valor é muito curto.", + "error.validation.minSupMax": "Não pode ser superior", + "error.validation.regex": "Este valor não corresponde ao regex.", + "error.validation.required": "O valor desta entrada é obrigatória.", + "form.Input.description": "Description", + "form.Input.description.placeholder": "Display name in the profile", + "form.Input.disabled": "Editable field", + "notification.error.relationship.fetch": "Ocorreu um erro durante a busca da relação.", + "pageNotFound": "Página não encontrada", + "plugin.description.long": "Maneira rápida de ver, editar e excluir os dados em sua base de dados.", + "plugin.description.short": "Maneira rápida de ver, editar e excluir os dados em sua base de dados.", + "popUpWarning.bodyMessage.contentType.delete": "Tem a certeza de que pretende apagar esta entrada?", + "popUpWarning.bodyMessage.contentType.delete.all": "Tem a certeza de que pretende apagar estas entradas?", + "popUpWarning.button.cancel": "Cancelar", + "popUpWarning.button.confirm": "Confirmar", + "popUpWarning.title": "Por favor, confirme", + "success.record.delete": "Apagado", + "success.record.save": "Guardado" +} \ No newline at end of file diff --git a/packages/strapi-plugin-content-manager/admin/src/translations/ru.json b/packages/strapi-plugin-content-manager/admin/src/translations/ru.json index 5866499e52..1cd8be7b48 100644 --- a/packages/strapi-plugin-content-manager/admin/src/translations/ru.json +++ b/packages/strapi-plugin-content-manager/admin/src/translations/ru.json @@ -1,110 +1,101 @@ { - "plugin.description.short": "Быстрый способ увидеть, отредактировать и удалить данные в вашей базе данных.", - "plugin.description.long": "Быстрый способ увидеть, отредактировать и удалить данные в вашей базе данных.", - "containers.Home.pluginHeaderTitle": "Редактор контента", - "containers.Home.introduction": "Для того чтобы отредактировать ваши записи используйте соответствующую ссылку в меню слева. У плагина отсутствует полноценная возможность редактировать настройки и он все еще находится в стадии активной разработки.", - "containers.Home.pluginHeaderDescription": "Manage your entries through a powerful and beautiful interface.", - "containers.Edit.submit": "Сохранить", - "containers.Edit.editing": "Редактирование...", - "containers.Edit.delete": "Удалить", - "containers.Edit.reset": "Сбросить", - "containers.Edit.returnList": "Вернуться к списку", - "containers.List.addAnEntry": "Добавить новые {entity}", - "containers.List.pluginHeaderDescription": "{label} записей найдено", - "containers.List.pluginHeaderDescription.singular": "{label} запись найдена", - "components.LimitSelect.itemsPerPage": "Элементов на странице", - "containers.List.errorFetchRecords": "Ошибка", - "containers.SettingPage.addField": "Добавить новое поле", - "containers.SettingPage.attributes": "Поля атрибутов", - "containers.SettingPage.attributes.description": "Определить порядок атребутов", - "containers.SettingPage.listSettings.description": "Указать порядок атрибутов", - "containers.SettingPage.listSettings.title": "Список — Настройки", - "containers.SettingPage.pluginHeaderDescription": "Отдельные настройки для этого Типа Данных", - "containers.SettingsPage.pluginHeaderDescription": "Настройте параметры по умолчанию для всех Типов Данных", - "containers.SettingsPage.Block.generalSettings.description": "Настройте опции по умолчанию для ваших Типов Данных", - "containers.SettingsPage.Block.generalSettings.title": "Общее", - "containers.SettingsPage.Block.contentType.title": "Типы данных", - "containers.SettingsPage.Block.contentType.description": "Настроить отдельные параметры", - "components.AddFilterCTA.add": "Фильтры", - "components.AddFilterCTA.hide": "Фильтры", - "components.DraggableAttr.edit": "Нажмите чтобы редактировать", - "components.FiltersPickWrapper.PluginHeader.actions.apply": "Применить", - "components.FiltersPickWrapper.PluginHeader.actions.clearAll": "Очистить все", - "components.FiltersPickWrapper.PluginHeader.description": "Укажите условия для фильтрации записей", - "components.FiltersPickWrapper.PluginHeader.title.filter": "Фильтры", - "components.FiltersPickWrapper.hide": "Скрыть", - "components.FilterOptions.button.apply": "Применить", - "components.FilterOptions.FILTER_TYPES.=": "равно", - "components.FilterOptions.FILTER_TYPES._ne": "не равно", - "components.FilterOptions.FILTER_TYPES._lt": "меньше чем", - "components.FilterOptions.FILTER_TYPES._lte": "меньше или равно чем", - "components.FilterOptions.FILTER_TYPES._gt": "больше чем", - "components.FilterOptions.FILTER_TYPES._gte": "равно или больше чем", - "components.FilterOptions.FILTER_TYPES._contains": "содержит", - "components.FilterOptions.FILTER_TYPES._containss": "содержит (с учетом регистра)", - "components.Search.placeholder": "Поиск записей...", - "components.TableDelete.entries.plural": "{число} записей выбрано", - "components.TableDelete.entries.singular": "{число} записей выделено", - "components.TableDelete.delete": "Удалить все", - "components.TableEmpty.withFilters": "Нет {contentType} с примененными фильтрами...", - "components.TableEmpty.withoutFilter": "Нет {contentType}...", - "components.TableEmpty.withSearch": "Нет {contentType} согласно поиску ({search})", - "error.validation.json": "Это не JSON", - "form.Input.label.inputDescription": "Это знчение переопределит метку, в заголовке таблицы", - "form.Input.label": "Метка", - "form.Input.search": "Применить поиск", - "form.Input.search.field": "Применить поиск по этому полю", - "form.Input.filters": "Применить фильтры", - "form.Input.sort.field": "Применить сортировку по этому полю", - "form.Input.bulkActions": "Применить массовые действия", - "form.Input.pageEntries": "Записей на страницу", - "form.Input.pageEntries.inputDescription": "Заметка: вы можете переопределить это значение на странице настроек Типа Данных", - "form.Input.defaultSort": "Сортировка по умолчанию", - "notification.info.SettingPage.disableSort": "У вас должен быть один атрибут с разрешенной сортировкой", - "popUpWarning.bodyMessage.contentType.delete.all": "Вы уверенны, что хотите удалить эти записи?", - "popUpWarning.warning.cancelAllSettings": "Вы уверенны, что хотите отменить ваши модификации?", - "popUpWarning.warning.updateAllSettings": "Это изменит все ваши настройки", - - "EditRelations.title": "Связанные данные", - - "emptyAttributes.title": "Пока нет полей", - "emptyAttributes.description": "Добавте новое поле в ваш Тип Данных", - "emptyAttributes.button": "Перейти в редактор контента", - - "error.schema.generation": "Возникла ошибка во время генерации структуры.", - "error.records.count": "Произошла ошибка при подсчете количества записей.", - "error.records.fetch": "Произошла ошибка при извлечении записей.", - "error.record.fetch": "Произошла ошибка при извлечении записи.", - "error.record.create": "Произошла ошибка при создании записи.", - "error.record.update": "Произошла ошибка при обновлении записи.", - "error.record.delete": "Произошла ошибка при удалении записи.", - "error.model.fetch": "Произошла ошибка во время настройки конфигурации модели.", - "error.validation.required": "Обязательное значение.", - "error.validation.regex": "Значение не соответствует регулярному выражению.", - "error.validation.max": "Слишком большое.", - "error.validation.min": "Слишком маленькое.", - "error.validation.maxLength": "Слишком длинное.", - "error.validation.minLength": "Слишком короткое.", - "error.contentTypeName.taken": "Это название уже существует", - "error.attribute.taken": "Поле с таким названием уже существует", - "error.attribute.key.taken": "Это значение уже существует", - "error.attribute.sameKeyAndName": "Не может быть одинаковым", - "error.validation.minSupMax": "Не может быть выше", - - "form.Input.description": "Description", - "form.Input.description.placeholder": "Display name in the profile", - "form.Input.disabled": "Editable field", - - "notification.error.relationship.fetch": "Возникла ошибка при получении связей.", - - "success.record.delete": "Удалено", - "success.record.save": "Сохранено", - - "pageNotFound": "Страница не найдена", - - "popUpWarning.button.cancel": "Отменить", - "popUpWarning.button.confirm": "Подтвердить", - "popUpWarning.title": "Пожалуйста подтвердите", - "popUpWarning.bodyMessage.contentType.delete": "Вы уверены, что хотите удалить эту запись?" - } - + "EditRelations.title": "Связанные данные", + "components.AddFilterCTA.add": "Фильтры", + "components.AddFilterCTA.hide": "Фильтры", + "components.DraggableAttr.edit": "Нажмите чтобы редактировать", + "components.FilterOptions.FILTER_TYPES.=": "равно", + "components.FilterOptions.FILTER_TYPES._contains": "содержит", + "components.FilterOptions.FILTER_TYPES._containss": "содержит (с учетом регистра)", + "components.FilterOptions.FILTER_TYPES._gt": "больше чем", + "components.FilterOptions.FILTER_TYPES._gte": "равно или больше чем", + "components.FilterOptions.FILTER_TYPES._lt": "меньше чем", + "components.FilterOptions.FILTER_TYPES._lte": "меньше или равно чем", + "components.FilterOptions.FILTER_TYPES._ne": "не равно", + "components.FilterOptions.button.apply": "Применить", + "components.FiltersPickWrapper.PluginHeader.actions.apply": "Применить", + "components.FiltersPickWrapper.PluginHeader.actions.clearAll": "Очистить все", + "components.FiltersPickWrapper.PluginHeader.description": "Укажите условия для фильтрации записей", + "components.FiltersPickWrapper.PluginHeader.title.filter": "Фильтры", + "components.FiltersPickWrapper.hide": "Скрыть", + "components.LimitSelect.itemsPerPage": "Элементов на странице", + "components.Search.placeholder": "Поиск записей...", + "components.TableDelete.delete": "Удалить все", + "components.TableDelete.entries.plural": "{число} записей выбрано", + "components.TableDelete.entries.singular": "{число} записей выделено", + "components.TableEmpty.withFilters": "Нет {contentType} с примененными фильтрами...", + "components.TableEmpty.withSearch": "Нет {contentType} согласно поиску ({search})", + "components.TableEmpty.withoutFilter": "Нет {contentType}...", + "containers.Edit.delete": "Удалить", + "containers.Edit.editing": "Редактирование...", + "containers.Edit.reset": "Сбросить", + "containers.Edit.returnList": "Вернуться к списку", + "containers.Edit.submit": "Сохранить", + "containers.Home.introduction": "Для того чтобы отредактировать ваши записи используйте соответствующую ссылку в меню слева. У плагина отсутствует полноценная возможность редактировать настройки и он все еще находится в стадии активной разработки.", + "containers.Home.pluginHeaderDescription": "Manage your entries through a powerful and beautiful interface.", + "containers.Home.pluginHeaderTitle": "Редактор контента", + "containers.List.addAnEntry": "Добавить новые {entity}", + "containers.List.errorFetchRecords": "Ошибка", + "containers.List.pluginHeaderDescription": "{label} записей найдено", + "containers.List.pluginHeaderDescription.singular": "{label} запись найдена", + "containers.SettingPage.addField": "Добавить новое поле", + "containers.SettingPage.attributes": "Поля атрибутов", + "containers.SettingPage.attributes.description": "Определить порядок атребутов", + "containers.SettingPage.listSettings.description": "Указать порядок атрибутов", + "containers.SettingPage.listSettings.title": "Список — Настройки", + "containers.SettingPage.pluginHeaderDescription": "Отдельные настройки для этого Типа Данных", + "containers.SettingsPage.Block.contentType.description": "Настроить отдельные параметры", + "containers.SettingsPage.Block.contentType.title": "Типы данных", + "containers.SettingsPage.Block.generalSettings.description": "Настройте опции по умолчанию для ваших Типов Данных", + "containers.SettingsPage.Block.generalSettings.title": "Общее", + "containers.SettingsPage.pluginHeaderDescription": "Настройте параметры по умолчанию для всех Типов Данных", + "emptyAttributes.button": "Перейти в редактор контента", + "emptyAttributes.description": "Добавте новое поле в ваш Тип Данных", + "emptyAttributes.title": "Пока нет полей", + "error.attribute.key.taken": "Это значение уже существует", + "error.attribute.sameKeyAndName": "Не может быть одинаковым", + "error.attribute.taken": "Поле с таким названием уже существует", + "error.contentTypeName.taken": "Это название уже существует", + "error.model.fetch": "Произошла ошибка во время настройки конфигурации модели.", + "error.record.create": "Произошла ошибка при создании записи.", + "error.record.delete": "Произошла ошибка при удалении записи.", + "error.record.fetch": "Произошла ошибка при извлечении записи.", + "error.record.update": "Произошла ошибка при обновлении записи.", + "error.records.count": "Произошла ошибка при подсчете количества записей.", + "error.records.fetch": "Произошла ошибка при извлечении записей.", + "error.schema.generation": "Возникла ошибка во время генерации структуры.", + "error.validation.json": "Это не JSON", + "error.validation.max": "Слишком большое.", + "error.validation.maxLength": "Слишком длинное.", + "error.validation.min": "Слишком маленькое.", + "error.validation.minLength": "Слишком короткое.", + "error.validation.minSupMax": "Не может быть выше", + "error.validation.regex": "Значение не соответствует регулярному выражению.", + "error.validation.required": "Обязательное значение.", + "form.Input.bulkActions": "Применить массовые действия", + "form.Input.defaultSort": "Сортировка по умолчанию", + "form.Input.description": "Description", + "form.Input.description.placeholder": "Display name in the profile", + "form.Input.disabled": "Editable field", + "form.Input.filters": "Применить фильтры", + "form.Input.label": "Метка", + "form.Input.label.inputDescription": "Это знчение переопределит метку, в заголовке таблицы", + "form.Input.pageEntries": "Записей на страницу", + "form.Input.pageEntries.inputDescription": "Заметка: вы можете переопределить это значение на странице настроек Типа Данных", + "form.Input.search": "Применить поиск", + "form.Input.search.field": "Применить поиск по этому полю", + "form.Input.sort.field": "Применить сортировку по этому полю", + "notification.error.relationship.fetch": "Возникла ошибка при получении связей.", + "notification.info.SettingPage.disableSort": "У вас должен быть один атрибут с разрешенной сортировкой", + "pageNotFound": "Страница не найдена", + "plugin.description.long": "Быстрый способ увидеть, отредактировать и удалить данные в вашей базе данных.", + "plugin.description.short": "Быстрый способ увидеть, отредактировать и удалить данные в вашей базе данных.", + "popUpWarning.bodyMessage.contentType.delete": "Вы уверены, что хотите удалить эту запись?", + "popUpWarning.bodyMessage.contentType.delete.all": "Вы уверенны, что хотите удалить эти записи?", + "popUpWarning.button.cancel": "Отменить", + "popUpWarning.button.confirm": "Подтвердить", + "popUpWarning.title": "Пожалуйста подтвердите", + "popUpWarning.warning.cancelAllSettings": "Вы уверенны, что хотите отменить ваши модификации?", + "popUpWarning.warning.updateAllSettings": "Это изменит все ваши настройки", + "success.record.delete": "Удалено", + "success.record.save": "Сохранено" +} \ No newline at end of file diff --git a/packages/strapi-plugin-content-manager/admin/src/translations/tr.json b/packages/strapi-plugin-content-manager/admin/src/translations/tr.json index 038ef1eb01..932a17e317 100644 --- a/packages/strapi-plugin-content-manager/admin/src/translations/tr.json +++ b/packages/strapi-plugin-content-manager/admin/src/translations/tr.json @@ -1,119 +1,101 @@ { - "plugin.description.short": "Veritabanındaki verileri görmek, düzenlemek ve silmek için hızlı bir yol.", - "plugin.description.long": "Veritabanındaki verileri görmek, düzenlemek ve silmek için hızlı bir yol.", - "containers.Home.pluginHeaderTitle": "İçerik Yönetimi", - "containers.Home.introduction": "Girişlerinizi düzenlemek için soldaki menüdeki ilgili bağlantıya gidin. Bu eklentinin ayarları düzenlemek için uygun bir yol bulunmamaktadır ve halen aktif geliştirme aşamasındadır.", - "containers.Home.pluginHeaderDescription": "Güçlü ve güzel bir arayüz aracılığıyla girişlerinizi yönetin.", - "containers.Edit.submit": "Kaydet", - "containers.Edit.editing": "Düzenleniyor...", - "containers.Edit.delete": "Sil", - "containers.Edit.reset": "Reset", - "containers.Edit.returnList": "Listeye dön", - "containers.List.addAnEntry": "Yeni {entity} ekle", - "containers.List.pluginHeaderDescription": "{label} kayıt bulundu", - "containers.List.pluginHeaderDescription.singular": "{label} kayıt bulundu", - "components.LimitSelect.itemsPerPage": "Sayfa başı", - "containers.List.errorFetchRecords": "Hata", - - "containers.SettingPage.addField": "Yeni alan ekle", - "containers.SettingPage.attributes": "Nitelik alanları", - "containers.SettingPage.attributes.description": "Niteliklerin sırasını tanımlayın", - - "containers.SettingPage.listSettings.title": "Liste — Ayarlar", - "containers.SettingPage.listSettings.description": "Bu içerik türü için seçenekleri yapılandırın", - "containers.SettingPage.pluginHeaderDescription": "Bu İçerik Türü için belirli ayarları yapılandırın", - "containers.SettingsPage.pluginHeaderDescription": "Tüm İçerik türleriniz için varsayılan ayarları yapılandırın", - "containers.SettingsPage.Block.generalSettings.description": "İçerik Türleriniz için varsayılan seçenekleri yapılandırın", - "containers.SettingsPage.Block.generalSettings.title": "Genel", - "containers.SettingsPage.Block.contentType.title": "İçerik Türleri", - "containers.SettingsPage.Block.contentType.description": "Belirli ayarları yapılandırın", - + "EditRelations.title": "İlişkili Data", "components.AddFilterCTA.add": "Filtreler", "components.AddFilterCTA.hide": "Filtreler", - "components.DraggableAttr.edit": "Düzenlemek için tıklayın", - + "components.FilterOptions.FILTER_TYPES.=": "eşit", + "components.FilterOptions.FILTER_TYPES._contains": "içermek", + "components.FilterOptions.FILTER_TYPES._containss": "içermek (büyük-küçük harfe duyarlı)", + "components.FilterOptions.FILTER_TYPES._gt": "daha yüksek", + "components.FilterOptions.FILTER_TYPES._gte": "daha yüksek ya da eşit", + "components.FilterOptions.FILTER_TYPES._lt": "daha düşük", + "components.FilterOptions.FILTER_TYPES._lte": "daha düşük ya da eşit", + "components.FilterOptions.FILTER_TYPES._ne": "eşit değil", + "components.FilterOptions.button.apply": "Uygula", "components.FiltersPickWrapper.PluginHeader.actions.apply": "Uygula", "components.FiltersPickWrapper.PluginHeader.actions.clearAll": "Hepsini temizle", "components.FiltersPickWrapper.PluginHeader.description": "Filtrelemek için uygulanacak şartları ayarlayın", "components.FiltersPickWrapper.PluginHeader.title.filter": "Filtreler", "components.FiltersPickWrapper.hide": "Gizle", - - "components.FilterOptions.button.apply": "Uygula", - "components.FilterOptions.FILTER_TYPES.=": "eşit", - "components.FilterOptions.FILTER_TYPES._ne": "eşit değil", - "components.FilterOptions.FILTER_TYPES._lt": "daha düşük", - "components.FilterOptions.FILTER_TYPES._lte": "daha düşük ya da eşit", - "components.FilterOptions.FILTER_TYPES._gt": "daha yüksek", - "components.FilterOptions.FILTER_TYPES._gte": "daha yüksek ya da eşit", - "components.FilterOptions.FILTER_TYPES._contains": "içermek", - "components.FilterOptions.FILTER_TYPES._containss": "içermek (büyük-küçük harfe duyarlı)", - + "components.LimitSelect.itemsPerPage": "Sayfa başı", "components.Search.placeholder": "Kayıt aramak için...", - + "components.TableDelete.delete": "Hepsini sil", "components.TableDelete.entries.plural": "{number} kayıt seçildi", "components.TableDelete.entries.singular": "{number} kayıt seçildi", - "components.TableDelete.delete": "Hepsini sil", - "components.TableEmpty.withFilters": "Uygulanan filtrelerle {contentType} yoktur...", - "components.TableEmpty.withoutFilter": "{contentType} yoktur...", "components.TableEmpty.withSearch": "Aramaya karşılık gelen {contentType} yoktur ({search})...", - - "EditRelations.title": "İlişkili Data", - - "emptyAttributes.title": "Henüz bir alan yok", - "emptyAttributes.description": "İçerik türüne ilk alanınızı ekleyin", + "components.TableEmpty.withoutFilter": "{contentType} yoktur...", + "containers.Edit.delete": "Sil", + "containers.Edit.editing": "Düzenleniyor...", + "containers.Edit.reset": "Reset", + "containers.Edit.returnList": "Listeye dön", + "containers.Edit.submit": "Kaydet", + "containers.Home.introduction": "Girişlerinizi düzenlemek için soldaki menüdeki ilgili bağlantıya gidin. Bu eklentinin ayarları düzenlemek için uygun bir yol bulunmamaktadır ve halen aktif geliştirme aşamasındadır.", + "containers.Home.pluginHeaderDescription": "Güçlü ve güzel bir arayüz aracılığıyla girişlerinizi yönetin.", + "containers.Home.pluginHeaderTitle": "İçerik Yönetimi", + "containers.List.addAnEntry": "Yeni {entity} ekle", + "containers.List.errorFetchRecords": "Hata", + "containers.List.pluginHeaderDescription": "{label} kayıt bulundu", + "containers.List.pluginHeaderDescription.singular": "{label} kayıt bulundu", + "containers.SettingPage.addField": "Yeni alan ekle", + "containers.SettingPage.attributes": "Nitelik alanları", + "containers.SettingPage.attributes.description": "Niteliklerin sırasını tanımlayın", + "containers.SettingPage.listSettings.description": "Bu içerik türü için seçenekleri yapılandırın", + "containers.SettingPage.listSettings.title": "Liste — Ayarlar", + "containers.SettingPage.pluginHeaderDescription": "Bu İçerik Türü için belirli ayarları yapılandırın", + "containers.SettingsPage.Block.contentType.description": "Belirli ayarları yapılandırın", + "containers.SettingsPage.Block.contentType.title": "İçerik Türleri", + "containers.SettingsPage.Block.generalSettings.description": "İçerik Türleriniz için varsayılan seçenekleri yapılandırın", + "containers.SettingsPage.Block.generalSettings.title": "Genel", + "containers.SettingsPage.pluginHeaderDescription": "Tüm İçerik türleriniz için varsayılan ayarları yapılandırın", "emptyAttributes.button": "Içerik türü oluşturucuya gidin", - - "error.schema.generation": "Şema oluşturma sırasında bir hata oluştu.", - "error.records.count": "Sayım kayıtları getirilinceye kadar", - "error.records.fetch": "Kayıtlar getirilirken bir hata oluştu.", - "error.record.fetch": "Kayıt getirilirken bir hata oluştu.", - "error.record.create": "Kayıt oluşturulurken bir hata oluştu.", - "error.record.update": "Kayıt güncelleme sırasında bir hata oluştu.", - "error.record.delete": "Kayıt silinirken bir hata oluştu.", - "error.model.fetch": "Modellerin yapılandırması getirilirken bir hata oluştu.", - "error.validation.required": "Zorunlu alandır.", - "error.validation.regex": "Regex ile eşleşmiyor.", - "error.validation.max": "Değer çok yüksek.", - "error.validation.min": "Değer çok az.", - "error.validation.maxLength": "Değer çok uzun.", - "error.validation.minLength": "Değer çok kısa.", - "error.contentTypeName.taken": "Bu alan ismi zaten var.", - "error.attribute.taken": "Bu alan ismi zaten var.", + "emptyAttributes.description": "İçerik türüne ilk alanınızı ekleyin", + "emptyAttributes.title": "Henüz bir alan yok", "error.attribute.key.taken": "Bu değer zaten var.", "error.attribute.sameKeyAndName": "Eşit olamaz", - "error.validation.minSupMax": "Üstü olamaz", + "error.attribute.taken": "Bu alan ismi zaten var.", + "error.contentTypeName.taken": "Bu alan ismi zaten var.", + "error.model.fetch": "Modellerin yapılandırması getirilirken bir hata oluştu.", + "error.record.create": "Kayıt oluşturulurken bir hata oluştu.", + "error.record.delete": "Kayıt silinirken bir hata oluştu.", + "error.record.fetch": "Kayıt getirilirken bir hata oluştu.", + "error.record.update": "Kayıt güncelleme sırasında bir hata oluştu.", + "error.records.count": "Sayım kayıtları getirilinceye kadar", + "error.records.fetch": "Kayıtlar getirilirken bir hata oluştu.", + "error.schema.generation": "Şema oluşturma sırasında bir hata oluştu.", "error.validation.json": "Bu JSON biçimi ile eşleşmiyor", - - "form.Input.label.inputDescription": "Bu değer, tablonun başında görüntülenen etiketi geçersiz kılar", - "form.Input.label": "Etiket", - "form.Input.search": "Aramayı etkinleştir", - "form.Input.search.field": "Bu alanda aramayı etkinleştir", - "form.Input.filters": "Filtreleri etkinleştir", - "form.Input.sort.field": "Bu alana göre sıralamayı etkinleştir", + "error.validation.max": "Değer çok yüksek.", + "error.validation.maxLength": "Değer çok uzun.", + "error.validation.min": "Değer çok az.", + "error.validation.minLength": "Değer çok kısa.", + "error.validation.minSupMax": "Üstü olamaz", + "error.validation.regex": "Regex ile eşleşmiyor.", + "error.validation.required": "Zorunlu alandır.", "form.Input.bulkActions": "Toplu işlemleri etkinleştir", - "form.Input.pageEntries": "Sayfa başına kayıtlar", - "form.Input.pageEntries.inputDescription": "Not: Bu değeri İçerik Türü ayarları sayfasında geçersiz kılabilirsiniz..", "form.Input.defaultSort": "Varsayılan sıralama özelliği", - "form.Input.description": "Description", "form.Input.description.placeholder": "Display name in the profile", "form.Input.disabled": "Editable field", - + "form.Input.filters": "Filtreleri etkinleştir", + "form.Input.label": "Etiket", + "form.Input.label.inputDescription": "Bu değer, tablonun başında görüntülenen etiketi geçersiz kılar", + "form.Input.pageEntries": "Sayfa başına kayıtlar", + "form.Input.pageEntries.inputDescription": "Not: Bu değeri İçerik Türü ayarları sayfasında geçersiz kılabilirsiniz..", + "form.Input.search": "Aramayı etkinleştir", + "form.Input.search.field": "Bu alanda aramayı etkinleştir", + "form.Input.sort.field": "Bu alana göre sıralamayı etkinleştir", "notification.error.relationship.fetch": "İlişki getirme sırasında bir hata oluştu.", "notification.info.SettingPage.disableSort": "Sıralamaya izin verilen tek bir özelliğe sahip olmanız gerekir", - - "success.record.delete": "Silindi", - "success.record.save": "Kaydedildi", - "pageNotFound": "Sayfa bulunamadı", - + "plugin.description.long": "Veritabanındaki verileri görmek, düzenlemek ve silmek için hızlı bir yol.", + "plugin.description.short": "Veritabanındaki verileri görmek, düzenlemek ve silmek için hızlı bir yol.", + "popUpWarning.bodyMessage.contentType.delete": "Bu kaydı silmek istediğinizden emin misiniz?", + "popUpWarning.bodyMessage.contentType.delete.all": "Bu kayıtları silmek istediğinizden emin misiniz?", "popUpWarning.button.cancel": "İptal", "popUpWarning.button.confirm": "Onayla", "popUpWarning.title": "Lütfen onaylayın", - "popUpWarning.bodyMessage.contentType.delete": "Bu kaydı silmek istediğinizden emin misiniz?", - "popUpWarning.bodyMessage.contentType.delete.all": "Bu kayıtları silmek istediğinizden emin misiniz?", "popUpWarning.warning.cancelAllSettings": "Değişikliklerinizi iptal etmek istediğinizden emin misiniz?", - "popUpWarning.warning.updateAllSettings": "Bu bütün ayarlarınızı değiştirecektir" -} + "popUpWarning.warning.updateAllSettings": "Bu bütün ayarlarınızı değiştirecektir", + "success.record.delete": "Silindi", + "success.record.save": "Kaydedildi" +} \ No newline at end of file diff --git a/packages/strapi-plugin-content-manager/admin/src/translations/zh-Hans.json b/packages/strapi-plugin-content-manager/admin/src/translations/zh-Hans.json index a9cae7f62f..742be63028 100644 --- a/packages/strapi-plugin-content-manager/admin/src/translations/zh-Hans.json +++ b/packages/strapi-plugin-content-manager/admin/src/translations/zh-Hans.json @@ -1,64 +1,54 @@ { - "plugin.description.short": "快速查看、编辑和删除数据库中的数据。", - "plugin.description.long": "快速查看、编辑和删除数据库中的数据。", - "containers.Home.pluginHeaderTitle": "内容管理器", - "containers.Home.introduction": "要编辑您的条目,请转到左边菜单中的特定链接。这个插件没有合适的方法来编辑设置,它仍然在积极的开发中。", - "containers.Home.pluginHeaderDescription": "通过一个强大而漂亮的界面管理你的条目。", - "containers.Edit.submit": "保存", - "containers.Edit.editing": "编辑...", + "EditRelations.title": "关系数据", + "components.LimitSelect.itemsPerPage": "每页显示数目", "containers.Edit.delete": "删除", + "containers.Edit.editing": "编辑...", "containers.Edit.reset": "重置", "containers.Edit.returnList": "返回列表", + "containers.Edit.submit": "保存", + "containers.Home.introduction": "要编辑您的条目,请转到左边菜单中的特定链接。这个插件没有合适的方法来编辑设置,它仍然在积极的开发中。", + "containers.Home.pluginHeaderDescription": "通过一个强大而漂亮的界面管理你的条目。", + "containers.Home.pluginHeaderTitle": "内容管理器", "containers.List.addAnEntry": "增加新的 {entity}", + "containers.List.errorFetchRecords": "错误", "containers.List.pluginHeaderDescription": "找到 {label} 条目", "containers.List.pluginHeaderDescription.singular": "找到 {label} 条目", - "components.LimitSelect.itemsPerPage": "每页显示数目", - "containers.List.errorFetchRecords": "错误", - - "containers.SettingPage.relations": "Relational fields", - "containers.SettingPage.editSettings.description": "Drag & drop the fields to build the layout", "containers.SettingPage.editSettings.title": "Edit — Settings", - - "EditRelations.title": "关系数据", - - "emptyAttributes.title": "还没有字段", - "emptyAttributes.description": "为你的内容类型添加第一个字段", + "containers.SettingPage.relations": "Relational fields", "emptyAttributes.button": "转到内容类型生成器", - - "error.schema.generation": "Schema生成过程中发生错误。", - "error.records.count": "获取记录数count时发生错误。", - "error.records.fetch": "获取记录时发生错误。", - "error.record.fetch": "获取记录时发生错误。", - "error.record.create": "创建记录时发生错误", - "error.record.update": "更新记录时发生错误", - "error.record.delete": "删除记录时发生错误", - "error.model.fetch": "获取models配置时发生错误", - "error.validation.required": "必填项", - "error.validation.regex": "格式错误", - "error.validation.max": "超过最大值", - "error.validation.min": "小于最小值", - "error.validation.maxLength": "长度太长", - "error.validation.minLength": "长度太短", - "error.contentTypeName.taken": "该名称已被使用", - "error.attribute.taken": "该名称已被使用", + "emptyAttributes.description": "为你的内容类型添加第一个字段", + "emptyAttributes.title": "还没有字段", "error.attribute.key.taken": "该值已存在", "error.attribute.sameKeyAndName": "不能相等", + "error.attribute.taken": "该名称已被使用", + "error.contentTypeName.taken": "该名称已被使用", + "error.model.fetch": "获取models配置时发生错误", + "error.record.create": "创建记录时发生错误", + "error.record.delete": "删除记录时发生错误", + "error.record.fetch": "获取记录时发生错误。", + "error.record.update": "更新记录时发生错误", + "error.records.count": "获取记录数count时发生错误。", + "error.records.fetch": "获取记录时发生错误。", + "error.schema.generation": "Schema生成过程中发生错误。", + "error.validation.max": "超过最大值", + "error.validation.maxLength": "长度太长", + "error.validation.min": "小于最小值", + "error.validation.minLength": "长度太短", "error.validation.minSupMax": "最小值大于最大值。", - + "error.validation.regex": "格式错误", + "error.validation.required": "必填项", "form.Input.description": "Description", "form.Input.description.placeholder": "Display name in the profile", "form.Input.disabled": "Editable field", - "notification.error.relationship.fetch": "获取关联数据时发生错误", - - "success.record.delete": "删除", - "success.record.save": "保存", - "pageNotFound": "页面未找到", - + "plugin.description.long": "快速查看、编辑和删除数据库中的数据。", + "plugin.description.short": "快速查看、编辑和删除数据库中的数据。", + "popUpWarning.bodyMessage.contentType.delete": "确实要删除此条目吗?", "popUpWarning.button.cancel": "取消", "popUpWarning.button.confirm": "确认", "popUpWarning.title": "请确认", - "popUpWarning.bodyMessage.contentType.delete": "确实要删除此条目吗?" -} + "success.record.delete": "删除", + "success.record.save": "保存" +} \ No newline at end of file diff --git a/packages/strapi-plugin-content-manager/admin/src/translations/zh.json b/packages/strapi-plugin-content-manager/admin/src/translations/zh.json index 2664dced0b..d2cac8b04c 100644 --- a/packages/strapi-plugin-content-manager/admin/src/translations/zh.json +++ b/packages/strapi-plugin-content-manager/admin/src/translations/zh.json @@ -1,65 +1,54 @@ { - "plugin.description.short": "快速瀏覽、編輯、刪除您資料庫的檔案", - "plugin.description.long": "快速瀏覽、編輯、刪除您資料庫的檔案", - "containers.Home.pluginHeaderTitle": "內容管理員", - "containers.Home.introduction": - "這個擴充功能還在開發階段,如果要編輯進入點,請去左邊 Menu 對應的連結", - "containers.Home.pluginHeaderDescription": "透過強大的介面來管理您的進入點", - "containers.Edit.submit": "儲存", - "containers.Edit.editing": "編輯中...", + "EditRelations.title": "關聯式資料", + "components.LimitSelect.itemsPerPage": "每個頁面檔案數量", "containers.Edit.delete": "刪除", + "containers.Edit.editing": "編輯中...", "containers.Edit.reset": "重設", "containers.Edit.returnList": "回到清單", + "containers.Edit.submit": "儲存", + "containers.Home.introduction": "這個擴充功能還在開發階段,如果要編輯進入點,請去左邊 Menu 對應的連結", + "containers.Home.pluginHeaderDescription": "透過強大的介面來管理您的進入點", + "containers.Home.pluginHeaderTitle": "內容管理員", "containers.List.addAnEntry": "增加新的 {entity}", + "containers.List.errorFetchRecords": "錯誤", "containers.List.pluginHeaderDescription": "找到 {label} 筆資料", "containers.List.pluginHeaderDescription.singular": "找到 {label} 筆資料", - "components.LimitSelect.itemsPerPage": "每個頁面檔案數量", - "containers.List.errorFetchRecords": "錯誤", - - "containers.SettingPage.relations": "Relational fields", - "containers.SettingPage.editSettings.description": "Drag & drop the fields to build the layout", "containers.SettingPage.editSettings.title": "Edit — Settings", - - "EditRelations.title": "關聯式資料", - - "emptyAttributes.title": "目前還沒有欄位", - "emptyAttributes.description": "增加您第一個欄位到資料結構", + "containers.SettingPage.relations": "Relational fields", "emptyAttributes.button": "去資料建構頁面", - - "error.schema.generation": "產生資料結構時發生錯誤", - "error.records.count": "讀取資料數量時發生錯誤", - "error.records.fetch": "讀取資料時發生錯誤", - "error.record.fetch": "讀取資料時發生錯誤", - "error.record.create": "增加資料時發生錯誤", - "error.record.update": "更新資料時發生錯誤", - "error.record.delete": "刪除資料時發生錯誤", - "error.model.fetch": "讀取資料結構設定時發生錯誤", - "error.validation.required": "這個數值必填", - "error.validation.regex": "這個數值和 regex 不符合", - "error.validation.max": "這個數值太高", - "error.validation.min": "這個數值太低", - "error.validation.maxLength": "這個數值太長", - "error.validation.minLength": "這個數值太短", - "error.contentTypeName.taken": "這個名稱已存在", - "error.attribute.taken": "這個欄位名稱已存在", + "emptyAttributes.description": "增加您第一個欄位到資料結構", + "emptyAttributes.title": "目前還沒有欄位", "error.attribute.key.taken": "這個數值已存在", "error.attribute.sameKeyAndName": "不能等於", + "error.attribute.taken": "這個欄位名稱已存在", + "error.contentTypeName.taken": "這個名稱已存在", + "error.model.fetch": "讀取資料結構設定時發生錯誤", + "error.record.create": "增加資料時發生錯誤", + "error.record.delete": "刪除資料時發生錯誤", + "error.record.fetch": "讀取資料時發生錯誤", + "error.record.update": "更新資料時發生錯誤", + "error.records.count": "讀取資料數量時發生錯誤", + "error.records.fetch": "讀取資料時發生錯誤", + "error.schema.generation": "產生資料結構時發生錯誤", + "error.validation.max": "這個數值太高", + "error.validation.maxLength": "這個數值太長", + "error.validation.min": "這個數值太低", + "error.validation.minLength": "這個數值太短", "error.validation.minSupMax": "不能大於", - + "error.validation.regex": "這個數值和 regex 不符合", + "error.validation.required": "這個數值必填", "form.Input.description": "Description", "form.Input.description.placeholder": "Display name in the profile", "form.Input.disabled": "Editable field", - "notification.error.relationship.fetch": "讀取關聯資料時發生錯誤", - - "success.record.delete": "已刪除", - "success.record.save": "已儲存", - "pageNotFound": "頁面沒有找到", - + "plugin.description.long": "快速瀏覽、編輯、刪除您資料庫的檔案", + "plugin.description.short": "快速瀏覽、編輯、刪除您資料庫的檔案", + "popUpWarning.bodyMessage.contentType.delete": "您確定要刪除這筆資料嗎?", "popUpWarning.button.cancel": "取消", "popUpWarning.button.confirm": "確認", "popUpWarning.title": "請確認", - "popUpWarning.bodyMessage.contentType.delete": "您確定要刪除這筆資料嗎?" -} + "success.record.delete": "已刪除", + "success.record.save": "已儲存" +} \ No newline at end of file diff --git a/packages/strapi-plugin-content-type-builder/admin/src/translations/ar.json b/packages/strapi-plugin-content-type-builder/admin/src/translations/ar.json index 98d6b5d070..3cc9e9d47f 100644 --- a/packages/strapi-plugin-content-type-builder/admin/src/translations/ar.json +++ b/packages/strapi-plugin-content-type-builder/admin/src/translations/ar.json @@ -1,158 +1,158 @@ { - "plugin.description.short": "قم بتجميع هيكل البيانات الخاص بـ API الخاص بك.", - "plugin.description.long": "قم بتجميع هيكل البيانات الخاص بـ API الخاص بك. إنشاء حقول وعلاقات جديدة في دقيقة واحدة فقط. يتم إنشاء الملفات وتحديثها تلقائيًا في مشروعك.", - "attribute.string": "سلسلة نصية", - "attribute.text": "نص", + "attribute.WYSIWYG": "نص (WYSIWYG)", "attribute.boolean": "منطقي", + "attribute.date": "تاريخ", + "attribute.decimal": "عدد عشري", + "attribute.email": "بريد الإكتروني", + "attribute.enumeration": "تعداد", "attribute.float": "عدد عائم", "attribute.integer": "عدد صحيح", - "attribute.decimal": "عدد عشري", - "attribute.date": "تاريخ", "attribute.json": "JSON", "attribute.media": "وسائط", - "attribute.email": "بريد الإكتروني", "attribute.password": "كلمة سر", "attribute.relation": "علاقة", - "attribute.enumeration": "تعداد", - "attribute.WYSIWYG": "نص (WYSIWYG)", - "contentType.temporaryDisplay": "(غير محفوظ)", - "from": "من", - "home.contentTypeBuilder.name": "أنواع المحتوى", - "home.contentTypeBuilder.description": "إنشاء وتحديث أنواع المحتوى الخاصة بك.", - "home.emptyContentType.title": "لا يوجد أنواع محتويات متاحة", - "home.emptyContentType.description": "قم بإنشاء نوع المحتوى الأول لتتمكن من استرداد البيانات من API الخاص بك.", - "home.emptyAttributes.title": "لا توجد حقول بعد", - "home.emptyAttributes.description": "أضف حقلك الأول إلى نوع المحتوى الجديد", - "button.contentType.create": "إنشاء نوع المحتوى", - "button.contentType.add": "أضف نوع المحتوى", + "attribute.string": "سلسلة نصية", + "attribute.text": "نص", "button.attributes.add": "أضف حقل جديد", - "error.validation.required": "قيمة هذا الحقل مطلوبة.", - "error.validation.regex": "هذه القيمة لا تطابق regex.", - "error.validation.max": "هذه القيمة عالية جدًا.", - "error.validation.min": "هذه القيمة قليل جدًا.", - "error.validation.maxLength": "هذه القيمة طويلة جدًا.", - "error.validation.minLength": "هذه القيمة قصيرة جدًا.", - "error.contentTypeName.taken": "هذا الأسم موجود مسبقًا", - "error.attribute.taken": "اسم الحقل هذا موجود مسبقًا", + "button.contentType.add": "أضف نوع المحتوى", + "button.contentType.create": "إنشاء نوع المحتوى", + "contentType.temporaryDisplay": "(غير محفوظ)", + "error.attribute.forbidden": "اسم السمة هذا محجوز", "error.attribute.key.taken": "هذه القيمة موجودة مسبقًا", "error.attribute.sameKeyAndName": "لا تتطابق", + "error.attribute.taken": "اسم الحقل هذا موجود مسبقًا", + "error.contentTypeName.taken": "هذا الأسم موجود مسبقًا", + "error.validation.max": "هذه القيمة عالية جدًا.", + "error.validation.maxLength": "هذه القيمة طويلة جدًا.", + "error.validation.min": "هذه القيمة قليل جدًا.", + "error.validation.minLength": "هذه القيمة قصيرة جدًا.", "error.validation.minSupMax": "لا يمكن أن تكون متفوقة", - "error.attribute.forbidden": "اسم السمة هذا محجوز", - "form.attribute.item.textarea.name": "الأسم", - "form.attribute.item.number.name": "الأسم", - "form.attribute.item.date.name": "الأسم", - "form.attribute.item.media.name": "الأسم", - "form.attribute.item.media.multiple": "السماح لعدة ملفات", - "form.attribute.item.json.name": "الأسم", - "form.attribute.item.boolean.name": "الأسم", - "form.attribute.item.string.name": "الأسم", - "form.attribute.item.enumeration.name": "أسم", - "form.attribute.item.enumeration.rules": "قيم ( مقسمة بإستخدام الفاصلة )", - "form.attribute.item.enumeration.graphql": "تجاوز الاسم لـ GraphQL", - "form.attribute.item.enumeration.graphql.description": "يسمح لك بتجاوز الاسم الذي تم إنشاؤه افتراضيًا لـ GraphQL", - "form.attribute.item.enumeration.placeholder": "مثال: صباح,قمر,احداث", - "form.attribute.item.appearance.name": "المظهر خارجي", - "form.attribute.item.appearance.label": "عرض كسلسلة WYSIWYG", + "error.validation.regex": "هذه القيمة لا تطابق regex.", + "error.validation.required": "قيمة هذا الحقل مطلوبة.", "form.attribute.item.appearance.description": "خلاف ذلك ، ستكون القيمة قابلة للتحرير من خلال حقل textarea الأساسي", - "form.attribute.item.settings.name": "الإعدادات", - "form.attribute.item.requiredField": "الحقل مطلوب", - "form.attribute.item.uniqueField": "حقل فريد", - "form.attribute.item.minimum": "أدنى قيمة", - "form.attribute.item.minimumLength": "أدنى طول", - "form.attribute.item.maximumLength": "أقصى طول", - "form.attribute.item.maximum": "اقصى قيمة", - "form.attribute.item.requiredField.description": "لن تتمكن من إنشاء إدخال إذا كان هذا الحقل فارغًا", - "form.attribute.item.uniqueField.description": "لن تتمكن من إنشاء إدخال إذا كان هناك إدخال حالي بمحتوى متطابق", - "form.attribute.item.defineRelation.fieldName": "اسم الحقل", + "form.attribute.item.appearance.label": "عرض كسلسلة WYSIWYG", + "form.attribute.item.appearance.name": "المظهر خارجي", + "form.attribute.item.boolean.name": "الأسم", "form.attribute.item.customColumnName": "أسماء الأعمدة المخصصة", "form.attribute.item.customColumnName.description": "يفيد ذلك في إعادة تسمية أسماء أعمدة قاعدة البيانات بتنسيق أكثر شمولاً لاستجابات واجهة برمجة التطبيقات ( API )", + "form.attribute.item.date.name": "الأسم", + "form.attribute.item.defineRelation.fieldName": "اسم الحقل", + "form.attribute.item.enumeration.graphql": "تجاوز الاسم لـ GraphQL", + "form.attribute.item.enumeration.graphql.description": "يسمح لك بتجاوز الاسم الذي تم إنشاؤه افتراضيًا لـ GraphQL", + "form.attribute.item.enumeration.name": "أسم", + "form.attribute.item.enumeration.placeholder": "مثال: صباح,قمر,احداث", + "form.attribute.item.enumeration.rules": "قيم ( مقسمة بإستخدام الفاصلة )", + "form.attribute.item.json.name": "الأسم", + "form.attribute.item.maximum": "اقصى قيمة", + "form.attribute.item.maximumLength": "أقصى طول", + "form.attribute.item.media.multiple": "السماح لعدة ملفات", + "form.attribute.item.media.name": "الأسم", + "form.attribute.item.minimum": "أدنى قيمة", + "form.attribute.item.minimumLength": "أدنى طول", + "form.attribute.item.number.name": "الأسم", "form.attribute.item.number.type": "تنسيق الرقم", - "form.attribute.item.number.type.integer": "عدد صحيح (مثال: 10)", - "form.attribute.item.number.type.float": "عدد عائم (مثال: 3.33333333)", "form.attribute.item.number.type.decimal": "عدد عشري (مثال: 2.22)", + "form.attribute.item.number.type.float": "عدد عائم (مثال: 3.33333333)", + "form.attribute.item.number.type.integer": "عدد صحيح (مثال: 10)", + "form.attribute.item.requiredField": "الحقل مطلوب", + "form.attribute.item.requiredField.description": "لن تتمكن من إنشاء إدخال إذا كان هذا الحقل فارغًا", + "form.attribute.item.settings.name": "الإعدادات", + "form.attribute.item.string.name": "الأسم", + "form.attribute.item.textarea.name": "الأسم", + "form.attribute.item.uniqueField": "حقل فريد", + "form.attribute.item.uniqueField.description": "لن تتمكن من إنشاء إدخال إذا كان هناك إدخال حالي بمحتوى متطابق", "form.attribute.settings.default": "القيمة الأفتراضية", "form.attribute.settings.default.checkboxLabel": "جعلة true (صحيح)", "form.button.cancel": "الغاء", "form.button.continue": "استمر", "form.button.save": "حفظ", + "form.contentType.item.collectionName": "اسم المجموعة ( collection )", + "form.contentType.item.collectionName.inputDescription": "من المفيد أن يختلف اسم نوع المحتوى واسم الجدول الخاص بك", "form.contentType.item.connections": "الأتصال", + "form.contentType.item.description": "الوصف", + "form.contentType.item.description.placeholder": "اكتب وصفك الصغير هنا...", "form.contentType.item.name": "الأسم", "form.contentType.item.name.description": "يجب أن تكون أسماء نوع المحتوى مفردة: {link}", "form.contentType.item.name.link.description": "تحقق من وثائقنا", - "form.contentType.item.description": "الوصف", - "form.contentType.item.description.placeholder": "اكتب وصفك الصغير هنا...", - "form.contentType.item.collectionName": "اسم المجموعة ( collection )", - "form.contentType.item.collectionName.inputDescription": "من المفيد أن يختلف اسم نوع المحتوى واسم الجدول الخاص بك", + "from": "من", + "home.contentTypeBuilder.description": "إنشاء وتحديث أنواع المحتوى الخاصة بك.", + "home.contentTypeBuilder.name": "أنواع المحتوى", + "home.emptyAttributes.description": "أضف حقلك الأول إلى نوع المحتوى الجديد", + "home.emptyAttributes.title": "لا توجد حقول بعد", + "home.emptyContentType.description": "قم بإنشاء نوع المحتوى الأول لتتمكن من استرداد البيانات من API الخاص بك.", + "home.emptyContentType.title": "لا يوجد أنواع محتويات متاحة", "menu.section.contentTypeBuilder.name.plural": "أنواع المحتوى", "menu.section.contentTypeBuilder.name.singular": "نوع المحتوى", - "menu.section.documentation.name": "التوثيق", "menu.section.documentation.guide": "قراءة المزيد عن أنواع المحتوى في موقعنا", "menu.section.documentation.guideLink": "الإرشاد.", + "menu.section.documentation.name": "التوثيق", "menu.section.documentation.tutorial": "تحقق من", "menu.section.documentation.tutorialLink": "الفيديو التعليمي.", + "modelPage.attribute.relationWith": "علاقة مع", "modelPage.contentHeader.emptyDescription.description": "لا يوجد وصف لنوع المحتوى هذا", - "modelPage.contentType.list.title.plural": "حقول", - "modelPage.contentType.list.title.singular": "حقل", - "modelPage.contentType.list.title.including": "من ضمنها", "modelPage.contentType.list.relationShipTitle.plural": "العلاقات", "modelPage.contentType.list.relationShipTitle.singular": "العلاقة", - "modelPage.attribute.relationWith": "علاقة مع", + "modelPage.contentType.list.title.including": "من ضمنها", + "modelPage.contentType.list.title.plural": "حقول", + "modelPage.contentType.list.title.singular": "حقل", "noTableWarning.description": "لا تنسَ إنشاء الجدول `{modelName}` في قاعدة البيانات الخاصة بك", "noTableWarning.infos": "مزيد من المعلومات", "notification.error.message": "حدث خطأ", "notification.info.contentType.creating.notSaved": "يرجى حفظ نوع المحتوى الحالي قبل إنشاء نوع جديد", "notification.info.disable": "هذا الحقل غير قابل للتحرير في الوقت الحالي...😮", + "notification.info.enumeration": "هذا الحقل غير قابل للتحرير في الوقت الحالي ... 😮", "notification.info.optimized": "تم تحسين هذا المكون الإضافي باستخدام التخزين المحلي الخاص بك", - "notification.success.message.contentType.edit": "تم تحديث نوع المحتوى الخاص بك", - "notification.success.message.contentType.create": "تم إنشاء نوع المحتوى الخاص بك", "notification.success.contentTypeDeleted": "تم حذف نوع المحتوى", - "popUpForm.attributes.string.description": "عناوين, اسماء, فقرات, قائمة الاسماء", - "popUpForm.attributes.text.description": "اوصاف, فقرات نصية, مقالات ", + "notification.success.message.contentType.create": "تم إنشاء نوع المحتوى الخاص بك", + "notification.success.message.contentType.edit": "تم تحديث نوع المحتوى الخاص بك", + "plugin.description.long": "قم بتجميع هيكل البيانات الخاص بـ API الخاص بك. إنشاء حقول وعلاقات جديدة في دقيقة واحدة فقط. يتم إنشاء الملفات وتحديثها تلقائيًا في مشروعك.", + "plugin.description.short": "قم بتجميع هيكل البيانات الخاص بـ API الخاص بك.", "popUpForm.attributes.boolean.description": "نعم او لا, 1 او 0, true او false", - "popUpForm.attributes.number.description": "كل ما هو رقم", - "popUpForm.attributes.date.description": "تاريخ الحدث وساعات العمل", - "popUpForm.attributes.json.description": "البيانات في تنسيق JSON", - "popUpForm.attributes.media.description": "صور, فيديوهات, مستندات PDF وملفات اخرى", - "popUpForm.attributes.relation.description": "يشير إلى نوع المحتوى", - "popUpForm.attributes.email.description": "البريد الإلكتروني للمستخدم...", - "popUpForm.attributes.password.description": "كلمة مرور المستخدم...", - "popUpForm.attributes.enumeration.description": "قائمة من الخيارات", - "popUpForm.attributes.string.name": "سلسلة نصية", - "popUpForm.attributes.text.name": "نص", "popUpForm.attributes.boolean.name": "قيمة منطقية", + "popUpForm.attributes.date.description": "تاريخ الحدث وساعات العمل", "popUpForm.attributes.date.name": "تاريخ", - "popUpForm.attributes.json.name": "JSON", - "popUpForm.attributes.media.name": "واسائط", - "popUpForm.attributes.number.name": "رقم", - "popUpForm.attributes.relation.name": "علاقة", + "popUpForm.attributes.email.description": "البريد الإلكتروني للمستخدم...", "popUpForm.attributes.email.name": "بريد الأكتروني", - "popUpForm.attributes.password.name": "كلمة السر", + "popUpForm.attributes.enumeration.description": "قائمة من الخيارات", "popUpForm.attributes.enumeration.name": "تعداد", - "popUpForm.create": "اضافة جديد", - "popUpForm.edit": "تعديل", - "popUpForm.field": "حقل", - "popUpForm.create.contentType.header.title": "إضافة نوع محتوى جديد", + "popUpForm.attributes.json.description": "البيانات في تنسيق JSON", + "popUpForm.attributes.json.name": "JSON", + "popUpForm.attributes.media.description": "صور, فيديوهات, مستندات PDF وملفات اخرى", + "popUpForm.attributes.media.name": "واسائط", + "popUpForm.attributes.number.description": "كل ما هو رقم", + "popUpForm.attributes.number.name": "رقم", + "popUpForm.attributes.password.description": "كلمة مرور المستخدم...", + "popUpForm.attributes.password.name": "كلمة السر", + "popUpForm.attributes.relation.description": "يشير إلى نوع المحتوى", + "popUpForm.attributes.relation.name": "علاقة", + "popUpForm.attributes.string.description": "عناوين, اسماء, فقرات, قائمة الاسماء", + "popUpForm.attributes.string.name": "سلسلة نصية", + "popUpForm.attributes.text.description": "اوصاف, فقرات نصية, مقالات ", + "popUpForm.attributes.text.name": "نص", "popUpForm.choose.attributes.header.title": "اضافة حقل جديد", + "popUpForm.create": "اضافة جديد", + "popUpForm.create.contentType.header.title": "إضافة نوع محتوى جديد", + "popUpForm.edit": "تعديل", "popUpForm.edit.contentType.header.title": "تحرير نوع المحتوى", - "popUpForm.navContainer.relation": "تعريف العلاقة", - "popUpForm.navContainer.base": "إعدادات القاعدة", + "popUpForm.field": "حقل", "popUpForm.navContainer.advanced": "إعدادات متقدمة", + "popUpForm.navContainer.base": "إعدادات القاعدة", + "popUpForm.navContainer.relation": "تعريف العلاقة", "popUpRelation.title": "علاقة", + "popUpWarning.bodyMessage.attribute.delete": "هل أنت متأكد من أنك تريد حذف هذا الحقل؟", + "popUpWarning.bodyMessage.contentType.delete": "هل أنت متأكد من أنك تريد حذف نوع المحتوى هذا؟", "popUpWarning.button.cancel": "الغاء", "popUpWarning.button.confirm": "تأكيد", "popUpWarning.title": "الرجاء التأكيد", - "popUpWarning.bodyMessage.contentType.delete": "هل أنت متأكد من أنك تريد حذف نوع المحتوى هذا؟", - "popUpWarning.bodyMessage.attribute.delete": "هل أنت متأكد من أنك تريد حذف هذا الحقل؟", - "table.contentType.title.plural": "أنواع المحتوى متاحة", - "table.contentType.title.singular": "نوع المحتوى متاح", - "table.contentType.head.name": "اسم", + "relation.attributeName.placeholder": "مثال: المؤلف, الفئة, الوسم", + "relation.manyToMany": "يملك وينتم للكثير", + "relation.manyToOne": "يملك الكثير", + "relation.oneToMany": "ينتمي للكثير", + "relation.oneToOne": "يتشارك بواحد", + "relation.oneWay": "يمتلك واحد", "table.contentType.head.description": "وصف", "table.contentType.head.fields": "حقول", - "relation.oneWay": "يمتلك واحد", - "relation.oneToOne": "يتشارك بواحد", - "relation.oneToMany": "ينتمي للكثير", - "relation.manyToOne": "يملك الكثير", - "relation.manyToMany": "يملك وينتم للكثير", - "relation.attributeName.placeholder": "مثال: المؤلف, الفئة, الوسم", - "notification.info.enumeration": "هذا الحقل غير قابل للتحرير في الوقت الحالي ... 😮" + "table.contentType.head.name": "اسم", + "table.contentType.title.plural": "أنواع المحتوى متاحة", + "table.contentType.title.singular": "نوع المحتوى متاح" } \ No newline at end of file diff --git a/packages/strapi-plugin-content-type-builder/admin/src/translations/de.json b/packages/strapi-plugin-content-type-builder/admin/src/translations/de.json index 01573a4ada..7b3a57ef4f 100644 --- a/packages/strapi-plugin-content-type-builder/admin/src/translations/de.json +++ b/packages/strapi-plugin-content-type-builder/admin/src/translations/de.json @@ -1,179 +1,157 @@ { - "plugin.description.short": "Modelliere die Datenstruktur deiner API.", - "plugin.description.long": - "Modelliere die Datenstruktur deiner API. Lege neue Felder und Beziehungen innerhalb von einer Minute an. Erforderliche Dateien werden automatisch in deinem Projekt angelegt und aktualisiert.", - "attribute.string": "String", - "attribute.text": "Text", + "attribute.WYSIWYG": "Text (WYSIWYG)", "attribute.boolean": "Boolean", + "attribute.date": "Datum", + "attribute.decimal": "Decimal", + "attribute.email": "E-Mail", + "attribute.enumeration": "Enumeration", "attribute.float": "Float", "attribute.integer": "Integer", - "attribute.decimal": "Decimal", - "attribute.date": "Datum", "attribute.json": "JSON", "attribute.media": "Medien", - "attribute.email": "E-Mail", "attribute.password": "Passwort", "attribute.relation": "Beziehung", - "attribute.enumeration": "Enumeration", - "attribute.WYSIWYG": "Text (WYSIWYG)", - - "contentType.temporaryDisplay": "(Nicht gespeichert)", - "from": "aus", - "home.contentTypeBuilder.name": "Inhaltstypen", - "home.contentTypeBuilder.description": "Verwalte deine Inhaltstypen.", - "home.emptyContentType.title": "Es sind keine Inhaltstypen verfügbar", - "home.emptyContentType.description": "Lege deinen ersten Inhaltstyp an, Daten deiner API abrufen zu können.", - - "home.emptyAttributes.title": "Es gibt noch keine Felder", - "home.emptyAttributes.description": "Füge deinem Inhaltstypen das erste Feld hinzu", - - "button.contentType.create": "Lege einen Inhaltstyp an", - "button.contentType.add": "Neuer Inhaltstyp", + "attribute.string": "String", + "attribute.text": "Text", "button.attributes.add": "Neues Feld", - - "error.validation.required": "Dieser Wert ist erforderlich.", - "error.validation.regex": "Dieser Wert entspricht nicht dem RegEx.", - "error.validation.max": "Dieser Wert ist zu hoch.", - "error.validation.min": "Dieser Wert ist zu niedrig.", - "error.validation.maxLength": "Dieser Wert ist zu lang.", - "error.validation.minLength": "Dieser Wert ist zu kurz.", - "error.contentTypeName.taken": "Dieser Name existiert bereits", - "error.attribute.taken": "Dieser Feldname ist bereits vergeben", + "button.contentType.add": "Neuer Inhaltstyp", + "button.contentType.create": "Lege einen Inhaltstyp an", + "contentType.temporaryDisplay": "(Nicht gespeichert)", + "error.attribute.forbidden": "Dieser Attributname ist reserviert", "error.attribute.key.taken": "Dieser Wert existiert bereits", "error.attribute.sameKeyAndName": "Darf nicht gleich sein", + "error.attribute.taken": "Dieser Feldname ist bereits vergeben", + "error.contentTypeName.taken": "Dieser Name existiert bereits", + "error.validation.max": "Dieser Wert ist zu hoch.", + "error.validation.maxLength": "Dieser Wert ist zu lang.", + "error.validation.min": "Dieser Wert ist zu niedrig.", + "error.validation.minLength": "Dieser Wert ist zu kurz.", "error.validation.minSupMax": "Darf nicht höher sein", - "error.attribute.forbidden": "Dieser Attributname ist reserviert", - - "form.attribute.item.textarea.name": "Name", - "form.attribute.item.number.name": "Name", - "form.attribute.item.date.name": "Name", - "form.attribute.item.media.name": "Name", - "form.attribute.item.media.multiple": "Erlaube mehrere Dateien", - "form.attribute.item.json.name": "Name", + "error.validation.regex": "Dieser Wert entspricht nicht dem RegEx.", + "error.validation.required": "Dieser Wert ist erforderlich.", + "form.attribute.item.appearance.description": "Andernfalls ist der Wert über ein einfaches Textfeld editierbar", + "form.attribute.item.appearance.label": "Als WYSIWYG anzeigen", + "form.attribute.item.appearance.name": "Aussehen", "form.attribute.item.boolean.name": "Name", - "form.attribute.item.string.name": "Name", - "form.attribute.item.enumeration.name": "Name", - "form.attribute.item.enumeration.rules": "Werte (trenne sie mit einem Komma)", - "form.attribute.item.enumeration.placeholder": "Ex: Morgen, Mittag, Abend", - "form.attribute.item.enumeration.graphql": "Name override for GraphQL", - "form.attribute.item.enumeration.graphql.description": "Allows you to override the default generated name for GraphQL", - "form.attribute.item.settings.name": "Einstellungen", - "form.attribute.item.requiredField": "Benötigtes Feld", - "form.attribute.item.uniqueField": "Einzigartiges Feld", - "form.attribute.item.minimum": "Mindestwert", - "form.attribute.item.minimumLength": "Mindestlänge", - "form.attribute.item.maximumLength": "Maximallänge", - "form.attribute.item.maximum": "Maximalwert", - "form.attribute.item.requiredField.description": "Du wirst keinen Eintrag anlegen können, wenn dieses Feld leer ist", - "form.attribute.item.uniqueField.description": "Du wirst keinen Eintrag anlegen können, wenn es bereits einen Eintrag mit identischem Inhalt gibt", - "form.attribute.item.defineRelation.fieldName": "Feldname", "form.attribute.item.customColumnName": "Eigener Spaltenname", "form.attribute.item.customColumnName.description": "Dies ist nützlich, um Spalten in der Datenbank für Antworten der API umzubenennen", + "form.attribute.item.date.name": "Name", + "form.attribute.item.defineRelation.fieldName": "Feldname", + "form.attribute.item.enumeration.graphql": "Name override for GraphQL", + "form.attribute.item.enumeration.graphql.description": "Allows you to override the default generated name for GraphQL", + "form.attribute.item.enumeration.name": "Name", + "form.attribute.item.enumeration.placeholder": "Ex: Morgen, Mittag, Abend", + "form.attribute.item.enumeration.rules": "Werte (trenne sie mit einem Komma)", + "form.attribute.item.json.name": "Name", + "form.attribute.item.maximum": "Maximalwert", + "form.attribute.item.maximumLength": "Maximallänge", + "form.attribute.item.media.multiple": "Erlaube mehrere Dateien", + "form.attribute.item.media.name": "Name", + "form.attribute.item.minimum": "Mindestwert", + "form.attribute.item.minimumLength": "Mindestlänge", + "form.attribute.item.number.name": "Name", "form.attribute.item.number.type": "Zahlenformat", - "form.attribute.item.number.type.integer": "integer (z.B.: 10)", - "form.attribute.item.number.type.float": "float (z.B.: 3.33333333)", "form.attribute.item.number.type.decimal": "decimal (z.B.: 2.22)", - "form.attribute.item.appearance.name": "Aussehen", - "form.attribute.item.appearance.label": "Als WYSIWYG anzeigen", - "form.attribute.item.appearance.description": "Andernfalls ist der Wert über ein einfaches Textfeld editierbar", + "form.attribute.item.number.type.float": "float (z.B.: 3.33333333)", + "form.attribute.item.number.type.integer": "integer (z.B.: 10)", + "form.attribute.item.requiredField": "Benötigtes Feld", + "form.attribute.item.requiredField.description": "Du wirst keinen Eintrag anlegen können, wenn dieses Feld leer ist", + "form.attribute.item.settings.name": "Einstellungen", + "form.attribute.item.string.name": "Name", + "form.attribute.item.textarea.name": "Name", + "form.attribute.item.uniqueField": "Einzigartiges Feld", + "form.attribute.item.uniqueField.description": "Du wirst keinen Eintrag anlegen können, wenn es bereits einen Eintrag mit identischem Inhalt gibt", "form.attribute.settings.default": "Standardwert", "form.attribute.settings.default.checkboxLabel": "Set to true", - "form.button.cancel": "Abbrechen", "form.button.continue": "Weiter", "form.button.save": "Speichern", - + "form.contentType.item.collectionName": "Name des Dokuments in der Datenbank", + "form.contentType.item.collectionName.inputDescription": "Nützlich, wenn Inhaltstyp und Datenbankname unterschiedlich sind", "form.contentType.item.connections": "Verbindung", + "form.contentType.item.description": "Beschreibung", + "form.contentType.item.description.placeholder": "Beschreibe deinen Inhaltstyp", "form.contentType.item.name": "Name", "form.contentType.item.name.description": "Der Name des Inhaltstyps sollte Singular sein. {link}", "form.contentType.item.name.link.description": "Schau dir unsere Dokumentation an.", - "form.contentType.item.description": "Beschreibung", - "form.contentType.item.description.placeholder": "Beschreibe deinen Inhaltstyp", - "form.contentType.item.collectionName": "Name des Dokuments in der Datenbank", - "form.contentType.item.collectionName.inputDescription": "Nützlich, wenn Inhaltstyp und Datenbankname unterschiedlich sind", - + "from": "aus", + "home.contentTypeBuilder.description": "Verwalte deine Inhaltstypen.", + "home.contentTypeBuilder.name": "Inhaltstypen", + "home.emptyAttributes.description": "Füge deinem Inhaltstypen das erste Feld hinzu", + "home.emptyAttributes.title": "Es gibt noch keine Felder", + "home.emptyContentType.description": "Lege deinen ersten Inhaltstyp an, Daten deiner API abrufen zu können.", + "home.emptyContentType.title": "Es sind keine Inhaltstypen verfügbar", "menu.section.contentTypeBuilder.name.plural": "Inhaltstypen", "menu.section.contentTypeBuilder.name.singular": "Inhaltstyp", - "menu.section.documentation.name": "Dokumentation", "menu.section.documentation.guide": "Mehr über Inhaltstypen findest du in unserer", "menu.section.documentation.guideLink": "Anleitung.", + "menu.section.documentation.name": "Dokumentation", "menu.section.documentation.tutorial": "Schau dir unser", "menu.section.documentation.tutorialLink": "Tutorial an.", - + "modelPage.attribute.relationWith": "Beziehung mit", "modelPage.contentHeader.emptyDescription.description": "Dieser Inhaltstyp hat keine Beschreibung", - "modelPage.contentType.list.title.plural": "Felder", - "modelPage.contentType.list.title.singular": "Feld", - "modelPage.contentType.list.title.including": "schließt ein", "modelPage.contentType.list.relationShipTitle.plural": "Beziehungen", "modelPage.contentType.list.relationShipTitle.singular": "Beziehung", - "modelPage.attribute.relationWith": "Beziehung mit", - + "modelPage.contentType.list.title.including": "schließt ein", + "modelPage.contentType.list.title.plural": "Felder", + "modelPage.contentType.list.title.singular": "Feld", "noTableWarning.description": "Vergiss nicht, die Tabelle `{modelName}` in deiner Datenbank zu erstellen", "noTableWarning.infos": "Mehr Informationen", - "notification.error.message": "Ein Fehler ist aufgetreten", "notification.info.contentType.creating.notSaved": "Bitte speichere zuerst diesen Inhaltstyp bevor du einen neuen anlegst", "notification.info.disable": "Dieses Feld ist momentan nicht editierbar...😮", "notification.info.optimized": "Dieses Plugin ist auf deinen localStorage optimiert", - "notification.success.message.contentType.edit": "Der Inhaltstyp wurde aktualisiert", - "notification.success.message.contentType.create": "Der Inhaltstyp wurde angelegt", "notification.success.contentTypeDeleted": "Der Inhaltstyp wurde gelöscht", - - "relation.oneWay": "hat eine", - - "popUpForm.attributes.string.description": "Titel, Namen, Namenslisten", - "popUpForm.attributes.text.description": "Beschreibungen, Paragraphen, Artikel", + "notification.success.message.contentType.create": "Der Inhaltstyp wurde angelegt", + "notification.success.message.contentType.edit": "Der Inhaltstyp wurde aktualisiert", + "plugin.description.long": "Modelliere die Datenstruktur deiner API. Lege neue Felder und Beziehungen innerhalb von einer Minute an. Erforderliche Dateien werden automatisch in deinem Projekt angelegt und aktualisiert.", + "plugin.description.short": "Modelliere die Datenstruktur deiner API.", "popUpForm.attributes.boolean.description": "Ja/Nein, 1 oder 0, Wahr/Falsch", - "popUpForm.attributes.number.description": "Jegliche Zahlen", - "popUpForm.attributes.date.description": "Event-Daten, Öffnungszeiten", - "popUpForm.attributes.json.description": "Daten in JSON-Format", - "popUpForm.attributes.media.description": "Bilder, Videos, PDFs und andere", - "popUpForm.attributes.relation.description": "Bezieht sich auf einen Inhaltstyp", - "popUpForm.attributes.email.description": "E-Mail-Adressen von Benutzern", - "popUpForm.attributes.password.description": "Passwörter von Benutzers", - "popUpForm.attributes.enumeration.description": "Liste der Auswahlmöglichkeiten", - - "popUpForm.attributes.string.name": "String", - "popUpForm.attributes.text.name": "Text", "popUpForm.attributes.boolean.name": "Boolean", + "popUpForm.attributes.date.description": "Event-Daten, Öffnungszeiten", "popUpForm.attributes.date.name": "Datum", - "popUpForm.attributes.json.name": "JSON", - "popUpForm.attributes.media.name": "Medien", - "popUpForm.attributes.number.name": "Zahl", - "popUpForm.attributes.relation.name": "Beziehung", + "popUpForm.attributes.email.description": "E-Mail-Adressen von Benutzern", "popUpForm.attributes.email.name": "E-Mail", + "popUpForm.attributes.enumeration.description": "Liste der Auswahlmöglichkeiten", + "popUpForm.attributes.enumeration.name": "Enumeration", + "popUpForm.attributes.json.description": "Daten in JSON-Format", + "popUpForm.attributes.json.name": "JSON", + "popUpForm.attributes.media.description": "Bilder, Videos, PDFs und andere", + "popUpForm.attributes.media.name": "Medien", + "popUpForm.attributes.number.description": "Jegliche Zahlen", + "popUpForm.attributes.number.name": "Zahl", + "popUpForm.attributes.password.description": "Passwörter von Benutzers", "popUpForm.attributes.password.name": "Passwort", - "popUpForm.attributes.enumeration.name": "Enumeration", - "popUpForm.create": "Neu", - "popUpForm.edit": "Bearbeiten", - "popUpForm.field": "Feld", - "popUpForm.create.contentType.header.title": "Neuer Inhaltstyp", + "popUpForm.attributes.relation.description": "Bezieht sich auf einen Inhaltstyp", + "popUpForm.attributes.relation.name": "Beziehung", + "popUpForm.attributes.string.description": "Titel, Namen, Namenslisten", + "popUpForm.attributes.string.name": "String", + "popUpForm.attributes.text.description": "Beschreibungen, Paragraphen, Artikel", + "popUpForm.attributes.text.name": "Text", "popUpForm.choose.attributes.header.title": "Neues Feld hinzufügen", + "popUpForm.create": "Neu", + "popUpForm.create.contentType.header.title": "Neuer Inhaltstyp", + "popUpForm.edit": "Bearbeiten", "popUpForm.edit.contentType.header.title": "Inhaltstypen bearbeiten", - - "popUpForm.navContainer.relation": "Beziehung definieren", - "popUpForm.navContainer.base": "Grundeinstellungen", + "popUpForm.field": "Feld", "popUpForm.navContainer.advanced": "Fortgeschrittene Einstellungen", - + "popUpForm.navContainer.base": "Grundeinstellungen", + "popUpForm.navContainer.relation": "Beziehung definieren", "popUpRelation.title": "Beziehung", - + "popUpWarning.bodyMessage.attribute.delete": "Bist du sicher, dass du dieses Feld löschen willst?", + "popUpWarning.bodyMessage.contentType.delete": "Bist du sicher, dass du diesen Inhaltstyp löschen willst?", "popUpWarning.button.cancel": "Abbrechen", "popUpWarning.button.confirm": "Bestätigen", "popUpWarning.title": "Bitte bestätigen", - "popUpWarning.bodyMessage.contentType.delete": "Bist du sicher, dass du diesen Inhaltstyp löschen willst?", - "popUpWarning.bodyMessage.attribute.delete": "Bist du sicher, dass du dieses Feld löschen willst?", - - - "table.contentType.title.plural": "Inhaltstypen sind verfügbar", - "table.contentType.title.singular": "Inhaltstyp ist verfügbar", - "table.contentType.head.name": "Name", + "relation.attributeName.placeholder": "z.B.: Autor, Kategorie", + "relation.manyToMany": "hat und gehört zu vielen", + "relation.manyToOne": "hat viele", + "relation.oneToMany": "gehört zu vielen", + "relation.oneToOne": "hat ein(en)", + "relation.oneWay": "hat eine", "table.contentType.head.description": "Beschreibung", "table.contentType.head.fields": "Felder", - - "relation.oneToOne": "hat ein(en)", - "relation.oneToMany": "gehört zu vielen", - "relation.manyToOne": "hat viele", - "relation.manyToMany": "hat und gehört zu vielen", - "relation.attributeName.placeholder": "z.B.: Autor, Kategorie" - -} + "table.contentType.head.name": "Name", + "table.contentType.title.plural": "Inhaltstypen sind verfügbar", + "table.contentType.title.singular": "Inhaltstyp ist verfügbar" +} \ No newline at end of file diff --git a/packages/strapi-plugin-content-type-builder/admin/src/translations/en.json b/packages/strapi-plugin-content-type-builder/admin/src/translations/en.json index 73b932b462..9f18df4e65 100644 --- a/packages/strapi-plugin-content-type-builder/admin/src/translations/en.json +++ b/packages/strapi-plugin-content-type-builder/admin/src/translations/en.json @@ -1,185 +1,157 @@ { - "plugin.description.short": "Modelize the data structure of your API.", - "plugin.description.long": - "Modelize the data structure of your API. Create new fields and relations in just a minute. The files are automatically created and updated in your project.", - "attribute.string": "String", - "attribute.text": "Text", + "attribute.WYSIWYG": "Text (WYSIWYG)", "attribute.boolean": "Boolean", + "attribute.date": "Date", + "attribute.decimal": "Decimal", + "attribute.email": "Email", + "attribute.enumeration": "Enumeration", "attribute.float": "Float", "attribute.integer": "integer", - "attribute.decimal": "Decimal", - "attribute.date": "Date", "attribute.json": "JSON", "attribute.media": "Media", - "attribute.email": "Email", "attribute.password": "Password", "attribute.relation": "Relation", - "attribute.enumeration": "Enumeration", - "attribute.WYSIWYG": "Text (WYSIWYG)", - - "contentType.temporaryDisplay": "(Not saved)", - "from": "from", - "home.contentTypeBuilder.name": "Content Types", - "home.contentTypeBuilder.description": "Create and update your own Content Types.", - "home.emptyContentType.title": "There are no Content Types available", - "home.emptyContentType.description": - "Create your first Content Type to be able to retrieve data from your API.", - - "home.emptyAttributes.title": "There are no fields yet", - "home.emptyAttributes.description": "Add your first field to your new Content Type", - - "button.contentType.create": "Create Content Type", - "button.contentType.add": "Add Content Type", + "attribute.string": "String", + "attribute.text": "Text", "button.attributes.add": "Add New Field", - - "error.validation.required": "This value input is required.", - "error.validation.regex": "The value does not match the regex.", - "error.validation.max": "The value is too high.", - "error.validation.min": "The value is too low.", - "error.validation.maxLength": "The value is too long.", - "error.validation.minLength": "The value is too short.", - "error.contentTypeName.taken": "This name already exists", - "error.attribute.taken": "This field name already exists", + "button.contentType.add": "Add Content Type", + "button.contentType.create": "Create Content Type", + "contentType.temporaryDisplay": "(Not saved)", + "error.attribute.forbidden": "This attribute name is reserved", "error.attribute.key.taken": "This value already exists", "error.attribute.sameKeyAndName": "Can't be equal", + "error.attribute.taken": "This field name already exists", + "error.contentTypeName.taken": "This name already exists", + "error.validation.max": "The value is too high.", + "error.validation.maxLength": "The value is too long.", + "error.validation.min": "The value is too low.", + "error.validation.minLength": "The value is too short.", "error.validation.minSupMax": "Can't be superior", - "error.attribute.forbidden": "This attribute name is reserved", - - "form.attribute.item.textarea.name": "Name", - "form.attribute.item.number.name": "Name", - "form.attribute.item.date.name": "Name", - "form.attribute.item.media.name": "Name", - "form.attribute.item.media.multiple": "Allow multiple files", - "form.attribute.item.json.name": "Name", + "error.validation.regex": "The value does not match the regex.", + "error.validation.required": "This value input is required.", + "form.attribute.item.appearance.description": "Otherwise, the value will be editable through a basic textarea field", + "form.attribute.item.appearance.label": "Display as a WYSIWYG", + "form.attribute.item.appearance.name": "Appearance", "form.attribute.item.boolean.name": "Name", - "form.attribute.item.string.name": "Name", - "form.attribute.item.enumeration.name": "Name", - "form.attribute.item.enumeration.rules": "Values (separate them with a comma)", + "form.attribute.item.customColumnName": "Custom column names", + "form.attribute.item.customColumnName.description": "This is useful to rename database column names in a more comprehensive format for the API's responses", + "form.attribute.item.date.name": "Name", + "form.attribute.item.defineRelation.fieldName": "Field name", "form.attribute.item.enumeration.graphql": "Name override for GraphQL", "form.attribute.item.enumeration.graphql.description": "Allows you to override the default generated name for GraphQL", + "form.attribute.item.enumeration.name": "Name", "form.attribute.item.enumeration.placeholder": "Ex: morning,noon,evening", - "form.attribute.item.appearance.name": "Appearance", - "form.attribute.item.appearance.label": "Display as a WYSIWYG", - "form.attribute.item.appearance.description": - "Otherwise, the value will be editable through a basic textarea field", - "form.attribute.item.settings.name": "Settings", - "form.attribute.item.requiredField": "Required field", - "form.attribute.item.uniqueField": "Unique field", + "form.attribute.item.enumeration.rules": "Values (separate them with a comma)", + "form.attribute.item.json.name": "Name", + "form.attribute.item.maximum": "Maximum value", + "form.attribute.item.maximumLength": "Maximum length", + "form.attribute.item.media.multiple": "Allow multiple files", + "form.attribute.item.media.name": "Name", "form.attribute.item.minimum": "Minimum value", "form.attribute.item.minimumLength": "Minimum length", - "form.attribute.item.maximumLength": "Maximum length", - "form.attribute.item.maximum": "Maximum value", - "form.attribute.item.requiredField.description": - "You won't be able to create an entry if this field is empty", - "form.attribute.item.uniqueField.description": - "You won't be able to create an entry if there is an existing entry with identical content", - "form.attribute.item.defineRelation.fieldName": "Field name", - "form.attribute.item.customColumnName": "Custom column names", - "form.attribute.item.customColumnName.description": - "This is useful to rename database column names in a more comprehensive format for the API's responses", + "form.attribute.item.number.name": "Name", "form.attribute.item.number.type": "Number format", - "form.attribute.item.number.type.integer": "integer (ex: 10)", - "form.attribute.item.number.type.float": "float (ex: 3.33333333)", "form.attribute.item.number.type.decimal": "decimal (ex: 2.22)", + "form.attribute.item.number.type.float": "float (ex: 3.33333333)", + "form.attribute.item.number.type.integer": "integer (ex: 10)", + "form.attribute.item.requiredField": "Required field", + "form.attribute.item.requiredField.description": "You won't be able to create an entry if this field is empty", + "form.attribute.item.settings.name": "Settings", + "form.attribute.item.string.name": "Name", + "form.attribute.item.textarea.name": "Name", + "form.attribute.item.uniqueField": "Unique field", + "form.attribute.item.uniqueField.description": "You won't be able to create an entry if there is an existing entry with identical content", "form.attribute.settings.default": "Default value", "form.attribute.settings.default.checkboxLabel": "Set to true", - "form.button.cancel": "Cancel", "form.button.continue": "Continue", "form.button.save": "Save", - + "form.contentType.item.collectionName": "Collection Name", + "form.contentType.item.collectionName.inputDescription": "Useful when the name of your Content Type and your table name differ", "form.contentType.item.connections": "Connection", + "form.contentType.item.description": "Description", + "form.contentType.item.description.placeholder": "Write your little description here...", "form.contentType.item.name": "Name", "form.contentType.item.name.description": "Content Type names should be singular: {link}", "form.contentType.item.name.link.description": "Check out our documentation", - "form.contentType.item.description": "Description", - "form.contentType.item.description.placeholder": "Write your little description here...", - "form.contentType.item.collectionName": "Collection Name", - "form.contentType.item.collectionName.inputDescription": - "Useful when the name of your Content Type and your table name differ", - + "from": "from", + "home.contentTypeBuilder.description": "Create and update your own Content Types.", + "home.contentTypeBuilder.name": "Content Types", + "home.emptyAttributes.description": "Add your first field to your new Content Type", + "home.emptyAttributes.title": "There are no fields yet", + "home.emptyContentType.description": "Create your first Content Type to be able to retrieve data from your API.", + "home.emptyContentType.title": "There are no Content Types available", "menu.section.contentTypeBuilder.name.plural": "Content Types", "menu.section.contentTypeBuilder.name.singular": "Content Type", - "menu.section.documentation.name": "Documentation", "menu.section.documentation.guide": "Read more about Content Types in our", "menu.section.documentation.guideLink": "guide.", + "menu.section.documentation.name": "Documentation", "menu.section.documentation.tutorial": "Check out our", "menu.section.documentation.tutorialLink": "tutorial video.", - - "modelPage.contentHeader.emptyDescription.description": - "There is no description for this Content Type", - "modelPage.contentType.list.title.plural": "fields", - "modelPage.contentType.list.title.singular": "field", - "modelPage.contentType.list.title.including": "including", + "modelPage.attribute.relationWith": "Relation with", + "modelPage.contentHeader.emptyDescription.description": "There is no description for this Content Type", "modelPage.contentType.list.relationShipTitle.plural": "relationships", "modelPage.contentType.list.relationShipTitle.singular": "relationship", - "modelPage.attribute.relationWith": "Relation with", - + "modelPage.contentType.list.title.including": "including", + "modelPage.contentType.list.title.plural": "fields", + "modelPage.contentType.list.title.singular": "field", "noTableWarning.description": "Don't forget to create the table `{modelName}` in your database", "noTableWarning.infos": "More info", - "notification.error.message": "An error occurred", - "notification.info.contentType.creating.notSaved": - "Please save your current Content Type before creating a new one", + "notification.info.contentType.creating.notSaved": "Please save your current Content Type before creating a new one", "notification.info.disable": "This field is not editable for the moment...😮", "notification.info.optimized": "This plugin is optimized with your localStorage", - "notification.success.message.contentType.edit": "Your Content Type has been updated", - "notification.success.message.contentType.create": "Your Content Type has been created", "notification.success.contentTypeDeleted": "The Content Type has been deleted", - - "popUpForm.attributes.string.description": "Titles, names, paragraphs, list of names", - "popUpForm.attributes.text.description": "Descriptions, text paragraphs, articles ", + "notification.success.message.contentType.create": "Your Content Type has been created", + "notification.success.message.contentType.edit": "Your Content Type has been updated", + "plugin.description.long": "Modelize the data structure of your API. Create new fields and relations in just a minute. The files are automatically created and updated in your project.", + "plugin.description.short": "Modelize the data structure of your API.", "popUpForm.attributes.boolean.description": "Yes or no, 1 or 0, true or false", - "popUpForm.attributes.number.description": "Everything that is number", - "popUpForm.attributes.date.description": "Event date, opening hours", - "popUpForm.attributes.json.description": "Data in JSON format", - "popUpForm.attributes.media.description": "Images, videos, PDFs and other files", - "popUpForm.attributes.relation.description": "Refers to a Content Type", - "popUpForm.attributes.email.description": "User's email...", - "popUpForm.attributes.password.description": "User password...", - "popUpForm.attributes.enumeration.description": "List of choices", - - "popUpForm.attributes.string.name": "String", - "popUpForm.attributes.text.name": "Text", "popUpForm.attributes.boolean.name": "Boolean", + "popUpForm.attributes.date.description": "Event date, opening hours", "popUpForm.attributes.date.name": "Date", - "popUpForm.attributes.json.name": "JSON", - "popUpForm.attributes.media.name": "Media", - "popUpForm.attributes.number.name": "Number", - "popUpForm.attributes.relation.name": "Relation", + "popUpForm.attributes.email.description": "User's email...", "popUpForm.attributes.email.name": "Email", + "popUpForm.attributes.enumeration.description": "List of choices", + "popUpForm.attributes.enumeration.name": "Enumeration", + "popUpForm.attributes.json.description": "Data in JSON format", + "popUpForm.attributes.json.name": "JSON", + "popUpForm.attributes.media.description": "Images, videos, PDFs and other files", + "popUpForm.attributes.media.name": "Media", + "popUpForm.attributes.number.description": "Everything that is number", + "popUpForm.attributes.number.name": "Number", + "popUpForm.attributes.password.description": "User password...", "popUpForm.attributes.password.name": "Password", - "popUpForm.attributes.enumeration.name": "Enumeration", - "popUpForm.create": "Add New", - "popUpForm.edit": "Edit", - "popUpForm.field": "Field", - "popUpForm.create.contentType.header.title": "Add New Content Type", + "popUpForm.attributes.relation.description": "Refers to a Content Type", + "popUpForm.attributes.relation.name": "Relation", + "popUpForm.attributes.string.description": "Titles, names, paragraphs, list of names", + "popUpForm.attributes.string.name": "String", + "popUpForm.attributes.text.description": "Descriptions, text paragraphs, articles ", + "popUpForm.attributes.text.name": "Text", "popUpForm.choose.attributes.header.title": "Add New Field", + "popUpForm.create": "Add New", + "popUpForm.create.contentType.header.title": "Add New Content Type", + "popUpForm.edit": "Edit", "popUpForm.edit.contentType.header.title": "Edit Content Type", - - "popUpForm.navContainer.relation": "Define relation", - "popUpForm.navContainer.base": "Base settings", + "popUpForm.field": "Field", "popUpForm.navContainer.advanced": "Advanced settings", - + "popUpForm.navContainer.base": "Base settings", + "popUpForm.navContainer.relation": "Define relation", "popUpRelation.title": "Relation", - + "popUpWarning.bodyMessage.attribute.delete": "Are you sure you want to delete this field?", + "popUpWarning.bodyMessage.contentType.delete": "Are you sure you want to delete this Content Type?", "popUpWarning.button.cancel": "Cancel", "popUpWarning.button.confirm": "Confirm", "popUpWarning.title": "Please confirm", - "popUpWarning.bodyMessage.contentType.delete": - "Are you sure you want to delete this Content Type?", - "popUpWarning.bodyMessage.attribute.delete": "Are you sure you want to delete this field?", - - "table.contentType.title.plural": "Content Types are available", - "table.contentType.title.singular": "Content Type is available", - "table.contentType.head.name": "Name", + "relation.attributeName.placeholder": "Ex: author, category, tag", + "relation.manyToMany": "has and belongs to many", + "relation.manyToOne": "has many", + "relation.oneToMany": "belongs to many", + "relation.oneToOne": "has and belongs to one", + "relation.oneWay": "has one", "table.contentType.head.description": "Description", "table.contentType.head.fields": "Fields", - - "relation.oneWay": "has one", - "relation.oneToOne": "has and belongs to one", - "relation.oneToMany": "belongs to many", - "relation.manyToOne": "has many", - "relation.manyToMany": "has and belongs to many", - "relation.attributeName.placeholder": "Ex: author, category, tag" -} + "table.contentType.head.name": "Name", + "table.contentType.title.plural": "Content Types are available", + "table.contentType.title.singular": "Content Type is available" +} \ No newline at end of file diff --git a/packages/strapi-plugin-content-type-builder/admin/src/translations/es.json b/packages/strapi-plugin-content-type-builder/admin/src/translations/es.json index e33ad22ed2..bf7fd8cb9d 100644 --- a/packages/strapi-plugin-content-type-builder/admin/src/translations/es.json +++ b/packages/strapi-plugin-content-type-builder/admin/src/translations/es.json @@ -1,185 +1,157 @@ { - "plugin.description.short": "Modelice la estructura de datos de su API.", - "plugin.description.long": - "Modelice la estructura de datos de su API. Cree nuevos campos y relaciones en sólo un minuto. Los archivos se crean y actualizan automáticamente en el proyecto.", - "attribute.string": "Cadena de texto", - "attribute.text": "Texto", + "attribute.WYSIWYG": "Texto (WYSIWYG)", "attribute.boolean": "Booleano", + "attribute.date": "Fecha", + "attribute.decimal": "Número decimal", + "attribute.email": "Email", + "attribute.enumeration": "Enumeración", "attribute.float": "Número flotante", "attribute.integer": "Número entero", - "attribute.decimal": "Número decimal", - "attribute.date": "Fecha", "attribute.json": "JSON", "attribute.media": "Medios", - "attribute.email": "Email", "attribute.password": "Contraseña", "attribute.relation": "Relación", - "attribute.enumeration": "Enumeración", - "attribute.WYSIWYG": "Texto (WYSIWYG)", - - "contentType.temporaryDisplay": "(No grabado)", - "from": "de", - "home.contentTypeBuilder.name": "Tipos de contenido", - "home.contentTypeBuilder.description": "Cree y actualice sus propios tipos de contenido.", - "home.emptyContentType.title": "No hay tipos de contenido disponibles", - "home.emptyContentType.description": - "Cree su primer tipo de contenido para poder recuperar datos de su API.", - - "home.emptyAttributes.title": "Todavía no hay campos", - "home.emptyAttributes.description": "Añada su primer campo a su nuevo Tipo de contenido", - - "button.contentType.create": "Crear tipo de contenido", - "button.contentType.add": "Agregar tipo de contenido", + "attribute.string": "Cadena de texto", + "attribute.text": "Texto", "button.attributes.add": "Añadir nuevo campo", - - "error.validation.required": "Esta entrada de valor es obligatoria.", - "error.validation.regex": "El valor no coincide con el valor de regex.", - "error.validation.max": "El valor es demasiado alto.", - "error.validation.min": "El valor es demasiado bajo.", - "error.validation.maxLength": "El valor es demasiado largo.", - "error.validation.minLength": "El valor es demasiado corto.", - "error.contentTypeName.taken": "Este nombre ya existe", - "error.attribute.taken": "Este nombre de campo ya existe", + "button.contentType.add": "Agregar tipo de contenido", + "button.contentType.create": "Crear tipo de contenido", + "contentType.temporaryDisplay": "(No grabado)", + "error.attribute.forbidden": "Este nombre de atributo está reservado", "error.attribute.key.taken": "Este valor ya existe", "error.attribute.sameKeyAndName": "No puede ser igual", + "error.attribute.taken": "Este nombre de campo ya existe", + "error.contentTypeName.taken": "Este nombre ya existe", + "error.validation.max": "El valor es demasiado alto.", + "error.validation.maxLength": "El valor es demasiado largo.", + "error.validation.min": "El valor es demasiado bajo.", + "error.validation.minLength": "El valor es demasiado corto.", "error.validation.minSupMax": "No puede ser superior", - "error.attribute.forbidden": "Este nombre de atributo está reservado", - - "form.attribute.item.textarea.name": "Nombre", - "form.attribute.item.number.name": "Nombre", - "form.attribute.item.date.name": "Nombre", - "form.attribute.item.media.name": "Nombre", - "form.attribute.item.media.multiple": "Permitir múltiples archivos", - "form.attribute.item.json.name": "Nombre", + "error.validation.regex": "El valor no coincide con el valor de regex.", + "error.validation.required": "Esta entrada de valor es obligatoria.", + "form.attribute.item.appearance.description": "Si no, el valor será editable a través de un campo textarea básico", + "form.attribute.item.appearance.label": "Mostrar como WYSIWYG", + "form.attribute.item.appearance.name": "Apariencia", "form.attribute.item.boolean.name": "Nombre", - "form.attribute.item.string.name": "Nombre", - "form.attribute.item.enumeration.name": "Nombre", - "form.attribute.item.enumeration.rules": "Valores (sepárelos con una coma)", + "form.attribute.item.customColumnName": "Nombres de columna personalizados", + "form.attribute.item.customColumnName.description": "Esto es útil para renombrar los nombres de las columnas de la base de datos en un formato más completo para las respuestas de la API.", + "form.attribute.item.date.name": "Nombre", + "form.attribute.item.defineRelation.fieldName": "Nombre del campo", "form.attribute.item.enumeration.graphql": "Sobreescritura de nombre para GraphQL", "form.attribute.item.enumeration.graphql.description": "Le permite redefinir el nombre generado por defecto para GraphQL", + "form.attribute.item.enumeration.name": "Nombre", "form.attribute.item.enumeration.placeholder": "Ej: mañana, mediodía, noche", - "form.attribute.item.appearance.name": "Apariencia", - "form.attribute.item.appearance.label": "Mostrar como WYSIWYG", - "form.attribute.item.appearance.description": - "Si no, el valor será editable a través de un campo textarea básico", - "form.attribute.item.settings.name": "Ajustes", - "form.attribute.item.requiredField": "Campo obligatorio", - "form.attribute.item.uniqueField": "Campo único", + "form.attribute.item.enumeration.rules": "Valores (sepárelos con una coma)", + "form.attribute.item.json.name": "Nombre", + "form.attribute.item.maximum": "Valor máximo", + "form.attribute.item.maximumLength": "Longitud máxima", + "form.attribute.item.media.multiple": "Permitir múltiples archivos", + "form.attribute.item.media.name": "Nombre", "form.attribute.item.minimum": "Valor mínimo", "form.attribute.item.minimumLength": "Longitud mínima", - "form.attribute.item.maximumLength": "Longitud máxima", - "form.attribute.item.maximum": "Valor máximo", - "form.attribute.item.requiredField.description": - "No podrá crear una entrada si este campo está vacío", - "form.attribute.item.uniqueField.description": - "No podrá crear una entrada si hay una entrada existente con contenido idéntico", - "form.attribute.item.defineRelation.fieldName": "Nombre del campo", - "form.attribute.item.customColumnName": "Nombres de columna personalizados", - "form.attribute.item.customColumnName.description": - "Esto es útil para renombrar los nombres de las columnas de la base de datos en un formato más completo para las respuestas de la API.", + "form.attribute.item.number.name": "Nombre", "form.attribute.item.number.type": "Formato de número", - "form.attribute.item.number.type.integer": "entero (ej: 10)", - "form.attribute.item.number.type.float": "flotante (ex: 3.3333333333)", "form.attribute.item.number.type.decimal": "decimal (ex: 2.22)", + "form.attribute.item.number.type.float": "flotante (ex: 3.3333333333)", + "form.attribute.item.number.type.integer": "entero (ej: 10)", + "form.attribute.item.requiredField": "Campo obligatorio", + "form.attribute.item.requiredField.description": "No podrá crear una entrada si este campo está vacío", + "form.attribute.item.settings.name": "Ajustes", + "form.attribute.item.string.name": "Nombre", + "form.attribute.item.textarea.name": "Nombre", + "form.attribute.item.uniqueField": "Campo único", + "form.attribute.item.uniqueField.description": "No podrá crear una entrada si hay una entrada existente con contenido idéntico", "form.attribute.settings.default": "Valor por defecto", "form.attribute.settings.default.checkboxLabel": "Ajustar a verdadero", - "form.button.cancel": "Cancelar", "form.button.continue": "Continuar", "form.button.save": "Guardar", - + "form.contentType.item.collectionName": "Nombre de la colección", + "form.contentType.item.collectionName.inputDescription": "Útil cuando el nombre de su tipo de contenido y el nombre de su tabla difieren", "form.contentType.item.connections": "Conexión", + "form.contentType.item.description": "Descripción", + "form.contentType.item.description.placeholder": "Escribe aquí tu breve descripción...", "form.contentType.item.name": "Nombre", "form.contentType.item.name.description": "Los nombres de los tipos de contenido deben ser singulares: {link}", "form.contentType.item.name.link.description": "Consulte nuestra documentación", - "form.contentType.item.description": "Descripción", - "form.contentType.item.description.placeholder": "Escribe aquí tu breve descripción...", - "form.contentType.item.collectionName": "Nombre de la colección", - "form.contentType.item.collectionName.inputDescription": - "Útil cuando el nombre de su tipo de contenido y el nombre de su tabla difieren", - + "from": "de", + "home.contentTypeBuilder.description": "Cree y actualice sus propios tipos de contenido.", + "home.contentTypeBuilder.name": "Tipos de contenido", + "home.emptyAttributes.description": "Añada su primer campo a su nuevo Tipo de contenido", + "home.emptyAttributes.title": "Todavía no hay campos", + "home.emptyContentType.description": "Cree su primer tipo de contenido para poder recuperar datos de su API.", + "home.emptyContentType.title": "No hay tipos de contenido disponibles", "menu.section.contentTypeBuilder.name.plural": "Tipos de contenido", "menu.section.contentTypeBuilder.name.singular": "Tipo de contenido", - "menu.section.documentation.name": "Documentación", "menu.section.documentation.guide": "Lea más acerca de los Tipos de Contenido en nuestro", "menu.section.documentation.guideLink": "guía.", + "menu.section.documentation.name": "Documentación", "menu.section.documentation.tutorial": "Echa un vistazo a nuestro", "menu.section.documentation.tutorialLink": "video tutorial.", - - "modelPage.contentHeader.emptyDescription.description": - "No hay descripción para este Tipo de Contenido", - "modelPage.contentType.list.title.plural": "campos", - "modelPage.contentType.list.title.singular": "campo", - "modelPage.contentType.list.title.including": "incluyendo", + "modelPage.attribute.relationWith": "Vinculación con", + "modelPage.contentHeader.emptyDescription.description": "No hay descripción para este Tipo de Contenido", "modelPage.contentType.list.relationShipTitle.plural": "vinculaciones", "modelPage.contentType.list.relationShipTitle.singular": "vinculacion", - "modelPage.attribute.relationWith": "Vinculación con", - + "modelPage.contentType.list.title.including": "incluyendo", + "modelPage.contentType.list.title.plural": "campos", + "modelPage.contentType.list.title.singular": "campo", "noTableWarning.description": "No olvide crear la tabla `{modelName}` en su base de datos", "noTableWarning.infos": "Más información", - "notification.error.message": "Se ha producido un error", - "notification.info.contentType.creating.notSaved": - "Por favor, guarde su Tipo de Contenido actual antes de crear uno nuevo", + "notification.info.contentType.creating.notSaved": "Por favor, guarde su Tipo de Contenido actual antes de crear uno nuevo", "notification.info.disable": "Este campo no es editable por el momento....😮", "notification.info.optimized": "Este plugin está optimizado para su localStorage", - "notification.success.message.contentType.edit": "Su Tipo de Contenido ha sido actualizado", - "notification.success.message.contentType.create": "Su Tipo de Contenido ha sido creado", "notification.success.contentTypeDeleted": "El Tipo de Contenido ha sido eliminado", - - "popUpForm.attributes.string.description": "Títulos, nombres, párrafos, lista de nombres", - "popUpForm.attributes.text.description": "Descripciones, párrafos de texto, artículos ", + "notification.success.message.contentType.create": "Su Tipo de Contenido ha sido creado", + "notification.success.message.contentType.edit": "Su Tipo de Contenido ha sido actualizado", + "plugin.description.long": "Modelice la estructura de datos de su API. Cree nuevos campos y relaciones en sólo un minuto. Los archivos se crean y actualizan automáticamente en el proyecto.", + "plugin.description.short": "Modelice la estructura de datos de su API.", "popUpForm.attributes.boolean.description": "Sí o no, 1 o 0, verdadero o falso", - "popUpForm.attributes.number.description": "Todo lo que es número", - "popUpForm.attributes.date.description": "Fecha del evento, horario de apertura", - "popUpForm.attributes.json.description": "Datos en formato JSON", - "popUpForm.attributes.media.description": "Imágenes, vídeos, PDFs y otros archivos", - "popUpForm.attributes.relation.description": "Se refiere a un Tipo de Contenido", - "popUpForm.attributes.email.description": "Email del usuario...", - "popUpForm.attributes.password.description": "Contraseña de usuario...", - "popUpForm.attributes.enumeration.description": "Lista de opciones", - - "popUpForm.attributes.string.name": "Cadena de texto", - "popUpForm.attributes.text.name": "Texto", "popUpForm.attributes.boolean.name": "Booleano", + "popUpForm.attributes.date.description": "Fecha del evento, horario de apertura", "popUpForm.attributes.date.name": "Fecha", - "popUpForm.attributes.json.name": "JSON", - "popUpForm.attributes.media.name": "Medios", - "popUpForm.attributes.number.name": "Número", - "popUpForm.attributes.relation.name": "Relación", + "popUpForm.attributes.email.description": "Email del usuario...", "popUpForm.attributes.email.name": "Email", + "popUpForm.attributes.enumeration.description": "Lista de opciones", + "popUpForm.attributes.enumeration.name": "Enumeración", + "popUpForm.attributes.json.description": "Datos en formato JSON", + "popUpForm.attributes.json.name": "JSON", + "popUpForm.attributes.media.description": "Imágenes, vídeos, PDFs y otros archivos", + "popUpForm.attributes.media.name": "Medios", + "popUpForm.attributes.number.description": "Todo lo que es número", + "popUpForm.attributes.number.name": "Número", + "popUpForm.attributes.password.description": "Contraseña de usuario...", "popUpForm.attributes.password.name": "Contraseña", - "popUpForm.attributes.enumeration.name": "Enumeración", - "popUpForm.create": "Añadir Nuevo", - "popUpForm.edit": "Editar", - "popUpForm.field": "Campo", - "popUpForm.create.contentType.header.title": "Añadir nuevo Tipo de Contenido", + "popUpForm.attributes.relation.description": "Se refiere a un Tipo de Contenido", + "popUpForm.attributes.relation.name": "Relación", + "popUpForm.attributes.string.description": "Títulos, nombres, párrafos, lista de nombres", + "popUpForm.attributes.string.name": "Cadena de texto", + "popUpForm.attributes.text.description": "Descripciones, párrafos de texto, artículos ", + "popUpForm.attributes.text.name": "Texto", "popUpForm.choose.attributes.header.title": "Añadir Nuevo Campo", + "popUpForm.create": "Añadir Nuevo", + "popUpForm.create.contentType.header.title": "Añadir nuevo Tipo de Contenido", + "popUpForm.edit": "Editar", "popUpForm.edit.contentType.header.title": "Editar Tipo de Contenido", - - "popUpForm.navContainer.relation": "Definir vinculación", - "popUpForm.navContainer.base": "Ajustes básicos", + "popUpForm.field": "Campo", "popUpForm.navContainer.advanced": "Configuración avanzada", - + "popUpForm.navContainer.base": "Ajustes básicos", + "popUpForm.navContainer.relation": "Definir vinculación", "popUpRelation.title": "Relación", - + "popUpWarning.bodyMessage.attribute.delete": "¿Está seguro de que desea borrar este campo?", + "popUpWarning.bodyMessage.contentType.delete": "¿Está seguro de que desea eliminar este tipo de contenido?", "popUpWarning.button.cancel": "Cancelar", "popUpWarning.button.confirm": "Confirmar", "popUpWarning.title": "Por favor, confirme", - "popUpWarning.bodyMessage.contentType.delete": - "¿Está seguro de que desea eliminar este tipo de contenido?", - "popUpWarning.bodyMessage.attribute.delete": "¿Está seguro de que desea borrar este campo?", - - "table.contentType.title.plural": "Tipos de Contenido disponibles", - "table.contentType.title.singular": "Tipo de contenido está disponible", - "table.contentType.head.name": "Nombre", + "relation.attributeName.placeholder": "Ej: autor, categoría, etiqueta", + "relation.manyToMany": "tiene y pertenece a muchos", + "relation.manyToOne": "tiene muchos", + "relation.oneToMany": "pertenece a muchos", + "relation.oneToOne": "tiene y pertenece a una", + "relation.oneWay": "tiene uno", "table.contentType.head.description": "Descripción", "table.contentType.head.fields": "Campos", - - "relation.oneWay": "tiene uno", - "relation.oneToOne": "tiene y pertenece a una", - "relation.oneToMany": "pertenece a muchos", - "relation.manyToOne": "tiene muchos", - "relation.manyToMany": "tiene y pertenece a muchos", - "relation.attributeName.placeholder": "Ej: autor, categoría, etiqueta" -} + "table.contentType.head.name": "Nombre", + "table.contentType.title.plural": "Tipos de Contenido disponibles", + "table.contentType.title.singular": "Tipo de contenido está disponible" +} \ No newline at end of file diff --git a/packages/strapi-plugin-content-type-builder/admin/src/translations/fr.json b/packages/strapi-plugin-content-type-builder/admin/src/translations/fr.json index 2a58868e0f..b2781793fe 100644 --- a/packages/strapi-plugin-content-type-builder/admin/src/translations/fr.json +++ b/packages/strapi-plugin-content-type-builder/admin/src/translations/fr.json @@ -1,186 +1,158 @@ { - "plugin.description.short": "Modélisez la structure de données de votre API.", - "plugin.description.long": - "Modélisez la structure de données de votre API. Créer des nouveaux champs et relations en un instant. Les fichiers se créent et se mettent à jour automatiquement.", - "attribute.string": "Chaîne de caractères", - "attribute.text": "Texte", + "attribute.WYSIWYG": "Text (WYSIWYG)", "attribute.boolean": "Booléen", + "attribute.date": "Date", + "attribute.decimal": "Décimal", + "attribute.email": "Email", + "attribute.enumeration": "Énumération", "attribute.float": "Décimal approximatif", "attribute.integer": "Entier", - "attribute.decimal": "Décimal", - "attribute.date": "Date", "attribute.json": "JSON", "attribute.media": "Média", "attribute.password": "Mot de passe", - "attribute.email": "Email", "attribute.relation": "Relation", - "attribute.enumeration": "Énumération", - "attribute.WYSIWYG": "Text (WYSIWYG)", - - "contentType.temporaryDisplay": "(Non sauvegardé)", - - "from": "De", - - "home.contentTypeBuilder.name": "Content Types", - "home.contentTypeBuilder.description": "Créez, éditer vos modèles.", - "home.emptyContentType.title": "Il n'y a pas de model disponible", - "home.emptyContentType.description": "Créez votre premier modèle...", - - "home.emptyAttributes.title": "Il n'y a pas encore de champ", - "home.emptyAttributes.description": "Ajoutez votre premier champ a votre modèle", - - "button.contentType.create": "Créer un modèle", - "button.contentType.add": "Ajouter un modèle", + "attribute.string": "Chaîne de caractères", + "attribute.text": "Texte", "button.attributes.add": "Ajouter un champ", - - "error.validation.required": "Ce champ est obligatoire.", - "error.validation.regex": "La valeur ne correspond pas au format attendu.", - "error.validation.max": "La valeur est trop grande.", - "error.validation.min": "La valeur est trop basse.", - "error.validation.maxLength": "La valeur est trop longue.", - "error.validation.minLength": "La valeur est trop courte.", - "error.contentTypeName.taken": "Ce nom existe déjà", - "error.attribute.taken": "Ce champ existe déjà", + "button.contentType.add": "Ajouter un modèle", + "button.contentType.create": "Créer un modèle", + "contentType.temporaryDisplay": "(Non sauvegardé)", + "error.attribute.forbidden": "Cet attribut est réservé", "error.attribute.key.taken": "Cette valeur existe déjà", "error.attribute.sameKeyAndName": "Ne peuvent pas être égaux", + "error.attribute.taken": "Ce champ existe déjà", + "error.contentTypeName.taken": "Ce nom existe déjà", + "error.validation.max": "La valeur est trop grande.", + "error.validation.maxLength": "La valeur est trop longue.", + "error.validation.min": "La valeur est trop basse.", + "error.validation.minLength": "La valeur est trop courte.", "error.validation.minSupMax": "Ne peut pas être plus grand", - "error.attribute.forbidden": "Cet attribut est réservé", - - "form.attribute.item.textarea.name": "Nom", - "form.attribute.item.date.name": "Nom", + "error.validation.regex": "La valeur ne correspond pas au format attendu.", + "error.validation.required": "Ce champ est obligatoire.", + "form.attribute.item.appearance.description": "Sinon, il sera editable à partir d'une simple textarea", + "form.attribute.item.appearance.label": "Editable avec un WYSIWYG", + "form.attribute.item.appearance.name": "Apparence", "form.attribute.item.boolean.name": "Nom", - "form.attribute.item.number.name": "Nom", - "form.attribute.item.json.name": "Nom", - "form.attribute.item.media.name": "Nom", - "form.attribute.item.media.multiple": "Peut être relié à plusieurs fichiers", - "form.attribute.item.string.name": "Nom", - "form.attribute.item.enumeration.name": "Nom", - "form.attribute.item.enumeration.rules": "Valeurs (les séparer par une virgule)", + "form.attribute.item.customColumnName": "Nom de colonne custom", + "form.attribute.item.customColumnName.description": "Pratique pour renommer la colonne de la db dans un format plus comprehensible pour les responses de l'API", + "form.attribute.item.date.name": "Nom", + "form.attribute.item.defineRelation.fieldName": "Nom du Champ", "form.attribute.item.enumeration.graphql": "Surchage du nom pour GraphQL", "form.attribute.item.enumeration.graphql.description": "Vous permet de remplacer le nom généré par défaut pour GraphQL", + "form.attribute.item.enumeration.name": "Nom", "form.attribute.item.enumeration.placeholder": "Ex: matin,midi,soir", - "form.attribute.item.appearance.name": "Apparence", - "form.attribute.item.appearance.label": "Editable avec un WYSIWYG", - "form.attribute.item.appearance.description": - "Sinon, il sera editable à partir d'une simple textarea", - "form.attribute.item.settings.name": "Paramètres", - "form.attribute.item.requiredField": "Champ obligatoire", - "form.attribute.item.uniqueField": "Champ unique", - "form.attribute.item.minimumLength": "Taille minimun", - "form.attribute.item.minimum": "Valeur minimun", + "form.attribute.item.enumeration.rules": "Valeurs (les séparer par une virgule)", + "form.attribute.item.json.name": "Nom", "form.attribute.item.maximum": "Valeur maximum", "form.attribute.item.maximumLength": "Taille maximum", - "form.attribute.item.requiredField.description": - "Vous ne pourrez pas créer une entrée si ce champ est vide", - "form.attribute.item.uniqueField.description": - "Vous ne pourrez pas créer une entrée s'il existe un champ similaire", - "form.attribute.item.defineRelation.fieldName": "Nom du Champ", - "form.attribute.item.customColumnName": "Nom de colonne custom", - "form.attribute.item.customColumnName.description": - "Pratique pour renommer la colonne de la db dans un format plus comprehensible pour les responses de l'API", + "form.attribute.item.media.multiple": "Peut être relié à plusieurs fichiers", + "form.attribute.item.media.name": "Nom", + "form.attribute.item.minimum": "Valeur minimun", + "form.attribute.item.minimumLength": "Taille minimun", + "form.attribute.item.number.name": "Nom", "form.attribute.item.number.type": "Format nombre", - "form.attribute.item.number.type.integer": "entier (ex: 10)", - "form.attribute.item.number.type.float": "décimal approximatif (ex: 3,33333)", "form.attribute.item.number.type.decimal": "décimal (ex: 2,22)", + "form.attribute.item.number.type.float": "décimal approximatif (ex: 3,33333)", + "form.attribute.item.number.type.integer": "entier (ex: 10)", + "form.attribute.item.requiredField": "Champ obligatoire", + "form.attribute.item.requiredField.description": "Vous ne pourrez pas créer une entrée si ce champ est vide", + "form.attribute.item.settings.name": "Paramètres", + "form.attribute.item.string.name": "Nom", + "form.attribute.item.textarea.name": "Nom", + "form.attribute.item.uniqueField": "Champ unique", + "form.attribute.item.uniqueField.description": "Vous ne pourrez pas créer une entrée s'il existe un champ similaire", "form.attribute.settings.default": "Valeur par défault", "form.attribute.settings.default.checkboxLabel": "Définir à true", - "form.button.cancel": "Annuler", "form.button.continue": "Continue", "form.button.save": "Sauvegarder", - + "form.contentType.item.collectionName": "Nom de la Collection", + "form.contentType.item.collectionName.inputDescription": "Pratique quand le Nom de votre Modèle et de votre table sont différents", "form.contentType.item.connections": "Connexion", + "form.contentType.item.description": "Description", + "form.contentType.item.description.placeholder": "Ecrivez votre petite description ici...", "form.contentType.item.name": "Nom", "form.contentType.item.name.description": "Les noms de modèles doivent être au singulier, {link}", "form.contentType.item.name.link.description": "regardez la documentation", - "form.contentType.item.description": "Description", - "form.contentType.item.description.placeholder": "Ecrivez votre petite description ici...", - "form.contentType.item.collectionName": "Nom de la Collection", - "form.contentType.item.collectionName.inputDescription": - "Pratique quand le Nom de votre Modèle et de votre table sont différents", - + "from": "De", + "home.contentTypeBuilder.description": "Créez, éditer vos modèles.", + "home.contentTypeBuilder.name": "Content Types", + "home.emptyAttributes.description": "Ajoutez votre premier champ a votre modèle", + "home.emptyAttributes.title": "Il n'y a pas encore de champ", + "home.emptyContentType.description": "Créez votre premier modèle...", + "home.emptyContentType.title": "Il n'y a pas de model disponible", "menu.section.contentTypeBuilder.name.plural": "Modèles", "menu.section.contentTypeBuilder.name.singular": "Modèle", - "menu.section.documentation.name": "Documentation", "menu.section.documentation.guide": "Découvrez plus à propose des modèles dans notre", "menu.section.documentation.guideLink": "guide.", + "menu.section.documentation.name": "Documentation", "menu.section.documentation.tutorial": "Découvrez notre", "menu.section.documentation.tutorialLink": "tuto vidéo.", - - "modelPage.contentHeader.emptyDescription.description": - "Il n'y a pas de description pour ce modèle", - "modelPage.contentType.list.title.plural": "champs", - "modelPage.contentType.list.title.singular": "champ", - "modelPage.contentType.list.title.including": "dont", + "modelPage.attribute.relationWith": "Relation avec", + "modelPage.contentHeader.emptyDescription.description": "Il n'y a pas de description pour ce modèle", "modelPage.contentType.list.relationShipTitle.plural": "relations", "modelPage.contentType.list.relationShipTitle.singular": "relation", - - "modelPage.attribute.relationWith": "Relation avec", - + "modelPage.contentType.list.title.including": "dont", + "modelPage.contentType.list.title.plural": "champs", + "modelPage.contentType.list.title.singular": "champ", "noTableWarning.description": "N'oubliez pas de créer la table `{modelName}` dans votre database", "noTableWarning.infos": "Plus d'infos", - "notification.error.message": "Une erreur est survenue", - "notification.info.contentType.creating.notSaved": - "Sauvegardez votre Modèle en cours avant d'en créer un nouveau", + "notification.info.contentType.creating.notSaved": "Sauvegardez votre Modèle en cours avant d'en créer un nouveau", "notification.info.disable": "Ce champ n'est pas modifiable pour le moment...😮", "notification.info.optimized": "Ce plugin est optimisé pour votre localStorage", - "notification.success.message.contentType.edit": "Votre modèle a bien été modifié", - "notification.success.message.contentType.create": "Votre modèle a bien été créée", "notification.success.contentTypeDeleted": "Le modèle a bien été supprimé.", - - "popUpForm.attributes.enumeration.name": "Énumération", - "popUpForm.attributes.string.description": "Titres, noms,...", - "popUpForm.attributes.text.description": "Descriptions, paragraphes texte, articles ", - "popUpForm.attributes.number.description": "Tout ce qui est nombre", + "notification.success.message.contentType.create": "Votre modèle a bien été créée", + "notification.success.message.contentType.edit": "Votre modèle a bien été modifié", + "plugin.description.long": "Modélisez la structure de données de votre API. Créer des nouveaux champs et relations en un instant. Les fichiers se créent et se mettent à jour automatiquement.", + "plugin.description.short": "Modélisez la structure de données de votre API.", "popUpForm.attributes.boolean.description": "Oui ou non, 1 ou 0, vrai ou faux", - "popUpForm.attributes.date.description": "Date événements, horaires", - "popUpForm.attributes.json.description": "Données au format JSON", - "popUpForm.attributes.media.description": "Images, vidéos, PDFs et autres fichiers", - "popUpForm.attributes.relation.description": "Pointe vers un autre Modèle", - "popUpForm.attributes.password.description": "Mot de passe utilisateur...", - "popUpForm.attributes.email.description": "Email utilisateurs", - "popUpForm.attributes.enumeration.description": "Liste de choix", - - "popUpForm.attributes.string.name": "Chaîne de caractères", - "popUpForm.attributes.text.name": "Texte", "popUpForm.attributes.boolean.name": "Booléen", - "popUpForm.attributes.number.name": "Nombre", + "popUpForm.attributes.date.description": "Date événements, horaires", "popUpForm.attributes.date.name": "Date", - "popUpForm.attributes.json.name": "JSON", - "popUpForm.attributes.media.name": "Média", - "popUpForm.attributes.relation.name": "Relation", + "popUpForm.attributes.email.description": "Email utilisateurs", "popUpForm.attributes.email.name": "Email", - "popUpForm.attributes.password.name": "Mot de passe", "popUpForm.attributes.enumeration": "Énumération", - "popUpForm.create": "Ajouter un Nouveau", - "popUpForm.edit": "Modifer", - "popUpForm.field": "Champ", - "popUpForm.create.contentType.header.title": "Ajouter un Nouveau Modèle", + "popUpForm.attributes.enumeration.description": "Liste de choix", + "popUpForm.attributes.enumeration.name": "Énumération", + "popUpForm.attributes.json.description": "Données au format JSON", + "popUpForm.attributes.json.name": "JSON", + "popUpForm.attributes.media.description": "Images, vidéos, PDFs et autres fichiers", + "popUpForm.attributes.media.name": "Média", + "popUpForm.attributes.number.description": "Tout ce qui est nombre", + "popUpForm.attributes.number.name": "Nombre", + "popUpForm.attributes.password.description": "Mot de passe utilisateur...", + "popUpForm.attributes.password.name": "Mot de passe", + "popUpForm.attributes.relation.description": "Pointe vers un autre Modèle", + "popUpForm.attributes.relation.name": "Relation", + "popUpForm.attributes.string.description": "Titres, noms,...", + "popUpForm.attributes.string.name": "Chaîne de caractères", + "popUpForm.attributes.text.description": "Descriptions, paragraphes texte, articles ", + "popUpForm.attributes.text.name": "Texte", "popUpForm.choose.attributes.header.title": "Ajouter un Nouveau Champ", + "popUpForm.create": "Ajouter un Nouveau", + "popUpForm.create.contentType.header.title": "Ajouter un Nouveau Modèle", + "popUpForm.edit": "Modifer", "popUpForm.edit.contentType.header.title": "Modifier un Modèle", - "popUpForm.navContainer.relation": "Définir relation", - "popUpForm.navContainer.base": "Réglages de base", + "popUpForm.field": "Champ", "popUpForm.navContainer.advanced": "Réglages avancés", - + "popUpForm.navContainer.base": "Réglages de base", + "popUpForm.navContainer.relation": "Définir relation", + "popUpRelation.title": "Relation", + "popUpWarning.bodyMessage.attribute.delete": "Êtes-vous sûre de vouloir supprimer ce champ?", + "popUpWarning.bodyMessage.contentType.delete": "Êtes-vous sûre de vouloir supprimer ce modèle?", "popUpWarning.button.cancel": "Annuler", "popUpWarning.button.confirm": "Confirmer", "popUpWarning.title": "Merci de confirmer", - "popUpWarning.bodyMessage.contentType.delete": "Êtes-vous sûre de vouloir supprimer ce modèle?", - "popUpWarning.bodyMessage.attribute.delete": "Êtes-vous sûre de vouloir supprimer ce champ?", - - "popUpRelation.title": "Relation", - - "table.contentType.title.plural": "Modèles sont disponibles", - "table.contentType.title.singular": "Modèle est disponible", - "table.contentType.head.name": "Nom", + "relation.attributeName.placeholder": "Ex: auteur, catégorie, tag", + "relation.manyToMany": "a plusieurs", + "relation.manyToOne": "a plusieurs", + "relation.oneToMany": "appartient a", + "relation.oneToOne": "a un ", + "relation.oneWay": "a un", "table.contentType.head.description": "Description", "table.contentType.head.fields": "Champs", - - "relation.oneToOne": "a un ", - "relation.oneToMany": "appartient a", - "relation.oneWay": "a un", - "relation.manyToOne": "a plusieurs", - "relation.manyToMany": "a plusieurs", - "relation.attributeName.placeholder": "Ex: auteur, catégorie, tag" -} + "table.contentType.head.name": "Nom", + "table.contentType.title.plural": "Modèles sont disponibles", + "table.contentType.title.singular": "Modèle est disponible" +} \ No newline at end of file diff --git a/packages/strapi-plugin-content-type-builder/admin/src/translations/it.json b/packages/strapi-plugin-content-type-builder/admin/src/translations/it.json index a4799f2e3a..7192efca4e 100644 --- a/packages/strapi-plugin-content-type-builder/admin/src/translations/it.json +++ b/packages/strapi-plugin-content-type-builder/admin/src/translations/it.json @@ -1,157 +1,157 @@ { - "plugin.description.short": "Modellizzare la struttura dei dati dell'API.", - "plugin.description.long": "Modellizzare la struttura dei dati dell'API. Creare nuovi campi e le relazioni che in un solo minuto. I file vengono automaticamente creati e aggiornati nel tuo progetto.", - "attribute.string": "String", - "attribute.text": "Testo", - "attribute.boolean": "Boolean", - "attribute.float": "Float", - "attribute.integer": "intero", - "attribute.decimal": "Decimale", - "attribute.date": "Data", - "attribute.json": "JSON", - "attribute.media": "Media", - "attribute.email": "Email", - "attribute.password": "Password", - "attribute.relation": "Relazione", - "attribute.enumeration": "Enumerazione", - "attribute.WYSIWYG": "Text (WYSIWYG)", - "contentType.temporaryDisplay": "(Non salvati)", - "from": "da", - "home.contentTypeBuilder.name": "I Tipi Di Contenuto", - "home.contentTypeBuilder.description": "Creare e aggiornare il tuo tipo di Contenuto.", - "home.emptyContentType.title": "Non ci sono Tipi di Contenuto disponibili", - "home.emptyContentType.description": "Crea il tuo primo Tipo di Contenuto per essere in grado di recuperare dati da API.", - "home.emptyAttributes.title": "Non ci sono campi ancora", - "home.emptyAttributes.description": "Aggiungi il tuo primo campo per il nuovo Tipo di Contenuto", - "button.contentType.create": "Creare Un Tipo Di Contenuto", - "button.contentType.add": "Aggiungi Tipo Di Contenuto", - "button.attributes.add": "Aggiungi Un Nuovo Campo", - "error.validation.required": "Questo valore è richiesto l'input.", - "error.validation.regex": "Il valore non corrisponde all'espressione regolare.", - "error.validation.max": "Il valore è troppo alto.", - "error.validation.min": "Il valore è troppo basso.", - "error.validation.maxLength": "Il valore è troppo lungo.", - "error.validation.minLength": "Il valore è troppo breve.", - "error.contentTypeName.taken": "Questo nome esiste già", - "error.attribute.taken": "Questo campo nome esiste già", - "error.attribute.key.taken": "Questo valore esiste già", - "error.attribute.sameKeyAndName": "Non può essere uguale", - "error.validation.minSupMax": "Non può essere superiore", - "error.attribute.forbidden": "Questo attributo nome è riservato", - "form.attribute.item.textarea.name": "Nome", - "form.attribute.item.number.name": "Nome", - "form.attribute.item.date.name": "Nome", - "form.attribute.item.media.name": "Nome", - "form.attribute.item.media.multiple": "Consentire a più file", - "form.attribute.item.json.name": "Nome", - "form.attribute.item.boolean.name": "Nome", - "form.attribute.item.string.name": "Nome", - "form.attribute.item.enumeration.name": "Nome", - "form.attribute.item.enumeration.rules": "Valori (separati da una virgola)", - "form.attribute.item.enumeration.graphql": "Nome override per GraphQL", - "form.attribute.item.enumeration.graphql.description": "Consente di ignorare l'impostazione predefinita generata nome per GraphQL", - "form.attribute.item.enumeration.placeholder": "Ex: mattina,mezzogiorno,sera", - "form.attribute.item.appearance.name": "Aspetto", - "form.attribute.item.appearance.label": "Visualizza come un WYSIWYG", - "form.attribute.item.appearance.description": "In caso contrario, il valore sarà modificabile tramite una semplice textarea campo", - "form.attribute.item.settings.name": "Impostazioni", - "form.attribute.item.requiredField": "Campo obbligatorio", - "form.attribute.item.uniqueField": "Unico campo", - "form.attribute.item.minimum": "Valore minimo", - "form.attribute.item.minimumLength": "Lunghezza minima", - "form.attribute.item.maximumLength": "Lunghezza massima", - "form.attribute.item.maximum": "Valore massimo", - "form.attribute.item.requiredField.description": "Non sarà in grado di creare una voce se questo campo è vuoto", - "form.attribute.item.uniqueField.description": "Non sarà in grado di creare una voce, se c'è una voce esistente con contenuti identici", - "form.attribute.item.defineRelation.fieldName": "Nome del campo", - "form.attribute.item.customColumnName": "Nomi di colonna personalizzata", - "form.attribute.item.customColumnName.description": "Questo è utile per rinominare il database di nomi di colonna in un più ampio formato per le API risposte", - "form.attribute.item.number.type": "Il formato del numero di", - "form.attribute.item.number.type.integer": "intero (es: 10)", - "form.attribute.item.number.type.float": "float (ex: 3.33333333)", - "form.attribute.item.number.type.decimal": "decimale (es: 2.22)", - "form.attribute.settings.default": "Valore di Default", - "form.attribute.settings.default.checkboxLabel": "Impostare su true", - "form.button.cancel": "Annulla", - "form.button.continue": "Continua", - "form.button.save": "Salva", - "form.contentType.item.connections": "Collegamento", - "form.contentType.item.name": "Nome", - "form.contentType.item.name.description": "Tipo di contenuto nomi singolari: {link}", - "form.contentType.item.name.link.description": "Scopri la nostra documentazione", - "form.contentType.item.description": "Descrizione", - "form.contentType.item.description.placeholder": "Scrivi la tua piccola descrizione qui...", - "form.contentType.item.collectionName": "Nome Della Collezione", - "form.contentType.item.collectionName.inputDescription": "Utile quando il nome del Tipo di Contenuto e il nome della tabella differiscono", - "menu.section.contentTypeBuilder.name.plural": "I Tipi Di Contenuto", - "menu.section.contentTypeBuilder.name.singular": "Tipo Di Contenuto", - "menu.section.documentation.name": "Documentazione", - "menu.section.documentation.guide": "Per saperne di più sui Tipi di Contenuto nel nostro", - "menu.section.documentation.guideLink": "guida.", - "menu.section.documentation.tutorial": "Check out nostro", - "menu.section.documentation.tutorialLink": "video tutorial.", - "modelPage.contentHeader.emptyDescription.description": "Non vi è alcuna descrizione per questo Tipo di Contenuto", - "modelPage.contentType.list.title.plural": "campi", - "modelPage.contentType.list.title.singular": "campo", - "modelPage.contentType.list.title.including": "compresi", - "modelPage.contentType.list.relationShipTitle.plural": "relazioni", - "modelPage.contentType.list.relationShipTitle.singular": "rapporto", - "modelPage.attribute.relationWith": "Relazione con", - "noTableWarning.description": "Non dimenticare di creare la tabella \" {modelName}` nel database", - "noTableWarning.infos": "Ulteriori informazioni", - "notification.error.message": "Si è verificato un errore", - "notification.info.contentType.creating.notSaved": "Si prega di salvare il Tipo di Contenuto prima di crearne uno nuovo", - "notification.info.disable": "Questo campo non è modificabile per il momento...😮", - "notification.info.optimized": "Questo plugin è ottimizzato con il localStorage", - "notification.success.message.contentType.edit": "Il Tipo di Contenuto è stato aggiornato", - "notification.success.message.contentType.create": "Il Tipo di Contenuto è stato creato", - "notification.success.contentTypeDeleted": "Il Tipo di Contenuto è stato eliminato", - "popUpForm.attributes.string.description": "Titoli, nomi, paragrafi, liste di nomi", - "popUpForm.attributes.text.description": "Descrizioni, paragrafi di testo, articoli ", - "popUpForm.attributes.boolean.description": "Sì o no, 1 o 0, vero o falso", - "popUpForm.attributes.number.description": "Tutto ciò che è il numero", - "popUpForm.attributes.date.description": "Data dell'evento, gli orari di apertura", - "popUpForm.attributes.json.description": "I dati in formato JSON", - "popUpForm.attributes.media.description": "Immagini, video, file Pdf e altri file", - "popUpForm.attributes.relation.description": "Si riferisce a un Tipo di Contenuto", - "popUpForm.attributes.email.description": "E-mail dell'utente...", - "popUpForm.attributes.password.description": "Utente password...", - "popUpForm.attributes.enumeration.description": "Elenco di scelte", - "popUpForm.attributes.string.name": "String", - "popUpForm.attributes.text.name": "Testo", - "popUpForm.attributes.boolean.name": "Boolean", - "popUpForm.attributes.date.name": "Data", - "popUpForm.attributes.json.name": "JSON", - "popUpForm.attributes.media.name": "Media", - "popUpForm.attributes.number.name": "Numero", - "popUpForm.attributes.relation.name": "Relazione", - "popUpForm.attributes.email.name": "Email", - "popUpForm.attributes.password.name": "Password", - "popUpForm.attributes.enumeration.name": "Enumerazione", - "popUpForm.create": "Aggiungi Nuovo", - "popUpForm.edit": "Modifica", - "popUpForm.field": "Campo", - "popUpForm.create.contentType.header.title": "Aggiungi Un Nuovo Tipo Di Contenuto", - "popUpForm.choose.attributes.header.title": "Aggiungi Un Nuovo Campo", - "popUpForm.edit.contentType.header.title": "Modificare Il Tipo Di Contenuto", - "popUpForm.navContainer.relation": "Definire la relazione", - "popUpForm.navContainer.base": "Le impostazioni di Base", - "popUpForm.navContainer.advanced": "Impostazioni avanzate", - "popUpRelation.title": "Relazione", - "popUpWarning.button.cancel": "Annulla", - "popUpWarning.button.confirm": "Confermare", - "popUpWarning.title": "Si prega di confermare", - "popUpWarning.bodyMessage.contentType.delete": "Sei sicuro di voler eliminare questo Tipo di Contenuto?", - "popUpWarning.bodyMessage.attribute.delete": "Sei sicuro di voler eliminare questo campo?", - "table.contentType.title.plural": "I Tipi di contenuto sono disponibili", - "table.contentType.title.singular": "Il Tipo di contenuto è disponibile", - "table.contentType.head.name": "Nome", - "table.contentType.head.description": "Descrizione", - "table.contentType.head.fields": "Campi", - "relation.oneWay": "ha una", - "relation.oneToOne": "e appartiene a uno", - "relation.oneToMany": "appartiene a molti", - "relation.manyToOne": "ha molti", - "relation.manyToMany": "e appartiene a molti", - "relation.attributeName.placeholder": "Ex: autore, categoria, tag" + "attribute.WYSIWYG": "Text (WYSIWYG)", + "attribute.boolean": "Boolean", + "attribute.date": "Data", + "attribute.decimal": "Decimale", + "attribute.email": "Email", + "attribute.enumeration": "Enumerazione", + "attribute.float": "Float", + "attribute.integer": "intero", + "attribute.json": "JSON", + "attribute.media": "Media", + "attribute.password": "Password", + "attribute.relation": "Relazione", + "attribute.string": "String", + "attribute.text": "Testo", + "button.attributes.add": "Aggiungi Un Nuovo Campo", + "button.contentType.add": "Aggiungi Tipo Di Contenuto", + "button.contentType.create": "Creare Un Tipo Di Contenuto", + "contentType.temporaryDisplay": "(Non salvati)", + "error.attribute.forbidden": "Questo attributo nome è riservato", + "error.attribute.key.taken": "Questo valore esiste già", + "error.attribute.sameKeyAndName": "Non può essere uguale", + "error.attribute.taken": "Questo campo nome esiste già", + "error.contentTypeName.taken": "Questo nome esiste già", + "error.validation.max": "Il valore è troppo alto.", + "error.validation.maxLength": "Il valore è troppo lungo.", + "error.validation.min": "Il valore è troppo basso.", + "error.validation.minLength": "Il valore è troppo breve.", + "error.validation.minSupMax": "Non può essere superiore", + "error.validation.regex": "Il valore non corrisponde all'espressione regolare.", + "error.validation.required": "Questo valore è richiesto l'input.", + "form.attribute.item.appearance.description": "In caso contrario, il valore sarà modificabile tramite una semplice textarea campo", + "form.attribute.item.appearance.label": "Visualizza come un WYSIWYG", + "form.attribute.item.appearance.name": "Aspetto", + "form.attribute.item.boolean.name": "Nome", + "form.attribute.item.customColumnName": "Nomi di colonna personalizzata", + "form.attribute.item.customColumnName.description": "Questo è utile per rinominare il database di nomi di colonna in un più ampio formato per le API risposte", + "form.attribute.item.date.name": "Nome", + "form.attribute.item.defineRelation.fieldName": "Nome del campo", + "form.attribute.item.enumeration.graphql": "Nome override per GraphQL", + "form.attribute.item.enumeration.graphql.description": "Consente di ignorare l'impostazione predefinita generata nome per GraphQL", + "form.attribute.item.enumeration.name": "Nome", + "form.attribute.item.enumeration.placeholder": "Ex: mattina,mezzogiorno,sera", + "form.attribute.item.enumeration.rules": "Valori (separati da una virgola)", + "form.attribute.item.json.name": "Nome", + "form.attribute.item.maximum": "Valore massimo", + "form.attribute.item.maximumLength": "Lunghezza massima", + "form.attribute.item.media.multiple": "Consentire a più file", + "form.attribute.item.media.name": "Nome", + "form.attribute.item.minimum": "Valore minimo", + "form.attribute.item.minimumLength": "Lunghezza minima", + "form.attribute.item.number.name": "Nome", + "form.attribute.item.number.type": "Il formato del numero di", + "form.attribute.item.number.type.decimal": "decimale (es: 2.22)", + "form.attribute.item.number.type.float": "float (ex: 3.33333333)", + "form.attribute.item.number.type.integer": "intero (es: 10)", + "form.attribute.item.requiredField": "Campo obbligatorio", + "form.attribute.item.requiredField.description": "Non sarà in grado di creare una voce se questo campo è vuoto", + "form.attribute.item.settings.name": "Impostazioni", + "form.attribute.item.string.name": "Nome", + "form.attribute.item.textarea.name": "Nome", + "form.attribute.item.uniqueField": "Unico campo", + "form.attribute.item.uniqueField.description": "Non sarà in grado di creare una voce, se c'è una voce esistente con contenuti identici", + "form.attribute.settings.default": "Valore di Default", + "form.attribute.settings.default.checkboxLabel": "Impostare su true", + "form.button.cancel": "Annulla", + "form.button.continue": "Continua", + "form.button.save": "Salva", + "form.contentType.item.collectionName": "Nome Della Collezione", + "form.contentType.item.collectionName.inputDescription": "Utile quando il nome del Tipo di Contenuto e il nome della tabella differiscono", + "form.contentType.item.connections": "Collegamento", + "form.contentType.item.description": "Descrizione", + "form.contentType.item.description.placeholder": "Scrivi la tua piccola descrizione qui...", + "form.contentType.item.name": "Nome", + "form.contentType.item.name.description": "Tipo di contenuto nomi singolari: {link}", + "form.contentType.item.name.link.description": "Scopri la nostra documentazione", + "from": "da", + "home.contentTypeBuilder.description": "Creare e aggiornare il tuo tipo di Contenuto.", + "home.contentTypeBuilder.name": "I Tipi Di Contenuto", + "home.emptyAttributes.description": "Aggiungi il tuo primo campo per il nuovo Tipo di Contenuto", + "home.emptyAttributes.title": "Non ci sono campi ancora", + "home.emptyContentType.description": "Crea il tuo primo Tipo di Contenuto per essere in grado di recuperare dati da API.", + "home.emptyContentType.title": "Non ci sono Tipi di Contenuto disponibili", + "menu.section.contentTypeBuilder.name.plural": "I Tipi Di Contenuto", + "menu.section.contentTypeBuilder.name.singular": "Tipo Di Contenuto", + "menu.section.documentation.guide": "Per saperne di più sui Tipi di Contenuto nel nostro", + "menu.section.documentation.guideLink": "guida.", + "menu.section.documentation.name": "Documentazione", + "menu.section.documentation.tutorial": "Check out nostro", + "menu.section.documentation.tutorialLink": "video tutorial.", + "modelPage.attribute.relationWith": "Relazione con", + "modelPage.contentHeader.emptyDescription.description": "Non vi è alcuna descrizione per questo Tipo di Contenuto", + "modelPage.contentType.list.relationShipTitle.plural": "relazioni", + "modelPage.contentType.list.relationShipTitle.singular": "rapporto", + "modelPage.contentType.list.title.including": "compresi", + "modelPage.contentType.list.title.plural": "campi", + "modelPage.contentType.list.title.singular": "campo", + "noTableWarning.description": "Non dimenticare di creare la tabella \" {modelName}` nel database", + "noTableWarning.infos": "Ulteriori informazioni", + "notification.error.message": "Si è verificato un errore", + "notification.info.contentType.creating.notSaved": "Si prega di salvare il Tipo di Contenuto prima di crearne uno nuovo", + "notification.info.disable": "Questo campo non è modificabile per il momento...😮", + "notification.info.optimized": "Questo plugin è ottimizzato con il localStorage", + "notification.success.contentTypeDeleted": "Il Tipo di Contenuto è stato eliminato", + "notification.success.message.contentType.create": "Il Tipo di Contenuto è stato creato", + "notification.success.message.contentType.edit": "Il Tipo di Contenuto è stato aggiornato", + "plugin.description.long": "Modellizzare la struttura dei dati dell'API. Creare nuovi campi e le relazioni che in un solo minuto. I file vengono automaticamente creati e aggiornati nel tuo progetto.", + "plugin.description.short": "Modellizzare la struttura dei dati dell'API.", + "popUpForm.attributes.boolean.description": "Sì o no, 1 o 0, vero o falso", + "popUpForm.attributes.boolean.name": "Boolean", + "popUpForm.attributes.date.description": "Data dell'evento, gli orari di apertura", + "popUpForm.attributes.date.name": "Data", + "popUpForm.attributes.email.description": "E-mail dell'utente...", + "popUpForm.attributes.email.name": "Email", + "popUpForm.attributes.enumeration.description": "Elenco di scelte", + "popUpForm.attributes.enumeration.name": "Enumerazione", + "popUpForm.attributes.json.description": "I dati in formato JSON", + "popUpForm.attributes.json.name": "JSON", + "popUpForm.attributes.media.description": "Immagini, video, file Pdf e altri file", + "popUpForm.attributes.media.name": "Media", + "popUpForm.attributes.number.description": "Tutto ciò che è il numero", + "popUpForm.attributes.number.name": "Numero", + "popUpForm.attributes.password.description": "Utente password...", + "popUpForm.attributes.password.name": "Password", + "popUpForm.attributes.relation.description": "Si riferisce a un Tipo di Contenuto", + "popUpForm.attributes.relation.name": "Relazione", + "popUpForm.attributes.string.description": "Titoli, nomi, paragrafi, liste di nomi", + "popUpForm.attributes.string.name": "String", + "popUpForm.attributes.text.description": "Descrizioni, paragrafi di testo, articoli ", + "popUpForm.attributes.text.name": "Testo", + "popUpForm.choose.attributes.header.title": "Aggiungi Un Nuovo Campo", + "popUpForm.create": "Aggiungi Nuovo", + "popUpForm.create.contentType.header.title": "Aggiungi Un Nuovo Tipo Di Contenuto", + "popUpForm.edit": "Modifica", + "popUpForm.edit.contentType.header.title": "Modificare Il Tipo Di Contenuto", + "popUpForm.field": "Campo", + "popUpForm.navContainer.advanced": "Impostazioni avanzate", + "popUpForm.navContainer.base": "Le impostazioni di Base", + "popUpForm.navContainer.relation": "Definire la relazione", + "popUpRelation.title": "Relazione", + "popUpWarning.bodyMessage.attribute.delete": "Sei sicuro di voler eliminare questo campo?", + "popUpWarning.bodyMessage.contentType.delete": "Sei sicuro di voler eliminare questo Tipo di Contenuto?", + "popUpWarning.button.cancel": "Annulla", + "popUpWarning.button.confirm": "Confermare", + "popUpWarning.title": "Si prega di confermare", + "relation.attributeName.placeholder": "Ex: autore, categoria, tag", + "relation.manyToMany": "e appartiene a molti", + "relation.manyToOne": "ha molti", + "relation.oneToMany": "appartiene a molti", + "relation.oneToOne": "e appartiene a uno", + "relation.oneWay": "ha una", + "table.contentType.head.description": "Descrizione", + "table.contentType.head.fields": "Campi", + "table.contentType.head.name": "Nome", + "table.contentType.title.plural": "I Tipi di contenuto sono disponibili", + "table.contentType.title.singular": "Il Tipo di contenuto è disponibile" } \ No newline at end of file diff --git a/packages/strapi-plugin-content-type-builder/admin/src/translations/ko.json b/packages/strapi-plugin-content-type-builder/admin/src/translations/ko.json index c2ef962b0b..c33cb2afbb 100644 --- a/packages/strapi-plugin-content-type-builder/admin/src/translations/ko.json +++ b/packages/strapi-plugin-content-type-builder/admin/src/translations/ko.json @@ -1,176 +1,157 @@ { - "plugin.description.short": "API를 위한 데이터 구조를 모델링 합니다.", - "plugin.description.long": "API를 위한 데이터 구조를 모델링 합니다. 새로운 필드와 릴레이션을 간단히 만드세요. 자동으로 설정 파일이 만들어 지고 프로젝트에 추가됩니다.", - "attribute.string": "문자(String)", - "attribute.text": "텍스트(Text)", + "attribute.WYSIWYG": "WYSIWYG 텍스트(Text)", "attribute.boolean": "불리언(Boolean)", + "attribute.date": "날짜(Date)", + "attribute.decimal": "숫자(Decimal)", + "attribute.email": "이메일(Email)", + "attribute.enumeration": "열거(Enumeration)", "attribute.float": "숫자(Float)", "attribute.integer": "숫자(integer)", - "attribute.decimal": "숫자(Decimal)", - "attribute.date": "날짜(Date)", "attribute.json": "JSON", "attribute.media": "미디어(Media)", - "attribute.email": "이메일(Email)", "attribute.password": "패스워드(Password)", "attribute.relation": "관계(Relation)", - "attribute.enumeration": "열거(Enumeration)", - "attribute.WYSIWYG": "WYSIWYG 텍스트(Text)", - - "contentType.temporaryDisplay": "(저장되지 않음)", - "from": "from", - "home.contentTypeBuilder.name": "콘텐츠 타입 빌더", - "home.contentTypeBuilder.description": "콘텐츠 타입을 만들거나 업데이트 하세요.", - "home.emptyContentType.title": "콘텐츠 타입이 없습니다.", - "home.emptyContentType.description": "API로 검색 할 수 있게 첫번째 콘텐츠 타입을 만드세요.", - - "home.emptyAttributes.title": "아직 필드가 없습니다.", - "home.emptyAttributes.description": "새 콘텐츠 타입에 첫번째 필드를 추가하세요.", - - "button.contentType.create": "콘텐츠 타입 만들기", - "button.contentType.add": "콘텐츠 타입 추가", + "attribute.string": "문자(String)", + "attribute.text": "텍스트(Text)", "button.attributes.add": "필드 추가", - - "error.validation.required": "내용을 입력해 주세요.", - "error.validation.regex": "입력한 내용이 형식에 맞지 않습니다.", - "error.validation.max": "입력한 내용이 너무 큽니다.", - "error.validation.min": "입력한 내용이 너무 작습니다.", - "error.validation.maxLength": "입력한 내용이 너무 깁니다.", - "error.validation.minLength": "입력한 내용이 너무 짧습니다.", - "error.contentTypeName.taken": "이미 사용중인 이름입니다.", - "error.attribute.taken": "이미 사용중인 이름입니다.", + "button.contentType.add": "콘텐츠 타입 추가", + "button.contentType.create": "콘텐츠 타입 만들기", + "contentType.temporaryDisplay": "(저장되지 않음)", + "error.attribute.forbidden": "사용할 수 없는 이름입니다.(예약어)", "error.attribute.key.taken": "이미 사용중인 키입니다.", "error.attribute.sameKeyAndName": "같을 수 없습니다.", + "error.attribute.taken": "이미 사용중인 이름입니다.", + "error.contentTypeName.taken": "이미 사용중인 이름입니다.", + "error.validation.max": "입력한 내용이 너무 큽니다.", + "error.validation.maxLength": "입력한 내용이 너무 깁니다.", + "error.validation.min": "입력한 내용이 너무 작습니다.", + "error.validation.minLength": "입력한 내용이 너무 짧습니다.", "error.validation.minSupMax": "이 보다 더 클 수 없습니다.", - "error.attribute.forbidden": "사용할 수 없는 이름입니다.(예약어)", - - "form.attribute.item.textarea.name": "이름", - "form.attribute.item.number.name": "이름", - "form.attribute.item.date.name": "이름", - "form.attribute.item.media.name": "이름", - "form.attribute.item.media.multiple": "여러 파일 허용", - "form.attribute.item.json.name": "이름", + "error.validation.regex": "입력한 내용이 형식에 맞지 않습니다.", + "error.validation.required": "내용을 입력해 주세요.", + "form.attribute.item.appearance.description": "혹은 기본 textarea로 내용을 편집할 수 있습니다.", + "form.attribute.item.appearance.label": "WYSIWYG으로 보기", + "form.attribute.item.appearance.name": "모양", "form.attribute.item.boolean.name": "이름", - "form.attribute.item.string.name": "이름", - "form.attribute.item.enumeration.name": "이름", - "form.attribute.item.enumeration.rules": "값 (쉼표로 구분)", + "form.attribute.item.customColumnName": "커스텀 컬럼 이름", + "form.attribute.item.customColumnName.description": "API 응답을 위해 데이터베이스 컬럼 이름을 포괄적인 형식으로 변경하는데 유용합니다.", + "form.attribute.item.date.name": "이름", + "form.attribute.item.defineRelation.fieldName": "필드 이름", "form.attribute.item.enumeration.graphql": "GraphQL에서 사용할 이름", "form.attribute.item.enumeration.graphql.description": "기본 생성된 이름을 GraphQL에서 사용합니다.", + "form.attribute.item.enumeration.name": "이름", "form.attribute.item.enumeration.placeholder": "Ex: morning,noon,evening", - "form.attribute.item.appearance.name": "모양", - "form.attribute.item.appearance.label": "WYSIWYG으로 보기", - "form.attribute.item.appearance.description": "혹은 기본 textarea로 내용을 편집할 수 있습니다.", - "form.attribute.item.settings.name": "설정", - "form.attribute.item.requiredField": "필수 항목", - "form.attribute.item.uniqueField": "유니크 항목", + "form.attribute.item.enumeration.rules": "값 (쉼표로 구분)", + "form.attribute.item.json.name": "이름", + "form.attribute.item.maximum": "최대 값", + "form.attribute.item.maximumLength": "최대 길이", + "form.attribute.item.media.multiple": "여러 파일 허용", + "form.attribute.item.media.name": "이름", "form.attribute.item.minimum": "최소 값", "form.attribute.item.minimumLength": "최소 길이", - "form.attribute.item.maximumLength": "최대 길이", - "form.attribute.item.maximum": "최대 값", - "form.attribute.item.requiredField.description": "필수 항목일 경우 체크하세요.", - "form.attribute.item.uniqueField.description": "유일한 값만 허용 할 경우 체크하세요.", - "form.attribute.item.defineRelation.fieldName": "필드 이름", - "form.attribute.item.customColumnName": "커스텀 컬럼 이름", - "form.attribute.item.customColumnName.description": - "API 응답을 위해 데이터베이스 컬럼 이름을 포괄적인 형식으로 변경하는데 유용합니다.", + "form.attribute.item.number.name": "이름", "form.attribute.item.number.type": "숫자 형식", - "form.attribute.item.number.type.integer": "integer (ex: 10)", - "form.attribute.item.number.type.float": "float (ex: 3.33333333)", "form.attribute.item.number.type.decimal": "decimal (ex: 2.22)", + "form.attribute.item.number.type.float": "float (ex: 3.33333333)", + "form.attribute.item.number.type.integer": "integer (ex: 10)", + "form.attribute.item.requiredField": "필수 항목", + "form.attribute.item.requiredField.description": "필수 항목일 경우 체크하세요.", + "form.attribute.item.settings.name": "설정", + "form.attribute.item.string.name": "이름", + "form.attribute.item.textarea.name": "이름", + "form.attribute.item.uniqueField": "유니크 항목", + "form.attribute.item.uniqueField.description": "유일한 값만 허용 할 경우 체크하세요.", "form.attribute.settings.default": "기본값", "form.attribute.settings.default.checkboxLabel": "true로 설정", - "form.button.cancel": "취소", "form.button.continue": "다음", "form.button.save": "저장", - + "form.contentType.item.collectionName": "컬렉션 이름", + "form.contentType.item.collectionName.inputDescription": "콘텐츠 타입 이름과 테이블 이름이 다를 경우 유용합니다.", "form.contentType.item.connections": "연결", + "form.contentType.item.description": "설명", + "form.contentType.item.description.placeholder": "간략한 설명을 작성하세요.", "form.contentType.item.name": "이름", "form.contentType.item.name.description": "콘텐츠 타입 이름은 단수형이어야 합니다. {link}", "form.contentType.item.name.link.description": "문서를 참고하세요.", - "form.contentType.item.description": "설명", - "form.contentType.item.description.placeholder": "간략한 설명을 작성하세요.", - "form.contentType.item.collectionName": "컬렉션 이름", - "form.contentType.item.collectionName.inputDescription": "콘텐츠 타입 이름과 테이블 이름이 다를 경우 유용합니다.", - + "from": "from", + "home.contentTypeBuilder.description": "콘텐츠 타입을 만들거나 업데이트 하세요.", + "home.contentTypeBuilder.name": "콘텐츠 타입 빌더", + "home.emptyAttributes.description": "새 콘텐츠 타입에 첫번째 필드를 추가하세요.", + "home.emptyAttributes.title": "아직 필드가 없습니다.", + "home.emptyContentType.description": "API로 검색 할 수 있게 첫번째 콘텐츠 타입을 만드세요.", + "home.emptyContentType.title": "콘텐츠 타입이 없습니다.", "menu.section.contentTypeBuilder.name.plural": "콘텐츠 타입", "menu.section.contentTypeBuilder.name.singular": "콘텐츠 타입", - "menu.section.documentation.name": "문서", "menu.section.documentation.guide": "콘텐츠 타입", "menu.section.documentation.guideLink": "가이드", + "menu.section.documentation.name": "문서", "menu.section.documentation.tutorial": "튜토리얼", "menu.section.documentation.tutorialLink": "비디오", - + "modelPage.attribute.relationWith": "관계", "modelPage.contentHeader.emptyDescription.description": "이 콘텐츠 타입에 대한 설명이 없습니다.", - "modelPage.contentType.list.title.plural": "필드", - "modelPage.contentType.list.title.singular": "필드", - "modelPage.contentType.list.title.including": "포함", "modelPage.contentType.list.relationShipTitle.plural": "관계", "modelPage.contentType.list.relationShipTitle.singular": "관계", - "modelPage.attribute.relationWith": "관계", - + "modelPage.contentType.list.title.including": "포함", + "modelPage.contentType.list.title.plural": "필드", + "modelPage.contentType.list.title.singular": "필드", "noTableWarning.description": "데이터베이스에 `{modelName}` 테이블을 생성하세요.", "noTableWarning.infos": "더보기", - "notification.error.message": "에러가 발생했습니다.", "notification.info.contentType.creating.notSaved": "새로운 것을 만들기 전에 콘텐츠 타입을 저장하세요.", "notification.info.disable": "현재 수정 할 수 없습니다...😮", "notification.info.optimized": "이 플러그인은 로컬스토리지에 최적화되어 있습니다.", - "notification.success.message.contentType.edit": "콘텐츠 타입이 업데이트 됐습니다.", - "notification.success.message.contentType.create": "콘텐츠 타입이 생성 됐습니다.", "notification.success.contentTypeDeleted": "콘텐츠 타입이 삭제 됐습니다.", - - "popUpForm.attributes.string.description": "제목, 이름, 문장, 이름 목록", - "popUpForm.attributes.text.description": "설명, 문장, 아티클 ", + "notification.success.message.contentType.create": "콘텐츠 타입이 생성 됐습니다.", + "notification.success.message.contentType.edit": "콘텐츠 타입이 업데이트 됐습니다.", + "plugin.description.long": "API를 위한 데이터 구조를 모델링 합니다. 새로운 필드와 릴레이션을 간단히 만드세요. 자동으로 설정 파일이 만들어 지고 프로젝트에 추가됩니다.", + "plugin.description.short": "API를 위한 데이터 구조를 모델링 합니다.", "popUpForm.attributes.boolean.description": "yes 또는 no, 1 또는 0, true 또는 false", - "popUpForm.attributes.number.description": "모든 숫자", - "popUpForm.attributes.date.description": "이벤트 날짜, 오픈 시각", - "popUpForm.attributes.json.description": "JSON 형식의 데이터", - "popUpForm.attributes.media.description": "이미지, 비디오, PDF 등등의 파일", - "popUpForm.attributes.relation.description": "다른 콘텐츠 타입 참조", - "popUpForm.attributes.email.description": "사용자 이메일", - "popUpForm.attributes.password.description": "사용자 패스워드", - "popUpForm.attributes.enumeration.description": "선택 목록", - - "popUpForm.attributes.string.name": "문자(String)", - "popUpForm.attributes.text.name": "텍스트(Text)", "popUpForm.attributes.boolean.name": "불리언(Boolean)", + "popUpForm.attributes.date.description": "이벤트 날짜, 오픈 시각", "popUpForm.attributes.date.name": "날짜(Date)", - "popUpForm.attributes.json.name": "JSON", - "popUpForm.attributes.media.name": "미디어(Media)", - "popUpForm.attributes.number.name": "숫자(Number)", - "popUpForm.attributes.relation.name": "관계(Relation)", + "popUpForm.attributes.email.description": "사용자 이메일", "popUpForm.attributes.email.name": "이메일(Email)", - "popUpForm.attributes.password.name": "패스워드(Password)", + "popUpForm.attributes.enumeration.description": "선택 목록", "popUpForm.attributes.enumeration.name": "열거형(Enumeration)", - "popUpForm.create": "새로운 ", - "popUpForm.edit": "수정", - "popUpForm.field": "필드", - "popUpForm.create.contentType.header.title": "새 콘텐츠 타입 추가", + "popUpForm.attributes.json.description": "JSON 형식의 데이터", + "popUpForm.attributes.json.name": "JSON", + "popUpForm.attributes.media.description": "이미지, 비디오, PDF 등등의 파일", + "popUpForm.attributes.media.name": "미디어(Media)", + "popUpForm.attributes.number.description": "모든 숫자", + "popUpForm.attributes.number.name": "숫자(Number)", + "popUpForm.attributes.password.description": "사용자 패스워드", + "popUpForm.attributes.password.name": "패스워드(Password)", + "popUpForm.attributes.relation.description": "다른 콘텐츠 타입 참조", + "popUpForm.attributes.relation.name": "관계(Relation)", + "popUpForm.attributes.string.description": "제목, 이름, 문장, 이름 목록", + "popUpForm.attributes.string.name": "문자(String)", + "popUpForm.attributes.text.description": "설명, 문장, 아티클 ", + "popUpForm.attributes.text.name": "텍스트(Text)", "popUpForm.choose.attributes.header.title": "새 필드 추가", + "popUpForm.create": "새로운 ", + "popUpForm.create.contentType.header.title": "새 콘텐츠 타입 추가", + "popUpForm.edit": "수정", "popUpForm.edit.contentType.header.title": "콘텐츠 타입 수정", - - "popUpForm.navContainer.relation": "관계 설정", - "popUpForm.navContainer.base": "기본 설정", + "popUpForm.field": "필드", "popUpForm.navContainer.advanced": "고급 설정", - + "popUpForm.navContainer.base": "기본 설정", + "popUpForm.navContainer.relation": "관계 설정", "popUpRelation.title": "관계", - + "popUpWarning.bodyMessage.attribute.delete": "이 필드를 삭제 하시겠습니까?", + "popUpWarning.bodyMessage.contentType.delete": "이 콘텐츠 타입을 삭제 하시겠습니까?", "popUpWarning.button.cancel": "취소", "popUpWarning.button.confirm": "확인", "popUpWarning.title": "확인", - "popUpWarning.bodyMessage.contentType.delete": "이 콘텐츠 타입을 삭제 하시겠습니까?", - "popUpWarning.bodyMessage.attribute.delete": "이 필드를 삭제 하시겠습니까?", - - "table.contentType.title.plural": "개의 콘텐츠 타입이 있습니다.", - "table.contentType.title.singular": "개의 콘텐츠 타입이 있습니다.", - "table.contentType.head.name": "이름", + "relation.attributeName.placeholder": "Ex: author, category, tag", + "relation.manyToMany": "N : N", + "relation.manyToOne": "N : 1", + "relation.oneToMany": "1 : N", + "relation.oneToOne": "1 : 1", + "relation.oneWay": "has one", "table.contentType.head.description": "설명", "table.contentType.head.fields": "필드", - - "relation.oneWay": "has one", - "relation.oneToOne": "1 : 1", - "relation.oneToMany": "1 : N", - "relation.manyToOne": "N : 1", - "relation.manyToMany": "N : N", - "relation.attributeName.placeholder": "Ex: author, category, tag" -} + "table.contentType.head.name": "이름", + "table.contentType.title.plural": "개의 콘텐츠 타입이 있습니다.", + "table.contentType.title.singular": "개의 콘텐츠 타입이 있습니다." +} \ No newline at end of file diff --git a/packages/strapi-plugin-content-type-builder/admin/src/translations/nl.json b/packages/strapi-plugin-content-type-builder/admin/src/translations/nl.json index 2b96c95867..b3aa6855b7 100644 --- a/packages/strapi-plugin-content-type-builder/admin/src/translations/nl.json +++ b/packages/strapi-plugin-content-type-builder/admin/src/translations/nl.json @@ -1,185 +1,157 @@ { - "plugin.description.short": "Modelize de data structuur van je API", - "plugin.description.long": - "Modelize de data structuur van je API. Maak nieuwe velden en relaties in een minuut. De bestanden worden automatisch aangemaakt en geüpdatet in jouw project", - "attribute.string": "String", - "attribute.text": "Text", + "attribute.WYSIWYG": "Tekst (WYSIWYG)", "attribute.boolean": "Boolean", + "attribute.date": "Date", + "attribute.decimal": "Decimal", + "attribute.email": "E-mail", + "attribute.enumeration": "Enumeration", "attribute.float": "Float", "attribute.integer": "integer", - "attribute.decimal": "Decimal", - "attribute.date": "Date", "attribute.json": "JSON", "attribute.media": "Media", - "attribute.email": "E-mail", "attribute.password": "Wachtwoord", "attribute.relation": "Relatie", - "attribute.enumeration": "Enumeration", - "attribute.WYSIWYG": "Tekst (WYSIWYG)", - - "contentType.temporaryDisplay": "(Niet opgeslagen)", - "from": "van", - "home.contentTypeBuilder.name": "Content Types", - "home.contentTypeBuilder.description": "Maak en update jouw eigen Content Types.", - "home.emptyContentType.title": "Er zijn geen Content Types beschikbaar", - "home.emptyContentType.description": - "Maak je eerste Content Type om data op te halen via jouw API", - - "home.emptyAttributes.title": "Er zijn nog geen velden", - "home.emptyAttributes.description": "Voeg je eerste veld toe aan je nieuwe Content Type", - - "button.contentType.create": "Maak Content Type", - "button.contentType.add": "Voeg Content Type toe", + "attribute.string": "String", + "attribute.text": "Text", "button.attributes.add": "Voeg nieuw veld toe", - - "error.validation.required": "Deze waarde is verplicht.", - "error.validation.regex": "De waarde komt niet overeen met de regex.", - "error.validation.max": "De waarde is te hoog.", - "error.validation.min": "De waarde is te laag.", - "error.validation.maxLength": "De waarde is te lang.", - "error.validation.minLength": "De waarde is te kort.", - "error.contentTypeName.taken": "De naam bestaat al.", - "error.attribute.taken": "Deze veld naam bestaat al.", + "button.contentType.add": "Voeg Content Type toe", + "button.contentType.create": "Maak Content Type", + "contentType.temporaryDisplay": "(Niet opgeslagen)", + "error.attribute.forbidden": "Deze attribuut naam bestaat al", "error.attribute.key.taken": "Deze waarde bestaat al", "error.attribute.sameKeyAndName": "Mag niet gelijk zijn", + "error.attribute.taken": "Deze veld naam bestaat al.", + "error.contentTypeName.taken": "De naam bestaat al.", + "error.validation.max": "De waarde is te hoog.", + "error.validation.maxLength": "De waarde is te lang.", + "error.validation.min": "De waarde is te laag.", + "error.validation.minLength": "De waarde is te kort.", "error.validation.minSupMax": "Mag niet superieur zijn", - "error.attribute.forbidden": "Deze attribuut naam bestaat al", - - "form.attribute.item.textarea.name": "Naam", - "form.attribute.item.number.name": "Naam", - "form.attribute.item.date.name": "Naam", - "form.attribute.item.media.name": "Naam", - "form.attribute.item.media.multiple": "Meerdere bestanden toestaan", - "form.attribute.item.json.name": "Naam", + "error.validation.regex": "De waarde komt niet overeen met de regex.", + "error.validation.required": "Deze waarde is verplicht.", + "form.attribute.item.appearance.description": "Anders zal de waarde via een standaard tekstveld aanpasbaar zijn", + "form.attribute.item.appearance.label": "Weergeven als WYSIWYG", + "form.attribute.item.appearance.name": "Uiterlijk", "form.attribute.item.boolean.name": "Naam", - "form.attribute.item.string.name": "Naam", - "form.attribute.item.enumeration.name": "Naam", - "form.attribute.item.enumeration.rules": "Waardes (onderscheid ze met een komma)", + "form.attribute.item.customColumnName": "Aangepaste kolom namen", + "form.attribute.item.customColumnName.description": "Dit is handig om database kollom namen te hernoemen in een meer uitgebreid format voor de API responses", + "form.attribute.item.date.name": "Naam", + "form.attribute.item.defineRelation.fieldName": "Veld naam", "form.attribute.item.enumeration.graphql": "Naam overschreven voor GraphQL", "form.attribute.item.enumeration.graphql.description": "Zorgt ervoor dat je de standaard gegenereerde naam voor GraphQL kan overschrijven", + "form.attribute.item.enumeration.name": "Naam", "form.attribute.item.enumeration.placeholder": "Bijv.: ochtend,middag,avond", - "form.attribute.item.appearance.name": "Uiterlijk", - "form.attribute.item.appearance.label": "Weergeven als WYSIWYG", - "form.attribute.item.appearance.description": - "Anders zal de waarde via een standaard tekstveld aanpasbaar zijn", - "form.attribute.item.settings.name": "Instellingen", - "form.attribute.item.requiredField": "Verplicht veld", - "form.attribute.item.uniqueField": "Uniek veld", + "form.attribute.item.enumeration.rules": "Waardes (onderscheid ze met een komma)", + "form.attribute.item.json.name": "Naam", + "form.attribute.item.maximum": "Maximale waarde", + "form.attribute.item.maximumLength": "Maximale lengte", + "form.attribute.item.media.multiple": "Meerdere bestanden toestaan", + "form.attribute.item.media.name": "Naam", "form.attribute.item.minimum": "Minimale waarde", "form.attribute.item.minimumLength": "Minimale lengte", - "form.attribute.item.maximumLength": "Maximale lengte", - "form.attribute.item.maximum": "Maximale waarde", - "form.attribute.item.requiredField.description": - "Je kan geen item aanmaken als dit veld leeg is", - "form.attribute.item.uniqueField.description": - "Je kan geen item aanmaken als er een item is met gelijke inhoud", - "form.attribute.item.defineRelation.fieldName": "Veld naam", - "form.attribute.item.customColumnName": "Aangepaste kolom namen", - "form.attribute.item.customColumnName.description": - "Dit is handig om database kollom namen te hernoemen in een meer uitgebreid format voor de API responses", + "form.attribute.item.number.name": "Naam", "form.attribute.item.number.type": "Nummer formaat", - "form.attribute.item.number.type.integer": "integer (bijv.: 10)", - "form.attribute.item.number.type.float": "float (bijv.: 3.33333333)", "form.attribute.item.number.type.decimal": "decimal (bijv.: 2.22)", + "form.attribute.item.number.type.float": "float (bijv.: 3.33333333)", + "form.attribute.item.number.type.integer": "integer (bijv.: 10)", + "form.attribute.item.requiredField": "Verplicht veld", + "form.attribute.item.requiredField.description": "Je kan geen item aanmaken als dit veld leeg is", + "form.attribute.item.settings.name": "Instellingen", + "form.attribute.item.string.name": "Naam", + "form.attribute.item.textarea.name": "Naam", + "form.attribute.item.uniqueField": "Uniek veld", + "form.attribute.item.uniqueField.description": "Je kan geen item aanmaken als er een item is met gelijke inhoud", "form.attribute.settings.default": "Standaard waade", "form.attribute.settings.default.checkboxLabel": "Naar waar gezet", - "form.button.cancel": "Annuleren", "form.button.continue": "Doorgaan", "form.button.save": "Opslaan", - + "form.contentType.item.collectionName": "Collectie naam", + "form.contentType.item.collectionName.inputDescription": "Handig als de naam van je Content Type en je tabel verschillen", "form.contentType.item.connections": "Verbinding", + "form.contentType.item.description": "Beschrijving", + "form.contentType.item.description.placeholder": "Schrijf je korte beschrijving hier...", "form.contentType.item.name": "Naam", "form.contentType.item.name.description": "Content Type namen moeten enkelvoud zijn: {link}", "form.contentType.item.name.link.description": "Bekijk onze documentatie", - "form.contentType.item.description": "Beschrijving", - "form.contentType.item.description.placeholder": "Schrijf je korte beschrijving hier...", - "form.contentType.item.collectionName": "Collectie naam", - "form.contentType.item.collectionName.inputDescription": - "Handig als de naam van je Content Type en je tabel verschillen", - + "from": "van", + "home.contentTypeBuilder.description": "Maak en update jouw eigen Content Types.", + "home.contentTypeBuilder.name": "Content Types", + "home.emptyAttributes.description": "Voeg je eerste veld toe aan je nieuwe Content Type", + "home.emptyAttributes.title": "Er zijn nog geen velden", + "home.emptyContentType.description": "Maak je eerste Content Type om data op te halen via jouw API", + "home.emptyContentType.title": "Er zijn geen Content Types beschikbaar", "menu.section.contentTypeBuilder.name.plural": "Content Types", "menu.section.contentTypeBuilder.name.singular": "Content Type", - "menu.section.documentation.name": "Documentatie", "menu.section.documentation.guide": "Lees meer over Content Types in onze", "menu.section.documentation.guideLink": "handleiding.", + "menu.section.documentation.name": "Documentatie", "menu.section.documentation.tutorial": "Zie onze", "menu.section.documentation.tutorialLink": "handleiding video.", - - "modelPage.contentHeader.emptyDescription.description": - "Er is geen beschrijving voor dit Content Type", - "modelPage.contentType.list.title.plural": "velden", - "modelPage.contentType.list.title.singular": "veld", - "modelPage.contentType.list.title.including": "inclusief", + "modelPage.attribute.relationWith": "Relatie met", + "modelPage.contentHeader.emptyDescription.description": "Er is geen beschrijving voor dit Content Type", "modelPage.contentType.list.relationShipTitle.plural": "relaties", "modelPage.contentType.list.relationShipTitle.singular": "relatie", - "modelPage.attribute.relationWith": "Relatie met", - + "modelPage.contentType.list.title.including": "inclusief", + "modelPage.contentType.list.title.plural": "velden", + "modelPage.contentType.list.title.singular": "veld", "noTableWarning.description": "Vergeet niet om de tabel `{modelName}` aan te maken in je database", "noTableWarning.infos": "Meer info", - "notification.error.message": "Er is een fout opgetreden", - "notification.info.contentType.creating.notSaved": - "Sla eerst je huidige Content Type voor je een nieuwe aanmaakt", + "notification.info.contentType.creating.notSaved": "Sla eerst je huidige Content Type voor je een nieuwe aanmaakt", "notification.info.disable": "Dit veld is momenteel niet aanpasbaar...😮", "notification.info.optimized": "Deze extensie is geoptimaliseerd voor je localStorage", - "notification.success.message.contentType.edit": "Je Content Type is geüpdatet", - "notification.success.message.contentType.create": "Je Content Type is aangemaakt", "notification.success.contentTypeDeleted": "De Content Type is verwijderd", - - "popUpForm.attributes.string.description": "Titels, namen, paragrafen, lijst met namen", - "popUpForm.attributes.text.description": "Beschrijvingen, tekst paragrafen, artikels ", + "notification.success.message.contentType.create": "Je Content Type is aangemaakt", + "notification.success.message.contentType.edit": "Je Content Type is geüpdatet", + "plugin.description.long": "Modelize de data structuur van je API. Maak nieuwe velden en relaties in een minuut. De bestanden worden automatisch aangemaakt en geüpdatet in jouw project", + "plugin.description.short": "Modelize de data structuur van je API", "popUpForm.attributes.boolean.description": "Ja of nee, 1 of 0, waar of niet waar", - "popUpForm.attributes.number.description": "Alles wat een getal is", - "popUpForm.attributes.date.description": "Evenement datum, openingstijden", - "popUpForm.attributes.json.description": "Data in JSON formaat", - "popUpForm.attributes.media.description": "Foto's, video's, PDFs en andere bestanden", - "popUpForm.attributes.relation.description": "Refereert naar een Content Type", - "popUpForm.attributes.email.description": "Gebruiker's e-mail...", - "popUpForm.attributes.password.description": "Gebruiker wachtwoord...", - "popUpForm.attributes.enumeration.description": "Lijst van keuzes", - - "popUpForm.attributes.string.name": "String", - "popUpForm.attributes.text.name": "Text", "popUpForm.attributes.boolean.name": "Boolean", + "popUpForm.attributes.date.description": "Evenement datum, openingstijden", "popUpForm.attributes.date.name": "Date", - "popUpForm.attributes.json.name": "JSON", - "popUpForm.attributes.media.name": "Media", - "popUpForm.attributes.number.name": "Number", - "popUpForm.attributes.relation.name": "Relation", + "popUpForm.attributes.email.description": "Gebruiker's e-mail...", "popUpForm.attributes.email.name": "E-mail", - "popUpForm.attributes.password.name": "Wachtwoord", + "popUpForm.attributes.enumeration.description": "Lijst van keuzes", "popUpForm.attributes.enumeration.name": "Enumeration", - "popUpForm.create": "Nieuwe Toevoegen", - "popUpForm.edit": "Aanpassen", - "popUpForm.field": "Veld", - "popUpForm.create.contentType.header.title": "Nieuw Content Type", + "popUpForm.attributes.json.description": "Data in JSON formaat", + "popUpForm.attributes.json.name": "JSON", + "popUpForm.attributes.media.description": "Foto's, video's, PDFs en andere bestanden", + "popUpForm.attributes.media.name": "Media", + "popUpForm.attributes.number.description": "Alles wat een getal is", + "popUpForm.attributes.number.name": "Number", + "popUpForm.attributes.password.description": "Gebruiker wachtwoord...", + "popUpForm.attributes.password.name": "Wachtwoord", + "popUpForm.attributes.relation.description": "Refereert naar een Content Type", + "popUpForm.attributes.relation.name": "Relation", + "popUpForm.attributes.string.description": "Titels, namen, paragrafen, lijst met namen", + "popUpForm.attributes.string.name": "String", + "popUpForm.attributes.text.description": "Beschrijvingen, tekst paragrafen, artikels ", + "popUpForm.attributes.text.name": "Text", "popUpForm.choose.attributes.header.title": "Nieuw Veld", + "popUpForm.create": "Nieuwe Toevoegen", + "popUpForm.create.contentType.header.title": "Nieuw Content Type", + "popUpForm.edit": "Aanpassen", "popUpForm.edit.contentType.header.title": "Content Type Aanpassen", - - "popUpForm.navContainer.relation": "Relatie aangeven", - "popUpForm.navContainer.base": "Standaard instellingen", + "popUpForm.field": "Veld", "popUpForm.navContainer.advanced": "Geavanceerde instellingen", - + "popUpForm.navContainer.base": "Standaard instellingen", + "popUpForm.navContainer.relation": "Relatie aangeven", "popUpRelation.title": "Relatie", - + "popUpWarning.bodyMessage.attribute.delete": "Weet je zeker dat je dit veld wilt verwijderen?", + "popUpWarning.bodyMessage.contentType.delete": "Weet je zeker dat je dit Content Type wilt verwijderen?", "popUpWarning.button.cancel": "Annuleren", "popUpWarning.button.confirm": "Akkoord", "popUpWarning.title": "Ga a.u.b. akkoord", - "popUpWarning.bodyMessage.contentType.delete": - "Weet je zeker dat je dit Content Type wilt verwijderen?", - "popUpWarning.bodyMessage.attribute.delete": "Weet je zeker dat je dit veld wilt verwijderen?", - - "table.contentType.title.plural": "Content Types zijn beschikbaar", - "table.contentType.title.singular": "Content Type is beschikbaar", - "table.contentType.head.name": "Naam", + "relation.attributeName.placeholder": "Bijv.: auteur, categorie, tag", + "relation.manyToMany": "heeft en behoord tot veel", + "relation.manyToOne": "heeft veel", + "relation.oneToMany": "behoord tot vele", + "relation.oneToOne": "heeft en behoord tot één", + "relation.oneWay": "heeft één", "table.contentType.head.description": "Beschrijving", "table.contentType.head.fields": "Velden", - - "relation.oneWay": "heeft één", - "relation.oneToOne": "heeft en behoord tot één", - "relation.oneToMany": "behoord tot vele", - "relation.manyToOne": "heeft veel", - "relation.manyToMany": "heeft en behoord tot veel", - "relation.attributeName.placeholder": "Bijv.: auteur, categorie, tag" -} + "table.contentType.head.name": "Naam", + "table.contentType.title.plural": "Content Types zijn beschikbaar", + "table.contentType.title.singular": "Content Type is beschikbaar" +} \ No newline at end of file diff --git a/packages/strapi-plugin-content-type-builder/admin/src/translations/pl.json b/packages/strapi-plugin-content-type-builder/admin/src/translations/pl.json index 19eb2bb8c1..64ab4cb6d2 100644 --- a/packages/strapi-plugin-content-type-builder/admin/src/translations/pl.json +++ b/packages/strapi-plugin-content-type-builder/admin/src/translations/pl.json @@ -1,184 +1,156 @@ { - "plugin.description.short": "Modeluj strukturę danych swojego API.", - "plugin.description.long": - "Modeluj strukturę danych swojego API. Twórz atrybuty i relacje w minutę. Pliki są automatycznie tworzone i aktualizowane w twoim projekcie.", - "attribute.string": "Ciąg", - "attribute.text": "Tekst", + "attribute.WYSIWYG": "Tekst (WYSIWYG)", "attribute.boolean": "Typ logiczny", + "attribute.date": "Data", + "attribute.decimal": "Dziesiętna", + "attribute.email": "Email", + "attribute.enumeration": "Wyliczenie", "attribute.float": "Zmiennoprzecinkowa", "attribute.integer": "Całkowita", - "attribute.decimal": "Dziesiętna", - "attribute.date": "Data", "attribute.json": "JSON", "attribute.media": "Media", - "attribute.email": "Email", "attribute.password": "Hasło", "attribute.relation": "Relacja", - "attribute.enumeration": "Wyliczenie", - "attribute.WYSIWYG": "Tekst (WYSIWYG)", - - "contentType.temporaryDisplay": "(Nie zapisany)", - "from": "z", - "home.contentTypeBuilder.name": "Modele", - "home.contentTypeBuilder.description": "Twórz i dowolnie zmieniaj struktury danych", - "home.emptyContentType.title": "Nie został jeszcze utworzony żaden model", - "home.emptyContentType.description": - "Stwórz swój pierwszy model, aby móc pobierać dane z interfejsu API.", - - "home.emptyAttributes.title": "Nie został jeszcze utworzony żaden atrybut", - "home.emptyAttributes.description": "Dodaj pierwszy atrybut do nowego modelu", - - "button.contentType.create": "Model", - "button.contentType.add": "Model", + "attribute.string": "Ciąg", + "attribute.text": "Tekst", "button.attributes.add": "Atrybut", - - "error.validation.required": "Wpisanie wartości dla tego atrybutu jest wymagane.", - "error.validation.regex": "Wartość nie jest zgodna z wymaganym wzorcem.", - "error.validation.max": "Wartość jest za wysoka.", - "error.validation.min": "Wartość jest za niska.", - "error.validation.maxLength": "Wartość jest za długa.", - "error.validation.minLength": "Wartość jest za krótka", - "error.contentTypeName.taken": "Ta nazwa już istnieje", - "error.attribute.taken": "Taki atrybut już istnieje", + "button.contentType.add": "Model", + "button.contentType.create": "Model", + "contentType.temporaryDisplay": "(Nie zapisany)", "error.attribute.key.taken": "Ta wartość już istnieje", "error.attribute.sameKeyAndName": "Nie mogą być takie same", + "error.attribute.taken": "Taki atrybut już istnieje", + "error.contentTypeName.taken": "Ta nazwa już istnieje", + "error.validation.max": "Wartość jest za wysoka.", + "error.validation.maxLength": "Wartość jest za długa.", + "error.validation.min": "Wartość jest za niska.", + "error.validation.minLength": "Wartość jest za krótka", "error.validation.minSupMax": "Nie może być większa", - - "form.attribute.item.textarea.name": "Nazwa", - "form.attribute.item.number.name": "Nazwa", - "form.attribute.item.date.name": "Nazwa", - "form.attribute.item.media.name": "Nazwa", - "form.attribute.item.media.multiple": "Pozwalaj na wiele plików", - "form.attribute.item.json.name": "Nazwa", + "error.validation.regex": "Wartość nie jest zgodna z wymaganym wzorcem.", + "error.validation.required": "Wpisanie wartości dla tego atrybutu jest wymagane.", + "form.attribute.item.appearance.description": "W przeciwnym razie zawartość będzie można edytować za pomocą podstawowego pola tekstowego.", + "form.attribute.item.appearance.label": "Wyświetlaj jako WYSIWYG", + "form.attribute.item.appearance.name": "Wygląd", "form.attribute.item.boolean.name": "Nazwa", - "form.attribute.item.string.name": "Nazwa", - "form.attribute.item.enumeration.name": "Nazwa", - "form.attribute.item.enumeration.rules": "Wartości (oddzielone przecinkiem)", + "form.attribute.item.customColumnName": "Własne nazwy tabel", + "form.attribute.item.customColumnName.description": "Jest to przydatne do zmiany nazwy tabel bazy danych w bardziej wszechstronnym formacie odpowiedzi API", + "form.attribute.item.date.name": "Nazwa", + "form.attribute.item.defineRelation.fieldName": "Atrybut", "form.attribute.item.enumeration.graphql": "Nadpisanie nazwy dla GraphQL", "form.attribute.item.enumeration.graphql.description": "Pozwalaj na nadpisanie domyślnie wygenerowanej nazwy dla GraphQL.", + "form.attribute.item.enumeration.name": "Nazwa", "form.attribute.item.enumeration.placeholder": "Przykład: rano,południe,wieczór", - "form.attribute.item.appearance.name": "Wygląd", - "form.attribute.item.appearance.label": "Wyświetlaj jako WYSIWYG", - "form.attribute.item.appearance.description": - "W przeciwnym razie zawartość będzie można edytować za pomocą podstawowego pola tekstowego.", - "form.attribute.item.settings.name": "Ustawienia", - "form.attribute.item.requiredField": "Wymagany", - "form.attribute.item.uniqueField": "Unikalny", + "form.attribute.item.enumeration.rules": "Wartości (oddzielone przecinkiem)", + "form.attribute.item.json.name": "Nazwa", + "form.attribute.item.maximum": "Maksymalna wartość", + "form.attribute.item.maximumLength": "Maksymalna długość", + "form.attribute.item.media.multiple": "Pozwalaj na wiele plików", + "form.attribute.item.media.name": "Nazwa", "form.attribute.item.minimum": "Minimalna wartość", "form.attribute.item.minimumLength": "Minimalna długość", - "form.attribute.item.maximumLength": "Maksymalna długość", - "form.attribute.item.maximum": "Maksymalna wartość", - "form.attribute.item.requiredField.description": - "Nie będziesz w stanie stworzyć wpisu jeżeli atrybut będzie pusty", - "form.attribute.item.uniqueField.description": - "Nie będziesz w stanie stworzyć wpisu jeżeli wartość atrybutu będzie już wykorzystywana", - "form.attribute.item.defineRelation.fieldName": "Atrybut", - "form.attribute.item.customColumnName": "Własne nazwy tabel", - "form.attribute.item.customColumnName.description": - "Jest to przydatne do zmiany nazwy tabel bazy danych w bardziej wszechstronnym formacie odpowiedzi API", + "form.attribute.item.number.name": "Nazwa", "form.attribute.item.number.type": "Forma", - "form.attribute.item.number.type.integer": "całkowita (np: 10)", - "form.attribute.item.number.type.float": "zmiennoprzecinkowa (np: 3.33333333)", "form.attribute.item.number.type.decimal": "dziesiętna (np: 2.22)", + "form.attribute.item.number.type.float": "zmiennoprzecinkowa (np: 3.33333333)", + "form.attribute.item.number.type.integer": "całkowita (np: 10)", + "form.attribute.item.requiredField": "Wymagany", + "form.attribute.item.requiredField.description": "Nie będziesz w stanie stworzyć wpisu jeżeli atrybut będzie pusty", + "form.attribute.item.settings.name": "Ustawienia", + "form.attribute.item.string.name": "Nazwa", + "form.attribute.item.textarea.name": "Nazwa", + "form.attribute.item.uniqueField": "Unikalny", + "form.attribute.item.uniqueField.description": "Nie będziesz w stanie stworzyć wpisu jeżeli wartość atrybutu będzie już wykorzystywana", "form.attribute.settings.default": "Domyślnie", "form.attribute.settings.default.checkboxLabel": "Ustawione na prawdę", - "form.button.cancel": "Anuluj", "form.button.continue": "Kontynuuj", "form.button.save": "Zapisz", - + "form.contentType.item.collectionName": "Kolekcja", + "form.contentType.item.collectionName.inputDescription": "Przydatne kiedy nazwa modelu jest inna niż nazwa tabeli w bazie danych", "form.contentType.item.connections": "Połączenie", + "form.contentType.item.description": "Opis", + "form.contentType.item.description.placeholder": "Wpisz krótki opis tutaj...", "form.contentType.item.name": "Nazwa", "form.contentType.item.name.description": "Nazwa modelu powinna być w liczbie pojedyńczej", "form.contentType.item.name.link.description": "zobacz naszą dokumentację", - "form.contentType.item.description": "Opis", - "form.contentType.item.description.placeholder": "Wpisz krótki opis tutaj...", - "form.contentType.item.collectionName": "Kolekcja", - "form.contentType.item.collectionName.inputDescription": - "Przydatne kiedy nazwa modelu jest inna niż nazwa tabeli w bazie danych", - + "from": "z", + "home.contentTypeBuilder.description": "Twórz i dowolnie zmieniaj struktury danych", + "home.contentTypeBuilder.name": "Modele", + "home.emptyAttributes.description": "Dodaj pierwszy atrybut do nowego modelu", + "home.emptyAttributes.title": "Nie został jeszcze utworzony żaden atrybut", + "home.emptyContentType.description": "Stwórz swój pierwszy model, aby móc pobierać dane z interfejsu API.", + "home.emptyContentType.title": "Nie został jeszcze utworzony żaden model", "menu.section.contentTypeBuilder.name.plural": "Modele", "menu.section.contentTypeBuilder.name.singular": "Model", - "menu.section.documentation.name": "Dokumentacja", "menu.section.documentation.guide": "Dowiedz się więcej na temat modeli w naszym", "menu.section.documentation.guideLink": "poradniku.", + "menu.section.documentation.name": "Dokumentacja", "menu.section.documentation.tutorial": "Zobacz nasz", "menu.section.documentation.tutorialLink": "poradnik wideo.", - - "modelPage.contentHeader.emptyDescription.description": - "Ten model nie posiada opisu", - "modelPage.contentType.list.title.plural": "atrybutów", - "modelPage.contentType.list.title.singular": "atrybut", - "modelPage.contentType.list.title.including": "w tym", + "modelPage.attribute.relationWith": "Relacja z", + "modelPage.contentHeader.emptyDescription.description": "Ten model nie posiada opisu", "modelPage.contentType.list.relationShipTitle.plural": "relacji", "modelPage.contentType.list.relationShipTitle.singular": "relacja", - "modelPage.attribute.relationWith": "Relacja z", - + "modelPage.contentType.list.title.including": "w tym", + "modelPage.contentType.list.title.plural": "atrybutów", + "modelPage.contentType.list.title.singular": "atrybut", "noTableWarning.description": "Nie zapomnij stworzyć tabeli `{modelName}` w bazie danych.", "noTableWarning.infos": "Więcej informacji", - "notification.error.message": "Wystąpił błąd", - "notification.info.contentType.creating.notSaved": - "Zapisz proszę aktualny model zanim stworzysz nowy", + "notification.info.contentType.creating.notSaved": "Zapisz proszę aktualny model zanim stworzysz nowy", "notification.info.disable": "Tego pola nie można obecnie edytować... 😮", "notification.info.optimized": "Ta wtyczka jest zoptymalizowana z localStorage", - "notification.success.message.contentType.edit": "Model został zmieniony", - "notification.success.message.contentType.create": "Model został utworzony", "notification.success.contentTypeDeleted": "Model został usunięty", - - "popUpForm.attributes.string.description": "Tytuły, nazwy, paragrafy, lista nazwisk", - "popUpForm.attributes.text.description": "Opisy, paragrafy, artykuły ", + "notification.success.message.contentType.create": "Model został utworzony", + "notification.success.message.contentType.edit": "Model został zmieniony", + "plugin.description.long": "Modeluj strukturę danych swojego API. Twórz atrybuty i relacje w minutę. Pliki są automatycznie tworzone i aktualizowane w twoim projekcie.", + "plugin.description.short": "Modeluj strukturę danych swojego API.", "popUpForm.attributes.boolean.description": "Tak lub nie, 1 lub 0, prawda lub fałsz", - "popUpForm.attributes.number.description": "Wszystko co jest liczbą", - "popUpForm.attributes.date.description": "Data wydarzenia, godziny otwarcia", - "popUpForm.attributes.json.description": "Data w formacie JSON", - "popUpForm.attributes.media.description": "Obrazy, filmy, PDF'y i inne pliki", - "popUpForm.attributes.relation.description": "Odnosi się do modelu", - "popUpForm.attributes.email.description": "Email użytkownika...", - "popUpForm.attributes.password.description": "Hasło użytkownika...", - "popUpForm.attributes.enumeration.description": "Lista wyborów", - - "popUpForm.attributes.string.name": "Ciąg", - "popUpForm.attributes.text.name": "Tekst", "popUpForm.attributes.boolean.name": "Typ logiczny", + "popUpForm.attributes.date.description": "Data wydarzenia, godziny otwarcia", "popUpForm.attributes.date.name": "Data", - "popUpForm.attributes.json.name": "JSON", - "popUpForm.attributes.media.name": "Media", - "popUpForm.attributes.number.name": "Numer", - "popUpForm.attributes.relation.name": "Relacja", + "popUpForm.attributes.email.description": "Email użytkownika...", "popUpForm.attributes.email.name": "Email", - "popUpForm.attributes.password.name": "Hasło", + "popUpForm.attributes.enumeration.description": "Lista wyborów", "popUpForm.attributes.enumeration.name": "Wyliczenie", - "popUpForm.create": "Nowy", - "popUpForm.edit": "Zmień", - "popUpForm.field": "Atrybut", - "popUpForm.create.contentType.header.title": "Model", + "popUpForm.attributes.json.description": "Data w formacie JSON", + "popUpForm.attributes.json.name": "JSON", + "popUpForm.attributes.media.description": "Obrazy, filmy, PDF'y i inne pliki", + "popUpForm.attributes.media.name": "Media", + "popUpForm.attributes.number.description": "Wszystko co jest liczbą", + "popUpForm.attributes.number.name": "Numer", + "popUpForm.attributes.password.description": "Hasło użytkownika...", + "popUpForm.attributes.password.name": "Hasło", + "popUpForm.attributes.relation.description": "Odnosi się do modelu", + "popUpForm.attributes.relation.name": "Relacja", + "popUpForm.attributes.string.description": "Tytuły, nazwy, paragrafy, lista nazwisk", + "popUpForm.attributes.string.name": "Ciąg", + "popUpForm.attributes.text.description": "Opisy, paragrafy, artykuły ", + "popUpForm.attributes.text.name": "Tekst", "popUpForm.choose.attributes.header.title": "Atrybut", + "popUpForm.create": "Nowy", + "popUpForm.create.contentType.header.title": "Model", + "popUpForm.edit": "Zmień", "popUpForm.edit.contentType.header.title": "Model", - - "popUpForm.navContainer.relation": "Relacja", - "popUpForm.navContainer.base": "Podstawowe", + "popUpForm.field": "Atrybut", "popUpForm.navContainer.advanced": "Zaawansowane", - + "popUpForm.navContainer.base": "Podstawowe", + "popUpForm.navContainer.relation": "Relacja", "popUpRelation.title": "Relacja", - + "popUpWarning.bodyMessage.attribute.delete": "Czy na pewno chcesz usunąć ten atrybut?", + "popUpWarning.bodyMessage.contentType.delete": "Czy na pewno chcesz usunąć ten model?", "popUpWarning.button.cancel": "Nie", "popUpWarning.button.confirm": "Tak", "popUpWarning.title": "Potwierdzenie", - "popUpWarning.bodyMessage.contentType.delete": - "Czy na pewno chcesz usunąć ten model?", - "popUpWarning.bodyMessage.attribute.delete": "Czy na pewno chcesz usunąć ten atrybut?", - - "table.contentType.title.plural": "Modeli jest dostępnych", - "table.contentType.title.singular": "Model jest dostępny", - "table.contentType.head.name": "Nazwa", + "relation.attributeName.placeholder": "Np: autor, kategoria, tag", + "relation.manyToMany": "zawiera i należy do wielu", + "relation.manyToOne": "zawiera wiele", + "relation.oneToMany": "należy do wielu", + "relation.oneToOne": "zawiera i należy do", + "relation.oneWay": "zawiera", "table.contentType.head.description": "Opis", "table.contentType.head.fields": "Atrybuty", - - "relation.oneWay": "zawiera", - "relation.oneToOne": "zawiera i należy do", - "relation.oneToMany": "należy do wielu", - "relation.manyToOne": "zawiera wiele", - "relation.manyToMany": "zawiera i należy do wielu", - "relation.attributeName.placeholder": "Np: autor, kategoria, tag" -} + "table.contentType.head.name": "Nazwa", + "table.contentType.title.plural": "Modeli jest dostępnych", + "table.contentType.title.singular": "Model jest dostępny" +} \ No newline at end of file diff --git a/packages/strapi-plugin-content-type-builder/admin/src/translations/pt-BR.json b/packages/strapi-plugin-content-type-builder/admin/src/translations/pt-BR.json index 9590644973..8194f27b76 100644 --- a/packages/strapi-plugin-content-type-builder/admin/src/translations/pt-BR.json +++ b/packages/strapi-plugin-content-type-builder/admin/src/translations/pt-BR.json @@ -1,177 +1,157 @@ { - "plugin.description.short": "Molde a estrutura de dados da sua API.", - "plugin.description.long": "Molde a estrutura de dados da sua API. Crie novos campos e relações em apenas um minuto. Os arquivos são automaticamente criados e atualizados no seu projeto.", - "attribute.string": "String", - "attribute.text": "Texto", + "attribute.WYSIWYG": "Texto (WYSIWYG)", "attribute.boolean": "Booleano", + "attribute.date": "Data", + "attribute.decimal": "Decimal", + "attribute.email": "Email", + "attribute.enumeration": "Enumeração", "attribute.float": "Float", "attribute.integer": "Inteiro", - "attribute.decimal": "Decimal", - "attribute.date": "Data", "attribute.json": "JSON", "attribute.media": "Mídia", - "attribute.email": "Email", "attribute.password": "Senha", "attribute.relation": "Relação", - "attribute.enumeration": "Enumeração", - "attribute.WYSIWYG": "Texto (WYSIWYG)", - - "contentType.temporaryDisplay": "(Não salvo)", - "from": "de", - "home.contentTypeBuilder.name": "Construtor de Tipos de Conteúdo", - "home.contentTypeBuilder.description": "Crie e atualize seu próprio Tipo de Conteúdo.", - "home.emptyContentType.title": "Nenhum Tipo de Conteúdo disponível", - "home.emptyContentType.description": - "Cria seu primeiro Tipo de Conteúdo para poder recuperar dados de sua API.", - - "home.emptyAttributes.title": "Ainda não há campos", - "home.emptyAttributes.description": - "Adicione seu primeiro campo para seu novo Tipo de Conteúdo", - - "button.contentType.create": "Criar Tipo de Conteúdo", - "button.contentType.add": "Adicionar Tipo de Conteúdo", + "attribute.string": "String", + "attribute.text": "Texto", "button.attributes.add": "Adicionar Novo Campo", - - "error.validation.required": "Este valor deste registro é obrigatório.", - "error.validation.regex": "O valor não corresponde ao regex The value does not match the regex.", - "error.validation.max": "O valor é muito alto.", - "error.validation.min": "O valor é muito baixo.", - "error.validation.maxLength": "O valor é muito longo.", - "error.validation.minLength": "O valor é muito curto.", - "error.contentTypeName.taken": "Este nome já existe", - "error.attribute.taken": "O nome deste campo já existe", + "button.contentType.add": "Adicionar Tipo de Conteúdo", + "button.contentType.create": "Criar Tipo de Conteúdo", + "contentType.temporaryDisplay": "(Não salvo)", + "error.attribute.forbidden": "Este nome de atributo está reservado", "error.attribute.key.taken": "Este valor já existe", "error.attribute.sameKeyAndName": "Não pode ser igual", + "error.attribute.taken": "O nome deste campo já existe", + "error.contentTypeName.taken": "Este nome já existe", + "error.validation.max": "O valor é muito alto.", + "error.validation.maxLength": "O valor é muito longo.", + "error.validation.min": "O valor é muito baixo.", + "error.validation.minLength": "O valor é muito curto.", "error.validation.minSupMax": "Não pode ser superior", - "error.attribute.forbidden": "Este nome de atributo está reservado", - - "form.attribute.item.textarea.name": "Nome", - "form.attribute.item.number.name": "Nome", - "form.attribute.item.date.name": "Nome", - "form.attribute.item.media.name": "Nome", - "form.attribute.item.media.multiple": "Permite vários arquivos", - "form.attribute.item.json.name": "Nome", - "form.attribute.item.boolean.name": "Nome", - "form.attribute.item.string.name": "Nome", - "form.attribute.item.enumeration.name": "Nome", - "form.attribute.item.enumeration.rules": "Valores (separe-os com uma vírgula)", - "form.attribute.item.enumeration.graphql": "Substituição de nome para o GraphQL", - "form.attribute.item.enumeration.graphql.description": "Permite à si a substituição do nome predefinido para o GraphQL", - "form.attribute.item.enumeration.placeholder": "Ex: manhã,tarde,noite", - "form.attribute.item.appearance.name": "Aparência", - "form.attribute.item.appearance.label": "Mostrar como um WYSIWYG", + "error.validation.regex": "O valor não corresponde ao regex The value does not match the regex.", + "error.validation.required": "Este valor deste registro é obrigatório.", "form.attribute.item.appearance.description": "Caso contrário, o valor será editável por meio de um campo textarea básico", - "form.attribute.item.settings.name": "Definições", - "form.attribute.item.requiredField": "Campo obrigatório", - "form.attribute.item.uniqueField": "Campo único", - "form.attribute.item.minimum": "Valor mínimo", - "form.attribute.item.minimumLength": "Tamanho mínimo", - "form.attribute.item.maximumLength": "Tamanho máximo", - "form.attribute.item.maximum": "Valor máximo", - "form.attribute.item.requiredField.description": "Você não poderá criar um registro se este campo estiver vazio", - "form.attribute.item.uniqueField.description": "Você não poderá criar um registro se houver outro registro com o nome do campo idêntico", - "form.attribute.item.defineRelation.fieldName": "Nome do campo", + "form.attribute.item.appearance.label": "Mostrar como um WYSIWYG", + "form.attribute.item.appearance.name": "Aparência", + "form.attribute.item.boolean.name": "Nome", "form.attribute.item.customColumnName": "Nomes de colunas customizadas", "form.attribute.item.customColumnName.description": "Isto é útil para renomear os nomes das colunas da base de dados em um formato mais abrangente para as respostas da API", + "form.attribute.item.date.name": "Nome", + "form.attribute.item.defineRelation.fieldName": "Nome do campo", + "form.attribute.item.enumeration.graphql": "Substituição de nome para o GraphQL", + "form.attribute.item.enumeration.graphql.description": "Permite à si a substituição do nome predefinido para o GraphQL", + "form.attribute.item.enumeration.name": "Nome", + "form.attribute.item.enumeration.placeholder": "Ex: manhã,tarde,noite", + "form.attribute.item.enumeration.rules": "Valores (separe-os com uma vírgula)", + "form.attribute.item.json.name": "Nome", + "form.attribute.item.maximum": "Valor máximo", + "form.attribute.item.maximumLength": "Tamanho máximo", + "form.attribute.item.media.multiple": "Permite vários arquivos", + "form.attribute.item.media.name": "Nome", + "form.attribute.item.minimum": "Valor mínimo", + "form.attribute.item.minimumLength": "Tamanho mínimo", + "form.attribute.item.number.name": "Nome", "form.attribute.item.number.type": "Formato numérico", - "form.attribute.item.number.type.integer": "inteiro (ex: 10)", - "form.attribute.item.number.type.float": "float (ex: 3.33333333)", "form.attribute.item.number.type.decimal": "decimal (ex: 2.22)", + "form.attribute.item.number.type.float": "float (ex: 3.33333333)", + "form.attribute.item.number.type.integer": "inteiro (ex: 10)", + "form.attribute.item.requiredField": "Campo obrigatório", + "form.attribute.item.requiredField.description": "Você não poderá criar um registro se este campo estiver vazio", + "form.attribute.item.settings.name": "Definições", + "form.attribute.item.string.name": "Nome", + "form.attribute.item.textarea.name": "Nome", + "form.attribute.item.uniqueField": "Campo único", + "form.attribute.item.uniqueField.description": "Você não poderá criar um registro se houver outro registro com o nome do campo idêntico", "form.attribute.settings.default": "Valor predefinido", "form.attribute.settings.default.checkboxLabel": "Definir como verdadeiro", - "form.button.cancel": "Cancelar", "form.button.continue": "Continuar", "form.button.save": "Salvar", - + "form.contentType.item.collectionName": "Nome da coleção", + "form.contentType.item.collectionName.inputDescription": "Útil quando o nome do seu Tipo de Conteúdo e o nome da sua tabela diferem", "form.contentType.item.connections": "Conexões", + "form.contentType.item.description": "Descrição", + "form.contentType.item.description.placeholder": "Escreva sua pequena descrição aqui...", "form.contentType.item.name": "Nome", "form.contentType.item.name.description": "Os nomes dos Tipos de Conteúdo devem estar no singular: {link}", "form.contentType.item.name.link.description": "Veja nossa documentação", - "form.contentType.item.description": "Descrição", - "form.contentType.item.description.placeholder": "Escreva sua pequena descrição aqui...", - "form.contentType.item.collectionName": "Nome da coleção", - "form.contentType.item.collectionName.inputDescription": "Útil quando o nome do seu Tipo de Conteúdo e o nome da sua tabela diferem", - + "from": "de", + "home.contentTypeBuilder.description": "Crie e atualize seu próprio Tipo de Conteúdo.", + "home.contentTypeBuilder.name": "Construtor de Tipos de Conteúdo", + "home.emptyAttributes.description": "Adicione seu primeiro campo para seu novo Tipo de Conteúdo", + "home.emptyAttributes.title": "Ainda não há campos", + "home.emptyContentType.description": "Cria seu primeiro Tipo de Conteúdo para poder recuperar dados de sua API.", + "home.emptyContentType.title": "Nenhum Tipo de Conteúdo disponível", "menu.section.contentTypeBuilder.name.plural": "Tipos de Conteúdos", "menu.section.contentTypeBuilder.name.singular": "Tipo de Conteúdo", - "menu.section.documentation.name": "Documentação", "menu.section.documentation.guide": "Leia mais sobre os Tipos De Conteúdos no nosso", "menu.section.documentation.guideLink": "guia.", + "menu.section.documentation.name": "Documentação", "menu.section.documentation.tutorial": "Veja nosso", "menu.section.documentation.tutorialLink": "vídeo tutorial.", - + "modelPage.attribute.relationWith": "Relação com", "modelPage.contentHeader.emptyDescription.description": "Nenhuma descrição para este Tipo De Conteúdo", - "modelPage.contentType.list.title.plural": "campos", - "modelPage.contentType.list.title.singular": "campo", - "modelPage.contentType.list.title.including": "incluindo", "modelPage.contentType.list.relationShipTitle.plural": "relações", "modelPage.contentType.list.relationShipTitle.singular": "relação", - "modelPage.attribute.relationWith": "Relação com", - + "modelPage.contentType.list.title.including": "incluindo", + "modelPage.contentType.list.title.plural": "campos", + "modelPage.contentType.list.title.singular": "campo", "noTableWarning.description": "Não se esqueça de criar a tabela `{modelName}` na sua base de dados", "noTableWarning.infos": "Mais informação", - "notification.error.message": "Ocorreu um erro", "notification.info.contentType.creating.notSaved": "Por favor, salve seu Tipo de Conteúdo atual antes de criar um novo", "notification.info.disable": "Este campo não pode ser editado no momento...😮", "notification.info.optimized": "Esta extensão é optimizada com o seu localStorage", - "notification.success.message.contentType.edit": "Seu Tipo de Conteúdo foi atualizado", - "notification.success.message.contentType.create": "Seu Tipo de Conteúdo foi criado", "notification.success.contentTypeDeleted": "O Tipo de Conteúdo foi apagado", - - "popUpForm.attributes.string.description": "Títulos, nomes, parágrafos, lista de nomes", - "popUpForm.attributes.text.description": "Descrições, parágrafos de texto, artigos ", + "notification.success.message.contentType.create": "Seu Tipo de Conteúdo foi criado", + "notification.success.message.contentType.edit": "Seu Tipo de Conteúdo foi atualizado", + "plugin.description.long": "Molde a estrutura de dados da sua API. Crie novos campos e relações em apenas um minuto. Os arquivos são automaticamente criados e atualizados no seu projeto.", + "plugin.description.short": "Molde a estrutura de dados da sua API.", "popUpForm.attributes.boolean.description": "Sim ou não, 1 ou 0, verdadeiro ou falso", - "popUpForm.attributes.number.description": "Tudo que seja número", - "popUpForm.attributes.date.description": "Evento data, horas de abertura", - "popUpForm.attributes.json.description": "Data em formato JSON", - "popUpForm.attributes.media.description": "Imagens, vídeos, PDFs e outros arquivos", - "popUpForm.attributes.relation.description": "Refere-se à um Tipo de Conteúdo", - "popUpForm.attributes.email.description": "Email do utilizador...", - "popUpForm.attributes.password.description": "Senha do Usuário...", - "popUpForm.attributes.enumeration.description": "Lista de escolhas", - - "popUpForm.attributes.string.name": "String", - "popUpForm.attributes.text.name": "Texto", "popUpForm.attributes.boolean.name": "Valor Booleano", + "popUpForm.attributes.date.description": "Evento data, horas de abertura", "popUpForm.attributes.date.name": "Data", - "popUpForm.attributes.json.name": "JSON", - "popUpForm.attributes.media.name": "Media", - "popUpForm.attributes.number.name": "Número", - "popUpForm.attributes.relation.name": "Relação", + "popUpForm.attributes.email.description": "Email do utilizador...", "popUpForm.attributes.email.name": "Email", - "popUpForm.attributes.password.name": "Senha", + "popUpForm.attributes.enumeration.description": "Lista de escolhas", "popUpForm.attributes.enumeration.name": "Enumeração", - "popUpForm.create": "Adicionar Novo", - "popUpForm.edit": "Editar", - "popUpForm.field": "Campo", - "popUpForm.create.contentType.header.title": "Adicionar Novo Tipo de Conteúdo", + "popUpForm.attributes.json.description": "Data em formato JSON", + "popUpForm.attributes.json.name": "JSON", + "popUpForm.attributes.media.description": "Imagens, vídeos, PDFs e outros arquivos", + "popUpForm.attributes.media.name": "Media", + "popUpForm.attributes.number.description": "Tudo que seja número", + "popUpForm.attributes.number.name": "Número", + "popUpForm.attributes.password.description": "Senha do Usuário...", + "popUpForm.attributes.password.name": "Senha", + "popUpForm.attributes.relation.description": "Refere-se à um Tipo de Conteúdo", + "popUpForm.attributes.relation.name": "Relação", + "popUpForm.attributes.string.description": "Títulos, nomes, parágrafos, lista de nomes", + "popUpForm.attributes.string.name": "String", + "popUpForm.attributes.text.description": "Descrições, parágrafos de texto, artigos ", + "popUpForm.attributes.text.name": "Texto", "popUpForm.choose.attributes.header.title": "Adicionar Novo Campo", + "popUpForm.create": "Adicionar Novo", + "popUpForm.create.contentType.header.title": "Adicionar Novo Tipo de Conteúdo", + "popUpForm.edit": "Editar", "popUpForm.edit.contentType.header.title": "Editar Tipo de Conteúdo", - - "popUpForm.navContainer.relation": "Definir relação", - "popUpForm.navContainer.base": "Definições básicas", + "popUpForm.field": "Campo", "popUpForm.navContainer.advanced": "Definições Avançadas", - + "popUpForm.navContainer.base": "Definições básicas", + "popUpForm.navContainer.relation": "Definir relação", "popUpRelation.title": "Relação", - + "popUpWarning.bodyMessage.attribute.delete": "Tem a certeza que deseja remover este campo?", + "popUpWarning.bodyMessage.contentType.delete": "Tem a certeza que deseja remover este Tipo de Conteúdo?", "popUpWarning.button.cancel": "Cancelar", "popUpWarning.button.confirm": "Confirmar", "popUpWarning.title": "Por favor, confirme", - "popUpWarning.bodyMessage.contentType.delete": "Tem a certeza que deseja remover este Tipo de Conteúdo?", - "popUpWarning.bodyMessage.attribute.delete": "Tem a certeza que deseja remover este campo?", - - "table.contentType.title.plural": "Tipos de Conteúdos estão disponíveis", - "table.contentType.title.singular": "Tipo de Conteúdo está disponível", - "table.contentType.head.name": "Nome", + "relation.attributeName.placeholder": "Ex: autor, catégoria, etiqueta", + "relation.manyToMany": "tem e pertence à vários", + "relation.manyToOne": "tem vários", + "relation.oneToMany": "pertence à vários", + "relation.oneToOne": "tem e pertence à um", + "relation.oneWay": "tem um", "table.contentType.head.description": "Descrição", "table.contentType.head.fields": "Campos", - - "relation.oneWay": "tem um", - "relation.oneToOne": "tem e pertence à um", - "relation.oneToMany": "pertence à vários", - "relation.manyToOne": "tem vários", - "relation.manyToMany": "tem e pertence à vários", - "relation.attributeName.placeholder": "Ex: autor, catégoria, etiqueta" + "table.contentType.head.name": "Nome", + "table.contentType.title.plural": "Tipos de Conteúdos estão disponíveis", + "table.contentType.title.singular": "Tipo de Conteúdo está disponível" } \ No newline at end of file diff --git a/packages/strapi-plugin-content-type-builder/admin/src/translations/pt.json b/packages/strapi-plugin-content-type-builder/admin/src/translations/pt.json index efb0cf41ad..53364233f2 100644 --- a/packages/strapi-plugin-content-type-builder/admin/src/translations/pt.json +++ b/packages/strapi-plugin-content-type-builder/admin/src/translations/pt.json @@ -1,186 +1,157 @@ { - "plugin.description.short": "Modelize a estrutura de dados da sua API.", - "plugin.description.long": - "Modelize a estrutura de dados da sua API. Crie novos campos e relações em apenas um minuto. Os arquivos são automaticamente criados e actualizados no seu projecto.", - "attribute.string": "String", - "attribute.text": "Texto", - "attribute.boolean": "Booleano", - "attribute.float": "Float", - "attribute.integer": "inteiro", - "attribute.decimal": "Decimal", - "attribute.date": "Data", - "attribute.json": "JSON", - "attribute.media": "Media", - "attribute.email": "Email", - "attribute.password": "Palavra-passe", - "attribute.relation": "Relação", - "attribute.enumeration": "Enumeração", - "attribute.WYSIWYG": "Texto (WYSIWYG)", - - "contentType.temporaryDisplay": "(Não guardado)", - "from": "de", - "home.contentTypeBuilder.name": "Tipos de Conteúdos", - "home.contentTypeBuilder.description": "Crie e actualize seu próprio Tipo de Conteúdo.", - "home.emptyContentType.title": "Sem Tipos de Conteúdos disponíveis", - "home.emptyContentType.description": - "Cria seu primeiro Tipo de Conteúdo para poder recuperar dados de sua API.", - - "home.emptyAttributes.title": "Ainda não há campos", - "home.emptyAttributes.description": "Adicione seu primeiro campo para seu novo Tipo de Conteúdo", - - "button.contentType.create": "Criar Tipo de Conteúdo", - "button.contentType.add": "Adicionar Tipo de Conteúdo", - "button.attributes.add": "Adicionar Novo Campo", - - "error.validation.required": "Este valor de entrada é obrigatório.", - "error.validation.regex": "O valor não corresponde ao regex The value does not match the regex.", - "error.validation.max": "O valor é muito alto.", - "error.validation.min": "O valor é muito baixo.", - "error.validation.maxLength": "O valor é muito longo.", - "error.validation.minLength": "O valor é muito curto.", - "error.contentTypeName.taken": "Este nome já existe", - "error.attribute.taken": "O nome deste campo já existe", - "error.attribute.key.taken": "Este valor já existe", - "error.attribute.sameKeyAndName": "Não pode ser igual", - "error.validation.minSupMax": "Não pode ser superior", - "error.attribute.forbidden": "Este nome de atributo está reservado", - - "form.attribute.item.textarea.name": "Nome", - "form.attribute.item.number.name": "Nome", - "form.attribute.item.date.name": "Nome", - "form.attribute.item.media.name": "Nome", - "form.attribute.item.media.multiple": "Permites vários arquivos", - "form.attribute.item.json.name": "Nome", - "form.attribute.item.boolean.name": "Nome", - "form.attribute.item.string.name": "Nome", - "form.attribute.item.enumeration.name": "Nome", - "form.attribute.item.enumeration.rules": "Valores (separe-os com uma vírgula)", - "form.attribute.item.enumeration.graphql": "Substituição de nome para o GraphQL", - "form.attribute.item.enumeration.graphql.description": "Permite à si a substituição do nome predefinido para o GraphQL", - "form.attribute.item.enumeration.placeholder": "Ex: manhã,tarde,noite", - "form.attribute.item.appearance.name": "Aparência", - "form.attribute.item.appearance.label": "Mostrar como um WYSIWYG", - "form.attribute.item.appearance.description": - "Caso contrário, o valor será editável por meio de um campo textarea básico", - "form.attribute.item.settings.name": "Definições", - "form.attribute.item.requiredField": "Campo obrigatório", - "form.attribute.item.uniqueField": "Campo único", - "form.attribute.item.minimum": "Valor mínimo", - "form.attribute.item.minimumLength": "Comprimento mínimo", - "form.attribute.item.maximumLength": "Comprimento máximo", - "form.attribute.item.maximum": "Valor máximo", - "form.attribute.item.requiredField.description": - "Você não será capaz de criar uma entrada se este campo estiver vazio", - "form.attribute.item.uniqueField.description": - "Você não será capaz de criar uma entrada se houver uma entrada existente com conteúdo idêntico", - "form.attribute.item.defineRelation.fieldName": "Nome do campo", - "form.attribute.item.customColumnName": "Nomes de colunas customizadas", - "form.attribute.item.customColumnName.description": - "Isto é útil para renomear os nomes das colunas da base de dados em um formato mais abrangente para as respostas da API", - "form.attribute.item.number.type": "Formato numérico", - "form.attribute.item.number.type.integer": "inteiro (ex: 10)", - "form.attribute.item.number.type.float": "float (ex: 3.33333333)", - "form.attribute.item.number.type.decimal": "decimal (ex: 2.22)", - "form.attribute.settings.default": "Valor predefinido", - "form.attribute.settings.default.checkboxLabel": "Definir como verdadeiro", - - "form.button.cancel": "Cancelar", - "form.button.continue": "Continuar", - "form.button.save": "Guardar", - - "form.contentType.item.connections": "Conexão", - "form.contentType.item.name": "Nome", - "form.contentType.item.name.description": "Os nomes dos Tipos de Conteúdos devem estar no singular: {link}", - "form.contentType.item.name.link.description": "Veja nossa documentação", - "form.contentType.item.description": "Descrição", - "form.contentType.item.description.placeholder": "Escreva sua pequena descrição aqui...", - "form.contentType.item.collectionName": "Nome da coleção", - "form.contentType.item.collectionName.inputDescription": - "Útil quando o nome do seu Tipo de Conteúdo e o nome da sua tabela diferem", - - "menu.section.contentTypeBuilder.name.plural": "Tipos de Conteúdos", - "menu.section.contentTypeBuilder.name.singular": "Tipo de Conteúdo", - "menu.section.documentation.name": "Documentação", - "menu.section.documentation.guide": "Leia mais sobre os Tipos De Conteúdos no nosso", - "menu.section.documentation.guideLink": "guia.", - "menu.section.documentation.tutorial": "Veja nosso", - "menu.section.documentation.tutorialLink": "vídeo tutorial.", - - "modelPage.contentHeader.emptyDescription.description": - "Nenhuma descrição para este Tipo De Conteúdo", - "modelPage.contentType.list.title.plural": "campos", - "modelPage.contentType.list.title.singular": "campo", - "modelPage.contentType.list.title.including": "incluindo", - "modelPage.contentType.list.relationShipTitle.plural": "relações", - "modelPage.contentType.list.relationShipTitle.singular": "relação", - "modelPage.attribute.relationWith": "Relação com", - - "noTableWarning.description": "Não se esqueça de criar a tabela `{modelName}` na sua base de dados", - "noTableWarning.infos": "Mais informação", - - "notification.error.message": "Ocorreu um erro", - "notification.info.contentType.creating.notSaved": - "Por favor, guarde seu actual Tipo de Conteúdo antes de criar um novo", - "notification.info.disable": "Este campo não pode ser editado no momento...😮", - "notification.info.optimized": "Esta extensão é optimizada com o seu localStorage", - "notification.success.message.contentType.edit": "Seu Tipo de Conteúdo foi actualizado", - "notification.success.message.contentType.create": "Seu Tipo de Conteúdo foi criado", - "notification.success.contentTypeDeleted": "O Tipo de Conteúdo foi apagado", - - "popUpForm.attributes.string.description": "Títulos, nomes, parágrafos, lista de nomes", - "popUpForm.attributes.text.description": "Descrições, parágrafos de texto, artigos ", - "popUpForm.attributes.boolean.description": "Sim ou não, 1 ou 0, verdadeiro ou falso", - "popUpForm.attributes.number.description": "Tudo que seja número", - "popUpForm.attributes.date.description": "Evento data, horas de abertura", - "popUpForm.attributes.json.description": "Data em formato JSON", - "popUpForm.attributes.media.description": "Imagens, vídeos, PDFs e outros arquivos", - "popUpForm.attributes.relation.description": "Refere-se à um Tipo de Conteúdo", - "popUpForm.attributes.email.description": "Email do utilizador...", - "popUpForm.attributes.password.description": "Palavra-passe do utilizador...", - "popUpForm.attributes.enumeration.description": "Lista de escolhas", - - "popUpForm.attributes.string.name": "String", - "popUpForm.attributes.text.name": "Texto", - "popUpForm.attributes.boolean.name": "Booleano", - "popUpForm.attributes.date.name": "Data", - "popUpForm.attributes.json.name": "JSON", - "popUpForm.attributes.media.name": "Media", - "popUpForm.attributes.number.name": "Número", - "popUpForm.attributes.relation.name": "Relação", - "popUpForm.attributes.email.name": "Email", - "popUpForm.attributes.password.name": "Palavra-passe", - "popUpForm.attributes.enumeration.name": "Enumeração", - "popUpForm.create": "Adicionar Novo", - "popUpForm.edit": "Editar", - "popUpForm.field": "Campo", - "popUpForm.create.contentType.header.title": "Adicionar Novo Tipo de Conteúdo", - "popUpForm.choose.attributes.header.title": "Adicionar Novo Campo", - "popUpForm.edit.contentType.header.title": "Editar Tipo de Conteúdo", - - "popUpForm.navContainer.relation": "Definir relação", - "popUpForm.navContainer.base": "Definições básicas", - "popUpForm.navContainer.advanced": "Definições Avançadas", - - "popUpRelation.title": "Relação", - - "popUpWarning.button.cancel": "Cancelar", - "popUpWarning.button.confirm": "Confirmar", - "popUpWarning.title": "Por favor, confirme", - "popUpWarning.bodyMessage.contentType.delete": - "Tem a certeza que pretende apagar este Tipo de Conteúdo?", - "popUpWarning.bodyMessage.attribute.delete": "Tem a certeza que pretende apagar este campo?", - - "table.contentType.title.plural": "Tipos de Conteúdos estão disponíveis", - "table.contentType.title.singular": "Tipo de Conteúdo está disponível", - "table.contentType.head.name": "Nome", - "table.contentType.head.description": "Descrição", - "table.contentType.head.fields": "Campos", - - "relation.oneWay": "tem um", - "relation.oneToOne": "tem e pertence à um", - "relation.oneToMany": "pertence à vários", - "relation.manyToOne": "tem vários", - "relation.manyToMany": "tem e pertence à vários", - "relation.attributeName.placeholder": "Ex: autor, catégoria, tag" - } - \ No newline at end of file + "attribute.WYSIWYG": "Texto (WYSIWYG)", + "attribute.boolean": "Booleano", + "attribute.date": "Data", + "attribute.decimal": "Decimal", + "attribute.email": "Email", + "attribute.enumeration": "Enumeração", + "attribute.float": "Float", + "attribute.integer": "inteiro", + "attribute.json": "JSON", + "attribute.media": "Media", + "attribute.password": "Palavra-passe", + "attribute.relation": "Relação", + "attribute.string": "String", + "attribute.text": "Texto", + "button.attributes.add": "Adicionar Novo Campo", + "button.contentType.add": "Adicionar Tipo de Conteúdo", + "button.contentType.create": "Criar Tipo de Conteúdo", + "contentType.temporaryDisplay": "(Não guardado)", + "error.attribute.forbidden": "Este nome de atributo está reservado", + "error.attribute.key.taken": "Este valor já existe", + "error.attribute.sameKeyAndName": "Não pode ser igual", + "error.attribute.taken": "O nome deste campo já existe", + "error.contentTypeName.taken": "Este nome já existe", + "error.validation.max": "O valor é muito alto.", + "error.validation.maxLength": "O valor é muito longo.", + "error.validation.min": "O valor é muito baixo.", + "error.validation.minLength": "O valor é muito curto.", + "error.validation.minSupMax": "Não pode ser superior", + "error.validation.regex": "O valor não corresponde ao regex The value does not match the regex.", + "error.validation.required": "Este valor de entrada é obrigatório.", + "form.attribute.item.appearance.description": "Caso contrário, o valor será editável por meio de um campo textarea básico", + "form.attribute.item.appearance.label": "Mostrar como um WYSIWYG", + "form.attribute.item.appearance.name": "Aparência", + "form.attribute.item.boolean.name": "Nome", + "form.attribute.item.customColumnName": "Nomes de colunas customizadas", + "form.attribute.item.customColumnName.description": "Isto é útil para renomear os nomes das colunas da base de dados em um formato mais abrangente para as respostas da API", + "form.attribute.item.date.name": "Nome", + "form.attribute.item.defineRelation.fieldName": "Nome do campo", + "form.attribute.item.enumeration.graphql": "Substituição de nome para o GraphQL", + "form.attribute.item.enumeration.graphql.description": "Permite à si a substituição do nome predefinido para o GraphQL", + "form.attribute.item.enumeration.name": "Nome", + "form.attribute.item.enumeration.placeholder": "Ex: manhã,tarde,noite", + "form.attribute.item.enumeration.rules": "Valores (separe-os com uma vírgula)", + "form.attribute.item.json.name": "Nome", + "form.attribute.item.maximum": "Valor máximo", + "form.attribute.item.maximumLength": "Comprimento máximo", + "form.attribute.item.media.multiple": "Permites vários arquivos", + "form.attribute.item.media.name": "Nome", + "form.attribute.item.minimum": "Valor mínimo", + "form.attribute.item.minimumLength": "Comprimento mínimo", + "form.attribute.item.number.name": "Nome", + "form.attribute.item.number.type": "Formato numérico", + "form.attribute.item.number.type.decimal": "decimal (ex: 2.22)", + "form.attribute.item.number.type.float": "float (ex: 3.33333333)", + "form.attribute.item.number.type.integer": "inteiro (ex: 10)", + "form.attribute.item.requiredField": "Campo obrigatório", + "form.attribute.item.requiredField.description": "Você não será capaz de criar uma entrada se este campo estiver vazio", + "form.attribute.item.settings.name": "Definições", + "form.attribute.item.string.name": "Nome", + "form.attribute.item.textarea.name": "Nome", + "form.attribute.item.uniqueField": "Campo único", + "form.attribute.item.uniqueField.description": "Você não será capaz de criar uma entrada se houver uma entrada existente com conteúdo idêntico", + "form.attribute.settings.default": "Valor predefinido", + "form.attribute.settings.default.checkboxLabel": "Definir como verdadeiro", + "form.button.cancel": "Cancelar", + "form.button.continue": "Continuar", + "form.button.save": "Guardar", + "form.contentType.item.collectionName": "Nome da coleção", + "form.contentType.item.collectionName.inputDescription": "Útil quando o nome do seu Tipo de Conteúdo e o nome da sua tabela diferem", + "form.contentType.item.connections": "Conexão", + "form.contentType.item.description": "Descrição", + "form.contentType.item.description.placeholder": "Escreva sua pequena descrição aqui...", + "form.contentType.item.name": "Nome", + "form.contentType.item.name.description": "Os nomes dos Tipos de Conteúdos devem estar no singular: {link}", + "form.contentType.item.name.link.description": "Veja nossa documentação", + "from": "de", + "home.contentTypeBuilder.description": "Crie e actualize seu próprio Tipo de Conteúdo.", + "home.contentTypeBuilder.name": "Tipos de Conteúdos", + "home.emptyAttributes.description": "Adicione seu primeiro campo para seu novo Tipo de Conteúdo", + "home.emptyAttributes.title": "Ainda não há campos", + "home.emptyContentType.description": "Cria seu primeiro Tipo de Conteúdo para poder recuperar dados de sua API.", + "home.emptyContentType.title": "Sem Tipos de Conteúdos disponíveis", + "menu.section.contentTypeBuilder.name.plural": "Tipos de Conteúdos", + "menu.section.contentTypeBuilder.name.singular": "Tipo de Conteúdo", + "menu.section.documentation.guide": "Leia mais sobre os Tipos De Conteúdos no nosso", + "menu.section.documentation.guideLink": "guia.", + "menu.section.documentation.name": "Documentação", + "menu.section.documentation.tutorial": "Veja nosso", + "menu.section.documentation.tutorialLink": "vídeo tutorial.", + "modelPage.attribute.relationWith": "Relação com", + "modelPage.contentHeader.emptyDescription.description": "Nenhuma descrição para este Tipo De Conteúdo", + "modelPage.contentType.list.relationShipTitle.plural": "relações", + "modelPage.contentType.list.relationShipTitle.singular": "relação", + "modelPage.contentType.list.title.including": "incluindo", + "modelPage.contentType.list.title.plural": "campos", + "modelPage.contentType.list.title.singular": "campo", + "noTableWarning.description": "Não se esqueça de criar a tabela `{modelName}` na sua base de dados", + "noTableWarning.infos": "Mais informação", + "notification.error.message": "Ocorreu um erro", + "notification.info.contentType.creating.notSaved": "Por favor, guarde seu actual Tipo de Conteúdo antes de criar um novo", + "notification.info.disable": "Este campo não pode ser editado no momento...😮", + "notification.info.optimized": "Esta extensão é optimizada com o seu localStorage", + "notification.success.contentTypeDeleted": "O Tipo de Conteúdo foi apagado", + "notification.success.message.contentType.create": "Seu Tipo de Conteúdo foi criado", + "notification.success.message.contentType.edit": "Seu Tipo de Conteúdo foi actualizado", + "plugin.description.long": "Modelize a estrutura de dados da sua API. Crie novos campos e relações em apenas um minuto. Os arquivos são automaticamente criados e actualizados no seu projecto.", + "plugin.description.short": "Modelize a estrutura de dados da sua API.", + "popUpForm.attributes.boolean.description": "Sim ou não, 1 ou 0, verdadeiro ou falso", + "popUpForm.attributes.boolean.name": "Booleano", + "popUpForm.attributes.date.description": "Evento data, horas de abertura", + "popUpForm.attributes.date.name": "Data", + "popUpForm.attributes.email.description": "Email do utilizador...", + "popUpForm.attributes.email.name": "Email", + "popUpForm.attributes.enumeration.description": "Lista de escolhas", + "popUpForm.attributes.enumeration.name": "Enumeração", + "popUpForm.attributes.json.description": "Data em formato JSON", + "popUpForm.attributes.json.name": "JSON", + "popUpForm.attributes.media.description": "Imagens, vídeos, PDFs e outros arquivos", + "popUpForm.attributes.media.name": "Media", + "popUpForm.attributes.number.description": "Tudo que seja número", + "popUpForm.attributes.number.name": "Número", + "popUpForm.attributes.password.description": "Palavra-passe do utilizador...", + "popUpForm.attributes.password.name": "Palavra-passe", + "popUpForm.attributes.relation.description": "Refere-se à um Tipo de Conteúdo", + "popUpForm.attributes.relation.name": "Relação", + "popUpForm.attributes.string.description": "Títulos, nomes, parágrafos, lista de nomes", + "popUpForm.attributes.string.name": "String", + "popUpForm.attributes.text.description": "Descrições, parágrafos de texto, artigos ", + "popUpForm.attributes.text.name": "Texto", + "popUpForm.choose.attributes.header.title": "Adicionar Novo Campo", + "popUpForm.create": "Adicionar Novo", + "popUpForm.create.contentType.header.title": "Adicionar Novo Tipo de Conteúdo", + "popUpForm.edit": "Editar", + "popUpForm.edit.contentType.header.title": "Editar Tipo de Conteúdo", + "popUpForm.field": "Campo", + "popUpForm.navContainer.advanced": "Definições Avançadas", + "popUpForm.navContainer.base": "Definições básicas", + "popUpForm.navContainer.relation": "Definir relação", + "popUpRelation.title": "Relação", + "popUpWarning.bodyMessage.attribute.delete": "Tem a certeza que pretende apagar este campo?", + "popUpWarning.bodyMessage.contentType.delete": "Tem a certeza que pretende apagar este Tipo de Conteúdo?", + "popUpWarning.button.cancel": "Cancelar", + "popUpWarning.button.confirm": "Confirmar", + "popUpWarning.title": "Por favor, confirme", + "relation.attributeName.placeholder": "Ex: autor, catégoria, tag", + "relation.manyToMany": "tem e pertence à vários", + "relation.manyToOne": "tem vários", + "relation.oneToMany": "pertence à vários", + "relation.oneToOne": "tem e pertence à um", + "relation.oneWay": "tem um", + "table.contentType.head.description": "Descrição", + "table.contentType.head.fields": "Campos", + "table.contentType.head.name": "Nome", + "table.contentType.title.plural": "Tipos de Conteúdos estão disponíveis", + "table.contentType.title.singular": "Tipo de Conteúdo está disponível" +} \ No newline at end of file diff --git a/packages/strapi-plugin-content-type-builder/admin/src/translations/ru.json b/packages/strapi-plugin-content-type-builder/admin/src/translations/ru.json index aef503c112..88f7648819 100644 --- a/packages/strapi-plugin-content-type-builder/admin/src/translations/ru.json +++ b/packages/strapi-plugin-content-type-builder/admin/src/translations/ru.json @@ -1,185 +1,157 @@ { - "plugin.description.short": "Моделируйте структуру данных вашего API.", - "plugin.description.long": - "Моделируйте структуру данных вашего API. Создавайте новые поля и связи всего за минуту. Файлы автоматически создаются и обновляются в вашем проекте.", - "attribute.string": "String", - "attribute.text": "Text", + "attribute.WYSIWYG": "Text (WYSIWYG)", "attribute.boolean": "Boolean", + "attribute.date": "Date", + "attribute.decimal": "Decimal", + "attribute.email": "Email", + "attribute.enumeration": "Enumeration", "attribute.float": "Float", "attribute.integer": "Integer", - "attribute.decimal": "Decimal", - "attribute.date": "Date", "attribute.json": "JSON", "attribute.media": "Media", - "attribute.email": "Email", "attribute.password": "Password", "attribute.relation": "Связь", - "attribute.enumeration": "Enumeration", - "attribute.WYSIWYG": "Text (WYSIWYG)", - - "contentType.temporaryDisplay": "(Не сохранено)", - "from": "from", - "home.contentTypeBuilder.name": "Типы Данных", - "home.contentTypeBuilder.description": "Создавайте и обновляйте ваш Тип Данных.", - "home.emptyContentType.title": "Нет Типов Данных", - "home.emptyContentType.description": - "Создайте ваш первый Тип Данных и у вас появится возможность загружать ваши данные при помощи API.", - - "home.emptyAttributes.title": "Пока ни одного поля не создано", - "home.emptyAttributes.description": "Добавте первое поле в ваш новый Тип Данных", - - "button.contentType.create": "Создать Тип Данных", - "button.contentType.add": "Добавить Тип Данных", + "attribute.string": "String", + "attribute.text": "Text", "button.attributes.add": "Добавить Новое Поле", - - "error.validation.required": "Это поле является обязательным.", - "error.validation.regex": "Не соответствует регулярному выражению.", - "error.validation.max": "Слишком большое.", - "error.validation.min": "Слишком маленькое.", - "error.validation.maxLength": "Слишком длинное.", - "error.validation.minLength": "Слишком короткое.", - "error.contentTypeName.taken": "Это название уже существует", - "error.attribute.taken": "Поле с таким названием уже существует", + "button.contentType.add": "Добавить Тип Данных", + "button.contentType.create": "Создать Тип Данных", + "contentType.temporaryDisplay": "(Не сохранено)", + "error.attribute.forbidden": "Такое имя атрибута зарезервировано", "error.attribute.key.taken": "Это значение уже существует", "error.attribute.sameKeyAndName": "Не может быть одинаковым", - "error.attribute.forbidden": "Такое имя атрибута зарезервировано", + "error.attribute.taken": "Поле с таким названием уже существует", + "error.contentTypeName.taken": "Это название уже существует", + "error.validation.max": "Слишком большое.", + "error.validation.maxLength": "Слишком длинное.", + "error.validation.min": "Слишком маленькое.", + "error.validation.minLength": "Слишком короткое.", "error.validation.minSupMax": "Не может быть выше", - - "form.attribute.item.textarea.name": "Название", - "form.attribute.item.number.name": "Название", - "form.attribute.item.date.name": "Название", - "form.attribute.item.media.name": "Название", - "form.attribute.item.media.multiple": "Возможно несколько файлов", - "form.attribute.item.json.name": "Название", + "error.validation.regex": "Не соответствует регулярному выражению.", + "error.validation.required": "Это поле является обязательным.", + "form.attribute.item.appearance.description": "В противном случае значение будет доступно для редактирования как обычное текстовое поле", + "form.attribute.item.appearance.label": "Показывать WYSIWYG", + "form.attribute.item.appearance.name": "Отображение", "form.attribute.item.boolean.name": "Название", - "form.attribute.item.string.name": "Название", - "form.attribute.item.enumeration.name": "Название", - "form.attribute.item.enumeration.rules": "Values (separate them with a comma)", + "form.attribute.item.customColumnName": "Настраиваемые названия столбца", + "form.attribute.item.customColumnName.description": "Это удобно иметь возможность переименовывать название столбцов для настройки ответов от API.", + "form.attribute.item.date.name": "Название", + "form.attribute.item.defineRelation.fieldName": "Название поля", "form.attribute.item.enumeration.graphql": "Name override for GraphQL", "form.attribute.item.enumeration.graphql.description": "Allows you to override the default generated name for GraphQL", + "form.attribute.item.enumeration.name": "Название", "form.attribute.item.enumeration.placeholder": "Ex: morning,noon,evening", - "form.attribute.item.appearance.name": "Отображение", - "form.attribute.item.appearance.label": "Показывать WYSIWYG", - "form.attribute.item.appearance.description": - "В противном случае значение будет доступно для редактирования как обычное текстовое поле", - "form.attribute.item.settings.name": "Настройки", - "form.attribute.item.requiredField": "Обязательное поле", - "form.attribute.item.uniqueField": "Уникальное поле", + "form.attribute.item.enumeration.rules": "Values (separate them with a comma)", + "form.attribute.item.json.name": "Название", + "form.attribute.item.maximum": "Максимальное значение", + "form.attribute.item.maximumLength": "Максимальная длина", + "form.attribute.item.media.multiple": "Возможно несколько файлов", + "form.attribute.item.media.name": "Название", "form.attribute.item.minimum": "Минимальное значение", "form.attribute.item.minimumLength": "Минимальная длина", - "form.attribute.item.maximumLength": "Максимальная длина", - "form.attribute.item.maximum": "Максимальное значение", - "form.attribute.item.requiredField.description": - "Вы не сможете создать запись если это поле останенься пустым", - "form.attribute.item.uniqueField.description": - "Вы не сможете создать запись если существует запись с аналогичным содержанием", - "form.attribute.item.defineRelation.fieldName": "Название поля", - "form.attribute.item.customColumnName": "Настраиваемые названия столбца", - "form.attribute.item.customColumnName.description": - "Это удобно иметь возможность переименовывать название столбцов для настройки ответов от API.", + "form.attribute.item.number.name": "Название", "form.attribute.item.number.type": "Числовой формат", - "form.attribute.item.number.type.integer": "integer (ex: 10)", - "form.attribute.item.number.type.float": "float (ex: 3.33333333)", "form.attribute.item.number.type.decimal": "decimal (ex: 2.22)", + "form.attribute.item.number.type.float": "float (ex: 3.33333333)", + "form.attribute.item.number.type.integer": "integer (ex: 10)", + "form.attribute.item.requiredField": "Обязательное поле", + "form.attribute.item.requiredField.description": "Вы не сможете создать запись если это поле останенься пустым", + "form.attribute.item.settings.name": "Настройки", + "form.attribute.item.string.name": "Название", + "form.attribute.item.textarea.name": "Название", + "form.attribute.item.uniqueField": "Уникальное поле", + "form.attribute.item.uniqueField.description": "Вы не сможете создать запись если существует запись с аналогичным содержанием", "form.attribute.settings.default": "Стандартное значение", "form.attribute.settings.default.checkboxLabel": "Установить значение — true", - "form.button.cancel": "Отменить", "form.button.continue": "Продолжить", "form.button.save": "Сохранить", - + "form.contentType.item.collectionName": "Название коллекции", + "form.contentType.item.collectionName.inputDescription": "Полезно, когда название вашего Типа Данных и название вашей таблицы различаются", "form.contentType.item.connections": "Соединение", + "form.contentType.item.description": "Описание", + "form.contentType.item.description.placeholder": "Добавте ваше короткое описание...", "form.contentType.item.name": "Название", "form.contentType.item.name.description": "Название Типов Данных должны быть уникальными: {link}", "form.contentType.item.name.link.description": "Ознакомьтесь с нашей документацией", - "form.contentType.item.description": "Описание", - "form.contentType.item.description.placeholder": "Добавте ваше короткое описание...", - "form.contentType.item.collectionName": "Название коллекции", - "form.contentType.item.collectionName.inputDescription": - "Полезно, когда название вашего Типа Данных и название вашей таблицы различаются", - + "from": "from", + "home.contentTypeBuilder.description": "Создавайте и обновляйте ваш Тип Данных.", + "home.contentTypeBuilder.name": "Типы Данных", + "home.emptyAttributes.description": "Добавте первое поле в ваш новый Тип Данных", + "home.emptyAttributes.title": "Пока ни одного поля не создано", + "home.emptyContentType.description": "Создайте ваш первый Тип Данных и у вас появится возможность загружать ваши данные при помощи API.", + "home.emptyContentType.title": "Нет Типов Данных", "menu.section.contentTypeBuilder.name.plural": "Типы Данных", "menu.section.contentTypeBuilder.name.singular": "Тип Данных", - "menu.section.documentation.name": "Документация", "menu.section.documentation.guide": "Прочтите больше о Типах Данных в нашем", "menu.section.documentation.guideLink": "руководстве.", + "menu.section.documentation.name": "Документация", "menu.section.documentation.tutorial": "Посмотрите наши", "menu.section.documentation.tutorialLink": "обучающие видео.", - - "modelPage.contentHeader.emptyDescription.description": - "Нет описания для этого Типа Данных", - "modelPage.contentType.list.title.plural": "поля", - "modelPage.contentType.list.title.singular": "поле", - "modelPage.contentType.list.title.including": "включает", + "modelPage.attribute.relationWith": "Связан с", + "modelPage.contentHeader.emptyDescription.description": "Нет описания для этого Типа Данных", "modelPage.contentType.list.relationShipTitle.plural": "связи", "modelPage.contentType.list.relationShipTitle.singular": "связь", - "modelPage.attribute.relationWith": "Связан с", - + "modelPage.contentType.list.title.including": "включает", + "modelPage.contentType.list.title.plural": "поля", + "modelPage.contentType.list.title.singular": "поле", "noTableWarning.description": "Не забудте создать таблицу `{modelName}` в вашей базе данных", "noTableWarning.infos": "Больше информации", - "notification.error.message": "Возникла ошибка", - "notification.info.contentType.creating.notSaved": - "Пожалуйста сохраните ваш текущий Тип Данных перед тем как создавать новый", + "notification.info.contentType.creating.notSaved": "Пожалуйста сохраните ваш текущий Тип Данных перед тем как создавать новый", "notification.info.disable": "Это поле в данный момент не редактируемо...😮", "notification.info.optimized": "Плагин оптимизирован с вашим localstorage", - "notification.success.message.contentType.edit": "Ваш Тип Данных обновлен", - "notification.success.message.contentType.create": "Ваш Тип Данных создан", "notification.success.contentTypeDeleted": "Ваш Тип Данных удален", - - "popUpForm.attributes.string.description": "Загаловки, названия, имена, перечень названий", - "popUpForm.attributes.text.description": "Описания, текстовые параграфы, статьи", + "notification.success.message.contentType.create": "Ваш Тип Данных создан", + "notification.success.message.contentType.edit": "Ваш Тип Данных обновлен", + "plugin.description.long": "Моделируйте структуру данных вашего API. Создавайте новые поля и связи всего за минуту. Файлы автоматически создаются и обновляются в вашем проекте.", + "plugin.description.short": "Моделируйте структуру данных вашего API.", "popUpForm.attributes.boolean.description": "Yes или no, 1 или 0, true или false", - "popUpForm.attributes.number.description": "Все что является числом", - "popUpForm.attributes.date.description": "Дата события, рабочие часы", - "popUpForm.attributes.json.description": "Данные в JSON формате", - "popUpForm.attributes.media.description": "Картинки, видео, PDF и другие виды файлов", - "popUpForm.attributes.relation.description": "Связан с Типом Данных", - "popUpForm.attributes.email.description": "Пользовательский email...", - "popUpForm.attributes.password.description": "Пароль пользователя...", - "popUpForm.attributes.enumeration.description": "List of choices", - - "popUpForm.attributes.string.name": "String", - "popUpForm.attributes.text.name": "Text", "popUpForm.attributes.boolean.name": "Boolean", + "popUpForm.attributes.date.description": "Дата события, рабочие часы", "popUpForm.attributes.date.name": "Date", - "popUpForm.attributes.json.name": "JSON", - "popUpForm.attributes.media.name": "Media", - "popUpForm.attributes.number.name": "Number", - "popUpForm.attributes.relation.name": "Relation", + "popUpForm.attributes.email.description": "Пользовательский email...", "popUpForm.attributes.email.name": "Email", + "popUpForm.attributes.enumeration.description": "List of choices", + "popUpForm.attributes.enumeration.name": "Enumeration", + "popUpForm.attributes.json.description": "Данные в JSON формате", + "popUpForm.attributes.json.name": "JSON", + "popUpForm.attributes.media.description": "Картинки, видео, PDF и другие виды файлов", + "popUpForm.attributes.media.name": "Media", + "popUpForm.attributes.number.description": "Все что является числом", + "popUpForm.attributes.number.name": "Number", + "popUpForm.attributes.password.description": "Пароль пользователя...", "popUpForm.attributes.password.name": "Password", - "popUpForm.attributes.enumeration.name": "Enumeration", - "popUpForm.create": "Добавить новое", - "popUpForm.edit": "Отредактировать", - "popUpForm.field": "Поле", - "popUpForm.create.contentType.header.title": "Добавить новый Тип Данных", + "popUpForm.attributes.relation.description": "Связан с Типом Данных", + "popUpForm.attributes.relation.name": "Relation", + "popUpForm.attributes.string.description": "Загаловки, названия, имена, перечень названий", + "popUpForm.attributes.string.name": "String", + "popUpForm.attributes.text.description": "Описания, текстовые параграфы, статьи", + "popUpForm.attributes.text.name": "Text", "popUpForm.choose.attributes.header.title": "Добавить новое поле", + "popUpForm.create": "Добавить новое", + "popUpForm.create.contentType.header.title": "Добавить новый Тип Данных", + "popUpForm.edit": "Отредактировать", "popUpForm.edit.contentType.header.title": "Отредактировать Тип Данных", - - "popUpForm.navContainer.relation": "Определить связь", - "popUpForm.navContainer.base": "Базовый настройки", + "popUpForm.field": "Поле", "popUpForm.navContainer.advanced": "Расширенные настройки", - + "popUpForm.navContainer.base": "Базовый настройки", + "popUpForm.navContainer.relation": "Определить связь", "popUpRelation.title": "Связь", - + "popUpWarning.bodyMessage.attribute.delete": "Вы уверены, что хотите удалить это поле?", + "popUpWarning.bodyMessage.contentType.delete": "Вы уверены, что хотите удалить этот Тип Данных?", "popUpWarning.button.cancel": "Отменить", "popUpWarning.button.confirm": "Подтвердить", "popUpWarning.title": "Пожалуйста подтвердите", - "popUpWarning.bodyMessage.contentType.delete": - "Вы уверены, что хотите удалить этот Тип Данных?", - "popUpWarning.bodyMessage.attribute.delete": "Вы уверены, что хотите удалить это поле?", - - "table.contentType.title.plural": "Типы Данных доступны", - "table.contentType.title.singular": "Тип Данных доступен", - "table.contentType.head.name": "Название", + "relation.attributeName.placeholder": "Пример: автор, категория, тег", + "relation.manyToMany": "имеет и принадлежит многим", + "relation.manyToOne": "имеет много", + "relation.oneToMany": "принадлежит многим", + "relation.oneToOne": "имеет один", + "relation.oneWay": "один принадлежит", "table.contentType.head.description": "Описание", "table.contentType.head.fields": "Поля", - - "relation.oneWay": "один принадлежит", - "relation.oneToOne": "имеет один", - "relation.oneToMany": "принадлежит многим", - "relation.manyToOne": "имеет много", - "relation.manyToMany": "имеет и принадлежит многим", - "relation.attributeName.placeholder": "Пример: автор, категория, тег" -} \ No newline at end of file + "table.contentType.head.name": "Название", + "table.contentType.title.plural": "Типы Данных доступны", + "table.contentType.title.singular": "Тип Данных доступен" +} \ No newline at end of file diff --git a/packages/strapi-plugin-content-type-builder/admin/src/translations/tr.json b/packages/strapi-plugin-content-type-builder/admin/src/translations/tr.json index 4da69543a8..fff448251b 100644 --- a/packages/strapi-plugin-content-type-builder/admin/src/translations/tr.json +++ b/packages/strapi-plugin-content-type-builder/admin/src/translations/tr.json @@ -1,184 +1,157 @@ { - "plugin.description.short": "Servisinizin veri yapısını modelleyin.", - "plugin.description.long": - "Servisinizin veri yapısını modelleyin. Bir dakika içinde yeni alanlar ve ilişkiler yaratın. Dosyalar, projenizde otomatik olarak oluşturulur ve güncellenir.", - "attribute.string": "String", - "attribute.text": "Yazı", + "attribute.WYSIWYG": "Text (WYSIWYG)", "attribute.boolean": "Mantıksal", + "attribute.date": "Tarih", + "attribute.decimal": "Ondalık", + "attribute.email": "E-posta", + "attribute.enumeration": "Enumeration", "attribute.float": "Ondalık", "attribute.integer": "Tamsayı", - "attribute.decimal": "Ondalık", - "attribute.date": "Tarih", "attribute.json": "JSON", "attribute.media": "Medya", - "attribute.email": "E-posta", "attribute.password": "Parola", "attribute.relation": "İlişki", - "attribute.enumeration": "Enumeration", - "attribute.WYSIWYG": "Text (WYSIWYG)", - - "contentType.temporaryDisplay": "(Kaydedilmedi)", - "from": "kimden", - "home.contentTypeBuilder.name": "İçerik Türleri", - "home.contentTypeBuilder.description": "Kendi İçerik Türlerinizi oluşturun ve güncelleyin.", - "home.emptyContentType.title": "Kullanılabilir İçerik Türü bulunmamaktadır.", - "home.emptyContentType.description": - "Servisinizden veri alabilmek için ilk İçerik Türünüzü oluşturun.", - - "home.emptyAttributes.title": "Henüz bir alan bulunmamaktadır.", - "home.emptyAttributes.description": "İçerik Türünüze ilk alanınızı ekleyin", - - "button.contentType.create": "İçerik Türü Oluştur", - "button.contentType.add": "İçerik Türü Ekle", + "attribute.string": "String", + "attribute.text": "Yazı", "button.attributes.add": "Yeni alan ekle", - - "error.validation.required": "Zorunlu alandır.", - "error.validation.regex": "Regex ile eşleşmiyor.", - "error.validation.max": "Değer çok yüksek.", - "error.validation.min": "Değer çok az.", - "error.validation.maxLength": "Değer çok uzun.", - "error.validation.minLength": "Değer çok kısa.", - "error.contentTypeName.taken": "Bu alan ismi zaten var.", - "error.attribute.taken": "Bu alan ismi zaten var.", + "button.contentType.add": "İçerik Türü Ekle", + "button.contentType.create": "İçerik Türü Oluştur", + "contentType.temporaryDisplay": "(Kaydedilmedi)", + "error.attribute.forbidden": "Bu özellik adı saklıdır", "error.attribute.key.taken": "Bu değer zaten var.", "error.attribute.sameKeyAndName": "Eşit olamaz", + "error.attribute.taken": "Bu alan ismi zaten var.", + "error.contentTypeName.taken": "Bu alan ismi zaten var.", + "error.validation.max": "Değer çok yüksek.", + "error.validation.maxLength": "Değer çok uzun.", + "error.validation.min": "Değer çok az.", + "error.validation.minLength": "Değer çok kısa.", "error.validation.minSupMax": "Üstü olamaz", - "error.attribute.forbidden": "Bu özellik adı saklıdır", - - "form.attribute.item.textarea.name": "İsim", - "form.attribute.item.number.name": "İsim", - "form.attribute.item.date.name": "İsim", - "form.attribute.item.media.name": "İsim", - "form.attribute.item.media.multiple": "Birden çok dosyaya izin ver", - "form.attribute.item.json.name": "İsim", + "error.validation.regex": "Regex ile eşleşmiyor.", + "error.validation.required": "Zorunlu alandır.", + "form.attribute.item.appearance.description": "Aksi halde, değer temel bir textarea alanıyla düzenlenebilir", + "form.attribute.item.appearance.label": "WYSIWYG olarak görüntüle", + "form.attribute.item.appearance.name": "Görünüm", "form.attribute.item.boolean.name": "İsim", - "form.attribute.item.string.name": "İsim", - "form.attribute.item.enumeration.name": "İsim", - "form.attribute.item.enumeration.rules": "Değerler (virgülle ayırın)", - "form.attribute.item.enumeration.placeholder": "Örn: sabah, öğlen, akşam", + "form.attribute.item.customColumnName": "Özel kolon isimleri", + "form.attribute.item.customColumnName.description": "Bu veritabanı sütun isimleri servis yanıtları için daha kapsamlı bir biçimde yeniden adlandırmak için kullanışlıdır", + "form.attribute.item.date.name": "İsim", + "form.attribute.item.defineRelation.fieldName": "Alan adı", "form.attribute.item.enumeration.graphql": "GraphQL için isim geçersiz kıl", "form.attribute.item.enumeration.graphql.description": "GraphQL için varsayılan oluşturulan adı geçersiz kılmanıza izin verir.", - "form.attribute.item.appearance.name": "Görünüm", - "form.attribute.item.appearance.label": "WYSIWYG olarak görüntüle", - "form.attribute.item.appearance.description": - "Aksi halde, değer temel bir textarea alanıyla düzenlenebilir", - "form.attribute.item.settings.name": "Ayarlar", - "form.attribute.item.requiredField": "Zorunlu alan", - "form.attribute.item.uniqueField": "Benzersiz alan", + "form.attribute.item.enumeration.name": "İsim", + "form.attribute.item.enumeration.placeholder": "Örn: sabah, öğlen, akşam", + "form.attribute.item.enumeration.rules": "Değerler (virgülle ayırın)", + "form.attribute.item.json.name": "İsim", + "form.attribute.item.maximum": "En yüksek değer", + "form.attribute.item.maximumLength": "En yüksek uzunluk", + "form.attribute.item.media.multiple": "Birden çok dosyaya izin ver", + "form.attribute.item.media.name": "İsim", "form.attribute.item.minimum": "En düşük değer", "form.attribute.item.minimumLength": "En düşük uzunluk", - "form.attribute.item.maximumLength": "En yüksek uzunluk", - "form.attribute.item.maximum": "En yüksek değer", - "form.attribute.item.requiredField.description": "Bu alan boşsa kayıt oluşturamazsınız", - "form.attribute.item.uniqueField.description": - "Aynı içeriğe sahip bir kayıt varsa kayıt oluşturamazsınız.", - "form.attribute.item.defineRelation.fieldName": "Alan adı", - "form.attribute.item.customColumnName": "Özel kolon isimleri", - "form.attribute.item.customColumnName.description": - "Bu veritabanı sütun isimleri servis yanıtları için daha kapsamlı bir biçimde yeniden adlandırmak için kullanışlıdır", + "form.attribute.item.number.name": "İsim", "form.attribute.item.number.type": "Sayı biçimi", - "form.attribute.item.number.type.integer": "tamsayı (ex: 10)", - "form.attribute.item.number.type.float": "float (ex: 3.33333333)", "form.attribute.item.number.type.decimal": "ondalık (ex: 2.22)", + "form.attribute.item.number.type.float": "float (ex: 3.33333333)", + "form.attribute.item.number.type.integer": "tamsayı (ex: 10)", + "form.attribute.item.requiredField": "Zorunlu alan", + "form.attribute.item.requiredField.description": "Bu alan boşsa kayıt oluşturamazsınız", + "form.attribute.item.settings.name": "Ayarlar", + "form.attribute.item.string.name": "İsim", + "form.attribute.item.textarea.name": "İsim", + "form.attribute.item.uniqueField": "Benzersiz alan", + "form.attribute.item.uniqueField.description": "Aynı içeriğe sahip bir kayıt varsa kayıt oluşturamazsınız.", "form.attribute.settings.default": "Varsayılan değer", "form.attribute.settings.default.checkboxLabel": "Seçili olarak ayarla", - "form.button.cancel": "İptal", "form.button.continue": "Devam", "form.button.save": "Kaydet", - + "form.contentType.item.collectionName": "Koleksiyon Adı", + "form.contentType.item.collectionName.inputDescription": "İçerik Türünüzün adı ve tablonuzun adı farklı olduğunda kullanışlıdır.", "form.contentType.item.connections": "Bağlantı", + "form.contentType.item.description": "Açıklama", + "form.contentType.item.description.placeholder": "Küçük açıklama yaz...", "form.contentType.item.name": "İsim", "form.contentType.item.name.description": "İçerik Türü isimleri tekil olmalıdır: {link}", "form.contentType.item.name.link.description": "Dokümana göz atın", - "form.contentType.item.description": "Açıklama", - "form.contentType.item.description.placeholder": "Küçük açıklama yaz...", - "form.contentType.item.collectionName": "Koleksiyon Adı", - "form.contentType.item.collectionName.inputDescription": - "İçerik Türünüzün adı ve tablonuzun adı farklı olduğunda kullanışlıdır.", - + "from": "kimden", + "home.contentTypeBuilder.description": "Kendi İçerik Türlerinizi oluşturun ve güncelleyin.", + "home.contentTypeBuilder.name": "İçerik Türleri", + "home.emptyAttributes.description": "İçerik Türünüze ilk alanınızı ekleyin", + "home.emptyAttributes.title": "Henüz bir alan bulunmamaktadır.", + "home.emptyContentType.description": "Servisinizden veri alabilmek için ilk İçerik Türünüzü oluşturun.", + "home.emptyContentType.title": "Kullanılabilir İçerik Türü bulunmamaktadır.", "menu.section.contentTypeBuilder.name.plural": "İçerik Türleri", "menu.section.contentTypeBuilder.name.singular": "İçerik Türü", - "menu.section.documentation.name": "Dokümantasyon", "menu.section.documentation.guide": "İçerik Türleri hakkında daha fazla bilgi için", "menu.section.documentation.guideLink": "kılavuz.", + "menu.section.documentation.name": "Dokümantasyon", "menu.section.documentation.tutorial": "İnceleyin", "menu.section.documentation.tutorialLink": "Öğretici video.", - - "modelPage.contentHeader.emptyDescription.description": - "Bu İçerik Türü için açıklama bulunmamaktadır.", - "modelPage.contentType.list.title.plural": "alanlar", - "modelPage.contentType.list.title.singular": "alan", - "modelPage.contentType.list.title.including": "içeren", + "modelPage.attribute.relationWith": "İlişkili", + "modelPage.contentHeader.emptyDescription.description": "Bu İçerik Türü için açıklama bulunmamaktadır.", "modelPage.contentType.list.relationShipTitle.plural": "ilişkiler", "modelPage.contentType.list.relationShipTitle.singular": "ilişki", - "modelPage.attribute.relationWith": "İlişkili", - + "modelPage.contentType.list.title.including": "içeren", + "modelPage.contentType.list.title.plural": "alanlar", + "modelPage.contentType.list.title.singular": "alan", "noTableWarning.description": "Veritabanında `{modelName}` tablosunu oluşturmayı unutmayın", "noTableWarning.infos": "Daha fazla bilgi", - "notification.error.message": "Bir hata oluştu.", - "notification.info.contentType.creating.notSaved": - "Lütfen yeni bir tane oluşturmadan önce mevcut İçerik Türünüzü kaydedin", + "notification.info.contentType.creating.notSaved": "Lütfen yeni bir tane oluşturmadan önce mevcut İçerik Türünüzü kaydedin", "notification.info.disable": "Bu alan şu an için düzenlenemez ... 😮", "notification.info.optimized": "Bu eklenti, localStorage ile optimize edilmiştir", - "notification.success.message.contentType.edit": "İçerik Türünüz güncellendi", - "notification.success.message.contentType.create": "İçerik Türünüz oluşturuldu", "notification.success.contentTypeDeleted": "İçerik Türü silindi", - - "popUpForm.attributes.string.description": "Başlıklar, adlar, paragraflar, isim listesi", - "popUpForm.attributes.text.description": "Tanımlar, metin paragrafları, makaleler ", + "notification.success.message.contentType.create": "İçerik Türünüz oluşturuldu", + "notification.success.message.contentType.edit": "İçerik Türünüz güncellendi", + "plugin.description.long": "Servisinizin veri yapısını modelleyin. Bir dakika içinde yeni alanlar ve ilişkiler yaratın. Dosyalar, projenizde otomatik olarak oluşturulur ve güncellenir.", + "plugin.description.short": "Servisinizin veri yapısını modelleyin.", "popUpForm.attributes.boolean.description": "Evet veya hayır, 1 veya 0, doğru veya yanlış", - "popUpForm.attributes.number.description": "Numara olan her şey", - "popUpForm.attributes.date.description": "Etkinlik tarihi, çalışma saatleri", - "popUpForm.attributes.json.description": "JSON formatındaki veriler", - "popUpForm.attributes.media.description": "Resimler, videolar, PDF'ler ve diğer dosyalar", - "popUpForm.attributes.relation.description": "Bir İçerik Türünü Belirtiyor", - "popUpForm.attributes.email.description": "Kullanıcının e-postası...", - "popUpForm.attributes.password.description": "Kullanıcı şifresi...", - "popUpForm.attributes.enumeration.description": "List of choices", - - "popUpForm.attributes.string.name": "String", - "popUpForm.attributes.text.name": "Yazı", "popUpForm.attributes.boolean.name": "Mantıksal", + "popUpForm.attributes.date.description": "Etkinlik tarihi, çalışma saatleri", "popUpForm.attributes.date.name": "Tarih", - "popUpForm.attributes.json.name": "JSON", - "popUpForm.attributes.media.name": "Medya", - "popUpForm.attributes.number.name": "Sayı", - "popUpForm.attributes.relation.name": "İlişki", + "popUpForm.attributes.email.description": "Kullanıcının e-postası...", "popUpForm.attributes.email.name": "E-posta", + "popUpForm.attributes.enumeration.description": "List of choices", + "popUpForm.attributes.enumeration.name": "Enumeration", + "popUpForm.attributes.json.description": "JSON formatındaki veriler", + "popUpForm.attributes.json.name": "JSON", + "popUpForm.attributes.media.description": "Resimler, videolar, PDF'ler ve diğer dosyalar", + "popUpForm.attributes.media.name": "Medya", + "popUpForm.attributes.number.description": "Numara olan her şey", + "popUpForm.attributes.number.name": "Sayı", + "popUpForm.attributes.password.description": "Kullanıcı şifresi...", "popUpForm.attributes.password.name": "Parola", - "popUpForm.attributes.enumeration.name": "Enumeration", - "popUpForm.create": "Yeni ekle", - "popUpForm.edit": "Düzenle", - "popUpForm.field": "Alan", - "popUpForm.create.contentType.header.title": "Yeni İçerik Türü Ekle", + "popUpForm.attributes.relation.description": "Bir İçerik Türünü Belirtiyor", + "popUpForm.attributes.relation.name": "İlişki", + "popUpForm.attributes.string.description": "Başlıklar, adlar, paragraflar, isim listesi", + "popUpForm.attributes.string.name": "String", + "popUpForm.attributes.text.description": "Tanımlar, metin paragrafları, makaleler ", + "popUpForm.attributes.text.name": "Yazı", "popUpForm.choose.attributes.header.title": "Yeni Alan Ekle", + "popUpForm.create": "Yeni ekle", + "popUpForm.create.contentType.header.title": "Yeni İçerik Türü Ekle", + "popUpForm.edit": "Düzenle", "popUpForm.edit.contentType.header.title": "İçerik Türünü Düzenle", - - "popUpForm.navContainer.relation": "Ilişki tanımla", - "popUpForm.navContainer.base": "Temel ayarlar", + "popUpForm.field": "Alan", "popUpForm.navContainer.advanced": "Gelişmiş Ayarlar", - + "popUpForm.navContainer.base": "Temel ayarlar", + "popUpForm.navContainer.relation": "Ilişki tanımla", "popUpRelation.title": "İlişki", - + "popUpWarning.bodyMessage.attribute.delete": "Bu alanı silmek istediğinizden emin misiniz?", + "popUpWarning.bodyMessage.contentType.delete": "Bu İçerik Türünü silmek istediğinizden emin misiniz?", "popUpWarning.button.cancel": "İptal", "popUpWarning.button.confirm": "Onaylar", "popUpWarning.title": "Lütfen onaylayın", - "popUpWarning.bodyMessage.contentType.delete": - "Bu İçerik Türünü silmek istediğinizden emin misiniz?", - "popUpWarning.bodyMessage.attribute.delete": "Bu alanı silmek istediğinizden emin misiniz?", - - "table.contentType.title.plural": "İçerik Türleri kullanılabilir", - "table.contentType.title.singular": "İçerik Türü kullanılabilir", - "table.contentType.head.name": "İsim", + "relation.attributeName.placeholder": "Örnek: yazar, katagori, etiket", + "relation.manyToMany": "birçok kişiye ait ve ait", + "relation.manyToOne": "Birçok var", + "relation.oneToMany": "Birçoğuna ait", + "relation.oneToOne": "biri var", + "relation.oneWay": "tek yönlü", "table.contentType.head.description": "Açıklama", "table.contentType.head.fields": "Alanlar", - - "relation.oneWay": "tek yönlü", - "relation.oneToOne": "biri var", - "relation.oneToMany": "Birçoğuna ait", - "relation.manyToOne": "Birçok var", - "relation.manyToMany": "birçok kişiye ait ve ait", - "relation.attributeName.placeholder": "Örnek: yazar, katagori, etiket" -} + "table.contentType.head.name": "İsim", + "table.contentType.title.plural": "İçerik Türleri kullanılabilir", + "table.contentType.title.singular": "İçerik Türü kullanılabilir" +} \ No newline at end of file diff --git a/packages/strapi-plugin-content-type-builder/admin/src/translations/zh-Hans.json b/packages/strapi-plugin-content-type-builder/admin/src/translations/zh-Hans.json index f046418133..94e2676832 100644 --- a/packages/strapi-plugin-content-type-builder/admin/src/translations/zh-Hans.json +++ b/packages/strapi-plugin-content-type-builder/admin/src/translations/zh-Hans.json @@ -1,181 +1,155 @@ { - "plugin.description.short": "给你的API的数据结构建模", - "plugin.description.long": - "给你的API的数据结构建模. 快速的创造新的字段(fields)和关系(relations)。将会自动在项目中创建和更新文件。", - "attribute.string": "String", - "attribute.text": "Text", + "attribute.WYSIWYG": "Text (WYSIWYG)", "attribute.boolean": "Boolean", + "attribute.date": "Date", + "attribute.decimal": "Decimal", + "attribute.email": "Email", + "attribute.enumeration": "Enumeration", "attribute.float": "Float", "attribute.integer": "integer", - "attribute.decimal": "Decimal", - "attribute.date": "Date", "attribute.json": "JSON", "attribute.media": "Media", - "attribute.email": "Email", "attribute.password": "Password", "attribute.relation": "Relation", - "attribute.enumeration": "Enumeration", - "attribute.WYSIWYG": "Text (WYSIWYG)", - - "contentType.temporaryDisplay": "(未保存)", - "from": "from", - "home.contentTypeBuilder.name": "Content Types", - "home.contentTypeBuilder.description": "创建和更新自己Content Types.", - "home.emptyContentType.title": "没有可用的Content Types", - "home.emptyContentType.description": - "创建第一个Content Type,以便能够从API中检索数据。", - - "home.emptyAttributes.title": "还没有字段", - "home.emptyAttributes.description": "为你的新Content Type添加第一个字段", - - "button.contentType.create": "创建Content Type", - "button.contentType.add": "增加Content Type", + "attribute.string": "String", + "attribute.text": "Text", "button.attributes.add": "增加New字段", - - "error.validation.required": "必填项", - "error.validation.regex": "格式错误", - "error.validation.max": "超过最大值", - "error.validation.min": "低于最小值", - "error.validation.maxLength": "超过最大长度", - "error.validation.minLength": "小于最小长度", - "error.contentTypeName.taken": "名称已存在", - "error.attribute.taken": "字段名称已存在", + "button.contentType.add": "增加Content Type", + "button.contentType.create": "创建Content Type", + "contentType.temporaryDisplay": "(未保存)", "error.attribute.key.taken": "该值已存在", "error.attribute.sameKeyAndName": "不能相等", + "error.attribute.taken": "字段名称已存在", + "error.contentTypeName.taken": "名称已存在", + "error.validation.max": "超过最大值", + "error.validation.maxLength": "超过最大长度", + "error.validation.min": "低于最小值", + "error.validation.minLength": "小于最小长度", "error.validation.minSupMax": "最小值大于最大值。", - - "form.attribute.item.textarea.name": "Name", - "form.attribute.item.number.name": "Name", - "form.attribute.item.date.name": "Name", - "form.attribute.item.media.name": "Name", - "form.attribute.item.media.multiple": "允许多个文件", - "form.attribute.item.json.name": "Name", + "error.validation.regex": "格式错误", + "error.validation.required": "必填项", + "form.attribute.item.appearance.description": "否则,该值将通过基本文本字段进行编辑。", + "form.attribute.item.appearance.label": "Display as a WYSIWYG", + "form.attribute.item.appearance.name": "Appearance", "form.attribute.item.boolean.name": "Name", - "form.attribute.item.string.name": "Name", - "form.attribute.item.enumeration.name": "Name", - "form.attribute.item.enumeration.rules": "Values (separate them with a comma)", - "form.attribute.item.enumeration.placeholder": "Ex: morning,noon,evening", + "form.attribute.item.customColumnName": "Custom column names", + "form.attribute.item.customColumnName.description": "修改数据库列名,使得API返回更容易理解。", + "form.attribute.item.date.name": "Name", + "form.attribute.item.defineRelation.fieldName": "Field name", "form.attribute.item.enumeration.graphql": "Name override for GraphQL", "form.attribute.item.enumeration.graphql.description": "Allows you to override the default generated name for GraphQL", - "form.attribute.item.appearance.name": "Appearance", - "form.attribute.item.appearance.label": "Display as a WYSIWYG", - "form.attribute.item.appearance.description": - "否则,该值将通过基本文本字段进行编辑。", - "form.attribute.item.settings.name": "设置", - "form.attribute.item.requiredField": "必须的", - "form.attribute.item.uniqueField": "唯一的", + "form.attribute.item.enumeration.name": "Name", + "form.attribute.item.enumeration.placeholder": "Ex: morning,noon,evening", + "form.attribute.item.enumeration.rules": "Values (separate them with a comma)", + "form.attribute.item.json.name": "Name", + "form.attribute.item.maximum": "最大值", + "form.attribute.item.maximumLength": "最大长度", + "form.attribute.item.media.multiple": "允许多个文件", + "form.attribute.item.media.name": "Name", "form.attribute.item.minimum": "最小值", "form.attribute.item.minimumLength": "最小长度", - "form.attribute.item.maximumLength": "最大长度", - "form.attribute.item.maximum": "最大值", - "form.attribute.item.requiredField.description": - "如果此字段为空,则无法创建条目。", - "form.attribute.item.uniqueField.description": - "如果存在具有相同内容的现有条目,则无法创建条目。", - "form.attribute.item.defineRelation.fieldName": "Field name", - "form.attribute.item.customColumnName": "Custom column names", - "form.attribute.item.customColumnName.description":"修改数据库列名,使得API返回更容易理解。", + "form.attribute.item.number.name": "Name", "form.attribute.item.number.type": "Number format", - "form.attribute.item.number.type.integer": "integer (ex: 10)", - "form.attribute.item.number.type.float": "float (ex: 3.33333333)", "form.attribute.item.number.type.decimal": "decimal (ex: 2.22)", + "form.attribute.item.number.type.float": "float (ex: 3.33333333)", + "form.attribute.item.number.type.integer": "integer (ex: 10)", + "form.attribute.item.requiredField": "必须的", + "form.attribute.item.requiredField.description": "如果此字段为空,则无法创建条目。", + "form.attribute.item.settings.name": "设置", + "form.attribute.item.string.name": "Name", + "form.attribute.item.textarea.name": "Name", + "form.attribute.item.uniqueField": "唯一的", + "form.attribute.item.uniqueField.description": "如果存在具有相同内容的现有条目,则无法创建条目。", "form.attribute.settings.default": "默认值", "form.attribute.settings.default.checkboxLabel": "Set to true", - "form.button.cancel": "取消", "form.button.continue": "继续", "form.button.save": "保存", - + "form.contentType.item.collectionName": "Collection Name", + "form.contentType.item.collectionName.inputDescription": "当你的Content Type和你的数据库表名不一样的时候", "form.contentType.item.connections": "连接", + "form.contentType.item.description": "描述", + "form.contentType.item.description.placeholder": "在这里写下你的描述...", "form.contentType.item.name": "名称", "form.contentType.item.name.description": "Content Type names should be singular: {link}", "form.contentType.item.name.link.description": "查看我们的文档", - "form.contentType.item.description": "描述", - "form.contentType.item.description.placeholder": "在这里写下你的描述...", - "form.contentType.item.collectionName": "Collection Name", - "form.contentType.item.collectionName.inputDescription": - "当你的Content Type和你的数据库表名不一样的时候", - + "from": "from", + "home.contentTypeBuilder.description": "创建和更新自己Content Types.", + "home.contentTypeBuilder.name": "Content Types", + "home.emptyAttributes.description": "为你的新Content Type添加第一个字段", + "home.emptyAttributes.title": "还没有字段", + "home.emptyContentType.description": "创建第一个Content Type,以便能够从API中检索数据。", + "home.emptyContentType.title": "没有可用的Content Types", "menu.section.contentTypeBuilder.name.plural": "Content Types", "menu.section.contentTypeBuilder.name.singular": "Content Type", - "menu.section.documentation.name": "Documentation", "menu.section.documentation.guide": "阅读更多关于我们的Content Types", "menu.section.documentation.guideLink": "guide.", + "menu.section.documentation.name": "Documentation", "menu.section.documentation.tutorial": "看看我们的", "menu.section.documentation.tutorialLink": "教程视频。", - + "modelPage.attribute.relationWith": "Relation with", "modelPage.contentHeader.emptyDescription.description": "该Content Type没有任何描述", - "modelPage.contentType.list.title.plural": "fields", - "modelPage.contentType.list.title.singular": "field", - "modelPage.contentType.list.title.including": "including", "modelPage.contentType.list.relationShipTitle.plural": "relationships", "modelPage.contentType.list.relationShipTitle.singular": "relationship", - "modelPage.attribute.relationWith": "Relation with", - + "modelPage.contentType.list.title.including": "including", + "modelPage.contentType.list.title.plural": "fields", + "modelPage.contentType.list.title.singular": "field", "noTableWarning.description": "不要忘了在数据库里创建表 `{modelName}`", "noTableWarning.infos": "更多信息", - "notification.error.message": "发生错误", - "notification.info.contentType.creating.notSaved": - "在创建新Content Type之前,请保存当前Content Type", + "notification.info.contentType.creating.notSaved": "在创建新Content Type之前,请保存当前Content Type", "notification.info.disable": "这个字段暂时不可编辑...😮", "notification.info.optimized": "这个插件是用本地存储优化的", - "notification.success.message.contentType.edit": "你的Content Type已更新", - "notification.success.message.contentType.create": "你的Content Type已创建", "notification.success.contentTypeDeleted": "这个Content Type已被删除", - - "popUpForm.attributes.string.description": "标题、名称、段落、名称列表", - "popUpForm.attributes.text.description": "描述、文本段落、文章", + "notification.success.message.contentType.create": "你的Content Type已创建", + "notification.success.message.contentType.edit": "你的Content Type已更新", + "plugin.description.long": "给你的API的数据结构建模. 快速的创造新的字段(fields)和关系(relations)。将会自动在项目中创建和更新文件。", + "plugin.description.short": "给你的API的数据结构建模", "popUpForm.attributes.boolean.description": "Yes or no, 1 or 0, true or false", - "popUpForm.attributes.number.description": "所有数字", - "popUpForm.attributes.date.description": "活动日期、开放时间", - "popUpForm.attributes.json.description": "JSON格式的数据", - "popUpForm.attributes.media.description": "图像,视频,PDF文件和其他文件", - "popUpForm.attributes.relation.description": "引用其它 Content Type", - "popUpForm.attributes.email.description": "用户email...", - "popUpForm.attributes.password.description": "用户密码...", - "popUpForm.attributes.enumeration.description": "List of choices", - - "popUpForm.attributes.string.name": "String", - "popUpForm.attributes.text.name": "Text", "popUpForm.attributes.boolean.name": "Boolean", + "popUpForm.attributes.date.description": "活动日期、开放时间", "popUpForm.attributes.date.name": "Date", - "popUpForm.attributes.json.name": "JSON", - "popUpForm.attributes.media.name": "Media", - "popUpForm.attributes.number.name": "Number", - "popUpForm.attributes.relation.name": "Relation", + "popUpForm.attributes.email.description": "用户email...", "popUpForm.attributes.email.name": "Email", + "popUpForm.attributes.enumeration.description": "List of choices", + "popUpForm.attributes.enumeration.name": "Enumeration", + "popUpForm.attributes.json.description": "JSON格式的数据", + "popUpForm.attributes.json.name": "JSON", + "popUpForm.attributes.media.description": "图像,视频,PDF文件和其他文件", + "popUpForm.attributes.media.name": "Media", + "popUpForm.attributes.number.description": "所有数字", + "popUpForm.attributes.number.name": "Number", + "popUpForm.attributes.password.description": "用户密码...", "popUpForm.attributes.password.name": "Password", - "popUpForm.attributes.enumeration.name": "Enumeration", - "popUpForm.create": "增加新的", - "popUpForm.edit": "编辑", - "popUpForm.field": "字段", - "popUpForm.create.contentType.header.title": "增加新的 Content Type", + "popUpForm.attributes.relation.description": "引用其它 Content Type", + "popUpForm.attributes.relation.name": "Relation", + "popUpForm.attributes.string.description": "标题、名称、段落、名称列表", + "popUpForm.attributes.string.name": "String", + "popUpForm.attributes.text.description": "描述、文本段落、文章", + "popUpForm.attributes.text.name": "Text", "popUpForm.choose.attributes.header.title": "增加新字段", + "popUpForm.create": "增加新的", + "popUpForm.create.contentType.header.title": "增加新的 Content Type", + "popUpForm.edit": "编辑", "popUpForm.edit.contentType.header.title": "编辑 Content Type", - - "popUpForm.navContainer.relation": "定义关联关系", - "popUpForm.navContainer.base": "基础设置", + "popUpForm.field": "字段", "popUpForm.navContainer.advanced": "高级设置", - + "popUpForm.navContainer.base": "基础设置", + "popUpForm.navContainer.relation": "定义关联关系", "popUpRelation.title": "关联", - + "popUpWarning.bodyMessage.attribute.delete": "确实要删除此字段吗?", + "popUpWarning.bodyMessage.contentType.delete": "确实要删除此 Content Type 吗?", "popUpWarning.button.cancel": "取消", "popUpWarning.button.confirm": "确认", "popUpWarning.title": "请确认", - "popUpWarning.bodyMessage.contentType.delete": - "确实要删除此 Content Type 吗?", - "popUpWarning.bodyMessage.attribute.delete": "确实要删除此字段吗?", - - "table.contentType.title.plural": "Content Types 是可用的", - "table.contentType.title.singular": "Content Type 是可用的", - "table.contentType.head.name": "名称", + "relation.attributeName.placeholder": "Ex: author, category, tag", + "relation.manyToMany": "has and belongs to many", + "relation.manyToOne": "has many", + "relation.oneToMany": "belongs to many", + "relation.oneToOne": "has one", "table.contentType.head.description": "描述", "table.contentType.head.fields": "字段", - - "relation.oneToOne": "has one", - "relation.oneToMany": "belongs to many", - "relation.manyToOne": "has many", - "relation.manyToMany": "has and belongs to many", - "relation.attributeName.placeholder": "Ex: author, category, tag" -} + "table.contentType.head.name": "名称", + "table.contentType.title.plural": "Content Types 是可用的", + "table.contentType.title.singular": "Content Type 是可用的" +} \ No newline at end of file diff --git a/packages/strapi-plugin-content-type-builder/admin/src/translations/zh.json b/packages/strapi-plugin-content-type-builder/admin/src/translations/zh.json index 6e958407b4..47c0d9d2b4 100644 --- a/packages/strapi-plugin-content-type-builder/admin/src/translations/zh.json +++ b/packages/strapi-plugin-content-type-builder/admin/src/translations/zh.json @@ -1,173 +1,151 @@ { - "plugin.description.short": "為您的 API 定義資料結構", - "plugin.description.long": - "為您的 API 定義資料結構,使你輕鬆新增欄位和關聯結構,你所做的修改會自動更新專案。", - "attribute.string": "字串", - "attribute.text": "文字", + "attribute.WYSIWYG": "Text (WYSIWYG)", "attribute.boolean": "是/否", + "attribute.date": "日期", + "attribute.decimal": "浮點數(decimal)", + "attribute.email": "Email", + "attribute.enumeration": "Enumeration", "attribute.float": "浮點數(float)", "attribute.integer": "整數", - "attribute.decimal": "浮點數(decimal)", - "attribute.date": "日期", "attribute.json": "JSON", "attribute.media": "媒體", - "attribute.email": "Email", "attribute.password": "密碼", "attribute.relation": "關聯其他結構", - "attribute.enumeration": "Enumeration", - "attribute.WYSIWYG": "Text (WYSIWYG)", - - "contentType.temporaryDisplay": "(未儲存)", - "from": "從", - "home.contentTypeBuilder.name": "資料結構", - "home.contentTypeBuilder.description": "建立和更新資料結構.", - "home.emptyContentType.title": "沒有任何資料結構", - "home.emptyContentType.description": "建立您第一個資料結構,讓您能夠從 API 擷取資料。", - - "home.emptyAttributes.title": "目前沒有任何欄位", - "home.emptyAttributes.description": "新增您第一個欄位到您的資料結構", - - "button.contentType.create": "建立資料結構", - "button.contentType.add": "增加資料結構", + "attribute.string": "字串", + "attribute.text": "文字", "button.attributes.add": "增加新的欄位", - - "error.validation.required": "必填欄位", - "error.validation.regex": "這個數值和 regex 不符合", - "error.validation.max": "這個數值太高了", - "error.validation.min": "這個數值太低了", - "error.validation.maxLength": "這個數值太長了", - "error.validation.minLength": "這個數值太短了", - "error.contentTypeName.taken": "這個名稱已存在", - "error.attribute.taken": "這個欄位名稱已存在", + "button.contentType.add": "增加資料結構", + "button.contentType.create": "建立資料結構", + "contentType.temporaryDisplay": "(未儲存)", "error.attribute.key.taken": "這個數值已存在", "error.attribute.sameKeyAndName": "不能一樣", + "error.attribute.taken": "這個欄位名稱已存在", + "error.contentTypeName.taken": "這個名稱已存在", + "error.validation.max": "這個數值太高了", + "error.validation.maxLength": "這個數值太長了", + "error.validation.min": "這個數值太低了", + "error.validation.minLength": "這個數值太短了", "error.validation.minSupMax": "不能大於", - - "form.attribute.item.textarea.name": "名稱", - "form.attribute.item.number.name": "名稱", - "form.attribute.item.date.name": "名稱", - "form.attribute.item.media.name": "名稱", - "form.attribute.item.json.name": "名稱", + "error.validation.regex": "這個數值和 regex 不符合", + "error.validation.required": "必填欄位", "form.attribute.item.boolean.name": "名稱", - "form.attribute.item.string.name": "名稱", - "form.attribute.item.enumeration.name": "名稱", - "form.attribute.item.enumeration.rules": "Values (separate them with a comma)", - "form.attribute.item.enumeration.placeholder": "Ex: morning,noon,evening", + "form.attribute.item.customColumnName": "自訂欄位名稱", + "form.attribute.item.customColumnName.description": "將資料庫欄位名稱以更廣泛的格式重新命名,對 API 回應很有用。", + "form.attribute.item.date.name": "名稱", + "form.attribute.item.defineRelation.fieldName": "欄位名稱", "form.attribute.item.enumeration.graphql": "Name override for GraphQL", "form.attribute.item.enumeration.graphql.description": "Allows you to override the default generated name for GraphQL", - "form.attribute.item.settings.name": "設定", - "form.attribute.item.requiredField": "必填欄位", - "form.attribute.item.uniqueField": "唯一欄位", + "form.attribute.item.enumeration.name": "名稱", + "form.attribute.item.enumeration.placeholder": "Ex: morning,noon,evening", + "form.attribute.item.enumeration.rules": "Values (separate them with a comma)", + "form.attribute.item.json.name": "名稱", + "form.attribute.item.maximum": "最大數值", + "form.attribute.item.maximumLength": "最大長度", + "form.attribute.item.media.name": "名稱", "form.attribute.item.minimum": "最小數值", "form.attribute.item.minimumLength": "最小長度", - "form.attribute.item.maximumLength": "最大長度", - "form.attribute.item.maximum": "最大數值", - "form.attribute.item.requiredField.description": "如果這個欄位留空,您將不能建立進入點。", - "form.attribute.item.uniqueField.description": - "如果已存在的進入點有一模一樣的內容,您將不能建立進入點。", - "form.attribute.item.defineRelation.fieldName": "欄位名稱", - "form.attribute.item.customColumnName": "自訂欄位名稱", - "form.attribute.item.customColumnName.description": - "將資料庫欄位名稱以更廣泛的格式重新命名,對 API 回應很有用。", + "form.attribute.item.number.name": "名稱", "form.attribute.item.number.type": "數字格式", - "form.attribute.item.number.type.integer": "整數 (ex: 10)", - "form.attribute.item.number.type.float": "浮點數(float) (ex: 3.33333333)", "form.attribute.item.number.type.decimal": "浮點數(decimal) (ex: 2.22)", + "form.attribute.item.number.type.float": "浮點數(float) (ex: 3.33333333)", + "form.attribute.item.number.type.integer": "整數 (ex: 10)", + "form.attribute.item.requiredField": "必填欄位", + "form.attribute.item.requiredField.description": "如果這個欄位留空,您將不能建立進入點。", + "form.attribute.item.settings.name": "設定", + "form.attribute.item.string.name": "名稱", + "form.attribute.item.textarea.name": "名稱", + "form.attribute.item.uniqueField": "唯一欄位", + "form.attribute.item.uniqueField.description": "如果已存在的進入點有一模一樣的內容,您將不能建立進入點。", "form.attribute.settings.default": "Default value", "form.attribute.settings.default.checkboxLabel": "Set to true", - "form.button.cancel": "取消", "form.button.continue": "繼續", "form.button.save": "儲存", - + "form.contentType.item.collectionName": "群組名稱", + "form.contentType.item.collectionName.inputDescription": "當您的資料結構和資料庫欄位不一樣時很有用", "form.contentType.item.connections": "連線", + "form.contentType.item.description": "說明", + "form.contentType.item.description.placeholder": "請在這裡寫一些說明...", "form.contentType.item.name": "名稱", "form.contentType.item.name.description": "資料結構名稱必須要單數: {link}", "form.contentType.item.name.link.description": "請看我們的文件", - "form.contentType.item.description": "說明", - "form.contentType.item.description.placeholder": "請在這裡寫一些說明...", - "form.contentType.item.collectionName": "群組名稱", - "form.contentType.item.collectionName.inputDescription": - "當您的資料結構和資料庫欄位不一樣時很有用", - + "from": "從", + "home.contentTypeBuilder.description": "建立和更新資料結構.", + "home.contentTypeBuilder.name": "資料結構", + "home.emptyAttributes.description": "新增您第一個欄位到您的資料結構", + "home.emptyAttributes.title": "目前沒有任何欄位", + "home.emptyContentType.description": "建立您第一個資料結構,讓您能夠從 API 擷取資料。", + "home.emptyContentType.title": "沒有任何資料結構", "menu.section.contentTypeBuilder.name.plural": "資料結構", "menu.section.contentTypeBuilder.name.singular": "資料結構", - "menu.section.documentation.name": "文件", "menu.section.documentation.guide": "閱讀更多有關資料結構", "menu.section.documentation.guideLink": "指南", + "menu.section.documentation.name": "文件", "menu.section.documentation.tutorial": "請看看我們的", "menu.section.documentation.tutorialLink": "教學影片", - + "modelPage.attribute.relationWith": "關聯到", "modelPage.contentHeader.emptyDescription.description": "這個資料結構沒有任何說明", - "modelPage.contentType.list.title.plural": "欄位", - "modelPage.contentType.list.title.singular": "欄位", - "modelPage.contentType.list.title.including": "包含", "modelPage.contentType.list.relationShipTitle.plural": "關係", "modelPage.contentType.list.relationShipTitle.singular": "關係", - "modelPage.attribute.relationWith": "關聯到", - + "modelPage.contentType.list.title.including": "包含", + "modelPage.contentType.list.title.plural": "欄位", + "modelPage.contentType.list.title.singular": "欄位", "noTableWarning.description": "請勿忘記建立在您的資料庫建立 `{modelName}`", "noTableWarning.infos": "更多資訊", - "notification.error.message": "有錯誤發生了", "notification.info.contentType.creating.notSaved": "建立新的資料結構前,請先儲存現在的。", - "notification.info.disable": "这个字段暂时不可编辑...😮", + "notification.info.disable": "这个字段暂时不可编辑...😮", "notification.info.optimized": "這個擴充功能使用您的 localstorage 來最佳化", - "notification.success.message.contentType.edit": "您的資料結構已更新", - "notification.success.message.contentType.create": "您的資料結構已建立", "notification.success.contentTypeDeleted": "這個資料結構被刪除了", - - "popUpForm.attributes.string.description": "標題、名字、文章段落、名字列表", - "popUpForm.attributes.text.description": "說明、文章片段、作者", + "notification.success.message.contentType.create": "您的資料結構已建立", + "notification.success.message.contentType.edit": "您的資料結構已更新", + "plugin.description.long": "為您的 API 定義資料結構,使你輕鬆新增欄位和關聯結構,你所做的修改會自動更新專案。", + "plugin.description.short": "為您的 API 定義資料結構", "popUpForm.attributes.boolean.description": "是或否、1 或 0、真或假", - "popUpForm.attributes.number.description": "跟數字有關的", - "popUpForm.attributes.date.description": "日期、營業時間", - "popUpForm.attributes.json.description": "JSON 格式資料", - "popUpForm.attributes.media.description": "圖片、影片、PDF 和其他檔案", - "popUpForm.attributes.relation.description": "關聯到一個資料結構", - "popUpForm.attributes.email.description": "使用者的 email...", - "popUpForm.attributes.password.description": "使用者密碼...", - "popUpForm.attributes.enumeration.description": "List of choices", - - "popUpForm.attributes.string.name": "字串", - "popUpForm.attributes.text.name": "文字", "popUpForm.attributes.boolean.name": "是/否", + "popUpForm.attributes.date.description": "日期、營業時間", "popUpForm.attributes.date.name": "日期", - "popUpForm.attributes.json.name": "JSON", - "popUpForm.attributes.media.name": "媒體", - "popUpForm.attributes.number.name": "數字", - "popUpForm.attributes.relation.name": "關聯其他結構", + "popUpForm.attributes.email.description": "使用者的 email...", "popUpForm.attributes.email.name": "Email", + "popUpForm.attributes.enumeration.description": "List of choices", + "popUpForm.attributes.enumeration.name": "Enumeration", + "popUpForm.attributes.json.description": "JSON 格式資料", + "popUpForm.attributes.json.name": "JSON", + "popUpForm.attributes.media.description": "圖片、影片、PDF 和其他檔案", + "popUpForm.attributes.media.name": "媒體", + "popUpForm.attributes.number.description": "跟數字有關的", + "popUpForm.attributes.number.name": "數字", + "popUpForm.attributes.password.description": "使用者密碼...", "popUpForm.attributes.password.name": "密碼", - "popUpForm.attributes.enumeration.name": "Enumeration", - "popUpForm.create": "增加新的", - "popUpForm.edit": "編輯", - "popUpForm.field": "欄位", - "popUpForm.create.contentType.header.title": "增加新的資料結構", + "popUpForm.attributes.relation.description": "關聯到一個資料結構", + "popUpForm.attributes.relation.name": "關聯其他結構", + "popUpForm.attributes.string.description": "標題、名字、文章段落、名字列表", + "popUpForm.attributes.string.name": "字串", + "popUpForm.attributes.text.description": "說明、文章片段、作者", + "popUpForm.attributes.text.name": "文字", "popUpForm.choose.attributes.header.title": "增加新的Field", + "popUpForm.create": "增加新的", + "popUpForm.create.contentType.header.title": "增加新的資料結構", + "popUpForm.edit": "編輯", "popUpForm.edit.contentType.header.title": "編輯資料結構", - - "popUpForm.navContainer.relation": "定義關係", - "popUpForm.navContainer.base": "基本設定", + "popUpForm.field": "欄位", "popUpForm.navContainer.advanced": "進階設定", - + "popUpForm.navContainer.base": "基本設定", + "popUpForm.navContainer.relation": "定義關係", "popUpRelation.title": "關係", - + "popUpWarning.bodyMessage.attribute.delete": "您確定要刪除這個欄位嗎?", + "popUpWarning.bodyMessage.contentType.delete": "您確定要刪除這個資料結構嗎?", "popUpWarning.button.cancel": "取消", "popUpWarning.button.confirm": "確認", "popUpWarning.title": "請確認", - "popUpWarning.bodyMessage.contentType.delete": "您確定要刪除這個資料結構嗎?", - "popUpWarning.bodyMessage.attribute.delete": "您確定要刪除這個欄位嗎?", - - "table.contentType.title.plural": "筆資料結構", - "table.contentType.title.singular": "筆資料結構", - "table.contentType.head.name": "名稱", + "relation.attributeName.placeholder": "Ex: 作者, 類別, tag", + "relation.manyToMany": "有而且屬於許多", + "relation.manyToOne": "有許多", + "relation.oneToMany": "屬於許多", + "relation.oneToOne": "有一個", "table.contentType.head.description": "說明", "table.contentType.head.fields": "欄位", - - "relation.oneToOne": "有一個", - "relation.oneToMany": "屬於許多", - "relation.manyToOne": "有許多", - "relation.manyToMany": "有而且屬於許多", - "relation.attributeName.placeholder": "Ex: 作者, 類別, tag" -} + "table.contentType.head.name": "名稱", + "table.contentType.title.plural": "筆資料結構", + "table.contentType.title.singular": "筆資料結構" +} \ No newline at end of file diff --git a/packages/strapi-plugin-email/admin/src/translations/ar.json b/packages/strapi-plugin-email/admin/src/translations/ar.json index 037c99ed5b..4aa9cc3237 100644 --- a/packages/strapi-plugin-email/admin/src/translations/ar.json +++ b/packages/strapi-plugin-email/admin/src/translations/ar.json @@ -1,4 +1,4 @@ { - "plugin.description.short": "إرسال بريد.", - "plugin.description.long": "إرسال بريد." -} + "plugin.description.long": "إرسال بريد.", + "plugin.description.short": "إرسال بريد." +} \ No newline at end of file diff --git a/packages/strapi-plugin-email/admin/src/translations/de.json b/packages/strapi-plugin-email/admin/src/translations/de.json index e7519e0639..81ca8f8bce 100644 --- a/packages/strapi-plugin-email/admin/src/translations/de.json +++ b/packages/strapi-plugin-email/admin/src/translations/de.json @@ -1,14 +1,11 @@ { - "ConfigPage.title": "E-Mail - Einstellungen", "ConfigPage.description": "E-Mail-Plugin konfigurieren", - + "ConfigPage.title": "E-Mail - Einstellungen", "EditForm.Input.number.label": "Maximal zulässige Größe (in MB)", - "EditForm.Input.select.label": "Anbieter", "EditForm.Input.select.inputDescription": "E-Mails können mit dem Standardanbieter (Sendmail) oder einem externen Anbieter versendet werden", + "EditForm.Input.select.label": "Anbieter", "EditForm.Input.toggle.label": "E-Mail-Versand aktivieren", - "notification.config.success": "Die Einstellungen wurden aktualisiert", - - "plugin.description.short": "Zum Versand von E-Mails.", - "plugin.description.long": "Zum Versand von E-Mails." -} + "plugin.description.long": "Zum Versand von E-Mails.", + "plugin.description.short": "Zum Versand von E-Mails." +} \ No newline at end of file diff --git a/packages/strapi-plugin-email/admin/src/translations/en.json b/packages/strapi-plugin-email/admin/src/translations/en.json index 433f6d501a..02fc39111b 100644 --- a/packages/strapi-plugin-email/admin/src/translations/en.json +++ b/packages/strapi-plugin-email/admin/src/translations/en.json @@ -1,14 +1,11 @@ { - "ConfigPage.title": "Email - Settings", "ConfigPage.description": "Configure the email plugin", - + "ConfigPage.title": "Email - Settings", "EditForm.Input.number.label": "Maximum size allowed (in MB)", - "EditForm.Input.select.label": "Providers", "EditForm.Input.select.inputDescription": "Emails can be sent with the default provider (Sendmail) or an external provider", + "EditForm.Input.select.label": "Providers", "EditForm.Input.toggle.label": "Enable email send", - - "plugin.description.short": "Send emails.", + "notification.config.success": "The settings has been updated", "plugin.description.long": "Send emails.", - - "notification.config.success": "The settings has been updated" -} + "plugin.description.short": "Send emails." +} \ No newline at end of file diff --git a/packages/strapi-plugin-email/admin/src/translations/es.json b/packages/strapi-plugin-email/admin/src/translations/es.json index 0c84804ae1..f6eef20b8a 100644 --- a/packages/strapi-plugin-email/admin/src/translations/es.json +++ b/packages/strapi-plugin-email/admin/src/translations/es.json @@ -1,14 +1,11 @@ { - "ConfigPage.title": "Correo electrónico - Configuración", "ConfigPage.description": "Configurar el plugin de correo electrónico", - + "ConfigPage.title": "Correo electrónico - Configuración", "EditForm.Input.number.label": "Tamaño máximo permitido (en MB)", - "EditForm.Input.select.label": "Proveedores", "EditForm.Input.select.inputDescription": "Los correos electrónicos se pueden enviar con el proveedor predeterminado (Sendmail) o con un proveedor externo.", + "EditForm.Input.select.label": "Proveedores", "EditForm.Input.toggle.label": "Habilitar envío de correo electrónico", - - "plugin.description.short": "Enviar correos electrónicos.", + "notification.config.success": "Se ha actualizado la configuración", "plugin.description.long": "Enviar correos electrónicos.", - - "notification.config.success": "Se ha actualizado la configuración" -} + "plugin.description.short": "Enviar correos electrónicos." +} \ No newline at end of file diff --git a/packages/strapi-plugin-email/admin/src/translations/fr.json b/packages/strapi-plugin-email/admin/src/translations/fr.json index 667c832b0c..b632053210 100644 --- a/packages/strapi-plugin-email/admin/src/translations/fr.json +++ b/packages/strapi-plugin-email/admin/src/translations/fr.json @@ -1,14 +1,11 @@ { - "ConfigPage.title": "E-mail - Paramètres", "ConfigPage.description": "Configurer le plugin email", - + "ConfigPage.title": "E-mail - Paramètres", "EditForm.Input.number.label": "Taille maximale autorisée (en MB)", - "EditForm.Input.select.label": "Fournisseurs", "EditForm.Input.select.inputDescription": "Les e-mails peuvent être envoyés avec le fournisseur par défaut (Sendmail) ou un fournisseur externe.", + "EditForm.Input.select.label": "Fournisseurs", "EditForm.Input.toggle.label": "Activer l'envoi de e-mails", - "notification.config.success": "Les paramètres ont été mis à jour.", - - "plugin.description.short": "Envoyez des emails", - "plugin.description.long": "Envoyez des emails" -} + "plugin.description.long": "Envoyez des emails", + "plugin.description.short": "Envoyez des emails" +} \ No newline at end of file diff --git a/packages/strapi-plugin-email/admin/src/translations/it.json b/packages/strapi-plugin-email/admin/src/translations/it.json index d382cf9dbc..3487a2e976 100644 --- a/packages/strapi-plugin-email/admin/src/translations/it.json +++ b/packages/strapi-plugin-email/admin/src/translations/it.json @@ -1,16 +1,11 @@ { - "ConfigPage.title": "Email - Impostazioni", "ConfigPage.description": "Configura il plugin Email", - - + "ConfigPage.title": "Email - Impostazioni", "EditForm.Input.number.label": "Dimensione massima consentita (in MB)", - "EditForm.Input.select.label": "Providers", "EditForm.Input.select.inputDescription": "Le e-mail possono essere inviate con il provider predefinito (Sendmail) o un provider esterno", + "EditForm.Input.select.label": "Providers", "EditForm.Input.toggle.label": "Abilita invio email", - - "plugin.description.short": "Invia le email.", + "notification.config.success": "Le impostazioni sono state aggiornate", "plugin.description.long": "Invia le email.", - - - "notification.config.success": "Le impostazioni sono state aggiornate" -} + "plugin.description.short": "Invia le email." +} \ No newline at end of file diff --git a/packages/strapi-plugin-email/admin/src/translations/ko.json b/packages/strapi-plugin-email/admin/src/translations/ko.json index 495da06ee1..b35b92d1f6 100644 --- a/packages/strapi-plugin-email/admin/src/translations/ko.json +++ b/packages/strapi-plugin-email/admin/src/translations/ko.json @@ -1,14 +1,11 @@ { - "ConfigPage.title": "이메일 설정", "ConfigPage.description": "이메일 플러그인을 설정합니다.", - + "ConfigPage.title": "이메일 설정", "EditForm.Input.number.label": "최대 허용 크기(MB)", - "EditForm.Input.select.label": "프로바이더(Providers)", "EditForm.Input.select.inputDescription": "이메일을 기본 프로바이더(Sendmail) 또는 외부 프로바이더를 통해 전동합니다.", + "EditForm.Input.select.label": "프로바이더(Providers)", "EditForm.Input.toggle.label": "이메일 전송 허용", - - "plugin.description.short": "이메일을 전송합니다.", + "notification.config.success": "설정을 업데이트 했습니다.", "plugin.description.long": "이메일을 전송합니다.", - - "notification.config.success": "설정을 업데이트 했습니다." -} + "plugin.description.short": "이메일을 전송합니다." +} \ No newline at end of file diff --git a/packages/strapi-plugin-email/admin/src/translations/nl.json b/packages/strapi-plugin-email/admin/src/translations/nl.json index 04d9ef7239..1e25ffbcad 100644 --- a/packages/strapi-plugin-email/admin/src/translations/nl.json +++ b/packages/strapi-plugin-email/admin/src/translations/nl.json @@ -1,14 +1,11 @@ { - "ConfigPage.title": "E-mail - Instellingen", "ConfigPage.description": "Configureer de e-mail extensie", - + "ConfigPage.title": "E-mail - Instellingen", "EditForm.Input.number.label": "Maximum grootte toegestaan (in MB)", - "EditForm.Input.select.label": "Leveranciers", "EditForm.Input.select.inputDescription": "E-mails kunnen worden verstuurd via de standaard leverancier (Sendmail) of via een externe leverancier", + "EditForm.Input.select.label": "Leveranciers", "EditForm.Input.toggle.label": "E-mail versturen inschakelen", - - "plugin.description.short": "Verstuur e-mails.", + "notification.config.success": "De instellingen zijn opgeslagen.", "plugin.description.long": "Verstuur e-mails.", - - "notification.config.success": "De instellingen zijn opgeslagen." -} + "plugin.description.short": "Verstuur e-mails." +} \ No newline at end of file diff --git a/packages/strapi-plugin-email/admin/src/translations/pl.json b/packages/strapi-plugin-email/admin/src/translations/pl.json index 69eb406cea..c957a5b4f1 100644 --- a/packages/strapi-plugin-email/admin/src/translations/pl.json +++ b/packages/strapi-plugin-email/admin/src/translations/pl.json @@ -1,4 +1,4 @@ { - "plugin.description.short": "Wysyłaj E-maile", - "plugin.description.long": "Wysyłaj E-maile" -} + "plugin.description.long": "Wysyłaj E-maile", + "plugin.description.short": "Wysyłaj E-maile" +} \ No newline at end of file diff --git a/packages/strapi-plugin-email/admin/src/translations/pt-BR.json b/packages/strapi-plugin-email/admin/src/translations/pt-BR.json index 3ce5336850..bc472b448c 100644 --- a/packages/strapi-plugin-email/admin/src/translations/pt-BR.json +++ b/packages/strapi-plugin-email/admin/src/translations/pt-BR.json @@ -1,14 +1,11 @@ { - "ConfigPage.title": "E-mail - Definições", "ConfigPage.description": "Configure a extensão do email", - + "ConfigPage.title": "E-mail - Definições", "EditForm.Input.number.label": "Tamanho máximo permitido (em MB)", - "EditForm.Input.select.label": "Provedores", "EditForm.Input.select.inputDescription": "Os emails podem ser enviados com o provedor predefinido (Sendmail) ou por um provedor externo", + "EditForm.Input.select.label": "Provedores", "EditForm.Input.toggle.label": "Ativar envio de email", - - "plugin.description.short": "Enviar emails.", + "notification.config.success": "As configurações foram atualizadas", "plugin.description.long": "Enviar emails.", - - "notification.config.success": "As configurações foram atualizadas" + "plugin.description.short": "Enviar emails." } \ No newline at end of file diff --git a/packages/strapi-plugin-email/admin/src/translations/pt.json b/packages/strapi-plugin-email/admin/src/translations/pt.json index 9689d016d7..dd3213d2e3 100644 --- a/packages/strapi-plugin-email/admin/src/translations/pt.json +++ b/packages/strapi-plugin-email/admin/src/translations/pt.json @@ -1,15 +1,11 @@ { - "ConfigPage.title": "Email - Definições", - "ConfigPage.description": "Configure a extensão do email", - - "EditForm.Input.number.label": "Tamanho máximo permitido (em MB)", - "EditForm.Input.select.label": "Provedores", - "EditForm.Input.select.inputDescription": "Os emails podem ser enviados com o provedor predefinido (Sendmail) ou por um provedor externo", - "EditForm.Input.toggle.label": "Activar envio de email", - - "plugin.description.short": "Enviar emails.", - "plugin.description.long": "Enviar emails.", - - "notification.config.success": "As configurações foram actualizadas" - } - \ No newline at end of file + "ConfigPage.description": "Configure a extensão do email", + "ConfigPage.title": "Email - Definições", + "EditForm.Input.number.label": "Tamanho máximo permitido (em MB)", + "EditForm.Input.select.inputDescription": "Os emails podem ser enviados com o provedor predefinido (Sendmail) ou por um provedor externo", + "EditForm.Input.select.label": "Provedores", + "EditForm.Input.toggle.label": "Activar envio de email", + "notification.config.success": "As configurações foram actualizadas", + "plugin.description.long": "Enviar emails.", + "plugin.description.short": "Enviar emails." +} \ No newline at end of file diff --git a/packages/strapi-plugin-email/admin/src/translations/ru.json b/packages/strapi-plugin-email/admin/src/translations/ru.json index 8733143ea1..2990cab738 100644 --- a/packages/strapi-plugin-email/admin/src/translations/ru.json +++ b/packages/strapi-plugin-email/admin/src/translations/ru.json @@ -1,12 +1,11 @@ { - "plugin.description.short": "Отсылка почты.", - "plugin.description.long": "Отсылка почты.", - "ConfigPage.title": "Email - Настройки", - "ConfigPage.description": "Настройка плагина email", - "EditForm.Input.number.label": "Максимально допустимый размер (в МБ)", - "EditForm.Input.select.label": "Провайдеры", - "EditForm.Input.select.inputDescription": "Письма могут быть отправлены стандартным провайдером (Sendmail), или внешними провайдерами", - "EditForm.Input.toggle.label": "Активировать отправку писем", - "notification.config.success": "Настройки успешно обновлены" - } - \ No newline at end of file + "ConfigPage.description": "Настройка плагина email", + "ConfigPage.title": "Email - Настройки", + "EditForm.Input.number.label": "Максимально допустимый размер (в МБ)", + "EditForm.Input.select.inputDescription": "Письма могут быть отправлены стандартным провайдером (Sendmail), или внешними провайдерами", + "EditForm.Input.select.label": "Провайдеры", + "EditForm.Input.toggle.label": "Активировать отправку писем", + "notification.config.success": "Настройки успешно обновлены", + "plugin.description.long": "Отсылка почты.", + "plugin.description.short": "Отсылка почты." +} \ No newline at end of file diff --git a/packages/strapi-plugin-email/admin/src/translations/tr.json b/packages/strapi-plugin-email/admin/src/translations/tr.json index d75849eaa3..0306a093d1 100644 --- a/packages/strapi-plugin-email/admin/src/translations/tr.json +++ b/packages/strapi-plugin-email/admin/src/translations/tr.json @@ -1,14 +1,11 @@ { - "ConfigPage.title": "E-posta - Ayarlar", "ConfigPage.description": "E-posta eklentisini yapılandırma", - + "ConfigPage.title": "E-posta - Ayarlar", "EditForm.Input.number.label": "İzin verilen maksimum boyut (MB cinsinden)", - "EditForm.Input.select.label": "Sağlayıcıları", "EditForm.Input.select.inputDescription": "E-postalar varsayılan sağlayıcı (Sendmail) veya harici bir sağlayıcıyla gönderilebilir", + "EditForm.Input.select.label": "Sağlayıcıları", "EditForm.Input.toggle.label": "E-posta gönderimini etkinleştir", - - "plugin.description.short": "E-posta gönder.", + "notification.config.success": "Ayarlar güncellendi", "plugin.description.long": "E-posta gönder.", - - "notification.config.success": "Ayarlar güncellendi" -} + "plugin.description.short": "E-posta gönder." +} \ No newline at end of file diff --git a/packages/strapi-plugin-email/admin/src/translations/zh-Hans.json b/packages/strapi-plugin-email/admin/src/translations/zh-Hans.json index 91a00d96e7..2c4479bbc8 100644 --- a/packages/strapi-plugin-email/admin/src/translations/zh-Hans.json +++ b/packages/strapi-plugin-email/admin/src/translations/zh-Hans.json @@ -1,4 +1,4 @@ { - "plugin.description.short": "发送电子邮件。", - "plugin.description.long": "发送电子邮件。" -} + "plugin.description.long": "发送电子邮件。", + "plugin.description.short": "发送电子邮件。" +} \ No newline at end of file diff --git a/packages/strapi-plugin-email/admin/src/translations/zh.json b/packages/strapi-plugin-email/admin/src/translations/zh.json index d345310472..123abb7010 100644 --- a/packages/strapi-plugin-email/admin/src/translations/zh.json +++ b/packages/strapi-plugin-email/admin/src/translations/zh.json @@ -1,4 +1,4 @@ { - "plugin.description.short": "送出", - "plugin.description.long": "送出" -} + "plugin.description.long": "送出", + "plugin.description.short": "送出" +} \ No newline at end of file diff --git a/packages/strapi-plugin-settings-manager/admin/src/translations/ar.json b/packages/strapi-plugin-settings-manager/admin/src/translations/ar.json index 084ab4bd60..26fd67ad0c 100644 --- a/packages/strapi-plugin-settings-manager/admin/src/translations/ar.json +++ b/packages/strapi-plugin-settings-manager/admin/src/translations/ar.json @@ -1,163 +1,84 @@ { "components.DownloadDb.download": "لتثبيت قيد التقدم...", "components.DownloadDb.text": "قد يستغرق هذا دقيقة أو نحو ذلك. شكرا لصبرك.", - "plugin.description.short": "تكوين المشروع الخاص بك في غضون ثوان.", - "plugin.description.long": "تكوين المشروع الخاص بك في غضون ثوان.", - "menu.section.global-settings": "الاعدادات العامة", - "menu.item.application": "التطبيق", - "menu.item.languages": "اللغات", - "menu.item.advanced": "المتقدمة", - - "menu.section.environments": "البيئات", - "menu.item.database": "قاعدة البيانات", - "menu.item.request": "طلب", - "menu.item.response": "استجابة", - "menu.item.security": "الأمان", - "menu.item.server": "الخادم", - - "form.button.cancel": "الغاء", - "form.button.save": "حفظ", - "form.button.confirm": "تأكيد", - - "form.databases.name": "قاعدة البيانات", - "form.databases.description": "تكوين إعدادات قاعدة البيانات الخاصة بك عن طريق البيئة.", - - "form.database.item.name": "اسم قاعدة البيانات", - "form.database.item.client": "العميل", - "form.database.item.connector": "المتصل", - "form.database.item.host": "الخادم", - "form.database.item.port": "المنفذ", - "form.database.item.username": "اسم المستخدم", - "form.database.item.password": "كلمة السر", - "form.database.item.database": "قاعدة البيانات", - "form.database.item.ssl": "SSL", - "form.database.item.authenticationDatabase": "مصادقة قاعدة البيانات", - "form.database.item.default": "جعلة الاتصال الإفتراضي", - "form.database.item.provider.mongo": "Mongo", - "form.database.item.provider.postgres": "PostgresSQL", - "form.database.item.provider.mysql": "MySQL", - "form.database.item.provider.redis": "Redis", - - "form.application.name": "تطبيق", - "form.application.description": "تهئية إعدادات تطبيقك.", - - "form.application.item.name": "الإسم", - "form.application.item.description": "الوصف", - "form.application.item.version": "الإصدار", - - "form.advanced.name": "المتقدمة", "form.advanced.description": "تكوين الإعدادات المتقدمة الخاصة بك.", - "form.advanced.item.admin": "رابط لوحة التحكم", "form.advanced.item.prefix": "بادئة API", - - "form.request.name": "الطلب", + "form.advanced.name": "المتقدمة", + "form.application.description": "تهئية إعدادات تطبيقك.", + "form.application.item.description": "الوصف", + "form.application.item.name": "الإسم", + "form.application.item.version": "الإصدار", + "form.application.name": "تطبيق", + "form.button.cancel": "الغاء", + "form.button.confirm": "تأكيد", + "form.button.save": "حفظ", + "form.database.item.authenticationDatabase": "مصادقة قاعدة البيانات", + "form.database.item.client": "العميل", + "form.database.item.connector": "المتصل", + "form.database.item.database": "قاعدة البيانات", + "form.database.item.default": "جعلة الاتصال الإفتراضي", + "form.database.item.host": "الخادم", + "form.database.item.name": "اسم قاعدة البيانات", + "form.database.item.password": "كلمة السر", + "form.database.item.port": "المنفذ", + "form.database.item.provider.mongo": "Mongo", + "form.database.item.provider.mysql": "MySQL", + "form.database.item.provider.postgres": "PostgresSQL", + "form.database.item.provider.redis": "Redis", + "form.database.item.ssl": "SSL", + "form.database.item.username": "اسم المستخدم", + "form.databases.description": "تكوين إعدادات قاعدة البيانات الخاصة بك عن طريق البيئة.", + "form.databases.name": "قاعدة البيانات", + "form.language.choose": "اختار اللغة:", + "form.language.description": "تكوين لغتك.", + "form.language.name": "اللغات", "form.request.description": "تكوين إعدادات الطلب الخاص بك.", + "form.request.item.logger": "المسجل", + "form.request.item.logger.exposeInContext": "الكشف في السياق", + "form.request.item.logger.level": "المستوى", + "form.request.item.logger.requests": "الطلبات", "form.request.item.parser": "المحلل", "form.request.item.parser.multipart": "المحلل المتعدد", "form.request.item.prefix": "البادئة", "form.request.item.prefix.prefix": "البادئة", - "form.request.item.logger": "المسجل", - "form.request.item.logger.level": "المستوى", - "form.request.item.logger.exposeInContext": "الكشف في السياق", - "form.request.item.logger.requests": "الطلبات", "form.request.item.router": "الموجه", "form.request.item.router.prefix": "البدائة", - - "form.response.name": "الإستجابة", + "form.request.name": "الطلب", "form.response.description": "قم بتكوين إعدادات الاستجابة الخاصة بك.", "form.response.item.gzip.enabled": "Gzip", "form.response.item.responseTime.enabled": "وقت الاستجابة", - - "form.security.name": "الحماية", + "form.response.name": "الإستجابة", "form.security.description": "تكوين إعدادات الأمان الخاصة بك.", - + "form.security.item.cors": "Cors", + "form.security.item.cors.origin": "Origin", "form.security.item.csrf": "CSRF", - "form.security.item.p3p": "P3P", - "form.security.item.p3p.value": "القيمة", - "form.security.item.hsts": "المضيفين", + "form.security.item.csrf.angular": "الزاوي", + "form.security.item.csrf.cookie": "الكعكات", "form.security.item.csrf.key": "المفتاح", "form.security.item.csrf.secret": "الحماية", - "form.security.item.csrf.cookie": "الكعكات", - "form.security.item.csrf.angular": "الزاوي", - "form.security.item.hsts.maxAge": "أقصى عمر", + "form.security.item.hsts": "المضيفين", "form.security.item.hsts.includeSubDomains": "تضمين المجال الفرعي", + "form.security.item.hsts.maxAge": "أقصى عمر", "form.security.item.hsts.preload": "التحميل المسبق", - + "form.security.item.p3p": "P3P", + "form.security.item.p3p.value": "القيمة", "form.security.item.session": "الجلسة", "form.security.item.session.key": "مفتاح الجلسة", "form.security.item.session.maxAge": "أقصى عمر", - "form.security.item.xframe": "Xframe", - "form.security.item.xframe.value": "الخيارات", + "form.security.item.xframe.allow-from": "ALLOW-FROM", "form.security.item.xframe.deny": "رفض", "form.security.item.xframe.sameorigin": "SAMEORIGIN", - "form.security.item.xframe.allow-from": "ALLOW-FROM", - + "form.security.item.xframe.value": "الخيارات", "form.security.item.xssProtection": "xss Protection", "form.security.item.xssProtection.mode": "الوضع", - - "form.security.item.cors": "Cors", - "form.security.item.cors.origin": "Origin", - - "form.server.name": "الخادم", + "form.security.name": "الحماية", "form.server.description": "تكوين إعدادات الخادم الخاص بك.", - + "form.server.item.cron": "Cron", "form.server.item.host": "المستضيف", "form.server.item.port": "المنفذ", - "form.server.item.cron": "Cron", - - "form.language.name": "اللغات", - "form.language.description": "تكوين لغتك.", - "form.language.choose": "اختار اللغة:", - - "request.error.database.exist": "هذا الاتصال موجود بالفعل", - "request.error.database.unknow": "لا يوجد اتصال", - "request.error.type.string": "السلسلة النصية مطلوبة.", - "request.error.type.number": "الرقم مطلوب.", - "request.error.type.boolean": "القيمة المنطقية مطلوبة.", - "request.error.type.select": "جب أن تكون القيمة في قائمة محددة مسبقًا.", - - "request.error.validation.required": "قيمة هذا الحقل مطلوبة.", - "request.error.validation.regex": "هذه القيمة لا تطابق regex.", - "request.error.validation.max": "هذه القيمة عالية جدًا.", - "request.error.validation.min": "هذه القيمة قليل جدًا.", - "request.error.validation.maxLength": "هذه القيمة طويلة جدًا.", - "request.error.validation.minLength": "هذه القيمة قصيرة جدًا.", - - - "request.error.config": "ملف التكوين غير موجود.", - "request.error.environment.required": "البيئة مطلوبة.", - "request.error.environment.unknow": "البيئة غير معروفة.", - "request.error.languages.exist": "هذه اللغة موجودة بالفعل.", - "request.error.languages.unknow": "هذه اللغة غير موجودة.", - "request.error.languages.incorrect": "هذه اللغة غير صحيحة.", - - "list.languages.button.label": "إضافة لغة", - "list.languages.title.singular": "اللغة موجودة", - "list.languages.title.plural": "اللغات موجودة", - "list.languages.default.languages": "اللغة الإفتراضية", - "list.languages.set.languages": "جعلها افتراضية", - "list.databases.button.label": "اضافة اتصال جديد", - "list.databases.title.singular": "اتصال في هذه البيئة", - "list.databases.title.plural": "اتصالات في هذه البيئة", - - "popUpWarning.title": "الرجاء التأكيد", - "popUpWarning.databases.danger.message": "لا تزال أنواع المحتوى مرتبطة بهذا الاتصال عند إزالته قد تتسبب في مشكلات خطيرة في تطبيقك. كن حذرا...", - "popUpWarning.danger.ok.message": "أنا أفهم", - "popUpWarning.databases.delete.message": "هل أنت متأكد من أنك تريد حذف قاعدة البيانات هذه؟", - "popUpWarning.languages.delete.message": "هل أنت متأكد من أنك تريد حذف هذه اللغة؟", - "strapi.notification.info.settingsEqual": "الإعدادات متساوية", - "strapi.notification.success.databaseDelete": "تم حذف قاعدة البيانات بنجاح.", - "strapi.notification.success.languageDelete": "تم حذف اللغة بنجاح.", - "strapi.notification.success.languageAdd": "تمت إضافة اللغة بنجاح.", - "strapi.notification.success.databaseAdd": "تمت إضافة قاعدة البيانات بنجاح.", - "strapi.notification.success.databaseEdit": "تم تحديث إعدادات قاعدة البيانات بنجاح.", - "strapi.notification.success.databaseDeleted": "تم حذف قاعدة البيانات.", - "strapi.notification.success.settingsEdit": "تم تحديث الإعدادات بنجاح.", - "strapi.notification.error": "حدث خطأ", - "strapi.notification.info.serverRestart": "سيتم إعادة تشغيل الخادم", - + "form.server.name": "الخادم", "language.af": "Afrikaans", "language.af_NA": "Afrikaans (Namibië)", "language.af_ZA": "Afrikaans (Suid-Afrika)", @@ -652,6 +573,58 @@ "language.zh_Hant_TW": "中文(繁體中文,台灣)", "language.zu": "isiZulu", "language.zu_ZA": "isiZulu (iNingizimu Afrika)", - - "pageNotFound": "Page not found" -} + "list.databases.button.label": "اضافة اتصال جديد", + "list.databases.title.plural": "اتصالات في هذه البيئة", + "list.databases.title.singular": "اتصال في هذه البيئة", + "list.languages.button.label": "إضافة لغة", + "list.languages.default.languages": "اللغة الإفتراضية", + "list.languages.set.languages": "جعلها افتراضية", + "list.languages.title.plural": "اللغات موجودة", + "list.languages.title.singular": "اللغة موجودة", + "menu.item.advanced": "المتقدمة", + "menu.item.application": "التطبيق", + "menu.item.database": "قاعدة البيانات", + "menu.item.languages": "اللغات", + "menu.item.request": "طلب", + "menu.item.response": "استجابة", + "menu.item.security": "الأمان", + "menu.item.server": "الخادم", + "menu.section.environments": "البيئات", + "menu.section.global-settings": "الاعدادات العامة", + "pageNotFound": "Page not found", + "plugin.description.long": "تكوين المشروع الخاص بك في غضون ثوان.", + "plugin.description.short": "تكوين المشروع الخاص بك في غضون ثوان.", + "popUpWarning.danger.ok.message": "أنا أفهم", + "popUpWarning.databases.danger.message": "لا تزال أنواع المحتوى مرتبطة بهذا الاتصال عند إزالته قد تتسبب في مشكلات خطيرة في تطبيقك. كن حذرا...", + "popUpWarning.databases.delete.message": "هل أنت متأكد من أنك تريد حذف قاعدة البيانات هذه؟", + "popUpWarning.languages.delete.message": "هل أنت متأكد من أنك تريد حذف هذه اللغة؟", + "popUpWarning.title": "الرجاء التأكيد", + "request.error.config": "ملف التكوين غير موجود.", + "request.error.database.exist": "هذا الاتصال موجود بالفعل", + "request.error.database.unknow": "لا يوجد اتصال", + "request.error.environment.required": "البيئة مطلوبة.", + "request.error.environment.unknow": "البيئة غير معروفة.", + "request.error.languages.exist": "هذه اللغة موجودة بالفعل.", + "request.error.languages.incorrect": "هذه اللغة غير صحيحة.", + "request.error.languages.unknow": "هذه اللغة غير موجودة.", + "request.error.type.boolean": "القيمة المنطقية مطلوبة.", + "request.error.type.number": "الرقم مطلوب.", + "request.error.type.select": "جب أن تكون القيمة في قائمة محددة مسبقًا.", + "request.error.type.string": "السلسلة النصية مطلوبة.", + "request.error.validation.max": "هذه القيمة عالية جدًا.", + "request.error.validation.maxLength": "هذه القيمة طويلة جدًا.", + "request.error.validation.min": "هذه القيمة قليل جدًا.", + "request.error.validation.minLength": "هذه القيمة قصيرة جدًا.", + "request.error.validation.regex": "هذه القيمة لا تطابق regex.", + "request.error.validation.required": "قيمة هذا الحقل مطلوبة.", + "strapi.notification.error": "حدث خطأ", + "strapi.notification.info.serverRestart": "سيتم إعادة تشغيل الخادم", + "strapi.notification.info.settingsEqual": "الإعدادات متساوية", + "strapi.notification.success.databaseAdd": "تمت إضافة قاعدة البيانات بنجاح.", + "strapi.notification.success.databaseDelete": "تم حذف قاعدة البيانات بنجاح.", + "strapi.notification.success.databaseDeleted": "تم حذف قاعدة البيانات.", + "strapi.notification.success.databaseEdit": "تم تحديث إعدادات قاعدة البيانات بنجاح.", + "strapi.notification.success.languageAdd": "تمت إضافة اللغة بنجاح.", + "strapi.notification.success.languageDelete": "تم حذف اللغة بنجاح.", + "strapi.notification.success.settingsEdit": "تم تحديث الإعدادات بنجاح." +} \ No newline at end of file diff --git a/packages/strapi-plugin-settings-manager/admin/src/translations/de.json b/packages/strapi-plugin-settings-manager/admin/src/translations/de.json index 8128d30e42..32cadbf0ba 100644 --- a/packages/strapi-plugin-settings-manager/admin/src/translations/de.json +++ b/packages/strapi-plugin-settings-manager/admin/src/translations/de.json @@ -1,162 +1,84 @@ { "components.DownloadDb.download": "Installiere...", "components.DownloadDb.text": "Dies kann kurz dauern. Danke für deine Geduld.", - "plugin.description.short": "Passe dein Projekt in Sekundenschnelle an.", - "plugin.description.long": "Passe dein Projekt in Sekundenschnelle an.", - "menu.section.global-settings": "Systemweite Einstellungen", - "menu.item.application": "Anwendung", - "menu.item.languages": "Sprachen", - "menu.item.advanced": "Fortgeschritten", - - "menu.section.environments": "Umgebungen", - "menu.item.database": "Datenbank", - "menu.item.request": "Anfragen", - "menu.item.response": "Antwort", - "menu.item.security": "Sicherheit", - "menu.item.server": "Server", - - "form.button.cancel": "Abbrechen", - "form.button.save": "Speichern", - "form.button.confirm": "Bestätigen", - - "form.databases.name": "Datenbank", - "form.databases.description": "Verwalte deine Datenbankeinstellungen.", - - "form.database.item.name": "Verbindungsname", - "form.database.item.client": "Client", - "form.database.item.connector": "Connector", - "form.database.item.host": "Host", - "form.database.item.port": "Port", - "form.database.item.username": "Benutzername", - "form.database.item.password": "Passwort", - "form.database.item.database": "Datenbank", - "form.database.item.ssl": "SSL", - "form.database.item.authenticationDatabase": "Authentifizierungsdatenbank", - "form.database.item.default": "Als Standard festgelegt", - "form.database.item.provider.mongo": "Mongo", - "form.database.item.provider.postgres": "PostgreSQL", - "form.database.item.provider.mysql": "MySQL", - "form.database.item.provider.redis": "Redis", - - "form.application.name": "Anwendung", - "form.application.description": "Verwalte allgemeine Einstellungen.", - - "form.application.item.name": "Name", - "form.application.item.description": "Beschreibung", - "form.application.item.version": "Version", - - "form.advanced.name": "Fortgeschritten", "form.advanced.description": "Verwalte fortgeschrittene Einstellungen.", - "form.advanced.item.admin": "URL des Adminbereichs", "form.advanced.item.prefix": "Präfix API", - - "form.request.name": "Anfragen", + "form.advanced.name": "Fortgeschritten", + "form.application.description": "Verwalte allgemeine Einstellungen.", + "form.application.item.description": "Beschreibung", + "form.application.item.name": "Name", + "form.application.item.version": "Version", + "form.application.name": "Anwendung", + "form.button.cancel": "Abbrechen", + "form.button.confirm": "Bestätigen", + "form.button.save": "Speichern", + "form.database.item.authenticationDatabase": "Authentifizierungsdatenbank", + "form.database.item.client": "Client", + "form.database.item.connector": "Connector", + "form.database.item.database": "Datenbank", + "form.database.item.default": "Als Standard festgelegt", + "form.database.item.host": "Host", + "form.database.item.name": "Verbindungsname", + "form.database.item.password": "Passwort", + "form.database.item.port": "Port", + "form.database.item.provider.mongo": "Mongo", + "form.database.item.provider.mysql": "MySQL", + "form.database.item.provider.postgres": "PostgreSQL", + "form.database.item.provider.redis": "Redis", + "form.database.item.ssl": "SSL", + "form.database.item.username": "Benutzername", + "form.databases.description": "Verwalte deine Datenbankeinstellungen.", + "form.databases.name": "Datenbank", + "form.language.choose": "Wähle eine Sprache:", + "form.language.description": "Verwalte installierte Sprachen.", + "form.language.name": "Sprachen", "form.request.description": "Verwalte deine Anfrageneinstellungen.", + "form.request.item.logger": "Logger", + "form.request.item.logger.exposeInContext": "An Kontext übergeben", + "form.request.item.logger.level": "Stufe", + "form.request.item.logger.requests": "Anfragen", "form.request.item.parser": "Parser", "form.request.item.parser.multipart": "Parser Multipart", "form.request.item.prefix": "Präfix", "form.request.item.prefix.prefix": "Präfix", - "form.request.item.logger": "Logger", - "form.request.item.logger.level": "Stufe", - "form.request.item.logger.exposeInContext": "An Kontext übergeben", - "form.request.item.logger.requests": "Anfragen", "form.request.item.router": "Router", "form.request.item.router.prefix": "Präfix", - - "form.response.name": "Antwort", + "form.request.name": "Anfragen", "form.response.description": "Verwalte deine Antworteinstellungen.", "form.response.item.gzip.enabled": "Gzip", "form.response.item.responseTime.enabled": "Antwortzeit", - - "form.security.name": "Sicherheit", + "form.response.name": "Antwort", "form.security.description": "Verwalte deine Sicherheitseinstellungen.", - + "form.security.item.cors": "Cors", + "form.security.item.cors.origin": "Origin", "form.security.item.csrf": "CSRF", - "form.security.item.p3p": "P3P", - "form.security.item.p3p.value": "Wert", - "form.security.item.hsts": "HOSTS", + "form.security.item.csrf.angular": "Angular", + "form.security.item.csrf.cookie": "Cookie", "form.security.item.csrf.key": "Key", "form.security.item.csrf.secret": "Secret", - "form.security.item.csrf.cookie": "Cookie", - "form.security.item.csrf.angular": "Angular", - "form.security.item.hsts.maxAge": "Max Age", + "form.security.item.hsts": "HOSTS", "form.security.item.hsts.includeSubDomains": "Subdomain mit einschließen", + "form.security.item.hsts.maxAge": "Max Age", "form.security.item.hsts.preload": "Vorladen", - + "form.security.item.p3p": "P3P", + "form.security.item.p3p.value": "Wert", "form.security.item.session": "Session", "form.security.item.session.key": "Secret key", "form.security.item.session.maxAge": "Maximum age", - "form.security.item.xframe": "Xframe", - "form.security.item.xframe.value": "Options", + "form.security.item.xframe.allow-from": "ALLOW-FROM", "form.security.item.xframe.deny": "DENY", "form.security.item.xframe.sameorigin": "SAMEORIGIN", - "form.security.item.xframe.allow-from": "ALLOW-FROM", - + "form.security.item.xframe.value": "Options", "form.security.item.xssProtection": "xss Protection", "form.security.item.xssProtection.mode": "Mode", - - "form.security.item.cors": "Cors", - "form.security.item.cors.origin": "Origin", - - "form.server.name": "Server", + "form.security.name": "Sicherheit", "form.server.description": "Verwalte deine Servereinstellungen.", - + "form.server.item.cron": "Cron", "form.server.item.host": "Host", "form.server.item.port": "Port", - "form.server.item.cron": "Cron", - - "form.language.name": "Sprachen", - "form.language.description": "Verwalte installierte Sprachen.", - "form.language.choose": "Wähle eine Sprache:", - - "request.error.database.exist": "Diese Verbindung gibt es bereits", - "request.error.database.unknow": "Keine solche Verbindung", - "request.error.type.string": "Ein Text ist erforderlich.", - "request.error.type.number": "Eine Nummer ist erforderlich.", - "request.error.type.boolean": "Ein Boolean ist erforderlich.", - "request.error.type.select": "Der Wert muss in der vordefinierten Liste enthalten sein.", - - "request.error.validation.required": "Dieser Wert ist erforderlich.", - "request.error.validation.regex": "Dieser Wert entspricht nicht dem RegEx.", - "request.error.validation.max": "Dieser Wert ist zu hoch.", - "request.error.validation.min": "Dieser Wert ist zu niedrig.", - "request.error.validation.maxLength": "Dieser Wert ist zu lang.", - "request.error.validation.minLength": "Dieser Wert ist zu kurz.", - - "request.error.config": "Konfigurationsdatei fehlt.", - "request.error.environment.required": "Umgebung ist erforderlich.", - "request.error.environment.unknow": "Unbekannte Umgebung.", - "request.error.languages.exist": "Diese Sprache ist bereits installiert.", - "request.error.languages.unknow": "Diese Sprache ist nicht installiert.", - "request.error.languages.incorrect": "Diese Sprache ist inkorrekt.", - - "list.languages.button.label": "Eine neue Sprache hinzufügen", - "list.languages.title.singular": "Sprache ist verfügbar", - "list.languages.title.plural": "Sprachen sind verfügbar", - "list.languages.default.languages": "Standard", - "list.languages.set.languages": "Als Standard festlegen", - "list.databases.button.label": "Eine neue Verbindung hinzufügen", - "list.databases.title.singular": "Verbindung in dieser Umgebung", - "list.databases.title.plural": "Verbindungen in dieser Umgebung", - - "popUpWarning.title": "Bitte bestätigen", - "popUpWarning.databases.danger.message": "Es gibt noch hiermit verbundene Inhaltstypen. Durch das Löschen könntest du deine Anwendung beschädigen. Sei vorsichtig...", - "popUpWarning.danger.ok.message": "Ich stimme zu", - "popUpWarning.databases.delete.message": "Bist du sicher, dass du diese Datenbank löschen möchtest?", - "popUpWarning.languages.delete.message": "Bist du sicher, dass du diese Sprache entfernen möchtest?", - "strapi.notification.info.settingsEqual": "Einstellungen sind gleich", - "strapi.notification.success.databaseDelete": "Die Datenbank wurde erfolgreich gelöscht.", - "strapi.notification.success.languageDelete": "Die Sprache wurde erfolgreich entfernt.", - "strapi.notification.success.languageAdd": "Die Sprache wurde erfolgreich hinzugefügt.", - "strapi.notification.success.databaseAdd": "Die Datenbank wurde erfolgreich erstellt.", - "strapi.notification.success.databaseEdit": "Die Datenbankeinstellungen wurden erfolgreich aktualisiert.", - "strapi.notification.success.databaseDeleted": "Diese Datenbank wurde gelöscht.", - "strapi.notification.success.settingsEdit": "Die Einstellungen wurden erfolgreich aktualisiert.", - "strapi.notification.error": "Ein Fehler ist aufgetreten", - "strapi.notification.info.serverRestart": "Der Server startet neu", - + "form.server.name": "Server", "language.af": "Afrikaans", "language.af_NA": "Afrikaans (Namibië)", "language.af_ZA": "Afrikaans (Suid-Afrika)", @@ -651,6 +573,58 @@ "language.zh_Hant_TW": "中文(繁體中文,台灣)", "language.zu": "isiZulu", "language.zu_ZA": "isiZulu (iNingizimu Afrika)", - - "pageNotFound": "Page not found" -} + "list.databases.button.label": "Eine neue Verbindung hinzufügen", + "list.databases.title.plural": "Verbindungen in dieser Umgebung", + "list.databases.title.singular": "Verbindung in dieser Umgebung", + "list.languages.button.label": "Eine neue Sprache hinzufügen", + "list.languages.default.languages": "Standard", + "list.languages.set.languages": "Als Standard festlegen", + "list.languages.title.plural": "Sprachen sind verfügbar", + "list.languages.title.singular": "Sprache ist verfügbar", + "menu.item.advanced": "Fortgeschritten", + "menu.item.application": "Anwendung", + "menu.item.database": "Datenbank", + "menu.item.languages": "Sprachen", + "menu.item.request": "Anfragen", + "menu.item.response": "Antwort", + "menu.item.security": "Sicherheit", + "menu.item.server": "Server", + "menu.section.environments": "Umgebungen", + "menu.section.global-settings": "Systemweite Einstellungen", + "pageNotFound": "Page not found", + "plugin.description.long": "Passe dein Projekt in Sekundenschnelle an.", + "plugin.description.short": "Passe dein Projekt in Sekundenschnelle an.", + "popUpWarning.danger.ok.message": "Ich stimme zu", + "popUpWarning.databases.danger.message": "Es gibt noch hiermit verbundene Inhaltstypen. Durch das Löschen könntest du deine Anwendung beschädigen. Sei vorsichtig...", + "popUpWarning.databases.delete.message": "Bist du sicher, dass du diese Datenbank löschen möchtest?", + "popUpWarning.languages.delete.message": "Bist du sicher, dass du diese Sprache entfernen möchtest?", + "popUpWarning.title": "Bitte bestätigen", + "request.error.config": "Konfigurationsdatei fehlt.", + "request.error.database.exist": "Diese Verbindung gibt es bereits", + "request.error.database.unknow": "Keine solche Verbindung", + "request.error.environment.required": "Umgebung ist erforderlich.", + "request.error.environment.unknow": "Unbekannte Umgebung.", + "request.error.languages.exist": "Diese Sprache ist bereits installiert.", + "request.error.languages.incorrect": "Diese Sprache ist inkorrekt.", + "request.error.languages.unknow": "Diese Sprache ist nicht installiert.", + "request.error.type.boolean": "Ein Boolean ist erforderlich.", + "request.error.type.number": "Eine Nummer ist erforderlich.", + "request.error.type.select": "Der Wert muss in der vordefinierten Liste enthalten sein.", + "request.error.type.string": "Ein Text ist erforderlich.", + "request.error.validation.max": "Dieser Wert ist zu hoch.", + "request.error.validation.maxLength": "Dieser Wert ist zu lang.", + "request.error.validation.min": "Dieser Wert ist zu niedrig.", + "request.error.validation.minLength": "Dieser Wert ist zu kurz.", + "request.error.validation.regex": "Dieser Wert entspricht nicht dem RegEx.", + "request.error.validation.required": "Dieser Wert ist erforderlich.", + "strapi.notification.error": "Ein Fehler ist aufgetreten", + "strapi.notification.info.serverRestart": "Der Server startet neu", + "strapi.notification.info.settingsEqual": "Einstellungen sind gleich", + "strapi.notification.success.databaseAdd": "Die Datenbank wurde erfolgreich erstellt.", + "strapi.notification.success.databaseDelete": "Die Datenbank wurde erfolgreich gelöscht.", + "strapi.notification.success.databaseDeleted": "Diese Datenbank wurde gelöscht.", + "strapi.notification.success.databaseEdit": "Die Datenbankeinstellungen wurden erfolgreich aktualisiert.", + "strapi.notification.success.languageAdd": "Die Sprache wurde erfolgreich hinzugefügt.", + "strapi.notification.success.languageDelete": "Die Sprache wurde erfolgreich entfernt.", + "strapi.notification.success.settingsEdit": "Die Einstellungen wurden erfolgreich aktualisiert." +} \ No newline at end of file diff --git a/packages/strapi-plugin-settings-manager/admin/src/translations/en.json b/packages/strapi-plugin-settings-manager/admin/src/translations/en.json index b9365fada3..b885891a6f 100644 --- a/packages/strapi-plugin-settings-manager/admin/src/translations/en.json +++ b/packages/strapi-plugin-settings-manager/admin/src/translations/en.json @@ -1,168 +1,89 @@ { "components.DownloadDb.download": "Installation in progess...", "components.DownloadDb.text": "This could take a minute or so. Thanks for your patience.", - "plugin.description.short": "Configure your project within seconds.", - "plugin.description.long": "Configure your project within seconds.", - "menu.section.global-settings": "Global settings", - "menu.item.application": "Application", - "menu.item.languages": "Languages", - "menu.item.advanced": "Advanced", - - "menu.section.environments": "Environments", - "menu.item.database": "Database", - "menu.item.request": "Request", - "menu.item.response": "Response", - "menu.item.security": "Security", - "menu.item.server": "Server", - - "form.button.cancel": "Cancel", - "form.button.save": "Save", - "form.button.confirm": "Confirm", - - "form.databases.name": "Database", - "form.databases.description": "Configure your database settings by environment.", - - "form.database.item.name": "Connection Name", - "form.database.item.client": "Client", - "form.database.item.connector": "Connector", - "form.database.item.host": "Host", - "form.database.item.port": "Port", - "form.database.item.username": "Username", - "form.database.item.password": "Password", - "form.database.item.database": "Database", - "form.database.item.ssl": "SSL", - "form.database.item.authenticationDatabase": "Authentication Database", - "form.database.item.default": "Set as default connection", - "form.database.item.provider.mongo": "Mongo", - "form.database.item.provider.postgres": "PostgresSQL", - "form.database.item.provider.mysql": "MySQL", - "form.database.item.provider.redis": "Redis", - - "form.application.name": "Application", - "form.application.description": "Configure your application settings.", - - "form.application.item.name": "Name", - "form.application.item.description": "Description", - "form.application.item.version": "Version", - - "form.advanced.name": "Advanced", "form.advanced.description": "Configure your advanced settings.", - "form.advanced.item.admin": "Admin dashboard url", "form.advanced.item.prefix": "Prefix API", - - "form.request.name": "Request", + "form.advanced.name": "Advanced", + "form.application.description": "Configure your application settings.", + "form.application.item.description": "Description", + "form.application.item.name": "Name", + "form.application.item.version": "Version", + "form.application.name": "Application", + "form.button.cancel": "Cancel", + "form.button.confirm": "Confirm", + "form.button.save": "Save", + "form.database.item.authenticationDatabase": "Authentication Database", + "form.database.item.client": "Client", + "form.database.item.connector": "Connector", + "form.database.item.database": "Database", + "form.database.item.default": "Set as default connection", + "form.database.item.host": "Host", + "form.database.item.name": "Connection Name", + "form.database.item.password": "Password", + "form.database.item.port": "Port", + "form.database.item.provider.mongo": "Mongo", + "form.database.item.provider.mysql": "MySQL", + "form.database.item.provider.postgres": "PostgresSQL", + "form.database.item.provider.redis": "Redis", + "form.database.item.ssl": "SSL", + "form.database.item.username": "Username", + "form.databases.description": "Configure your database settings by environment.", + "form.databases.name": "Database", + "form.language.choose": "Choose a language:", + "form.language.description": "Configure your languages.", + "form.language.name": "Languages", "form.request.description": "Configure your request settings.", + "form.request.item.logger": "Logger", + "form.request.item.logger.exposeInContext": "Expose in context", + "form.request.item.logger.level": "Level", + "form.request.item.logger.requests": "Requests", "form.request.item.parser": "Parser", "form.request.item.parser.multipart": "Parser Multipart", "form.request.item.prefix": "Prefix", "form.request.item.prefix.prefix": "Prefix", - "form.request.item.logger": "Logger", - "form.request.item.logger.level": "Level", - "form.request.item.logger.exposeInContext": "Expose in context", - "form.request.item.logger.requests": "Requests", "form.request.item.router": "Router", "form.request.item.router.prefix": "Prefix", - - "form.response.name": "Response", + "form.request.name": "Request", "form.response.description": "Configure your response settings.", "form.response.item.gzip.enabled": "Gzip", "form.response.item.responseTime.enabled": "Response Time", - - "form.security.name": "Security", + "form.response.name": "Response", "form.security.description": "Configure your security settings.", - + "form.security.item.cors": "Cors", + "form.security.item.cors.origin": "Origin", "form.security.item.csrf": "CSRF", - "form.security.item.p3p": "P3P", - "form.security.item.p3p.value": "Value", - "form.security.item.hsts": "HOSTS", + "form.security.item.csrf.angular": "Angular", + "form.security.item.csrf.cookie": "Cookie", "form.security.item.csrf.key": "Key", "form.security.item.csrf.secret": "Secret", - "form.security.item.csrf.cookie": "Cookie", - "form.security.item.csrf.angular": "Angular", - "form.security.item.hsts.maxAge": "Max Age", + "form.security.item.hsts": "HOSTS", "form.security.item.hsts.includeSubDomains": "Include Sub Domain", + "form.security.item.hsts.maxAge": "Max Age", "form.security.item.hsts.preload": "Preload", - + "form.security.item.p3p": "P3P", + "form.security.item.p3p.value": "Value", "form.security.item.session": "Session", "form.security.item.session.key": "Secret key", "form.security.item.session.maxAge": "Maximum age", - "form.security.item.xframe": "Xframe", - "form.security.item.xframe.value": "Options", + "form.security.item.xframe.allow-from": "ALLOW-FROM", "form.security.item.xframe.deny": "DENY", "form.security.item.xframe.sameorigin": "SAMEORIGIN", - "form.security.item.xframe.allow-from": "ALLOW-FROM", - + "form.security.item.xframe.value": "Options", "form.security.item.xssProtection": "xss Protection", "form.security.item.xssProtection.mode": "Mode", - - "form.security.item.cors": "Cors", - "form.security.item.cors.origin": "Origin", - - "form.server.name": "Server", + "form.security.name": "Security", "form.server.description": "Configure your server settings.", - + "form.server.item.cron": "Cron", "form.server.item.host": "Host", "form.server.item.port": "Port", - "form.server.item.cron": "Cron", - "form.server.item.proxy": "Proxy Settings", "form.server.item.proxy.enable": "Proxy Enable", - "form.server.item.proxy.ssl": "Proxy SSL", "form.server.item.proxy.host": "Proxy Host", "form.server.item.proxy.port": "Proxy Port", - - "form.language.name": "Languages", - "form.language.description": "Configure your languages.", - "form.language.choose": "Choose a language:", - - "request.error.database.exist": "This connection already exists", - "request.error.database.unknow": "No such connection", - "request.error.type.string": "A text is required.", - "request.error.type.number": "A number is required.", - "request.error.type.boolean": "A boolean is required.", - "request.error.type.select": "The value must be in predefined list.", - - "request.error.validation.required": "This value input is required.", - "request.error.validation.regex": "The value does not match the regex.", - "request.error.validation.max": "The value is too high.", - "request.error.validation.min": "The value is too low.", - "request.error.validation.maxLength": "The value is too long.", - "request.error.validation.minLength": "The value is too shot.", - - "request.error.config": "Config file doesn't exist.", - "request.error.environment.required": "Environment is required.", - "request.error.environment.unknow": "Environment is unknown.", - "request.error.languages.exist": "This language already exist.", - "request.error.languages.unknow": "This language doesn't exist.", - "request.error.languages.incorrect": "This language is incorrect.", - - "list.languages.button.label": "Add a new language", - "list.languages.title.singular": "language is available", - "list.languages.title.plural": "languages are available", - "list.languages.default.languages": "Default language", - "list.languages.set.languages": "Set as default", - "list.databases.button.label": "Add a new connection", - "list.databases.title.singular": "connection in this environment", - "list.databases.title.plural": "connections in this environment", - - "popUpWarning.title": "Please confirm", - "popUpWarning.databases.danger.message": "Content Types are still linked with this connection. By removing it, you could cause critical issues to your app. Be careful...", - "popUpWarning.danger.ok.message": "I Understand", - "popUpWarning.databases.delete.message": "Are you sure you want to delete this database?", - "popUpWarning.languages.delete.message": "Are you sure you want to delete this language?", - "strapi.notification.info.settingsEqual": "Settings are equals", - "strapi.notification.success.databaseDelete": "The database has been successfully deleted.", - "strapi.notification.success.languageDelete": "The language has been successfully deleted.", - "strapi.notification.success.languageAdd": "The language has been successfully added.", - "strapi.notification.success.databaseAdd": "The database has been successfully added.", - "strapi.notification.success.databaseEdit": "The database settings have been successfully updated.", - "strapi.notification.success.databaseDeleted": "The database has been deleted.", - "strapi.notification.success.settingsEdit": "The settings have been successfully updated.", - "strapi.notification.error": "An error occurred", - "strapi.notification.info.serverRestart": "The server will restart", - + "form.server.item.proxy.ssl": "Proxy SSL", + "form.server.name": "Server", "language.af": "Afrikaans", "language.af_NA": "Afrikaans (Namibië)", "language.af_ZA": "Afrikaans (Suid-Afrika)", @@ -657,6 +578,58 @@ "language.zh_Hant_TW": "中文(繁體中文,台灣)", "language.zu": "isiZulu", "language.zu_ZA": "isiZulu (iNingizimu Afrika)", - - "pageNotFound": "Page not found" -} + "list.databases.button.label": "Add a new connection", + "list.databases.title.plural": "connections in this environment", + "list.databases.title.singular": "connection in this environment", + "list.languages.button.label": "Add a new language", + "list.languages.default.languages": "Default language", + "list.languages.set.languages": "Set as default", + "list.languages.title.plural": "languages are available", + "list.languages.title.singular": "language is available", + "menu.item.advanced": "Advanced", + "menu.item.application": "Application", + "menu.item.database": "Database", + "menu.item.languages": "Languages", + "menu.item.request": "Request", + "menu.item.response": "Response", + "menu.item.security": "Security", + "menu.item.server": "Server", + "menu.section.environments": "Environments", + "menu.section.global-settings": "Global settings", + "pageNotFound": "Page not found", + "plugin.description.long": "Configure your project within seconds.", + "plugin.description.short": "Configure your project within seconds.", + "popUpWarning.danger.ok.message": "I Understand", + "popUpWarning.databases.danger.message": "Content Types are still linked with this connection. By removing it, you could cause critical issues to your app. Be careful...", + "popUpWarning.databases.delete.message": "Are you sure you want to delete this database?", + "popUpWarning.languages.delete.message": "Are you sure you want to delete this language?", + "popUpWarning.title": "Please confirm", + "request.error.config": "Config file doesn't exist.", + "request.error.database.exist": "This connection already exists", + "request.error.database.unknow": "No such connection", + "request.error.environment.required": "Environment is required.", + "request.error.environment.unknow": "Environment is unknown.", + "request.error.languages.exist": "This language already exist.", + "request.error.languages.incorrect": "This language is incorrect.", + "request.error.languages.unknow": "This language doesn't exist.", + "request.error.type.boolean": "A boolean is required.", + "request.error.type.number": "A number is required.", + "request.error.type.select": "The value must be in predefined list.", + "request.error.type.string": "A text is required.", + "request.error.validation.max": "The value is too high.", + "request.error.validation.maxLength": "The value is too long.", + "request.error.validation.min": "The value is too low.", + "request.error.validation.minLength": "The value is too shot.", + "request.error.validation.regex": "The value does not match the regex.", + "request.error.validation.required": "This value input is required.", + "strapi.notification.error": "An error occurred", + "strapi.notification.info.serverRestart": "The server will restart", + "strapi.notification.info.settingsEqual": "Settings are equals", + "strapi.notification.success.databaseAdd": "The database has been successfully added.", + "strapi.notification.success.databaseDelete": "The database has been successfully deleted.", + "strapi.notification.success.databaseDeleted": "The database has been deleted.", + "strapi.notification.success.databaseEdit": "The database settings have been successfully updated.", + "strapi.notification.success.languageAdd": "The language has been successfully added.", + "strapi.notification.success.languageDelete": "The language has been successfully deleted.", + "strapi.notification.success.settingsEdit": "The settings have been successfully updated." +} \ No newline at end of file diff --git a/packages/strapi-plugin-settings-manager/admin/src/translations/es.json b/packages/strapi-plugin-settings-manager/admin/src/translations/es.json index 7c8ce57dbe..4bf6403b54 100644 --- a/packages/strapi-plugin-settings-manager/admin/src/translations/es.json +++ b/packages/strapi-plugin-settings-manager/admin/src/translations/es.json @@ -1,162 +1,84 @@ { "components.DownloadDb.download": "Instalación en curso...", "components.DownloadDb.text": "Esto podría llevar un minuto más o menos. Gracias por su paciencia.", - "plugin.description.short": "Configure su proyecto en cuestión de segundos.", - "plugin.description.long": "Configure su proyecto en cuestión de segundos.", - "menu.section.global-settings": "Ajustes globales", - "menu.item.application": "Aplicación", - "menu.item.languages": "Idiomas", - "menu.item.advanced": "Avanzado", - - "menu.section.environments": "Entornos", - "menu.item.database": "Base de Datos", - "menu.item.request": "Petición", - "menu.item.response": "Respuesta", - "menu.item.security": "Seguridad", - "menu.item.server": "Servidor", - - "form.button.cancel": "Cancelar", - "form.button.save": "Guardar", - "form.button.confirm": "Confirmar", - - "form.databases.name": "Base de Datos", - "form.databases.description": "Configure las opciones de su base de datos por entorno.", - - "form.database.item.name": "Nombre de la conexión", - "form.database.item.client": "Cliente", - "form.database.item.connector": "Conector", - "form.database.item.host": "Anfitrión", - "form.database.item.port": "Puerto", - "form.database.item.username": "Nombre de Usuario", - "form.database.item.password": "Contraseña", - "form.database.item.database": "Base de Datos", - "form.database.item.ssl": "SSL", - "form.database.item.authenticationDatabase": "Base de Datos de Autenticación", - "form.database.item.default": "Establecer como conexión predeterminada", - "form.database.item.provider.mongo": "Mongo", - "form.database.item.provider.postgres": "PostgresSQL", - "form.database.item.provider.mysql": "MySQL", - "form.database.item.provider.redis": "Redis", - - "form.application.name": "Aplicación", - "form.application.description": "Configure las opciones de su aplicación.", - - "form.application.item.name": "Nombre", - "form.application.item.description": "Descripción", - "form.application.item.version": "Versión", - - "form.advanced.name": "Avanzado", "form.advanced.description": "Configure sus opciones avanzadas.", - "form.advanced.item.admin": "URL del panel de control del administrador", "form.advanced.item.prefix": "API de prefijos", - - "form.request.name": "Solicitud", + "form.advanced.name": "Avanzado", + "form.application.description": "Configure las opciones de su aplicación.", + "form.application.item.description": "Descripción", + "form.application.item.name": "Nombre", + "form.application.item.version": "Versión", + "form.application.name": "Aplicación", + "form.button.cancel": "Cancelar", + "form.button.confirm": "Confirmar", + "form.button.save": "Guardar", + "form.database.item.authenticationDatabase": "Base de Datos de Autenticación", + "form.database.item.client": "Cliente", + "form.database.item.connector": "Conector", + "form.database.item.database": "Base de Datos", + "form.database.item.default": "Establecer como conexión predeterminada", + "form.database.item.host": "Anfitrión", + "form.database.item.name": "Nombre de la conexión", + "form.database.item.password": "Contraseña", + "form.database.item.port": "Puerto", + "form.database.item.provider.mongo": "Mongo", + "form.database.item.provider.mysql": "MySQL", + "form.database.item.provider.postgres": "PostgresSQL", + "form.database.item.provider.redis": "Redis", + "form.database.item.ssl": "SSL", + "form.database.item.username": "Nombre de Usuario", + "form.databases.description": "Configure las opciones de su base de datos por entorno.", + "form.databases.name": "Base de Datos", + "form.language.choose": "Seleccione un idioma:", + "form.language.description": "Configure sus idiomas.", + "form.language.name": "Idiomas", "form.request.description": "Configure los ajustes de su solicitud.", + "form.request.item.logger": "Logger", + "form.request.item.logger.exposeInContext": "Exponer en contexto", + "form.request.item.logger.level": "Nivel", + "form.request.item.logger.requests": "Solicitudes", "form.request.item.parser": "Parser", "form.request.item.parser.multipart": "Parser Multiparte", "form.request.item.prefix": "Prefijo", "form.request.item.prefix.prefix": "Prefijo", - "form.request.item.logger": "Logger", - "form.request.item.logger.level": "Nivel", - "form.request.item.logger.exposeInContext": "Exponer en contexto", - "form.request.item.logger.requests": "Solicitudes", "form.request.item.router": "Router", "form.request.item.router.prefix": "Prefijo", - - "form.response.name": "Respuesta", + "form.request.name": "Solicitud", "form.response.description": "Configurar las opciones de respuesta.", "form.response.item.gzip.enabled": "Gzip", "form.response.item.responseTime.enabled": "Tiempo de respuesta", - - "form.security.name": "Seguridad", + "form.response.name": "Respuesta", "form.security.description": "Configurar las opciones de seguridad.", - + "form.security.item.cors": "Cors", + "form.security.item.cors.origin": "Origen", "form.security.item.csrf": "CSRF", - "form.security.item.p3p": "P3P", - "form.security.item.p3p.value": "Valor", - "form.security.item.hsts": "HOSTS", + "form.security.item.csrf.angular": "Angular", + "form.security.item.csrf.cookie": "Cookie", "form.security.item.csrf.key": "Clave", "form.security.item.csrf.secret": "Secreto", - "form.security.item.csrf.cookie": "Cookie", - "form.security.item.csrf.angular": "Angular", - "form.security.item.hsts.maxAge": "Edad Máxima", + "form.security.item.hsts": "HOSTS", "form.security.item.hsts.includeSubDomains": "Incluir Sub Dominio", + "form.security.item.hsts.maxAge": "Edad Máxima", "form.security.item.hsts.preload": "Precarga", - + "form.security.item.p3p": "P3P", + "form.security.item.p3p.value": "Valor", "form.security.item.session": "Sesión", "form.security.item.session.key": "Clave secreta", "form.security.item.session.maxAge": "Edad máxima", - "form.security.item.xframe": "Xframe", - "form.security.item.xframe.value": "Opciones", + "form.security.item.xframe.allow-from": "ALLOW-FROM", "form.security.item.xframe.deny": "DENY", "form.security.item.xframe.sameorigin": "SAMEORIGIN", - "form.security.item.xframe.allow-from": "ALLOW-FROM", - + "form.security.item.xframe.value": "Opciones", "form.security.item.xssProtection": "Protección xss", "form.security.item.xssProtection.mode": "Modo", - - "form.security.item.cors": "Cors", - "form.security.item.cors.origin": "Origen", - - "form.server.name": "Servidor", + "form.security.name": "Seguridad", "form.server.description": "Configure las opciones de su servidor.", - + "form.server.item.cron": "Cron", "form.server.item.host": "Host", "form.server.item.port": "Puerto", - "form.server.item.cron": "Cron", - - "form.language.name": "Idiomas", - "form.language.description": "Configure sus idiomas.", - "form.language.choose": "Seleccione un idioma:", - - "request.error.database.exist": "Esta conexión ya existe", - "request.error.database.unknow": "No existe dicha conexión", - "request.error.type.string": "Se requiere un texto.", - "request.error.type.number": "Se requiere un número.", - "request.error.type.boolean": "Se requiere un booleano.", - "request.error.type.select": "El valor debe estar en una lista predefinida.", - - "request.error.validation.required": "Esta entrada de valor es obligatoria.", - "request.error.validation.regex": "El valor no coincide con el valor de regex.", - "request.error.validation.max": "El valor es demasiado alto.", - "request.error.validation.min": "El valor es demasiado bajo.", - "request.error.validation.maxLength": "El valor es demasiado largo.", - "request.error.validation.minLength": "El valor es demasiado alto.", - - "request.error.config": "El archivo de configuración no existe.", - "request.error.environment.required": "Se requiere un entorno.", - "request.error.environment.unknow": "El entorno es desconocido.", - "request.error.languages.exist": "Este idioma ya existe.", - "request.error.languages.unknow": "This language doesn't exist.", - "request.error.languages.incorrect": "Este idioma no existe.", - - "list.languages.button.label": "Añadir un nuevo idioma", - "list.languages.title.singular": "idioma disponible", - "list.languages.title.plural": "idiomas disponibles", - "list.languages.default.languages": "Idioma por defecto", - "list.languages.set.languages": "Fijar como valor por defecto", - "list.databases.button.label": "Añadir una nueva conexión", - "list.databases.title.singular": "conexión en este entorno", - "list.databases.title.plural": "conexiones en este entorno", - - "popUpWarning.title": "Por favor, confirme", - "popUpWarning.databases.danger.message": "Los Tipos de Contenido todavía están vinculados a esta conexión. Al eliminarlo, podría causar problemas críticos a su aplicación. Ten cuidado...", - "popUpWarning.danger.ok.message": "Entiendo", - "popUpWarning.databases.delete.message": "¿Está seguro de que desea eliminar esta Base de Datos?", - "popUpWarning.languages.delete.message": "¿Estás seguro de que quieres eliminar este idioma?", - "strapi.notification.info.settingsEqual": "Los ajustes son idénticos", - "strapi.notification.success.databaseDelete": "La base de datos se ha borrado con éxito.", - "strapi.notification.success.languageDelete": "El idioma ha sido borrado con éxito.", - "strapi.notification.success.languageAdd": "El idioma ha sido añadido con éxito.", - "strapi.notification.success.databaseAdd": "La Base de Datos ha sido añadida con éxito.", - "strapi.notification.success.databaseEdit": "La configuración de la base de datos se ha actualizado correctamente.", - "strapi.notification.success.databaseDeleted": "La base de datos ha sido borrada.", - "strapi.notification.success.settingsEdit": "La configuración se ha actualizado correctamente.", - "strapi.notification.error": "Se ha producido un error", - "strapi.notification.info.serverRestart": "El servidor se reiniciará", - + "form.server.name": "Servidor", "language.af": "Afrikaans", "language.af_NA": "Afrikaans (Namibië)", "language.af_ZA": "Afrikaans (Suid-Afrika)", @@ -651,6 +573,58 @@ "language.zh_Hant_TW": "中文(繁體中文,台灣)", "language.zu": "isiZulu", "language.zu_ZA": "isiZulu (iNingizimu Afrika)", - - "pageNotFound": "Página no encontrada" -} + "list.databases.button.label": "Añadir una nueva conexión", + "list.databases.title.plural": "conexiones en este entorno", + "list.databases.title.singular": "conexión en este entorno", + "list.languages.button.label": "Añadir un nuevo idioma", + "list.languages.default.languages": "Idioma por defecto", + "list.languages.set.languages": "Fijar como valor por defecto", + "list.languages.title.plural": "idiomas disponibles", + "list.languages.title.singular": "idioma disponible", + "menu.item.advanced": "Avanzado", + "menu.item.application": "Aplicación", + "menu.item.database": "Base de Datos", + "menu.item.languages": "Idiomas", + "menu.item.request": "Petición", + "menu.item.response": "Respuesta", + "menu.item.security": "Seguridad", + "menu.item.server": "Servidor", + "menu.section.environments": "Entornos", + "menu.section.global-settings": "Ajustes globales", + "pageNotFound": "Página no encontrada", + "plugin.description.long": "Configure su proyecto en cuestión de segundos.", + "plugin.description.short": "Configure su proyecto en cuestión de segundos.", + "popUpWarning.danger.ok.message": "Entiendo", + "popUpWarning.databases.danger.message": "Los Tipos de Contenido todavía están vinculados a esta conexión. Al eliminarlo, podría causar problemas críticos a su aplicación. Ten cuidado...", + "popUpWarning.databases.delete.message": "¿Está seguro de que desea eliminar esta Base de Datos?", + "popUpWarning.languages.delete.message": "¿Estás seguro de que quieres eliminar este idioma?", + "popUpWarning.title": "Por favor, confirme", + "request.error.config": "El archivo de configuración no existe.", + "request.error.database.exist": "Esta conexión ya existe", + "request.error.database.unknow": "No existe dicha conexión", + "request.error.environment.required": "Se requiere un entorno.", + "request.error.environment.unknow": "El entorno es desconocido.", + "request.error.languages.exist": "Este idioma ya existe.", + "request.error.languages.incorrect": "Este idioma no existe.", + "request.error.languages.unknow": "This language doesn't exist.", + "request.error.type.boolean": "Se requiere un booleano.", + "request.error.type.number": "Se requiere un número.", + "request.error.type.select": "El valor debe estar en una lista predefinida.", + "request.error.type.string": "Se requiere un texto.", + "request.error.validation.max": "El valor es demasiado alto.", + "request.error.validation.maxLength": "El valor es demasiado largo.", + "request.error.validation.min": "El valor es demasiado bajo.", + "request.error.validation.minLength": "El valor es demasiado alto.", + "request.error.validation.regex": "El valor no coincide con el valor de regex.", + "request.error.validation.required": "Esta entrada de valor es obligatoria.", + "strapi.notification.error": "Se ha producido un error", + "strapi.notification.info.serverRestart": "El servidor se reiniciará", + "strapi.notification.info.settingsEqual": "Los ajustes son idénticos", + "strapi.notification.success.databaseAdd": "La Base de Datos ha sido añadida con éxito.", + "strapi.notification.success.databaseDelete": "La base de datos se ha borrado con éxito.", + "strapi.notification.success.databaseDeleted": "La base de datos ha sido borrada.", + "strapi.notification.success.databaseEdit": "La configuración de la base de datos se ha actualizado correctamente.", + "strapi.notification.success.languageAdd": "El idioma ha sido añadido con éxito.", + "strapi.notification.success.languageDelete": "El idioma ha sido borrado con éxito.", + "strapi.notification.success.settingsEdit": "La configuración se ha actualizado correctamente." +} \ No newline at end of file diff --git a/packages/strapi-plugin-settings-manager/admin/src/translations/fr.json b/packages/strapi-plugin-settings-manager/admin/src/translations/fr.json index cc336ffc9a..68dac6d06a 100644 --- a/packages/strapi-plugin-settings-manager/admin/src/translations/fr.json +++ b/packages/strapi-plugin-settings-manager/admin/src/translations/fr.json @@ -1,165 +1,84 @@ { "components.DownloadDb.download": "Installation en cours...", "components.DownloadDb.text": "Cela peut prendre plusieurs minutes. Merci de patienter.", - "plugin.description.short": "Configurez votre projet en quelques secondes.", - "plugin.description.long": "Configurez votre projet en quelques secondes.", - "menu.section.global-settings": "Configuration générale", - "menu.item.application": "Application", - "menu.item.languages": "Langages", - "menu.item.advanced": "Avancé", - - "menu.section.environments": "Environnements", - "menu.item.database": "Base de donnée", - "menu.item.request": "Requête", - "menu.item.response": "Réponse", - "menu.item.security": "Sécurité", - "menu.item.server": "Serveur", - - "form.button.cancel": "Annuler", - "form.button.save": "Sauvegarder", - "form.button.confirm": "Confimer", - - "form.databases.name": "Bases de données", - "form.databases.description": "Modification des configurations de bases de données par environnement.", - - "form.database.item.name": "Nom de la Connexion", - "form.database.item.client": "Client", - "form.database.item.host": "Hôte", - "form.database.item.port": "Port", - "form.database.item.connector": "Connecteur", - "form.database.item.username": "Surnom", - "form.database.item.password": "Mot de Passe", - "form.database.item.database": "Base de données", - "form.database.item.default": "Définir comme connexion par défaut", - "form.database.item.provider.mongo": "Mongo", - "form.database.item.provider.postgres": "PostgresSQL", - "form.database.item.provider.mysql": "MySQL", - "form.database.item.provider.redis": "Redis", - "form.database.item.ssl": "SSL", - "form.database.item.authenticationDatabase": "Base de données d'authentification", - - "form.application.name": "Application", - "form.application.description": "Modification des configurations de l'application.", - - "form.application.item.name": "Nom", - "form.application.item.description": "Description", - "form.application.item.version": "Version", - - "form.advanced.name": "Avancé", "form.advanced.description": "Modification des configurations avancé.", - "form.advanced.item.admin": "Url du panel d'administration", "form.advanced.item.prefix": "Prefix de l'API", - - "form.request.name": "Requête", + "form.advanced.name": "Avancé", + "form.application.description": "Modification des configurations de l'application.", + "form.application.item.description": "Description", + "form.application.item.name": "Nom", + "form.application.item.version": "Version", + "form.application.name": "Application", + "form.button.cancel": "Annuler", + "form.button.confirm": "Confimer", + "form.button.save": "Sauvegarder", + "form.database.item.authenticationDatabase": "Base de données d'authentification", + "form.database.item.client": "Client", + "form.database.item.connector": "Connecteur", + "form.database.item.database": "Base de données", + "form.database.item.default": "Définir comme connexion par défaut", + "form.database.item.host": "Hôte", + "form.database.item.name": "Nom de la Connexion", + "form.database.item.password": "Mot de Passe", + "form.database.item.port": "Port", + "form.database.item.provider.mongo": "Mongo", + "form.database.item.provider.mysql": "MySQL", + "form.database.item.provider.postgres": "PostgresSQL", + "form.database.item.provider.redis": "Redis", + "form.database.item.ssl": "SSL", + "form.database.item.username": "Surnom", + "form.databases.description": "Modification des configurations de bases de données par environnement.", + "form.databases.name": "Bases de données", + "form.language.choose": "Choisissez un langage", + "form.language.description": "Modification des langages.", + "form.language.name": "Langages", "form.request.description": "Configuration des requêtes.", + "form.request.item.logger": "Logger", + "form.request.item.logger.exposeInContext": "Exposer dans le contexte", + "form.request.item.logger.level": "Niveau", + "form.request.item.logger.requests": "Requêtes", "form.request.item.parser": "Parser", "form.request.item.parser.multipart": "Parser Multipart", "form.request.item.prefix": "Préfix", "form.request.item.prefix.prefix": "Préfix", - "form.request.item.logger": "Logger", - "form.request.item.logger.level": "Niveau", - "form.request.item.logger.exposeInContext": "Exposer dans le contexte", - "form.request.item.logger.requests": "Requêtes", "form.request.item.router": "Router", "form.request.item.router.prefix": "Préfixe", - - "form.response.name": "Réponse", + "form.request.name": "Requête", "form.response.description": "Configuration des réponses.", "form.response.item.gzip.enabled": "Gzip", "form.response.item.responseTime.enabled": "Temps de réponse", - - "form.security.name": "Sécurité", + "form.response.name": "Réponse", "form.security.description": "Configurations de sécurité.", - + "form.security.item.cors": "Cors", + "form.security.item.cors.origin": "Origine", "form.security.item.csrf": "CSRF", - "form.security.item.p3p": "P3P", - "form.security.item.p3p.value": "Valeur", - "form.security.item.hsts": "HOSTS", + "form.security.item.csrf.angular": "Angular", + "form.security.item.csrf.cookie": "Cookie", "form.security.item.csrf.key": "Clé", "form.security.item.csrf.secret": "Clé secrète", - "form.security.item.csrf.cookie": "Cookie", - "form.security.item.csrf.angular": "Angular", - "form.security.item.hsts.maxAge": "Max Age", + "form.security.item.hsts": "HOSTS", "form.security.item.hsts.includeSubDomains": "Inclure les sous-domaines", + "form.security.item.hsts.maxAge": "Max Age", "form.security.item.hsts.preload": "Preload", - + "form.security.item.p3p": "P3P", + "form.security.item.p3p.value": "Valeur", "form.security.item.session": "Session", "form.security.item.session.key": "Clé secrète", "form.security.item.session.maxAge": "Durée de vie ", - "form.security.item.xframe": "Xframe", - "form.security.item.xframe.value": "Options", + "form.security.item.xframe.allow-from": "ALLOW-FROM", "form.security.item.xframe.deny": "DENY", "form.security.item.xframe.sameorigin": "SAMEORIGIN", - "form.security.item.xframe.allow-from": "ALLOW-FROM", - + "form.security.item.xframe.value": "Options", "form.security.item.xssProtection": "Protection xss", "form.security.item.xssProtection.mode": "Mode", - - "form.security.item.cors": "Cors", - "form.security.item.cors.origin": "Origine", - - "form.server.name": "Serveur", + "form.security.name": "Sécurité", "form.server.description": "Modification des configurations serveur", - + "form.server.item.cron": "Cron", "form.server.item.host": "Host", "form.server.item.port": "Port", - "form.server.item.cron": "Cron", - - "form.language.name": "Langages", - "form.language.description": "Modification des langages.", - "form.language.choose": "Choisissez un langage", - - "request.error.database.exist": "Cette connexion est déjà utilisée", - "request.error.database.unknow": "Il n'y a pas de connexion de ce genre", - "request.error.type.string": "Un texte est demandé.", - "request.error.type.number": "Un nombre est demandé.", - "request.error.type.boolean": "Un boolean est demandé.", - "request.error.type.select": "La valeur doit être dans la liste prédéfini.", - - "request.error.validation.required": "Ce champ est obligatoire.", - "request.error.validation.regex": "La valeur ne correspond pas au format attendu.", - "request.error.validation.max": "La valeur est trop grande.", - "request.error.validation.min": "La valeur est trop basse.", - "request.error.validation.maxLength": "La valeur est trop longue.", - "request.error.validation.minLength": "La valeur est trop courte.", - - "request.error.config": "Le fichier de configuration n'éxiste pas.", - "request.error.environment.required": "L'environnement est obligatoire.", - "request.error.environment.unknow": "L'environnement est inconnu.", - "request.error.languages.exist": "Ce langage existe déjà.", - "request.error.languages.unknow": "Ce langage n'éxiste pas.", - "request.error.languages.incorrect": "Ce langage est incorrecte.", - - "list.languages.button.label": "Ajouter un nouveau langage", - "list.languages.title.singular": "langage est disponible", - "list.languages.title.plural": "langages sont disponibles", - "list.languages.default.languages": "Langage par défault", - "list.languages.set.languages": "Appliquer par défault", - "list.databases.button.label": "Ajouter une nouvelle connection", - "list.databases.title.singular": "connexion dans cet environnement", - "list.databases.title.plural": "connexions dans cet environnement", - - "popUpWarning.title": "Merci de confirmer", - "popUpWarning.databases.delete.message": "Etes-vous sûre de vouloir supprimer cette connexion ?", - "popUpWarning.danger.message": "Des models sont toujours reliés à cette connexion.....", - "popUpWarning.databases.danger.message": "Les types de contenu sont toujours liés à cette connexion. En le supprimant, vous pourriez causer des problèmes critiques à votre application. Soyez prudent...", - "popUpWarning.danger.ok.message": "Je comprends", - "popUpWarning.databases.danger.ok.message": "J'ai compris", - "popUpWarning.languages.delete.message": "Etes-vous sûre de vouloir supprimer ce language ?", - - "strapi.notification.info.settingsEqual": "Les settings sont similaires", - "strapi.notification.success.databaseDelete": "Suppression de la base de données", - "strapi.notification.success.languageDelete": "Le language a été supprimé", - "strapi.notification.success.languageAdd": "Le nouveau langage a été ajouté", - "strapi.notification.success.databaseAdd": "La nouvelle base de données a été ajoutée", - "strapi.notification.success.databaseEdit": "La base de données a bien été éditée", - "strapi.notification.success.databaseDeleted": "La base de données a bien été supprimée", - "strapi.notification.success.settingsEdit": "Les modifications ont été effectuées", - "strapi.notification.error": "Une erreur est apparue", - "strapi.notification.info.serverRestart": "Le serveur va redémarrer", - + "form.server.name": "Serveur", "language.af": "Afrikaans", "language.af_NA": "Afrikaans (Namibië)", "language.af_ZA": "Afrikaans (Suid-Afrika)", @@ -654,6 +573,60 @@ "language.zh_Hant_TW": "中文(繁體中文,台灣)", "language.zu": "isiZulu", "language.zu_ZA": "isiZulu (iNingizimu Afrika)", - - "pageNotFound": "Page introuvable" -} + "list.databases.button.label": "Ajouter une nouvelle connection", + "list.databases.title.plural": "connexions dans cet environnement", + "list.databases.title.singular": "connexion dans cet environnement", + "list.languages.button.label": "Ajouter un nouveau langage", + "list.languages.default.languages": "Langage par défault", + "list.languages.set.languages": "Appliquer par défault", + "list.languages.title.plural": "langages sont disponibles", + "list.languages.title.singular": "langage est disponible", + "menu.item.advanced": "Avancé", + "menu.item.application": "Application", + "menu.item.database": "Base de donnée", + "menu.item.languages": "Langages", + "menu.item.request": "Requête", + "menu.item.response": "Réponse", + "menu.item.security": "Sécurité", + "menu.item.server": "Serveur", + "menu.section.environments": "Environnements", + "menu.section.global-settings": "Configuration générale", + "pageNotFound": "Page introuvable", + "plugin.description.long": "Configurez votre projet en quelques secondes.", + "plugin.description.short": "Configurez votre projet en quelques secondes.", + "popUpWarning.danger.message": "Des models sont toujours reliés à cette connexion.....", + "popUpWarning.danger.ok.message": "Je comprends", + "popUpWarning.databases.danger.message": "Les types de contenu sont toujours liés à cette connexion. En le supprimant, vous pourriez causer des problèmes critiques à votre application. Soyez prudent...", + "popUpWarning.databases.danger.ok.message": "J'ai compris", + "popUpWarning.databases.delete.message": "Etes-vous sûre de vouloir supprimer cette connexion ?", + "popUpWarning.languages.delete.message": "Etes-vous sûre de vouloir supprimer ce language ?", + "popUpWarning.title": "Merci de confirmer", + "request.error.config": "Le fichier de configuration n'éxiste pas.", + "request.error.database.exist": "Cette connexion est déjà utilisée", + "request.error.database.unknow": "Il n'y a pas de connexion de ce genre", + "request.error.environment.required": "L'environnement est obligatoire.", + "request.error.environment.unknow": "L'environnement est inconnu.", + "request.error.languages.exist": "Ce langage existe déjà.", + "request.error.languages.incorrect": "Ce langage est incorrecte.", + "request.error.languages.unknow": "Ce langage n'éxiste pas.", + "request.error.type.boolean": "Un boolean est demandé.", + "request.error.type.number": "Un nombre est demandé.", + "request.error.type.select": "La valeur doit être dans la liste prédéfini.", + "request.error.type.string": "Un texte est demandé.", + "request.error.validation.max": "La valeur est trop grande.", + "request.error.validation.maxLength": "La valeur est trop longue.", + "request.error.validation.min": "La valeur est trop basse.", + "request.error.validation.minLength": "La valeur est trop courte.", + "request.error.validation.regex": "La valeur ne correspond pas au format attendu.", + "request.error.validation.required": "Ce champ est obligatoire.", + "strapi.notification.error": "Une erreur est apparue", + "strapi.notification.info.serverRestart": "Le serveur va redémarrer", + "strapi.notification.info.settingsEqual": "Les settings sont similaires", + "strapi.notification.success.databaseAdd": "La nouvelle base de données a été ajoutée", + "strapi.notification.success.databaseDelete": "Suppression de la base de données", + "strapi.notification.success.databaseDeleted": "La base de données a bien été supprimée", + "strapi.notification.success.databaseEdit": "La base de données a bien été éditée", + "strapi.notification.success.languageAdd": "Le nouveau langage a été ajouté", + "strapi.notification.success.languageDelete": "Le language a été supprimé", + "strapi.notification.success.settingsEdit": "Les modifications ont été effectuées" +} \ No newline at end of file diff --git a/packages/strapi-plugin-settings-manager/admin/src/translations/it.json b/packages/strapi-plugin-settings-manager/admin/src/translations/it.json index bf1f20eef8..4f83a6e893 100644 --- a/packages/strapi-plugin-settings-manager/admin/src/translations/it.json +++ b/packages/strapi-plugin-settings-manager/admin/src/translations/it.json @@ -1,137 +1,84 @@ { - "components.DownloadDb.download": "Installazione in progresso...", - "components.DownloadDb.text": "Questo potrebbe richiedere un minuto o giù di lì. Grazie per la vostra pazienza.", - "plugin.description.short": "Configurare il vostro progetto in pochi secondi.", - "plugin.description.long": "Configurare il vostro progetto in pochi secondi.", - "menu.section.global-settings": "Impostazioni globali", - "menu.item.application": "Applicazione", - "menu.item.languages": "Lingue", - "menu.item.advanced": "Avanzate", - "menu.section.environments": "Ambiente", - "menu.item.database": "Database", - "menu.item.request": "Richiesta", - "menu.item.response": "Risposta", - "menu.item.security": "Sicurezza", - "menu.item.server": "Server", - "form.button.cancel": "Annulla", - "form.button.save": "Salva", - "form.button.confirm": "Conferma", - "form.databases.name": "Database", - "form.databases.description": "Configurare le impostazioni del database per l'ambiente.", - "form.database.item.name": "Nome Connessione", - "form.database.item.client": "Client", - "form.database.item.connector": "Connettore", - "form.database.item.host": "Host", - "form.database.item.port": "Porta", - "form.database.item.username": "Username", - "form.database.item.password": "Password", - "form.database.item.database": "Database", - "form.database.item.ssl": "SSL", - "form.database.item.authenticationDatabase": "Database Di Autenticazione", - "form.database.item.default": "Imposta come connessione predefinita", - "form.database.item.provider.mongo": "Mongo", - "form.database.item.provider.postgres": "PostgresSQL", - "form.database.item.provider.mysql": "MySQL", - "form.database.item.provider.redis": "Redis", - "form.application.name": "Applicazione", - "form.application.description": "Configurare le impostazioni dell'applicazione.", - "form.application.item.name": "Nome", - "form.application.item.description": "Descrizione", - "form.application.item.version": "Versione", - "form.advanced.name": "Avanzate", - "form.advanced.description": "Configurare le impostazioni avanzate.", - "form.advanced.item.admin": "Admin dashboard url", - "form.advanced.item.prefix": "Prefisso API", - "form.request.name": "Richiesta", - "form.request.description": "Configurare le impostazioni di richiesta.", - "form.request.item.parser": "Parser", - "form.request.item.parser.multipart": "Parser Multipart", - "form.request.item.prefix": "Prefisso", - "form.request.item.prefix.prefix": "Prefisso", - "form.request.item.logger": "Logger", - "form.request.item.logger.level": "Livello", - "form.request.item.logger.exposeInContext": "Esporre in contesto", - "form.request.item.logger.requests": "Le richieste di", - "form.request.item.router": "Router", - "form.request.item.router.prefix": "Prefisso", - "form.response.name": "Risposta", - "form.response.description": "Configurare la tua risposta impostazioni.", - "form.response.item.gzip.enabled": "Gzip", - "form.response.item.responseTime.enabled": "Il Tempo Di Risposta", - "form.security.name": "Sicurezza", - "form.security.description": "Configurare le impostazioni di sicurezza.", - "form.security.item.csrf": "CSRF", - "form.security.item.p3p": "P3P", - "form.security.item.p3p.value": "Valore", - "form.security.item.hsts": "OSPITA", - "form.security.item.csrf.key": "Chiave", - "form.security.item.csrf.secret": "Segreto", - "form.security.item.csrf.cookie": "Cookie", - "form.security.item.csrf.angular": "Angolare", - "form.security.item.hsts.maxAge": "Età Max", - "form.security.item.hsts.includeSubDomains": "Includi domini secondari", - "form.security.item.hsts.preload": "Precarico", - "form.security.item.session": "Sessione", - "form.security.item.session.key": "Chiave segreta", - "form.security.item.session.maxAge": "Età massima", - "form.security.item.xframe": "Xframe", - "form.security.item.xframe.value": "Opzioni", - "form.security.item.xframe.deny": "NEGARE", - "form.security.item.xframe.sameorigin": "SAMEORIGIN", - "form.security.item.xframe.allow-from": "CONSENTIRE-DA", - "form.security.item.xssProtection": "la Protezione xss", - "form.security.item.xssProtection.mode": "Modalità di", - "form.security.item.cors": "Cors", - "form.security.item.cors.origin": "Origine", - "form.server.name": "Server", - "form.server.description": "Configurare le impostazioni del server.", - "form.server.item.host": "Host", - "form.server.item.port": "Porta", - "form.server.item.cron": "Cron", - "form.language.name": "Lingue", - "form.language.description": "Configurare le lingue.", - "form.language.choose": "Scegliere una lingua:", - "request.error.database.exist": "Questo collegamento esiste già", - "request.error.database.unknow": "Se tale connessione", - "request.error.type.string": "Un testo è necessario.", - "request.error.type.number": "È necessario un numero.", - "request.error.type.boolean": "E' richiesto un booleano.", - "request.error.type.select": "Il valore deve essere compreso nell'elenco predefinito.", - "request.error.validation.required": "Questo valore è richiesto l'input.", - "request.error.validation.regex": "Il valore non corrisponde all'espressione regolare.", - "request.error.validation.max": "Il valore è troppo alto.", - "request.error.validation.min": "Il valore è troppo basso.", - "request.error.validation.maxLength": "Il valore è troppo lungo.", - "request.error.validation.minLength": "Il valore è troppo sparato.", - "request.error.config": "File di configurazione non esiste.", - "request.error.environment.required": "È necessario un ambiente.", - "request.error.environment.unknow": "L'ambiente è sconosciuto.", - "request.error.languages.exist": "Questa lingua che già esiste.", - "request.error.languages.unknow": "Questa lingua non esiste.", - "request.error.languages.incorrect": "Questo linguaggio non è corretto.", - "list.languages.button.label": "Aggiungere una nuova lingua", - "list.languages.title.singular": "la lingua è disponibile", - "list.languages.title.plural": "le lingue sono disponibili", - "list.languages.default.languages": "La lingua predefinita", - "list.languages.set.languages": "Imposta come predefinito", - "list.databases.button.label": "Aggiungere una nuova connessione", - "list.databases.title.singular": "collegamento in questo ambiente", - "list.databases.title.plural": "le connessioni in questo ambiente", - "popUpWarning.title": "Si prega di confermare", - "popUpWarning.databases.danger.message": "I Tipi di contenuto sono ancora collegato con la connessione. Rimuovendo, si potrebbe causare problemi critici per la vostra applicazione. Attenzione...", - "popUpWarning.danger.ok.message": "Confermo", - "popUpWarning.databases.delete.message": "Sei sicuro di voler eliminare questo database?", - "popUpWarning.languages.delete.message": "Sei sicuro di voler eliminare questo linguaggio?", - "strapi.notification.info.settingsEqual": "Le impostazioni sono uguale", - "strapi.notification.success.databaseDelete": "Il database è stato eliminato con successo.", - "strapi.notification.success.languageDelete": "Il linguaggio è stato eliminato con successo.", - "strapi.notification.success.languageAdd": "Il linguaggio è stato aggiunto con successo.", - "strapi.notification.success.databaseAdd": "Il database è stato aggiunto con successo.", - "strapi.notification.success.databaseEdit": "Le impostazioni del database sono state aggiornate con successo.", - "strapi.notification.success.databaseDeleted": "Il database è stato eliminato.", - "strapi.notification.success.settingsEdit": "Le impostazioni sono state aggiornate con successo.", - "strapi.notification.error": "Si è verificato un errore", - "strapi.notification.info.serverRestart": "Il server verrà riavviato", + "components.DownloadDb.download": "Installazione in progresso...", + "components.DownloadDb.text": "Questo potrebbe richiedere un minuto o giù di lì. Grazie per la vostra pazienza.", + "form.advanced.description": "Configurare le impostazioni avanzate.", + "form.advanced.item.admin": "Admin dashboard url", + "form.advanced.item.prefix": "Prefisso API", + "form.advanced.name": "Avanzate", + "form.application.description": "Configurare le impostazioni dell'applicazione.", + "form.application.item.description": "Descrizione", + "form.application.item.name": "Nome", + "form.application.item.version": "Versione", + "form.application.name": "Applicazione", + "form.button.cancel": "Annulla", + "form.button.confirm": "Conferma", + "form.button.save": "Salva", + "form.database.item.authenticationDatabase": "Database Di Autenticazione", + "form.database.item.client": "Client", + "form.database.item.connector": "Connettore", + "form.database.item.database": "Database", + "form.database.item.default": "Imposta come connessione predefinita", + "form.database.item.host": "Host", + "form.database.item.name": "Nome Connessione", + "form.database.item.password": "Password", + "form.database.item.port": "Porta", + "form.database.item.provider.mongo": "Mongo", + "form.database.item.provider.mysql": "MySQL", + "form.database.item.provider.postgres": "PostgresSQL", + "form.database.item.provider.redis": "Redis", + "form.database.item.ssl": "SSL", + "form.database.item.username": "Username", + "form.databases.description": "Configurare le impostazioni del database per l'ambiente.", + "form.databases.name": "Database", + "form.language.choose": "Scegliere una lingua:", + "form.language.description": "Configurare le lingue.", + "form.language.name": "Lingue", + "form.request.description": "Configurare le impostazioni di richiesta.", + "form.request.item.logger": "Logger", + "form.request.item.logger.exposeInContext": "Esporre in contesto", + "form.request.item.logger.level": "Livello", + "form.request.item.logger.requests": "Le richieste di", + "form.request.item.parser": "Parser", + "form.request.item.parser.multipart": "Parser Multipart", + "form.request.item.prefix": "Prefisso", + "form.request.item.prefix.prefix": "Prefisso", + "form.request.item.router": "Router", + "form.request.item.router.prefix": "Prefisso", + "form.request.name": "Richiesta", + "form.response.description": "Configurare la tua risposta impostazioni.", + "form.response.item.gzip.enabled": "Gzip", + "form.response.item.responseTime.enabled": "Il Tempo Di Risposta", + "form.response.name": "Risposta", + "form.security.description": "Configurare le impostazioni di sicurezza.", + "form.security.item.cors": "Cors", + "form.security.item.cors.origin": "Origine", + "form.security.item.csrf": "CSRF", + "form.security.item.csrf.angular": "Angolare", + "form.security.item.csrf.cookie": "Cookie", + "form.security.item.csrf.key": "Chiave", + "form.security.item.csrf.secret": "Segreto", + "form.security.item.hsts": "OSPITA", + "form.security.item.hsts.includeSubDomains": "Includi domini secondari", + "form.security.item.hsts.maxAge": "Età Max", + "form.security.item.hsts.preload": "Precarico", + "form.security.item.p3p": "P3P", + "form.security.item.p3p.value": "Valore", + "form.security.item.session": "Sessione", + "form.security.item.session.key": "Chiave segreta", + "form.security.item.session.maxAge": "Età massima", + "form.security.item.xframe": "Xframe", + "form.security.item.xframe.allow-from": "CONSENTIRE-DA", + "form.security.item.xframe.deny": "NEGARE", + "form.security.item.xframe.sameorigin": "SAMEORIGIN", + "form.security.item.xframe.value": "Opzioni", + "form.security.item.xssProtection": "la Protezione xss", + "form.security.item.xssProtection.mode": "Modalità di", + "form.security.name": "Sicurezza", + "form.server.description": "Configurare le impostazioni del server.", + "form.server.item.cron": "Cron", + "form.server.item.host": "Host", + "form.server.item.port": "Porta", + "form.server.name": "Server", "language.af": "Afrikaans", "language.af_NA": "Afrikaans (Namibië)", "language.af_ZA": "Afrikaans (Suid-Afrika)", @@ -626,5 +573,58 @@ "language.zh_Hant_TW": "中文(繁體中文,台灣)", "language.zu": "isiZulu", "language.zu_ZA": "isiZulu (iNingizimu Afrika)", - "pageNotFound": "Pagina non trovata" + "list.databases.button.label": "Aggiungere una nuova connessione", + "list.databases.title.plural": "le connessioni in questo ambiente", + "list.databases.title.singular": "collegamento in questo ambiente", + "list.languages.button.label": "Aggiungere una nuova lingua", + "list.languages.default.languages": "La lingua predefinita", + "list.languages.set.languages": "Imposta come predefinito", + "list.languages.title.plural": "le lingue sono disponibili", + "list.languages.title.singular": "la lingua è disponibile", + "menu.item.advanced": "Avanzate", + "menu.item.application": "Applicazione", + "menu.item.database": "Database", + "menu.item.languages": "Lingue", + "menu.item.request": "Richiesta", + "menu.item.response": "Risposta", + "menu.item.security": "Sicurezza", + "menu.item.server": "Server", + "menu.section.environments": "Ambiente", + "menu.section.global-settings": "Impostazioni globali", + "pageNotFound": "Pagina non trovata", + "plugin.description.long": "Configurare il vostro progetto in pochi secondi.", + "plugin.description.short": "Configurare il vostro progetto in pochi secondi.", + "popUpWarning.danger.ok.message": "Confermo", + "popUpWarning.databases.danger.message": "I Tipi di contenuto sono ancora collegato con la connessione. Rimuovendo, si potrebbe causare problemi critici per la vostra applicazione. Attenzione...", + "popUpWarning.databases.delete.message": "Sei sicuro di voler eliminare questo database?", + "popUpWarning.languages.delete.message": "Sei sicuro di voler eliminare questo linguaggio?", + "popUpWarning.title": "Si prega di confermare", + "request.error.config": "File di configurazione non esiste.", + "request.error.database.exist": "Questo collegamento esiste già", + "request.error.database.unknow": "Se tale connessione", + "request.error.environment.required": "È necessario un ambiente.", + "request.error.environment.unknow": "L'ambiente è sconosciuto.", + "request.error.languages.exist": "Questa lingua che già esiste.", + "request.error.languages.incorrect": "Questo linguaggio non è corretto.", + "request.error.languages.unknow": "Questa lingua non esiste.", + "request.error.type.boolean": "E' richiesto un booleano.", + "request.error.type.number": "È necessario un numero.", + "request.error.type.select": "Il valore deve essere compreso nell'elenco predefinito.", + "request.error.type.string": "Un testo è necessario.", + "request.error.validation.max": "Il valore è troppo alto.", + "request.error.validation.maxLength": "Il valore è troppo lungo.", + "request.error.validation.min": "Il valore è troppo basso.", + "request.error.validation.minLength": "Il valore è troppo sparato.", + "request.error.validation.regex": "Il valore non corrisponde all'espressione regolare.", + "request.error.validation.required": "Questo valore è richiesto l'input.", + "strapi.notification.error": "Si è verificato un errore", + "strapi.notification.info.serverRestart": "Il server verrà riavviato", + "strapi.notification.info.settingsEqual": "Le impostazioni sono uguale", + "strapi.notification.success.databaseAdd": "Il database è stato aggiunto con successo.", + "strapi.notification.success.databaseDelete": "Il database è stato eliminato con successo.", + "strapi.notification.success.databaseDeleted": "Il database è stato eliminato.", + "strapi.notification.success.databaseEdit": "Le impostazioni del database sono state aggiornate con successo.", + "strapi.notification.success.languageAdd": "Il linguaggio è stato aggiunto con successo.", + "strapi.notification.success.languageDelete": "Il linguaggio è stato eliminato con successo.", + "strapi.notification.success.settingsEdit": "Le impostazioni sono state aggiornate con successo." } \ No newline at end of file diff --git a/packages/strapi-plugin-settings-manager/admin/src/translations/ko.json b/packages/strapi-plugin-settings-manager/admin/src/translations/ko.json index 00fc61dc05..8a63d2473c 100644 --- a/packages/strapi-plugin-settings-manager/admin/src/translations/ko.json +++ b/packages/strapi-plugin-settings-manager/admin/src/translations/ko.json @@ -1,162 +1,84 @@ { "components.DownloadDb.download": "설치 중입니다...", "components.DownloadDb.text": "이 작업은 시간이 조금 걸립니다. 잠시만 기다려 주세요.", - "plugin.description.short": "프로젝트 환경을 설정하고 관리합니다.", - "plugin.description.long": "프로젝트 환경을 설정하고 관리합니다.", - "menu.section.global-settings": "전역 설정", - "menu.item.application": "애플리케이션", - "menu.item.languages": "언어", - "menu.item.advanced": "고급", - - "menu.section.environments": "환경", - "menu.item.database": "데이터베이스", - "menu.item.request": "요청(Request)", - "menu.item.response": "응답(Response)", - "menu.item.security": "보안", - "menu.item.server": "서버", - - "form.button.cancel": "취소", - "form.button.save": "저장", - "form.button.confirm": "확인", - - "form.databases.name": "데이터베이스", - "form.databases.description": "데이터베이스 환경을 설정하세요.", - - "form.database.item.name": "커넥션 이름(Connection Name)", - "form.database.item.client": "클라이언트", - "form.database.item.connector": "커넥터(Connector)", - "form.database.item.host": "호스트(Host)", - "form.database.item.port": "포트(Port)", - "form.database.item.username": "사용자이름(Username)", - "form.database.item.password": "패스워드(Password)", - "form.database.item.database": "데이터베이스(Database)", - "form.database.item.ssl": "SSL", - "form.database.item.authenticationDatabase": "인증 DB(Authentication Database)", - "form.database.item.default": "기본 연결로 설정", - "form.database.item.provider.mongo": "Mongo", - "form.database.item.provider.postgres": "PostgresSQL", - "form.database.item.provider.mysql": "MySQL", - "form.database.item.provider.redis": "Redis", - - "form.application.name": "애플리케이션", - "form.application.description": "애플리케이션 환경을 설정하세요.", - - "form.application.item.name": "이름", - "form.application.item.description": "설명", - "form.application.item.version": "버전", - - "form.advanced.name": "고급", "form.advanced.description": "고급 환경을 설정하세요.", - "form.advanced.item.admin": "관리자 대시보드 URL", "form.advanced.item.prefix": "API 프리픽스(Prefix)", - - "form.request.name": "요청 (Request)", + "form.advanced.name": "고급", + "form.application.description": "애플리케이션 환경을 설정하세요.", + "form.application.item.description": "설명", + "form.application.item.name": "이름", + "form.application.item.version": "버전", + "form.application.name": "애플리케이션", + "form.button.cancel": "취소", + "form.button.confirm": "확인", + "form.button.save": "저장", + "form.database.item.authenticationDatabase": "인증 DB(Authentication Database)", + "form.database.item.client": "클라이언트", + "form.database.item.connector": "커넥터(Connector)", + "form.database.item.database": "데이터베이스(Database)", + "form.database.item.default": "기본 연결로 설정", + "form.database.item.host": "호스트(Host)", + "form.database.item.name": "커넥션 이름(Connection Name)", + "form.database.item.password": "패스워드(Password)", + "form.database.item.port": "포트(Port)", + "form.database.item.provider.mongo": "Mongo", + "form.database.item.provider.mysql": "MySQL", + "form.database.item.provider.postgres": "PostgresSQL", + "form.database.item.provider.redis": "Redis", + "form.database.item.ssl": "SSL", + "form.database.item.username": "사용자이름(Username)", + "form.databases.description": "데이터베이스 환경을 설정하세요.", + "form.databases.name": "데이터베이스", + "form.language.choose": "언어 선택:", + "form.language.description": "지원 언어를 설정하세요.", + "form.language.name": "언어", "form.request.description": "요청(request) 환경을 설정하세요.", + "form.request.item.logger": "로거 (Logger)", + "form.request.item.logger.exposeInContext": "컨텍스트 노출 (Expose in context)", + "form.request.item.logger.level": "수준 (Level)", + "form.request.item.logger.requests": "요청 (Requests)", "form.request.item.parser": "파서 (Parser)", "form.request.item.parser.multipart": "파서 멀티파트 (Parser Multipart)", "form.request.item.prefix": "프리픽스 (Prefix)", "form.request.item.prefix.prefix": "프리픽스 (Prefix)", - "form.request.item.logger": "로거 (Logger)", - "form.request.item.logger.level": "수준 (Level)", - "form.request.item.logger.exposeInContext": "컨텍스트 노출 (Expose in context)", - "form.request.item.logger.requests": "요청 (Requests)", "form.request.item.router": "라우터 (Router)", "form.request.item.router.prefix": "프리픽스 (Prefix)", - - "form.response.name": "응답 (Response)", + "form.request.name": "요청 (Request)", "form.response.description": "응답(response) 환경을 설정하세요.", "form.response.item.gzip.enabled": "Gzip", "form.response.item.responseTime.enabled": "응답 시간 (Response Time)", - - "form.security.name": "보안", + "form.response.name": "응답 (Response)", "form.security.description": "보안 환경을 설정하세요.", - + "form.security.item.cors": "Cors", + "form.security.item.cors.origin": "Origin", "form.security.item.csrf": "CSRF", - "form.security.item.p3p": "P3P", - "form.security.item.p3p.value": "값", - "form.security.item.hsts": "호스트 (HOSTS)", + "form.security.item.csrf.angular": "앵귤러 (Angular)", + "form.security.item.csrf.cookie": "쿠키 (Cookie)", "form.security.item.csrf.key": "키 (Key)", "form.security.item.csrf.secret": "시크릿 (Secret)", - "form.security.item.csrf.cookie": "쿠키 (Cookie)", - "form.security.item.csrf.angular": "앵귤러 (Angular)", - "form.security.item.hsts.maxAge": "만료 (Max Age)", + "form.security.item.hsts": "호스트 (HOSTS)", "form.security.item.hsts.includeSubDomains": "서브 도메인 포함", + "form.security.item.hsts.maxAge": "만료 (Max Age)", "form.security.item.hsts.preload": "프리로드 (Preload)", - + "form.security.item.p3p": "P3P", + "form.security.item.p3p.value": "값", "form.security.item.session": "세션 (Session)", "form.security.item.session.key": "보안 키 (Secret key)", "form.security.item.session.maxAge": "Maximum age", - "form.security.item.xframe": "Xframe", - "form.security.item.xframe.value": "옵션", + "form.security.item.xframe.allow-from": "ALLOW-FROM", "form.security.item.xframe.deny": "DENY", "form.security.item.xframe.sameorigin": "SAMEORIGIN", - "form.security.item.xframe.allow-from": "ALLOW-FROM", - + "form.security.item.xframe.value": "옵션", "form.security.item.xssProtection": "xss 보호", "form.security.item.xssProtection.mode": "모드", - - "form.security.item.cors": "Cors", - "form.security.item.cors.origin": "Origin", - - "form.server.name": "서버", + "form.security.name": "보안", "form.server.description": "서버 환경을 설정 하세요.", - + "form.server.item.cron": "크론 (Cron)", "form.server.item.host": "호스트 (Host)", "form.server.item.port": "포트 (Port)", - "form.server.item.cron": "크론 (Cron)", - - "form.language.name": "언어", - "form.language.description": "지원 언어를 설정하세요.", - "form.language.choose": "언어 선택:", - - "request.error.database.exist": "이미 사용중인 연결입니다.", - "request.error.database.unknow": "알 수 없는 연결입니다.", - "request.error.type.string": "텍스트를 입력해 주세요.", - "request.error.type.number": "숫자를 입력해 주세요.", - "request.error.type.boolean": "불리언값을 입력해 주세요.", - "request.error.type.select": "리스트에서 선택해 주세요.", - - "request.error.validation.required": "내용을 입력해 주세요.", - "request.error.validation.regex": "입력한 내용이 형식에 맞지 않습니다.", - "request.error.validation.max": "입력한 내용이 너무 큽니다.", - "request.error.validation.min": "입력한 내용이 너무 작습니다.", - "request.error.validation.maxLength": "입력한 내용이 너무 깁니다.", - "request.error.validation.minLength": "입력한 내용이 너무 짧습니다.", - - "request.error.config": "설정파일이 없습니다.", - "request.error.environment.required": "환경이 필요합니다.", - "request.error.environment.unknow": "알 수 없는 환경입니다.", - "request.error.languages.exist": "이미 사용중인 언어입니다.", - "request.error.languages.unknow": "알 수 없는 언어입니다.", - "request.error.languages.incorrect": "정확하지 않은 언어입니다.", - - "list.languages.button.label": "새 언어 추가", - "list.languages.title.singular": "개의 언어를 사용할 수 있습니다.", - "list.languages.title.plural": "개의 언어를 사용할 수 있습니다.", - "list.languages.default.languages": "기본", - "list.languages.set.languages": "기본으로 설정", - "list.databases.button.label": "새 연결 추가", - "list.databases.title.singular": "개의 연결이 있습니다.", - "list.databases.title.plural": "개의 연결이 있습니다.", - - "popUpWarning.title": "경고", - "popUpWarning.databases.danger.message": "이 연결에 콘텐츠 타입이 있습니다. 제거할 경우 문제가 발생할 수 있습니다.", - "popUpWarning.danger.ok.message": "확인", - "popUpWarning.databases.delete.message": "데이터베이스를 삭제하시겠습니까?", - "popUpWarning.languages.delete.message": "언어를 제거 하시겠습니까?", - "strapi.notification.info.settingsEqual": "설정이 같습니다.", - "strapi.notification.success.databaseDelete": "데이터베이스를 삭제했습니다.", - "strapi.notification.success.languageDelete": "언어를 제거했습니다.", - "strapi.notification.success.languageAdd": "언어를 추가했습니다.", - "strapi.notification.success.databaseAdd": "데이터베이스를 추가했습니다.", - "strapi.notification.success.databaseEdit": "데이터베이스 설정을 업데이트했습니다.", - "strapi.notification.success.databaseDeleted": "데이터베이스를 삭제했습니다.", - "strapi.notification.success.settingsEdit": "설정을 업데이트했습니다.", - "strapi.notification.error": "에러가 발생했습니다.", - "strapi.notification.info.serverRestart": "서버를 재시작 합니다.", - + "form.server.name": "서버", "language.af": "Afrikaans", "language.af_NA": "Afrikaans (Namibië)", "language.af_ZA": "Afrikaans (Suid-Afrika)", @@ -651,6 +573,58 @@ "language.zh_Hant_TW": "中文(繁體中文,台灣)", "language.zu": "isiZulu", "language.zu_ZA": "isiZulu (iNingizimu Afrika)", - - "pageNotFound": "페이지를 찾을 수 없습니다." -} + "list.databases.button.label": "새 연결 추가", + "list.databases.title.plural": "개의 연결이 있습니다.", + "list.databases.title.singular": "개의 연결이 있습니다.", + "list.languages.button.label": "새 언어 추가", + "list.languages.default.languages": "기본", + "list.languages.set.languages": "기본으로 설정", + "list.languages.title.plural": "개의 언어를 사용할 수 있습니다.", + "list.languages.title.singular": "개의 언어를 사용할 수 있습니다.", + "menu.item.advanced": "고급", + "menu.item.application": "애플리케이션", + "menu.item.database": "데이터베이스", + "menu.item.languages": "언어", + "menu.item.request": "요청(Request)", + "menu.item.response": "응답(Response)", + "menu.item.security": "보안", + "menu.item.server": "서버", + "menu.section.environments": "환경", + "menu.section.global-settings": "전역 설정", + "pageNotFound": "페이지를 찾을 수 없습니다.", + "plugin.description.long": "프로젝트 환경을 설정하고 관리합니다.", + "plugin.description.short": "프로젝트 환경을 설정하고 관리합니다.", + "popUpWarning.danger.ok.message": "확인", + "popUpWarning.databases.danger.message": "이 연결에 콘텐츠 타입이 있습니다. 제거할 경우 문제가 발생할 수 있습니다.", + "popUpWarning.databases.delete.message": "데이터베이스를 삭제하시겠습니까?", + "popUpWarning.languages.delete.message": "언어를 제거 하시겠습니까?", + "popUpWarning.title": "경고", + "request.error.config": "설정파일이 없습니다.", + "request.error.database.exist": "이미 사용중인 연결입니다.", + "request.error.database.unknow": "알 수 없는 연결입니다.", + "request.error.environment.required": "환경이 필요합니다.", + "request.error.environment.unknow": "알 수 없는 환경입니다.", + "request.error.languages.exist": "이미 사용중인 언어입니다.", + "request.error.languages.incorrect": "정확하지 않은 언어입니다.", + "request.error.languages.unknow": "알 수 없는 언어입니다.", + "request.error.type.boolean": "불리언값을 입력해 주세요.", + "request.error.type.number": "숫자를 입력해 주세요.", + "request.error.type.select": "리스트에서 선택해 주세요.", + "request.error.type.string": "텍스트를 입력해 주세요.", + "request.error.validation.max": "입력한 내용이 너무 큽니다.", + "request.error.validation.maxLength": "입력한 내용이 너무 깁니다.", + "request.error.validation.min": "입력한 내용이 너무 작습니다.", + "request.error.validation.minLength": "입력한 내용이 너무 짧습니다.", + "request.error.validation.regex": "입력한 내용이 형식에 맞지 않습니다.", + "request.error.validation.required": "내용을 입력해 주세요.", + "strapi.notification.error": "에러가 발생했습니다.", + "strapi.notification.info.serverRestart": "서버를 재시작 합니다.", + "strapi.notification.info.settingsEqual": "설정이 같습니다.", + "strapi.notification.success.databaseAdd": "데이터베이스를 추가했습니다.", + "strapi.notification.success.databaseDelete": "데이터베이스를 삭제했습니다.", + "strapi.notification.success.databaseDeleted": "데이터베이스를 삭제했습니다.", + "strapi.notification.success.databaseEdit": "데이터베이스 설정을 업데이트했습니다.", + "strapi.notification.success.languageAdd": "언어를 추가했습니다.", + "strapi.notification.success.languageDelete": "언어를 제거했습니다.", + "strapi.notification.success.settingsEdit": "설정을 업데이트했습니다." +} \ No newline at end of file diff --git a/packages/strapi-plugin-settings-manager/admin/src/translations/nl.json b/packages/strapi-plugin-settings-manager/admin/src/translations/nl.json index c07100a025..593f4ec87b 100644 --- a/packages/strapi-plugin-settings-manager/admin/src/translations/nl.json +++ b/packages/strapi-plugin-settings-manager/admin/src/translations/nl.json @@ -1,162 +1,84 @@ { "components.DownloadDb.download": "Installatie is bezig...", "components.DownloadDb.text": "Dit kan even duren. Bedankt voor je geduld.", - "plugin.description.short": "Configureer je project binnen enkele seconden.", - "plugin.description.long": "Configureer je project binnen enkele seconden.", - "menu.section.global-settings": "Globale instellingen", - "menu.item.application": "Applicatie", - "menu.item.languages": "Talen", - "menu.item.advanced": "Geavanceerd", - - "menu.section.environments": "Omgevingen", - "menu.item.database": "Database", - "menu.item.request": "Request", - "menu.item.response": "Response", - "menu.item.security": "Beveiliging", - "menu.item.server": "Server", - - "form.button.cancel": "Annuleren", - "form.button.save": "Opslaan", - "form.button.confirm": "Akkoord", - - "form.databases.name": "Database", - "form.databases.description": "Configureer je databse instellingen via omgeving", - - "form.database.item.name": "Connectie Naam", - "form.database.item.client": "Client", - "form.database.item.connector": "Connector", - "form.database.item.host": "Host", - "form.database.item.port": "Poort", - "form.database.item.username": "Gebruikersnaam", - "form.database.item.password": "Wachtwoord", - "form.database.item.database": "Database", - "form.database.item.ssl": "SSL", - "form.database.item.authenticationDatabase": "Authenticatie Database", - "form.database.item.default": "Zet een standaard connectie", - "form.database.item.provider.mongo": "Mongo", - "form.database.item.provider.postgres": "PostgresSQL", - "form.database.item.provider.mysql": "MySQL", - "form.database.item.provider.redis": "Redis", - - "form.application.name": "Applicatie", - "form.application.description": "Configureer jouw applicatie instellingen", - - "form.application.item.name": "Naam", - "form.application.item.description": "Beschrijving", - "form.application.item.version": "Versie", - - "form.advanced.name": "Geavanceerd", "form.advanced.description": "Configureer je geavanceerde instellingen", - "form.advanced.item.admin": "Admin dashboard url", "form.advanced.item.prefix": "Prefix API", - - "form.request.name": "Request", + "form.advanced.name": "Geavanceerd", + "form.application.description": "Configureer jouw applicatie instellingen", + "form.application.item.description": "Beschrijving", + "form.application.item.name": "Naam", + "form.application.item.version": "Versie", + "form.application.name": "Applicatie", + "form.button.cancel": "Annuleren", + "form.button.confirm": "Akkoord", + "form.button.save": "Opslaan", + "form.database.item.authenticationDatabase": "Authenticatie Database", + "form.database.item.client": "Client", + "form.database.item.connector": "Connector", + "form.database.item.database": "Database", + "form.database.item.default": "Zet een standaard connectie", + "form.database.item.host": "Host", + "form.database.item.name": "Connectie Naam", + "form.database.item.password": "Wachtwoord", + "form.database.item.port": "Poort", + "form.database.item.provider.mongo": "Mongo", + "form.database.item.provider.mysql": "MySQL", + "form.database.item.provider.postgres": "PostgresSQL", + "form.database.item.provider.redis": "Redis", + "form.database.item.ssl": "SSL", + "form.database.item.username": "Gebruikersnaam", + "form.databases.description": "Configureer je databse instellingen via omgeving", + "form.databases.name": "Database", + "form.language.choose": "Kies een taal:", + "form.language.description": "Configureer je talen.", + "form.language.name": "Talen", "form.request.description": "Configureer je request instellingen.", + "form.request.item.logger": "Logger", + "form.request.item.logger.exposeInContext": "Expose in context", + "form.request.item.logger.level": "Level", + "form.request.item.logger.requests": "Requests", "form.request.item.parser": "Parser", "form.request.item.parser.multipart": "Parser Multipart", "form.request.item.prefix": "Prefix", "form.request.item.prefix.prefix": "Prefix", - "form.request.item.logger": "Logger", - "form.request.item.logger.level": "Level", - "form.request.item.logger.exposeInContext": "Expose in context", - "form.request.item.logger.requests": "Requests", "form.request.item.router": "Router", "form.request.item.router.prefix": "Prefix", - - "form.response.name": "Response", + "form.request.name": "Request", "form.response.description": "Configureer je response instellingen.", "form.response.item.gzip.enabled": "Gzip", "form.response.item.responseTime.enabled": "Response Tijd", - - "form.security.name": "Beveiliging", + "form.response.name": "Response", "form.security.description": "Configureer je beveiliging instellingen.", - + "form.security.item.cors": "Cors", + "form.security.item.cors.origin": "Origin", "form.security.item.csrf": "CSRF", - "form.security.item.p3p": "P3P", - "form.security.item.p3p.value": "Waarde", - "form.security.item.hsts": "HOSTS", + "form.security.item.csrf.angular": "Angular", + "form.security.item.csrf.cookie": "Cookie", "form.security.item.csrf.key": "Key", "form.security.item.csrf.secret": "Secret", - "form.security.item.csrf.cookie": "Cookie", - "form.security.item.csrf.angular": "Angular", - "form.security.item.hsts.maxAge": "Max Leeftijd", + "form.security.item.hsts": "HOSTS", "form.security.item.hsts.includeSubDomains": "Inclusief Sub Domain", + "form.security.item.hsts.maxAge": "Max Leeftijd", "form.security.item.hsts.preload": "Preload", - + "form.security.item.p3p": "P3P", + "form.security.item.p3p.value": "Waarde", "form.security.item.session": "Sessie", "form.security.item.session.key": "Secret key", "form.security.item.session.maxAge": "Maximum leeftijd", - "form.security.item.xframe": "Xframe", - "form.security.item.xframe.value": "Options", + "form.security.item.xframe.allow-from": "ALLOW-FROM", "form.security.item.xframe.deny": "DENY", "form.security.item.xframe.sameorigin": "SAMEORIGIN", - "form.security.item.xframe.allow-from": "ALLOW-FROM", - + "form.security.item.xframe.value": "Options", "form.security.item.xssProtection": "xss Protection", "form.security.item.xssProtection.mode": "Mode", - - "form.security.item.cors": "Cors", - "form.security.item.cors.origin": "Origin", - - "form.server.name": "Server", + "form.security.name": "Beveiliging", "form.server.description": "Configureer je server instellingen.", - + "form.server.item.cron": "Cron", "form.server.item.host": "Host", "form.server.item.port": "Poort", - "form.server.item.cron": "Cron", - - "form.language.name": "Talen", - "form.language.description": "Configureer je talen.", - "form.language.choose": "Kies een taal:", - - "request.error.database.exist": "Deze verbinding bestaat al", - "request.error.database.unknow": "Geen verbinding gevonden", - "request.error.type.string": "Een tekst is verplicht.", - "request.error.type.number": "Een getal is verplicht.", - "request.error.type.boolean": "Een boolean is verplicht.", - "request.error.type.select": "De waarde moet in de vooraangegeven lijst zitten.", - - "request.error.validation.required": "Deze waarde is verplicht.", - "request.error.validation.regex": "De waarde voldoet niet aan de regex.", - "request.error.validation.max": "De waarde is te hoog.", - "request.error.validation.min": "De waarde is te laag.", - "request.error.validation.maxLength": "De waarde is te lang.", - "request.error.validation.minLength": "De waarde is te kort.", - - "request.error.config": "Configuratie bestand bestaat niet.", - "request.error.environment.required": "Omgeving is verplicht.", - "request.error.environment.unknow": "Omgeving is onbekend.", - "request.error.languages.exist": "Deze taal bestaat al.", - "request.error.languages.unknow": "Deze taal bestaat niet.", - "request.error.languages.incorrect": "Deze taal is incorrect.", - - "list.languages.button.label": "Nieuwe taal toevoegen", - "list.languages.title.singular": "taal is beschikbaar", - "list.languages.title.plural": "talen zijn beschikbaar", - "list.languages.default.languages": "Standaard taal", - "list.languages.set.languages": "Zet als standaard", - "list.databases.button.label": "Nieuwe verbinding", - "list.databases.title.singular": "verbinding in deze omgeving", - "list.databases.title.plural": "verbindingen in deze omgeving", - - "popUpWarning.title": "Ga a.u.b. akkoord", - "popUpWarning.databases.danger.message": "Content Types zijn nog gelinked met deze omgeving. Door deze te verwijderen kunnen er fouten ontstaan. Pas op...", - "popUpWarning.danger.ok.message": "Ik begrijp het", - "popUpWarning.databases.delete.message": "Weet je zeker dat je deze database wilt verwijderen?", - "popUpWarning.languages.delete.message": "Weet je zeker dat je deze taal wilt verwijderen?", - "strapi.notification.info.settingsEqual": "Instellingen zijn gelijk", - "strapi.notification.success.databaseDelete": "De database is succesvol verwijderd.", - "strapi.notification.success.languageDelete": "De taal is succesvol verwijderd.", - "strapi.notification.success.languageAdd": "De taal is succesvol toegevoegd.", - "strapi.notification.success.databaseAdd": "De database is succesvol toegevoegd.", - "strapi.notification.success.databaseEdit": "De database instellingen zijn succesvol aangepast.", - "strapi.notification.success.databaseDeleted": "De database is verwijderd.", - "strapi.notification.success.settingsEdit": "De instellingen zijn succesvol geüpdatet", - "strapi.notification.error": "Er is een fout opgetreden", - "strapi.notification.info.serverRestart": "De server zal opnieuw opstarten", - + "form.server.name": "Server", "language.af": "Afrikaans", "language.af_NA": "Afrikaans (Namibië)", "language.af_ZA": "Afrikaans (Suid-Afrika)", @@ -651,6 +573,58 @@ "language.zh_Hant_TW": "中文(繁體中文,台灣)", "language.zu": "isiZulu", "language.zu_ZA": "isiZulu (iNingizimu Afrika)", - - "pageNotFound": "Pagina niet gevonden" -} + "list.databases.button.label": "Nieuwe verbinding", + "list.databases.title.plural": "verbindingen in deze omgeving", + "list.databases.title.singular": "verbinding in deze omgeving", + "list.languages.button.label": "Nieuwe taal toevoegen", + "list.languages.default.languages": "Standaard taal", + "list.languages.set.languages": "Zet als standaard", + "list.languages.title.plural": "talen zijn beschikbaar", + "list.languages.title.singular": "taal is beschikbaar", + "menu.item.advanced": "Geavanceerd", + "menu.item.application": "Applicatie", + "menu.item.database": "Database", + "menu.item.languages": "Talen", + "menu.item.request": "Request", + "menu.item.response": "Response", + "menu.item.security": "Beveiliging", + "menu.item.server": "Server", + "menu.section.environments": "Omgevingen", + "menu.section.global-settings": "Globale instellingen", + "pageNotFound": "Pagina niet gevonden", + "plugin.description.long": "Configureer je project binnen enkele seconden.", + "plugin.description.short": "Configureer je project binnen enkele seconden.", + "popUpWarning.danger.ok.message": "Ik begrijp het", + "popUpWarning.databases.danger.message": "Content Types zijn nog gelinked met deze omgeving. Door deze te verwijderen kunnen er fouten ontstaan. Pas op...", + "popUpWarning.databases.delete.message": "Weet je zeker dat je deze database wilt verwijderen?", + "popUpWarning.languages.delete.message": "Weet je zeker dat je deze taal wilt verwijderen?", + "popUpWarning.title": "Ga a.u.b. akkoord", + "request.error.config": "Configuratie bestand bestaat niet.", + "request.error.database.exist": "Deze verbinding bestaat al", + "request.error.database.unknow": "Geen verbinding gevonden", + "request.error.environment.required": "Omgeving is verplicht.", + "request.error.environment.unknow": "Omgeving is onbekend.", + "request.error.languages.exist": "Deze taal bestaat al.", + "request.error.languages.incorrect": "Deze taal is incorrect.", + "request.error.languages.unknow": "Deze taal bestaat niet.", + "request.error.type.boolean": "Een boolean is verplicht.", + "request.error.type.number": "Een getal is verplicht.", + "request.error.type.select": "De waarde moet in de vooraangegeven lijst zitten.", + "request.error.type.string": "Een tekst is verplicht.", + "request.error.validation.max": "De waarde is te hoog.", + "request.error.validation.maxLength": "De waarde is te lang.", + "request.error.validation.min": "De waarde is te laag.", + "request.error.validation.minLength": "De waarde is te kort.", + "request.error.validation.regex": "De waarde voldoet niet aan de regex.", + "request.error.validation.required": "Deze waarde is verplicht.", + "strapi.notification.error": "Er is een fout opgetreden", + "strapi.notification.info.serverRestart": "De server zal opnieuw opstarten", + "strapi.notification.info.settingsEqual": "Instellingen zijn gelijk", + "strapi.notification.success.databaseAdd": "De database is succesvol toegevoegd.", + "strapi.notification.success.databaseDelete": "De database is succesvol verwijderd.", + "strapi.notification.success.databaseDeleted": "De database is verwijderd.", + "strapi.notification.success.databaseEdit": "De database instellingen zijn succesvol aangepast.", + "strapi.notification.success.languageAdd": "De taal is succesvol toegevoegd.", + "strapi.notification.success.languageDelete": "De taal is succesvol verwijderd.", + "strapi.notification.success.settingsEdit": "De instellingen zijn succesvol geüpdatet" +} \ No newline at end of file diff --git a/packages/strapi-plugin-settings-manager/admin/src/translations/pl.json b/packages/strapi-plugin-settings-manager/admin/src/translations/pl.json index 64c8f1e7b0..6854fd667a 100644 --- a/packages/strapi-plugin-settings-manager/admin/src/translations/pl.json +++ b/packages/strapi-plugin-settings-manager/admin/src/translations/pl.json @@ -1,162 +1,84 @@ { "components.DownloadDb.download": "Instalacja w toku...", "components.DownloadDb.text": "To może chwilę potrwać. Dziękujemy za cierpliwość.", - "plugin.description.short": "Skonfiguruj swój projekt w kilka sekund", - "plugin.description.long": "Skonfiguruj swój projekt w kilka sekund", - "menu.section.global-settings": "Globalne", - "menu.item.application": "Aplikacja", - "menu.item.languages": "Języki", - "menu.item.advanced": "Zaawansowane", - - "menu.section.environments": "Środowiska", - "menu.item.database": "Bazy danych", - "menu.item.request": "Żądania", - "menu.item.response": "Odpowiedzi", - "menu.item.security": "Bezpieczeństwo", - "menu.item.server": "Serwer", - - "form.button.cancel": "Anuluj", - "form.button.save": "Zapisz", - "form.button.confirm": "Potwierdź", - - "form.databases.name": "Bazy danych", - "form.databases.description": "Konfiguruj ustawienia baz danych według środowiska.", - - "form.database.item.name": "Nazwa", - "form.database.item.client": "Klient", - "form.database.item.connector": "Łącznik", - "form.database.item.host": "Host", - "form.database.item.port": "Port", - "form.database.item.username": "Nazwa użytkownika", - "form.database.item.password": "Hasło", - "form.database.item.database": "Baza danych", - "form.database.item.ssl": "SSL", - "form.database.item.authenticationDatabase": "Authentication Database", - "form.database.item.default": "Ustaw jako domyślne połączenie", - "form.database.item.provider.mongo": "Mongo", - "form.database.item.provider.postgres": "PostgresSQL", - "form.database.item.provider.mysql": "MySQL", - "form.database.item.provider.redis": "Redis", - - "form.application.name": "Aplikacja", - "form.application.description": "Skonfiguruj ustawienia aplikacji.", - - "form.application.item.name": "Nazwa", - "form.application.item.description": "Opis", - "form.application.item.version": "Wersja", - - "form.advanced.name": "Zaawansowane", "form.advanced.description": "Skonfiguruj zaawansowane ustawienia.", - "form.advanced.item.admin": "Adres panelu administratora", "form.advanced.item.prefix": "Prefiks API", - - "form.request.name": "Żądania", + "form.advanced.name": "Zaawansowane", + "form.application.description": "Skonfiguruj ustawienia aplikacji.", + "form.application.item.description": "Opis", + "form.application.item.name": "Nazwa", + "form.application.item.version": "Wersja", + "form.application.name": "Aplikacja", + "form.button.cancel": "Anuluj", + "form.button.confirm": "Potwierdź", + "form.button.save": "Zapisz", + "form.database.item.authenticationDatabase": "Authentication Database", + "form.database.item.client": "Klient", + "form.database.item.connector": "Łącznik", + "form.database.item.database": "Baza danych", + "form.database.item.default": "Ustaw jako domyślne połączenie", + "form.database.item.host": "Host", + "form.database.item.name": "Nazwa", + "form.database.item.password": "Hasło", + "form.database.item.port": "Port", + "form.database.item.provider.mongo": "Mongo", + "form.database.item.provider.mysql": "MySQL", + "form.database.item.provider.postgres": "PostgresSQL", + "form.database.item.provider.redis": "Redis", + "form.database.item.ssl": "SSL", + "form.database.item.username": "Nazwa użytkownika", + "form.databases.description": "Konfiguruj ustawienia baz danych według środowiska.", + "form.databases.name": "Bazy danych", + "form.language.choose": "Nazwa:", + "form.language.description": "Konfiguruj języki.", + "form.language.name": "Języki", "form.request.description": "Konfiguruj ustawienia żądań.", + "form.request.item.logger": "Logger", + "form.request.item.logger.exposeInContext": "Odsłoń w kontekście", + "form.request.item.logger.level": "Poziom", + "form.request.item.logger.requests": "Żądania", "form.request.item.parser": "Parser", "form.request.item.parser.multipart": "Parser Multipart", "form.request.item.prefix": "Prefiks", "form.request.item.prefix.prefix": "Prefiks", - "form.request.item.logger": "Logger", - "form.request.item.logger.level": "Poziom", - "form.request.item.logger.exposeInContext": "Odsłoń w kontekście", - "form.request.item.logger.requests": "Żądania", "form.request.item.router": "Router", "form.request.item.router.prefix": "Prefiks", - - "form.response.name": "Odpowiedzi", + "form.request.name": "Żądania", "form.response.description": "Konfiguruj ustawienia odpowiedzi.", "form.response.item.gzip.enabled": "Gzip", "form.response.item.responseTime.enabled": "Czas odpowiedzi", - - "form.security.name": "Bezpieczeństwo", + "form.response.name": "Odpowiedzi", "form.security.description": "Konfiguruj ustawienia bezpieczeństwa.", - + "form.security.item.cors": "Cors", + "form.security.item.cors.origin": "Źródło", "form.security.item.csrf": "CSRF", - "form.security.item.p3p": "P3P", - "form.security.item.p3p.value": "Wartość", - "form.security.item.hsts": "HOSTS", + "form.security.item.csrf.angular": "Angular", + "form.security.item.csrf.cookie": "Cookie", "form.security.item.csrf.key": "Klucz", "form.security.item.csrf.secret": "Sekretny klucz", - "form.security.item.csrf.cookie": "Cookie", - "form.security.item.csrf.angular": "Angular", - "form.security.item.hsts.maxAge": "Max Age", + "form.security.item.hsts": "HOSTS", "form.security.item.hsts.includeSubDomains": "Subdomeny", + "form.security.item.hsts.maxAge": "Max Age", "form.security.item.hsts.preload": "Przeładowywanie", - + "form.security.item.p3p": "P3P", + "form.security.item.p3p.value": "Wartość", "form.security.item.session": "Sesja", "form.security.item.session.key": "Sekretny klucz", "form.security.item.session.maxAge": "Maksymalny czas", - "form.security.item.xframe": "Xframe", - "form.security.item.xframe.value": "Opcje", + "form.security.item.xframe.allow-from": "ALLOW-FROM", "form.security.item.xframe.deny": "DENY", "form.security.item.xframe.sameorigin": "SAMEORIGIN", - "form.security.item.xframe.allow-from": "ALLOW-FROM", - + "form.security.item.xframe.value": "Opcje", "form.security.item.xssProtection": "Ochrona xss", "form.security.item.xssProtection.mode": "Tryb", - - "form.security.item.cors": "Cors", - "form.security.item.cors.origin": "Źródło", - - "form.server.name": "Serwer", + "form.security.name": "Bezpieczeństwo", "form.server.description": "Konfiguruj ustaweinia serwera.", - + "form.server.item.cron": "Cron", "form.server.item.host": "Host", "form.server.item.port": "Port", - "form.server.item.cron": "Cron", - - "form.language.name": "Języki", - "form.language.description": "Konfiguruj języki.", - "form.language.choose": "Nazwa:", - - "request.error.database.exist": "Takie połączenie już istnieje", - "request.error.database.unknow": "Takie połączenie nie istnieje", - "request.error.type.string": "Tekst jest wymagany.", - "request.error.type.number": "Liczba jest wymagana.", - "request.error.type.boolean": "Typ logiczny jest wymagany.", - "request.error.type.select": "Wartość musi znajdować się na uprzednio zdefiniowanej liście.", - - "request.error.validation.required": "Wpisanie wartości dla tego atrybutu jest wymagane.", - "request.error.validation.regex": "Forma nie zgadza się z wymaganym wzorcem.", - "request.error.validation.max": "Ta wartość jest za wysoka.", - "request.error.validation.min": "Ta wartość jest za niska", - "request.error.validation.maxLength": "Ta wartość jest za długa.", - "request.error.validation.minLength": "Ta wartość jest za krótka.", - - "request.error.config": "Plik konfiguracyjny nie istnieje.", - "request.error.environment.required": "Środowisko jest wymagane.", - "request.error.environment.unknow": "Środowisko jest nieokreślone.", - "request.error.languages.exist": "Taki język już istnieje.", - "request.error.languages.unknow": "Taki język nie istnieje.", - "request.error.languages.incorrect": "Ten język jest niepoprawny.", - - "list.languages.button.label": "Język", - "list.languages.title.singular": "język jest dostępny", - "list.languages.title.plural": "języków jest dostępnych", - "list.languages.default.languages": "Domyślny", - "list.languages.set.languages": "Ustaw jako domyślny", - "list.databases.button.label": "Połączenie", - "list.databases.title.singular": "połączenie w tym środowisku", - "list.databases.title.plural": "połączeń w tym środowisku", - - "popUpWarning.title": "Potwierdzenie", - "popUpWarning.databases.danger.message": "Modele wciąż są powiązane z tym połączeniem. Usuwając je możesz spowodować krytyczne problemy w aplikacji. Ostrożnie...", - "popUpWarning.danger.ok.message": "Rozumiem", - "popUpWarning.databases.delete.message": "Czy na pewno chcesz usunąć tę bazę danych?", - "popUpWarning.languages.delete.message": "Czy na pewno chcesz usunąć ten język?", - "strapi.notification.info.settingsEqual": "Ustawienia są takie same", - "strapi.notification.success.databaseDelete": "Baza danych została pomyślnie usunięta.", - "strapi.notification.success.languageDelete": "Język został pomyślnie usunięty.", - "strapi.notification.success.languageAdd": "Język został pomyślnie dodany.", - "strapi.notification.success.databaseAdd": "Baza danych została pomyślnie dodana.", - "strapi.notification.success.databaseEdit": "Ustawienia bazy danych zostały pomyślnie zmienione.", - "strapi.notification.success.databaseDeleted": "Baza danych została usunięta.", - "strapi.notification.success.settingsEdit": "Ustawienia zostały pomyślnie zmienione.", - "strapi.notification.error": "Wystąpił błąd", - "strapi.notification.info.serverRestart": "Serwer uruchomi się ponownie", - + "form.server.name": "Serwer", "language.af": "Afrikaans", "language.af_NA": "Afrikaans (Namibië)", "language.af_ZA": "Afrikaans (Suid-Afrika)", @@ -651,6 +573,58 @@ "language.zh_Hant_TW": "中文(繁體中文,台灣)", "language.zu": "isiZulu", "language.zu_ZA": "isiZulu (iNingizimu Afrika)", - - "pageNotFound": "Strona nie znaleziona" -} + "list.databases.button.label": "Połączenie", + "list.databases.title.plural": "połączeń w tym środowisku", + "list.databases.title.singular": "połączenie w tym środowisku", + "list.languages.button.label": "Język", + "list.languages.default.languages": "Domyślny", + "list.languages.set.languages": "Ustaw jako domyślny", + "list.languages.title.plural": "języków jest dostępnych", + "list.languages.title.singular": "język jest dostępny", + "menu.item.advanced": "Zaawansowane", + "menu.item.application": "Aplikacja", + "menu.item.database": "Bazy danych", + "menu.item.languages": "Języki", + "menu.item.request": "Żądania", + "menu.item.response": "Odpowiedzi", + "menu.item.security": "Bezpieczeństwo", + "menu.item.server": "Serwer", + "menu.section.environments": "Środowiska", + "menu.section.global-settings": "Globalne", + "pageNotFound": "Strona nie znaleziona", + "plugin.description.long": "Skonfiguruj swój projekt w kilka sekund", + "plugin.description.short": "Skonfiguruj swój projekt w kilka sekund", + "popUpWarning.danger.ok.message": "Rozumiem", + "popUpWarning.databases.danger.message": "Modele wciąż są powiązane z tym połączeniem. Usuwając je możesz spowodować krytyczne problemy w aplikacji. Ostrożnie...", + "popUpWarning.databases.delete.message": "Czy na pewno chcesz usunąć tę bazę danych?", + "popUpWarning.languages.delete.message": "Czy na pewno chcesz usunąć ten język?", + "popUpWarning.title": "Potwierdzenie", + "request.error.config": "Plik konfiguracyjny nie istnieje.", + "request.error.database.exist": "Takie połączenie już istnieje", + "request.error.database.unknow": "Takie połączenie nie istnieje", + "request.error.environment.required": "Środowisko jest wymagane.", + "request.error.environment.unknow": "Środowisko jest nieokreślone.", + "request.error.languages.exist": "Taki język już istnieje.", + "request.error.languages.incorrect": "Ten język jest niepoprawny.", + "request.error.languages.unknow": "Taki język nie istnieje.", + "request.error.type.boolean": "Typ logiczny jest wymagany.", + "request.error.type.number": "Liczba jest wymagana.", + "request.error.type.select": "Wartość musi znajdować się na uprzednio zdefiniowanej liście.", + "request.error.type.string": "Tekst jest wymagany.", + "request.error.validation.max": "Ta wartość jest za wysoka.", + "request.error.validation.maxLength": "Ta wartość jest za długa.", + "request.error.validation.min": "Ta wartość jest za niska", + "request.error.validation.minLength": "Ta wartość jest za krótka.", + "request.error.validation.regex": "Forma nie zgadza się z wymaganym wzorcem.", + "request.error.validation.required": "Wpisanie wartości dla tego atrybutu jest wymagane.", + "strapi.notification.error": "Wystąpił błąd", + "strapi.notification.info.serverRestart": "Serwer uruchomi się ponownie", + "strapi.notification.info.settingsEqual": "Ustawienia są takie same", + "strapi.notification.success.databaseAdd": "Baza danych została pomyślnie dodana.", + "strapi.notification.success.databaseDelete": "Baza danych została pomyślnie usunięta.", + "strapi.notification.success.databaseDeleted": "Baza danych została usunięta.", + "strapi.notification.success.databaseEdit": "Ustawienia bazy danych zostały pomyślnie zmienione.", + "strapi.notification.success.languageAdd": "Język został pomyślnie dodany.", + "strapi.notification.success.languageDelete": "Język został pomyślnie usunięty.", + "strapi.notification.success.settingsEdit": "Ustawienia zostały pomyślnie zmienione." +} \ No newline at end of file diff --git a/packages/strapi-plugin-settings-manager/admin/src/translations/pt-BR.json b/packages/strapi-plugin-settings-manager/admin/src/translations/pt-BR.json index a6564266e3..f6b0dd3a93 100644 --- a/packages/strapi-plugin-settings-manager/admin/src/translations/pt-BR.json +++ b/packages/strapi-plugin-settings-manager/admin/src/translations/pt-BR.json @@ -1,162 +1,84 @@ { "components.DownloadDb.download": "Instalação em progresso...", "components.DownloadDb.text": "Isto pode demorar um minuto ou mais. Obrigado pela sua paciência.", - "plugin.description.short": "Configure seu projeto em segundos.", - "plugin.description.long": "Configure seu projeto em segundos.", - "menu.section.global-settings": "Definições gerais", - "menu.item.application": "Aplicação", - "menu.item.languages": "Idiomas", - "menu.item.advanced": "Avançado", - - "menu.section.environments": "Ambientes", - "menu.item.database": "Banco de Dados", - "menu.item.request": "Requisição", - "menu.item.response": "Resposta", - "menu.item.security": "Segurança", - "menu.item.server": "Servidor", - - "form.button.cancel": "Cancelar", - "form.button.save": "Salvar", - "form.button.confirm": "Confirmar", - - "form.databases.name": "Banco de Dados", - "form.databases.description": "Defina as suas configurações de seu banco de dados por ambiente.", - - "form.database.item.name": "Nome da conexão", - "form.database.item.client": "Cliente", - "form.database.item.connector": "Conector", - "form.database.item.host": "Host", - "form.database.item.port": "Porta", - "form.database.item.username": "Nome do Usuário", - "form.database.item.password": "Senha", - "form.database.item.database": "Banco de Dados", - "form.database.item.ssl": "SSL", - "form.database.item.authenticationDatabase": "Base de Dados para Autenticação", - "form.database.item.default": "Definir como conexão padrão", - "form.database.item.provider.mongo": "Mongo", - "form.database.item.provider.postgres": "PostgresSQL", - "form.database.item.provider.mysql": "MySQL", - "form.database.item.provider.redis": "Redis", - - "form.application.name": "Aplicação", - "form.application.description": "Defina as suas configurações de sua aplicação.", - - "form.application.item.name": "Nome", - "form.application.item.description": "Descrição", - "form.application.item.version": "Versão", - - "form.advanced.name": "Avançado", "form.advanced.description": "Defina as suas configurações avançadas.", - "form.advanced.item.admin": "Admin dashboard url", "form.advanced.item.prefix": "Prefixo da API", - - "form.request.name": "Requisição", + "form.advanced.name": "Avançado", + "form.application.description": "Defina as suas configurações de sua aplicação.", + "form.application.item.description": "Descrição", + "form.application.item.name": "Nome", + "form.application.item.version": "Versão", + "form.application.name": "Aplicação", + "form.button.cancel": "Cancelar", + "form.button.confirm": "Confirmar", + "form.button.save": "Salvar", + "form.database.item.authenticationDatabase": "Base de Dados para Autenticação", + "form.database.item.client": "Cliente", + "form.database.item.connector": "Conector", + "form.database.item.database": "Banco de Dados", + "form.database.item.default": "Definir como conexão padrão", + "form.database.item.host": "Host", + "form.database.item.name": "Nome da conexão", + "form.database.item.password": "Senha", + "form.database.item.port": "Porta", + "form.database.item.provider.mongo": "Mongo", + "form.database.item.provider.mysql": "MySQL", + "form.database.item.provider.postgres": "PostgresSQL", + "form.database.item.provider.redis": "Redis", + "form.database.item.ssl": "SSL", + "form.database.item.username": "Nome do Usuário", + "form.databases.description": "Defina as suas configurações de seu banco de dados por ambiente.", + "form.databases.name": "Banco de Dados", + "form.language.choose": "Escolha um idioma:", + "form.language.description": "Configure seus idiomas.", + "form.language.name": "Idiomas", "form.request.description": "Defina as suas configurações de requisição.", + "form.request.item.logger": "Logger", + "form.request.item.logger.exposeInContext": "Expor em contexto", + "form.request.item.logger.level": "Nível", + "form.request.item.logger.requests": "Requisições", "form.request.item.parser": "Parser", "form.request.item.parser.multipart": "Parser Multipart", "form.request.item.prefix": "Prefixo", "form.request.item.prefix.prefix": "Prefixo", - "form.request.item.logger": "Logger", - "form.request.item.logger.level": "Nível", - "form.request.item.logger.exposeInContext": "Expor em contexto", - "form.request.item.logger.requests": "Requisições", "form.request.item.router": "Roteador", "form.request.item.router.prefix": "Prefixo", - - "form.response.name": "Resposta", + "form.request.name": "Requisição", "form.response.description": "Defina as suas configurações de resposta.", "form.response.item.gzip.enabled": "Gzip", "form.response.item.responseTime.enabled": "Tempo de resposta", - - "form.security.name": "Segurança", + "form.response.name": "Resposta", "form.security.description": "Defina as suas configurações de segurança.", - + "form.security.item.cors": "CORS", + "form.security.item.cors.origin": "Origem", "form.security.item.csrf": "CSRF", - "form.security.item.p3p": "P3P", - "form.security.item.p3p.value": "Valor", - "form.security.item.hsts": "HOSTS", + "form.security.item.csrf.angular": "Angular", + "form.security.item.csrf.cookie": "Cookie", "form.security.item.csrf.key": "Chave", "form.security.item.csrf.secret": "Segredo", - "form.security.item.csrf.cookie": "Cookie", - "form.security.item.csrf.angular": "Angular", - "form.security.item.hsts.maxAge": "Idade máxima", + "form.security.item.hsts": "HOSTS", "form.security.item.hsts.includeSubDomains": "Incluir Sub Domínio", + "form.security.item.hsts.maxAge": "Idade máxima", "form.security.item.hsts.preload": "Pré-carregar", - + "form.security.item.p3p": "P3P", + "form.security.item.p3p.value": "Valor", "form.security.item.session": "Sessão", "form.security.item.session.key": "Chave Secreta", "form.security.item.session.maxAge": "Idade máxima", - "form.security.item.xframe": "Xframe", - "form.security.item.xframe.value": "Opções", + "form.security.item.xframe.allow-from": "PERMITIR-DE", "form.security.item.xframe.deny": "NEGAR", "form.security.item.xframe.sameorigin": "MESMAORIGEM", - "form.security.item.xframe.allow-from": "PERMITIR-DE", - + "form.security.item.xframe.value": "Opções", "form.security.item.xssProtection": "Proteção XSS", "form.security.item.xssProtection.mode": "Modo", - - "form.security.item.cors": "CORS", - "form.security.item.cors.origin": "Origem", - - "form.server.name": "Servidor", + "form.security.name": "Segurança", "form.server.description": "Configure as suas definições de servidor.", - + "form.server.item.cron": "Cron", "form.server.item.host": "Host", "form.server.item.port": "Porta", - "form.server.item.cron": "Cron", - - "form.language.name": "Idiomas", - "form.language.description": "Configure seus idiomas.", - "form.language.choose": "Escolha um idioma:", - - "request.error.database.exist": "Esta conexão já existe", - "request.error.database.unknow": "Nenhuma conexão", - "request.error.type.string": "Um texto é obrigatório.", - "request.error.type.number": "Um número é obrigatório.", - "request.error.type.boolean": "Um valor booleano é obrigatório.", - "request.error.type.select": "O valor deve estar na lista predefinida.", - - "request.error.validation.required": "Este valor é obrigatório.", - "request.error.validation.regex": "O valor não corresponde ao regex.", - "request.error.validation.max": "O valor é muito alto.", - "request.error.validation.min": "O valor é muito baixo.", - "request.error.validation.maxLength": "O valor é muito longo.", - "request.error.validation.minLength": "O valor é muito curto.", - - "request.error.config": "O arquivo de configuração não existe.", - "request.error.environment.required": "O ambiente é obrigatório.", - "request.error.environment.unknow": "O Ambiente é desconhecido.", - "request.error.languages.exist": "O idioma já existe.", - "request.error.languages.unknow": "Este idioma não existe.", - "request.error.languages.incorrect": "Este idioma está incorrecto.", - - "list.languages.button.label": "Adicionar um novo idioma", - "list.languages.title.singular": "idioma está disponível", - "list.languages.title.plural": "idiomas estão disponíveis", - "list.languages.default.languages": "Idioma predefinido", - "list.languages.set.languages": "Definir como padrão", - "list.databases.button.label": "Adicionar uma nova conexão", - "list.databases.title.singular": "conexão neste ambiente", - "list.databases.title.plural": "conexões neste ambiente", - - "popUpWarning.title": "Por favor, confirme", - "popUpWarning.databases.danger.message": "Os Tipos de Conteúdo ainda estão vinculados a esta conexão. Ao removê-los, você poderá causar problemas críticos à sua aplicação. Seja cuidadoso...", - "popUpWarning.danger.ok.message": "Eu Entendo", - "popUpWarning.databases.delete.message": "Tem a certeza que deseja remover este banco de dados?", - "popUpWarning.languages.delete.message": "Tem a certeza que deseja remover este idioma?", - "strapi.notification.info.settingsEqual": "Configurações são iguais", - "strapi.notification.success.databaseDelete": "O banco de dados foi removido com sucesso.", - "strapi.notification.success.languageDelete": "O idioma foi removido com sucesso.", - "strapi.notification.success.languageAdd": "O idioma foi adicionado com sucesso.", - "strapi.notification.success.databaseAdd": "O banco de dados foi adicionado com sucesso.", - "strapi.notification.success.databaseEdit": "As configurações do banco de dados foram atualizadas com sucesso.", - "strapi.notification.success.databaseDeleted": "O banco de dados foi removido.", - "strapi.notification.success.settingsEdit": "As configurações foram atualizadas com sucesso.", - "strapi.notification.error": "Ocorreu um erro", - "strapi.notification.info.serverRestart": "O servidor irá reiniciar", - + "form.server.name": "Servidor", "language.af": "Afrikaans", "language.af_NA": "Afrikaans (Namibië)", "language.af_ZA": "Afrikaans (Suid-Afrika)", @@ -651,6 +573,58 @@ "language.zh_Hant_TW": "中文(繁體中文,台灣)", "language.zu": "isiZulu", "language.zu_ZA": "isiZulu (iNingizimu Afrika)", - - "pageNotFound": "Página não encontrada" -} + "list.databases.button.label": "Adicionar uma nova conexão", + "list.databases.title.plural": "conexões neste ambiente", + "list.databases.title.singular": "conexão neste ambiente", + "list.languages.button.label": "Adicionar um novo idioma", + "list.languages.default.languages": "Idioma predefinido", + "list.languages.set.languages": "Definir como padrão", + "list.languages.title.plural": "idiomas estão disponíveis", + "list.languages.title.singular": "idioma está disponível", + "menu.item.advanced": "Avançado", + "menu.item.application": "Aplicação", + "menu.item.database": "Banco de Dados", + "menu.item.languages": "Idiomas", + "menu.item.request": "Requisição", + "menu.item.response": "Resposta", + "menu.item.security": "Segurança", + "menu.item.server": "Servidor", + "menu.section.environments": "Ambientes", + "menu.section.global-settings": "Definições gerais", + "pageNotFound": "Página não encontrada", + "plugin.description.long": "Configure seu projeto em segundos.", + "plugin.description.short": "Configure seu projeto em segundos.", + "popUpWarning.danger.ok.message": "Eu Entendo", + "popUpWarning.databases.danger.message": "Os Tipos de Conteúdo ainda estão vinculados a esta conexão. Ao removê-los, você poderá causar problemas críticos à sua aplicação. Seja cuidadoso...", + "popUpWarning.databases.delete.message": "Tem a certeza que deseja remover este banco de dados?", + "popUpWarning.languages.delete.message": "Tem a certeza que deseja remover este idioma?", + "popUpWarning.title": "Por favor, confirme", + "request.error.config": "O arquivo de configuração não existe.", + "request.error.database.exist": "Esta conexão já existe", + "request.error.database.unknow": "Nenhuma conexão", + "request.error.environment.required": "O ambiente é obrigatório.", + "request.error.environment.unknow": "O Ambiente é desconhecido.", + "request.error.languages.exist": "O idioma já existe.", + "request.error.languages.incorrect": "Este idioma está incorrecto.", + "request.error.languages.unknow": "Este idioma não existe.", + "request.error.type.boolean": "Um valor booleano é obrigatório.", + "request.error.type.number": "Um número é obrigatório.", + "request.error.type.select": "O valor deve estar na lista predefinida.", + "request.error.type.string": "Um texto é obrigatório.", + "request.error.validation.max": "O valor é muito alto.", + "request.error.validation.maxLength": "O valor é muito longo.", + "request.error.validation.min": "O valor é muito baixo.", + "request.error.validation.minLength": "O valor é muito curto.", + "request.error.validation.regex": "O valor não corresponde ao regex.", + "request.error.validation.required": "Este valor é obrigatório.", + "strapi.notification.error": "Ocorreu um erro", + "strapi.notification.info.serverRestart": "O servidor irá reiniciar", + "strapi.notification.info.settingsEqual": "Configurações são iguais", + "strapi.notification.success.databaseAdd": "O banco de dados foi adicionado com sucesso.", + "strapi.notification.success.databaseDelete": "O banco de dados foi removido com sucesso.", + "strapi.notification.success.databaseDeleted": "O banco de dados foi removido.", + "strapi.notification.success.databaseEdit": "As configurações do banco de dados foram atualizadas com sucesso.", + "strapi.notification.success.languageAdd": "O idioma foi adicionado com sucesso.", + "strapi.notification.success.languageDelete": "O idioma foi removido com sucesso.", + "strapi.notification.success.settingsEdit": "As configurações foram atualizadas com sucesso." +} \ No newline at end of file diff --git a/packages/strapi-plugin-settings-manager/admin/src/translations/pt.json b/packages/strapi-plugin-settings-manager/admin/src/translations/pt.json index 7988f9756f..564f53fe9e 100644 --- a/packages/strapi-plugin-settings-manager/admin/src/translations/pt.json +++ b/packages/strapi-plugin-settings-manager/admin/src/translations/pt.json @@ -1,656 +1,630 @@ { - "components.DownloadDb.download": "Instalação em progresso...", - "components.DownloadDb.text": "Isto pode demorar um minuto ou mais. Obrigado pela sua paciência.", - "plugin.description.short": "Configure seu projecto em segundos.", - "plugin.description.long": "Configure seu projecto em segundos.", - "menu.section.global-settings": "Definições gerais", - "menu.item.application": "Aplicação", - "menu.item.languages": "Idiomas", - "menu.item.advanced": "Avançado", - - "menu.section.environments": "Ambientes", - "menu.item.database": "Base de dados", - "menu.item.request": "Requisição", - "menu.item.response": "Resposta", - "menu.item.security": "Segurança", - "menu.item.server": "Servidor", - - "form.button.cancel": "Cancelar", - "form.button.save": "Guardar", - "form.button.confirm": "Confirmar", - - "form.databases.name": "Base de dados", - "form.databases.description": "Configure as definições de sua base de dados por ambiente.", - - "form.database.item.name": "Nome da conexão", - "form.database.item.client": "Cliente", - "form.database.item.connector": "Conector", - "form.database.item.host": "Host", - "form.database.item.port": "Porta", - "form.database.item.username": "Nomde de Utilizador", - "form.database.item.password": "Palavra-passe", - "form.database.item.database": "Base de dados", - "form.database.item.ssl": "SSL", - "form.database.item.authenticationDatabase": "Base de Dados de Autenticação", - "form.database.item.default": "Definir como conexão padrão", - "form.database.item.provider.mongo": "Mongo", - "form.database.item.provider.postgres": "PostgresSQL", - "form.database.item.provider.mysql": "MySQL", - "form.database.item.provider.redis": "Redis", - - "form.application.name": "Aplicação", - "form.application.description": "Configure as definições de sua aplicação.", - - "form.application.item.name": "Nome", - "form.application.item.description": "Descrição", - "form.application.item.version": "Versão", - - "form.advanced.name": "Avançado", - "form.advanced.description": "Configure as suas definições avançadas.", - - "form.advanced.item.admin": "Admin dashboard url", - "form.advanced.item.prefix": "Prefix API", - - "form.request.name": "Requisição", - "form.request.description": "Configure as suas definições de requisição.", - "form.request.item.parser": "Parser", - "form.request.item.parser.multipart": "Parser Multipart", - "form.request.item.prefix": "Prefix", - "form.request.item.prefix.prefix": "Prefixo", - "form.request.item.logger": "Logger", - "form.request.item.logger.level": "Nível", - "form.request.item.logger.exposeInContext": "Expor em contexto", - "form.request.item.logger.requests": "Requisições", - "form.request.item.router": "Roteador", - "form.request.item.router.prefix": "Prefixo", - - "form.response.name": "Resposta", - "form.response.description": "Configure as suas definições de resposta.", - "form.response.item.gzip.enabled": "Gzip", - "form.response.item.responseTime.enabled": "Tempo de resposta", - - "form.security.name": "Segurança", - "form.security.description": "Configure as suas definições de segurança.", - - "form.security.item.csrf": "CSRF", - "form.security.item.p3p": "P3P", - "form.security.item.p3p.value": "Valor", - "form.security.item.hsts": "HOSTS", - "form.security.item.csrf.key": "Chave", - "form.security.item.csrf.secret": "Secreta", - "form.security.item.csrf.cookie": "Cookie", - "form.security.item.csrf.angular": "Angular", - "form.security.item.hsts.maxAge": "Idade máxima", - "form.security.item.hsts.includeSubDomains": "Incluir Sub Domínio", - "form.security.item.hsts.preload": "Pré-carregar", - - "form.security.item.session": "Sessão", - "form.security.item.session.key": "Chave Secreta", - "form.security.item.session.maxAge": "Idade máxima", - - "form.security.item.xframe": "Xframe", - "form.security.item.xframe.value": "Opções", - "form.security.item.xframe.deny": "NEGAR", - "form.security.item.xframe.sameorigin": "MESMAORIGEM", - "form.security.item.xframe.allow-from": "PERMITIR-DE", - - "form.security.item.xssProtection": "xss Proteção", - "form.security.item.xssProtection.mode": "Modo", - - "form.security.item.cors": "Cors", - "form.security.item.cors.origin": "Origem", - - "form.server.name": "Servidor", - "form.server.description": "Configure as suas definições de servidor.", - - "form.server.item.host": "Host", - "form.server.item.port": "Port", - "form.server.item.cron": "Cron", - - "form.language.name": "Idimoas", - "form.language.description": "Configure seus idiomas.", - "form.language.choose": "Escolha um idioma:", - - "request.error.database.exist": "Esta conexão já existe", - "request.error.database.unknow": "Nenhuma conexão", - "request.error.type.string": "Um texto é obrigatório.", - "request.error.type.number": "Um número é obrigatório.", - "request.error.type.boolean": "Um booleano é obrigatório.", - "request.error.type.select": "O valor deve estar na lista predefinida.", - - "request.error.validation.required": "Este valor é obrigatório.", - "request.error.validation.regex": "O valor não corresponde ao regex.", - "request.error.validation.max": "O valor é muito alto.", - "request.error.validation.min": "O valor é muito baixo.", - "request.error.validation.maxLength": "O valor é muito longo.", - "request.error.validation.minLength": "O valor é muito curto.", - - "request.error.config": "O arquivo de configuração não existe.", - "request.error.environment.required": "O ambiente é obrigatório.", - "request.error.environment.unknow": "O Ambiente é desconhecido.", - "request.error.languages.exist": "O idioma já existe.", - "request.error.languages.unknow": "Este idioma não existe.", - "request.error.languages.incorrect": "Este idioma está incorrecto.", - - "list.languages.button.label": "Adicionar um novo idioma", - "list.languages.title.singular": "idioma está disponível", - "list.languages.title.plural": "idiomas estão disponíveis", - "list.languages.default.languages": "Idioma predefinido", - "list.languages.set.languages": "Definir como padrão", - "list.databases.button.label": "Adicionar uma nova conexão", - "list.databases.title.singular": "conexão neste ambiente", - "list.databases.title.plural": "conexões neste ambiente", - - "popUpWarning.title": "Por favor, confirme", - "popUpWarning.databases.danger.message": "Os Tipos de Conteúdos ainda estão vinculados a esta conexão. Ao removê-los, você poderá causar problemas críticos à sua aplicação. Seja cuidadoso...", - "popUpWarning.danger.ok.message": "Eu Entendo", - "popUpWarning.databases.delete.message": "Tem a certeza de que pretende apagar esta base de dados?", - "popUpWarning.languages.delete.message": "Tem a certeza de que pretende apagar este idioma?", - "strapi.notification.info.settingsEqual": "Configurações são iguais", - "strapi.notification.success.databaseDelete": "A base de dados foi excluida com sucesso.", - "strapi.notification.success.languageDelete": "O idioma foi excluido com sucesso.", - "strapi.notification.success.languageAdd": "O idioma foi adicionado com sucesso.", - "strapi.notification.success.databaseAdd": "A base de dados foi adicionada com sucesso.", - "strapi.notification.success.databaseEdit": "As configurações da base de dados foram actualizadas com sucesso.", - "strapi.notification.success.databaseDeleted": "A base de dados foi apagada.", - "strapi.notification.success.settingsEdit": "As configurações foram actualizadas com sucesso.", - "strapi.notification.error": "Ocorreu um erro", - "strapi.notification.info.serverRestart": "O servidor irá reiniciar", - - "language.af": "Afrikaans", - "language.af_NA": "Afrikaans (Namibië)", - "language.af_ZA": "Afrikaans (Suid-Afrika)", - "language.agq": "Aghem", - "language.agq_CM": "Aghem (Kàmàlûŋ)", - "language.ak": "Akan", - "language.ak_GH": "Akan (Gaana)", - "language.am": "አማርኛ", - "language.am_ET": "አማርኛ (ኢትዮጵያ)", - "language.ar": "العربية", - "language.ar_001": "العربية (العالم)", - "language.ar_AE": "العربية (الإمارات العربية المتحدة)", - "language.ar_BH": "العربية (البحرين)", - "language.ar_DZ": "العربية (الجزائر)", - "language.ar_EG": "العربية (مصر)", - "language.ar_IQ": "العربية (العراق)", - "language.ar_JO": "العربية (الأردن)", - "language.ar_KW": "العربية (الكويت)", - "language.ar_LB": "العربية (لبنان)", - "language.ar_LY": "العربية (ليبيا)", - "language.ar_MA": "العربية (المغرب)", - "language.ar_OM": "العربية (عُمان)", - "language.ar_QA": "العربية (قطر)", - "language.ar_SA": "العربية (المملكة العربية السعودية)", - "language.ar_SD": "العربية (السودان)", - "language.ar_SY": "العربية (سوريا)", - "language.ar_TN": "العربية (تونس)", - "language.ar_YE": "العربية (اليمن)", - "language.as": "অসমীয়া", - "language.as_IN": "অসমীয়া (ভাৰত)", - "language.asa": "Kipare", - "language.asa_TZ": "Kipare (Tadhania)", - "language.az": "azərbaycanca", - "language.az_Cyrl": "Азәрбајҹан (kiril)", - "language.az_Cyrl_AZ": "Азәрбајҹан (kiril, Азәрбајҹан)", - "language.az_Latn": "azərbaycanca (latın)", - "language.az_Latn_AZ": "azərbaycanca (latın, Azərbaycan)", - "language.bas": "Ɓàsàa", - "language.bas_CM": "Ɓàsàa (Kàmɛ̀rûn)", - "language.be": "беларуская", - "language.be_BY": "беларуская (Беларусь)", - "language.bem": "Ichibemba", - "language.bem_ZM": "Ichibemba (Zambia)", - "language.bez": "Hibena", - "language.bez_TZ": "Hibena (Hutanzania)", - "language.bg": "български", - "language.bg_BG": "български (България)", - "language.bm": "bamanakan", - "language.bm_ML": "bamanakan (Mali)", - "language.bn": "বাংলা", - "language.bn_BD": "বাংলা (বাংলাদেশ)", - "language.bn_IN": "বাংলা (ভারত)", - "language.bo": "པོད་སྐད་", - "language.bo_CN": "པོད་སྐད་ (རྒྱ་ནག)", - "language.bo_IN": "པོད་སྐད་ (རྒྱ་གར་)", - "language.br": "brezhoneg", - "language.br_FR": "brezhoneg (Frañs)", - "language.brx": "बड़ो", - "language.brx_IN": "बड़ो (भारत)", - "language.bs": "bosanski", - "language.bs_BA": "bosanski (Bosna i Hercegovina)", - "language.ca": "català", - "language.ca_ES": "català (Espanya)", - "language.cgg": "Rukiga", - "language.cgg_UG": "Rukiga (Uganda)", - "language.chr": "ᏣᎳᎩ", - "language.chr_US": "ᏣᎳᎩ (ᎠᎹᏰᏟ)", - "language.cs": "čeština", - "language.cs_CZ": "čeština (Česká republika)", - "language.cy": "Cymraeg", - "language.cy_GB": "Cymraeg (Prydain Fawr)", - "language.da": "dansk", - "language.da_DK": "dansk (Danmark)", - "language.dav": "Kitaita", - "language.dav_KE": "Kitaita (Kenya)", - "language.de": "Deutsch", - "language.de_AT": "Deutsch (Österreich)", - "language.de_BE": "Deutsch (Belgien)", - "language.de_CH": "Deutsch (Schweiz)", - "language.de_DE": "Deutsch (Deutschland)", - "language.de_LI": "Deutsch (Liechtenstein)", - "language.de_LU": "Deutsch (Luxemburg)", - "language.dje": "Zarmaciine", - "language.dje_NE": "Zarmaciine (Nižer)", - "language.dua": "duálá", - "language.dua_CM": "duálá (Cameroun)", - "language.dyo": "joola", - "language.dyo_SN": "joola (Senegal)", - "language.ebu": "Kĩembu", - "language.ebu_KE": "Kĩembu (Kenya)", - "language.ee": "eʋegbe", - "language.ee_GH": "eʋegbe (Ghana nutome)", - "language.ee_TG": "eʋegbe (Togo nutome)", - "language.el": "Ελληνικά", - "language.el_CY": "Ελληνικά (Κύπρος)", - "language.el_GR": "Ελληνικά (Ελλάδα)", - "language.en": "English", - "language.en_AS": "English (American Samoa)", - "language.en_AU": "English (Australia)", - "language.en_BB": "English (Barbados)", - "language.en_BE": "English (Belgium)", - "language.en_BM": "English (Bermuda)", - "language.en_BW": "English (Botswana)", - "language.en_BZ": "English (Belize)", - "language.en_CA": "English (Canada)", - "language.en_GB": "English (United Kingdom)", - "language.en_GU": "English (Guam)", - "language.en_GY": "English (Guyana)", - "language.en_HK": "English (Hong Kong SAR China)", - "language.en_IE": "English (Ireland)", - "language.en_IN": "English (India)", - "language.en_JM": "English (Jamaica)", - "language.en_MH": "English (Marshall Islands)", - "language.en_MP": "English (Northern Mariana Islands)", - "language.en_MT": "English (Malta)", - "language.en_MU": "English (Mauritius)", - "language.en_NA": "English (Namibia)", - "language.en_NZ": "English (New Zealand)", - "language.en_PH": "English (Philippines)", - "language.en_PK": "English (Pakistan)", - "language.en_SG": "English (Singapore)", - "language.en_TT": "English (Trinidad and Tobago)", - "language.en_UM": "English (U.S. Minor Outlying Islands)", - "language.en_US": "English (United States)", - "language.en_US_POSIX": "English (United States, Computer)", - "language.en_VI": "English (U.S. Virgin Islands)", - "language.en_ZA": "English (South Africa)", - "language.en_ZW": "English (Zimbabwe)", - "language.eo": "esperanto", - "language.es": "español", - "language.es_419": "español (Latinoamérica)", - "language.es_AR": "español (Argentina)", - "language.es_BO": "español (Bolivia)", - "language.es_CL": "español (Chile)", - "language.es_CO": "español (Colombia)", - "language.es_CR": "español (Costa Rica)", - "language.es_DO": "español (República Dominicana)", - "language.es_EC": "español (Ecuador)", - "language.es_ES": "español (España)", - "language.es_GQ": "español (Guinea Ecuatorial)", - "language.es_GT": "español (Guatemala)", - "language.es_HN": "español (Honduras)", - "language.es_MX": "español (México)", - "language.es_NI": "español (Nicaragua)", - "language.es_PA": "español (Panamá)", - "language.es_PE": "español (Perú)", - "language.es_PR": "español (Puerto Rico)", - "language.es_PY": "español (Paraguay)", - "language.es_SV": "español (El Salvador)", - "language.es_US": "español (Estados Unidos)", - "language.es_UY": "español (Uruguay)", - "language.es_VE": "español (Venezuela)", - "language.et": "eesti", - "language.et_EE": "eesti (Eesti)", - "language.eu": "euskara", - "language.eu_ES": "euskara (Espainia)", - "language.ewo": "ewondo", - "language.ewo_CM": "ewondo (Kamǝrún)", - "language.fa": "فارسی", - "language.fa_AF": "دری (افغانستان)", - "language.fa_IR": "فارسی (ایران)", - "language.ff": "Pulaar", - "language.ff_SN": "Pulaar (Senegaal)", - "language.fi": "suomi", - "language.fi_FI": "suomi (Suomi)", - "language.fil": "Filipino", - "language.fil_PH": "Filipino (Pilipinas)", - "language.fo": "føroyskt", - "language.fo_FO": "føroyskt (Føroyar)", - "language.fr": "français", - "language.fr_BE": "français (Belgique)", - "language.fr_BF": "français (Burkina Faso)", - "language.fr_BI": "français (Burundi)", - "language.fr_BJ": "français (Bénin)", - "language.fr_BL": "français (Saint-Barthélémy)", - "language.fr_CA": "français (Canada)", - "language.fr_CD": "français (République démocratique du Congo)", - "language.fr_CF": "français (République centrafricaine)", - "language.fr_CG": "français (Congo-Brazzaville)", - "language.fr_CH": "français (Suisse)", - "language.fr_CI": "français (Côte d’Ivoire)", - "language.fr_CM": "français (Cameroun)", - "language.fr_DJ": "français (Djibouti)", - "language.fr_FR": "français (France)", - "language.fr_GA": "français (Gabon)", - "language.fr_GF": "français (Guyane française)", - "language.fr_GN": "français (Guinée)", - "language.fr_GP": "français (Guadeloupe)", - "language.fr_GQ": "français (Guinée équatoriale)", - "language.fr_KM": "français (Comores)", - "language.fr_LU": "français (Luxembourg)", - "language.fr_MC": "français (Monaco)", - "language.fr_MF": "français (Saint-Martin)", - "language.fr_MG": "français (Madagascar)", - "language.fr_ML": "français (Mali)", - "language.fr_MQ": "français (Martinique)", - "language.fr_NE": "français (Niger)", - "language.fr_RE": "français (Réunion)", - "language.fr_RW": "français (Rwanda)", - "language.fr_SN": "français (Sénégal)", - "language.fr_TD": "français (Tchad)", - "language.fr_TG": "français (Togo)", - "language.fr_YT": "français (Mayotte)", - "language.ga": "Gaeilge", - "language.ga_IE": "Gaeilge (Éire)", - "language.gl": "galego", - "language.gl_ES": "galego (España)", - "language.gsw": "Schwiizertüütsch", - "language.gsw_CH": "Schwiizertüütsch (Schwiiz)", - "language.gu": "ગુજરાતી", - "language.gu_IN": "ગુજરાતી (ભારત)", - "language.guz": "Ekegusii", - "language.guz_KE": "Ekegusii (Kenya)", - "language.gv": "Gaelg", - "language.gv_GB": "Gaelg (Rywvaneth Unys)", - "language.ha": "Hausa", - "language.ha_Latn": "Hausa (Latn)", - "language.ha_Latn_GH": "Hausa (Latn, Gana)", - "language.ha_Latn_NE": "Hausa (Latn, Nijar)", - "language.ha_Latn_NG": "Hausa (Latn, Najeriya)", - "language.haw": "ʻŌlelo Hawaiʻi", - "language.haw_US": "ʻŌlelo Hawaiʻi (ʻAmelika Hui Pū ʻIa)", - "language.he": "עברית", - "language.he_IL": "עברית (ישראל)", - "language.hi": "हिन्दी", - "language.hi_IN": "हिन्दी (भारत)", - "language.hr": "hrvatski", - "language.hr_HR": "hrvatski (Hrvatska)", - "language.hu": "magyar", - "language.hu_HU": "magyar (Magyarország)", - "language.hy": "Հայերէն", - "language.hy_AM": "Հայերէն (Հայաստանի Հանրապետութիւն)", - "language.id": "Bahasa Indonesia", - "language.id_ID": "Bahasa Indonesia (Indonesia)", - "language.ig": "Igbo", - "language.ig_NG": "Igbo (Nigeria)", - "language.ii": "ꆈꌠꉙ", - "language.ii_CN": "ꆈꌠꉙ (ꍏꇩ)", - "language.is": "íslenska", - "language.is_IS": "íslenska (Ísland)", - "language.it": "italiano", - "language.it_CH": "italiano (Svizzera)", - "language.it_IT": "italiano (Italia)", - "language.ja": "日本語", - "language.ja_JP": "日本語(日本)", - "language.jmc": "Kimachame", - "language.jmc_TZ": "Kimachame (Tanzania)", - "language.ka": "ქართული", - "language.ka_GE": "ქართული (საქართველო)", - "language.kab": "Taqbaylit", - "language.kab_DZ": "Taqbaylit (Lezzayer)", - "language.kam": "Kikamba", - "language.kam_KE": "Kikamba (Kenya)", - "language.kde": "Chimakonde", - "language.kde_TZ": "Chimakonde (Tanzania)", - "language.kea": "kabuverdianu", - "language.kea_CV": "kabuverdianu (Kabu Verdi)", - "language.khq": "Koyra ciini", - "language.khq_ML": "Koyra ciini (Maali)", - "language.ki": "Gikuyu", - "language.ki_KE": "Gikuyu (Kenya)", - "language.kk": "қазақ тілі", - "language.kk_Cyrl": "қазақ тілі (кириллица)", - "language.kk_Cyrl_KZ": "қазақ тілі (кириллица, Қазақстан)", - "language.kl": "kalaallisut", - "language.kl_GL": "kalaallisut (Kalaallit Nunaat)", - "language.kln": "Kalenjin", - "language.kln_KE": "Kalenjin (Emetab Kenya)", - "language.km": "ភាសាខ្មែរ", - "language.km_KH": "ភាសាខ្មែរ (កម្ពុជា)", - "language.kn": "ಕನ್ನಡ", - "language.kn_IN": "ಕನ್ನಡ (ಭಾರತ)", - "language.ko": "한국어", - "language.ko_KR": "한국어(대한민국)", - "language.kok": "कोंकणी", - "language.kok_IN": "कोंकणी (भारत)", - "language.ksb": "Kishambaa", - "language.ksb_TZ": "Kishambaa (Tanzania)", - "language.ksf": "rikpa", - "language.ksf_CM": "rikpa (kamɛrún)", - "language.kw": "kernewek", - "language.kw_GB": "kernewek (Rywvaneth Unys)", - "language.lag": "Kɨlaangi", - "language.lag_TZ": "Kɨlaangi (Taansanía)", - "language.lg": "Luganda", - "language.lg_UG": "Luganda (Yuganda)", - "language.ln": "lingála", - "language.ln_CD": "lingála (Repibiki demokratiki ya Kongó)", - "language.ln_CG": "lingála (Kongo)", - "language.lt": "lietuvių", - "language.lt_LT": "lietuvių (Lietuva)", - "language.lu": "Tshiluba", - "language.lu_CD": "Tshiluba (Ditunga wa Kongu)", - "language.luo": "Dholuo", - "language.luo_KE": "Dholuo (Kenya)", - "language.luy": "Luluhia", - "language.luy_KE": "Luluhia (Kenya)", - "language.lv": "latviešu", - "language.lv_LV": "latviešu (Latvija)", - "language.mas": "Maa", - "language.mas_KE": "Maa (Kenya)", - "language.mas_TZ": "Maa (Tansania)", - "language.mer": "Kĩmĩrũ", - "language.mer_KE": "Kĩmĩrũ (Kenya)", - "language.mfe": "kreol morisien", - "language.mfe_MU": "kreol morisien (Moris)", - "language.mg": "Malagasy", - "language.mg_MG": "Malagasy (Madagasikara)", - "language.mgh": "Makua", - "language.mgh_MZ": "Makua (Umozambiki)", - "language.mk": "македонски", - "language.mk_MK": "македонски (Македонија)", - "language.ml": "മലയാളം", - "language.ml_IN": "മലയാളം (ഇന്ത്യ)", - "language.mr": "मराठी", - "language.mr_IN": "मराठी (भारत)", - "language.ms": "Bahasa Melayu", - "language.ms_BN": "Bahasa Melayu (Brunei)", - "language.ms_MY": "Bahasa Melayu (Malaysia)", - "language.mt": "Malti", - "language.mt_MT": "Malti (Malta)", - "language.mua": "MUNDAŊ", - "language.mua_CM": "MUNDAŊ (kameruŋ)", - "language.my": "ဗမာ", - "language.my_MM": "ဗမာ (မြန်မာ)", - "language.naq": "Khoekhoegowab", - "language.naq_NA": "Khoekhoegowab (Namibiab)", - "language.nb": "norsk bokmål", - "language.nb_NO": "norsk bokmål (Norge)", - "language.nd": "isiNdebele", - "language.nd_ZW": "isiNdebele (Zimbabwe)", - "language.ne": "नेपाली", - "language.ne_IN": "नेपाली (भारत)", - "language.ne_NP": "नेपाली (नेपाल)", - "language.nl": "Nederlands", - "language.nl_AW": "Nederlands (Aruba)", - "language.nl_BE": "Nederlands (België)", - "language.nl_CW": "Nederlands (Curaçao)", - "language.nl_NL": "Nederlands (Nederland)", - "language.nl_SX": "Nederlands (Sint Maarten)", - "language.nmg": "nmg", - "language.nmg_CM": "nmg (Kamerun)", - "language.nn": "nynorsk", - "language.nn_NO": "nynorsk (Noreg)", - "language.nus": "Thok Nath", - "language.nus_SD": "Thok Nath (Sudan)", - "language.nyn": "Runyankore", - "language.nyn_UG": "Runyankore (Uganda)", - "language.om": "Oromoo", - "language.om_ET": "Oromoo (Itoophiyaa)", - "language.om_KE": "Oromoo (Keeniyaa)", - "language.or": "ଓଡ଼ିଆ", - "language.or_IN": "ଓଡ଼ିଆ (ଭାରତ)", - "language.pa": "ਪੰਜਾਬੀ", - "language.pa_Arab": "پنجاب (العربية)", - "language.pa_Arab_PK": "پنجاب (العربية, پکستان)", - "language.pa_Guru": "ਪੰਜਾਬੀ (Guru)", - "language.pa_Guru_IN": "ਪੰਜਾਬੀ (Guru, ਭਾਰਤ)", - "language.pl": "polski", - "language.pl_PL": "polski (Polska)", - "language.ps": "پښتو", - "language.ps_AF": "پښتو (افغانستان)", - "language.pt": "português", - "language.pt_AO": "português (Angola)", - "language.pt_BR": "português (Brasil)", - "language.pt_GW": "português (Guiné Bissau)", - "language.pt_MZ": "português (Moçambique)", - "language.pt_PT": "português (Portugal)", - "language.pt_ST": "português (São Tomé e Príncipe)", - "language.rm": "rumantsch", - "language.rm_CH": "rumantsch (Svizra)", - "language.rn": "Ikirundi", - "language.rn_BI": "Ikirundi (Uburundi)", - "language.ro": "română", - "language.ro_MD": "română (Republica Moldova)", - "language.ro_RO": "română (România)", - "language.rof": "Kihorombo", - "language.rof_TZ": "Kihorombo (Tanzania)", - "language.ru": "русский", - "language.ru_MD": "русский (Молдова)", - "language.ru_RU": "русский (Россия)", - "language.ru_UA": "русский (Украина)", - "language.rw": "Kinyarwanda", - "language.rw_RW": "Kinyarwanda (Rwanda)", - "language.rwk": "Kiruwa", - "language.rwk_TZ": "Kiruwa (Tanzania)", - "language.saq": "Kisampur", - "language.saq_KE": "Kisampur (Kenya)", - "language.sbp": "Ishisangu", - "language.sbp_TZ": "Ishisangu (Tansaniya)", - "language.seh": "sena", - "language.seh_MZ": "sena (Moçambique)", - "language.ses": "Koyraboro senni", - "language.ses_ML": "Koyraboro senni (Maali)", - "language.sg": "Sängö", - "language.sg_CF": "Sängö (Ködörösêse tî Bêafrîka)", - "language.shi": "tamazight", - "language.shi_Latn": "tamazight (Latn)", - "language.shi_Latn_MA": "tamazight (Latn, lmɣrib)", - "language.shi_Tfng": "ⵜⴰⵎⴰⵣⵉⵖⵜ (Tfng)", - "language.shi_Tfng_MA": "ⵜⴰⵎⴰⵣⵉⵖⵜ (Tfng, ⵍⵎⵖⵔⵉⴱ)", - "language.si": "සිංහල", - "language.si_LK": "සිංහල (ශ්‍රී ලංකාව)", - "language.sk": "slovenčina", - "language.sk_SK": "slovenčina (Slovenská republika)", - "language.sl": "slovenščina", - "language.sl_SI": "slovenščina (Slovenija)", - "language.sn": "chiShona", - "language.sn_ZW": "chiShona (Zimbabwe)", - "language.so": "Soomaali", - "language.so_DJ": "Soomaali (Jabuuti)", - "language.so_ET": "Soomaali (Itoobiya)", - "language.so_KE": "Soomaali (Kiiniya)", - "language.so_SO": "Soomaali (Soomaaliya)", - "language.sq": "shqip", - "language.sq_AL": "shqip (Shqipëria)", - "language.sr": "Српски", - "language.sr_Cyrl": "Српски (Ћирилица)", - "language.sr_Cyrl_BA": "Српски (Ћирилица, Босна и Херцеговина)", - "language.sr_Cyrl_ME": "Српски (Ћирилица, Црна Гора)", - "language.sr_Cyrl_RS": "Српски (Ћирилица, Србија)", - "language.sr_Latn": "Srpski (Latinica)", - "language.sr_Latn_BA": "Srpski (Latinica, Bosna i Hercegovina)", - "language.sr_Latn_ME": "Srpski (Latinica, Crna Gora)", - "language.sr_Latn_RS": "Srpski (Latinica, Srbija)", - "language.sv": "svenska", - "language.sv_FI": "svenska (Finland)", - "language.sv_SE": "svenska (Sverige)", - "language.sw": "Kiswahili", - "language.sw_KE": "Kiswahili (Kenya)", - "language.sw_TZ": "Kiswahili (Tanzania)", - "language.swc": "Kiswahili ya Kongo", - "language.swc_CD": "Kiswahili ya Kongo (Jamhuri ya Kidemokrasia ya Kongo)", - "language.ta": "தமிழ்", - "language.ta_IN": "தமிழ் (இந்தியா)", - "language.ta_LK": "தமிழ் (இலங்கை)", - "language.te": "తెలుగు", - "language.te_IN": "తెలుగు (భారత దేశం)", - "language.teo": "Kiteso", - "language.teo_KE": "Kiteso (Kenia)", - "language.teo_UG": "Kiteso (Uganda)", - "language.th": "ไทย", - "language.th_TH": "ไทย (ไทย)", - "language.ti": "ትግርኛ", - "language.ti_ER": "ትግርኛ (ER)", - "language.ti_ET": "ትግርኛ (ET)", - "language.to": "lea fakatonga", - "language.to_TO": "lea fakatonga (Tonga)", - "language.tr": "Türkçe", - "language.tr_TR": "Türkçe (Türkiye)", - "language.twq": "Tasawaq senni", - "language.twq_NE": "Tasawaq senni (Nižer)", - "language.tzm": "Tamaziɣt", - "language.tzm_Latn": "Tamaziɣt (Latn)", - "language.tzm_Latn_MA": "Tamaziɣt (Latn, Meṛṛuk)", - "language.uk": "українська", - "language.uk_UA": "українська (Україна)", - "language.ur": "اردو", - "language.ur_IN": "اردو (بھارت)", - "language.ur_PK": "اردو (پاکستان)", - "language.uz": "Ўзбек", - "language.uz_Arab": "اۉزبېک (Arab)", - "language.uz_Arab_AF": "اۉزبېک (Arab, افغانستان)", - "language.uz_Cyrl": "Ўзбек (Cyrl)", - "language.uz_Cyrl_UZ": "Ўзбек (Cyrl, Ўзбекистон)", - "language.uz_Latn": "oʼzbekcha (Lotin)", - "language.uz_Latn_UZ": "oʼzbekcha (Lotin, Oʼzbekiston)", - "language.vai": "ꕙꔤ", - "language.vai_Latn": "Vai (Latn)", - "language.vai_Latn_LR": "Vai (Latn, Laibhiya)", - "language.vai_Vaii": "ꕙꔤ (Vaii)", - "language.vai_Vaii_LR": "ꕙꔤ (Vaii, ꕞꔤꔫꕩ)", - "language.vi": "Tiếng Việt", - "language.vi_VN": "Tiếng Việt (Việt Nam)", - "language.vun": "Kyivunjo", - "language.vun_TZ": "Kyivunjo (Tanzania)", - "language.xog": "Olusoga", - "language.xog_UG": "Olusoga (Yuganda)", - "language.yav": "nuasue", - "language.yav_CM": "nuasue (Kemelún)", - "language.yo": "Èdè Yorùbá", - "language.yo_NG": "Èdè Yorùbá (Orílẹ́ède Nàìjíríà)", - "language.zh": "中文", - "language.zh_Hans": "中文(简体中文)", - "language.zh_Hans_CN": "中文(简体中文、中国)", - "language.zh_Hans_HK": "中文(简体中文、中国香港特别行政区)", - "language.zh_Hans_MO": "中文(简体中文、中国澳门特别行政区)", - "language.zh_Hans_SG": "中文(简体中文、新加坡)", - "language.zh_Hant": "中文(繁體中文)", - "language.zh_Hant_HK": "中文(繁體中文,中華人民共和國香港特別行政區)", - "language.zh_Hant_MO": "中文(繁體中文,中華人民共和國澳門特別行政區)", - "language.zh_Hant_TW": "中文(繁體中文,台灣)", - "language.zu": "isiZulu", - "language.zu_ZA": "isiZulu (iNingizimu Afrika)", - - "pageNotFound": "Page not found" - } \ No newline at end of file + "components.DownloadDb.download": "Instalação em progresso...", + "components.DownloadDb.text": "Isto pode demorar um minuto ou mais. Obrigado pela sua paciência.", + "form.advanced.description": "Configure as suas definições avançadas.", + "form.advanced.item.admin": "Admin dashboard url", + "form.advanced.item.prefix": "Prefix API", + "form.advanced.name": "Avançado", + "form.application.description": "Configure as definições de sua aplicação.", + "form.application.item.description": "Descrição", + "form.application.item.name": "Nome", + "form.application.item.version": "Versão", + "form.application.name": "Aplicação", + "form.button.cancel": "Cancelar", + "form.button.confirm": "Confirmar", + "form.button.save": "Guardar", + "form.database.item.authenticationDatabase": "Base de Dados de Autenticação", + "form.database.item.client": "Cliente", + "form.database.item.connector": "Conector", + "form.database.item.database": "Base de dados", + "form.database.item.default": "Definir como conexão padrão", + "form.database.item.host": "Host", + "form.database.item.name": "Nome da conexão", + "form.database.item.password": "Palavra-passe", + "form.database.item.port": "Porta", + "form.database.item.provider.mongo": "Mongo", + "form.database.item.provider.mysql": "MySQL", + "form.database.item.provider.postgres": "PostgresSQL", + "form.database.item.provider.redis": "Redis", + "form.database.item.ssl": "SSL", + "form.database.item.username": "Nomde de Utilizador", + "form.databases.description": "Configure as definições de sua base de dados por ambiente.", + "form.databases.name": "Base de dados", + "form.language.choose": "Escolha um idioma:", + "form.language.description": "Configure seus idiomas.", + "form.language.name": "Idimoas", + "form.request.description": "Configure as suas definições de requisição.", + "form.request.item.logger": "Logger", + "form.request.item.logger.exposeInContext": "Expor em contexto", + "form.request.item.logger.level": "Nível", + "form.request.item.logger.requests": "Requisições", + "form.request.item.parser": "Parser", + "form.request.item.parser.multipart": "Parser Multipart", + "form.request.item.prefix": "Prefix", + "form.request.item.prefix.prefix": "Prefixo", + "form.request.item.router": "Roteador", + "form.request.item.router.prefix": "Prefixo", + "form.request.name": "Requisição", + "form.response.description": "Configure as suas definições de resposta.", + "form.response.item.gzip.enabled": "Gzip", + "form.response.item.responseTime.enabled": "Tempo de resposta", + "form.response.name": "Resposta", + "form.security.description": "Configure as suas definições de segurança.", + "form.security.item.cors": "Cors", + "form.security.item.cors.origin": "Origem", + "form.security.item.csrf": "CSRF", + "form.security.item.csrf.angular": "Angular", + "form.security.item.csrf.cookie": "Cookie", + "form.security.item.csrf.key": "Chave", + "form.security.item.csrf.secret": "Secreta", + "form.security.item.hsts": "HOSTS", + "form.security.item.hsts.includeSubDomains": "Incluir Sub Domínio", + "form.security.item.hsts.maxAge": "Idade máxima", + "form.security.item.hsts.preload": "Pré-carregar", + "form.security.item.p3p": "P3P", + "form.security.item.p3p.value": "Valor", + "form.security.item.session": "Sessão", + "form.security.item.session.key": "Chave Secreta", + "form.security.item.session.maxAge": "Idade máxima", + "form.security.item.xframe": "Xframe", + "form.security.item.xframe.allow-from": "PERMITIR-DE", + "form.security.item.xframe.deny": "NEGAR", + "form.security.item.xframe.sameorigin": "MESMAORIGEM", + "form.security.item.xframe.value": "Opções", + "form.security.item.xssProtection": "xss Proteção", + "form.security.item.xssProtection.mode": "Modo", + "form.security.name": "Segurança", + "form.server.description": "Configure as suas definições de servidor.", + "form.server.item.cron": "Cron", + "form.server.item.host": "Host", + "form.server.item.port": "Port", + "form.server.name": "Servidor", + "language.af": "Afrikaans", + "language.af_NA": "Afrikaans (Namibië)", + "language.af_ZA": "Afrikaans (Suid-Afrika)", + "language.agq": "Aghem", + "language.agq_CM": "Aghem (Kàmàlûŋ)", + "language.ak": "Akan", + "language.ak_GH": "Akan (Gaana)", + "language.am": "አማርኛ", + "language.am_ET": "አማርኛ (ኢትዮጵያ)", + "language.ar": "العربية", + "language.ar_001": "العربية (العالم)", + "language.ar_AE": "العربية (الإمارات العربية المتحدة)", + "language.ar_BH": "العربية (البحرين)", + "language.ar_DZ": "العربية (الجزائر)", + "language.ar_EG": "العربية (مصر)", + "language.ar_IQ": "العربية (العراق)", + "language.ar_JO": "العربية (الأردن)", + "language.ar_KW": "العربية (الكويت)", + "language.ar_LB": "العربية (لبنان)", + "language.ar_LY": "العربية (ليبيا)", + "language.ar_MA": "العربية (المغرب)", + "language.ar_OM": "العربية (عُمان)", + "language.ar_QA": "العربية (قطر)", + "language.ar_SA": "العربية (المملكة العربية السعودية)", + "language.ar_SD": "العربية (السودان)", + "language.ar_SY": "العربية (سوريا)", + "language.ar_TN": "العربية (تونس)", + "language.ar_YE": "العربية (اليمن)", + "language.as": "অসমীয়া", + "language.as_IN": "অসমীয়া (ভাৰত)", + "language.asa": "Kipare", + "language.asa_TZ": "Kipare (Tadhania)", + "language.az": "azərbaycanca", + "language.az_Cyrl": "Азәрбајҹан (kiril)", + "language.az_Cyrl_AZ": "Азәрбајҹан (kiril, Азәрбајҹан)", + "language.az_Latn": "azərbaycanca (latın)", + "language.az_Latn_AZ": "azərbaycanca (latın, Azərbaycan)", + "language.bas": "Ɓàsàa", + "language.bas_CM": "Ɓàsàa (Kàmɛ̀rûn)", + "language.be": "беларуская", + "language.be_BY": "беларуская (Беларусь)", + "language.bem": "Ichibemba", + "language.bem_ZM": "Ichibemba (Zambia)", + "language.bez": "Hibena", + "language.bez_TZ": "Hibena (Hutanzania)", + "language.bg": "български", + "language.bg_BG": "български (България)", + "language.bm": "bamanakan", + "language.bm_ML": "bamanakan (Mali)", + "language.bn": "বাংলা", + "language.bn_BD": "বাংলা (বাংলাদেশ)", + "language.bn_IN": "বাংলা (ভারত)", + "language.bo": "པོད་སྐད་", + "language.bo_CN": "པོད་སྐད་ (རྒྱ་ནག)", + "language.bo_IN": "པོད་སྐད་ (རྒྱ་གར་)", + "language.br": "brezhoneg", + "language.br_FR": "brezhoneg (Frañs)", + "language.brx": "बड़ो", + "language.brx_IN": "बड़ो (भारत)", + "language.bs": "bosanski", + "language.bs_BA": "bosanski (Bosna i Hercegovina)", + "language.ca": "català", + "language.ca_ES": "català (Espanya)", + "language.cgg": "Rukiga", + "language.cgg_UG": "Rukiga (Uganda)", + "language.chr": "ᏣᎳᎩ", + "language.chr_US": "ᏣᎳᎩ (ᎠᎹᏰᏟ)", + "language.cs": "čeština", + "language.cs_CZ": "čeština (Česká republika)", + "language.cy": "Cymraeg", + "language.cy_GB": "Cymraeg (Prydain Fawr)", + "language.da": "dansk", + "language.da_DK": "dansk (Danmark)", + "language.dav": "Kitaita", + "language.dav_KE": "Kitaita (Kenya)", + "language.de": "Deutsch", + "language.de_AT": "Deutsch (Österreich)", + "language.de_BE": "Deutsch (Belgien)", + "language.de_CH": "Deutsch (Schweiz)", + "language.de_DE": "Deutsch (Deutschland)", + "language.de_LI": "Deutsch (Liechtenstein)", + "language.de_LU": "Deutsch (Luxemburg)", + "language.dje": "Zarmaciine", + "language.dje_NE": "Zarmaciine (Nižer)", + "language.dua": "duálá", + "language.dua_CM": "duálá (Cameroun)", + "language.dyo": "joola", + "language.dyo_SN": "joola (Senegal)", + "language.ebu": "Kĩembu", + "language.ebu_KE": "Kĩembu (Kenya)", + "language.ee": "eʋegbe", + "language.ee_GH": "eʋegbe (Ghana nutome)", + "language.ee_TG": "eʋegbe (Togo nutome)", + "language.el": "Ελληνικά", + "language.el_CY": "Ελληνικά (Κύπρος)", + "language.el_GR": "Ελληνικά (Ελλάδα)", + "language.en": "English", + "language.en_AS": "English (American Samoa)", + "language.en_AU": "English (Australia)", + "language.en_BB": "English (Barbados)", + "language.en_BE": "English (Belgium)", + "language.en_BM": "English (Bermuda)", + "language.en_BW": "English (Botswana)", + "language.en_BZ": "English (Belize)", + "language.en_CA": "English (Canada)", + "language.en_GB": "English (United Kingdom)", + "language.en_GU": "English (Guam)", + "language.en_GY": "English (Guyana)", + "language.en_HK": "English (Hong Kong SAR China)", + "language.en_IE": "English (Ireland)", + "language.en_IN": "English (India)", + "language.en_JM": "English (Jamaica)", + "language.en_MH": "English (Marshall Islands)", + "language.en_MP": "English (Northern Mariana Islands)", + "language.en_MT": "English (Malta)", + "language.en_MU": "English (Mauritius)", + "language.en_NA": "English (Namibia)", + "language.en_NZ": "English (New Zealand)", + "language.en_PH": "English (Philippines)", + "language.en_PK": "English (Pakistan)", + "language.en_SG": "English (Singapore)", + "language.en_TT": "English (Trinidad and Tobago)", + "language.en_UM": "English (U.S. Minor Outlying Islands)", + "language.en_US": "English (United States)", + "language.en_US_POSIX": "English (United States, Computer)", + "language.en_VI": "English (U.S. Virgin Islands)", + "language.en_ZA": "English (South Africa)", + "language.en_ZW": "English (Zimbabwe)", + "language.eo": "esperanto", + "language.es": "español", + "language.es_419": "español (Latinoamérica)", + "language.es_AR": "español (Argentina)", + "language.es_BO": "español (Bolivia)", + "language.es_CL": "español (Chile)", + "language.es_CO": "español (Colombia)", + "language.es_CR": "español (Costa Rica)", + "language.es_DO": "español (República Dominicana)", + "language.es_EC": "español (Ecuador)", + "language.es_ES": "español (España)", + "language.es_GQ": "español (Guinea Ecuatorial)", + "language.es_GT": "español (Guatemala)", + "language.es_HN": "español (Honduras)", + "language.es_MX": "español (México)", + "language.es_NI": "español (Nicaragua)", + "language.es_PA": "español (Panamá)", + "language.es_PE": "español (Perú)", + "language.es_PR": "español (Puerto Rico)", + "language.es_PY": "español (Paraguay)", + "language.es_SV": "español (El Salvador)", + "language.es_US": "español (Estados Unidos)", + "language.es_UY": "español (Uruguay)", + "language.es_VE": "español (Venezuela)", + "language.et": "eesti", + "language.et_EE": "eesti (Eesti)", + "language.eu": "euskara", + "language.eu_ES": "euskara (Espainia)", + "language.ewo": "ewondo", + "language.ewo_CM": "ewondo (Kamǝrún)", + "language.fa": "فارسی", + "language.fa_AF": "دری (افغانستان)", + "language.fa_IR": "فارسی (ایران)", + "language.ff": "Pulaar", + "language.ff_SN": "Pulaar (Senegaal)", + "language.fi": "suomi", + "language.fi_FI": "suomi (Suomi)", + "language.fil": "Filipino", + "language.fil_PH": "Filipino (Pilipinas)", + "language.fo": "føroyskt", + "language.fo_FO": "føroyskt (Føroyar)", + "language.fr": "français", + "language.fr_BE": "français (Belgique)", + "language.fr_BF": "français (Burkina Faso)", + "language.fr_BI": "français (Burundi)", + "language.fr_BJ": "français (Bénin)", + "language.fr_BL": "français (Saint-Barthélémy)", + "language.fr_CA": "français (Canada)", + "language.fr_CD": "français (République démocratique du Congo)", + "language.fr_CF": "français (République centrafricaine)", + "language.fr_CG": "français (Congo-Brazzaville)", + "language.fr_CH": "français (Suisse)", + "language.fr_CI": "français (Côte d’Ivoire)", + "language.fr_CM": "français (Cameroun)", + "language.fr_DJ": "français (Djibouti)", + "language.fr_FR": "français (France)", + "language.fr_GA": "français (Gabon)", + "language.fr_GF": "français (Guyane française)", + "language.fr_GN": "français (Guinée)", + "language.fr_GP": "français (Guadeloupe)", + "language.fr_GQ": "français (Guinée équatoriale)", + "language.fr_KM": "français (Comores)", + "language.fr_LU": "français (Luxembourg)", + "language.fr_MC": "français (Monaco)", + "language.fr_MF": "français (Saint-Martin)", + "language.fr_MG": "français (Madagascar)", + "language.fr_ML": "français (Mali)", + "language.fr_MQ": "français (Martinique)", + "language.fr_NE": "français (Niger)", + "language.fr_RE": "français (Réunion)", + "language.fr_RW": "français (Rwanda)", + "language.fr_SN": "français (Sénégal)", + "language.fr_TD": "français (Tchad)", + "language.fr_TG": "français (Togo)", + "language.fr_YT": "français (Mayotte)", + "language.ga": "Gaeilge", + "language.ga_IE": "Gaeilge (Éire)", + "language.gl": "galego", + "language.gl_ES": "galego (España)", + "language.gsw": "Schwiizertüütsch", + "language.gsw_CH": "Schwiizertüütsch (Schwiiz)", + "language.gu": "ગુજરાતી", + "language.gu_IN": "ગુજરાતી (ભારત)", + "language.guz": "Ekegusii", + "language.guz_KE": "Ekegusii (Kenya)", + "language.gv": "Gaelg", + "language.gv_GB": "Gaelg (Rywvaneth Unys)", + "language.ha": "Hausa", + "language.ha_Latn": "Hausa (Latn)", + "language.ha_Latn_GH": "Hausa (Latn, Gana)", + "language.ha_Latn_NE": "Hausa (Latn, Nijar)", + "language.ha_Latn_NG": "Hausa (Latn, Najeriya)", + "language.haw": "ʻŌlelo Hawaiʻi", + "language.haw_US": "ʻŌlelo Hawaiʻi (ʻAmelika Hui Pū ʻIa)", + "language.he": "עברית", + "language.he_IL": "עברית (ישראל)", + "language.hi": "हिन्दी", + "language.hi_IN": "हिन्दी (भारत)", + "language.hr": "hrvatski", + "language.hr_HR": "hrvatski (Hrvatska)", + "language.hu": "magyar", + "language.hu_HU": "magyar (Magyarország)", + "language.hy": "Հայերէն", + "language.hy_AM": "Հայերէն (Հայաստանի Հանրապետութիւն)", + "language.id": "Bahasa Indonesia", + "language.id_ID": "Bahasa Indonesia (Indonesia)", + "language.ig": "Igbo", + "language.ig_NG": "Igbo (Nigeria)", + "language.ii": "ꆈꌠꉙ", + "language.ii_CN": "ꆈꌠꉙ (ꍏꇩ)", + "language.is": "íslenska", + "language.is_IS": "íslenska (Ísland)", + "language.it": "italiano", + "language.it_CH": "italiano (Svizzera)", + "language.it_IT": "italiano (Italia)", + "language.ja": "日本語", + "language.ja_JP": "日本語(日本)", + "language.jmc": "Kimachame", + "language.jmc_TZ": "Kimachame (Tanzania)", + "language.ka": "ქართული", + "language.ka_GE": "ქართული (საქართველო)", + "language.kab": "Taqbaylit", + "language.kab_DZ": "Taqbaylit (Lezzayer)", + "language.kam": "Kikamba", + "language.kam_KE": "Kikamba (Kenya)", + "language.kde": "Chimakonde", + "language.kde_TZ": "Chimakonde (Tanzania)", + "language.kea": "kabuverdianu", + "language.kea_CV": "kabuverdianu (Kabu Verdi)", + "language.khq": "Koyra ciini", + "language.khq_ML": "Koyra ciini (Maali)", + "language.ki": "Gikuyu", + "language.ki_KE": "Gikuyu (Kenya)", + "language.kk": "қазақ тілі", + "language.kk_Cyrl": "қазақ тілі (кириллица)", + "language.kk_Cyrl_KZ": "қазақ тілі (кириллица, Қазақстан)", + "language.kl": "kalaallisut", + "language.kl_GL": "kalaallisut (Kalaallit Nunaat)", + "language.kln": "Kalenjin", + "language.kln_KE": "Kalenjin (Emetab Kenya)", + "language.km": "ភាសាខ្មែរ", + "language.km_KH": "ភាសាខ្មែរ (កម្ពុជា)", + "language.kn": "ಕನ್ನಡ", + "language.kn_IN": "ಕನ್ನಡ (ಭಾರತ)", + "language.ko": "한국어", + "language.ko_KR": "한국어(대한민국)", + "language.kok": "कोंकणी", + "language.kok_IN": "कोंकणी (भारत)", + "language.ksb": "Kishambaa", + "language.ksb_TZ": "Kishambaa (Tanzania)", + "language.ksf": "rikpa", + "language.ksf_CM": "rikpa (kamɛrún)", + "language.kw": "kernewek", + "language.kw_GB": "kernewek (Rywvaneth Unys)", + "language.lag": "Kɨlaangi", + "language.lag_TZ": "Kɨlaangi (Taansanía)", + "language.lg": "Luganda", + "language.lg_UG": "Luganda (Yuganda)", + "language.ln": "lingála", + "language.ln_CD": "lingála (Repibiki demokratiki ya Kongó)", + "language.ln_CG": "lingála (Kongo)", + "language.lt": "lietuvių", + "language.lt_LT": "lietuvių (Lietuva)", + "language.lu": "Tshiluba", + "language.lu_CD": "Tshiluba (Ditunga wa Kongu)", + "language.luo": "Dholuo", + "language.luo_KE": "Dholuo (Kenya)", + "language.luy": "Luluhia", + "language.luy_KE": "Luluhia (Kenya)", + "language.lv": "latviešu", + "language.lv_LV": "latviešu (Latvija)", + "language.mas": "Maa", + "language.mas_KE": "Maa (Kenya)", + "language.mas_TZ": "Maa (Tansania)", + "language.mer": "Kĩmĩrũ", + "language.mer_KE": "Kĩmĩrũ (Kenya)", + "language.mfe": "kreol morisien", + "language.mfe_MU": "kreol morisien (Moris)", + "language.mg": "Malagasy", + "language.mg_MG": "Malagasy (Madagasikara)", + "language.mgh": "Makua", + "language.mgh_MZ": "Makua (Umozambiki)", + "language.mk": "македонски", + "language.mk_MK": "македонски (Македонија)", + "language.ml": "മലയാളം", + "language.ml_IN": "മലയാളം (ഇന്ത്യ)", + "language.mr": "मराठी", + "language.mr_IN": "मराठी (भारत)", + "language.ms": "Bahasa Melayu", + "language.ms_BN": "Bahasa Melayu (Brunei)", + "language.ms_MY": "Bahasa Melayu (Malaysia)", + "language.mt": "Malti", + "language.mt_MT": "Malti (Malta)", + "language.mua": "MUNDAŊ", + "language.mua_CM": "MUNDAŊ (kameruŋ)", + "language.my": "ဗမာ", + "language.my_MM": "ဗမာ (မြန်မာ)", + "language.naq": "Khoekhoegowab", + "language.naq_NA": "Khoekhoegowab (Namibiab)", + "language.nb": "norsk bokmål", + "language.nb_NO": "norsk bokmål (Norge)", + "language.nd": "isiNdebele", + "language.nd_ZW": "isiNdebele (Zimbabwe)", + "language.ne": "नेपाली", + "language.ne_IN": "नेपाली (भारत)", + "language.ne_NP": "नेपाली (नेपाल)", + "language.nl": "Nederlands", + "language.nl_AW": "Nederlands (Aruba)", + "language.nl_BE": "Nederlands (België)", + "language.nl_CW": "Nederlands (Curaçao)", + "language.nl_NL": "Nederlands (Nederland)", + "language.nl_SX": "Nederlands (Sint Maarten)", + "language.nmg": "nmg", + "language.nmg_CM": "nmg (Kamerun)", + "language.nn": "nynorsk", + "language.nn_NO": "nynorsk (Noreg)", + "language.nus": "Thok Nath", + "language.nus_SD": "Thok Nath (Sudan)", + "language.nyn": "Runyankore", + "language.nyn_UG": "Runyankore (Uganda)", + "language.om": "Oromoo", + "language.om_ET": "Oromoo (Itoophiyaa)", + "language.om_KE": "Oromoo (Keeniyaa)", + "language.or": "ଓଡ଼ିଆ", + "language.or_IN": "ଓଡ଼ିଆ (ଭାରତ)", + "language.pa": "ਪੰਜਾਬੀ", + "language.pa_Arab": "پنجاب (العربية)", + "language.pa_Arab_PK": "پنجاب (العربية, پکستان)", + "language.pa_Guru": "ਪੰਜਾਬੀ (Guru)", + "language.pa_Guru_IN": "ਪੰਜਾਬੀ (Guru, ਭਾਰਤ)", + "language.pl": "polski", + "language.pl_PL": "polski (Polska)", + "language.ps": "پښتو", + "language.ps_AF": "پښتو (افغانستان)", + "language.pt": "português", + "language.pt_AO": "português (Angola)", + "language.pt_BR": "português (Brasil)", + "language.pt_GW": "português (Guiné Bissau)", + "language.pt_MZ": "português (Moçambique)", + "language.pt_PT": "português (Portugal)", + "language.pt_ST": "português (São Tomé e Príncipe)", + "language.rm": "rumantsch", + "language.rm_CH": "rumantsch (Svizra)", + "language.rn": "Ikirundi", + "language.rn_BI": "Ikirundi (Uburundi)", + "language.ro": "română", + "language.ro_MD": "română (Republica Moldova)", + "language.ro_RO": "română (România)", + "language.rof": "Kihorombo", + "language.rof_TZ": "Kihorombo (Tanzania)", + "language.ru": "русский", + "language.ru_MD": "русский (Молдова)", + "language.ru_RU": "русский (Россия)", + "language.ru_UA": "русский (Украина)", + "language.rw": "Kinyarwanda", + "language.rw_RW": "Kinyarwanda (Rwanda)", + "language.rwk": "Kiruwa", + "language.rwk_TZ": "Kiruwa (Tanzania)", + "language.saq": "Kisampur", + "language.saq_KE": "Kisampur (Kenya)", + "language.sbp": "Ishisangu", + "language.sbp_TZ": "Ishisangu (Tansaniya)", + "language.seh": "sena", + "language.seh_MZ": "sena (Moçambique)", + "language.ses": "Koyraboro senni", + "language.ses_ML": "Koyraboro senni (Maali)", + "language.sg": "Sängö", + "language.sg_CF": "Sängö (Ködörösêse tî Bêafrîka)", + "language.shi": "tamazight", + "language.shi_Latn": "tamazight (Latn)", + "language.shi_Latn_MA": "tamazight (Latn, lmɣrib)", + "language.shi_Tfng": "ⵜⴰⵎⴰⵣⵉⵖⵜ (Tfng)", + "language.shi_Tfng_MA": "ⵜⴰⵎⴰⵣⵉⵖⵜ (Tfng, ⵍⵎⵖⵔⵉⴱ)", + "language.si": "සිංහල", + "language.si_LK": "සිංහල (ශ්‍රී ලංකාව)", + "language.sk": "slovenčina", + "language.sk_SK": "slovenčina (Slovenská republika)", + "language.sl": "slovenščina", + "language.sl_SI": "slovenščina (Slovenija)", + "language.sn": "chiShona", + "language.sn_ZW": "chiShona (Zimbabwe)", + "language.so": "Soomaali", + "language.so_DJ": "Soomaali (Jabuuti)", + "language.so_ET": "Soomaali (Itoobiya)", + "language.so_KE": "Soomaali (Kiiniya)", + "language.so_SO": "Soomaali (Soomaaliya)", + "language.sq": "shqip", + "language.sq_AL": "shqip (Shqipëria)", + "language.sr": "Српски", + "language.sr_Cyrl": "Српски (Ћирилица)", + "language.sr_Cyrl_BA": "Српски (Ћирилица, Босна и Херцеговина)", + "language.sr_Cyrl_ME": "Српски (Ћирилица, Црна Гора)", + "language.sr_Cyrl_RS": "Српски (Ћирилица, Србија)", + "language.sr_Latn": "Srpski (Latinica)", + "language.sr_Latn_BA": "Srpski (Latinica, Bosna i Hercegovina)", + "language.sr_Latn_ME": "Srpski (Latinica, Crna Gora)", + "language.sr_Latn_RS": "Srpski (Latinica, Srbija)", + "language.sv": "svenska", + "language.sv_FI": "svenska (Finland)", + "language.sv_SE": "svenska (Sverige)", + "language.sw": "Kiswahili", + "language.sw_KE": "Kiswahili (Kenya)", + "language.sw_TZ": "Kiswahili (Tanzania)", + "language.swc": "Kiswahili ya Kongo", + "language.swc_CD": "Kiswahili ya Kongo (Jamhuri ya Kidemokrasia ya Kongo)", + "language.ta": "தமிழ்", + "language.ta_IN": "தமிழ் (இந்தியா)", + "language.ta_LK": "தமிழ் (இலங்கை)", + "language.te": "తెలుగు", + "language.te_IN": "తెలుగు (భారత దేశం)", + "language.teo": "Kiteso", + "language.teo_KE": "Kiteso (Kenia)", + "language.teo_UG": "Kiteso (Uganda)", + "language.th": "ไทย", + "language.th_TH": "ไทย (ไทย)", + "language.ti": "ትግርኛ", + "language.ti_ER": "ትግርኛ (ER)", + "language.ti_ET": "ትግርኛ (ET)", + "language.to": "lea fakatonga", + "language.to_TO": "lea fakatonga (Tonga)", + "language.tr": "Türkçe", + "language.tr_TR": "Türkçe (Türkiye)", + "language.twq": "Tasawaq senni", + "language.twq_NE": "Tasawaq senni (Nižer)", + "language.tzm": "Tamaziɣt", + "language.tzm_Latn": "Tamaziɣt (Latn)", + "language.tzm_Latn_MA": "Tamaziɣt (Latn, Meṛṛuk)", + "language.uk": "українська", + "language.uk_UA": "українська (Україна)", + "language.ur": "اردو", + "language.ur_IN": "اردو (بھارت)", + "language.ur_PK": "اردو (پاکستان)", + "language.uz": "Ўзбек", + "language.uz_Arab": "اۉزبېک (Arab)", + "language.uz_Arab_AF": "اۉزبېک (Arab, افغانستان)", + "language.uz_Cyrl": "Ўзбек (Cyrl)", + "language.uz_Cyrl_UZ": "Ўзбек (Cyrl, Ўзбекистон)", + "language.uz_Latn": "oʼzbekcha (Lotin)", + "language.uz_Latn_UZ": "oʼzbekcha (Lotin, Oʼzbekiston)", + "language.vai": "ꕙꔤ", + "language.vai_Latn": "Vai (Latn)", + "language.vai_Latn_LR": "Vai (Latn, Laibhiya)", + "language.vai_Vaii": "ꕙꔤ (Vaii)", + "language.vai_Vaii_LR": "ꕙꔤ (Vaii, ꕞꔤꔫꕩ)", + "language.vi": "Tiếng Việt", + "language.vi_VN": "Tiếng Việt (Việt Nam)", + "language.vun": "Kyivunjo", + "language.vun_TZ": "Kyivunjo (Tanzania)", + "language.xog": "Olusoga", + "language.xog_UG": "Olusoga (Yuganda)", + "language.yav": "nuasue", + "language.yav_CM": "nuasue (Kemelún)", + "language.yo": "Èdè Yorùbá", + "language.yo_NG": "Èdè Yorùbá (Orílẹ́ède Nàìjíríà)", + "language.zh": "中文", + "language.zh_Hans": "中文(简体中文)", + "language.zh_Hans_CN": "中文(简体中文、中国)", + "language.zh_Hans_HK": "中文(简体中文、中国香港特别行政区)", + "language.zh_Hans_MO": "中文(简体中文、中国澳门特别行政区)", + "language.zh_Hans_SG": "中文(简体中文、新加坡)", + "language.zh_Hant": "中文(繁體中文)", + "language.zh_Hant_HK": "中文(繁體中文,中華人民共和國香港特別行政區)", + "language.zh_Hant_MO": "中文(繁體中文,中華人民共和國澳門特別行政區)", + "language.zh_Hant_TW": "中文(繁體中文,台灣)", + "language.zu": "isiZulu", + "language.zu_ZA": "isiZulu (iNingizimu Afrika)", + "list.databases.button.label": "Adicionar uma nova conexão", + "list.databases.title.plural": "conexões neste ambiente", + "list.databases.title.singular": "conexão neste ambiente", + "list.languages.button.label": "Adicionar um novo idioma", + "list.languages.default.languages": "Idioma predefinido", + "list.languages.set.languages": "Definir como padrão", + "list.languages.title.plural": "idiomas estão disponíveis", + "list.languages.title.singular": "idioma está disponível", + "menu.item.advanced": "Avançado", + "menu.item.application": "Aplicação", + "menu.item.database": "Base de dados", + "menu.item.languages": "Idiomas", + "menu.item.request": "Requisição", + "menu.item.response": "Resposta", + "menu.item.security": "Segurança", + "menu.item.server": "Servidor", + "menu.section.environments": "Ambientes", + "menu.section.global-settings": "Definições gerais", + "pageNotFound": "Page not found", + "plugin.description.long": "Configure seu projecto em segundos.", + "plugin.description.short": "Configure seu projecto em segundos.", + "popUpWarning.danger.ok.message": "Eu Entendo", + "popUpWarning.databases.danger.message": "Os Tipos de Conteúdos ainda estão vinculados a esta conexão. Ao removê-los, você poderá causar problemas críticos à sua aplicação. Seja cuidadoso...", + "popUpWarning.databases.delete.message": "Tem a certeza de que pretende apagar esta base de dados?", + "popUpWarning.languages.delete.message": "Tem a certeza de que pretende apagar este idioma?", + "popUpWarning.title": "Por favor, confirme", + "request.error.config": "O arquivo de configuração não existe.", + "request.error.database.exist": "Esta conexão já existe", + "request.error.database.unknow": "Nenhuma conexão", + "request.error.environment.required": "O ambiente é obrigatório.", + "request.error.environment.unknow": "O Ambiente é desconhecido.", + "request.error.languages.exist": "O idioma já existe.", + "request.error.languages.incorrect": "Este idioma está incorrecto.", + "request.error.languages.unknow": "Este idioma não existe.", + "request.error.type.boolean": "Um booleano é obrigatório.", + "request.error.type.number": "Um número é obrigatório.", + "request.error.type.select": "O valor deve estar na lista predefinida.", + "request.error.type.string": "Um texto é obrigatório.", + "request.error.validation.max": "O valor é muito alto.", + "request.error.validation.maxLength": "O valor é muito longo.", + "request.error.validation.min": "O valor é muito baixo.", + "request.error.validation.minLength": "O valor é muito curto.", + "request.error.validation.regex": "O valor não corresponde ao regex.", + "request.error.validation.required": "Este valor é obrigatório.", + "strapi.notification.error": "Ocorreu um erro", + "strapi.notification.info.serverRestart": "O servidor irá reiniciar", + "strapi.notification.info.settingsEqual": "Configurações são iguais", + "strapi.notification.success.databaseAdd": "A base de dados foi adicionada com sucesso.", + "strapi.notification.success.databaseDelete": "A base de dados foi excluida com sucesso.", + "strapi.notification.success.databaseDeleted": "A base de dados foi apagada.", + "strapi.notification.success.databaseEdit": "As configurações da base de dados foram actualizadas com sucesso.", + "strapi.notification.success.languageAdd": "O idioma foi adicionado com sucesso.", + "strapi.notification.success.languageDelete": "O idioma foi excluido com sucesso.", + "strapi.notification.success.settingsEdit": "As configurações foram actualizadas com sucesso." +} \ No newline at end of file diff --git a/packages/strapi-plugin-settings-manager/admin/src/translations/ru.json b/packages/strapi-plugin-settings-manager/admin/src/translations/ru.json index 88519ec44c..cf896316b6 100644 --- a/packages/strapi-plugin-settings-manager/admin/src/translations/ru.json +++ b/packages/strapi-plugin-settings-manager/admin/src/translations/ru.json @@ -1,162 +1,84 @@ { "components.DownloadDb.download": "Установка в процессе...", "components.DownloadDb.text": "Это может занять около минуты. Спасибо за ваше терпение.", - "plugin.description.short": "Настройте ваш проект в течении считаных секунд.", - "plugin.description.long": "Настройте ваш проект в течении считаных секунд.", - "menu.section.global-settings": "Глобальные настройки", - "menu.item.application": "Приложение", - "menu.item.languages": "Языки", - "menu.item.advanced": "Расширенные", - - "menu.section.environments": "Окружения приложения", - "menu.item.database": "База данных", - "menu.item.request": "Запрос", - "menu.item.response": "Ответ", - "menu.item.security": "Безопасность", - "menu.item.server": "Сервер", - - "form.button.cancel": "Отменить", - "form.button.save": "Сохранить", - "form.button.confirm": "Подтвердить", - - "form.databases.name": "База данных", - "form.databases.description": "Настройки базы данных в зависимости от окружения.", - - "form.database.item.name": "Название соединения", - "form.database.item.client": "Клиент", - "form.database.item.connector": "Коннектор", - "form.database.item.host": "Хост", - "form.database.item.port": "Порт", - "form.database.item.username": "Имя пользователя", - "form.database.item.password": "Пароль", - "form.database.item.database": "Базы данных", - "form.database.item.default": "Задать как стандартное значение", - "form.database.item.provider.mongo": "Mongo", - "form.database.item.provider.postgres": "PostgresSQL", - "form.database.item.provider.mysql": "MySQL", - "form.database.item.provider.redis": "Redis", - "form.database.item.ssl": "SSL", - "form.database.item.authenticationDatabase": "База данных аутентификации", - - "form.application.name": "Приложение", - "form.application.description": "Зайдайте настройки вашего приложения.", - - "form.application.item.name": "Название", - "form.application.item.description": "Описание", - "form.application.item.version": "Версия", - - "form.advanced.name": "Расширенные", "form.advanced.description": "Задайте расширенные настройки.", - "form.advanced.item.admin": "URL-адрес панели администратора", "form.advanced.item.prefix": "Приставка API", - - "form.request.name": "Запрос", + "form.advanced.name": "Расширенные", + "form.application.description": "Зайдайте настройки вашего приложения.", + "form.application.item.description": "Описание", + "form.application.item.name": "Название", + "form.application.item.version": "Версия", + "form.application.name": "Приложение", + "form.button.cancel": "Отменить", + "form.button.confirm": "Подтвердить", + "form.button.save": "Сохранить", + "form.database.item.authenticationDatabase": "База данных аутентификации", + "form.database.item.client": "Клиент", + "form.database.item.connector": "Коннектор", + "form.database.item.database": "Базы данных", + "form.database.item.default": "Задать как стандартное значение", + "form.database.item.host": "Хост", + "form.database.item.name": "Название соединения", + "form.database.item.password": "Пароль", + "form.database.item.port": "Порт", + "form.database.item.provider.mongo": "Mongo", + "form.database.item.provider.mysql": "MySQL", + "form.database.item.provider.postgres": "PostgresSQL", + "form.database.item.provider.redis": "Redis", + "form.database.item.ssl": "SSL", + "form.database.item.username": "Имя пользователя", + "form.databases.description": "Настройки базы данных в зависимости от окружения.", + "form.databases.name": "База данных", + "form.language.choose": "Выберите язык:", + "form.language.description": "Настройте ваш язык.", + "form.language.name": "Язык", "form.request.description": "Задайте настройки запроса.", + "form.request.item.logger": "Логирование", + "form.request.item.logger.exposeInContext": "Выводить в контексте", + "form.request.item.logger.level": "Уровень", + "form.request.item.logger.requests": "Запросы", "form.request.item.parser": "Парсер", "form.request.item.parser.multipart": "Парсер Multipart", "form.request.item.prefix": "Приставка", "form.request.item.prefix.prefix": "Приставка", - "form.request.item.logger": "Логирование", - "form.request.item.logger.level": "Уровень", - "form.request.item.logger.exposeInContext": "Выводить в контексте", - "form.request.item.logger.requests": "Запросы", "form.request.item.router": "Роутер", "form.request.item.router.prefix": "Приставка", - - "form.response.name": "Ответ", + "form.request.name": "Запрос", "form.response.description": "Задайте настройки ответа.", "form.response.item.gzip.enabled": "Gzip", "form.response.item.responseTime.enabled": "Время ответа", - - "form.security.name": "Безопасность", + "form.response.name": "Ответ", "form.security.description": "Задайте настройки безопасности.", - + "form.security.item.cors": "Cors", + "form.security.item.cors.origin": "Origin", "form.security.item.csrf": "CSRF", - "form.security.item.p3p": "P3P", - "form.security.item.p3p.value": "Value", - "form.security.item.hsts": "HOSTS", + "form.security.item.csrf.angular": "Angular", + "form.security.item.csrf.cookie": "Cookie", "form.security.item.csrf.key": "Key", "form.security.item.csrf.secret": "Secret", - "form.security.item.csrf.cookie": "Cookie", - "form.security.item.csrf.angular": "Angular", - "form.security.item.hsts.maxAge": "Max Age", + "form.security.item.hsts": "HOSTS", "form.security.item.hsts.includeSubDomains": "Include Sub Domain", + "form.security.item.hsts.maxAge": "Max Age", "form.security.item.hsts.preload": "Preload", - + "form.security.item.p3p": "P3P", + "form.security.item.p3p.value": "Value", "form.security.item.session": "Session", "form.security.item.session.key": "Secret key", "form.security.item.session.maxAge": "Maximum age", - "form.security.item.xframe": "Xframe", - "form.security.item.xframe.value": "Options", + "form.security.item.xframe.allow-from": "ALLOW-FROM", "form.security.item.xframe.deny": "DENY", "form.security.item.xframe.sameorigin": "SAMEORIGIN", - "form.security.item.xframe.allow-from": "ALLOW-FROM", - + "form.security.item.xframe.value": "Options", "form.security.item.xssProtection": "xss Protection", "form.security.item.xssProtection.mode": "Mode", - - "form.security.item.cors": "Cors", - "form.security.item.cors.origin": "Origin", - - "form.server.name": "Сервер", + "form.security.name": "Безопасность", "form.server.description": "Задайте настройки сервера.", - + "form.server.item.cron": "Cron", "form.server.item.host": "Host", "form.server.item.port": "Port", - "form.server.item.cron": "Cron", - - "form.language.name": "Язык", - "form.language.description": "Настройте ваш язык.", - "form.language.choose": "Выберите язык:", - - "request.error.database.exist": "Это соединение уже существует", - "request.error.database.unknow": "Нет такого соединения", - "request.error.type.string": "Текст обязателен.", - "request.error.type.number": "Число обязательно.", - "request.error.type.boolean": "Boolean обязательно.", - "request.error.type.select": "Значение должно присутствовать в заданом списке.", - - "request.error.validation.required": "Значение для этого поля обязательно.", - "request.error.validation.regex": "Не соответствует регулярному выражению.", - "request.error.validation.max": "Слишком большое.", - "request.error.validation.min": "Слишком маленькое.", - "request.error.validation.maxLength": "Слишком длинное.", - "request.error.validation.minLength": "Слишком короткое.", - - "request.error.config": "Файл с настройками отсутствует.", - "request.error.environment.required": "Окружение необходимо.", - "request.error.environment.unknow": "Окружение неизвестно.", - "request.error.languages.exist": "Этот язык уже существует.", - "request.error.languages.unknow": "Этот язык не существует.", - "request.error.languages.incorrect": "Язык задан не правильно.", - - "list.languages.button.label": "Добавить новый языка", - "list.languages.title.singular": "языка доступен", - "list.languages.title.plural": "языка доступны", - "list.languages.default.languages": "Стандартный язык", - "list.languages.set.languages": "Задать как стандартный", - "list.databases.button.label": "Добавить новое соединение", - "list.databases.title.singular": "соединение в этом окружении", - "list.databases.title.plural": "соединения в этом окружении", - - "popUpWarning.title": "Пожалуйта подтвердите", - "popUpWarning.databases.danger.message": "Типы Данных все еще подключены этому соединению. Удалив его, возможна критическая ошибка в приложении. Будте осторожны...", - "popUpWarning.danger.ok.message": "Я понимаю", - "popUpWarning.databases.delete.message": "Вы уверены, что хотите удалить эту базу данных?", - "popUpWarning.languages.delete.message": "Вы уверены, что хотите удалить этот язык?", - "strapi.notification.info.settingsEqual": "Значения идентичны", - "strapi.notification.success.databaseDelete": "База данных успешно удалена.", - "strapi.notification.success.languageDelete": "Язык успешно удалена.", - "strapi.notification.success.languageAdd": "Язык успешно добавлен.", - "strapi.notification.success.databaseAdd": "База данных успешно добавлен.", - "strapi.notification.success.databaseEdit": "Настройки базы данных успешно обновлены.", - "strapi.notification.success.databaseDeleted": "База данных была удалена.", - "strapi.notification.success.settingsEdit": "Настройки успешно обновлены.", - "strapi.notification.error": "Возникла ошибка", - "strapi.notification.info.serverRestart": "Сервер будет перезапущен", - + "form.server.name": "Сервер", "language.af": "Afrikaans", "language.af_NA": "Afrikaans (Namibië)", "language.af_ZA": "Afrikaans (Suid-Afrika)", @@ -651,6 +573,58 @@ "language.zh_Hant_TW": "中文(繁體中文,台灣)", "language.zu": "isiZulu", "language.zu_ZA": "isiZulu (iNingizimu Afrika)", - - "pageNotFound": "Cтраница не найдена" -} + "list.databases.button.label": "Добавить новое соединение", + "list.databases.title.plural": "соединения в этом окружении", + "list.databases.title.singular": "соединение в этом окружении", + "list.languages.button.label": "Добавить новый языка", + "list.languages.default.languages": "Стандартный язык", + "list.languages.set.languages": "Задать как стандартный", + "list.languages.title.plural": "языка доступны", + "list.languages.title.singular": "языка доступен", + "menu.item.advanced": "Расширенные", + "menu.item.application": "Приложение", + "menu.item.database": "База данных", + "menu.item.languages": "Языки", + "menu.item.request": "Запрос", + "menu.item.response": "Ответ", + "menu.item.security": "Безопасность", + "menu.item.server": "Сервер", + "menu.section.environments": "Окружения приложения", + "menu.section.global-settings": "Глобальные настройки", + "pageNotFound": "Cтраница не найдена", + "plugin.description.long": "Настройте ваш проект в течении считаных секунд.", + "plugin.description.short": "Настройте ваш проект в течении считаных секунд.", + "popUpWarning.danger.ok.message": "Я понимаю", + "popUpWarning.databases.danger.message": "Типы Данных все еще подключены этому соединению. Удалив его, возможна критическая ошибка в приложении. Будте осторожны...", + "popUpWarning.databases.delete.message": "Вы уверены, что хотите удалить эту базу данных?", + "popUpWarning.languages.delete.message": "Вы уверены, что хотите удалить этот язык?", + "popUpWarning.title": "Пожалуйта подтвердите", + "request.error.config": "Файл с настройками отсутствует.", + "request.error.database.exist": "Это соединение уже существует", + "request.error.database.unknow": "Нет такого соединения", + "request.error.environment.required": "Окружение необходимо.", + "request.error.environment.unknow": "Окружение неизвестно.", + "request.error.languages.exist": "Этот язык уже существует.", + "request.error.languages.incorrect": "Язык задан не правильно.", + "request.error.languages.unknow": "Этот язык не существует.", + "request.error.type.boolean": "Boolean обязательно.", + "request.error.type.number": "Число обязательно.", + "request.error.type.select": "Значение должно присутствовать в заданом списке.", + "request.error.type.string": "Текст обязателен.", + "request.error.validation.max": "Слишком большое.", + "request.error.validation.maxLength": "Слишком длинное.", + "request.error.validation.min": "Слишком маленькое.", + "request.error.validation.minLength": "Слишком короткое.", + "request.error.validation.regex": "Не соответствует регулярному выражению.", + "request.error.validation.required": "Значение для этого поля обязательно.", + "strapi.notification.error": "Возникла ошибка", + "strapi.notification.info.serverRestart": "Сервер будет перезапущен", + "strapi.notification.info.settingsEqual": "Значения идентичны", + "strapi.notification.success.databaseAdd": "База данных успешно добавлен.", + "strapi.notification.success.databaseDelete": "База данных успешно удалена.", + "strapi.notification.success.databaseDeleted": "База данных была удалена.", + "strapi.notification.success.databaseEdit": "Настройки базы данных успешно обновлены.", + "strapi.notification.success.languageAdd": "Язык успешно добавлен.", + "strapi.notification.success.languageDelete": "Язык успешно удалена.", + "strapi.notification.success.settingsEdit": "Настройки успешно обновлены." +} \ No newline at end of file diff --git a/packages/strapi-plugin-settings-manager/admin/src/translations/tr.json b/packages/strapi-plugin-settings-manager/admin/src/translations/tr.json index 29f2ba8653..0eec87ccc0 100644 --- a/packages/strapi-plugin-settings-manager/admin/src/translations/tr.json +++ b/packages/strapi-plugin-settings-manager/admin/src/translations/tr.json @@ -1,162 +1,84 @@ { "components.DownloadDb.download": "Kurulum devam ediyor...", "components.DownloadDb.text": "Bu birkaç dakika sürebilir. Sabrınız için teşekkürler.", - "plugin.description.short": "Projenizi hemen yapılandırın.", - "plugin.description.long": "Projenizi hemen yapılandırın..", - "menu.section.global-settings": "Genel Ayarlar", - "menu.item.application": "Uygulama", - "menu.item.languages": "Diller", - "menu.item.advanced": "Gelişmiş", - - "menu.section.environments": "Ortamlar", - "menu.item.database": "Veritabanı", - "menu.item.request": "İstek", - "menu.item.response": "Cevap", - "menu.item.security": "Güvenlik", - "menu.item.server": "Sunucu", - - "form.button.cancel": "İptal", - "form.button.save": "Kaydet", - "form.button.confirm": "Onayla", - - "form.databases.name": "Veritabanı", - "form.databases.description": "Veritabanı ayarlarınızı çevreye göre yapılandırın.", - - "form.database.item.name": "Bağlantı Adı", - "form.database.item.client": "İstemci", - "form.database.item.connector": "Bağlayıcı", - "form.database.item.host": "Sunucu", - "form.database.item.port": "Port", - "form.database.item.username": "Kullanıcı Adı", - "form.database.item.password": "Parola", - "form.database.item.database": "Veritabanları", - "form.database.item.ssl": "SSL", - "form.database.item.authenticationDatabase": "Kimlik Doğrulama Veritabanı", - "form.database.item.default": "Varsayılan bağlantı olarak ayarla", - "form.database.item.provider.mongo": "Mongo", - "form.database.item.provider.postgres": "PostgresSQL", - "form.database.item.provider.mysql": "MySQL", - "form.database.item.provider.redis": "Redis", - - "form.application.name": "Uygulama", - "form.application.description": "Uygulama ayarlarınızı yapılandırın.", - - "form.application.item.name": "İsim", - "form.application.item.description": "Açıklama", - "form.application.item.version": "Versiyon", - - "form.advanced.name": "Gelişmiş", "form.advanced.description": "Gelişmiş ayarlarınızı yapılandırın.", - "form.advanced.item.admin": "Yönetici kontrol panel adresi", "form.advanced.item.prefix": "Servis Önek", - - "form.request.name": "İstek", + "form.advanced.name": "Gelişmiş", + "form.application.description": "Uygulama ayarlarınızı yapılandırın.", + "form.application.item.description": "Açıklama", + "form.application.item.name": "İsim", + "form.application.item.version": "Versiyon", + "form.application.name": "Uygulama", + "form.button.cancel": "İptal", + "form.button.confirm": "Onayla", + "form.button.save": "Kaydet", + "form.database.item.authenticationDatabase": "Kimlik Doğrulama Veritabanı", + "form.database.item.client": "İstemci", + "form.database.item.connector": "Bağlayıcı", + "form.database.item.database": "Veritabanları", + "form.database.item.default": "Varsayılan bağlantı olarak ayarla", + "form.database.item.host": "Sunucu", + "form.database.item.name": "Bağlantı Adı", + "form.database.item.password": "Parola", + "form.database.item.port": "Port", + "form.database.item.provider.mongo": "Mongo", + "form.database.item.provider.mysql": "MySQL", + "form.database.item.provider.postgres": "PostgresSQL", + "form.database.item.provider.redis": "Redis", + "form.database.item.ssl": "SSL", + "form.database.item.username": "Kullanıcı Adı", + "form.databases.description": "Veritabanı ayarlarınızı çevreye göre yapılandırın.", + "form.databases.name": "Veritabanı", + "form.language.choose": "Bir dil seçin:", + "form.language.description": "Dillerinizi yapılandırın.", + "form.language.name": "Diller", "form.request.description": "Talep ayarlarınızı yapılandırın.", + "form.request.item.logger": "Logger", + "form.request.item.logger.exposeInContext": "Kaynak göster", + "form.request.item.logger.level": "Seviye", + "form.request.item.logger.requests": "Cevap", "form.request.item.parser": "Ayrıştırıcı", "form.request.item.parser.multipart": "Çoklu Ayrıştırıcı", "form.request.item.prefix": "Önek", "form.request.item.prefix.prefix": "Önek", - "form.request.item.logger": "Logger", - "form.request.item.logger.level": "Seviye", - "form.request.item.logger.exposeInContext": "Kaynak göster", - "form.request.item.logger.requests": "Cevap", "form.request.item.router": "Yönlendirici", "form.request.item.router.prefix": "Önek", - - "form.response.name": "Cevap", + "form.request.name": "İstek", "form.response.description": "Yanıt ayarlarınızı yapılandırın.", "form.response.item.gzip.enabled": "Gzip", "form.response.item.responseTime.enabled": "Tepki Süresi", - - "form.security.name": "Güvenlik", + "form.response.name": "Cevap", "form.security.description": "Güvenlik ayarlarınızı yapılandırın.", - + "form.security.item.cors": "Cors", + "form.security.item.cors.origin": "Origin", "form.security.item.csrf": "CSRF", - "form.security.item.p3p": "P3P", - "form.security.item.p3p.value": "Değer", - "form.security.item.hsts": "HOSTS", + "form.security.item.csrf.angular": "Açısal", + "form.security.item.csrf.cookie": "Çerez", "form.security.item.csrf.key": "Anahtar", "form.security.item.csrf.secret": "Gizli", - "form.security.item.csrf.cookie": "Çerez", - "form.security.item.csrf.angular": "Açısal", - "form.security.item.hsts.maxAge": "Max Age", + "form.security.item.hsts": "HOSTS", "form.security.item.hsts.includeSubDomains": "Alt Etki Alanını Dahil Et", + "form.security.item.hsts.maxAge": "Max Age", "form.security.item.hsts.preload": "Önceden Yükle", - + "form.security.item.p3p": "P3P", + "form.security.item.p3p.value": "Değer", "form.security.item.session": "Oturum", "form.security.item.session.key": "Gizli anahtar", "form.security.item.session.maxAge": "Maximum age", - "form.security.item.xframe": "Xframe", - "form.security.item.xframe.value": "Options", + "form.security.item.xframe.allow-from": "ALLOW-FROM", "form.security.item.xframe.deny": "DENY", "form.security.item.xframe.sameorigin": "SAMEORIGIN", - "form.security.item.xframe.allow-from": "ALLOW-FROM", - + "form.security.item.xframe.value": "Options", "form.security.item.xssProtection": "xss Protection", "form.security.item.xssProtection.mode": "Mode", - - "form.security.item.cors": "Cors", - "form.security.item.cors.origin": "Origin", - - "form.server.name": "Sunucu", + "form.security.name": "Güvenlik", "form.server.description": "Sunucu ayarlarınızı yapılandırın.", - + "form.server.item.cron": "Cron", "form.server.item.host": "Sunucu", "form.server.item.port": "Port", - "form.server.item.cron": "Cron", - - "form.language.name": "Diller", - "form.language.description": "Dillerinizi yapılandırın.", - "form.language.choose": "Bir dil seçin:", - - "request.error.database.exist": "Bu bağlantı zaten var", - "request.error.database.unknow": "Böyle bir bağlantı yok", - "request.error.type.string": "Bir metin gerekiyor.", - "request.error.type.number": "Bir sayı gerekiyor.", - "request.error.type.boolean": "Bir mantıksal değer gerekli.", - "request.error.type.select": "Değer önceden tanımlanmış listede olmalıdır.", - - "request.error.validation.required": "Zorunlu alandır.", - "request.error.validation.regex": "Regex ile eşleşmiyor.", - "request.error.validation.max": "Değer çok yüksek.", - "request.error.validation.min": "Değer çok az", - "request.error.validation.maxLength": "Değer çok uzun.", - "request.error.validation.minLength": "Değer çok kısa.", - - "request.error.config": "Yapılandırma dosyası mevcut değil.", - "request.error.environment.required": "Ortam zorunludur.", - "request.error.environment.unknow": "Ortam bilinmiyor.", - "request.error.languages.exist": "Bu dil zaten var.", - "request.error.languages.unknow": "Bu dil yoktur.", - "request.error.languages.incorrect": "Bu dil yanlıştır.", - - "list.languages.button.label": "Yeni bir dil ekle", - "list.languages.title.singular": "dil kullanılabilir", - "list.languages.title.plural": "diller kullanılabilir", - "list.languages.default.languages": "Varsayılan dil", - "list.languages.set.languages": "Varsayılan olarak ayarla", - "list.databases.button.label": "Yeni bir bağlantı ekle", - "list.databases.title.singular": "bu ortamdaki bağlantı", - "list.databases.title.plural": "bu ortamdaki bağlantılar", - - "popUpWarning.title": "Lütfen onaylayın", - "popUpWarning.databases.danger.message": "İçerik Türleri, bu bağlantıyla halen bağlantılıdır. Kaldırarak uygulamanızda kritik sorunlara neden olabilirsiniz. Dikkatli olun...", - "popUpWarning.danger.ok.message": "Anlıyorum", - "popUpWarning.databases.delete.message": "Bu veritabanını silmek istediğinizden emin misiniz?", - "popUpWarning.languages.delete.message": "Bu dili silmek istediğinizden emin misiniz?", - "strapi.notification.info.settingsEqual": "Ayarlar eşittir", - "strapi.notification.success.databaseDelete": "Veritabanı başarıyla silindi.", - "strapi.notification.success.languageDelete": "Dil başarıyla silindi.", - "strapi.notification.success.languageAdd": "Dil başarıyla eklendi.", - "strapi.notification.success.databaseAdd": "Veritabanı başarıyla eklendi.", - "strapi.notification.success.databaseEdit": "Veritabanı ayarları başarıyla güncellendi.", - "strapi.notification.success.databaseDeleted": "Veritabanı silindi.", - "strapi.notification.success.settingsEdit": "Ayarlar başarıyla güncellendi.", - "strapi.notification.error": "Bir hata oluştu", - "strapi.notification.info.serverRestart": "Sunucu yeniden başlatılacak", - + "form.server.name": "Sunucu", "language.af": "Afrikaans", "language.af_NA": "Afrikaans (Namibië)", "language.af_ZA": "Afrikaans (Suid-Afrika)", @@ -651,6 +573,58 @@ "language.zh_Hant_TW": "中文(繁體中文,台灣)", "language.zu": "isiZulu", "language.zu_ZA": "isiZulu (iNingizimu Afrika)", - - "pageNotFound": "Sayfa bulunamadı" -} + "list.databases.button.label": "Yeni bir bağlantı ekle", + "list.databases.title.plural": "bu ortamdaki bağlantılar", + "list.databases.title.singular": "bu ortamdaki bağlantı", + "list.languages.button.label": "Yeni bir dil ekle", + "list.languages.default.languages": "Varsayılan dil", + "list.languages.set.languages": "Varsayılan olarak ayarla", + "list.languages.title.plural": "diller kullanılabilir", + "list.languages.title.singular": "dil kullanılabilir", + "menu.item.advanced": "Gelişmiş", + "menu.item.application": "Uygulama", + "menu.item.database": "Veritabanı", + "menu.item.languages": "Diller", + "menu.item.request": "İstek", + "menu.item.response": "Cevap", + "menu.item.security": "Güvenlik", + "menu.item.server": "Sunucu", + "menu.section.environments": "Ortamlar", + "menu.section.global-settings": "Genel Ayarlar", + "pageNotFound": "Sayfa bulunamadı", + "plugin.description.long": "Projenizi hemen yapılandırın..", + "plugin.description.short": "Projenizi hemen yapılandırın.", + "popUpWarning.danger.ok.message": "Anlıyorum", + "popUpWarning.databases.danger.message": "İçerik Türleri, bu bağlantıyla halen bağlantılıdır. Kaldırarak uygulamanızda kritik sorunlara neden olabilirsiniz. Dikkatli olun...", + "popUpWarning.databases.delete.message": "Bu veritabanını silmek istediğinizden emin misiniz?", + "popUpWarning.languages.delete.message": "Bu dili silmek istediğinizden emin misiniz?", + "popUpWarning.title": "Lütfen onaylayın", + "request.error.config": "Yapılandırma dosyası mevcut değil.", + "request.error.database.exist": "Bu bağlantı zaten var", + "request.error.database.unknow": "Böyle bir bağlantı yok", + "request.error.environment.required": "Ortam zorunludur.", + "request.error.environment.unknow": "Ortam bilinmiyor.", + "request.error.languages.exist": "Bu dil zaten var.", + "request.error.languages.incorrect": "Bu dil yanlıştır.", + "request.error.languages.unknow": "Bu dil yoktur.", + "request.error.type.boolean": "Bir mantıksal değer gerekli.", + "request.error.type.number": "Bir sayı gerekiyor.", + "request.error.type.select": "Değer önceden tanımlanmış listede olmalıdır.", + "request.error.type.string": "Bir metin gerekiyor.", + "request.error.validation.max": "Değer çok yüksek.", + "request.error.validation.maxLength": "Değer çok uzun.", + "request.error.validation.min": "Değer çok az", + "request.error.validation.minLength": "Değer çok kısa.", + "request.error.validation.regex": "Regex ile eşleşmiyor.", + "request.error.validation.required": "Zorunlu alandır.", + "strapi.notification.error": "Bir hata oluştu", + "strapi.notification.info.serverRestart": "Sunucu yeniden başlatılacak", + "strapi.notification.info.settingsEqual": "Ayarlar eşittir", + "strapi.notification.success.databaseAdd": "Veritabanı başarıyla eklendi.", + "strapi.notification.success.databaseDelete": "Veritabanı başarıyla silindi.", + "strapi.notification.success.databaseDeleted": "Veritabanı silindi.", + "strapi.notification.success.databaseEdit": "Veritabanı ayarları başarıyla güncellendi.", + "strapi.notification.success.languageAdd": "Dil başarıyla eklendi.", + "strapi.notification.success.languageDelete": "Dil başarıyla silindi.", + "strapi.notification.success.settingsEdit": "Ayarlar başarıyla güncellendi." +} \ No newline at end of file diff --git a/packages/strapi-plugin-settings-manager/admin/src/translations/zh-Hans.json b/packages/strapi-plugin-settings-manager/admin/src/translations/zh-Hans.json index 9065d4af0a..52ba8ef535 100644 --- a/packages/strapi-plugin-settings-manager/admin/src/translations/zh-Hans.json +++ b/packages/strapi-plugin-settings-manager/admin/src/translations/zh-Hans.json @@ -1,161 +1,83 @@ { "components.DownloadDb.download": "正在安装...", "components.DownloadDb.text": "这可能需要几分钟左右。谢谢你的耐心。", - "plugin.description.short": "在几秒钟内配置你的项目。", - "plugin.description.long": "在几秒钟内配置你的项目。", - "menu.section.global-settings": "全局设置", - "menu.item.application": "应用", - "menu.item.languages": "语言", - "menu.item.advanced": "高级", - - "menu.section.environments": "环境", - "menu.item.database": "数据库", - "menu.item.request": "请求", - "menu.item.response": "回复", - "menu.item.security": "安全性", - "menu.item.server": "服务器", - - "form.button.cancel": "取消", - "form.button.save": "保存", - "form.button.confirm": "确认", - - "form.databases.name": "数据库", - "form.databases.description": "通过环境配置数据库设置。", - - "form.database.item.name": "连接名", - "form.database.item.client": "客户端", - "form.database.item.connector": "连接器", - "form.database.item.host": "主机", - "form.database.item.port": "端口", - "form.database.item.username": "用户名", - "form.database.item.password": "密码", - "form.database.item.database": "数据库", - "form.database.item.default": "设置为默认连接", - "form.database.item.provider.mongo": "Mongo", - "form.database.item.provider.postgres": "PostgresSQL", - "form.database.item.provider.mysql": "MySQL", - "form.database.item.provider.sqlite3": "SQlite3", - "form.database.item.provider.redis": "Redis", - - "form.application.name": "应用", - "form.application.description": "配置应用程序设置。", - - "form.application.item.name": "名字", - "form.application.item.description": "描述", - "form.application.item.version": "版本", - - "form.advanced.name": "先进的", "form.advanced.description": "配置高级设置。", - "form.advanced.item.admin": "Admin dashboard url", "form.advanced.item.prefix": "Prefix API", - - "form.request.name": "Request", + "form.advanced.name": "先进的", + "form.application.description": "配置应用程序设置。", + "form.application.item.description": "描述", + "form.application.item.name": "名字", + "form.application.item.version": "版本", + "form.application.name": "应用", + "form.button.cancel": "取消", + "form.button.confirm": "确认", + "form.button.save": "保存", + "form.database.item.client": "客户端", + "form.database.item.connector": "连接器", + "form.database.item.database": "数据库", + "form.database.item.default": "设置为默认连接", + "form.database.item.host": "主机", + "form.database.item.name": "连接名", + "form.database.item.password": "密码", + "form.database.item.port": "端口", + "form.database.item.provider.mongo": "Mongo", + "form.database.item.provider.mysql": "MySQL", + "form.database.item.provider.postgres": "PostgresSQL", + "form.database.item.provider.redis": "Redis", + "form.database.item.provider.sqlite3": "SQlite3", + "form.database.item.username": "用户名", + "form.databases.description": "通过环境配置数据库设置。", + "form.databases.name": "数据库", + "form.language.choose": "选择一种语言:", + "form.language.description": "配置您的语言。", + "form.language.name": "Languages", "form.request.description": "配置您的请求设置。", + "form.request.item.logger": "Logger", + "form.request.item.logger.exposeInContext": "Expose in context", + "form.request.item.logger.level": "Level", + "form.request.item.logger.requests": "Requests", "form.request.item.parser": "Parser", "form.request.item.parser.multipart": "Parser Multipart", "form.request.item.prefix": "Prefix", "form.request.item.prefix.prefix": "Prefix", - "form.request.item.logger": "Logger", - "form.request.item.logger.level": "Level", - "form.request.item.logger.exposeInContext": "Expose in context", - "form.request.item.logger.requests": "Requests", "form.request.item.router": "Router", "form.request.item.router.prefix": "Prefix", - - "form.response.name": "Response", + "form.request.name": "Request", "form.response.description": "配置您的响应设置。", "form.response.item.gzip.enabled": "Gzip", "form.response.item.responseTime.enabled": "Response Time", - - "form.security.name": "Security", + "form.response.name": "Response", "form.security.description": "配置安全设置。", - + "form.security.item.cors": "Cors", + "form.security.item.cors.origin": "Origin", "form.security.item.csrf": "CSRF", - "form.security.item.p3p": "P3P", - "form.security.item.p3p.value": "Value", - "form.security.item.hsts": "HOSTS", + "form.security.item.csrf.angular": "Angular", + "form.security.item.csrf.cookie": "Cookie", "form.security.item.csrf.key": "Key", "form.security.item.csrf.secret": "Secret", - "form.security.item.csrf.cookie": "Cookie", - "form.security.item.csrf.angular": "Angular", - "form.security.item.hsts.maxAge": "Max Age", + "form.security.item.hsts": "HOSTS", "form.security.item.hsts.includeSubDomains": "包括子域", + "form.security.item.hsts.maxAge": "Max Age", "form.security.item.hsts.preload": "Preload", - + "form.security.item.p3p": "P3P", + "form.security.item.p3p.value": "Value", "form.security.item.session": "Session", "form.security.item.session.key": "Secret key", "form.security.item.session.maxAge": "Maximum age", - "form.security.item.xframe": "Xframe", - "form.security.item.xframe.value": "Options", + "form.security.item.xframe.allow-from": "ALLOW-FROM", "form.security.item.xframe.deny": "DENY", "form.security.item.xframe.sameorigin": "SAMEORIGIN", - "form.security.item.xframe.allow-from": "ALLOW-FROM", - + "form.security.item.xframe.value": "Options", "form.security.item.xssProtection": "xss Protection", "form.security.item.xssProtection.mode": "Mode", - - "form.security.item.cors": "Cors", - "form.security.item.cors.origin": "Origin", - - "form.server.name": "Server", + "form.security.name": "Security", "form.server.description": "配置服务器设置。", - + "form.server.item.cron": "Cron", "form.server.item.host": "Host", "form.server.item.port": "Port", - "form.server.item.cron": "Cron", - - "form.language.name": "Languages", - "form.language.description": "配置您的语言。", - "form.language.choose": "选择一种语言:", - - "request.error.database.exist": "此连接已经存在", - "request.error.database.unknow": "没有这样的连接", - "request.error.type.string": "需要一个文本。", - "request.error.type.number": "需要一个数字。", - "request.error.type.boolean": "需要一个布尔值。", - "request.error.type.select": "该值必须在预定义列表中。", - - "request.error.validation.required": "必选", - "request.error.validation.regex": "格式错误", - "request.error.validation.max": "超过最大值", - "request.error.validation.min": "小于最小值", - "request.error.validation.maxLength": "超过最大长度", - "request.error.validation.minLength": "低于最小长度", - - "request.error.config": "配置文件不存在。", - "request.error.environment.required": "环境是必需的。", - "request.error.environment.unknow": "环境未知。", - "request.error.languages.exist": "这种语言已经存在。", - "request.error.languages.unknow": "这种语言是不存在的。", - "request.error.languages.incorrect": "这种语言不正确。", - - "list.languages.button.label": "添加新语言", - "list.languages.title.singular": "语言是可用的", - "list.languages.title.plural": "可用的语言", - "list.languages.default.languages": "缺省语言", - "list.languages.set.languages": "设置为默认值", - "list.databases.button.label": "添加新连接", - "list.databases.title.singular": "在这种环境中的连接", - "list.databases.title.plural": "在这种环境中的连接", - - "popUpWarning.title": "请确认", - "popUpWarning.databases.danger.message": "内容类型仍然与此连接连接。如果删除它,可能会对应用程序造成严重的问题。小心...", - "popUpWarning.danger.ok.message": "我明白", - "popUpWarning.databases.delete.message": "确实要删除此数据库吗?", - "popUpWarning.languages.delete.message": "确实要删除此数据库吗?", - "strapi.notification.info.settingsEqual": "设置相等", - "strapi.notification.success.databaseDelete": "数据库已被成功删除。", - "strapi.notification.success.languageDelete": "数据库已被成功删除。", - "strapi.notification.success.languageAdd": "该语言已成功添加。", - "strapi.notification.success.databaseAdd": "该语言已成功添加。", - "strapi.notification.success.databaseEdit": "数据库设置已成功更新。", - "strapi.notification.success.databaseDeleted": "数据库已被删除。", - "strapi.notification.success.settingsEdit": "设置已成功更新。", - "strapi.notification.error": "发生错误", - "strapi.notification.info.serverRestart": "服务器将重新启动", - + "form.server.name": "Server", "language.af": "Afrikaans", "language.af_NA": "Afrikaans (Namibië)", "language.af_ZA": "Afrikaans (Suid-Afrika)", @@ -650,6 +572,58 @@ "language.zh_Hant_TW": "中文(繁體中文,台灣)", "language.zu": "isiZulu", "language.zu_ZA": "isiZulu (iNingizimu Afrika)", - - "pageNotFound": "Page not found" -} + "list.databases.button.label": "添加新连接", + "list.databases.title.plural": "在这种环境中的连接", + "list.databases.title.singular": "在这种环境中的连接", + "list.languages.button.label": "添加新语言", + "list.languages.default.languages": "缺省语言", + "list.languages.set.languages": "设置为默认值", + "list.languages.title.plural": "可用的语言", + "list.languages.title.singular": "语言是可用的", + "menu.item.advanced": "高级", + "menu.item.application": "应用", + "menu.item.database": "数据库", + "menu.item.languages": "语言", + "menu.item.request": "请求", + "menu.item.response": "回复", + "menu.item.security": "安全性", + "menu.item.server": "服务器", + "menu.section.environments": "环境", + "menu.section.global-settings": "全局设置", + "pageNotFound": "Page not found", + "plugin.description.long": "在几秒钟内配置你的项目。", + "plugin.description.short": "在几秒钟内配置你的项目。", + "popUpWarning.danger.ok.message": "我明白", + "popUpWarning.databases.danger.message": "内容类型仍然与此连接连接。如果删除它,可能会对应用程序造成严重的问题。小心...", + "popUpWarning.databases.delete.message": "确实要删除此数据库吗?", + "popUpWarning.languages.delete.message": "确实要删除此数据库吗?", + "popUpWarning.title": "请确认", + "request.error.config": "配置文件不存在。", + "request.error.database.exist": "此连接已经存在", + "request.error.database.unknow": "没有这样的连接", + "request.error.environment.required": "环境是必需的。", + "request.error.environment.unknow": "环境未知。", + "request.error.languages.exist": "这种语言已经存在。", + "request.error.languages.incorrect": "这种语言不正确。", + "request.error.languages.unknow": "这种语言是不存在的。", + "request.error.type.boolean": "需要一个布尔值。", + "request.error.type.number": "需要一个数字。", + "request.error.type.select": "该值必须在预定义列表中。", + "request.error.type.string": "需要一个文本。", + "request.error.validation.max": "超过最大值", + "request.error.validation.maxLength": "超过最大长度", + "request.error.validation.min": "小于最小值", + "request.error.validation.minLength": "低于最小长度", + "request.error.validation.regex": "格式错误", + "request.error.validation.required": "必选", + "strapi.notification.error": "发生错误", + "strapi.notification.info.serverRestart": "服务器将重新启动", + "strapi.notification.info.settingsEqual": "设置相等", + "strapi.notification.success.databaseAdd": "该语言已成功添加。", + "strapi.notification.success.databaseDelete": "数据库已被成功删除。", + "strapi.notification.success.databaseDeleted": "数据库已被删除。", + "strapi.notification.success.databaseEdit": "数据库设置已成功更新。", + "strapi.notification.success.languageAdd": "该语言已成功添加。", + "strapi.notification.success.languageDelete": "数据库已被成功删除。", + "strapi.notification.success.settingsEdit": "设置已成功更新。" +} \ No newline at end of file diff --git a/packages/strapi-plugin-settings-manager/admin/src/translations/zh.json b/packages/strapi-plugin-settings-manager/admin/src/translations/zh.json index 6c6e01e0ca..bdab1a0598 100644 --- a/packages/strapi-plugin-settings-manager/admin/src/translations/zh.json +++ b/packages/strapi-plugin-settings-manager/admin/src/translations/zh.json @@ -1,160 +1,82 @@ { "components.DownloadDb.download": "正在安裝中...", "components.DownloadDb.text": "這會需要幾分鐘的時間,感謝您的耐心。", - "plugin.description.short": "只需要幾秒鐘的時間就可以設定好您的專案", - "plugin.description.long": "只需要幾秒鐘的時間就可以設定好您的專案", - "menu.section.global-settings": "全域設定", - "menu.item.application": "應用程式", - "menu.item.languages": "語言", - "menu.item.advanced": "進階", - - "menu.section.environments": "環境", - "menu.item.database": "資料庫", - "menu.item.request": "請求", - "menu.item.response": "回應", - "menu.item.security": "安全性", - "menu.item.server": "主機", - - "form.button.cancel": "取消", - "form.button.save": "儲存", - "form.button.confirm": "確認", - - "form.databases.name": "資料庫", - "form.databases.description": "根據您的環境來設定資料庫", - - "form.database.item.name": "連線名稱", - "form.database.item.client": "Client", - "form.database.item.connector": "Connector", - "form.database.item.host": "Host", - "form.database.item.port": "Port", - "form.database.item.username": "使用者名稱", - "form.database.item.password": "密碼", - "form.database.item.database": "資料庫", - "form.database.item.default": "設為預設連線", - "form.database.item.provider.mongo": "Mongo", - "form.database.item.provider.postgres": "PostgresSQL", - "form.database.item.provider.mysql": "MySQL", - "form.database.item.provider.redis": "Redis", - - "form.application.name": "應用程式", - "form.application.description": "調整您的應用程式設定", - - "form.application.item.name": "名稱", - "form.application.item.description": "說明", - "form.application.item.version": "版本", - - "form.advanced.name": "進階", "form.advanced.description": "調整進階設定", - "form.advanced.item.admin": "Admin 控制面板連結", "form.advanced.item.prefix": "Prefix API", - - "form.request.name": "請求", + "form.advanced.name": "進階", + "form.application.description": "調整您的應用程式設定", + "form.application.item.description": "說明", + "form.application.item.name": "名稱", + "form.application.item.version": "版本", + "form.application.name": "應用程式", + "form.button.cancel": "取消", + "form.button.confirm": "確認", + "form.button.save": "儲存", + "form.database.item.client": "Client", + "form.database.item.connector": "Connector", + "form.database.item.database": "資料庫", + "form.database.item.default": "設為預設連線", + "form.database.item.host": "Host", + "form.database.item.name": "連線名稱", + "form.database.item.password": "密碼", + "form.database.item.port": "Port", + "form.database.item.provider.mongo": "Mongo", + "form.database.item.provider.mysql": "MySQL", + "form.database.item.provider.postgres": "PostgresSQL", + "form.database.item.provider.redis": "Redis", + "form.database.item.username": "使用者名稱", + "form.databases.description": "根據您的環境來設定資料庫", + "form.databases.name": "資料庫", + "form.language.choose": "選擇一個語言:", + "form.language.description": "設定語言", + "form.language.name": "語言", "form.request.description": "調整請求設定", + "form.request.item.logger": "Logger", + "form.request.item.logger.exposeInContext": "Expose in context", + "form.request.item.logger.level": "Level", + "form.request.item.logger.requests": "請求", "form.request.item.parser": "Parser", "form.request.item.parser.multipart": "Parser Multipart", "form.request.item.prefix": "Prefix", "form.request.item.prefix.prefix": "Prefix", - "form.request.item.logger": "Logger", - "form.request.item.logger.level": "Level", - "form.request.item.logger.exposeInContext": "Expose in context", - "form.request.item.logger.requests": "請求", "form.request.item.router": "Router", "form.request.item.router.prefix": "Prefix", - - "form.response.name": "回應", + "form.request.name": "請求", "form.response.description": "調整回應設定", "form.response.item.gzip.enabled": "Gzip", "form.response.item.responseTime.enabled": "回應時間", - - "form.security.name": "安全性", + "form.response.name": "回應", "form.security.description": "調整安全性設定", - + "form.security.item.cors": "Cors", + "form.security.item.cors.origin": "Origin", "form.security.item.csrf": "CSRF", - "form.security.item.p3p": "P3P", - "form.security.item.p3p.value": "Value", - "form.security.item.hsts": "HOSTS", + "form.security.item.csrf.angular": "Angular", + "form.security.item.csrf.cookie": "Cookie", "form.security.item.csrf.key": "Key", "form.security.item.csrf.secret": "Secret", - "form.security.item.csrf.cookie": "Cookie", - "form.security.item.csrf.angular": "Angular", - "form.security.item.hsts.maxAge": "Max Age", + "form.security.item.hsts": "HOSTS", "form.security.item.hsts.includeSubDomains": "Include Sub Domain", + "form.security.item.hsts.maxAge": "Max Age", "form.security.item.hsts.preload": "Preload", - + "form.security.item.p3p": "P3P", + "form.security.item.p3p.value": "Value", "form.security.item.session": "Session", "form.security.item.session.key": "Secret key", "form.security.item.session.maxAge": "Maximum age", - "form.security.item.xframe": "Xframe", - "form.security.item.xframe.value": "Options", + "form.security.item.xframe.allow-from": "ALLOW-FROM", "form.security.item.xframe.deny": "DENY", "form.security.item.xframe.sameorigin": "SAMEORIGIN", - "form.security.item.xframe.allow-from": "ALLOW-FROM", - + "form.security.item.xframe.value": "Options", "form.security.item.xssProtection": "xss Protection", "form.security.item.xssProtection.mode": "Mode", - - "form.security.item.cors": "Cors", - "form.security.item.cors.origin": "Origin", - - "form.server.name": "Server", + "form.security.name": "安全性", "form.server.description": "調整伺服器設定", - + "form.server.item.cron": "Cron", "form.server.item.host": "Host", "form.server.item.port": "Port", - "form.server.item.cron": "Cron", - - "form.language.name": "語言", - "form.language.description": "設定語言", - "form.language.choose": "選擇一個語言:", - - "request.error.database.exist": "這個連線已存在", - "request.error.type.string": "必填文字欄位", - "request.error.type.number": "必填數字欄位", - "request.error.type.boolean": "必填 Boolean 欄位", - "request.error.type.select": "這個數值必須要在預先設定清單", - - "request.error.validation.required": "必填欄位", - "request.error.validation.regex": "這個數值和 regex 不符合", - "request.error.validation.max": "這個數值太高", - "request.error.validation.min": "這個數值太低", - "request.error.validation.maxLength": "這個數值太長", - "request.error.validation.minLength": "這個數值太短", - - "request.error.config": "設定檔不存在", - "request.error.environment.required": "環境必須設定", - "request.error.environment.unknow": "環境為未知", - "request.error.languages.exist": "這個語言已存在", - "request.error.languages.unknow": "這個語言不存在", - "request.error.languages.incorrect": "這個語言不正確", - - "list.languages.button.label": "增加一個新的語言", - "list.languages.title.singular": "可用語言", - "list.languages.title.plural": "可用語言", - "list.languages.default.languages": "預設語言", - "list.languages.set.languages": "設為預設", - "list.databases.button.label": "增加新的連線", - "list.databases.title.singular": "個環境連線", - "list.databases.title.plural": "個環境連線", - - "popUpWarning.title": "請確認", - "popUpWarning.databases.danger.message": - "資料結構目前還在綁定這個連線中,如果刪除它,將會發生嚴重錯誤,請小心。", - "popUpWarning.danger.ok.message": "我知道", - "popUpWarning.databases.delete.message": "您確定要刪除這個資料庫嗎?", - "popUpWarning.languages.delete.message": "您確定要刪除這個語言嗎?", - "strapi.notification.info.settingsEqual": "設定是相同的", - "strapi.notification.success.databaseDelete": "成功刪除這個資料庫", - "strapi.notification.success.languageDelete": "成功刪除這個語言", - "strapi.notification.success.languageAdd": "成功新增這個語言", - "strapi.notification.success.databaseAdd": "成功新增這個資料庫", - "strapi.notification.success.databaseEdit": "已更新這個資料庫設定", - "strapi.notification.success.databaseDeleted": "已刪除這個資料庫", - "strapi.notification.success.settingsEdit": "已更新這個設定", - "strapi.notification.error": "有錯誤發生", - "strapi.notification.info.serverRestart": "伺服器將重啟", - + "form.server.name": "Server", "language.af": "Afrikaans", "language.af_NA": "Afrikaans (Namibië)", "language.af_ZA": "Afrikaans (Suid-Afrika)", @@ -649,6 +571,57 @@ "language.zh_Hant_TW": "中文(繁體中文,台灣)", "language.zu": "isiZulu", "language.zu_ZA": "isiZulu (iNingizimu Afrika)", - - "pageNotFound": "Page not found" -} + "list.databases.button.label": "增加新的連線", + "list.databases.title.plural": "個環境連線", + "list.databases.title.singular": "個環境連線", + "list.languages.button.label": "增加一個新的語言", + "list.languages.default.languages": "預設語言", + "list.languages.set.languages": "設為預設", + "list.languages.title.plural": "可用語言", + "list.languages.title.singular": "可用語言", + "menu.item.advanced": "進階", + "menu.item.application": "應用程式", + "menu.item.database": "資料庫", + "menu.item.languages": "語言", + "menu.item.request": "請求", + "menu.item.response": "回應", + "menu.item.security": "安全性", + "menu.item.server": "主機", + "menu.section.environments": "環境", + "menu.section.global-settings": "全域設定", + "pageNotFound": "Page not found", + "plugin.description.long": "只需要幾秒鐘的時間就可以設定好您的專案", + "plugin.description.short": "只需要幾秒鐘的時間就可以設定好您的專案", + "popUpWarning.danger.ok.message": "我知道", + "popUpWarning.databases.danger.message": "資料結構目前還在綁定這個連線中,如果刪除它,將會發生嚴重錯誤,請小心。", + "popUpWarning.databases.delete.message": "您確定要刪除這個資料庫嗎?", + "popUpWarning.languages.delete.message": "您確定要刪除這個語言嗎?", + "popUpWarning.title": "請確認", + "request.error.config": "設定檔不存在", + "request.error.database.exist": "這個連線已存在", + "request.error.environment.required": "環境必須設定", + "request.error.environment.unknow": "環境為未知", + "request.error.languages.exist": "這個語言已存在", + "request.error.languages.incorrect": "這個語言不正確", + "request.error.languages.unknow": "這個語言不存在", + "request.error.type.boolean": "必填 Boolean 欄位", + "request.error.type.number": "必填數字欄位", + "request.error.type.select": "這個數值必須要在預先設定清單", + "request.error.type.string": "必填文字欄位", + "request.error.validation.max": "這個數值太高", + "request.error.validation.maxLength": "這個數值太長", + "request.error.validation.min": "這個數值太低", + "request.error.validation.minLength": "這個數值太短", + "request.error.validation.regex": "這個數值和 regex 不符合", + "request.error.validation.required": "必填欄位", + "strapi.notification.error": "有錯誤發生", + "strapi.notification.info.serverRestart": "伺服器將重啟", + "strapi.notification.info.settingsEqual": "設定是相同的", + "strapi.notification.success.databaseAdd": "成功新增這個資料庫", + "strapi.notification.success.databaseDelete": "成功刪除這個資料庫", + "strapi.notification.success.databaseDeleted": "已刪除這個資料庫", + "strapi.notification.success.databaseEdit": "已更新這個資料庫設定", + "strapi.notification.success.languageAdd": "成功新增這個語言", + "strapi.notification.success.languageDelete": "成功刪除這個語言", + "strapi.notification.success.settingsEdit": "已更新這個設定" +} \ No newline at end of file diff --git a/packages/strapi-plugin-upload/admin/src/translations/ar.json b/packages/strapi-plugin-upload/admin/src/translations/ar.json index f9631571c0..7b75b8be10 100644 --- a/packages/strapi-plugin-upload/admin/src/translations/ar.json +++ b/packages/strapi-plugin-upload/admin/src/translations/ar.json @@ -1,36 +1,28 @@ { - "ConfigPage.title": "الرفع - الإعدادات", "ConfigPage.description": "تهئية إضافة الرفع", - + "ConfigPage.title": "الرفع - الإعدادات", "EditForm.Input.number.label": "اقصى حجم مسموح (بوحدة MB)", - "EditForm.Input.select.label": "مزودين", "EditForm.Input.select.inputDescription": "يمكن إما تحميل الملفات على الخادم الخاص بك أو على مقدمي الخارجية.", + "EditForm.Input.select.label": "مزودين", "EditForm.Input.toggle.label": "السماح برفع الملفات", - "EmptyLi.message": "لا توجد ملفات تم تحميلها", - "EntriesNumber.number": "{number} ملف وجد", "EntriesNumber.number.plural": "{number} ملفات وجدة", - - "HomePage.title": "رفع", - "HomePage.description": "اكتشف كل الملفات التي تم تحميلها", "HomePage.InputSearch.placeholder": "ابحث عن ملف...", - + "HomePage.description": "اكتشف كل الملفات التي تم تحميلها", + "HomePage.title": "رفع", "Li.linkCopied": "رابط نسخها في الحافظة", - - "ListHeader.type": "النوع", "ListHeader.hash": "الهاش", "ListHeader.name": "الاسم", - "ListHeader.updated": "رفع", - "ListHeader.size": "الحجم", "ListHeader.related": "متعلق بـ", - - "PluginInputFile.text": "اسحب الملفات وأسقطها في هذه المنطقة أو {link} من ملف لتحميله", + "ListHeader.size": "الحجم", + "ListHeader.type": "النوع", + "ListHeader.updated": "رفع", "PluginInputFile.link": "متصفح", "PluginInputFile.loading": "يجري تحميل ملفاتك...", - + "PluginInputFile.text": "اسحب الملفات وأسقطها في هذه المنطقة أو {link} من ملف لتحميله", "notification.config.success": "تم تحديث الإعدادات", "notification.delete.success": "تم حذف الملف", "notification.dropFile.success": "تم تحميل ملفك", "notification.dropFiles.success": "{number} ملفات تم تحميلها" -} +} \ No newline at end of file diff --git a/packages/strapi-plugin-upload/admin/src/translations/de.json b/packages/strapi-plugin-upload/admin/src/translations/de.json index 75c6e44d12..62508a5e84 100644 --- a/packages/strapi-plugin-upload/admin/src/translations/de.json +++ b/packages/strapi-plugin-upload/admin/src/translations/de.json @@ -1,37 +1,28 @@ { - - "ConfigPage.title": "Hochladen - Einstellungen", "ConfigPage.description": "Konfiguriere das Hochladen-Plugin", - + "ConfigPage.title": "Hochladen - Einstellungen", "EditForm.Input.number.label": "Maximal zulässige Größe (in MB)", - "EditForm.Input.select.label": "Anbieter", "EditForm.Input.select.inputDescription": "Dateien können entweder auf deinem Server oder bei einem externe Anbieter hochgeladen werden.", + "EditForm.Input.select.label": "Anbieter", "EditForm.Input.toggle.label": "Datei -hinzufügen aktivieren", - "EmptyLi.message": "Es gibt keine hochgeladenen Dateien", - "EntriesNumber.number": "{number} Datei gefunden", "EntriesNumber.number.plural": "{number} Dateien gefunden", - - "HomePage.title": "Dateien hochladen", - "HomePage.description": "Übersicht über alle hochgeladenen Dateien.", "HomePage.InputSearch.placeholder": "Suche nach einer Datei...", - + "HomePage.description": "Übersicht über alle hochgeladenen Dateien.", + "HomePage.title": "Dateien hochladen", "Li.linkCopied": "Link in die Zwischenablage kopiert", - - "ListHeader.type": "Art", "ListHeader.hash": "Hash", "ListHeader.name": "Name", - "ListHeader.updated": "Aktualisiert", - "ListHeader.size": "Größe", "ListHeader.related": "Verbunden mit", - - "PluginInputFile.text": "Ziehe eine Datei hierher oder {link} eine Datei zum hochladen aus", + "ListHeader.size": "Größe", + "ListHeader.type": "Art", + "ListHeader.updated": "Aktualisiert", "PluginInputFile.link": "wähle", "PluginInputFile.loading": "Deine Dateien werden hochgeladen...", - + "PluginInputFile.text": "Ziehe eine Datei hierher oder {link} eine Datei zum hochladen aus", + "notification.config.success": "Die Einstellungen wurden aktualisiert", "notification.delete.success": "Die Datei wurde gelöscht", "notification.dropFile.success": "Deine Datei wurde hochgeladen", - "notification.dropFiles.success": "{number} Dateien wurden hochgeladen", - "notification.config.success": "Die Einstellungen wurden aktualisiert" -} + "notification.dropFiles.success": "{number} Dateien wurden hochgeladen" +} \ No newline at end of file diff --git a/packages/strapi-plugin-upload/admin/src/translations/en.json b/packages/strapi-plugin-upload/admin/src/translations/en.json index 5d668a7f89..3abf220a52 100644 --- a/packages/strapi-plugin-upload/admin/src/translations/en.json +++ b/packages/strapi-plugin-upload/admin/src/translations/en.json @@ -1,36 +1,28 @@ { - "ConfigPage.title": "Upload - Settings", "ConfigPage.description": "Configure the upload plugin", - + "ConfigPage.title": "Upload - Settings", "EditForm.Input.number.label": "Maximum size allowed (in MB)", - "EditForm.Input.select.label": "Providers", "EditForm.Input.select.inputDescription": "Files can either be uploaded on your server or on external providers.", + "EditForm.Input.select.label": "Providers", "EditForm.Input.toggle.label": "Enable file upload", - "EmptyLi.message": "There are no uploaded files", - "EntriesNumber.number": "{number} file found", "EntriesNumber.number.plural": "{number} files found", - - "HomePage.title": "Upload", - "HomePage.description": "Discover all the uploaded files", "HomePage.InputSearch.placeholder": "Search for a file...", - + "HomePage.description": "Discover all the uploaded files", + "HomePage.title": "Upload", "Li.linkCopied": "Link copied into the clipboard", - - "ListHeader.type": "Type", "ListHeader.hash": "Hash", "ListHeader.name": "Name", - "ListHeader.updated": "Updated", - "ListHeader.size": "Size", "ListHeader.related": "Related to", - - "PluginInputFile.text": "Drag & drop your files into this area or {link} from a file to upload", + "ListHeader.size": "Size", + "ListHeader.type": "Type", + "ListHeader.updated": "Updated", "PluginInputFile.link": "browse", "PluginInputFile.loading": "Your files are being uploaded...", - + "PluginInputFile.text": "Drag & drop your files into this area or {link} from a file to upload", "notification.config.success": "The settings has been updated", "notification.delete.success": "The file has been deleted", "notification.dropFile.success": "Your file has been uploaded", "notification.dropFiles.success": "{number} files have been uploaded" -} +} \ No newline at end of file diff --git a/packages/strapi-plugin-upload/admin/src/translations/es.json b/packages/strapi-plugin-upload/admin/src/translations/es.json index e0bac6a16e..9207269afb 100644 --- a/packages/strapi-plugin-upload/admin/src/translations/es.json +++ b/packages/strapi-plugin-upload/admin/src/translations/es.json @@ -1,36 +1,28 @@ { - "ConfigPage.title": "Cargar - Configuración", "ConfigPage.description": "Configurar el plugin de carga", - + "ConfigPage.title": "Cargar - Configuración", "EditForm.Input.number.label": "Tamaño máximo permitido (en MB)", - "EditForm.Input.select.label": "Proveedores", "EditForm.Input.select.inputDescription": "Los archivos se pueden cargar en su servidor o en proveedores externos.", + "EditForm.Input.select.label": "Proveedores", "EditForm.Input.toggle.label": "Habilitar la carga de archivos", - "EmptyLi.message": "No hay archivos cargados", - "EntriesNumber.number": "{number} archivo encontrado", "EntriesNumber.number.plural": "{number} archivos encontrados", - - "HomePage.title": "Cargar", - "HomePage.description": "Descubre todos los archivos subidos", "HomePage.InputSearch.placeholder": "Buscar un archivo...", - + "HomePage.description": "Descubre todos los archivos subidos", + "HomePage.title": "Cargar", "Li.linkCopied": "Enlace copiado en el portapapeles", - - "ListHeader.type": "Tipo", "ListHeader.hash": "Hash", "ListHeader.name": "Nombre", - "ListHeader.updated": "Actualizado", - "ListHeader.size": "Tamaño", "ListHeader.related": "Relacionado con", - - "PluginInputFile.text": "Arrastre y suelte sus archivos en esta área o {link} desde un archivo para cargarlo", + "ListHeader.size": "Tamaño", + "ListHeader.type": "Tipo", + "ListHeader.updated": "Actualizado", "PluginInputFile.link": "buscar", "PluginInputFile.loading": "Tus archivos están cargando....", - + "PluginInputFile.text": "Arrastre y suelte sus archivos en esta área o {link} desde un archivo para cargarlo", "notification.config.success": "Se ha actualizado la configuración", "notification.delete.success": "El archivo ha sido borrado", "notification.dropFile.success": "Su archivo esta cargado", "notification.dropFiles.success": "{number} archivos han sido cargados" -} +} \ No newline at end of file diff --git a/packages/strapi-plugin-upload/admin/src/translations/fr.json b/packages/strapi-plugin-upload/admin/src/translations/fr.json index 562fb658ba..0d0d7931ee 100644 --- a/packages/strapi-plugin-upload/admin/src/translations/fr.json +++ b/packages/strapi-plugin-upload/admin/src/translations/fr.json @@ -1,36 +1,28 @@ { - "ConfigPage.title": "Upload - Paramètres", "ConfigPage.description": "Configurez le plugin upload", - + "ConfigPage.title": "Upload - Paramètres", "EditForm.Input.number.label": "Taille limite acceptée (en MB)", - "EditForm.Input.select.label": "Fournisseurs", "EditForm.Input.select.inputDescription": "Les fichiers peuvent être téléchargés soit sur votre serveur soit sur des providers externes.", + "EditForm.Input.select.label": "Fournisseurs", "EditForm.Input.toggle.label": "Autoriser le téléchargement de fichiers", - "EmptyLi.message": "Aucun fichier n'a été téléchargé", - "EntriesNumber.number": "{number} fichier trouvé", "EntriesNumber.number.plural": "{number} fichiers trouvés", - - "HomePage.title": "Upload", - "HomePage.description": "Découvrez tous les fichiers téléchargés", "HomePage.InputSearch.placeholder": "Rechercher un fichier...", - + "HomePage.description": "Découvrez tous les fichiers téléchargés", + "HomePage.title": "Upload", "Li.linkCopied": "Lien copié dans le presse-papier", - - "ListHeader.type": "Type", "ListHeader.hash": "Hash", "ListHeader.name": "Nom", - "ListHeader.updated": "Modifié", - "ListHeader.size": "Taille", "ListHeader.related": "Relié à", - - "PluginInputFile.text": "Drag & drop vos fichiers dans cette zone ou {link} un fichier à télécharger", + "ListHeader.size": "Taille", + "ListHeader.type": "Type", + "ListHeader.updated": "Modifié", "PluginInputFile.link": "recherchez", "PluginInputFile.loading": "Vos fichiers sont en train d'être téléchargés...", - + "PluginInputFile.text": "Drag & drop vos fichiers dans cette zone ou {link} un fichier à télécharger", "notification.config.success": "Les paramètres ont été mis à jour.", "notification.delete.success": "Le fichier a bien été supprimé", "notification.dropFile.success": "Votre fichier a été téléchargé", "notification.dropFiles.success": "{number} fichiers ont été téléchargées" -} +} \ No newline at end of file diff --git a/packages/strapi-plugin-upload/admin/src/translations/it.json b/packages/strapi-plugin-upload/admin/src/translations/it.json index 0c7407b163..abffc11ad4 100644 --- a/packages/strapi-plugin-upload/admin/src/translations/it.json +++ b/packages/strapi-plugin-upload/admin/src/translations/it.json @@ -1,28 +1,28 @@ { - "ConfigPage.title": "Upload - Impostazioni", - "ConfigPage.description": "Configurare il plugin di caricamento", - "EditForm.Input.number.label": "Dimensione massima consentita (in MB)", - "EditForm.Input.select.label": "Provider", - "EditForm.Input.select.inputDescription": "I file possono essere caricati sul server o su fornitori esterni.", - "EditForm.Input.toggle.label": "Abilitare il caricamento di file", - "EmptyLi.message": "Non ci sono i file caricati", - "EntriesNumber.number": "{number} file trovato", - "EntriesNumber.number.plural": "{number} file trovato", - "HomePage.title": "Caricare", - "HomePage.description": "Scopri tutti i file caricati", - "HomePage.InputSearch.placeholder": "La ricerca di un file...", - "Li.linkCopied": "Link copiato negli appunti", - "ListHeader.type": "Tipo", - "ListHeader.hash": "Hash", - "ListHeader.name": "Nome", - "ListHeader.updated": "Aggiornato", - "ListHeader.size": "Dimensioni", - "ListHeader.related": "Relative al", - "PluginInputFile.text": "Trascinare e rilasciare i file in questa zona, o {link} da un file da caricare", - "PluginInputFile.link": "sfoglia", - "PluginInputFile.loading": "I file vengono caricati...", - "notification.config.success": "Le impostazioni è stato aggiornato", - "notification.delete.success": "Il file è stato cancellato", - "notification.dropFile.success": "Il file è stato caricato", - "notification.dropFiles.success": "{number} file sono stati caricati" + "ConfigPage.description": "Configurare il plugin di caricamento", + "ConfigPage.title": "Upload - Impostazioni", + "EditForm.Input.number.label": "Dimensione massima consentita (in MB)", + "EditForm.Input.select.inputDescription": "I file possono essere caricati sul server o su fornitori esterni.", + "EditForm.Input.select.label": "Provider", + "EditForm.Input.toggle.label": "Abilitare il caricamento di file", + "EmptyLi.message": "Non ci sono i file caricati", + "EntriesNumber.number": "{number} file trovato", + "EntriesNumber.number.plural": "{number} file trovato", + "HomePage.InputSearch.placeholder": "La ricerca di un file...", + "HomePage.description": "Scopri tutti i file caricati", + "HomePage.title": "Caricare", + "Li.linkCopied": "Link copiato negli appunti", + "ListHeader.hash": "Hash", + "ListHeader.name": "Nome", + "ListHeader.related": "Relative al", + "ListHeader.size": "Dimensioni", + "ListHeader.type": "Tipo", + "ListHeader.updated": "Aggiornato", + "PluginInputFile.link": "sfoglia", + "PluginInputFile.loading": "I file vengono caricati...", + "PluginInputFile.text": "Trascinare e rilasciare i file in questa zona, o {link} da un file da caricare", + "notification.config.success": "Le impostazioni è stato aggiornato", + "notification.delete.success": "Il file è stato cancellato", + "notification.dropFile.success": "Il file è stato caricato", + "notification.dropFiles.success": "{number} file sono stati caricati" } \ No newline at end of file diff --git a/packages/strapi-plugin-upload/admin/src/translations/ko.json b/packages/strapi-plugin-upload/admin/src/translations/ko.json index ff79d70bd9..46f4f64663 100644 --- a/packages/strapi-plugin-upload/admin/src/translations/ko.json +++ b/packages/strapi-plugin-upload/admin/src/translations/ko.json @@ -1,36 +1,28 @@ { - "ConfigPage.title": "업로드 설정", "ConfigPage.description": "업로드 플러그인 설정", - + "ConfigPage.title": "업로드 설정", "EditForm.Input.number.label": "최대 허용 크기(MB)", - "EditForm.Input.select.label": "프로바이더(Providers)", "EditForm.Input.select.inputDescription": "파일을 서버 또는 외부 프로바이더에 업로드할 수 있습니다.", + "EditForm.Input.select.label": "프로바이더(Providers)", "EditForm.Input.toggle.label": "파일 업로드 허용", - "EmptyLi.message": "업로드된 파일이 없습니다.", - "EntriesNumber.number": "{number}개의 파일이 있습니다.", "EntriesNumber.number.plural": "{number}개의 파일이 있습니다.", - - "HomePage.title": "파일 업로드", - "HomePage.description": "파일을 업로드하고 관리합니다.", "HomePage.InputSearch.placeholder": "파일 검색...", - + "HomePage.description": "파일을 업로드하고 관리합니다.", + "HomePage.title": "파일 업로드", "Li.linkCopied": "링크를 클립보드로 복사했습니다.", - - "ListHeader.type": "타입", "ListHeader.hash": "해시(Hash)", "ListHeader.name": "이름", - "ListHeader.updated": "수정", - "ListHeader.size": "크기", "ListHeader.related": "연관", - - "PluginInputFile.text": "업로드 할 파일을 끌어 넣거나 {link} 하세요", + "ListHeader.size": "크기", + "ListHeader.type": "타입", + "ListHeader.updated": "수정", "PluginInputFile.link": "선택", "PluginInputFile.loading": "파일을 업로드합니다.", - + "PluginInputFile.text": "업로드 할 파일을 끌어 넣거나 {link} 하세요", "notification.config.success": "설정을 업데이트했습니다.", "notification.delete.success": "파일을 삭제했습니다.", "notification.dropFile.success": "파일을 업로드했습니다.", "notification.dropFiles.success": "{number}개의 파일을 업로드 했습니다." -} +} \ No newline at end of file diff --git a/packages/strapi-plugin-upload/admin/src/translations/nl.json b/packages/strapi-plugin-upload/admin/src/translations/nl.json index 3caa72c7d5..a77ca9f3b8 100644 --- a/packages/strapi-plugin-upload/admin/src/translations/nl.json +++ b/packages/strapi-plugin-upload/admin/src/translations/nl.json @@ -1,36 +1,28 @@ { - "ConfigPage.title": "Upload - Instellingen", "ConfigPage.description": "Configureer de upload extensie", - + "ConfigPage.title": "Upload - Instellingen", "EditForm.Input.number.label": "Maximale toegestane grootte (in MB)", - "EditForm.Input.select.label": "Leveranciers", "EditForm.Input.select.inputDescription": "Bestanden kunnen of geüpload worden op jouw server of bij een externe leverancier", + "EditForm.Input.select.label": "Leveranciers", "EditForm.Input.toggle.label": "Bestand upload inschakelen", - "EmptyLi.message": "Er zijn geen geüploade bestanden", - "EntriesNumber.number": "{number} bestand gevonden", "EntriesNumber.number.plural": "{number} bestanden gevonden", - - "HomePage.title": "Upload", - "HomePage.description": "Bekijk alle geüploade bestanden", "HomePage.InputSearch.placeholder": "Naar een bestand zoeken...", - + "HomePage.description": "Bekijk alle geüploade bestanden", + "HomePage.title": "Upload", "Li.linkCopied": "Link gekopieerd naar klembord", - - "ListHeader.type": "Type", "ListHeader.hash": "Hash", "ListHeader.name": "Naam", - "ListHeader.updated": "Geüpdatet", - "ListHeader.size": "Grootte", "ListHeader.related": "Gerelateerd aan", - - "PluginInputFile.text": "Sleep bestanden in dit gebied of {link} van een bestand om te uploaden", + "ListHeader.size": "Grootte", + "ListHeader.type": "Type", + "ListHeader.updated": "Geüpdatet", "PluginInputFile.link": "doorbladeren", "PluginInputFile.loading": "Je bestanden worden geüpload...", - + "PluginInputFile.text": "Sleep bestanden in dit gebied of {link} van een bestand om te uploaden", "notification.config.success": "De instellingen zijn geüpdatet", "notification.delete.success": "Het bestand is verwijderd", "notification.dropFile.success": "Je bestand is geüpload", "notification.dropFiles.success": "{number} bestanden zijn geüpload" -} +} \ No newline at end of file diff --git a/packages/strapi-plugin-upload/admin/src/translations/pl.json b/packages/strapi-plugin-upload/admin/src/translations/pl.json index bc33302f01..50ef7699a9 100644 --- a/packages/strapi-plugin-upload/admin/src/translations/pl.json +++ b/packages/strapi-plugin-upload/admin/src/translations/pl.json @@ -1,36 +1,28 @@ { - "ConfigPage.title": "Pliki - Ustawienia", "ConfigPage.description": "Konfiguracja wtyczki służącej do przesyłania plików.", - + "ConfigPage.title": "Pliki - Ustawienia", "EditForm.Input.number.label": "Maksymalny dozwolony rozmiar (w MB)", - "EditForm.Input.select.label": "Dostawcy", "EditForm.Input.select.inputDescription": "Pliki mogą zostać przesłane na serwer lub zewnętrzne źródła.", + "EditForm.Input.select.label": "Dostawcy", "EditForm.Input.toggle.label": "Włącz przesyłanie plików", - "EmptyLi.message": "Żaden plik nie został jeszcze przesłany", - "EntriesNumber.number": "{number} plik znaleziony", "EntriesNumber.number.plural": "{number} plików znalezionych", - - "HomePage.title": "Pliki", - "HomePage.description": "Przeglądaj wszystkie przesłane pliki.", "HomePage.InputSearch.placeholder": "Szukaj...", - + "HomePage.description": "Przeglądaj wszystkie przesłane pliki.", + "HomePage.title": "Pliki", "Li.linkCopied": "Link został skopiowany do schowka", - - "ListHeader.type": "Typ", "ListHeader.hash": "Hash", "ListHeader.name": "Nazwa", - "ListHeader.updated": "Aktualizacja", - "ListHeader.size": "Rozmiar", "ListHeader.related": "Związany z", - - "PluginInputFile.text": "Przeciągnij & upuść pliki w to miejsce lub {link} pliki do przesłania.", + "ListHeader.size": "Rozmiar", + "ListHeader.type": "Typ", + "ListHeader.updated": "Aktualizacja", "PluginInputFile.link": "przeglądaj", "PluginInputFile.loading": "Twoje pliki są właśnie przesyłane...", - + "PluginInputFile.text": "Przeciągnij & upuść pliki w to miejsce lub {link} pliki do przesłania.", "notification.config.success": "Ustawienia zostały zaaktualizowane", "notification.delete.success": "Plik został usunięty", "notification.dropFile.success": "Plik został przesłany", "notification.dropFiles.success": "{number} plików zostało przesłanych" -} +} \ No newline at end of file diff --git a/packages/strapi-plugin-upload/admin/src/translations/pt-BR.json b/packages/strapi-plugin-upload/admin/src/translations/pt-BR.json index e4ae3bc073..2a5ea2b05e 100644 --- a/packages/strapi-plugin-upload/admin/src/translations/pt-BR.json +++ b/packages/strapi-plugin-upload/admin/src/translations/pt-BR.json @@ -1,34 +1,26 @@ { - "ConfigPage.title": "Enviar Arquivos - Configurações", "ConfigPage.description": "Configure a extensão para envio de arquivos", - + "ConfigPage.title": "Enviar Arquivos - Configurações", "EditForm.Input.number.label": "Tamanho máximo permitido (em MB)", - "EditForm.Input.select.label": "Provedores", "EditForm.Input.select.inputDescription": "Arquivos podem ser transferidos em seu servidor ou num provedor externo.", + "EditForm.Input.select.label": "Provedores", "EditForm.Input.toggle.label": "Ativar o envio de arquivos", - "EmptyLi.message": "Nenhum arquivo enviado", - "EntriesNumber.number": "{number} arquivo encontrado", "EntriesNumber.number.plural": "{number} arquivos encontrados", - - "HomePage.title": "Enviar Arquivos", - "HomePage.description": "Ver todos os arquivos enviados", "HomePage.InputSearch.placeholder": "Buscar arquivo...", - + "HomePage.description": "Ver todos os arquivos enviados", + "HomePage.title": "Enviar Arquivos", "Li.linkCopied": "Link copiado para a área de transferência", - - "ListHeader.type": "Tipo", "ListHeader.hash": "Hash", "ListHeader.name": "Nome", - "ListHeader.updated": "Atualizado", - "ListHeader.size": "Tamanho", "ListHeader.related": "Relacionado à", - - "PluginInputFile.text": "Arraste & solte os seus arquivos nesta area ou {link} um arquivo para enviar", + "ListHeader.size": "Tamanho", + "ListHeader.type": "Tipo", + "ListHeader.updated": "Atualizado", "PluginInputFile.link": "selecione", "PluginInputFile.loading": "Seus arquivos estão sendo enviados...", - + "PluginInputFile.text": "Arraste & solte os seus arquivos nesta area ou {link} um arquivo para enviar", "notification.config.success": "As configurações foram atualizadas", "notification.delete.success": "O arquivo foi removido", "notification.dropFile.success": "Seu arquivo foi enviado com sucesso", diff --git a/packages/strapi-plugin-upload/admin/src/translations/pt.json b/packages/strapi-plugin-upload/admin/src/translations/pt.json index 73a5c1a6ea..11f0aa6c17 100644 --- a/packages/strapi-plugin-upload/admin/src/translations/pt.json +++ b/packages/strapi-plugin-upload/admin/src/translations/pt.json @@ -1,37 +1,28 @@ { - "ConfigPage.title": "Transferência - Definições", - "ConfigPage.description": "Configure a extensão de transferência", - - "EditForm.Input.number.label": "Tamanho máximo permitido (em MB)", - "EditForm.Input.select.label": "Provedores", - "EditForm.Input.select.inputDescription": "Arquivos podem ser transferidos em seu servidor ou num provedor externo.", - "EditForm.Input.toggle.label": "Activar a transferência do arquivo", - - "EmptyLi.message": "Sem arquivos transferidos", - - "EntriesNumber.number": "{number} arquivo encontrado", - "EntriesNumber.number.plural": "{number} arquivos encontrados", - - "HomePage.title": "Transferir", - "HomePage.description": "Ver todos os ficheiros transferidos", - "HomePage.InputSearch.placeholder": "Procurar um arquivo...", - - "Li.linkCopied": "Link copiado para a área de transferência", - - "ListHeader.type": "Tipo", - "ListHeader.hash": "Hash", - "ListHeader.name": "Nome", - "ListHeader.updated": "Actualizado", - "ListHeader.size": "Tamanho", - "ListHeader.related": "Relacionado à", - - "PluginInputFile.text": "Arraste & solte os seus arquivos nesta area ou {link} um arquivo para transferir", - "PluginInputFile.link": "procure", - "PluginInputFile.loading": "Seus arquivos estão sendo transferidos...", - - "notification.config.success": "As configurações foram actualizadas", - "notification.delete.success": "O arquivo foi apagado", - "notification.dropFile.success": "Seu arquivo foi transferido com sucesso", - "notification.dropFiles.success": "{number} arquivos foram transferidos com sucesso" - } - \ No newline at end of file + "ConfigPage.description": "Configure a extensão de transferência", + "ConfigPage.title": "Transferência - Definições", + "EditForm.Input.number.label": "Tamanho máximo permitido (em MB)", + "EditForm.Input.select.inputDescription": "Arquivos podem ser transferidos em seu servidor ou num provedor externo.", + "EditForm.Input.select.label": "Provedores", + "EditForm.Input.toggle.label": "Activar a transferência do arquivo", + "EmptyLi.message": "Sem arquivos transferidos", + "EntriesNumber.number": "{number} arquivo encontrado", + "EntriesNumber.number.plural": "{number} arquivos encontrados", + "HomePage.InputSearch.placeholder": "Procurar um arquivo...", + "HomePage.description": "Ver todos os ficheiros transferidos", + "HomePage.title": "Transferir", + "Li.linkCopied": "Link copiado para a área de transferência", + "ListHeader.hash": "Hash", + "ListHeader.name": "Nome", + "ListHeader.related": "Relacionado à", + "ListHeader.size": "Tamanho", + "ListHeader.type": "Tipo", + "ListHeader.updated": "Actualizado", + "PluginInputFile.link": "procure", + "PluginInputFile.loading": "Seus arquivos estão sendo transferidos...", + "PluginInputFile.text": "Arraste & solte os seus arquivos nesta area ou {link} um arquivo para transferir", + "notification.config.success": "As configurações foram actualizadas", + "notification.delete.success": "O arquivo foi apagado", + "notification.dropFile.success": "Seu arquivo foi transferido com sucesso", + "notification.dropFiles.success": "{number} arquivos foram transferidos com sucesso" +} \ No newline at end of file diff --git a/packages/strapi-plugin-upload/admin/src/translations/ru.json b/packages/strapi-plugin-upload/admin/src/translations/ru.json index e7af308f65..66a28d4b1b 100644 --- a/packages/strapi-plugin-upload/admin/src/translations/ru.json +++ b/packages/strapi-plugin-upload/admin/src/translations/ru.json @@ -1,37 +1,28 @@ { - "ConfigPage.title": "Загрузка файлов - Настройки", - "ConfigPage.description": "Настройте плагин загрузок", - - "EditForm.Input.number.label": "Максимальный размер файлов (в MB)", - "EditForm.Input.select.label": "Провайдеры", - "EditForm.Input.select.inputDescription": "Файлы могут быть загружены как на ваш сервер так и стороннему провайдеру.", - "EditForm.Input.toggle.label": "Включить загрузку файлов", - - "EmptyLi.message": "Нет загруженных файлов", - - "EntriesNumber.number": "{number} файл найден", - "EntriesNumber.number.plural": "Количество найденных файлов: {number}", - - "HomePage.title": "Загрузка файлов", - "HomePage.description": "Посмотреть все загруженные файлы", - "HomePage.InputSearch.placeholder": "Искать файл...", - - "Li.linkCopied": "Ссылка скопирована в буфер обмена", - - "ListHeader.type": "Тип", - "ListHeader.hash": "Хеш", - "ListHeader.name": "Название", - "ListHeader.updated": "Обновлен", - "ListHeader.size": "Размер", - "ListHeader.related": "Связан с", - - "PluginInputFile.text": "Претащите файлы на эту область или {link} локальный файл", - "PluginInputFile.link": "выберите", - "PluginInputFile.loading": "Ваши файлы загружаются...", - - "notification.config.success": "Настройки обновлены", - "notification.delete.success": "Файл удален", - "notification.dropFile.success": "Ваш файл загружен", - "notification.dropFiles.success": "Файлов загружено: {number}" - } - \ No newline at end of file + "ConfigPage.description": "Настройте плагин загрузок", + "ConfigPage.title": "Загрузка файлов - Настройки", + "EditForm.Input.number.label": "Максимальный размер файлов (в MB)", + "EditForm.Input.select.inputDescription": "Файлы могут быть загружены как на ваш сервер так и стороннему провайдеру.", + "EditForm.Input.select.label": "Провайдеры", + "EditForm.Input.toggle.label": "Включить загрузку файлов", + "EmptyLi.message": "Нет загруженных файлов", + "EntriesNumber.number": "{number} файл найден", + "EntriesNumber.number.plural": "Количество найденных файлов: {number}", + "HomePage.InputSearch.placeholder": "Искать файл...", + "HomePage.description": "Посмотреть все загруженные файлы", + "HomePage.title": "Загрузка файлов", + "Li.linkCopied": "Ссылка скопирована в буфер обмена", + "ListHeader.hash": "Хеш", + "ListHeader.name": "Название", + "ListHeader.related": "Связан с", + "ListHeader.size": "Размер", + "ListHeader.type": "Тип", + "ListHeader.updated": "Обновлен", + "PluginInputFile.link": "выберите", + "PluginInputFile.loading": "Ваши файлы загружаются...", + "PluginInputFile.text": "Претащите файлы на эту область или {link} локальный файл", + "notification.config.success": "Настройки обновлены", + "notification.delete.success": "Файл удален", + "notification.dropFile.success": "Ваш файл загружен", + "notification.dropFiles.success": "Файлов загружено: {number}" +} \ No newline at end of file diff --git a/packages/strapi-plugin-upload/admin/src/translations/tr.json b/packages/strapi-plugin-upload/admin/src/translations/tr.json index bebb044ba1..c9316bafdb 100644 --- a/packages/strapi-plugin-upload/admin/src/translations/tr.json +++ b/packages/strapi-plugin-upload/admin/src/translations/tr.json @@ -1,36 +1,28 @@ { - "ConfigPage.title": "Yükle - Ayarlar", "ConfigPage.description": "Yükleme eklentisini yapılandır.", - + "ConfigPage.title": "Yükle - Ayarlar", "EditForm.Input.number.label": "Yüklenebilecek maksimum dosya boyutu(MB)", - "EditForm.Input.select.label": "Sağlayıcılar", "EditForm.Input.select.inputDescription": "Dosyalar sunucunuza veya harici sağlayıcılara yüklenebilir.", + "EditForm.Input.select.label": "Sağlayıcılar", "EditForm.Input.toggle.label": "Dosya yükleme etkin", - "EmptyLi.message": "Yüklenmiş dosya bulunmamaktadır.", - "EntriesNumber.number": "{number} dosya bulundu", "EntriesNumber.number.plural": "{number} dosya bulundu", - - "HomePage.title": "Yükle", - "HomePage.description": "Yüklenen dosyalar", "HomePage.InputSearch.placeholder": "Dosya ara...", - + "HomePage.description": "Yüklenen dosyalar", + "HomePage.title": "Yükle", "Li.linkCopied": "Bağlantı, panoya kopyalandı", - - "ListHeader.type": "Tip", "ListHeader.hash": "Hash", "ListHeader.name": "İsim", - "ListHeader.updated": "Yüklendi", - "ListHeader.size": "Boyut", "ListHeader.related": "İlişkili", - - "PluginInputFile.text": "Dosyanızı bu alana sürükleyip bırakın ya da dosya yüklemek için {link}", + "ListHeader.size": "Boyut", + "ListHeader.type": "Tip", + "ListHeader.updated": "Yüklendi", "PluginInputFile.link": "gözat", "PluginInputFile.loading": "Dosyalarınız yükleniyor...", - + "PluginInputFile.text": "Dosyanızı bu alana sürükleyip bırakın ya da dosya yüklemek için {link}", "notification.config.success": "Ayarlar güncellendi.", "notification.delete.success": "Dosya silindi", "notification.dropFile.success": "Dosyanız yüklendi", "notification.dropFiles.success": "{number} dosyalar yüklendi" -} +} \ No newline at end of file diff --git a/packages/strapi-plugin-upload/admin/src/translations/zh-Hans.json b/packages/strapi-plugin-upload/admin/src/translations/zh-Hans.json index 8cefc87eda..7e6ece88b2 100644 --- a/packages/strapi-plugin-upload/admin/src/translations/zh-Hans.json +++ b/packages/strapi-plugin-upload/admin/src/translations/zh-Hans.json @@ -1,36 +1,28 @@ { - "ConfigPage.title": "上传-设置", "ConfigPage.description": "配置上传插件", - + "ConfigPage.title": "上传-设置", "EditForm.Input.number.label": "最大文件限制 (单位:MB)", - "EditForm.Input.select.label": "Providers", "EditForm.Input.select.inputDescription": "文件可以上传到服务器上,也可以上传到外部存储服务供应商。", + "EditForm.Input.select.label": "Providers", "EditForm.Input.toggle.label": "启用文件上传", - "EmptyLi.message": "没有上传的文件", - "EntriesNumber.number": "找到 {number} 个文件", "EntriesNumber.number.plural": "找到 {number} 个文件", - - "HomePage.title": "上传", - "HomePage.description": "发现所有上传的文件", "HomePage.InputSearch.placeholder": "搜索文件…", - + "HomePage.description": "发现所有上传的文件", + "HomePage.title": "上传", "Li.linkCopied": "链接复制到剪贴板", - - "ListHeader.type": "类型", "ListHeader.hash": "Hash", "ListHeader.name": "文件名", - "ListHeader.updated": "更新时间", - "ListHeader.size": "大小", "ListHeader.related": "Related to", - - "PluginInputFile.text": "将文件拖放到该区域或 {link} 文件上传", + "ListHeader.size": "大小", + "ListHeader.type": "类型", + "ListHeader.updated": "更新时间", "PluginInputFile.link": "浏览", "PluginInputFile.loading": "您的文件正在上传…", - + "PluginInputFile.text": "将文件拖放到该区域或 {link} 文件上传", "notification.config.success": "设置已更新", "notification.delete.success": "文件已被删除", "notification.dropFile.success": "您的文件已上传", "notification.dropFiles.success": "{number} 个文件已上传" -} +} \ No newline at end of file diff --git a/packages/strapi-plugin-upload/admin/src/translations/zh.json b/packages/strapi-plugin-upload/admin/src/translations/zh.json index 8aa3f0cfcf..80bf2738f6 100644 --- a/packages/strapi-plugin-upload/admin/src/translations/zh.json +++ b/packages/strapi-plugin-upload/admin/src/translations/zh.json @@ -1,26 +1,20 @@ { "EmptyLi.message": "您目前沒有上傳任何檔案", - "EntriesNumber.number": "找到 {number} 個檔案", "EntriesNumber.number.plural": "找到 {number} 個檔案", - - "HomePage.title": "上傳", - "HomePage.description": "查看所有上傳的檔案", "HomePage.InputSearch.placeholder": "尋找檔案...", - + "HomePage.description": "查看所有上傳的檔案", + "HomePage.title": "上傳", "Li.linkCopied": "連結已複製到剪貼簿", - - "ListHeader.type": "類型", "ListHeader.hash": "Hash", "ListHeader.name": "名稱", - "ListHeader.updated": "已更新", - "ListHeader.size": "大小", "ListHeader.related": "關聯到", - - "PluginInputFile.text": "拖拉您的檔案到這個地方,或是連到 {link} 來上傳", + "ListHeader.size": "大小", + "ListHeader.type": "類型", + "ListHeader.updated": "已更新", "PluginInputFile.link": "瀏覽", - + "PluginInputFile.text": "拖拉您的檔案到這個地方,或是連到 {link} 來上傳", "notification.delete.success": "檔案已刪除", "notification.dropFile.success": "您的檔案已上傳", "notification.dropFiles.success": "{number} 個檔案已上傳" -} +} \ No newline at end of file diff --git a/packages/strapi-plugin-users-permissions/admin/src/translations/ar.json b/packages/strapi-plugin-users-permissions/admin/src/translations/ar.json index 37d7ba274e..c78f12692c 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/translations/ar.json +++ b/packages/strapi-plugin-users-permissions/admin/src/translations/ar.json @@ -1,177 +1,144 @@ { - "Auth.form.button.register-success": "إعادة الإرسال", - "Auth.form.button.forgot-password.success": "إعادة الإرسال", + "Auth.advanced.allow_register": "", "Auth.form.button.forgot-password": "إرسال للبريد", - "Auth.form.button.reset-password": "تغيير كلمة السر", + "Auth.form.button.forgot-password.success": "إعادة الإرسال", "Auth.form.button.login": "تسجيل دخول", "Auth.form.button.register": "مستعد للبدء", + "Auth.form.button.register-success": "إعادة الإرسال", + "Auth.form.button.reset-password": "تغيير كلمة السر", + "Auth.form.error.code.provide": "الرمز المقدم غير صحيح.", + "Auth.form.error.email.invalid": "هذا البريد الاكتروني غير صالح.", + "Auth.form.error.email.provide": "يرجى تقديم اسم المستخدم الخاص بك أو البريد الإلكتروني الخاص بك.", + "Auth.form.error.email.taken": "البريد الإلكتروني مسجل بالفعل", + "Auth.form.error.invalid": "المعرّف أو كلمة المرور غير صالحين.", "Auth.form.error.noAdminAccess": "لا تملك الصلاحية للدخول الى لوحة الإدارة.", - + "Auth.form.error.params.provide": "المعلومات المقدمة غير صحيحة.", + "Auth.form.error.password.format": "لا يمكن أن تحتوي كلمة مرورك على الرمز `$` أكثر من ثلاث مرات.", + "Auth.form.error.password.local": "لم يقم هذا المستخدم بتعيين كلمة مرور محلية مطلقًا ، الرجاء تسجيل الدخول عبر الموفر المستخدم أثناء إنشاء الحساب.", + "Auth.form.error.password.matching": "كلمة المرور غير مطابقة.", + "Auth.form.error.password.provide": "يرجى تقديم كلمة المرور الخاصة بك.", + "Auth.form.error.user.not-exist": "هذا الإميل غير موجود.", + "Auth.form.error.username.taken": "اسم المستخدم مسجل بالفعل", "Auth.form.forgot-password.email.label": "ادخل ايميلك", "Auth.form.forgot-password.email.label.success": "تم إرسال الرسالة بنجاح الى", "Auth.form.forgot-password.email.placeholder": "mysuperemail@gmail.com", - - "Auth.header.register.description": "لإنهاء الإعداد وتأمين تطبيقك ، يرجى إنشاء أول مستخدم (مسؤول أساسي) عن طريق إدخال المعلومات الضرورية أدناه.", - "Auth.form.header.login": "strapi", "Auth.form.header.forgot-password": "strapi", + "Auth.form.header.login": "strapi", "Auth.form.header.register": "مرحبًا!", "Auth.form.header.register-success": "strapi", - "Auth.form.login.password.label": "كلمة السر", "Auth.form.login.rememberMe.label": "تذكرني", "Auth.form.login.username.label": "اسم المستخدم", "Auth.form.login.username.placeholder": "اكتب اسمك هنا (مثل: خالد سالم)", - - "Auth.form.register.email.label": "البريد الإكتروني", - "Auth.form.register.email.placeholder": "mysuperemail@example.com", - "Auth.form.register.username.label": "اسم المستخدم", - "Auth.form.register.username.placeholder": "اكتب اسمك هنا (مثل: خالد سالم)", - "Auth.form.register.password.label": "كلمة السر", - "Auth.form.register.confirmPassword.label": "تأكيد كلمة السر", - "Auth.form.register.news.label": "ابقيني محدّثًا عن الميزات الجديدة والتحسينات القادمة.", - "Auth.form.register-success.email.label": "الأيميل ارسل بنجاح الى", "Auth.form.register-success.email.placeholder": "mysuperemail@gmail.com", - - "Auth.form.error.email.provide": "يرجى تقديم اسم المستخدم الخاص بك أو البريد الإلكتروني الخاص بك.", - "Auth.form.error.email.invalid": "هذا البريد الاكتروني غير صالح.", - "Auth.form.error.password.provide": "يرجى تقديم كلمة المرور الخاصة بك.", - "Auth.form.error.invalid": "المعرّف أو كلمة المرور غير صالحين.", - "Auth.form.error.password.local": "لم يقم هذا المستخدم بتعيين كلمة مرور محلية مطلقًا ، الرجاء تسجيل الدخول عبر الموفر المستخدم أثناء إنشاء الحساب.", - "Auth.form.error.password.format": "لا يمكن أن تحتوي كلمة مرورك على الرمز `$` أكثر من ثلاث مرات.", - "Auth.form.error.user.not-exist": "هذا الإميل غير موجود.", - "Auth.form.error.code.provide": "الرمز المقدم غير صحيح.", - "Auth.form.error.password.matching": "كلمة المرور غير مطابقة.", - "Auth.form.error.params.provide": "المعلومات المقدمة غير صحيحة.", - "Auth.form.error.username.taken": "اسم المستخدم مسجل بالفعل", - "Auth.form.error.email.taken": "البريد الإلكتروني مسجل بالفعل", - + "Auth.form.register.confirmPassword.label": "تأكيد كلمة السر", + "Auth.form.register.email.label": "البريد الإكتروني", + "Auth.form.register.email.placeholder": "mysuperemail@example.com", + "Auth.form.register.news.label": "ابقيني محدّثًا عن الميزات الجديدة والتحسينات القادمة.", + "Auth.form.register.password.label": "كلمة السر", + "Auth.form.register.username.label": "اسم المستخدم", + "Auth.form.register.username.placeholder": "اكتب اسمك هنا (مثل: خالد سالم)", + "Auth.header.register.description": "لإنهاء الإعداد وتأمين تطبيقك ، يرجى إنشاء أول مستخدم (مسؤول أساسي) عن طريق إدخال المعلومات الضرورية أدناه.", "Auth.link.forgot-password": "هل نسيت كلمة السر الخاصة بك؟", "Auth.link.ready": "مستعد لتسجيل الدخول؟", - "BoundRoute.title": "Bound route to", - - "components.Input.error.password.noMatch": "كلمات السر لا تتطابق", - "Controller.input.label": "{label} ", "Controller.selectAll": "تحديد الكل", - - "EditForm.inputSelect.label.role": "الدور الافتراضي للمستخدمين المصادقين", "EditForm.inputSelect.description.role": "سيتم إرفاق المستخدم المصادق الجديد بالدور المحدد.", - "EditForm.inputSelect.subscriptions.label": "إدارة حصص الاشتراك", - "EditForm.inputSelect.subscriptions.description": "حدد عدد الاشتراكات لكل IP في الساعة.", - "EditForm.inputSelect.durations.label": "المدة", "EditForm.inputSelect.durations.description": "عدد الساعات التي لا يمكن للمستخدم الاشتراك خلالها.", - - "EditForm.inputToggle.label.email": "حساب واحد لكل بريد الاكتروني", - "EditForm.inputToggle.label.sign-up": "تفعيل التسجيل", + "EditForm.inputSelect.durations.label": "المدة", + "EditForm.inputSelect.label.role": "الدور الافتراضي للمستخدمين المصادقين", + "EditForm.inputSelect.subscriptions.description": "حدد عدد الاشتراكات لكل IP في الساعة.", + "EditForm.inputSelect.subscriptions.label": "إدارة حصص الاشتراك", "EditForm.inputToggle.description.email": "عدم السماح للمستخدم بإنشاء حسابات متعددة باستخدام نفس عنوان البريد الإلكتروني مع موفري مصادقة مختلفين.", "EditForm.inputToggle.description.sign-up": "عند تعطيل (OFF) ، يتم حظر عملية التسجيل. لا أحد يستطيع الاشتراك بعد الآن بغض النظر عن المزود المستخدم.", - + "EditForm.inputToggle.label.email": "حساب واحد لكل بريد الاكتروني", + "EditForm.inputToggle.label.sign-up": "تفعيل التسجيل", "EditPage.cancel": "الغاء", - "EditPage.submit": "حفظ", "EditPage.form.roles": "تفاصيل الدور", "EditPage.form.roles.label.description": "الوصف", "EditPage.form.roles.label.name": "الأسم", "EditPage.form.roles.label.users": "المستخدمون المرتبطون بهذا الدور ({number})", "EditPage.form.roles.name.error": "القيمة مطلوبة.", - "EditPage.header.title": "{name} ", - "EditPage.header.title.create": "إنشاء دور جديد", "EditPage.header.description": "{description} ", "EditPage.header.description.create": " ", - + "EditPage.header.title": "{name} ", + "EditPage.header.title.create": "إنشاء دور جديد", "EditPage.notification.permissions.error": "حدث خطأ أثناء جلب الأذونات", "EditPage.notification.policies.error": "حدث خطأ أثناء جلب السياسات", "EditPage.notification.role.error": "حدث خطأ أثناء جلب الدور", - + "EditPage.submit": "حفظ", + "Email.template.reset_password": "إعادة تعيين كلمة المرور", + "Email.template.success_register": "التسجيل ناجح", + "Email.template.validation_email": "التحقق من صحة عنوان البريد الإلكتروني", "HeaderNav.link.advancedSettings": "إعدادات متقدمة", "HeaderNav.link.emailTemplates": "قوالب الإيميل", "HeaderNav.link.providers": "مزودين", "HeaderNav.link.roles": "الأدوار والأذونات", - - "HomePage.header.title": "الأدوار والأذونات", "HomePage.header.description": "حدد الأدوار والأذونات للمستخدمين لديك.", - + "HomePage.header.title": "الأدوار والأذونات", "InputSearch.placeholder": "ابحث عن مستخدم", - - "List.button.roles": "إضافة دور جديد", "List.button.providers": "إضافة موفر جديد", - - "List.title.emailTemplates.singular": "يتوفر {number} نموذج للبريد الإلكتروني", + "List.button.roles": "إضافة دور جديد", "List.title.emailTemplates.plural": "يتوفر {number} نماذج للبريد الإلكتروني", - - "List.title.providers.disabled.singular": "{number} معطل", + "List.title.emailTemplates.singular": "يتوفر {number} نموذج للبريد الإلكتروني", "List.title.providers.disabled.plural": "{number} معطلين", - "List.title.providers.enabled.singular": "يتم تمكين {number} مزود و", + "List.title.providers.disabled.singular": "{number} معطل", "List.title.providers.enabled.plural": "يتم تمكين {number} مزودين و", - - "List.title.roles.singular": "{number} دور متوفر", + "List.title.providers.enabled.singular": "يتم تمكين {number} مزود و", "List.title.roles.plural": "{number} ادوار متوفرة", - - "notification.error.delete": "حدث خطأ أثناء محاولة حذف العنصر", - "notification.error.fetch": "حدث خطأ أثناء محاولة جلب البيانات", - "notification.error.fetchUser": "حدث خطأ أثناء محاولة جلب المستخدمين", - "notification.info.emailSent": "تم إرسال البريد الإلكتروني", - "notification.success.delete": "تم حذف هذا العنصر", - "notification.success.submit": "تم تحديث الإعدادات", - - "plugin.description.short": "حماية الـAPI الخاص بك مع عملية مصادقة كاملة استناداً إلى JWT", - "plugin.description.long": "حماية الـAPI الخاص بك مع عملية مصادقة كاملة استناداً إلى JWT. يأتي هذا الملحق أيضًا مع إستراتيجية ACL التي تسمح لك بإدارة الأذونات بين مجموعات المستخدمين.", - + "List.title.roles.singular": "{number} دور متوفر", "Plugin.permissions.application.description": "حدد جميع الإجراءات المسموح بها لمشروعك.", "Plugin.permissions.plugins.description": "حدد جميع الإجراءات المسموح بها للإضافة {name}.", - - "Plugins.header.title": "الصلاحيات", "Plugins.header.description": "يتم سرد الإجراءات المحددة المرتبطة بالمسار أدناه.", - + "Plugins.header.title": "الصلاحيات", "Policies.InputSelect.empty": "لا شيء", "Policies.InputSelect.label": "السماح بتنفيذ هذا الإجراء لـ:", "Policies.header.hint": "حدد إجراءات التطبيق أو إجراءات الإضافة وانقر على رمز الترس لعرض المسار المرتبط", "Policies.header.title": "إعدادات متقدمة", - - "Email.template.validation_email": "التحقق من صحة عنوان البريد الإلكتروني", - "Email.template.reset_password": "إعادة تعيين كلمة المرور", - "Email.template.success_register": "التسجيل ناجح", - - "Auth.advanced.allow_register": "", - + "PopUpForm.Email.email_templates.inputDescription": "إذا كنت غير متأكد من كيفية استخدام المتغيرات ، {link}", + "PopUpForm.Email.link.documentation": "تحقق من وثائقنا.", + "PopUpForm.Email.options.from.email.label": "البريد الإلكتروني للشاحن", + "PopUpForm.Email.options.from.email.placeholder": "johndoe@gmail.com", + "PopUpForm.Email.options.from.name.label": "أسم المورد", + "PopUpForm.Email.options.from.name.placeholder": "John Doe", + "PopUpForm.Email.options.message.label": "الرسالة", + "PopUpForm.Email.options.object.label": "موضوع", + "PopUpForm.Email.options.response_email.label": "البريد الإلكتروني للاستجابة", + "PopUpForm.Email.options.response_email.placeholder": "johndoe@gmail.com", + "PopUpForm.Email.reset_password.options.message.placeholder": "

يرجى النقر على هذا الرابط لتأكيد حسابك

", + "PopUpForm.Email.reset_password.options.object.placeholder": "يرجى تأكيد عنوان بريدك الإلكتروني لـ %APP_NAME%", + "PopUpForm.Email.success_register.options.message.placeholder": "

يرجى النقر على هذا الرابط لتأكيد حسابك

", + "PopUpForm.Email.success_register.options.object.placeholder": "يرجى تأكيد عنوان بريدك الإلكتروني لـ %APP_NAME%", + "PopUpForm.Email.validation_email.options.message.placeholder": "

يرجى النقر على هذا الرابط لتأكيد حسابك

", + "PopUpForm.Email.validation_email.options.object.placeholder": "يرجى تأكيد عنوان بريدك الإلكتروني لـ %APP_NAME%", + "PopUpForm.Providers.callback.placeholder": "نص", + "PopUpForm.Providers.enabled.description": "في حالة التعطيل ، لن يتمكن المستخدمون من استخدام هذا الموفر.", + "PopUpForm.Providers.enabled.label": "مفعل", + "PopUpForm.Providers.facebook.providerConfig.redirectURL": "عنوان URL لإعادة التوجيه لإضافتة تكوين تطبيق Facebook", + "PopUpForm.Providers.github.providerConfig.redirectURL": "عنوان URL لإعادة التوجيه لإضافتة تكوين تطبيق Github", + "PopUpForm.Providers.google.providerConfig.redirectURL": "عنوان URL لإعادة التوجيه لإضافتة تكوين تطبيق Google", + "PopUpForm.Providers.key.label": "معرف العميل", + "PopUpForm.Providers.key.placeholder": "نص", + "PopUpForm.Providers.linkedin2.providerConfig.redirectURL": "عنوان URL لإعادة التوجيه لإضافتة تكوين تطبيق Linkedin", + "PopUpForm.Providers.redirectURL.front-end.label": "عنوان URL لإعادة التوجيه إلى تطبيق الواجهة الأمامية (front-end)", + "PopUpForm.Providers.secret.label": "سر العميل (Client Secret)", + "PopUpForm.Providers.secret.placeholder": "نص", + "PopUpForm.Providers.twitter.providerConfig.redirectURL": "عنوان URL لإعادة التوجيه لإضافتة تكوين تطبيق Twitter", "PopUpForm.button.cancel": "الغاء", "PopUpForm.button.save": "حفظ", "PopUpForm.header.add.providers": "إضافة موفر جديد", "PopUpForm.header.edit.email-templates": "تحرير قوالب البريد الإلكتروني", "PopUpForm.header.edit.providers": "تحرير موفر {provider}", "PopUpForm.inputSelect.providers.label": "اختر الموفر", - "PopUpForm.Email.options.from.name.label": "أسم المورد", - "PopUpForm.Email.options.from.email.label": "البريد الإلكتروني للشاحن", - "PopUpForm.Email.options.response_email.label": "البريد الإلكتروني للاستجابة", - "PopUpForm.Email.options.object.label": "موضوع", - "PopUpForm.Email.options.message.label": "الرسالة", - "PopUpForm.Email.validation_email.options.object.placeholder": "يرجى تأكيد عنوان بريدك الإلكتروني لـ %APP_NAME%", - "PopUpForm.Email.reset_password.options.object.placeholder": "يرجى تأكيد عنوان بريدك الإلكتروني لـ %APP_NAME%", - "PopUpForm.Email.success_register.options.object.placeholder": "يرجى تأكيد عنوان بريدك الإلكتروني لـ %APP_NAME%", - "PopUpForm.Email.validation_email.options.message.placeholder": "

يرجى النقر على هذا الرابط لتأكيد حسابك

", - "PopUpForm.Email.reset_password.options.message.placeholder": "

يرجى النقر على هذا الرابط لتأكيد حسابك

", - "PopUpForm.Email.success_register.options.message.placeholder": "

يرجى النقر على هذا الرابط لتأكيد حسابك

", - "PopUpForm.Email.options.from.email.placeholder": "johndoe@gmail.com", - "PopUpForm.Email.options.response_email.placeholder": "johndoe@gmail.com", - "PopUpForm.Email.options.from.name.placeholder": "John Doe", - "PopUpForm.Providers.enabled.label": "مفعل", - "PopUpForm.Providers.enabled.description": "في حالة التعطيل ، لن يتمكن المستخدمون من استخدام هذا الموفر.", - "PopUpForm.Providers.key.label": "معرف العميل", - "PopUpForm.Providers.key.placeholder": "نص", - "PopUpForm.Providers.secret.label": "سر العميل (Client Secret)", - "PopUpForm.Providers.secret.placeholder": "نص", - "PopUpForm.Providers.redirectURL.front-end.label": "عنوان URL لإعادة التوجيه إلى تطبيق الواجهة الأمامية (front-end)", - - - - "PopUpForm.Providers.facebook.providerConfig.redirectURL": "عنوان URL لإعادة التوجيه لإضافتة تكوين تطبيق Facebook", - "PopUpForm.Providers.google.providerConfig.redirectURL": "عنوان URL لإعادة التوجيه لإضافتة تكوين تطبيق Google", - "PopUpForm.Providers.github.providerConfig.redirectURL": "عنوان URL لإعادة التوجيه لإضافتة تكوين تطبيق Github", - "PopUpForm.Providers.linkedin2.providerConfig.redirectURL": "عنوان URL لإعادة التوجيه لإضافتة تكوين تطبيق Linkedin", - "PopUpForm.Providers.twitter.providerConfig.redirectURL": "عنوان URL لإعادة التوجيه لإضافتة تكوين تطبيق Twitter", - - "PopUpForm.Providers.callback.placeholder": "نص", - "PopUpForm.Email.email_templates.inputDescription": "إذا كنت غير متأكد من كيفية استخدام المتغيرات ، {link}", - "PopUpForm.Email.link.documentation": "تحقق من وثائقنا." -} + "components.Input.error.password.noMatch": "كلمات السر لا تتطابق", + "notification.error.delete": "حدث خطأ أثناء محاولة حذف العنصر", + "notification.error.fetch": "حدث خطأ أثناء محاولة جلب البيانات", + "notification.error.fetchUser": "حدث خطأ أثناء محاولة جلب المستخدمين", + "notification.info.emailSent": "تم إرسال البريد الإلكتروني", + "notification.success.delete": "تم حذف هذا العنصر", + "notification.success.submit": "تم تحديث الإعدادات", + "plugin.description.long": "حماية الـAPI الخاص بك مع عملية مصادقة كاملة استناداً إلى JWT. يأتي هذا الملحق أيضًا مع إستراتيجية ACL التي تسمح لك بإدارة الأذونات بين مجموعات المستخدمين.", + "plugin.description.short": "حماية الـAPI الخاص بك مع عملية مصادقة كاملة استناداً إلى JWT" +} \ No newline at end of file diff --git a/packages/strapi-plugin-users-permissions/admin/src/translations/de.json b/packages/strapi-plugin-users-permissions/admin/src/translations/de.json index 4e304d04a4..f72a33b56a 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/translations/de.json +++ b/packages/strapi-plugin-users-permissions/admin/src/translations/de.json @@ -1,177 +1,144 @@ { - "Auth.form.button.register-success": "Erneut schicken", - "Auth.form.button.forgot-password.success": "Erneut schicken", + "Auth.advanced.allow_register": "", "Auth.form.button.forgot-password": "E-Mail versenden", - "Auth.form.button.reset-password": "Passwort ändern", + "Auth.form.button.forgot-password.success": "Erneut schicken", "Auth.form.button.login": "Login", "Auth.form.button.register": "Bereit zum Start", + "Auth.form.button.register-success": "Erneut schicken", + "Auth.form.button.reset-password": "Passwort ändern", + "Auth.form.error.code.provide": "Ungültiger Code.", + "Auth.form.error.email.invalid": "Diese E-Mail-Adresse ist ungültig.", + "Auth.form.error.email.provide": "Bitte nenne uns deinen Benutzernamen oder deine E-Mail-Adresse.", + "Auth.form.error.email.taken": "Die E-Mail-Adresse wird bereits genutzt", + "Auth.form.error.invalid": "Ungültige Login-Daten.", "Auth.form.error.noAdminAccess": "Du hast keinen Zugriff auf den Administrator-Bereich.", - + "Auth.form.error.params.provide": "Ungültige Parameter.", + "Auth.form.error.password.format": "Dein Passwort darf nicht mehr als dreimal das Symbol `$` enthalten.", + "Auth.form.error.password.local": "Dieser Benutzer hat kein lokales Passwort. Bitte logge dich mithilfe des Providers ein, den du bei der Erstellung deines Accounts genutzt hast.", + "Auth.form.error.password.matching": "Passwörter sind nicht gleich.", + "Auth.form.error.password.provide": "Bitte gib dein Passwort ein.", + "Auth.form.error.user.not-exist": "Diese E-Mail-Adresse ist nicht registriert.", + "Auth.form.error.username.taken": "Der Benutzername ist bereits vergeben", "Auth.form.forgot-password.email.label": "Gib deine E-Mail ein", "Auth.form.forgot-password.email.label.success": "Eine E-Mail wurde erfolgreich verschickt an", "Auth.form.forgot-password.email.placeholder": "mysuperemail@gmail.com", - - "Auth.header.register.description": "Erstelle bitte einen Administrator durch Ausfüllen der folgenden Felder, um die Einrichtung deiner App abzuschließen.", - "Auth.form.header.login": "strapi", "Auth.form.header.forgot-password": "strapi", + "Auth.form.header.login": "strapi", "Auth.form.header.register": "Willkommen!", "Auth.form.header.register-success": "strapi", - "Auth.form.login.password.label": "Passwort", "Auth.form.login.rememberMe.label": "Eingeloggt bleiben", "Auth.form.login.username.label": "Benutzername", "Auth.form.login.username.placeholder": "John Doe", - - "Auth.form.register.email.label": "E-Mail", - "Auth.form.register.email.placeholder": "johndoe@gmail.com", - "Auth.form.register.username.label": "Benutzername", - "Auth.form.register.username.placeholder": "John Doe", - "Auth.form.register.password.label": "Passwort", - "Auth.form.register.confirmPassword.label": "Passwort-Bestätigung", - "Auth.form.register.news.label": "Haltet mich auf dem Laufenden über die neuen Funktionen und kommenden Verbesserungen.", - "Auth.form.register-success.email.label": "Eine E-Mail wurde erfolgreich verschickt an", "Auth.form.register-success.email.placeholder": "mysuperemail@gmail.com", - - "Auth.form.error.email.provide": "Bitte nenne uns deinen Benutzernamen oder deine E-Mail-Adresse.", - "Auth.form.error.email.invalid": "Diese E-Mail-Adresse ist ungültig.", - "Auth.form.error.password.provide": "Bitte gib dein Passwort ein.", - "Auth.form.error.invalid": "Ungültige Login-Daten.", - "Auth.form.error.password.local": "Dieser Benutzer hat kein lokales Passwort. Bitte logge dich mithilfe des Providers ein, den du bei der Erstellung deines Accounts genutzt hast.", - "Auth.form.error.password.format": "Dein Passwort darf nicht mehr als dreimal das Symbol `$` enthalten.", - "Auth.form.error.user.not-exist": "Diese E-Mail-Adresse ist nicht registriert.", - "Auth.form.error.code.provide": "Ungültiger Code.", - "Auth.form.error.password.matching": "Passwörter sind nicht gleich.", - "Auth.form.error.params.provide": "Ungültige Parameter.", - "Auth.form.error.username.taken": "Der Benutzername ist bereits vergeben", - "Auth.form.error.email.taken": "Die E-Mail-Adresse wird bereits genutzt", - + "Auth.form.register.confirmPassword.label": "Passwort-Bestätigung", + "Auth.form.register.email.label": "E-Mail", + "Auth.form.register.email.placeholder": "johndoe@gmail.com", + "Auth.form.register.news.label": "Haltet mich auf dem Laufenden über die neuen Funktionen und kommenden Verbesserungen.", + "Auth.form.register.password.label": "Passwort", + "Auth.form.register.username.label": "Benutzername", + "Auth.form.register.username.placeholder": "John Doe", + "Auth.header.register.description": "Erstelle bitte einen Administrator durch Ausfüllen der folgenden Felder, um die Einrichtung deiner App abzuschließen.", "Auth.link.forgot-password": "Passwort vergessen?", "Auth.link.ready": "Bereit für den Login?", - "BoundRoute.title": "Pfad gebunden an", - - "components.Input.error.password.noMatch": "Passwörter stimmen nicht überein", - "Controller.input.label": "{label} ", "Controller.selectAll": "Alle auswählen", - - "EditForm.inputSelect.label.role": "Standardrolle für authentifizierte Benutzer", "EditForm.inputSelect.description.role": "Es wird den neuen authentifizierten Benutzer an die ausgewählte Rolle anhängen.", - "EditForm.inputSelect.subscriptions.label": "Abonnementkontingente verwalten", - "EditForm.inputSelect.subscriptions.description": "Lege die Anzahl an subscriptions pro Stunde und IP fest.", - "EditForm.inputSelect.durations.label": "Dauer", "EditForm.inputSelect.durations.description": "Anzahl Stunden, während derer eine Registration unmöglich ist.", - - "EditForm.inputToggle.label.email": "Ein Account pro E-Mail-Adresse", - "EditForm.inputToggle.label.sign-up": "Registration ermöglichen", + "EditForm.inputSelect.durations.label": "Dauer", + "EditForm.inputSelect.label.role": "Standardrolle für authentifizierte Benutzer", + "EditForm.inputSelect.subscriptions.description": "Lege die Anzahl an subscriptions pro Stunde und IP fest.", + "EditForm.inputSelect.subscriptions.label": "Abonnementkontingente verwalten", "EditForm.inputToggle.description.email": "Verbiete das Anlegen verschiedener Accounts derselben E-Mail-Adresse bei unterschiedlichen Anmeldemethoden.", "EditForm.inputToggle.description.sign-up": "Wenn deaktiviert (OFF), wird der Registrationsprozess unterbunden. Niemand kann sich mehr registrieren.", - + "EditForm.inputToggle.label.email": "Ein Account pro E-Mail-Adresse", + "EditForm.inputToggle.label.sign-up": "Registration ermöglichen", "EditPage.cancel": "Abbrechen", - "EditPage.submit": "Speichern", "EditPage.form.roles": "Details zu Rollen", "EditPage.form.roles.label.description": "Beschreibung", "EditPage.form.roles.label.name": "Name", "EditPage.form.roles.label.users": "Benutzer mit dieser Rolle ({number})", "EditPage.form.roles.name.error": "Dieser Wert ist erforderlich.", - "EditPage.header.title": "{name} ", - "EditPage.header.title.create": "Erstelle eine neue Rolle", "EditPage.header.description": "{description} ", "EditPage.header.description.create": " ", - + "EditPage.header.title": "{name} ", + "EditPage.header.title.create": "Erstelle eine neue Rolle", "EditPage.notification.permissions.error": "Beim Abruf von Befugnissen ist ein Fehler aufgetreten", "EditPage.notification.policies.error": "Beim Abruf von policies ist ein Fehler aufgetreten", "EditPage.notification.role.error": "Beim Abruf der Rolle ist ein Fehler aufgetreten", - + "EditPage.submit": "Speichern", + "Email.template.reset_password": "Passwort zurücksetzen", + "Email.template.success_register": "Anmeldung erfolgreich", + "Email.template.validation_email": "Validierung der E-Mail-Adresse", "HeaderNav.link.advancedSettings": "Erweiterte Einstellungen", "HeaderNav.link.emailTemplates": "E-Mail-Templates", "HeaderNav.link.providers": "Methoden", "HeaderNav.link.roles": "Rollen", - - "HomePage.header.title": "Benutzer & Berechtigungen", "HomePage.header.description": "Lege Rollen und deren Berechtigungen fest.", - + "HomePage.header.title": "Benutzer & Berechtigungen", "InputSearch.placeholder": "Suche nach einem Benutzer", - - "List.button.roles": "Neue Rolle hinzufügen", "List.button.providers": "Neue Methode hinzufügen", - - "List.title.emailTemplates.singular": "{number} E-Mail-Template ist verfügbar", + "List.button.roles": "Neue Rolle hinzufügen", "List.title.emailTemplates.plural": "{number} E-Mail-Templates sind verfügbar", - - "List.title.providers.disabled.singular": "{number} ist deaktiviert", + "List.title.emailTemplates.singular": "{number} E-Mail-Template ist verfügbar", "List.title.providers.disabled.plural": "{number} sind deaktiviert", - "List.title.providers.enabled.singular": "{number} Methode ist aktiviert und", + "List.title.providers.disabled.singular": "{number} ist deaktiviert", "List.title.providers.enabled.plural": "{number} Methoden sind aktiviert und", - - "List.title.roles.singular": "{number} Rolle ist verfügbar", + "List.title.providers.enabled.singular": "{number} Methode ist aktiviert und", "List.title.roles.plural": "{number} Rollen sind verfügbar", - - "notification.error.delete": "Beim Löschen des Objekts ist ein Fehler aufgetreten", - "notification.error.fetch": "Beim Abruf von Daten ist ein Fehler aufgetreten", - "notification.error.fetchUser": "Beim Abruf von Benutzern ist ein Fehler aufgetreten", - "notification.info.emailSent": "Die E-Mail wurde versendet", - "notification.success.delete": "Das Objekt wurde gelöscht", - "notification.success.submit": "Einstellungen aktualisiert", - - "plugin.description.short": "Beschütze deine API mit einem vollständigen Authentifikationsprozess basierend auf JWT.", - "plugin.description.long": "Beschütze deine API mit einem vollständigen Authentifikationsprozess basierend auf JWT. Zudem bietet dieses Plugin eine ACL-Strategie, die erlaubt, die Befugnisse zwischen Benutzergruppen festzulegen.", - + "List.title.roles.singular": "{number} Rolle ist verfügbar", "Plugin.permissions.application.description": "Definiere die möglichen Aktionen deines Projekts.", "Plugin.permissions.plugins.description": "Definiere die möglichen Aktionen des {name} Plugins.", - - "Plugins.header.title": "Befugnisse", "Plugins.header.description": "Nur Aktionen, die an einen Pfad gebunden sind, werden hier gelistet.", - + "Plugins.header.title": "Befugnisse", "Policies.InputSelect.empty": "Keine", "Policies.InputSelect.label": "Diese Aktion folgenden erlauben:", "Policies.header.hint": "Wähle eine Aktion aus und klicke auf das Zahnrad, um den an diese Aktion gebundenen Pfand anzuzeigen", "Policies.header.title": "Fortgeschrittene Einstellungen", - - "Email.template.validation_email": "Validierung der E-Mail-Adresse", - "Email.template.reset_password": "Passwort zurücksetzen", - "Email.template.success_register": "Anmeldung erfolgreich", - - "Auth.advanced.allow_register": "", - + "PopUpForm.Email.email_templates.inputDescription": "Für mehr Informationen, {link}", + "PopUpForm.Email.link.documentation": "schau in unsere Dokumentation.", + "PopUpForm.Email.options.from.email.label": "E-Mail-Adresse des Absenders", + "PopUpForm.Email.options.from.email.placeholder": "johndoe@gmail.com", + "PopUpForm.Email.options.from.name.label": "Name des Absenders", + "PopUpForm.Email.options.from.name.placeholder": "John Doe", + "PopUpForm.Email.options.message.label": "Nachricht", + "PopUpForm.Email.options.object.label": "Betreff", + "PopUpForm.Email.options.response_email.label": "Antwort E-Mail-Adresse", + "PopUpForm.Email.options.response_email.placeholder": "johndoe@gmail.com", + "PopUpForm.Email.reset_password.options.message.placeholder": "

Hier klicken, um deinen Account zu bestätigen

", + "PopUpForm.Email.reset_password.options.object.placeholder": "Bitte bestätige deine E-Mail-Adresse für %APP_NAME%", + "PopUpForm.Email.success_register.options.message.placeholder": "

Hier klicken, um deinen Account zu bestätigen

", + "PopUpForm.Email.success_register.options.object.placeholder": "Bitte bestätige deine E-Mail-Adresse für %APP_NAME%", + "PopUpForm.Email.validation_email.options.message.placeholder": "

Hier klicken, um deinen Account zu bestätigen

", + "PopUpForm.Email.validation_email.options.object.placeholder": "Bitte bestätige deine E-Mail-Adresse für %APP_NAME%", + "PopUpForm.Providers.callback.placeholder": "TEXT", + "PopUpForm.Providers.enabled.description": "Wenn deaktiviert, kann diese Methode nicht verwendet werden.", + "PopUpForm.Providers.enabled.label": "Aktivieren", + "PopUpForm.Providers.facebook.providerConfig.redirectURL": "Die URL, die in den Einstellungen deiner Facebook-App gesetzt wird", + "PopUpForm.Providers.github.providerConfig.redirectURL": "Die URL, die in den Einstellungen deiner Github-App gesetzt wird", + "PopUpForm.Providers.google.providerConfig.redirectURL": "Die URL, die in den Einstellungen deiner Google-App gesetzt wird", + "PopUpForm.Providers.key.label": "Client ID", + "PopUpForm.Providers.key.placeholder": "TEXT", + "PopUpForm.Providers.linkedin2.providerConfig.redirectURL": "Die URL, die in den Einstellungen deiner LinkedIn-App gesetzt wird", + "PopUpForm.Providers.redirectURL.front-end.label": "Die URL, die zur Weiterleitung zu deiner Frontend-App verwendet wird", + "PopUpForm.Providers.secret.label": "Client Secret", + "PopUpForm.Providers.secret.placeholder": "TEXT", + "PopUpForm.Providers.twitter.providerConfig.redirectURL": "Die URL, die in den Einstellungen deiner Twitter-App gesetzt wird", "PopUpForm.button.cancel": "Abbrechen", "PopUpForm.button.save": "Speichern", "PopUpForm.header.add.providers": "Neue Methode hinzufügen", "PopUpForm.header.edit.email-templates": "E-Mail-Templates bearbeiten", "PopUpForm.header.edit.providers": "Methode {provider} bearbeiten", "PopUpForm.inputSelect.providers.label": "Wähle die Methode aus", - "PopUpForm.Email.options.from.name.label": "Name des Absenders", - "PopUpForm.Email.options.from.email.label": "E-Mail-Adresse des Absenders", - "PopUpForm.Email.options.response_email.label": "Antwort E-Mail-Adresse", - "PopUpForm.Email.options.object.label": "Betreff", - "PopUpForm.Email.options.message.label": "Nachricht", - "PopUpForm.Email.validation_email.options.object.placeholder": "Bitte bestätige deine E-Mail-Adresse für %APP_NAME%", - "PopUpForm.Email.reset_password.options.object.placeholder": "Bitte bestätige deine E-Mail-Adresse für %APP_NAME%", - "PopUpForm.Email.success_register.options.object.placeholder": "Bitte bestätige deine E-Mail-Adresse für %APP_NAME%", - "PopUpForm.Email.validation_email.options.message.placeholder": "

Hier klicken, um deinen Account zu bestätigen

", - "PopUpForm.Email.reset_password.options.message.placeholder": "

Hier klicken, um deinen Account zu bestätigen

", - "PopUpForm.Email.success_register.options.message.placeholder": "

Hier klicken, um deinen Account zu bestätigen

", - "PopUpForm.Email.options.from.email.placeholder": "johndoe@gmail.com", - "PopUpForm.Email.options.response_email.placeholder": "johndoe@gmail.com", - "PopUpForm.Email.options.from.name.placeholder": "John Doe", - "PopUpForm.Providers.enabled.label": "Aktivieren", - "PopUpForm.Providers.enabled.description": "Wenn deaktiviert, kann diese Methode nicht verwendet werden.", - "PopUpForm.Providers.key.label": "Client ID", - "PopUpForm.Providers.key.placeholder": "TEXT", - "PopUpForm.Providers.secret.label": "Client Secret", - "PopUpForm.Providers.secret.placeholder": "TEXT", - "PopUpForm.Providers.redirectURL.front-end.label": "Die URL, die zur Weiterleitung zu deiner Frontend-App verwendet wird", - - - - "PopUpForm.Providers.facebook.providerConfig.redirectURL": "Die URL, die in den Einstellungen deiner Facebook-App gesetzt wird", - "PopUpForm.Providers.google.providerConfig.redirectURL": "Die URL, die in den Einstellungen deiner Google-App gesetzt wird", - "PopUpForm.Providers.github.providerConfig.redirectURL": "Die URL, die in den Einstellungen deiner Github-App gesetzt wird", - "PopUpForm.Providers.linkedin2.providerConfig.redirectURL": "Die URL, die in den Einstellungen deiner LinkedIn-App gesetzt wird", - "PopUpForm.Providers.twitter.providerConfig.redirectURL": "Die URL, die in den Einstellungen deiner Twitter-App gesetzt wird", - - "PopUpForm.Providers.callback.placeholder": "TEXT", - "PopUpForm.Email.email_templates.inputDescription": "Für mehr Informationen, {link}", - "PopUpForm.Email.link.documentation": "schau in unsere Dokumentation." -} + "components.Input.error.password.noMatch": "Passwörter stimmen nicht überein", + "notification.error.delete": "Beim Löschen des Objekts ist ein Fehler aufgetreten", + "notification.error.fetch": "Beim Abruf von Daten ist ein Fehler aufgetreten", + "notification.error.fetchUser": "Beim Abruf von Benutzern ist ein Fehler aufgetreten", + "notification.info.emailSent": "Die E-Mail wurde versendet", + "notification.success.delete": "Das Objekt wurde gelöscht", + "notification.success.submit": "Einstellungen aktualisiert", + "plugin.description.long": "Beschütze deine API mit einem vollständigen Authentifikationsprozess basierend auf JWT. Zudem bietet dieses Plugin eine ACL-Strategie, die erlaubt, die Befugnisse zwischen Benutzergruppen festzulegen.", + "plugin.description.short": "Beschütze deine API mit einem vollständigen Authentifikationsprozess basierend auf JWT." +} \ No newline at end of file diff --git a/packages/strapi-plugin-users-permissions/admin/src/translations/en.json b/packages/strapi-plugin-users-permissions/admin/src/translations/en.json index 4a0b65d607..01d4d505e5 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/translations/en.json +++ b/packages/strapi-plugin-users-permissions/admin/src/translations/en.json @@ -1,184 +1,153 @@ { - "Auth.form.button.register-success": "Send again", - "Auth.form.button.forgot-password.success": "Send again", + "Auth.advanced.allow_register": "", "Auth.form.button.forgot-password": "Send Email", - "Auth.form.button.reset-password": "Change password", + "Auth.form.button.forgot-password.success": "Send again", "Auth.form.button.login": "Log in", "Auth.form.button.register": "Ready to start", - "Auth.form.error.noAdminAccess": "You can't access the administration panel.", + "Auth.form.button.register-success": "Send again", + "Auth.form.button.reset-password": "Change password", + "Auth.form.error.blocked": "Your account has been blocked by the administrator.", + "Auth.form.error.code.provide": "Incorrect code provided.", "Auth.form.error.confirmed": "Your account email is not confirmed.", - + "Auth.form.error.email.invalid": "This email is invalid.", + "Auth.form.error.email.provide": "Please provide your username or your email.", + "Auth.form.error.email.taken": "Email is already taken.", + "Auth.form.error.invalid": "Identifier or password invalid.", + "Auth.form.error.noAdminAccess": "You can't access the administration panel.", + "Auth.form.error.params.provide": "Incorrect params provided.", + "Auth.form.error.password.format": "Your password cannot contain the symbol `$` more than three times.", + "Auth.form.error.password.local": "This user never set a local password, please login via the provider used during account creation.", + "Auth.form.error.password.matching": "Passwords do not match.", + "Auth.form.error.password.provide": "Please provide your password.", + "Auth.form.error.ratelimit": "Too many attempts, please try again in a minute.", + "Auth.form.error.user.not-exist": "This email does not exist.", + "Auth.form.error.username.taken": "Username is already taken.", "Auth.form.forgot-password.email.label": "Enter your email", "Auth.form.forgot-password.email.label.success": "Email successfully sent to", "Auth.form.forgot-password.email.placeholder": "mysuperemail@gmail.com", - - "Auth.header.register.description": "To finish setup and secure your app, please create the first user (root admin) by entering the necessary information below.", - "Auth.form.header.login": "strapi", "Auth.form.header.forgot-password": "strapi", + "Auth.form.header.login": "strapi", "Auth.form.header.register": "Welcome!", "Auth.form.header.register-success": "strapi", - "Auth.form.login.password.label": "Password", "Auth.form.login.rememberMe.label": "Remember me", "Auth.form.login.username.label": "Username", "Auth.form.login.username.placeholder": "John Doe", - - "Auth.form.register.email.label": "Email", - "Auth.form.register.email.placeholder": "johndoe@gmail.com", - "Auth.form.register.username.label": "Username", - "Auth.form.register.username.placeholder": "John Doe", - "Auth.form.register.password.label": "Password", - "Auth.form.register.confirmPassword.label": "Confirmation Password", - "Auth.form.register.news.label": "Keep me updated about the new features and upcoming improvements.", - "Auth.form.register-success.email.label": "Email sent with success to", "Auth.form.register-success.email.placeholder": "mysuperemail@gmail.com", - - "Auth.form.error.email.provide": "Please provide your username or your email.", - "Auth.form.error.email.invalid": "This email is invalid.", - "Auth.form.error.password.provide": "Please provide your password.", - "Auth.form.error.invalid": "Identifier or password invalid.", - "Auth.form.error.password.local": "This user never set a local password, please login via the provider used during account creation.", - "Auth.form.error.password.format": "Your password cannot contain the symbol `$` more than three times.", - "Auth.form.error.user.not-exist": "This email does not exist.", - "Auth.form.error.code.provide": "Incorrect code provided.", - "Auth.form.error.password.matching": "Passwords do not match.", - "Auth.form.error.params.provide": "Incorrect params provided.", - "Auth.form.error.username.taken": "Username is already taken.", - "Auth.form.error.email.taken": "Email is already taken.", - "Auth.form.error.blocked": "Your account has been blocked by the administrator.", - "Auth.form.error.ratelimit": "Too many attempts, please try again in a minute.", - + "Auth.form.register.confirmPassword.label": "Confirmation Password", + "Auth.form.register.email.label": "Email", + "Auth.form.register.email.placeholder": "johndoe@gmail.com", + "Auth.form.register.news.label": "Keep me updated about the new features and upcoming improvements.", + "Auth.form.register.password.label": "Password", + "Auth.form.register.username.label": "Username", + "Auth.form.register.username.placeholder": "John Doe", + "Auth.header.register.description": "To finish setup and secure your app, please create the first user (root admin) by entering the necessary information below.", "Auth.link.forgot-password": "Forgot your password?", "Auth.link.ready": "Ready to sign in?", - "BoundRoute.title": "Bound route to", - - "components.Input.error.password.noMatch": "Passwords do not match", - "Controller.input.label": "{label} ", "Controller.selectAll": "Select all", - - "EditForm.inputSelect.label.role": "Default role for authenticated users", "EditForm.inputSelect.description.role": "It will attach the new authenticated user to the selected role.", - "EditForm.inputSelect.subscriptions.label": "Manage subscription quotas", - "EditForm.inputSelect.subscriptions.description": "Limit the number of subscriptions per IP per hour.", - "EditForm.inputSelect.durations.label": "Duration", "EditForm.inputSelect.durations.description": "Number of hours during which the user can't subscribe.", - - "EditForm.inputToggle.label.email": "One account per email address", - "EditForm.inputToggle.label.sign-up": "Enable sign-ups", - "EditForm.inputToggle.label.email-confirmation": "Enable email confirmation", - "EditForm.inputToggle.label.email-confirmation-redirection": "Redirection url", + "EditForm.inputSelect.durations.label": "Duration", + "EditForm.inputSelect.label.role": "Default role for authenticated users", + "EditForm.inputSelect.subscriptions.description": "Limit the number of subscriptions per IP per hour.", + "EditForm.inputSelect.subscriptions.label": "Manage subscription quotas", "EditForm.inputToggle.description.email": "Disallow the user to create multiple accounts using the same email address with different authentication providers.", - "EditForm.inputToggle.description.sign-up": "When disabled (OFF), the registration process is forbidden. No one can subscribe anymore no matter the used provider.", "EditForm.inputToggle.description.email-confirmation": "When enabled (ON), new registred users receive a confirmation email.", "EditForm.inputToggle.description.email-confirmation-redirection": "After confirmed your email, chose where you will be redirected.", - + "EditForm.inputToggle.description.sign-up": "When disabled (OFF), the registration process is forbidden. No one can subscribe anymore no matter the used provider.", + "EditForm.inputToggle.label.email": "One account per email address", + "EditForm.inputToggle.label.email-confirmation": "Enable email confirmation", + "EditForm.inputToggle.label.email-confirmation-redirection": "Redirection url", + "EditForm.inputToggle.label.sign-up": "Enable sign-ups", "EditPage.cancel": "Cancel", - "EditPage.submit": "Save", "EditPage.form.roles": "Role details", "EditPage.form.roles.label.description": "Description", "EditPage.form.roles.label.name": "Name", "EditPage.form.roles.label.users": "Users associated with this role ({number})", "EditPage.form.roles.name.error": "This value is required.", - "EditPage.header.title": "{name} ", - "EditPage.header.title.create": "Create a new role", "EditPage.header.description": "{description} ", "EditPage.header.description.create": " ", - + "EditPage.header.title": "{name} ", + "EditPage.header.title.create": "Create a new role", "EditPage.notification.permissions.error": "An error occurred while fetching permissions", "EditPage.notification.policies.error": "An error occurred while fetching policies", "EditPage.notification.role.error": "An error occurred while fetching the role", - + "EditPage.submit": "Save", + "Email.template.email_confirmation": "Email address confirmation", + "Email.template.reset_password": "Reset password", + "Email.template.success_register": "Registration successful", "HeaderNav.link.advancedSettings": "Advanced settings", "HeaderNav.link.emailTemplates": "Email templates", "HeaderNav.link.providers": "Providers", "HeaderNav.link.roles": "Roles & Permissions", - - "HomePage.header.title": "Roles & Permissions", "HomePage.header.description": "Define the roles and permissions for your users.", - + "HomePage.header.title": "Roles & Permissions", "InputSearch.placeholder": "Search for a user", - - "List.button.roles": "Add New Role", "List.button.providers": "Add New Provider", - - "List.title.emailTemplates.singular": "{number} email template is available", + "List.button.roles": "Add New Role", "List.title.emailTemplates.plural": "{number} email templates are available", - - "List.title.providers.disabled.singular": "{number} is disabled", + "List.title.emailTemplates.singular": "{number} email template is available", "List.title.providers.disabled.plural": "{number} are disabled", - "List.title.providers.enabled.singular": "{number} provider is enabled and", + "List.title.providers.disabled.singular": "{number} is disabled", "List.title.providers.enabled.plural": "{number} providers are enabled and", - - "List.title.roles.singular": "{number} role is available", + "List.title.providers.enabled.singular": "{number} provider is enabled and", "List.title.roles.plural": "{number} roles are available", - - "notification.error.delete": "An error occurred while trying to delete the item", - "notification.error.fetch": "An error occurred while trying to fetch data", - "notification.error.fetchUser": "An error occurred while trying to fetch users", - "notification.info.emailSent": "The email has been sent", - "notification.success.delete": "The item has been deleted", - "notification.success.submit": "Settings have been updated", - - "plugin.description.short": "Protect your API with a full authentication process based on JWT", - "plugin.description.long": "Protect your API with a full authentication process based on JWT. This plugin comes also with an ACL strategy that allows you to manage the permissions between the groups of users.", - + "List.title.roles.singular": "{number} role is available", "Plugin.permissions.application.description": "Define all your project's allowed actions.", "Plugin.permissions.plugins.description": "Define all allowed actions for the {name} plugin.", - - "Plugins.header.title": "Permissions", "Plugins.header.description": "Only actions bound by a route are listed below.", - + "Plugins.header.title": "Permissions", "Policies.InputSelect.empty": "None", "Policies.InputSelect.label": "Allow to perform this action for:", "Policies.header.hint": "Select the application's actions or the plugin's actions and click on the cog icon to display the bound route", "Policies.header.title": "Advanced settings", - - "Email.template.email_confirmation": "Email address confirmation", - "Email.template.reset_password": "Reset password", - "Email.template.success_register": "Registration successful", - - "Auth.advanced.allow_register": "", - + "PopUpForm.Email.email_templates.inputDescription": "If you're unsure how to use variables, {link}", + "PopUpForm.Email.link.documentation": "check out our documentation.", + "PopUpForm.Email.options.from.email.label": "Shipper email", + "PopUpForm.Email.options.from.email.placeholder": "johndoe@gmail.com", + "PopUpForm.Email.options.from.name.label": "Shipper name", + "PopUpForm.Email.options.from.name.placeholder": "John Doe", + "PopUpForm.Email.options.message.label": "Message", + "PopUpForm.Email.options.object.label": "Subject", + "PopUpForm.Email.options.response_email.label": "Response email", + "PopUpForm.Email.options.response_email.placeholder": "johndoe@gmail.com", + "PopUpForm.Email.reset_password.options.message.placeholder": "

Please click on this link to validate your account

", + "PopUpForm.Email.reset_password.options.object.placeholder": "Please confirm your email address for %APP_NAME%", + "PopUpForm.Email.success_register.options.message.placeholder": "

Please click on this link to validate your account

", + "PopUpForm.Email.success_register.options.object.placeholder": "Please confirm your email address for %APP_NAME%", + "PopUpForm.Email.validation_email.options.message.placeholder": "

Please click on this link to validate your account

", + "PopUpForm.Email.validation_email.options.object.placeholder": "Please confirm your email address for %APP_NAME%", + "PopUpForm.Providers.callback.placeholder": "TEXT", + "PopUpForm.Providers.discord.providerConfig.redirectURL": "The redirect URL to add in your Discord application configurations", + "PopUpForm.Providers.enabled.description": "If disabled, users won't be able to use this provider.", + "PopUpForm.Providers.enabled.label": "Enable", + "PopUpForm.Providers.facebook.providerConfig.redirectURL": "The redirect URL to add in your Facebook application configurations", + "PopUpForm.Providers.github.providerConfig.redirectURL": "The redirect URL to add in your GitHub application configurations", + "PopUpForm.Providers.google.providerConfig.redirectURL": "The redirect URL to add in your Google application configurations", + "PopUpForm.Providers.key.label": "Client ID", + "PopUpForm.Providers.key.placeholder": "TEXT", + "PopUpForm.Providers.linkedin2.providerConfig.redirectURL": "The redirect URL to add in your Linkedin application configurations", + "PopUpForm.Providers.microsoft.providerConfig.redirectURL": "The redirect URL to add in your Microsoft application configurations", + "PopUpForm.Providers.redirectURL.front-end.label": "The redirect URL to your front-end app", + "PopUpForm.Providers.secret.label": "Client Secret", + "PopUpForm.Providers.secret.placeholder": "TEXT", + "PopUpForm.Providers.twitter.providerConfig.redirectURL": "The redirect URL to add in your Twitter application configurations", "PopUpForm.button.cancel": "Cancel", "PopUpForm.button.save": "Save", "PopUpForm.header.add.providers": "Add New Provider", "PopUpForm.header.edit.email-templates": "Edit Email Templates", "PopUpForm.header.edit.providers": "Edit {provider} Provider", "PopUpForm.inputSelect.providers.label": "Choose the provider", - "PopUpForm.Email.options.from.name.label": "Shipper name", - "PopUpForm.Email.options.from.email.label": "Shipper email", - "PopUpForm.Email.options.response_email.label": "Response email", - "PopUpForm.Email.options.object.label": "Subject", - "PopUpForm.Email.options.message.label": "Message", - "PopUpForm.Email.validation_email.options.object.placeholder": "Please confirm your email address for %APP_NAME%", - "PopUpForm.Email.reset_password.options.object.placeholder": "Please confirm your email address for %APP_NAME%", - "PopUpForm.Email.success_register.options.object.placeholder": "Please confirm your email address for %APP_NAME%", - "PopUpForm.Email.validation_email.options.message.placeholder": "

Please click on this link to validate your account

", - "PopUpForm.Email.reset_password.options.message.placeholder": "

Please click on this link to validate your account

", - "PopUpForm.Email.success_register.options.message.placeholder": "

Please click on this link to validate your account

", - "PopUpForm.Email.options.from.email.placeholder": "johndoe@gmail.com", - "PopUpForm.Email.options.response_email.placeholder": "johndoe@gmail.com", - "PopUpForm.Email.options.from.name.placeholder": "John Doe", - "PopUpForm.Providers.enabled.label": "Enable", - "PopUpForm.Providers.enabled.description": "If disabled, users won't be able to use this provider.", - "PopUpForm.Providers.key.label": "Client ID", - "PopUpForm.Providers.key.placeholder": "TEXT", - "PopUpForm.Providers.secret.label": "Client Secret", - "PopUpForm.Providers.secret.placeholder": "TEXT", - "PopUpForm.Providers.redirectURL.front-end.label": "The redirect URL to your front-end app", - - "PopUpForm.Providers.discord.providerConfig.redirectURL": "The redirect URL to add in your Discord application configurations", - "PopUpForm.Providers.facebook.providerConfig.redirectURL": "The redirect URL to add in your Facebook application configurations", - "PopUpForm.Providers.google.providerConfig.redirectURL": "The redirect URL to add in your Google application configurations", - "PopUpForm.Providers.github.providerConfig.redirectURL": "The redirect URL to add in your GitHub application configurations", - "PopUpForm.Providers.microsoft.providerConfig.redirectURL": "The redirect URL to add in your Microsoft application configurations", - "PopUpForm.Providers.linkedin2.providerConfig.redirectURL": "The redirect URL to add in your Linkedin application configurations", - "PopUpForm.Providers.twitter.providerConfig.redirectURL": "The redirect URL to add in your Twitter application configurations", - - "PopUpForm.Providers.callback.placeholder": "TEXT", - "PopUpForm.Email.email_templates.inputDescription": "If you're unsure how to use variables, {link}", - "PopUpForm.Email.link.documentation": "check out our documentation." -} + "components.Input.error.password.noMatch": "Passwords do not match", + "notification.error.delete": "An error occurred while trying to delete the item", + "notification.error.fetch": "An error occurred while trying to fetch data", + "notification.error.fetchUser": "An error occurred while trying to fetch users", + "notification.info.emailSent": "The email has been sent", + "notification.success.delete": "The item has been deleted", + "notification.success.submit": "Settings have been updated", + "plugin.description.long": "Protect your API with a full authentication process based on JWT. This plugin comes also with an ACL strategy that allows you to manage the permissions between the groups of users.", + "plugin.description.short": "Protect your API with a full authentication process based on JWT" +} \ No newline at end of file diff --git a/packages/strapi-plugin-users-permissions/admin/src/translations/es.json b/packages/strapi-plugin-users-permissions/admin/src/translations/es.json index 1279d42b23..60cfd43371 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/translations/es.json +++ b/packages/strapi-plugin-users-permissions/admin/src/translations/es.json @@ -1,175 +1,144 @@ { - "Auth.form.button.register-success": "Enviar nuevamente", - "Auth.form.button.forgot-password.success": "Enviar nuevamente", + "Auth.advanced.allow_register": "", "Auth.form.button.forgot-password": "Enviar Email", - "Auth.form.button.reset-password": "Cambiar contraseña", + "Auth.form.button.forgot-password.success": "Enviar nuevamente", "Auth.form.button.login": "Iniciar sesión", "Auth.form.button.register": "Listo para comenzar", + "Auth.form.button.register-success": "Enviar nuevamente", + "Auth.form.button.reset-password": "Cambiar contraseña", + "Auth.form.error.code.provide": "Código incorrecto proporcionado.", + "Auth.form.error.email.invalid": "Este email es inválido.", + "Auth.form.error.email.provide": "Por favor proporcione su nombre de usuario o su correo electrónico.", + "Auth.form.error.email.taken": "El email ya está registrado", + "Auth.form.error.invalid": "Identificador o contraseña inválidos.", "Auth.form.error.noAdminAccess": "No puedes acceder al panel de administración.", - + "Auth.form.error.params.provide": "Parametros incorrectos proporcionados.", + "Auth.form.error.password.format": "Su contraseña no puede contener el símbolo `$` más de tres veces.", + "Auth.form.error.password.local": "Este usuario nunca estableció una contraseña local, por favor ingrese a través de su proveedor utilizado durante la creación de la cuenta.", + "Auth.form.error.password.matching": "Las contraseñas no coinciden.", + "Auth.form.error.password.provide": "Por favor, introduzca su contraseña.", + "Auth.form.error.user.not-exist": "Este email no existe.", + "Auth.form.error.username.taken": "El nombre de usuario ya está registrado", "Auth.form.forgot-password.email.label": "Introduce tu email", "Auth.form.forgot-password.email.label.success": "Email enviado con éxito a", "Auth.form.forgot-password.email.placeholder": "mysuperemail@gmail.com", - - "Auth.header.register.description": "Para terminar de configurar y asegurar su aplicación, por favor cree el primer usuario (administrador root) ingresando la información necesaria a continuación.", - "Auth.form.header.login": "strapi", "Auth.form.header.forgot-password": "strapi", + "Auth.form.header.login": "strapi", "Auth.form.header.register": "Bienvenidos!", "Auth.form.header.register-success": "strapi", - "Auth.form.login.password.label": "Contraseña", "Auth.form.login.rememberMe.label": "Recuérdame", "Auth.form.login.username.label": "Nombre de usuario", "Auth.form.login.username.placeholder": "John Doe", - - "Auth.form.register.email.label": "Email", - "Auth.form.register.email.placeholder": "johndoe@gmail.com", - "Auth.form.register.username.label": "Nombre de usuario", - "Auth.form.register.username.placeholder": "John Doe", - "Auth.form.register.password.label": "Contraseña", - "Auth.form.register.confirmPassword.label": "Contraseña de confirmación", - "Auth.form.register.news.label": "Manténgame informado sobre las nuevas características y las próximas mejoras.", - "Auth.form.register-success.email.label": "Email enviado con éxito a", "Auth.form.register-success.email.placeholder": "mysuperemail@gmail.com", - - "Auth.form.error.email.provide": "Por favor proporcione su nombre de usuario o su correo electrónico.", - "Auth.form.error.email.invalid": "Este email es inválido.", - "Auth.form.error.password.provide": "Por favor, introduzca su contraseña.", - "Auth.form.error.invalid": "Identificador o contraseña inválidos.", - "Auth.form.error.password.local": "Este usuario nunca estableció una contraseña local, por favor ingrese a través de su proveedor utilizado durante la creación de la cuenta.", - "Auth.form.error.password.format": "Su contraseña no puede contener el símbolo `$` más de tres veces.", - "Auth.form.error.user.not-exist": "Este email no existe.", - "Auth.form.error.code.provide": "Código incorrecto proporcionado.", - "Auth.form.error.password.matching": "Las contraseñas no coinciden.", - "Auth.form.error.params.provide": "Parametros incorrectos proporcionados.", - "Auth.form.error.username.taken": "El nombre de usuario ya está registrado", - "Auth.form.error.email.taken": "El email ya está registrado", - + "Auth.form.register.confirmPassword.label": "Contraseña de confirmación", + "Auth.form.register.email.label": "Email", + "Auth.form.register.email.placeholder": "johndoe@gmail.com", + "Auth.form.register.news.label": "Manténgame informado sobre las nuevas características y las próximas mejoras.", + "Auth.form.register.password.label": "Contraseña", + "Auth.form.register.username.label": "Nombre de usuario", + "Auth.form.register.username.placeholder": "John Doe", + "Auth.header.register.description": "Para terminar de configurar y asegurar su aplicación, por favor cree el primer usuario (administrador root) ingresando la información necesaria a continuación.", "Auth.link.forgot-password": "¿Olvidó su contraseña?", "Auth.link.ready": "¿Listo para iniciar sesión?", - "BoundRoute.title": "Ruta enlazada a", - - "components.Input.error.password.noMatch": "Las contraseñas no coinciden", - "Controller.input.label": "{label} ", "Controller.selectAll": "Seleccionar todo", - - "EditForm.inputSelect.label.role": "Rol predeterminado para usuarios autenticados", "EditForm.inputSelect.description.role": "Adjuntará el nuevo usuario autenticado al rol seleccionado.", - "EditForm.inputSelect.subscriptions.label": "Gestionar cuotas de suscripción", - "EditForm.inputSelect.subscriptions.description": "Limite el número de suscripciones de IP por hora.", - "EditForm.inputSelect.durations.label": "Duración", "EditForm.inputSelect.durations.description": "Número de horas durante las cuales el usuario no puede suscribirse.", - - "EditForm.inputToggle.label.email": "Una cuenta por dirección de correo electrónico", - "EditForm.inputToggle.label.sign-up": "Habilitar inscripciones", + "EditForm.inputSelect.durations.label": "Duración", + "EditForm.inputSelect.label.role": "Rol predeterminado para usuarios autenticados", + "EditForm.inputSelect.subscriptions.description": "Limite el número de suscripciones de IP por hora.", + "EditForm.inputSelect.subscriptions.label": "Gestionar cuotas de suscripción", "EditForm.inputToggle.description.email": "No permita que el usuario cree varias cuentas utilizando la misma dirección de correo electrónico con distintos proveedores de autenticación.", "EditForm.inputToggle.description.sign-up": "Cuando está desactivado (OFF), el proceso de registro está prohibido. Nadie puede suscribirse sin importar el proveedor utilizado.", - + "EditForm.inputToggle.label.email": "Una cuenta por dirección de correo electrónico", + "EditForm.inputToggle.label.sign-up": "Habilitar inscripciones", "EditPage.cancel": "Cancelar", - "EditPage.submit": "Guardar", "EditPage.form.roles": "Detalles del rol", "EditPage.form.roles.label.description": "Descripción", "EditPage.form.roles.label.name": "Nombre", "EditPage.form.roles.label.users": "Usuarios asociados a este rol ({number})", "EditPage.form.roles.name.error": "Este valor es obligatorio.", - "EditPage.header.title": "{name} ", - "EditPage.header.title.create": "Crear un nuevo rol", "EditPage.header.description": "{description} ", "EditPage.header.description.create": " ", - + "EditPage.header.title": "{name} ", + "EditPage.header.title.create": "Crear un nuevo rol", "EditPage.notification.permissions.error": "Se ha producido un error al obtener las autorizaciones", "EditPage.notification.policies.error": "Se ha producido un error al recuperar las políticas", "EditPage.notification.role.error": "Se ha producido un error al recuperar el rol", - + "EditPage.submit": "Guardar", + "Email.template.reset_password": "Restablecer contraseña", + "Email.template.success_register": "Inscripción exitosa", + "Email.template.validation_email": "Validación de la dirección de email", "HeaderNav.link.advancedSettings": "Ajustes avanzados", "HeaderNav.link.emailTemplates": "Plantillas de email", "HeaderNav.link.providers": "Proveedores", "HeaderNav.link.roles": "Roles y Permisos", - - "HomePage.header.title": "Roles y Permisos", "HomePage.header.description": "Defina los roles y permisos para sus usuarios.", - + "HomePage.header.title": "Roles y Permisos", "InputSearch.placeholder": "Buscar un usuario", - - "List.button.roles": "Añadir nuevo rol", "List.button.providers": "Añadir nuevo proveedor", - - "List.title.emailTemplates.singular": "{number} plantilla de email está disponible", + "List.button.roles": "Añadir nuevo rol", "List.title.emailTemplates.plural": "{number} plantillas de email disponibles", - - "List.title.providers.disabled.singular": "{number} está desactivado", + "List.title.emailTemplates.singular": "{number} plantilla de email está disponible", "List.title.providers.disabled.plural": "{number} están desactivados", - "List.title.providers.enabled.singular": "{number} está habilitado y", + "List.title.providers.disabled.singular": "{number} está desactivado", "List.title.providers.enabled.plural": "{number} proveedores están habilitados y", - - "List.title.roles.singular": "{number} rol disponible", + "List.title.providers.enabled.singular": "{number} está habilitado y", "List.title.roles.plural": "{number} roles disponibles", - - "notification.error.delete": "Se ha producido un error al intentar borrar el elemento", - "notification.error.fetch": "Se ha producido un error al intentar recuperar los datos", - "notification.error.fetchUser": "Se ha producido un error al intentar buscar usuarios", - "notification.info.emailSent": "El email ha sido enviado", - "notification.success.delete": "El elemento ha sido borrado", - "notification.success.submit": "Los ajustes se han actualizado", - - "plugin.description.short": "Proteja su API con un proceso de autenticación completo basado en JWT", - "plugin.description.long": "Proteja su API con un proceso de autenticación completo basado en JWT. Este plugin viene también con una estrategia ACL que le permite administrar los permisos entre los grupos de usuarios.", - + "List.title.roles.singular": "{number} rol disponible", "Plugin.permissions.application.description": "Defina todas las acciones permitidas de su proyecto.", "Plugin.permissions.plugins.description": "Defina todas las acciones permitidas para el plugin {name}.", - - "Plugins.header.title": "Permisos", "Plugins.header.description": "Sólo las acciones vinculadas a una ruta se enumeran a continuación.", - + "Plugins.header.title": "Permisos", "Policies.InputSelect.empty": "Ninguno", "Policies.InputSelect.label": "Permita que se realice esta acción para:", "Policies.header.hint": "Seleccione las acciones de la aplicación o las acciones del plugin y haga clic en el icono del engranaje para ver la ruta vinculada", "Policies.header.title": "Ajustes avanzados", - - "Email.template.validation_email": "Validación de la dirección de email", - "Email.template.reset_password": "Restablecer contraseña", - "Email.template.success_register": "Inscripción exitosa", - - "Auth.advanced.allow_register": "", - + "PopUpForm.Email.email_templates.inputDescription": "Si no estás seguro de cómo usar las variables, {link}", + "PopUpForm.Email.link.documentation": "consulte nuestra documentación.", + "PopUpForm.Email.options.from.email.label": "Email del remitente", + "PopUpForm.Email.options.from.email.placeholder": "johndoe@gmail.com", + "PopUpForm.Email.options.from.name.label": "Nombre del remitente", + "PopUpForm.Email.options.from.name.placeholder": "John Doe", + "PopUpForm.Email.options.message.label": "Mensaje", + "PopUpForm.Email.options.object.label": "Tema", + "PopUpForm.Email.options.response_email.label": "Email de respuesta", + "PopUpForm.Email.options.response_email.placeholder": "johndoe@gmail.com", + "PopUpForm.Email.reset_password.options.message.placeholder": "

Haga clic en este enlace para validar su cuenta

", + "PopUpForm.Email.reset_password.options.object.placeholder": "Confirme su dirección de email para %APP_NAME%", + "PopUpForm.Email.success_register.options.message.placeholder": "

Haga clic en este enlace para validar su cuenta

", + "PopUpForm.Email.success_register.options.object.placeholder": "Confirme su dirección de email para %APP_NAME%", + "PopUpForm.Email.validation_email.options.message.placeholder": "

Haga clic en este enlace para validar su cuenta

", + "PopUpForm.Email.validation_email.options.object.placeholder": "Por favor, confirme su dirección de email para %APP_NAME%", + "PopUpForm.Providers.callback.placeholder": "TEXTO", + "PopUpForm.Providers.enabled.description": "Si está desactivado, los usuarios no podrán utilizar este proveedor.", + "PopUpForm.Providers.enabled.label": "Habilitar", + "PopUpForm.Providers.facebook.providerConfig.redirectURL": "La URL de redirección que se debe agregar en la configuración de la aplicación Facebook", + "PopUpForm.Providers.github.providerConfig.redirectURL": "La URL de redirección que se debe agregar en la configuración de la aplicación GitHub", + "PopUpForm.Providers.google.providerConfig.redirectURL": "La URL de redirección que se debe agregar en la configuración de la aplicación Google", + "PopUpForm.Providers.key.label": "ID de cliente", + "PopUpForm.Providers.key.placeholder": "TEXTO", + "PopUpForm.Providers.linkedin2.providerConfig.redirectURL": "La URL de redirección que se debe agregar en la configuración de la aplicación Linkedin", + "PopUpForm.Providers.redirectURL.front-end.label": "La URL de redireccionamiento a su aplicación front-end", + "PopUpForm.Providers.secret.label": "Secreto Cliente", + "PopUpForm.Providers.secret.placeholder": "TEXTO", + "PopUpForm.Providers.twitter.providerConfig.redirectURL": "La URL de redirección que se debe agregar en la configuración de la aplicación Twitter", "PopUpForm.button.cancel": "Cancelar", "PopUpForm.button.save": "Guardar", "PopUpForm.header.add.providers": "Añadir nuevo proveedor", "PopUpForm.header.edit.email-templates": "Editar Plantillas de Email", "PopUpForm.header.edit.providers": "Editar Proveedor {provider}", "PopUpForm.inputSelect.providers.label": "Elija el proveedor", - "PopUpForm.Email.options.from.name.label": "Nombre del remitente", - "PopUpForm.Email.options.from.email.label": "Email del remitente", - "PopUpForm.Email.options.response_email.label": "Email de respuesta", - "PopUpForm.Email.options.object.label": "Tema", - "PopUpForm.Email.options.message.label": "Mensaje", - "PopUpForm.Email.validation_email.options.object.placeholder": "Por favor, confirme su dirección de email para %APP_NAME%", - "PopUpForm.Email.reset_password.options.object.placeholder": "Confirme su dirección de email para %APP_NAME%", - "PopUpForm.Email.success_register.options.object.placeholder": "Confirme su dirección de email para %APP_NAME%", - "PopUpForm.Email.validation_email.options.message.placeholder": "

Haga clic en este enlace para validar su cuenta

", - "PopUpForm.Email.reset_password.options.message.placeholder": "

Haga clic en este enlace para validar su cuenta

", - "PopUpForm.Email.success_register.options.message.placeholder": "

Haga clic en este enlace para validar su cuenta

", - "PopUpForm.Email.options.from.email.placeholder": "johndoe@gmail.com", - "PopUpForm.Email.options.response_email.placeholder": "johndoe@gmail.com", - "PopUpForm.Email.options.from.name.placeholder": "John Doe", - "PopUpForm.Providers.enabled.label": "Habilitar", - "PopUpForm.Providers.enabled.description": "Si está desactivado, los usuarios no podrán utilizar este proveedor.", - "PopUpForm.Providers.key.label": "ID de cliente", - "PopUpForm.Providers.key.placeholder": "TEXTO", - "PopUpForm.Providers.secret.label": "Secreto Cliente", - "PopUpForm.Providers.secret.placeholder": "TEXTO", - "PopUpForm.Providers.redirectURL.front-end.label": "La URL de redireccionamiento a su aplicación front-end", - - "PopUpForm.Providers.facebook.providerConfig.redirectURL": "La URL de redirección que se debe agregar en la configuración de la aplicación Facebook", - "PopUpForm.Providers.google.providerConfig.redirectURL": "La URL de redirección que se debe agregar en la configuración de la aplicación Google", - "PopUpForm.Providers.github.providerConfig.redirectURL": "La URL de redirección que se debe agregar en la configuración de la aplicación GitHub", - "PopUpForm.Providers.linkedin2.providerConfig.redirectURL": "La URL de redirección que se debe agregar en la configuración de la aplicación Linkedin", - "PopUpForm.Providers.twitter.providerConfig.redirectURL": "La URL de redirección que se debe agregar en la configuración de la aplicación Twitter", - - "PopUpForm.Providers.callback.placeholder": "TEXTO", - "PopUpForm.Email.email_templates.inputDescription": "Si no estás seguro de cómo usar las variables, {link}", - "PopUpForm.Email.link.documentation": "consulte nuestra documentación." -} + "components.Input.error.password.noMatch": "Las contraseñas no coinciden", + "notification.error.delete": "Se ha producido un error al intentar borrar el elemento", + "notification.error.fetch": "Se ha producido un error al intentar recuperar los datos", + "notification.error.fetchUser": "Se ha producido un error al intentar buscar usuarios", + "notification.info.emailSent": "El email ha sido enviado", + "notification.success.delete": "El elemento ha sido borrado", + "notification.success.submit": "Los ajustes se han actualizado", + "plugin.description.long": "Proteja su API con un proceso de autenticación completo basado en JWT. Este plugin viene también con una estrategia ACL que le permite administrar los permisos entre los grupos de usuarios.", + "plugin.description.short": "Proteja su API con un proceso de autenticación completo basado en JWT" +} \ No newline at end of file diff --git a/packages/strapi-plugin-users-permissions/admin/src/translations/fr.json b/packages/strapi-plugin-users-permissions/admin/src/translations/fr.json index f12484c033..08b0e2cb4c 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/translations/fr.json +++ b/packages/strapi-plugin-users-permissions/admin/src/translations/fr.json @@ -1,177 +1,144 @@ { - "Auth.form.button.register-success": "Envoyer à nouveau", + "Auth.advanced.allow_register": "", "Auth.form.button.forgot-password": "Envoyer à nouveau", "Auth.form.button.forgot-password.success": "Envoyer à nouveau", - "Auth.form.button.reset-password": "Changez votre mot de passe", "Auth.form.button.login": "Se connecter", "Auth.form.button.register": "Prêt à commencer", + "Auth.form.button.register-success": "Envoyer à nouveau", + "Auth.form.button.reset-password": "Changez votre mot de passe", + "Auth.form.error.code.provide": "Le code est incorrect.", + "Auth.form.error.email.invalid": "Cette e-mail n'est pas valide.", + "Auth.form.error.email.provide": "Votre identifiant est manquant.", + "Auth.form.error.email.taken": "Cet email est déjà utilisé", + "Auth.form.error.invalid": "Votre identifiant ou mot de passe est incorrect.", "Auth.form.error.noAdminAccess": "Vous ne pouvez pas accéder à l'administration.", - + "Auth.form.error.params.provide": "Les informations nos incorrect.", + "Auth.form.error.password.format": "Votre mot de passe ne peut pas contenir trois fois le symbole `$`.", + "Auth.form.error.password.local": "Ce compte n'a pas de mot de passe.", + "Auth.form.error.password.matching": "Les mots de passe ne sont pas identique.", + "Auth.form.error.password.provide": "Votre mot de passe est manquant.", + "Auth.form.error.user.not-exist": "Cette e-mails n'existe pas.", + "Auth.form.error.username.taken": "Ce nom est déjà utilisé", "Auth.form.forgot-password.email.label": "Entrez votre email", "Auth.form.forgot-password.email.label.success": "Email envoyé avec succès à l'adresse suivante", "Auth.form.forgot-password.email.placeholder": "mysuperemail@gmail.com", - - "Auth.form.header.login": "strapi", - "Auth.header.register.description": "Pour finir le setup et sécuriser votre app, merci de créer le premier utilisateur (root admin) en remplissant le formulaire suivant.", "Auth.form.header.forgot-password": "strapi", + "Auth.form.header.login": "strapi", "Auth.form.header.register": "Bienvenue!", "Auth.form.header.register-success": "strapi", - "Auth.form.login.password.label": "Mot de Passe", "Auth.form.login.rememberMe.label": "Se souvenir de moi", "Auth.form.login.username.label": "Username", "Auth.form.login.username.placeholder": "John Doe", - - "Auth.form.register.email.label": "Email", - "Auth.form.register.email.placeholder": "johndoe@gmail.com", - "Auth.form.register.username.label": "Username", - "Auth.form.register.username.placeholder": "John Doe", - "Auth.form.register.password.label": "Mot de Passe", - "Auth.form.register.confirmPassword.label": "Confirmez le Mot de Passe", - "Auth.form.register.news.label": "Me tenir au courant des nouvelles fonctionnalités et améliorations à venir.", - "Auth.form.register-success.email.label": "Email envoyé avec succès à", "Auth.form.register-success.email.placeholder": "mysuperemail@gmail.com", - - "Auth.form.error.email.provide": "Votre identifiant est manquant.", - "Auth.form.error.email.invalid": "Cette e-mail n'est pas valide.", - "Auth.form.error.password.provide": "Votre mot de passe est manquant.", - "Auth.form.error.invalid": "Votre identifiant ou mot de passe est incorrect.", - "Auth.form.error.password.local": "Ce compte n'a pas de mot de passe.", - "Auth.form.error.password.format": "Votre mot de passe ne peut pas contenir trois fois le symbole `$`.", - "Auth.form.error.user.not-exist": "Cette e-mails n'existe pas.", - "Auth.form.error.code.provide": "Le code est incorrect.", - "Auth.form.error.password.matching": "Les mots de passe ne sont pas identique.", - "Auth.form.error.params.provide": "Les informations nos incorrect.", - "Auth.form.error.username.taken": "Ce nom est déjà utilisé", - "Auth.form.error.email.taken": "Cet email est déjà utilisé", - + "Auth.form.register.confirmPassword.label": "Confirmez le Mot de Passe", + "Auth.form.register.email.label": "Email", + "Auth.form.register.email.placeholder": "johndoe@gmail.com", + "Auth.form.register.news.label": "Me tenir au courant des nouvelles fonctionnalités et améliorations à venir.", + "Auth.form.register.password.label": "Mot de Passe", + "Auth.form.register.username.label": "Username", + "Auth.form.register.username.placeholder": "John Doe", + "Auth.header.register.description": "Pour finir le setup et sécuriser votre app, merci de créer le premier utilisateur (root admin) en remplissant le formulaire suivant.", "Auth.link.forgot-password": "Mot de passe oublié?", "Auth.link.ready": "Prêt à vous connecter?", - "BoundRoute.title": "Route associée à", - - "components.Input.error.password.noMatch": "Le mot de passe ne correspond pas", - "Controller.input.label": "{label} ", "Controller.selectAll": "Tout cocher", - - "EditForm.inputSelect.label.role": "Rôle par defaut pour les nouveaux utilisateurs", "EditForm.inputSelect.description.role": "Choisissez le rôle qui sera lié aux utilisateurs lors de le enregistrement.", - "EditForm.inputSelect.subscriptions.label": "Quotas de souscriptions", - "EditForm.inputSelect.subscriptions.description": "Limitez le nombre de souscriptions par IP par heure.", - "EditForm.inputSelect.durations.label": "Duration", "EditForm.inputSelect.durations.description": "Nombre d'heure pendant lesquelles un utilisateur ne peut souscrire.", - - "EditForm.inputToggle.label.email": "Un compte par adresse email", - "EditForm.inputToggle.label.sign-up": "Activer l'inscription", + "EditForm.inputSelect.durations.label": "Duration", + "EditForm.inputSelect.label.role": "Rôle par defaut pour les nouveaux utilisateurs", + "EditForm.inputSelect.subscriptions.description": "Limitez le nombre de souscriptions par IP par heure.", + "EditForm.inputSelect.subscriptions.label": "Quotas de souscriptions", "EditForm.inputToggle.description.email": "Interdire l'utilisateur de créer de multiple comptes avec la même adresse email avec des providers différents", "EditForm.inputToggle.description.sign-up": "Quand l'inscription est désactivée (OFF), aucun utilisateur ne peut s'inscrire qu'importe le provider", - + "EditForm.inputToggle.label.email": "Un compte par adresse email", + "EditForm.inputToggle.label.sign-up": "Activer l'inscription", "EditPage.cancel": "Cancel", - "EditPage.submit": "Sauvegarder", "EditPage.form.roles": "Rôles détails", "EditPage.form.roles.label.description": "Description", "EditPage.form.roles.label.name": "Nom", "EditPage.form.roles.label.users": "Utilisateurs associés avec ce rôle ({number})", "EditPage.form.roles.name.error": "Ce champ est obligatoire.", - "EditPage.header.title": "{name} ", - "EditPage.header.title.create": "Créez un nouveau rôle", "EditPage.header.description": "{description} ", "EditPage.header.description.create": " ", - + "EditPage.header.title": "{name} ", + "EditPage.header.title.create": "Créez un nouveau rôle", "EditPage.notification.permissions.error": "Une erreur est survenue en récupérant les permissions", "EditPage.notification.policies.error": "Une erreur est survenue en récupérant les policies", "EditPage.notification.role.error": "Une erreur est survenue en récupérant le rôle", - - + "EditPage.submit": "Sauvegarder", + "Email.template.reset_password": "Modification de mot de passe", + "Email.template.success_register": "Inscription réussie", + "Email.template.validation_email": "Email de validation d'adresse", "HeaderNav.link.advancedSettings": "Paramètres avancés", "HeaderNav.link.emailTemplates": "Templates d'email", "HeaderNav.link.providers": "Fournisseurs", "HeaderNav.link.roles": "Rôles & Permissions", - - "HomePage.header.title": "Roles & Permissions", "HomePage.header.description": "Définissez les rôles et permissions pour chacun d'eux", - + "HomePage.header.title": "Roles & Permissions", "InputSearch.placeholder": "Recherez un utilisateur", - - "List.button.roles": "Ajouter un Nouveau Rôle", "List.button.providers": "Ajouter Un Nouveau Provider", - - "List.title.emailTemplates.singular": "{number} template d'email est disponible", + "List.button.roles": "Ajouter un Nouveau Rôle", "List.title.emailTemplates.plural": "{number} templates d'email sont disponibles", - - "List.title.providers.enabled.singular": "{number} provider est disponible et", - "List.title.providers.enabled.plural": "{number} providers sont disponibles et", - "List.title.providers.disabled.singular": "{number} indisponible", + "List.title.emailTemplates.singular": "{number} template d'email est disponible", "List.title.providers.disabled.plural": "{number} indisponibles", - - "List.title.roles.singular": "{number} rôle est disponible", + "List.title.providers.disabled.singular": "{number} indisponible", + "List.title.providers.enabled.plural": "{number} providers sont disponibles et", + "List.title.providers.enabled.singular": "{number} provider est disponible et", "List.title.roles.plural": "{number} rôles sont disponibles", - - "notification.error.delete": "Une erreur est survenue en essayant de supprimer cet élément", - "notification.error.fetch": "Une erreur est survenue en essayant de récupérer les données", - "notification.error.fetchUser": "Une erreur est survenue en esssayent de récupérer les users", - "notification.info.emailSent": "L'email a été envoyé", - "notification.success.delete": "L'élément a bien été supprimé", - "notification.success.submit": "Les configurations ont bien été sauvegardés", - - "plugin.description.short": "Protégez votre API avec un système d'authentification complet basé sur JWT", - "plugin.description.long": "Protégez votre API avec un système d'authentification complet basé sur JWT (JSON Web Token). Ce plugin ajoute aussi une stratégie ACL (Access Control Layer) qui vous permet de gérer les permissions entre les groupes d'utilisateurs.", - + "List.title.roles.singular": "{number} rôle est disponible", "Plugin.permissions.application.description": "Définissez les actions autorisées dans votre projet.", "Plugin.permissions.plugins.description": "Définissez les actions autorisées dans le {name} plugin.", - - "Plugins.header.title": "Permissions", "Plugins.header.description": "Sont listés uniquement les actions associées à une route.", - + "Plugins.header.title": "Permissions", "Policies.InputSelect.empty": "Aucune", "Policies.InputSelect.label": "Autorisez cette action pour :", "Policies.header.hint": "Sélectionnez les actions de l'application ou d'un plugin et cliquer sur l'icon de paramètres pour voir les routes associées à cette action", "Policies.header.title": "Paramètres avancés", - - "Email.template.validation_email": "Email de validation d'adresse", - "Email.template.reset_password": "Modification de mot de passe", - "Email.template.success_register": "Inscription réussie", - - "Auth.advanced.allow_register": "", - + "PopUpForm.Email.email_templates.inputDescription": "Regardez la documentation des variables, {link}", + "PopUpForm.Email.link.documentation": "afin de templeter vos emails", + "PopUpForm.Email.options.from.email.label": "Email de l'envoyeur", + "PopUpForm.Email.options.from.email.placeholder": "arthurdupont@gmail.com", + "PopUpForm.Email.options.from.name.label": "Nom de l'envoyeur", + "PopUpForm.Email.options.from.name.placeholder": "Arthur Dupont", + "PopUpForm.Email.options.message.label": "Message", + "PopUpForm.Email.options.object.label": "Objet", + "PopUpForm.Email.options.response_email.label": "Email de réponse", + "PopUpForm.Email.options.response_email.placeholder": "arthurdupont@gmail.com", + "PopUpForm.Email.reset_password.options.message.placeholder": "

Merci de cliquer sur ce lien pour valider votre compte

", + "PopUpForm.Email.reset_password.options.object.placeholder": "Merci de confirmer votre adresse email pour %APP_NAME%", + "PopUpForm.Email.success_register.options.message.placeholder": "

Merci de cliquer sur ce lien pour valider votre compte

", + "PopUpForm.Email.success_register.options.object.placeholder": "Merci de confirmer votre adresse email pour %APP_NAME%", + "PopUpForm.Email.validation_email.options.message.placeholder": "

Merci de cliquer sur ce lien pour valider votre compte

", + "PopUpForm.Email.validation_email.options.object.placeholder": "Merci de confirmer votre adresse email pour %APP_NAME%", + "PopUpForm.Providers.callback.placeholder": "TEXT", + "PopUpForm.Providers.enabled.description": "S'il est désactivé les utilisateurs ne pourront pas utiliser ce provider.", + "PopUpForm.Providers.enabled.label": "Activer", + "PopUpForm.Providers.facebook.providerConfig.redirectURL": "L'URL de redirection à ajouter dans les configurations Facebook de votre application", + "PopUpForm.Providers.github.providerConfig.redirectURL": "L'URL de redirection à ajouter dans les configurations GitHub de votre application", + "PopUpForm.Providers.google.providerConfig.redirectURL": "L'URL de redirection à ajouter dans les configurations Google de votre application", + "PopUpForm.Providers.key.label": "Client ID", + "PopUpForm.Providers.key.placeholder": "TEXT", + "PopUpForm.Providers.linkedin2.providerConfig.redirectURL": "L'URL de redirection à ajouter dans les configurations Linkedin de votre application", + "PopUpForm.Providers.redirectURL.front-end.label": "L'URL de redirection de votre app front-end", + "PopUpForm.Providers.secret.label": "Client Secret", + "PopUpForm.Providers.secret.placeholder": "TEXT", + "PopUpForm.Providers.twitter.providerConfig.redirectURL": "L'URL de redirection à ajouter dans les configurations Twitter de votre application", "PopUpForm.button.cancel": "Annuler", "PopUpForm.button.save": "Sauvegarder", "PopUpForm.header.add.providers": "Ajouter un Nouveau Provider", "PopUpForm.header.edit.email-templates": "Editer Email Templates", "PopUpForm.header.edit.providers": "Editer {provider} Provider", "PopUpForm.inputSelect.providers.label": "Sélectionnez le provider", - "PopUpForm.Email.options.from.name.label": "Nom de l'envoyeur", - "PopUpForm.Email.options.from.email.label": "Email de l'envoyeur", - "PopUpForm.Email.options.response_email.label": "Email de réponse", - "PopUpForm.Email.options.object.label": "Objet", - "PopUpForm.Email.validation_email.options.object.placeholder": "Merci de confirmer votre adresse email pour %APP_NAME%", - "PopUpForm.Email.success_register.options.object.placeholder": "Merci de confirmer votre adresse email pour %APP_NAME%", - "PopUpForm.Email.reset_password.options.object.placeholder": "Merci de confirmer votre adresse email pour %APP_NAME%", - "PopUpForm.Email.options.message.label": "Message", - "PopUpForm.Email.validation_email.options.message.placeholder": "

Merci de cliquer sur ce lien pour valider votre compte

", - "PopUpForm.Email.success_register.options.message.placeholder": "

Merci de cliquer sur ce lien pour valider votre compte

", - "PopUpForm.Email.reset_password.options.message.placeholder": "

Merci de cliquer sur ce lien pour valider votre compte

", - "PopUpForm.Email.options.from.email.placeholder": "arthurdupont@gmail.com", - "PopUpForm.Email.options.response_email.placeholder": "arthurdupont@gmail.com", - "PopUpForm.Email.options.from.name.placeholder": "Arthur Dupont", - "PopUpForm.Providers.enabled.label": "Activer", - "PopUpForm.Providers.enabled.description": "S'il est désactivé les utilisateurs ne pourront pas utiliser ce provider.", - "PopUpForm.Providers.key.label": "Client ID", - "PopUpForm.Providers.key.placeholder": "TEXT", - "PopUpForm.Providers.secret.label": "Client Secret", - "PopUpForm.Providers.secret.placeholder": "TEXT", - - "PopUpForm.Providers.redirectURL.front-end.label": "L'URL de redirection de votre app front-end", - - "PopUpForm.Providers.facebook.providerConfig.redirectURL": "L'URL de redirection à ajouter dans les configurations Facebook de votre application", - "PopUpForm.Providers.google.providerConfig.redirectURL": "L'URL de redirection à ajouter dans les configurations Google de votre application", - "PopUpForm.Providers.github.providerConfig.redirectURL": "L'URL de redirection à ajouter dans les configurations GitHub de votre application", - "PopUpForm.Providers.linkedin2.providerConfig.redirectURL": "L'URL de redirection à ajouter dans les configurations Linkedin de votre application", - "PopUpForm.Providers.twitter.providerConfig.redirectURL": "L'URL de redirection à ajouter dans les configurations Twitter de votre application", - - "PopUpForm.Providers.callback.placeholder": "TEXT", - "PopUpForm.Email.email_templates.inputDescription": "Regardez la documentation des variables, {link}", - "PopUpForm.Email.link.documentation": "afin de templeter vos emails" -} + "components.Input.error.password.noMatch": "Le mot de passe ne correspond pas", + "notification.error.delete": "Une erreur est survenue en essayant de supprimer cet élément", + "notification.error.fetch": "Une erreur est survenue en essayant de récupérer les données", + "notification.error.fetchUser": "Une erreur est survenue en esssayent de récupérer les users", + "notification.info.emailSent": "L'email a été envoyé", + "notification.success.delete": "L'élément a bien été supprimé", + "notification.success.submit": "Les configurations ont bien été sauvegardés", + "plugin.description.long": "Protégez votre API avec un système d'authentification complet basé sur JWT (JSON Web Token). Ce plugin ajoute aussi une stratégie ACL (Access Control Layer) qui vous permet de gérer les permissions entre les groupes d'utilisateurs.", + "plugin.description.short": "Protégez votre API avec un système d'authentification complet basé sur JWT" +} \ No newline at end of file diff --git a/packages/strapi-plugin-users-permissions/admin/src/translations/it.json b/packages/strapi-plugin-users-permissions/admin/src/translations/it.json index f845251dda..8c8fae0476 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/translations/it.json +++ b/packages/strapi-plugin-users-permissions/admin/src/translations/it.json @@ -1,144 +1,144 @@ { - "Auth.form.button.register-success": "Invia di nuovo", - "Auth.form.button.forgot-password.success": "Invia di nuovo", + "Auth.advanced.allow_register": "Registrazione consentita", "Auth.form.button.forgot-password": "Invia Email", - "Auth.form.button.reset-password": "Cambia password", + "Auth.form.button.forgot-password.success": "Invia di nuovo", "Auth.form.button.login": "Accedi", "Auth.form.button.register": "Inizia adesso", + "Auth.form.button.register-success": "Invia di nuovo", + "Auth.form.button.reset-password": "Cambia password", + "Auth.form.error.code.provide": "Codice fornito non corretto.", + "Auth.form.error.email.invalid": "Questa email non è valida.", + "Auth.form.error.email.provide": "Per favore fornisci il tuo username o la tua password", + "Auth.form.error.email.taken": "Email in uso", + "Auth.form.error.invalid": "Identificatore o password non valida.", "Auth.form.error.noAdminAccess": "Non puoi accedere al pannello di amministrazione.", + "Auth.form.error.params.provide": "I parametri forniti non sono corretti.", + "Auth.form.error.password.format": "La tua password non può contenere il simbolo $ per più di tre volte.", + "Auth.form.error.password.local": "Questo utente non ha mai impostato una password locale, accedi gentilmente tramite il provider usato durante la creazione dell'account", + "Auth.form.error.password.matching": "La password non corrisponde.", + "Auth.form.error.password.provide": "Per favore fornisci la tua password", + "Auth.form.error.user.not-exist": "Questa email non esiste.", + "Auth.form.error.username.taken": "Username in uso", "Auth.form.forgot-password.email.label": "Inserisci la tua email", "Auth.form.forgot-password.email.label.success": "Email inviata correttamente", "Auth.form.forgot-password.email.placeholder": "mysuperemail@gmail.com", - "Auth.header.register.description": "Per terminare l'installazione e mettere in sicurezza la tua applicazione è necessario creare il primo utente (root admin) inserendo le informazioni necessarie di seguito riportate", - "Auth.form.header.login": "strapi", "Auth.form.header.forgot-password": "strapi", + "Auth.form.header.login": "strapi", "Auth.form.header.register": "Benvenuto!", "Auth.form.header.register-success": "strapi", "Auth.form.login.password.label": "Password", "Auth.form.login.rememberMe.label": "Ricordati di me", "Auth.form.login.username.label": "Username", "Auth.form.login.username.placeholder": "John Doe", - "Auth.form.register.email.label": "Email", - "Auth.form.register.email.placeholder": "johndoe@gmail.com", - "Auth.form.register.username.label": "Username", - "Auth.form.register.username.placeholder": "John Doe", - "Auth.form.register.password.label": "Password", - "Auth.form.register.confirmPassword.label": "Password di conferma", - "Auth.form.register.news.label": "Tienimi aggiornato su nuove funzionalità e futuri miglioramenti", "Auth.form.register-success.email.label": "Email inviata con successo a", "Auth.form.register-success.email.placeholder": "mysuperemail@gmail.com", - "Auth.form.error.email.provide": "Per favore fornisci il tuo username o la tua password", - "Auth.form.error.email.invalid": "Questa email non è valida.", - "Auth.form.error.password.provide": "Per favore fornisci la tua password", - "Auth.form.error.invalid": "Identificatore o password non valida.", - "Auth.form.error.password.local": "Questo utente non ha mai impostato una password locale, accedi gentilmente tramite il provider usato durante la creazione dell'account", - "Auth.form.error.password.format": "La tua password non può contenere il simbolo $ per più di tre volte.", - "Auth.form.error.user.not-exist": "Questa email non esiste.", - "Auth.form.error.code.provide": "Codice fornito non corretto.", - "Auth.form.error.password.matching": "La password non corrisponde.", - "Auth.form.error.params.provide": "I parametri forniti non sono corretti.", - "Auth.form.error.username.taken": "Username in uso", - "Auth.form.error.email.taken": "Email in uso", + "Auth.form.register.confirmPassword.label": "Password di conferma", + "Auth.form.register.email.label": "Email", + "Auth.form.register.email.placeholder": "johndoe@gmail.com", + "Auth.form.register.news.label": "Tienimi aggiornato su nuove funzionalità e futuri miglioramenti", + "Auth.form.register.password.label": "Password", + "Auth.form.register.username.label": "Username", + "Auth.form.register.username.placeholder": "John Doe", + "Auth.header.register.description": "Per terminare l'installazione e mettere in sicurezza la tua applicazione è necessario creare il primo utente (root admin) inserendo le informazioni necessarie di seguito riportate", "Auth.link.forgot-password": "Password dimenticata?", "Auth.link.ready": "Sei pronto per accedere?", "BoundRoute.title": "Percorso vincolato a", - "components.Input.error.password.noMatch": "La password non corrisponde", "Controller.input.label": "{label}", "Controller.selectAll": "Seleziona tutto", - "EditForm.inputSelect.label.role": "Ruolo di default per gli utenti autenticati", "EditForm.inputSelect.description.role": "Questa operazione associerà i nuovi utenti autenticati al ruolo selezionato.", - "EditForm.inputSelect.subscriptions.label": "Gestisci le sottoscrizioni di quota", - "EditForm.inputSelect.subscriptions.description": "Limita il numero di sottoscrizioni per IP per ora.", - "EditForm.inputSelect.durations.label": "Durata", "EditForm.inputSelect.durations.description": "Numero di ore in cui l'utente non può registrarsi", - "EditForm.inputToggle.label.email": "Un account per indirizzo email", - "EditForm.inputToggle.label.sign-up": "Abilita iscrizioni", + "EditForm.inputSelect.durations.label": "Durata", + "EditForm.inputSelect.label.role": "Ruolo di default per gli utenti autenticati", + "EditForm.inputSelect.subscriptions.description": "Limita il numero di sottoscrizioni per IP per ora.", + "EditForm.inputSelect.subscriptions.label": "Gestisci le sottoscrizioni di quota", "EditForm.inputToggle.description.email": "Non consentire all'utente di creare account multipli usando lo stesso indirizzo email con fornitori di autenticazione diversi.", "EditForm.inputToggle.description.sign-up": "Quando disabilitata (OFF), il processo di registrazione è proibito. Nessuno può iscriversi indipendentemente dal fornitore utilizzato.", + "EditForm.inputToggle.label.email": "Un account per indirizzo email", + "EditForm.inputToggle.label.sign-up": "Abilita iscrizioni", "EditPage.cancel": "Cancella", - "EditPage.submit": "Salva", "EditPage.form.roles": "Dettagli del ruolo", "EditPage.form.roles.label.description": "Descrizione", "EditPage.form.roles.label.name": "Nome", "EditPage.form.roles.label.users": "Utente associato con questo ruolo ({number})", "EditPage.form.roles.name.error": "Questo valore è obbligatorio", - "EditPage.header.title": "{name}", - "EditPage.header.title.create": "Crea un nuovo ruolo", "EditPage.header.description": "{description}", "EditPage.header.description.create": "Crea", + "EditPage.header.title": "{name}", + "EditPage.header.title.create": "Crea un nuovo ruolo", "EditPage.notification.permissions.error": "Si è verificato un errore durante il recupero dei permessi", "EditPage.notification.policies.error": "Si è verificato un errore durante il recupero delle policy", "EditPage.notification.role.error": "Si è verificato un errore durante il recupero del ruolo", - "eaderNav.link.advancedSettings": "Impostazioni avanzate", + "EditPage.submit": "Salva", + "Email.template.reset_password": "Reset password", + "Email.template.success_register": "Registrazione avvenuta", + "Email.template.validation_email": "Validazione dell'indirizzo Email", "HeaderNav.link.emailTemplates": "Template delle Email", "HeaderNav.link.providers": "Providers", "HeaderNav.link.roles": "Ruoli e permessi", - "HomePage.header.title": "Ruoli e permessi", "HomePage.header.description": "Definisci i ruoli e i permessi per i tuoi utenti.", + "HomePage.header.title": "Ruoli e permessi", "InputSearch.placeholder": "Cerca un utente", - "List.button.roles": "Aggiungi un ruolo", "List.button.providers": "Aggiungi un nuovo Provider", - "List.title.emailTemplates.singular": "{number} template per le email disponibile", + "List.button.roles": "Aggiungi un ruolo", "List.title.emailTemplates.plural": "{number} template per le email disponibili", - "List.title.providers.disabled.singular": "{number} disabilitato", + "List.title.emailTemplates.singular": "{number} template per le email disponibile", "List.title.providers.disabled.plural": "{number} sono disabilitati", - "List.title.providers.enabled.singular": "{number} provider è abilitato e", + "List.title.providers.disabled.singular": "{number} disabilitato", "List.title.providers.enabled.plural": "{number} providers sono disponibili e", - "List.title.roles.singular": "{number} ruolo disponibile", + "List.title.providers.enabled.singular": "{number} provider è abilitato e", "List.title.roles.plural": "{number} ruoli disponibili", - "notification.error.delete": "Si è verificato un errore mentre si stava cercando di eliminare l'elemento", - "notification.error.fetch": "Si è verificato un errore mentre si stava cercando di recuperare i dati", - "notification.error.fetchUser": "Si è verificato un errore mentre si stava cercando di recuperare gli utenti", - "notification.info.emailSent": "Email inviata", - "notification.success.delete": "L'elemento è stato eliminato", - "notification.success.submit": "Impostazioni aggiornate", - "plugin.description.short": "Proteggi le tue API con un processo completo di autenticazione basato su JWT", - "plugin.description.long": "Proteggi le tue API con un processo completo di autenticazione basato su JWT. Questo plugin è implementato con una strategia ACL che ti consente di gestire i permessi tra i gruppi di utenti.", + "List.title.roles.singular": "{number} ruolo disponibile", "Plugin.permissions.application.description": "Definire tutte le azioni consentite per il tuo progetto.", "Plugin.permissions.plugins.description": "Definire tutte le azioni consentite per il plugin {name}.", - "Plugins.header.title": "Permessi", "Plugins.header.description": "Solo le azioni guidate da un percorso sono elencate sotto.", + "Plugins.header.title": "Permessi", "Policies.InputSelect.empty": "Nessuno", "Policies.InputSelect.label": "Consenti di eseguire questa azione per:", "Policies.header.hint": "Seleziona le azioni dell'applicazione o del plugin e clicca sull'icona cog per mostrare il percorso corrispondente", "Policies.header.title": "Impostazioni avanzate", - "Email.template.validation_email": "Validazione dell'indirizzo Email", - "Email.template.reset_password": "Reset password", - "Email.template.success_register": "Registrazione avvenuta", - "Auth.advanced.allow_register": "Registrazione consentita", + "PopUpForm.Email.email_templates.inputDescription": "Se non sai bene come usare le variabili, {link}", + "PopUpForm.Email.link.documentation": "controlla la documentazione", + "PopUpForm.Email.options.from.email.label": "Email del mittente", + "PopUpForm.Email.options.from.email.placeholder": "johndoe@gmail.com", + "PopUpForm.Email.options.from.name.label": "Nome del mittente", + "PopUpForm.Email.options.from.name.placeholder": "John Doe", + "PopUpForm.Email.options.message.label": "Messaggio", + "PopUpForm.Email.options.object.label": "Soggetto", + "PopUpForm.Email.options.response_email.label": "Email di risposta", + "PopUpForm.Email.options.response_email.placeholder": "johndoe@gmail.com", + "PopUpForm.Email.reset_password.options.message.placeholder": "Clicca su questo link per validare il tuo account", + "PopUpForm.Email.reset_password.options.object.placeholder": "Conferma gentilmente il tuo indirizzo email per %APP_NAME%", + "PopUpForm.Email.success_register.options.message.placeholder": "Clicca su questo link per validare il tuo account", + "PopUpForm.Email.success_register.options.object.placeholder": "Conferma gentilmente il tuo indirizzo email per %APP_NAME%", + "PopUpForm.Email.validation_email.options.message.placeholder": "Clicca su questo link per validare il tuo account", + "PopUpForm.Email.validation_email.options.object.placeholder": "Conferma gentilmente il tuo indirizzo email per %APP_NAME%", + "PopUpForm.Providers.callback.placeholder": "TEXT", + "PopUpForm.Providers.enabled.description": "Se disabilitato, gli utenti non potranno usare questo provider.", + "PopUpForm.Providers.enabled.label": "Abilita", + "PopUpForm.Providers.facebook.providerConfig.redirectURL": "L'URL di redirect per aggiungere la tua configurazione dell'applicazione Facebook", + "PopUpForm.Providers.github.providerConfig.redirectURL": "L'URL di redirect per aggiungere la tua configurazione dell'applicazione Github", + "PopUpForm.Providers.google.providerConfig.redirectURL": "L'URL di redirect per aggiungere la tua configurazione dell'applicazione Google", + "PopUpForm.Providers.key.placeholder": "TEXT", + "PopUpForm.Providers.linkedin2.providerConfig.redirectURL": "L'URL di redirect per aggiungere la tua configurazione dell'applicazione Linkdin", + "PopUpForm.Providers.redirectURL.front-end.label": "L'URL di redirect per la tua app di front-end", + "PopUpForm.Providers.secret.label": "Client Secret", + "PopUpForm.Providers.secret.placeholder": "TEXT", + "PopUpForm.Providers.twitter.providerConfig.redirectURL": "L'URL di redirect per aggiungere la tua configurazione dell'applicazione Twitter", "PopUpForm.button.cancel": "Cancella", "PopUpForm.button.save": "Salva", "PopUpForm.header.add.providers": "Aggiungi nuovo Provider", "PopUpForm.header.edit.email-templates": "Modifica il template delle Email", "PopUpForm.header.edit.providers": "Modifica {provider} Provider", "PopUpForm.inputSelect.providers.label": "Scegli il provider", - "PopUpForm.Email.options.from.name.label": "Nome del mittente", - "PopUpForm.Email.options.from.email.label": "Email del mittente", - "PopUpForm.Email.options.response_email.label": "Email di risposta", - "PopUpForm.Email.options.object.label": "Soggetto", - "PopUpForm.Email.options.message.label": "Messaggio", - "PopUpForm.Email.validation_email.options.object.placeholder": "Conferma gentilmente il tuo indirizzo email per %APP_NAME%", - "PopUpForm.Email.reset_password.options.object.placeholder": "Conferma gentilmente il tuo indirizzo email per %APP_NAME%", - "PopUpForm.Email.success_register.options.object.placeholder": "Conferma gentilmente il tuo indirizzo email per %APP_NAME%", - "PopUpForm.Email.validation_email.options.message.placeholder": "Clicca su questo link per validare il tuo account", - "PopUpForm.Email.reset_password.options.message.placeholder": "Clicca su questo link per validare il tuo account", - "PopUpForm.Email.success_register.options.message.placeholder": "Clicca su questo link per validare il tuo account", - "PopUpForm.Email.options.from.email.placeholder": "johndoe@gmail.com", - "PopUpForm.Email.options.response_email.placeholder": "johndoe@gmail.com", - "PopUpForm.Email.options.from.name.placeholder": "John Doe", - "PopUpForm.Providers.enabled.label": "Abilita", - "PopUpForm.Providers.enabled.description": "Se disabilitato, gli utenti non potranno usare questo provider.", + "components.Input.error.password.noMatch": "La password non corrisponde", + "eaderNav.link.advancedSettings": "Impostazioni avanzate", + "notification.error.delete": "Si è verificato un errore mentre si stava cercando di eliminare l'elemento", + "notification.error.fetch": "Si è verificato un errore mentre si stava cercando di recuperare i dati", + "notification.error.fetchUser": "Si è verificato un errore mentre si stava cercando di recuperare gli utenti", + "notification.info.emailSent": "Email inviata", + "notification.success.delete": "L'elemento è stato eliminato", + "notification.success.submit": "Impostazioni aggiornate", "opUpForm.Providers.key.label": "Client ID", - "PopUpForm.Providers.key.placeholder": "TEXT", - "PopUpForm.Providers.secret.label": "Client Secret", - "PopUpForm.Providers.secret.placeholder": "TEXT", - "PopUpForm.Providers.redirectURL.front-end.label": "L'URL di redirect per la tua app di front-end", - "PopUpForm.Providers.facebook.providerConfig.redirectURL": "L'URL di redirect per aggiungere la tua configurazione dell'applicazione Facebook", - "PopUpForm.Providers.google.providerConfig.redirectURL": "L'URL di redirect per aggiungere la tua configurazione dell'applicazione Google", - "PopUpForm.Providers.github.providerConfig.redirectURL": "L'URL di redirect per aggiungere la tua configurazione dell'applicazione Github", - "PopUpForm.Providers.linkedin2.providerConfig.redirectURL": "L'URL di redirect per aggiungere la tua configurazione dell'applicazione Linkdin", - "PopUpForm.Providers.twitter.providerConfig.redirectURL": "L'URL di redirect per aggiungere la tua configurazione dell'applicazione Twitter", - "PopUpForm.Providers.callback.placeholder": "TEXT", - "PopUpForm.Email.email_templates.inputDescription": "Se non sai bene come usare le variabili, {link}", - "PopUpForm.Email.link.documentation": "controlla la documentazione" -} + "plugin.description.long": "Proteggi le tue API con un processo completo di autenticazione basato su JWT. Questo plugin è implementato con una strategia ACL che ti consente di gestire i permessi tra i gruppi di utenti.", + "plugin.description.short": "Proteggi le tue API con un processo completo di autenticazione basato su JWT" +} \ No newline at end of file diff --git a/packages/strapi-plugin-users-permissions/admin/src/translations/ko.json b/packages/strapi-plugin-users-permissions/admin/src/translations/ko.json index 20c751f40e..a26897dfba 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/translations/ko.json +++ b/packages/strapi-plugin-users-permissions/admin/src/translations/ko.json @@ -1,175 +1,144 @@ { - "Auth.form.button.register-success": "다시 보내기", - "Auth.form.button.forgot-password.success": "다시 보내기", + "Auth.advanced.allow_register": "", "Auth.form.button.forgot-password": "메일 보내기", - "Auth.form.button.reset-password": "패스워드 변경", + "Auth.form.button.forgot-password.success": "다시 보내기", "Auth.form.button.login": "로그인", "Auth.form.button.register": "등록", + "Auth.form.button.register-success": "다시 보내기", + "Auth.form.button.reset-password": "패스워드 변경", + "Auth.form.error.code.provide": "유효하지 않은 코드입니다.", + "Auth.form.error.email.invalid": "유효하지 않은 이메일입니다.", + "Auth.form.error.email.provide": "이메일을 입력해 주세요.", + "Auth.form.error.email.taken": "이미 사용 중인 이메일입니다.", + "Auth.form.error.invalid": "입력한 내용이 유효하지 않습니다.", "Auth.form.error.noAdminAccess": "관리자 페이지에 접근할 수 없습니다.", - + "Auth.form.error.params.provide": "유효하지 않은 파라미터입니다.", + "Auth.form.error.password.format": "패스워드에 `$` 문자를 세 번 이상 포함 할 수 없습니다.", + "Auth.form.error.password.local": "비밀번호를 설정하지 않았습니다. 다른 방법으로 로그인 하세요.", + "Auth.form.error.password.matching": "패스워드가 일치하지 않습니다.", + "Auth.form.error.password.provide": "패스워드를 입력해 주세요.", + "Auth.form.error.user.not-exist": "이메일이 없습니다.", + "Auth.form.error.username.taken": "이미 사용 중인 아이디입니다.", "Auth.form.forgot-password.email.label": "메일 주소를 입력하세요.", "Auth.form.forgot-password.email.label.success": "메일을 보냈습니다.", "Auth.form.forgot-password.email.placeholder": "mysuperemail@gmail.com", - - "Auth.header.register.description": "애플리케이션 설정 및 보안을 위해 첫 번째 사용자(root 관리자)를 생성하세요.", - "Auth.form.header.login": "strapi", "Auth.form.header.forgot-password": "strapi", + "Auth.form.header.login": "strapi", "Auth.form.header.register": "환영합니다!", "Auth.form.header.register-success": "strapi", - "Auth.form.login.password.label": "패스워드", "Auth.form.login.rememberMe.label": "로그인 상태 저장", "Auth.form.login.username.label": "아이디", "Auth.form.login.username.placeholder": "JohnDoe", - - "Auth.form.register.email.label": "이메일", - "Auth.form.register.email.placeholder": "johndoe@gmail.com", - "Auth.form.register.username.label": "아이디", - "Auth.form.register.username.placeholder": "JohnDoe", - "Auth.form.register.password.label": "패스워드", - "Auth.form.register.confirmPassword.label": "패스워드 확인", - "Auth.form.register.news.label": "새로운 기능 및 개선 사항 등을 업데이트 받겠습니다.", - "Auth.form.register-success.email.label": "메일을 발송했습니다. ", "Auth.form.register-success.email.placeholder": "mysuperemail@gmail.com", - - "Auth.form.error.email.provide": "이메일을 입력해 주세요.", - "Auth.form.error.email.invalid": "유효하지 않은 이메일입니다.", - "Auth.form.error.password.provide": "패스워드를 입력해 주세요.", - "Auth.form.error.invalid": "입력한 내용이 유효하지 않습니다.", - "Auth.form.error.password.local": "비밀번호를 설정하지 않았습니다. 다른 방법으로 로그인 하세요.", - "Auth.form.error.password.format": "패스워드에 `$` 문자를 세 번 이상 포함 할 수 없습니다.", - "Auth.form.error.user.not-exist": "이메일이 없습니다.", - "Auth.form.error.code.provide": "유효하지 않은 코드입니다.", - "Auth.form.error.password.matching": "패스워드가 일치하지 않습니다.", - "Auth.form.error.params.provide": "유효하지 않은 파라미터입니다.", - "Auth.form.error.username.taken": "이미 사용 중인 아이디입니다.", - "Auth.form.error.email.taken": "이미 사용 중인 이메일입니다.", - + "Auth.form.register.confirmPassword.label": "패스워드 확인", + "Auth.form.register.email.label": "이메일", + "Auth.form.register.email.placeholder": "johndoe@gmail.com", + "Auth.form.register.news.label": "새로운 기능 및 개선 사항 등을 업데이트 받겠습니다.", + "Auth.form.register.password.label": "패스워드", + "Auth.form.register.username.label": "아이디", + "Auth.form.register.username.placeholder": "JohnDoe", + "Auth.header.register.description": "애플리케이션 설정 및 보안을 위해 첫 번째 사용자(root 관리자)를 생성하세요.", "Auth.link.forgot-password": "패스워드 재설정", "Auth.link.ready": "로그인 하시겠습니까?", - "BoundRoute.title": "라우트(bound route)", - - "components.Input.error.password.noMatch": "패스워드가 일치하지 않습니다.", - "Controller.input.label": "{label} ", "Controller.selectAll": "전체 선택", - - "EditForm.inputSelect.label.role": "인증된 사용자의 기본 역할(role)", "EditForm.inputSelect.description.role": "인증된 사용자에 선택한 역할(role)을 부여합니다.", - "EditForm.inputSelect.subscriptions.label": "사용량 관리", - "EditForm.inputSelect.subscriptions.description": "동일 IP에서 시간당 사용할 수 있는 횟수를 제한합니다.", - "EditForm.inputSelect.durations.label": "기간(duration)", "EditForm.inputSelect.durations.description": "사용자가 사용할 수 없는 시간을 설정합니다.", - - "EditForm.inputToggle.label.email": "이메일 주소 당 하나의 계정", - "EditForm.inputToggle.label.sign-up": "사용자 등록", + "EditForm.inputSelect.durations.label": "기간(duration)", + "EditForm.inputSelect.label.role": "인증된 사용자의 기본 역할(role)", + "EditForm.inputSelect.subscriptions.description": "동일 IP에서 시간당 사용할 수 있는 횟수를 제한합니다.", + "EditForm.inputSelect.subscriptions.label": "사용량 관리", "EditForm.inputToggle.description.email": "사용자가 동일한 이메일 주소를 사용해 여러 계정을 만들지 못하게 합니다.", "EditForm.inputToggle.description.sign-up": "비활성(OFF)일 경우, 등록 프로세스를 금지합니다. 사용하는 프로바이더(provider)에 관계 없이 누구도 가입할 수 없습니다.", - + "EditForm.inputToggle.label.email": "이메일 주소 당 하나의 계정", + "EditForm.inputToggle.label.sign-up": "사용자 등록", "EditPage.cancel": "취소", - "EditPage.submit": "저장", "EditPage.form.roles": "역할(role) 세부설정", "EditPage.form.roles.label.description": "설명", "EditPage.form.roles.label.name": "이름", "EditPage.form.roles.label.users": "이 역할(role)에 속한 사용자 ({number})", "EditPage.form.roles.name.error": "내용을 입력해 주세요.", - "EditPage.header.title": "{name} ", - "EditPage.header.title.create": "새로운 역할(role) 생성", "EditPage.header.description": "{description} ", "EditPage.header.description.create": " ", - + "EditPage.header.title": "{name} ", + "EditPage.header.title.create": "새로운 역할(role) 생성", "EditPage.notification.permissions.error": "권한(permissions)을 가져오는데 에러가 발생했습니다.", "EditPage.notification.policies.error": "정책(policies)를 가져오는데 에러가 발생했습니다.", "EditPage.notification.role.error": "역할(role)을 가져오는데 에러가 발생했습니다.", - + "EditPage.submit": "저장", + "Email.template.reset_password": "패스워드 재설정", + "Email.template.success_register": "등록했습니다.", + "Email.template.validation_email": "이메일 주소 검증", "HeaderNav.link.advancedSettings": "고급 설정", "HeaderNav.link.emailTemplates": "이메일 템플릿", "HeaderNav.link.providers": "프로바이더(Providers)", "HeaderNav.link.roles": "역할(Roles) & 권한(Permissions)", - - "HomePage.header.title": "역할(roles) & 권한(permissions)", "HomePage.header.description": "사용자의 역할(roles)과 권한(permissions)을 설정하고 관리합니다.", - + "HomePage.header.title": "역할(roles) & 권한(permissions)", "InputSearch.placeholder": "사용자 검색", - - "List.button.roles": "새 역할(role) 추가", "List.button.providers": "새 프로바이더(provider) 추가", - - "List.title.emailTemplates.singular": "{number}개의 이메일 템플릿이 있습니다.", + "List.button.roles": "새 역할(role) 추가", "List.title.emailTemplates.plural": "{number}개의 이메일 템플릿이 있습니다.", - - "List.title.providers.disabled.singular": "{number}개 사용 불가능", + "List.title.emailTemplates.singular": "{number}개의 이메일 템플릿이 있습니다.", "List.title.providers.disabled.plural": "{number}개 사용 불가능", - "List.title.providers.enabled.singular": "{number}개 사용 가능, ", + "List.title.providers.disabled.singular": "{number}개 사용 불가능", "List.title.providers.enabled.plural": "{number}개 사용 가능, ", - - "List.title.roles.singular": "{number}개의 역할(role)이 있습니다.", + "List.title.providers.enabled.singular": "{number}개 사용 가능, ", "List.title.roles.plural": "{number}개의 역할(role)이 있습니다.", - - "notification.error.delete": "항목을 삭제하는데 에러가 발생했습니다.", - "notification.error.fetch": "데이터를 가져오는데 에러가 발생했습니다.", - "notification.error.fetchUser": "사용자를 가져오는데 에러가 발생했습니다.", - "notification.info.emailSent": "이메일을 보냈습니다.", - "notification.success.delete": "항목을 삭제했습니다.", - "notification.success.submit": "설정을 업데이트했습니다.", - - "plugin.description.short": "JWT 기반의 인증 프로세스로 API를 보호하세요.", - "plugin.description.long": "JWT 기반의 인증 프로세스로 API를 보호하세요. 이 플러그인에서 사용자 그룹간 권한을 관리할 수 있는 ACL 전략도 설정할 수 있습니다.", - + "List.title.roles.singular": "{number}개의 역할(role)이 있습니다.", "Plugin.permissions.application.description": "프로젝트에서 허용할 액션을 설정합니다.", "Plugin.permissions.plugins.description": "{name} 플러그인에서 허용할 액션을 설정합니다.", - - "Plugins.header.title": "권한(Permissions)", "Plugins.header.description": "라우트(route)에 연결된 액션만 표시됩니다.", - + "Plugins.header.title": "권한(Permissions)", "Policies.InputSelect.empty": "비어있음", "Policies.InputSelect.label": "다음에 대해 이 액션을 허용합니다.", "Policies.header.hint": "애플리케이션 또는 플러그인을 선택하고 항목을 클릭하면 바인딩 된 경로를 표시할 수 있습니다.", "Policies.header.title": "고급 설정", - - "Email.template.validation_email": "이메일 주소 검증", - "Email.template.reset_password": "패스워드 재설정", - "Email.template.success_register": "등록했습니다.", - - "Auth.advanced.allow_register": "", - + "PopUpForm.Email.email_templates.inputDescription": "이메일 템플릿 문법은 이 {link}를 확인하세요.", + "PopUpForm.Email.link.documentation": "문서", + "PopUpForm.Email.options.from.email.label": "보내는 이메일", + "PopUpForm.Email.options.from.email.placeholder": "johndoe@gmail.com", + "PopUpForm.Email.options.from.name.label": "보내는 사람", + "PopUpForm.Email.options.from.name.placeholder": "John Doe", + "PopUpForm.Email.options.message.label": "내용", + "PopUpForm.Email.options.object.label": "제목", + "PopUpForm.Email.options.response_email.label": "응답받을 이메일", + "PopUpForm.Email.options.response_email.placeholder": "johndoe@gmail.com", + "PopUpForm.Email.reset_password.options.message.placeholder": "

이 링크를 클릭하고 계정을 확인하세요.

", + "PopUpForm.Email.reset_password.options.object.placeholder": "%APP_NAME%의 이메일 주소를 확인하세요.", + "PopUpForm.Email.success_register.options.message.placeholder": "

이 링크를 클릭하고 계정을 확인하세요.

", + "PopUpForm.Email.success_register.options.object.placeholder": "%APP_NAME%의 이메일 주소를 확인하세요.", + "PopUpForm.Email.validation_email.options.message.placeholder": "

이 링크를 클릭하고 계정을 확인하세요.

", + "PopUpForm.Email.validation_email.options.object.placeholder": "%APP_NAME%의 이메일 주소를 확인하세요.", + "PopUpForm.Providers.callback.placeholder": "TEXT", + "PopUpForm.Providers.enabled.description": "사용하지 않을 경우 이 프로바이더(provider) 기능을 이용할 수 없습니다.", + "PopUpForm.Providers.enabled.label": "사용", + "PopUpForm.Providers.facebook.providerConfig.redirectURL": "Facebook 애플리케이션 구성에 추가 할 리다이렉트 URL", + "PopUpForm.Providers.github.providerConfig.redirectURL": "Github 애플리케이션 구성에 추가 할 리다이렉트 URL", + "PopUpForm.Providers.google.providerConfig.redirectURL": "Google 애플리케이션 구성에 추가 할 리다이렉트 URL", + "PopUpForm.Providers.key.label": "클라이언트 ID(Client ID)", + "PopUpForm.Providers.key.placeholder": "텍스트", + "PopUpForm.Providers.linkedin2.providerConfig.redirectURL": "Linkedin", + "PopUpForm.Providers.redirectURL.front-end.label": "프론트엔드 애플리케이션 리다이렉트 URL", + "PopUpForm.Providers.secret.label": "클라이언트 시크릿(Client Secret)", + "PopUpForm.Providers.secret.placeholder": "텍스트", + "PopUpForm.Providers.twitter.providerConfig.redirectURL": "Twitter", "PopUpForm.button.cancel": "취소", "PopUpForm.button.save": "저장", "PopUpForm.header.add.providers": "새 프로바이더(provider) 추가", "PopUpForm.header.edit.email-templates": "이메일 템플릿 수정", "PopUpForm.header.edit.providers": "{provider} 프로바이더(Provider) 설정", "PopUpForm.inputSelect.providers.label": "프로바이더(provider) 선택", - "PopUpForm.Email.options.from.name.label": "보내는 사람", - "PopUpForm.Email.options.from.email.label": "보내는 이메일", - "PopUpForm.Email.options.response_email.label": "응답받을 이메일", - "PopUpForm.Email.options.object.label": "제목", - "PopUpForm.Email.options.message.label": "내용", - "PopUpForm.Email.validation_email.options.object.placeholder": "%APP_NAME%의 이메일 주소를 확인하세요.", - "PopUpForm.Email.reset_password.options.object.placeholder": "%APP_NAME%의 이메일 주소를 확인하세요.", - "PopUpForm.Email.success_register.options.object.placeholder": "%APP_NAME%의 이메일 주소를 확인하세요.", - "PopUpForm.Email.validation_email.options.message.placeholder": "

이 링크를 클릭하고 계정을 확인하세요.

", - "PopUpForm.Email.reset_password.options.message.placeholder": "

이 링크를 클릭하고 계정을 확인하세요.

", - "PopUpForm.Email.success_register.options.message.placeholder": "

이 링크를 클릭하고 계정을 확인하세요.

", - "PopUpForm.Email.options.from.email.placeholder": "johndoe@gmail.com", - "PopUpForm.Email.options.response_email.placeholder": "johndoe@gmail.com", - "PopUpForm.Email.options.from.name.placeholder": "John Doe", - "PopUpForm.Providers.enabled.label": "사용", - "PopUpForm.Providers.enabled.description": "사용하지 않을 경우 이 프로바이더(provider) 기능을 이용할 수 없습니다.", - "PopUpForm.Providers.key.label": "클라이언트 ID(Client ID)", - "PopUpForm.Providers.key.placeholder": "텍스트", - "PopUpForm.Providers.secret.label": "클라이언트 시크릿(Client Secret)", - "PopUpForm.Providers.secret.placeholder": "텍스트", - "PopUpForm.Providers.redirectURL.front-end.label": "프론트엔드 애플리케이션 리다이렉트 URL", - - "PopUpForm.Providers.facebook.providerConfig.redirectURL": "Facebook 애플리케이션 구성에 추가 할 리다이렉트 URL", - "PopUpForm.Providers.google.providerConfig.redirectURL": "Google 애플리케이션 구성에 추가 할 리다이렉트 URL", - "PopUpForm.Providers.github.providerConfig.redirectURL": "Github 애플리케이션 구성에 추가 할 리다이렉트 URL", - "PopUpForm.Providers.linkedin2.providerConfig.redirectURL": "Linkedin", - "PopUpForm.Providers.twitter.providerConfig.redirectURL": "Twitter", - - "PopUpForm.Providers.callback.placeholder": "TEXT", - "PopUpForm.Email.email_templates.inputDescription": "이메일 템플릿 문법은 이 {link}를 확인하세요.", - "PopUpForm.Email.link.documentation": "문서" -} + "components.Input.error.password.noMatch": "패스워드가 일치하지 않습니다.", + "notification.error.delete": "항목을 삭제하는데 에러가 발생했습니다.", + "notification.error.fetch": "데이터를 가져오는데 에러가 발생했습니다.", + "notification.error.fetchUser": "사용자를 가져오는데 에러가 발생했습니다.", + "notification.info.emailSent": "이메일을 보냈습니다.", + "notification.success.delete": "항목을 삭제했습니다.", + "notification.success.submit": "설정을 업데이트했습니다.", + "plugin.description.long": "JWT 기반의 인증 프로세스로 API를 보호하세요. 이 플러그인에서 사용자 그룹간 권한을 관리할 수 있는 ACL 전략도 설정할 수 있습니다.", + "plugin.description.short": "JWT 기반의 인증 프로세스로 API를 보호하세요." +} \ No newline at end of file diff --git a/packages/strapi-plugin-users-permissions/admin/src/translations/nl.json b/packages/strapi-plugin-users-permissions/admin/src/translations/nl.json index 7c794e4db4..e002aa3927 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/translations/nl.json +++ b/packages/strapi-plugin-users-permissions/admin/src/translations/nl.json @@ -1,175 +1,144 @@ { - "Auth.form.button.register-success": "Opnieuw versturen", - "Auth.form.button.forgot-password.success": "Opnieuw versturen", + "Auth.advanced.allow_register": "", "Auth.form.button.forgot-password": "E-mail versturen", - "Auth.form.button.reset-password": "Wachtwoord wijzigen", + "Auth.form.button.forgot-password.success": "Opnieuw versturen", "Auth.form.button.login": "Inloggen", "Auth.form.button.register": "Klaar om te beginnen", + "Auth.form.button.register-success": "Opnieuw versturen", + "Auth.form.button.reset-password": "Wachtwoord wijzigen", + "Auth.form.error.code.provide": "Incorrecte code ingevoerd.", + "Auth.form.error.email.invalid": "Dit e-mailadres is onjuist", + "Auth.form.error.email.provide": "Voer a.u.b. je gebruikersnaam of je e-mail in.", + "Auth.form.error.email.taken": "E-mailadres is al in gebruik", + "Auth.form.error.invalid": "Gebruikersnaam of wachtwoord onjuist.", "Auth.form.error.noAdminAccess": "Je hebt geen toegang tot het administrator paneel", - + "Auth.form.error.params.provide": "Incorrecte parameters ingevoerd.", + "Auth.form.error.password.format": "Het wachtwoord mag niet het `$` symbool meer dan drie keer bevatten.", + "Auth.form.error.password.local": "Deze gebruiker heeft nooit een lokaal wachtwoord ingesteld, gebruik de leverancier welke gebruikt is tijdens het maken van het account om in te loggen/", + "Auth.form.error.password.matching": "Wachtwoorden komen niet overeen.", + "Auth.form.error.password.provide": "Voer a.u.b je wachtwoord in.", + "Auth.form.error.user.not-exist": "Dit e-mailadres bestaat niet.", + "Auth.form.error.username.taken": "Gebruikersnaam is al in gebruik", "Auth.form.forgot-password.email.label": "Voer je e-mail in", "Auth.form.forgot-password.email.label.success": "E-mail succesvol verstuurt naar", "Auth.form.forgot-password.email.placeholder": "mijnsuperemail@gmail.com", - - "Auth.header.register.description": "Om de set-up af te maken en je app te beveiligen, maak a.u.b. een eerste gebruiker (root admin) door alle velden hier beneden in te vullen.", - "Auth.form.header.login": "strapi", "Auth.form.header.forgot-password": "strapi", + "Auth.form.header.login": "strapi", "Auth.form.header.register": "Welkom!", "Auth.form.header.register-success": "strapi", - "Auth.form.login.password.label": "Wachtwoord", "Auth.form.login.rememberMe.label": "Onthoudt mij", "Auth.form.login.username.label": "Gebruikersnaam", "Auth.form.login.username.placeholder": "John Doe", - - "Auth.form.register.email.label": "E-mail", - "Auth.form.register.email.placeholder": "johndoe@gmail.com", - "Auth.form.register.username.label": "Gebruikersnaam", - "Auth.form.register.username.placeholder": "John Doe", - "Auth.form.register.password.label": "Wachtwoord", - "Auth.form.register.confirmPassword.label": "Wachtwoord Bevestigen", - "Auth.form.register.news.label": "Houd mij op de hoogte van nieuwe functies en nog komende verbeteringen.", - "Auth.form.register-success.email.label": "E-mail met succes verzonden aan", "Auth.form.register-success.email.placeholder": "mijnsuperemail@gmail.com", - - "Auth.form.error.email.provide": "Voer a.u.b. je gebruikersnaam of je e-mail in.", - "Auth.form.error.email.invalid": "Dit e-mailadres is onjuist", - "Auth.form.error.password.provide": "Voer a.u.b je wachtwoord in.", - "Auth.form.error.invalid": "Gebruikersnaam of wachtwoord onjuist.", - "Auth.form.error.password.local": "Deze gebruiker heeft nooit een lokaal wachtwoord ingesteld, gebruik de leverancier welke gebruikt is tijdens het maken van het account om in te loggen/", - "Auth.form.error.password.format": "Het wachtwoord mag niet het `$` symbool meer dan drie keer bevatten.", - "Auth.form.error.user.not-exist": "Dit e-mailadres bestaat niet.", - "Auth.form.error.code.provide": "Incorrecte code ingevoerd.", - "Auth.form.error.password.matching": "Wachtwoorden komen niet overeen.", - "Auth.form.error.params.provide": "Incorrecte parameters ingevoerd.", - "Auth.form.error.username.taken": "Gebruikersnaam is al in gebruik", - "Auth.form.error.email.taken": "E-mailadres is al in gebruik", - + "Auth.form.register.confirmPassword.label": "Wachtwoord Bevestigen", + "Auth.form.register.email.label": "E-mail", + "Auth.form.register.email.placeholder": "johndoe@gmail.com", + "Auth.form.register.news.label": "Houd mij op de hoogte van nieuwe functies en nog komende verbeteringen.", + "Auth.form.register.password.label": "Wachtwoord", + "Auth.form.register.username.label": "Gebruikersnaam", + "Auth.form.register.username.placeholder": "John Doe", + "Auth.header.register.description": "Om de set-up af te maken en je app te beveiligen, maak a.u.b. een eerste gebruiker (root admin) door alle velden hier beneden in te vullen.", "Auth.link.forgot-password": "Wachtwoord vergeten?", "Auth.link.ready": "Klaar om in te loggen?", - "BoundRoute.title": "Gebonden route naar", - - "components.Input.error.password.noMatch": "Wachtwoorden komen niet overeen", - "Controller.input.label": "{label} ", "Controller.selectAll": "Alles selecteren", - - "EditForm.inputSelect.label.role": "Standaard rol voor geautoriseerde gebruikers", "EditForm.inputSelect.description.role": "Het zal de nieuwe geautoriseerde gebruiker aan de geselecteerde rol verbinden.", - "EditForm.inputSelect.subscriptions.label": "Beheer abonnementen quotas", - "EditForm.inputSelect.subscriptions.description": "Stel een limiet in voor het aantal abonnementen per IP per uur", - "EditForm.inputSelect.durations.label": "Tijdsduur", "EditForm.inputSelect.durations.description": "Aantal uur welke de gebruiker niet kan abonneren.", - - "EditForm.inputToggle.label.email": "Één account per e-mailadres.", - "EditForm.inputToggle.label.sign-up": "Registratie inschakelen", + "EditForm.inputSelect.durations.label": "Tijdsduur", + "EditForm.inputSelect.label.role": "Standaard rol voor geautoriseerde gebruikers", + "EditForm.inputSelect.subscriptions.description": "Stel een limiet in voor het aantal abonnementen per IP per uur", + "EditForm.inputSelect.subscriptions.label": "Beheer abonnementen quotas", "EditForm.inputToggle.description.email": "Zorg ervoor dat de gebruiker niet meerdere accounts kan maken met hetzelfde e-mailadres maar met verschillende leveranciers.", "EditForm.inputToggle.description.sign-up": "Wanneer uitgeschakeld (OFF), is registratie verboden. Niemand kan abonneren ongeacht de leverancier", - + "EditForm.inputToggle.label.email": "Één account per e-mailadres.", + "EditForm.inputToggle.label.sign-up": "Registratie inschakelen", "EditPage.cancel": "Annuleren", - "EditPage.submit": "Opslaan", "EditPage.form.roles": "Rol details", "EditPage.form.roles.label.description": "Beschrijving", "EditPage.form.roles.label.name": "Naam", "EditPage.form.roles.label.users": "Gebruikers geassocieerd met deze rol ({number})", "EditPage.form.roles.name.error": "Deze waarde is verplicht.", - "EditPage.header.title": "{name} ", - "EditPage.header.title.create": "Nieuwe rol aanmaken", "EditPage.header.description": "{description} ", "EditPage.header.description.create": " ", - + "EditPage.header.title": "{name} ", + "EditPage.header.title.create": "Nieuwe rol aanmaken", "EditPage.notification.permissions.error": "Er is een fout opgetreden tijdens het ophalen van de permissies", "EditPage.notification.policies.error": "Er is een fout opgetreden tijdens het ophalen van het beleid", "EditPage.notification.role.error": "Er is een fout opgetreden tijdens het ophalen van de rol", - + "EditPage.submit": "Opslaan", + "Email.template.reset_password": "Wachtwoord herstellen", + "Email.template.success_register": "Registratie gelukt", + "Email.template.validation_email": "E-mailadres validatie", "HeaderNav.link.advancedSettings": "Geavanceerde instellingen", "HeaderNav.link.emailTemplates": "E-mail sjabloon", "HeaderNav.link.providers": "Leveranciers", "HeaderNav.link.roles": "Rollen & Permissies", - - "HomePage.header.title": "Rollen & Permissies", "HomePage.header.description": "Geef de rollen en permissies aan voor je gebruikers.", - + "HomePage.header.title": "Rollen & Permissies", "InputSearch.placeholder": "Zoek naar een gebruiker", - - "List.button.roles": "Nieuwe rol toevoegen", "List.button.providers": "Nieuwe leverancier toevoegen", - - "List.title.emailTemplates.singular": "{number} e-mail sjabloon beschikbaar", + "List.button.roles": "Nieuwe rol toevoegen", "List.title.emailTemplates.plural": "{number} e-mail sjablonen beschikbaar", - - "List.title.providers.disabled.singular": "{number} is uitgeschakeld", + "List.title.emailTemplates.singular": "{number} e-mail sjabloon beschikbaar", "List.title.providers.disabled.plural": "{number} zijn uitgeschakeld", - "List.title.providers.enabled.singular": "{number} leverancier is ingeschakeld en", + "List.title.providers.disabled.singular": "{number} is uitgeschakeld", "List.title.providers.enabled.plural": "{number} leveranciers zijn ingeschakeld en", - - "List.title.roles.singular": "{number} rol is beschikbaar", + "List.title.providers.enabled.singular": "{number} leverancier is ingeschakeld en", "List.title.roles.plural": "{number} rollen zijn beschikbaar", - - "notification.error.delete": "Er is een fout opgetreden tijdens het verwijderen van dit item", - "notification.error.fetch": "Er is een fout opgetreden tijdens het ophalen van de data", - "notification.error.fetchUser": "Er is een fout opgetreden tijdens het ophalen van de gebruikers", - "notification.info.emailSent": "De e-mail is verstuurd", - "notification.success.delete": "Het item is verwijderd", - "notification.success.submit": "Instellingen zijn geüpdatet", - - "plugin.description.short": "Beveilig je API met een volledig authenticatie proces op JWT", - "plugin.description.long": "Beveilig je API met een volledig authenticatie proces op JWT. Deze extensie komt ook met een ACL strategie welke ervoor zorgt dat je de permissies tussen groepen van gebruikers kan beheren.", - + "List.title.roles.singular": "{number} rol is beschikbaar", "Plugin.permissions.application.description": "Voer alle toegestane acties van je project in.", "Plugin.permissions.plugins.description": "Voer alle toegestane acties in voor extensie {name}.", - - "Plugins.header.title": "Permissies", "Plugins.header.description": "Alleen acties gekoppeld aan een route worden hieronder weergegeven.", - + "Plugins.header.title": "Permissies", "Policies.InputSelect.empty": "Geen", "Policies.InputSelect.label": "Deze actie toestaan voor:", "Policies.header.hint": "Selecteer de actie van de applicatie of de acties van de extensie en klik op het tandwiel icoontje om de gekoppelde route weer te geven", "Policies.header.title": "Geavanceerde instellingen", - - "Email.template.validation_email": "E-mailadres validatie", - "Email.template.reset_password": "Wachtwoord herstellen", - "Email.template.success_register": "Registratie gelukt", - - "Auth.advanced.allow_register": "", - + "PopUpForm.Email.email_templates.inputDescription": "Als je niet zeker weet hoe je variabelen moet gebruiken, {link}", + "PopUpForm.Email.link.documentation": "bekijk onze documentatie.", + "PopUpForm.Email.options.from.email.label": "Afzender e-mail", + "PopUpForm.Email.options.from.email.placeholder": "johndoe@gmail.com", + "PopUpForm.Email.options.from.name.label": "Afzender naam", + "PopUpForm.Email.options.from.name.placeholder": "John Doe", + "PopUpForm.Email.options.message.label": "Bericht", + "PopUpForm.Email.options.object.label": "Onderwerp", + "PopUpForm.Email.options.response_email.label": "Antwoord e-mail", + "PopUpForm.Email.options.response_email.placeholder": "johndoe@gmail.com", + "PopUpForm.Email.reset_password.options.message.placeholder": "

Klik op deze link om je account te valideren

", + "PopUpForm.Email.reset_password.options.object.placeholder": "Bevestig a.u.b. het e-mailadres voor %APP_NAME%", + "PopUpForm.Email.success_register.options.message.placeholder": "

Klik op deze link om je account te valideren

", + "PopUpForm.Email.success_register.options.object.placeholder": "Bevestig a.u.b. het e-mailadres voor %APP_NAME%", + "PopUpForm.Email.validation_email.options.message.placeholder": "

Klik op deze link om je account te valideren

", + "PopUpForm.Email.validation_email.options.object.placeholder": "Bevestig a.u.b. het e-mailadres voor %APP_NAME%", + "PopUpForm.Providers.callback.placeholder": "TEXT", + "PopUpForm.Providers.enabled.description": "Als deze uitgeschakeld is kunnen gebruikers geen gebruik maken van deze leverancier.", + "PopUpForm.Providers.enabled.label": "Inschakelen", + "PopUpForm.Providers.facebook.providerConfig.redirectURL": "De doorstuur URL om in je Facebook applicatie configuratie te zetten", + "PopUpForm.Providers.github.providerConfig.redirectURL": "De doorstuur URL om in je GitHub applicatie configuratie te zetten", + "PopUpForm.Providers.google.providerConfig.redirectURL": "De doorstuur URL om in je Google applicatie configuratie te zetten", + "PopUpForm.Providers.key.label": "Client ID", + "PopUpForm.Providers.key.placeholder": "TEXT", + "PopUpForm.Providers.linkedin2.providerConfig.redirectURL": "De doorstuur URL om in je LinkedIn applicatie configuratie te zetten", + "PopUpForm.Providers.redirectURL.front-end.label": "De doorstuur URL voor jouw front-end app", + "PopUpForm.Providers.secret.label": "Client Secret", + "PopUpForm.Providers.secret.placeholder": "TEXT", + "PopUpForm.Providers.twitter.providerConfig.redirectURL": "De doorstuur URL om in je Twitter applicatie configuratie te zetten", "PopUpForm.button.cancel": "Annuleren", "PopUpForm.button.save": "Opslaan", "PopUpForm.header.add.providers": "Nieuwe leverancier toevoegen", "PopUpForm.header.edit.email-templates": "E-mail sjablonen aanpassen", "PopUpForm.header.edit.providers": "Leverancier {provider} aanpassen", "PopUpForm.inputSelect.providers.label": "Kies een leverancier", - "PopUpForm.Email.options.from.name.label": "Afzender naam", - "PopUpForm.Email.options.from.email.label": "Afzender e-mail", - "PopUpForm.Email.options.response_email.label": "Antwoord e-mail", - "PopUpForm.Email.options.object.label": "Onderwerp", - "PopUpForm.Email.options.message.label": "Bericht", - "PopUpForm.Email.validation_email.options.object.placeholder": "Bevestig a.u.b. het e-mailadres voor %APP_NAME%", - "PopUpForm.Email.reset_password.options.object.placeholder": "Bevestig a.u.b. het e-mailadres voor %APP_NAME%", - "PopUpForm.Email.success_register.options.object.placeholder": "Bevestig a.u.b. het e-mailadres voor %APP_NAME%", - "PopUpForm.Email.validation_email.options.message.placeholder": "

Klik op deze link om je account te valideren

", - "PopUpForm.Email.reset_password.options.message.placeholder": "

Klik op deze link om je account te valideren

", - "PopUpForm.Email.success_register.options.message.placeholder": "

Klik op deze link om je account te valideren

", - "PopUpForm.Email.options.from.email.placeholder": "johndoe@gmail.com", - "PopUpForm.Email.options.response_email.placeholder": "johndoe@gmail.com", - "PopUpForm.Email.options.from.name.placeholder": "John Doe", - "PopUpForm.Providers.enabled.label": "Inschakelen", - "PopUpForm.Providers.enabled.description": "Als deze uitgeschakeld is kunnen gebruikers geen gebruik maken van deze leverancier.", - "PopUpForm.Providers.key.label": "Client ID", - "PopUpForm.Providers.key.placeholder": "TEXT", - "PopUpForm.Providers.secret.label": "Client Secret", - "PopUpForm.Providers.secret.placeholder": "TEXT", - "PopUpForm.Providers.redirectURL.front-end.label": "De doorstuur URL voor jouw front-end app", - - "PopUpForm.Providers.facebook.providerConfig.redirectURL": "De doorstuur URL om in je Facebook applicatie configuratie te zetten", - "PopUpForm.Providers.google.providerConfig.redirectURL": "De doorstuur URL om in je Google applicatie configuratie te zetten", - "PopUpForm.Providers.github.providerConfig.redirectURL": "De doorstuur URL om in je GitHub applicatie configuratie te zetten", - "PopUpForm.Providers.linkedin2.providerConfig.redirectURL": "De doorstuur URL om in je LinkedIn applicatie configuratie te zetten", - "PopUpForm.Providers.twitter.providerConfig.redirectURL": "De doorstuur URL om in je Twitter applicatie configuratie te zetten", - - "PopUpForm.Providers.callback.placeholder": "TEXT", - "PopUpForm.Email.email_templates.inputDescription": "Als je niet zeker weet hoe je variabelen moet gebruiken, {link}", - "PopUpForm.Email.link.documentation": "bekijk onze documentatie." -} + "components.Input.error.password.noMatch": "Wachtwoorden komen niet overeen", + "notification.error.delete": "Er is een fout opgetreden tijdens het verwijderen van dit item", + "notification.error.fetch": "Er is een fout opgetreden tijdens het ophalen van de data", + "notification.error.fetchUser": "Er is een fout opgetreden tijdens het ophalen van de gebruikers", + "notification.info.emailSent": "De e-mail is verstuurd", + "notification.success.delete": "Het item is verwijderd", + "notification.success.submit": "Instellingen zijn geüpdatet", + "plugin.description.long": "Beveilig je API met een volledig authenticatie proces op JWT. Deze extensie komt ook met een ACL strategie welke ervoor zorgt dat je de permissies tussen groepen van gebruikers kan beheren.", + "plugin.description.short": "Beveilig je API met een volledig authenticatie proces op JWT" +} \ No newline at end of file diff --git a/packages/strapi-plugin-users-permissions/admin/src/translations/pl.json b/packages/strapi-plugin-users-permissions/admin/src/translations/pl.json index 23fcc7a6e2..e837a67d27 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/translations/pl.json +++ b/packages/strapi-plugin-users-permissions/admin/src/translations/pl.json @@ -1,175 +1,142 @@ { - "Auth.form.button.register-success": "Wyślij ponownie", - "Auth.form.button.forgot-password.success": "Wyślij ponownie", + "Auth.advanced.allow_register": "", "Auth.form.button.forgot-password": "Wyślij e-mail", - "Auth.form.button.reset-password": "Zmień hasło", + "Auth.form.button.forgot-password.success": "Wyślij ponownie", "Auth.form.button.login": "Zaloguj się", "Auth.form.button.register": "Rejestracja", + "Auth.form.button.register-success": "Wyślij ponownie", + "Auth.form.button.reset-password": "Zmień hasło", + "Auth.form.error.code.provide": "Dostarczono niepoprawny kod.", + "Auth.form.error.email.invalid": "Ten e-mail jest nieprawidłowy.", + "Auth.form.error.email.provide": "Podaj swoją nazwę użytkownika lub adres email.", + "Auth.form.error.email.taken": "Adres email jest już zajęty", + "Auth.form.error.invalid": "Niepoprawny identyfikator lub hasło.", "Auth.form.error.noAdminAccess": "Nie masz dostępu do panelu administracyjnego.", - + "Auth.form.error.params.provide": "Dostarczono niepoprawne parametry.", + "Auth.form.error.password.format": "Twoje hasło nie może zawierać więcej niż trzykrotności symbolu `$`.", + "Auth.form.error.password.local": "Ten użytkownik nigdy nie ustawił lokalnego hasła, zaloguj się dzięki dostawcy używanemu podczas tworzenia konta.", + "Auth.form.error.password.matching": "Hasła się nie zgadzają.", + "Auth.form.error.password.provide": "Podaj hasło.", + "Auth.form.error.user.not-exist": "Ten email nie istnieje.", + "Auth.form.error.username.taken": "Nazwa użytkownika jest już zajęta", "Auth.form.forgot-password.email.label": "Email", "Auth.form.forgot-password.email.label.success": "E-mail wysłany z powodzeniem do", "Auth.form.forgot-password.email.placeholder": "jannowak@gmail.com", - - "Auth.header.register.description": "Aby zakończyć konfigurację i zabezpieczyć swoją aplikację, utwórz pierwszego użytkownika (administratora root), wypełniając poniższe informacje.", - "Auth.form.header.login": "strapi", "Auth.form.header.forgot-password": "strapi", + "Auth.form.header.login": "strapi", "Auth.form.header.register": "Witaj!", "Auth.form.header.register-success": "strapi", - "Auth.form.login.password.label": "Hasło", "Auth.form.login.rememberMe.label": "Zapamiętaj", "Auth.form.login.username.label": "Użytkownik", "Auth.form.login.username.placeholder": "Jan Nowak", - - "Auth.form.register.email.label": "Email", - "Auth.form.register.email.placeholder": "jannowak@gmail.com", - "Auth.form.register.username.label": "Użytkownik", - "Auth.form.register.username.placeholder": "Jan Nowak", - "Auth.form.register.password.label": "Hasło", - "Auth.form.register.confirmPassword.label": "Potwierdzenie hasła", - "Auth.form.register-success.email.label": "E-mail wysłany z powodzeniem do", "Auth.form.register-success.email.placeholder": "jannowak@gmail.com", - - "Auth.form.error.email.provide": "Podaj swoją nazwę użytkownika lub adres email.", - "Auth.form.error.email.invalid": "Ten e-mail jest nieprawidłowy.", - "Auth.form.error.password.provide": "Podaj hasło.", - "Auth.form.error.invalid": "Niepoprawny identyfikator lub hasło.", - "Auth.form.error.password.local": "Ten użytkownik nigdy nie ustawił lokalnego hasła, zaloguj się dzięki dostawcy używanemu podczas tworzenia konta.", - "Auth.form.error.password.format": "Twoje hasło nie może zawierać więcej niż trzykrotności symbolu `$`.", - "Auth.form.error.user.not-exist": "Ten email nie istnieje.", - "Auth.form.error.code.provide": "Dostarczono niepoprawny kod.", - "Auth.form.error.password.matching": "Hasła się nie zgadzają.", - "Auth.form.error.params.provide": "Dostarczono niepoprawne parametry.", - "Auth.form.error.username.taken": "Nazwa użytkownika jest już zajęta", - "Auth.form.error.email.taken": "Adres email jest już zajęty", - + "Auth.form.register.confirmPassword.label": "Potwierdzenie hasła", + "Auth.form.register.email.label": "Email", + "Auth.form.register.email.placeholder": "jannowak@gmail.com", + "Auth.form.register.password.label": "Hasło", + "Auth.form.register.username.label": "Użytkownik", + "Auth.form.register.username.placeholder": "Jan Nowak", + "Auth.header.register.description": "Aby zakończyć konfigurację i zabezpieczyć swoją aplikację, utwórz pierwszego użytkownika (administratora root), wypełniając poniższe informacje.", "Auth.link.forgot-password": "Nie pamiętasz hasła?", "Auth.link.ready": "Zaczynamy?", - "BoundRoute.title": "Wywoływanie", - - "components.Input.error.password.noMatch": "Hasło nie pasuje", - "Controller.input.label": "{label} ", "Controller.selectAll": "Zaznacz wszystko", - - "EditForm.inputSelect.label.role": "Domyślna rola dla uwierzytelnionych użytkowników", "EditForm.inputSelect.description.role": "Połączy nowego uwierzytelnionego użytkownika z wybraną rolą.", - "EditForm.inputSelect.subscriptions.label": "Rejestracje", - "EditForm.inputSelect.subscriptions.description": "Ogranicz liczbę rejestracji z tego samego IP na godzinę.", - "EditForm.inputSelect.durations.label": "Okres", "EditForm.inputSelect.durations.description": "Liczba godzin podczas których użytkownik nie może dołączyć.", - - "EditForm.inputToggle.label.email": "Jedno konto na adres email", - "EditForm.inputToggle.label.sign-up": "Rejestracja", + "EditForm.inputSelect.durations.label": "Okres", + "EditForm.inputSelect.label.role": "Domyślna rola dla uwierzytelnionych użytkowników", + "EditForm.inputSelect.subscriptions.description": "Ogranicz liczbę rejestracji z tego samego IP na godzinę.", + "EditForm.inputSelect.subscriptions.label": "Rejestracje", "EditForm.inputToggle.description.email": "Nie zezwalaj użytkownikowi na tworzenie wielu kont za pomocą tego samego adresu e-mail u różnych dostawców uwierzytelniania.", "EditForm.inputToggle.description.sign-up": "Po wyłączeniu (OFF) proces rejestracji jest zabroniony. Nikt nie może już dołączyć bez względu na używanego dostawcę.", - + "EditForm.inputToggle.label.email": "Jedno konto na adres email", + "EditForm.inputToggle.label.sign-up": "Rejestracja", "EditPage.cancel": "Anuluj", - "EditPage.submit": "Zapisz", "EditPage.form.roles": "Szczegóły", "EditPage.form.roles.label.description": "Opis", "EditPage.form.roles.label.name": "Nazwa", "EditPage.form.roles.label.users": "Użytkownicy powiązani z tą rolą ({number})", "EditPage.form.roles.name.error": "Wpisanie wartości dla tego atrybutu jest wymagane.", - "EditPage.header.title": "{name} ", - "EditPage.header.title.create": "Rola", "EditPage.header.description": "{description} ", "EditPage.header.description.create": " ", - + "EditPage.header.title": "{name} ", + "EditPage.header.title.create": "Rola", "EditPage.notification.permissions.error": "Wystąpił błąd podczas pobierania uprawnień", "EditPage.notification.policies.error": "Wystąpił błąd podczas pobierania polityk", "EditPage.notification.role.error": "Wystąpił błąd podczas pobierania ról", - + "EditPage.submit": "Zapisz", + "Email.template.reset_password": "Reset hasła", + "Email.template.success_register": "Pomyślna rejestracja", + "Email.template.validation_email": "Sprawdzanie adresu e-mail", "HeaderNav.link.advancedSettings": "Zaawansowane", "HeaderNav.link.emailTemplates": "Szablony e-mail", "HeaderNav.link.providers": "Dostawcy", "HeaderNav.link.roles": "Role", - - "HomePage.header.title": "Użytkownicy & Uprawnienia", "HomePage.header.description": "Określ role i uprawnienia dla każdego z użytkowników.", - + "HomePage.header.title": "Użytkownicy & Uprawnienia", "InputSearch.placeholder": "Wyszukaj", - - "List.button.roles": "Rola", "List.button.providers": "Dostawca", - - "List.title.emailTemplates.singular": "{number} szablon e-mail jest dostępny", + "List.button.roles": "Rola", "List.title.emailTemplates.plural": "{number} szablonów e-mail jest dostępnych", - - "List.title.providers.disabled.singular": "{number} jest wyłączony", + "List.title.emailTemplates.singular": "{number} szablon e-mail jest dostępny", "List.title.providers.disabled.plural": "{number} jest wyłączonych", - "List.title.providers.enabled.singular": "{number} dostawca jest włączony i", + "List.title.providers.disabled.singular": "{number} jest wyłączony", "List.title.providers.enabled.plural": "{number} dostawców jest włączonych i", - - "List.title.roles.singular": "{number} rola jest dostępna", + "List.title.providers.enabled.singular": "{number} dostawca jest włączony i", "List.title.roles.plural": "{number} ról jest dostępnych", - - "notification.error.delete": "Wystąpił błąd podczas usuwania pozycji", - "notification.error.fetch": "Wystąpił błąd podczas pobierania danych", - "notification.error.fetchUser": "Wystąpił błąd podczas pobierania użytkowników", - "notification.info.emailSent": "E-mail został wysłany", - "notification.success.delete": "Pozycja została usunięta", - - "plugin.description.short": "Chroń API za pomocą procesu pełnego uwierzytelniania opartego na JWT", - "plugin.description.long": "Chroń API za pomocą procesu pełnego uwierzytelniania opartego na JWT. Ta wtyczka zawiera również strategię ACL, która pozwala zarządzać uprawnieniami między grupami użytkowników.", - + "List.title.roles.singular": "{number} rola jest dostępna", "Plugin.permissions.application.description": "Określ dozwolone działania w projekcie.", "Plugin.permissions.plugins.description": "Określ dozwolone działania w wtyczce {name}.", - - "Plugins.header.title": "Uprawnienia", "Plugins.header.description": "Jedynie akcje związane z wywoływaniami wymienionymi poniżej.", - + "Plugins.header.title": "Uprawnienia", "Policies.InputSelect.empty": "Nikogo", "Policies.InputSelect.label": "Zezwól na wykonanie tej akcji dla:", "Policies.header.hint": "Wybierz działania aplikacji lub działania wtyczki i kliknij ikonę koła zębatego, aby wyświetlić wywoływania", "Policies.header.title": "Zaawansowane", - - "Email.template.validation_email": "Sprawdzanie adresu e-mail", - "Email.template.reset_password": "Reset hasła", - "Email.template.success_register": "Pomyślna rejestracja", - - "Auth.advanced.allow_register": "", - + "PopUpForm.Email.email_templates.inputDescription": "Nie wiesz jak skonfigurować zmienne? {link}", + "PopUpForm.Email.link.documentation": "Zajrzyj do dokumentacji.", + "PopUpForm.Email.options.from.email.label": "Email nadawcy", + "PopUpForm.Email.options.from.email.placeholder": "jannowak@gmail.com", + "PopUpForm.Email.options.from.name.label": "Nazwa nadawcy", + "PopUpForm.Email.options.from.name.placeholder": "Jan Nowak", + "PopUpForm.Email.options.message.label": "Wiadomość", + "PopUpForm.Email.options.object.label": "Temat", + "PopUpForm.Email.options.response_email.label": "Email zwrotny", + "PopUpForm.Email.options.response_email.placeholder": "jannowak@gmail.com", + "PopUpForm.Email.reset_password.options.message.placeholder": "

Kliknij ten link, aby potwierdzić swoje konto

", + "PopUpForm.Email.reset_password.options.object.placeholder": "Potwierdź swój adres e-mail dla %APP_NAME%", + "PopUpForm.Email.success_register.options.message.placeholder": "

Kliknij ten link, aby potwierdzić swoje konto

", + "PopUpForm.Email.success_register.options.object.placeholder": "Potwierdź swój adres e-mail dla %APP_NAME%", + "PopUpForm.Email.validation_email.options.message.placeholder": "

Kliknij ten link, aby potwierdzić swoje konto

", + "PopUpForm.Email.validation_email.options.object.placeholder": "Potwierdź swój adres email dla %APP_NAME%", + "PopUpForm.Providers.callback.placeholder": "TEKST", + "PopUpForm.Providers.enabled.description": "W przypadku wyłączenia, użytkownicy nie będą mogli skorzystać z tego dostawcy.", + "PopUpForm.Providers.enabled.label": "Włączony", + "PopUpForm.Providers.facebook.providerConfig.redirectURL": "Adres przekierowania do dodania w aplikacji Facebook", + "PopUpForm.Providers.github.providerConfig.redirectURL": "Adres przekierowania do dodania w aplikacji GitHub", + "PopUpForm.Providers.google.providerConfig.redirectURL": "Adres przekierowania do dodania w aplikacji Google", + "PopUpForm.Providers.key.label": "ID klienta", + "PopUpForm.Providers.key.placeholder": "TEKST", + "PopUpForm.Providers.linkedin2.providerConfig.redirectURL": "Adres przekierowania do dodania w aplikacji Linkedin", + "PopUpForm.Providers.redirectURL.front-end.label": "Adres przekierowania do własnej aplikacji", + "PopUpForm.Providers.secret.label": "Klucz sekretny klienta", + "PopUpForm.Providers.secret.placeholder": "TEKST", + "PopUpForm.Providers.twitter.providerConfig.redirectURL": "Adres przekierowania do dodania w aplikacji Twitter", "PopUpForm.button.cancel": "Anuluj", "PopUpForm.button.save": "Zapisz", "PopUpForm.header.add.providers": "Dostawca", "PopUpForm.header.edit.email-templates": "Zmień szablony e-mail", "PopUpForm.header.edit.providers": "Edytuj dostawcę {provider}", "PopUpForm.inputSelect.providers.label": "Dostawca", - "PopUpForm.Email.options.from.name.label": "Nazwa nadawcy", - "PopUpForm.Email.options.from.email.label": "Email nadawcy", - "PopUpForm.Email.options.response_email.label": "Email zwrotny", - "PopUpForm.Email.options.object.label": "Temat", - "PopUpForm.Email.options.message.label": "Wiadomość", - "PopUpForm.Email.validation_email.options.object.placeholder": "Potwierdź swój adres email dla %APP_NAME%", - "PopUpForm.Email.reset_password.options.object.placeholder": "Potwierdź swój adres e-mail dla %APP_NAME%", - "PopUpForm.Email.success_register.options.object.placeholder": "Potwierdź swój adres e-mail dla %APP_NAME%", - "PopUpForm.Email.validation_email.options.message.placeholder": "

Kliknij ten link, aby potwierdzić swoje konto

", - "PopUpForm.Email.reset_password.options.message.placeholder": "

Kliknij ten link, aby potwierdzić swoje konto

", - "PopUpForm.Email.success_register.options.message.placeholder": "

Kliknij ten link, aby potwierdzić swoje konto

", - "PopUpForm.Email.options.from.email.placeholder": "jannowak@gmail.com", - "PopUpForm.Email.options.response_email.placeholder": "jannowak@gmail.com", - "PopUpForm.Email.options.from.name.placeholder": "Jan Nowak", - "PopUpForm.Providers.enabled.label": "Włączony", - "PopUpForm.Providers.enabled.description": "W przypadku wyłączenia, użytkownicy nie będą mogli skorzystać z tego dostawcy.", - "PopUpForm.Providers.key.label": "ID klienta", - "PopUpForm.Providers.key.placeholder": "TEKST", - "PopUpForm.Providers.secret.label": "Klucz sekretny klienta", - "PopUpForm.Providers.secret.placeholder": "TEKST", - "PopUpForm.Providers.redirectURL.front-end.label": "Adres przekierowania do własnej aplikacji", - - - - "PopUpForm.Providers.facebook.providerConfig.redirectURL": "Adres przekierowania do dodania w aplikacji Facebook", - "PopUpForm.Providers.google.providerConfig.redirectURL": "Adres przekierowania do dodania w aplikacji Google", - "PopUpForm.Providers.github.providerConfig.redirectURL": "Adres przekierowania do dodania w aplikacji GitHub", - "PopUpForm.Providers.linkedin2.providerConfig.redirectURL": "Adres przekierowania do dodania w aplikacji Linkedin", - "PopUpForm.Providers.twitter.providerConfig.redirectURL": "Adres przekierowania do dodania w aplikacji Twitter", - - "PopUpForm.Providers.callback.placeholder": "TEKST", - "PopUpForm.Email.email_templates.inputDescription": "Nie wiesz jak skonfigurować zmienne? {link}", - "PopUpForm.Email.link.documentation": "Zajrzyj do dokumentacji." -} + "components.Input.error.password.noMatch": "Hasło nie pasuje", + "notification.error.delete": "Wystąpił błąd podczas usuwania pozycji", + "notification.error.fetch": "Wystąpił błąd podczas pobierania danych", + "notification.error.fetchUser": "Wystąpił błąd podczas pobierania użytkowników", + "notification.info.emailSent": "E-mail został wysłany", + "notification.success.delete": "Pozycja została usunięta", + "plugin.description.long": "Chroń API za pomocą procesu pełnego uwierzytelniania opartego na JWT. Ta wtyczka zawiera również strategię ACL, która pozwala zarządzać uprawnieniami między grupami użytkowników.", + "plugin.description.short": "Chroń API za pomocą procesu pełnego uwierzytelniania opartego na JWT" +} \ No newline at end of file diff --git a/packages/strapi-plugin-users-permissions/admin/src/translations/pt-BR.json b/packages/strapi-plugin-users-permissions/admin/src/translations/pt-BR.json index 5be972c780..21e06ae010 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/translations/pt-BR.json +++ b/packages/strapi-plugin-users-permissions/admin/src/translations/pt-BR.json @@ -1,175 +1,144 @@ { - "Auth.form.button.register-success": "Enviar novamente", - "Auth.form.button.forgot-password.success": "Enviar novamente", + "Auth.advanced.allow_register": "", "Auth.form.button.forgot-password": "Enviar e-mail", - "Auth.form.button.reset-password": "Alterar senha", + "Auth.form.button.forgot-password.success": "Enviar novamente", "Auth.form.button.login": "Entrar", "Auth.form.button.register": "Pronto para começar", + "Auth.form.button.register-success": "Enviar novamente", + "Auth.form.button.reset-password": "Alterar senha", + "Auth.form.error.code.provide": "Código incorreto fornecido.", + "Auth.form.error.email.invalid": "Este email é inválido.", + "Auth.form.error.email.provide": "Por favor, forneça seu nome de usuário ou seu e-mail.", + "Auth.form.error.email.taken": "O email já foi recebido", + "Auth.form.error.invalid": "Identificador ou senha inválida.", "Auth.form.error.noAdminAccess": "Você não pode acessar o painel de administração.", - + "Auth.form.error.params.provide": "Params incorretos fornecidos.", + "Auth.form.error.password.format": "Sua senha não pode conter o símbolo` $ `mais de três vezes.", + "Auth.form.error.password.local": "Este usuário nunca definiu uma senha local, por favor faça o login através do provedor usado durante a criação da conta.", + "Auth.form.error.password.matching": "As senhas não coincidem.", + "Auth.form.error.password.provide": "Por favor, forneça sua senha", + "Auth.form.error.user.not-exist": "Este e-mail não existe.", + "Auth.form.error.username.taken": "Nome de usuário já foi obtido", "Auth.form.forgot-password.email.label": "Digite seu email", "Auth.form.forgot-password.email.label.success": "E-mail enviado com sucesso para", "Auth.form.forgot-password.email.placeholder": "mysuperemail@gmail.com", - - "Auth.header.register.description": "Para concluir a configuração e proteger seu aplicativo, crie o primeiro usuário (administrador root), digitando as informações necessárias abaixo.", - "Auth.form.header.login": "strapi", "Auth.form.header.forgot-password": "strapi", + "Auth.form.header.login": "strapi", "Auth.form.header.register": "Bem-vindo!", "Auth.form.header.register-success": "strapi", - "Auth.form.login.password.label": "Senha", "Auth.form.login.rememberMe.label": "Lembre-se de mim", "Auth.form.login.username.label": "Nome de usuário", "Auth.form.login.username.placeholder": "John Doe", - - "Auth.form.register.email.label": "E-mail", - "Auth.form.register.email.placeholder": "johndoe@gmail.com", - "Auth.form.register.username.label": "Username", - "Auth.form.register.username.placeholder": "John Doe", - "Auth.form.register.password.label": "Senha", - "Auth.form.register.confirmPassword.label": "Senha de Confirmação", - "Auth.form.register.news.label": "Mantenha-me atualizado sobre os novos recursos e melhorias futuras", - "Auth.form.register-success.email.label": "E-mail enviado com sucesso para", "Auth.form.register-success.email.placeholder": "mysuperemail@gmail.com", - - "Auth.form.error.email.provide": "Por favor, forneça seu nome de usuário ou seu e-mail.", - "Auth.form.error.email.invalid": "Este email é inválido.", - "Auth.form.error.password.provide": "Por favor, forneça sua senha", - "Auth.form.error.invalid": "Identificador ou senha inválida.", - "Auth.form.error.password.local": "Este usuário nunca definiu uma senha local, por favor faça o login através do provedor usado durante a criação da conta.", - "Auth.form.error.password.format": "Sua senha não pode conter o símbolo` $ `mais de três vezes.", - "Auth.form.error.user.not-exist": "Este e-mail não existe.", - "Auth.form.error.code.provide": "Código incorreto fornecido.", - "Auth.form.error.password.matching": "As senhas não coincidem.", - "Auth.form.error.params.provide": "Params incorretos fornecidos.", - "Auth.form.error.username.taken": "Nome de usuário já foi obtido", - "Auth.form.error.email.taken": "O email já foi recebido", - + "Auth.form.register.confirmPassword.label": "Senha de Confirmação", + "Auth.form.register.email.label": "E-mail", + "Auth.form.register.email.placeholder": "johndoe@gmail.com", + "Auth.form.register.news.label": "Mantenha-me atualizado sobre os novos recursos e melhorias futuras", + "Auth.form.register.password.label": "Senha", + "Auth.form.register.username.label": "Username", + "Auth.form.register.username.placeholder": "John Doe", + "Auth.header.register.description": "Para concluir a configuração e proteger seu aplicativo, crie o primeiro usuário (administrador root), digitando as informações necessárias abaixo.", "Auth.link.forgot-password": "Esqueceu sua senha?", "Auth.link.ready": "Pronto para entrar?", - "BoundRoute.title": "Rota definida para", - - "components.Input.error.password.noMatch": "As senhas não conferem", - "Controller.input.label": "{label}", "Controller.selectAll": "Selecionar tudo", - - "EditForm.inputSelect.label.role": "Nível padrão para usuários autenticados", "EditForm.inputSelect.description.role": "Ele anexará o novo usuário autenticado ao nível selecionado.", - "EditForm.inputSelect.subscriptions.label": "Gerenciar cotas de assinatura", - "EditForm.inputSelect.subscriptions.description": "Limitar o número de assinaturas por IP por hora", - "EditForm.inputSelect.durations.label": "Duração", "EditForm.inputSelect.durations.description": "Número de horas durante as quais o usuário não pode se registrar.", - - "EditForm.inputToggle.label.email": "Limitar 1 conta por endereço de email", - "EditForm.inputToggle.label.sign-up": "Ativar registro de usuários", + "EditForm.inputSelect.durations.label": "Duração", + "EditForm.inputSelect.label.role": "Nível padrão para usuários autenticados", + "EditForm.inputSelect.subscriptions.description": "Limitar o número de assinaturas por IP por hora", + "EditForm.inputSelect.subscriptions.label": "Gerenciar cotas de assinatura", "EditForm.inputToggle.description.email": "Não permitir que o usuário crie várias contas usando o mesmo endereço de e-mail com diferentes provedores de autenticação.", "EditForm.inputToggle.description.sign-up": "Quando desativado (OFF), o processo de registro é proibido. Nenhum novo usuário poderá se registrar, não importa o provedor usado.", - + "EditForm.inputToggle.label.email": "Limitar 1 conta por endereço de email", + "EditForm.inputToggle.label.sign-up": "Ativar registro de usuários", "EditPage.cancel": "Cancelar", - "EditPage.submit": "Salvar", "EditPage.form.roles": "Detalhes do nível", "EditPage.form.roles.label.description": "Descrição", "EditPage.form.roles.label.name": "Nome", "EditPage.form.roles.label.users": "Usuários associados a este nível ({number})", "EditPage.form.roles.name.error": "Este valor é obrigatório.", - "EditPage.header.title": "{name}", - "EditPage.header.title.create": "Criar um novo nível", "EditPage.header.description": "{description}", "EditPage.header.description.create": "", - + "EditPage.header.title": "{name}", + "EditPage.header.title.create": "Criar um novo nível", "EditPage.notification.permissions.error": "Ocorreu um erro ao buscar permissões", "EditPage.notification.policies.error": "Ocorreu um erro ao buscar políticas", "EditPage.notification.role.error": "Ocorreu um erro ao buscar o nível", - + "EditPage.submit": "Salvar", + "Email.template.reset_password": "Redefinir senha", + "Email.template.success_register": "Registo bem sucedido", + "Email.template.validation_email": "Validação de endereço de email", "HeaderNav.link.advancedSettings": "Configurações avançadas", "HeaderNav.link.emailTemplates": "Modelos de email", "HeaderNav.link.providers": "Provedores", "HeaderNav.link.roles": "Níveis & Permissões", - - "HomePage.header.title": "Níveis & Permissões", "HomePage.header.description": "Defina os níveis e permissões para seus usuários", - + "HomePage.header.title": "Níveis & Permissões", "InputSearch.placeholder": "Buscar usuário", - - "List.button.roles": "Adicionar novo nível", "List.button.providers": "Adicionar novo provedor", - - "List.title.emailTemplates.singular": "{number} modelo de e-mail está disponível", + "List.button.roles": "Adicionar novo nível", "List.title.emailTemplates.plural": "{number} modelos de e-mail estão disponíveis", - - "List.title.providers.disabled.singular": "{number} está desativado", + "List.title.emailTemplates.singular": "{number} modelo de e-mail está disponível", "List.title.providers.disabled.plural": "{number} estão desativados", - "List.title.providers.enabled.singular": "{number} provedor está ativado e", + "List.title.providers.disabled.singular": "{number} está desativado", "List.title.providers.enabled.plural": "os provedores {number} estão habilitados e", - - "List.title.roles.singular": "o nível {number} está disponível", + "List.title.providers.enabled.singular": "{number} provedor está ativado e", "List.title.roles.plural": "{number} níveis estão disponíveis", - - "notification.error.delete": "Ocorreu um erro ao tentar eliminar o registro", - "notification.error.fetch": "Ocorreu um erro ao tentar buscar dados", - "notification.error.fetchUser": "Ocorreu um erro ao tentar buscar usuários", - "notification.info.emailSent": "O email foi enviado", - "notification.success.delete": "O item foi excluído", - "notification.success.submit": "As configurações foram atualizadas", - - "plugin.description.short": "Proteja sua API com um processo de autenticação completo baseado no JWT", - "plugin.description.long": "Proteja sua API com um processo de autenticação completo baseado no JWT. Esse plugin também vem com uma estratégia de ACL que permite gerenciar as permissões entre os grupos de usuários.", - + "List.title.roles.singular": "o nível {number} está disponível", "Plugin.permissions.application.description": "Defina todas as ações permitidas do seu projeto.", "Plugin.permissions.plugins.description": "Defina todas as ações permitidas para o plugin {name}.", - - "Plugins.header.title": "Permissões", "Plugins.header.description": "Somente ações vinculadas por uma rota estão listadas abaixo.", - + "Plugins.header.title": "Permissões", "Policies.InputSelect.empty": "None", "Policies.InputSelect.label": "Permitir para executar esta ação para:", "Policies.header.hint": "Selecione as ações do aplicativo ou as ações do plugin e clique no ícone do cog para exibir a rota", "Policies.header.title": "Configurações avançadas", - - "Email.template.validation_email": "Validação de endereço de email", - "Email.template.reset_password": "Redefinir senha", - "Email.template.success_register": "Registo bem sucedido", - - "Auth.advanced.allow_register": "", - + "PopUpForm.Email.email_templates.inputDescription": "Se não tiver certeza de como usar variáveis, {link}", + "PopUpForm.Email.link.documentation": "confira nossa documentação", + "PopUpForm.Email.options.from.email.label": "Email do remetente", + "PopUpForm.Email.options.from.email.placeholder": "johndoe@gmail.com", + "PopUpForm.Email.options.from.name.label": "Nome do remetente", + "PopUpForm.Email.options.from.name.placeholder": "John Doe", + "PopUpForm.Email.options.message.label": "Mensagem", + "PopUpForm.Email.options.object.label": "Assunto", + "PopUpForm.Email.options.response_email.label": "Email de resposta", + "PopUpForm.Email.options.response_email.placeholder": "johndoe@gmail.com", + "PopUpForm.Email.reset_password.options.message.placeholder": "

Por favor, clique neste link para validar sua conta ", + "PopUpForm.Email.reset_password.options.object.placeholder": "Confirme seu endereço de e-mail para% APP_NAME%", + "PopUpForm.Email.success_register.options.message.placeholder": "

Por favor, clique neste link para validar sua conta ", + "PopUpForm.Email.success_register.options.object.placeholder": "Confirme seu endereço de e-mail para% APP_NAME%", + "PopUpForm.Email.validation_email.options.message.placeholder": "

Por favor, clique neste link para validar sua conta ", + "PopUpForm.Email.validation_email.options.object.placeholder": "Confirme seu endereço de e-mail para% APP_NAME%", + "PopUpForm.Providers.callback.placeholder": "TEXT", + "PopUpForm.Providers.enabled.description": "Se desativado, os usuários não poderão usar este provedor", + "PopUpForm.Providers.enabled.label": "Ativar", + "PopUpForm.Providers.facebook.providerConfig.redirectURL": "O URL de redirecionamento para adicionar em suas configurações de aplicativos do Facebook", + "PopUpForm.Providers.github.providerConfig.redirectURL": "O URL de redirecionamento para adicionar nas configurações do aplicativo GitHub", + "PopUpForm.Providers.google.providerConfig.redirectURL": "O URL de redirecionamento a adicionar nas suas configurações de aplicativo do Google", + "PopUpForm.Providers.key.label": "ID do cliente", + "PopUpForm.Providers.key.placeholder": "TEXT", + "PopUpForm.Providers.linkedin2.providerConfig.redirectURL": "O URL de redirecionamento a ser adicionado nas configurações do aplicativo Linkedin", + "PopUpForm.Providers.redirectURL.front-end.label": "O URL de redirecionamento para seu aplicativo front-end", + "PopUpForm.Providers.secret.label": "Segredo do Cliente", + "PopUpForm.Providers.secret.placeholder": "TEXT", + "PopUpForm.Providers.twitter.providerConfig.redirectURL": "O URL de redirecionamento a ser adicionado nas configurações do aplicativo do Twitter", "PopUpForm.button.cancel": "Cancelar", "PopUpForm.button.save": "Salvar", "PopUpForm.header.add.providers": "Adicionar novo provedor", "PopUpForm.header.edit.email-templates": "Editar modelos de email", "PopUpForm.header.edit.providers": "Editar provedor {provider}", "PopUpForm.inputSelect.providers.label": "Escolher o provedor", - "PopUpForm.Email.options.from.name.label": "Nome do remetente", - "PopUpForm.Email.options.from.email.label": "Email do remetente", - "PopUpForm.Email.options.response_email.label": "Email de resposta", - "PopUpForm.Email.options.object.label": "Assunto", - "PopUpForm.Email.options.message.label": "Mensagem", - "PopUpForm.Email.validation_email.options.object.placeholder": "Confirme seu endereço de e-mail para% APP_NAME%", - "PopUpForm.Email.reset_password.options.object.placeholder": "Confirme seu endereço de e-mail para% APP_NAME%", - "PopUpForm.Email.success_register.options.object.placeholder": "Confirme seu endereço de e-mail para% APP_NAME%", - "PopUpForm.Email.validation_email.options.message.placeholder": "

Por favor, clique neste link para validar sua conta ", - "PopUpForm.Email.reset_password.options.message.placeholder": "

Por favor, clique neste link para validar sua conta ", - "PopUpForm.Email.success_register.options.message.placeholder": "

Por favor, clique neste link para validar sua conta ", - "PopUpForm.Email.options.from.email.placeholder": "johndoe@gmail.com", - "PopUpForm.Email.options.response_email.placeholder": "johndoe@gmail.com", - "PopUpForm.Email.options.from.name.placeholder": "John Doe", - "PopUpForm.Providers.enabled.label": "Ativar", - "PopUpForm.Providers.enabled.description": "Se desativado, os usuários não poderão usar este provedor", - "PopUpForm.Providers.key.label": "ID do cliente", - "PopUpForm.Providers.key.placeholder": "TEXT", - "PopUpForm.Providers.secret.label": "Segredo do Cliente", - "PopUpForm.Providers.secret.placeholder": "TEXT", - "PopUpForm.Providers.redirectURL.front-end.label": "O URL de redirecionamento para seu aplicativo front-end", - - "PopUpForm.Providers.facebook.providerConfig.redirectURL": "O URL de redirecionamento para adicionar em suas configurações de aplicativos do Facebook", - "PopUpForm.Providers.google.providerConfig.redirectURL": "O URL de redirecionamento a adicionar nas suas configurações de aplicativo do Google", - "PopUpForm.Providers.github.providerConfig.redirectURL": "O URL de redirecionamento para adicionar nas configurações do aplicativo GitHub", - "PopUpForm.Providers.linkedin2.providerConfig.redirectURL": "O URL de redirecionamento a ser adicionado nas configurações do aplicativo Linkedin", - "PopUpForm.Providers.twitter.providerConfig.redirectURL": "O URL de redirecionamento a ser adicionado nas configurações do aplicativo do Twitter", - - "PopUpForm.Providers.callback.placeholder": "TEXT", - "PopUpForm.Email.email_templates.inputDescription": "Se não tiver certeza de como usar variáveis, {link}", - "PopUpForm.Email.link.documentation": "confira nossa documentação" + "components.Input.error.password.noMatch": "As senhas não conferem", + "notification.error.delete": "Ocorreu um erro ao tentar eliminar o registro", + "notification.error.fetch": "Ocorreu um erro ao tentar buscar dados", + "notification.error.fetchUser": "Ocorreu um erro ao tentar buscar usuários", + "notification.info.emailSent": "O email foi enviado", + "notification.success.delete": "O item foi excluído", + "notification.success.submit": "As configurações foram atualizadas", + "plugin.description.long": "Proteja sua API com um processo de autenticação completo baseado no JWT. Esse plugin também vem com uma estratégia de ACL que permite gerenciar as permissões entre os grupos de usuários.", + "plugin.description.short": "Proteja sua API com um processo de autenticação completo baseado no JWT" } \ No newline at end of file diff --git a/packages/strapi-plugin-users-permissions/admin/src/translations/ru.json b/packages/strapi-plugin-users-permissions/admin/src/translations/ru.json index cce1caab7d..fe50e6e10c 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/translations/ru.json +++ b/packages/strapi-plugin-users-permissions/admin/src/translations/ru.json @@ -1,177 +1,144 @@ { - "Auth.form.button.register-success": "Послать еще раз", - "Auth.form.button.forgot-password.success": "Послать еще раз", - "Auth.form.button.forgot-password": "Послать письмо", - "Auth.form.button.reset-password": "Сменить пароль", - "Auth.form.button.login": "Войти", - "Auth.form.button.register": "Готов начать", - "Auth.form.error.noAdminAccess": "Вы не можете получить доступ к панели администрирования.", - - "Auth.form.forgot-password.email.label": "Введите ваш почтовый адрес", - "Auth.form.forgot-password.email.label.success": "Письмо успешно отправлено", - "Auth.form.forgot-password.email.placeholder": "mysuperemail@gmail.com", - - "Auth.header.register.description": "Для завершения установки и обеспечения безопасности приложения, создайте вашего первого пользователя (root admin) заполнив необходимую информацию ниже.", - "Auth.form.header.login": "strapi", - "Auth.form.header.forgot-password": "strapi", - "Auth.form.header.register": "Добро пожаловать!", - "Auth.form.header.register-success": "strapi", - - "Auth.form.login.password.label": "Пароль", - "Auth.form.login.rememberMe.label": "Запомнить меня", - "Auth.form.login.username.label": "Имя пользователя", - "Auth.form.login.username.placeholder": "John Doe", - - "Auth.form.register.email.label": "Email", - "Auth.form.register.email.placeholder": "johndoe@gmail.com", - "Auth.form.register.username.label": "Имя пользователя", - "Auth.form.register.username.placeholder": "John Doe", - "Auth.form.register.password.label": "Пароль", - "Auth.form.register.confirmPassword.label": "Подтверждение пароля", - "Auth.form.register.news.label": "Держите меня в курсе по поводу новых возможностей и предстоящих улучшениях.", - - "Auth.form.register-success.email.label": "Письмо успешно отправлено по адресу", - "Auth.form.register-success.email.placeholder": "mysuperemail@gmail.com", - - "Auth.form.error.email.provide": "Укажите свое имя пользователя или адрес электронной почты.", - "Auth.form.error.email.invalid": "Неправильный адрес электронной почты.", - "Auth.form.error.password.provide": "Укажите свой пароль.", - "Auth.form.error.invalid": "Недопустимый идентификатор или пароль.", - "Auth.form.error.password.local": "Этот пользователь никогда не задавал пароль, пожалуйста, войдите в систему через провайдера, используемого при создании учетной записи.", - "Auth.form.error.password.format": "Пароль не может содержать символ `$` больше трех раз.", - "Auth.form.error.user.not-exist": "Этот почтовый адрес не существует.", - "Auth.form.error.code.provide": "Неверный код.", - "Auth.form.error.password.matching": "Пароль не соответствует.", - "Auth.form.error.params.provide": "Неправильные параметры.", - "Auth.form.error.username.taken": "Имя пользователя уже используется", - "Auth.form.error.email.taken": "Почтовый адрес уже используется", - - "Auth.link.forgot-password": "Забыли пароль?", - "Auth.link.ready": "Готовы войти?", - - "BoundRoute.title": "Связать путь с", - - "components.Input.error.password.noMatch": "Пароль не совпадает", - - "Controller.input.label": "{label} ", - "Controller.selectAll": "Выделить все", - - "EditForm.inputSelect.label.role": "Роль по умолчанию для аутентифицированных пользователей", - "EditForm.inputSelect.description.role": "Он присоединит нового аутентифицированного пользователя к выбранной роли.", - "EditForm.inputSelect.subscriptions.label": "Управление квотами на подписку", - "EditForm.inputSelect.subscriptions.description": "Ограничить количество подписчиков на каждый IP-адрес в час.", - "EditForm.inputSelect.durations.label": "Длительность", - "EditForm.inputSelect.durations.description": "Количество часов, в течение которых пользователь не может подписаться.", - - "EditForm.inputToggle.label.email": "Одна учетная запись на адрес электронной почты", - "EditForm.inputToggle.label.sign-up": "Включить регистрации", - "EditForm.inputToggle.description.email": "Запретить пользователю создавать несколько учетных записей, используя один и тот же адрес электронной почты с различными провайдерами аутентификации.", - "EditForm.inputToggle.description.sign-up": "Когда выключенно (OFF) процесс регистрации запрещен. Никто не может подписаться, независимо от провайдера.", - - "EditPage.cancel": "Отменить", - "EditPage.submit": "Сохранить", - "EditPage.form.roles": "Детали роли", - "EditPage.form.roles.label.description": "Описание", - "EditPage.form.roles.label.name": "Название", - "EditPage.form.roles.label.users": "Пользователи с этой ролью — ({number})", - "EditPage.form.roles.name.error": "Это значение обязательно.", - "EditPage.header.title": "{name} ", - "EditPage.header.title.create": "Создать новую роль", - "EditPage.header.description": "{description} ", - "EditPage.header.description.create": " ", - - "EditPage.notification.permissions.error": "Возникла ошибка при загрузке доступов", - "EditPage.notification.policies.error": "Возникла ошибка при загрузке политики пользователя", - "EditPage.notification.role.error": "Возникла ошибка при загрузке роли", - - "HeaderNav.link.advancedSettings": "Расширенные настройки", - "HeaderNav.link.emailTemplates": "Шаблоны писем", - "HeaderNav.link.providers": "Провайдеры", - "HeaderNav.link.roles": "Роли и доступы", - - "HomePage.header.title": "Роли и доступы", - "HomePage.header.description": "Задавай роли и доступы для ваших пользователей.", - - "InputSearch.placeholder": "Искать пользователя", - - "List.button.roles": "Добавить новую роль", - "List.button.providers": "Добавить нового провайдера", - - "List.title.emailTemplates.singular": "{number} шаблон доступен", - "List.title.emailTemplates.plural": "{number} – количество доступных шаблонов", - - "List.title.providers.disabled.singular": "{number} отключен", - "List.title.providers.disabled.plural": "{number} отключено", - "List.title.providers.enabled.singular": "{number} провайдер включен и", - "List.title.providers.enabled.plural": "{number} — количество провайдеров включено and", - - "List.title.roles.singular": "{number} роль доступна", - "List.title.roles.plural": "{number} - количество доступных ролей", - - "notification.error.delete": "Возникла ошибка в процессе удаления", - "notification.error.fetch": "Возникла ошибка при загрузке данных", - "notification.error.fetchUser": "Возникла ошибка при загрузке пользователей", - "notification.info.emailSent": "Письмо отправленно", - "notification.success.delete": "Успешно удалено", - "notification.success.submit": "Настройки обновлены", - - "plugin.description.short": "Защитите ваш API с процессом полной аутентификации основаном на JWT", - "plugin.description.long": "Защитите ваш API с процессом полной аутентификации основаном на JWT. Этот плагин также идет с ACL (Access Control List) возможностями, которые позволяет вам настраивать доступы для групп пользователей.", - - "Plugin.permissions.application.description": "Задайте действия доступные для вашего проекта.", - "Plugin.permissions.plugins.description": "Задайте все возможные действия для {name} плагина.", - - "Plugins.header.title": "Доступы", - "Plugins.header.description": "Только действия связанные с маршрутом показаны в списке.", - - "Policies.InputSelect.empty": "Нет", - "Policies.InputSelect.label": "Разрешить выполнение этого действия для:", - "Policies.header.hint": "Выберите действия приложения или действия плагина и щелкните значок шестеренки, чтобы отобразить связанный маршрут", - "Policies.header.title": "Расширенные настройки", - - "Email.template.validation_email": "Валидация почтового адреса", - "Email.template.reset_password": "Сброс пароля", - "Email.template.success_register": "Регистрация прошла успешно", - - "Auth.advanced.allow_register": "", - - "PopUpForm.button.cancel": "Отменить", - "PopUpForm.button.save": "Сохранить", - "PopUpForm.header.add.providers": "Добавить нового провайдера", - "PopUpForm.header.edit.email-templates": "Отредактировать шаблон письма", - "PopUpForm.header.edit.providers": "Отредактировать {provider} провайдера", - "PopUpForm.inputSelect.providers.label": "Выбрать провайдера", - "PopUpForm.Email.options.from.name.label": "Название доставщика", - "PopUpForm.Email.options.from.email.label": "Почтовый адрес доставщика", - "PopUpForm.Email.options.response_email.label": "Обратный почтовый адрес", - "PopUpForm.Email.options.object.label": "Тема", - "PopUpForm.Email.options.message.label": "Послание", - "PopUpForm.Email.validation_email.options.object.placeholder": "Пожалуйста подтвердите ваш почтовый адрес для %APP_NAME%", - "PopUpForm.Email.reset_password.options.object.placeholder": "Пожалуйста подтвердите ваш почтовый адрес для %APP_NAME%", - "PopUpForm.Email.success_register.options.object.placeholder": "Пожалуйста подтвердите ваш почтовый адрес для %APP_NAME%", - "PopUpForm.Email.validation_email.options.message.placeholder": "

Пажалуйста нажмите на ссылку чтобы подтвердить вашу учетную запись

", - "PopUpForm.Email.reset_password.options.message.placeholder": "

Пажалуйста нажмите на ссылку чтобы подтвердить вашу учетную запись

", - "PopUpForm.Email.success_register.options.message.placeholder": "

Пажалуйста нажмите на ссылку чтобы подтвердить вашу учетную запись

", - "PopUpForm.Email.options.from.email.placeholder": "johndoe@gmail.com", - "PopUpForm.Email.options.response_email.placeholder": "johndoe@gmail.com", - "PopUpForm.Email.options.from.name.placeholder": "John Doe", - "PopUpForm.Providers.enabled.label": "Включить", - "PopUpForm.Providers.enabled.description": "Если отключено, пользователь не сможет использовать этот провайдер.", - "PopUpForm.Providers.key.label": "Client ID", - "PopUpForm.Providers.key.placeholder": "TEXT", - "PopUpForm.Providers.secret.label": "Client Secret", - "PopUpForm.Providers.secret.placeholder": "TEXT", - "PopUpForm.Providers.redirectURL.front-end.label": "URL-адрес перенаправления для вашего приложения", - - - - "PopUpForm.Providers.facebook.providerConfig.redirectURL": "URL-адрес перенаправления, который необходимо добавить в настройки Facebook приложения", - "PopUpForm.Providers.google.providerConfig.redirectURL": "URL-адрес перенаправления, который необходимо добавить в настройки Google приложения", - "PopUpForm.Providers.github.providerConfig.redirectURL": "URL-адрес перенаправления, который необходимо добавить в настройки GitHub приложения", - "PopUpForm.Providers.linkedin2.providerConfig.redirectURL": "URL-адрес перенаправления, который необходимо добавить в настройки Linkedin приложения", - "PopUpForm.Providers.twitter.providerConfig.redirectURL": "URL-адрес перенаправления, который необходимо добавить в настройки Twitter приложения", - - "PopUpForm.Providers.callback.placeholder": "TEXT", - "PopUpForm.Email.email_templates.inputDescription": "Если вы не уверены как использовать переменные, {link}", - "PopUpForm.Email.link.documentation": "ознакомтесь с нашей документацией." - } \ No newline at end of file + "Auth.advanced.allow_register": "", + "Auth.form.button.forgot-password": "Послать письмо", + "Auth.form.button.forgot-password.success": "Послать еще раз", + "Auth.form.button.login": "Войти", + "Auth.form.button.register": "Готов начать", + "Auth.form.button.register-success": "Послать еще раз", + "Auth.form.button.reset-password": "Сменить пароль", + "Auth.form.error.code.provide": "Неверный код.", + "Auth.form.error.email.invalid": "Неправильный адрес электронной почты.", + "Auth.form.error.email.provide": "Укажите свое имя пользователя или адрес электронной почты.", + "Auth.form.error.email.taken": "Почтовый адрес уже используется", + "Auth.form.error.invalid": "Недопустимый идентификатор или пароль.", + "Auth.form.error.noAdminAccess": "Вы не можете получить доступ к панели администрирования.", + "Auth.form.error.params.provide": "Неправильные параметры.", + "Auth.form.error.password.format": "Пароль не может содержать символ `$` больше трех раз.", + "Auth.form.error.password.local": "Этот пользователь никогда не задавал пароль, пожалуйста, войдите в систему через провайдера, используемого при создании учетной записи.", + "Auth.form.error.password.matching": "Пароль не соответствует.", + "Auth.form.error.password.provide": "Укажите свой пароль.", + "Auth.form.error.user.not-exist": "Этот почтовый адрес не существует.", + "Auth.form.error.username.taken": "Имя пользователя уже используется", + "Auth.form.forgot-password.email.label": "Введите ваш почтовый адрес", + "Auth.form.forgot-password.email.label.success": "Письмо успешно отправлено", + "Auth.form.forgot-password.email.placeholder": "mysuperemail@gmail.com", + "Auth.form.header.forgot-password": "strapi", + "Auth.form.header.login": "strapi", + "Auth.form.header.register": "Добро пожаловать!", + "Auth.form.header.register-success": "strapi", + "Auth.form.login.password.label": "Пароль", + "Auth.form.login.rememberMe.label": "Запомнить меня", + "Auth.form.login.username.label": "Имя пользователя", + "Auth.form.login.username.placeholder": "John Doe", + "Auth.form.register-success.email.label": "Письмо успешно отправлено по адресу", + "Auth.form.register-success.email.placeholder": "mysuperemail@gmail.com", + "Auth.form.register.confirmPassword.label": "Подтверждение пароля", + "Auth.form.register.email.label": "Email", + "Auth.form.register.email.placeholder": "johndoe@gmail.com", + "Auth.form.register.news.label": "Держите меня в курсе по поводу новых возможностей и предстоящих улучшениях.", + "Auth.form.register.password.label": "Пароль", + "Auth.form.register.username.label": "Имя пользователя", + "Auth.form.register.username.placeholder": "John Doe", + "Auth.header.register.description": "Для завершения установки и обеспечения безопасности приложения, создайте вашего первого пользователя (root admin) заполнив необходимую информацию ниже.", + "Auth.link.forgot-password": "Забыли пароль?", + "Auth.link.ready": "Готовы войти?", + "BoundRoute.title": "Связать путь с", + "Controller.input.label": "{label} ", + "Controller.selectAll": "Выделить все", + "EditForm.inputSelect.description.role": "Он присоединит нового аутентифицированного пользователя к выбранной роли.", + "EditForm.inputSelect.durations.description": "Количество часов, в течение которых пользователь не может подписаться.", + "EditForm.inputSelect.durations.label": "Длительность", + "EditForm.inputSelect.label.role": "Роль по умолчанию для аутентифицированных пользователей", + "EditForm.inputSelect.subscriptions.description": "Ограничить количество подписчиков на каждый IP-адрес в час.", + "EditForm.inputSelect.subscriptions.label": "Управление квотами на подписку", + "EditForm.inputToggle.description.email": "Запретить пользователю создавать несколько учетных записей, используя один и тот же адрес электронной почты с различными провайдерами аутентификации.", + "EditForm.inputToggle.description.sign-up": "Когда выключенно (OFF) процесс регистрации запрещен. Никто не может подписаться, независимо от провайдера.", + "EditForm.inputToggle.label.email": "Одна учетная запись на адрес электронной почты", + "EditForm.inputToggle.label.sign-up": "Включить регистрации", + "EditPage.cancel": "Отменить", + "EditPage.form.roles": "Детали роли", + "EditPage.form.roles.label.description": "Описание", + "EditPage.form.roles.label.name": "Название", + "EditPage.form.roles.label.users": "Пользователи с этой ролью — ({number})", + "EditPage.form.roles.name.error": "Это значение обязательно.", + "EditPage.header.description": "{description} ", + "EditPage.header.description.create": " ", + "EditPage.header.title": "{name} ", + "EditPage.header.title.create": "Создать новую роль", + "EditPage.notification.permissions.error": "Возникла ошибка при загрузке доступов", + "EditPage.notification.policies.error": "Возникла ошибка при загрузке политики пользователя", + "EditPage.notification.role.error": "Возникла ошибка при загрузке роли", + "EditPage.submit": "Сохранить", + "Email.template.reset_password": "Сброс пароля", + "Email.template.success_register": "Регистрация прошла успешно", + "Email.template.validation_email": "Валидация почтового адреса", + "HeaderNav.link.advancedSettings": "Расширенные настройки", + "HeaderNav.link.emailTemplates": "Шаблоны писем", + "HeaderNav.link.providers": "Провайдеры", + "HeaderNav.link.roles": "Роли и доступы", + "HomePage.header.description": "Задавай роли и доступы для ваших пользователей.", + "HomePage.header.title": "Роли и доступы", + "InputSearch.placeholder": "Искать пользователя", + "List.button.providers": "Добавить нового провайдера", + "List.button.roles": "Добавить новую роль", + "List.title.emailTemplates.plural": "{number} – количество доступных шаблонов", + "List.title.emailTemplates.singular": "{number} шаблон доступен", + "List.title.providers.disabled.plural": "{number} отключено", + "List.title.providers.disabled.singular": "{number} отключен", + "List.title.providers.enabled.plural": "{number} — количество провайдеров включено and", + "List.title.providers.enabled.singular": "{number} провайдер включен и", + "List.title.roles.plural": "{number} - количество доступных ролей", + "List.title.roles.singular": "{number} роль доступна", + "Plugin.permissions.application.description": "Задайте действия доступные для вашего проекта.", + "Plugin.permissions.plugins.description": "Задайте все возможные действия для {name} плагина.", + "Plugins.header.description": "Только действия связанные с маршрутом показаны в списке.", + "Plugins.header.title": "Доступы", + "Policies.InputSelect.empty": "Нет", + "Policies.InputSelect.label": "Разрешить выполнение этого действия для:", + "Policies.header.hint": "Выберите действия приложения или действия плагина и щелкните значок шестеренки, чтобы отобразить связанный маршрут", + "Policies.header.title": "Расширенные настройки", + "PopUpForm.Email.email_templates.inputDescription": "Если вы не уверены как использовать переменные, {link}", + "PopUpForm.Email.link.documentation": "ознакомтесь с нашей документацией.", + "PopUpForm.Email.options.from.email.label": "Почтовый адрес доставщика", + "PopUpForm.Email.options.from.email.placeholder": "johndoe@gmail.com", + "PopUpForm.Email.options.from.name.label": "Название доставщика", + "PopUpForm.Email.options.from.name.placeholder": "John Doe", + "PopUpForm.Email.options.message.label": "Послание", + "PopUpForm.Email.options.object.label": "Тема", + "PopUpForm.Email.options.response_email.label": "Обратный почтовый адрес", + "PopUpForm.Email.options.response_email.placeholder": "johndoe@gmail.com", + "PopUpForm.Email.reset_password.options.message.placeholder": "

Пажалуйста нажмите на ссылку чтобы подтвердить вашу учетную запись

", + "PopUpForm.Email.reset_password.options.object.placeholder": "Пожалуйста подтвердите ваш почтовый адрес для %APP_NAME%", + "PopUpForm.Email.success_register.options.message.placeholder": "

Пажалуйста нажмите на ссылку чтобы подтвердить вашу учетную запись

", + "PopUpForm.Email.success_register.options.object.placeholder": "Пожалуйста подтвердите ваш почтовый адрес для %APP_NAME%", + "PopUpForm.Email.validation_email.options.message.placeholder": "

Пажалуйста нажмите на ссылку чтобы подтвердить вашу учетную запись

", + "PopUpForm.Email.validation_email.options.object.placeholder": "Пожалуйста подтвердите ваш почтовый адрес для %APP_NAME%", + "PopUpForm.Providers.callback.placeholder": "TEXT", + "PopUpForm.Providers.enabled.description": "Если отключено, пользователь не сможет использовать этот провайдер.", + "PopUpForm.Providers.enabled.label": "Включить", + "PopUpForm.Providers.facebook.providerConfig.redirectURL": "URL-адрес перенаправления, который необходимо добавить в настройки Facebook приложения", + "PopUpForm.Providers.github.providerConfig.redirectURL": "URL-адрес перенаправления, который необходимо добавить в настройки GitHub приложения", + "PopUpForm.Providers.google.providerConfig.redirectURL": "URL-адрес перенаправления, который необходимо добавить в настройки Google приложения", + "PopUpForm.Providers.key.label": "Client ID", + "PopUpForm.Providers.key.placeholder": "TEXT", + "PopUpForm.Providers.linkedin2.providerConfig.redirectURL": "URL-адрес перенаправления, который необходимо добавить в настройки Linkedin приложения", + "PopUpForm.Providers.redirectURL.front-end.label": "URL-адрес перенаправления для вашего приложения", + "PopUpForm.Providers.secret.label": "Client Secret", + "PopUpForm.Providers.secret.placeholder": "TEXT", + "PopUpForm.Providers.twitter.providerConfig.redirectURL": "URL-адрес перенаправления, который необходимо добавить в настройки Twitter приложения", + "PopUpForm.button.cancel": "Отменить", + "PopUpForm.button.save": "Сохранить", + "PopUpForm.header.add.providers": "Добавить нового провайдера", + "PopUpForm.header.edit.email-templates": "Отредактировать шаблон письма", + "PopUpForm.header.edit.providers": "Отредактировать {provider} провайдера", + "PopUpForm.inputSelect.providers.label": "Выбрать провайдера", + "components.Input.error.password.noMatch": "Пароль не совпадает", + "notification.error.delete": "Возникла ошибка в процессе удаления", + "notification.error.fetch": "Возникла ошибка при загрузке данных", + "notification.error.fetchUser": "Возникла ошибка при загрузке пользователей", + "notification.info.emailSent": "Письмо отправленно", + "notification.success.delete": "Успешно удалено", + "notification.success.submit": "Настройки обновлены", + "plugin.description.long": "Защитите ваш API с процессом полной аутентификации основаном на JWT. Этот плагин также идет с ACL (Access Control List) возможностями, которые позволяет вам настраивать доступы для групп пользователей.", + "plugin.description.short": "Защитите ваш API с процессом полной аутентификации основаном на JWT" +} \ No newline at end of file diff --git a/packages/strapi-plugin-users-permissions/admin/src/translations/tr.json b/packages/strapi-plugin-users-permissions/admin/src/translations/tr.json index 2ad1bc29e6..beecdbea41 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/translations/tr.json +++ b/packages/strapi-plugin-users-permissions/admin/src/translations/tr.json @@ -1,175 +1,144 @@ { - "Auth.form.button.register-success": "Tekrar gönderin", - "Auth.form.button.forgot-password.success": "Tekrar gönderin", + "Auth.advanced.allow_register": "", "Auth.form.button.forgot-password": "E-posta gönder", - "Auth.form.button.reset-password": "Şifre değiştir", + "Auth.form.button.forgot-password.success": "Tekrar gönderin", "Auth.form.button.login": "Giriş", "Auth.form.button.register": "Başlamaya hazır", + "Auth.form.button.register-success": "Tekrar gönderin", + "Auth.form.button.reset-password": "Şifre değiştir", + "Auth.form.error.code.provide": "Geçersiz sağlanmış kod.", + "Auth.form.error.email.invalid": "E-postası geçersiz.", + "Auth.form.error.email.provide": "Lütfen kullanıcı adınızı veya e-postanızı belirtin.", + "Auth.form.error.email.taken": "E-posta zaten alınmış", + "Auth.form.error.invalid": "Kimlik veya şifre geçersiz.", "Auth.form.error.noAdminAccess": "Yönetim paneline erişemezsiniz.", - + "Auth.form.error.params.provide": "Geçersiz sağlanmış kod parametresi.", + "Auth.form.error.password.format": "Şifreniz `$` sembolünü üç kezden fazla içeremez.", + "Auth.form.error.password.local": "Bu kullanıcı hiçbir bir şifre belirlemedi; hesap oluşturma sırasında kullanılan sağlayıcı aracılığıyla lütfen giriş yapınız..", + "Auth.form.error.password.matching": "Parolalar uyuşmuyor.", + "Auth.form.error.password.provide": "Lütfen şifrenizi girin.", + "Auth.form.error.user.not-exist": "Bu e-posta bulunmamaktadır..", + "Auth.form.error.username.taken": "Kullanıcı adı zaten alınmış", "Auth.form.forgot-password.email.label": "E-postanızı giriniz", "Auth.form.forgot-password.email.label.success": "E-posta başarıyla gönderildi, ", "Auth.form.forgot-password.email.placeholder": "mysuperemail@gmail.com", - - "Auth.header.register.description": "Kurulumu tamamlamak ve uygulamanızı güvence altına almak için, lütfen aşağıdaki gerekli bilgileri girerek ilk kullanıcıyı (root admin) oluşturun.", - "Auth.form.header.login": "strapi", "Auth.form.header.forgot-password": "strapi", + "Auth.form.header.login": "strapi", "Auth.form.header.register": "Hoşgeldin!", "Auth.form.header.register-success": "strapi", - "Auth.form.login.password.label": "Parola", "Auth.form.login.rememberMe.label": "Beni hatırla", "Auth.form.login.username.label": "Kullanıcı Adı", "Auth.form.login.username.placeholder": "John Doe", - - "Auth.form.register.email.label": "E-posta", - "Auth.form.register.email.placeholder": "johndoe@gmail.com", - "Auth.form.register.username.label": "Kullanıcı Adı", - "Auth.form.register.username.placeholder": "John Doe", - "Auth.form.register.password.label": "Parola", - "Auth.form.register.confirmPassword.label": "Parola Tekrarı", - "Auth.form.register.news.label": "Yeni özellikler ve yaklaşan iyileştirmeler hakkında beni haberdar edin.", - "Auth.form.register-success.email.label": "E-posta başarıyla gönderildi, ", "Auth.form.register-success.email.placeholder": "mysuperemail@gmail.com", - - "Auth.form.error.email.provide": "Lütfen kullanıcı adınızı veya e-postanızı belirtin.", - "Auth.form.error.email.invalid": "E-postası geçersiz.", - "Auth.form.error.password.provide": "Lütfen şifrenizi girin.", - "Auth.form.error.invalid": "Kimlik veya şifre geçersiz.", - "Auth.form.error.password.local": "Bu kullanıcı hiçbir bir şifre belirlemedi; hesap oluşturma sırasında kullanılan sağlayıcı aracılığıyla lütfen giriş yapınız..", - "Auth.form.error.password.format": "Şifreniz `$` sembolünü üç kezden fazla içeremez.", - "Auth.form.error.user.not-exist": "Bu e-posta bulunmamaktadır..", - "Auth.form.error.code.provide": "Geçersiz sağlanmış kod.", - "Auth.form.error.password.matching": "Parolalar uyuşmuyor.", - "Auth.form.error.params.provide": "Geçersiz sağlanmış kod parametresi.", - "Auth.form.error.username.taken": "Kullanıcı adı zaten alınmış", - "Auth.form.error.email.taken": "E-posta zaten alınmış", - + "Auth.form.register.confirmPassword.label": "Parola Tekrarı", + "Auth.form.register.email.label": "E-posta", + "Auth.form.register.email.placeholder": "johndoe@gmail.com", + "Auth.form.register.news.label": "Yeni özellikler ve yaklaşan iyileştirmeler hakkında beni haberdar edin.", + "Auth.form.register.password.label": "Parola", + "Auth.form.register.username.label": "Kullanıcı Adı", + "Auth.form.register.username.placeholder": "John Doe", + "Auth.header.register.description": "Kurulumu tamamlamak ve uygulamanızı güvence altına almak için, lütfen aşağıdaki gerekli bilgileri girerek ilk kullanıcıyı (root admin) oluşturun.", "Auth.link.forgot-password": "Parolanızı mı unuttunuz ?", "Auth.link.ready": "Zaten kayıtlı mısınız?", - "BoundRoute.title": "Bağlı rota", - - "components.Input.error.password.noMatch": "Parolalar uyuşmuyor", - "Controller.input.label": "{label} ", "Controller.selectAll": "Hepsini seç", - - "EditForm.inputSelect.label.role": "Kimliği doğrulanmış kullanıcılar için varsayılan rol", "EditForm.inputSelect.description.role": "Yeni kimliği doğrulanmış kullanıcıyı seçilen rolü ekler.", - "EditForm.inputSelect.subscriptions.label": "Abonelik kotalarını yönetme", - "EditForm.inputSelect.subscriptions.description": "Saat başına IP için abone sayısını sınırlayın.", - "EditForm.inputSelect.durations.label": "Süre", "EditForm.inputSelect.durations.description": "Kullanıcının abone olamayacağı süre sayısı.", - - "EditForm.inputToggle.label.email": "E-posta adresi başına bir hesap", - "EditForm.inputToggle.label.sign-up": "Kayıtları etkinleştir", + "EditForm.inputSelect.durations.label": "Süre", + "EditForm.inputSelect.label.role": "Kimliği doğrulanmış kullanıcılar için varsayılan rol", + "EditForm.inputSelect.subscriptions.description": "Saat başına IP için abone sayısını sınırlayın.", + "EditForm.inputSelect.subscriptions.label": "Abonelik kotalarını yönetme", "EditForm.inputToggle.description.email": "Kullanıcıyı, farklı kimlik doğrulama sağlayıcılarıyla aynı e-posta adresini kullanarak birden fazla hesap oluşturmasına izin vermeyin.", "EditForm.inputToggle.description.sign-up": "Devre dışı bırakıldığında (KAPALI), kayıt işlemi yasaktır. Artık kullanılan sağlayıcı ne olursa olsun hiç kimse abone olamaz.", - + "EditForm.inputToggle.label.email": "E-posta adresi başına bir hesap", + "EditForm.inputToggle.label.sign-up": "Kayıtları etkinleştir", "EditPage.cancel": "İptal", - "EditPage.submit": "Kaydet", "EditPage.form.roles": "Rol detayları", "EditPage.form.roles.label.description": "Açıklama", "EditPage.form.roles.label.name": "İsim", "EditPage.form.roles.label.users": "Bu rolle ilişkili kullanıcılar ({number})", "EditPage.form.roles.name.error": "Zorunlu alandır.", - "EditPage.header.title": "{name} ", - "EditPage.header.title.create": "Yeni bir rol oluştur", "EditPage.header.description": "{description} ", "EditPage.header.description.create": " ", - + "EditPage.header.title": "{name} ", + "EditPage.header.title.create": "Yeni bir rol oluştur", "EditPage.notification.permissions.error": "İzinler getirilirken bir hata oluştu.", "EditPage.notification.policies.error": "İlkeler getirilirken bir hata oluştu.", "EditPage.notification.role.error": "Rol getirilirken bir hata oluştu.", - + "EditPage.submit": "Kaydet", + "Email.template.reset_password": "Şifreyi yenile", + "Email.template.success_register": "Kayıt başarılı", + "Email.template.validation_email": "E-posta adresinin doğrulanması", "HeaderNav.link.advancedSettings": "Gelişmiş Ayarlar", "HeaderNav.link.emailTemplates": "E-posta Şablonları", "HeaderNav.link.providers": "Sağlayıcıları", "HeaderNav.link.roles": "Kurallar", - - "HomePage.header.title": "Kullanıcılar & İzinler", "HomePage.header.description": "Kullanıcılarınızın rollerini ve izinlerini tanımlayın.", - + "HomePage.header.title": "Kullanıcılar & İzinler", "InputSearch.placeholder": "Kullanıcı ara", - - "List.button.roles": "Yeni Rol Ekle", "List.button.providers": "AYeni Sağlayıcı Ekle", - - "List.title.emailTemplates.singular": "{number} e-posta şablonu kullanılabilir", + "List.button.roles": "Yeni Rol Ekle", "List.title.emailTemplates.plural": "{number} e-posta şablonları kullanılabilir", - - "List.title.providers.disabled.singular": "{number} devre dışı", + "List.title.emailTemplates.singular": "{number} e-posta şablonu kullanılabilir", "List.title.providers.disabled.plural": "{number} devre dışı", - "List.title.providers.enabled.singular": "{number} sağlayıcı etkinleştirilmiş ve", + "List.title.providers.disabled.singular": "{number} devre dışı", "List.title.providers.enabled.plural": "{number} sağlayıcılar etkinleştirilmiş ve", - - "List.title.roles.singular": "{number} rol kullanılabilir", + "List.title.providers.enabled.singular": "{number} sağlayıcı etkinleştirilmiş ve", "List.title.roles.plural": "{number} roller kullanılabilir", - - "notification.error.delete": "Öğe silinirken bir hata oluştu", - "notification.error.fetch": "Verileri getirmeye çalışılırken bir hata oluştu", - "notification.error.fetchUser": "Kullanıcıları getirmeye çalışılırken bir hata oluştu", - "notification.info.emailSent": "E-posta gönderildi", - "notification.success.delete": "Öğe silindi", - "notification.success.submit": "Ayarlar güncellendi", - - "plugin.description.short": "Servisinizi JWT'ye dayalı tam bir kimlik doğrulama işlemi ile koruyun", - "plugin.description.long": "Servisinizi JWT'ye dayalı tam bir kimlik doğrulama işlemi ile koruyun. Bu eklenti, kullanıcı grupları arasındaki izinleri yönetmenize izin veren bir ACL stratejisiyle de gelir.", - + "List.title.roles.singular": "{number} rol kullanılabilir", "Plugin.permissions.application.description": "Projenizin izin verilen tüm eylemlerini tanımlayın.", "Plugin.permissions.plugins.description": "{name} eklentisi için izin verilen tüm eylemleri tanımlayın.", - - "Plugins.header.title": "İzinler", "Plugins.header.description": "Yalnızca bir güzergahla sınırlandırılan işlemler aşağıda listelenmiştir.", - + "Plugins.header.title": "İzinler", "Policies.InputSelect.empty": "Yok", "Policies.InputSelect.label": "Gerçekleşmesine izin verilen aksiyonlar:", "Policies.header.hint": "Uygulamanın eylemlerini veya eklentinin eylemlerini seçin ve bağlı rotayı görüntülemek için dişli çark simgesini tıklayın", "Policies.header.title": "Gelişmiş Ayarlar", - - "Email.template.validation_email": "E-posta adresinin doğrulanması", - "Email.template.reset_password": "Şifreyi yenile", - "Email.template.success_register": "Kayıt başarılı", - - "Auth.advanced.allow_register": "", - + "PopUpForm.Email.email_templates.inputDescription": "Değişkenleri nasıl kullanacağınızdan emin değilseniz, {link}", + "PopUpForm.Email.link.documentation": "dokümanlarımıza göz atın.", + "PopUpForm.Email.options.from.email.label": "Gönderenin E-posta", + "PopUpForm.Email.options.from.email.placeholder": "johndoe@gmail.com", + "PopUpForm.Email.options.from.name.label": "Gönderenin adı", + "PopUpForm.Email.options.from.name.placeholder": "John Doe", + "PopUpForm.Email.options.message.label": "Mesaj", + "PopUpForm.Email.options.object.label": "Konu", + "PopUpForm.Email.options.response_email.label": "Yanıt e-postası", + "PopUpForm.Email.options.response_email.placeholder": "johndoe@gmail.com", + "PopUpForm.Email.reset_password.options.message.placeholder": "

Hesabınızı doğrulamak için lütfen bu bağlantıyı tıklayın.

", + "PopUpForm.Email.reset_password.options.object.placeholder": "Lütfen %APP_NAME% için e-posta adresinizi onaylayın", + "PopUpForm.Email.success_register.options.message.placeholder": "

Hesabınızı doğrulamak için lütfen bu bağlantıyı tıklayın.

", + "PopUpForm.Email.success_register.options.object.placeholder": "Lütfen %APP_NAME% için e-posta adresinizi onaylayın", + "PopUpForm.Email.validation_email.options.message.placeholder": "

Hesabınızı doğrulamak için lütfen bu bağlantıyı tıklayın.

", + "PopUpForm.Email.validation_email.options.object.placeholder": "Lütfen %APP_NAME% için e-posta adresinizi onaylayın", + "PopUpForm.Providers.callback.placeholder": "METİN", + "PopUpForm.Providers.enabled.description": "Devre dışı bırakıldıysa kullanıcılar bu sağlayıcıyı kullanamaz.", + "PopUpForm.Providers.enabled.label": "Etkinleştirme", + "PopUpForm.Providers.facebook.providerConfig.redirectURL": "Facebook uygulama yapılandırmalarınıza eklenecek yönlendirme URL'si", + "PopUpForm.Providers.github.providerConfig.redirectURL": "GitHub uygulama yapılandırmalarınıza eklenecek yönlendirme URL'si", + "PopUpForm.Providers.google.providerConfig.redirectURL": "Google uygulama yapılandırmalarınıza eklenecek yönlendirme URL'si", + "PopUpForm.Providers.key.label": "Web istemcisi ID", + "PopUpForm.Providers.key.placeholder": "METİN", + "PopUpForm.Providers.linkedin2.providerConfig.redirectURL": "Linkedin uygulama yapılandırmalarınıza eklenecek yönlendirme URL'si", + "PopUpForm.Providers.redirectURL.front-end.label": "Arayüz uygulamanızın yönlendirme URL'si", + "PopUpForm.Providers.secret.label": "Web istemcisi Secret", + "PopUpForm.Providers.secret.placeholder": "METİN", + "PopUpForm.Providers.twitter.providerConfig.redirectURL": "Twitter uygulama yapılandırmalarınıza eklenecek yönlendirme URL'si", "PopUpForm.button.cancel": "İptal", "PopUpForm.button.save": "Kaydet", "PopUpForm.header.add.providers": "Yeni Sağlayıcı Ekle", "PopUpForm.header.edit.email-templates": "E-posta Şablonlarını Düzenle", "PopUpForm.header.edit.providers": "{sağlayıcı} sağlayıcını düzenle", "PopUpForm.inputSelect.providers.label": "Sağlayıcıyı seçin", - "PopUpForm.Email.options.from.name.label": "Gönderenin adı", - "PopUpForm.Email.options.from.email.label": "Gönderenin E-posta", - "PopUpForm.Email.options.response_email.label": "Yanıt e-postası", - "PopUpForm.Email.options.object.label": "Konu", - "PopUpForm.Email.options.message.label": "Mesaj", - "PopUpForm.Email.validation_email.options.object.placeholder": "Lütfen %APP_NAME% için e-posta adresinizi onaylayın", - "PopUpForm.Email.reset_password.options.object.placeholder": "Lütfen %APP_NAME% için e-posta adresinizi onaylayın", - "PopUpForm.Email.success_register.options.object.placeholder": "Lütfen %APP_NAME% için e-posta adresinizi onaylayın", - "PopUpForm.Email.validation_email.options.message.placeholder": "

Hesabınızı doğrulamak için lütfen bu bağlantıyı tıklayın.

", - "PopUpForm.Email.reset_password.options.message.placeholder": "

Hesabınızı doğrulamak için lütfen bu bağlantıyı tıklayın.

", - "PopUpForm.Email.success_register.options.message.placeholder": "

Hesabınızı doğrulamak için lütfen bu bağlantıyı tıklayın.

", - "PopUpForm.Email.options.from.email.placeholder": "johndoe@gmail.com", - "PopUpForm.Email.options.response_email.placeholder": "johndoe@gmail.com", - "PopUpForm.Email.options.from.name.placeholder": "John Doe", - "PopUpForm.Providers.enabled.label": "Etkinleştirme", - "PopUpForm.Providers.enabled.description": "Devre dışı bırakıldıysa kullanıcılar bu sağlayıcıyı kullanamaz.", - "PopUpForm.Providers.key.label": "Web istemcisi ID", - "PopUpForm.Providers.key.placeholder": "METİN", - "PopUpForm.Providers.secret.label": "Web istemcisi Secret", - "PopUpForm.Providers.secret.placeholder": "METİN", - "PopUpForm.Providers.redirectURL.front-end.label": "Arayüz uygulamanızın yönlendirme URL'si", - - "PopUpForm.Providers.facebook.providerConfig.redirectURL": "Facebook uygulama yapılandırmalarınıza eklenecek yönlendirme URL'si", - "PopUpForm.Providers.google.providerConfig.redirectURL": "Google uygulama yapılandırmalarınıza eklenecek yönlendirme URL'si", - "PopUpForm.Providers.github.providerConfig.redirectURL": "GitHub uygulama yapılandırmalarınıza eklenecek yönlendirme URL'si", - "PopUpForm.Providers.linkedin2.providerConfig.redirectURL": "Linkedin uygulama yapılandırmalarınıza eklenecek yönlendirme URL'si", - "PopUpForm.Providers.twitter.providerConfig.redirectURL": "Twitter uygulama yapılandırmalarınıza eklenecek yönlendirme URL'si", - - "PopUpForm.Providers.callback.placeholder": "METİN", - "PopUpForm.Email.email_templates.inputDescription": "Değişkenleri nasıl kullanacağınızdan emin değilseniz, {link}", - "PopUpForm.Email.link.documentation": "dokümanlarımıza göz atın." -} + "components.Input.error.password.noMatch": "Parolalar uyuşmuyor", + "notification.error.delete": "Öğe silinirken bir hata oluştu", + "notification.error.fetch": "Verileri getirmeye çalışılırken bir hata oluştu", + "notification.error.fetchUser": "Kullanıcıları getirmeye çalışılırken bir hata oluştu", + "notification.info.emailSent": "E-posta gönderildi", + "notification.success.delete": "Öğe silindi", + "notification.success.submit": "Ayarlar güncellendi", + "plugin.description.long": "Servisinizi JWT'ye dayalı tam bir kimlik doğrulama işlemi ile koruyun. Bu eklenti, kullanıcı grupları arasındaki izinleri yönetmenize izin veren bir ACL stratejisiyle de gelir.", + "plugin.description.short": "Servisinizi JWT'ye dayalı tam bir kimlik doğrulama işlemi ile koruyun" +} \ No newline at end of file diff --git a/packages/strapi-plugin-users-permissions/admin/src/translations/zh-Hans.json b/packages/strapi-plugin-users-permissions/admin/src/translations/zh-Hans.json index 9e1b7f9fd5..4573fea3a4 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/translations/zh-Hans.json +++ b/packages/strapi-plugin-users-permissions/admin/src/translations/zh-Hans.json @@ -1,177 +1,144 @@ { - "Auth.form.button.register-success": "再次发送", - "Auth.form.button.forgot-password.success": "再次发送", + "Auth.advanced.allow_register": "", "Auth.form.button.forgot-password": "发送电子邮件", - "Auth.form.button.reset-password": "修改密码", + "Auth.form.button.forgot-password.success": "再次发送", "Auth.form.button.login": "登陆", "Auth.form.button.register": "准备开始", + "Auth.form.button.register-success": "再次发送", + "Auth.form.button.reset-password": "修改密码", + "Auth.form.error.code.provide": "提供代码的代码不正确。", + "Auth.form.error.email.invalid": "此电子邮件无效。", + "Auth.form.error.email.provide": "请提供您的用户名或电子邮件。", + "Auth.form.error.email.taken": "邮箱已被使用", + "Auth.form.error.invalid": "标识符或密码无效。", "Auth.form.error.noAdminAccess": "你无法访问管理面板。", - + "Auth.form.error.params.provide": "提供错误的参数。", + "Auth.form.error.password.format": "您的密码不能包含符号 `$` 超过三次。", + "Auth.form.error.password.local": "此用户从未设置本地密码,请通过帐户创建过程中使用的第三方供应商登录。", + "Auth.form.error.password.matching": "密码不匹配。", + "Auth.form.error.password.provide": "请提供您的密码。", + "Auth.form.error.user.not-exist": "此电子邮件不存在。", + "Auth.form.error.username.taken": "用户名已被使用", "Auth.form.forgot-password.email.label": "输入你的电子邮件", "Auth.form.forgot-password.email.label.success": "电子邮件已成功发送到", "Auth.form.forgot-password.email.placeholder": "mysuperemail@gmail.com", - - "Auth.header.register.description": "要完成安装并保护您的应用程序,请通过输入必要的信息来创建第一个用户(root管理员)。", - "Auth.form.header.login": "strapi", "Auth.form.header.forgot-password": "strapi", + "Auth.form.header.login": "strapi", "Auth.form.header.register": "欢迎!", "Auth.form.header.register-success": "strapi", - "Auth.form.login.password.label": "密码", "Auth.form.login.rememberMe.label": "记住我", "Auth.form.login.username.label": "用户名", "Auth.form.login.username.placeholder": "John Doe", - - "Auth.form.register.email.label": "邮箱", - "Auth.form.register.email.placeholder": "johndoe@gmail.com", - "Auth.form.register.username.label": "用户名", - "Auth.form.register.username.placeholder": "John Doe", - "Auth.form.register.password.label": "密码", - "Auth.form.register.confirmPassword.label": "确认密码", - "Auth.form.register.news.label": "让我了解新特性和即将到来的改进。", - "Auth.form.register-success.email.label": "电子邮件已发送成功到", "Auth.form.register-success.email.placeholder": "mysuperemail@gmail.com", - - "Auth.form.error.email.provide": "请提供您的用户名或电子邮件。", - "Auth.form.error.email.invalid": "此电子邮件无效。", - "Auth.form.error.password.provide": "请提供您的密码。", - "Auth.form.error.invalid": "标识符或密码无效。", - "Auth.form.error.password.local": "此用户从未设置本地密码,请通过帐户创建过程中使用的第三方供应商登录。", - "Auth.form.error.password.format": "您的密码不能包含符号 `$` 超过三次。", - "Auth.form.error.user.not-exist": "此电子邮件不存在。", - "Auth.form.error.code.provide": "提供代码的代码不正确。", - "Auth.form.error.password.matching": "密码不匹配。", - "Auth.form.error.params.provide": "提供错误的参数。", - "Auth.form.error.username.taken": "用户名已被使用", - "Auth.form.error.email.taken": "邮箱已被使用", - + "Auth.form.register.confirmPassword.label": "确认密码", + "Auth.form.register.email.label": "邮箱", + "Auth.form.register.email.placeholder": "johndoe@gmail.com", + "Auth.form.register.news.label": "让我了解新特性和即将到来的改进。", + "Auth.form.register.password.label": "密码", + "Auth.form.register.username.label": "用户名", + "Auth.form.register.username.placeholder": "John Doe", + "Auth.header.register.description": "要完成安装并保护您的应用程序,请通过输入必要的信息来创建第一个用户(root管理员)。", "Auth.link.forgot-password": "忘记密码了吗?", "Auth.link.ready": "准备好登陆?", - "BoundRoute.title": "绑定路由到", - - "components.Input.error.password.noMatch": "密码不匹配", - "Controller.input.label": "{label} ", "Controller.selectAll": "选择全部", - - "EditForm.inputSelect.label.role": "认证用户的默认角色", "EditForm.inputSelect.description.role": "新验证身份的用户将被赋予所选角色。", - "EditForm.inputSelect.subscriptions.label": "管理订阅配额", - "EditForm.inputSelect.subscriptions.description": "限制每个每小时IP的订阅数。", - "EditForm.inputSelect.durations.label": "持续时间", "EditForm.inputSelect.durations.description": "用户无法订阅的时间段。", - - "EditForm.inputToggle.label.email": "每个电子邮件地址一个帐户", - "EditForm.inputToggle.label.sign-up": "启用注册", + "EditForm.inputSelect.durations.label": "持续时间", + "EditForm.inputSelect.label.role": "认证用户的默认角色", + "EditForm.inputSelect.subscriptions.description": "限制每个每小时IP的订阅数。", + "EditForm.inputSelect.subscriptions.label": "管理订阅配额", "EditForm.inputToggle.description.email": "不允许用户使用不同的认证提供者(绑定的相同的电子邮件地址)来创建多个帐户。", "EditForm.inputToggle.description.sign-up": "当禁用(OFF)时,注册过程将被禁止。任何人无论使用任何的供应商都不可以订阅。", - + "EditForm.inputToggle.label.email": "每个电子邮件地址一个帐户", + "EditForm.inputToggle.label.sign-up": "启用注册", "EditPage.cancel": "取消", - "EditPage.submit": "保存", "EditPage.form.roles": "角色详情", "EditPage.form.roles.label.description": "描述", "EditPage.form.roles.label.name": "名称", "EditPage.form.roles.label.users": "与此角色相关联的用户数: ({number})", "EditPage.form.roles.name.error": "此值是必需的。", - "EditPage.header.title": "{name} ", - "EditPage.header.title.create": "创建一个新角色", "EditPage.header.description": "{description} ", "EditPage.header.description.create": " ", - + "EditPage.header.title": "{name} ", + "EditPage.header.title.create": "创建一个新角色", "EditPage.notification.permissions.error": "获取权限(permission)时出错", "EditPage.notification.policies.error": "获取鉴权策略(policies)时出错", "EditPage.notification.role.error": "获取角色时出错", - + "EditPage.submit": "保存", + "Email.template.reset_password": "重置密码", + "Email.template.success_register": "注册成功", + "Email.template.validation_email": "电子邮件地址验证", "HeaderNav.link.advancedSettings": "高级设置", "HeaderNav.link.emailTemplates": "电子邮件模板", "HeaderNav.link.providers": "提供者", "HeaderNav.link.roles": "角色和权限", - - "HomePage.header.title": "角色和权限", "HomePage.header.description": "定义用户的角色和权限。", - + "HomePage.header.title": "角色和权限", "InputSearch.placeholder": "搜索用户", - - "List.button.roles": "添加新角色", "List.button.providers": "添加新供应商", - - "List.title.emailTemplates.singular": "{number} 电子邮件模板是可用的", + "List.button.roles": "添加新角色", "List.title.emailTemplates.plural": "{number} 电子邮件模板是可用的", - - "List.title.providers.disabled.singular": "{number} 被禁用", + "List.title.emailTemplates.singular": "{number} 电子邮件模板是可用的", "List.title.providers.disabled.plural": "{number} 被禁用", - "List.title.providers.enabled.singular": "{number} 个供应商被启用, ", + "List.title.providers.disabled.singular": "{number} 被禁用", "List.title.providers.enabled.plural": "{number} 个供应商被启用, ", - - "List.title.roles.singular": "{number} 个角色可用", + "List.title.providers.enabled.singular": "{number} 个供应商被启用, ", "List.title.roles.plural": "{number} 角色可用", - - "notification.error.delete": "删除数据时出错", - "notification.error.fetch": "获取数据时出错", - "notification.error.fetchUser": "获取用户时出错", - "notification.info.emailSent": "电子邮件已发送", - "notification.success.delete": "该项已被删除", - "notification.success.submit": "设置已被更新", - - "plugin.description.short": "使用基于JWT的完整身份验证过程保护API", - "plugin.description.long": "使用基于JWT的完整身份验证过程来保护API。这个插件还有一个ACL策略,允许你管理用户组之间的权限。", - + "List.title.roles.singular": "{number} 个角色可用", "Plugin.permissions.application.description": "定义所有项目的允许操作。", "Plugin.permissions.plugins.description": "定义 {name} 插件所有允许的操作。", - - "Plugins.header.title": "权限", "Plugins.header.description": "下面只列出路由绑定的操作。", - + "Plugins.header.title": "权限", "Policies.InputSelect.empty": "没有", "Policies.InputSelect.label": "允许执行以下操作:", "Policies.header.hint": "选择应用程序或插件的操作,然后点击COG图标显示绑定的路由", "Policies.header.title": "高级设置", - - "Email.template.validation_email": "电子邮件地址验证", - "Email.template.reset_password": "重置密码", - "Email.template.success_register": "注册成功", - - "Auth.advanced.allow_register": "", - + "PopUpForm.Email.email_templates.inputDescription": "如果你不确定如何使用变量, {link}", + "PopUpForm.Email.link.documentation": "看看我们的文档。", + "PopUpForm.Email.options.from.email.label": "Shipper email", + "PopUpForm.Email.options.from.email.placeholder": "johndoe@gmail.com", + "PopUpForm.Email.options.from.name.label": "Shipper name", + "PopUpForm.Email.options.from.name.placeholder": "John Doe", + "PopUpForm.Email.options.message.label": "消息", + "PopUpForm.Email.options.object.label": "主题", + "PopUpForm.Email.options.response_email.label": "Response email", + "PopUpForm.Email.options.response_email.placeholder": "johndoe@gmail.com", + "PopUpForm.Email.reset_password.options.message.placeholder": "

请点击此链接验证您的帐户

", + "PopUpForm.Email.reset_password.options.object.placeholder": "请确认您的电子邮件地址 %APP_NAME%", + "PopUpForm.Email.success_register.options.message.placeholder": "

请点击此链接验证您的帐户

", + "PopUpForm.Email.success_register.options.object.placeholder": "请确认您的电子邮件地址 %APP_NAME%", + "PopUpForm.Email.validation_email.options.message.placeholder": "

请点击此链接验证您的帐户

", + "PopUpForm.Email.validation_email.options.object.placeholder": "请确认您的电子邮件地址 %APP_NAME%", + "PopUpForm.Providers.callback.placeholder": "TEXT", + "PopUpForm.Providers.enabled.description": "如果禁用,用户将无法使用此供应商。", + "PopUpForm.Providers.enabled.label": "启用", + "PopUpForm.Providers.facebook.providerConfig.redirectURL": "Facebook应用中配置的重定向URL", + "PopUpForm.Providers.github.providerConfig.redirectURL": "GitHub应用中配置的重定向URL", + "PopUpForm.Providers.google.providerConfig.redirectURL": "Google应用中配置的重定向URL", + "PopUpForm.Providers.key.label": "Client ID", + "PopUpForm.Providers.key.placeholder": "TEXT", + "PopUpForm.Providers.linkedin2.providerConfig.redirectURL": "Linkedin应用中配置的重定向URL", + "PopUpForm.Providers.redirectURL.front-end.label": "重定向URL", + "PopUpForm.Providers.secret.label": "Client Secret", + "PopUpForm.Providers.secret.placeholder": "TEXT", + "PopUpForm.Providers.twitter.providerConfig.redirectURL": "Twitter应用中配置的重定向URL", "PopUpForm.button.cancel": "取消", "PopUpForm.button.save": "保存", "PopUpForm.header.add.providers": "增加新的供应商(Provider)", "PopUpForm.header.edit.email-templates": "编辑电子邮件模版", "PopUpForm.header.edit.providers": "编译 {provider} 供应商", "PopUpForm.inputSelect.providers.label": "选择供应商", - "PopUpForm.Email.options.from.name.label": "Shipper name", - "PopUpForm.Email.options.from.email.label": "Shipper email", - "PopUpForm.Email.options.response_email.label": "Response email", - "PopUpForm.Email.options.object.label": "主题", - "PopUpForm.Email.options.message.label": "消息", - "PopUpForm.Email.validation_email.options.object.placeholder": "请确认您的电子邮件地址 %APP_NAME%", - "PopUpForm.Email.reset_password.options.object.placeholder": "请确认您的电子邮件地址 %APP_NAME%", - "PopUpForm.Email.success_register.options.object.placeholder": "请确认您的电子邮件地址 %APP_NAME%", - "PopUpForm.Email.validation_email.options.message.placeholder": "

请点击此链接验证您的帐户

", - "PopUpForm.Email.reset_password.options.message.placeholder": "

请点击此链接验证您的帐户

", - "PopUpForm.Email.success_register.options.message.placeholder": "

请点击此链接验证您的帐户

", - "PopUpForm.Email.options.from.email.placeholder": "johndoe@gmail.com", - "PopUpForm.Email.options.response_email.placeholder": "johndoe@gmail.com", - "PopUpForm.Email.options.from.name.placeholder": "John Doe", - "PopUpForm.Providers.enabled.label": "启用", - "PopUpForm.Providers.enabled.description": "如果禁用,用户将无法使用此供应商。", - "PopUpForm.Providers.key.label": "Client ID", - "PopUpForm.Providers.key.placeholder": "TEXT", - "PopUpForm.Providers.secret.label": "Client Secret", - "PopUpForm.Providers.secret.placeholder": "TEXT", - "PopUpForm.Providers.redirectURL.front-end.label": "重定向URL", - - - - "PopUpForm.Providers.facebook.providerConfig.redirectURL": "Facebook应用中配置的重定向URL", - "PopUpForm.Providers.google.providerConfig.redirectURL": "Google应用中配置的重定向URL", - "PopUpForm.Providers.github.providerConfig.redirectURL": "GitHub应用中配置的重定向URL", - "PopUpForm.Providers.linkedin2.providerConfig.redirectURL": "Linkedin应用中配置的重定向URL", - "PopUpForm.Providers.twitter.providerConfig.redirectURL": "Twitter应用中配置的重定向URL", - - "PopUpForm.Providers.callback.placeholder": "TEXT", - "PopUpForm.Email.email_templates.inputDescription": "如果你不确定如何使用变量, {link}", - "PopUpForm.Email.link.documentation": "看看我们的文档。" -} + "components.Input.error.password.noMatch": "密码不匹配", + "notification.error.delete": "删除数据时出错", + "notification.error.fetch": "获取数据时出错", + "notification.error.fetchUser": "获取用户时出错", + "notification.info.emailSent": "电子邮件已发送", + "notification.success.delete": "该项已被删除", + "notification.success.submit": "设置已被更新", + "plugin.description.long": "使用基于JWT的完整身份验证过程来保护API。这个插件还有一个ACL策略,允许你管理用户组之间的权限。", + "plugin.description.short": "使用基于JWT的完整身份验证过程保护API" +} \ No newline at end of file diff --git a/packages/strapi-plugin-users-permissions/admin/src/translations/zh.json b/packages/strapi-plugin-users-permissions/admin/src/translations/zh.json index 835b0e7293..7bd630c8ab 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/translations/zh.json +++ b/packages/strapi-plugin-users-permissions/admin/src/translations/zh.json @@ -1,194 +1,143 @@ { - "Auth.form.button.register-success": "重寄一次", - "Auth.form.button.forgot-password.success": "重寄一次", + "Auth.advanced.allow_register": "", "Auth.form.button.forgot-password": "送出 Email", - "Auth.form.button.reset-password": "更改密碼", + "Auth.form.button.forgot-password.success": "重寄一次", "Auth.form.button.login": "登入", "Auth.form.button.register": "準備開始", + "Auth.form.button.register-success": "重寄一次", + "Auth.form.button.reset-password": "更改密碼", + "Auth.form.error.code.provide": "提供的數字不正確", + "Auth.form.error.email.invalid": "Email 格式不正確", + "Auth.form.error.email.provide": "請輸入使用者名稱或 Email", + "Auth.form.error.email.taken": "Email 已被使用", + "Auth.form.error.invalid": "使用者名稱或密碼不正確", "Auth.form.error.noAdminAccess": "您將不能進入管理者控制面板", - + "Auth.form.error.params.provide": "密碼不正確", + "Auth.form.error.password.format": "您的密碼不能包含這個符號 `$` 超過三次", + "Auth.form.error.password.local": "這個使用者還沒有設定本地密碼,請使用創建帳號時使用的供應商登入。", + "Auth.form.error.password.matching": "密碼不相符", + "Auth.form.error.password.provide": "請輸入您的密碼", + "Auth.form.error.user.not-exist": "這個 Email 不存在", + "Auth.form.error.username.taken": "使用者名稱已被使用", "Auth.form.forgot-password.email.label": "輸入您的 Email", "Auth.form.forgot-password.email.label.success": "成功寄出 Email", "Auth.form.forgot-password.email.placeholder": "mysuperemail@gmail.com", - - "Auth.header.register.description": - "為了完成設定,請創建第一個使用者 (最高權限),請填寫以下欄位。", - "Auth.form.header.login": "strapi", "Auth.form.header.forgot-password": "strapi", + "Auth.form.header.login": "strapi", "Auth.form.header.register": "歡迎!", "Auth.form.header.register-success": "strapi", - "Auth.form.login.password.label": "密碼", "Auth.form.login.rememberMe.label": "記住我", "Auth.form.login.username.label": "使用者名稱", "Auth.form.login.username.placeholder": "John Doe", - - "Auth.form.register.email.label": "Email", - "Auth.form.register.email.placeholder": "johndoe@gmail.com", - "Auth.form.register.username.label": "使用者名稱", - "Auth.form.register.username.placeholder": "John Doe", - "Auth.form.register.password.label": "密碼", - "Auth.form.register.confirmPassword.label": "確認密碼", - "Auth.form.register-success.email.label": "Email 成功寄出", "Auth.form.register-success.email.placeholder": "mysuperemail@gmail.com", - - "Auth.form.error.email.provide": "請輸入使用者名稱或 Email", - "Auth.form.error.email.invalid": "Email 格式不正確", - "Auth.form.error.password.provide": "請輸入您的密碼", - "Auth.form.error.invalid": "使用者名稱或密碼不正確", - "Auth.form.error.password.local": - "這個使用者還沒有設定本地密碼,請使用創建帳號時使用的供應商登入。", - "Auth.form.error.password.format": "您的密碼不能包含這個符號 `$` 超過三次", - "Auth.form.error.user.not-exist": "這個 Email 不存在", - "Auth.form.error.code.provide": "提供的數字不正確", - "Auth.form.error.password.matching": "密碼不相符", - "Auth.form.error.params.provide": "密碼不正確", - "Auth.form.error.username.taken": "使用者名稱已被使用", - "Auth.form.error.email.taken": "Email 已被使用", - + "Auth.form.register.confirmPassword.label": "確認密碼", + "Auth.form.register.email.label": "Email", + "Auth.form.register.email.placeholder": "johndoe@gmail.com", + "Auth.form.register.password.label": "密碼", + "Auth.form.register.username.label": "使用者名稱", + "Auth.form.register.username.placeholder": "John Doe", + "Auth.header.register.description": "為了完成設定,請創建第一個使用者 (最高權限),請填寫以下欄位。", "Auth.link.forgot-password": "忘記密碼?", "Auth.link.ready": "準備登入了嗎?", - "BoundRoute.title": "綁定路徑到", - - "components.Input.error.password.noMatch": "密碼不相符", - "Controller.input.label": "{label} ", "Controller.selectAll": "全選", - - "EditForm.inputSelect.label.role": "Default role for authenticated users", "EditForm.inputSelect.description.role": "It will attach the new authenticated user to the selected role.", - "EditForm.inputSelect.subscriptions.label": "管理訂閱點數", - "EditForm.inputSelect.subscriptions.description": "限制每個 IP 每小時訂閱", - "EditForm.inputSelect.durations.label": "時間", "EditForm.inputSelect.durations.description": "每小時使用者訂閱失敗的數量", - + "EditForm.inputSelect.durations.label": "時間", + "EditForm.inputSelect.label.role": "Default role for authenticated users", + "EditForm.inputSelect.subscriptions.description": "限制每個 IP 每小時訂閱", + "EditForm.inputSelect.subscriptions.label": "管理訂閱點數", + "EditForm.inputToggle.description.email": "禁止使用者用同一個 Email + 不同的供應商註冊多個帳號", + "EditForm.inputToggle.description.sign-up": "當停用,註冊將被禁止,不管用什麼供應商都沒有人可以訂閱。", "EditForm.inputToggle.label.email": "一個帳號一個 Email", "EditForm.inputToggle.label.sign-up": "啟用註冊", - "EditForm.inputToggle.description.email": - "禁止使用者用同一個 Email + 不同的供應商註冊多個帳號", - "EditForm.inputToggle.description.sign-up": - "當停用,註冊將被禁止,不管用什麼供應商都沒有人可以訂閱。", - "EditPage.cancel": "取消", - "EditPage.submit": "儲存", "EditPage.form.roles": "規則細節", "EditPage.form.roles.label.description": "說明", "EditPage.form.roles.label.name": "名稱", "EditPage.form.roles.label.users": "和這個規則有關的使用者 ({number})", "EditPage.form.roles.name.error": "這個數值必填", - "EditPage.header.title": "{name} ", - "EditPage.header.title.create": "創建一個規則", "EditPage.header.description": "{description} ", "EditPage.header.description.create": " ", - + "EditPage.header.title": "{name} ", + "EditPage.header.title.create": "創建一個規則", "EditPage.notification.permissions.error": "讀取權限時發生錯誤", "EditPage.notification.policies.error": "讀取政策時發生錯誤", "EditPage.notification.role.error": "讀取規則時發生錯誤", - + "EditPage.submit": "儲存", + "Email.template.reset_password": "重設密碼", + "Email.template.success_register": "註冊成功", + "Email.template.validation_email": "Email 認證", "HeaderNav.link.advancedSettings": "進階設定", "HeaderNav.link.emailTemplates": "Email 範本", "HeaderNav.link.providers": "供應商", "HeaderNav.link.roles": "規則", - - "HomePage.header.title": "使用者 & 權限", "HomePage.header.description": "為您的使用者設定規則和權限", - + "HomePage.header.title": "使用者 & 權限", "InputSearch.placeholder": "搜尋使用者", - - "List.button.roles": "增加新規則", "List.button.providers": "增加新的供應商", - - "List.title.emailTemplates.singular": "{number} 個 Email 範本可用", + "List.button.roles": "增加新規則", "List.title.emailTemplates.plural": "{number} 個 Email 範本可用", - - "List.title.providers.disabled.singular": "{number} 已停用", + "List.title.emailTemplates.singular": "{number} 個 Email 範本可用", "List.title.providers.disabled.plural": "{number} 已停用", - "List.title.providers.enabled.singular": "{number} 個供應商已啟動", + "List.title.providers.disabled.singular": "{number} 已停用", "List.title.providers.enabled.plural": "{number} 個供應商已啟動", - - "List.title.roles.singular": "{number} 個可用規則", + "List.title.providers.enabled.singular": "{number} 個供應商已啟動", "List.title.roles.plural": "{number} 個可用規則", - - "notification.error.delete": "刪除項目時發生錯誤", - "notification.error.fetch": "讀取資料時發生錯誤", - "notification.error.fetchUser": "讀取使用者資料時發生錯誤", - "notification.info.emailSent": "Email 已寄出", - "notification.success.delete": "項目已刪除", - "notification.success.submit": "設定已更新", - - "plugin.description.short": "使用 JWT 認證保護您的 API", - "plugin.description.long": - "使用 JWT 認證保護您的 API。這個擴充功能也使用 ACL 來讓你管理不同群組使用者的權限。", - + "List.title.roles.singular": "{number} 個可用規則", "Plugin.permissions.application.description": "定義您所有專案可用的動作", - "Plugin.permissions.plugins.description": - "為 {name} 擴充功能定義所有可用的動作", - - "Plugins.header.title": "權限", + "Plugin.permissions.plugins.description": "為 {name} 擴充功能定義所有可用的動作", "Plugins.header.description": "只有路徑綁定的動作顯示在下面", - + "Plugins.header.title": "權限", "Policies.InputSelect.empty": "無", "Policies.InputSelect.label": "授權這個動作:", - "Policies.header.hint": - "選取應用程式或擴充功能的動作然後點擊齒輪 Icon 來顯示綁定路徑", + "Policies.header.hint": "選取應用程式或擴充功能的動作然後點擊齒輪 Icon 來顯示綁定路徑", "Policies.header.title": "進階設定", - - "Email.template.validation_email": "Email 認證", - "Email.template.reset_password": "重設密碼", - "Email.template.success_register": "註冊成功", - - "Auth.advanced.allow_register": "", - + "PopUpForm.Email.email_templates.inputDescription": "如果您不確定要怎麼使用變數 {link}", + "PopUpForm.Email.link.documentation": "查詢我們的文件", + "PopUpForm.Email.options.from.email.label": "寄件人 Email", + "PopUpForm.Email.options.from.email.placeholder": "johndoe@gmail.com", + "PopUpForm.Email.options.from.name.label": "寄件人名稱", + "PopUpForm.Email.options.from.name.placeholder": "John Doe", + "PopUpForm.Email.options.message.label": "訊息", + "PopUpForm.Email.options.object.label": "主題", + "PopUpForm.Email.options.response_email.label": "回覆 Email", + "PopUpForm.Email.options.response_email.placeholder": "johndoe@gmail.com", + "PopUpForm.Email.reset_password.options.message.placeholder": "

請點這個連結來認證您的 Email

", + "PopUpForm.Email.reset_password.options.object.placeholder": "請確認這個 %APP_NAME% Email 正不正確", + "PopUpForm.Email.success_register.options.message.placeholder": "

請點這個連結來認證您的 Email

", + "PopUpForm.Email.success_register.options.object.placeholder": "請確認這個 %APP_NAME% Email 正不正確", + "PopUpForm.Email.validation_email.options.message.placeholder": "

請點這個連結來認證您的 Email

", + "PopUpForm.Email.validation_email.options.object.placeholder": "請確認這個 %APP_NAME% Email 正不正確", + "PopUpForm.Providers.callback.placeholder": "TEXT", + "PopUpForm.Providers.enabled.description": "如果停用,使用者將無法使用這個供應商", + "PopUpForm.Providers.enabled.label": "啟動", + "PopUpForm.Providers.facebook.providerConfig.redirectURL": "您應用程式的網址在 Facebook 的設定", + "PopUpForm.Providers.github.providerConfig.redirectURL": "您應用程式的網址在 GitHub 的設定", + "PopUpForm.Providers.google.providerConfig.redirectURL": "您應用程式的網址在 Google 的設定", + "PopUpForm.Providers.key.label": "Client ID", + "PopUpForm.Providers.key.placeholder": "TEXT", + "PopUpForm.Providers.linkedin2.providerConfig.redirectURL": "您應用程式的網址在 Linkedin 的設定", + "PopUpForm.Providers.redirectURL.front-end.label": "您應用程式的網址", + "PopUpForm.Providers.secret.label": "Client Secret", + "PopUpForm.Providers.secret.placeholder": "TEXT", + "PopUpForm.Providers.twitter.providerConfig.redirectURL": "您應用程式的網址在 Twitter 的設定", "PopUpForm.button.cancel": "取消", "PopUpForm.button.save": "儲存", "PopUpForm.header.add.providers": "新增供應商", "PopUpForm.header.edit.email-templates": "編輯 Email 範本", "PopUpForm.header.edit.providers": "編輯 {provider} 供應商", "PopUpForm.inputSelect.providers.label": "選擇供應商", - "PopUpForm.Email.options.from.name.label": "寄件人名稱", - "PopUpForm.Email.options.from.email.label": "寄件人 Email", - "PopUpForm.Email.options.response_email.label": "回覆 Email", - "PopUpForm.Email.options.object.label": "主題", - "PopUpForm.Email.options.message.label": "訊息", - "PopUpForm.Email.validation_email.options.object.placeholder": - "請確認這個 %APP_NAME% Email 正不正確", - "PopUpForm.Email.reset_password.options.object.placeholder": - "請確認這個 %APP_NAME% Email 正不正確", - "PopUpForm.Email.success_register.options.object.placeholder": - "請確認這個 %APP_NAME% Email 正不正確", - "PopUpForm.Email.validation_email.options.message.placeholder": - "

請點這個連結來認證您的 Email

", - "PopUpForm.Email.reset_password.options.message.placeholder": - "

請點這個連結來認證您的 Email

", - "PopUpForm.Email.success_register.options.message.placeholder": - "

請點這個連結來認證您的 Email

", - "PopUpForm.Email.options.from.email.placeholder": "johndoe@gmail.com", - "PopUpForm.Email.options.response_email.placeholder": "johndoe@gmail.com", - "PopUpForm.Email.options.from.name.placeholder": "John Doe", - "PopUpForm.Providers.enabled.label": "啟動", - "PopUpForm.Providers.enabled.description": - "如果停用,使用者將無法使用這個供應商", - "PopUpForm.Providers.key.label": "Client ID", - "PopUpForm.Providers.key.placeholder": "TEXT", - "PopUpForm.Providers.secret.label": "Client Secret", - "PopUpForm.Providers.secret.placeholder": "TEXT", - "PopUpForm.Providers.redirectURL.front-end.label": "您應用程式的網址", - - "PopUpForm.Providers.facebook.providerConfig.redirectURL": - "您應用程式的網址在 Facebook 的設定", - "PopUpForm.Providers.google.providerConfig.redirectURL": - "您應用程式的網址在 Google 的設定", - "PopUpForm.Providers.github.providerConfig.redirectURL": - "您應用程式的網址在 GitHub 的設定", - "PopUpForm.Providers.linkedin2.providerConfig.redirectURL": - "您應用程式的網址在 Linkedin 的設定", - "PopUpForm.Providers.twitter.providerConfig.redirectURL": - "您應用程式的網址在 Twitter 的設定", - - "PopUpForm.Providers.callback.placeholder": "TEXT", - "PopUpForm.Email.email_templates.inputDescription": - "如果您不確定要怎麼使用變數 {link}", - "PopUpForm.Email.link.documentation": "查詢我們的文件" -} + "components.Input.error.password.noMatch": "密碼不相符", + "notification.error.delete": "刪除項目時發生錯誤", + "notification.error.fetch": "讀取資料時發生錯誤", + "notification.error.fetchUser": "讀取使用者資料時發生錯誤", + "notification.info.emailSent": "Email 已寄出", + "notification.success.delete": "項目已刪除", + "notification.success.submit": "設定已更新", + "plugin.description.long": "使用 JWT 認證保護您的 API。這個擴充功能也使用 ACL 來讓你管理不同群組使用者的權限。", + "plugin.description.short": "使用 JWT 認證保護您的 API" +} \ No newline at end of file From 9ae159e093d4ece6f047f04f43edf1f5298c1de8 Mon Sep 17 00:00:00 2001 From: henrych4 Date: Wed, 26 Sep 2018 21:37:14 +0800 Subject: [PATCH 13/81] update node and npm requirement on both github issue template and doc --- .github/ISSUE_TEMPLATE/BUG_REPORT.md | 4 ++-- docs/3.x.x/en/getting-started/installation.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/BUG_REPORT.md b/.github/ISSUE_TEMPLATE/BUG_REPORT.md index c74ee09797..cf23192409 100644 --- a/.github/ISSUE_TEMPLATE/BUG_REPORT.md +++ b/.github/ISSUE_TEMPLATE/BUG_REPORT.md @@ -6,8 +6,8 @@ about: Create a report to help us improve 🤔. - - + + **Informations** diff --git a/docs/3.x.x/en/getting-started/installation.md b/docs/3.x.x/en/getting-started/installation.md index 1ed5fc166d..fa4e3392dd 100644 --- a/docs/3.x.x/en/getting-started/installation.md +++ b/docs/3.x.x/en/getting-started/installation.md @@ -5,8 +5,8 @@ Installation is very easy and only takes a few seconds. ## Requirements Please make sure your computer/server meets the following requirements: - - [Node.js](https://nodejs.org) >= 9: Node.js is a server platform which runs JavaScript. Installation guide [here](https://nodejs.org/en/download/). - - [MongoDB](https://www.mongodb.com/) >= 2.6: MongoDB is a powerful document store. Installation guide [here](https://www.mongodb.com/download-center?j#community). + - [Node.js](https://nodejs.org) >= 10.x: Node.js is a server platform which runs JavaScript. Installation guide [here](https://nodejs.org/en/download/). + - [MongoDB](https://www.mongodb.com/) >= 6.x: MongoDB is a powerful document store. Installation guide [here](https://www.mongodb.com/download-center?j#community). ## Setup From 6f9130179df2e375991fdfebfbe009c32c1afb85 Mon Sep 17 00:00:00 2001 From: henrych4 Date: Thu, 27 Sep 2018 23:54:55 +0800 Subject: [PATCH 14/81] fix typo and add requirements for other databases --- docs/3.x.x/en/getting-started/installation.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/3.x.x/en/getting-started/installation.md b/docs/3.x.x/en/getting-started/installation.md index fa4e3392dd..c782195e92 100644 --- a/docs/3.x.x/en/getting-started/installation.md +++ b/docs/3.x.x/en/getting-started/installation.md @@ -6,7 +6,12 @@ Installation is very easy and only takes a few seconds. Please make sure your computer/server meets the following requirements: - [Node.js](https://nodejs.org) >= 10.x: Node.js is a server platform which runs JavaScript. Installation guide [here](https://nodejs.org/en/download/). - - [MongoDB](https://www.mongodb.com/) >= 6.x: MongoDB is a powerful document store. Installation guide [here](https://www.mongodb.com/download-center?j#community). + - [NPM](https://www.npmjs.com/) >= 6.x: NPM is the package manager for Javascript. Installation guide [here](https://nodejs.org/en/download/). +*(Make sure the database that you are using meets the requirement.)* + - [MongoDB](https://www.mongodb.com/) >= 3.x: MongoDB is a powerful document store. Installation guide [here](https://www.mongodb.com/download-center?j#community). + - [MySQL](https://www.mysql.com/) >= 5.6: MySQL is an open-source relational database management system. Installation guide [here](https://dev.mysql.com/downloads/). + - [MariaDB](https://mariadb.org/) >= 10.1: MarialDB is a fork of MySQL and is guaranteed to stay open source. Installation guide [here](https://mariadb.org/download/). + - [PostgreSQL](https://www.postgresql.org/) >= 10: PostgreSQL is an open-source object-relational database management system. Installation guide [here](https://www.postgresql.org/download/). ## Setup From 6f35b53d3c2fa8430cd8c4dd2b6c5162549fc343 Mon Sep 17 00:00:00 2001 From: Alberto Maturano Date: Thu, 27 Sep 2018 12:54:49 -0500 Subject: [PATCH 15/81] Add execute bit to `server.js` file Without this, #1967 makes no sense. --- packages/strapi-generate-new/files/server.js | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 packages/strapi-generate-new/files/server.js diff --git a/packages/strapi-generate-new/files/server.js b/packages/strapi-generate-new/files/server.js old mode 100644 new mode 100755 From 0994b0514294faff6a552baa3ed92cdc188afed8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=96zg=C3=BCr=20ERSOY?= Date: Thu, 27 Sep 2018 22:53:39 +0300 Subject: [PATCH 16/81] Update TR translations - 2 #1634 --- .../admin/src/translations/tr.json | 1 + .../admin/src/translations/tr.json | 19 ++++++++++++++++--- .../admin/src/translations/tr.json | 5 +++++ .../admin/src/translations/tr.json | 14 ++++++++++++-- 4 files changed, 34 insertions(+), 5 deletions(-) diff --git a/packages/strapi-admin/admin/src/translations/tr.json b/packages/strapi-admin/admin/src/translations/tr.json index 86b2d46078..becc5fb2c6 100644 --- a/packages/strapi-admin/admin/src/translations/tr.json +++ b/packages/strapi-admin/admin/src/translations/tr.json @@ -26,6 +26,7 @@ "app.components.DownloadInfo.download": "İndirme devam ediyor...", "app.components.DownloadInfo.text": "Bu birkaç dakika sürebilir. Sabrınız için teşekkürler.", "app.components.HomePage.button.blog": "BLOG SAYFASINDA DAHA FAZLASINI GÖRÜN", + "app.components.EmptyAttributes.title": "Alan henüz yok", "app.components.HomePage.button.quickStart": "HIZLI BAŞLANGIÇ YAP", "app.components.HomePage.community": "Topluluğumuza ulaşın", "app.components.HomePage.community.content": "Farklı kanallarda takım üyeleri, katkıda bulunanlar ve geliştiricilere ulaşın.", diff --git a/packages/strapi-plugin-content-manager/admin/src/translations/tr.json b/packages/strapi-plugin-content-manager/admin/src/translations/tr.json index 932a17e317..c142ee5e44 100644 --- a/packages/strapi-plugin-content-manager/admin/src/translations/tr.json +++ b/packages/strapi-plugin-content-manager/admin/src/translations/tr.json @@ -3,6 +3,8 @@ "components.AddFilterCTA.add": "Filtreler", "components.AddFilterCTA.hide": "Filtreler", "components.DraggableAttr.edit": "Düzenlemek için tıklayın", + "components.EmptyAttributesBlock.button": "Ayarlar sayfasına git", + "components.EmptyAttributesBlock.description": "Ayarlarınızı değiştirebilirsiniz", "components.FilterOptions.FILTER_TYPES.=": "eşit", "components.FilterOptions.FILTER_TYPES._contains": "içermek", "components.FilterOptions.FILTER_TYPES._containss": "içermek (büyük-küçük harfe duyarlı)", @@ -25,10 +27,13 @@ "components.TableEmpty.withFilters": "Uygulanan filtrelerle {contentType} yoktur...", "components.TableEmpty.withSearch": "Aramaya karşılık gelen {contentType} yoktur ({search})...", "components.TableEmpty.withoutFilter": "{contentType} yoktur...", + "containers.Edit.addAnItem": "Bir öğe ekle...", + "containers.Edit.clickToJump": "Kayıta atlamak için tıklayın", "containers.Edit.delete": "Sil", "containers.Edit.editing": "Düzenleniyor...", "containers.Edit.reset": "Reset", "containers.Edit.returnList": "Listeye dön", + "containers.Edit.seeDetails": "Detaylar", "containers.Edit.submit": "Kaydet", "containers.Home.introduction": "Girişlerinizi düzenlemek için soldaki menüdeki ilgili bağlantıya gidin. Bu eklentinin ayarları düzenlemek için uygun bir yol bulunmamaktadır ve halen aktif geliştirme aşamasındadır.", "containers.Home.pluginHeaderDescription": "Güçlü ve güzel bir arayüz aracılığıyla girişlerinizi yönetin.", @@ -37,12 +42,17 @@ "containers.List.errorFetchRecords": "Hata", "containers.List.pluginHeaderDescription": "{label} kayıt bulundu", "containers.List.pluginHeaderDescription.singular": "{label} kayıt bulundu", + "containers.ListPage.displayedFields": "Görüntülenen Alanlar", "containers.SettingPage.addField": "Yeni alan ekle", + "containers.SettingPage.addRelationalField": "Add new relational field", "containers.SettingPage.attributes": "Nitelik alanları", "containers.SettingPage.attributes.description": "Niteliklerin sırasını tanımlayın", + "containers.SettingPage.editSettings.description": "Yerleşimi oluşturmak için alanları sürükleyip bırakın", + "containers.SettingPage.editSettings.title": "Düzenle - Ayarlar", "containers.SettingPage.listSettings.description": "Bu içerik türü için seçenekleri yapılandırın", "containers.SettingPage.listSettings.title": "Liste — Ayarlar", "containers.SettingPage.pluginHeaderDescription": "Bu İçerik Türü için belirli ayarları yapılandırın", + "containers.SettingPage.relations": "İlişkisel alanlar", "containers.SettingsPage.Block.contentType.description": "Belirli ayarları yapılandırın", "containers.SettingsPage.Block.contentType.title": "İçerik Türleri", "containers.SettingsPage.Block.generalSettings.description": "İçerik Türleriniz için varsayılan seçenekleri yapılandırın", @@ -73,17 +83,20 @@ "error.validation.required": "Zorunlu alandır.", "form.Input.bulkActions": "Toplu işlemleri etkinleştir", "form.Input.defaultSort": "Varsayılan sıralama özelliği", - "form.Input.description": "Description", - "form.Input.description.placeholder": "Display name in the profile", - "form.Input.disabled": "Editable field", + "form.Input.description": "Açıklama", + "form.Input.description.placeholder": "Profildeki görünen ad", + "form.Input.disabled": "Düzenlenebilir alan", "form.Input.filters": "Filtreleri etkinleştir", "form.Input.label": "Etiket", "form.Input.label.inputDescription": "Bu değer, tablonun başında görüntülenen etiketi geçersiz kılar", "form.Input.pageEntries": "Sayfa başına kayıtlar", "form.Input.pageEntries.inputDescription": "Not: Bu değeri İçerik Türü ayarları sayfasında geçersiz kılabilirsiniz..", + "form.Input.placeholder": "Placeholder", + "form.Input.placeholder.placeholder": "Müthiş değerim", "form.Input.search": "Aramayı etkinleştir", "form.Input.search.field": "Bu alanda aramayı etkinleştir", "form.Input.sort.field": "Bu alana göre sıralamayı etkinleştir", + "notification.error.displayedFields": "En az bir görüntülenen alana ihtiyacınız var", "notification.error.relationship.fetch": "İlişki getirme sırasında bir hata oluştu.", "notification.info.SettingPage.disableSort": "Sıralamaya izin verilen tek bir özelliğe sahip olmanız gerekir", "pageNotFound": "Sayfa bulunamadı", diff --git a/packages/strapi-plugin-settings-manager/admin/src/translations/tr.json b/packages/strapi-plugin-settings-manager/admin/src/translations/tr.json index 0eec87ccc0..3ebdb03dae 100644 --- a/packages/strapi-plugin-settings-manager/admin/src/translations/tr.json +++ b/packages/strapi-plugin-settings-manager/admin/src/translations/tr.json @@ -78,6 +78,11 @@ "form.server.item.cron": "Cron", "form.server.item.host": "Sunucu", "form.server.item.port": "Port", + "form.server.item.proxy": "Vekil Sunucu Ayarları", + "form.server.item.proxy.enable": "Vekil Sunucuyu Etkinleştir", + "form.server.item.proxy.host": "Vekil Sunucu", + "form.server.item.proxy.port": "Vekil Sunucu Port", + "form.server.item.proxy.ssl": "Vekil Sunucu SSL", "form.server.name": "Sunucu", "language.af": "Afrikaans", "language.af_NA": "Afrikaans (Namibië)", diff --git a/packages/strapi-plugin-users-permissions/admin/src/translations/tr.json b/packages/strapi-plugin-users-permissions/admin/src/translations/tr.json index beecdbea41..4c908421ef 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/translations/tr.json +++ b/packages/strapi-plugin-users-permissions/admin/src/translations/tr.json @@ -6,7 +6,9 @@ "Auth.form.button.register": "Başlamaya hazır", "Auth.form.button.register-success": "Tekrar gönderin", "Auth.form.button.reset-password": "Şifre değiştir", + "Auth.form.error.blocked": "Hesabınız yönetici tarafından engellendi.", "Auth.form.error.code.provide": "Geçersiz sağlanmış kod.", + "Auth.form.error.confirmed": "Tanımladığınız e-posta onaylanmadı.", "Auth.form.error.email.invalid": "E-postası geçersiz.", "Auth.form.error.email.provide": "Lütfen kullanıcı adınızı veya e-postanızı belirtin.", "Auth.form.error.email.taken": "E-posta zaten alınmış", @@ -17,7 +19,8 @@ "Auth.form.error.password.local": "Bu kullanıcı hiçbir bir şifre belirlemedi; hesap oluşturma sırasında kullanılan sağlayıcı aracılığıyla lütfen giriş yapınız..", "Auth.form.error.password.matching": "Parolalar uyuşmuyor.", "Auth.form.error.password.provide": "Lütfen şifrenizi girin.", - "Auth.form.error.user.not-exist": "Bu e-posta bulunmamaktadır..", + "Auth.form.error.ratelimit": "Çok fazla deneme var. Lütfen bir dakika sonra tekrar deneyin.", + "Auth.form.error.user.not-exist": "Bu e-posta bulunmamaktadır..", "Auth.form.error.username.taken": "Kullanıcı adı zaten alınmış", "Auth.form.forgot-password.email.label": "E-postanızı giriniz", "Auth.form.forgot-password.email.label.success": "E-posta başarıyla gönderildi, ", @@ -52,8 +55,12 @@ "EditForm.inputSelect.subscriptions.description": "Saat başına IP için abone sayısını sınırlayın.", "EditForm.inputSelect.subscriptions.label": "Abonelik kotalarını yönetme", "EditForm.inputToggle.description.email": "Kullanıcıyı, farklı kimlik doğrulama sağlayıcılarıyla aynı e-posta adresini kullanarak birden fazla hesap oluşturmasına izin vermeyin.", + "EditForm.inputToggle.description.email-confirmation": "Etkinleştirildiğinde yeni kayıtlı kullanıcılar bir onay e-postası alır.", + "EditForm.inputToggle.description.email-confirmation-redirection": "E-postanızı onayladıktan sonra, yönlendirileceğiniz yeri seçin.", "EditForm.inputToggle.description.sign-up": "Devre dışı bırakıldığında (KAPALI), kayıt işlemi yasaktır. Artık kullanılan sağlayıcı ne olursa olsun hiç kimse abone olamaz.", "EditForm.inputToggle.label.email": "E-posta adresi başına bir hesap", + "EditForm.inputToggle.label.email-confirmation": "E-posta onayını etkinleştir", + "EditForm.inputToggle.label.email-confirmation-redirection": "Yönlendirme URL'si", "EditForm.inputToggle.label.sign-up": "Kayıtları etkinleştir", "EditPage.cancel": "İptal", "EditPage.form.roles": "Rol detayları", @@ -69,6 +76,7 @@ "EditPage.notification.policies.error": "İlkeler getirilirken bir hata oluştu.", "EditPage.notification.role.error": "Rol getirilirken bir hata oluştu.", "EditPage.submit": "Kaydet", + "Email.template.email_confirmation": "E-posta adresi onayı", "Email.template.reset_password": "Şifreyi yenile", "Email.template.success_register": "Kayıt başarılı", "Email.template.validation_email": "E-posta adresinin doğrulanması", @@ -113,7 +121,8 @@ "PopUpForm.Email.success_register.options.object.placeholder": "Lütfen %APP_NAME% için e-posta adresinizi onaylayın", "PopUpForm.Email.validation_email.options.message.placeholder": "

Hesabınızı doğrulamak için lütfen bu bağlantıyı tıklayın.

", "PopUpForm.Email.validation_email.options.object.placeholder": "Lütfen %APP_NAME% için e-posta adresinizi onaylayın", - "PopUpForm.Providers.callback.placeholder": "METİN", + "PopUpForm.Providers.discord.providerConfig.redirectURL": "Discord uygulama yapılandırmalarınıza eklenecek yönlendirme URL'si", + "PopUpForm.Providers.callback.placeholder": "METİN", "PopUpForm.Providers.enabled.description": "Devre dışı bırakıldıysa kullanıcılar bu sağlayıcıyı kullanamaz.", "PopUpForm.Providers.enabled.label": "Etkinleştirme", "PopUpForm.Providers.facebook.providerConfig.redirectURL": "Facebook uygulama yapılandırmalarınıza eklenecek yönlendirme URL'si", @@ -122,6 +131,7 @@ "PopUpForm.Providers.key.label": "Web istemcisi ID", "PopUpForm.Providers.key.placeholder": "METİN", "PopUpForm.Providers.linkedin2.providerConfig.redirectURL": "Linkedin uygulama yapılandırmalarınıza eklenecek yönlendirme URL'si", + "PopUpForm.Providers.microsoft.providerConfig.redirectURL": "Microsoft uygulama yapılandırmalarınıza eklenecek yönlendirme URL'si", "PopUpForm.Providers.redirectURL.front-end.label": "Arayüz uygulamanızın yönlendirme URL'si", "PopUpForm.Providers.secret.label": "Web istemcisi Secret", "PopUpForm.Providers.secret.placeholder": "METİN", From 77e73cbc19b8d32767b6764cfa2be506f3c394f7 Mon Sep 17 00:00:00 2001 From: Martin Muzatko Date: Fri, 28 Sep 2018 10:19:11 +0200 Subject: [PATCH 17/81] ejected theme for custom modifications --- docs/.vuepress/theme/AlgoliaSearchBox.vue | 131 +++++++++++ docs/.vuepress/theme/AppLink.vue | 32 +++ docs/.vuepress/theme/DropdownLink.vue | 154 ++++++++++++ docs/.vuepress/theme/DropdownTransition.vue | 29 +++ docs/.vuepress/theme/Home.vue | 134 +++++++++++ docs/.vuepress/theme/Layout.vue | 133 +++++++++++ docs/.vuepress/theme/NavLink.vue | 46 ++++ docs/.vuepress/theme/NavLinks.vue | 132 +++++++++++ docs/.vuepress/theme/Navbar.vue | 71 ++++++ docs/.vuepress/theme/NotFound.vue | 26 +++ docs/.vuepress/theme/Page.vue | 207 ++++++++++++++++ docs/.vuepress/theme/SearchBox.vue | 221 ++++++++++++++++++ docs/.vuepress/theme/Sidebar.vue | 104 +++++++++ docs/.vuepress/theme/SidebarButton.vue | 28 +++ docs/.vuepress/theme/SidebarGroup.vue | 63 +++++ docs/.vuepress/theme/SidebarLink.vue | 98 ++++++++ docs/.vuepress/theme/search.svg | 1 + docs/.vuepress/theme/styles/arrow.styl | 22 ++ docs/.vuepress/theme/styles/code.styl | 127 ++++++++++ docs/.vuepress/theme/styles/config.styl | 19 ++ .../.vuepress/theme/styles/custom-blocks.styl | 28 +++ docs/.vuepress/theme/styles/mobile.styl | 37 +++ docs/.vuepress/theme/styles/nprogress.styl | 48 ++++ docs/.vuepress/theme/styles/theme.styl | 208 +++++++++++++++++ docs/.vuepress/theme/styles/toc.styl | 3 + docs/.vuepress/theme/styles/wrapper.styl | 9 + docs/.vuepress/theme/util.js | 218 +++++++++++++++++ 27 files changed, 2329 insertions(+) create mode 100644 docs/.vuepress/theme/AlgoliaSearchBox.vue create mode 100644 docs/.vuepress/theme/AppLink.vue create mode 100644 docs/.vuepress/theme/DropdownLink.vue create mode 100644 docs/.vuepress/theme/DropdownTransition.vue create mode 100644 docs/.vuepress/theme/Home.vue create mode 100644 docs/.vuepress/theme/Layout.vue create mode 100644 docs/.vuepress/theme/NavLink.vue create mode 100644 docs/.vuepress/theme/NavLinks.vue create mode 100644 docs/.vuepress/theme/Navbar.vue create mode 100644 docs/.vuepress/theme/NotFound.vue create mode 100644 docs/.vuepress/theme/Page.vue create mode 100644 docs/.vuepress/theme/SearchBox.vue create mode 100644 docs/.vuepress/theme/Sidebar.vue create mode 100644 docs/.vuepress/theme/SidebarButton.vue create mode 100644 docs/.vuepress/theme/SidebarGroup.vue create mode 100644 docs/.vuepress/theme/SidebarLink.vue create mode 100644 docs/.vuepress/theme/search.svg create mode 100644 docs/.vuepress/theme/styles/arrow.styl create mode 100644 docs/.vuepress/theme/styles/code.styl create mode 100644 docs/.vuepress/theme/styles/config.styl create mode 100644 docs/.vuepress/theme/styles/custom-blocks.styl create mode 100644 docs/.vuepress/theme/styles/mobile.styl create mode 100644 docs/.vuepress/theme/styles/nprogress.styl create mode 100644 docs/.vuepress/theme/styles/theme.styl create mode 100644 docs/.vuepress/theme/styles/toc.styl create mode 100644 docs/.vuepress/theme/styles/wrapper.styl create mode 100644 docs/.vuepress/theme/util.js diff --git a/docs/.vuepress/theme/AlgoliaSearchBox.vue b/docs/.vuepress/theme/AlgoliaSearchBox.vue new file mode 100644 index 0000000000..c27f1bbdda --- /dev/null +++ b/docs/.vuepress/theme/AlgoliaSearchBox.vue @@ -0,0 +1,131 @@ + + + + + diff --git a/docs/.vuepress/theme/AppLink.vue b/docs/.vuepress/theme/AppLink.vue new file mode 100644 index 0000000000..190096be99 --- /dev/null +++ b/docs/.vuepress/theme/AppLink.vue @@ -0,0 +1,32 @@ + + + diff --git a/docs/.vuepress/theme/DropdownLink.vue b/docs/.vuepress/theme/DropdownLink.vue new file mode 100644 index 0000000000..7c8efb4e13 --- /dev/null +++ b/docs/.vuepress/theme/DropdownLink.vue @@ -0,0 +1,154 @@ + + + + + diff --git a/docs/.vuepress/theme/DropdownTransition.vue b/docs/.vuepress/theme/DropdownTransition.vue new file mode 100644 index 0000000000..abad7ead54 --- /dev/null +++ b/docs/.vuepress/theme/DropdownTransition.vue @@ -0,0 +1,29 @@ + + + + + diff --git a/docs/.vuepress/theme/Home.vue b/docs/.vuepress/theme/Home.vue new file mode 100644 index 0000000000..e6817e1619 --- /dev/null +++ b/docs/.vuepress/theme/Home.vue @@ -0,0 +1,134 @@ + + + + + diff --git a/docs/.vuepress/theme/Layout.vue b/docs/.vuepress/theme/Layout.vue new file mode 100644 index 0000000000..7b422a41fa --- /dev/null +++ b/docs/.vuepress/theme/Layout.vue @@ -0,0 +1,133 @@ + + + + + + diff --git a/docs/.vuepress/theme/NavLink.vue b/docs/.vuepress/theme/NavLink.vue new file mode 100644 index 0000000000..01add321f5 --- /dev/null +++ b/docs/.vuepress/theme/NavLink.vue @@ -0,0 +1,46 @@ + + + diff --git a/docs/.vuepress/theme/NavLinks.vue b/docs/.vuepress/theme/NavLinks.vue new file mode 100644 index 0000000000..f29ee0acd5 --- /dev/null +++ b/docs/.vuepress/theme/NavLinks.vue @@ -0,0 +1,132 @@ + + + + + diff --git a/docs/.vuepress/theme/Navbar.vue b/docs/.vuepress/theme/Navbar.vue new file mode 100644 index 0000000000..f4a9002a37 --- /dev/null +++ b/docs/.vuepress/theme/Navbar.vue @@ -0,0 +1,71 @@ + + + + + diff --git a/docs/.vuepress/theme/NotFound.vue b/docs/.vuepress/theme/NotFound.vue new file mode 100644 index 0000000000..6aefe797c4 --- /dev/null +++ b/docs/.vuepress/theme/NotFound.vue @@ -0,0 +1,26 @@ + + + diff --git a/docs/.vuepress/theme/Page.vue b/docs/.vuepress/theme/Page.vue new file mode 100644 index 0000000000..17957e7563 --- /dev/null +++ b/docs/.vuepress/theme/Page.vue @@ -0,0 +1,207 @@ + + + + + diff --git a/docs/.vuepress/theme/SearchBox.vue b/docs/.vuepress/theme/SearchBox.vue new file mode 100644 index 0000000000..bf73b44569 --- /dev/null +++ b/docs/.vuepress/theme/SearchBox.vue @@ -0,0 +1,221 @@ + + + + + diff --git a/docs/.vuepress/theme/Sidebar.vue b/docs/.vuepress/theme/Sidebar.vue new file mode 100644 index 0000000000..61e52a0bf7 --- /dev/null +++ b/docs/.vuepress/theme/Sidebar.vue @@ -0,0 +1,104 @@ + + + + + diff --git a/docs/.vuepress/theme/SidebarButton.vue b/docs/.vuepress/theme/SidebarButton.vue new file mode 100644 index 0000000000..0a22243456 --- /dev/null +++ b/docs/.vuepress/theme/SidebarButton.vue @@ -0,0 +1,28 @@ + + + diff --git a/docs/.vuepress/theme/SidebarGroup.vue b/docs/.vuepress/theme/SidebarGroup.vue new file mode 100644 index 0000000000..c2f0655ee9 --- /dev/null +++ b/docs/.vuepress/theme/SidebarGroup.vue @@ -0,0 +1,63 @@ + + + + + diff --git a/docs/.vuepress/theme/SidebarLink.vue b/docs/.vuepress/theme/SidebarLink.vue new file mode 100644 index 0000000000..6aaef95188 --- /dev/null +++ b/docs/.vuepress/theme/SidebarLink.vue @@ -0,0 +1,98 @@ + + + diff --git a/docs/.vuepress/theme/search.svg b/docs/.vuepress/theme/search.svg new file mode 100644 index 0000000000..03d83913e8 --- /dev/null +++ b/docs/.vuepress/theme/search.svg @@ -0,0 +1 @@ + diff --git a/docs/.vuepress/theme/styles/arrow.styl b/docs/.vuepress/theme/styles/arrow.styl new file mode 100644 index 0000000000..20bffc0dc8 --- /dev/null +++ b/docs/.vuepress/theme/styles/arrow.styl @@ -0,0 +1,22 @@ +@require './config' + +.arrow + display inline-block + width 0 + height 0 + &.up + border-left 4px solid transparent + border-right 4px solid transparent + border-bottom 6px solid $arrowBgColor + &.down + border-left 4px solid transparent + border-right 4px solid transparent + border-top 6px solid $arrowBgColor + &.right + border-top 4px solid transparent + border-bottom 4px solid transparent + border-left 6px solid $arrowBgColor + &.left + border-top 4px solid transparent + border-bottom 4px solid transparent + border-right 6px solid $arrowBgColor diff --git a/docs/.vuepress/theme/styles/code.styl b/docs/.vuepress/theme/styles/code.styl new file mode 100644 index 0000000000..fb5a8037f0 --- /dev/null +++ b/docs/.vuepress/theme/styles/code.styl @@ -0,0 +1,127 @@ +@require './config' + +.content + code + color lighten($textColor, 20%) + padding 0.25rem 0.5rem + margin 0 + font-size 0.85em + background-color rgba(27,31,35,0.05) + border-radius 3px + +.content + pre, pre[class*="language-"] + line-height 1.4 + padding 1.25rem 1.5rem + margin 0.85rem 0 + background transparent + overflow auto + code + color #fff + padding 0 + background-color transparent + border-radius 0 + +div[class*="language-"] + position relative + background-color $codeBgColor + border-radius 6px + .highlight-lines + user-select none + padding-top 1.3rem + position absolute + top 0 + left 0 + width 100% + line-height 1.4 + .highlighted + background-color rgba(0, 0, 0, 66%) + pre + position relative + z-index 1 + &::before + position absolute + z-index 3 + top 0.8em + right 1em + font-size 0.75rem + color rgba(255, 255, 255, 0.4) + &:not(.line-numbers-mode) + .line-numbers-wrapper + display none + &.line-numbers-mode + .highlight-lines .highlighted + position relative + &:before + content ' ' + position absolute + z-index 3 + left 0 + top 0 + display block + width $lineNumbersWrapperWidth + height 100% + background-color rgba(0, 0, 0, 66%) + pre + padding-left $lineNumbersWrapperWidth + 1 rem + vertical-align middle + .line-numbers-wrapper + position absolute + top 0 + width $lineNumbersWrapperWidth + text-align center + color rgba(255, 255, 255, 0.3) + padding 1.25rem 0 + line-height 1.4 + br + user-select none + .line-number + position relative + z-index 4 + user-select none + font-size 0.85em + &::after + content '' + position absolute + z-index 2 + top 0 + left 0 + width $lineNumbersWrapperWidth + height 100% + border-radius 6px 0 0 6px + border-right 1px solid rgba(0, 0, 0, 66%) + background-color $codeBgColor + + +for lang in js ts html md vue css sass scss less stylus go java c sh yaml + div{'[class~="language-' + lang + '"]'} + &:before + content ('' + lang) + +div[class~="language-javascript"] + &:before + content "js" + +div[class~="language-typescript"] + &:before + content "ts" + +div[class~="language-markup"] + &:before + content "html" + +div[class~="language-markdown"] + &:before + content "md" + +div[class~="language-json"]:before + content "json" + +div[class~="language-ruby"]:before + content "rb" + +div[class~="language-python"]:before + content "py" + +div[class~="language-bash"]:before + content "sh" diff --git a/docs/.vuepress/theme/styles/config.styl b/docs/.vuepress/theme/styles/config.styl new file mode 100644 index 0000000000..d7db7a3ad1 --- /dev/null +++ b/docs/.vuepress/theme/styles/config.styl @@ -0,0 +1,19 @@ +// colors +$accentColor = #2F80ED +$textColor = #2c3e50 +$borderColor = #eaecef +$codeBgColor = #282c34 +$arrowBgColor = #ccc + +// layout +$navbarHeight = 3.6rem +$sidebarWidth = 20rem +$contentWidth = 740px + +// responsive breakpoints +$MQNarrow = 959px +$MQMobile = 719px +$MQMobileNarrow = 419px + +// code +$lineNumbersWrapperWidth = 3.5rem diff --git a/docs/.vuepress/theme/styles/custom-blocks.styl b/docs/.vuepress/theme/styles/custom-blocks.styl new file mode 100644 index 0000000000..3ccc2df2a2 --- /dev/null +++ b/docs/.vuepress/theme/styles/custom-blocks.styl @@ -0,0 +1,28 @@ +.custom-block + .custom-block-title + font-weight 600 + margin-bottom -0.4rem + &.tip, &.warning, &.danger + padding .1rem 1.5rem + border-left-width .5rem + border-left-style solid + margin 1rem 0 + &.tip + background-color #f3f5f7 + border-color #42b983 + &.warning + background-color rgba(255,229,100,.3) + border-color darken(#ffe564, 35%) + color darken(#ffe564, 70%) + .custom-block-title + color darken(#ffe564, 50%) + a + color $textColor + &.danger + background-color #ffe6e6 + border-color darken(red, 20%) + color darken(red, 70%) + .custom-block-title + color darken(red, 40%) + a + color $textColor diff --git a/docs/.vuepress/theme/styles/mobile.styl b/docs/.vuepress/theme/styles/mobile.styl new file mode 100644 index 0000000000..b35e59c588 --- /dev/null +++ b/docs/.vuepress/theme/styles/mobile.styl @@ -0,0 +1,37 @@ +@require './config' + +$mobileSidebarWidth = $sidebarWidth * 0.82 + +// narrow desktop / iPad +@media (max-width: $MQNarrow) + .sidebar + font-size 15px + width $mobileSidebarWidth + .page + padding-left $mobileSidebarWidth + +// wide mobile +@media (max-width: $MQMobile) + .sidebar + top 0 + padding-top $navbarHeight + transform translateX(-100%) + transition transform .2s ease + .page + padding-left 0 + .theme-container + &.sidebar-open + .sidebar + transform translateX(0) + &.no-navbar + .sidebar + padding-top: 0 + +// narrow mobile +@media (max-width: $MQMobileNarrow) + h1 + font-size 1.9rem + .content + div[class*="language-"] + margin 0.85rem -1.5rem + border-radius 0 diff --git a/docs/.vuepress/theme/styles/nprogress.styl b/docs/.vuepress/theme/styles/nprogress.styl new file mode 100644 index 0000000000..f186a67ec3 --- /dev/null +++ b/docs/.vuepress/theme/styles/nprogress.styl @@ -0,0 +1,48 @@ +#nprogress + pointer-events none + .bar + background $accentColor + position fixed + z-index 1031 + top 0 + left 0 + width 100% + height 2px + .peg + display block + position absolute + right 0px + width 100px + height 100% + box-shadow 0 0 10px $accentColor, 0 0 5px $accentColor + opacity 1.0 + transform rotate(3deg) translate(0px, -4px) + .spinner + display block + position fixed + z-index 1031 + top 15px + right 15px + .spinner-icon + width 18px + height 18px + box-sizing border-box + border solid 2px transparent + border-top-color $accentColor + border-left-color $accentColor + border-radius 50% + animation nprogress-spinner 400ms linear infinite + +.nprogress-custom-parent + overflow hidden + position relative + +.nprogress-custom-parent #nprogress .spinner, +.nprogress-custom-parent #nprogress .bar + position absolute + +@keyframes nprogress-spinner + 0% + transform rotate(0deg) + 100% + transform rotate(360deg) diff --git a/docs/.vuepress/theme/styles/theme.styl b/docs/.vuepress/theme/styles/theme.styl new file mode 100644 index 0000000000..211aaa3d4b --- /dev/null +++ b/docs/.vuepress/theme/styles/theme.styl @@ -0,0 +1,208 @@ +@require './config' +@require './nprogress' +@require './code' +@require './custom-blocks' +@require './arrow' +@require './wrapper' +@require './toc' + +html, body + padding 0 + margin 0 + +body + font-family -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif + -webkit-font-smoothing antialiased + -moz-osx-font-smoothing grayscale + font-size 16px + color $textColor + +.intro + text-align center + font-size 1.15em + margin 0 2em + +// hide outboundlinks for shields +a img + svg + display none !important + +.text-center + text-align center + +.flex + display flex + +.justify-around + justify-content space-around + +.page + padding-left $sidebarWidth + +.navbar + position fixed + z-index 20 + top 0 + left 0 + right 0 + height $navbarHeight + background-color #fff + box-sizing border-box + border-bottom 1px solid $borderColor + +.sidebar-mask + position fixed + z-index 9 + top 0 + left 0 + width 100vw + height 100vh + display none + +.sidebar + font-size 15px + background-color #fff + width $sidebarWidth + position fixed + z-index 10 + margin 0 + top $navbarHeight + left 0 + bottom 0 + box-sizing border-box + border-right 1px solid $borderColor + overflow-y auto + +.content:not(.custom) + @extend $wrapper + > *:first-child + margin-top $navbarHeight + a:hover + text-decoration underline + p.demo + padding 1rem 1.5rem + border 1px solid #ddd + border-radius 4px + img + max-width 100% + +.content.custom + padding 0 + margin 0 + img + max-width 100% + +a + font-weight 500 + color $accentColor + text-decoration none + +p a code + font-weight 400 + color $accentColor + +kbd + background #eee + border solid 0.15rem #ddd + border-bottom solid 0.25rem #ddd + border-radius 0.15rem + padding 0 0.15em + +blockquote + font-size 1.2rem + color #999 + border-left .25rem solid #dfe2e5 + margin-left 0 + padding-left 1rem + +ul, ol + padding-left 1.2em + +strong + font-weight 600 + +h1, h2, h3, h4, h5, h6 + font-weight 600 + line-height 1.25 + .content:not(.custom) > & + margin-top (0.5rem - $navbarHeight) + padding-top ($navbarHeight + 1rem) + margin-bottom 0 + &:first-child + margin-top -1.5rem + margin-bottom 1rem + + p, + pre, + .custom-block + margin-top 2rem + &:hover .header-anchor + opacity: 1 + +h1 + font-size 2.2rem + +h2 + font-size 1.65rem + padding-bottom .3rem + border-bottom 1px solid $borderColor + +h3 + font-size 1.35rem + +a.header-anchor + font-size 0.85em + float left + margin-left -0.87em + padding-right 0.23em + margin-top 0.125em + opacity 0 + &:hover + text-decoration none + +code, kbd, .line-number + font-family source-code-pro, Menlo, Monaco, Consolas, "Courier New", monospace + +p, ul, ol + line-height 1.7 + +hr + border 0 + border-top 1px solid $borderColor + +table + border-collapse collapse + margin 1rem 0 + display: block + overflow-x: auto + +tr + border-top 1px solid #dfe2e5 + &:nth-child(2n) + background-color #f6f8fa + +th, td + border 1px solid #dfe2e5 + padding .6em 1em + +.custom-layout + padding-top $navbarHeight + +.theme-container + &.sidebar-open + .sidebar-mask + display: block + &.no-navbar + .content:not(.custom) > h1, h2, h3, h4, h5, h6 + margin-top 1.5rem + padding-top 0 + .sidebar + top 0 + .custom-layout + padding-top 0 + + +@media (min-width: ($MQMobile + 1px)) + .theme-container.no-sidebar + .sidebar + display none + .page + padding-left 0 + +@require './mobile.styl' diff --git a/docs/.vuepress/theme/styles/toc.styl b/docs/.vuepress/theme/styles/toc.styl new file mode 100644 index 0000000000..d3e71069ba --- /dev/null +++ b/docs/.vuepress/theme/styles/toc.styl @@ -0,0 +1,3 @@ +.table-of-contents + .badge + vertical-align middle diff --git a/docs/.vuepress/theme/styles/wrapper.styl b/docs/.vuepress/theme/styles/wrapper.styl new file mode 100644 index 0000000000..a99262c71a --- /dev/null +++ b/docs/.vuepress/theme/styles/wrapper.styl @@ -0,0 +1,9 @@ +$wrapper + max-width $contentWidth + margin 0 auto + padding 2rem 2.5rem + @media (max-width: $MQNarrow) + padding 2rem + @media (max-width: $MQMobileNarrow) + padding 1.5rem + diff --git a/docs/.vuepress/theme/util.js b/docs/.vuepress/theme/util.js new file mode 100644 index 0000000000..0908f68649 --- /dev/null +++ b/docs/.vuepress/theme/util.js @@ -0,0 +1,218 @@ +export const hashRE = /#.*$/ +export const extRE = /\.(md|html)$/ +export const endingSlashRE = /\/$/ +export const outboundRE = /^(https?:|mailto:|tel:)/ + +export function normalize (path) { + return path + .replace(hashRE, '') + .replace(extRE, '') +} + +export function getHash (path) { + const match = path.match(hashRE) + if (match) { + return match[0] + } +} + +export function isExternal (path) { + return outboundRE.test(path) +} + +export function isMailto (path) { + return /^mailto:/.test(path) +} + +export function isTel (path) { + return /^tel:/.test(path) +} + +export function ensureExt (path) { + if (isExternal(path)) { + return path + } + const hashMatch = path.match(hashRE) + const hash = hashMatch ? hashMatch[0] : '' + const normalized = normalize(path) + + if (endingSlashRE.test(normalized)) { + return path + } + return normalized + '.html' + hash +} + +export function isActive (route, path) { + const routeHash = route.hash + const linkHash = getHash(path) + if (linkHash && routeHash !== linkHash) { + return false + } + const routePath = normalize(route.path) + const pagePath = normalize(path) + return routePath === pagePath +} + +export function resolvePage (pages, rawPath, base) { + if (rawPath.includes('http')) return { + type: 'external-link', + path: rawPath + } + if (base) rawPath = resolvePath(rawPath, base) + const path = normalize(rawPath) + for (let i = 0; i < pages.length; i++) { + if (normalize(pages[i].path) === path) { + return Object.assign({}, pages[i], { + type: 'page', + path: ensureExt(rawPath) + }) + } + } + console.error(`[vuepress] No matching page found for sidebar item "${rawPath}"`) + return {} +} + +function resolvePath (relative, base, append) { + const firstChar = relative.charAt(0) + if (firstChar === '/') { + return relative + } + + if (firstChar === '?' || firstChar === '#') { + return base + relative + } + + const stack = base.split('/') + + // remove trailing segment if: + // - not appending + // - appending to trailing slash (last segment is empty) + if (!append || !stack[stack.length - 1]) { + stack.pop() + } + + // resolve relative path + const segments = relative.replace(/^\//, '').split('/') + for (let i = 0; i < segments.length; i++) { + const segment = segments[i] + if (segment === '..') { + stack.pop() + } else if (segment !== '.') { + stack.push(segment) + } + } + + // ensure leading slash + if (stack[0] !== '') { + stack.unshift('') + } + + return stack.join('/') +} + +export function resolveSidebarItems (page, route, site, localePath) { + const { pages, themeConfig } = site + + const localeConfig = localePath && themeConfig.locales + ? themeConfig.locales[localePath] || themeConfig + : themeConfig + + const pageSidebarConfig = page.frontmatter.sidebar || localeConfig.sidebar || themeConfig.sidebar + if (pageSidebarConfig === 'auto') { + return resolveHeaders(page) + } + + const sidebarConfig = localeConfig.sidebar || themeConfig.sidebar + if (!sidebarConfig) { + return [] + } else { + const { base, config } = resolveMatchingConfig(route, sidebarConfig) + return config + ? config.map(item => resolveItem(item, pages, base)) + : [] + } +} + +function resolveHeaders (page) { + const headers = groupHeaders(page.headers || []) + return [{ + type: 'group', + collapsable: false, + title: page.title, + children: headers.map(h => ({ + type: 'auto', + title: h.title, + basePath: page.path, + path: page.path + '#' + h.slug, + children: h.children || [] + })) + }] +} + +export function groupHeaders (headers) { + // group h3s under h2 + headers = headers.map(h => Object.assign({}, h)) + let lastH2 + headers.forEach(h => { + if (h.level === 2) { + lastH2 = h + } else if (lastH2) { + (lastH2.children || (lastH2.children = [])).push(h) + } + }) + return headers.filter(h => h.level === 2) +} + +export function resolveNavLinkItem (linkItem) { + return Object.assign(linkItem, { + type: linkItem.items && linkItem.items.length ? 'links' : 'link' + }) +} + +export function resolveMatchingConfig (route, config) { + if (Array.isArray(config)) { + return { + base: '/', + config: config + } + } + for (const base in config) { + if (ensureEndingSlash(route.path).indexOf(base) === 0) { + return { + base, + config: config[base] + } + } + } + return {} +} + +function ensureEndingSlash (path) { + return /(\.html|\/)$/.test(path) + ? path + : path + '/' +} + +function resolveItem (item, pages, base, isNested) { + if (typeof item === 'string') { + return resolvePage(pages, item, base) + } else if (Array.isArray(item)) { + return Object.assign(resolvePage(pages, item[0], base), { + title: item[1] + }) + } else { + if (isNested) { + console.error( + '[vuepress] Nested sidebar groups are not supported. ' + + 'Consider using navbar + categories instead.' + ) + } + const children = item.children || [] + return { + type: 'group', + title: item.title, + children: children.map(child => resolveItem(child, pages, base, true)), + collapsable: item.collapsable !== false + } + } +} From add86f25978b3fb111d7583754fb952ff04ee34a Mon Sep 17 00:00:00 2001 From: Martin Muzatko Date: Fri, 28 Sep 2018 10:20:08 +0200 Subject: [PATCH 18/81] added sidebar config and custom markdown directives --- docs/.vuepress/config.js | 128 +++++++++++++++++++++++++-------------- docs/package.json | 4 ++ 2 files changed, 86 insertions(+), 46 deletions(-) diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index 910a12d1db..e930b13c73 100644 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -1,50 +1,86 @@ +const container = require('markdown-it-container') + module.exports = { + markdown: { + anchor: { + permalink: false, + }, + config: md => { + md + .use(require('markdown-it-decorate')) + .use(...createContainer('intro')) + } + }, + title: 'Strapi Docs', + description: 'API creation made simple, secure and fast.', themeConfig: { - sidebar: [ - '/3.x.x/en/', - { - title: 'advanced', - children: [ - '/3.x.x/en/advanced/customize-admin', - '/3.x.x/en/advanced/hooks', - '/3.x.x/en/advanced/logging', - '/3.x.x/en/advanced/middlewares', - '/3.x.x/en/advanced/usage-tracking', - ] - }, - { - title: 'api-reference', - children: [ - '/3.x.x/en/api-reference/reference', - ] - }, - '/3.x.x/en/cli/CLI', - '/3.x.x/en/concepts/concepts', - '/3.x.x/en/configurations/configurations', - { - title: 'Getting started', - children: [ - '/3.x.x/en/getting-started/installation', - '/3.x.x/en/getting-started/quick-start', - ] - }, - { - title: 'Guides', - children: [ - '/3.x.x/en/guides/authentication', - '/3.x.x/en/guides/controllers', - '/3.x.x/en/guides/deployment', - '/3.x.x/en/guides/email', - '/3.x.x/en/guides/filters', - '/3.x.x/en/guides/graphql', - '/3.x.x/en/guides/i18n', - '/3.x.x/en/guides/models', - '/3.x.x/en/guides/policies', - '/3.x.x/en/guides/public-assets', - '/3.x.x/en/guides/requests', - '/3.x.x/en/guides/requests', - ] - }, - ], + // base: '/', + // host: 'localhost', + serviceWorker: true, + sidebar: { + '/3.x.x/': [ + { + collapsable: false, + title: 'UsefulLinks', + children: [ + ['/3.x.x/', 'Introduction'], + ['https://strapi.io', 'Strapi Website'], + ['https://github.com/strapi/strapi', 'GitHub Repository'], + ['https://github.com/strapi/strapi/blob/master/CONTRIBUTING.md', 'Contribution Guide'], + ], + }, + { + collapsable: false, + title: 'advanced', + children: [ + '/3.x.x/advanced/customize-admin', + '/3.x.x/advanced/hooks', + '/3.x.x/advanced/logging', + '/3.x.x/advanced/middlewares', + '/3.x.x/advanced/usage-tracking', + ], + }, + '/3.x.x/api-reference/reference', + '/3.x.x/cli/CLI', + '/3.x.x/concepts/concepts', + '/3.x.x/configurations/configurations', + { + collapsable: false, + title: 'Getting started', + children: ['/3.x.x/getting-started/installation', '/3.x.x/getting-started/quick-start'], + }, + { + collapsable: false, + title: 'Guides', + children: [ + '/3.x.x/guides/authentication', + '/3.x.x/guides/controllers', + '/3.x.x/guides/deployment', + '/3.x.x/guides/email', + '/3.x.x/guides/filters', + '/3.x.x/guides/graphql', + '/3.x.x/guides/i18n', + '/3.x.x/guides/models', + '/3.x.x/guides/policies', + '/3.x.x/guides/public-assets', + '/3.x.x/guides/requests', + '/3.x.x/guides/requests', + ], + }, + ], + }, }, } + +function createContainer(className) { + return [container, className, { + render(tokens, idx) { + const token = tokens[idx] + if (token.nesting === 1) { + return `
\n` + } else { + return `
\n` + } + } + }] +} diff --git a/docs/package.json b/docs/package.json index 149e5d6cc0..9fbfe0f51e 100644 --- a/docs/package.json +++ b/docs/package.json @@ -10,6 +10,10 @@ "license": "ISC", "dependencies": { "directory-tree": "^2.1.0", + "markdown-it-decorate": "^1.2.2", "vuepress": "^0.14.2" + }, + "devDependencies": { + "markdown-it-container": "^2.0.0" } } From ab310dd1dbea83f618f56f845fd0d11ee1172849 Mon Sep 17 00:00:00 2001 From: Martin Muzatko Date: Fri, 28 Sep 2018 11:04:07 +0200 Subject: [PATCH 19/81] added version selector --- docs/.vuepress/config.js | 44 +++++++++++++++++++++++++- docs/.vuepress/theme/Layout.vue | 16 +++++++++- docs/.vuepress/theme/styles/theme.styl | 14 ++++++++ 3 files changed, 72 insertions(+), 2 deletions(-) diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index e930b13c73..c5ab8362c3 100644 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -14,6 +14,14 @@ module.exports = { title: 'Strapi Docs', description: 'API creation made simple, secure and fast.', themeConfig: { + versions: [ + ['Version 3.x.x', '/3.x.x/'], + ['Version 1.x.x', '/1.x.x/'], + ], + repo: 'strapi/strapi', + docsDir: 'docs', + editLinks: true, + editLinkText: 'Improve this page', // base: '/', // host: 'localhost', serviceWorker: true, @@ -31,7 +39,7 @@ module.exports = { }, { collapsable: false, - title: 'advanced', + title: 'Advanced', children: [ '/3.x.x/advanced/customize-admin', '/3.x.x/advanced/hooks', @@ -68,6 +76,40 @@ module.exports = { ], }, ], + '/1.x.x/': [ + { + collapsable: false, + title: 'UsefulLinks', + children: [ + ['/1.x.x/', 'Introduction'], + ['https://strapi.io', 'Strapi Website'], + ['https://github.com/strapi/strapi', 'GitHub Repository'], + ['https://github.com/strapi/strapi/blob/master/CONTRIBUTING.md', 'Contribution Guide'], + ], + }, + '/1.x.x/admin.md', + '/1.x.x/configuration.md', + '/1.x.x/email.md', + '/1.x.x/introduction.md', + '/1.x.x/queries.md', + '/1.x.x/response.md', + '/1.x.x/sessions.md', + '/1.x.x/testing.md', + '/1.x.x/views.md', + '/1.x.x/blueprints.md', + '/1.x.x/context.md', + '/1.x.x/graphql.md', + '/1.x.x/logging.md', + '/1.x.x/router.md', + '/1.x.x/upload.md', + '/1.x.x/cli.md', + '/1.x.x/customization.md', + '/1.x.x/internationalization.md', + '/1.x.x/models.md', + '/1.x.x/request.md', + '/1.x.x/services.md', + '/1.x.x/users.md', + ], }, }, } diff --git a/docs/.vuepress/theme/Layout.vue b/docs/.vuepress/theme/Layout.vue index 7b422a41fa..f15c97bb11 100644 --- a/docs/.vuepress/theme/Layout.vue +++ b/docs/.vuepress/theme/Layout.vue @@ -6,7 +6,11 @@ - +
+ +
@@ -38,6 +42,13 @@ export default { }, computed: { + versions() { + const { themeConfig } = this.$site + return themeConfig.versions.map(version => ({ + name: version[0], + path: version[1], + })) + }, shouldShowNavbar () { const { themeConfig } = this.$site const { frontmatter } = this.$page @@ -104,6 +115,9 @@ export default { }, methods: { + changeVersion(to) { + this.$router.push(to) + }, toggleSidebar (to) { this.isSidebarOpen = typeof to === 'boolean' ? to : !this.isSidebarOpen }, diff --git a/docs/.vuepress/theme/styles/theme.styl b/docs/.vuepress/theme/styles/theme.styl index 211aaa3d4b..c3165711a4 100644 --- a/docs/.vuepress/theme/styles/theme.styl +++ b/docs/.vuepress/theme/styles/theme.styl @@ -26,6 +26,20 @@ body a img + svg display none !important +.version-selector + margin 1em 1em 0 1.5em + color lighten($textColor, 25%) + display block + border 1px solid darken($borderColor, 10%) + font-size .9rem + line-height 2rem + padding .5em 1rem .5em 1em + outline none + transition all .2s ease + &:focus + cursor auto + border-color $accentColor + .text-center text-align center From 7376e49827a8c2ee2af799658ddd1aee96e4d45b Mon Sep 17 00:00:00 2001 From: Martin Muzatko Date: Fri, 28 Sep 2018 11:04:40 +0200 Subject: [PATCH 20/81] fixed some broken docs in v1 --- docs/.vuepress/config.js | 2 +- docs/1.x.x/README.md | 14 ++++++++------ docs/3.x.x/README.md | 5 ++++- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index c5ab8362c3..e02c495b5d 100644 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -3,7 +3,7 @@ const container = require('markdown-it-container') module.exports = { markdown: { anchor: { - permalink: false, + permalink: true, }, config: md => { md diff --git a/docs/1.x.x/README.md b/docs/1.x.x/README.md index 81fb51d86b..f1c9496438 100644 --- a/docs/1.x.x/README.md +++ b/docs/1.x.x/README.md @@ -1,8 +1,11 @@ -# Strapi [![Build Status](https://travis-ci.org/wistityhq/strapi.svg?branch=master)](https://travis-ci.org/wistityhq/strapi) [![Slack Status](http://strapi-slack.herokuapp.com/badge.svg)](http://slack.strapi.io) +::: intro +# Strapi -[Website](http://strapi.io/) - [Getting Started](#user-content-getting-started-in-a-minute) - [Documentation](http://strapi.io/documentation/introduction) - [Support](http://strapi.io/support) +[![Build Status](https://travis-ci.org/wistityhq/strapi.svg?branch=master)](https://travis-ci.org/wistityhq/strapi) +[![Slack Status](http://strapi-slack.herokuapp.com/badge.svg)](http://slack.strapi.io) Strapi is an open-source Node.js rich framework for building applications and services. +::: Strapi enables developers to focus on writing reusable application logic instead of spending time building infrastructure. It is designed for building practical, production-ready Node.js applications @@ -111,11 +114,10 @@ Strapi comes with a simple but yet powerful dashboard. ## Resources -- [Roadmap](ROADMAP.md) -- [Contributing guide](CONTRIBUTING.md) -- [MIT License](LICENSE.md) +- [Contributing guide]((https://github.com/strapi/strapi/blob/master/CONTRIBUTING.md)) +- [MIT License]((https://github.com/strapi/strapi/blob/master/LICENSE.md)) ## Links -- [Strapi website](http://strapi.io/) +- [Strapi website](https://strapi.io/) - [Strapi news on Twitter](https://twitter.com/strapijs) diff --git a/docs/3.x.x/README.md b/docs/3.x.x/README.md index bf918349dd..04c5d1f289 100644 --- a/docs/3.x.x/README.md +++ b/docs/3.x.x/README.md @@ -1,4 +1,5 @@ -![Logo](https://cldup.com/7umchwdUBh.png) +::: intro +![Logo](https://cldup.com/7umchwdUBh.png) ### API creation made simple, secure and fast. The most advanced open-source Content Management Framework to build powerful API with no effort. @@ -8,6 +9,8 @@ The most advanced open-source Content Management Framework to build powerful API [![Build status](https://travis-ci.org/strapi/strapi.svg?branch=master)](https://travis-ci.org/strapi/strapi) [![Slack status](http://strapi-slack.herokuapp.com/badge.svg)](http://slack.strapi.io) [![Heroku Deploy](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy?template=https://github.com/strapi/strapi-heroku-app) + +::: ## v3@alpha.13 is available! We've been working on a major update for Strapi during the past months, rewriting the core framework and the dashboard. From a9951fbe84692eb6ea89f28734b9b990b50d95a9 Mon Sep 17 00:00:00 2001 From: Martin Muzatko Date: Fri, 28 Sep 2018 11:05:35 +0200 Subject: [PATCH 21/81] added redirect to latest version on docs homepage --- docs/README.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 docs/README.md diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000000..b2d26aed7d --- /dev/null +++ b/docs/README.md @@ -0,0 +1,5 @@ +--- +meta: + - http-equiv: refresh + content: 0;url=/3.x.x/ +--- From 03fc2e1f0e2aa6e88d1cbb09289e3a00af83b126 Mon Sep 17 00:00:00 2001 From: Martin Muzatko Date: Fri, 28 Sep 2018 11:26:00 +0200 Subject: [PATCH 22/81] added docs package lifecycle hooks --- docs/package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/package.json b/docs/package.json index 9fbfe0f51e..6d8cb38d1e 100644 --- a/docs/package.json +++ b/docs/package.json @@ -4,7 +4,8 @@ "description": "", "main": "index.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "dev": "vuepress dev", + "build": "vuepress build" }, "author": "", "license": "ISC", From f52ab10de0d7b77099f9bd41da1a75113bb74d4e Mon Sep 17 00:00:00 2001 From: Martin Muzatko Date: Fri, 28 Sep 2018 12:05:09 +0200 Subject: [PATCH 23/81] fixed double entry for request in sidebar --- docs/.vuepress/config.js | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index e02c495b5d..ef99f3cbdf 100644 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -72,7 +72,6 @@ module.exports = { '/3.x.x/guides/policies', '/3.x.x/guides/public-assets', '/3.x.x/guides/requests', - '/3.x.x/guides/requests', ], }, ], From 46b477c0b3204b7474bcc6b8e4025ebd4cfb6cff Mon Sep 17 00:00:00 2001 From: DMehaffy Date: Fri, 28 Sep 2018 03:05:55 -0700 Subject: [PATCH 24/81] Update the templates --- .github/ISSUE_TEMPLATE.md | 38 ++++++++--------------- .github/ISSUE_TEMPLATE/BUG_REPORT.md | 26 +++++++++------- .github/ISSUE_TEMPLATE/FEATURE_REQUEST.md | 4 +-- 3 files changed, 29 insertions(+), 39 deletions(-) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 1464308f38..334a2e31cc 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,18 +1,22 @@ - + + + + + + - - - + + **Informations** -- **Node.js version**: -- **npm version**: -- **Strapi version**: -- **Database**: -- **Operating system**: +- **Node.js version**: +- **npm version**: +- **Strapi version**: +- **Database**: +- **Operating system**: **What is the current behavior?** @@ -28,19 +32,3 @@ **Suggested solutions** - - - - - - - - - - - -**What is the expected behavior?** - - - - \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/BUG_REPORT.md b/.github/ISSUE_TEMPLATE/BUG_REPORT.md index c74ee09797..07d419d81f 100644 --- a/.github/ISSUE_TEMPLATE/BUG_REPORT.md +++ b/.github/ISSUE_TEMPLATE/BUG_REPORT.md @@ -5,17 +5,23 @@ about: Create a report to help us improve 🤔. + + + + + + + - - - + + **Informations** -- **Node.js version**: -- **npm version**: -- **Strapi version**: -- **Database**: -- **Operating system**: +- **Node.js version**: +- **npm version**: +- **Strapi version**: +- **Database**: +- **Operating system**: **What is the current behavior?** @@ -31,7 +37,3 @@ about: Create a report to help us improve 🤔. **Suggested solutions** - - - - diff --git a/.github/ISSUE_TEMPLATE/FEATURE_REQUEST.md b/.github/ISSUE_TEMPLATE/FEATURE_REQUEST.md index a5d8b50677..e3c12f501d 100644 --- a/.github/ISSUE_TEMPLATE/FEATURE_REQUEST.md +++ b/.github/ISSUE_TEMPLATE/FEATURE_REQUEST.md @@ -5,8 +5,8 @@ about: Suggest an idea for this project 💡! + + **What is the expected behavior?** - - From f593a441e628f44feb3c38a01b0f2196a2541f29 Mon Sep 17 00:00:00 2001 From: cyril lopez Date: Fri, 28 Sep 2018 12:24:11 +0200 Subject: [PATCH 25/81] Fixes 1823 --- .../admin/src/utils/formValidations.js | 17 +++++++++++++++-- packages/strapi/bin/strapi.js | 0 2 files changed, 15 insertions(+), 2 deletions(-) mode change 100644 => 100755 packages/strapi/bin/strapi.js diff --git a/packages/strapi-plugin-content-manager/admin/src/utils/formValidations.js b/packages/strapi-plugin-content-manager/admin/src/utils/formValidations.js index 8adda2cbf2..b6b01fbc40 100644 --- a/packages/strapi-plugin-content-manager/admin/src/utils/formValidations.js +++ b/packages/strapi-plugin-content-manager/admin/src/utils/formValidations.js @@ -1,4 +1,17 @@ -import { forEach, isObject, isArray, map, mapKeys, includes, reject, isEmpty, findIndex, isUndefined } from 'lodash'; +import { + forEach, + isObject, + isArray, + map, + mapKeys, + includes, + reject, + isEmpty, + findIndex, + isUndefined, + isBoolean, + isNumber, +} from 'lodash'; /* eslint-disable consistent-return */ export function getValidationsFromForm(form, formValidations) { @@ -88,7 +101,7 @@ function validate(value, validations) { case 'type': if (validationValue === 'json') { try { - if (isObject(value)) { + if (isObject(value) || isBoolean(value) || isNumber(value) || isArray(value)) { value = JSON.parse(JSON.stringify(value)); } else { errors.push({ id: 'content-manager.error.validation.json' }); diff --git a/packages/strapi/bin/strapi.js b/packages/strapi/bin/strapi.js old mode 100644 new mode 100755 From d992fd74640a4f709c03a694bf8049be81479509 Mon Sep 17 00:00:00 2001 From: cyril lopez Date: Fri, 28 Sep 2018 12:49:59 +0200 Subject: [PATCH 26/81] Fixes 1785 --- .../admin/src/containers/AuthPage/index.js | 6 ++++++ .../admin/src/translations/fr.json | 1 + packages/strapi/bin/strapi.js | 0 3 files changed, 7 insertions(+) mode change 100644 => 100755 packages/strapi/bin/strapi.js diff --git a/packages/strapi-plugin-users-permissions/admin/src/containers/AuthPage/index.js b/packages/strapi-plugin-users-permissions/admin/src/containers/AuthPage/index.js index 4c165782e2..c865bc5877 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/containers/AuthPage/index.js +++ b/packages/strapi-plugin-users-permissions/admin/src/containers/AuthPage/index.js @@ -75,7 +75,13 @@ export class AuthPage extends React.Component { // eslint-disable-line react/pre acc.push({ name: key, errors: [{ id: 'components.Input.error.validation.required' }] }); } + console.log(this.props.modifiedData.password.length); + if (!isEmpty(get(this.props.modifiedData, 'password')) && !isEmpty(get(this.props.modifiedData, 'confirmPassword')) && findIndex(acc, ['name', 'confirmPassword']) === -1) { + if (this.props.modifiedData.password.length < 6) { + acc.push({ name: 'password', errors: [{ id: 'users-permissions.components.Input.error.password.length' }] }); + } + if (get(this.props.modifiedData, 'password') !== get(this.props.modifiedData, 'confirmPassword')) { acc.push({ name: 'confirmPassword', errors: [{ id: 'users-permissions.components.Input.error.password.noMatch' }] }); } diff --git a/packages/strapi-plugin-users-permissions/admin/src/translations/fr.json b/packages/strapi-plugin-users-permissions/admin/src/translations/fr.json index 08b0e2cb4c..e64ca4974d 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/translations/fr.json +++ b/packages/strapi-plugin-users-permissions/admin/src/translations/fr.json @@ -133,6 +133,7 @@ "PopUpForm.header.edit.providers": "Editer {provider} Provider", "PopUpForm.inputSelect.providers.label": "Sélectionnez le provider", "components.Input.error.password.noMatch": "Le mot de passe ne correspond pas", + "components.Input.error.password.length": "Le password doit contenir au moins 6 caractères", "notification.error.delete": "Une erreur est survenue en essayant de supprimer cet élément", "notification.error.fetch": "Une erreur est survenue en essayant de récupérer les données", "notification.error.fetchUser": "Une erreur est survenue en esssayent de récupérer les users", diff --git a/packages/strapi/bin/strapi.js b/packages/strapi/bin/strapi.js old mode 100644 new mode 100755 From 3acec21d685438096e8ea802fd1dd08676be49b3 Mon Sep 17 00:00:00 2001 From: cyril lopez Date: Fri, 28 Sep 2018 12:53:14 +0200 Subject: [PATCH 27/81] Add en trad --- .../admin/src/translations/en.json | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/strapi-plugin-users-permissions/admin/src/translations/en.json b/packages/strapi-plugin-users-permissions/admin/src/translations/en.json index 01d4d505e5..5cd377a899 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/translations/en.json +++ b/packages/strapi-plugin-users-permissions/admin/src/translations/en.json @@ -142,6 +142,7 @@ "PopUpForm.header.edit.providers": "Edit {provider} Provider", "PopUpForm.inputSelect.providers.label": "Choose the provider", "components.Input.error.password.noMatch": "Passwords do not match", + "components.Input.error.password.length": "Password is too short", "notification.error.delete": "An error occurred while trying to delete the item", "notification.error.fetch": "An error occurred while trying to fetch data", "notification.error.fetchUser": "An error occurred while trying to fetch users", From 6949720de92ff5083cd5a4833ce8201b76965477 Mon Sep 17 00:00:00 2001 From: Brayden Girard Date: Fri, 28 Sep 2018 10:00:59 -0400 Subject: [PATCH 28/81] Updated for MLab example configuration --- .../3.x.x/en/configurations/configurations.md | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/docs/3.x.x/en/configurations/configurations.md b/docs/3.x.x/en/configurations/configurations.md index 3e4ccb8556..d16d15c261 100644 --- a/docs/3.x.x/en/configurations/configurations.md +++ b/docs/3.x.x/en/configurations/configurations.md @@ -246,6 +246,33 @@ Most of the application's configurations are defined by environment. It means th > Please refer to the [dynamic configurations section](#dynamic-configurations) to use global environment variable to configure the databases. +#### MLab Example + +**Path —** `./config/environments/**/database.json`. +```json +{ + "defaultConnection": "default", + "connections": { + "default": { + "connector": "strapi-hook-mongoose", + "settings": { + "client": "mongo", + "host": "ds123456.mlab.com", + "port": 12345, + "database": "mlab_db_name", + "username": "mlab_user_name", + "password": "mlab_pass" + }, + "options": { + "authenticationDatabase": "mlab_db_name", + "ssl": false + } + } + } +} +``` + +> Please note that you must give your MLab database name as the authenticationDatabase and your password can not contain the "@" symbol. From 455077b786bbbca7766c0ec66501000413d416f1 Mon Sep 17 00:00:00 2001 From: Jim LAURIE Date: Fri, 28 Sep 2018 19:43:03 +0200 Subject: [PATCH 29/81] Delete log --- .../admin/src/containers/AuthPage/index.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/strapi-plugin-users-permissions/admin/src/containers/AuthPage/index.js b/packages/strapi-plugin-users-permissions/admin/src/containers/AuthPage/index.js index c865bc5877..df4357dc3e 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/containers/AuthPage/index.js +++ b/packages/strapi-plugin-users-permissions/admin/src/containers/AuthPage/index.js @@ -75,8 +75,6 @@ export class AuthPage extends React.Component { // eslint-disable-line react/pre acc.push({ name: key, errors: [{ id: 'components.Input.error.validation.required' }] }); } - console.log(this.props.modifiedData.password.length); - if (!isEmpty(get(this.props.modifiedData, 'password')) && !isEmpty(get(this.props.modifiedData, 'confirmPassword')) && findIndex(acc, ['name', 'confirmPassword']) === -1) { if (this.props.modifiedData.password.length < 6) { acc.push({ name: 'password', errors: [{ id: 'users-permissions.components.Input.error.password.length' }] }); From 263c8fc1270f41f333b1bd1474634dca8b5f21b0 Mon Sep 17 00:00:00 2001 From: Jim LAURIE Date: Sat, 29 Sep 2018 14:57:52 +0200 Subject: [PATCH 30/81] Remove log --- packages/strapi-admin/admin/src/app.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/strapi-admin/admin/src/app.js b/packages/strapi-admin/admin/src/app.js index daf4949bbd..7a53201557 100644 --- a/packages/strapi-admin/admin/src/app.js +++ b/packages/strapi-admin/admin/src/app.js @@ -20,7 +20,6 @@ import './public-path'; import './strapi'; const dispatch = store.dispatch; -// console.log(process.env); // Don't inject plugins in development mode. if (window.location.port !== '4000') { From 98ed66293addb913993b0c2acf521089ed31254c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=96zg=C3=BCr=20ERSOY?= Date: Sun, 30 Sep 2018 12:21:06 +0300 Subject: [PATCH 31/81] update missing #2037 --- .../admin/src/translations/tr.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/strapi-plugin-users-permissions/admin/src/translations/tr.json b/packages/strapi-plugin-users-permissions/admin/src/translations/tr.json index 4c908421ef..ea9471692e 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/translations/tr.json +++ b/packages/strapi-plugin-users-permissions/admin/src/translations/tr.json @@ -142,7 +142,8 @@ "PopUpForm.header.edit.email-templates": "E-posta Şablonlarını Düzenle", "PopUpForm.header.edit.providers": "{sağlayıcı} sağlayıcını düzenle", "PopUpForm.inputSelect.providers.label": "Sağlayıcıyı seçin", - "components.Input.error.password.noMatch": "Parolalar uyuşmuyor", + "components.Input.error.password.noMatch": "Şifreler uyuşmuyor", + "components.Input.error.password.length": "Şifreniz çok kısa", "notification.error.delete": "Öğe silinirken bir hata oluştu", "notification.error.fetch": "Verileri getirmeye çalışılırken bir hata oluştu", "notification.error.fetchUser": "Kullanıcıları getirmeye çalışılırken bir hata oluştu", From 2fcab8f9d172eed190d1106485f290fc818ebbf2 Mon Sep 17 00:00:00 2001 From: Alberto Maturano Date: Sun, 30 Sep 2018 12:22:43 -0500 Subject: [PATCH 32/81] Fix validation for avoid create invalid indexes Fix the validation introduced with #1950 Fix #1382 Add skip eslint rule to avoid error --- packages/strapi-hook-bookshelf/lib/index.js | 2 +- packages/strapi-hook-bookshelf/lib/utils/connectivity.js | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/strapi-hook-bookshelf/lib/index.js b/packages/strapi-hook-bookshelf/lib/index.js index a5d651de30..42548eb2d4 100644 --- a/packages/strapi-hook-bookshelf/lib/index.js +++ b/packages/strapi-hook-bookshelf/lib/index.js @@ -461,7 +461,7 @@ module.exports = function(strapi) { const connection = strapi.config.connections[definition.connection]; let columns = Object.keys(attributes).filter(attribute => ['string', 'text'].includes(attributes[attribute].type)); - if (!columns) { + if (!columns.length) { // No text columns founds, exit from creating Fulltext Index return; } diff --git a/packages/strapi-hook-bookshelf/lib/utils/connectivity.js b/packages/strapi-hook-bookshelf/lib/utils/connectivity.js index 31cbf709cb..34671904b7 100644 --- a/packages/strapi-hook-bookshelf/lib/utils/connectivity.js +++ b/packages/strapi-hook-bookshelf/lib/utils/connectivity.js @@ -5,6 +5,7 @@ const inquirer = require('inquirer'); const rimraf = require('rimraf'); module.exports = (scope, success, error) => { + // eslint-disable-next-line import/no-unresolved const knex = require('knex')({ client: scope.client.module, connection: Object.assign({}, scope.database.settings, { From 6ea86fc9ae39931904a27a88e8f3f8b5ea2df1f2 Mon Sep 17 00:00:00 2001 From: Martin Muzatko Date: Mon, 1 Oct 2018 12:19:34 +0200 Subject: [PATCH 33/81] replaced blockquotes with proper note containers --- docs/.vuepress/config.js | 1 + .../.vuepress/theme/styles/custom-blocks.styl | 5 ++- docs/3.x.x/advanced/customize-admin.md | 27 +++++++++++----- docs/3.x.x/advanced/middlewares.md | 4 ++- docs/3.x.x/advanced/usage-tracking.md | 4 ++- docs/3.x.x/api-reference/reference.md | 8 +++-- docs/3.x.x/cli/CLI.md | 20 +++++++++--- docs/3.x.x/concepts/concepts.md | 4 ++- docs/3.x.x/configurations/configurations.md | 16 +++++++--- docs/3.x.x/getting-started/installation.md | 4 ++- docs/3.x.x/getting-started/quick-start.md | 31 +++++++++---------- docs/3.x.x/guides/authentication.md | 4 ++- docs/3.x.x/guides/controllers.md | 4 ++- docs/3.x.x/guides/deployment.md | 8 +++-- docs/3.x.x/guides/email.md | 4 ++- docs/3.x.x/guides/filters.md | 6 ++-- docs/3.x.x/guides/graphql.md | 20 +++++++++--- docs/3.x.x/guides/models.md | 20 +++++++++--- docs/3.x.x/guides/policies.md | 12 +++++-- docs/3.x.x/guides/public-assets.md | 10 +++--- docs/3.x.x/guides/responses.md | 12 +++++-- docs/3.x.x/guides/restapi.md | 8 +++-- docs/3.x.x/guides/services.md | 4 ++- docs/3.x.x/guides/upload.md | 8 +++-- .../migration-guide-alpha-11-to-alpha-12.md | 4 ++- docs/3.x.x/migration/migration-guide.md | 20 +++++++++--- .../plugin-development/backend-development.md | 4 ++- .../frontend-development.md | 4 ++- docs/3.x.x/plugin-development/quick-start.md | 6 ++-- 29 files changed, 201 insertions(+), 81 deletions(-) diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index ef99f3cbdf..a1faee3d71 100644 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -9,6 +9,7 @@ module.exports = { md .use(require('markdown-it-decorate')) .use(...createContainer('intro')) + .use(...createContainer('note')) } }, title: 'Strapi Docs', diff --git a/docs/.vuepress/theme/styles/custom-blocks.styl b/docs/.vuepress/theme/styles/custom-blocks.styl index 3ccc2df2a2..f8458658c9 100644 --- a/docs/.vuepress/theme/styles/custom-blocks.styl +++ b/docs/.vuepress/theme/styles/custom-blocks.styl @@ -2,7 +2,7 @@ .custom-block-title font-weight 600 margin-bottom -0.4rem - &.tip, &.warning, &.danger + &.tip, &.warning, &.danger, &.note padding .1rem 1.5rem border-left-width .5rem border-left-style solid @@ -10,6 +10,9 @@ &.tip background-color #f3f5f7 border-color #42b983 + &.note + background-color #f3f5f7 + border-color $accentColor &.warning background-color rgba(255,229,100,.3) border-color darken(#ffe564, 35%) diff --git a/docs/3.x.x/advanced/customize-admin.md b/docs/3.x.x/advanced/customize-admin.md index efe380e7b4..37691396ce 100644 --- a/docs/3.x.x/advanced/customize-admin.md +++ b/docs/3.x.x/advanced/customize-admin.md @@ -76,7 +76,9 @@ Run `npm start` from the `./admin` folder. That's all. You should be able to see the admin at [http://localhost:4000/admin](http://localhost:4000/admin). -> Note: In development, all the plugins of your app are mounted in the same build as the administration panel. +::: note +In development, all the plugins of your app are mounted in the same build as the administration panel. +::: ### Colors @@ -95,7 +97,9 @@ Fonts can also be overridden: To change the top-left displayed admin panel's logo, replace the image located at `./admin/admin/src/assets/images/logo-strapi.png`. -Note: make sure the size of your image is the same as the existing one (434px x 120px). +::: note +make sure the size of your image is the same as the existing one (434px x 120px). +::: *** @@ -109,7 +113,11 @@ npm run setup This will replace the folder's content located at `./admin/admin/build`. Visit http://localhost:1337/admin/ to make sure your updates have been taken in account. -After you have built the admininistration you can now create a new project to develop your API with the changes implemented. **Note:** You should now create a project without `--dev` +After you have built the admininistration you can now create a new project to develop your API with the changes implemented. + +::: note +You should now create a project without `--dev` +::: *** @@ -178,7 +186,9 @@ It's very common to deploy the front-end and the back-end on different servers. The administration URL will be http://yourfrontend.com and every request from the panel will hit the backend at http://yourbackend.com. The plugins will be injected through the `origin` (means the API itself). In other words, the plugins URLs will be `http://yourbackend.com/dashboard/content-manager/main.js`. -> Note: How it is possible? The API (the Strapi server) owns the plugin and these plugins are exposed through `http://yourbackend.com/admin/**/main.js` +::: note +How it is possible? The API (the Strapi server) owns the plugin and these plugins are exposed through `http://yourbackend.com/admin/**/main.js` +::: The DOM should look like this: @@ -198,7 +208,9 @@ The DOM should look like this: ``` -> Note: The plugins are injected using the `./admin/admin/build/config/plugins.json`. To see the plugins URLs in the `index.html`, you need to launch the administration panel in the browser. +::: note +The plugins are injected using the `./admin/admin/build/config/plugins.json`. To see the plugins URLs in the `index.html`, you need to launch the administration panel in the browser. +::: #### Deploy the administration panel and the plugins on another server than the API @@ -275,5 +287,6 @@ The generated `index.html` will look like this: ``` - -> Note: The plugins are injected using the `./admin/admin/build/config/plugins.json`. To see the plugins URLs in the `index.html`, you need to launch the administration panel in the browser. +::: note +The plugins are injected using the `./admin/admin/build/config/plugins.json`. To see the plugins URLs in the `index.html`, you need to launch the administration panel in the browser. +::: diff --git a/docs/3.x.x/advanced/middlewares.md b/docs/3.x.x/advanced/middlewares.md index 46e2bd8890..bf0197c73d 100644 --- a/docs/3.x.x/advanced/middlewares.md +++ b/docs/3.x.x/advanced/middlewares.md @@ -58,7 +58,9 @@ The core of Strapi embraces a small list of middlewares for performances, securi - xframe - xss -> Note: The following middlewares cannot be disabled: responses, router, logger and boom. +::: note +The following middlewares cannot be disabled: responses, router, logger and boom. +::: ## Structure diff --git a/docs/3.x.x/advanced/usage-tracking.md b/docs/3.x.x/advanced/usage-tracking.md index b6b445700f..296478abb4 100644 --- a/docs/3.x.x/advanced/usage-tracking.md +++ b/docs/3.x.x/advanced/usage-tracking.md @@ -21,7 +21,9 @@ Here is the list of the collected data and why we need them. We are not collecting sensitive data such as databases configurations, environment or custom variables. The data are encrypted and anonymised. -> GDPR: The collected data are non-sensitive or personal data. We are compliant with the European recommendations (see our [Privacy Policy](https://strapi.io/privacy)). +::: warning GDPR +The collected data are non-sensitive or personal data. We are compliant with the European recommendations (see our [Privacy Policy](https://strapi.io/privacy)). +::: ## Disable diff --git a/docs/3.x.x/api-reference/reference.md b/docs/3.x.x/api-reference/reference.md index c9087acf1d..9368db455f 100644 --- a/docs/3.x.x/api-reference/reference.md +++ b/docs/3.x.x/api-reference/reference.md @@ -35,7 +35,9 @@ Returns the Koa instance. Returns a `Promise`. When resolved, it means that the `./config/functions/bootstrap.js` has been executed. Otherwise, it throws an error. -> Note: You can also access to the bootstrap function through `strapi.config.functions.boostrap`. +::: note +You can also access to the bootstrap function through `strapi.config.functions.boostrap`. +::: ## strapi.config @@ -45,7 +47,9 @@ Returns an object that represents the configurations of the project. Every JavaS Returns an object of the controllers wich is available in the project. Every JavaScript file located in the `./api/**/controllers` folder will be parsed into the `strapi.controllers` object. Thanks to this object, you can access to every controller's actions everywhere in the project. -> Note: This object doesn't include the admin's controllers and plugin's controllers. +::: note +This object doesn't include the admin's controllers and plugin's controllers. +::: ## strapi.hook diff --git a/docs/3.x.x/cli/CLI.md b/docs/3.x.x/cli/CLI.md index 9759038fef..dd1109ea9c 100644 --- a/docs/3.x.x/cli/CLI.md +++ b/docs/3.x.x/cli/CLI.md @@ -55,7 +55,9 @@ options: [--tpl |--plugin ] Example: `strapi generate:api product --tpl bookshelf` -> Note: The first letter of the filename will be uppercased. +::: note +The first letter of the filename will be uppercased. +::: ## strapi generate:controller Create a new controller @@ -79,7 +81,9 @@ options: [--api |--plugin ] - **strapi generate:controller <name> --plugin <plugin>**
Generates an empty controller called **<name>** in the `./plugins//controllers` folder. -> Note: The first letter of the filename will be uppercased. +::: note +The first letter of the filename will be uppercased. +::: ## strapi generate:model Create a new model @@ -112,7 +116,9 @@ options: [--api |--plugin ] - **strapi generate:model <name> --plugin <plugin>**
Generates an empty model called **<name>** in the `./plugins//models` folder. -> Note: The first letter of the filename will be uppercased. +::: note +The first letter of the filename will be uppercased. +::: ## strapi generate:service Create a new service @@ -136,7 +142,9 @@ options: [--api |--plugin ] - **strapi generate:service <name> --plugin <plugin>**
Generates an empty service called **<name>** in the `./plugins//services` folder. -> Note: The first letter of the filename will be uppercased. +::: note +The first letter of the filename will be uppercased. +::: ## strapi generate:policy Create a new policy @@ -200,7 +208,9 @@ options: [--dev] > Checkout the [CONTRIBUTING guide](https://github.com/strapi/strapi/blob/master/CONTRIBUTING.md) for more details about the local Strapi development workflow. -> **Note: You have to restart the server to load the plugin into your project.** +::: warning +You have to restart the server to load the plugin into your project. +::: Please refer to the [plugins documentation](../plugin-development/quick-start.md) to know more. diff --git a/docs/3.x.x/concepts/concepts.md b/docs/3.x.x/concepts/concepts.md index 966482fdf4..a94f38178f 100644 --- a/docs/3.x.x/concepts/concepts.md +++ b/docs/3.x.x/concepts/concepts.md @@ -63,7 +63,9 @@ By default, your project's structure will look like this: - [`/public`](../concepts/concepts.html#public-assets): contains the file accessible to the outside world. -> Tips: Inside the `/config` folder, every folder will be parsed and injected into the global object `strapi.config`. Let's say, you added a folder named `credentials` with two files `stripe.json` and `paypal.json` into it. The content of these files will be accessible through `strapi.config.credentials.stripe` and `strapi.config.credentials.paypal`. +::: note +Inside the `/config` folder, every folder will be parsed and injected into the global object `strapi.config`. Let's say, you added a folder named `credentials` with two files `stripe.json` and `paypal.json` into it. The content of these files will be accessible through `strapi.config.credentials.stripe` and `strapi.config.credentials.paypal`. +::: *** diff --git a/docs/3.x.x/configurations/configurations.md b/docs/3.x.x/configurations/configurations.md index 56a2ba4d51..57e27808dc 100644 --- a/docs/3.x.x/configurations/configurations.md +++ b/docs/3.x.x/configurations/configurations.md @@ -95,7 +95,9 @@ Here are some use cases: CRON tasks allow you to schedule jobs (arbitrary functions) for execution at specific dates, with optional recurrence rules. It only uses a single timer at any given time (rather than reevaluating upcoming jobs every second/minute). -> Note: Make sure the `enabled` cron config is set to `true` in your environment's variables. +::: note +Make sure the `enabled` cron config is set to `true` in your environment's variables. +::: The cron format consists of: @@ -153,7 +155,9 @@ Each JSON file located in the folder must have the name of its corresponding tra Most of the application's configurations are defined by environment. It means that you can specify settings for each environment (`development`, `production`, `test`, etc.). -> Note: You can access the config of the current environment through `strapi.config.currentEnvironment`. +::: note +You can access the config of the current environment through `strapi.config.currentEnvironment`. +::: *** @@ -278,7 +282,9 @@ Most of the application's configurations are defined by environment. It means th - `router` - `prefix` (string): API url prefix (eg. `/v1`). -> Note: The session doesn't work with `mongo` as a client. The package that we should use is broken for now. +::: note +The session doesn't work with `mongo` as a client. The package that we should use is broken for now. +::: *** @@ -383,7 +389,9 @@ In any JSON configurations files in your project, you can inject dynamic values } ``` -> Note: You can't execute functions inside the curly braces. Only strings are allowed. +::: note +You can't execute functions inside the curly braces. Only strings are allowed. +::: *** diff --git a/docs/3.x.x/getting-started/installation.md b/docs/3.x.x/getting-started/installation.md index 1ed5fc166d..84a374bc97 100644 --- a/docs/3.x.x/getting-started/installation.md +++ b/docs/3.x.x/getting-started/installation.md @@ -16,7 +16,9 @@ Time to install Strapi! npm install strapi@alpha -g ``` -Note: if you encounter npm permissions issues, [change the permissions to npm default directory](https://docs.npmjs.com/getting-started/fixing-npm-permissions#option-1-change-the-permission-to-npms-default-directory). +::: note +If you encounter npm permissions issues, [change the permissions to npm default directory](https://docs.npmjs.com/getting-started/fixing-npm-permissions#option-1-change-the-permission-to-npms-default-directory). +::: It takes about 20 seconds with a good Internet connection. You can take a coffee ☕️ if you have a slow one. diff --git a/docs/3.x.x/getting-started/quick-start.md b/docs/3.x.x/getting-started/quick-start.md index 1a26062328..fa0bc14093 100644 --- a/docs/3.x.x/getting-started/quick-start.md +++ b/docs/3.x.x/getting-started/quick-start.md @@ -3,21 +3,18 @@ This section explains how to handle Strapi for the first time, ([check out our tutorial video](https://www.youtube.com/watch?v=yMl5IcFHA74)). **Table of contents:** -- [Create your first project](#create-your-first-project) -- [Create your first API](#create-your-first-api) - - [Content Type Builder plugin](#content-type-builder-plugin) - - [Files structure](#files-structure) -- [Manage your data](#manage-your-data) - - [Content Manager Plugin](#content-manager-plugin) - - [Create a product](#create-a-product) - - [Edit a product](#edit-a-product) - - [Delete a product](#delete-a-product) -- [Consume your API](#consume-your-api) - - [List entries](#list-entries) - - [Get a specific entry](#get-a-specific-entry) - - [Create data (POST)](#create-data-post) - - [Update data (PUT)](#update-data-put) - - [Delete data (DELETE)](#delete-data-delete) +- [Quick start](#quick-start) + - [Create your first project](#create-your-first-project) + - [Create your first user](#create-your-first-user) + - [Create your first API](#create-your-first-api) + - [Files structure](#files-structure) + - [Manage your data](#manage-your-data) + - [Consume your API](#consume-your-api) + - [List entries (GET)](#list-entries-get) + - [Get a specific entry (GET)](#get-a-specific-entry-get) + - [Create data (POST)](#create-data-post) + - [Update data (PUT)](#update-data-put) + - [Delete data (DELETE)](#delete-data-delete) *** @@ -92,7 +89,9 @@ At this point, your application is empty. To create your first API is to use the **#4 —** Save. That's it! -> Note: See the [CLI documentation](../cli/CLI.md#strapi-generateapi) for more information on how to do it the hacker way. +::: note +See the [CLI documentation](../cli/CLI.md#strapi-generateapi) for more information on how to do it the hacker way. +::: ### Files structure diff --git a/docs/3.x.x/guides/authentication.md b/docs/3.x.x/guides/authentication.md index 7449c54e76..68069fa72c 100644 --- a/docs/3.x.x/guides/authentication.md +++ b/docs/3.x.x/guides/authentication.md @@ -1,6 +1,8 @@ # Authentication -> ⚠️ This feature requires the Users & Permissions plugin (installed by default). +::: warning +This feature requires the Users & Permissions plugin (installed by default). +::: ## Register a new user diff --git a/docs/3.x.x/guides/controllers.md b/docs/3.x.x/guides/controllers.md index a786793299..94644bf6ac 100644 --- a/docs/3.x.x/guides/controllers.md +++ b/docs/3.x.x/guides/controllers.md @@ -39,4 +39,6 @@ module.exports = { }; ``` -> Note: A route handler can only access the controllers defined in the `./api/**/controllers` folders. +::: note +A route handler can only access the controllers defined in the `./api/**/controllers` folders. +::: diff --git a/docs/3.x.x/guides/deployment.md b/docs/3.x.x/guides/deployment.md index a082b1d2a2..980dd15402 100644 --- a/docs/3.x.x/guides/deployment.md +++ b/docs/3.x.x/guides/deployment.md @@ -29,7 +29,9 @@ cd /path/to/the/project npm run setup ``` -> Note: To display the build logs use the --debug option `npm run setup --debug`. +::: note +To display the build logs use the --debug option `npm run setup --debug`. +::: #### #3 - Launch the server @@ -39,7 +41,9 @@ Run the server with the `production` settings. NODE_ENV=production npm start ``` -> We highly recommend to use [pm2](https://github.com/Unitech/pm2/) to manage your process. +::: warning +We highly recommend to use [pm2](https://github.com/Unitech/pm2/) to manage your process. +::: ### Advanced configurations diff --git a/docs/3.x.x/guides/email.md b/docs/3.x.x/guides/email.md index f852e57929..b9db09ded4 100644 --- a/docs/3.x.x/guides/email.md +++ b/docs/3.x.x/guides/email.md @@ -1,6 +1,8 @@ # Email -> ⚠️ This feature requires the Email plugin (installed by default). +::: warning +This feature requires the Email plugin (installed by default). +::: Thanks to the plugin `Email`, you can send email on your server or externals providers such as Sendgrid. diff --git a/docs/3.x.x/guides/filters.md b/docs/3.x.x/guides/filters.md index eb50d62173..27232a711c 100644 --- a/docs/3.x.x/guides/filters.md +++ b/docs/3.x.x/guides/filters.md @@ -2,7 +2,7 @@ See the [filters' concepts](../concepts/concepts.md#filters) for details. -::: tip Note +::: note by default, the filters can only be used from `find` endpoints generated by the Content Type Builder and the [CLI](../cli/CLI.md). If you need to implement a filters system somewhere else, read the [programmatic usage](#programmatic-usage) section. ::: @@ -76,7 +76,9 @@ Requests system can be implemented in custom code sections. To extract the filters from an JavaScript object or a request, you need to call the [`strapi.utils.models.convertParams` helper](../api-reference/reference.md#strapiutils). -> Note: The returned objects is formatted according to the ORM used by the model. +::: note +The returned objects is formatted according to the ORM used by the model. +::: #### Example diff --git a/docs/3.x.x/guides/graphql.md b/docs/3.x.x/guides/graphql.md index 3f67c612f1..78ed3bc9e9 100644 --- a/docs/3.x.x/guides/graphql.md +++ b/docs/3.x.x/guides/graphql.md @@ -1,6 +1,8 @@ # GraphQL -> ⚠️ This feature requires the GraphQL plugin (not installed by default). +::: warning +This feature requires the GraphQL plugin (not installed by default). +::: ## Usage @@ -364,7 +366,9 @@ module.exports = { Edit the `definition` attribute in one of the `schema.graphql` files of your project by using the GraphQL Type language string. -> Note: The easiest way is to create a new model using the CLI `strapi generate:model category --api post`, so you don't need to customise anything. +::: note +The easiest way is to create a new model using the CLI `strapi generate:model category --api post`, so you don't need to customise anything. +::: ```js module.exports = { @@ -507,7 +511,9 @@ module.exports = { In this example, the policy `isAuthenticated` located in `./plugins/users-permissions/config/policies/isAuthenticated.js` will be executed first. Then, the `isOwner` policy located in the `Post` API `./api/post/config/policies/isOwner.js`. Next, it will execute the `logging` policy located in `./config/policies/logging.js`. Finally, the resolver will be executed. -> Note: There is no custom resolver in that case, so it will execute the default resolver (Post.find) provided by the Shadow CRUD feature. +::: note +There is no custom resolver in that case, so it will execute the default resolver (Post.find) provided by the Shadow CRUD feature. +::: ### Link a query to a controller action @@ -528,7 +534,9 @@ module.exports = { In this example, it will execute the `findByAuthor` action of the `Post` controller. It also means that the resolver will apply on the `posts` query the permissions defined on the `findByAuthor` action (through the administration panel). -> Note: The `obj` parameter is available via `ctx.params` and the `options` are available via `ctx.query` in the controller's action. +::: note +The `obj` parameter is available via `ctx.params` and the `options` are available via `ctx.query` in the controller's action. +::: ### Define a custom resolver @@ -606,7 +614,9 @@ The type name is the global ID of the model. You can find the global ID of a mod We recommend to put the field description and deprecated reason in the model. Right now, the GraphQL plugin is the only which uses these fields. Another plugin could use this description in the future as well. However, sometimes you don't have the choice, especially when you're defining a custom type. -> Note: It's not a bad practice to put the description and deprecated attribute in the `schema.graphql`, though. +::: note +It's not a bad practice to put the description and deprecated attribute in the `schema.graphql`, though. +::: **Why are the "createdAt" and "updatedAt" field added to my type?** diff --git a/docs/3.x.x/guides/models.md b/docs/3.x.x/guides/models.md index de58ff2c6d..a4cd2841fa 100644 --- a/docs/3.x.x/guides/models.md +++ b/docs/3.x.x/guides/models.md @@ -3,7 +3,9 @@ See the [models' concepts](../concepts/concepts.md#models) for details. ## How to create a model? -> Note: If you are just starting out it is very convenient to generate some models with the Content Type Builder, directly in the admin interface. You can then review the generated model mappings on the code level. The UI takes over a lot of validation tasks and gives you a fast feeling for available features. +::: note +If you are just starting out it is very convenient to generate some models with the Content Type Builder, directly in the admin interface. You can then review the generated model mappings on the code level. The UI takes over a lot of validation tasks and gives you a fast feeling for available features. +::: Use the CLI, and run the following command `strapi generate:model user firstname:string lastname:string`. Read the [CLI documentation](../cli/CLI.md) for more informations. @@ -11,7 +13,9 @@ This will create two files located at `./api/user/models`: - `User.settings.json`: contains the list of attributes and settings. The JSON format makes the file easily editable. - `User.js`: imports `User.settings.json` and extends it with additional settings and lifecycle callbacks. -> Note: when you create a new API using the CLI (`strapi generate:api `), a model is automatically created. +::: note +when you create a new API using the CLI (`strapi generate:api `), a model is automatically created. +::: ## Model Information The info key on the model-json states information about the model. This information is used in the admin interface, when showing the model. @@ -291,7 +295,9 @@ A `product` can be related to many `categories`, so a `category` can have many ` } ``` -> Note: The `dominant` key allows you to define in which table/collection (only for NoSQL databases) should be stored the array that defines the relationship. Because there is no join table in NoSQL, this key is required for NoSQL databases (ex: MongoDB). +::: note +The `dominant` key allows you to define in which table/collection (only for NoSQL databases) should be stored the array that defines the relationship. Because there is no join table in NoSQL, this key is required for NoSQL databases (ex: MongoDB). +::: **Path —** `./api/category/models/Category.settings.json`. ```json @@ -571,7 +577,9 @@ CREATE TABLE `image` ( ) ``` -> Note: If you've overrided the default table name given by Strapi by using the `collectionName` attribute. Use the value set in the `collectionName` to name the table. +::: note +If you've overrided the default table name given by Strapi by using the `collectionName` attribute. Use the value set in the `collectionName` to name the table. +::: The second table will allow us to associate one or many others entries to the `Image` model. The name of the table is the same as the previous one with the suffix `_morph`. ``` @@ -693,4 +701,6 @@ Additional settings can be set on models: In this example, the model `User` will be accessible through the `Users` global variable. The data will be stored in the `Users_v1` collection or table and the model will use the `mongo` connection defined in `./config/environments/**/database.json` -> Note: The `connection` value can be changed whenever you want, but you should be aware that there is no automatic data migration process. Also if the new connection doesn't use the same ORM you will have to rewrite your queries. +::: note +The `connection` value can be changed whenever you want, but you should be aware that there is no automatic data migration process. Also if the new connection doesn't use the same ORM you will have to rewrite your queries. +::: diff --git a/docs/3.x.x/guides/policies.md b/docs/3.x.x/guides/policies.md index 698c4f6fe1..b9cbb1f26d 100644 --- a/docs/3.x.x/guides/policies.md +++ b/docs/3.x.x/guides/policies.md @@ -22,7 +22,9 @@ module.exports = async (ctx, next) => { In this example, we are verifying that a session is open. If it is the case, we call the `next()` method that will execute the next policy or controller's action. Otherwise, a 401 error is returned. -> Note: You can access to any controllers, services or models thanks to the global variable `strapi` in a policy. +::: note +You can access to any controllers, services or models thanks to the global variable `strapi` in a policy. +::: ## Usage @@ -54,7 +56,9 @@ The global policies can be associated to any routes in your project. Before executing the `find` action in the `Car.js` controller, the global policy `isAuthenticated` located in `./config/policies/isAuthenticated.js` will be called. -> Note: You can put as much policy you want in this array. However be careful about the performance impact. +::: note +You can put as much policy you want in this array. However be careful about the performance impact. +::: ### Plugins policies @@ -116,7 +120,9 @@ module.exports = async (ctx, next) => { The policy `isAdmin` located in `./api/car/config/policies/isAdmin.js` will be executed before the `find` action in the `Car.js` controller. -> Note: The policy `isAdmin` can only be applied to the routes defined in the `/api/car` folder. +::: note +The policy `isAdmin` can only be applied to the routes defined in the `/api/car` folder. +::: ## Advanced usage diff --git a/docs/3.x.x/guides/public-assets.md b/docs/3.x.x/guides/public-assets.md index 052b32a940..db584bac44 100644 --- a/docs/3.x.x/guides/public-assets.md +++ b/docs/3.x.x/guides/public-assets.md @@ -8,10 +8,12 @@ Because an API may need to serve static assets, every new Strapi project include An image named `company-logo.png` in `./public/` is accessible through `/company-logo.png` URL. -> Note: `index.html` files are served if the request corresponds to a folder name (`/pictures` url will try to serve `public/pictures/index.html` file). - - -> Warning bis: The dotfiles are not exposed. It means that every files with the names start by `.` such as `.htaccess` or `.gitignore` are not served. +::: note +`index.html` files are served if the request corresponds to a folder name (`/pictures` url will try to serve `public/pictures/index.html` file). +::: +::: warning +The dotfiles are not exposed. It means that every files with the names start by `.` such as `.htaccess` or `.gitignore` are not served. +::: Refer to the [public assets configurations](../configurations/configurations.md#Application) for more informations. diff --git a/docs/3.x.x/guides/responses.md b/docs/3.x.x/guides/responses.md index ce1afab894..13198e9fd1 100644 --- a/docs/3.x.x/guides/responses.md +++ b/docs/3.x.x/guides/responses.md @@ -221,9 +221,11 @@ ctx.type = '.png'; ctx.type = 'png'; ``` -Note: when appropriate a `charset` is selected for you, for +::: note +when appropriate a `charset` is selected for you, for example `response.type = 'html'` will default to "utf-8". If you need to overwrite `charset`, use `ctx.set('Content-Type', 'text/html')` to set response header field to value directly. +::: #### response.is(types...) @@ -534,9 +536,11 @@ ctx.type = '.png'; ctx.type = 'png'; ``` -Note: when appropriate a `charset` is selected for you, for +::: note +when appropriate a `charset` is selected for you, for example `response.type = 'html'` will default to "utf-8". If you need to overwrite `charset`, use `ctx.set('Content-Type', 'text/html')` to set response header field to value directly. +::: #### response.is(types...) @@ -635,7 +639,9 @@ Strapi integrates [Boom](https://github.com/hapijs/boom): a set of utilities for You can also override responses based on them status. Please read the [configuration responses](../configurations/configurations.md#responses) for that. -> Note: Every Boom's functions is delegated to the context. It means that `ctx.notFound` is a shortcut to `ctx.response.notFound`. +::: note +Every Boom's functions is delegated to the context. It means that `ctx.notFound` is a shortcut to `ctx.response.notFound`. +::: ### API Reference diff --git a/docs/3.x.x/guides/restapi.md b/docs/3.x.x/guides/restapi.md index 351a6f5a5b..27232a711c 100644 --- a/docs/3.x.x/guides/restapi.md +++ b/docs/3.x.x/guides/restapi.md @@ -2,7 +2,9 @@ See the [filters' concepts](../concepts/concepts.md#filters) for details. -> Note: by default, the filters can only be used from `find` endpoints generated by the Content Type Builder and the [CLI](../cli/CLI.md). If you need to implement a filters system somewhere else, read the [programmatic usage](#programmatic-usage) section. +::: note +by default, the filters can only be used from `find` endpoints generated by the Content Type Builder and the [CLI](../cli/CLI.md). If you need to implement a filters system somewhere else, read the [programmatic usage](#programmatic-usage) section. +::: ## Available operators @@ -74,7 +76,9 @@ Requests system can be implemented in custom code sections. To extract the filters from an JavaScript object or a request, you need to call the [`strapi.utils.models.convertParams` helper](../api-reference/reference.md#strapiutils). -> Note: The returned objects is formatted according to the ORM used by the model. +::: note +The returned objects is formatted according to the ORM used by the model. +::: #### Example diff --git a/docs/3.x.x/guides/services.md b/docs/3.x.x/guides/services.md index 768faf1976..12953fb96a 100644 --- a/docs/3.x.x/guides/services.md +++ b/docs/3.x.x/guides/services.md @@ -41,7 +41,9 @@ module.exports = { }; ``` -> Note: please make sure you installed `nodemailer` (`npm install nodemailer`) for this example. +::: note +please make sure you installed `nodemailer` (`npm install nodemailer`) for this example. +::: The service is now available through the `strapi.services` global variable. We can use it in another part of our codebase. For example a controller like below: diff --git a/docs/3.x.x/guides/upload.md b/docs/3.x.x/guides/upload.md index 67a82b7054..31711b0d9c 100644 --- a/docs/3.x.x/guides/upload.md +++ b/docs/3.x.x/guides/upload.md @@ -1,6 +1,8 @@ # File Upload -> ⚠️ This feature requires the Upload plugin (installed by default). +::: warning +This feature requires the Upload plugin (installed by default). +::: Thanks to the plugin `Upload`, you can upload any kind of files on your server or externals providers such as AWS S3. @@ -8,7 +10,9 @@ Thanks to the plugin `Upload`, you can upload any kind of files on your server o The plugin exposes a single route `POST /upload` to upload one or multiple files in a single request. -> ⚠️ Please send the request using multipart/form-data encoding +::: warning +Please send the request using multipart/form-data encoding +::: **Parameters** diff --git a/docs/3.x.x/migration/migration-guide-alpha-11-to-alpha-12.md b/docs/3.x.x/migration/migration-guide-alpha-11-to-alpha-12.md index b45b2caed7..76a6d34dc1 100644 --- a/docs/3.x.x/migration/migration-guide-alpha-11-to-alpha-12.md +++ b/docs/3.x.x/migration/migration-guide-alpha-11-to-alpha-12.md @@ -69,7 +69,9 @@ You also will have to reset your roles permissions. ### Update bookshelf filters -> This update is if you come from version before alpha-11.3 +::: warning +This update is if you come from version before alpha-11.3 +::: You will have to replace your `fetchAll` services queries of your generated API: diff --git a/docs/3.x.x/migration/migration-guide.md b/docs/3.x.x/migration/migration-guide.md index dec61ddd51..748db7c634 100644 --- a/docs/3.x.x/migration/migration-guide.md +++ b/docs/3.x.x/migration/migration-guide.md @@ -36,7 +36,9 @@ The structure of the configurations has been harmonised and simplified. Files ha Please refer to the [new documentation](../configurations/configurations.md) to set the correct values in each file. -> Note: Don't forget that middlewares has been removed. Please refers to the right section of this document for more details. +::: note +Don't forget that middlewares has been removed. Please refers to the right section of this document for more details. +::: ## Routes @@ -141,9 +143,13 @@ The services files should stay as they are. Your generator functions can be conv The models didn't change a lot. The `autoCreatedAt`, `autoUpdatedAt` and `autoPK` attributes have been removed and replaced by the `hasTimestamps` attribute. -> Note: The `hasTimestamps` options will only work with Bookshelf. Also you need to create the `created_at` and `updated_at` columns manually. +::: note +The `hasTimestamps` options will only work with Bookshelf. Also you need to create the `created_at` and `updated_at` columns manually. +::: -> Note: The `enum` type is not available for now. Also, the validations are not working properly. It means that most of the validations have to be done manually. +::: note +The `enum` type is not available for now. Also, the validations are not working properly. It means that most of the validations have to be done manually. +::: #### v1.x @@ -310,7 +316,9 @@ module.exports = { } ``` -> Note: You will have more changes if your project is based on a SQL database. Waterline and Mongoose are almost sharing the same API. +::: note +You will have more changes if your project is based on a SQL database. Waterline and Mongoose are almost sharing the same API. +::: ## Middlewares @@ -351,7 +359,9 @@ It works exactly as before. You need to add `strapi-views` into your app's depen } ``` -> Note: You might have to install the template engine by your own (ex: `npm install ejs --save`). +::: note +You might have to install the template engine by your own (ex: `npm install ejs --save`). +::: ## Error handling diff --git a/docs/3.x.x/plugin-development/backend-development.md b/docs/3.x.x/plugin-development/backend-development.md index e0d495d31a..74df918242 100644 --- a/docs/3.x.x/plugin-development/backend-development.md +++ b/docs/3.x.x/plugin-development/backend-development.md @@ -6,7 +6,9 @@ This section explains how the 'back-end part' of your plugin works. The plugin API routes are defined in the `./plugins/**/config/routes.json` file. -> Please refer to [router documentation](../guides/routing.md) for informations. +::: note +Please refer to [router documentation](../guides/routing.md) for informations. +::: **Route prefix** diff --git a/docs/3.x.x/plugin-development/frontend-development.md b/docs/3.x.x/plugin-development/frontend-development.md index e203b5d8b3..e49e05f68c 100644 --- a/docs/3.x.x/plugin-development/frontend-development.md +++ b/docs/3.x.x/plugin-development/frontend-development.md @@ -73,7 +73,9 @@ To style a plugin component: Use this style in the component: `
`. -Note: if you want to use several classes: +::: note +if you want to use several classes: +::: ```js import cn from 'classnames'; diff --git a/docs/3.x.x/plugin-development/quick-start.md b/docs/3.x.x/plugin-development/quick-start.md index 92db599c6c..453c6b72cf 100644 --- a/docs/3.x.x/plugin-development/quick-start.md +++ b/docs/3.x.x/plugin-development/quick-start.md @@ -10,9 +10,11 @@ To setup the development environment please **follow the instructions below:** 2. Clone it to your computer `git clone git@github.com:strapi/strapi.git`. 3. Run `npm run setup` at the root of the directory. -> You can run `npm run setup:build` to build the plugins' admin (the setup time will be longer) +You can run `npm run setup:build` to build the plugins' admin (the setup time will be longer) -> Note: If the installation failed, please remove the global packages related to Strapi. The command `npm ls strapi` will help you to find where your packages are installed globally. +::: note +If the installation failed, please remove the global packages related to Strapi. The command `npm ls strapi` will help you to find where your packages are installed globally. +::: ## Plugin development Setup From d05f936ff585ad11990c5dc028101d9e773d4acd Mon Sep 17 00:00:00 2001 From: cyril lopez Date: Mon, 1 Oct 2018 14:29:11 +0200 Subject: [PATCH 34/81] Add plugin prefix to plugins routes. Fixes #1765 --- .../admin/src/containers/EditPage/saga.js | 15 ++++++--------- .../services/UsersPermissions.js | 15 ++++++++++++--- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/packages/strapi-plugin-users-permissions/admin/src/containers/EditPage/saga.js b/packages/strapi-plugin-users-permissions/admin/src/containers/EditPage/saga.js index 7cb72e3637..5bb5105867 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/containers/EditPage/saga.js +++ b/packages/strapi-plugin-users-permissions/admin/src/containers/EditPage/saga.js @@ -1,5 +1,6 @@ import { LOCATION_CHANGE } from 'react-router-redux'; import { + all, call, cancel, fork, @@ -8,9 +9,7 @@ import { take, takeLatest, } from 'redux-saga/effects'; - import request from 'utils/request'; - import { getPermissionsSucceeded, getPoliciesSucceeded, @@ -19,7 +18,6 @@ import { getUserSucceeded, submitSucceeded, } from './actions'; - import { GET_PERMISSIONS, GET_POLICIES, @@ -27,7 +25,6 @@ import { GET_USER, SUBMIT, } from './constants'; - import { makeSelectActionType, makeSelectModifiedData, @@ -61,13 +58,13 @@ export function* permissionsGet() { export function* policiesGet() { try { - const response = yield [ + const [policies, routes] = yield all([ call(request, '/users-permissions/policies', { method: 'GET' }), call(request, '/users-permissions/routes', { method: 'GET' }), - ]; - - yield put(getPoliciesSucceeded(response[0])); - yield put(getRoutesSucceeded(response[1])); + ]); + + yield put(getPoliciesSucceeded(policies)); + yield put(getRoutesSucceeded(routes)); } catch(err) { strapi.notification.error('users-permissions.EditPage.notification.policies.error'); } diff --git a/packages/strapi-plugin-users-permissions/services/UsersPermissions.js b/packages/strapi-plugin-users-permissions/services/UsersPermissions.js index ac6f6f92f0..f358a76e50 100644 --- a/packages/strapi-plugin-users-permissions/services/UsersPermissions.js +++ b/packages/strapi-plugin-users-permissions/services/UsersPermissions.js @@ -190,12 +190,21 @@ module.exports = { const routes = Object.keys(strapi.api || {}).reduce((acc, current) => { return acc.concat(_.get(strapi.api[current].config, 'routes', [])); }, []); + const clonedPlugins = _.cloneDeep(strapi.plugins); + const pluginsRoutes = Object.keys(clonedPlugins || {}).reduce((acc, current) => { + const routes = _.get(clonedPlugins, [current, 'config', 'routes'], []) + .reduce((acc, curr) => { + const prefix = curr.config.prefix; + const path = prefix !== undefined ? `${prefix}${curr.path}` : `/${current}${curr.path}`; + _.set(curr, 'path', path); + + return acc.concat(curr); + }, []); - const pluginsRoutes = Object.keys(strapi.plugins || {}).reduce((acc, current) => { - acc[current] = _.get(strapi.plugins[current].config, 'routes', []); + acc[current] = routes; return acc; - }, []); + }, {}); return _.merge({ application: routes }, pluginsRoutes); }, From fa5489488d610c5bb3680e6cfc3b843b8fad1b44 Mon Sep 17 00:00:00 2001 From: Jim LAURIE Date: Tue, 2 Oct 2018 16:48:46 +0200 Subject: [PATCH 35/81] Remove API prefix close #1323 --- docs/3.x.x/en/configurations/configurations.md | 2 -- .../files/config/environments/development/request.json | 3 --- .../files/config/environments/production/request.json | 3 --- .../files/config/environments/staging/request.json | 3 --- 4 files changed, 11 deletions(-) diff --git a/docs/3.x.x/en/configurations/configurations.md b/docs/3.x.x/en/configurations/configurations.md index d16d15c261..f1d0a3500e 100644 --- a/docs/3.x.x/en/configurations/configurations.md +++ b/docs/3.x.x/en/configurations/configurations.md @@ -297,8 +297,6 @@ Most of the application's configurations are defined by environment. It means th - `parser` - `enabled`(boolean): Enable or disable parser. Default value: `true`. - `multipart` (boolean): Enable or disable multipart bodies parsing. Default value: `true`. - - `router` - - `prefix` (string): API url prefix (eg. `/v1`). > Note: The session doesn't work with `mongo` as a client. The package that we should use is broken for now. diff --git a/packages/strapi-generate-new/files/config/environments/development/request.json b/packages/strapi-generate-new/files/config/environments/development/request.json index b826f5ac0d..8307d0270f 100644 --- a/packages/strapi-generate-new/files/config/environments/development/request.json +++ b/packages/strapi-generate-new/files/config/environments/development/request.json @@ -19,8 +19,5 @@ "parser": { "enabled": true, "multipart": true - }, - "router": { - "prefix": "" } } diff --git a/packages/strapi-generate-new/files/config/environments/production/request.json b/packages/strapi-generate-new/files/config/environments/production/request.json index fe19265b12..a89938b428 100644 --- a/packages/strapi-generate-new/files/config/environments/production/request.json +++ b/packages/strapi-generate-new/files/config/environments/production/request.json @@ -19,8 +19,5 @@ "parser": { "enabled": true, "multipart": true - }, - "router": { - "prefix": "" } } diff --git a/packages/strapi-generate-new/files/config/environments/staging/request.json b/packages/strapi-generate-new/files/config/environments/staging/request.json index fe19265b12..a89938b428 100644 --- a/packages/strapi-generate-new/files/config/environments/staging/request.json +++ b/packages/strapi-generate-new/files/config/environments/staging/request.json @@ -19,8 +19,5 @@ "parser": { "enabled": true, "multipart": true - }, - "router": { - "prefix": "" } } From eced058920bd6a75417886da6350e97eeaad88e4 Mon Sep 17 00:00:00 2001 From: Jim LAURIE Date: Tue, 2 Oct 2018 19:14:10 +0200 Subject: [PATCH 36/81] Fix #1469 return 0 count route --- packages/strapi/lib/middlewares/boom/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/strapi/lib/middlewares/boom/index.js b/packages/strapi/lib/middlewares/boom/index.js index eaa688165b..c73b8d57ea 100644 --- a/packages/strapi/lib/middlewares/boom/index.js +++ b/packages/strapi/lib/middlewares/boom/index.js @@ -45,7 +45,7 @@ module.exports = strapi => { } // Empty body is considered as `notFound` response. - if (!ctx.body) { + if (!ctx.body && ctx.body !== 0) { ctx.notFound(); } From 03b03deca3874e2efd06ecda69def72b7573dd14 Mon Sep 17 00:00:00 2001 From: Jim LAURIE Date: Tue, 2 Oct 2018 20:03:58 +0200 Subject: [PATCH 37/81] Fix #1784 change error message incorrect code --- .../admin/src/containers/AuthPage/saga.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/strapi-plugin-users-permissions/admin/src/containers/AuthPage/saga.js b/packages/strapi-plugin-users-permissions/admin/src/containers/AuthPage/saga.js index 431ed2e97a..943968d60b 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/containers/AuthPage/saga.js +++ b/packages/strapi-plugin-users-permissions/admin/src/containers/AuthPage/saga.js @@ -82,7 +82,11 @@ export function* submitForm(action) { yield put(hideLoginErrorsInput(true)); break; case 'reset-password': - formErrors = [{ name: 'password', errors: [{ id: 'users-permissions.Auth.form.error.password.matching' }] }]; + if (errors[0].id === 'users-permissions.Auth.form.error.code.provide') { + strapi.notification.error(errors[0].id); + } else { + formErrors = [{ name: 'password', errors }]; + } break; case 'register': { const target = includes(get(errors, ['0', 'id']), 'username') ? 'username' : 'email'; From a805567c439d7d42ec0b1840f660a633882e5d1d Mon Sep 17 00:00:00 2001 From: Daan De Deckere Date: Tue, 2 Oct 2018 20:41:40 +0200 Subject: [PATCH 38/81] Add missing translation keys for NL language. Fixes #2035 --- .../strapi-admin/admin/src/translations/nl.json | 1 + .../admin/src/translations/nl.json | 16 ++++++++++++++++ .../admin/src/translations/nl.json | 5 +++++ .../admin/src/translations/nl.json | 11 +++++++++++ 4 files changed, 33 insertions(+) diff --git a/packages/strapi-admin/admin/src/translations/nl.json b/packages/strapi-admin/admin/src/translations/nl.json index 17aa71870b..aba6364ec7 100644 --- a/packages/strapi-admin/admin/src/translations/nl.json +++ b/packages/strapi-admin/admin/src/translations/nl.json @@ -25,6 +25,7 @@ "app.components.ComingSoonPage.featuresNotAvailable": "Deze feature is nog in ontwikkeling", "app.components.DownloadInfo.download": "Aan het downloaden...", "app.components.DownloadInfo.text": "Dit kan even duren. Bedankt voor je geduld.", + "app.components.EmptyAttributes.title": "Er zijn nog geen velden", "app.components.HomePage.button.blog": "LEES MEER OP DE BLOG", "app.components.HomePage.button.quickStart": "START DE SNELLE START HANDLEIDING", "app.components.HomePage.community": "Vind de community op het web", diff --git a/packages/strapi-plugin-content-manager/admin/src/translations/nl.json b/packages/strapi-plugin-content-manager/admin/src/translations/nl.json index 0baf49e66f..9b70976ab3 100644 --- a/packages/strapi-plugin-content-manager/admin/src/translations/nl.json +++ b/packages/strapi-plugin-content-manager/admin/src/translations/nl.json @@ -3,6 +3,8 @@ "components.AddFilterCTA.add": "Filters", "components.AddFilterCTA.hide": "Filters", "components.DraggableAttr.edit": "Klik om aan te passen", + "components.EmptyAttributesBlock.button": "Ga naar instellingen", + "components.EmptyAttributesBlock.description": "U kunt uw instellingen aanpassen", "components.FilterOptions.FILTER_TYPES.=": "is", "components.FilterOptions.FILTER_TYPES._contains": "bevat", "components.FilterOptions.FILTER_TYPES._containss": "bevat (hoofdletter gevoelig)", @@ -25,10 +27,13 @@ "components.TableEmpty.withFilters": "Er is geen {contentType} met de gekozen filters...", "components.TableEmpty.withSearch": "Er is geen {contentType} passend bij de zoekopdracht ({search})...", "components.TableEmpty.withoutFilter": "Er is geen {contentType}...", + "containers.Edit.addAnItem": "Item toevoegen...", + "containers.Edit.clickToJump": "Klik om naar het item te gaan", "containers.Edit.delete": "Verwijderen", "containers.Edit.editing": "Aanpassen...", "containers.Edit.reset": "Resetten", "containers.Edit.returnList": "Terug naar lijst", + "containers.Edit.seeDetails": "Details", "containers.Edit.submit": "Opslaan", "containers.Home.introduction": "Om items aan te passen klik je op de link in het menu links boven. Deze plugin heeft nog geen goede manier om instellingen aan te passen en is nog in ontwikkeling.", "containers.Home.pluginHeaderDescription": "Onderhoud je data via een krachtig en mooie interface.", @@ -37,12 +42,17 @@ "containers.List.errorFetchRecords": "Fout", "containers.List.pluginHeaderDescription": "{label} item gevonden", "containers.List.pluginHeaderDescription.singular": "{label} items gevonden", + "containers.ListPage.displayedFields": "Weergegeven velden", "containers.SettingPage.addField": "Nieuw veld toevoegen", + "containers.SettingPage.addRelationalField": "Nieuw relationeel veld toevoegen", "containers.SettingPage.attributes": "Attribuut velden", "containers.SettingPage.attributes.description": "Geef de volgorde van de attributen aan", + "containers.SettingPage.editSettings.description": "Klik & sleep de velden om de layout te bouwen", + "containers.SettingPage.editSettings.title": "Wijzig — Instellingen", "containers.SettingPage.listSettings.description": "Stel de opties voor dit Content Type in", "containers.SettingPage.listSettings.title": "Lijst — Instellingen", "containers.SettingPage.pluginHeaderDescription": "Stel de specifieke instellingen voor dit Content Type in", + "containers.SettingPage.relations": "Relationele velden", "containers.SettingsPage.Block.contentType.description": "Configureer de specifieke instellingen", "containers.SettingsPage.Block.contentType.title": "Content Types", "containers.SettingsPage.Block.generalSettings.description": "Stel de standaard instellingen voor jouw Content Types in", @@ -73,14 +83,20 @@ "error.validation.required": "Deze gegevens zijn verplicht.", "form.Input.bulkActions": "Bulk acties inschakelen", "form.Input.defaultSort": "Standaard sorteer attribuut", + "form.Input.description": "Beschrijving", + "form.Input.description.placeholder": "Naam in het profiel tonen", + "form.Input.disabled": "Bewerkbaar veld", "form.Input.filters": "Filters inschakelen", "form.Input.label": "Label", "form.Input.label.inputDescription": "Deze waarde overschrijft het label welke weergegeven wordt in het tabel hoofd", "form.Input.pageEntries": "Items per pagina", "form.Input.pageEntries.inputDescription": "Hint: Je kunt deze waarde overschrijven in de Content Type instellingen pagina", + "form.Input.placeholder": "Placeholder", + "form.Input.placeholder.placeholder": "Mijn fantastische placeholder", "form.Input.search": "Zoeken inschakelen", "form.Input.search.field": "Schakel zoeken in voor dit veld", "form.Input.sort.field": "Sorteren inschakelen voor dit veld", + "notification.error.displayedFields": "Je hebt tenminste één zichtbaar veld nodig", "notification.error.relationship.fetch": "Er is een fout opgetreden tijdens het ophalen van de relaties.", "notification.info.SettingPage.disableSort": "Je moet één attribuut hebben met sorteren ingeschakeld", "pageNotFound": "Pagina niet gevonden", diff --git a/packages/strapi-plugin-settings-manager/admin/src/translations/nl.json b/packages/strapi-plugin-settings-manager/admin/src/translations/nl.json index 593f4ec87b..4efe15eb62 100644 --- a/packages/strapi-plugin-settings-manager/admin/src/translations/nl.json +++ b/packages/strapi-plugin-settings-manager/admin/src/translations/nl.json @@ -79,6 +79,11 @@ "form.server.item.host": "Host", "form.server.item.port": "Poort", "form.server.name": "Server", + "form.server.item.proxy": "Proxy Instellingen", + "form.server.item.proxy.enable": "Proxy Inschakelen", + "form.server.item.proxy.host": "Proxy Host", + "form.server.item.proxy.port": "Proxy Poort", + "form.server.item.proxy.ssl": "Proxy SSL", "language.af": "Afrikaans", "language.af_NA": "Afrikaans (Namibië)", "language.af_ZA": "Afrikaans (Suid-Afrika)", diff --git a/packages/strapi-plugin-users-permissions/admin/src/translations/nl.json b/packages/strapi-plugin-users-permissions/admin/src/translations/nl.json index e002aa3927..1489e970a4 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/translations/nl.json +++ b/packages/strapi-plugin-users-permissions/admin/src/translations/nl.json @@ -6,7 +6,9 @@ "Auth.form.button.register": "Klaar om te beginnen", "Auth.form.button.register-success": "Opnieuw versturen", "Auth.form.button.reset-password": "Wachtwoord wijzigen", + "Auth.form.error.blocked": "Uw account werd geblokkeerd door de administrator.", "Auth.form.error.code.provide": "Incorrecte code ingevoerd.", + "Auth.form.error.confirmed": "Het e-mailadres voor uw account is nog niet bevestigd.", "Auth.form.error.email.invalid": "Dit e-mailadres is onjuist", "Auth.form.error.email.provide": "Voer a.u.b. je gebruikersnaam of je e-mail in.", "Auth.form.error.email.taken": "E-mailadres is al in gebruik", @@ -17,6 +19,7 @@ "Auth.form.error.password.local": "Deze gebruiker heeft nooit een lokaal wachtwoord ingesteld, gebruik de leverancier welke gebruikt is tijdens het maken van het account om in te loggen/", "Auth.form.error.password.matching": "Wachtwoorden komen niet overeen.", "Auth.form.error.password.provide": "Voer a.u.b je wachtwoord in.", + "Auth.form.error.ratelimit": "Teveel pogingen, gelieve opnieuw te proberen binnen een minuut.", "Auth.form.error.user.not-exist": "Dit e-mailadres bestaat niet.", "Auth.form.error.username.taken": "Gebruikersnaam is al in gebruik", "Auth.form.forgot-password.email.label": "Voer je e-mail in", @@ -52,8 +55,12 @@ "EditForm.inputSelect.subscriptions.description": "Stel een limiet in voor het aantal abonnementen per IP per uur", "EditForm.inputSelect.subscriptions.label": "Beheer abonnementen quotas", "EditForm.inputToggle.description.email": "Zorg ervoor dat de gebruiker niet meerdere accounts kan maken met hetzelfde e-mailadres maar met verschillende leveranciers.", + "EditForm.inputToggle.description.email-confirmation": "Wanneer ingeschakeld (ON), ontvangen nieuw geregistreerde gebruikers een bevestigingsmail.", + "EditForm.inputToggle.description.email-confirmation-redirection": "Na het bevestigen van je e-mail, kies naar waar je doorgestuurd zal worden.", "EditForm.inputToggle.description.sign-up": "Wanneer uitgeschakeld (OFF), is registratie verboden. Niemand kan abonneren ongeacht de leverancier", "EditForm.inputToggle.label.email": "Één account per e-mailadres.", + "EditForm.inputToggle.label.email-confirmation": "Schakel emailbevestiging in", + "EditForm.inputToggle.label.email-confirmation-redirection": "Doorstuur URL", "EditForm.inputToggle.label.sign-up": "Registratie inschakelen", "EditPage.cancel": "Annuleren", "EditPage.form.roles": "Rol details", @@ -69,6 +76,7 @@ "EditPage.notification.policies.error": "Er is een fout opgetreden tijdens het ophalen van het beleid", "EditPage.notification.role.error": "Er is een fout opgetreden tijdens het ophalen van de rol", "EditPage.submit": "Opslaan", + "Email.template.email_confirmation": "E-mailadres bevestiging", "Email.template.reset_password": "Wachtwoord herstellen", "Email.template.success_register": "Registratie gelukt", "Email.template.validation_email": "E-mailadres validatie", @@ -113,6 +121,7 @@ "PopUpForm.Email.success_register.options.object.placeholder": "Bevestig a.u.b. het e-mailadres voor %APP_NAME%", "PopUpForm.Email.validation_email.options.message.placeholder": "

Klik op deze link om je account te valideren

", "PopUpForm.Email.validation_email.options.object.placeholder": "Bevestig a.u.b. het e-mailadres voor %APP_NAME%", + "PopUpForm.Providers.discord.providerConfig.redirectURL": "De doorstuur URL om in je Discord applicatie configuratie te zetten", "PopUpForm.Providers.callback.placeholder": "TEXT", "PopUpForm.Providers.enabled.description": "Als deze uitgeschakeld is kunnen gebruikers geen gebruik maken van deze leverancier.", "PopUpForm.Providers.enabled.label": "Inschakelen", @@ -121,6 +130,7 @@ "PopUpForm.Providers.google.providerConfig.redirectURL": "De doorstuur URL om in je Google applicatie configuratie te zetten", "PopUpForm.Providers.key.label": "Client ID", "PopUpForm.Providers.key.placeholder": "TEXT", + "PopUpForm.Providers.microsoft.providerConfig.redirectURL": "De doorstuur URL om in je Microsoft applicatie configuratie te zetten", "PopUpForm.Providers.linkedin2.providerConfig.redirectURL": "De doorstuur URL om in je LinkedIn applicatie configuratie te zetten", "PopUpForm.Providers.redirectURL.front-end.label": "De doorstuur URL voor jouw front-end app", "PopUpForm.Providers.secret.label": "Client Secret", @@ -132,6 +142,7 @@ "PopUpForm.header.edit.email-templates": "E-mail sjablonen aanpassen", "PopUpForm.header.edit.providers": "Leverancier {provider} aanpassen", "PopUpForm.inputSelect.providers.label": "Kies een leverancier", + "components.Input.error.password.length": "Wachtwoord is te kort", "components.Input.error.password.noMatch": "Wachtwoorden komen niet overeen", "notification.error.delete": "Er is een fout opgetreden tijdens het verwijderen van dit item", "notification.error.fetch": "Er is een fout opgetreden tijdens het ophalen van de data", From 403c5d0567e67d767a380d5678ec3e734551b141 Mon Sep 17 00:00:00 2001 From: Pedro Caseiro Date: Tue, 2 Oct 2018 22:53:00 +0100 Subject: [PATCH 39/81] issue #1626: pt translations --- .../admin/src/translations/pt.json | 7 +- .../admin/src/translations/pt.json | 42 ++++- .../admin/src/translations/pt.json | 5 + .../admin/src/translations/pt.json | 155 +++++++++++++++++- 4 files changed, 203 insertions(+), 6 deletions(-) diff --git a/packages/strapi-admin/admin/src/translations/pt.json b/packages/strapi-admin/admin/src/translations/pt.json index 6265180f2b..7e2be79f02 100644 --- a/packages/strapi-admin/admin/src/translations/pt.json +++ b/packages/strapi-admin/admin/src/translations/pt.json @@ -3,7 +3,7 @@ "Content Manager": "Gestor de conteúdo", "Content Type Builder": "Construtor de Tipo de Conteúdo", "Email": "Email", - "HomePage.notification.newsLetter.success": "Subscrito à newslatter com sucesso", + "HomePage.notification.newsLetter.success": "Subscrito à newsletter com sucesso", "New entry": "Nova entrada", "Password": "Palavra-passe", "Provider": "Provedor", @@ -12,7 +12,9 @@ "Settings Manager": "Gerenciador de configurações", "Username": "Nome de utilizador", "Users": "Utilizadores", - "Users & Permissions": "Utilizador & Permições", + "Users & Permissions": "Utilizador & Permissões", + "Files Upload": "Carregamento de Ficheiros", + "Roles & Permissions": "Grupos e Permissões", "app.components.BlockLink.code": "Exemplos de codigos", "app.components.BlockLink.code.content": "Aprenda testando projetos reais desenvolvidos pela comunidade.", "app.components.BlockLink.documentation": "Leia a documentação", @@ -23,6 +25,7 @@ "app.components.ComingSoonPage.featuresNotAvailable": "Esta funcionalidade continua em desenvolvimento", "app.components.DownloadInfo.download": "Transferência em curso...", "app.components.DownloadInfo.text": "Isto poderá levar alguns minutos. Obrigado pela sua paciência", + "app.components.EmptyAttributes.title": "Ainda não há campos", "app.components.HomePage.button.blog": "VEJA MAIS NO BLOG", "app.components.HomePage.button.quickStart": "COMEÇAR UM BREVE TUTORIAL", "app.components.HomePage.community": "Encontre a comunidade na web", diff --git a/packages/strapi-plugin-content-manager/admin/src/translations/pt.json b/packages/strapi-plugin-content-manager/admin/src/translations/pt.json index 42c5bf1baa..8a8d7bb315 100644 --- a/packages/strapi-plugin-content-manager/admin/src/translations/pt.json +++ b/packages/strapi-plugin-content-manager/admin/src/translations/pt.json @@ -1,7 +1,10 @@ { - "EditRelations.title": "Dados relacionais", "components.AddFilterCTA.add": "Filtros", "components.AddFilterCTA.hide": "Filtros", + "components.DraggableAttr.edit": "Clique para editar", + "components.EmptyAttributesBlock.button": "Ir para a página de configurações", + "components.EmptyAttributesBlock.description": "Pode alterar as configurações", + "components.FilterOptions.button.apply": "Aplicar", "components.FilterOptions.FILTER_TYPES.=": "é", "components.FilterOptions.FILTER_TYPES._contains": "contém", "components.FilterOptions.FILTER_TYPES._containss": "contém (case sensitive)", @@ -10,7 +13,7 @@ "components.FilterOptions.FILTER_TYPES._lt": "é menor que", "components.FilterOptions.FILTER_TYPES._lte": "é menor que ou igual à", "components.FilterOptions.FILTER_TYPES._ne": "não é", - "components.FilterOptions.button.apply": "Aplicar", + "components.FiltersPickWrapper.hide": "Esconder", "components.FiltersPickWrapper.PluginHeader.actions.apply": "Aplicar", "components.FiltersPickWrapper.PluginHeader.actions.clearAll": "Limpar tudo", "components.FiltersPickWrapper.PluginHeader.description": "Definir as condições a serem aplicadas para filtrar as entradas", @@ -22,12 +25,15 @@ "components.TableDelete.entries.plural": "{number} entradas selecionadas", "components.TableDelete.entries.singular": "{number} entrada selecionada", "components.TableEmpty.withFilters": "Não há {contentType} com os filtros aplicados...", - "components.TableEmpty.withSearch": "Não há {contentType} correspondente à pesquisa ({search})...", "components.TableEmpty.withoutFilter": "Não há {contentType}...", + "components.TableEmpty.withSearch": "Não há {contentType} correspondente à pesquisa ({search})...", + "containers.Edit.addAnItem": "Adicionar uma entrada...", + "containers.Edit.clickToJump": "Clique para saltar para a entrada", "containers.Edit.delete": "Apagar", "containers.Edit.editing": "Editando...", "containers.Edit.reset": "Restabelecer", "containers.Edit.returnList": "Retornar à lista", + "containers.Edit.seeDetails": "Detalhes", "containers.Edit.submit": "Guardar", "containers.Home.introduction": "Para editar suas entradas, acesse o link específico no menu à esquerda. Esta extensão não tem uma maneira correcta de editar configurações e ainda está em desenvolvimento activo.", "containers.Home.pluginHeaderDescription": "Gerencie suas entradas através de uma interface poderosa e bonita.", @@ -36,9 +42,23 @@ "containers.List.errorFetchRecords": "Erro", "containers.List.pluginHeaderDescription": "{label} entradas encontradas", "containers.List.pluginHeaderDescription.singular": "{label} entrada encontrada", + "containers.ListPage.displayedFields": "Campos visíveis", + "containers.SettingPage.addField": "Adicionar um novo campo", + "containers.SettingPage.addRelationalField": "Adicionar um novo campo relacional", + "containers.SettingPage.attributes": "Campos de atributos", + "containers.SettingPage.attributes.description": "Definir a ordem dos atributos", "containers.SettingPage.editSettings.description": "Drag & drop the fields to build the layout", "containers.SettingPage.editSettings.title": "Edit — Settings", + "containers.SettingPage.listSettings.description": "Configurar as opções para este tipo de conteúdo", + "containers.SettingPage.listSettings.title": "Lista — Configurações", + "containers.SettingPage.pluginHeaderDescription": "Configure as configurações específicas para este tipo de conteúdo", "containers.SettingPage.relations": "Relational fields", + "containers.SettingsPage.Block.contentType.description": "Configurar configurações específicas", + "containers.SettingsPage.Block.contentType.title": "Tipos de conteúdo", + "containers.SettingsPage.Block.generalSettings.description": "Configure opções por defeito para este tipo de conteúdo", + "containers.SettingsPage.Block.generalSettings.title": "Geral", + "containers.SettingsPage.pluginHeaderDescription": "Configure as opções por defeito para todos os tipos de conteúdos", + "EditRelations.title": "Dados relacionais", "emptyAttributes.button": "Ir para o construtor de tipo de conteúdo", "emptyAttributes.description": "Adicione seu primeiro campo ao seu Tipo de Conteúdo", "emptyAttributes.title": "Ainda não há campos", @@ -62,10 +82,24 @@ "error.validation.minSupMax": "Não pode ser superior", "error.validation.regex": "Este valor não corresponde ao regex.", "error.validation.required": "O valor desta entrada é obrigatória.", + "form.Input.bulkActions": "Ativar ações em massa", + "form.Input.defaultSort": "Ordenação por defeito", "form.Input.description": "Description", "form.Input.description.placeholder": "Display name in the profile", "form.Input.disabled": "Editable field", + "form.Input.filters": "Ativar filtros", + "form.Input.label": "Legenda", + "form.Input.label.inputDescription": "Este valor sobrepõe a legenda visível no cabeçalho da tabela", + "form.Input.pageEntries": "Entradas por página", + "form.Input.pageEntries.inputDescription": "Nota: Pode sobrepôr o valor deste tipo de conteúdo na página de configurações.", + "form.Input.placeholder": "Preenchimento", + "form.Input.placeholder.placeholder": "O meu valor espetacular", + "form.Input.search": "Ativar pesquisa", + "form.Input.search.field": "Ative a pesquisa neste campo", + "form.Input.sort.field": "Ative a ordenação neste campo", + "notification.error.displayedFields": "Precisa de ter pelo menos um campo visível", "notification.error.relationship.fetch": "Ocorreu um erro durante a busca da relação.", + "notification.info.SettingPage.disableSort": "Precisa de ter pelo menos um atributo com ordenação ativada", "pageNotFound": "Página não encontrada", "plugin.description.long": "Maneira rápida de ver, editar e excluir os dados em sua base de dados.", "plugin.description.short": "Maneira rápida de ver, editar e excluir os dados em sua base de dados.", @@ -74,6 +108,8 @@ "popUpWarning.button.cancel": "Cancelar", "popUpWarning.button.confirm": "Confirmar", "popUpWarning.title": "Por favor, confirme", + "popUpWarning.warning.cancelAllSettings": "Tem a certeza de que quer cancelar as alterações?", + "popUpWarning.warning.updateAllSettings": "Isto vai alterar todas as suas configurações", "success.record.delete": "Apagado", "success.record.save": "Guardado" } \ No newline at end of file diff --git a/packages/strapi-plugin-settings-manager/admin/src/translations/pt.json b/packages/strapi-plugin-settings-manager/admin/src/translations/pt.json index 564f53fe9e..0aedfccf13 100644 --- a/packages/strapi-plugin-settings-manager/admin/src/translations/pt.json +++ b/packages/strapi-plugin-settings-manager/admin/src/translations/pt.json @@ -78,6 +78,11 @@ "form.server.item.cron": "Cron", "form.server.item.host": "Host", "form.server.item.port": "Port", + "form.server.item.proxy": "Configurações do Proxy", + "form.server.item.proxy.enable": "Ativar Proxy", + "form.server.item.proxy.host": "Anfitrião do Proxy", + "form.server.item.proxy.port": "Porto do Proxy", + "form.server.item.proxy.ssl": "Proxy SSL", "form.server.name": "Servidor", "language.af": "Afrikaans", "language.af_NA": "Afrikaans (Namibië)", diff --git a/packages/strapi-plugin-users-permissions/admin/src/translations/pt.json b/packages/strapi-plugin-users-permissions/admin/src/translations/pt.json index 9e26dfeeb6..2728c36fdb 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/translations/pt.json +++ b/packages/strapi-plugin-users-permissions/admin/src/translations/pt.json @@ -1 +1,154 @@ -{} \ No newline at end of file +{ + "Auth.advanced.allow_register": "Permitir registo", + "Auth.form.button.forgot-password": "Enviar email", + "Auth.form.button.forgot-password.success": "Enviar novamente", + "Auth.form.button.login": "Entrar", + "Auth.form.button.register": "Preparado para começar", + "Auth.form.button.register-success": "Enviar novamente", + "Auth.form.button.reset-password": "Alterar palavra-passe", + "Auth.form.error.blocked": "A sua conta foi bloqueada por um administrador.", + "Auth.form.error.code.provide": "O código fornecido está incorreto.", + "Auth.form.error.confirmed": "O email da sua conta não está confirmado.", + "Auth.form.error.email.invalid": "Este email é inválido.", + "Auth.form.error.email.provide": "Por favor preencha com o nome de utilizador ou email.", + "Auth.form.error.email.taken": "O email já está a ser utilizado.", + "Auth.form.error.invalid": "Identificador ou password inválida.", + "Auth.form.error.noAdminAccess": "Não pode aceder ao painel administrativo.", + "Auth.form.error.params.provide": "Os parâmetros submetidos estão errados.", + "Auth.form.error.password.format": "A password não pode conter o símbolo `$` mais do que 3 vezes.", + "Auth.form.error.password.local": "Este utilizador nunca definiu a palavra-passe local, por favor faça login pelo serviço utilizado aquando a criação da conta.", + "Auth.form.error.password.matching": "As passwords não coincidem.", + "Auth.form.error.password.provide": "Por favor submeta a palavra-passe.", + "Auth.form.error.ratelimit": "Demasiadas tentativas, por favor tente novamente dentro de um minuto.", + "Auth.form.error.user.not-exist": "Este email não existe.", + "Auth.form.error.username.taken": "O nome de utilizador já está utilizado.", + "Auth.form.forgot-password.email.label": "Insira o seu email", + "Auth.form.forgot-password.email.label.success": "Email enviado com sucesso", + "Auth.form.forgot-password.email.placeholder": "mysuperemail@gmail.com", + "Auth.form.header.forgot-password": "strapi", + "Auth.form.header.login": "strapi", + "Auth.form.header.register": "Bem Vindo!", + "Auth.form.header.register-success": "strapi", + "Auth.form.login.password.label": "Palavra-passe", + "Auth.form.login.rememberMe.label": "Lembrar-me", + "Auth.form.login.username.label": "Nome de utilizador", + "Auth.form.login.username.placeholder": "John Doe", + "Auth.form.register-success.email.label": "Email enviado com sucesso para", + "Auth.form.register-success.email.placeholder": "mysuperemail@gmail.com", + "Auth.form.register.confirmPassword.label": "Confirmação de palavra-passe", + "Auth.form.register.email.label": "Email", + "Auth.form.register.email.placeholder": "johndoe@gmail.com", + "Auth.form.register.news.label": "Mantenha-me a par das novas funcionalidades e melhoramentos futuros.", + "Auth.form.register.password.label": "Palavra-passe", + "Auth.form.register.username.label": "Nome de utilizador", + "Auth.form.register.username.placeholder": "John Doe", + "Auth.header.register.description": "Para terminar a configuração e melhorar a segurança da sua aplicação, por favor crie o primeiro utilizador (root admin) inserindo a informação necessária abaixo.", + "Auth.link.forgot-password": "Esqueceu a palavra-passe?", + "Auth.link.ready": "Preparado para entrar?", + "BoundRoute.title": "Ligar rota a", + "Controller.input.label": "{legenda} ", + "Controller.selectAll": "Selecionar todos", + "EditForm.inputSelect.description.role": "Vai atribuir o grupo selecionado ao novo utilizador autenticado.", + "EditForm.inputSelect.durations.description": "Número de horas em que o utilizador não se pode registar.", + "EditForm.inputSelect.durations.label": "Duração", + "EditForm.inputSelect.label.role": "Grupo por defeito para utilizadores autenticados", + "EditForm.inputSelect.subscriptions.description": "Limitar o número de registos por endereço IP por hora.", + "EditForm.inputSelect.subscriptions.label": "Gerir limites de registo", + "EditForm.inputToggle.description.email": "Proibir a criação de múltiplas contas com o mesmo email por serviços de autenticação diferentes.", + "EditForm.inputToggle.description.email-confirmation": "Quando ativado (ON), os novos utilizadores recebem um email de confirmação.", + "EditForm.inputToggle.description.email-confirmation-redirection": "Após confirmar o seu email, escolha para onde vai ser redirecionado.", + "EditForm.inputToggle.description.sign-up": "Quando desativado (OFF), o processo de registo está proibido. Ninguém se consegue registar mais, independentemente do serviço de authenticação.", + "EditForm.inputToggle.label.email": "Uma conta por endereço de email", + "EditForm.inputToggle.label.email-confirmation": "Ativar email de confirmação", + "EditForm.inputToggle.label.email-confirmation-redirection": "Endereço de redirecionamento (URL)", + "EditForm.inputToggle.label.sign-up": "Ativar registos", + "EditPage.cancel": "Cancelar", + "EditPage.form.roles": "Detalhes do grupo", + "EditPage.form.roles.label.description": "Descrição", + "EditPage.form.roles.label.name": "Nome", + "EditPage.form.roles.label.users": "Utilizadores associados a este grupo ({number})", + "EditPage.form.roles.name.error": "Este valor é obrigatório.", + "EditPage.header.description": "{description} ", + "EditPage.header.description.create": " ", + "EditPage.header.title": "{name} ", + "EditPage.header.title.create": "Criar um novo grupo", + "EditPage.notification.permissions.error": "Ocorreu um erro a obter as permissões", + "EditPage.notification.policies.error": "Ocorreu um erro a obter as restrições", + "EditPage.notification.role.error": "Ocorreu um erro a obter os grupos", + "EditPage.submit": "Guardar", + "Email.template.email_confirmation": "Endereço de email de confirmação", + "Email.template.reset_password": "Redefinir palavra-passe", + "Email.template.success_register": "Registado com sucesso", + "HeaderNav.link.advancedSettings": "Configurações avançadas", + "HeaderNav.link.emailTemplates": "Modelos de email", + "HeaderNav.link.providers": "Serviços de autenticação", + "HeaderNav.link.roles": "Grupos e permissões", + "HomePage.header.description": "Defina os grupos e permissões dos seus utilizadores.", + "HomePage.header.title": "Grupos e permissões", + "InputSearch.placeholder": "Procurar um utilizador", + "List.button.providers": "Adicionar um novo serviço de autenticação", + "List.button.roles": "Adicionar um novo grupo", + "List.title.emailTemplates.plural": "{number} modelos de email disponíveis", + "List.title.emailTemplates.singular": "{number} modelo de email disponível", + "List.title.providers.disabled.plural": "{number} estão desativados", + "List.title.providers.disabled.singular": "{number} está desativado", + "List.title.providers.enabled.plural": "{number} serviços de antenticação estão ativados e", + "List.title.providers.enabled.singular": "{number} serviço de antenticação está ativado e", + "List.title.roles.plural": "{number} grupos estão disponíveis", + "List.title.roles.singular": "{number} grupo está disponível", + "Plugin.permissions.application.description": "Defina todas as ações permitidas para o seu projeto.", + "Plugin.permissions.plugins.description": "Defina todas as ações permitidas para o plugin {name}.", + "Plugins.header.description": "Todas as ações associadas a uma rota estão listadas abaixo.", + "Plugins.header.title": "Permissões", + "Policies.InputSelect.empty": "Nenhum(a)", + "Policies.InputSelect.label": "Permitir executar esta ação para:", + "Policies.header.hint": "Selecione as ações da aplicação ou dos plugins e clique no ícone para mostrar as rotas associadas", + "Policies.header.title": "Configurações avançadas", + "PopUpForm.Email.email_templates.inputDescription": "Se não tem a certeza de como usar as variáveis, {link}", + "PopUpForm.Email.link.documentation": "consulte a nossa documentação.", + "PopUpForm.Email.options.from.email.label": "Shipper email", + "PopUpForm.Email.options.from.email.placeholder": "johndoe@gmail.com", + "PopUpForm.Email.options.from.name.label": "Shipper name", + "PopUpForm.Email.options.from.name.placeholder": "John Doe", + "PopUpForm.Email.options.message.label": "Mensagem", + "PopUpForm.Email.options.object.label": "Assunto", + "PopUpForm.Email.options.response_email.label": "Email de resposta", + "PopUpForm.Email.options.response_email.placeholder": "johndoe@gmail.com", + "PopUpForm.Email.reset_password.options.message.placeholder": "

Por favor clique neste link para validar a sua conta

", + "PopUpForm.Email.reset_password.options.object.placeholder": "Por favor confirme o seu endereço de email para %APP_NAME%", + "PopUpForm.Email.success_register.options.message.placeholder": "

Por favor clique neste link para validar a sua conta

", + "PopUpForm.Email.success_register.options.object.placeholder": "Por favor confirme o seu endereço de email para %APP_NAME%", + "PopUpForm.Email.validation_email.options.message.placeholder": "

Por favor clique neste link para validar a sua conta

", + "PopUpForm.Email.validation_email.options.object.placeholder": "Por favor confirme o seu endereço de email para %APP_NAME%", + "PopUpForm.Providers.callback.placeholder": "TEXTO", + "PopUpForm.Providers.discord.providerConfig.redirectURL": "Endereço de redirecionamento para adicionar às configurações da sua aplicação de Discord", + "PopUpForm.Providers.enabled.description": "Se desativado, os utilizadores não conseguirão utilizar este serviço de autenticação.", + "PopUpForm.Providers.enabled.label": "Ativar", + "PopUpForm.Providers.facebook.providerConfig.redirectURL": "Endereço de redirecionamento para adicionar às configurações da sua aplicação do Facebook", + "PopUpForm.Providers.github.providerConfig.redirectURL": "Endereço de redirecionamento para adicionar às configurações da sua aplicação de GitHub", + "PopUpForm.Providers.google.providerConfig.redirectURL": "Endereço de redirecionamento para adicionar às configurações da sua aplicação da Google", + "PopUpForm.Providers.key.label": "ID de Client", + "PopUpForm.Providers.key.placeholder": "TEXTO", + "PopUpForm.Providers.linkedin2.providerConfig.redirectURL": "Endereço de redirecionamento para adicionar às configurações da sua aplicação de Linkedin", + "PopUpForm.Providers.microsoft.providerConfig.redirectURL": "Endereço de redirecionamento para adicionar às configurações da sua aplicação da Microsoft", + "PopUpForm.Providers.redirectURL.front-end.label": "Endereço de redirecionamento para a sua aplicação de front-end", + "PopUpForm.Providers.secret.label": "Segredo de cliente", + "PopUpForm.Providers.secret.placeholder": "TEXTO", + "PopUpForm.Providers.twitter.providerConfig.redirectURL": "Endereço de redirecionamento para adicionar às configurações da sua aplicação de Twitter", + "PopUpForm.button.cancel": "Cancelar", + "PopUpForm.button.save": "Guardar", + "PopUpForm.header.add.providers": "Adicionar novo serviço de autenticação", + "PopUpForm.header.edit.email-templates": "Editar Modelos de Email", + "PopUpForm.header.edit.providers": "Editar o serviço de autenticação {provider}", + "PopUpForm.inputSelect.providers.label": "Selecionar o serviço de autenticação", + "components.Input.error.password.noMatch": "As passwords não coincidem", + "components.Input.error.password.length": "A password é demasiado curta", + "notification.error.delete": "Ocorreu um erro a tentar eliminar o item", + "notification.error.fetch": "Ocorreu um erro a tentar obter os dados", + "notification.error.fetchUser": "Ocorreu um erro a tentar obter os utilizadores", + "notification.info.emailSent": "O email foi enviado", + "notification.success.delete": "O item foi eliminado", + "notification.success.submit": "As configurações foram atualizadas", + "plugin.description.long": "Proteja a sua API com um processo completo de autenticação baseado em JWT. Este plugin também vem com estratégia de ACL que permite gerir permissões entre grupos de utilizadores.", + "plugin.description.short": "Proteja a sua API com um processo completo de autenticação baseado em JWT" +} \ No newline at end of file From bb66b760876b1c8d611ba3e4a2996312f3786e9f Mon Sep 17 00:00:00 2001 From: Alberto Maturano Date: Tue, 2 Oct 2018 20:02:24 -0500 Subject: [PATCH 40/81] Improve spanish translation fix #1621 --- .../admin/src/translations/es.json | 1 + .../admin/src/translations/es.json | 16 ++++++++++++ .../admin/src/translations/es.json | 7 ++++- .../admin/src/translations/es.json | 26 +++++++++++++------ 4 files changed, 41 insertions(+), 9 deletions(-) diff --git a/packages/strapi-admin/admin/src/translations/es.json b/packages/strapi-admin/admin/src/translations/es.json index 3252b9958a..18a005c70f 100644 --- a/packages/strapi-admin/admin/src/translations/es.json +++ b/packages/strapi-admin/admin/src/translations/es.json @@ -25,6 +25,7 @@ "app.components.ComingSoonPage.featuresNotAvailable": "Esta característica está aún en desarrollo.", "app.components.DownloadInfo.download": "Descarga en curso...", "app.components.DownloadInfo.text": "Esto puede tardar un minuto. Gracias por su paciencia.", + "app.components.EmptyAttributes.title": "Aún no hay campos", "app.components.HomePage.button.blog": "VER MÁS EN EL BLOG", "app.components.HomePage.button.quickStart": "INICIAR EL TUTORIAL DE INICIO RÁPIDO", "app.components.HomePage.community": "Encuentra la comunidad en la web", diff --git a/packages/strapi-plugin-content-manager/admin/src/translations/es.json b/packages/strapi-plugin-content-manager/admin/src/translations/es.json index 237dfb52bc..eabadc6ad7 100644 --- a/packages/strapi-plugin-content-manager/admin/src/translations/es.json +++ b/packages/strapi-plugin-content-manager/admin/src/translations/es.json @@ -3,6 +3,8 @@ "components.AddFilterCTA.add": "Filtros", "components.AddFilterCTA.hide": "Filtros", "components.DraggableAttr.edit": "Click para editar", + "components.EmptyAttributesBlock.button": "Ir a la página de configuraciones", + "components.EmptyAttributesBlock.description": "Usted puede cambiar sus configuraciones", "components.FilterOptions.FILTER_TYPES.=": "es", "components.FilterOptions.FILTER_TYPES._contains": "contiene", "components.FilterOptions.FILTER_TYPES._containss": "contiene (distinguiendo mayúsculas y minúsculas)", @@ -25,10 +27,13 @@ "components.TableEmpty.withFilters": "No hay {contentType} con los filtros aplicados...", "components.TableEmpty.withSearch": "No hay {contentType} que coincida con la búsqueda ({search})...", "components.TableEmpty.withoutFilter": "No hay {contentType}...", + "containers.Edit.addAnItem": "Agregar un registro...", + "containers.Edit.clickToJump": "Click para ir al registro", "containers.Edit.delete": "Eliminar", "containers.Edit.editing": "Editando...", "containers.Edit.reset": "Reiniciar", "containers.Edit.returnList": "Regresar a la lista", + "containers.Edit.seeDetails": "Detalles", "containers.Edit.submit": "Guardar", "containers.Home.introduction": "Para editar sus registros vaya al link en específico en el menu de la izquierda. Este plugin no tiene una manera de editar configuraciones y aún esta en continuo desarrollo.", "containers.Home.pluginHeaderDescription": "Gestiona sus registros en una bella y poderoza interfaz.", @@ -37,12 +42,17 @@ "containers.List.errorFetchRecords": "Error", "containers.List.pluginHeaderDescription": "{label} registros encontrados", "containers.List.pluginHeaderDescription.singular": "{label} registro encontrado", + "containers.ListPage.displayedFields": "Campos mostrados", "containers.SettingPage.addField": "Agregar nuevo campo", + "containers.SettingPage.addRelationalField": "Agregar un nuevo campo relacional", "containers.SettingPage.attributes": "Campos de atributos", "containers.SettingPage.attributes.description": "Defina el orden de sus atributos", + "containers.SettingPage.editSettings.description": "Arrastra y suelta los campos para construir el diseño", + "containers.SettingPage.editSettings.title": "Editar — Configuraciones", "containers.SettingPage.listSettings.description": "Configura las opciones para este tipo de contenido", "containers.SettingPage.listSettings.title": "Lista — Configuraciones", "containers.SettingPage.pluginHeaderDescription": "Configura las opciones específicas para este Tipo de Contenido", + "containers.SettingPage.relations": "Campos relacionales", "containers.SettingsPage.Block.contentType.description": "Configuraciones específicas", "containers.SettingsPage.Block.contentType.title": "Tipos de Contenido", "containers.SettingsPage.Block.generalSettings.description": "Configura las opciones por defecto para sus Tipos de Contenido", @@ -73,14 +83,20 @@ "error.validation.required": "Este dato es requerido.", "form.Input.bulkActions": "Habilitar acciones en bloque", "form.Input.defaultSort": "Atributo para ordenar por defecto", + "form.Input.description": "Descripción", + "form.Input.description.placeholder": "Mostrar nombre en el perfíl", + "form.Input.disabled": "Campo editable", "form.Input.filters": "Habilitar filtros", "form.Input.label": "Etiqueta", "form.Input.label.inputDescription": "Este valor sobrescribe la etiqueta mostrada en la cabecera de la tabla", "form.Input.pageEntries": "Registros por página", "form.Input.pageEntries.inputDescription": "Nota: Puede sobrescribir este valor en la página de configuraciones para Tipo de Contenido.", + "form.Input.placeholder": "Placeholder", + "form.Input.placeholder.placeholder": "Mi valor maravilloso", "form.Input.search": "Habilitar la búsqueda", "form.Input.search.field": "Habilitar la búsqueda para este campo", "form.Input.sort.field": "Habilitar ordenado para este campo", + "notification.error.displayedFields": "Usted necesita al menos un campo mostrado", "notification.error.relationship.fetch": "Ocurrió un error durante la consulta de la relación.", "notification.info.SettingPage.disableSort": "Necesita tener un habilidato el ordenado en un atributo", "pageNotFound": "Página no encontrada", diff --git a/packages/strapi-plugin-settings-manager/admin/src/translations/es.json b/packages/strapi-plugin-settings-manager/admin/src/translations/es.json index 4bf6403b54..c6f686b836 100644 --- a/packages/strapi-plugin-settings-manager/admin/src/translations/es.json +++ b/packages/strapi-plugin-settings-manager/admin/src/translations/es.json @@ -78,6 +78,11 @@ "form.server.item.cron": "Cron", "form.server.item.host": "Host", "form.server.item.port": "Puerto", + "form.server.item.proxy": "Proxy Settings", + "form.server.item.proxy.enable": "Proxy Habilitado", + "form.server.item.proxy.host": "Proxy Host", + "form.server.item.proxy.port": "Proxy Puerto", + "form.server.item.proxy.ssl": "Proxy SSL", "form.server.name": "Servidor", "language.af": "Afrikaans", "language.af_NA": "Afrikaans (Namibië)", @@ -627,4 +632,4 @@ "strapi.notification.success.languageAdd": "El idioma ha sido añadido con éxito.", "strapi.notification.success.languageDelete": "El idioma ha sido borrado con éxito.", "strapi.notification.success.settingsEdit": "La configuración se ha actualizado correctamente." -} \ No newline at end of file +} diff --git a/packages/strapi-plugin-users-permissions/admin/src/translations/es.json b/packages/strapi-plugin-users-permissions/admin/src/translations/es.json index 60cfd43371..8e12b29713 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/translations/es.json +++ b/packages/strapi-plugin-users-permissions/admin/src/translations/es.json @@ -6,7 +6,9 @@ "Auth.form.button.register": "Listo para comenzar", "Auth.form.button.register-success": "Enviar nuevamente", "Auth.form.button.reset-password": "Cambiar contraseña", + "Auth.form.error.blocked": "Su cuenta ha sido bloqueada por el administrador.", "Auth.form.error.code.provide": "Código incorrecto proporcionado.", + "Auth.form.error.confirmed": "Su cuenta de correo no ha sido confirmada.", "Auth.form.error.email.invalid": "Este email es inválido.", "Auth.form.error.email.provide": "Por favor proporcione su nombre de usuario o su correo electrónico.", "Auth.form.error.email.taken": "El email ya está registrado", @@ -17,6 +19,7 @@ "Auth.form.error.password.local": "Este usuario nunca estableció una contraseña local, por favor ingrese a través de su proveedor utilizado durante la creación de la cuenta.", "Auth.form.error.password.matching": "Las contraseñas no coinciden.", "Auth.form.error.password.provide": "Por favor, introduzca su contraseña.", + "Auth.form.error.ratelimit": "Demasiados intentos. Por favor vuelva a intentarlo dentro de un minuto.", "Auth.form.error.user.not-exist": "Este email no existe.", "Auth.form.error.username.taken": "El nombre de usuario ya está registrado", "Auth.form.forgot-password.email.label": "Introduce tu email", @@ -24,22 +27,22 @@ "Auth.form.forgot-password.email.placeholder": "mysuperemail@gmail.com", "Auth.form.header.forgot-password": "strapi", "Auth.form.header.login": "strapi", - "Auth.form.header.register": "Bienvenidos!", + "Auth.form.header.register": "¡Bienvenido!", "Auth.form.header.register-success": "strapi", "Auth.form.login.password.label": "Contraseña", "Auth.form.login.rememberMe.label": "Recuérdame", - "Auth.form.login.username.label": "Nombre de usuario", + "Auth.form.login.username.label": "Usuario", "Auth.form.login.username.placeholder": "John Doe", - "Auth.form.register-success.email.label": "Email enviado con éxito a", + "Auth.form.register-success.email.label": "Correo enviado con éxito a", "Auth.form.register-success.email.placeholder": "mysuperemail@gmail.com", - "Auth.form.register.confirmPassword.label": "Contraseña de confirmación", - "Auth.form.register.email.label": "Email", + "Auth.form.register.confirmPassword.label": "Confirmación de contraseña", + "Auth.form.register.email.label": "Correo electrónico", "Auth.form.register.email.placeholder": "johndoe@gmail.com", - "Auth.form.register.news.label": "Manténgame informado sobre las nuevas características y las próximas mejoras.", + "Auth.form.register.news.label": "Mantenerme informado sobre nuevas características y próximas mejoras.", "Auth.form.register.password.label": "Contraseña", "Auth.form.register.username.label": "Nombre de usuario", "Auth.form.register.username.placeholder": "John Doe", - "Auth.header.register.description": "Para terminar de configurar y asegurar su aplicación, por favor cree el primer usuario (administrador root) ingresando la información necesaria a continuación.", + "Auth.header.register.description": "Para terminar de configurar y asegurar su aplicación, por favor cree el primer usuario (administrador) ingresando a continuación la información necesaria.", "Auth.link.forgot-password": "¿Olvidó su contraseña?", "Auth.link.ready": "¿Listo para iniciar sesión?", "BoundRoute.title": "Ruta enlazada a", @@ -52,8 +55,12 @@ "EditForm.inputSelect.subscriptions.description": "Limite el número de suscripciones de IP por hora.", "EditForm.inputSelect.subscriptions.label": "Gestionar cuotas de suscripción", "EditForm.inputToggle.description.email": "No permita que el usuario cree varias cuentas utilizando la misma dirección de correo electrónico con distintos proveedores de autenticación.", + "EditForm.inputToggle.description.email-confirmation": "Estando habilitado (ON), nuevos usuarios registrados reciben un correo de confirmación.", + "EditForm.inputToggle.description.email-confirmation-redirection": "After confirmed your email, chose where you will be redirected.", "EditForm.inputToggle.description.sign-up": "Cuando está desactivado (OFF), el proceso de registro está prohibido. Nadie puede suscribirse sin importar el proveedor utilizado.", "EditForm.inputToggle.label.email": "Una cuenta por dirección de correo electrónico", + "EditForm.inputToggle.label.email-confirmation": "Habilitar confirmación de correo", + "EditForm.inputToggle.label.email-confirmation-redirection": "URL de redirección", "EditForm.inputToggle.label.sign-up": "Habilitar inscripciones", "EditPage.cancel": "Cancelar", "EditPage.form.roles": "Detalles del rol", @@ -69,9 +76,9 @@ "EditPage.notification.policies.error": "Se ha producido un error al recuperar las políticas", "EditPage.notification.role.error": "Se ha producido un error al recuperar el rol", "EditPage.submit": "Guardar", + "Email.template.email_confirmation": "Confirmación de dirección de correo", "Email.template.reset_password": "Restablecer contraseña", "Email.template.success_register": "Inscripción exitosa", - "Email.template.validation_email": "Validación de la dirección de email", "HeaderNav.link.advancedSettings": "Ajustes avanzados", "HeaderNav.link.emailTemplates": "Plantillas de email", "HeaderNav.link.providers": "Proveedores", @@ -114,6 +121,7 @@ "PopUpForm.Email.validation_email.options.message.placeholder": "

Haga clic en este enlace para validar su cuenta

", "PopUpForm.Email.validation_email.options.object.placeholder": "Por favor, confirme su dirección de email para %APP_NAME%", "PopUpForm.Providers.callback.placeholder": "TEXTO", + "PopUpForm.Providers.discord.providerConfig.redirectURL": "La URL de redirección para agregar a las configuraciones de su aplicación Discord", "PopUpForm.Providers.enabled.description": "Si está desactivado, los usuarios no podrán utilizar este proveedor.", "PopUpForm.Providers.enabled.label": "Habilitar", "PopUpForm.Providers.facebook.providerConfig.redirectURL": "La URL de redirección que se debe agregar en la configuración de la aplicación Facebook", @@ -122,6 +130,7 @@ "PopUpForm.Providers.key.label": "ID de cliente", "PopUpForm.Providers.key.placeholder": "TEXTO", "PopUpForm.Providers.linkedin2.providerConfig.redirectURL": "La URL de redirección que se debe agregar en la configuración de la aplicación Linkedin", + "PopUpForm.Providers.microsoft.providerConfig.redirectURL": "La URL de redirección para agregar a las configuraciones de su aplicación Microsoft", "PopUpForm.Providers.redirectURL.front-end.label": "La URL de redireccionamiento a su aplicación front-end", "PopUpForm.Providers.secret.label": "Secreto Cliente", "PopUpForm.Providers.secret.placeholder": "TEXTO", @@ -133,6 +142,7 @@ "PopUpForm.header.edit.providers": "Editar Proveedor {provider}", "PopUpForm.inputSelect.providers.label": "Elija el proveedor", "components.Input.error.password.noMatch": "Las contraseñas no coinciden", + "components.Input.error.password.length": "Contraseña muy corta", "notification.error.delete": "Se ha producido un error al intentar borrar el elemento", "notification.error.fetch": "Se ha producido un error al intentar recuperar los datos", "notification.error.fetchUser": "Se ha producido un error al intentar buscar usuarios", From 220fb2caf8f8ca46ffff5646d62c3adc62c69819 Mon Sep 17 00:00:00 2001 From: cyril lopez Date: Wed, 3 Oct 2018 12:49:43 +0200 Subject: [PATCH 41/81] Fix font-family --- .../src/components/DownloadInfo/styles.scss | 2 +- .../src/components/LeftMenuFooter/styles.scss | 2 +- .../admin/src/components/Sub/styles.scss | 2 +- .../admin/src/containers/HomePage/styles.scss | 4 +- .../src/containers/LocaleToggle/styles.scss | 2 +- .../admin/src/styles/base/fonts.scss | 72 +++++++++---------- .../components/BlockerComponent/styles.scss | 4 +- .../lib/src/components/Button/styles.scss | 4 +- .../EmptyAttributesBlock/styles.scss | 2 +- .../lib/src/components/HeaderNav/styles.scss | 2 +- .../lib/src/components/InputAddon/styles.scss | 4 +- .../InputCheckboxWithErrors/styles.scss | 4 +- .../lib/src/components/InputDate/styles.scss | 2 +- .../components/InputDescription/styles.scss | 2 +- .../lib/src/components/InputEmail/styles.scss | 6 +- .../components/InputFileDetails/styles.scss | 2 +- .../src/components/InputNumber/styles.scss | 2 +- .../src/components/InputPassword/styles.scss | 2 +- .../src/components/InputSearch/styles.scss | 2 +- .../src/components/InputSelect/styles.scss | 2 +- .../lib/src/components/InputText/styles.scss | 2 +- .../src/components/InputTextArea/styles.scss | 2 +- .../InputTextAreaWithErrors/styles.scss | 2 +- .../src/components/InputToggle/styles.scss | 2 +- .../src/components/OverlayBlocker/styles.scss | 2 +- .../lib/src/components/PageFooter/styles.scss | 2 +- .../src/components/PopUpWarning/styles.scss | 6 +- .../src/components/CustomButton/index.js | 2 +- .../EmptyAttributesView/styles.scss | 2 +- .../InputJSONWithErrors/styles.scss | 2 +- .../components/Wysiwyg/componentsStyles.scss | 2 +- .../admin/src/components/Wysiwyg/styles.scss | 4 +- .../WysiwygBottomControls/styles.scss | 2 +- .../components/WysiwygWithErrors/styles.scss | 2 +- .../admin/src/containers/ListPage/styles.scss | 2 +- .../src/components/ContentHeader/styles.scss | 4 +- .../EmptyContentTypeView/styles.scss | 2 +- .../InputCheckboxWithNestedInputs/styles.scss | 4 +- .../admin/src/components/List/styles.scss | 2 +- .../src/components/PluginLeftMenu/styles.scss | 2 +- .../PluginLeftMenuSection/styles.scss | 2 +- .../src/components/PopUpForm/styles.scss | 10 +-- .../src/components/PopUpRelations/styles.scss | 12 ++-- .../src/components/RelationBox/styles.scss | 4 +- .../src/components/TableList/styles.scss | 2 +- .../admin/src/components/Button/styles.scss | 4 +- .../src/components/ContentHeader/styles.scss | 4 +- .../src/components/HeaderNav/styles.scss | 2 +- .../src/components/InputEnum/styles.scss | 2 +- .../src/components/InputSelect/styles.scss | 10 +-- .../src/components/InputToggle/styles.scss | 2 +- .../admin/src/components/List/styles.scss | 14 ++-- .../PluginLeftMenuSection/styles.scss | 2 +- .../components/WithFormSection/styles.scss | 4 +- .../src/components/WithInput/styles.scss | 10 +-- .../admin/src/containers/HomePage/styles.scss | 2 +- .../src/components/HeaderNav/styles.scss | 2 +- .../InputSearchContainer/styles.scss | 4 +- .../admin/src/components/List/styles.scss | 2 +- .../admin/src/components/Plugins/styles.scss | 2 +- .../src/components/PopUpForm/styles.scss | 8 +-- .../admin/src/containers/AuthPage/styles.scss | 2 +- 62 files changed, 140 insertions(+), 140 deletions(-) diff --git a/packages/strapi-admin/admin/src/components/DownloadInfo/styles.scss b/packages/strapi-admin/admin/src/components/DownloadInfo/styles.scss index d8c51a7aae..0f235ed3f9 100644 --- a/packages/strapi-admin/admin/src/components/DownloadInfo/styles.scss +++ b/packages/strapi-admin/admin/src/components/DownloadInfo/styles.scss @@ -9,7 +9,7 @@ padding-top: 3rem; // color: #F64D0A; text-align: center; - font-family: 'Lato', sans-serif; + font-family: Lato; font-size: 1.3rem; > img { width: 2.5rem; diff --git a/packages/strapi-admin/admin/src/components/LeftMenuFooter/styles.scss b/packages/strapi-admin/admin/src/components/LeftMenuFooter/styles.scss index 92a2efa3cc..022f6d9a50 100644 --- a/packages/strapi-admin/admin/src/components/LeftMenuFooter/styles.scss +++ b/packages/strapi-admin/admin/src/components/LeftMenuFooter/styles.scss @@ -11,7 +11,7 @@ padding-left: 15px; padding-right: 15px; line-height: 3rem; - font-family: 'Lato', sans-serif; + font-family: Lato; background-color: rgba(255, 255, 255, .02); font-size: 1rem; font-weight: 400; diff --git a/packages/strapi-admin/admin/src/components/Sub/styles.scss b/packages/strapi-admin/admin/src/components/Sub/styles.scss index 9eebf649dc..8e9af568f5 100644 --- a/packages/strapi-admin/admin/src/components/Sub/styles.scss +++ b/packages/strapi-admin/admin/src/components/Sub/styles.scss @@ -10,7 +10,7 @@ > span { text-decoration: none; - font-family: 'Lato', sans-serif; + font-family: Lato; font-weight: bold; font-size: 20px; color: #333740; diff --git a/packages/strapi-admin/admin/src/containers/HomePage/styles.scss b/packages/strapi-admin/admin/src/containers/HomePage/styles.scss index 34a24ec150..1012d74b3d 100644 --- a/packages/strapi-admin/admin/src/containers/HomePage/styles.scss +++ b/packages/strapi-admin/admin/src/containers/HomePage/styles.scss @@ -9,14 +9,14 @@ line-height: 18px; text-decoration: none; > span { - font-family: 'Lato', sans-serif; + font-family: Lato; font-weight: bold; font-size: 16px; color: #333740; letter-spacing: 0; } > p { - font-family: 'Lato', sans-serif; + font-family: Lato; font-size: 13px; color: #919BAE; letter-spacing: 0; diff --git a/packages/strapi-admin/admin/src/containers/LocaleToggle/styles.scss b/packages/strapi-admin/admin/src/containers/LocaleToggle/styles.scss index 7d4afde11d..712c17fb73 100644 --- a/packages/strapi-admin/admin/src/containers/LocaleToggle/styles.scss +++ b/packages/strapi-admin/admin/src/containers/LocaleToggle/styles.scss @@ -40,7 +40,7 @@ span { color: #333740; font-size: 11px; - font-family: 'Lato', sans-serif; + font-family: Lato; font-weight: 600; letter-spacing: 0.5; text-transform: uppercase; diff --git a/packages/strapi-admin/admin/src/styles/base/fonts.scss b/packages/strapi-admin/admin/src/styles/base/fonts.scss index 40d614afff..85a9a6e236 100644 --- a/packages/strapi-admin/admin/src/styles/base/fonts.scss +++ b/packages/strapi-admin/admin/src/styles/base/fonts.scss @@ -1,146 +1,146 @@ /* Lato (hairline, regular) */ @font-face { - font-family: 'Lato', sans-serif; + font-family: Lato; font-weight: 100; font-style: normal; text-rendering: optimizeLegibility; - src: url("styles/fonts/lato/lato-hairline/lato-hairline.woff2") format("woff2"), url("styles/fonts/lato/lato-hairline/lato-hairline.woff") format("woff"); + src: url("styles/fonts/Lato/Lato-hairline/Lato-hairline.woff2") format("woff2"), url("styles/fonts/Lato/Lato-hairline/Lato-hairline.woff") format("woff"); } /* Lato (hairline, italic) */ @font-face { - font-family: 'Lato', sans-serif; + font-family: Lato; font-weight: 100; font-style: italic; text-rendering: optimizeLegibility; - src: url("styles/fonts/lato/lato-hairline-italic/lato-hairline-italic.woff2") format("woff2"), url("styles/fonts/lato/lato-hairline-italic/lato-hairline-italic.woff") format("woff"); + src: url("styles/fonts/Lato/Lato-hairline-italic/Lato-hairline-italic.woff2") format("woff2"), url("styles/fonts/Lato/Lato-hairline-italic/Lato-hairline-italic.woff") format("woff"); } /* Lato (thin, regular) */ @font-face { - font-family: 'Lato', sans-serif; + font-family: Lato; font-weight: 200; font-style: normal; text-rendering: optimizeLegibility; - src: url("styles/fonts/lato/lato-thin/lato-thin.woff2") format("woff2"), url("styles/fonts/lato/lato-thin/lato-thin.woff") format("woff"); + src: url("styles/fonts/Lato/Lato-thin/Lato-thin.woff2") format("woff2"), url("styles/fonts/Lato/Lato-thin/Lato-thin.woff") format("woff"); } /* Lato (thin, italic) */ @font-face { - font-family: 'Lato', sans-serif; + font-family: Lato; font-weight: 200; font-style: italic; text-rendering: optimizeLegibility; - src: url("styles/fonts/lato/lato-thin-italic/lato-thin-italic.woff2") format("woff2"), url("styles/fonts/lato/lato-thin-italic/lato-thin-italic.woff") format("woff"); + src: url("styles/fonts/Lato/Lato-thin-italic/Lato-thin-italic.woff2") format("woff2"), url("styles/fonts/Lato/Lato-thin-italic/Lato-thin-italic.woff") format("woff"); } /* Lato (light, regular) */ @font-face { - font-family: 'Lato', sans-serif; + font-family: Lato; font-weight: 300; font-style: normal; text-rendering: optimizeLegibility; - src: url("styles/fonts/lato/lato-light/lato-light.woff2") format("woff2"), url("styles/fonts/lato/lato-light/lato-light.woff") format("woff"); + src: url("styles/fonts/Lato/Lato-light/Lato-light.woff2") format("woff2"), url("styles/fonts/Lato/Lato-light/Lato-light.woff") format("woff"); } /* Lato (light, italic) */ @font-face { - font-family: 'Lato', sans-serif; + font-family: Lato; font-weight: 300; font-style: italic; text-rendering: optimizeLegibility; - src: url("styles/fonts/lato/lato-light-italic/lato-light-italic.woff2") format("woff2"), url("styles/fonts/lato/lato-light-italic/lato-light-italic.woff") format("woff"); + src: url("styles/fonts/Lato/Lato-light-italic/Lato-light-italic.woff2") format("woff2"), url("styles/fonts/Lato/Lato-light-italic/Lato-light-italic.woff") format("woff"); } /* Lato (normal, regular) */ @font-face { - font-family: 'Lato', sans-serif; + font-family: Lato; font-weight: 400; font-style: normal; text-rendering: optimizeLegibility; - src: url("styles/fonts/lato/lato-normal/lato-normal.woff2") format("woff2"), url("styles/fonts/lato/lato-normal/lato-normal.woff") format("woff"); + src: url("styles/fonts/Lato/Lato-normal/Lato-normal.woff2") format("woff2"), url("styles/fonts/Lato/Lato-normal/Lato-normal.woff") format("woff"); } /* Lato (normal, italic) */ @font-face { - font-family: 'Lato', sans-serif; + font-family: Lato; font-weight: 400; font-style: italic; text-rendering: optimizeLegibility; - src: url("styles/fonts/lato/lato-normal-italic/lato-normal-italic.woff2") format("woff2"), url("styles/fonts/lato/lato-normal-italic/lato-normal-italic.woff") format("woff"); + src: url("styles/fonts/Lato/Lato-normal-italic/Lato-normal-italic.woff2") format("woff2"), url("styles/fonts/Lato/Lato-normal-italic/Lato-normal-italic.woff") format("woff"); } /* Lato (medium, regular) */ @font-face { - font-family: 'Lato', sans-serif; + font-family: Lato; font-weight: 400; font-style: normal; text-rendering: optimizeLegibility; - src: url("styles/fonts/lato/lato-medium/lato-medium.woff2") format("woff2"), url("styles/fonts/lato/lato-medium/lato-medium.woff") format("woff"); + src: url("styles/fonts/Lato/Lato-medium/Lato-medium.woff2") format("woff2"), url("styles/fonts/Lato/Lato-medium/Lato-medium.woff") format("woff"); } /* Lato (medium, italic) */ @font-face { - font-family: 'Lato', sans-serif; + font-family: Lato; font-weight: 400; font-style: italic; text-rendering: optimizeLegibility; - src: url("styles/fonts/lato/lato-medium-italic/lato-medium-italic.woff2") format("woff2"), url("styles/fonts/lato/lato-medium-italic/lato-medium-italic.woff") format("woff"); + src: url("styles/fonts/Lato/Lato-medium-italic/Lato-medium-italic.woff2") format("woff2"), url("styles/fonts/Lato/Lato-medium-italic/Lato-medium-italic.woff") format("woff"); } /* Lato (semibold, regular) */ @font-face { - font-family: 'Lato', sans-serif; + font-family: Lato; font-weight: 500; font-style: normal; text-rendering: optimizeLegibility; - src: url("styles/fonts/lato/lato-semibold/lato-semibold.woff2") format("woff2"), url("styles/fonts/lato/lato-semibold/lato-semibold.woff") format("woff"); + src: url("styles/fonts/Lato/Lato-semibold/Lato-semibold.woff2") format("woff2"), url("styles/fonts/Lato/Lato-semibold/Lato-semibold.woff") format("woff"); } /* Lato (semibold, italic) */ @font-face { - font-family: 'Lato', sans-serif; + font-family: Lato; font-weight: 500; font-style: italic; text-rendering: optimizeLegibility; - src: url("styles/fonts/lato/lato-semibold-italic/lato-semibold-italic.woff2") format("woff2"), url("styles/fonts/lato/lato-semibold-italic/lato-semibold-italic.woff") format("woff"); + src: url("styles/fonts/Lato/Lato-semibold-italic/Lato-semibold-italic.woff2") format("woff2"), url("styles/fonts/Lato/Lato-semibold-italic/Lato-semibold-italic.woff") format("woff"); } /* Lato (bold, regular) */ @font-face { - font-family: 'Lato', sans-serif; + font-family: Lato; font-weight: 600; font-style: normal; text-rendering: optimizeLegibility; - src: url("styles/fonts/lato/lato-bold/lato-bold.woff2") format("woff2"), url("styles/fonts/lato/lato-bold/lato-bold.woff") format("woff"); + src: url("styles/fonts/Lato/Lato-bold/Lato-bold.woff2") format("woff2"), url("styles/fonts/Lato/Lato-bold/Lato-bold.woff") format("woff"); } /* Lato (bold, italic) */ @font-face { - font-family: 'Lato', sans-serif; + font-family: Lato; font-weight: 600; font-style: italic; text-rendering: optimizeLegibility; - src: url("styles/fonts/lato/lato-bold-italic/lato-bold-italic.woff2") format("woff2"), url("styles/fonts/lato/lato-bold-italic/lato-bold-italic.woff") format("woff"); + src: url("styles/fonts/Lato/Lato-bold-italic/Lato-bold-italic.woff2") format("woff2"), url("styles/fonts/Lato/Lato-bold-italic/Lato-bold-italic.woff") format("woff"); } /* Lato (heavy, regular) */ @font-face { - font-family: 'Lato', sans-serif; + font-family: Lato; font-weight: 800; font-style: normal; text-rendering: optimizeLegibility; - src: url("styles/fonts/lato/lato-heavy/lato-heavy.woff2") format("woff2"), url("styles/fonts/lato/lato-heavy/lato-heavy.woff") format("woff"); + src: url("styles/fonts/Lato/Lato-heavy/Lato-heavy.woff2") format("woff2"), url("styles/fonts/Lato/Lato-heavy/Lato-heavy.woff") format("woff"); } /* Lato (heavy, italic) */ @font-face { - font-family: 'Lato', sans-serif; + font-family: Lato; font-weight: 800; font-style: italic; text-rendering: optimizeLegibility; - src: url("styles/fonts/lato/lato-heavy-italic/lato-heavy-italic.woff2") format("woff2"), url("styles/fonts/lato/lato-heavy-italic/lato-heavy-italic.woff") format("woff"); + src: url("styles/fonts/Lato/Lato-heavy-italic/Lato-heavy-italic.woff2") format("woff2"), url("styles/fonts/Lato/Lato-heavy-italic/Lato-heavy-italic.woff") format("woff"); } /* Lato (black, regular) */ @font-face { - font-family: 'Lato', sans-serif; + font-family: Lato; font-weight: 900; font-style: normal; text-rendering: optimizeLegibility; - src: url("styles/fonts/lato/lato-black/lato-black.woff2") format("woff2"), url("styles/fonts/lato/lato-black/lato-black.woff") format("woff"); + src: url("styles/fonts/Lato/Lato-black/Lato-black.woff2") format("woff2"), url("styles/fonts/Lato/Lato-black/Lato-black.woff") format("woff"); } /* Lato (black, italic) */ @font-face { - font-family: 'Lato', sans-serif; + font-family: Lato; font-weight: 900; font-style: italic; text-rendering: optimizeLegibility; - src: url("styles/fonts/lato/lato-black-italic/lato-black-italic.woff2") format("woff2"), url("styles/fonts/lato/lato-black-italic/lato-black-italic.woff") format("woff"); + src: url("styles/fonts/Lato/Lato-black-italic/Lato-black-italic.woff2") format("woff2"), url("styles/fonts/Lato/Lato-black-italic/Lato-black-italic.woff") format("woff"); } diff --git a/packages/strapi-helper-plugin/lib/src/components/BlockerComponent/styles.scss b/packages/strapi-helper-plugin/lib/src/components/BlockerComponent/styles.scss index f3c8c32a70..b8112563ca 100644 --- a/packages/strapi-helper-plugin/lib/src/components/BlockerComponent/styles.scss +++ b/packages/strapi-helper-plugin/lib/src/components/BlockerComponent/styles.scss @@ -5,7 +5,7 @@ .header { display: flex; justify-content: center; - font-family: 'Lato', sans-serif; + font-family: Lato; > div { padding-top: 2.5rem; > h4 { @@ -77,7 +77,7 @@ margin-right: 13px; } cursor: pointer; - font-family: 'Lato', sans-serif; + font-family: Lato; -webkit-font-smoothing: antialiased; &:focus { outline: 0; diff --git a/packages/strapi-helper-plugin/lib/src/components/Button/styles.scss b/packages/strapi-helper-plugin/lib/src/components/Button/styles.scss index d54755b052..1d52efe957 100644 --- a/packages/strapi-helper-plugin/lib/src/components/Button/styles.scss +++ b/packages/strapi-helper-plugin/lib/src/components/Button/styles.scss @@ -29,7 +29,7 @@ white-space: nowrap; margin-right: 1.8rem; cursor: pointer; - font-family: 'Lato', sans-serif; + font-family: Lato; -webkit-font-smoothing: antialiased; &:focus { outline: 0; @@ -155,7 +155,7 @@ padding: 0; border-radius: 0.3rem; letter-spacing: .5rem; - font-family: 'Lato', sans-serif; + font-family: Lato; cursor: not-allowed; opacity: .65; &:focus { diff --git a/packages/strapi-helper-plugin/lib/src/components/EmptyAttributesBlock/styles.scss b/packages/strapi-helper-plugin/lib/src/components/EmptyAttributesBlock/styles.scss index 8d43bca861..bfcc71f833 100644 --- a/packages/strapi-helper-plugin/lib/src/components/EmptyAttributesBlock/styles.scss +++ b/packages/strapi-helper-plugin/lib/src/components/EmptyAttributesBlock/styles.scss @@ -7,7 +7,7 @@ background-repeat: repeat; text-align: center; font-size: 1.4rem; - font-family: 'Lato', sans-serif; + font-family: Lato; box-shadow: 2px 2px 4px #E3E9F3; } diff --git a/packages/strapi-helper-plugin/lib/src/components/HeaderNav/styles.scss b/packages/strapi-helper-plugin/lib/src/components/HeaderNav/styles.scss index 19de406980..cf9656eaf8 100644 --- a/packages/strapi-helper-plugin/lib/src/components/HeaderNav/styles.scss +++ b/packages/strapi-helper-plugin/lib/src/components/HeaderNav/styles.scss @@ -30,7 +30,7 @@ border-radius: 2px 0 0 0; background-color: darken(#F5F5F5, 50%); text-decoration: none !important; - font-family: 'Lato', sans-serif; + font-family: Lato; font-size: 1.3rem; color: #333740 !important; line-height: 1.6rem; diff --git a/packages/strapi-helper-plugin/lib/src/components/InputAddon/styles.scss b/packages/strapi-helper-plugin/lib/src/components/InputAddon/styles.scss index cb0f86ef0f..a7fcc79fad 100644 --- a/packages/strapi-helper-plugin/lib/src/components/InputAddon/styles.scss +++ b/packages/strapi-helper-plugin/lib/src/components/InputAddon/styles.scss @@ -9,7 +9,7 @@ color: rgba(16, 22, 34, 0.5); line-height: 3.2rem; font-size: 1.3rem; - font-family: 'Lato', sans-serif; + font-family: Lato; font-weight: 600!important; -moz-appearance: none; -webkit-appearance: none; @@ -45,7 +45,7 @@ border-radius: 0.25rem; line-height: 3.4rem; font-size: 1.3rem; - font-family: 'Lato', sans-serif !important; + font-family: Lato !important; box-shadow: 0px 1px 1px rgba(104, 118, 142, 0.05); &:focus { border-color: #78caff; diff --git a/packages/strapi-helper-plugin/lib/src/components/InputCheckboxWithErrors/styles.scss b/packages/strapi-helper-plugin/lib/src/components/InputCheckboxWithErrors/styles.scss index d59158f80a..bfbff384d5 100644 --- a/packages/strapi-helper-plugin/lib/src/components/InputCheckboxWithErrors/styles.scss +++ b/packages/strapi-helper-plugin/lib/src/components/InputCheckboxWithErrors/styles.scss @@ -1,7 +1,7 @@ .container { margin-bottom: 1.5rem; font-size: 1.3rem; - font-family: 'Lato', sans-serif; + font-family: Lato; } .inputCheckboxDescriptionContainer { @@ -12,7 +12,7 @@ > small { color: #9EA7B8; - font-family: 'Lato', sans-serif; + font-family: Lato; font-size: 1.2rem; } } diff --git a/packages/strapi-helper-plugin/lib/src/components/InputDate/styles.scss b/packages/strapi-helper-plugin/lib/src/components/InputDate/styles.scss index 38a3c453d5..8eced4761f 100644 --- a/packages/strapi-helper-plugin/lib/src/components/InputDate/styles.scss +++ b/packages/strapi-helper-plugin/lib/src/components/InputDate/styles.scss @@ -7,6 +7,6 @@ border-radius: 0.25rem; line-height: 3.4rem; font-size: 1.3rem; - font-family: 'Lato', sans-serif !important; + font-family: Lato !important; box-shadow: 0px 1px 1px rgba(104, 118, 142, 0.05); } diff --git a/packages/strapi-helper-plugin/lib/src/components/InputDescription/styles.scss b/packages/strapi-helper-plugin/lib/src/components/InputDescription/styles.scss index bf4e7e89c7..b43b8bb2eb 100644 --- a/packages/strapi-helper-plugin/lib/src/components/InputDescription/styles.scss +++ b/packages/strapi-helper-plugin/lib/src/components/InputDescription/styles.scss @@ -5,7 +5,7 @@ > small { color: #9EA7B8; - font-family: 'Lato', sans-serif; + font-family: Lato; font-size: 1.2rem; } } diff --git a/packages/strapi-helper-plugin/lib/src/components/InputEmail/styles.scss b/packages/strapi-helper-plugin/lib/src/components/InputEmail/styles.scss index 7479929b24..78f58a1cb8 100644 --- a/packages/strapi-helper-plugin/lib/src/components/InputEmail/styles.scss +++ b/packages/strapi-helper-plugin/lib/src/components/InputEmail/styles.scss @@ -9,7 +9,7 @@ color: rgba(16, 22, 34, 0.5); line-height: 3.2rem; font-size: 1.3rem; - font-family: 'Lato', sans-serif; + font-family: Lato; font-weight: 600!important; text-transform: capitalize; -moz-appearance: none; @@ -21,7 +21,7 @@ color: #B3B5B9; font-size: 16px; font-weight: 900; - font-family: 'Lato', sans-serif; + font-family: Lato; } & + input { @@ -43,7 +43,7 @@ border-radius: 0.25rem; line-height: 3.4rem; font-size: 1.3rem; - font-family: 'Lato', sans-serif !important; + font-family: Lato !important; box-shadow: 0px 1px 1px rgba(104, 118, 142, 0.05); &:focus { border-color: #78caff; diff --git a/packages/strapi-helper-plugin/lib/src/components/InputFileDetails/styles.scss b/packages/strapi-helper-plugin/lib/src/components/InputFileDetails/styles.scss index cae9293da0..86d3f4b501 100644 --- a/packages/strapi-helper-plugin/lib/src/components/InputFileDetails/styles.scss +++ b/packages/strapi-helper-plugin/lib/src/components/InputFileDetails/styles.scss @@ -68,7 +68,7 @@ .positionContainer { margin-left: 10px; color: #333740; - font-family: 'Lato', sans-serif; + font-family: Lato; -webkit-font-smoothing: antialiased; > span:first-child { font-size: 13px; diff --git a/packages/strapi-helper-plugin/lib/src/components/InputNumber/styles.scss b/packages/strapi-helper-plugin/lib/src/components/InputNumber/styles.scss index eb29b27a16..37354ec5c0 100644 --- a/packages/strapi-helper-plugin/lib/src/components/InputNumber/styles.scss +++ b/packages/strapi-helper-plugin/lib/src/components/InputNumber/styles.scss @@ -7,6 +7,6 @@ border-radius: 0.25rem; line-height: 3.4rem; font-size: 1.3rem; - font-family: 'Lato', sans-serif !important; + font-family: Lato !important; box-shadow: 0px 1px 1px rgba(104, 118, 142, 0.05); } diff --git a/packages/strapi-helper-plugin/lib/src/components/InputPassword/styles.scss b/packages/strapi-helper-plugin/lib/src/components/InputPassword/styles.scss index 33d0bfc856..06c02e1079 100644 --- a/packages/strapi-helper-plugin/lib/src/components/InputPassword/styles.scss +++ b/packages/strapi-helper-plugin/lib/src/components/InputPassword/styles.scss @@ -7,7 +7,7 @@ border-radius: 0.25rem; line-height: 3.4rem; font-size: 1.3rem; - font-family: 'Lato', sans-serif !important; + font-family: Lato !important; box-shadow: 0px 1px 1px rgba(104, 118, 142, 0.05); } diff --git a/packages/strapi-helper-plugin/lib/src/components/InputSearch/styles.scss b/packages/strapi-helper-plugin/lib/src/components/InputSearch/styles.scss index bd3112ba2a..91bf43e088 100644 --- a/packages/strapi-helper-plugin/lib/src/components/InputSearch/styles.scss +++ b/packages/strapi-helper-plugin/lib/src/components/InputSearch/styles.scss @@ -43,7 +43,7 @@ border-radius: 0.25rem; line-height: 3.4rem; font-size: 1.3rem; - font-family: 'Lato', sans-serif !important; + font-family: Lato !important; box-shadow: 0px 1px 1px rgba(104, 118, 142, 0.05); &:focus { border-color: #78caff; diff --git a/packages/strapi-helper-plugin/lib/src/components/InputSelect/styles.scss b/packages/strapi-helper-plugin/lib/src/components/InputSelect/styles.scss index 61ee8a808f..85238cad8b 100644 --- a/packages/strapi-helper-plugin/lib/src/components/InputSelect/styles.scss +++ b/packages/strapi-helper-plugin/lib/src/components/InputSelect/styles.scss @@ -10,7 +10,7 @@ border-radius: 0.25rem; line-height: 3.2rem; font-size: 1.3rem; - font-family: 'Lato', sans-serif !important; + font-family: Lato !important; -moz-appearance: none; -webkit-appearance: none; box-shadow: 0px 1px 1px rgba(104, 118, 142, 0.05); diff --git a/packages/strapi-helper-plugin/lib/src/components/InputText/styles.scss b/packages/strapi-helper-plugin/lib/src/components/InputText/styles.scss index 38dd06acf6..6eaa93f67d 100644 --- a/packages/strapi-helper-plugin/lib/src/components/InputText/styles.scss +++ b/packages/strapi-helper-plugin/lib/src/components/InputText/styles.scss @@ -7,6 +7,6 @@ border-radius: 0.25rem; line-height: 3.4rem; font-size: 1.3rem; - font-family: 'Lato', sans-serif !important; + font-family: Lato !important; box-shadow: 0px 1px 1px rgba(104, 118, 142, 0.05); } diff --git a/packages/strapi-helper-plugin/lib/src/components/InputTextArea/styles.scss b/packages/strapi-helper-plugin/lib/src/components/InputTextArea/styles.scss index 561622736a..3293da8f6b 100644 --- a/packages/strapi-helper-plugin/lib/src/components/InputTextArea/styles.scss +++ b/packages/strapi-helper-plugin/lib/src/components/InputTextArea/styles.scss @@ -7,6 +7,6 @@ border-radius: 0.25rem; line-height: 1.8rem; font-size: 1.3rem; - font-family: 'Lato', sans-serif !important; + font-family: Lato !important; box-shadow: 0px 1px 1px rgba(104, 118, 142, 0.05); } diff --git a/packages/strapi-helper-plugin/lib/src/components/InputTextAreaWithErrors/styles.scss b/packages/strapi-helper-plugin/lib/src/components/InputTextAreaWithErrors/styles.scss index 688351a1c9..bb6b993d41 100644 --- a/packages/strapi-helper-plugin/lib/src/components/InputTextAreaWithErrors/styles.scss +++ b/packages/strapi-helper-plugin/lib/src/components/InputTextAreaWithErrors/styles.scss @@ -1,5 +1,5 @@ .containerTextArea { margin-bottom: 1.5rem; font-size: 1.3rem; - font-family: 'Lato', sans-serif; + font-family: Lato; } diff --git a/packages/strapi-helper-plugin/lib/src/components/InputToggle/styles.scss b/packages/strapi-helper-plugin/lib/src/components/InputToggle/styles.scss index 7639008538..8c257908a4 100644 --- a/packages/strapi-helper-plugin/lib/src/components/InputToggle/styles.scss +++ b/packages/strapi-helper-plugin/lib/src/components/InputToggle/styles.scss @@ -37,7 +37,7 @@ font-weight: 600; font-size: 1.2rem; letter-spacing: 0.1rem; - font-family: 'Lato', sans-serif; + font-family: Lato; line-height: 3.4rem; cursor: pointer; &:first-of-type { diff --git a/packages/strapi-helper-plugin/lib/src/components/OverlayBlocker/styles.scss b/packages/strapi-helper-plugin/lib/src/components/OverlayBlocker/styles.scss index 01f7c855be..e365f100cf 100644 --- a/packages/strapi-helper-plugin/lib/src/components/OverlayBlocker/styles.scss +++ b/packages/strapi-helper-plugin/lib/src/components/OverlayBlocker/styles.scss @@ -86,7 +86,7 @@ border: none; background: linear-gradient(315deg, #0097F6 0%, #005EEA 100%); color: white; - font-family: 'Lato', sans-serif; + font-family: Lato; font-weight: 600; -webkit-font-smoothing: antialiased; cursor: pointer; diff --git a/packages/strapi-helper-plugin/lib/src/components/PageFooter/styles.scss b/packages/strapi-helper-plugin/lib/src/components/PageFooter/styles.scss index f2073ac5ce..cf8fd7d444 100644 --- a/packages/strapi-helper-plugin/lib/src/components/PageFooter/styles.scss +++ b/packages/strapi-helper-plugin/lib/src/components/PageFooter/styles.scss @@ -29,7 +29,7 @@ border-radius: 0.25rem; line-height: 29px; font-size: 1.3rem; - font-family: 'Lato', sans-serif !important; + font-family: Lato !important; -moz-appearance: none; -webkit-appearance: none; } diff --git a/packages/strapi-helper-plugin/lib/src/components/PopUpWarning/styles.scss b/packages/strapi-helper-plugin/lib/src/components/PopUpWarning/styles.scss index a91f2ce961..4616bcf0b8 100644 --- a/packages/strapi-helper-plugin/lib/src/components/PopUpWarning/styles.scss +++ b/packages/strapi-helper-plugin/lib/src/components/PopUpWarning/styles.scss @@ -12,7 +12,7 @@ > h5 { width: 100%; text-align: center; - font-family: 'Lato', sans-serif; + font-family: Lato; font-weight: bold!important; font-size: 1.8rem!important; } @@ -61,7 +61,7 @@ padding: .1rem; color: #F64D0A; text-align: center; - font-family: 'Lato', sans-serif; + font-family: Lato; font-size: 1.3rem; > img { @@ -92,7 +92,7 @@ border-radius: 0.3rem; background-color: transparent; text-transform: capitalize; - font-family: 'Lato', sans-serif; + font-family: Lato; cursor: pointer; > i { diff --git a/packages/strapi-plugin-content-manager/admin/src/components/CustomButton/index.js b/packages/strapi-plugin-content-manager/admin/src/components/CustomButton/index.js index 7356ee06ae..c7c29ae4dc 100644 --- a/packages/strapi-plugin-content-manager/admin/src/components/CustomButton/index.js +++ b/packages/strapi-plugin-content-manager/admin/src/components/CustomButton/index.js @@ -11,7 +11,7 @@ const CustomButton = styled.button` line-height: 28px; font-size: 13px; font-weight: 500; - font-family: 'Lato', sans-serif; + font-family: Lato; -webkit-font-smoothing-antialiased; cursor: pointer; &:hover { diff --git a/packages/strapi-plugin-content-manager/admin/src/components/EmptyAttributesView/styles.scss b/packages/strapi-plugin-content-manager/admin/src/components/EmptyAttributesView/styles.scss index 53f1186ce1..d4e09b31c1 100644 --- a/packages/strapi-plugin-content-manager/admin/src/components/EmptyAttributesView/styles.scss +++ b/packages/strapi-plugin-content-manager/admin/src/components/EmptyAttributesView/styles.scss @@ -10,7 +10,7 @@ background-repeat: repeat; text-align: center; font-size: 1.4rem; - font-family: 'Lato', sans-serif; + font-family: Lato; box-shadow: 2px 2px 4px #E3E9F3; } diff --git a/packages/strapi-plugin-content-manager/admin/src/components/InputJSONWithErrors/styles.scss b/packages/strapi-plugin-content-manager/admin/src/components/InputJSONWithErrors/styles.scss index f3f0b734f3..453e297318 100644 --- a/packages/strapi-plugin-content-manager/admin/src/components/InputJSONWithErrors/styles.scss +++ b/packages/strapi-plugin-content-manager/admin/src/components/InputJSONWithErrors/styles.scss @@ -1,5 +1,5 @@ .containerJSON { margin-bottom: 1.6rem; font-size: 1.3rem; - font-family: 'Lato', sans-serif; + font-family: Lato; } diff --git a/packages/strapi-plugin-content-manager/admin/src/components/Wysiwyg/componentsStyles.scss b/packages/strapi-plugin-content-manager/admin/src/components/Wysiwyg/componentsStyles.scss index 4e68f0348d..0f4be295a1 100644 --- a/packages/strapi-plugin-content-manager/admin/src/components/Wysiwyg/componentsStyles.scss +++ b/packages/strapi-plugin-content-manager/admin/src/components/Wysiwyg/componentsStyles.scss @@ -155,7 +155,7 @@ h1+.editorParagraph{ background-color: #FAFAFB; line-height: 30px; font-size: 12px; - font-family: 'Lato', sans-serif; + font-family: Lato; background-color: #fff; border-bottom: 1px solid #F3F4F4; line-height: 49px; diff --git a/packages/strapi-plugin-content-manager/admin/src/components/Wysiwyg/styles.scss b/packages/strapi-plugin-content-manager/admin/src/components/Wysiwyg/styles.scss index 7ec5fa502d..400028c10d 100644 --- a/packages/strapi-plugin-content-manager/admin/src/components/Wysiwyg/styles.scss +++ b/packages/strapi-plugin-content-manager/admin/src/components/Wysiwyg/styles.scss @@ -70,7 +70,7 @@ .editorBlockquote { border-left: 5px solid #eee; - font-family: 'Lato', sans-serif; + font-family: Lato; font-style: italic; margin: 16px 0; padding: 10px 20px; @@ -80,7 +80,7 @@ margin-bottom: 0!important; padding: 5px; background-color: rgba(0, 0, 0, 0.05); - font-family: 'Lato', sans-serif; + font-family: Lato; } diff --git a/packages/strapi-plugin-content-manager/admin/src/components/WysiwygBottomControls/styles.scss b/packages/strapi-plugin-content-manager/admin/src/components/WysiwygBottomControls/styles.scss index 9da1b2bc2c..c4d10ab7f1 100644 --- a/packages/strapi-plugin-content-manager/admin/src/components/WysiwygBottomControls/styles.scss +++ b/packages/strapi-plugin-content-manager/admin/src/components/WysiwygBottomControls/styles.scss @@ -7,7 +7,7 @@ background-color: #FAFAFB; line-height: 30px; font-size: 13px; - font-family: 'Lato', sans-serif; + font-family: Lato; border-top: 1px dashed #e3e4e4; > div:first-child { diff --git a/packages/strapi-plugin-content-manager/admin/src/components/WysiwygWithErrors/styles.scss b/packages/strapi-plugin-content-manager/admin/src/components/WysiwygWithErrors/styles.scss index c1ab563cfa..eb3437caaf 100644 --- a/packages/strapi-plugin-content-manager/admin/src/components/WysiwygWithErrors/styles.scss +++ b/packages/strapi-plugin-content-manager/admin/src/components/WysiwygWithErrors/styles.scss @@ -1,7 +1,7 @@ .containerWysiwyg { margin-bottom: 1.6rem; font-size: 1.3rem; - font-family: 'Lato', sans-serif; + font-family: Lato; } .wysLoader { diff --git a/packages/strapi-plugin-content-manager/admin/src/containers/ListPage/styles.scss b/packages/strapi-plugin-content-manager/admin/src/containers/ListPage/styles.scss index f637b9e52a..c4c8a18f83 100644 --- a/packages/strapi-plugin-content-manager/admin/src/containers/ListPage/styles.scss +++ b/packages/strapi-plugin-content-manager/admin/src/containers/ListPage/styles.scss @@ -26,7 +26,7 @@ .listPageDropdownWrapper { display: flex; justify-content: flex-end; - font-family: 'Lato', sans-serif; + font-family: Lato; margin-top: -2px; -webkit-font-smoothing: antialiased; diff --git a/packages/strapi-plugin-content-type-builder/admin/src/components/ContentHeader/styles.scss b/packages/strapi-plugin-content-type-builder/admin/src/components/ContentHeader/styles.scss index 926eb436bc..8ff27cbabd 100644 --- a/packages/strapi-plugin-content-type-builder/admin/src/components/ContentHeader/styles.scss +++ b/packages/strapi-plugin-content-type-builder/admin/src/components/ContentHeader/styles.scss @@ -1,14 +1,14 @@ .contentHeader { /* stylelint-disable */ position: relative; margin: 2.3rem 0rem 3.3rem 0rem; - font-family: 'Lato', sans-serif; + font-family: Lato; display: flex; justify-content: space-between; } .title { color: #333740; - font-family: 'Lato', sans-serif; + font-family: Lato; font-size: 2.4rem; line-height: 2.9rem; font-weight: 600; diff --git a/packages/strapi-plugin-content-type-builder/admin/src/components/EmptyContentTypeView/styles.scss b/packages/strapi-plugin-content-type-builder/admin/src/components/EmptyContentTypeView/styles.scss index 9e8e73913d..ede68ad92b 100644 --- a/packages/strapi-plugin-content-type-builder/admin/src/components/EmptyContentTypeView/styles.scss +++ b/packages/strapi-plugin-content-type-builder/admin/src/components/EmptyContentTypeView/styles.scss @@ -8,7 +8,7 @@ background-repeat: repeat; text-align: center; font-size: 1.4rem; - font-family: 'Lato', sans-serif; + font-family: Lato; box-shadow: 2px 2px 4px #E3E9F3; > img { position: absolute; diff --git a/packages/strapi-plugin-content-type-builder/admin/src/components/InputCheckboxWithNestedInputs/styles.scss b/packages/strapi-plugin-content-type-builder/admin/src/components/InputCheckboxWithNestedInputs/styles.scss index 558fa08e5f..44d08921d2 100644 --- a/packages/strapi-plugin-content-type-builder/admin/src/components/InputCheckboxWithNestedInputs/styles.scss +++ b/packages/strapi-plugin-content-type-builder/admin/src/components/InputCheckboxWithNestedInputs/styles.scss @@ -1,6 +1,6 @@ .inputCheckboxWithNestedInputs { /* stylelint-disable */ font-size: 1.3rem; - font-family: 'Lato', sans-serif; + font-family: Lato; margin-bottom: 1.5rem; -webkit-font-smoothing: antialiased; > div { @@ -34,7 +34,7 @@ > small { -webkit-font-smoothing: antialiased; color: #9EA7B8; - font-family: 'Lato', sans-serif; + font-family: Lato; font-size: 1.2rem; } } diff --git a/packages/strapi-plugin-content-type-builder/admin/src/components/List/styles.scss b/packages/strapi-plugin-content-type-builder/admin/src/components/List/styles.scss index 336bad5f9e..e72099042a 100644 --- a/packages/strapi-plugin-content-type-builder/admin/src/components/List/styles.scss +++ b/packages/strapi-plugin-content-type-builder/admin/src/components/List/styles.scss @@ -14,7 +14,7 @@ .titleContainer { color: #333740; - font-family: 'Lato', sans-serif; + font-family: Lato; font-size: 1.8rem; font-weight: bold; line-height: 2.2rem; diff --git a/packages/strapi-plugin-content-type-builder/admin/src/components/PluginLeftMenu/styles.scss b/packages/strapi-plugin-content-type-builder/admin/src/components/PluginLeftMenu/styles.scss index 399c842684..0e683aa906 100644 --- a/packages/strapi-plugin-content-type-builder/admin/src/components/PluginLeftMenu/styles.scss +++ b/packages/strapi-plugin-content-type-builder/admin/src/components/PluginLeftMenu/styles.scss @@ -16,7 +16,7 @@ line-height: 1.3rem; color: #919BAE; letter-spacing: 0.1rem; - font-family: 'Lato', sans-serif; + font-family: Lato; font-size: 1.1rem; font-weight: bold; text-transform: uppercase; diff --git a/packages/strapi-plugin-content-type-builder/admin/src/components/PluginLeftMenuSection/styles.scss b/packages/strapi-plugin-content-type-builder/admin/src/components/PluginLeftMenuSection/styles.scss index 1396afc3f6..216c3d865f 100644 --- a/packages/strapi-plugin-content-type-builder/admin/src/components/PluginLeftMenuSection/styles.scss +++ b/packages/strapi-plugin-content-type-builder/admin/src/components/PluginLeftMenuSection/styles.scss @@ -8,7 +8,7 @@ line-height: 1.3rem; color: #919BAE; letter-spacing: 0.1rem; - font-family: 'Lato', sans-serif; + font-family: Lato; font-size: 1.1rem; font-weight: bold; text-transform: uppercase; diff --git a/packages/strapi-plugin-content-type-builder/admin/src/components/PopUpForm/styles.scss b/packages/strapi-plugin-content-type-builder/admin/src/components/PopUpForm/styles.scss index 0b64a2e3c7..f47bedba18 100644 --- a/packages/strapi-plugin-content-type-builder/admin/src/components/PopUpForm/styles.scss +++ b/packages/strapi-plugin-content-type-builder/admin/src/components/PopUpForm/styles.scss @@ -27,7 +27,7 @@ text-transform: capitalize; margin-right: 1.8rem; cursor: pointer; - font-family: 'Lato', sans-serif; + font-family: Lato; &:focus { outline: 0; } @@ -77,7 +77,7 @@ } .popUpForm { - font-family: 'Lato', sans-serif; + font-family: Lato; } .popUpFormHeader { @@ -121,7 +121,7 @@ border-radius: 3px; color: white!important; line-height: 1.6rem; - font-family: 'Lato', sans-serif !important; + font-family: Lato !important; font-weight: 600; cursor: pointer; -webkit-font-smoothing: antialiased; @@ -137,7 +137,7 @@ .secondary { min-width: 100px; - font-family: 'Lato', sans-serif; + font-family: Lato; color: #F64D0A; border: 0.1rem solid #F64D0A; cursor: pointer; @@ -201,7 +201,7 @@ border: none!important; border-radius: 3px; color: white; - font-family: 'Lato', sans-serif !important; + font-family: Lato !important; font-weight: 600; &:focus { outline: 0; diff --git a/packages/strapi-plugin-content-type-builder/admin/src/components/PopUpRelations/styles.scss b/packages/strapi-plugin-content-type-builder/admin/src/components/PopUpRelations/styles.scss index b4ce3b385a..5bef9bf83a 100644 --- a/packages/strapi-plugin-content-type-builder/admin/src/components/PopUpRelations/styles.scss +++ b/packages/strapi-plugin-content-type-builder/admin/src/components/PopUpRelations/styles.scss @@ -42,7 +42,7 @@ text-transform: capitalize; margin-right: 1.8rem; cursor: pointer; - font-family: 'Lato', sans-serif; + font-family: Lato; &:focus { outline: 0; } @@ -123,15 +123,15 @@ } .popUpRelations { - font-family: 'Lato', sans-serif; + font-family: Lato; } .primary { height: 3rem; - font-family: 'Lato', sans-serif !important; + font-family: Lato !important; margin-left: 1.9rem!important; cursor: pointer; - font-family: 'Lato', sans-serif; + font-family: Lato; &:focus { outline: 0; } @@ -185,7 +185,7 @@ .secondary { min-width: 100px; - font-family: 'Lato', sans-serif; + font-family: Lato; color: #F64D0A; border: 0.1rem solid #F64D0A; cursor: pointer; @@ -215,7 +215,7 @@ border: none!important; border-radius: 3px; color: white; - font-family: 'Lato', sans-serif !important; + font-family: Lato !important; font-weight: 600; &:focus { outline: 0; diff --git a/packages/strapi-plugin-content-type-builder/admin/src/components/RelationBox/styles.scss b/packages/strapi-plugin-content-type-builder/admin/src/components/RelationBox/styles.scss index 669ec31b63..b3cea87196 100644 --- a/packages/strapi-plugin-content-type-builder/admin/src/components/RelationBox/styles.scss +++ b/packages/strapi-plugin-content-type-builder/admin/src/components/RelationBox/styles.scss @@ -88,7 +88,7 @@ padding: 0; border-radius: 0; border: none; - font-family: 'Lato', sans-serif; + font-family: Lato; box-shadow: 0 2px 4px rgba(203, 211, 224, .5); > div { @@ -101,7 +101,7 @@ cursor: pointer; border-bottom: 1px solid #F6F6F6; font-size: 1.3rem; - font-family: 'Lato', sans-serif; + font-family: Lato; font-weight: 400; text-transform: capitalize; color: #323740; diff --git a/packages/strapi-plugin-content-type-builder/admin/src/components/TableList/styles.scss b/packages/strapi-plugin-content-type-builder/admin/src/components/TableList/styles.scss index ad739319f5..6eac935dc9 100644 --- a/packages/strapi-plugin-content-type-builder/admin/src/components/TableList/styles.scss +++ b/packages/strapi-plugin-content-type-builder/admin/src/components/TableList/styles.scss @@ -1,7 +1,7 @@ .tableListContainer { /* stylelint-disable */ padding: 2rem 0 0rem 0; background: #FFFFFF; - font-family: 'Lato', sans-serif; + font-family: Lato; box-shadow: 0 2px 4px #E3E9F3; } diff --git a/packages/strapi-plugin-settings-manager/admin/src/components/Button/styles.scss b/packages/strapi-plugin-settings-manager/admin/src/components/Button/styles.scss index d7b3d4d3b3..50d7b9cd22 100644 --- a/packages/strapi-plugin-settings-manager/admin/src/components/Button/styles.scss +++ b/packages/strapi-plugin-settings-manager/admin/src/components/Button/styles.scss @@ -5,7 +5,7 @@ text-transform: capitalize; margin-right: 1.8rem; cursor: pointer; - font-family: 'Lato', sans-serif; + font-family: Lato; &:focus { outline: 0; } @@ -91,7 +91,7 @@ line-height: 3.2rem; border-radius: 0.3rem; letter-spacing: 1rem; - font-family: 'Lato', sans-serif; + font-family: Lato; cursor: not-allowed; position: relative; opacity: .65; diff --git a/packages/strapi-plugin-settings-manager/admin/src/components/ContentHeader/styles.scss b/packages/strapi-plugin-settings-manager/admin/src/components/ContentHeader/styles.scss index 08aa3a94d8..8368944d72 100644 --- a/packages/strapi-plugin-settings-manager/admin/src/components/ContentHeader/styles.scss +++ b/packages/strapi-plugin-settings-manager/admin/src/components/ContentHeader/styles.scss @@ -1,12 +1,12 @@ .contentHeader { /* stylelint-disable */ position: relative; margin: 2.4rem 4rem 3.3rem 4rem; - font-family: 'Lato', sans-serif; + font-family: Lato; } .title { color: #333740; - font-family: 'Lato', sans-serif; + font-family: Lato; font-size: 2.4rem; line-height: 2.9rem; font-weight: 600; diff --git a/packages/strapi-plugin-settings-manager/admin/src/components/HeaderNav/styles.scss b/packages/strapi-plugin-settings-manager/admin/src/components/HeaderNav/styles.scss index 1f85e838ca..0ca47990fc 100644 --- a/packages/strapi-plugin-settings-manager/admin/src/components/HeaderNav/styles.scss +++ b/packages/strapi-plugin-settings-manager/admin/src/components/HeaderNav/styles.scss @@ -29,7 +29,7 @@ $linkcolour: #F5F5F5; border-radius: 2px 0 0 0; background-color: darken($linkcolour, 50%); text-decoration: none !important; - font-family: 'Lato', sans-serif; + font-family: Lato; font-size: 1.3rem; color: #333740 !important; line-height: 1.6rem; diff --git a/packages/strapi-plugin-settings-manager/admin/src/components/InputEnum/styles.scss b/packages/strapi-plugin-settings-manager/admin/src/components/InputEnum/styles.scss index a760351feb..1d82043b99 100644 --- a/packages/strapi-plugin-settings-manager/admin/src/components/InputEnum/styles.scss +++ b/packages/strapi-plugin-settings-manager/admin/src/components/InputEnum/styles.scss @@ -43,7 +43,7 @@ .active { -webkit-font-smoothing: antialiased; background: linear-gradient(315deg, #0097F6 0%, #005EEA 100%); - font-family: 'Lato', sans-serif !important; + font-family: Lato !important; font-weight: 800; color: white !important; } diff --git a/packages/strapi-plugin-settings-manager/admin/src/components/InputSelect/styles.scss b/packages/strapi-plugin-settings-manager/admin/src/components/InputSelect/styles.scss index e5a326fa7c..f5f0dc4667 100644 --- a/packages/strapi-plugin-settings-manager/admin/src/components/InputSelect/styles.scss +++ b/packages/strapi-plugin-settings-manager/admin/src/components/InputSelect/styles.scss @@ -1,6 +1,6 @@ .inputSelect { /* stylelint-disable */ font-size: 1.3rem; - font-family: 'Lato', sans-serif; + font-family: Lato; > label { text-transform: capitalize; @@ -9,7 +9,7 @@ } > select { font-size: 1.3rem; - font-family: 'Lato', sans-serif; + font-family: Lato; color: #333740; height: 3.5rem!important; border-radius: 0rem!important; @@ -21,7 +21,7 @@ .requiredClass { > label:after { color: red; - font-family: 'Lato', sans-serif; + font-family: Lato; font-weight: bold; margin-left: 5px; content: "*"; @@ -32,7 +32,7 @@ .input { margin-bottom: 1.5rem; font-size: 1.3rem; - font-family: 'Lato', sans-serif; + font-family: Lato; -webkit-font-smoothing: antialiased; > label { margin-bottom: 0; @@ -51,7 +51,7 @@ -moz-appearance: none; -webkit-appearance: none; font-size: 1.3rem; - font-family: 'Lato', sans-serif !important; + font-family: Lato !important; background-position: right -1px center; background-repeat: no-repeat; background-image: url('../../assets/images/background_input.svg'); diff --git a/packages/strapi-plugin-settings-manager/admin/src/components/InputToggle/styles.scss b/packages/strapi-plugin-settings-manager/admin/src/components/InputToggle/styles.scss index 3824ba8e70..f209a5149b 100644 --- a/packages/strapi-plugin-settings-manager/admin/src/components/InputToggle/styles.scss +++ b/packages/strapi-plugin-settings-manager/admin/src/components/InputToggle/styles.scss @@ -24,7 +24,7 @@ font-weight: 600; font-size: 1.2rem; letter-spacing: 0.1rem; - font-family: 'Lato', sans-serif; + font-family: Lato; cursor: pointer; &:first-of-type { border-right: none; diff --git a/packages/strapi-plugin-settings-manager/admin/src/components/List/styles.scss b/packages/strapi-plugin-settings-manager/admin/src/components/List/styles.scss index 4bf2404f69..20c0ee9070 100644 --- a/packages/strapi-plugin-settings-manager/admin/src/components/List/styles.scss +++ b/packages/strapi-plugin-settings-manager/admin/src/components/List/styles.scss @@ -23,7 +23,7 @@ .titleContainer { color: #333740; - font-family: 'Lato', sans-serif; + font-family: Lato; font-size: 1.8rem; font-weight: bold; line-height: 2.2rem; @@ -146,7 +146,7 @@ button { } .italicText { - font-family: 'Lato', sans-serif; + font-family: Lato; color: #49515A; font-style: italic; height: 100%; @@ -156,17 +156,17 @@ button { } .normal { - font-family: 'Lato', sans-serif; + font-family: Lato; color: #1C5DE7; cursor: pointer; } .primary { height: 3rem; - font-family: 'Lato', sans-serif !important; + font-family: Lato !important; margin-left: 1.9rem!important; cursor: pointer; - font-family: 'Lato', sans-serif; + font-family: Lato; &:focus { outline: 0; } @@ -187,7 +187,7 @@ button { } .secondary { - font-family: 'Lato', sans-serif; + font-family: Lato; color: #F64D0A; border: 0.1rem solid #F64D0A; background-color: transparent; @@ -273,7 +273,7 @@ button { padding-top: 1.6rem; padding-bottom: 1rem; > h4 { - font-family: 'Lato', sans-serif; + font-family: Lato; font-weight: bold!important; font-size: 1.8rem!important; diff --git a/packages/strapi-plugin-settings-manager/admin/src/components/PluginLeftMenuSection/styles.scss b/packages/strapi-plugin-settings-manager/admin/src/components/PluginLeftMenuSection/styles.scss index 1396afc3f6..216c3d865f 100644 --- a/packages/strapi-plugin-settings-manager/admin/src/components/PluginLeftMenuSection/styles.scss +++ b/packages/strapi-plugin-settings-manager/admin/src/components/PluginLeftMenuSection/styles.scss @@ -8,7 +8,7 @@ line-height: 1.3rem; color: #919BAE; letter-spacing: 0.1rem; - font-family: 'Lato', sans-serif; + font-family: Lato; font-size: 1.1rem; font-weight: bold; text-transform: uppercase; diff --git a/packages/strapi-plugin-settings-manager/admin/src/components/WithFormSection/styles.scss b/packages/strapi-plugin-settings-manager/admin/src/components/WithFormSection/styles.scss index a544a3228f..12cd8e572a 100644 --- a/packages/strapi-plugin-settings-manager/admin/src/components/WithFormSection/styles.scss +++ b/packages/strapi-plugin-settings-manager/admin/src/components/WithFormSection/styles.scss @@ -5,7 +5,7 @@ .sectionHeader { color: #787E8F; - font-family: 'Lato', sans-serif; + font-family: Lato; font-size: 1.1rem; font-weight: bold; line-height: 1.3rem; @@ -36,6 +36,6 @@ .sectionDescription { margin: .1rem 0; color: #8B91A0; - font-family: 'Lato', sans-serif; + font-family: Lato; font-size: 1.1rem; } diff --git a/packages/strapi-plugin-settings-manager/admin/src/components/WithInput/styles.scss b/packages/strapi-plugin-settings-manager/admin/src/components/WithInput/styles.scss index e3304712db..9c42cbc22c 100644 --- a/packages/strapi-plugin-settings-manager/admin/src/components/WithInput/styles.scss +++ b/packages/strapi-plugin-settings-manager/admin/src/components/WithInput/styles.scss @@ -1,7 +1,7 @@ .inputNumber { /* stylelint-disable */ // margin-bottom: .3rem; font-size: 1.3rem; - font-family: 'Lato', sans-serif; + font-family: Lato; > label { font-weight: 500; text-transform: capitalize; @@ -21,14 +21,14 @@ height: 3.4rem; line-height: 3.4rem; font-size: 1.3rem; - font-family: 'Lato', sans-serif !important; + font-family: Lato !important; background-size: 0!important; } } .inputText { /* stylelint-disable */ - font-family: 'Lato', sans-serif !important; + font-family: Lato !important; font-size: 1.3rem; > label { font-size: 1.3rem; @@ -49,7 +49,7 @@ border-radius: 0.25rem; border: 1px solid #E3E9F3; line-height: 3.4rem; - font-family: 'Lato', sans-serif !important; + font-family: Lato !important; font-size: 1.3rem; background-size: 0!important; } @@ -69,7 +69,7 @@ .requiredClass { > label:after { color: red; - font-family: 'Lato', sans-serif; + font-family: Lato; font-weight: bold; margin-left: 5px; content: "*"; diff --git a/packages/strapi-plugin-upload/admin/src/containers/HomePage/styles.scss b/packages/strapi-plugin-upload/admin/src/containers/HomePage/styles.scss index 96471e001b..fc269b5952 100644 --- a/packages/strapi-plugin-upload/admin/src/containers/HomePage/styles.scss +++ b/packages/strapi-plugin-upload/admin/src/containers/HomePage/styles.scss @@ -1,6 +1,6 @@ .homePageUpload { padding-right: 20px; - font-family: 'Lato', sans-serif !important; + font-family: Lato !important; } .entriesWrapper { diff --git a/packages/strapi-plugin-users-permissions/admin/src/components/HeaderNav/styles.scss b/packages/strapi-plugin-users-permissions/admin/src/components/HeaderNav/styles.scss index 21a2a9a0c0..816e446ee9 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/components/HeaderNav/styles.scss +++ b/packages/strapi-plugin-users-permissions/admin/src/components/HeaderNav/styles.scss @@ -30,7 +30,7 @@ border-radius: 2px 0 0 0; background-color: darken(#F5F5F5, 50%); text-decoration: none !important; - font-family: 'Lato', sans-serif; + font-family: Lato; font-size: 1.3rem; color: #333740 !important; line-height: 1.6rem; diff --git a/packages/strapi-plugin-users-permissions/admin/src/components/InputSearchContainer/styles.scss b/packages/strapi-plugin-users-permissions/admin/src/components/InputSearchContainer/styles.scss index e507857b54..9055e3d779 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/components/InputSearchContainer/styles.scss +++ b/packages/strapi-plugin-users-permissions/admin/src/components/InputSearchContainer/styles.scss @@ -12,7 +12,7 @@ color: #B3B5B9; line-height: 3.2rem; font-size: 1.3rem; - font-family: 'Lato', sans-serif; + font-family: Lato; font-weight: 600!important; text-transform: capitalize; -moz-appearance: none; @@ -53,7 +53,7 @@ border-bottom-right-radius: 0; line-height: 3.4rem; font-size: 1.3rem; - font-family: 'Lato', sans-serif !important; + font-family: Lato !important; box-shadow: 0px 2px 1px rgba(104, 118, 142, 0.05); &:focus { border-color: #78caff; diff --git a/packages/strapi-plugin-users-permissions/admin/src/components/List/styles.scss b/packages/strapi-plugin-users-permissions/admin/src/components/List/styles.scss index 6a756e7cac..02f613cdaa 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/components/List/styles.scss +++ b/packages/strapi-plugin-users-permissions/admin/src/components/List/styles.scss @@ -14,7 +14,7 @@ flex: 2; width: 20%; color: #333740; - font-family: 'Lato', sans-serif; + font-family: Lato; font-size: 1.8rem; font-weight: 600; line-height: 2.2rem; diff --git a/packages/strapi-plugin-users-permissions/admin/src/components/Plugins/styles.scss b/packages/strapi-plugin-users-permissions/admin/src/components/Plugins/styles.scss index 472216066c..d6b1f49e8d 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/components/Plugins/styles.scss +++ b/packages/strapi-plugin-users-permissions/admin/src/components/Plugins/styles.scss @@ -31,7 +31,7 @@ > div:first-child { margin-bottom: 2px; color: #333740; - font-family: 'Lato', sans-serif; + font-family: Lato; font-size: 1.8rem; font-weight: 600; line-height: 2.1rem; diff --git a/packages/strapi-plugin-users-permissions/admin/src/components/PopUpForm/styles.scss b/packages/strapi-plugin-users-permissions/admin/src/components/PopUpForm/styles.scss index c56e8e80db..9bfb0186aa 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/components/PopUpForm/styles.scss +++ b/packages/strapi-plugin-users-permissions/admin/src/components/PopUpForm/styles.scss @@ -24,7 +24,7 @@ text-transform: capitalize; margin-right: 1.8rem; cursor: pointer; - font-family: 'Lato', sans-serif; + font-family: Lato; &:focus { outline: 0; } @@ -90,10 +90,10 @@ .primary { height: 3rem; - font-family: 'Lato', sans-serif !important; + font-family: Lato !important; margin-left: 1.9rem!important; cursor: pointer; - font-family: 'Lato', sans-serif; + font-family: Lato; &:focus { outline: 0; } @@ -148,7 +148,7 @@ .secondary { min-width: 100px; - font-family: 'Lato', sans-serif; + font-family: Lato; color: #F64D0A; border: 0.1rem solid #F64D0A; cursor: pointer; diff --git a/packages/strapi-plugin-users-permissions/admin/src/containers/AuthPage/styles.scss b/packages/strapi-plugin-users-permissions/admin/src/containers/AuthPage/styles.scss index f582a3b980..ccf7b004a7 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/containers/AuthPage/styles.scss +++ b/packages/strapi-plugin-users-permissions/admin/src/containers/AuthPage/styles.scss @@ -15,7 +15,7 @@ background-image: url('../../assets/images/background_empty.svg'); background-position-x: center; font-size: 1.4rem; - font-family: 'Lato', sans-serif; + font-family: Lato; } .errorsContainer { From 4daa7c643f1ae8e3a98772f5719cec9d6c62735b Mon Sep 17 00:00:00 2001 From: sennahLessert Date: Wed, 3 Oct 2018 14:22:09 +0200 Subject: [PATCH 42/81] fix_Issue1620 - add some missing translation keys in DE language --- .../strapi-admin/admin/src/translations/de.json | 3 ++- .../admin/src/translations/de.json | 12 +++++++++++- .../admin/src/translations/de.json | 7 ++++++- .../admin/src/translations/de.json | 13 ++++++++++++- 4 files changed, 31 insertions(+), 4 deletions(-) diff --git a/packages/strapi-admin/admin/src/translations/de.json b/packages/strapi-admin/admin/src/translations/de.json index f80d7221e4..d8d0e4b1e8 100644 --- a/packages/strapi-admin/admin/src/translations/de.json +++ b/packages/strapi-admin/admin/src/translations/de.json @@ -26,6 +26,7 @@ "app.components.ComingSoonPage.featuresNotAvailable": "Dieses Feature ist derzeit noch in aktiver Entwicklung.", "app.components.DownloadInfo.download": "Download wird ausgeführt...", "app.components.DownloadInfo.text": "Dies könnte kurz dauern. Danke für deine Geduld.", + "app.components.EmptyAttributes.title": "Bisher gibt es noch keine Felder", "app.components.HomePage.button.blog": "MEHR DAZU IM BLOG", "app.components.HomePage.button.quickStart": "STARTE DAS QUICK-START-TUTORIAL", "app.components.HomePage.community": "Finde die Community im Web", @@ -137,4 +138,4 @@ "notification.error": "Ein Fehler ist aufgetreten", "notification.error.layout": "Das Layout konnte nicht abgerufen werden.", "request.error.model.unknown": "Dieses Schema existiert nicht" -} \ No newline at end of file +} diff --git a/packages/strapi-plugin-content-manager/admin/src/translations/de.json b/packages/strapi-plugin-content-manager/admin/src/translations/de.json index af33e2b32e..e4a7447643 100644 --- a/packages/strapi-plugin-content-manager/admin/src/translations/de.json +++ b/packages/strapi-plugin-content-manager/admin/src/translations/de.json @@ -3,6 +3,8 @@ "components.AddFilterCTA.add": "Filter", "components.AddFilterCTA.hide": "Filter", "components.DraggableAttr.edit": "Klicken zum Bearbeiten", + "components.EmptyAttributesBlock.button": "Geh zu den Einstellungen", + "components.EmptyAttributesBlock.description": "Du kannst deine Einstellungen ändern", "components.FilterOptions.FILTER_TYPES.=": "ist", "components.FilterOptions.FILTER_TYPES._contains": "enthält", "components.FilterOptions.FILTER_TYPES._containss": "enthält (Groß-/Kleinschreibung beachten)", @@ -25,10 +27,13 @@ "components.TableEmpty.withFilters": "Es gibt keinen {contentType} mit den verwendeten Filtern...", "components.TableEmpty.withSearch": "Es gibt keinen {contentType}, der der Suche entspricht ({search})...", "components.TableEmpty.withoutFilter": "Es gibt keinen {contentType}...", + "containers.Edit.addAnItem": "Füge ein Item hinzu...", + "containers.Edit.clickToJump": "Klicke, um zu einem Eintrag zu springen", "containers.Edit.delete": "Löschen", "containers.Edit.editing": "Bearbeite...", "containers.Edit.reset": "Abbrechen", "containers.Edit.returnList": "Zu Liste zurückkehren", + "containers.Edit.seeDetails": "Details", "containers.Edit.submit": "Speichern", "containers.Home.introduction": "Um deine Einträge zu verwalten, klicke auf den entsprechenden Link im Menü links. Dieses Plugin ist noch in aktiver Entwicklung und seine Einstellungen können nicht optimal angepasst werden.", "containers.Home.pluginHeaderDescription": "Verwalte deine Einträge mithilfe eines mächtigen und wunderschönen Interfaces.", @@ -37,7 +42,9 @@ "containers.List.errorFetchRecords": "Fehler", "containers.List.pluginHeaderDescription": "{label} Einträge gefunden", "containers.List.pluginHeaderDescription.singular": "{label} Eintrag gefunden", + "containers.ListPage.displayedFields": "Dargestellte Felder", "containers.SettingPage.addField": "Neues Feld hinzufügen", + "containers.SettingPage.addRelationalField": "Füge ein neues relationales Feld hinzu", "containers.SettingPage.attributes": "Attribut Felder", "containers.SettingPage.attributes.description": "Reihenfolge der Attribute festlegen", "containers.SettingPage.editSettings.description": "Drag & drop the fields to build the layout", @@ -84,9 +91,12 @@ "form.Input.label.inputDescription": "Dieser Wert überschreibt das im Kopf der Tabelle angezeigte Label.", "form.Input.pageEntries": "Einträge pro Seite", "form.Input.pageEntries.inputDescription": "Hinweis: Du kannst diesen Wert auf der Inhaltstypen Einstellungsseite überschreiben.", + "form.Input.placeholder": "Platzhalter", + "form.Input.placeholder.placeholder": "Mein unglaublicher Wert", "form.Input.search": "Suche aktivieren", "form.Input.search.field": "Suche in diesem Feld aktivieren", "form.Input.sort.field": "Sortierung in diesem Feld aktivieren", + "notification.error.displayedFields": "Du benötigst wenigstens ein dargestelltes Feld", "notification.error.relationship.fetch": "Beim Abruf von Beziehungen ist ein Fehler aufgetreten.", "notification.info.SettingPage.disableSort": "Du musst ein Attribut mit aktivierter Sortierung haben.", "pageNotFound": "Seite nicht gefunden", @@ -101,4 +111,4 @@ "popUpWarning.warning.updateAllSettings": "Dadurch werden alle deine Einstellungen geändert.", "success.record.delete": "Gelöscht", "success.record.save": "Gespeichert" -} \ No newline at end of file +} diff --git a/packages/strapi-plugin-settings-manager/admin/src/translations/de.json b/packages/strapi-plugin-settings-manager/admin/src/translations/de.json index 32cadbf0ba..812acb1445 100644 --- a/packages/strapi-plugin-settings-manager/admin/src/translations/de.json +++ b/packages/strapi-plugin-settings-manager/admin/src/translations/de.json @@ -78,6 +78,11 @@ "form.server.item.cron": "Cron", "form.server.item.host": "Host", "form.server.item.port": "Port", + "form.server.item.proxy": "Proxy Einstellungen", + "form.server.item.proxy.enable": "Aktiviere Proxy", + "form.server.item.proxy.host": "Proxy Host", + "form.server.item.proxy.port": "Proxy Port", + "form.server.item.proxy.ssl": "Proxy SSL", "form.server.name": "Server", "language.af": "Afrikaans", "language.af_NA": "Afrikaans (Namibië)", @@ -627,4 +632,4 @@ "strapi.notification.success.languageAdd": "Die Sprache wurde erfolgreich hinzugefügt.", "strapi.notification.success.languageDelete": "Die Sprache wurde erfolgreich entfernt.", "strapi.notification.success.settingsEdit": "Die Einstellungen wurden erfolgreich aktualisiert." -} \ No newline at end of file +} diff --git a/packages/strapi-plugin-users-permissions/admin/src/translations/de.json b/packages/strapi-plugin-users-permissions/admin/src/translations/de.json index f72a33b56a..79dd814713 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/translations/de.json +++ b/packages/strapi-plugin-users-permissions/admin/src/translations/de.json @@ -6,7 +6,9 @@ "Auth.form.button.register": "Bereit zum Start", "Auth.form.button.register-success": "Erneut schicken", "Auth.form.button.reset-password": "Passwort ändern", + "Auth.form.error.blocked": "Dein Account wurde vom Administrator blockiert.", "Auth.form.error.code.provide": "Ungültiger Code.", + "Auth.form.error.confirmed": "Deine Account E-Mail-Adresse ist nicht bestätigt.", "Auth.form.error.email.invalid": "Diese E-Mail-Adresse ist ungültig.", "Auth.form.error.email.provide": "Bitte nenne uns deinen Benutzernamen oder deine E-Mail-Adresse.", "Auth.form.error.email.taken": "Die E-Mail-Adresse wird bereits genutzt", @@ -17,6 +19,7 @@ "Auth.form.error.password.local": "Dieser Benutzer hat kein lokales Passwort. Bitte logge dich mithilfe des Providers ein, den du bei der Erstellung deines Accounts genutzt hast.", "Auth.form.error.password.matching": "Passwörter sind nicht gleich.", "Auth.form.error.password.provide": "Bitte gib dein Passwort ein.", + "Auth.form.error.ratelimit": "Zu viele Versuche, bitte versuchen Sie es in einer Minute erneut.", "Auth.form.error.user.not-exist": "Diese E-Mail-Adresse ist nicht registriert.", "Auth.form.error.username.taken": "Der Benutzername ist bereits vergeben", "Auth.form.forgot-password.email.label": "Gib deine E-Mail ein", @@ -52,8 +55,12 @@ "EditForm.inputSelect.subscriptions.description": "Lege die Anzahl an subscriptions pro Stunde und IP fest.", "EditForm.inputSelect.subscriptions.label": "Abonnementkontingente verwalten", "EditForm.inputToggle.description.email": "Verbiete das Anlegen verschiedener Accounts derselben E-Mail-Adresse bei unterschiedlichen Anmeldemethoden.", + "EditForm.inputToggle.description.email-confirmation": "Wenn aktiviert (ON), neu registrierte Benutzer erhalten eine Bestätigungs-E-Mail.", + "EditForm.inputToggle.description.email-confirmation-redirection": "Nachdem Sie die E-Mail bestätigt haben, wähle wohin sie weitergeleitet wird.", "EditForm.inputToggle.description.sign-up": "Wenn deaktiviert (OFF), wird der Registrationsprozess unterbunden. Niemand kann sich mehr registrieren.", "EditForm.inputToggle.label.email": "Ein Account pro E-Mail-Adresse", + "EditForm.inputToggle.label.email-confirmation": "Aktiviere E-Mail Benachrichtigungen", + "EditForm.inputToggle.label.email-confirmation-redirection": "Weiterleitungs-URL", "EditForm.inputToggle.label.sign-up": "Registration ermöglichen", "EditPage.cancel": "Abbrechen", "EditPage.form.roles": "Details zu Rollen", @@ -69,6 +76,7 @@ "EditPage.notification.policies.error": "Beim Abruf von policies ist ein Fehler aufgetreten", "EditPage.notification.role.error": "Beim Abruf der Rolle ist ein Fehler aufgetreten", "EditPage.submit": "Speichern", + "Email.template.email_confirmation": "Betsätigung der E-Mail Adresse", "Email.template.reset_password": "Passwort zurücksetzen", "Email.template.success_register": "Anmeldung erfolgreich", "Email.template.validation_email": "Validierung der E-Mail-Adresse", @@ -116,9 +124,11 @@ "PopUpForm.Providers.callback.placeholder": "TEXT", "PopUpForm.Providers.enabled.description": "Wenn deaktiviert, kann diese Methode nicht verwendet werden.", "PopUpForm.Providers.enabled.label": "Aktivieren", + "PopUpForm.Providers.discord.providerConfig.redirectURL": "Die URL, die in den Einstellungen deiner Discord-App gesetzt wird", "PopUpForm.Providers.facebook.providerConfig.redirectURL": "Die URL, die in den Einstellungen deiner Facebook-App gesetzt wird", "PopUpForm.Providers.github.providerConfig.redirectURL": "Die URL, die in den Einstellungen deiner Github-App gesetzt wird", "PopUpForm.Providers.google.providerConfig.redirectURL": "Die URL, die in den Einstellungen deiner Google-App gesetzt wird", + "PopUpForm.Providers.microsoft.providerConfig.redirectURL": "Die URL, die in den Einstellungen deiner Microsoft-App gesetzt wird", "PopUpForm.Providers.key.label": "Client ID", "PopUpForm.Providers.key.placeholder": "TEXT", "PopUpForm.Providers.linkedin2.providerConfig.redirectURL": "Die URL, die in den Einstellungen deiner LinkedIn-App gesetzt wird", @@ -133,6 +143,7 @@ "PopUpForm.header.edit.providers": "Methode {provider} bearbeiten", "PopUpForm.inputSelect.providers.label": "Wähle die Methode aus", "components.Input.error.password.noMatch": "Passwörter stimmen nicht überein", + "components.Input.error.password.length": "Passwort ist zu kurz", "notification.error.delete": "Beim Löschen des Objekts ist ein Fehler aufgetreten", "notification.error.fetch": "Beim Abruf von Daten ist ein Fehler aufgetreten", "notification.error.fetchUser": "Beim Abruf von Benutzern ist ein Fehler aufgetreten", @@ -141,4 +152,4 @@ "notification.success.submit": "Einstellungen aktualisiert", "plugin.description.long": "Beschütze deine API mit einem vollständigen Authentifikationsprozess basierend auf JWT. Zudem bietet dieses Plugin eine ACL-Strategie, die erlaubt, die Befugnisse zwischen Benutzergruppen festzulegen.", "plugin.description.short": "Beschütze deine API mit einem vollständigen Authentifikationsprozess basierend auf JWT." -} \ No newline at end of file +} From dd4fa9b3f75e52ba422feb2828439929f45305cb Mon Sep 17 00:00:00 2001 From: Jim LAURIE Date: Wed, 3 Oct 2018 14:30:06 +0200 Subject: [PATCH 43/81] Update menu for 3.x.x --- docs/.vuepress/config.js | 44 ++++++++++++++++++++++------------ docs/3.x.x/tutorials/README.md | 2 +- 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index a1faee3d71..6a251ed895 100644 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -38,26 +38,21 @@ module.exports = { ['https://github.com/strapi/strapi/blob/master/CONTRIBUTING.md', 'Contribution Guide'], ], }, - { - collapsable: false, - title: 'Advanced', - children: [ - '/3.x.x/advanced/customize-admin', - '/3.x.x/advanced/hooks', - '/3.x.x/advanced/logging', - '/3.x.x/advanced/middlewares', - '/3.x.x/advanced/usage-tracking', - ], - }, - '/3.x.x/api-reference/reference', - '/3.x.x/cli/CLI', - '/3.x.x/concepts/concepts', - '/3.x.x/configurations/configurations', { collapsable: false, title: 'Getting started', children: ['/3.x.x/getting-started/installation', '/3.x.x/getting-started/quick-start'], }, + { + collapsable: false, + title: 'Globals', + children: [ + '/3.x.x/api-reference/reference', + '/3.x.x/cli/CLI', + '/3.x.x/concepts/concepts', + '/3.x.x/configurations/configurations', + ], + }, { collapsable: false, title: 'Guides', @@ -75,6 +70,25 @@ module.exports = { '/3.x.x/guides/requests', ], }, + { + collapsable: false, + title: 'Advanced', + children: [ + '/3.x.x/advanced/customize-admin', + '/3.x.x/advanced/hooks', + '/3.x.x/advanced/logging', + '/3.x.x/advanced/middlewares', + '/3.x.x/advanced/usage-tracking', + ], + }, + { + collapsable: false, + title: 'Help', + children: [ + ['https://github.com/strapi/strapi/wiki', 'Migration guides'], + '/3.x.x/tutorials/', + ], + }, ], '/1.x.x/': [ { diff --git a/docs/3.x.x/tutorials/README.md b/docs/3.x.x/tutorials/README.md index 440b5d34df..9b1344563d 100644 --- a/docs/3.x.x/tutorials/README.md +++ b/docs/3.x.x/tutorials/README.md @@ -1,4 +1,4 @@ -## Tutorials +# Tutorials Go further with Strapi, official and community tutorials are here to help you: From 4cc41331ce58e985b5c0643f638b8a6070b66b23 Mon Sep 17 00:00:00 2001 From: cyril lopez Date: Wed, 3 Oct 2018 16:19:04 +0200 Subject: [PATCH 44/81] Change button secondary class --- .../admin/src/translations/en.json | 3 +- .../admin/src/translations/fr.json | 3 +- .../lib/src/assets/icons/icon_trash.svg | 18 +++++++++++ .../lib/src/components/Button/styles.scss | 32 ++++++++++++++++--- .../admin/src/containers/EditPage/index.js | 7 ++++ 5 files changed, 56 insertions(+), 7 deletions(-) create mode 100644 packages/strapi-helper-plugin/lib/src/assets/icons/icon_trash.svg diff --git a/packages/strapi-admin/admin/src/translations/en.json b/packages/strapi-admin/admin/src/translations/en.json index 18a5504516..ed3f265cfe 100644 --- a/packages/strapi-admin/admin/src/translations/en.json +++ b/packages/strapi-admin/admin/src/translations/en.json @@ -136,5 +136,6 @@ "components.popUpWarning.title": "Please confirm", "notification.error": "An error occurred", "notification.error.layout": "Couldn't retrieve the layout", - "request.error.model.unknown": "This model doesn't exist" + "request.error.model.unknown": "This model doesn't exist", + "app.utils.delete": "Delete" } \ No newline at end of file diff --git a/packages/strapi-admin/admin/src/translations/fr.json b/packages/strapi-admin/admin/src/translations/fr.json index cdcab735b1..fec7ee627e 100644 --- a/packages/strapi-admin/admin/src/translations/fr.json +++ b/packages/strapi-admin/admin/src/translations/fr.json @@ -137,5 +137,6 @@ "components.popUpWarning.title": "Merci de confirmer", "notification.error": "Une erreur est survenue", "notification.error.layout": "Impossible de récupérer le layout de l'admin", - "request.error.model.unknown": "Le model n'existe pas" + "request.error.model.unknown": "Le model n'existe pas", + "app.utils.delete": "Supprimer" } \ No newline at end of file diff --git a/packages/strapi-helper-plugin/lib/src/assets/icons/icon_trash.svg b/packages/strapi-helper-plugin/lib/src/assets/icons/icon_trash.svg new file mode 100644 index 0000000000..c58142f930 --- /dev/null +++ b/packages/strapi-helper-plugin/lib/src/assets/icons/icon_trash.svg @@ -0,0 +1,18 @@ + + + + Shape + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/strapi-helper-plugin/lib/src/components/Button/styles.scss b/packages/strapi-helper-plugin/lib/src/components/Button/styles.scss index 1d52efe957..71e2c6ecf8 100644 --- a/packages/strapi-helper-plugin/lib/src/components/Button/styles.scss +++ b/packages/strapi-helper-plugin/lib/src/components/Button/styles.scss @@ -28,6 +28,8 @@ border-radius: 0.3rem; white-space: nowrap; margin-right: 1.8rem; + line-height: 28px; + font-size: 13px; cursor: pointer; font-family: Lato; -webkit-font-smoothing: antialiased; @@ -89,16 +91,36 @@ } .secondary { - // height: 32px !important; min-width: 10rem; - color: #F64D0A; - border: 0.1rem solid #F64D0A; + color: #919BAE; + border: 0.1rem solid #E3E9F3; position: relative; border-radius: 3px; overflow: hidden; &:active { - border: 0.15rem solid #F64D0A; - } + border: 0.1rem solid #B6BDCA; + } +} + +.delete { + position: relative; + min-width: 10rem; + background: rgba(255,0,0, 0.15); + color: #F23508; + border: 0.1rem solid rgba(255,0,0, 0.20); + border-radius: 3px; + overflow: hidden; + &:active { + border: 0.1rem solid rgba(255,0,0, 0.30); + } + &:before { + content: ''; + display: inline-block; + height: 12px; + margin-right: 8px; + width: 11px; + background-image: url('../../assets/icons/icon_trash.svg'); + } } .secondaryHotline { diff --git a/packages/strapi-plugin-content-manager/admin/src/containers/EditPage/index.js b/packages/strapi-plugin-content-manager/admin/src/containers/EditPage/index.js index cdae807520..14f3115b07 100644 --- a/packages/strapi-plugin-content-manager/admin/src/containers/EditPage/index.js +++ b/packages/strapi-plugin-content-manager/admin/src/containers/EditPage/index.js @@ -307,6 +307,13 @@ export class EditPage extends React.Component { pluginHeaderActions = () => ( [ + { + label: 'app.utils.delete', + kind: 'delete', + onClick: this.toggle, + type: 'button', + disabled: this.showLoaders(), + }, { label: 'content-manager.containers.Edit.reset', kind: 'secondary', From 08eae80563ba5472fe45131ef7bb7014bac6922f Mon Sep 17 00:00:00 2001 From: cyril lopez Date: Wed, 3 Oct 2018 17:22:08 +0200 Subject: [PATCH 45/81] Add delete button --- .../lib/src/components/Button/styles.scss | 1 + .../admin/src/components/Search/styles.scss | 2 +- .../admin/src/containers/EditPage/actions.js | 7 +++ .../src/containers/EditPage/constants.js | 1 + .../admin/src/containers/EditPage/index.js | 58 +++++++++++++++---- .../admin/src/containers/EditPage/saga.js | 27 +++++++-- 6 files changed, 79 insertions(+), 17 deletions(-) diff --git a/packages/strapi-helper-plugin/lib/src/components/Button/styles.scss b/packages/strapi-helper-plugin/lib/src/components/Button/styles.scss index 71e2c6ecf8..c7e547a112 100644 --- a/packages/strapi-helper-plugin/lib/src/components/Button/styles.scss +++ b/packages/strapi-helper-plugin/lib/src/components/Button/styles.scss @@ -62,6 +62,7 @@ .primary { font-weight: 500; min-width: 15rem; + border: 1px solid; background: linear-gradient(315deg, #0097F6 0%, #005EEA 100%); -webkit-font-smoothing: antialiased; color: white; diff --git a/packages/strapi-plugin-content-manager/admin/src/components/Search/styles.scss b/packages/strapi-plugin-content-manager/admin/src/components/Search/styles.scss index f2729871d9..95c9a1a5bc 100644 --- a/packages/strapi-plugin-content-manager/admin/src/components/Search/styles.scss +++ b/packages/strapi-plugin-content-manager/admin/src/components/Search/styles.scss @@ -9,7 +9,7 @@ padding-right: 20px; background-color: #FFFFFF; border-right: 1px solid #F3F4F4; - z-index: 1060; + z-index: 1050; color: #9EA7B8; line-height: 6rem; letter-spacing: 0; diff --git a/packages/strapi-plugin-content-manager/admin/src/containers/EditPage/actions.js b/packages/strapi-plugin-content-manager/admin/src/containers/EditPage/actions.js index 7e1306a5e5..f2f60e0977 100644 --- a/packages/strapi-plugin-content-manager/admin/src/containers/EditPage/actions.js +++ b/packages/strapi-plugin-content-manager/admin/src/containers/EditPage/actions.js @@ -10,6 +10,7 @@ import { getValidationsFromForm } from 'utils/formValidations'; import { ADD_RELATION_ITEM, CHANGE_DATA, + DELETE_DATA, GET_DATA, GET_DATA_SUCCEEDED, INIT_MODEL_PROPS, @@ -42,6 +43,12 @@ export function changeData({ target }) { }; } +export function deleteData() { + return { + type: DELETE_DATA, + }; +} + export function getData(id, source, mainField) { return { type: GET_DATA, diff --git a/packages/strapi-plugin-content-manager/admin/src/containers/EditPage/constants.js b/packages/strapi-plugin-content-manager/admin/src/containers/EditPage/constants.js index 6bf60c3159..b09385a9fa 100644 --- a/packages/strapi-plugin-content-manager/admin/src/containers/EditPage/constants.js +++ b/packages/strapi-plugin-content-manager/admin/src/containers/EditPage/constants.js @@ -6,6 +6,7 @@ export const ADD_RELATION_ITEM = 'ContentManager/EditPage/ADD_RELATION_ITEM'; export const CHANGE_DATA = 'ContentManager/EditPage/CHANGE_DATA'; +export const DELETE_DATA = 'ContentManager/EditPage/DELETE_DATA'; export const GET_DATA = 'ContentManager/EditPage/GET_DATA'; export const GET_DATA_SUCCEEDED = 'ContentManager/EditPage/GET_DATA_SUCCEEDED'; export const INIT_MODEL_PROPS = 'ContentManager/EditPage/INIT_MODEL_PROPS'; diff --git a/packages/strapi-plugin-content-manager/admin/src/containers/EditPage/index.js b/packages/strapi-plugin-content-manager/admin/src/containers/EditPage/index.js index 14f3115b07..f867af5cba 100644 --- a/packages/strapi-plugin-content-manager/admin/src/containers/EditPage/index.js +++ b/packages/strapi-plugin-content-manager/admin/src/containers/EditPage/index.js @@ -38,6 +38,7 @@ import { checkFormValidity } from 'utils/formValidations'; import { addRelationItem, changeData, + deleteData, getData, initModelProps, moveAttr, @@ -55,7 +56,7 @@ import makeSelectEditPage from './selectors'; import styles from './styles.scss'; export class EditPage extends React.Component { - state = { showWarning: false }; + state = { showWarning: false, showWarningDelete: false }; componentDidMount() { this.initComponent(this.props); @@ -241,8 +242,15 @@ export class EditPage extends React.Component { } handleConfirm = () => { - this.props.onCancel(); - this.toggle(); + const { showWarningDelete } = this.state; + + if (showWarningDelete) { + this.props.deleteData(); + this.toggleDelete(); + } else { + this.props.onCancel(); + this.toggle(); + } } handleGoBack = () => this.props.history.goBack(); @@ -307,13 +315,6 @@ export class EditPage extends React.Component { pluginHeaderActions = () => ( [ - { - label: 'app.utils.delete', - kind: 'delete', - onClick: this.toggle, - type: 'button', - disabled: this.showLoaders(), - }, { label: 'content-manager.containers.Edit.reset', kind: 'secondary', @@ -327,12 +328,28 @@ export class EditPage extends React.Component { onClick: this.handleSubmit, type: 'submit', loader: this.props.editPage.showLoader, - style: this.props.editPage.showLoader ? { marginRight: '18px' } : {}, + style: this.props.editPage.showLoader ? { marginRight: '18px', flexGrow: 2 } : { flexGrow: 2 }, disabled: this.showLoaders(), }, ] ); + pluginHeaderSubActions = () => { + const subActions = this.isCreating() + ? [] + : [ + { + label: 'app.utils.delete', + kind: 'delete', + onClick: this.toggleDelete, + type: 'button', + disabled: this.showLoaders(), + }, + ]; + + return subActions; + } + showLoaders = () => { const { editPage: { isLoading }, schema: { layout } } = this.props; @@ -341,6 +358,8 @@ export class EditPage extends React.Component { toggle = () => this.setState(prevState => ({ showWarning: !prevState.showWarning })); + toggleDelete = () => this.setState(prevState => ({ showWarningDelete: !prevState.showWarningDelete })); + renderEdit = () => { const { editPage, location: { search } } = this.props; const source = getQueryParameters(search, 'source'); @@ -394,7 +413,7 @@ export class EditPage extends React.Component { render() { const { editPage, moveAttr, moveAttrEnd } = this.props; - const { showWarning } = this.state; + const { showWarning, showWarningDelete } = this.state; return (
@@ -404,6 +423,7 @@ export class EditPage extends React.Component {
+
{this.renderEdit()} {this.hasDisplayedRelations() && ( @@ -461,6 +493,7 @@ EditPage.defaultProps = { EditPage.propTypes = { addRelationItem: PropTypes.func.isRequired, changeData: PropTypes.func.isRequired, + deleteData: PropTypes.func.isRequired, editPage: PropTypes.object.isRequired, getData: PropTypes.func.isRequired, history: PropTypes.object.isRequired, @@ -483,6 +516,7 @@ function mapDispatchToProps(dispatch) { { addRelationItem, changeData, + deleteData, getData, initModelProps, moveAttr, diff --git a/packages/strapi-plugin-content-manager/admin/src/containers/EditPage/saga.js b/packages/strapi-plugin-content-manager/admin/src/containers/EditPage/saga.js index 83651c127b..f559c4d543 100644 --- a/packages/strapi-plugin-content-manager/admin/src/containers/EditPage/saga.js +++ b/packages/strapi-plugin-content-manager/admin/src/containers/EditPage/saga.js @@ -9,14 +9,11 @@ import { take, takeLatest, } from 'redux-saga/effects'; - import { makeSelectSchema } from 'containers/App/selectors'; - // Utils. import cleanData from 'utils/cleanData'; import request from 'utils/request'; import templateObject from 'utils/templateObject'; - import { getDataSucceeded, setFormErrors, @@ -24,7 +21,7 @@ import { submitSuccess, unsetLoader, } from './actions'; -import { GET_DATA, SUBMIT } from './constants'; +import { DELETE_DATA, GET_DATA, SUBMIT } from './constants'; import { makeSelectFileRelations, makeSelectIsCreating, @@ -48,6 +45,27 @@ function* dataGet(action) { } } +function* deleteData() { + try { + const currentModelName = yield select(makeSelectModelName()); + const record = yield select(makeSelectRecord()); + const id = record.id || record._id; + const source = yield select(makeSelectSource()); + const requestUrl = `/content-manager/explorer/${currentModelName}/${id}`; + + yield call(request, requestUrl, { method: 'DELETE', params: { source } }); + strapi.notification.success('content-manager.success.record.delete'); + yield new Promise(resolve => { + setTimeout(() => { + resolve(); + }, 300); + }); + yield put(submitSuccess()); + } catch(err) { + strapi.notification.error('content-manager.error.record.delete'); + } +} + export function* submit() { const currentModelName = yield select(makeSelectModelName()); const fileRelations = yield select(makeSelectFileRelations()); @@ -161,6 +179,7 @@ export function* submit() { function* defaultSaga() { const loadDataWatcher = yield fork(takeLatest, GET_DATA, dataGet); + yield fork(takeLatest, DELETE_DATA, deleteData); yield fork(takeLatest, SUBMIT, submit); yield take(LOCATION_CHANGE); From c461629b3b688553005538b3254e78acd4f172af Mon Sep 17 00:00:00 2001 From: aDeve Date: Thu, 4 Oct 2018 14:19:23 +0200 Subject: [PATCH 46/81] Fix #1622 Update Translation FR --- .../admin/src/translations/en.json | 2 +- .../admin/src/translations/fr.json | 7 ++++++- .../admin/src/translations/fr.json | 10 ++++++++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/packages/strapi-plugin-settings-manager/admin/src/translations/en.json b/packages/strapi-plugin-settings-manager/admin/src/translations/en.json index b885891a6f..ff75bd219b 100644 --- a/packages/strapi-plugin-settings-manager/admin/src/translations/en.json +++ b/packages/strapi-plugin-settings-manager/admin/src/translations/en.json @@ -632,4 +632,4 @@ "strapi.notification.success.languageAdd": "The language has been successfully added.", "strapi.notification.success.languageDelete": "The language has been successfully deleted.", "strapi.notification.success.settingsEdit": "The settings have been successfully updated." -} \ No newline at end of file +} diff --git a/packages/strapi-plugin-settings-manager/admin/src/translations/fr.json b/packages/strapi-plugin-settings-manager/admin/src/translations/fr.json index 68dac6d06a..80c43b8d4f 100644 --- a/packages/strapi-plugin-settings-manager/admin/src/translations/fr.json +++ b/packages/strapi-plugin-settings-manager/admin/src/translations/fr.json @@ -78,6 +78,11 @@ "form.server.item.cron": "Cron", "form.server.item.host": "Host", "form.server.item.port": "Port", + "form.server.item.proxy": "Paramètres du Proxy", + "form.server.item.proxy.enable": "Activer le Proxy", + "form.server.item.proxy.host": "Proxy Host", + "form.server.item.proxy.port": "Proxy Port", + "form.server.item.proxy.ssl": "Proxy SSL", "form.server.name": "Serveur", "language.af": "Afrikaans", "language.af_NA": "Afrikaans (Namibië)", @@ -629,4 +634,4 @@ "strapi.notification.success.languageAdd": "Le nouveau langage a été ajouté", "strapi.notification.success.languageDelete": "Le language a été supprimé", "strapi.notification.success.settingsEdit": "Les modifications ont été effectuées" -} \ No newline at end of file +} diff --git a/packages/strapi-plugin-users-permissions/admin/src/translations/fr.json b/packages/strapi-plugin-users-permissions/admin/src/translations/fr.json index e64ca4974d..cb2dda6884 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/translations/fr.json +++ b/packages/strapi-plugin-users-permissions/admin/src/translations/fr.json @@ -6,7 +6,9 @@ "Auth.form.button.register": "Prêt à commencer", "Auth.form.button.register-success": "Envoyer à nouveau", "Auth.form.button.reset-password": "Changez votre mot de passe", + "Auth.form.error.blocked": "Votre compte a été bloqué par l'administrateur.", "Auth.form.error.code.provide": "Le code est incorrect.", + "Auth.form.error.confirmed": "L'email de votre compte n'est pas confirmé.", "Auth.form.error.email.invalid": "Cette e-mail n'est pas valide.", "Auth.form.error.email.provide": "Votre identifiant est manquant.", "Auth.form.error.email.taken": "Cet email est déjà utilisé", @@ -17,6 +19,7 @@ "Auth.form.error.password.local": "Ce compte n'a pas de mot de passe.", "Auth.form.error.password.matching": "Les mots de passe ne sont pas identique.", "Auth.form.error.password.provide": "Votre mot de passe est manquant.", + "Auth.form.error.ratelimit": "Trop de tentatives, veuillez réessayer dans une minute.", "Auth.form.error.user.not-exist": "Cette e-mails n'existe pas.", "Auth.form.error.username.taken": "Ce nom est déjà utilisé", "Auth.form.forgot-password.email.label": "Entrez votre email", @@ -52,8 +55,12 @@ "EditForm.inputSelect.subscriptions.description": "Limitez le nombre de souscriptions par IP par heure.", "EditForm.inputSelect.subscriptions.label": "Quotas de souscriptions", "EditForm.inputToggle.description.email": "Interdire l'utilisateur de créer de multiple comptes avec la même adresse email avec des providers différents", + "EditForm.inputToggle.description.email-confirmation": "Quand cette option est activée (ON), les nouveaux utilisateurs enregistrés reçoivent un email de confirmation.", + "EditForm.inputToggle.description.email-confirmation-redirection": "Après confirmation de votre email, choisissez où vous allez être redirigé.", "EditForm.inputToggle.description.sign-up": "Quand l'inscription est désactivée (OFF), aucun utilisateur ne peut s'inscrire qu'importe le provider", "EditForm.inputToggle.label.email": "Un compte par adresse email", + "EditForm.inputToggle.label.email-confirmation": "Activer l'email de confirmation", + "EditForm.inputToggle.label.email-confirmation-redirection": "Redirection de l'URL", "EditForm.inputToggle.label.sign-up": "Activer l'inscription", "EditPage.cancel": "Cancel", "EditPage.form.roles": "Rôles détails", @@ -69,6 +76,7 @@ "EditPage.notification.policies.error": "Une erreur est survenue en récupérant les policies", "EditPage.notification.role.error": "Une erreur est survenue en récupérant le rôle", "EditPage.submit": "Sauvegarder", + "Email.template.email_confirmation": "Confirmation de l'adresse email", "Email.template.reset_password": "Modification de mot de passe", "Email.template.success_register": "Inscription réussie", "Email.template.validation_email": "Email de validation d'adresse", @@ -114,6 +122,7 @@ "PopUpForm.Email.validation_email.options.message.placeholder": "

Merci de cliquer sur ce lien pour valider votre compte

", "PopUpForm.Email.validation_email.options.object.placeholder": "Merci de confirmer votre adresse email pour %APP_NAME%", "PopUpForm.Providers.callback.placeholder": "TEXT", + "PopUpForm.Providers.discord.providerConfig.redirectURL": "L'URL de redirection à ajouter dans les configurations Discord de votre application", "PopUpForm.Providers.enabled.description": "S'il est désactivé les utilisateurs ne pourront pas utiliser ce provider.", "PopUpForm.Providers.enabled.label": "Activer", "PopUpForm.Providers.facebook.providerConfig.redirectURL": "L'URL de redirection à ajouter dans les configurations Facebook de votre application", @@ -122,6 +131,7 @@ "PopUpForm.Providers.key.label": "Client ID", "PopUpForm.Providers.key.placeholder": "TEXT", "PopUpForm.Providers.linkedin2.providerConfig.redirectURL": "L'URL de redirection à ajouter dans les configurations Linkedin de votre application", + "PopUpForm.Providers.microsoft.providerConfig.redirectURL": "L'URL de redirection à ajouter dans les configurations Microsoft de votre application", "PopUpForm.Providers.redirectURL.front-end.label": "L'URL de redirection de votre app front-end", "PopUpForm.Providers.secret.label": "Client Secret", "PopUpForm.Providers.secret.placeholder": "TEXT", From 870b31ce5caf08f936ea043104bdf317764f227a Mon Sep 17 00:00:00 2001 From: Jim LAURIE Date: Thu, 4 Oct 2018 17:17:25 +0200 Subject: [PATCH 47/81] Fix typo update bookshelf service --- .../strapi-generate-api/templates/bookshelf/service.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/strapi-generate-api/templates/bookshelf/service.template b/packages/strapi-generate-api/templates/bookshelf/service.template index 948a990494..3bcefb435e 100644 --- a/packages/strapi-generate-api/templates/bookshelf/service.template +++ b/packages/strapi-generate-api/templates/bookshelf/service.template @@ -120,7 +120,7 @@ module.exports = { const data = _.omit(values, <%= globalID %>.associations.map(ast => ast.alias)); // Create entry with no-relational data. - const entry = <%= globalID %>.forge(params).save(data, { path: true }); + const entry = <%= globalID %>.forge(params).save(data); // Create relational data and return the entry. return <%= globalID %>.updateRelations(Object.assign(params, { values: relations })); From 2c72115088e11e8197eb8d899689deadccca35b9 Mon Sep 17 00:00:00 2001 From: segush11 Date: Fri, 5 Oct 2018 00:48:05 +0500 Subject: [PATCH 48/81] Add missing translation keys in RU language --- .../strapi-admin/admin/src/translations/ru.json | 1 + .../admin/src/translations/ru.json | 13 +++++++++++++ .../admin/src/translations/ru.json | 5 +++++ .../admin/src/translations/ru.json | 11 +++++++++++ 4 files changed, 30 insertions(+) diff --git a/packages/strapi-admin/admin/src/translations/ru.json b/packages/strapi-admin/admin/src/translations/ru.json index c70c61fa64..86ce858d85 100644 --- a/packages/strapi-admin/admin/src/translations/ru.json +++ b/packages/strapi-admin/admin/src/translations/ru.json @@ -25,6 +25,7 @@ "app.components.ComingSoonPage.featuresNotAvailable": "Этот функционал все еще находится в стадии активной разработки.", "app.components.DownloadInfo.download": "Выполняется загрузка...", "app.components.DownloadInfo.text": "Это может занять около минуты. Спасибо за ваше терпение.", + "app.components.EmptyAttributes.title": "Пока нет полей", "app.components.HomePage.button.blog": "СМОТРИТЕ БОЛЬШЕ В БЛОГЕ", "app.components.HomePage.button.quickStart": "ОЗНАКОМТЕСЬ С РУКОВОДСТВОМ ПО БЫСТРОМУ СТАРТУ", "app.components.HomePage.community": "Найти сообщество в интернете", diff --git a/packages/strapi-plugin-content-manager/admin/src/translations/ru.json b/packages/strapi-plugin-content-manager/admin/src/translations/ru.json index 1cd8be7b48..ac5160cfa4 100644 --- a/packages/strapi-plugin-content-manager/admin/src/translations/ru.json +++ b/packages/strapi-plugin-content-manager/admin/src/translations/ru.json @@ -3,6 +3,11 @@ "components.AddFilterCTA.add": "Фильтры", "components.AddFilterCTA.hide": "Фильтры", "components.DraggableAttr.edit": "Нажмите чтобы редактировать", + "components.EmptyAttributesBlock.button": "Перейти в настройки", + "components.EmptyAttributesBlock.description": "Вы можете изменить текущие настройки", + "containers.Edit.addAnItem": "Добавить элемент", + "containers.Edit.clickToJump": "Нажмите для перехода к записи", + "containers.Edit.seeDetails": "Подробнее", "components.FilterOptions.FILTER_TYPES.=": "равно", "components.FilterOptions.FILTER_TYPES._contains": "содержит", "components.FilterOptions.FILTER_TYPES._containss": "содержит (с учетом регистра)", @@ -18,7 +23,12 @@ "components.FiltersPickWrapper.PluginHeader.title.filter": "Фильтры", "components.FiltersPickWrapper.hide": "Скрыть", "components.LimitSelect.itemsPerPage": "Элементов на странице", + "containers.ListPage.displayedFields": "Отображаемые поля", "components.Search.placeholder": "Поиск записей...", + "containers.SettingPage.addRelationalField": "Добавить связанное поле", + "containers.SettingPage.editSettings.description": "Перетащите поля для сборки макета", + "containers.SettingPage.editSettings.title": "Правка — Настройки", + "containers.SettingPage.relations": "Связанные поля", "components.TableDelete.delete": "Удалить все", "components.TableDelete.entries.plural": "{число} записей выбрано", "components.TableDelete.entries.singular": "{число} записей выделено", @@ -81,9 +91,12 @@ "form.Input.label.inputDescription": "Это знчение переопределит метку, в заголовке таблицы", "form.Input.pageEntries": "Записей на страницу", "form.Input.pageEntries.inputDescription": "Заметка: вы можете переопределить это значение на странице настроек Типа Данных", + "form.Input.placeholder": "Плейсхолдер", + "form.Input.placeholder.placeholder": "Мое значение", "form.Input.search": "Применить поиск", "form.Input.search.field": "Применить поиск по этому полю", "form.Input.sort.field": "Применить сортировку по этому полю", + "notification.error.displayedFields": "Необходимо добавить хотя бы одно поле", "notification.error.relationship.fetch": "Возникла ошибка при получении связей.", "notification.info.SettingPage.disableSort": "У вас должен быть один атрибут с разрешенной сортировкой", "pageNotFound": "Страница не найдена", diff --git a/packages/strapi-plugin-settings-manager/admin/src/translations/ru.json b/packages/strapi-plugin-settings-manager/admin/src/translations/ru.json index cf896316b6..95145b37e2 100644 --- a/packages/strapi-plugin-settings-manager/admin/src/translations/ru.json +++ b/packages/strapi-plugin-settings-manager/admin/src/translations/ru.json @@ -78,6 +78,11 @@ "form.server.item.cron": "Cron", "form.server.item.host": "Host", "form.server.item.port": "Port", + "form.server.item.proxy": "Настройки прокси", + "form.server.item.proxy.enable": "Прокси включен", + "form.server.item.proxy.host": "Хост", + "form.server.item.proxy.port": "Порт", + "form.server.item.proxy.ssl": "SSL", "form.server.name": "Сервер", "language.af": "Afrikaans", "language.af_NA": "Afrikaans (Namibië)", diff --git a/packages/strapi-plugin-users-permissions/admin/src/translations/ru.json b/packages/strapi-plugin-users-permissions/admin/src/translations/ru.json index fe50e6e10c..8209ef2ee5 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/translations/ru.json +++ b/packages/strapi-plugin-users-permissions/admin/src/translations/ru.json @@ -6,7 +6,9 @@ "Auth.form.button.register": "Готов начать", "Auth.form.button.register-success": "Послать еще раз", "Auth.form.button.reset-password": "Сменить пароль", + "Auth.form.error.blocked": "Ваш аккаунт заблокирован администратором.", "Auth.form.error.code.provide": "Неверный код.", + "Auth.form.error.confirmed": "Адрес электронной почты не подтвержден.", "Auth.form.error.email.invalid": "Неправильный адрес электронной почты.", "Auth.form.error.email.provide": "Укажите свое имя пользователя или адрес электронной почты.", "Auth.form.error.email.taken": "Почтовый адрес уже используется", @@ -17,6 +19,7 @@ "Auth.form.error.password.local": "Этот пользователь никогда не задавал пароль, пожалуйста, войдите в систему через провайдера, используемого при создании учетной записи.", "Auth.form.error.password.matching": "Пароль не соответствует.", "Auth.form.error.password.provide": "Укажите свой пароль.", + "Auth.form.error.ratelimit": "Слишком много попыток. Пожалуйста, попробуйте позже.", "Auth.form.error.user.not-exist": "Этот почтовый адрес не существует.", "Auth.form.error.username.taken": "Имя пользователя уже используется", "Auth.form.forgot-password.email.label": "Введите ваш почтовый адрес", @@ -45,6 +48,7 @@ "BoundRoute.title": "Связать путь с", "Controller.input.label": "{label} ", "Controller.selectAll": "Выделить все", + "components.Input.error.password.length": "Пароль слишком короткий", "EditForm.inputSelect.description.role": "Он присоединит нового аутентифицированного пользователя к выбранной роли.", "EditForm.inputSelect.durations.description": "Количество часов, в течение которых пользователь не может подписаться.", "EditForm.inputSelect.durations.label": "Длительность", @@ -52,8 +56,12 @@ "EditForm.inputSelect.subscriptions.description": "Ограничить количество подписчиков на каждый IP-адрес в час.", "EditForm.inputSelect.subscriptions.label": "Управление квотами на подписку", "EditForm.inputToggle.description.email": "Запретить пользователю создавать несколько учетных записей, используя один и тот же адрес электронной почты с различными провайдерами аутентификации.", + "EditForm.inputToggle.description.email-confirmation": "Если включено (ON), новые пользователи получат уведомление по электронной почте.", + "EditForm.inputToggle.description.email-confirmation-redirection": "После подтверждения электронной почты укажите URL-адрес для перенаправления.", "EditForm.inputToggle.description.sign-up": "Когда выключенно (OFF) процесс регистрации запрещен. Никто не может подписаться, независимо от провайдера.", "EditForm.inputToggle.label.email": "Одна учетная запись на адрес электронной почты", + "EditForm.inputToggle.label.email-confirmation": "Включить подтверждение по электронной почте", + "EditForm.inputToggle.label.email-confirmation-redirection": "URL-адрес для перенаправления", "EditForm.inputToggle.label.sign-up": "Включить регистрации", "EditPage.cancel": "Отменить", "EditPage.form.roles": "Детали роли", @@ -69,6 +77,7 @@ "EditPage.notification.policies.error": "Возникла ошибка при загрузке политики пользователя", "EditPage.notification.role.error": "Возникла ошибка при загрузке роли", "EditPage.submit": "Сохранить", + "Email.template.email_confirmation": "Адрес электронной почты для подтверждения", "Email.template.reset_password": "Сброс пароля", "Email.template.success_register": "Регистрация прошла успешно", "Email.template.validation_email": "Валидация почтового адреса", @@ -114,6 +123,7 @@ "PopUpForm.Email.validation_email.options.message.placeholder": "

Пажалуйста нажмите на ссылку чтобы подтвердить вашу учетную запись

", "PopUpForm.Email.validation_email.options.object.placeholder": "Пожалуйста подтвердите ваш почтовый адрес для %APP_NAME%", "PopUpForm.Providers.callback.placeholder": "TEXT", + "PopUpForm.Providers.discord.providerConfig.redirectURL": "URL-адрес перенаправления, который необходимо добавить в настройки Discord приложения", "PopUpForm.Providers.enabled.description": "Если отключено, пользователь не сможет использовать этот провайдер.", "PopUpForm.Providers.enabled.label": "Включить", "PopUpForm.Providers.facebook.providerConfig.redirectURL": "URL-адрес перенаправления, который необходимо добавить в настройки Facebook приложения", @@ -122,6 +132,7 @@ "PopUpForm.Providers.key.label": "Client ID", "PopUpForm.Providers.key.placeholder": "TEXT", "PopUpForm.Providers.linkedin2.providerConfig.redirectURL": "URL-адрес перенаправления, который необходимо добавить в настройки Linkedin приложения", + "PopUpForm.Providers.microsoft.providerConfig.redirectURL": "URL-адрес перенаправления, который необходимо добавить в настройки Microsoft приложения", "PopUpForm.Providers.redirectURL.front-end.label": "URL-адрес перенаправления для вашего приложения", "PopUpForm.Providers.secret.label": "Client Secret", "PopUpForm.Providers.secret.placeholder": "TEXT", From d7ffb9e50ebd62c72c6d238250f18c221d48ff9f Mon Sep 17 00:00:00 2001 From: Alberto Maturano Date: Thu, 4 Oct 2018 12:36:16 -0500 Subject: [PATCH 49/81] Fix conditional logic Original code: ```js const listTitle = this.props.match.params.slug === 'languages' || 'databases' ? this.renderListTitle() : ''; ``` Is interpreted as: ```js const listTitle = ( this.props.match.params.slug === 'languages' || 'databases' ) ? this.renderListTitle() : '' ; ``` Been `databases` always been evaluate as `true`, this is the same that: ```js const listTitle = this.renderListTitle(); ``` Clearly is not the intention. I refactor this peace of code with what I think was the real intention; looking just the code, not knowing is this is the desire behavior --- .../admin/src/containers/HomePage/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/strapi-plugin-settings-manager/admin/src/containers/HomePage/index.js b/packages/strapi-plugin-settings-manager/admin/src/containers/HomePage/index.js index da3cfeeaa8..25073ec930 100644 --- a/packages/strapi-plugin-settings-manager/admin/src/containers/HomePage/index.js +++ b/packages/strapi-plugin-settings-manager/admin/src/containers/HomePage/index.js @@ -397,8 +397,8 @@ export class HomePage extends React.Component { // eslint-disable-line react/pre // if custom view display render specificComponent const Component = this.components[specificComponent]; const addRequiredInputDesign = this.props.match.params.slug === 'databases'; - const listTitle = this.props.match.params.slug === 'languages' || 'databases' ? this.renderListTitle() : ''; - const listButtonLabel = this.props.match.params.slug === 'languages' || 'databases' ? this.renderListButtonLabel() : ''; + const listTitle = ['languages', 'databases'].includes(this.props.match.params.slug) ? this.renderListTitle() : ''; + const listButtonLabel = ['languages', 'databases'].includes(this.props.match.params.slug) ? this.renderListButtonLabel() : ''; // check if HeaderNav component needs to render a form or a list const renderListComponent = this.props.match.params.slug === 'databases'; From 6574ede3487c41e8175d635fa4a032f79f23d680 Mon Sep 17 00:00:00 2001 From: Alberto Maturano Date: Thu, 4 Oct 2018 12:06:15 -0500 Subject: [PATCH 50/81] Fix `handleClick` invocation `handleClick` declared at line 69 expects 0 arguments, wrong invocation was done. --- .../admin/src/components/TableRow/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/strapi-plugin-content-manager/admin/src/components/TableRow/index.js b/packages/strapi-plugin-content-manager/admin/src/components/TableRow/index.js index 50bb74aedf..b44738fbca 100644 --- a/packages/strapi-plugin-content-manager/admin/src/components/TableRow/index.js +++ b/packages/strapi-plugin-content-manager/admin/src/components/TableRow/index.js @@ -74,7 +74,7 @@ class TableRow extends React.Component { this.handleClick(this.props.destination) }, + { icoType: 'pencil', onClick: this.handleClick }, { id: this.props.record.id, icoType: 'trash', onClick: this.props.onDelete }, ]} /> @@ -119,7 +119,7 @@ class TableRow extends React.Component { render() { return ( - this.handleClick(this.props.destination)}> + {this.renderCells()} ); From 7721f38ee62c8c1e5d1a1d90c747de813364ee8b Mon Sep 17 00:00:00 2001 From: Alberto Maturano Date: Thu, 4 Oct 2018 12:12:47 -0500 Subject: [PATCH 51/81] Fix `defaultProps` declaration Was done in multiple places. --- .../admin/src/components/TableRow/index.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/packages/strapi-plugin-content-manager/admin/src/components/TableRow/index.js b/packages/strapi-plugin-content-manager/admin/src/components/TableRow/index.js index b44738fbca..e42a9af38b 100644 --- a/packages/strapi-plugin-content-manager/admin/src/components/TableRow/index.js +++ b/packages/strapi-plugin-content-manager/admin/src/components/TableRow/index.js @@ -130,11 +130,6 @@ TableRow.contextTypes = { router: PropTypes.object.isRequired, }; -TableRow.defaultProps = { - enableBulkActions: true, - value: false, -}; - TableRow.propTypes = { destination: PropTypes.string.isRequired, enableBulkActions: PropTypes.bool, @@ -147,7 +142,9 @@ TableRow.propTypes = { }; TableRow.defaultProps = { + enableBulkActions: true, onDelete: () => {}, + value: false, }; export default TableRow; From ac7aa866584b92f72b9e34c289cca02f59309086 Mon Sep 17 00:00:00 2001 From: Alberto Maturano Date: Thu, 4 Oct 2018 15:16:41 -0500 Subject: [PATCH 52/81] Fix conditional returning the same --- .../admin/src/components/List/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/strapi-plugin-users-permissions/admin/src/components/List/index.js b/packages/strapi-plugin-users-permissions/admin/src/components/List/index.js index 3b029e8f84..a404d56e7f 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/components/List/index.js +++ b/packages/strapi-plugin-users-permissions/admin/src/components/List/index.js @@ -38,7 +38,7 @@ const generateListTitle = (data, settingType) => { const disabledProviders = size(data) - enabledProvidersSize > 1 ? - : ; + : ; return
{enabledProviders} {disabledProviders}
; From 017e713ec4163d4352186b15e45cde004afa7396 Mon Sep 17 00:00:00 2001 From: Alberto Maturano Date: Thu, 4 Oct 2018 15:19:56 -0500 Subject: [PATCH 53/81] Remove unused imported library --- packages/strapi-admin/scripts/preSetup.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/strapi-admin/scripts/preSetup.js b/packages/strapi-admin/scripts/preSetup.js index ac619911bb..22bf763312 100644 --- a/packages/strapi-admin/scripts/preSetup.js +++ b/packages/strapi-admin/scripts/preSetup.js @@ -1,6 +1,5 @@ const shell = require('shelljs'); const path = require('path'); -const _ = require('lodash'); shell.echo(''); shell.echo('🕓 The setup process can take few minutes.'); From e4f60a26ab2be42ed6e2ccc350544e9e2c1f0467 Mon Sep 17 00:00:00 2001 From: Alberto Maturano Date: Thu, 4 Oct 2018 15:21:05 -0500 Subject: [PATCH 54/81] Use just one call system --- packages/strapi-admin/scripts/preSetup.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/strapi-admin/scripts/preSetup.js b/packages/strapi-admin/scripts/preSetup.js index 22bf763312..40999fbf94 100644 --- a/packages/strapi-admin/scripts/preSetup.js +++ b/packages/strapi-admin/scripts/preSetup.js @@ -1,11 +1,12 @@ const shell = require('shelljs'); const path = require('path'); -shell.echo(''); -shell.echo('🕓 The setup process can take few minutes.'); -shell.echo(''); -shell.echo('🔸 Administration Panel'); -shell.echo('📦 Installing packages...'); +shell.echo(` +🕓 The setup process can take few minutes. + +🔸 Administration Panel +📦 Installing packages... +`); const pwd = shell.pwd(); From 2410d5ab9d1e780b46d21baa8aba06bac2245f3e Mon Sep 17 00:00:00 2001 From: Alberto Maturano Date: Thu, 4 Oct 2018 15:22:10 -0500 Subject: [PATCH 55/81] Simplify logic --- .../lib/internals/webpack/webpack.dll.babel.js | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/packages/strapi-helper-plugin/lib/internals/webpack/webpack.dll.babel.js b/packages/strapi-helper-plugin/lib/internals/webpack/webpack.dll.babel.js index b6d0a487c4..9cf7b23f22 100644 --- a/packages/strapi-helper-plugin/lib/internals/webpack/webpack.dll.babel.js +++ b/packages/strapi-helper-plugin/lib/internals/webpack/webpack.dll.babel.js @@ -1,26 +1,17 @@ /** * WEBPACK DLL GENERATOR * - * This profile is used to cache webpack's module - * contexts for external library and framework type - * dependencies which will usually not change often enough - * to warrant building them from scratch every time we use - * the webpack process. + * This profile is used to cache webpack's module contexts for external library and framework type dependencies which + * will usually not change often enough to warrant building them from scratch every time we use the webpack process. */ const path = require('path'); const webpack = require('webpack'); const isAdmin = process.env.IS_ADMIN === 'true'; -const appPath = (() => { - if (process.env.APP_PATH) { - return process.env.APP_PATH; - } - - return isAdmin ? path.resolve(process.env.PWD, '..') : path.resolve(process.env.PWD, '..', '..'); -})(); // const isSetup = path.resolve(process.env.PWD, '..', '..') === path.resolve(process.env.INIT_CWD); const isSetup = process.env.IS_MONOREPO; +const appPath = process.env.APP_PATH || path.resolve(process.env.PWD, '..', ( isAdmin ? '' : '..' )); const rootAdminpath = (() => { if (isSetup) { From bdde29eba83ac2c66c0ca915ad7f35c663301077 Mon Sep 17 00:00:00 2001 From: Alberto Maturano Date: Thu, 4 Oct 2018 17:05:29 -0500 Subject: [PATCH 56/81] Use the personal repository for contributions Or, the fork step should not be there... --- CONTRIBUTING.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 47723e14fb..e271fe6335 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -38,14 +38,14 @@ Then, please follow the instructions below: [Go to the repository](https://github.com/strapi/strapi) and fork it to your own GitHub account. -#### 2. 💿 Clone the repository +#### 2. 💿 Clone from your repository ```bash -git clone git@github.com:strapi/strapi.git +git clone git@github.com:YOUR_USERNAME/strapi.git ``` #### 3. ⏳ Installation - + Go to the root of the repository. ```bash cd strapi From 507ab8b9228afa396ff1b0d36814030734aec30a Mon Sep 17 00:00:00 2001 From: Benjamin Devaublanc Date: Fri, 5 Oct 2018 13:07:39 +0200 Subject: [PATCH 57/81] Fix error on fetch permissions Can't fetch permissions if we have an api that contain a service with no controllers --- .../services/UsersPermissions.js | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/strapi-plugin-users-permissions/services/UsersPermissions.js b/packages/strapi-plugin-users-permissions/services/UsersPermissions.js index f358a76e50..4ef5242f48 100644 --- a/packages/strapi-plugin-users-permissions/services/UsersPermissions.js +++ b/packages/strapi-plugin-users-permissions/services/UsersPermissions.js @@ -115,13 +115,15 @@ module.exports = { return acc; }, {})); - const appControllers = Object.keys(strapi.api || {}).reduce((acc, key) => { - Object.keys(strapi.api[key].controllers).forEach((controller) => { - acc.controllers[controller] = generateActions(strapi.api[key].controllers[controller]); - }); + const appControllers = Object.keys(strapi.api || {}) + .filter(key => !!strapi.api[key].controllers) + .reduce((acc, key) => { + Object.keys(strapi.api[key].controllers).forEach((controller) => { + acc.controllers[controller] = generateActions(strapi.api[key].controllers[controller]); + }); - return acc; - }, { controllers: {} }); + return acc; + }, { controllers: {} }); const pluginsPermissions = Object.keys(strapi.plugins).reduce((acc, key) => { const initialState = { From 25ab8e7bef27da6516bca80e6e99fd55cb00d0b1 Mon Sep 17 00:00:00 2001 From: Jim LAURIE Date: Fri, 5 Oct 2018 17:24:17 +0200 Subject: [PATCH 58/81] Add base /documentation --- docs/.vuepress/config.js | 1 + docs/.vuepress/dist/1.x.x/SUMMARY.html | 23 + docs/.vuepress/dist/1.x.x/admin.html | 41 ++ docs/.vuepress/dist/1.x.x/blueprints.html | 189 ++++++ docs/.vuepress/dist/1.x.x/cli.html | 49 ++ docs/.vuepress/dist/1.x.x/configuration.html | 313 ++++++++++ docs/.vuepress/dist/1.x.x/context.html | 67 +++ docs/.vuepress/dist/1.x.x/customization.html | 53 ++ docs/.vuepress/dist/1.x.x/email.html | 85 +++ docs/.vuepress/dist/1.x.x/graphql.html | 79 +++ docs/.vuepress/dist/1.x.x/index.html | 45 ++ .../dist/1.x.x/internationalization.html | 74 +++ docs/.vuepress/dist/1.x.x/introduction.html | 80 +++ docs/.vuepress/dist/1.x.x/logging.html | 73 +++ docs/.vuepress/dist/1.x.x/models.html | 416 ++++++++++++++ docs/.vuepress/dist/1.x.x/queries.html | 311 ++++++++++ docs/.vuepress/dist/1.x.x/request.html | 174 ++++++ docs/.vuepress/dist/1.x.x/response.html | 94 +++ docs/.vuepress/dist/1.x.x/router.html | 132 +++++ docs/.vuepress/dist/1.x.x/services.html | 66 +++ docs/.vuepress/dist/1.x.x/sessions.html | 58 ++ docs/.vuepress/dist/1.x.x/testing.html | 85 +++ docs/.vuepress/dist/1.x.x/upload.html | 77 +++ docs/.vuepress/dist/1.x.x/users.html | 66 +++ docs/.vuepress/dist/1.x.x/views.html | 67 +++ docs/.vuepress/dist/3.x.x/SUMMARY.html | 23 + .../dist/3.x.x/advanced/customize-admin.html | 164 ++++++ docs/.vuepress/dist/3.x.x/advanced/hooks.html | 110 ++++ .../dist/3.x.x/advanced/logging.html | 66 +++ .../dist/3.x.x/advanced/middlewares.html | 142 +++++ .../dist/3.x.x/advanced/usage-tracking.html | 30 + .../dist/3.x.x/api-reference/reference.html | 30 + docs/.vuepress/dist/3.x.x/cli/CLI.html | 79 +++ .../dist/3.x.x/concepts/concepts.html | 70 +++ .../3.x.x/configurations/configurations.html | 185 ++++++ .../3.x.x/getting-started/installation.html | 31 + .../3.x.x/getting-started/quick-start.html | 91 +++ .../dist/3.x.x/guides/authentication.html | 126 ++++ .../dist/3.x.x/guides/controllers.html | 44 ++ .../dist/3.x.x/guides/deployment.html | 42 ++ docs/.vuepress/dist/3.x.x/guides/email.html | 38 ++ docs/.vuepress/dist/3.x.x/guides/filters.html | 55 ++ docs/.vuepress/dist/3.x.x/guides/graphql.html | 414 ++++++++++++++ docs/.vuepress/dist/3.x.x/guides/i18n.html | 50 ++ docs/.vuepress/dist/3.x.x/guides/models.html | 408 +++++++++++++ .../.vuepress/dist/3.x.x/guides/policies.html | 97 ++++ .../dist/3.x.x/guides/public-assets.html | 29 + .../.vuepress/dist/3.x.x/guides/requests.html | 164 ++++++ .../dist/3.x.x/guides/responses.html | 365 ++++++++++++ docs/.vuepress/dist/3.x.x/guides/restapi.html | 49 ++ docs/.vuepress/dist/3.x.x/guides/routing.html | 68 +++ .../.vuepress/dist/3.x.x/guides/services.html | 63 ++ docs/.vuepress/dist/3.x.x/guides/upload.html | 90 +++ docs/.vuepress/dist/3.x.x/index.html | 32 ++ .../migration-guide-alpha-10-to-alpha-11.html | 30 + .../migration-guide-alpha-11-to-alpha-12.html | 57 ++ .../migration-guide-alpha-7-4-to-alpha-8.html | 39 ++ .../migration-guide-alpha-8-to-alpha-9.html | 35 ++ .../migration-guide-alpha-9-to-alpha-10.html | 30 + .../dist/3.x.x/migration/migration-guide.html | 265 +++++++++ .../backend-development.html | 111 ++++ .../frontend-development.html | 77 +++ .../frontend-use-cases.html | 541 ++++++++++++++++++ .../plugin-architecture.html | 55 ++ .../plugin-development/plugin-left-menu.html | 135 +++++ .../3.x.x/plugin-development/quick-start.html | 23 + .../plugin-development/ui-components.html | 23 + .../dist/3.x.x/plugin-development/utils.html | 356 ++++++++++++ .../.vuepress/dist/3.x.x/tutorials/index.html | 26 + docs/.vuepress/dist/404.html | 17 + .../dist/assets/css/1.styles.77d89b12.css | 0 .../dist/assets/css/2.styles.08038ddb.css | 1 + .../dist/assets/css/styles.a8210063.css | 1 + .../getting-started_add_entry.5ce15d30.png | Bin 0 -> 125813 bytes .../getting-started_allow_access.ea852994.png | Bin 0 -> 294849 bytes ...g-started_create_content_type.f4e658ac.png | Bin 0 -> 148411 bytes .../getting-started_list_fields.ecdf11cf.png | Bin 0 -> 138253 bytes ...ting-started_manage_role_home.11fb8455.png | Bin 0 -> 122683 bytes ...tting-started_no_content_type.144f7dab.png | Bin 0 -> 130776 bytes .../img/getting-started_no_entry.aef6f603.png | Bin 0 -> 124676 bytes .../img/getting-started_register.e656c1ff.png | Bin 0 -> 116786 bytes .../getting-started_with_entry.423d6421.png | Bin 0 -> 133700 bytes .../dist/assets/img/search.83621669.svg | 1 + .../dist/assets/img/terminal_new.3f7e23c3.png | Bin 0 -> 149517 bytes .../assets/img/terminal_start.b3a7364f.png | Bin 0 -> 260253 bytes docs/.vuepress/dist/assets/js/1.77d89b12.js | 1 + docs/.vuepress/dist/assets/js/10.f9e7d997.js | 1 + docs/.vuepress/dist/assets/js/11.bfb9de0f.js | 1 + docs/.vuepress/dist/assets/js/12.124227d1.js | 1 + docs/.vuepress/dist/assets/js/13.d8092700.js | 1 + docs/.vuepress/dist/assets/js/14.7cfd4cb8.js | 1 + docs/.vuepress/dist/assets/js/15.55a20f7c.js | 1 + docs/.vuepress/dist/assets/js/16.5c84c402.js | 1 + docs/.vuepress/dist/assets/js/17.1c93d494.js | 1 + docs/.vuepress/dist/assets/js/18.e1f1758f.js | 1 + docs/.vuepress/dist/assets/js/19.8d1b00cd.js | 1 + docs/.vuepress/dist/assets/js/2.08038ddb.js | 1 + docs/.vuepress/dist/assets/js/20.856d7bdd.js | 1 + docs/.vuepress/dist/assets/js/21.6f851286.js | 1 + docs/.vuepress/dist/assets/js/22.7ddb4e1d.js | 1 + docs/.vuepress/dist/assets/js/23.15e5a0c3.js | 1 + docs/.vuepress/dist/assets/js/24.6fdf34d0.js | 1 + docs/.vuepress/dist/assets/js/25.21c9a549.js | 1 + docs/.vuepress/dist/assets/js/26.6608295c.js | 1 + docs/.vuepress/dist/assets/js/27.2c9596ea.js | 1 + docs/.vuepress/dist/assets/js/28.9b077c15.js | 1 + docs/.vuepress/dist/assets/js/29.8ea8ecc1.js | 1 + docs/.vuepress/dist/assets/js/3.4d92d5e3.js | 1 + docs/.vuepress/dist/assets/js/30.5d2829b8.js | 1 + docs/.vuepress/dist/assets/js/31.fad00a3a.js | 1 + docs/.vuepress/dist/assets/js/32.a6900221.js | 1 + docs/.vuepress/dist/assets/js/33.bbfb3084.js | 1 + docs/.vuepress/dist/assets/js/34.0eb2f8aa.js | 1 + docs/.vuepress/dist/assets/js/35.76c29241.js | 1 + docs/.vuepress/dist/assets/js/36.dfcc07a1.js | 1 + docs/.vuepress/dist/assets/js/37.173a8112.js | 1 + docs/.vuepress/dist/assets/js/38.b86fac79.js | 1 + docs/.vuepress/dist/assets/js/39.a7d50afe.js | 1 + docs/.vuepress/dist/assets/js/4.385ae6a0.js | 1 + docs/.vuepress/dist/assets/js/40.0415492d.js | 1 + docs/.vuepress/dist/assets/js/41.5ef681df.js | 1 + docs/.vuepress/dist/assets/js/42.fdd80522.js | 1 + docs/.vuepress/dist/assets/js/43.03b496f2.js | 1 + docs/.vuepress/dist/assets/js/44.3f55a367.js | 1 + docs/.vuepress/dist/assets/js/45.6746c3dc.js | 1 + docs/.vuepress/dist/assets/js/46.ff6bc353.js | 1 + docs/.vuepress/dist/assets/js/47.53b7147a.js | 1 + docs/.vuepress/dist/assets/js/48.31a883aa.js | 1 + docs/.vuepress/dist/assets/js/49.18bd1a60.js | 1 + docs/.vuepress/dist/assets/js/5.edd21cb3.js | 1 + docs/.vuepress/dist/assets/js/50.9b6079cd.js | 1 + docs/.vuepress/dist/assets/js/51.b67aee1b.js | 1 + docs/.vuepress/dist/assets/js/52.62bc63b6.js | 1 + docs/.vuepress/dist/assets/js/53.2c567c55.js | 1 + docs/.vuepress/dist/assets/js/54.6cc10d25.js | 1 + docs/.vuepress/dist/assets/js/55.7faca13f.js | 1 + docs/.vuepress/dist/assets/js/56.0b06ad54.js | 1 + docs/.vuepress/dist/assets/js/57.a87c48df.js | 1 + docs/.vuepress/dist/assets/js/58.1c6547d9.js | 1 + docs/.vuepress/dist/assets/js/59.06f908d7.js | 1 + docs/.vuepress/dist/assets/js/6.fd6e4b24.js | 1 + docs/.vuepress/dist/assets/js/60.b5156b8d.js | 1 + docs/.vuepress/dist/assets/js/61.1d5cafa9.js | 1 + docs/.vuepress/dist/assets/js/62.ccacebe2.js | 1 + docs/.vuepress/dist/assets/js/63.66946dde.js | 1 + docs/.vuepress/dist/assets/js/64.d53bdeb7.js | 1 + docs/.vuepress/dist/assets/js/65.0cd2da1f.js | 1 + docs/.vuepress/dist/assets/js/66.03059dce.js | 1 + docs/.vuepress/dist/assets/js/67.6f988923.js | 1 + docs/.vuepress/dist/assets/js/68.303c1a05.js | 1 + docs/.vuepress/dist/assets/js/69.3f4ed952.js | 1 + docs/.vuepress/dist/assets/js/7.e1f45fa9.js | 1 + docs/.vuepress/dist/assets/js/70.531d76be.js | 1 + docs/.vuepress/dist/assets/js/71.ab3e74fc.js | 1 + docs/.vuepress/dist/assets/js/8.dc78e1c2.js | 1 + docs/.vuepress/dist/assets/js/9.fd6a21e6.js | 1 + docs/.vuepress/dist/assets/js/app.a8210063.js | 8 + docs/.vuepress/dist/index.html | 23 + 158 files changed, 7798 insertions(+) create mode 100644 docs/.vuepress/dist/1.x.x/SUMMARY.html create mode 100644 docs/.vuepress/dist/1.x.x/admin.html create mode 100644 docs/.vuepress/dist/1.x.x/blueprints.html create mode 100644 docs/.vuepress/dist/1.x.x/cli.html create mode 100644 docs/.vuepress/dist/1.x.x/configuration.html create mode 100644 docs/.vuepress/dist/1.x.x/context.html create mode 100644 docs/.vuepress/dist/1.x.x/customization.html create mode 100644 docs/.vuepress/dist/1.x.x/email.html create mode 100644 docs/.vuepress/dist/1.x.x/graphql.html create mode 100644 docs/.vuepress/dist/1.x.x/index.html create mode 100644 docs/.vuepress/dist/1.x.x/internationalization.html create mode 100644 docs/.vuepress/dist/1.x.x/introduction.html create mode 100644 docs/.vuepress/dist/1.x.x/logging.html create mode 100644 docs/.vuepress/dist/1.x.x/models.html create mode 100644 docs/.vuepress/dist/1.x.x/queries.html create mode 100644 docs/.vuepress/dist/1.x.x/request.html create mode 100644 docs/.vuepress/dist/1.x.x/response.html create mode 100644 docs/.vuepress/dist/1.x.x/router.html create mode 100644 docs/.vuepress/dist/1.x.x/services.html create mode 100644 docs/.vuepress/dist/1.x.x/sessions.html create mode 100644 docs/.vuepress/dist/1.x.x/testing.html create mode 100644 docs/.vuepress/dist/1.x.x/upload.html create mode 100644 docs/.vuepress/dist/1.x.x/users.html create mode 100644 docs/.vuepress/dist/1.x.x/views.html create mode 100644 docs/.vuepress/dist/3.x.x/SUMMARY.html create mode 100644 docs/.vuepress/dist/3.x.x/advanced/customize-admin.html create mode 100644 docs/.vuepress/dist/3.x.x/advanced/hooks.html create mode 100644 docs/.vuepress/dist/3.x.x/advanced/logging.html create mode 100644 docs/.vuepress/dist/3.x.x/advanced/middlewares.html create mode 100644 docs/.vuepress/dist/3.x.x/advanced/usage-tracking.html create mode 100644 docs/.vuepress/dist/3.x.x/api-reference/reference.html create mode 100644 docs/.vuepress/dist/3.x.x/cli/CLI.html create mode 100644 docs/.vuepress/dist/3.x.x/concepts/concepts.html create mode 100644 docs/.vuepress/dist/3.x.x/configurations/configurations.html create mode 100644 docs/.vuepress/dist/3.x.x/getting-started/installation.html create mode 100644 docs/.vuepress/dist/3.x.x/getting-started/quick-start.html create mode 100644 docs/.vuepress/dist/3.x.x/guides/authentication.html create mode 100644 docs/.vuepress/dist/3.x.x/guides/controllers.html create mode 100644 docs/.vuepress/dist/3.x.x/guides/deployment.html create mode 100644 docs/.vuepress/dist/3.x.x/guides/email.html create mode 100644 docs/.vuepress/dist/3.x.x/guides/filters.html create mode 100644 docs/.vuepress/dist/3.x.x/guides/graphql.html create mode 100644 docs/.vuepress/dist/3.x.x/guides/i18n.html create mode 100644 docs/.vuepress/dist/3.x.x/guides/models.html create mode 100644 docs/.vuepress/dist/3.x.x/guides/policies.html create mode 100644 docs/.vuepress/dist/3.x.x/guides/public-assets.html create mode 100644 docs/.vuepress/dist/3.x.x/guides/requests.html create mode 100644 docs/.vuepress/dist/3.x.x/guides/responses.html create mode 100644 docs/.vuepress/dist/3.x.x/guides/restapi.html create mode 100644 docs/.vuepress/dist/3.x.x/guides/routing.html create mode 100644 docs/.vuepress/dist/3.x.x/guides/services.html create mode 100644 docs/.vuepress/dist/3.x.x/guides/upload.html create mode 100644 docs/.vuepress/dist/3.x.x/index.html create mode 100644 docs/.vuepress/dist/3.x.x/migration/migration-guide-alpha-10-to-alpha-11.html create mode 100644 docs/.vuepress/dist/3.x.x/migration/migration-guide-alpha-11-to-alpha-12.html create mode 100644 docs/.vuepress/dist/3.x.x/migration/migration-guide-alpha-7-4-to-alpha-8.html create mode 100644 docs/.vuepress/dist/3.x.x/migration/migration-guide-alpha-8-to-alpha-9.html create mode 100644 docs/.vuepress/dist/3.x.x/migration/migration-guide-alpha-9-to-alpha-10.html create mode 100644 docs/.vuepress/dist/3.x.x/migration/migration-guide.html create mode 100644 docs/.vuepress/dist/3.x.x/plugin-development/backend-development.html create mode 100644 docs/.vuepress/dist/3.x.x/plugin-development/frontend-development.html create mode 100644 docs/.vuepress/dist/3.x.x/plugin-development/frontend-use-cases.html create mode 100644 docs/.vuepress/dist/3.x.x/plugin-development/plugin-architecture.html create mode 100644 docs/.vuepress/dist/3.x.x/plugin-development/plugin-left-menu.html create mode 100644 docs/.vuepress/dist/3.x.x/plugin-development/quick-start.html create mode 100644 docs/.vuepress/dist/3.x.x/plugin-development/ui-components.html create mode 100644 docs/.vuepress/dist/3.x.x/plugin-development/utils.html create mode 100644 docs/.vuepress/dist/3.x.x/tutorials/index.html create mode 100644 docs/.vuepress/dist/404.html create mode 100644 docs/.vuepress/dist/assets/css/1.styles.77d89b12.css create mode 100644 docs/.vuepress/dist/assets/css/2.styles.08038ddb.css create mode 100644 docs/.vuepress/dist/assets/css/styles.a8210063.css create mode 100644 docs/.vuepress/dist/assets/img/getting-started_add_entry.5ce15d30.png create mode 100644 docs/.vuepress/dist/assets/img/getting-started_allow_access.ea852994.png create mode 100644 docs/.vuepress/dist/assets/img/getting-started_create_content_type.f4e658ac.png create mode 100644 docs/.vuepress/dist/assets/img/getting-started_list_fields.ecdf11cf.png create mode 100644 docs/.vuepress/dist/assets/img/getting-started_manage_role_home.11fb8455.png create mode 100644 docs/.vuepress/dist/assets/img/getting-started_no_content_type.144f7dab.png create mode 100644 docs/.vuepress/dist/assets/img/getting-started_no_entry.aef6f603.png create mode 100644 docs/.vuepress/dist/assets/img/getting-started_register.e656c1ff.png create mode 100644 docs/.vuepress/dist/assets/img/getting-started_with_entry.423d6421.png create mode 100644 docs/.vuepress/dist/assets/img/search.83621669.svg create mode 100644 docs/.vuepress/dist/assets/img/terminal_new.3f7e23c3.png create mode 100644 docs/.vuepress/dist/assets/img/terminal_start.b3a7364f.png create mode 100644 docs/.vuepress/dist/assets/js/1.77d89b12.js create mode 100644 docs/.vuepress/dist/assets/js/10.f9e7d997.js create mode 100644 docs/.vuepress/dist/assets/js/11.bfb9de0f.js create mode 100644 docs/.vuepress/dist/assets/js/12.124227d1.js create mode 100644 docs/.vuepress/dist/assets/js/13.d8092700.js create mode 100644 docs/.vuepress/dist/assets/js/14.7cfd4cb8.js create mode 100644 docs/.vuepress/dist/assets/js/15.55a20f7c.js create mode 100644 docs/.vuepress/dist/assets/js/16.5c84c402.js create mode 100644 docs/.vuepress/dist/assets/js/17.1c93d494.js create mode 100644 docs/.vuepress/dist/assets/js/18.e1f1758f.js create mode 100644 docs/.vuepress/dist/assets/js/19.8d1b00cd.js create mode 100644 docs/.vuepress/dist/assets/js/2.08038ddb.js create mode 100644 docs/.vuepress/dist/assets/js/20.856d7bdd.js create mode 100644 docs/.vuepress/dist/assets/js/21.6f851286.js create mode 100644 docs/.vuepress/dist/assets/js/22.7ddb4e1d.js create mode 100644 docs/.vuepress/dist/assets/js/23.15e5a0c3.js create mode 100644 docs/.vuepress/dist/assets/js/24.6fdf34d0.js create mode 100644 docs/.vuepress/dist/assets/js/25.21c9a549.js create mode 100644 docs/.vuepress/dist/assets/js/26.6608295c.js create mode 100644 docs/.vuepress/dist/assets/js/27.2c9596ea.js create mode 100644 docs/.vuepress/dist/assets/js/28.9b077c15.js create mode 100644 docs/.vuepress/dist/assets/js/29.8ea8ecc1.js create mode 100644 docs/.vuepress/dist/assets/js/3.4d92d5e3.js create mode 100644 docs/.vuepress/dist/assets/js/30.5d2829b8.js create mode 100644 docs/.vuepress/dist/assets/js/31.fad00a3a.js create mode 100644 docs/.vuepress/dist/assets/js/32.a6900221.js create mode 100644 docs/.vuepress/dist/assets/js/33.bbfb3084.js create mode 100644 docs/.vuepress/dist/assets/js/34.0eb2f8aa.js create mode 100644 docs/.vuepress/dist/assets/js/35.76c29241.js create mode 100644 docs/.vuepress/dist/assets/js/36.dfcc07a1.js create mode 100644 docs/.vuepress/dist/assets/js/37.173a8112.js create mode 100644 docs/.vuepress/dist/assets/js/38.b86fac79.js create mode 100644 docs/.vuepress/dist/assets/js/39.a7d50afe.js create mode 100644 docs/.vuepress/dist/assets/js/4.385ae6a0.js create mode 100644 docs/.vuepress/dist/assets/js/40.0415492d.js create mode 100644 docs/.vuepress/dist/assets/js/41.5ef681df.js create mode 100644 docs/.vuepress/dist/assets/js/42.fdd80522.js create mode 100644 docs/.vuepress/dist/assets/js/43.03b496f2.js create mode 100644 docs/.vuepress/dist/assets/js/44.3f55a367.js create mode 100644 docs/.vuepress/dist/assets/js/45.6746c3dc.js create mode 100644 docs/.vuepress/dist/assets/js/46.ff6bc353.js create mode 100644 docs/.vuepress/dist/assets/js/47.53b7147a.js create mode 100644 docs/.vuepress/dist/assets/js/48.31a883aa.js create mode 100644 docs/.vuepress/dist/assets/js/49.18bd1a60.js create mode 100644 docs/.vuepress/dist/assets/js/5.edd21cb3.js create mode 100644 docs/.vuepress/dist/assets/js/50.9b6079cd.js create mode 100644 docs/.vuepress/dist/assets/js/51.b67aee1b.js create mode 100644 docs/.vuepress/dist/assets/js/52.62bc63b6.js create mode 100644 docs/.vuepress/dist/assets/js/53.2c567c55.js create mode 100644 docs/.vuepress/dist/assets/js/54.6cc10d25.js create mode 100644 docs/.vuepress/dist/assets/js/55.7faca13f.js create mode 100644 docs/.vuepress/dist/assets/js/56.0b06ad54.js create mode 100644 docs/.vuepress/dist/assets/js/57.a87c48df.js create mode 100644 docs/.vuepress/dist/assets/js/58.1c6547d9.js create mode 100644 docs/.vuepress/dist/assets/js/59.06f908d7.js create mode 100644 docs/.vuepress/dist/assets/js/6.fd6e4b24.js create mode 100644 docs/.vuepress/dist/assets/js/60.b5156b8d.js create mode 100644 docs/.vuepress/dist/assets/js/61.1d5cafa9.js create mode 100644 docs/.vuepress/dist/assets/js/62.ccacebe2.js create mode 100644 docs/.vuepress/dist/assets/js/63.66946dde.js create mode 100644 docs/.vuepress/dist/assets/js/64.d53bdeb7.js create mode 100644 docs/.vuepress/dist/assets/js/65.0cd2da1f.js create mode 100644 docs/.vuepress/dist/assets/js/66.03059dce.js create mode 100644 docs/.vuepress/dist/assets/js/67.6f988923.js create mode 100644 docs/.vuepress/dist/assets/js/68.303c1a05.js create mode 100644 docs/.vuepress/dist/assets/js/69.3f4ed952.js create mode 100644 docs/.vuepress/dist/assets/js/7.e1f45fa9.js create mode 100644 docs/.vuepress/dist/assets/js/70.531d76be.js create mode 100644 docs/.vuepress/dist/assets/js/71.ab3e74fc.js create mode 100644 docs/.vuepress/dist/assets/js/8.dc78e1c2.js create mode 100644 docs/.vuepress/dist/assets/js/9.fd6a21e6.js create mode 100644 docs/.vuepress/dist/assets/js/app.a8210063.js create mode 100644 docs/.vuepress/dist/index.html diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index 6a251ed895..24b463928f 100644 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -14,6 +14,7 @@ module.exports = { }, title: 'Strapi Docs', description: 'API creation made simple, secure and fast.', + base: '/documentation/', themeConfig: { versions: [ ['Version 3.x.x', '/3.x.x/'], diff --git a/docs/.vuepress/dist/1.x.x/SUMMARY.html b/docs/.vuepress/dist/1.x.x/SUMMARY.html new file mode 100644 index 0000000000..b390c82f57 --- /dev/null +++ b/docs/.vuepress/dist/1.x.x/SUMMARY.html @@ -0,0 +1,23 @@ + + + + + + Summary | Strapi Docs + + + + + + + +
+ + + diff --git a/docs/.vuepress/dist/1.x.x/admin.html b/docs/.vuepress/dist/1.x.x/admin.html new file mode 100644 index 0000000000..aa92ddf175 --- /dev/null +++ b/docs/.vuepress/dist/1.x.x/admin.html @@ -0,0 +1,41 @@ + + + + + + Admin | Strapi Docs + + + + + + + +

Admin

Where is my data ?

This is a recurring question when you create web applications from scratch or +using a web framework. That's why Strapi provides a ready-to-use admin panel.

Dashboard

This part is a summary of your application.

Work in progress.

Data Explorer

The Data Explorer allows you to easily manage your data. +The UI is auto-generated depending on the models of your application. +So, in just a few seconds, you are able to create, search, view, edit and +delete your data.

To try it, simply create a new API using the Studio or the CLI. +Then restart the server and reload the web browser page.

Strapi Admin panel Screenshot Data Explorer

Users

List of Users

List, edit and delete the users information of your application.

Roles

Each user can be related to one or many roles.

The first registered user is automatically related to the admin role.

Permissions

Strapi contains a security system based on the routes of your application. +The admin panel allows you to visualize the different routes of your server and +to manage the security of each of them.

  • Public: no level of security (anyone can use the route).
  • Registered: the user has to be logged to use the route.
  • Owner: the user must be one of the contributors of the model updated or deleted.
  • Admin: only the users related to the admin role are allowed to access the route.

Strapi Admin panel Screenshot Permissions

Customization

The admin panel is developed with Angular.js, using the John PAPA styleguide. +You can customize the admin from ./api/admin/public in your generated application.

To build the admin panel:

  • You need to install bower and gulp with $ npm install gulp bower -g.
  • Run $ npm install in this directory.
  • Run $ gulp serve.
  • Visit http://localhost:3002 from your web browser.
  • When you are ready to use your customized admin panel, run $ gulp dist. +That will update the files in the following folder: ./api/admin/public/dist.
  • Visit http://localhost:1337/admin/.

If you change the default port (1337) of your server, you will have to update +./api/admin/public/config/config.json and then run $ npm install && gulp dist +in ./api/admin/public.

NOTE: You can create your own admin generator using the .strapirc file. +Learn more how to use custom generators.

+ + + diff --git a/docs/.vuepress/dist/1.x.x/blueprints.html b/docs/.vuepress/dist/1.x.x/blueprints.html new file mode 100644 index 0000000000..59ec66c4f3 --- /dev/null +++ b/docs/.vuepress/dist/1.x.x/blueprints.html @@ -0,0 +1,189 @@ + + + + + + Blueprints | Strapi Docs + + + + + + + +

Blueprints

The blueprints are a set of useful actions containing all the logic you need to +create a clean RESTful API. The generated controllers and routes are automatically +plugged to the blueprint actions. Thanks to that, as soon as you generate a new API +from the CLI, you can enjoy a RESTful API without writing any line of code.

For example, if you generate a pet API, you will be able to immediately visit +POST /pet?name=joe to create a pet, and visit GET /pet to see an array +of your application's pets.

Blueprints are great for prototyping, but they are also a powerful tool in production +due to their ability to be overridden, protected, extended or disabled entirely.

All of the following actions return a promise.

find records

Returns a list of records from the model as a JSON array of objects.

Route:

{
+  "routes": {
+    "GET /pet": {
+      "controller": "Pet",
+      "action": "find"
+    }
+  }
+}
+

Controller function:

find: function * () {
+  this.model = 'Pet';
+
+  try {
+    this.body = yield strapi.hooks.blueprints.find(this);
+  } catch (error) {
+    this.body = error;
+  }
+}
+

Results may be filtered, paginated, and sorted based on the blueprint configuration +and/or parameters sent in the request.

Optional parameters:

  • * (string): To filter results based on a particular attribute, specify a query +parameter with the same name as the attribute defined on your model.
  • where (string): Instead of filtering based on a specific attribute, you may instead +choose to provide a where parameter with a Waterline WHERE criteria object, +encoded as a JSON string. This allows you to take advantage of contains, startsWith, +and other sub-attribute criteria modifiers for more powerful find() queries.
  • limit (number): The maximum number of records to send back (useful for pagination). +Defaults to 30.
  • skip (number): The number of records to skip (useful for pagination).
  • sort (string): The sort order. By default, returned records are sorted by primary key value +in ascending order. ASC or DESC.
  • populate (string): If specified, override the default automatic population process. +Accepts a comma separated list of attributes names for which to populate record values.

findOne record

Returns a single record from the model as a JSON object.

Route:

{
+  "routes": {
+    "GET /pet/:id": {
+      "controller": "Pet",
+      "action": "findOne"
+    }
+  }
+}
+

Controller function:

findOne: function * () {
+  this.model = 'Pet';
+
+  try {
+    this.body = yield strapi.hooks.blueprints.findOne(this);
+  } catch (error) {
+    this.body = error;
+  }
+}
+

The findOne() blueprint action returns a single record from the model as a JSON object. +The specified id is the primary key of the desired record.

Required parameters:

  • id (string or number): The desired record's primary key value.

create a record

Creates a new model instance in your database then returns its values.

Route:

{
+  "routes": {
+    "POST /pet/:id": {
+      "controller": "Pet",
+      "action": "create"
+    }
+  }
+}
+

Controller function:

create: function * () {
+  this.model = 'Pet';
+
+  try {
+    this.body = yield strapi.hooks.blueprints.create(this);
+  } catch (error) {
+    this.body = error;
+  }
+}
+

Attributes can be sent in the HTTP body as form-encoded values or JSON.

The promise returned contains a JSON object representing the newly created instance. +If a validation error occurred, a JSON response with the invalid attributes and +the Context status is set to 400.

Optional parameters:

  • * (string, number, object or array): Pass in body parameter with the same +name as the attribute defined in your model to set those values on your new record. +Nested objects and arrays passed in as parameters are handled the same +way as if they were passed into the model's .create() method.

update a record

Updates an existing record. Attributes to change should be sent in the HTTP body +as form-encoded values or JSON.

Route:

{
+  "routes": {
+    "PUT /pet/:id": {
+      "controller": "Pet",
+      "action": "update"
+    }
+  }
+}
+

Controller function:

update: function * () {
+  this.model = 'Pet';
+
+  try {
+    this.body = yield strapi.hooks.blueprints.update(this);
+  } catch (error) {
+    this.body = error;
+  }
+}
+

Updates the model instance which matches the id parameter. +The promise resolved contains a JSON object representing the newly updated instance. +If a validation error occurred, a JSON response with the invalid attributes and a +400 status code will be returned instead. If no model instance exists matching the +specified id, a 404 is returned.

Required parameters:

  • id (string or number): The desired record's primary key value.

Optional parameters:

  • * (string, number, object or array): Pass in body parameter with the same +name as the attribute defined on your model to set those values on your new record. +Nested objects and arrays passed in as parameters are handled the same +way as if they were passed into the model's .update() method.

destroy a record

Deletes an existing record specified by id from the database forever and returns +the values of the deleted record.

Route:

{
+  "routes": {
+    "DELETE /pet/:id": {
+      "controller": "Pet",
+      "action": "destroy"
+    }
+  }
+}
+

Controller function:

destroy: function * () {
+  this.model = 'Pet';
+
+  try {
+    this.body = yield strapi.hooks.blueprints.destroy(this);
+  } catch (error) {
+    this.body = error;
+  }
+}
+

Destroys the model instance which matches the id parameter. +Responds with a JSON object representing the newly destroyed instance. +If no model instance exists matching the specified id, the Context status is set to 400 and the returned promise is rejected.

Required parameters:

  • id (string or number): The desired record's primary key value.

add to a record

Adds an association between two records.

Route:

{
+  "routes": {
+    "POST /pet/:id/:parentId/:relation": {
+      "controller": "Pet",
+      "action": "add"
+    }
+  }
+}
+

Controller function:

add: function * () {
+  this.model = 'Pet';
+
+  try {
+    this.body = yield strapi.hooks.blueprints.add(this);
+  } catch (error) {
+    this.body = error;
+  }
+}
+

This action pushes a reference to some other record (the "foreign" record) onto a +collection attribute of this record (the "primary" record).

  • If :relation of an existing record is supplied, it will be associated with +the primary record.
  • If no :relation is supplied, and the body of the POST contains values for a +new record, that record will be created and associated with the primary record.
  • If the collection within the primary record already contains a reference to the +foreign record, this action will be ignored.
  • If the association is two-way (i.e. reflexive, with via on both sides) the association +on the foreign record will also be updated.

Notes:

  • This action is for dealing with plural ("collection") associations. +If you want to set or unset a singular ("model") association, just use +the update blueprint.

remove from a record

Removes an association between two records.

Route:

{
+  "routes": {
+    "DELETE /pet/:id/:parentId/:relation/:id": {
+      "controller": "Pet",
+      "action": "remove"
+    }
+  }
+}
+

Controller function:

remove: function * () {
+  this.model = 'Pet';
+
+  try {
+    this.body = yield strapi.hooks.blueprints.remove(this);
+  } catch (error) {
+    this.body = error;
+  }
+}
+

This action removes a reference to some other record (the "foreign" record) +from a collection attribute of this record (the "primary" record).

  • If the foreign record does not exist, it is created first.
  • If the collection doesn't contain a reference to the foreign record, +this action will be ignored.
  • If the association is two-way (i.e. reflexive, with via on both sides) +the association on the foreign record will also be updated.
+ + + diff --git a/docs/.vuepress/dist/1.x.x/cli.html b/docs/.vuepress/dist/1.x.x/cli.html new file mode 100644 index 0000000000..6e35060641 --- /dev/null +++ b/docs/.vuepress/dist/1.x.x/cli.html @@ -0,0 +1,49 @@ + + + + + + CLI | Strapi Docs + + + + + + + +

CLI

Strapi comes with a convenient command-line tool to quickly get your application scaffolded and running.

Login

$ strapi login
+

Ask your Strapi Studio credentials to link your new applications on your machine to +the Strapi Studio aiming to have a perfect workflow while you build APIs.

Go to the Strapi Studio to start the experience.

Create a new project

$ strapi new <appName>
+

Create a new Strapi project in a directory called appName.

$ strapi new is really just a special generator which runs strapi-generate-new. +In other words, running $ strapi new <appName> is an alias for running +$ strapi generate new <appName>, and like any Strapi generator, the actual generator module +which gets run can be overridden.

Start the server

$ cd <appName>
+$ strapi start
+

Run the Strapi application in the current directory. +If ./node_modules/strapi exists, it will be used instead of the globally installed module Strapi.

Access the console

$ cd <appName>
+$ strapi console
+

Start your Strapi application, and enter the Node.js REPL. This means you can access +and use all of your models, services, configuration, and much more. Useful for trying out +Waterline queries, quickly managing your data, and checking out your project's runtime configuration.

Note that this command still starts the server, so your routes will be accessible via HTTP and sockets.

Strapi exposes the same global variables in the console as it does in your application code. +This is particularly useful in the REPL. By default, you have access to the Strapi application +instance, your models as well as Lodash (_) and Socket.IO (io).

Generate an API

$ strapi generate api <apiName>
+

Generate a complete API with controllers, models and routes.

$ strapi version
+

Output the current globally installed Strapi version.

$ strapi link
+

Link an existing application without an appId to the Strapi Studio.

This command can be useful if you were not logged into the Studio or if you +didn't have Internet access when you generated your application.

Logout

$ strapi logout
+

If you don't want to be logged in to the Strapi Studio anymore.

+ + + diff --git a/docs/.vuepress/dist/1.x.x/configuration.html b/docs/.vuepress/dist/1.x.x/configuration.html new file mode 100644 index 0000000000..9b4b6f874d --- /dev/null +++ b/docs/.vuepress/dist/1.x.x/configuration.html @@ -0,0 +1,313 @@ + + + + + + Configuration | Strapi Docs + + + + + + + +

Configuration

While Strapi dutifully adheres to the philosophy of convention-over-configuration, +it is important to understand how to customize those handy defaults from time to time. +For almost every convention in Strapi, there is an accompanying set of configuration +options that allow you to adjust or override things to fit your needs.

Settings specified at the root directory will be available in all environments.

If you'd like to have some settings take effect only in certain environments, +you can use the special environment-specific files and folders. +Any files saved under the ./config/environments/development directory will be +loaded only when Strapi is started in the development environment.

The built-in meaning of the settings in strapi.config are, in some cases, +only interpreted by Strapi during the start process. In other words, changing some +options at runtime will have no effect. To change the port your application is running on, +for instance, you can't just change strapi.config.port. You'll need to change or +override the setting in a configuration file or as a command-line argument, +then restart the server.

Application package

strapi.config merge user config from the ./config directory with the package.json +of the application.

The most important things in your package.json are the name and version fields. +Those are actually required, and your package won't install without them. +The name and version together form an identifier that is assumed to be completely unique.

Application name

The name of the application.

  • Key: name
  • Environment: all
  • Location: ./package.json
  • Type: string

Notes:

  • The name must be shorter than 214 characters. This includes the scope for scoped packages.
  • The name can't start with a dot or an underscore.
  • New packages must not have uppercase letters in the name.
  • The name ends up being part of a URL, an argument on the command line, and a folder name. +Therefore, the name can't contain any non-URL-safe characters.
  • Don't use the same name as a core Node.js module.
  • Don't put "js" or "node" in the name. It's assumed that it's JavaScript, since you're writing +a package.json file.
  • The name will probably be passed as an argument to require(), so it should be something short, +but also reasonably descriptive. You may want to check the npm registry to see if there's something +by that name already, before you get too attached to it. https://www.npmjs.com/
  • A name can be optionally prefixed by a scope, e.g. @myorg/mypackage.

Application version

Changes to the package should come along with changes to the version.

  • Key: version
  • Environment: all
  • Location: ./package.json
  • Type: string

Notes:

  • Version must be parseable by node-semver, which is bundled with npm as a dependency.

Application description

The description of your application helps people discover your package, as it's listed in npm search.

  • Key: description
  • Environment: all
  • Location: ./package.json
  • Type: string

Global settings

Public assets

Public assets refer to static files on your server that you want to make accessible to the +outside world. In Strapi, these files are placed in the ./public directory.

Strapi is compatible with any front-end strategy; whether it's Angular, Backbone, Ember, +iOS, Android, Windows Phone, or something else that hasn't been invented yet.

  • Key: static

  • Environment: all

  • Location: ./config/general.json

  • Type: boolean

  • Defaults to:

    {
    +  "static": true
    +}
    +

Notes:

  • Set to false to disable the public assets.

Views

  • Key: views

  • Environment: all

  • Location: ./config/general.json

  • Type: object

  • Defaults to:

    {
    +  "views": false
    +}
    +

For more information, please refer to the views documentation.

Options:

  • map: Object mapping extension names to engine names.
  • default: Default extension name to use when missing.
  • cache: When true compiled template functions will be cached in-memory, +this prevents subsequent disk I/O, as well as the additional compilation step +that most template engines peform. By default this is enabled when the NODE_ENV +environment variable is anything but development, such as stage or production.

Notes:

  • Set to false to disable views support.

WebSockets

Socket.IO enables real-time bidirectional event-based communication. +It works on every platform, browser or device, focusing equally on reliability +and speed.

By default Strapi binds Socket.IO and your common websockets features are +available using the io object.

  • Key: websockets

  • Environment: all

  • Location: ./config/general.json

  • Type: boolean

  • Defaults to:

    {
    +  "websockets": true
    +}
    +

Notes:

  • Set to false to disable websockets with Socket.IO.

Favicon

Set a favicon for your web application.

  • Key: favicon

  • Environment: all

  • Location: ./config/general.json

  • Type: object

  • Defaults to:

    {
    +  "favicon": {
    +    "path": "favicon.ico",
    +    "maxAge": 86400000
    +  }
    +}
    +

Options:

  • path (string): Relative path for the favicon to use from the application root directory.
  • maxAge (integer): Cache-control max-age directive. Set to pass the cache-control in ms.

Notes:

  • Set to false to disable the favicon feature.

API prefix

Prefix your API aiming to not have any conflicts with your front-end if you have one of if need to +for some other reasons.

  • Key: prefix

  • Environment: all

  • Location: ./config/general.json

  • Type: string

  • Defaults to:

    {
    +  "prefix": ""
    +}
    +

Notes:

  • Let an empty string if you don't want to prefix your API.
  • The prefix must starts with a /, e.g. /api.

Blueprints

The blueprints are a set of useful actions containing all the logic you need to +create a clean RESTful API. The generated controllers and routes are automatically +plugged to the blueprint actions. Thanks to that, as soon as you generate a new API +from the CLI, you can enjoy a RESTful API without writing any line of code.

  • Key: blueprints

  • Environment: all

  • Location: ./config/general.json

  • Type: object

  • Defaults to:

    {
    +  "blueprints": {
    +    "defaultLimit": 30,
    +    "populate": true
    +  }
    +}
    +

Options:

  • defaultLimit (integer): The maximum number of records to send back.
  • populate (boolean): If enabled, the population process fills out attributes +in the returned list of records according to the model's defined associations.

i18n

If your application will touch people or systems from all over the world, internationalization +and localization (i18n) may be an important part of your international strategy.

Strapi provides built-in support for detecting user language preferences and translating +static words/sentences.

  • Key: i18n

  • Environment: all

  • Location: ./config/i18n.json

  • Type: object

  • Defaults to:

    {
    +  "i18n": {
    +    "defaultLocale": "en",
    +    "modes": [
    +      "query",
    +      "subdomain",
    +      "cookie",
    +      "header",
    +      "url",
    +      "tld"
    +    ],
    +    "cookieName": "locale"
    +  }
    +}
    +

Options:

  • defaultLocale (string): The default locale to use.
  • modes (array): Accept locale variable from: +
    • query: detect query string with /?locale=fr
    • subdomain: detect subdomain with fr.myapp.com
    • cookie: detect cookie with Accept-Language: en,fr;q=0.5
    • header: detect header with Cookie: locale=fr
    • url: detect url with /fr
    • tld: detect TLD with myapp.fr
  • cookieName (string): i18n cookies property, tries to find a cookie named locale here. +Allows the locale to be set from query string or from cookie.

Notes:

  • Set to false to disable the locales feature.
  • Locales may be configured in the ./config/locales directory.

Global variables

For convenience, Strapi exposes a handful of global variables. By default, your application's +models, the global strapi object and the Lodash node module are all available on the global +scope; meaning you can refer to them by name anywhere in your backend code +(as long as Strapi has been loaded).

Nothing in Strapi core relies on these global variables. Each and every global exposed in +Strapi may be disabled in strapi.config.globals.

Bear in mind that none of the globals, including strapi, are accessible until after +Strapi has loaded. In other words, you won't be able to use strapi.models.car or Car +outside of a function (since Strapi will not have finished loading yet).

  • Key: globals

  • Environment: all

  • Location: ./config/globals.json

  • Type: object

  • Defaults to:

    {
    +  "globals": {
    +    "models": true,
    +    "strapi": true,
    +    "async": true,
    +    "_": true,
    +    "graphql": true
    +  }
    +}
    +

Options:

  • models (boolean): Your application's models are exposed as global variables using their globalId. +For instance, the model defined in the file ./api/car/models/Car.js will be globally accessible as Car.
  • strapi (boolean): In most cases, you will want to keep the strapi object globally accessible, +it makes your application code much cleaner.
  • async (boolean): Exposes an instance of Async.
  • _ (boolean): Exposes an instance of Lodash.
  • graphql (boolean): Exposes an instance of GraphQL.

Notes:

  • Set to false to disable global variables.

Bootstrap function

The bootstrap function is a server-side JavaScript file that is executed by Strapi +just before your application is started.

This gives you an opportunity to set up your data model, run jobs, or perform some special logic.

  • Key: bootstrap
  • Environment: all
  • Location: ./config/functions/bootstrap.js
  • Type: function

Notes:

  • It's very important to trigger the callback method when you are finished with the bootstrap. +Otherwise your server will never start, since it's waiting on the bootstrap.

CRON tasks

CRON tasks allow you to schedule jobs (arbitrary functions) for execution at specific dates, +with optional recurrence rules. It only uses a single timer at any given time +(rather than reevaluating upcoming jobs every second/minute).

  • Key: cron

  • Environment: all

  • Location: ./config/functions/cron.js

  • Type: object

      module.exports.cron = {
    +
    +    /**
    +     * Every day at midnight.
    +     */
    +
    +    '0 0 * * *': function () {
    +      // Your code here
    +    }
    +  };
    +}
    +

Notes:

  • The cron format consists of: +
    1. second (0 - 59, optional)
    2. minute (0 - 59)
    3. hour (0 - 23)
    4. day of month (1 - 31)
    5. month (1 - 12)
    6. day of week (0 - 7)

Studio connection

The Strapi Studio is a toolbox for developers that allows you to build and manage +your APIs in realtime without writing any line of code. When your application is +linked to the Studio, you are able to generate APIs from the Studio and see +the changes in realtime in your local application.

  • Key: studio

  • Environment: all

  • Location: ./config/studio.json

  • Type: object

  • Defaults to:

    {
    +  "studio": {
    +    "enabled": true,
    +    "secretKey": "YOUR SECRET KEY HERE"
    +  }
    +}
    +

Options:

  • enabled (boolean): Do you want your application linked to the Strapi Studio?
  • secretKey (string): The secret key of your application to link your +current application with the Strapi Studio.

General environment settings

Host

The host name the connection was configured to.

  • Key: host

  • Environment: development

  • Location: ./config/environments/development/server.json

  • Type: string

  • Defaults to:

    {
    +  "host": "localhost"
    +}
    +

Notes:

  • You don't need to specify a host in a production environment.
  • Defaults to the operating system hostname when available, otherwise localhost.

Port

The actual port assigned after the server has been started.

  • Key: port

  • Environment: development

  • Location: ./config/environments/development/server.json

  • Type: integer

  • Defaults to:

    {
    +  "port": 1337
    +}
    +

Notes:

  • You don't need to specify a host in a production environment.
  • When no port is configured or set, Strapi will look for the process.env.PORT +value. If no port specified, the port will be 1337.

Front-end URL

This is the URL of your front-end application.

This config key is useful when you don't use the ./public directory for your +assets or when you run your automation tools such as Gulp or Grunt on an other port.

This address can be resourceful when you need to redirect the user after he +logged in with an authentication provider.

  • Key: frontendUrl

  • Environment: development

  • Location: ./config/environments/development/server.json

  • Type: string

  • Defaults to:

    {
    +  "frontendUrl": ""
    +}
    +

Reload

Enable or disable auto-reload when your application crashes.

  • Key: reload

  • Environment: development

  • Location: ./config/environments/development/server.json

  • Type: object

  • Defaults to:

    {
    +  "reload": {
    +    "timeout": 1000,
    +    "workers": 1
    +  }
    +}
    +

Options:

  • timeout (integer): Set the timeout before killing a worker in ms.
  • workers (integer): Set the number of workers to spawn. +If the workers key is not defined, Strapi will use every free CPU +(recommended in production environement).

Notes:

  • Set to false to disable the auto-reload and clustering features.

Request

Logger

Enable or disable request logs.

  • Key: logger

  • Environment: development

  • Location: ./config/environments/development/server.json

  • Type: boolean

  • Defaults to:

    {
    +  "logger": true
    +}
    +

Notes:

  • Set to false to disable the logger.

Body parser

Parse request bodies.

  • Key: parser

  • Environment: development

  • Location: ./config/environments/development/server.json

  • Type: object

  • Defaults to:

    {
    +  "parser": {
    +    "encode": "utf-8",
    +    "formLimit": "56kb",
    +    "jsonLimit": "1mb",
    +    "strict": true,
    +    "extendTypes": {
    +      "json": [
    +        "application/x-javascript"
    +      ]
    +    }
    +  }
    +}
    +

Options:

  • encode (string): Requested encoding.
  • formLimit (string): Limit of the urlencoded body. +If the body ends up being larger than this limit, a 413 error code is returned.
  • jsonLimit (string): Limit of the JSON body.
  • strict (boolean): When set to true, JSON parser will only accept arrays and objects.
  • extendTypes (array): Support extend types.

Notes:

  • Set to false to disable the body parser.

Response

Gzip

Enable or disable Gzip compression.

  • Key: gzip

  • Environment: development

  • Location: ./config/environments/development/server.json

  • Type: boolean

  • Defaults to:

    {
    +  "gzip": true
    +}
    +

Notes:

  • Set to false to disable Gzip.

Response time header

The X-Response-Time header records the response time for requests in HTTP servers. +The response time is defined here as the elapsed time from when a request enters the application +to when the headers are written out to the client.

  • Key: responseTime

  • Environment: development

  • Location: ./config/environments/development/reponse.json

  • Type: boolean

  • Defaults to:

    {
    +  "responseTime": true
    +}
    +

Notes:

  • Set to false to disable the response time header.

Databases

Strapi comes installed with a powerful ORM/ODM called Waterline, a datastore-agnostic tool that +dramatically simplifies interaction with one or more databases.

It provides an abstraction layer on top of the underlying database, allowing you to easily query +and manipulate your data without writing vendor-specific integration code.

  • Key: orm

  • Environment: development

  • Location: ./config/environments/development/databases.json

  • Type: object

  • Defaults to:

    {
    +  "orm": {
    +    "adapters": {
    +      "disk": "sails-disk"
    +    },
    +    "defaultConnection": "default",
    +    "connections": {
    +      "default": {
    +        "adapter": "disk",
    +        "filePath": ".tmp/",
    +        "fileName": "default.db",
    +        "migrate": "alter"
    +      },
    +      "permanent": {
    +        "adapter": "disk",
    +        "filePath": "./data/",
    +        "fileName": "permanent.db",
    +        "migrate": "alter"
    +      }
    +    }
    +  }
    +}
    +

Options:

  • adapters (object): Association between a connection and the adapter to use.
  • defaultConnection (string): The default connection will be used if the +connection key of a model is empty or missing.
  • connections (object): Options of the connection. +Every adapter has its own options such as host, port, database, etc. +The migrate option controls how Strapi will attempt to automatically +rebuild the tables/collections/sets/etc. in your schema. +
    • safe: never auto-migrate database(s).
    • alter: auto-migrate database(s), but attempt to keep existing data.
    • drop: drop all data and rebuild models every time your application starts.

Notes:

  • When your Strapi application starts, the Waterline ORM validates all of the data in your database. +This migrate flag tells waterline what to do with data when the data is corrupt. +You can set this flag to safe which will ignore the corrupt data and continue to start.
  • By using drop, or even alter, you risk losing your data. Be careful. +Never use drop or alter with a production dataset. +Additionally, on large databases alter may take a long time to complete at startup. +This may cause the start process to appear to hang.

Security

Sessions

Since HTTP driven applications are stateless, sessions provide a way to store information +about the user across requests.

Strapi provides "guest" sessions, meaning any visitor will have a session, +authenticated or not. If a session is new a Set-Cookie will be produced regardless +of populating the session.

Strapi only supports cookie sessions, for now.

  • Key: session

  • Environment: development

  • Location: ./config/environments/development/security.json

  • Type: object

  • Defaults to:

    {
    +  "session": {
    +    "key": "myApp",
    +    "secretKeys": [
    +      "mySecretKey1"
    +    ],
    +    "maxAge": 86400000
    +  }
    +}
    +

Options:

  • key (string): The cookie name.
  • secretKeys (array): Keys used to encrypt the session cookie.
  • maxAge (integer): Sets the time in seconds for when a cookie will be deleted.

Notes:

  • Set to false to disable sessions.

Cross Site Request Forgery (CSRF) headers

CSRF is a type of attack which forces an end user to execute unwanted actions on a web +application backend with which he/she is currently authenticated.

Strapi bundles optional CSRF protection out of the box.

  • Key: csrf

  • Environment: development

  • Location: ./config/environments/development/security.json

  • Type: object

  • Defaults to:

    {
    +  "csrf": false
    +}
    +

Options:

  • key (string): The name of the CSRF token added to the model. +Defaults to _csrf.
  • secret (string): The key to place on the session object which maps to the server side token. +Defaults to _csrfSecret.

Notes:

  • Set to false to disable CSRF headers.
  • If you have existing code that communicates with your Strapi backend via POST, PUT, or DELETE +requests, you'll need to acquire a CSRF token and include it as a parameter or header in those requests.

Content Security Policy (CSP) headers

Content Security Policy (CSP) is a W3C specification for instructing the client browser as to +which location and/or which type of resources are allowed to be loaded.

This spec uses "directives" to define a loading behaviors for target resource types. +Directives can be specified using HTTP response headers or or HTML Meta tags.

  • Key: csp

  • Environment: development

  • Location: ./config/environments/development/security.json

  • Type: object

  • Defaults to:

    {
    +  "csp": false
    +}
    +

Options:

  • policy (object): Object definition of policy.
  • reportOnly (boolean): Enable report only mode.
  • reportUri (string): URI where to send the report data.

Notes:

  • Set to false to disable CSP headers.

X-Frame-Options headers

Enables X-Frame-Options headers to help prevent Clickjacking.

  • Key: xframe

  • Environment: development

  • Location: ./config/environments/development/security.json

  • Type: string

  • Defaults to:

    {
    +  "xframe": "SAMEORIGIN"
    +}
    +

Notes:

  • The string is the value for the header: DENY, SAMEORIGIN or ALLOW-FROM.
  • Set to false to disable X-Frame-Options headers.

Platform for Privacy Preferences

Platform for Privacy Preferences (P3P) is a browser/web standard designed to facilitate +better consumer web privacy control. Currently out of all the major browsers, it is only +supported by Internet Explorer. It comes into play most often when dealing with legacy applications.

  • Key: p3p

  • Environment: development

  • Location: ./config/environments/development/security.json

  • Type: string

  • Defaults to:

    {
    +  "p3p": false
    +}
    +

Notes:

  • The string is the value of the compact privacy policy.
  • Set to false to disable P3P.

HTTP Strict Transport Security

Enables HTTP Strict Transport Security for the host domain.

The preload flag is required for HSTS domain submissions to Chrome's HSTS preload list.

  • Key: hsts

  • Environment: development

  • Location: ./config/environments/development/security.json

  • Type: object

  • Defaults to:

    {
    +  "hsts": {
    +    "maxAge": 31536000,
    +    "includeSubDomains": true
    +  }
    +}
    +

Options:

  • maxAge (integer): Number of seconds HSTS is in effect.
  • includeSubDomains (boolean): Applies HSTS to all subdomains of the host.

Notes:

  • Set to false to disable HSTS.

X-XSS-Protection headers

Cross-site scripting (XSS) is a type of attack in which a malicious agent manages to inject +client-side JavaScript into your website, so that it runs in the trusted environment of your users' browsers.

Enables X-XSS-Protection headers to help prevent cross site scripting (XSS) attacks in older IE browsers (IE8).

  • Key: xssProtection

  • Environment: development

  • Location: ./config/environments/development/security.json

  • Type: object

  • Defaults to:

    {
    +  "xssProtection": false
    +}
    +

Options:

  • enabled (boolean): If the header is enabled or not.
  • mode (string): Mode to set on the header.

Notes:

  • Set to false to disable HTTP Strict Transport Security.

Cross-Origin Resource Sharing (CORS)

Cross-origin resource sharing (CORS) is a mechanism that allows restricted resources +(e.g. fonts, JavaScript, etc.) on a web page to be requested from another domain outside +the domain from which the resource originated.

  • Key: cors

  • Environment: development

  • Location: ./config/environments/development/security.json

  • Type: object

  • Defaults to:

    {
    +  "cors": {
    +    "origin": true,
    +    "expose": [
    +      "WWW-Authenticate",
    +      "Server-Authorization"
    +    ],
    +    "maxAge": 31536000,
    +    "credentials": true,
    +    "methods": [
    +      "GET",
    +      "POST",
    +      "PUT",
    +      "DELETE",
    +      "OPTIONS",
    +      "HEAD"
    +    ],
    +    "headers": [
    +      "Content-Type",
    +      "Authorization"
    +    ]
    +  }
    +}
    +

Options:

  • origin (string|boolean): Configures the Access-Control-Allow-Origin CORS header. +Expects a string (ex: http://example.com) or a boolean. +Set to true to reflect the request origin, as defined by req.header('Origin'). +Set to false to disable CORS.
  • expose (array): Configures the Access-Control-Expose-Headers CORS header. +Set this to pass the header, otherwise it is omitted.
  • maxAge (integer): Configures the Access-Control-Max-Age CORS header. +Set to an integer to pass the header, otherwise it is omitted.
  • credentials (boolean): Configures the Access-Control-Allow-Credentials CORS header. +Set to true to pass the header, otherwise it is omitted.
  • methods (array): Configures the Access-Control-Allow-Methods CORS header.
  • headers (array): Configures the Access-Control-Allow-Headers CORS header. +If not specified, defaults to reflecting the headers specified in the request's +Access-Control-Request-Headers header.

Notes:

  • Set to false to disable CORS.

Secure Sockets Layer (SSL)

Secure Sockets Layer (SSL), is a cryptographic protocol designed to provide communications security +over a computer network.

This configuration enforce SSL for your application.

  • Key: ssl

  • Environment: development

  • Location: ./config/environments/development/security.json

  • Type: object

  • Defaults to:

    {
    +  "ssl": false
    +}
    +

Options:

  • disabled (boolean): If true, this middleware will allow all requests through.
  • trustProxy (boolean): If true, trust the X-Forwarded-Proto header.

Notes:

  • Set to false to disable SSL.

IP filter

The IP filter configuration allows you to whitelist or blacklist specific or range IP addresses.

The blacklisted IP addresses won't have access to your web application at all.

  • Key: ip

  • Environment: development

  • Location: ./config/environments/development/security.json

  • Type: object

  • Defaults to:

    {
    +  "ip": {
    +    "whiteList": [],
    +    "blackList": []
    +  }
    +}
    +

Options:

  • whiteList (array): IP addresses allowed.
  • blackList (array): IP addresses forbidden.

Notes:

  • Set to false to disable IP filter.

Proxy

A proxy server is a server that acts as an intermediary for requests from clients +seeking resources from other servers.

Request your server, fetch the proxy URL you typed and return.

  • Key: proxy

  • Environment: development

  • Location: ./config/environments/development/security.json

  • Type: string

  • Defaults to:

    {
    +  "proxy": false
    +}
    +

Notes:

  • The string will fetch the host and return.
  • Set to false to disable the proxy security.
+ + + diff --git a/docs/.vuepress/dist/1.x.x/context.html b/docs/.vuepress/dist/1.x.x/context.html new file mode 100644 index 0000000000..47278b7de2 --- /dev/null +++ b/docs/.vuepress/dist/1.x.x/context.html @@ -0,0 +1,67 @@ + + + + + + Context | Strapi Docs + + + + + + + +

Context

A Strapi Context encapsulates Node's request and response objects +into a single object which provides many helpful methods for writing +web applications and APIs.

These operations are used so frequently in HTTP server development +that they are added at this level instead of a higher level framework, +which would force middleware to re-implement this common functionality.

A Context is created per request, and is referenced in middleware +as the receiver, or the this identifier, as shown in the following +snippet:

strapi.app.use(function * () {
+  this; // is the Context
+  this.request; // is a Strapi Request
+  this.response; // is a Strapi Response
+});
+

Many of the context's accessors and methods simply delegate to their ctx.request or ctx.response +equivalents for convenience, and are otherwise identical. For example ctx.type and ctx.length +delegate to the response object, and ctx.path and ctx.method delegate to the request.

API

Context specific methods and accessors.

ctx.req

Node's request object.

ctx.res

Node's response object.

Bypassing Strapi's response handling is not supported. Avoid using the following Node properties:

  • res.statusCode
  • res.writeHead()
  • res.write()
  • res.end()

ctx.request

A Strapi Request object.

ctx.response

A Strapi Response object.

ctx.state

The recommended namespace for passing information through middleware and to your front-end views.

this.state.user = yield User.find(id);
+

ctx.app

Application instance reference.

ctx.cookies.get(name, [options])

Get cookie name with options:

  • signed the cookie requested should be signed

Strapi uses the cookies module where options are simply passed.

ctx.cookies.set(name, value, [options])

Set cookie name to value with options:

  • signed sign the cookie value
  • expires a Date for cookie expiration
  • path cookie path, /' by default
  • domain cookie domain
  • secure secure cookie
  • httpOnly server-accessible cookie, true by default

Strapi uses the cookies module where options are simply passed.

ctx.throw([msg], [status], [properties])

Helper method to throw an error with a .status property +defaulting to 500 that will allow Strapi to respond appropriately. +The following combinations are allowed:

this.throw(403);
+this.throw('name required', 400);
+this.throw(400, 'name required');
+this.throw('something exploded');
+

For example this.throw('name required', 400) is equivalent to:

const err = new Error('name required');
+err.status = 400;
+throw err;
+

Note that these are user-level errors and are flagged with +err.expose meaning the messages are appropriate for +client responses, which is typically not the case for +error messages since you do not want to leak failure +details.

You may optionally pass a properties object which is merged into the error as-is, +useful for decorating machine-friendly errors which are reported to the requester upstream.

this.throw(401, 'access_denied', { user: user });
+this.throw('access_denied', { user: user });
+

Strapi uses http-errors to create errors.

ctx.assert(value, [msg], [status], [properties])

Helper method to throw an error similar to .throw() +when !value. Similar to Node's assert() +method.

this.assert(this.state.user, 401, 'User not found. Please login!');
+

Strapi uses http-assert for assertions.

ctx.respond

To bypass Strapi's built-in response handling, you may explicitly set this.respond = false;. +Use this if you want to write to the raw res object instead of letting Strapi handle +the response for you.

Note that using this is not supported by Strapi. This may break intended functionality +of Strapi middleware and Strapi itself. Using this property is considered a hack and is +only a convenience to those wishing to use traditional fn(req, res) functions and middleware +within Strapi.

Request aliases

The following accessors and alias Request equivalents:

  • ctx.header
  • ctx.headers
  • ctx.method
  • ctx.method=
  • ctx.url
  • ctx.url=
  • ctx.originalUrl
  • ctx.origin
  • ctx.href
  • ctx.path
  • ctx.path=
  • ctx.query
  • ctx.query=
  • ctx.querystring
  • ctx.querystring=
  • ctx.host
  • ctx.hostname
  • ctx.fresh
  • ctx.stale
  • ctx.socket
  • ctx.protocol
  • ctx.secure
  • ctx.ip
  • ctx.ips
  • ctx.subdomains
  • ctx.is()
  • ctx.accepts()
  • ctx.acceptsEncodings()
  • ctx.acceptsCharsets()
  • ctx.acceptsLanguages()
  • ctx.get()

Response aliases

The following accessors and alias Response equivalents:

  • ctx.body
  • ctx.body=
  • ctx.status
  • ctx.status=
  • ctx.message
  • ctx.message=
  • ctx.length=
  • ctx.length
  • ctx.type=
  • ctx.type
  • ctx.headerSent
  • ctx.redirect()
  • ctx.attachment()
  • ctx.set()
  • ctx.append()
  • ctx.remove()
  • ctx.lastModified=
  • ctx.etag=
+ + + diff --git a/docs/.vuepress/dist/1.x.x/customization.html b/docs/.vuepress/dist/1.x.x/customization.html new file mode 100644 index 0000000000..3af3965093 --- /dev/null +++ b/docs/.vuepress/dist/1.x.x/customization.html @@ -0,0 +1,53 @@ + + + + + + Customization | Strapi Docs + + + + + + + +

Customization

In keeping with the Node.js philosophy, Strapi aims to keep its core as small +as possible, delegating all but the most critical functions to separate modules.

Generators are designed to make it easier to customize the $ strapi new +and $ strapi generate command-line tools, and provide better support +for different user features, custom admin panel, configuration options, +view engines, etc.

Custom generators are linked to your machine aiming to have your personal +configuration and features at any time, for every application.

You can edit your custom generators inside the .strapirc file at $HOME.

First, make sure you this file exists:

$ strapi config
+

This file should look like this:

{
+  "generators": {
+
+  }
+}
+

At this time, you don't have any custom generators on your machine.

In your .strapirc file, a custom generator is an object with three keys:

  • repository: the Git repository to clone.
  • remote: the current remote to pull updates from.
  • branch: the branch you want to pull updates from.

For example, to add a custom blog generator, follow this:

{
+  "generators": {
+    "blog": {
+      "repository": "git@github.com:username/strapi-generate-blog.git",
+      "remote": "origin",
+      "branch": "master"
+    }
+  }
+}
+

Once you have updated your .strapirc file, you need to clone and/or update your +generators. To do so, just execute:

$ strapi update
+

This command will clone every new repository written in your configuration file +and pull the latest updates for the other ones.

Then, you can generate your blog files inside your project with:

$ strapi generate blog
+
+ + + diff --git a/docs/.vuepress/dist/1.x.x/email.html b/docs/.vuepress/dist/1.x.x/email.html new file mode 100644 index 0000000000..8123b992e3 --- /dev/null +++ b/docs/.vuepress/dist/1.x.x/email.html @@ -0,0 +1,85 @@ + + + + + + Email | Strapi Docs + + + + + + + +

Email

Strapi contains a set of tools to send emails. This part is based on the +famous email node module: Nodemailer.

Email config

To change the STMP config, edit the ./api/email/config/environments/development/smtp.json file.

{
+  "smtp": {
+    "from": "test<no-reply@test.com>",
+    "service": {
+      "name": "",
+      "user": "",
+      "pass": ""
+    }
+  }
+}
+

Options:

  • from (string): The email address used to send emails.
  • service (object): The SMTP service info: +
    • name (string): Name of the service used to send emails (eg. Gmail).
    • user (string): Username of the service used (eg. john@gmail.com).
    • pass (string): Password of the username used (eg. 12356).

Email service

The email service allows you to easily send emails from anywhere in your application.

Usage as a promise (yieldable) :

strapi.api.email.services.email.send({
+    from: 'contact@company.com', // Sender (defaults to `strapi.config.smtp.from`).
+    to: ['john@doe.com'], // Recipients list.
+    html: '<p>Hello John</p>', // HTML version of the email content.
+    text: 'Hello John' // Text version of the email content.
+  })
+  .then(function (data) {
+    console.log(data);
+  })
+  .catch(function (err) {
+    console.log(err);
+  });
+

Usage with a callback :

strapi.api.email.services.email.send({
+    from: 'contact@company.com', // Sender (defaults to `strapi.config.smtp.from`).
+    to: ['john@doe.com'], // Recipients list.
+    html: '<p>Hello John</p>', // HTML version of the email content.
+    text: 'Hello John' // Text version of the email content.
+  }, function (err, data) {
+    if (err) {
+      console.log(err);
+    } else {
+      console.log(data);
+    }
+  });
+

Email API

The email API is a simple API which can be used from your client (front-end, mobile...) application.

Route used to send emails:

POST /email
+

Request payload:

{
+  from: 'contact@company.com', // Optional : sender (defaults to `strapi.config.smtp.from`).
+  to: ['john@doe.com'], // Recipients list.
+  html: '<p>Hello John</p>', // HTML version of the email content.
+  text: 'Hello John' // Text version of the email content.
+}
+

Response payload:

{
+  "sent": true,
+  "from": "contact@company.com",
+  "to": "john@doe.com",
+  "html": "<p>Hello John</p>",
+  "text": "Hello John",
+  "template": "default",
+  "lang": "en",
+  "createdAt": "2015-10-21T09:10:36.486Z",
+  "updatedAt": "2015-10-21T09:10:36.871Z",
+  "id": 2
+}
+

Email model

Each sent email is registered in the database. So you can retrieve them whenever +you want. However, you can disable this option by overriding the email service logic.

+ + + diff --git a/docs/.vuepress/dist/1.x.x/graphql.html b/docs/.vuepress/dist/1.x.x/graphql.html new file mode 100644 index 0000000000..f20993127e --- /dev/null +++ b/docs/.vuepress/dist/1.x.x/graphql.html @@ -0,0 +1,79 @@ + + + + + + GraphQL | Strapi Docs + + + + + + + +

GraphQL

GraphQL is a data querying language that allows you to execute complex nested +requests between your clients and server applications.

Configuration

By default, GraphQL is enabled and the HTTP endpoint is /graphql. +You can override this settings in the ./config/general.json file.

{
+  "graphql": {
+    "enabled": true,
+    "route": "/graphql"
+  }
+}
+

Options:

  • enabled (boolean): Enabled or disabled GraphQL.
  • route (string): Change GraphQL endpoint.

Note: If GraphQL is disabled, the GraphQL global variable is not exposed.

Execute simple query

Programmatically

Strapi takes over GraphQL natively. We added a function called query to execute +your query without given as a parameters the GraphQL schemas each time.

An example of how to use query function:

// Build your query
+const query = '{ users{firstName lastName posts{title}} }';
+
+// Execute the query
+graphql.query(query)
+  .then(function (result) {
+    console.log(result);
+  })
+  .catch(function (error) {
+    console.log(error);
+  });
+

And the JSON result:

{
+  "users": [{
+    "firstname": "John",
+    "lastname": "Doe",
+    "posts":[{
+      "title": "First title..."
+    }, {
+      "title": "Second title..."
+    }, {
+      "title": "Third title..."
+    }]    
+  }, {
+    "firstname": "Karl",
+    "lastname": "Doe",
+    "posts":[{
+      "title": "Fourth title..."
+    }]    
+  }]
+}
+

With a HTTP request

Strapi also provides a HTTP GraphQL server to execute request from your front-end application.

An example of how to execute the same request as above with a HTTP request with jQuery.

$.get('http://yourserver.com/graphql?query={ users{firstName lastName posts{title}} }', function (data) {
+  console.log(data);
+});
+

Execute complex queries

Query parameters

If you're using Waterline ORM installed by default with Strapi, you have access to +some Waterline query parameters in your GraphQL query such as sort, limit or skip. +Strapi also provides the start and end parameters to select records between two dates.

This example will return 10 users' records sorted alphabetically by firstName:

const query = '{ users(limit: 10, sort: "firstName ASC"){firstName lastName post{title}} }';
+

You can access to the 10 next users by adding the skip parameter:

const query = '{ users(limit: 10, sort: "firstName ASC", skip: 10){firstName lastName posts{title}} }';
+

And you also can select those records in a period between two dates with the start and end parameters:

const query = '{ users(limit: 10, sort: "firstName ASC", skip: 10, start: "09/21/2015", end:" 09/22/2015"){firstName lastName posts{title}} }';
+

Useful functions

Strapi comes with a powerful set of useful functions such as getLatest<Model>, getFirst<Model> and count<Model>.

Returns the 5 latest users from the September 27th 2015 at 8:59:59 PM:

const query = '{ getLatestUsers(count: 5, start: "9/27/2015 20:59:59"){firstName lastName posts{title}} }';
+

Returns the 5 first users:

const query = '{ getFirstUsers(count: 5){firstName lastName posts{title}} }';
+

Returns the number of subscribers the September 28th 2015:

const query = '{ countUsers(start: "9/28/2015", end: "9/28/2015") }';
+
+ + + diff --git a/docs/.vuepress/dist/1.x.x/index.html b/docs/.vuepress/dist/1.x.x/index.html new file mode 100644 index 0000000000..655df6585d --- /dev/null +++ b/docs/.vuepress/dist/1.x.x/index.html @@ -0,0 +1,45 @@ + + + + + + Strapi | Strapi Docs + + + + + + + +

Strapi

Build Status Slack Status

Strapi is an open-source Node.js rich framework for building applications and services.

Strapi enables developers to focus on writing reusable application logic instead of spending time +building infrastructure. It is designed for building practical, production-ready Node.js applications +in a matter of hours instead of weeks.

The framework sits on top of Koa. Its ensemble of small modules work +together to provide simplicity, maintainability, and structural conventions to Node.js applications.

DISCLAIMER: This version is maintained for criticals issues only.

Getting started in a minute

Installation

Install the latest stable release with the npm command-line tool:

$ npm install strapi -g
+

We advise you to use our Studio to build APIs. To do so, you need to create a Strapi account. +Go to the Strapi Studio to signup. +Studio is dedicated to developers to build applications without writing +any single line of code thanks to its powerful set of tools.

After creating an account on the Strapi Studio, you are able to link your machine to your +Strapi Studio account to get access to all features offered by the Strapi ecosystem. +Use your Strapi account credentials.

$ strapi login
+

Create your first project

You now are able to use the Strapi CLI. Simply create your first application and start the server:

$ strapi new <appName>
+

Note that you can generate a dry application using the dry option:

$ strapi new <appName> --dry
+

This will generate a Strapi application without:

  • the built-in user, email and upload APIs,
  • the grant hook,
  • the open-source admin panel,
  • the Waterline ORM (waterline and blueprints hooks disabled),
  • the Strapi Studio connection (studio hook disabled).

This feature allows you to only use Strapi for your HTTP server structure if you want to.

Start your application

$ cd <appName>
+$ strapi start
+

The default home page is accessible at http://localhost:1337/.

Create your first API

The Strapi ecosystem offers you two possibilities to create a complete RESTful API.

Via the CLI

$ strapi generate api <apiName>
+

For example, you can create a car API with a name (name), year (year) and +the license plate (license) with:

$ strapi generate api car name:string year:integer license:string
+

Via the Strapi Studio

The Strapi Studio allows you to easily build and manage your application environment +thanks to a powerful User Interface.

Log into the Strapi Studio with your user account (http://studio.strapi.io) +and follow the instructions to start the experience.

Strapi Studio Simply manage your APIs and relations thanks to the Strapi Studio.

Manage your data

Strapi comes with a simple but yet powerful dashboard.

Strapi Dashboard Create, read, update and delete your data.

Strapi Dashboard Manage user settings, login, registration, groups and permissions on the fly.

Resources

+ + + diff --git a/docs/.vuepress/dist/1.x.x/internationalization.html b/docs/.vuepress/dist/1.x.x/internationalization.html new file mode 100644 index 0000000000..19b317b9d7 --- /dev/null +++ b/docs/.vuepress/dist/1.x.x/internationalization.html @@ -0,0 +1,74 @@ + + + + + + Internationalization | Strapi Docs + + + + + + + +

Internationalization

Strapi provides built-in support for detecting user language preferences and translating +static words/sentences.

i18n settings

Settings for localization/internationalization may be configured in strapi.config.i18n. +The most common reason you'll need to modify these settings is to edit the list of your +application's supported locales and/or the location of your translation stringfiles.

Locales

Strapi reads JSON-formatted translation files from your project's ./config/locales +directory. Each file corresponds with a locale (usually a language) that your backend will support. +These files contain locale-specific strings (as JSON key-value pairs) that you can use in your +views, controllers, etc.

When your server is in production mode it will read these files only once and then cache +the result. It will not write any updated strings when in production mode.

Otherwise, the files will be read on every instantiation of the i18n object. +Additionally newly-detected strings will be automatically added, and written out, +to the locale JSON files.

These files contain locale-specific strings (as JSON key-value pairs) that you can use in your views, +controllers, etc. Here is an example locale file (./config/locales/fr.json):

{
+  "Hello!": "Bonjour!",
+  "Hello %s, how are you today?": "Bonjour %s, comment allez-vous aujourd'hui ?"
+}
+

Note that the keys in your stringfiles are case sensitive and require exact matches. +There are a few different schools of thought on the best approach here, and it really depends on +who/how often you'll be editing the stringfiles in the future. Especially if you'll be +editing the translations by hand, simpler, all-lowercase key names may be preferable for maintainability.

For example, here's another pass at ./config/locales/fr.json:

{
+  "hello": "Bonjour!",
+  "hello-how-are-you-today": "Bonjour %s, comment allez-vous aujourd'hui ?"
+}
+

And here's ./config/locales/en.json:

{
+  "hello": "Hello!",
+  "hello-how-are-you-today": "Hello %s, how are you today?"
+}
+

You can also nest locale strings. But a better approach would be to use . to represent nested strings. +For example, here's the list of labels for the index page of a user controller:

{
+  "user.index.label.id": "User ID",
+  "user.index.label.name": "User Name"
+}
+

Translate responses

Locales are accessible from everywhere in your application.

this.body = this.i18n.__('hello-how-are-you-today', 'John');
+// => "Hello John, how are you today?"
+

Different plural forms are supported as a response to count with this.i18n.__n(one, other, count).

Use this.i18n.__n() as you would use this.i18.__() directly:

this.body = this.i18n.__n('%s cat', '%s cats', 1);
+// => "1 cat"
+
+this.body = this.i18n.__n('%s cat', '%s cats', 3);
+// => "3 cats"
+

Or from locales:

{
+  "catEat": {
+    "one": "%d cat eats the %s",
+    "other": '%d cats eat the %s'
+  }
+}
+
this.body = this.i18n.__n('catEat', 10, 'mouse');
+// => "10 cats eat the mouse"
+
+ + + diff --git a/docs/.vuepress/dist/1.x.x/introduction.html b/docs/.vuepress/dist/1.x.x/introduction.html new file mode 100644 index 0000000000..2d27bab081 --- /dev/null +++ b/docs/.vuepress/dist/1.x.x/introduction.html @@ -0,0 +1,80 @@ + + + + + + Introduction | Strapi Docs + + + + + + + +

Introduction


Important Note: Strapi 1.x is on maintenance only. Development focuses on the upcoming Strapi 3.0.


Strapi is an open-source Node.js rich framework for building applications and services.

Strapi enables developers to focus on writing reusable application logic instead of spending time +building infrastructure. It is designed for building practical, production-ready Node.js applications +in a matter of hours instead of weeks.

The framework sits on top of Koa. Its ensemble of small modules work +together to provide simplicity, maintainability, and structural conventions to Node.js applications.

Getting Started

Installation

Install the latest stable release with the npm command-line tool:

$ npm install strapi -g
+

Create your first project

You now are able to use the Strapi CLI. Simply create your first application and start the server:

$ strapi new <appName>
+$ cd <appName>
+$ strapi start
+

The default home page is accessible at http://localhost:1337/.

Create your first API

$ strapi generate api <apiName>
+

For example, you can create a car API with a name (name), year (year) and +the license plate (license) with:

$ strapi generate api car name:string year:integer license:string
+

Alternatives

Dry Application

Note that you can generate a dry application using the dry option:

$ strapi new <appName> --dry
+

This will generate a Strapi application without:

  • the built-in user, email and upload APIs,
  • the grant hook,
  • the open-source admin panel,
  • the Waterline ORM (waterline and blueprints hooks disabled),
  • the Strapi Studio connection (studio hook disabled).

This feature allows you to only use Strapi for your HTTP server structure if you want to.

Create an API via the Strapi Studio

The Strapi Studio allows you to easily build and manage your application environment +thanks to a powerful User Interface.

Log into the Strapi Studio with your user account (http://studio.strapi.io) +and follow the instructions to start the experience.

We advise you to use our Studio to build APIs. To do so, you need to create a Strapi account. +Go to the Strapi Studio to signup. +Studio is dedicated to developers to build applications without writing +any single line of code thanks to its powerful set of tools.

After creating an account on the Strapi Studio, you are able to link your machine to your +Strapi Studio account to get access to all features offered by the Strapi ecosystem. +Use your Strapi account credentials.

$ strapi login
+

Key-features

100% JavaScript

Building on top of Strapi means your application is written entirely in JavaScript, +the language you and your team are already using in the browser.

Since you spend less time context-shifting, you're able to write code in a more consistent style, +which makes development more productive.

The entire Strapi framework is written in ES2015.

Getting started quickly

Strapi provides a robust layer for fundamental web applications to help you write your business +logic, without obscuring Node.js features that you know and love. Our goal is to make writing +business logic much easier than other frameworks.

Auto-generate REST APIs

Strapi comes with a generator that help jumpstart your application's backend without writing any code. Just run:

$ strapi generate api car
+

and you'll get an API that lets you read, paginate, sort, filter, create, destroy, update, +and associate cars.

Security

We take security very seriously. This is why Strapi comes with several security layers that just work +depending on your needs. Strapi provides configuration for CORS, CSRF, CSP, X-Frame-Options, XSS, HSTS, +HTTPS, SSL, proxy, IP filtering and ships reusable security policies.

No matter what you need to secure, Strapi is the right tool to make it right.

Datastore-agnostic

Strapi comes installed with a powerful ORM/ODM called Waterline, a datastore-agnostic tool that +dramatically simplifies interaction with one or more databases.

It provides an abstraction layer on top of the underlying database, allowing you to easily query +and manipulate your data without writing vendor-specific integration code.

Strapi offers a new take on the familiar relational model, aimed at making data modeling more practical. +You can do all the same things you might be used to (one-to-many, many-to-many), but you can also assign +multiple named associations per-model. Better yet, you can assign different models to different databases, +and your associations/joins will still work, even across NoSQL and relational boundries.

Strapi has no problem implicitly/automatically joining a SQL table with a NoSQL collection and vice versa.

Front-end agnostic

Strapi is compatible with any front-end strategy; whether it's Angular, Backbone, Ember, +iOS, Android, Windows Phone, or something else that hasn't been invented yet.

Plus it's easy to serve up the same API to be consumed by another web service or community of developers.

Convention over configuration

Convention over configuration is a consistent approach makes developing applications more +predictable and efficient for everybody involved.

If anyone on your team has worked with frameworks, Strapi will feel pretty familiar. +Not only that, but they can look at a Strapi project and know, generally, how to code up the basic +patterns they've implemented over and over again in the past; whether their background. +What about your second application, or your third? Each time you create a new Strapi application, +you start with a sane, familiar boilerplate that makes you more productive.

Configuration files give you extra opportunities for human error.

In many cases, you'll even be able to recycle some of your code.

Error Handling

By default outputs all errors to stderr unless NODE_ENV is test. +To perform custom error-handling logic such as centralized logging you can add an "error" event listener:

strapi.app.on('error', function (err) {
+  strapi.log.error('server error', err);
+});
+

If an error in the req/res cycle and it is not possible to respond to the client, +the Context instance is also passed:

strapi.app.on('error', function (err, ctx) {
+  strapi.log.error('server error', err, ctx);
+});
+

When an error occurs and it is still possible to respond to the client, +aka no data has been written to the socket, Strapi will respond appropriately with +a 500 "Internal Server Error". In either case an app-level "error" is emitted for logging purposes.

Different environments

Strapi has built in support for the idea of having a different set of settings for each environment. +Real applications have this too, but often the framework around them doesn't accommodate it and +you end up having to swap configuration files in and out to achieve the same effect.

Loose coupling

Strapi is flexible enough to allow you to explore and create when you have the time to but also +provides automation tools when you don't.

+ + + diff --git a/docs/.vuepress/dist/1.x.x/logging.html b/docs/.vuepress/dist/1.x.x/logging.html new file mode 100644 index 0000000000..85435164b9 --- /dev/null +++ b/docs/.vuepress/dist/1.x.x/logging.html @@ -0,0 +1,73 @@ + + + + + + Logging | Strapi Docs + + + + + + + +

Logging

Strapi comes with a simple and useful built-in logger. +Its usage is purposely very similar to console.log(), but with a handful of +extra features; namely support for multiple log levels with colorized, +prefixed console output.

The logger is accessible through the strapi object directly with strapi.log.

You can work with this logger in the same way that you work with the default logger:

strapi.log.info('Logs work!');
+

Logging with Metadata

In addition to logging string messages, the logger will also optionally log additional +JSON metadata objects. Adding metadata is simple:

strapi.log.info('Test log message', {
+  anything: 'This is metadata'
+});
+

String interpolation

The log method provides the same string interpolation methods like util.format.

This allows for the following log messages.

strapi.log.info('test message %s', 'my string');
+// => info: test message my string
+
strapi.log.info('test message %d', 123);
+// => info: test message 123
+
strapi.log.info('test message %j', {
+  number: 123
+}, {});
+// => info: test message {"number":123}
+// => meta = {}
+
strapi.log.info('test message %s, %s', 'first', 'second', {
+  number: 123
+});
+// => info: test message first, second
+// => meta = {number: 123}
+
strapi.log.info('test message', 'first', 'second', {
+  number: 123
+});
+// => info: test message first second
+// => meta = {number: 123}
+
strapi.log.info('test message %s, %s', 'first', 'second', {
+  number: 123
+}, function() {});
+// => info: test message first, second
+// => meta = {number: 123}
+// => callback = function() {}
+
strapi.log.info('test message', 'first', 'second', {
+  number: 123
+}, function() {});
+// => info: test message first second
+// => meta = {number: 123}
+// => callback = function() {}
+

Logging levels

Setting the level for your logging message can be accomplished by using +the level specified methods defined.

strapi.log.debug('This is a debug log');
+strapi.log.info('This is an info log');
+strapi.log.warn('This is a warning log');
+strapi.log.error('This is an error log ');
+
+ + + diff --git a/docs/.vuepress/dist/1.x.x/models.html b/docs/.vuepress/dist/1.x.x/models.html new file mode 100644 index 0000000000..f6819208ad --- /dev/null +++ b/docs/.vuepress/dist/1.x.x/models.html @@ -0,0 +1,416 @@ + + + + + + Models | Strapi Docs + + + + + + + +

Models

Strapi comes installed with a powerful Object-Relational-Mapper (ORM) called Waterline, +a datastore-agnostic tool that dramatically simplifies interaction with one or more databases.

Models represent a structure of data which requires persistent storage. The data may live in any data-store +but is interfaced in the same way. This allows your users to live in PostgreSQL and your user preferences +to live in MongoDB and you will interact with the data models in the exact same way.

If you're using MySQL, a model might correspond to a table. If you're using MongoDB, it might correspond +to a collection. In either case, the goal is to provide a simple, modular way of managing data without +relying on any one type of database.

Models are defined in the ./api/<apiName>/models directory.

Model settings

The following properties can be specified at the top level of your model definition to override +the defaults for that particular model.

For example, this a basic model Pet:

{
+  "identity": "pet",
+  "connection": "mongoDBServer",
+  "schema": true,
+  "attributes": {
+    "name": {
+      "type": "string",
+      "required": true
+    },
+    "gender": {
+      "type": "string",
+      "enum": ["male", "female"]
+    },
+    "age": {
+      "type": "int",
+      "max": 100
+    },
+    "birthDate": {
+      "type": "date"
+    },
+    "breed": {
+      "type": "string"
+    }
+  },
+  "autoPK": true,
+  "autoCreatedAt": true,
+  "autoUpdatedAt": true
+}
+
+

schema

A flag to toggle schemaless or schema mode in databases that support schemaless data structures. +If turned off, this will allow you to store arbitrary data in a record. If turned on, only attributes +defined in the model's attributes object will be stored.

For adapters that don't require a schema, such as MongoDB or Redis, the schema key is set to false.

{
+  "schema": true|false
+}
+

connection

The configured database connection where this model will fetch and save its data. +Defaults to defaultSQLite, the default connection that uses the waterline-sqlite3 adapter.

{
+  "connection": "mongoDBServer"
+}
+

identity

The lowercase unique key for the model. By default, a model's identity is inferred automatically +by lowercasing its filename. You should never change this property on your models.

{
+  "identity": "petModel"
+}
+

globalId

This flag changes the global name by which you can access your model (if the globalization of models +is enabled). You should never change this property on your models.

{
+  "globaId": "pets"
+}
+

For example to access to your model function:

Pets.find().exec(function (error, pets) {
+  if (error) {
+    console.log(error);
+    return false;
+  }
+
+  console.log(pets);
+});
+

autoPK

A flag to toggle the automatic definition of a primary key in your model. +The details of this default primary key vary between adapters. In any case, the primary keys generated +by autoPK will be unique. If turned off no primary key will be created by default, and you will need +to define one manually using primaryKey: true for one of the model attributes.

{
+  "autoPK": true|false
+}
+

autoCreatedAt

A flag to toggle the automatic definition of a createdAt attribute in your model. +By default, createdAt is an attribute which will be automatically set when a record is created with +the current timestamp.

{
+  "autoCreatedAt": true|false
+}
+

autoUpdatedAt

A flag to toggle the automatic definition of a updatedAt attribute in your model. +By default, updatedAt is an attribute which will be automatically set with the current timestamp +every time a record is updated.

{
+  "autoUpdatedAt": true|false
+}
+

tableName

You can define a custom name for the physical collection in your adapter by adding a tableName +attribute. This isn't just for tables. In MySQL, PostgreSQL, Oracle, etc. this setting refers +to the name of the table, but in MongoDB or Redis, it refers to the collection, and so forth. +If no tableName is specified, Waterline will use the model's identity as its tableName.

This is particularly useful for working with pre-existing/legacy databases.

{
+  "tableName": "pets_table"
+}
+

attributes

Model attributes are basic pieces of information about a model. +A model called Pet might have attributes called name, gender, age, +birthday and breed.

Options can be used to enforce various constraints and add special enhancements to model attributes.

type

Specifies the type of data that will be stored in this attribute. One of:

  • string
  • text
  • integer
  • float
  • date
  • datetime
  • boolean
  • binary
  • array
  • json

Defaults to string if not specified.

Validations

Strapi bundles support for automatic validations of your models' attributes. +Any time a record is updated, or a new record is created, the data for each attribute will +be checked against all of your predefined validation rules. This provides a convenient failsafe +to ensure that invalid entries don't make their way into your application's database(s).

Validations are defined directly in your collection attributes.

  • after (date): Checks if string date in this record is after the specified Date. +Must be valid JavaScript Date.
  • alpha (boolean): Checks if string in this record contains only letters (a-zA-Z).
  • alphadashed (boolean): Checks if string in this record contains only numbers and/or dashes.
  • alphanumeric (boolean): Checks if string in this record contains only letters and numbers.
  • alphanumericdashed (boolean): Checks if string in this record contains only numbers and/or +letters and/or dashes.
  • array (boolean): Checks if this record is a valid JavaScript array object. +Strings formatted as arrays will fail.
  • before (date): Checks if string in this record is a date that's before the specified date.
  • binary (boolean): Checks if this record is a valid binary data. Strings will pass.
  • boolean (boolean): Checks if this record is a valid boolean. Strings will fail.
  • contains (string): Checks if string in this record contains the seed.
  • creditcard (boolean): Checks if string in this record is a credit card.
  • date (boolean): Checks if string in this record is a date takes both strings and JavaScript.
  • datetime (boolean): Checks if string in this record looks like a JavaScript datetime.
  • decimal (boolean): Checks if it contains a decimal or is less than 1.
  • email (boolean): Checks if string in this record looks like an email address.
  • empty (boolean): Checks if the entry is empty. Arrays, strings, or arguments objects with +a length of 0 and objects with no +own enumerable properties are considered empty.
  • equals (integer): Checks if string in this record is equal to the specified value. +They must match in both value and type.
  • falsey (boolean): Would a Javascript engine register a value of false on this?.
  • finite (boolean): Checks if given value is, or can be coerced to, a finite number. +This is not the same as native isFinite +which will return true for booleans and empty strings.
  • float (boolean): Checks if string in this record is of the number type float.
  • hexadecimal (boolean): Checks if string in this record is a hexadecimal number.
  • hexColor (boolean): Checks if string in this record is a hexadecimal color.
  • in (array): Checks if string in this record is in the specified array of allowed +string values.
  • int (boolean): Check if string in this record is an integer.
  • integer (boolean): Check if string in this record is an integer. Alias for int.
  • ip (boolean): Checks if string in this record is a valid IP (v4 or v6).
  • ipv4 (boolean): Checks if string in this record is a valid IP v4.
  • ipv6 (boolean): Checks if string in this record is aa valid IP v6.
  • json (boolean): Checks if the record is a JSON.
  • lowercase (boolean): Check if string in this record is in all lowercase.
  • max (integer): max value for an integer.
  • maxLength (integer):
  • min (integer): min value for an integer.
  • minLength (integer):
  • notContains (string): Checks if string in this record doesn't contain the seed.
  • notIn (array): does the value of this model attribute exist inside of the defined +validator value (of the same type). +Takes strings and arrays.
  • notNull (boolean): does this not have a value of null ?.
  • null (boolean): Checks if string in this record is null.
  • number (boolean): Checks if this record is a number. NaN is considered a number.
  • numeric (boolean): Checks if string in this record contains only numbers.
  • object (boolean): Checks if this attribute is the language type of Object. +Passes for arrays, functions, objects, +regexes, new Number(0), and new String('') !
  • regex (regex): Checks if the record matches the specific regex.
  • required (boolean): Must this model attribute contain valid data before a new +record can be created?.
  • string (boolean): Checks if the record is a string.
  • text (boolean): Checks if the record is a text.
  • truthy (boolean): Would a Javascript engine register a value of false on this?
  • undefined (boolean): Would a JavaScript engine register this thing as have the +value undefined?
  • uppercase (boolean): Checks if string in this record is uppercase.
  • url (boolean): Checks if string in this record is a URL.
  • urlish (boolean): Checks if string in this record contains something that looks like +a route, ending with a file extension.
  • uuid (boolean): Checks if string in this record is a UUID (v3, v4, or v5).
  • uuidv3 (boolean): Checks if string in this record is a UUID (v3).
  • uuidv4 (boolean): Checks if string in this record is a UUID (v4).

defaultsTo

When a record is created, if no value was supplied, the record will be created with the specified +defaultsTo value.

"attributes": {
+  "usersGroup": {
+    "type": "string",
+    "defaultsTo": "guess"
+  }
+}
+

autoIncrement

Sets up the attribute as an auto-increment key. When a new record is added to the model, +if a value for this attribute is not specified, it will be generated by incrementing the most recent +record's value by one.

Attributes which specify autoIncrement should always be of type: integer. +Also, bear in mind that the level of support varies across different datastores. +For instance, MySQL will not allow more than one auto-incrementing column per table.

"attributes": {
+  "placeInLine": {
+    "type": "integer",
+    "autoIncrement": true
+  }
+}
+

unique

Ensures no two records will be allowed with the same value for the target attribute. +This is an adapter-level constraint, so in most cases this will result in a unique index on the +attribute being created in the underlying datastore.

Defaults to false if not specified.

"attributes": {
+  "username": {
+    "type": "string",
+    "unique": true
+  }
+}
+

primaryKey

Use this attribute as the the primary key for the record. Only one attribute per model can be the +primaryKey. Defaults to false if not specified.

This should never be used unless autoPK is set to false.

"attributes": {
+  "uuid": {
+    "type": "string",
+    "primaryKey": true,
+    "required": true
+  }
+}
+

enum

A special validation property which only saves data which matches a whitelisted set of values.

"attributes": {
+  "gender": {
+    "type": "string",
+    "enum": ["male", "female"]
+  }
+}
+

size

If supported in the adapter, can be used to define the size of the attribute. +For example in MySQL, size can be specified as a number (n) to create a column with the SQL +data type: varchar(n).

"attributes": {
+  "name": {
+    "type": "string",
+    "size": 24
+  }
+}
+

columnName

Inside an attribute definition, you can specify a columnName to force Waterline to store data +for that attribute in a specific column in the configured connection. +Be aware that this is not necessarily SQL-specific. It will also work for MongoDB fields, etc.

While the columnName property is primarily designed for working with existing/legacy databases, +it can also be useful in situations where your database is being shared by other applications, +or you don't have access permissions to change the schema.

"attributes": {
+  "name": {
+    "type": "string",
+    "columnName": "pet_name"
+  }
+}
+

Associations

With Waterline you can associate models with other models across all data stores. +This means that your users can live in PostgreSQL and their photos can live in MongoDB +and you can interact with the data as if they lived together on the same database. +You can also have associations that live on separate connections or in different databases +within the same adapter.

One-Way associations

A one-way association is where a model is associated with another model. +You could query that model and populate to get the associated model. +You can't however query the associated model and populate to get the associating model.

In this example, we are associating a User with a Pet but not a Pet with a User. +Because we have only formed an association on one of the models, a Pet has no restrictions +on the number of User models it can belong to. If we wanted to, we could change this and +associate the Pet with exactly one User and the User with exactly one Pet.

./api/pet/models/Pet.settings.json:

{
+  "attributes": {
+    "name": {
+      "type": "string",
+      "required": true,
+      "unique": true
+    },
+    "color": {
+      "type": "string",
+      "required": true
+    }
+  }
+}
+

./api/user/models/User.settings.json:

{
+  "attributes": {
+    "name": {
+      "type": "string",
+      "required": true,
+      "unique": true
+    },
+    "color": {
+      "type": "string",
+      "required": true
+    },
+    "pony": {
+      "model": "pet"
+    }
+  }
+}
+

One-to-One associations

A one-to-one association states that a model may only be associated with one other model. +In order for the model to know which other model it is associated with a foreign key must +be included in the record.

In this example, we are associating a Pet with a User. The User may only have one +Pet and viceversa, a Pet can only have one User. However, in order to query this association +from both sides, you will have to create/update both models.

./api/pet/models/Pet.settings.json:

{
+  "attributes": {
+    "name": {
+      "type": "string",
+      "required": true,
+      "unique": true
+    },
+    "color": {
+      "type": "string",
+      "required": true
+    },
+    "owner": {
+      "model": "user"
+    }
+  }
+}
+

./api/user/models/User.settings.json:

{
+  "attributes": {
+    "name": {
+      "type": "string",
+      "required": true,
+      "unique": true
+    },
+    "age": {
+      "type": "integer",
+      "required": true
+    },
+    "pony": {
+      "model": "pet"
+    }
+  }
+}
+

One-to-Many associations

A one-to-many association states that a model can be associated with many other models. +To build this association a virtual attribute is added to a model using the collection property. +In a one-to-many association one side must have a collection attribute and the other side must contain a +model attribute. This allows the many side to know which records it needs to get when a populate is used.

Because you may want a model to have multiple one-to-many associations on another model a via key is +needed on the collection attribute. This states which model attribute on the one side of the association +is used to populate the records.

In this example, a User can have several Pet, but a Pet has only one owner (from the User model).

./api/pet/models/Pet.settings.json:

{
+  "attributes": {
+    "name": {
+      "type": "string",
+      "required": true,
+      "unique": true
+    },
+    "color": {
+      "type": "string",
+      "required": true
+    },
+    "owner": {
+      "model": "user"
+    }
+  }
+}
+

./api/user/models/User.settings.json:

{
+  "attributes": {
+    "name": {
+      "type": "string",
+      "required": true,
+      "unique": true
+    },
+    "age": {
+      "type": "integer",
+      "required": true
+    },
+    "pets": {
+      "collection": "pet",
+      "via": "owner"
+    }
+  }
+}
+

Many-to-Many associations

A many-to-many association states that a model can be associated with many other models +and vice-versa. Because both models can have many related models a new join table will +need to be created to keep track of these relations.

Waterline will look at your models and if it finds that two models both have collection +attributes that point to each other, it will automatically build up a join table for you.

Because you may want a model to have multiple many-to-many associations on another model +a via key is needed on the collection attribute. This states which model attribute on the +one side of the association is used to populate the records.

Using the User and Pet example lets look at how to build a schema where a User may +have many Pet records and a Pet may have multiple owners.

In this example, we will start with an array of users and an array of pets. +We will create records for each element in each array then associate all of the Pets with all +of the Users. If everything worked properly, we should be able to query any User and see that +they own all of the Pets. Furthermore, we should be able to query any Pet and see that +it is owned by every User.

./api/pet/models/Pet.settings.json:

{
+  "attributes": {
+    "name": {
+      "type": "string",
+      "required": true,
+      "unique": true
+    },
+    "color": {
+      "type": "string",
+      "required": true
+    },
+    "owners": {
+      "collection": "user",
+      "via": "pets"
+    }
+  }
+}
+

./api/user/models/User.settings.json:

{
+  "attributes": {
+    "name": {
+      "type": "string",
+      "required": true,
+      "unique": true
+    },
+    "age": {
+      "type": "integer",
+      "required": true
+    },
+    "pets": {
+      "collection": "pet",
+      "via": "owners"
+    }
+  }
+}
+

Lifecycle Callbacks

Lifecycle callbacks are functions you can define to run at certain times in a query. +They are hooks that you can tap into in order to change data.

Strapi exposes a handful of lifecycle callbacks by default.

Callbacks on create

  • beforeValidate: fn(values, cb)
  • afterValidate: fn(values, cb)
  • beforeCreate: fn(values, cb)
  • afterCreate: fn(newlyInsertedRecord, cb)

Callbacks on update

  • beforeValidate: fn(valuesToUpdate, cb)
  • afterValidate: fn(valuesToUpdate, cb)
  • beforeUpdate: fn(valuesToUpdate, cb)
  • afterUpdate: fn(updatedRecord, cb)

Callbacks on destroy

  • beforeDestroy: fn(criteria, cb)
  • afterDestroy: fn(deletedRecord, cb)

For example, this could be your ./api/pet/models/Pet.js file:

module.exports = {
+  /**
+   * Basic settings
+   */
+
+  // The identity to use.
+  identity: settings.identity,
+
+  // The connection to use.
+  connection: settings.connection,
+
+  // Do you want to respect schema?
+  schema: settings.schema,
+
+  // Merge simple attributes from settings with those ones.
+  attributes: _.merge(settings.attributes, {
+
+  }),
+
+  // Do you automatically want to have time data?
+  autoCreatedAt: settings.autoCreatedAt,
+  autoUpdatedAt: settings.autoUpdatedAt,
+
+  /**
+   * Lifecycle callbacks on create
+   */
+
+  // Before creating a value.
+  beforeCreate: function (values, next) {
+    // Do some stuff
+    next();
+  },
+
+  // After creating a value.
+  afterCreate: function (newlyInsertedRecord, next) {
+    // Do some stuff
+    next();
+  },
+
+  /**
+   * Lifecycle callbacks on update
+   */
+
+  // Before updating a value.
+  beforeUpdate: function (valuesToUpdate, next) {
+    // Do some stuff
+    next();
+  },
+
+  // After updating a value.
+  afterUpdate: function (updatedRecord, next) {
+    // Do some stuff
+    next();
+  },
+
+  /**
+   * Lifecycle callbacks on destroy
+   */
+
+  // Before destroying a value.
+  beforeDestroy: function (criteria, next) {
+    // Do some stuff
+    next();
+  },
+
+  // After destroying a value.
+  afterDestroy: function (destroyedRecords, next) {
+    // Do some stuff
+    next();
+  }
+
+ + + diff --git a/docs/.vuepress/dist/1.x.x/queries.html b/docs/.vuepress/dist/1.x.x/queries.html new file mode 100644 index 0000000000..6664029b17 --- /dev/null +++ b/docs/.vuepress/dist/1.x.x/queries.html @@ -0,0 +1,311 @@ + + + + + + Query Interface | Strapi Docs + + + + + + + +

Query Interface

The Waterline Query Interface allows you to interact with your models the same +way no matter which adapter they are using. This means you can use the same Query +Language whether your data lives in MySQL, MongoDB, PostgreSQL, etc.

Query Methods

Every model in Waterline will have a set of query methods exposed on it to allow +you to interact with the database in a normalized fashion. +These are known as the CRUD (Create, Read, Update and Delete) methods and +is the primary way of interacting with your data.

There are also a special set of queries known as dynamic queries. +These are special class methods that are dynamically generated when you initialize Waterline. +We call them dynamic finders. They perform many of the same functions as the other class +methods but you can call them directly on an attribute in your model.

For most class methods, the callback parameter is optional and if one is not supplied, +it will return a chainable object.

.find(criteria, [callback])

find will return an array of records that match the supplied criteria. +Criteria can be built using the Query Language.

  • The criteria is required and accepts {}, [{}], string and int data types.
  • The callback function is optional.

Any string arguments passed must be the ID of the record. +This method will always return records in an array. +If you are trying to find an attribute that is an array, you must wrap it in an additional +set of brackets otherwise Waterline will think you want to perform an inQuery.

User.find({
+    name: 'Walter Jr'
+  })
+  .exec(function (err, users) {
+    if (err) {
+      console.log(err);
+    }
+    console.log(users);
+  });
+

.findOne(criteria, [callback])

findOne will return an object with the first matching result in the data store.

  • The criteria is required and accepts {}, [{}], string and int data types.
  • The callback function is optional.

Any string arguments passed must be the ID of the record. +If you are trying to find an attribute that is an array, you must wrap it in an additional +set of brackets otherwise Waterline will think you want to perform an inQuery.

User.findOne({
+    name: 'Walter Jr'
+  })
+  .exec(function (err, user) {
+    if (err) {
+      console.log(err);
+    }
+    console.log(user);
+  });
+

.create(criteria, [callback])

create will attempt to create a new record in the datastore. +If the data is valid and passes all validations it will be sent to the adapters create method.

  • The criteria is required and accepts {} and [{}] data types.
  • The callback function is optional.
User.create({
+    name: 'Walter Jr'
+  })
+  .exec(function (err, user) {
+    if (err) {
+      console.log(err);
+    }
+    console.log(user);
+  });
+

.findOrCreate(criteria, [values, callback])

findOrCreate will return a single record if one was found or created, +or an array of records if multiple get found/created via the supplied criteria or values. +Criteria can be built using the Query Language.

  • The criteria is required and accepts {}, [{}], string and int data types.
  • The values is optional and accepts {} and [{}] data types.
  • The callback function is optional.

Any string arguments passed must be the ID of the record. +This method can return a single record or an array of records. +If a model is not found and creation values are omitted, it will get created with the supplied criteria values.

Unless an adapter implements its own version of findOrCreate, findOrCreate will do the +find and create calls in two separate steps (not transactional). +In a high frequency scenario it's possible for duplicates to be created if the query field(s) are not indexed.

Either user(s) with the name "Walter Jr" get returned or +a single user gets created with the name "Walter Jr" and returned:

User.findOrCreate({
+    name: 'Walter Jr'
+  })
+  .exec(function (err, users) {
+    if (err) {
+      console.log(err);
+    }
+    console.log(users);
+  });
+

.update(search criteria, values, [callback])

update will attempt to update any records matching the criteria passed in. +Criteria can be built using the Query Language.

  • The criteria is required and accepts {}, [{}], string and int data types.
  • The values is required and accepts {} and [{}] data types.
  • The callback function is optional.

Although you may pass .update() an object or an array of objects, +it will always return an array of objects. Any string arguments passed must be the ID +of the record. If you specify a primary key instead of a criteria object, +any .where() filters will be ignored.

User.update({
+    name: 'Walter Jr'
+  }, {
+    name: 'Flynn'
+  })
+  .exec(function (err, user) {
+    if (err) {
+      console.log(err);
+    }
+    console.log(user);
+  });
+

.destroy(criteria, [callback])

destroy will destroy any records matching the provided criteria. +Criteria can be built using the Query Language.

  • The criteria is required and accepts {}, [{}], string and int data types.
  • The callback function is optional.

If you want to confirm the record exists before you delete it, +you must first perform a .find(). Any string arguments passed must be the ID of the record.

User.destroy({
+    name: 'Flynn'
+  })
+  .exec(function (err) {
+    if (err) {
+      console.log(err);
+    }
+  });
+

.query(query, [data], callback)

Some adapters, such as sails-mysql and sails-postgresql, support the query function +which will run the provided RAW query against the database. +This can sometimes be useful if you want to run complex queries and performance is very important.

  • The query is required and accepts string data types.
  • The data is optional and accepts array data types.
  • The callback function is required.

The type of the results returned depend on your adapter: sails-mysql returns an array of objects +and sails-postgresql returns an object containing metadata and the actual results within a 'rows' array. +This function does currently not support promises.

Using PostgreSQL:

const title = "The King's Speech";
+Movie.query('SELECT * FROM movie WHERE title = $1', [title], function (err, results) {
+  console.log('Found the following movie: ', results.rows[0]);
+});
+

Using MySQL:

const title = "The King's Speech";
+Movie.query('SELECT * FROM movie WHERE title = $1', [title], function (err, results) {
+  console.log('Found the following movie: ', results[0]);
+});
+

Query Language

The Waterline Query Language is an object based criteria used to retrieve the +records from any of the supported database adapters. +This allows you to change your database without changing your codebase.

All queries inside of Waterline are case insensitive. This allows for easier querying +but makes indexing strings tough. This is something to be aware of if you are +indexing and searching on string fields.

Query Language Basics

The criteria objects are formed using one of four types of object keys. +These are the top level keys used in a query object. It is loosely based on the +criteria used in MongoDB with a few slight variations.

Queries can be built using either a where key to specify attributes, +which will allow you to also use query options such as limit and skip or +if where is excluded the entire object will be treated as a where criteria.

User.find({
+  where: {
+    name: 'John'
+  },
+  skip: 20,
+  limit: 10,
+  sort: 'name DESC'
+});
+

Or:

User.find({
+  name: 'John'
+});
+

Key Pairs

A key pair can be used to search records for values matching exactly what is specified. +This is the base of a criteria object where the key represents an attribute on a model +and the value is a strict equality check of the records for matching values.

User.find({
+  name: 'John'
+});
+

They can be used together to search multiple attributes:

User.find({
+  name: 'John',
+  country: 'France'
+});
+

Modified Pairs

Modified pairs also have model attributes for keys but they also use any of the +supported criteria modifiers to perform queries where a strict equality check wouldn't work.

User.find({
+  name: {
+    contains: 'alt'
+  }
+})
+

In Pairs

In queries work similarly to MySQL in queries. Each element in the array is treated as or.

User.find({
+  name: ['John', 'Walter']
+});
+

Not-In Pairs

Not-In queries work similar to in queries, except for the nested object criteria.

User.find({
+  name: {
+    '!': ['John', 'Walter']
+  }
+});
+

Or Pairs

Performing OR queries is done by using an array of query pairs. +Results will be returned that match any of the criteria objects inside the array.

User.find({
+  or: [
+    {
+      name: 'John'
+    },
+    {
+      occupation: 'Developer'
+    }
+  ]
+});
+

Criteria Modifiers

The following modifiers are available to use when building queries:

  • < or lessThan
  • <= or lessThanOrEqual
  • > or greaterThan
  • >= or greaterThanOrEqual
  • ! or not
  • like
  • contains
  • startsWith
  • endsWith

< or lessThan

Searches for records where the value is less than the value specified.

User.find({
+  age: {
+    '<': 30
+  }
+});
+

<= or lessThanOrEqual

Searches for records where the value is less or equal to the value specified.

User.find({
+  age: {
+    '<=': 21
+  }
+});
+

> or greaterThan

Searches for records where the value is more than the value specified.

User.find({
+  age: {
+    '>': 18
+  }
+});
+

>= or greaterThanOrEqual

Searches for records where the value is more or equal to the value specified.

User.find({
+  age: {
+    '>=': 21
+  }
+});
+

! or not

Searches for records where the value is not equal to the value specified.

User.find({
+  name: {
+    '!': 'John'
+  }
+});
+

like

Searches for records using pattern matching with the % sign.

User.find({
+  food: {
+    'like': '%burgers'
+  }
+});
+

contains

A shorthand for pattern matching both sides of a string. +Will return records where the value contains the string anywhere inside of it.

User.find({
+  class: {
+    'like': '%history%'
+  }
+});
+
User.find({
+  class: {
+    'contains': 'history'
+  }
+});
+

startsWith

A shorthand for pattern matching the right side of a string +Will return records where the value starts with the supplied string value.

User.find({
+  class: {
+    'startsWith': 'french'
+  }
+});
+
User.find({
+  class: {
+    'like': 'french%'
+  }
+});
+

endsWith

A shorthand for pattern matching the left side of a string. +Will return records where the value ends with the supplied string value.

User.find({
+  class: {
+    'endsWith': 'can'
+  }
+});
+
User.find({
+  class: {
+    'like': '%can'
+  }
+});
+

Date Ranges

You can do date range queries using the comparison operators.

User.find({
+  date: {
+    '>': new Date('2/4/2014'),
+    '<': new Date('2/7/2014')
+  }
+});
+

Query Options

Query options allow you refine the results that are returned from a query.

Limit results

Limit the number of results returned from a query.

User.find({
+  where: {
+    name: 'John'
+  },
+  limit: 20
+});
+

Skip results

Return all the results excluding the number of items to skip.

User.find({
+  where: {
+    name: 'John'
+  },
+  skip: 10
+});
+

Pagination

skip and limit can be used together to build up a pagination system.

User.find({
+  where: {
+    name: 'John'
+  },
+  limit: 10,
+  skip: 10
+});
+

Sort results

Results can be sorted by attribute name. Simply specify an attribute name for +natural (ascending) sort, or specify an asc or desc flag for ascending or +descending orders respectively.

Sort by name in ascending order:

User.find({
+  where: {
+    name: 'John'
+  },
+  sort: 'name'
+});
+

Sort by name in descending order:

User.find({
+  where: {
+    name: 'John'
+  },
+  sort: 'name DESC'
+});
+

Sort by name in ascending order:

User.find({
+  where: {
+    name: 'John'
+  },
+  sort: 'name ASC'
+});
+

Sort by binary notation

User.find({
+  where: {
+    name: 'John'
+  },
+  sort: {
+    name: 1
+  }
+});
+

Sort by multiple attributes:

User.find({
+  where: {
+    name: 'John'
+  },
+  sort: {
+    name:  1,
+    age: 0
+  }
+});
+

Select a field

Apply a projection to a Waterline query.

This example only returns the field name:

User.find({
+  where: {
+    age: {
+      '<': 30
+    }
+  },
+  select: ['name']
+});
+
+ + + diff --git a/docs/.vuepress/dist/1.x.x/request.html b/docs/.vuepress/dist/1.x.x/request.html new file mode 100644 index 0000000000..4d51dd4c1a --- /dev/null +++ b/docs/.vuepress/dist/1.x.x/request.html @@ -0,0 +1,174 @@ + + + + + + Request | Strapi Docs + + + + + + + +

Request

A Strapi Request object is an abstraction on top of Node's vanilla request object, +providing additional functionality that is useful for every day HTTP server +development.

API

request.header

Request header object.

request.headers

Request header object. Alias as request.header.

request.method

Request method.

request.method=

Set request method, useful for implementing middleware +such as methodOverride().

request.length

Return request Content-Length as a number when present, or undefined.

request.url

Get request URL.

request.url=

Set request URL, useful for url rewrites.

request.originalUrl

Get request original URL.

request.origin

Get origin of URL, include protocol and host.

this.request.origin
+// => http://example.com
+

request.href

Get full request URL, include protocol, host and url.

this.request.href
+// => http://example.com/foo/bar?q=1
+

request.path

Get request pathname.

request.path=

Set request pathname and retain query-string when present.

request.querystring

Get raw query string void of ?.

request.querystring=

Set raw query string.

Get raw query string with the ?.

request.search=

Set raw query string.

request.host

Get host (hostname:port) when present. Supports X-Forwarded-Host +when strapi.app.proxy is true, otherwise Host is used.

request.hostname

Get hostname when present. Supports X-Forwarded-Host +when strapi.app.proxy is true, otherwise Host is used.

request.type

Get request Content-Type void of parameters such as "charset".

const ct = this.request.type;
+// => "image/png"
+

request.charset

Get request charset when present, or undefined:

this.request.charset
+// => "utf-8"
+

request.query

Get parsed query-string, returning an empty object when no +query-string is present. Note that this getter does not +support nested parsing.

For example "color=blue&size=small":

{
+  color: 'blue',
+  size: 'small'
+}
+

request.query=

Set query-string to the given object. Note that this +setter does not support nested objects.

this.query = { next: '/login' };
+

request.fresh

Check if a request cache is "fresh", aka the contents have not changed. This +method is for cache negotiation between If-None-Match / ETag, and +If-Modified-Since and Last-Modified. It should be referenced after setting +one or more of these response headers.

// freshness check requires status 20x or 304
+this.status = 200;
+this.set('ETag', '123');
+
+// cache is ok
+if (this.fresh) {
+  this.status = 304;
+  return;
+}
+
+// cache is stale
+// fetch new data
+this.body = yield db.find('something');
+

request.stale

Inverse of request.fresh.

request.protocol

Return request protocol, "https" or "http". Supports X-Forwarded-Proto +when strapi.app.proxy is true.

request.secure

Shorthand for this.protocol == "https" to check if a request was +issued via TLS.

request.ip

Request remote address. Supports X-Forwarded-For when strapi.app.proxy +is true.

request.ips

When X-Forwarded-For is present and strapi.app.proxy is enabled an array +of these ips is returned, ordered from upstream -> downstream. When disabled +an empty array is returned.

request.subdomains

Return subdomains as an array.

Subdomains are the dot-separated parts of the host before the main domain of +the app. By default, the domain of the app is assumed to be the last two +parts of the host. This can be changed by setting strapi.app.subdomainOffset.

For example, if the domain is "tobi.ferrets.example.com": +If strapi.app.subdomainOffset is not set, this.subdomains is ["ferrets", "tobi"]. +If strapi.app.subdomainOffset is 3, this.subdomains is ["tobi"].

request.is(types...)

Check if the incoming request contains the "Content-Type" +header field, and it contains any of the give mime types. +If there is no request body, undefined is returned. +If there is no content type, or the match fails false is returned. +Otherwise, it returns the matching content-type.

// With Content-Type: text/html; charset=utf-8
+this.is('html'); // => 'html'
+this.is('text/html'); // => 'text/html'
+this.is('text/*', 'text/html'); // => 'text/html'
+
+// When Content-Type is application/json
+this.is('json', 'urlencoded'); // => 'json'
+this.is('application/json'); // => 'application/json'
+this.is('html', 'application/*'); // => 'application/json'
+
+this.is('html'); // => false
+

For example if you want to ensure that +only images are sent to a given route:

if (this.is('image/*')) {
+  // process
+} else {
+  this.throw(415, 'images only!');
+}
+

Content Negotiation

Strapi's request object includes helpful content negotiation utilities powered by +accepts and +negotiator.

These utilities are:

  • request.accepts(types)
  • request.acceptsEncodings(types)
  • request.acceptsCharsets(charsets)
  • request.acceptsLanguages(langs)

If no types are supplied, all acceptable types are returned.

If multiple types are supplied, the best match will be returned. If no matches are found, +a false is returned, and you should send a 406 "Not Acceptable" response to the client.

In the case of missing accept headers where any type is acceptable, the first type will +be returned. Thus, the order of types you supply is important.

request.accepts(types)

Check if the given type(s) is acceptable, returning the best match when true, otherwise +false. The type value may be one or more mime type string +such as "application/json", the extension name +such as "json", or an array ["json", "html", "text/plain"].

// Accept: text/html
+this.accepts('html');
+// => "html"
+
+// Accept: text/*, application/json
+this.accepts('html');
+// => "html"
+this.accepts('text/html');
+// => "text/html"
+this.accepts('json', 'text');
+// => "json"
+this.accepts('application/json');
+// => "application/json"
+
+// Accept: text/*, application/json
+this.accepts('image/png');
+this.accepts('png');
+// => false
+
+// Accept: text/*;q=.5, application/json
+this.accepts(['html', 'json']);
+this.accepts('html', 'json');
+// => "json"
+
+// No Accept header
+this.accepts('html', 'json');
+// => "html"
+this.accepts('json', 'html');
+// => "json"
+

You may call this.accepts() as many times as you like, +or use a switch:

switch (this.accepts('json', 'html', 'text')) {
+  case 'json': break;
+  case 'html': break;
+  case 'text': break;
+  default: this.throw(406, 'json, html, or text only');
+}
+

request.acceptsEncodings(encodings)

Check if encodings are acceptable, returning the best match when true, otherwise false. +Note that you should include identity as one of the encodings!

// Accept-Encoding: gzip
+this.acceptsEncodings('gzip', 'deflate', 'identity');
+// => "gzip"
+
+this.acceptsEncodings(['gzip', 'deflate', 'identity']);
+// => "gzip"
+

When no arguments are given all accepted encodings +are returned as an array:

// Accept-Encoding: gzip, deflate
+this.acceptsEncodings();
+// => ["gzip", "deflate", "identity"]
+

Note that the identity encoding (which means no encoding) could be unacceptable if +the client explicitly sends identity;q=0. Although this is an edge case, you should +still handle the case where this method returns false.

request.acceptsCharsets(charsets)

Check if charsets are acceptable, returning +the best match when true, otherwise false.

// Accept-Charset: utf-8, iso-8859-1;q=0.2, utf-7;q=0.5
+this.acceptsCharsets('utf-8', 'utf-7');
+// => "utf-8"
+
+this.acceptsCharsets(['utf-7', 'utf-8']);
+// => "utf-8"
+

When no arguments are given all accepted charsets +are returned as an array:

// Accept-Charset: utf-8, iso-8859-1;q=0.2, utf-7;q=0.5
+this.acceptsCharsets();
+// => ["utf-8", "utf-7", "iso-8859-1"]
+

request.acceptsLanguages(langs)

Check if langs are acceptable, returning +the best match when true, otherwise false.

// Accept-Language: en;q=0.8, es, pt
+this.acceptsLanguages('es', 'en');
+// => "es"
+
+this.acceptsLanguages(['en', 'es']);
+// => "es"
+

When no arguments are given all accepted languages +are returned as an array:

// Accept-Language: en;q=0.8, es, pt
+this.acceptsLanguages();
+// => ["es", "pt", "en"]
+

request.idempotent

Check if the request is idempotent.

request.socket

Return the request socket.

request.get(field)

Return request header.

+ + + diff --git a/docs/.vuepress/dist/1.x.x/response.html b/docs/.vuepress/dist/1.x.x/response.html new file mode 100644 index 0000000000..454bd8c59a --- /dev/null +++ b/docs/.vuepress/dist/1.x.x/response.html @@ -0,0 +1,94 @@ + + + + + + Response | Strapi Docs + + + + + + + +

Response

A Strapi Response object is an abstraction on top of Node's vanilla response object, +providing additional functionality that is useful for every day HTTP server +development.

API

response.header

Response header object.

response.headers

Response header object. Alias as response.header.

response.socket

Request socket.

response.status

Get response status. By default, response.status is not set unlike Node's +res.statusCode which defaults to 200.

response.status=

Set response status via numeric code:

  • 100 "continue"
  • 101 "switching protocols"
  • 102 "processing"
  • 200 "ok"
  • 201 "created"
  • 202 "accepted"
  • 203 "non-authoritative information"
  • 204 "no content"
  • 205 "reset content"
  • 206 "partial content"
  • 207 "multi-status"
  • 300 "multiple choices"
  • 301 "moved permanently"
  • 302 "moved temporarily"
  • 303 "see other"
  • 304 "not modified"
  • 305 "use proxy"
  • 307 "temporary redirect"
  • 400 "bad request"
  • 401 "unauthorized"
  • 402 "payment required"
  • 403 "forbidden"
  • 404 "not found"
  • 405 "method not allowed"
  • 406 "not acceptable"
  • 407 "proxy authentication required"
  • 408 "request time-out"
  • 409 "conflict"
  • 410 "gone"
  • 411 "length required"
  • 412 "precondition failed"
  • 413 "request entity too large"
  • 414 "request-uri too large"
  • 415 "unsupported media type"
  • 416 "requested range not satisfiable"
  • 417 "expectation failed"
  • 418 "i'm a teapot"
  • 422 "unprocessable entity"
  • 423 "locked"
  • 424 "failed dependency"
  • 425 "unordered collection"
  • 426 "upgrade required"
  • 428 "precondition required"
  • 429 "too many requests"
  • 431 "request header fields too large"
  • 500 "internal server error"
  • 501 "not implemented"
  • 502 "bad gateway"
  • 503 "service unavailable"
  • 504 "gateway time-out"
  • 505 "http version not supported"
  • 506 "variant also negotiates"
  • 507 "insufficient storage"
  • 509 "bandwidth limit exceeded"
  • 510 "not extended"
  • 511 "network authentication required"

Don't worry too much about memorizing these strings, if you have a typo an error will be thrown, +displaying this list so you can make a correction.

response.message

Get response status message. By default, response.message is +associated with response.status.

response.message=

Set response status message to the given value.

response.length=

Set response Content-Length to the given value.

response.length

Return response Content-Length as a number when present, or deduce +from this.body when possible, or undefined.

response.body

Get response body.

response.body=

Set response body to one of the following:

  • string written
  • Buffer written
  • Stream piped
  • Object json-stringified
  • null no content response

If response.status has not been set, Strapi will automatically set the status to 200 or 204.

String

The Content-Type is defaulted to text/html or text/plain, both with +a default charset of utf-8. The Content-Length field is also set.

Buffer

The Content-Type is defaulted to application/octet-stream, and Content-Length +is also set.

Stream

The Content-Type is defaulted to application/octet-stream.

Object

The Content-Type is defaulted to application/json.

response.get(field)

Get a response header field value with case-insensitive field.

const etag = this.get('ETag');
+

response.set(field, value)

Set response header field to value:

this.set('Cache-Control', 'no-cache');
+

response.append(field, value)

Append additional header field with value val.

this.append('Link', '<http://127.0.0.1/>');
+

response.set(fields)

Set several response header fields with an object:

this.set({
+  'Etag': '1234',
+  'Last-Modified': date
+});
+

response.remove(field)

Remove header field.

response.type

Get response Content-Type void of parameters such as "charset".

const ct = this.type;
+// => "image/png"
+

response.type=

Set response Content-Type via mime string or file extension.

this.type = 'text/plain; charset=utf-8';
+this.type = 'image/png';
+this.type = '.png';
+this.type = 'png';
+

Note: when appropriate a charset is selected for you, for +example response.type = 'html' will default to "utf-8", however +when explicitly defined in full as response.type = 'text/html' +no charset is assigned.

response.is(types...)

Very similar to this.request.is(). +Check whether the response type is one of the supplied types. +This is particularly useful for creating middleware that +manipulate responses.

For example, this is a middleware that minifies +all HTML responses except for streams.

const minify = require('html-minifier');
+
+strapi.app.use(function *minifyHTML(next) {
+  yield next;
+
+  if (!this.response.is('html')) {
+    return;
+  }
+
+  const body = this.body;
+  if (!body || body.pipe) {
+    return;
+  }
+
+  if (Buffer.isBuffer(body)) {
+    body = body.toString();
+  }
+
+  this.body = minify(body);
+});
+

response.redirect(url, [alt])

Perform a [302] redirect to url.

The string "back" is special-cased +to provide Referrer support, when Referrer +is not present alt or "/" is used.

this.redirect('back');
+this.redirect('back', '/index.html');
+this.redirect('/login');
+this.redirect('http://google.com');
+

To alter the default status of 302, simply assign the status +before or after this call. To alter the body, assign it after this call:

this.status = 301;
+this.redirect('/cart');
+this.body = 'Redirecting to shopping cart';
+

response.attachment([filename])

Set Content-Disposition to "attachment" to signal the client +to prompt for download. Optionally specify the filename of the +download.

response.headerSent

Check if a response header has already been sent. Useful for seeing +if the client may be notified on error.

response.lastModified

Return the Last-Modified header as a Date, if it exists.

response.lastModified=

Set the Last-Modified header as an appropriate UTC string. +You can either set it as a Date or date string.

this.response.lastModified = new Date();
+

response.etag=

Set the ETag of a response including the wrapped "s. +Note that there is no corresponding response.etag getter.

this.response.etag = crypto.createHash('md5').update(this.body).digest('hex');
+

response.vary(field)

Vary on field.

+ + + diff --git a/docs/.vuepress/dist/1.x.x/router.html b/docs/.vuepress/dist/1.x.x/router.html new file mode 100644 index 0000000000..4532f990de --- /dev/null +++ b/docs/.vuepress/dist/1.x.x/router.html @@ -0,0 +1,132 @@ + + + + + + Router | Strapi Docs + + + + + + + +

Router

The most basic feature of any web application is the ability to interpret a request sent to a URL, +then send back a response. In order to do this, your application has to be able to distinguish one URL +from another.

Like most web frameworks, Strapi provides a router: a mechanism for mapping URLs to controllers. +Routes are rules that tell Strapi what to do when faced with an incoming request.

Routes can be found in ./api/<apiName>/config/routes.json.

Route format

Each route consists of an address (as a key) and a target (as an object value). +The address is a URL path and a specific HTTP method. The target is defined by an object with a +controller and an action. When the router receives an incoming request, it checks the address +of all routes for matches. If a matching route is found, the request is then passed to its target.

  {
+    "routes": {
+      "VERB /endpoint/:param": {
+        "controller": "controllerName",
+        "action": "actionName"
+      }
+    }
+  }
+

For example to manage your Post records with a CRUD, your route should look like this:

  {
+    "routes": {
+      "GET /post": {
+        "controller": "Post",
+        "action": "find"
+      }
+      "GET /post/:id": {
+        "controller": "Post",
+        "action": "findOne"
+      },
+      "POST /post": {
+        "controller": "Post",
+        "action": "create"
+      },
+      "PUT /post/:id": {
+        "controller": "Post",
+        "action": "update"
+      },
+      "DELETE /post/:id": {
+        "controller": "Post",
+        "action": "delete"
+      }
+    }
+  }
+

Route parameters

Route paths will be translated to regular expressions used to match requests. +Query strings will not be considered when matching requests.

Route parameters are captured and added to ctx.params or ctx.request.body.

By taking the previous example, your Post controller should look like this:

module.exports = {
+
+  // GET request
+  find: function *() {
+    try {
+      this.body = yield Post.find(this.params);
+    } catch (error) {
+      this.body = error;
+    }
+  },
+
+  findOne: function *() {
+    try {
+      this.body = yield Post.findOne(this.params);
+    } catch (error) {
+      this.body = error;
+    }
+  },
+
+  // POST request
+  create: function *() {
+    try {
+      this.body = yield Post.create(this.request.body);
+    } catch (error) {
+      this.body = error;
+    }
+  },
+
+  // PUT request
+  update: function *() {
+    try {
+      this.body = yield Post.update(this.params.id, this.request.body);
+    } catch (error) {
+      this.body = error;
+    }
+  },
+
+  // DELETE request
+  delete: function *() {
+    try {
+      this.body = yield Post.destroy(this.params);
+    } catch (error) {
+      this.body = error;
+    }
+  }
+};  
+
+

Router prefix

Keep in mind routes can automatically be prefixed in ./config/general.json with the prefix key. +Let an empty string if you don't want to prefix your API. The prefix must starts with a /, e.g. /api.

Policies and route process

Just because a request matches a route address doesn't necessarily mean it will be passed to that +route's target directly. The request will need to pass through any configured policies first. +Policies are versatile tools for authorization and access control. They let you allow or deny +access to your controllers down to a fine level of granularity.

Policies are defined in the policies directory of every of your APIs.

Each policy file should contain a single function. When it comes down to it, policies are +really just functions which run before your controllers. You can chain as many of them +together as you like. In fact they're designed to be used this way. Ideally, each middleware +function should really check just one thing.

For example to access DELETE /post/:id, the request will go through the isAdmin policy first. +If the policy allows the request, then the delete action from the Post controller is executed.

  {
+    "routes": {
+      "DELETE /post/:id": {
+        "controller": "Post",
+        "action": "delete",
+        "policies": ["isAdmin"]
+      }
+    }
+  }
+

Do not forget to yield next when you need to move on.

+ + + diff --git a/docs/.vuepress/dist/1.x.x/services.html b/docs/.vuepress/dist/1.x.x/services.html new file mode 100644 index 0000000000..6b069bfdb4 --- /dev/null +++ b/docs/.vuepress/dist/1.x.x/services.html @@ -0,0 +1,66 @@ + + + + + + Services | Strapi Docs + + + + + + + +

Services

Services can be thought of as libraries which contain functions that you might want to use +in many places of your application. For example, you might have an Email service which +wraps some default email message boilerplate code that you would want to use in many parts +of your application.

Simply create a JavaScript file containing a function or an object into your +./api/<apiName>/services directory.

For example, you could have an Email service like this:

const nodemailer = require('nodemailer');
+
+module.exports = {
+  sendEmail: function (from, to, subject, text) {
+
+    // Create reusable transporter object using SMTP transport
+    const transporter = nodemailer.createTransport({
+      service: 'Gmail',
+      auth: {
+        user: 'gmail.user@gmail.com',
+        pass: 'userpass'
+      }
+    });
+
+    // Setup e-mail data
+    const options = {
+      from: from,
+      to: to,
+      subject: subject,
+      text: text
+    };
+
+    // Send mail
+    transporter.sendMail(options, function(error, info){
+      if (error) {
+        console.log(error);
+        return false;
+      }
+
+      console.log('Message sent: ' + info.response);
+    });
+  }
+};
+
+ + + diff --git a/docs/.vuepress/dist/1.x.x/sessions.html b/docs/.vuepress/dist/1.x.x/sessions.html new file mode 100644 index 0000000000..221f0b7ca0 --- /dev/null +++ b/docs/.vuepress/dist/1.x.x/sessions.html @@ -0,0 +1,58 @@ + + + + + + Sessions | Strapi Docs + + + + + + + +

Sessions

Since HTTP driven applications are stateless, sessions provide a way to store information +about the user across requests.

Strapi provides "guest" sessions, meaning any visitor will have a session, +authenticated or not. If a session is new a Set-Cookie will be produced regardless +of populating the session.

Strapi only supports cookie sessions, for now.

The current session is available in this.session inside a controller action.

module.exports = {
+  find: function *() {
+
+    // Limit request rate to 100
+    if (this.session.views < 100) {
+      try {
+        this.session.views++;
+        this.body = yield Post.find(this.params);
+      } catch (error) {
+        this.body = error;
+      }
+    } else {
+      this.body = 'You have reached your request rate limit';
+    }
+  }
+};  
+

To destroy an active session, simply set it to null:

module.exports = {
+  logout: function () {
+    try {
+      this.session = null;
+      this.redirect('./');
+    } catch (error) {
+      this.body = error;
+    }
+  }
+};  
+
+ + + diff --git a/docs/.vuepress/dist/1.x.x/testing.html b/docs/.vuepress/dist/1.x.x/testing.html new file mode 100644 index 0000000000..36b7a58066 --- /dev/null +++ b/docs/.vuepress/dist/1.x.x/testing.html @@ -0,0 +1,85 @@ + + + + + + Testing | Strapi Docs + + + + + + + +

Testing

Strapi's test suite is written using mocha and although +Strapi doesn't impose any testing framework for your apps, in this example we +will setup tests using the mocha framework.

Setup

Before writing tests, you should setup a basic directory structure, like this:

./strapiApp
+├── api/
+├── ...
+├── test/
+│  ├── integration/
+│  │  ├── controllers/
+│  │  │  └── my_endpoint.test.js
+│  │  ├── models/
+│  │  │  └── my_model.test.js
+│  │  └── ...
+|  ├── ...
+│  ├── bootstrap.js
+

Boostrap

We are going to setup a bootstrap.js with before and after hooks to +perform any actions before and after our tests.
+In this example, the app server is started before running any tests an stop +the server after tests are completed.

./test/bootstrap.js

const strapi = require('strapi');
+
+before(function (done) {
+  strapi.start({}, function(err) {
+    if (err) {
+      return done(err);
+    }
+
+    done(err, strapi);
+  });
+});
+
+after(function (done) {
+  strapi.stop(done());
+});
+

Writing tests

Once you have setup your directory structure, you can start writing your tests. +In this example we use co-supertest, +a co and Supertest integration library. +Supertest provides several useful +methods for testing HTTP requests.
+If you want to test an api endpoint, you can do it like this:

./test/integration/controllers/my_endpoint.js

const request = require('co-supertest');
+
+describe('MyEndpoint Controller Integration', function() {
+  describe('GET /my_endpoint', function() {
+    it('should return 200 status code', function *() {
+      yield request(strapi.config.url)
+        .get('/my_endpoint')
+        .expect(200)
+        .expect('Content-Type', /json/)
+        .end();
+    });
+  });
+});
+

Running tests

In order to run tests you can use npm test. In your package.json, in the +scripts section, add this:

./package.json

"scripts": {
+  "test": "mocha --require co-mocha test/bootstrap.js test/**/*.test.js"
+}
+

Remember to run test/bootstrap.js before any other tests and, if you want, +use the --require option to pass any required dependencies you need available +in your tests.

+ + + diff --git a/docs/.vuepress/dist/1.x.x/upload.html b/docs/.vuepress/dist/1.x.x/upload.html new file mode 100644 index 0000000000..af3051e78f --- /dev/null +++ b/docs/.vuepress/dist/1.x.x/upload.html @@ -0,0 +1,77 @@ + + + + + + Upload | Strapi Docs + + + + + + + +

Upload

Strapi contains a set of tools to upload files.

Upload config

To change the upload config, edit the ./api/upload/config/settings.json file.

For the config bellow, please use refer to the [co-busboy](https://github.com/cojs/busboy) node module documentation.

{
+  "upload": {
+    "folder": "public/upload",
+    "acceptedExtensions": [
+      "*"
+    ],
+    "headers": {},
+    "highWaterMark": "",
+    "fileHwm": "",
+    "defCharset": "",
+    "preservePath": "",
+    "limits": {
+      "fieldNameSize": "",
+      "fieldSize": "",
+      "fields": "",
+      "fileSize": "",
+      "files": "",
+      "parts": "",
+      "headerPairs": ""
+    }
+  }
+}
+

Upload service

The upload service allows you to easily upload files from anywhere in your application.

Usage as a promise (yieldable) :

yield strapi.api.upload.services.upload.upload(part, this);
+

Upload API

The upload API is a simple API which can be used from your client +(front-end, mobile...) application to upload files.

Route used to upload files:

POST /upload
+

To use this route, you have to submit a HTML form with multipart/* enctype +(or fake it if you are using a web front-end framework like AngularJS).

Response payload:

[
+  {
+    "readable": true,
+    "domain": null,
+    "truncated": false,
+    "fieldname": "file",
+    "filename": "1445421755771-image.jpg",
+    "encoding": "7bit",
+    "transferEncoding": "7bit",
+    "mime": "image/jpeg",
+    "mimeType": "image/jpeg",
+    "originalFilenameFormatted": "image.jpg",
+    "originalFilename": "image.jpg",
+    "template": "default",
+    "lang": "en",
+    "createdAt": "2015-10-21T10:02:35.776Z",
+    "updatedAt": "2015-10-21T10:02:35.776Z",
+    "id": 2
+  }
+]
+

Upload model

Each uploaded file description is registered in the database. So you can retrieve +them whenever you want. However, you can disable this option by overriding the +upload service logic.

+ + + diff --git a/docs/.vuepress/dist/1.x.x/users.html b/docs/.vuepress/dist/1.x.x/users.html new file mode 100644 index 0000000000..684b597a56 --- /dev/null +++ b/docs/.vuepress/dist/1.x.x/users.html @@ -0,0 +1,66 @@ + + + + + + Users | Strapi Docs + + + + + + + +

Users

Most of the web applications require a user management system: registration, login, +reset password, etc.

To avoid you to reinvent the wheel, Strapi embedded a full featured user management +system powered by Grant and JSON Web Token (JWT).

Local Registration

Route used to register a user to your application: POST /auth/local/register.

Request payload:

{
+  "username": "John DOE",
+  "email": "contact@company.com",
+  "password": "123456"
+}
+

Response payload:

{
+  "user": {},
+  "jwt": ""
+}
+

Local Login

Route used to login a user to your application: POST /auth/local.

Request payload:

{
+  "identifier": "contact@company.com",
+  "password": "123456"
+}
+

Response payload:

{
+  "user": {},
+  "jwt": ""
+}
+

Authentication

JWT does not use session. Once you get the token, it has to be stored in front (for +example in the localstorage), and sent within each request. The token can be sent:

  • in the header (Bearer)
  • in the body (token field)
  • in the querystring (token field)

Providers

Thanks to Grant and Purest, you can easily use OAuth and OAuth2 +providers to enable authentication in your application. By default, +Strapi comes with four providers:

  • Facebook
  • Google
  • Github
  • Linkedin2 (Oauth2 Provider for Linkedin)

To use the providers authentication, set your credentials in +./api/user/config/environments/development/grant.json.

Redirect your user to: GET /connect/:provider.

After his approval, he will be redirected to /auth/:provider/callback. The jwt and user will be available in the querystring.

Response payload:

{
+  "user": {},
+  "jwt": ""
+}
+

Custom providers

Strapi comes with 5 providers. If you want to add another one, it can be easily done thanks to Purest, by adding it in the Grant service.

Forgot password

Send an email to the user with an activation code: POST /auth/forgot-password.

Request payload:

{
+  "email": "contact@company.com"
+}
+

Change password

Route used to update the password of a user after he asked for a +"forgot-password" email: POST /auth/change-password.

Request payload:

{
+  "code": "",
+  "password": "123456",
+  "passwordConfirmation": "123456"
+}
+

Response payload:

{
+  "user": {},
+  "jwt": ""
+}
+

Accessing user from requests.

If you want to access attributes of the logged in user, you can use this.user inside of your controller action.

+ + + diff --git a/docs/.vuepress/dist/1.x.x/views.html b/docs/.vuepress/dist/1.x.x/views.html new file mode 100644 index 0000000000..d0a4eae876 --- /dev/null +++ b/docs/.vuepress/dist/1.x.x/views.html @@ -0,0 +1,67 @@ + + + + + + Views | Strapi Docs + + + + + + + +

Views

In Strapi, views are markup templates that are compiled on the server into HTML pages. +In most cases, views are used as the response to an incoming HTTP request.

By default, Strapi doesn't use views. The philosophy of the framework is to +separate the reusable backend application logic from the frontend.

If you want to activate views, set the views in ./config/general.json.

For example, if you want to use lodash for .html files and use it by default, +you may set up your views object as below:

{
+  "views": {
+    "map": {
+      "html": "lodash"
+    },
+    "default": "html"
+  }
+}
+

Views are defined in your application's ./views directory.

Render a view

Simply use this.render instead of this.body to render a view.

You don't need to specify the view extension if you use the default one sets in config.

Using the config we wrote above with lodash for .html files and use the html +extension by default, this example will render ./views/user.html with +Lodash as template engine.

yield this.render('user', {
+  firstname: 'John',
+  lastname: 'Doe'
+});
+
<html>
+  <head>...</head>
+  <body>
+    <p>Firstname: <% firstname %><br>Lastname: <% lastname %></p>
+  </body>
+</html>
+

Here is the same example with the jade extension, not used by default:

yield this.render('user.jade', {
+  firstname: 'John',
+  lastname: 'Doe'
+});
+

Supported template engines

To use a view engine, you should use npm to install it in your project and +set the map object in strapi.config.views. For example, if you want to use +swig for .html files and hogan for .md files, you may configure the +map object as below:

{
+  "views": {
+    "map": {
+      "html": "swig",
+      "md": "hogan"
+    }
+  }
+}
+

Strapi supports all of those view engines:

+ + + diff --git a/docs/.vuepress/dist/3.x.x/SUMMARY.html b/docs/.vuepress/dist/3.x.x/SUMMARY.html new file mode 100644 index 0000000000..43e872beea --- /dev/null +++ b/docs/.vuepress/dist/3.x.x/SUMMARY.html @@ -0,0 +1,23 @@ + + + + + + Summary | Strapi Docs + + + + + + + + + + + diff --git a/docs/.vuepress/dist/3.x.x/advanced/customize-admin.html b/docs/.vuepress/dist/3.x.x/advanced/customize-admin.html new file mode 100644 index 0000000000..ac05843ee4 --- /dev/null +++ b/docs/.vuepress/dist/3.x.x/advanced/customize-admin.html @@ -0,0 +1,164 @@ + + + + + + Admin panel | Strapi Docs + + + + + + + +

Admin panel

One of Strapi's main feature is its fully extendable and customizable admin panel. This section explains how the admin panel section is structured and how to customize it.

See the Contributing Guide for informations on how to develop the Strapi's admin interface.

Files structure

The entire logic of the admin panel is located in a single folder named ./admin/. This directory contains the following structure:

/admin
+└─── admin
+|   └─── build // Webpack generated build of the front-end
+|   └─── src // Front-end directory
+|        └─── app.js // Entry point of the React application
+|        └─── assets // Assets directory containing images,...
+|        └─── components // Admin's React components directory
+|        └─── containers // Admin's high level components directory
+|        └─── favicon.ico // Favicon displayed in web browser
+|        └─── i18n.js // Internalization logic
+|        └─── index.html // Basic html file in which are injected necessary styles and scripts
+|        └─── reducers.js // Redux reducers logic
+|        └─── store.js // Redux store logic
+|        └─── styles // Directory containing the global styles. Specific styles are defined at the component level
+|        └─── translations  // Directory containing text messages for each supported languages
+└─── config
+|    └─── routes.json // Admin's API routes
+|    └─── layout.json // Admin's specific settings
+└─── controllers // Admin's API controllers
+└─── services // Admin's API services
+└─── packages.json // Admin's npm dependencies
+

Customization

The administration panel can be customised according to your needs, so you can make it reflects your identity: colors, fonts, logo, etc.

Change access URL

By default, the administration panel is exposed via http://localhost:1337/admin. However, for security reasons, you can easily update this path.

Path — ./config/environment/**/server.json.

{
+  "host": "localhost",
+  "port": 1337,
+  "autoReload": {
+    "enabled": true
+  },
+  "cron": {
+    "enabled": false
+  },
+  "admin": {
+    "path": "/dashboard"
+  }
+}
+

The panel will be available through http://localhost:1337/dashboard with the configurations above.

Development mode

Note that to modify the administration panel, your project needs to be created with using the dev flag, an example of such would be: strapi new strapi --dev.

#1 — Install its own dependencies

Run npm install from the ./admin folder.

#2 — Launch the development server

Run npm start from the ./admin folder. That's all.

#3 — Go to the browser

You should be able to see the admin at http://localhost:4000/admin.

In development, all the plugins of your app are mounted in the same build as the administration panel.

Colors

Admin's styles use PostCSS, and more precisely PostCSS-SCSS. In this way, colors are stored in variables. The values of these variables can be easily changed in files located in ./admin/admin/src/styles/variables/.

The changes should be automatically visible.

Fonts

Fonts can also be overridden:

  • Add the fonts files you need in ./admin/admin/src/styles/fonts.
  • Import them from ./admin/admin/src/styles/base/fonts.scss.
  • Use them by replacing the variables' values in ./admin/admin/src/styles/variables/variables.bootstrap.scss.

To change the top-left displayed admin panel's logo, replace the image located at ./admin/admin/src/assets/images/logo-strapi.png.

make sure the size of your image is the same as the existing one (434px x 120px).


Build

To build the administration, run the following command from the root directory of your project.

npm run setup
+

This will replace the folder's content located at ./admin/admin/build. Visit http://localhost:1337/admin/ to make sure your updates have been taken in account.

After you have built the admininistration you can now create a new project to develop your API with the changes implemented.

You should now create a project without --dev


Deployment

The administration is nothing more than a React front-end application calling an API. The front-end and the back-end are independent and can be deployed on different servers which brings us to different scenarios:

  1. Deploy the entire project on the same server.
  2. Deploy the administration panel on another server (AWS S3, Azure, etc) than the API.
  3. Deploy the administration panel and the plugins on another server than the API.

Let's dive into the build configurations for each case.

Deploy the entire project on the same server.

You don't need to touch anything in your configuration file. This is the default behaviour and the build configurations will be automatically set. The server will start on the defined port and the administration panel will be accessible through http://yourdomain.com:1337/dashboard.

You might want to change the path to access to the administration panel. Here the required configurations to change the path:

Path — ./config/environment/**/server.json.

{
+  "host": "localhost",
+  "port": 1337,
+  "autoReload": {
+    "enabled": false
+  },
+  "cron": {
+    "enabled": false
+  },
+  "admin": {
+    "path": "/dashboard" // We change the path to access to the admin (highly recommended for security reasons).
+  }
+}
+

You have to rebuild the administration panel to make this work. Please follow the step #2 of the deployment guide.

Deploy the administration panel on another server (AWS S3, Azure, etc) than the API.

It's very common to deploy the front-end and the back-end on different servers. Here the required configurations to handle this case:

Path — ./config/environment/**/server.json.

{
+  "host": "localhost",
+  "port": 1337,
+  "autoReload": {
+    "enabled": false
+  },
+  "cron": {
+    "enabled": false
+  },
+  "admin": {
+    "path": "/dashboard",
+    "build": {
+      "host": "/",  // Note: The administration will be accessible from the root of the domain (ex: http//yourfrontend.com/)
+      "backend": "http://yourbackend.com",
+      "plugins": {
+        "source": "backend" // What does it means? The script tags in the index.html will use the backend value to load the plugins (ex: http://yourbackend.com/dashboard/content-manager/main.js).
+      }
+    }
+  }
+}
+

The administration URL will be http://yourfrontend.com and every request from the panel will hit the backend at http://yourbackend.com. The plugins will be injected through the origin (means the API itself). In other words, the plugins URLs will be http://yourbackend.com/dashboard/content-manager/main.js.

How it is possible? The API (the Strapi server) owns the plugin and these plugins are exposed through http://yourbackend.com/admin/**/main.js

The DOM should look like this:

Path — ./admin/admin/build/index.html.

<html>
+  <head></head>
+  <body>
+    <div id="app"></div>
+    <script type="text/javascript" src="/vendor.dll.js"></script>
+    <script type="text/javascript" src="/main.js"></script>
+    <script src="http://yourbackend.com/dashboard/content-manager/main.js"></script>
+    <script src="http://yourbackend.com/dashboard/settings-manager/main.js"></script>
+    <script src="http://yourbackend.com/dashboard/content-type-builder/main.js"></script>
+  </body>
+</html>
+

The plugins are injected using the ./admin/admin/build/config/plugins.json. To see the plugins URLs in the index.html, you need to launch the administration panel in the browser.

Deploy the administration panel and the plugins on another server than the API

In this case, we suppose that you decided to put your administration and the plugins on the same server but on a different server as the API.

Path — ./config/environment/**/server.json.

{
+  "host": "localhost",
+  "port": 1337,
+  "autoReload": {
+    "enabled": false
+  },
+  "cron": {
+    "enabled": false
+  },
+  "admin": {
+    "build": {
+      "host": "http://yourfrontend.com/dashboard", // Note: The custom path has moved directly in the host URL.
+      "backend": "http://yourbackend.com",
+      "plugins": {
+        "source":  "host", // What does it means? The script tags in the index.html will use the host value to load the plugins (ex: http://yourfrontend.com/dashboard/plugins/content-manager/main.js).
+        "folder": "/plugins"
+      }
+    }
+  }
+}
+

The administration URL will be http://yourfrontend.com/dashboard and every request from the panel will hit the backend at http://yourbackend.com. The plugins will be injected through the host. It means that the plugins URLs will use the host URL as the origin. So the plugins URLs will be http://yourfrontend.com/dashboard/plugins/content-manager/main.js.

We also added a folder setting to separate the plugins from the administration build. In your server, the files structure should look like this:

- src/
+  - 0bd35bad03d09ca61ac6cce225112e36.svg
+  - 1d51d8767683a24635702f720cda4e26.svg
+  - af3aefd0529349e40e4817c87c620836.png
+  - config/
+    - plugins.json
+  - main.js
+  - main.js.map
+  - plugins/
+    - content-type-builder/
+      - 0bd35bad03d09ca61ac6cce225112e36.svg
+      - 1d51d8767683a24635702f720cda4e26.svg
+      - af3aefd0529349e40e4817c87c620836.png
+      - main.js
+      - main.js.map
+    - content-manager/
+      - ...
+      - main.js
+      - main.js.map
+    - settings-manager/
+      - ...
+      - main.js
+      - main.js.map
+  - vendor.dll.js
+  - vendor.dll.js.map
+

The generated index.html will look like this:

Path — ./admin/admin/build/index.html.

<html>
+  <head></head>
+  <body>
+    <div id="app"></div>
+    <script type="text/javascript" src="/dashboard/vendor.dll.js"></script>
+    <script type="text/javascript" src="/dashboard/main.js"></script>
+    <script src="/dashboard/plugins/content-manager/main.js"></script>
+    <script src="/dashboard/plugins/settings-manager/main.js"></script>
+    <script src="/dashboard/plugins/content-type-builder/main.js"></script>
+  </body>
+</html>
+

The plugins are injected using the ./admin/admin/build/config/plugins.json. To see the plugins URLs in the index.html, you need to launch the administration panel in the browser.

+ + + diff --git a/docs/.vuepress/dist/3.x.x/advanced/hooks.html b/docs/.vuepress/dist/3.x.x/advanced/hooks.html new file mode 100644 index 0000000000..a996c7aff1 --- /dev/null +++ b/docs/.vuepress/dist/3.x.x/advanced/hooks.html @@ -0,0 +1,110 @@ + + + + + + Hooks | Strapi Docs + + + + + + + +

Hooks

The hooks are modules that add functionality to the core. They are loaded during the server boot. For example, if your project needs to work with a SQL database, your will have to add the hook strapi-hook-bookshelf to be able to connect your app with your database.

Path — ./hooks/documentation/lib/index.js.

const fs = require('fs');
+const path = require('path');
+
+module.exports = strapi => {
+  const hook = {
+
+    /**
+     * Default options
+     */
+
+    defaults: {
+      documentation: {
+        path: '/public/documentation'
+      }
+    },
+
+    /**
+     * Initialize the hook
+     */
+
+    initialize: cb => {
+      try {
+        // Check if documentation folder exist.
+        fs.accessSync(path.resolve(process.cwd(), this.defaults.documentation.path));
+      } catch (e) {
+        // Otherwise, create the folder.
+        fs.mkdirSync(path.resolve(process.cwd(), this.defaults.documentation.path));
+      }
+
+      // This function doesn't really exist,
+      // it's just an example to tell you that you
+      // run your business logic and when it's done
+      // you just need to call the callback `cb`
+      generateDocumentation(path.resolve(process.cwd(), this.defaults.documentation.path), function(err) {
+        if (err) {
+          // Error: it will display the error to the user
+          // and the hook won't be loaded.
+          return cb(err);
+        }
+
+        // Success.
+        cb();
+      });
+    }
+  };
+
+  return hook;
+};
+
  • defaults (object): Contains the defaults configurations. This object is merged to strapi.config.hook.settings.**.
  • initialize (function): Called during the server boot. The callback cb needs to be called. Otherwise, the hook won't be loaded.

Every folder that follows this name pattern strapi-* in your ./node_modules folder will be loaded as a hook. The hooks are accessible through the strapi.hook variable.

Structure

A hook needs to follow the structure below:

/hook
+└─── lib
+     - index.js
+- LICENSE.md
+- package.json
+- README.md
+

The index.js is the entry point to your hook. It should look like the example above.

Dependencies

It happens that a hook has a dependency to another one. For example, the strapi-hook-bookshelf has a dependency to strapi-hook-knex. Without it, the strapi-hook-bookshelf can't work correctly. It also means that the strapi-hook-knex hook has to be loaded before.

To handle this case, you need to update the package.json at the root of your hook.

{
+  "name": "strapi-hook-bookshelf",
+  "version": "x.x.x",
+  "description": "Bookshelf hook for the Strapi framework",
+  "dependencies": {
+    ...
+  },
+  "strapi": {
+    "dependencies": [
+      "strapi-hook-knex"
+    ]
+  }
+}
+

Custom hooks

The framework allows to load hooks from the project directly without having to install them from npm. It's great way to take advantage of the features of the hooks system for code that doesn't need to be shared between apps. To achieve this, you have to create a ./hooks folder at the root of your project and put the hooks into it.

/project
+└─── admin
+└─── api
+└─── config
+└─── hooks
+│   └─── strapi-documentation
+│        - index.js
+│   └─── strapi-server-side-rendering
+│        - index.js
+└─── plugins
+└─── public
+- favicon.ico
+- package.json
+- server.js
+
+ + + diff --git a/docs/.vuepress/dist/3.x.x/advanced/logging.html b/docs/.vuepress/dist/3.x.x/advanced/logging.html new file mode 100644 index 0000000000..3c6e126eb2 --- /dev/null +++ b/docs/.vuepress/dist/3.x.x/advanced/logging.html @@ -0,0 +1,66 @@ + + + + + + Logging | Strapi Docs + + + + + + + +

Logging

Strapi relies on an extremely fast Node.js logger called Pino that includes a shell utility to pretty-print its log files. It provides great performances and doesn't slow down your app. The logger is accessible through the global variable strapi.log or the request's context ctx.log if enabled.

// Folder.js controller
+const fs = require('fs');
+const path = require('path');
+
+module.exports = {
+
+  /**
+   * Retrieve app's folders.
+   *
+   * @return {Object|Array}
+   */
+
+  findFolders: async (ctx) => {
+    try {
+      const folders = fs.readdirSync(path.resolve(process.cwd()));
+
+      strapi.log.info(folders); // ctx.log.info(folders);
+
+      ctx.send(folders);
+    } catch (error) {
+      strapi.log.fatal(error); // ctx.log.fatal(error);
+      ctx.badImplementation(error.message);
+    }
+  }
+}
+

Global logger configuration

The global logger is configured by environment variables.

STRAPI_LOG_LEVEL: Can be 'fatal', 'error', 'warn', 'info', 'debug' or 'trace'. +STRAPI_LOG_TIMESTAMP: Can be true/false +STRAPI_LOG_PRETTY_PRINT: Can be true/false +STRAPI_LOG_FORCE_COLOR: Can be true/false

Request logging middleware

To configure the request-logger middleware, you have to edit the following file ./config/environments/*/request.json.

{
+  ...
+  "logger": {
+    "level": "debug",
+    "exposeInContext": true,
+    "requests": true
+  },
+  ...
+}
+
  • level: defines the desired logging level (fatal, error, warn, info, debug, trace).
  • exposeInContext: allows access to the logger through the context.
  • requests: incoming HTTP requests will be logged.

To find more details about the logger API, please refer to the Pino documentation.

+ + + diff --git a/docs/.vuepress/dist/3.x.x/advanced/middlewares.html b/docs/.vuepress/dist/3.x.x/advanced/middlewares.html new file mode 100644 index 0000000000..8a78b828e6 --- /dev/null +++ b/docs/.vuepress/dist/3.x.x/advanced/middlewares.html @@ -0,0 +1,142 @@ + + + + + + Middlewares | Strapi Docs + + + + + + + +

Middlewares

The middlewares are functions which are composed and executed in a stack-like manner upon request. If you are not familiar with the middleware stack in Koa, we highly recommend you to read the Koa's documentation introduction.

Enable the middleware in environments settings

Path — [config/environments/**]

  "urlReader": {
+      "enabled": true
+  }
+

Path — strapi/lib/middlewares/responseTime/index.js.

module.exports = strapi => {
+  return {
+    initialize: function(cb) {
+      strapi.app.use(async (ctx, next) => {
+        const start = Date.now();
+
+        await next();
+
+        const delta = Math.ceil(Date.now() - start);
+
+        // Set X-Response-Time header
+        ctx.set('X-Response-Time', delta + 'ms');
+      });
+
+      cb();
+    }
+  };
+};
+
  • initialize (function): Called during the server boot. The callback cb needs to be called. Otherwise, the middleware won't be loaded into the stack.

The core of Strapi embraces a small list of middlewares for performances, security and great error handling.

  • boom
  • cors
  • cron
  • csp
  • csrf
  • favicon
  • gzip
  • hsts
  • ip
  • language
  • logger
  • p3p
  • parser
  • public
  • responses
  • responseTime
  • router
  • session
  • xframe
  • xss

The following middlewares cannot be disabled: responses, router, logger and boom.

Structure

A middleware needs to follow the structure below:

/middleware
+└─── lib
+     - index.js
+- LICENSE.md
+- package.json
+- README.md
+

The index.js is the entry point to your middleware. It should look like the example above.

Custom middlewares

The framework allows the application to override the default middlewares and add new ones. You have to create a ./middlewares folder at the root of your project and put the middlewares into it.

/project
+└─── admin
+└─── api
+└─── config
+└─── middlewares
+│   └─── responseTime // It will override the core default responseTime middleware
+│        - index.js
+│   └─── views // It will be added into the stack of middleware
+│        - index.js
+└─── plugins
+└─── public
+- favicon.ico
+- package.json
+- server.js
+

Every middleware will be injected into the Koa stack. To manage the load order, please refer to the Middleware order section.

Load order

The middlewares are injected into the Koa stack asynchronously. Sometimes it happens that some of these middlewares need to be loaded in a specific order. To define a load order, we created a dedicated file located in ./config/middleware.json.

Path — ./config/middleware.json.

{
+  "timeout": 100,
+  "load": {
+    "before": [
+      "responseTime",
+      "logger",
+      "cors",
+      "responses"
+    ],
+    "order": [
+      "Define the middlewares' load order by putting their name in this array in the right order"
+    ],
+    "after": [
+      "parser",
+      "router"
+    ]
+  }
+}
+
  • timeout: defines the maximum allowed milliseconds to load a middleware.
  • load: +
    • before: array of middlewares that need to be loaded in the first place. The order of this array matters.
    • order: array of middlewares that need to be loaded in a specific order.
    • after: array of middlewares that need to be loaded at the end of the stack. The order of this array matters.

Examples

Load a middleware at the very first place

Path — ./config/middleware.json

  {
+    "timeout": 100,
+    "load": {
+      "before": [
+        "responseTime",
+        "logger"
+      ],
+      "order": [],
+      "after": []
+    }
+  }
+

The responseTime middleware will be loaded first. Immediately followed by the logger middleware. Then, the others middlewares will be loaded asynchronously.

Load a middleware after another one

Path — ./config/middleware.json.

  {
+    "timeout": 100,
+    "load": {
+      "before": [],
+      "order": [
+        "p3p",
+        "gzip"
+      ],
+      "after": []
+    }
+  }
+

The gzip middleware will be loaded after the p3p middleware. All the others will be loaded asynchronously.

Load a middleware at the very end

Path — ./config/middleware.json.

  {
+    "timeout": 100,
+    "load": {
+      "before": [
+        ...
+      ],
+      "order": [],
+      "after": [
+        "parser",
+        "router"
+      ]
+    }
+  }
+

The router middleware will be loaded at the very end. The parser middleware will be loaded after all the others and just before the router middleware.

Complete example

For this example, we are going to imagine that we have 10 middlewares to load:

  • cors
  • cron
  • favicon
  • gzip
  • logger
  • p3p
  • parser
  • response
  • responseTime
  • router

We assume that we set the ./config/middleware.json file like this:

  {
+    "timeout": 100,
+    "load": {
+      "before": [
+        "responseTime",
+        "logger",
+        "cors",
+      ],
+      "order": [
+        "p3p",
+        "gzip"
+      ],
+      "after": [
+        "parser",
+        "router"
+      ]
+    }
+  }
+

Here is the loader order:

  1. responseTime (loaded at the very first place)
  2. logger
  3. cors
  4. favicon (position order not guarantee)
  5. p3p
  6. cron
  7. gzip (loaded after the p3p middlewares)
  8. response (position order not guarantee)
  9. parser
  10. router (loaded at the very end place)
+ + + diff --git a/docs/.vuepress/dist/3.x.x/advanced/usage-tracking.html b/docs/.vuepress/dist/3.x.x/advanced/usage-tracking.html new file mode 100644 index 0000000000..5b6fd14906 --- /dev/null +++ b/docs/.vuepress/dist/3.x.x/advanced/usage-tracking.html @@ -0,0 +1,30 @@ + + + + + + Usage tracking | Strapi Docs + + + + + + + +

Usage tracking

In order to improve the product and understand how the community is using it, we are collecting non-sensitive data.

Collected data

Here is the list of the collected data and why we need them.

  • UUID Identify the app with a unique identifier.
  • Model names and attributes names Understand what kind of APIs are built with Strapi (content or product or service?)
  • Environment state (development, staging, production) Understand how the developers are using the different configurations? How many projects are started in production mode?
  • Node modules names Are developers integrating Strapi with Stripe? It means that we should develop a plugin to simplify the development process with Stripe. +Are developers using Strapi with strapi-hook-bookshelf or strapi-hook-mongoose? It helps us prioritize the issues.
  • OS Is the community using Windows, Linux or Mac? It helps us prioritize the issues.
  • Build configurations How many people are deploying the admin on another server?

We are not collecting sensitive data such as databases configurations, environment or custom variables. The data are encrypted and anonymised.

GDPR

The collected data are non-sensitive or personal data. We are compliant with the European recommendations (see our Privacy Policy).

Disable

You can disable the tracking by removing the uuid property in the package.json file at the root of your project.

+ + + diff --git a/docs/.vuepress/dist/3.x.x/api-reference/reference.html b/docs/.vuepress/dist/3.x.x/api-reference/reference.html new file mode 100644 index 0000000000..f278044250 --- /dev/null +++ b/docs/.vuepress/dist/3.x.x/api-reference/reference.html @@ -0,0 +1,30 @@ + + + + + + API Reference | Strapi Docs + + + + + + + +

API Reference

strapi.admin

This object contains the controllers, models, services and configurations contained in the ./admin folder.

strapi.app

Returns the Koa instance.

strapi.bootstrap

Returns a Promise. When resolved, it means that the ./config/functions/bootstrap.js has been executed. Otherwise, it throws an error.

You can also access to the bootstrap function through strapi.config.functions.boostrap.

strapi.config

Returns an object that represents the configurations of the project. Every JavaScript or JSON file located in the ./config folder will be parsed into the strapi.config object.

strapi.controllers

Returns an object of the controllers wich is available in the project. Every JavaScript file located in the ./api/**/controllers folder will be parsed into the strapi.controllers object. Thanks to this object, you can access to every controller's actions everywhere in the project.

This object doesn't include the admin's controllers and plugin's controllers.

strapi.hook

Returns an object of the hooks available in the project. Every folder that follows this pattern strapi-* and located in the ./node_modules or /hooks folder will be mounted into the strapi.hook object.

strapi.koaMiddlewares

Returns an object of the Koa middlewares found in the ./node_modules folder of the project. This reference is very useful for the Strapi's core.

strapi.load

Returns a function that parses the configurations, hooks, middlewares and APIs of your app. It also loads the middlewares and hooks with the previously loaded configurations. This method could be useful to update references available through the strapi global variable without having to restart the server. However, without restarting the server, the new configurations will not be taken in account.

strapi.log

Returns the Logger (Pino) instance.

strapi.middleware

Returns an object of the middlewares available in the project. Every folder in the ./middlewares folder will be also mounted into the strapi.middleware object.

strapi.models

Returns an object of models available in the project. Every JavaScript or JSON file located in the ./api/**/models folders will be parsed into the strapi.models object. Also every strapi.models.** object is merged with the model's instance returned by the ORM (Mongoose, Bookshelf). It allows to call the ORM methods through the strapi.models.** object (ex: strapi.models.users.find()).

strapi.plugins

Returns an object of plugins available in the project. Each plugin object contains the associated controllers, models, services and configurations contained in the ./plugins/**/ folder.

strapi.query

Returns a function that will returns the available queries for this model. This feature is only available inside the plugin's files (controllers, services, custom functions). For more details, see the [ORM queries section](../plugin-development/backend-development.md#ORM queries).

strapi.reload

Returns a function that reloads the entire app (with downtime).

strapi.router

Returns the Router (Joi router) instance.

strapi.server

Returns the http.Server instance.

strapi.services

Returns an object of services available in the project. Every JavaScript file located in the ./api/**/services folders will be parsed into the strapi.services object.

strapi.start

Returns a function that loads the configurations, middlewares and hooks. Then, it executes the bootstrap file, freezes the global variable and listens the configured port.

strapi.stop

Returns a function that shuts down the server and destroys the current connections.

strapi.utils

Returns a set of utils.

+ + + diff --git a/docs/.vuepress/dist/3.x.x/cli/CLI.html b/docs/.vuepress/dist/3.x.x/cli/CLI.html new file mode 100644 index 0000000000..2a067d6180 --- /dev/null +++ b/docs/.vuepress/dist/3.x.x/cli/CLI.html @@ -0,0 +1,79 @@ + + + + + + Command Line Interface (CLI) | Strapi Docs + + + + + + + +

Command Line Interface (CLI)

Strapi comes with a full featured Command Line Interface (CLI) which lets you scaffold and manage your project in seconds.


strapi new

Create a new project

strapi new <name>
+
+options: [--dev|--dbclient=<dbclient> --dbhost=<dbhost> --dbport=<dbport> --dbname=<dbname> --dbusername=<dbusername> --dbpassword=<dbpassword> --dbssl=<dbssl> --dbauth=<dbauth>]
+
  • strapi new <name>
    +Generates a new project called <name> and installs the default plugins through the npm registry.

  • strapi new <name> --dev
    +Generates a new project called <name> and creates symlinks for the ./admin folder and each plugin inside the ./plugin folder. It means that the Strapi's development workflow has been set up on the machine earlier.

  • strapi new <name> --dbclient=<dbclient> --dbhost=<dbhost> --dbport=<dbport> --dbname=<dbname> --dbusername=<dbusername> --dbpassword=<dbpassword> --dbssl=<dbssl> --dbauth=<dbauth>
    +Generates a new project called <name> and skip the interactive database configuration and initilize with these options. <dbclient> can be mongo, postgres, mysql, sqlite3 or redis. <dbssl> and <dbauth> are optional.

    See the CONTRIBUTING guide for more details.


strapi generate:api

Scaffold a complete API with its configurations, controller, model and service.

strapi generate:api <name> [<attribute:type>]
+
+options: [--tpl <name>|--plugin <name>]
+
  • strapi generate:api <name>
    +Generates an API called <name> in the ./api folder at the root of your project.

  • strapi generate:api <name> <attribute:type>
    +Generates an API called <name> in the ./api folder at the root of your project. The model will already contain an attribute called <attribute> with the type property set to <type>.

    Example: strapi generate:api product name:string description:text price:integer

  • strapi generate:api <name> --plugin <plugin>
    +Generates an API called <name> in the ./plugins/<plugin> folder.

    Example: strapi generate:api product --plugin content-manager

  • strapi generate:api <name> --tpl <template>
    +Generates an API called <name> in the ./api folder which works with the given <template>. By default, the generated APIs are based on Mongoose.

    Example: strapi generate:api product --tpl bookshelf

The first letter of the filename will be uppercased.

strapi generate:controller

Create a new controller

strapi generate:controller <name>
+
+options: [--api <name>|--plugin <name>]
+
  • strapi generate:controller <name>
    +Generates an empty controller called <name> in the ./api/<name>/controllers folder.

    Example: strapi generate:controller category will create the controller at ./api/category/controllers/Category.js.

  • strapi generate:controller <name> --api <api>
    +Generates an empty controller called <name> in the ./api/<api>/controllers folder.

    Example: strapi generate:controller category --api product will create the controller at ./api/product/controllers/Category.js.

  • strapi generate:controller <name> --plugin <plugin>
    +Generates an empty controller called <name> in the ./plugins/<plugin>/controllers folder.

The first letter of the filename will be uppercased.

strapi generate:model

Create a new model

strapi generate:model <name> [<attribute:type>]
+
+options: [--api <name>|--plugin <name>]
+
  • strapi generate:model <name>
    +Generates an empty model called <name> in the ./api/<name>/models folder. It will create two files. +The first one will be <name>.js which contains your lifecycle callbacks and another <name>.settings.json that will list your attributes and options.

    Example: strapi generate:model category will create these two files ./api/category/models/Category.js and ./api/category/models/Category.settings.json.

  • strapi generate:model <name> <attribute:type>
    +Generates an empty model called <name> in the ./api/<name>/models folder. The file <name>.settings.json will already contain a list of attribute with their associated <type>.

    Example: strapi generate:model category name:string description:text will create these two files ./api/category/models/Category.js and ./api/category/models/Category.settings.json. This last file will contain two attributes name with the type string and description with type text.

  • strapi generate:model <name> --api <api>
    +Generates an empty model called <name> in the ./api/<api>/models folder.

    Example: strapi generate:model category --api product will create these two files:

    • ./api/product/models/Category.js
    • ./api/product/models/Category.settings.json.
  • strapi generate:model <name> --plugin <plugin>
    +Generates an empty model called <name> in the ./plugins/<plugin>/models folder.

The first letter of the filename will be uppercased.

strapi generate:service

Create a new service

strapi generate:service <name>
+
+options: [--api <name>|--plugin <name>]
+
  • strapi generate:service <name>
    +Generates an empty service called <name> in the ./api/<name>/services folder.

    Example: strapi generate:service category will create the service at ./api/category/services/Category.js.

  • strapi generate:service <name> --api <api>
    +Generates an empty service called <name> in the ./api/<api>/services folder.

    Example: strapi generate:service category --api product will create the service at ./api/product/services/Category.js.

  • strapi generate:service <name> --plugin <plugin>
    +Generates an empty service called <name> in the ./plugins/<plugin>/services folder.

The first letter of the filename will be uppercased.

strapi generate:policy

Create a new policy

strapi generate:policy <name>
+
+options: [--api <name>|--plugin <name>]
+
  • strapi generate:policy <name>
    +Generates an empty policy called <name> in the ./config/policies folder.

    Example: strapi generate:policy isAuthenticated will create the policy at ./config/policies/isAuthenticated.js.

  • strapi generate:policy <name> --api <api>
    +Generates an empty policy called <name> in the ./api/<api>/config/policies folder. This policy will be scoped and only accessible by the <api> routes.

    Example: strapi generate:policy isAuthenticated --api product will create the policy at ./api/product/config/policies/isAuthenticated.js.

  • strapi generate:policy <name> --plugin <plugin>
    +Generates an empty policy called <name> in the ./plugins/<plugin>/config/policies folder. This policy will be scoped and accessible only by the <plugin> routes.

strapi generate:plugin

Create a new plugin skeleton.

strapi generate:plugin <name>
+
  • strapi generate:plugin <name>
    +Generates an empty plugin called <name> in the ./plugins folder.

    Example: strapi generate:plugin user will create the plugin at ./plugins/user.

Please refer to the plugin develoment documentation to know more.


strapi install

Install a plugin in the project.

strapi install <name>
+
+options: [--dev]
+
  • strapi install <name>
    +Installs a plugin called <name> in the ./plugins folder.

    Example: strapi install content-type-builder will install the plugin at ./plugins/content-type-builder.

  • strapi install <name> --dev
    +It will create a symlink from the local Strapi repository plugin folder called <name> in the ./plugins folder.

    Example: strapi install content-type-builder --dev will create a symlink from /path/to/the/repository/packages/strapi-plugin-content-type-builder to ./plugins/content-type-builder.

Checkout the CONTRIBUTING guide for more details about the local Strapi development workflow.

WARNING

You have to restart the server to load the plugin into your project.

Please refer to the plugins documentation to know more.


strapi uninstall

Uninstall a plugin from the project.

strapi uninstall <name>
+
  • strapi uninstall <name>
    +Uninstalls a plugin called <name> in the ./plugins folder.

    Example: strapi uninstall content-type-builder will remove the folder at ./plugins/content-type-builder.

Please refer to the plugins documentation to know more.


strapi version

Print the current globally installed Strapi version.

strapi version
+

strapi help

List CLI commands.

strapi help
+
+ + + diff --git a/docs/.vuepress/dist/3.x.x/concepts/concepts.html b/docs/.vuepress/dist/3.x.x/concepts/concepts.html new file mode 100644 index 0000000000..f68bd1b90b --- /dev/null +++ b/docs/.vuepress/dist/3.x.x/concepts/concepts.html @@ -0,0 +1,70 @@ + + + + + + Concepts | Strapi Docs + + + + + + + +

Concepts


Files structure

By default, your project's structure will look like this:

  • /admin: contains the vast majority of the admin's front-end and back-end logic.
  • /api: contains the business logic of your project will be in this folder split in sub-folder per API. +
  • /node_modules: contains the npm's packages used by the project.
  • /config
    • /environments: contains the project's configurations per environment. +
      • /**
        • /development
          • custom.json: contains the custom configurations for this environment.
          • database.json: contains the database connections for this environment.
          • request.json: contains the request settings for this environment.
          • response.json: contains the response settings for this environment.
          • server.json: contains the server settings for this environment.
        • /production
        • /staging
    • /functions: contains lifecycle or generic functions of the project.
    • /locales: contains the translation files used by the built-in i18n feature.
    • application.json: contains the general configurations of the project.
    • custom.json: contains the custom configurations of the project.
    • hook.json: contains the hook settings of the project.
    • language.json: contains the language settings of the project.
    • middleware.json: contains the middleware settings of the project.
  • /hooks: contains the custom hooks of the project.
  • /middlewares: contains the custom middlewares of the project.
  • /plugins: contains the installed plugins in the project.
  • /public: contains the file accessible to the outside world.

Inside the /config folder, every folder will be parsed and injected into the global object strapi.config. Let's say, you added a folder named credentials with two files stripe.json and paypal.json into it. The content of these files will be accessible through strapi.config.credentials.stripe and strapi.config.credentials.paypal.


Controllers

Controllers are JavaScript files which contain a set of methods called actions reached by the client according to the requested route. It means that every time a client requests the route, the action performs the business logic coded and sends back the response. They represent the C in the MVC pattern. In most cases, the controllers will contain the bulk of a project's business logic.

module.exports = {
+  // GET /hello
+  index: async (ctx) => {
+    ctx.send('Hello World!');
+  }
+};
+

In this example, any time a web browser is pointed to the /hello URL on your app, the page will display the text: Hello World!.

Where are the controllers defined?

The controllers are defined in each ./api/**/controllers/ folders. Every JavaScript file put in these folders will be loaded as a controller. They are also available through the strapi.controllers and strapi.api.**.controllers global variables. By convention, controllers' names should be Pascal-cased, so that every word in the file (include the first one) is capitalized User.js, LegalEntity.js.

Please refer to the controllers' guide for more informations.


Filters

Filters are a handy way to request data according to generic parameters. It makes filtering, sorting and paginating easy and reusable (eg. GET /user?_limit=30&name=John).

Please refer to the filters' guide for more informations.


Models

Models are a representation of the database's structure and lifecyle. They are split into two separate files. A JavaScript file that contains the lifecycle callbacks, and a JSON one that represents the data stored in the database and their format. The models also allow you to define the relationships between them.

Path — ./api/user/models/User.js.

module.exports = {
+  // Before saving a value.
+  // Fired before an `insert` or `update` query.
+  beforeSave: (next) => {
+    // Use `this` to get your current object
+    next();
+  },
+
+  // After saving a value.
+  // Fired after an `insert` or `update` query.
+  afterSave: (doc, next) => {
+    next();
+  },
+
+  // ... and more
+};
+

Path — ./api/user/models/User.settings.json.

{
+  "connection": "default",
+  "info": {
+    "name": "user",
+    "description": "This represents the User Model"
+  },
+  "attributes": {
+    "firstname": {
+      "type": "string"
+    },
+    "lastname": {
+      "type": "string"
+    }
+  }
+}
+

In this example, there is a User model which contains two attributes firstname and lastname.

Where are the models defined?

The models are defined in each ./api/**/models/ folder. Every JavaScript or JSON file in these folders will be loaded as a model. They are also available through the strapi.models and strapi.api.**.models global variables. Usable every where in the project, they contain the ORM model object that they are refer to. By convention, models' names should be written in lowercase.

Attributes

A model must contain a list of attributes, and each of these attributes must have a type.

Please refer to the models' guide for more informations about the attributes.

Relations

Many-to-many

Many-to-many associations allow to link an entry to many entry.

Please refer to the many-to-many guide

One-to-many

One-way relationships are useful to link an entry to another.

Please refer to the one-to-many guide

One-to-one

One-way relationships are useful to link an entry to another.

Please refer to the one-to-one guide.

One-way

One-way relationships are useful to link an entry to another. However, only one of the models can be queried with its populated items.

Please refer to the one-way guide.

Lifecycle callbacks

Lifecycle callbacks are functions triggered at specific moments of the queries.

Please refer to the lifecycle callbacks guide.


Internationalization and localization

Internationalization and localization (i18n) allows to adapt the project to different languages and serve the right content to the users. This feature is deeply integrated into the Strapi's core. It will detect the user language preference (locale) and translate the requested content using the translation files.

Please refer to the internationalization's guide.


Plugin

A plugin is like a fully independent sub-application. It has its own business logic with dedicated models, controllers, services, middlewares or hooks. It can also contain an UI integrated into the admin panel to use it easily. It allows to develop or plugin features in a project in a short time span.

Please refer to the plugins documentation for more informations.


Plugin styles

The admin panel uses Bootstrap to be styled on top of solid conventions and reusable CSS classes. It is also using PostCSS and PostCSS SCSS to keep the code maintainable.

Please refer to the plugin front-end development for detailed informations.


Policies

Policies are functions which have the ability to execute specific logic on each request before it reaches the controller's action. They are mostly used for securing business logic easily. +Each route of the project can be associated to an array of policies. For example, you can create a policy named isAdmin, which obviously checks that the request is sent by an admin user, and use it for critical routes.

Policies can be:

  • global: so they can be used within the entire project.
  • scoped: used by single API or plugin.

Where are the policies defined?

The API and plugins policies (scoped) are defined in each ./api/**/config/policies/ folders and plugins. They are respectively exposed through strapi.api.**.config.policies and strapi.plugins.**.config.policies. The global policies are defined at ./config/policies/ and accessible via strapi.config.policies.

Please refer to the policy guide

Global policies

Global policies are reusable through the entire app.

Please refer to the global policy guide

Scoped policies

A policy defined in an API or plugin is usable only from this API or plugin. You don't need any prefix to use it.

Please refer to the scoped policy guide.

Plugin policies

Plugin policies are usable from any app API.

Please refer to the plugin policy guide.

Public Assets

Public assets are static files such as images, video, css, etc that you want to make accessible to the outside world. Every new project includes by default, a folder named ./public.

Please refer to the public configuration for more informations.


Requests

The context object (ctx) contains all the request's related informations.

Please refer to the requests guide for more informations.


Responses

The context object (ctx) contains a list of values and functions useful to manage server responses.

Please refer to the responses guide for more informations.


Routing

./api/**/config/routes.json files define all available routes for the clients.

Please refer to the routing guide for more informations.


Services

Services are a set of reusable functions. They are particularly useful to respect the DRY (don’t repeat yourself) programming concept and to simplify controllers logic.

Please refer to the services guide for more informations.


+ + + diff --git a/docs/.vuepress/dist/3.x.x/configurations/configurations.html b/docs/.vuepress/dist/3.x.x/configurations/configurations.html new file mode 100644 index 0000000000..2ef2b4240a --- /dev/null +++ b/docs/.vuepress/dist/3.x.x/configurations/configurations.html @@ -0,0 +1,185 @@ + + + + + + Configurations | Strapi Docs + + + + + + + +

Configurations

The main configurations of the project are located in the ./config directory. Additional configs can be added in the ./api/**/config folder of each API and plugin by creating JavaScript or JSON files.

Application

Contains the main configurations relative to your project.

Path — ./config/application.json.

{
+  "favicon": {
+    "path": "favicon.ico",
+    "maxAge": 86400000
+  },
+  "public": {
+    "path": "./public",
+    "maxAge": 60000
+  }
+}
+
  • favicon
    • path (string): Path to the favicon file. Default value: favicon.ico.
    • maxAge (integer): Cache-control max-age directive in ms. Default value: 86400000.
  • public
    • path (string): Path to the public folder. Default value: ./public.
    • maxAge (integer): Cache-control max-age directive in ms. Default value: 60000.

Custom

Add custom configurations to the project. The content of this file is available through the strapi.config object.

Example

Path — ./config/custom.json.

{
+  "backendURL": "http://www.strapi.io",
+  "mainColor": "blue"
+}
+

These configurations are accessible through strapi.config.backendURL and strapi.config.mainColor.


Language

As described in the i18n documentation, Strapi includes an internationalization system. This is especially useful to translate API messages (errors, etc.).

Path — ./config/language.json.

{
+  "enabled": true,
+  "defaultLocale": "en_us",
+  "modes": [
+    "query",
+    "subdomain",
+    "cookie",
+    "header",
+    "url",
+    "tld"
+  ],
+  "cookieName": "locale"
+}
+
  • enabled (boolean): Enable or disable i18n. Default value: true.
  • defaultLocale (string): Default locale used by the application. Default value: en_us.
  • modes (array): Methods used to detect client language. Default value: ["query", "subdomain", "cookie", "header", "url", "tld"].
  • cookieName (string): Name of the cookie used to store the locale name. Default value: locale.

Functions

The ./config/functions/ folder contains a set of JavaScript files in order to add dynamic and logic based configurations.

Bootstrap

Path — ./config/functions/bootstrap.js.

The bootstrap function is called at every server start. You can use it to add a specific logic at this moment of your server's lifecycle.

Here are some use cases:

  • Create an admin user if there isn't.
  • Fill the database with some necessary data.
  • Check that the database is up-and-running.

CRON tasks

CRON tasks allow you to schedule jobs (arbitrary functions) for execution at specific dates, with optional recurrence rules. It only uses a single timer at any given time (rather than reevaluating upcoming jobs every second/minute).

Make sure the enabled cron config is set to true in your environment's variables.

The cron format consists of:

*    *    *    *    *    *
+┬    ┬    ┬    ┬    ┬    ┬
+│    │    │    │    │    |
+│    │    │    │    │    └ day of week (0 - 7) (0 or 7 is Sun)
+│    │    │    │    └───── month (1 - 12)
+│    │    │    └────────── day of month (1 - 31)
+│    │    └─────────────── hour (0 - 23)
+│    └──────────────────── minute (0 - 59)
+└───────────────────────── second (0 - 59, OPTIONAL)
+

To define a CRON job, add your logic like bellow:

Path — ./config/functions/cron.js.

module.exports = {
+
+  /**
+   * Simple example.
+   * Every monday at 1am.
+   */
+
+  '0 0 1 * * 1': () => {
+    // Add your own logic here (eg. send a queue of email, create a database backup, etc.).
+  }
+};
+

Locales

The locales directory contains the translations of your API.

Each JSON file located in the folder must have the name of its corresponding translation (eg. en_US.json, fr_FR.json, etc.). Each line defines a translation key and its corresponding value.

Example

Path — ./config/locales/en_US.json.

{
+  "welcome": "Welcome"
+}
+

Take a look at the internationalization's guide for more details.


Environments

Most of the application's configurations are defined by environment. It means that you can specify settings for each environment (development, production, test, etc.).

You can access the config of the current environment through strapi.config.currentEnvironment.


Database

Path — ./config/environments/**/database.json.

  • defaultConnection (string): Connection by default for models which are not related to a specific connection. Default value: default.
  • connections List of all available connections. +
    • default
      • connector (string): Connector used by the current connection. Default value: strapi-hook-mongoose.
      • client (string): Client used to store session. Default value: cookie.
      • key (string): Cookie key name. Default value: strapi.sid
      • maxAge (integer): Time in milliseconds before the session expire. Default value: 86400000.
      • rolling (boolean): Force a session identifier cookie to be set on every response. Default value: false.
      • signed (boolean): httpOnly or not. Default value: true.
      • overwrite (boolean): Can overwrite or not. Default value: true.
      • settings Useful for external session stores such as Redis. +
        • host (string): Database host name. Default value: localhost.
        • port (integer): Database port. Default value: 27017.
        • database (string): Database name. Default value: development.
        • username (string): Username used to establish the connection.
        • password (string): Password used to establish the connection.
        • options (object): List of additional options used by the connector.
        • timezone (string): Set the default behavior for local time (used only for a SQL database). Default value: utc.
    • options Options used for database connection. +
      • ssl (boolean): For ssl database connection.
      • debug (boolean): Show database exchanges and errors.
      • autoMigration (boolean): To disable auto tables/columns creation for SQL database.

Example

Path — ./config/environments/**/database.json.

{
+  "defaultConnection": "default",
+  "connections": {
+    "default": {
+      "connector": "strapi-hook-mongoose",
+      "settings": {
+        "client": "mongo",
+        "host": "localhost",
+        "port": 27017,
+        "database": "development",
+        "username": "fooUsername",
+        "password": "fooPwd"
+      },
+      "options": {
+        "authenticationDatabase": "",
+        "ssl": true,
+        "minimize": true
+      }
+    },
+    "postgres": {
+      "connector": "strapi-hook-bookshelf",
+      "settings": {
+        "client": "postgres",
+        "host": "localhost",
+        "port": 5432,
+        "username": "${process.env.USERNAME}",
+        "password": "${process.env.PWD}",
+        "database": "strapi",
+        "schema": "public"
+      },
+      "options": {
+        "debug": true
+      }
+    },
+    "mysql": {
+      "connector": "strapi-hook-bookshelf",
+      "settings": {
+        "client": "mysql",
+        "host": "localhost",
+        "port": 5432,
+        "username": "strapi",
+        "password": "root",
+        "database": ""
+      },
+      "options": {}
+    },
+    "redis": {
+      "connector": "strapi-redis",
+      "settings": {
+        "port": 6379,
+        "host": "localhost",
+        "password": ""
+      },
+      "options": {
+        "debug": false
+      }
+    }
+  }
+}
+

Please refer to the dynamic configurations section to use global environment variable to configure the databases.


Request

Path — ./config/environments/**/request.json.

  • session
    • enabled (boolean): Enable or disable sessions. Default value: false.
    • client (string): Client used to persist sessions. Default value: redis.
    • settings
      • host (string): Client host name. Default value: localhost.
      • port (integer): Client port. Default value: 6379.
      • database(integer)|String - Client database name. Default value: 10.
      • password (string): Client password. Default value: .
  • logger
    • level (string): Default log level. Default value: debug.
    • exposeInContext (boolean): Expose logger in context so it can be used through strapi.log.info(‘my log’). Default value: true.
    • requests (boolean): Enable or disable requests logs. Default value: false.
  • parser
  • enabled(boolean): Enable or disable parser. Default value: true.
  • multipart (boolean): Enable or disable multipart bodies parsing. Default value: true.
  • router
  • prefix (string): API url prefix (eg. /v1).

The session doesn't work with mongo as a client. The package that we should use is broken for now.


Response

Path — ./config/environments/**/response.json.

  • gzip
  • enabled (boolean): Enable or not GZIP response compression.
  • responseTime
  • enabled (boolean): Enable or not X-Response-Time header to response. Default value: false.

Security

Path — ./config/environments/**/security.json.

  • csrf
    • enabled (boolean): Enable or disable CSRF. Default value: depends on the environment.
    • key (string): The name of the CSRF token added to the model. Default value: _csrf.
    • secret (string): The key to place on the session object which maps to the server side token. Default value: _csrfSecret.
  • csp
    • enabled (boolean): Enable or disable CSP to avoid Cross Site Scripting (XSS) and data injection attacks.
  • p3p
  • enabled (boolean): Enable or disable p3p.
  • hsts
  • enabled (boolean): Enable or disable HSTS.
  • maxAge (integer): Number of seconds HSTS is in effect. Default value: 31536000.
  • includeSubDomains (boolean): Applies HSTS to all subdomains of the host. Default value: true.
  • xframe
    • enabled (boolean): Enable or disable X-FRAME-OPTIONS headers in response.
    • value (string): The value for the header, e.g. DENY, SAMEORIGIN or ALLOW-FROM uri. Default value: SAMEORIGIN.
  • xss
  • enabled (boolean): Enable or disable XSS to prevent Cross Site Scripting (XSS) attacks in older IE browsers (IE8).
  • cors
  • enabled (boolean): Enable or disable CORS to prevent your server to be requested from another domain.
  • origin (string): Allowed URLs (http://example1.com, http://example2.com or allows everyone *). Default value: http://localhost.
  • expose (array): Configures the Access-Control-Expose-Headers CORS header. If not specified, no custom headers are exposed. Default value: ["WWW-Authenticate", "Server-Authorization"].
  • maxAge (integer): Configures the Access-Control-Max-Age CORS header. Default value: 31536000.
  • credentials (boolean): Configures the Access-Control-Allow-Credentials CORS header. Default value: true.
  • methods (array)|String - Configures the Access-Control-Allow-Methods CORS header. Default value: ["GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS", "HEAD"].
  • headers (array): Configures the Access-Control-Allow-Headers CORS header. If not specified, defaults to reflecting the headers specified in the request's Access-Control-Request-Headers header. Default value: ["Content-Type", "Authorization", "X-Frame-Options"].
  • ip
    • enabled (boolean): Enable or disable IP blocker. Default value: false.
    • whiteList (array): Whitelisted IPs. Default value: [].
    • blackList (array): Blacklisted IPs. Default value: [].

Server

Path — ./config/environments/**/server.json.

  • host (string): Host name. Default value: localhost.
  • port (integer): Port on which the server should be running. Default value: 1337.
  • autoReload (boolean): Enable or disabled server reload on files update. Default value: depends on the environment.
  • cron
  • enabled (boolean): Enable or disable CRON tasks to schedule jobs at specific dates. Default value: false.
  • admin
  • path (string): Allow to change the URL to access the admin (default: /admin).
  • build
    • host (string): URL to access the admin panel (default: http://localhost:1337/admin).
    • backend (string): URL that the admin panel and plugins will request (default: http://localhost:1337). +
      • plugins
        • source (string): Define the source mode (origin, host, custom).
        • folder (string): Indicate what the plugins folder in host source mode.

Dynamic configurations

For security reasons, sometimes it's better to set variables through the server environment. It's also useful to push dynamics values into configurations files. To enable this feature into JSON files, Strapi embraces a JSON-file interpreter into his core to allow dynamic value in the JSON configurations files.

Syntax

The syntax is inspired by the template literals ES2015 specifications. These dynamic values are indicated by the Dollar sign and curly braces (${expression}).

Usage

In any JSON configurations files in your project, you can inject dynamic values like this:

Path — ./config/environments/production/database.json.

{
+  "defaultConnection": "default",
+  "connections": {
+    "default": {
+      "connector": "strapi-hook-mongoose",
+      "settings": {
+        "client": "mongo",
+        "uri": "${process.env.DATABASE_URI || ''}",
+        "host": "${process.env.DATABASE_HOST || '127.0.0.1'}",
+        "port": "${process.env.DATABASE_PORT || 27017}",
+        "database": "${process.env.DATABASE_NAME || 'production'}",
+        "username": "${process.env.DATABASE_USERNAME || ''}",
+        "password": "${process.env.DATABASE_PASSWORD || ''}"
+      },
+      "options": {}
+    }
+  }
+}
+

You can't execute functions inside the curly braces. Only strings are allowed.


Database configuration

Configuration files are not multi server friendly. So we create a data store for config you will want to update in production.

Usage

Get settings:

  • environment (string): Sets the environment you want to store the data in. By default it's current environment (can be an empty string if your config is environment agnostic).
  • type (string): Sets if your config is for an api, plugin or core. By default it's core.
  • name (string): You have to set the plugin or api name if type is api or plugin.
  • key (string, required): The name of the key you want to store.
// strapi.store(object).get(object);
+
+// create reusable plugin store variable
+const pluginStore = strapi.store({
+  environment: strapi.config.environment,
+  type: 'plugin',
+  name: 'users-permissions'
+});
+
+await pluginStore.get({key: 'grant'});
+

Set settings:

  • value (any, required): The value you want to store.
// strapi.store(object).set(object);
+
+// create reusable plugin store variable
+const pluginStore = strapi.store({
+  environment: strapi.config.environment,
+  type: 'plugin',
+  name: 'users-permissions'
+});
+
+await pluginStore.set({
+  key: 'grant',
+  value: {
+    ...
+  }
+});
+
+ + + diff --git a/docs/.vuepress/dist/3.x.x/getting-started/installation.html b/docs/.vuepress/dist/3.x.x/getting-started/installation.html new file mode 100644 index 0000000000..5ac3f059bf --- /dev/null +++ b/docs/.vuepress/dist/3.x.x/getting-started/installation.html @@ -0,0 +1,31 @@ + + + + + + Installation | Strapi Docs + + + + + + + +

Installation

Installation is very easy and only takes a few seconds.

Requirements

Please make sure your computer/server meets the following requirements:

  • Node.js >= 9: Node.js is a server platform which runs JavaScript. Installation guide here.
  • MongoDB >= 2.6: MongoDB is a powerful document store. Installation guide here.

Setup

Time to install Strapi!

npm install strapi@alpha -g
+

If you encounter npm permissions issues, change the permissions to npm default directory.

It takes about 20 seconds with a good Internet connection. You can take a coffee ☕️ if you have a slow one.

Having troubles during the installation? Check if someone already had the same issue https://github.com/strapi/strapi/issues. If not, you can post one, or ask for help https://strapi.io/support.

Check installation

Once completed, please check that the installation went well, by running:

strapi -v
+

That should print 3.0.0-alpha.x.

Strapi is installed globally on your computer. Type strapi in your terminal you will have access to every available command lines.


Congrats! Now that Strapi is installed you can create your first API.

+ + + diff --git a/docs/.vuepress/dist/3.x.x/getting-started/quick-start.html b/docs/.vuepress/dist/3.x.x/getting-started/quick-start.html new file mode 100644 index 0000000000..8fb722d0f1 --- /dev/null +++ b/docs/.vuepress/dist/3.x.x/getting-started/quick-start.html @@ -0,0 +1,91 @@ + + + + + + Quick start | Strapi Docs + + + + + + + +

Quick start

This section explains how to handle Strapi for the first time, (check out our tutorial video).

Table of contents:


Create your first project

Creating your first project with Strapi is easy:

#1 — Open your terminal

Open your terminal in the directory you want to create your application in.

#2 — Run the following command line in your terminal:

strapi new my-project
+

Generate a Strapi project

This action creates a new folder named my-project with the entire files structure of a Strapi application.

#3 — Go to your project and launch the server:

In your terminal run the following commands:

cd my-project
+strapi start
+

Start Strapi

Now that your app is running let's see how to create your first user.


Create your first user

In order to use the admin panel and to consume your API you first need to register your first user. This process only happens once if you don't have any user table created and is made to create the admin user that has all the permissions granted for your API.

If your using MongoDB for your database you don't have to create your table manually (it's already handled by Strapi) otherwise you'll have to create your user table first.

To create your first user, start your server (strapi start) and go to : http://localhost:1337/admin.

Register View

Now that your first user is registered let's see how to create your first api.


Create your first API

To create your first API, start your server (strapi start) and go to : http://localhost:1337/admin.

At this point, your application is empty. To create your first API is to use the Content Type Builder plugin: a powerful UI to help you create an API in a few clicks. Let's take the example of an e-commerce API, which manages products.

#1 — Go to the Content Type Builder plugin.

Content Type Builder - Home

#2 — Create a Content Type named Product and submit the form.

Content Type Builder - Create a new Content Type

#3 — Add three fields in this Content Type.

  • A string field named name.
  • A text field named description.
  • A number field named price (with float as number format).

Content Type Builder - List fields in Product

#4 — Save. That's it!

See the CLI documentation for more information on how to do it the hacker way.

Files structure

A new directory has been created in the ./api folder of your application which contains all the needed stuff for your Product Content Type: routes, controllers, services and models. Take a look at the API structure documentation for more informations.

Well done, you created your first API using Strapi!


Manage your data

After creating your first Content Type, it would be great to be able to create, edit or delete entries.

#1 — Go to the Product list by clicking on the link in the left menu (generated by the Content Manager plugin).

Content Type Builder - Home

#2 — Click on the button Add New Product and fill the form.

Content Type Builder - Home

#3 — Save! You can edit or delete this entry by clicking on the icons at the right of the row.

Content Type Builder - Home


Consume your API

Your API is now ready and contains data. At this point, you'll probably want to use this data in mobile or desktop applications. +In order to do so, you'll need to allow access to other users (identified as 'Guest').

1 - Go to the Auth & Permissions View by clicking on Auth & Permissions link in the left menu and click on the Guest Role item.

Auth & Permissions - Home

2 - Manage your APIs permissions in the Permissions section of the Edit Guest Role view by enabling or disabling specific actions.

Auth & Permissions - Edit Guest

List entries (GET)

To retrieve the list of products, use the GET /your-content-type route.

Generated APIs provide a handy way to filter and order queries. In that way, ordering products by price is as easy as GET http://localhost:1337/product?_sort=price:asc. For more informations, read the filters documentation

Here is an example using jQuery.

$.ajax({
+  type: 'GET',
+  url: 'http://localhost:1337/product?_sort=price:asc', // Order by price.
+  done: function(products) {
+    console.log('Well done, here is the list of products: ', products);
+  },
+  fail: function(error) {
+    console.log('An error occurred:', error);
+  }
+});
+

Get a specific entry (GET)

If you want to get a specific entry, add the id of the wanted product at the end of the url.

$.ajax({
+  type: 'GET',
+  url: 'http://localhost:1337/product/123', // Where `123` is the `id` of the product.
+  done: function(product) {
+    console.log('Well done, here is the product having the `id` 123: ', product);
+  },
+  fail: function(error) {
+    console.log('An error occurred:', error);
+  }
+});
+

Create data (POST)

Use the POST route to create a new entry.

jQuery example:

$.ajax({
+  type: 'POST',
+  url: 'http://localhost:1337/product',
+  data: {
+    name: 'Cheese cake',
+    description: 'Chocolate cheese cake with ice cream',
+    price: 5
+  },
+  done: function(product) {
+    console.log('Congrats, your product has been successfully created: ', product); // Remember the product `id` for the next steps.
+  },
+  fail: function(error) {
+    console.log('An error occurred:', error);
+  }
+});
+

Update data (PUT)

Use the PUT route to update an existing entry.

jQuery example:

$.ajax({
+  type: 'PUT',
+  url: 'http://localhost:1337/product/123', // Where `123` is the `id` of the product.
+  data: {
+    description: 'This is the new description'
+  },
+  done: function(product) {
+    console.log('Congrats, your product has been successfully updated: ', product.description);
+  },
+  fail: function(error) {
+    console.log('An error occurred:', error);
+  }
+});
+

Delete data (DELETE)

Use the DELETE route to delete an existing entry.

jQuery example:

$.ajax({
+  type: 'DELETE',
+  url: 'http://localhost:1337/product/123', // Where `123` is the `id` of the product.
+  done: function(product) {
+    console.log('Congrats, your product has been successfully deleted: ', product);
+  },
+  fail: function(error) {
+    console.log('An error occurred:', error);
+  }
+});
+

Congratulations! You successfully finished the Getting Started guide! Read the concepts to understand more advanced concepts.

Also, feel free to join the community thanks to the different channels listed in the community page: team members, contributors and developers will be happy to help you.

+ + + diff --git a/docs/.vuepress/dist/3.x.x/guides/authentication.html b/docs/.vuepress/dist/3.x.x/guides/authentication.html new file mode 100644 index 0000000000..202238f319 --- /dev/null +++ b/docs/.vuepress/dist/3.x.x/guides/authentication.html @@ -0,0 +1,126 @@ + + + + + + Authentication | Strapi Docs + + + + + + + +

Authentication

WARNING

This feature requires the Users & Permissions plugin (installed by default).

Register a new user

This route lets you create new users.

Usage

$.ajax({
+  type: 'POST',
+  url: 'http://localhost:1337/auth/local/register',
+  data: {
+    username: 'Strapi user',
+    email: 'user@strapi.io',
+    password: 'strapiPassword'
+  },
+  done: function(auth) {
+    console.log('Well done!');
+    console.log('User profile', auth.user);
+    console.log('User token', auth.jwt);
+  },
+  fail: function(error) {
+    console.log('An error occurred:', error);
+  }
+});
+

Login.

This route lets you login your users by getting an authentication token.

Local

  • The identifier param can either be an email or a username.
$.ajax({
+  type: 'POST',
+  url: 'http://localhost:1337/auth/local',
+  data: {
+    identifier: 'user@strapi.io',
+    password: 'strapiPassword'
+  },
+  done: function(auth) {
+    console.log('Well done!');
+    console.log('User profile', auth.user);
+    console.log('User token', auth.jwt);
+  },
+  fail: function(error) {
+    console.log('An error occurred:', error);
+  }
+});
+

Providers

Thanks to Grant and Purest, you can easily use OAuth and OAuth2 +providers to enable authentication in your application. By default, +Strapi comes with the following providers:

👀   See our complete example with detailed tutorials for each provider (with React)


To use the providers authentication, set your credentials in the admin interface (Plugin Users & Permissions > Providers). +Then update and enable the provider you want use.

Redirect your user to: GET /connect/:provider. eg: GET /connect/facebook

After his approval, he will be redirected to /auth/:provider/callback. The jwt and user data will be available in the body response.

Response payload:

{
+  "user": {},
+  "jwt": ""
+}
+

Use your token to be identified as a user.

By default, each API request is identified as guest role (see permissions of guest's role in your admin dashboard). To make a request as a user, you have to set the Authorization token in your request headers. You receive a 401 error if you are not authorized to make this request or if your authorization header is not correct.

Usage

  • The token variable is the data.jwt received when login in or registering.
$.ajax({
+  type: 'GET',
+  url: 'http://localhost:1337/article',
+  headers: {
+    Authorization: `Bearer ${token}`
+  },
+  done: function(data) {
+    console.log('Your data', data);
+  },
+  fail: function(error) {
+    console.log('An error occurred:', error);
+  }
+});
+

Send forgot password request.

This action sends an email to a user with the link of you reset password page. This link contains an URL param code which is required to reset user password.

Usage

  • email is your user email.
  • url is the url link that user will receive.
$.ajax({
+  type: 'POST',
+  url: 'http://localhost:1337/auth/forgot-password',
+  data: {
+    email: 'user@strapi.io',
+    url: 'http://mon-site.com/rest-password'
+  },
+  done: function() {
+    console.log('Your user received an email');
+  },
+  fail: function(error) {
+    console.log('An error occurred:', error);
+  }
+});
+

Received link url format http://mon-site.com/rest-password?code=privateCode

Reset user password.

This action will reset the user password.

Usage

  • code is the url params received from the email link (see forgot password)
$.ajax({
+  type: 'POST',
+  url: 'http://localhost:1337/auth/reset-password',
+  data: {
+    code: 'privateCode',
+    password: 'myNewPassword',
+    passwordConfirmation: 'myNewPassword'
+  },
+  done: function() {
+    console.log('Your user password is reset');
+  },
+  fail: function(error) {
+    console.log('An error occurred:', error);
+  }
+});
+

User Object In Strapi Context

The User object is available to successfully authenticated requests.

Usage

  • The authenticated user object is a property of ctx.state.
  create: async (ctx) => {
+
+    const { _id } = ctx.state.user
+
+    const depositObj = {
+      ...ctx.request.body,
+      depositor: _id
+    }
+
+    const data = await strapi.services.deposit.add(depositObj);
+
+    // Send 201 `created`
+    ctx.created(data);
+  }
+
+

Email templates

See the documentation on GitHub

+ + + diff --git a/docs/.vuepress/dist/3.x.x/guides/controllers.html b/docs/.vuepress/dist/3.x.x/guides/controllers.html new file mode 100644 index 0000000000..e7a9c30b50 --- /dev/null +++ b/docs/.vuepress/dist/3.x.x/guides/controllers.html @@ -0,0 +1,44 @@ + + + + + + Controllers | Strapi Docs + + + + + + + +

Controllers

See the controllers' concepts for details.

How to create a controller?

There are two ways to create a controller:

  • Using the CLI strapi generate:controller user. Read the CLI documentation for more information.
  • Manually create a JavaScript file named User.js in ./api/**/controllers which contains at least one endpoint.

Adding Endpoints

Each controller’s action must be an async function and receives the context (ctx) object as first parameter containing the request context and the response context. The action has to be bounded by a route.

Example

In this example, we are defining a specific route in ./api/hello/config/routes.json that takes Hello.index as handler. It means that every time a web browser is pointed to the /hello URL, the server will called the index action in the Hello.js controller. Our index action will return Hello World!. You can also return a JSON object.

Path — ./api/hello/config/routes.json.

{
+  "routes": [
+    {
+      "method": "GET",
+      "path": "/hello",
+      "handler": "Hello.index"
+    }
+  ]
+}
+

Path — ./api/hello/controllers/Hello.js.

module.exports = {
+  // GET /hello
+  index: async (ctx) => {
+    ctx.send('Hello World!');
+  }
+};
+

A route handler can only access the controllers defined in the ./api/**/controllers folders.

+ + + diff --git a/docs/.vuepress/dist/3.x.x/guides/deployment.html b/docs/.vuepress/dist/3.x.x/guides/deployment.html new file mode 100644 index 0000000000..85785f54db --- /dev/null +++ b/docs/.vuepress/dist/3.x.x/guides/deployment.html @@ -0,0 +1,42 @@ + + + + + + Deployment | Strapi Docs + + + + + + + +

Deployment

#1 - Configurate

Update the production settings with the IP and domain name where the project will be running.

Path — ./config/environments/production/server.json.

{
+  "host": "domain.io", // IP or domain
+  "port": 1337,
+  "autoReload": {
+    "enabled": false
+  },
+  "admin": {
+    "path": "/dashboard" // We highly recommend to change the default `/admin` path for security reasons.
+  }
+}
+

⚠️ If you changed the path to access to the administration, the step #2 is required.

#2 - Setup (optional)

Run this following command to install the dependencies and build the project with your custom configurations.

cd /path/to/the/project
+npm run setup
+

To display the build logs use the --debug option npm run setup --debug.

#3 - Launch the server

Run the server with the production settings.

NODE_ENV=production npm start
+

WARNING

We highly recommend to use pm2 to manage your process.

Advanced configurations

If you want to host the administration on another server than the API, please take a look at this dedicated section.

+ + + diff --git a/docs/.vuepress/dist/3.x.x/guides/email.html b/docs/.vuepress/dist/3.x.x/guides/email.html new file mode 100644 index 0000000000..c9e8325261 --- /dev/null +++ b/docs/.vuepress/dist/3.x.x/guides/email.html @@ -0,0 +1,38 @@ + + + + + + Email | Strapi Docs + + + + + + + +

Email

WARNING

This feature requires the Email plugin (installed by default).

Thanks to the plugin Email, you can send email on your server or externals providers such as Sendgrid.

Usage

await strapi.plugins['email'].services.email.send({
+  to: 'admin@strapi.io',
+  from: 'robbot@strapi.io',
+  replyTo: 'no-reply@strapi.io',
+  subject: 'Use strapi email provider successfully',
+  text: 'Hello world!',
+  html: 'Hello world!'
+});
+

Install providers

By default Strapi provides a local email system. You might want to send email with Sendgrid or another provider.

To install a new provider run:

$ npm install strapi-email-sendgrid@alpha --save
+

We have two providers available strapi-email-sendgrid and strapi-upload-mailgun, use the alpha tag to install one of them. Then, visit /admin/plugins/email/configurations/development on your web browser and configure the provider.

If you want to create your own, make sure the name starts with strapi-email- (duplicating an existing one will be easier to create), modify the auth config object and customize the send functions.

Check all community providers available on npmjs.org - Providers list

+ + + diff --git a/docs/.vuepress/dist/3.x.x/guides/filters.html b/docs/.vuepress/dist/3.x.x/guides/filters.html new file mode 100644 index 0000000000..1ecdff7294 --- /dev/null +++ b/docs/.vuepress/dist/3.x.x/guides/filters.html @@ -0,0 +1,55 @@ + + + + + + Filters | Strapi Docs + + + + + + + +

Filters

See the filters' concepts for details.

by default, the filters can only be used from find endpoints generated by the Content Type Builder and the CLI. If you need to implement a filters system somewhere else, read the programmatic usage section.

Available operators

The available operators are separated in four different categories:

Filters

Easily filter results according to fields values.

  • =: Equals
  • _ne: Not equals
  • _lt: Lower than
  • _gt: Greater than
  • _lte: Lower than or equal to
  • _gte: Greater than or equal to
  • _contains: Contains
  • _containss: Contains case sensitive

Examples

Find users having John as first name.

GET /user?firstName=John

Find products having a price equal or greater than 3.

GET /product?price_gte=3

Sort

Sort according to a specific field.

Example

Sort users by email.

  • ASC: GET /user?_sort=email:asc
  • DESC: GET /user?_sort=email:desc

Limit

Limit the size of the returned results.

Example

Limit the result length to 30.

GET /user?_limit=30

Start

Skip a specific number of entries (especially useful for pagination).

Example

Get the second page of results.

GET /user?_start=10&_limit=10

Programmatic usage

Requests system can be implemented in custom code sections.

Extracting requests filters

To extract the filters from an JavaScript object or a request, you need to call the strapi.utils.models.convertParams helper.

The returned objects is formatted according to the ORM used by the model.

Example

Path — ./api/user/controllers/User.js.

// Define a list of params.
+const params = {
+  '_limit': 20,
+  '_sort': 'email'
+};
+
+// Convert params.
+const formattedParams = strapi.utils.models.convertParams('user', params); // { limit: 20, sort: 'email' }
+

Query usage

Example

Path — ./api/user/controllers/User.js.

module.exports = {
+
+  find: async (ctx) => {
+    // Convert params.
+    const formattedParams = strapi.utils.models.convertParams('user', ctx.request.query);
+
+    // Get the list of users according to the request query.
+    const filteredUsers = await User
+      .find()
+      .where(formattedParams.where)
+      .sort(formattedParams.sort)
+      .skip(formattedParams.start)
+      .limit(formattedParams.limit);
+
+    // Finally, send the results to the client.
+    ctx.body = filteredUsers;
+  };
+};
+
+ + + diff --git a/docs/.vuepress/dist/3.x.x/guides/graphql.html b/docs/.vuepress/dist/3.x.x/guides/graphql.html new file mode 100644 index 0000000000..5e4fb65a55 --- /dev/null +++ b/docs/.vuepress/dist/3.x.x/guides/graphql.html @@ -0,0 +1,414 @@ + + + + + + GraphQL | Strapi Docs + + + + + + + +

GraphQL

WARNING

This feature requires the GraphQL plugin (not installed by default).

Usage

To get started with GraphQL in your app, please install the plugin first. To do that, open your terminal and run the following command:

strapi install graphql
+

Then, start your app and open your browser at http://localhost:1337/playground. You should see the interface (GraphQL Playground) that will help you to write GraphQL query to explore your data.

Install the ModHeader extension to set the Authorization header in your request

Configurations

By default, the Shadow CRUD feature is enabled and the GraphQL is set to /graphql. You can edit these configurations in the following files.

Path — ./plugins/graphql/config/settings.json.

{
+  "endpoint": "/graphql",
+  "shadowCRUD": true,
+  "depthLimit": 7
+}
+

Query API

In the section, we assume that the Shadow CRUD feature is enabled. For each model, the plugin auto-generates queries which just fit to your needs.

Fetch a single entry
  • id: String
query {
+  user(id: "5aafe871ad624b7380d7a224") {
+    username
+    email
+  }
+}
+
Fetch multiple entries
query {
+  users {
+    username
+    email
+  }
+}
+

Filters

You can also apply different parameters to the query to make more complex queries.

  • limit (integer): Define the number of returned entries.
  • start (integer): Define the amount of entries to skip.
  • sort (string): Define how the data should be sorted.
  • where (object): Define the filters to apply in the query. +
    • <field>: Equals.
    • <field>_ne: Not equals.
    • <field>_lt: Lower than.
    • <field>_lte: Lower than or equal to.
    • <field>_gt: Greater than.
    • <field>_gte: Lower than or equal to.
    • <field>_contains: Contains.
    • <field>_containss: Contains sensitive.

Return the second decade of users which have an email that contains @strapi.io ordered by username.

query {
+  users(limit: 10, start: 10, sort: "username:asc", where: {
+    email_contains: "@strapi.io"
+  }) {
+    username
+    email
+  }
+}
+

Return the users which have been created after the March, 19th 2018 4:21 pm.

query {
+  users(where: {
+    createdAt_gt: "2018-03-19 16:21:07.161Z"
+  }) {
+    username
+    email
+  }
+}
+

Shadow CRUD

To simplify and automate the build of the GraphQL schema, we introduced the Shadow CRUD feature. It automatically generates the type definition, queries and resolvers based on your models. The feature also lets you make complex query with many arguments such as limit, sort, start and where.

Example

If you've generated an API called Post using the CLI strapi generate:api post or the administration panel, your model looks like this:

Path — ./api/post/models/Post.settings.json.

{
+  "connection": "default",
+  "options": {
+    "timestamps": true
+  },
+  "attributes": {
+    "title": {
+      "type": "string"
+    }
+    "content": {
+      "type": "text"
+    },
+    "published": {
+      "type": "boolean"
+    }
+  }
+}
+

The generated GraphQL type and queries will be:

type Post {
+  _id: String
+  created_at: String
+  updated_at: String
+  title: String
+  content: String
+  published: Boolean
+}
+
+type Query {
+  posts(sort: String, limit: Int, start: Int, where: JSON): [Post]
+  post(id: String!): Post
+}
+

The query will use the generated controller's actions as resolvers. It means that the posts query will execute the Post.find action and the post query will use the Post.findOne action.

Aggregation & Grouping

This feature is only available on Mongoose ORM.

Strapi now supports Aggregation & Grouping. +Let's consider again the model mentioned above:

type Post {
+  _id: ID
+  createdAt: String
+  updatedAt: String
+  title: String
+  content: String
+  nb_likes: Int,
+  published: Boolean
+}
+
+

Strapi will generate automatically for you the following queries & types:

Aggregation

type PostConnection {
+  values: [Post]
+  groupBy: PostGroupBy
+  aggregate: PostAggregator
+}
+
+type PostGroupBy {
+  _id: [PostConnection_id]
+  createdAt: [PostConnectionCreatedAt]
+  updatedAt: [PostConnectionUpdatedAt]
+  title: [PostConnectionTitle]
+  content: [PostConnectionContent]
+  nb_likes: [PostConnectionNbLikes],
+  published: [PostConnectionPublished]
+}
+
+type PostConnectionPublished {
+  key: Boolean
+  connection: PostConnection
+}
+
+type PostAggregator {
+  count: Int
+  sum: PostAggregatorSum
+  avg: PostAggregatorAvg
+  min: PostAggregatorMin
+  max: PostAggregatorMax
+}
+
+type PostAggregatorAvg {
+  nb_likes: Float
+}
+
+type PostAggregatorMin { // Same for max and sum
+  nb_likes: Int
+}
+
+type Query {
+  postsConnection(sort: String, limit: Int, start: Int, where: JSON): PostConnection
+}
+

Getting the total count and the average likes of posts:

postsConnection {
+  aggregate {
+    count
+    avg {
+      nb_likes
+    }
+  }
+
+}
+

Let's say we want to do the same query but for only published posts

postsConnection(where: { published: true }) {
+  aggregate {
+    count
+    avg {
+      nb_likes
+    }
+  }
+
+}
+

Gettings the average likes of published and unpublished posts

postsConnection {
+  groupBy {
+    published: {
+      key
+      connection {
+        aggregate {
+          avg {
+            nb_likes
+          }
+        }
+      }
+    }
+  }
+}
+

Result

{
+  data: {
+    postsConnection: {
+      groupBy: {
+        published: [
+          {
+            key: true,
+            connection: {
+              aggregate: {
+                avg {
+                  nb_likes: 10
+                }
+              }
+            }
+          },
+          {
+            key: false,
+            connection: {
+              aggregate: {
+                avg {
+                  nb_likes: 0
+                }
+              }
+            }
+          }
+        ]
+      }
+    }
+  }
+}
+

Customise the GraphQL schema

If you want to define a new scalar, input or enum types, this section is for you. To do so, you will have to create a schema.graphql file. This file has to be placed into the config folder of each API ./api/*/config/schema.graphql or plugin ./plugins/*/config/schema.graphql.

Structure — schema.graphql.

module.exports = {
+  definition: ``,
+  query: ``,
+  type: {},
+  resolver: {
+    Query: {}
+  }
+};
+
  • definition (string): let's you define new type, input, etc.
  • query (string): where you add custom query.
  • type (object): allows you to add description, deprecated field or disable the Shadow CRUD feature on a specific type.
  • resolver (object): +
    • Query (object): let's you define custom resolver, policies for a query.

Example

Let say we are using the same previous Post model.

Path — ./api/post/config/schema.graphql.

module.exports = {
+  definition: `
+    enum PostStatusInput {
+      draft
+      reviewing
+      reviewed
+      published
+      deleted
+    }
+  `,
+  query: `
+    postsByAuthor(id: String, status: PostStatusInput, limit: Int): [Post]!
+  `,
+  resolver: {
+    Query: {
+      post: {
+        description: 'Return a single post',
+        policy: ['plugins.users-permissions.isAuthenticated', 'isOwner'], // Apply the 'isAuthenticated' policy of the `Users & Permissions` plugin, then the 'isOwner' policy before executing the resolver.
+      },
+      posts: {
+        description: 'Return a list of posts', // Add a description to the query.
+        deprecated: 'This query should not be used anymore. Please consider using postsByAuthor instead.'
+      },
+      postsByAuthor: {
+        description: 'Return the posts published by the author',
+        resolver: 'Post.findByAuthor'
+      },
+      postsByTags: {
+        description: 'Return the posts published by the author',
+        resolverOf: 'Post.findByTags', // Will apply the same policy on the custom resolver than the controller's action `findByTags`.
+        resolver: (obj, options, ctx) => {
+          // ctx is the context of the Koa request.
+          await strapi.controllers.posts.findByTags(ctx);
+
+          return ctx.body.posts || `There is no post.`;
+        }
+      }
+    }
+  }
+};
+

Define a new type

Edit the definition attribute in one of the schema.graphql files of your project by using the GraphQL Type language string.

The easiest way is to create a new model using the CLI strapi generate:model category --api post, so you don't need to customise anything.

module.exports = {
+  definition: `
+    type Person {
+      id: Int!
+      firstname: String!
+      lastname: String!
+      age: Int
+      children: [Person]
+    }
+  `
+};
+

To explore the data of the new type Person, you need to define a query and associate a resolver to this query.

module.exports = {
+  definition: `
+    type Person {
+      id: Int!
+      firstname: String!
+      lastname: String!
+      age: Int
+      children: [Person]
+    }
+  `,
+  query: `
+    person(id: Int!): Person
+  `,
+  type: {
+    Person: {
+      _description: 'The Person type description', // Set the description for the type itself.
+      firstname: 'The firstname of the person',
+      lastname: 'The lastname of the person',
+      age: {
+        description: 'The age of the person',
+        deprecated: 'We are not using the age anymore, we can find it thanks to our powerful AI'
+      },
+      children: 'The children of the person'
+    }
+  }
+  resolver: {
+    Query: {
+      person: {
+        description: 'Return a single person',
+        resolver: 'Person.findOne' // It will use the action `findOne` located in the `Person.js` controller*.
+      }
+    }
+  }
+};
+

The resolver parameter also accepts an object as a value to target a controller located in a plugin.

module.exports = {
+  ...
+  resolver: {
+    Query: {
+      person: {
+        description: 'Return a single person',
+        resolver: {
+          plugin: 'users-permissions',
+          handler: 'User.findOne' // It will use the action `findOne` located in the `Person.js` controller inside the plugin `Users & Permissions`.
+        }
+      }
+    }
+  }
+};
+

Add description and deprecated reason

One of the most powerful features of GraphQL is the auto-documentation of the schema. The GraphQL plugin allows you to add a description to a type, a field and a query. You can also deprecate a field or a query.

Path — ./api/post/models/Post.settings.json.

{
+  "connection": "default",
+  "info": {
+    "description": "The Post type description"
+  },
+  "options": {
+    "timestamps": true
+  },
+  "attributes": {
+    "title": {
+      "type": "string",
+      "description": "The title of the post",
+      "deprecated": "We are not using the title anymore, it is auto-generated thanks to our powerful AI"
+    },
+    "content": {
+      "type": "text",
+      "description": "The content of the post."
+    },
+    "published": {
+      "type": "boolean",
+      "description": "Is the post published or not. Yes = true."
+    }
+  }
+}
+

It might happens that you want to add a description to a query or deprecate it. To do that, you need to use the schema.graphql file.

Remember: The schema.graphql file has to be placed into the config folder of each API ./api/*/config/schema.graphql or plugin ./plugins/*/config/schema.graphql.

Path — ./api/post/config/schema.graphql.

module.exports = {
+  resolver: {
+    Query: {
+      posts: {
+        description: 'Return a list of posts', // Add a description to the query.
+        deprecated: 'This query should not be used anymore. Please consider using postsByAuthor instead.' // Deprecate the query and explain the reason why.
+      }
+    }
+  }
+};
+

Execute a policy before a resolver

Sometimes a query needs to be only accessible to authenticated user. To handle this, Strapi provides a solid policy system. A policy is a function executed before the final action (the resolver). You can define an array of policy that will be executed in order.

module.exports = {
+  resolver: {
+    Query: {
+      posts: {
+        description: 'Return a list of posts',
+        policy: ['plugins.users-permissions.isAuthenticated', 'isOwner', 'global.logging']
+      }
+    }
+  }
+};
+

In this example, the policy isAuthenticated located in ./plugins/users-permissions/config/policies/isAuthenticated.js will be executed first. Then, the isOwner policy located in the Post API ./api/post/config/policies/isOwner.js. Next, it will execute the logging policy located in ./config/policies/logging.js. Finally, the resolver will be executed.

There is no custom resolver in that case, so it will execute the default resolver (Post.find) provided by the Shadow CRUD feature.

By default, the plugin will execute the actions located in the controllers that has been generated via the Content-Type Builder plugin or the CLI. For example, the query posts is going to execute the logic inside the find action in the Post.js controller. It might happens that you want to execute another action or a custom logic for one of your query.

module.exports = {
+  resolver: {
+    Query: {
+      posts: {
+        description: 'Return a list of posts by author',
+        resolver: 'Post.findByAuthor'
+      }
+    }
+  }
+};
+

In this example, it will execute the findByAuthor action of the Post controller. It also means that the resolver will apply on the posts query the permissions defined on the findByAuthor action (through the administration panel).

The obj parameter is available via ctx.params and the options are available via ctx.query in the controller's action.

Define a custom resolver

module.exports = {
+  resolver: {
+    Query: {
+      posts: {
+        description: 'Return a list of posts by author',
+        resolver: (obj, options, context) => {
+          // You can return a raw JSON object or a promise.
+
+          return [{
+            title: 'My first blog post',
+            content: 'Whatever you want...'
+          }];
+        }
+      }
+    }
+  }
+};
+

You can also execute a custom logic like above. However, the roles and permissions layers won't work.

Apply permissions on a query

It might happens that you want apply our permissions layer on a query. That's why, we created the resolverOf attribute. This attribute defines which are the permissions that should be applied to this resolver. By targeting an action it means that you're able to edit permissions for this resolver directly from the administration panel.

module.exports = {
+  resolver: {
+    Query: {
+      posts: {
+        description: 'Return a list of posts by author',
+        resolverOf: 'Post.find', // Will apply the same policy on the custom resolver than the controller's action `find` located in `Post.js`.
+        resolver: (obj, options, context) => {
+          // You can return a raw JSON object or a promise.
+
+          return [{
+            title: 'My first blog post',
+            content: 'Whatever you want...'
+          }];
+        }
+      }
+    }
+  }
+};
+

Disable a query or a type

To do that, we need to use the schema.graphql like below:

module.exports = {
+  type: {
+    Post: false // The Post type won't be "queriable".
+  }
+  resolver: {
+    Query: {
+      posts: false // The `posts` query will no longer be in the GraphQL schema.
+    }
+  }
+};
+

FAQ

How are the types name defined?

The type name is the global ID of the model. You can find the global ID of a model like that strapi.models[xxx].globalId or strapi.plugins[xxx].models[yyy].globalId.

Where should I put the field description and deprecated reason?

We recommend to put the field description and deprecated reason in the model. Right now, the GraphQL plugin is the only which uses these fields. Another plugin could use this description in the future as well. However, sometimes you don't have the choice, especially when you're defining a custom type.

It's not a bad practice to put the description and deprecated attribute in the schema.graphql, though.

Why are the "createdAt" and "updatedAt" field added to my type?

The plugin detects if the timestamps option is set to true in the model. By default, when you generate an API this option is checked. Set it to false in your model to remove these fields.

+ + + diff --git a/docs/.vuepress/dist/3.x.x/guides/i18n.html b/docs/.vuepress/dist/3.x.x/guides/i18n.html new file mode 100644 index 0000000000..3036998ebc --- /dev/null +++ b/docs/.vuepress/dist/3.x.x/guides/i18n.html @@ -0,0 +1,50 @@ + + + + + + Internationalization | Strapi Docs + + + + + + + +

Internationalization

See the internationalization' concepts for details.

Because an API may need to send different data based on the language of the user, Strapi provides a built-in strategy to handle the internationalization (i18n).

Usage

The i18n method that will allow you to retrieve the right string based on the language is accessible through the request's context.

There are many strategies to define the language that the server should use to return the correct translation. It can be based on the locale query parameter, the cookie or the Accept-Language header.

  • Query: Add the locale parameter in the URL GET /hello/John?locale=en_US.
  • Cookie: Set the locale field in the cookie locale=en\-US;.
  • Header: Set the Accept-Language header with the value en_US.

Please refer to the language configuration

Example

Let's say we want to say Hello John in english and Bonjour Tom in french. We need to use the built-in i18n feature and replace the string based on the received name.

Path — ./api/hello/config/routes.json.

{
+  "routes": [
+    {
+      "method": "GET",
+      "path": "/hello/:name",
+      "handler": "Hello.sayHello"
+    }
+  ]
+}
+

Path — ./api/hello/controllers/Hello.js.

module.exports = {
+  // GET /hello/:name
+  sayHello: async (ctx) => {
+    ctx.send(ctx.i18n.__('Hello %s', ctx.params.name));
+  }
+};
+

You need to define the english and french translation for this key.

Path — ./config/locales/en_US.json.

{
+  "Hello %s": "Hello %s"
+}
+

Path — ./config/locales/fr_FR.json.

{
+  "Hello %s": "Bonjour %s"
+}
+

That's all! The request GET /hello/John?locale=en_US will return Hello John and GET /hello/Tom?locale=fr_FR will return Bonjour Tom.

+ + + diff --git a/docs/.vuepress/dist/3.x.x/guides/models.html b/docs/.vuepress/dist/3.x.x/guides/models.html new file mode 100644 index 0000000000..cd36715488 --- /dev/null +++ b/docs/.vuepress/dist/3.x.x/guides/models.html @@ -0,0 +1,408 @@ + + + + + + Models | Strapi Docs + + + + + + + +

Models

See the models' concepts for details.

How to create a model?

If you are just starting out it is very convenient to generate some models with the Content Type Builder, directly in the admin interface. You can then review the generated model mappings on the code level. The UI takes over a lot of validation tasks and gives you a fast feeling for available features.

Use the CLI, and run the following command strapi generate:model user firstname:string lastname:string. Read the CLI documentation for more informations.

This will create two files located at ./api/user/models:

  • User.settings.json: contains the list of attributes and settings. The JSON format makes the file easily editable.
  • User.js: imports User.settings.json and extends it with additional settings and lifecycle callbacks.

when you create a new API using the CLI (strapi generate:api <name>), a model is automatically created.

Model Information

The info key on the model-json states information about the model. This information is used in the admin interface, when showing the model.

  • name: The name of the model, as shown in admin interface.
  • description: The description of the model.
  • mainField: Determines which model-attribute is shown when displaying the model.

Model options

The options key on the model-json states.

  • idAttribute: This tells the model which attribute to expect as the unique identifier for each database row (typically an auto-incrementing primary key named 'id').
  • idAttributeType: Data type of idAttribute, accepted list of value bellow:

Define the attributes

The following types are currently available:

  • string
  • text
  • integer
  • biginteger
  • float
  • decimal
  • password
  • date
  • time
  • datetime
  • timestamp
  • boolean
  • binary
  • uuid
  • enumeration
  • json
  • email

Validations

You can apply basic validations to the attributes. The following supported validations are only supported by MongoDB connection. +If you're using SQL databases, you should use the native SQL constraints to apply them.

  • required (boolean) — if true adds a required validator for this property.
  • unique (boolean) — whether to define a unique index on this property.
  • max (integer) — checks if the value is greater than or equal to the given minimum.
  • min (integer) — checks if the value is less than or equal to the given maximum.

Security validations +To improve the Developer eXperience when developing or using the administration panel, the framework enhances the attributes with these "security validations":

  • private (boolean) — if true, the attribute will be removed from the server response (it's useful to hide sensitive data).
  • configurable (boolean) - if false, the attribute isn't configurable from the Content Type Builder plugin.

Example

Path — User.settings.json.

{
+  "connection": "default",
+  "info": {
+    "name": "user",
+    "description": "This represents the User Model",
+    "mainField": "email"
+  },
+  "attributes": {
+    "firstname": {
+      "type": "string"
+    },
+    "lastname": {
+      "type": "string"
+    },
+    "email": {
+      "type": "email",
+      "required": true,
+      "unique": true
+    },
+    "password": {
+      "type": "password",
+      "required": true,
+      "private": true
+    },
+    "about": {
+      "type": "description"
+    },
+    "age": {
+      "type": "integer",
+      "min": 18,
+      "max": 99
+    },
+    "birthday": {
+      "type": "date"
+    }
+  }
+}
+

Relations

Refer to the relations concept for more informations about relations type.

One-way

Refer to the one-way concept for informations.

Example

A pet can be owned by someone (a user).

Path — ./api/pet/models/Pet.settings.json.

{
+  "attributes": {
+    "owner": {
+      "model": "user"
+    }
+  }
+}
+

Path — ./api/pet/controllers/Pet.js.

// Mongoose example
+module.exports = {
+  findPetsWithOwners: async (ctx) => {
+    // Retrieve the list of pets with their owners.
+    const pets = Pet
+      .find()
+      .populate('owner');
+
+    // Send the list of pets.
+    ctx.body = pets;
+  }
+}
+

One-to-one

Refer to the one-to-one concept for informations.

Example

A user can have one address. And this address is only related to this user.

Path — ./api/user/models/User.settings.json.

{
+  "attributes": {
+    "address": {
+      "model": "address",
+      "via": "user"
+    }
+  }
+}
+

Path — ./api/address/models/Address.settings.json.

{
+  "attributes": {
+    "user": {
+      "model": "user"
+    }
+  }
+}
+

Path — ./api/user/controllers/User.js.

// Mongoose example
+module.exports = {
+  findUsersWithAddresses: async (ctx) => {
+    // Retrieve the list of users with their addresses.
+    const users = User
+      .find()
+      .populate('address');
+
+    // Send the list of users.
+    ctx.body = users;
+  }
+}
+

Path — ./api/adress/controllers/Address.js.

// Mongoose example
+module.exports = {
+  findArticlesWithUsers: async (ctx) => {
+    // Retrieve the list of addresses with their users.
+    const articles = Address
+      .find()
+      .populate('user');
+
+    // Send the list of addresses.
+    ctx.body = addresses;
+  }
+}
+

One-to-many

Refer to the one-to-many concept for more informations.

Example

A user can have many articles, and an article can be related to one user (author).

Path — ./api/user/models/User.settings.json.

{
+  "attributes": {
+    "articles": {
+      "collection": "article",
+      "via": "author"
+    }
+  }
+}
+

Path — ./api/article/models/Article.settings.json.

{
+  "attributes": {
+    "author": {
+      "model": "user"
+    }
+  }
+}
+

Path — ./api/user/controllers/User.js.

// Mongoose example
+module.exports = {
+  findUsersWithArticles: async (ctx) => {
+    // Retrieve the list of users with their articles.
+    const users = User
+      .find()
+      .populate('articles');
+
+    // Send the list of users.
+    ctx.body = users;
+  }
+}
+

Path — ./api/article/controllers/Article.js.

// Mongoose example
+module.exports = {
+  findArticlesWithAuthors: async (ctx) => {
+    // Retrieve the list of articles with their authors.
+    const articles = Article
+      .find()
+      .populate('author');
+
+    // Send the list of users.
+    ctx.body = users;
+  }
+}
+

Many-to-many

Refer to the many-to-many concept.

Example

A product can be related to many categories, so a category can have many products.

Path — ./api/product/models/Product.settings.json.

{
+  "attributes": {
+    "categories": {
+      "collection": "category",
+      "via": "products",
+      "dominant": true
+    }
+  }
+}
+

The dominant key allows you to define in which table/collection (only for NoSQL databases) should be stored the array that defines the relationship. Because there is no join table in NoSQL, this key is required for NoSQL databases (ex: MongoDB).

Path — ./api/category/models/Category.settings.json.

{
+  "attributes": {
+    "products": {
+      "collection": "product",
+      "via": "categories"
+    }
+  }
+}
+

Path — ./api/product/controllers/Product.js.

// Mongoose example
+module.exports = {
+  findProductsWithCategories: async (ctx) => {
+    // Retrieve the list of products.
+    const products = Product
+      .find()
+      .populate('categories');
+
+    // Send the list of products.
+    ctx.body = products;
+  }
+}
+

Path — ./api/category/controllers/Category.js.

// Mongoose example
+module.exports = {
+  findCategoriesWithProducts: async (ctx) => {
+    // Retrieve the list of categories.
+    const categories = Category
+      .find()
+      .populate('products');
+
+    // Send the list of categories.
+    ctx.body = categories;
+  }
+}
+

Polymorphic

The polymorphic relationships are the solution when you don't know which kind of model will be associated to your entry. A common use case is an Image model that can be associated to many others kind of models (Article, Product, User, etc).

Refer to the upload plugin polymorphic implementation for more informations.

Single vs Many

Let's stay with our Image model which might belongs to a single Article or Product entry.

In other words, it means that a Image entry can be associated to one entry. This entry can be a Article or Product entry.

Path — ./api/image/models/Image.settings.json.

{
+  "attributes": {
+    "related": {
+      "model": "*",
+      "filter": "field"
+    }
+  }
+}
+

Also, our Image model which might belongs to many Article or Product entries.

In other words, it means that a Article entry can relate to the same image than a Product entry.

Path — ./api/image/models/Image.settings.json.

{
+  "attributes": {
+    "related": {
+      "collection": "*",
+      "filter": "field"
+    }
+  }
+}
+

Filter

The filter attribute is optional (but we highly recommend to use every time). If it's provided it adds a new match level to retrieve the related data.

For example, the Product model might have two attributes which are associated to the Image model. To distinguish which image is attached to the cover field and which images are attached to the pictures field, we need to save and provide this to the database.

Path — ./api/article/models/Product.settings.json.

{
+  "attributes": {
+    "cover": {
+      "model": "image",
+      "via": "related",
+    },
+    "pictures": {
+      "collection": "image",
+      "via": "related"
+    }
+  }
+}
+

The value is the filter attribute is the name of the column where the information is stored.

Example

A Image model might belongs to many either Article models or a Product models.

Path — ./api/image/models/Image.settings.json.

{
+  "attributes": {
+    "related": {
+      "collection": "*",
+      "filter": "field"
+    }
+  }
+}
+

Path — ./api/article/models/Article.settings.json.

{
+  "attributes": {
+    "avatar": {
+      "model": "image",
+      "via": "related"
+    }
+  }
+}
+

Path — ./api/article/models/Product.settings.json.

{
+  "attributes": {
+    "pictures": {
+      "collection": "image",
+      "via": "related"
+    }
+  }
+}
+

Path — ./api/image/controllers/Image.js.

// Mongoose example
+module.exports = {
+  findFiles: async (ctx) => {
+    // Retrieve the list of images with the Article or Product entries related to them.
+    const images = Images
+      .find()
+      .populate('related');
+
+    /*
+    [{
+      "_id": "5a81b0fa8c063a53298a934a",
+      "url": "http://....",
+      "name": "john_doe_avatar.png",
+      "related": [{
+        "_id": "5a81b0fa8c063a5393qj934a",
+        "title": "John Doe is awesome",
+        "description": "..."
+      }, {
+        "_id": "5a81jei389ns5abd75f79c",
+        "name": "A simple chair",
+        "description": "..."
+      }]
+    }]
+    */
+
+    // Send the list of files.
+    ctx.body = images;
+  }
+}
+

Path — ./api/article/controllers/Article.js.

// Mongoose example
+module.exports = {
+  findArticlesWithAvatar: async (ctx) => {
+    // Retrieve the list of articles with the avatar (image).
+    const articles = Article
+      .find()
+      .populate('avatar');
+
+    /*
+    [{
+      "_id": "5a81b0fa8c063a5393qj934a",
+      "title": "John Doe is awesome",
+      "description": "...",
+      "avatar": {
+        "_id": "5a81b0fa8c063a53298a934a",
+        "url": "http://....",
+        "name": "john_doe_avatar.png"
+      }
+    }]
+    */
+
+    // Send the list of users.
+    ctx.body = articles;
+  }
+}
+

Path — ./api/product/controllers/Product.js.

// Mongoose example
+module.exports = {
+  findProductWithPictures: async (ctx) => {
+    // Retrieve the list of products with the pictures (images).
+    const products = Product
+      .find()
+      .populate('pictures');
+
+    /*
+    [{
+      "_id": "5a81jei389ns5abd75f79c",
+      "name": "A simple chair",
+      "description": "...",
+      "pictures": [{
+        "_id": "5a81b0fa8c063a53298a934a",
+        "url": "http://....",
+        "name": "chair_position_1.png"
+      }, {
+        "_id": "5a81d22bee1ad45abd75f79c",
+        "url": "http://....",
+        "name": "chair_position_2.png"
+      }, {
+        "_id": "5a81d232ee1ad45abd75f79e",
+        "url": "http://....",
+        "name": "chair_position_3.png"
+      }]
+    }]
+    */
+
+    // Send the list of users.
+    ctx.body = products;
+  }
+}
+

Database implementation

If you're using MongoDB as a database, you don't need to do anything. Everything is natively handled by Strapi. However, to implement a polymorphic relationship with SQL databases, you need to create two tables.

Path — ./api/image/models/Image.settings.json.

{
+  "attributes": {
+    "name": {
+      "type": "string"
+    },
+    "url": {
+      "type": "string"
+    },
+    "related": {
+      "collection": "*",
+      "filter": "field"
+    }
+  }
+}
+

The first table to create is the table which has the same name as your model.

CREATE TABLE `image` (
+  `id` int(11) NOT NULL,
+  `name` text NOT NULL,
+  `text` text NOT NULL
+)
+

If you've overrided the default table name given by Strapi by using the collectionName attribute. Use the value set in the collectionName to name the table.

The second table will allow us to associate one or many others entries to the Image model. The name of the table is the same as the previous one with the suffix _morph.

CREATE TABLE `image_morph` (
+  `id` int(11) NOT NULL,
+  `image_id` int(11) NOT NULL,
+  `related_id` int(11) NOT NULL,
+  `related_type` text NOT NULL,
+  `field` text NOT NULL
+)
+
  • image_id is using the name of the first table with the suffix _id. +
    • Attempted value: It correspond to the id of an Image entry.
  • related_id is using the attribute name where the relation happens with the suffix _id. +
    • Attempted value: It correspond to the id of an Article or Product entry.
  • related_type is using the attribute name where the relation happens with the suffix _type. +
    • Attempted value: It correspond to the table name where the Article or Product entry is stored.
  • field is using the filter property value defined in the model. If you change the filter value, you have to change the name of this column as well. +
    • Attempted value: It correspond to the attribute of a Article, Product with which the Image entry is related.
id image_id related_id related_type field
1 1738 39 product cover
2 4738 58 article avatar
3 1738 71 article avatar

Lifecycle callbacks

Refer to the lifecycle callbacks concepts for informations.

The following events are available by default:

Callbacks on save:

  • beforeSave
  • afterSave

Callbacks on fetch:

  • beforeFetch
  • afterFetch

Callbacks on fetchAll:

  • beforeFetchAll
  • afterFetchAll

Callbacks on create:

  • beforeCreate
  • afterCreate

Callbacks on update:

  • beforeUpdate
  • afterUpdate

Callbacks on destroy:

  • beforeDestroy
  • afterDestroy

Mongoose

The entry is available through the model parameter

Path — ./api/user/models/User.js.

module.exports = {
+ /**
+  * Triggered before user creation.
+  */
+ beforeCreate: async (model) => {
+   // Hash password.
+   const passwordHashed = await strapi.api.user.services.user.hashPassword(model.password);
+
+   // Set the password.
+   model.password = passwordHashed;
+ }
+}
+

Bookshelf

Each of these functions receives a three parameters model, attrs and options. You have to return a Promise.

Path — ./api/user/models/User.js.

module.exports = {
+
+  /**
+   * Triggered before user creation.
+   */
+  beforeCreate: async (model, attrs, options) => {
+    // Hash password.
+    const passwordHashed = await strapi.api.user.services.user.hashPassword(model.attributes.password);
+
+    // Set the password.
+    model.set('password', passwordHashed);
+  }
+}
+

Settings

Additional settings can be set on models:

  • connection (string) - Connection's name which must be used. Default value: default.
  • collectionName (string) - Collection's name (or table's name) in which the data should be stored.
  • globalId (string) -Global variable name for this model (case-sensitive).

Path — User.settings.json.

{
+  "connection": "mongo",
+  "collectionName": "Users_v1",
+  "globalId": "Users",
+  "attributes": {
+
+  }
+}
+

In this example, the model User will be accessible through the Users global variable. The data will be stored in the Users_v1 collection or table and the model will use the mongo connection defined in ./config/environments/**/database.json

The connection value can be changed whenever you want, but you should be aware that there is no automatic data migration process. Also if the new connection doesn't use the same ORM you will have to rewrite your queries.

+ + + diff --git a/docs/.vuepress/dist/3.x.x/guides/policies.html b/docs/.vuepress/dist/3.x.x/guides/policies.html new file mode 100644 index 0000000000..98ef634a91 --- /dev/null +++ b/docs/.vuepress/dist/3.x.x/guides/policies.html @@ -0,0 +1,97 @@ + + + + + + Policies | Strapi Docs + + + + + + + +

Policies

See the policies' concepts for details.

How to create a policy?

There are several ways to create a policy.

  • Using the CLI strapi generate:policy isAuthenticated. Read the CLI documentation for more information.
  • Manually create a JavaScript file named isAuthenticated.js in ./config/policies/.

Path — ./config/policies/isAuthenticated.js.

module.exports = async (ctx, next) => {
+  if (ctx.state.user) {
+    // Go to next policy or will reach the controller's action.
+    return await next();
+  }
+
+  ctx.unauthorized(`You're not logged in!`);
+};
+

In this example, we are verifying that a session is open. If it is the case, we call the next() method that will execute the next policy or controller's action. Otherwise, a 401 error is returned.

You can access to any controllers, services or models thanks to the global variable strapi in a policy.

Usage

To apply policies to a route, you need to associate an array of policies to it. As explained in the policies' concepts, there are two kinds of policies: global or scoped.

Global policies

Refer to the concept for details.

The global policies can be associated to any routes in your project.

Path — ./api/car/routes.json.

{
+  "routes": [
+    {
+      "method": "GET",
+      "path": "/car",
+      "handler": "Car.find",
+      "config": {
+        "policies": [
+          "global.isAuthenticated"
+        ]
+      }
+    }
+  ]
+}
+

Before executing the find action in the Car.js controller, the global policy isAuthenticated located in ./config/policies/isAuthenticated.js will be called.

You can put as much policy you want in this array. However be careful about the performance impact.

Plugins policies

Plugins can add and expose policies into your app. For example, the plugin Auth (COMING SOON) comes with several useful policies to ensure that the user is well authenticated or has the rights to perform an action.

Path — ./api/car/config/routes.json.

{
+  "routes": [
+    {
+      "method": "GET",
+      "path": "/car",
+      "handler": "Car.find",
+      "config": {
+        "policies": [
+          "plugins.auth.isAuthenticated"
+        ]
+      }
+    }
+  ]
+}
+

The policy isAuthenticated located in ./plugins/auth/config/policies/isAuthenticated.js will be executed before the find action in the Car.js controller.

Scoped Policies

The scoped policies can only be associated to the routes defined in the API where they have been declared.

Path — ./api/car/config/policies/isAdmin.js.

module.exports = async (ctx, next) => {
+  if (ctx.state.user.role.name === 'Administrator') {
+    // Go to next policy or will reach the controller's action.
+    return await next();
+  }
+
+  ctx.unauthorized(`You're not allowed to perform this action!`);
+};
+

Path — ./api/car/config/routes.json.

{
+  "routes": [
+    {
+      "method": "GET",
+      "path": "/car",
+      "handler": "Car.find",
+      "config": {
+        "policies": [
+          "isAdmin"
+        ]
+      }
+    }
+  ]
+}
+

The policy isAdmin located in ./api/car/config/policies/isAdmin.js will be executed before the find action in the Car.js controller.

The policy isAdmin can only be applied to the routes defined in the /api/car folder.

Advanced usage

As it's explained above, the policies are executed before the controller's action. It looks like an action that you can make before the controller's action. You can also execute a logic after.

Path — ./config/policies/custom404.js.

module.exports = async (ctx, next) => {
+  // Indicate to the server to go to
+  // the next policy or to the controller's action.
+  await next();
+
+  // The code below will be executed after the controller's action.
+  if (ctx.status === 404) {
+    ctx.body = 'We cannot find the ressource.';
+  }
+};
+
+ + + diff --git a/docs/.vuepress/dist/3.x.x/guides/public-assets.html b/docs/.vuepress/dist/3.x.x/guides/public-assets.html new file mode 100644 index 0000000000..8029752ab9 --- /dev/null +++ b/docs/.vuepress/dist/3.x.x/guides/public-assets.html @@ -0,0 +1,29 @@ + + + + + + Public Assets | Strapi Docs + + + + + + + +

Public Assets

See the public assets concepts for details.

Because an API may need to serve static assets, every new Strapi project includes by default, a folder named /public. Any file located in this directory is accessible if the request's path doesn't match any other defined route and if it matches a public file name.

Example

An image named company-logo.png in ./public/ is accessible through /company-logo.png URL.

index.html files are served if the request corresponds to a folder name (/pictures url will try to serve public/pictures/index.html file).

WARNING

The dotfiles are not exposed. It means that every files with the names start by . such as .htaccess or .gitignore are not served.

Refer to the public assets configurations for more informations.

+ + + diff --git a/docs/.vuepress/dist/3.x.x/guides/requests.html b/docs/.vuepress/dist/3.x.x/guides/requests.html new file mode 100644 index 0000000000..9fb485a8f9 --- /dev/null +++ b/docs/.vuepress/dist/3.x.x/guides/requests.html @@ -0,0 +1,164 @@ + + + + + + Request | Strapi Docs + + + + + + + +

Request

See the requests concepts for details.

The context object (ctx) contains all the requests related informations. They are accessible through ctx.request, from controllers and policies.

API Reference

For more information, please refer to the Koa request documentation.

request.header

Request header object.

request.header=

Set request header object.

request.headers

Request header object. Alias as request.header.

request.headers=

Set request header object. Alias as request.header=.

request.method

Request method.

request.method=

Set request method, useful for implementing middleware +such as methodOverride().

request.length

Return request Content-Length as a number when present, or undefined.

request.url

Get request URL.

request.url=

Set request URL, useful for url rewrites.

request.originalUrl

Get request original URL.

request.origin

Get origin of URL, include protocol and host.

ctx.request.origin
+// => http://example.com
+

request.href

Get full request URL, include protocol, host and url.

ctx.request.href;
+// => http://example.com/foo/bar?q=1
+

request.path

Get request pathname.

request.path=

Set request pathname and retain query-string when present.

request.querystring

Get raw query string void of ?.

request.querystring=

Set raw query string.

Get raw query string with the ?.

request.search=

Set raw query string.

request.host

Get host (hostname:port) when present. Supports X-Forwarded-Host +when app.proxy is true, otherwise Host is used.

request.hostname

Get hostname when present. Supports X-Forwarded-Host +when app.proxy is true, otherwise Host is used.

If host is IPv6, Koa delegates parsing to +WHATWG URL API, +Note This may impact performance.

request.URL

Get WHATWG parsed URL object.

request.type

Get request Content-Type void of parameters such as "charset".

const ct = ctx.request.type;
+// => "image/png"
+

request.charset

Get request charset when present, or undefined:

ctx.request.charset;
+// => "utf-8"
+

request.query

Get parsed query-string, returning an empty object when no +query-string is present. Note that this getter does not +support nested parsing.

For example "color=blue&size=small":

{
+  color: 'blue',
+  size: 'small'
+}
+

request.query=

Set query-string to the given object. Note that this +setter does not support nested objects.

ctx.query = { next: '/login' };
+

request.fresh

Check if a request cache is "fresh", aka the contents have not changed. This +method is for cache negotiation between If-None-Match / ETag, and If-Modified-Since and Last-Modified. It should be referenced after setting one or more of these response headers.

// freshness check requires status 20x or 304
+ctx.status = 200;
+ctx.set('ETag', '123');
+
+// cache is ok
+if (ctx.fresh) {
+  ctx.status = 304;
+  return;
+}
+
+// cache is stale
+// fetch new data
+ctx.body = await db.find('something');
+

request.stale

Inverse of request.fresh.

request.protocol

Return request protocol, "https" or "http". Supports X-Forwarded-Proto +when app.proxy is true.

request.secure

Shorthand for ctx.protocol == "https" to check if a request was +issued via TLS.

request.ip

Request remote address. Supports X-Forwarded-For when app.proxy +is true.

request.ips

When X-Forwarded-For is present and app.proxy is enabled an array +of these ips is returned, ordered from upstream -> downstream. When disabled +an empty array is returned.

request.subdomains

Return subdomains as an array.

Subdomains are the dot-separated parts of the host before the main domain of +the app. By default, the domain of the app is assumed to be the last two +parts of the host. This can be changed by setting app.subdomainOffset.

For example, if the domain is "tobi.ferrets.example.com": +If app.subdomainOffset is not set, ctx.subdomains is ["ferrets", "tobi"]. +If app.subdomainOffset is 3, ctx.subdomains is ["tobi"].

request.is(types...)

Check if the incoming request contains the "Content-Type" +header field, and it contains any of the give mime types. +If there is no request body, null is returned. +If there is no content type, or the match fails false is returned. +Otherwise, it returns the matching content-type.

// With Content-Type: text/html; charset=utf-8
+ctx.is('html'); // => 'html'
+ctx.is('text/html'); // => 'text/html'
+ctx.is('text/*', 'text/html'); // => 'text/html'
+
+// When Content-Type is application/json
+ctx.is('json', 'urlencoded'); // => 'json'
+ctx.is('application/json'); // => 'application/json'
+ctx.is('html', 'application/*'); // => 'application/json'
+
+ctx.is('html'); // => false
+

For example if you want to ensure that +only images are sent to a given route:

if (ctx.is('image/*')) {
+// process
+} else {
+  ctx.throw(415, 'images only!');
+}
+

Content Negotiation

Koa's request object includes helpful content negotiation utilities powered by accepts and negotiator. These utilities are:

  • request.accepts(types)
  • request.acceptsEncodings(types)
  • request.acceptsCharsets(charsets)
  • request.acceptsLanguages(langs)

If no types are supplied, all acceptable types are returned.

If multiple types are supplied, the best match will be returned. If no matches are found, a false is returned, and you should send a 406 "Not Acceptable" response to the client.

In the case of missing accept headers where any type is acceptable, the first type will be returned. Thus, the order of types you supply is important.

request.accepts(types)

Check if the given type(s) is acceptable, returning the best match when true, otherwise false. The type value may be one or more mime type string +such as "application/json", the extension name +such as "json", or an array ["json", "html", "text/plain"].

// Accept: text/html
+ctx.accepts('html');
+// => "html"
+
+// Accept: text/*, application/json
+ctx.accepts('html');
+// => "html"
+ctx.accepts('text/html');
+// => "text/html"
+ctx.accepts('json', 'text');
+// => "json"
+ctx.accepts('application/json');
+// => "application/json"
+
+// Accept: text/*, application/json
+ctx.accepts('image/png');
+ctx.accepts('png');
+// => false
+
+// Accept: text/*;q=.5, application/json
+ctx.accepts(['html', 'json']);
+ctx.accepts('html', 'json');
+// => "json"
+
+// No Accept header
+ctx.accepts('html', 'json');
+// => "html"
+ctx.accepts('json', 'html');
+// => "json"
+

You may call ctx.accepts() as many times as you like, +or use a switch:

switch (ctx.accepts('json', 'html', 'text')) {
+  case 'json': break;
+  case 'html': break;
+  case 'text': break;
+  default: ctx.throw(406, 'json, html, or text only');
+}
+

request.acceptsEncodings(encodings)

Check if encodings are acceptable, returning the best match when true, otherwise false. Note that you should include identity as one of the encodings!

// Accept-Encoding: gzip
+ctx.acceptsEncodings('gzip', 'deflate', 'identity');
+// => "gzip"
+
+ctx.acceptsEncodings(['gzip', 'deflate', 'identity']);
+// => "gzip"
+

When no arguments are given all accepted encodings +are returned as an array:

// Accept-Encoding: gzip, deflate
+ctx.acceptsEncodings();
+// => ["gzip", "deflate", "identity"]
+

Note that the identity encoding (which means no encoding) could be unacceptable if the client explicitly sends identity;q=0. Although this is an edge case, you should still handle the case where this method returns false.

request.acceptsCharsets(charsets)

Check if charsets are acceptable, returning +the best match when true, otherwise false.

// Accept-Charset: utf-8, iso-8859-1;q=0.2, utf-7;q=0.5
+ctx.acceptsCharsets('utf-8', 'utf-7');
+// => "utf-8"
+
+ctx.acceptsCharsets(['utf-7', 'utf-8']);
+// => "utf-8"
+

When no arguments are given all accepted charsets +are returned as an array:

// Accept-Charset: utf-8, iso-8859-1;q=0.2, utf-7;q=0.5
+ctx.acceptsCharsets();
+// => ["utf-8", "utf-7", "iso-8859-1"]
+

request.acceptsLanguages(langs)

Check if langs are acceptable, returning +the best match when true, otherwise false.

// Accept-Language: en;q=0.8, es, pt
+ctx.acceptsLanguages('es', 'en');
+// => "es"
+
+ctx.acceptsLanguages(['en', 'es']);
+// => "es"
+

When no arguments are given all accepted languages +are returned as an array:

// Accept-Language: en;q=0.8, es, pt
+ctx.acceptsLanguages();
+// => ["es", "pt", "en"]
+

request.idempotent

Check if the request is idempotent.

request.socket

Return the request socket.

request.get(field)

Return request header.

+ + + diff --git a/docs/.vuepress/dist/3.x.x/guides/responses.html b/docs/.vuepress/dist/3.x.x/guides/responses.html new file mode 100644 index 0000000000..23997ca95b --- /dev/null +++ b/docs/.vuepress/dist/3.x.x/guides/responses.html @@ -0,0 +1,365 @@ + + + + + + Responses | Strapi Docs + + + + + + + +

Responses

See the responses concepts for details.

API Reference

For more information, please refer to the Koa response documentation.

Context Response

The context object (ctx) contains a list of values and functions useful to manage server responses. They are accessible through ctx.response, from controllers and policies.

response.header

Response header object.

response.headers

Response header object. Alias as response.header.

response.socket

Request socket.

response.status

Get response status. By default, response.status is set to 404 unlike node's res.statusCode which defaults to 200.

response.status=

Set response status via numeric code:

  • 100 "continue"
  • 101 "switching protocols"
  • 102 "processing"
  • 200 "ok"
  • 201 "created"
  • 202 "accepted"
  • 203 "non-authoritative information"
  • 204 "no content"
  • 205 "reset content"
  • 206 "partial content"
  • 207 "multi-status"
  • 208 "already reported"
  • 226 "im used"
  • 300 "multiple choices"
  • 301 "moved permanently"
  • 302 "found"
  • 303 "see other"
  • 304 "not modified"
  • 305 "use proxy"
  • 307 "temporary redirect"
  • 308 "permanent redirect"
  • 400 "bad request"
  • 401 "unauthorized"
  • 402 "payment required"
  • 403 "forbidden"
  • 404 "not found"
  • 405 "method not allowed"
  • 406 "not acceptable"
  • 407 "proxy authentication required"
  • 408 "request timeout"
  • 409 "conflict"
  • 410 "gone"
  • 411 "length required"
  • 412 "precondition failed"
  • 413 "payload too large"
  • 414 "uri too long"
  • 415 "unsupported media type"
  • 416 "range not satisfiable"
  • 417 "expectation failed"
  • 418 "I'm a teapot"
  • 422 "unprocessable entity"
  • 423 "locked"
  • 424 "failed dependency"
  • 426 "upgrade required"
  • 428 "precondition required"
  • 429 "too many requests"
  • 431 "request header fields too large"
  • 500 "internal server error"
  • 501 "not implemented"
  • 502 "bad gateway"
  • 503 "service unavailable"
  • 504 "gateway timeout"
  • 505 "http version not supported"
  • 506 "variant also negotiates"
  • 507 "insufficient storage"
  • 508 "loop detected"
  • 510 "not extended"
  • 511 "network authentication required"

NOTE: don't worry too much about memorizing these strings, +if you have a typo an error will be thrown, displaying this list +so you can make a correction.

response.message

Get response status message. By default, response.message is +associated with response.status.

response.message=

Set response status message to the given value.

response.length=

Set response Content-Length to the given value.

response.length

Return response Content-Length as a number when present, or deduce +from ctx.body when possible, or undefined.

response.body

Get response body.

response.body=

Set response body to one of the following:

  • string written
  • Buffer written
  • Stream piped
  • Object || Array json-stringified
  • null no content response

If response.status has not been set, Koa will automatically set the status to 200 or 204.

String

The Content-Type is defaulted to text/html or text/plain, both with +a default charset of utf-8. The Content-Length field is also set.

Buffer

The Content-Type is defaulted to application/octet-stream, and Content-Length +is also set.

Stream

The Content-Type is defaulted to application/octet-stream.

Whenever a stream is set as the response body, .onerror is automatically added as a listener to the error event to catch any errors. +In addition, whenever the request is closed (even prematurely), the stream is destroyed. +If you do not want these two features, do not set the stream as the body directly. +For example, you may not want this when setting the body as an HTTP stream in a proxy as it would destroy the underlying connection.

See: https://github.com/koajs/koa/pull/612 for more information.

Here's an example of stream error handling without automatically destroying the stream:

const PassThrough = require('stream').PassThrough;
+
+app.use(async ctx => {
+  ctx.body = someHTTPStream.on('error', ctx.onerror).pipe(PassThrough());
+});
+
Object

The Content-Type is defaulted to application/json. This includes plain objects { foo: 'bar' } and arrays ['foo', 'bar'].

response.get(field)

Get a response header field value with case-insensitive field.

const etag = ctx.response.get('ETag');
+

response.set(field, value)

Set response header field to value:

ctx.set('Cache-Control', 'no-cache');
+

response.append(field, value)

Append additional header field with value val.

ctx.append('Link', '<http://127.0.0.1/>');
+

response.set(fields)

Set several response header fields with an object:

ctx.set({
+  'Etag': '1234',
+  'Last-Modified': date
+});
+

response.remove(field)

Remove header field.

response.type

Get response Content-Type void of parameters such as "charset".

const ct = ctx.type;
+// => "image/png"
+

response.type=

Set response Content-Type via mime string or file extension.

ctx.type = 'text/plain; charset=utf-8';
+ctx.type = 'image/png';
+ctx.type = '.png';
+ctx.type = 'png';
+

when appropriate a charset is selected for you, for +example response.type = 'html' will default to "utf-8". If you need to overwrite charset, +use ctx.set('Content-Type', 'text/html') to set response header field to value directly.

response.is(types...)

Very similar to ctx.request.is(). +Check whether the response type is one of the supplied types. +This is particularly useful for creating middleware that +manipulate responses.

For example, this is a middleware that minifies +all HTML responses except for streams.

const minify = require('html-minifier');
+
+app.use(async (ctx, next) => {
+await next();
+
+if (!ctx.response.is('html')) return;
+
+let body = ctx.body;
+if (!body || body.pipe) return;
+
+if (Buffer.isBuffer(body)) body = body.toString();
+  ctx.body = minify(body);
+});
+

response.redirect(url, [alt])

Perform a [302] redirect to url.

The string "back" is special-cased +to provide Referrer support, when Referrer +is not present alt or "/" is used.

ctx.redirect('back');
+ctx.redirect('back', '/index.html');
+ctx.redirect('/login');
+ctx.redirect('http://google.com');
+

To alter the default status of 302, simply assign the status +before or after this call. To alter the body, assign it after this call:

ctx.status = 301;
+ctx.redirect('/cart');
+ctx.body = 'Redirecting to shopping cart';
+

response.attachment([filename])

Set Content-Disposition to "attachment" to signal the client +to prompt for download. Optionally specify the filename of the +download.

response.headerSent

Check if a response header has already been sent. Useful for seeing +if the client may be notified on error.

response.lastModified

Return the Last-Modified header as a Date, if it exists.

response.lastModified=

Set the Last-Modified header as an appropriate UTC string. +You can either set it as a Date or date string.

ctx.response.lastModified = new Date();
+

response.etag=

Set the ETag of a response including the wrapped "s. +Note that there is no corresponding response.etag getter.

ctx.response.etag = crypto.createHash('md5').update(ctx.body).digest('hex');
+

response.vary(field)

Vary on field.

response.flushHeaders()

Flush any set headers, and begin the body.

Response

A Koa Response object is an abstraction on top of node's vanilla response object, +providing additional functionality that is useful for every day HTTP server +development.

API

response.header

Response header object.

response.headers

Response header object. Alias as response.header.

response.socket

Request socket.

response.status

Get response status. By default, response.status is set to 404 unlike node's res.statusCode which defaults to 200.

response.status=

Set response status via numeric code:

  • 100 "continue"
  • 101 "switching protocols"
  • 102 "processing"
  • 200 "ok"
  • 201 "created"
  • 202 "accepted"
  • 203 "non-authoritative information"
  • 204 "no content"
  • 205 "reset content"
  • 206 "partial content"
  • 207 "multi-status"
  • 208 "already reported"
  • 226 "im used"
  • 300 "multiple choices"
  • 301 "moved permanently"
  • 302 "found"
  • 303 "see other"
  • 304 "not modified"
  • 305 "use proxy"
  • 307 "temporary redirect"
  • 308 "permanent redirect"
  • 400 "bad request"
  • 401 "unauthorized"
  • 402 "payment required"
  • 403 "forbidden"
  • 404 "not found"
  • 405 "method not allowed"
  • 406 "not acceptable"
  • 407 "proxy authentication required"
  • 408 "request timeout"
  • 409 "conflict"
  • 410 "gone"
  • 411 "length required"
  • 412 "precondition failed"
  • 413 "payload too large"
  • 414 "uri too long"
  • 415 "unsupported media type"
  • 416 "range not satisfiable"
  • 417 "expectation failed"
  • 418 "I'm a teapot"
  • 422 "unprocessable entity"
  • 423 "locked"
  • 424 "failed dependency"
  • 426 "upgrade required"
  • 428 "precondition required"
  • 429 "too many requests"
  • 431 "request header fields too large"
  • 500 "internal server error"
  • 501 "not implemented"
  • 502 "bad gateway"
  • 503 "service unavailable"
  • 504 "gateway timeout"
  • 505 "http version not supported"
  • 506 "variant also negotiates"
  • 507 "insufficient storage"
  • 508 "loop detected"
  • 510 "not extended"
  • 511 "network authentication required"

NOTE: don't worry too much about memorizing these strings, +if you have a typo an error will be thrown, displaying this list +so you can make a correction.

response.message

Get response status message. By default, response.message is +associated with response.status.

response.message=

Set response status message to the given value.

response.length=

Set response Content-Length to the given value.

response.length

Return response Content-Length as a number when present, or deduce +from ctx.body when possible, or undefined.

response.body

Get response body.

response.body=

Set response body to one of the following:

  • string written
  • Buffer written
  • Stream piped
  • Object || Array json-stringified
  • null no content response

If response.status has not been set, Koa will automatically set the status to 200 or 204.

String

The Content-Type is defaulted to text/html or text/plain, both with +a default charset of utf-8. The Content-Length field is also set.

Buffer

The Content-Type is defaulted to application/octet-stream, and Content-Length +is also set.

Stream

The Content-Type is defaulted to application/octet-stream.

Whenever a stream is set as the response body, .onerror is automatically added as a listener to the error event to catch any errors. +In addition, whenever the request is closed (even prematurely), the stream is destroyed. +If you do not want these two features, do not set the stream as the body directly. +For example, you may not want this when setting the body as an HTTP stream in a proxy as it would destroy the underlying connection.

See: https://github.com/koajs/koa/pull/612 for more information.

Here's an example of stream error handling without automatically destroying the stream:

const PassThrough = require('stream').PassThrough;
+
+app.use(async ctx => {
+  ctx.body = someHTTPStream.on('error', ctx.onerror).pipe(PassThrough());
+});
+
Object

The Content-Type is defaulted to application/json. This includes plain objects { foo: 'bar' } and arrays ['foo', 'bar'].

response.get(field)

Get a response header field value with case-insensitive field.

const etag = ctx.response.get('ETag');
+

response.set(field, value)

Set response header field to value:

ctx.set('Cache-Control', 'no-cache');
+

response.append(field, value)

Append additional header field with value val.

ctx.append('Link', '<http://127.0.0.1/>');
+

response.set(fields)

Set several response header fields with an object:

ctx.set({
+  'Etag': '1234',
+  'Last-Modified': date
+});
+

response.remove(field)

Remove header field.

response.type

Get response Content-Type void of parameters such as "charset".

const ct = ctx.type;
+// => "image/png"
+

response.type=

Set response Content-Type via mime string or file extension.

ctx.type = 'text/plain; charset=utf-8';
+ctx.type = 'image/png';
+ctx.type = '.png';
+ctx.type = 'png';
+

when appropriate a charset is selected for you, for +example response.type = 'html' will default to "utf-8". If you need to overwrite charset, +use ctx.set('Content-Type', 'text/html') to set response header field to value directly.

response.is(types...)

Very similar to ctx.request.is(). +Check whether the response type is one of the supplied types. +This is particularly useful for creating middleware that +manipulate responses.

For example, this is a middleware that minifies +all HTML responses except for streams.

const minify = require('html-minifier');
+
+app.use(async (ctx, next) => {
+await next();
+
+if (!ctx.response.is('html')) return;
+
+let body = ctx.body;
+if (!body || body.pipe) return;
+
+if (Buffer.isBuffer(body)) body = body.toString();
+  ctx.body = minify(body);
+});
+

response.redirect(url, [alt])

Perform a [302] redirect to url.

The string "back" is special-cased +to provide Referrer support, when Referrer +is not present alt or "/" is used.

ctx.redirect('back');
+ctx.redirect('back', '/index.html');
+ctx.redirect('/login');
+ctx.redirect('http://google.com');
+

To alter the default status of 302, simply assign the status +before or after this call. To alter the body, assign it after this call:

ctx.status = 301;
+ctx.redirect('/cart');
+ctx.body = 'Redirecting to shopping cart';
+

response.attachment([filename])

Set Content-Disposition to "attachment" to signal the client +to prompt for download. Optionally specify the filename of the +download.

response.headerSent

Check if a response header has already been sent. Useful for seeing +if the client may be notified on error.

response.lastModified

Return the Last-Modified header as a Date, if it exists.

response.lastModified=

Set the Last-Modified header as an appropriate UTC string. +You can either set it as a Date or date string.

ctx.response.lastModified = new Date();
+

response.etag=

Set the ETag of a response including the wrapped "s. +Note that there is no corresponding response.etag getter.

ctx.response.etag = crypto.createHash('md5').update(ctx.body).digest('hex');
+

response.vary(field)

Vary on field.

response.flushHeaders()

Flush any set headers, and begin the body.

Advanced responses

Strapi integrates Boom: a set of utilities for returning HTTP errors. Every Boom’s functions are accessible through the ctx.response.

You can also override responses based on them status. Please read the configuration responses for that.

Every Boom's functions is delegated to the context. It means that ctx.notFound is a shortcut to ctx.response.notFound.

API Reference

For more information, please refer to the Boom documentation.

HTTP 4xx Errors

ctx.response.badRequest([message], [data])

Returns a 400 Bad Request error where:

  • message - optional message.
  • data - optional additional error data.
ctx.response.badRequest('invalid query');
+

Generates the following response payload:

{
+  "statusCode": 400,
+  "error": "Bad Request",
+  "message": "invalid query"
+}
+

ctx.response.unauthorized([message], [scheme], [attributes])

Returns a 401 Unauthorized error where:

  • message - optional message.
  • scheme can be one of the following: +
    • an authentication scheme name
    • an array of string values. These values will be separated by ', ' and set to the 'WWW-Authenticate' header.
  • attributes - an object of values to use while setting the 'WWW-Authenticate' header. This value is only used +when scheme is a string, otherwise it is ignored. Every key/value pair will be included in the +'WWW-Authenticate' in the format of 'key="value"' as well as in the response payload under the attributes key. Alternatively value can be a string which is use to set the value of the scheme, for example setting the token value for negotiate header. If string is used message parameter must be null. +null and undefined will be replaced with an empty string. If attributes is set, message will be used as +the 'error' segment of the 'WWW-Authenticate' header. If message is unset, the 'error' segment of the header +will not be present and isMissing will be true on the error object.

If either scheme or attributes are set, the resultant Boom object will have the 'WWW-Authenticate' header set for the response.

ctx.response.unauthorized('invalid password');
+

Generates the following response:

"payload": {
+  "statusCode": 401,
+  "error": "Unauthorized",
+  "message": "invalid password"
+},
+"headers" {}
+
ctx.response.unauthorized('invalid password', 'sample');
+

Generates the following response:

"payload": {
+  "statusCode": 401,
+  "error": "Unauthorized",
+  "message": "invalid password",
+  "attributes": {
+    "error": "invalid password"
+  }
+},
+"headers" {
+  "WWW-Authenticate": "sample error=\"invalid password\""
+}
+
ctx.response.unauthorized(null, 'Negotiate', 'VGhpcyBpcyBhIHRlc3QgdG9rZW4=');
+

Generates the following response:

"payload": {
+  "statusCode": 401,
+  "error": "Unauthorized",
+  "attributes": "VGhpcyBpcyBhIHRlc3QgdG9rZW4="
+},
+"headers" {
+  "WWW-Authenticate": "Negotiate VGhpcyBpcyBhIHRlc3QgdG9rZW4="
+}
+
ctx.response.unauthorized('invalid password', 'sample', { ttl: 0, cache: null, foo: 'bar' });
+

Generates the following response:

"payload": {
+  "statusCode": 401,
+  "error": "Unauthorized",
+  "message": "invalid password",
+  "attributes": {
+    "error": "invalid password",
+    "ttl": 0,
+    "cache": "",
+    "foo": "bar"
+  }
+},
+"headers" {
+  "WWW-Authenticate": "sample ttl=\"0\", cache=\"\", foo=\"bar\", error=\"invalid password\""
+}
+

ctx.response.paymentRequired([message], [data])

Returns a 402 Payment Required error where:

  • message - optional message.
  • data - optional additional error data.
ctx.response.paymentRequired('bandwidth used');
+

Generates the following response payload:

{
+  "statusCode": 402,
+  "error": "Payment Required",
+  "message": "bandwidth used"
+}
+

ctx.response.forbidden([message], [data])

Returns a 403 Forbidden error where:

  • message - optional message.
  • data - optional additional error data.
ctx.response.forbidden('try again some time');
+

Generates the following response payload:

{
+  "statusCode": 403,
+  "error": "Forbidden",
+  "message": "try again some time"
+}
+

ctx.response.notFound([message], [data])

Returns a 404 Not Found error where:

  • message - optional message.
  • data - optional additional error data.
ctx.response.notFound('missing');
+

Generates the following response payload:

{
+  "statusCode": 404,
+  "error": "Not Found",
+  "message": "missing"
+}
+

ctx.response.methodNotAllowed([message], [data], [allow])

Returns a 405 Method Not Allowed error where:

  • message - optional message.
  • data - optional additional error data.
  • allow - optional string or array of strings (to be combined and separated by ', ') which is set to the 'Allow' header.
ctx.response.methodNotAllowed('that method is not allowed');
+

Generates the following response payload:

{
+  "statusCode": 405,
+  "error": "Method Not Allowed",
+  "message": "that method is not allowed"
+}
+

ctx.response.notAcceptable([message], [data])

Returns a 406 Not Acceptable error where:

  • message - optional message.
  • data - optional additional error data.
ctx.response.notAcceptable('unacceptable');
+

Generates the following response payload:

{
+  "statusCode": 406,
+  "error": "Not Acceptable",
+  "message": "unacceptable"
+}
+

ctx.response.proxyAuthRequired([message], [data])

Returns a 407 Proxy Authentication Required error where:

  • message - optional message.
  • data - optional additional error data.
ctx.response.proxyAuthRequired('auth missing');
+

Generates the following response payload:

{
+  "statusCode": 407,
+  "error": "Proxy Authentication Required",
+  "message": "auth missing"
+}
+

ctx.response.clientTimeout([message], [data])

Returns a 408 Request Time-out error where:

  • message - optional message.
  • data - optional additional error data.
ctx.response.clientTimeout('timed out');
+

Generates the following response payload:

{
+  "statusCode": 408,
+  "error": "Request Time-out",
+  "message": "timed out"
+}
+

ctx.response.conflict([message], [data])

Returns a 409 Conflict error where:

  • message - optional message.
  • data - optional additional error data.
ctx.response.conflict('there was a conflict');
+

Generates the following response payload:

{
+  "statusCode": 409,
+  "error": "Conflict",
+  "message": "there was a conflict"
+}
+

ctx.response.resourceGone([message], [data])

Returns a 410 Gone error where:

  • message - optional message.
  • data - optional additional error data.
ctx.response.resourceGone('it is gone');
+

Generates the following response payload:

{
+  "statusCode": 410,
+  "error": "Gone",
+  "message": "it is gone"
+}
+

ctx.response.lengthRequired([message], [data])

Returns a 411 Length Required error where:

  • message - optional message.
  • data - optional additional error data.
ctx.response.lengthRequired('length needed');
+

Generates the following response payload:

{
+  "statusCode": 411,
+  "error": "Length Required",
+  "message": "length needed"
+}
+

ctx.response.preconditionFailed([message], [data])

Returns a 412 Precondition Failed error where:

  • message - optional message.
  • data - optional additional error data.
ctx.response.preconditionFailed();
+

Generates the following response payload:

{
+  "statusCode": 412,
+  "error": "Precondition Failed"
+}
+

ctx.response.entityTooLarge([message], [data])

Returns a 413 Request Entity Too Large error where:

  • message - optional message.
  • data - optional additional error data.
ctx.response.entityTooLarge('too big');
+

Generates the following response payload:

{
+  "statusCode": 413,
+  "error": "Request Entity Too Large",
+  "message": "too big"
+}
+

ctx.response.uriTooLong([message], [data])

Returns a 414 Request-URI Too Large error where:

  • message - optional message.
  • data - optional additional error data.
ctx.response.uriTooLong('uri is too long');
+

Generates the following response payload:

{
+  "statusCode": 414,
+  "error": "Request-URI Too Large",
+  "message": "uri is too long"
+}
+

ctx.response.unsupportedMediaType([message], [data])

Returns a 415 Unsupported Media Type error where:

  • message - optional message.
  • data - optional additional error data.
ctx.response.unsupportedMediaType('that media is not supported');
+

Generates the following response payload:

{
+  "statusCode": 415,
+  "error": "Unsupported Media Type",
+  "message": "that media is not supported"
+}
+

ctx.response.rangeNotSatisfiable([message], [data])

Returns a 416 Requested Range Not Satisfiable error where:

  • message - optional message.
  • data - optional additional error data.
ctx.response.rangeNotSatisfiable();
+

Generates the following response payload:

{
+  "statusCode": 416,
+  "error": "Requested Range Not Satisfiable"
+}
+

ctx.response.expectationFailed([message], [data])

Returns a 417 Expectation Failed error where:

  • message - optional message.
  • data - optional additional error data.
ctx.response.expectationFailed('expected this to work');
+

Generates the following response payload:

{
+  "statusCode": 417,
+  "error": "Expectation Failed",
+  "message": "expected this to work"
+}
+

ctx.response.teapot([message], [data])

Returns a 418 I'm a Teapot error where:

  • message - optional message.
  • data - optional additional error data.
ctx.response.teapot('sorry, no coffee...');
+

Generates the following response payload:

{
+  "statusCode": 418,
+  "error": "I'm a Teapot",
+  "message": "Sorry, no coffee..."
+}
+

ctx.response.badData([message], [data])

Returns a 422 Unprocessable Entity error where:

  • message - optional message.
  • data - optional additional error data.
ctx.response.badData('your data is bad and you should feel bad');
+

Generates the following response payload:

{
+  "statusCode": 422,
+  "error": "Unprocessable Entity",
+  "message": "your data is bad and you should feel bad"
+}
+

ctx.response.locked([message], [data])

Returns a 423 Locked error where:

  • message - optional message.
  • data - optional additional error data.
ctx.response.locked('this resource has been locked');
+

Generates the following response payload:

{
+  "statusCode": 423,
+  "error": "Locked",
+  "message": "this resource has been locked"
+}
+

ctx.response.preconditionRequired([message], [data])

Returns a 428 Precondition Required error where:

  • message - optional message.
  • data - optional additional error data.
ctx.response.preconditionRequired('you must supply an If-Match header');
+

Generates the following response payload:

{
+  "statusCode": 428,
+  "error": "Precondition Required",
+  "message": "you must supply an If-Match header"
+}
+

ctx.response.tooManyRequests([message], [data])

Returns a 429 Too Many Requests error where:

  • message - optional message.
  • data - optional additional error data.
ctx.response.tooManyRequests('you have exceeded your request limit');
+

Generates the following response payload:

{
+  "statusCode": 429,
+  "error": "Too Many Requests",
+  "message": "you have exceeded your request limit"
+}
+

ctx.response.illegal([message], [data])

Returns a 451 Unavailable For Legal Reasons error where:

  • message - optional message.
  • data - optional additional error data.
ctx.response.illegal('you are not permitted to view this resource for legal reasons');
+

Generates the following response payload:

{
+  "statusCode": 451,
+  "error": "Unavailable For Legal Reasons",
+  "message": "you are not permitted to view this resource for legal reasons"
+}
+

HTTP 5xx Errors

All 500 errors hide your message from the end user. Your message is recorded in the server log.

ctx.response.badImplementation([message], [data]) - (alias: internal)

Returns a 500 Internal Server Error error where:

  • message - optional message.
  • data - optional additional error data.
ctx.response.badImplementation('terrible implementation');
+

Generates the following response payload:

{
+  "statusCode": 500,
+  "error": "Internal Server Error",
+  "message": "An internal server error occurred"
+}
+

ctx.response.notImplemented([message], [data])

Returns a 501 Not Implemented error where:

  • message - optional message.
  • data - optional additional error data.
ctx.response.notImplemented('method not implemented');
+

Generates the following response payload:

{
+  "statusCode": 501,
+  "error": "Not Implemented",
+  "message": "method not implemented"
+}
+

ctx.response.badGateway([message], [data])

Returns a 502 Bad Gateway error where:

  • message - optional message.
  • data - optional additional error data.
ctx.response.badGateway('that is a bad gateway');
+

Generates the following response payload:

{
+  "statusCode": 502,
+  "error": "Bad Gateway",
+  "message": "that is a bad gateway"
+}
+

ctx.response.serverUnavailable([message], [data])

Returns a 503 Service Unavailable error where:

  • message - optional message.
  • data - optional additional error data.
ctx.response.serverUnavailable('unavailable');
+

Generates the following response payload:

{
+  "statusCode": 503,
+  "error": "Service Unavailable",
+  "message": "unavailable"
+}
+

ctx.response.gatewayTimeout([message], [data])

Returns a 504 Gateway Time-out error where:

  • message - optional message.
  • data - optional additional error data.
ctx.response.gatewayTimeout();
+

Generates the following response payload:

{
+  "statusCode": 504,
+  "error": "Gateway Time-out"
+}
+
+ + + diff --git a/docs/.vuepress/dist/3.x.x/guides/restapi.html b/docs/.vuepress/dist/3.x.x/guides/restapi.html new file mode 100644 index 0000000000..1416a63274 --- /dev/null +++ b/docs/.vuepress/dist/3.x.x/guides/restapi.html @@ -0,0 +1,49 @@ + + + + + + Filters | Strapi Docs + + + + + + + +

Filters

See the filters' concepts for details.

by default, the filters can only be used from find endpoints generated by the Content Type Builder and the CLI. If you need to implement a filters system somewhere else, read the programmatic usage section.

Available operators

The available operators are separated in four different categories:

Filters

Easily filter results according to fields values.

  • =: Equals
  • _ne: Not equals
  • _lt: Lower than
  • _gt: Greater than
  • _lte: Lower than or equal to
  • _gte: Greater than or equal to
  • _contains: Contains
  • _containss: Contains case sensitive

Examples

Find users having John as first name.

GET /user?firstName=John

Find products having a price equal or greater than 3.

GET /product?price_gte=3

Sort

Sort according to a specific field.

Example

Sort users by email.

  • ASC: GET /user?_sort=email:asc
  • DESC: GET /user?_sort=email:desc

Limit

Limit the size of the returned results.

Example

Limit the result length to 30.

GET /user?_limit=30

Start

Skip a specific number of entries (especially useful for pagination).

Example

Get the second page of results.

GET /user?_start=10&_limit=10

Programmatic usage

Requests system can be implemented in custom code sections.

Extracting requests filters

To extract the filters from an JavaScript object or a request, you need to call the strapi.utils.models.convertParams helper.

The returned objects is formatted according to the ORM used by the model.

Example

Path — ./api/user/controllers/User.js.

// Define a list of params.
+const params = {
+  '_limit': 20,
+  '_sort': 'email'
+};
+
+// Convert params.
+const formattedParams = strapi.utils.models.convertParams('user', params); // { limit: 20, sort: 'email' }
+

Query usage

Example

Path — ./api/user/controllers/User.js.

module.exports = {
+
+  find: async (ctx) => {
+    // Convert params.
+    const formattedParams = strapi.utils.models.convertParams('user', ctx.request.query);
+
+    // Get the list of users according to the request query.
+    const filteredUsers = await User
+      .find()
+      .where(formattedParams.where)
+      .sort(formattedParams.sort)
+      .skip(formattedParams.start)
+      .limit(formattedParams.limit);
+
+    // Finally, send the results to the client.
+    ctx.body = filteredUsers;
+  };
+};
+
+ + + diff --git a/docs/.vuepress/dist/3.x.x/guides/routing.html b/docs/.vuepress/dist/3.x.x/guides/routing.html new file mode 100644 index 0000000000..3be7631845 --- /dev/null +++ b/docs/.vuepress/dist/3.x.x/guides/routing.html @@ -0,0 +1,68 @@ + + + + + + Routing | Strapi Docs + + + + + + + +

Routing

See the routing's concept for details.

How to create a route?

You have to edit the routes.json file in one of your APIs folders (./api/**/config/routes.json) and manually add a new route object into the routes array.

Path — ./api/**/config/routes.json.

{
+  "routes": [
+    {
+      "method": "GET",
+      "path": "/product",
+      "handler": "Product.find",
+    },
+    {
+      "method": ["POST", "PUT"],
+      "path": "/product/:id",
+      "handler": "Product.createOrUpdate",
+    },
+    {
+      "method": "POST",
+      "path": "/product/:id/buy",
+      "handler": "Product.buy",
+      "config": {
+        "policies": ["isAuthenticated", "hasCreditCard"]
+      }
+    }
+  ]
+}
+
  • method (string): Method or array of methods to hit the route (ex: GET, POST, PUT, HEAD, DELETE, PATCH)
  • path (string): URL starting with / (ex: /product)
  • handler (string): Action to executed when the route is hit following this syntax <Controller>.<action>
  • config
    • policies (array): Array of policies names or path (see more)
    • prefix (string): Set a prefix to this route. Also, it will be loaded into the main router (useful feature for plugin)

Dynamic parameters

The router used by Strapi allows you to create dynamic routes where you can use parameters and simple regular expressions. These parameters will be exposed in the ctx.params object. For more details, please refer to the PathToRegex documentation.

{
+  "routes": [
+    {
+      "method": "GET",
+      "path": "/product/:category/:id",
+      "handler": "Product.findOneByCategory",
+    },
+    {
+      "method": "GET",
+      "path": "/product/:region(\\d{2}|\\d{3})/:id", // Only match when the first parameter contains 2 or 3 digits.
+      "handler": "Product.findOneByRegion",
+    }
+  ]
+}
+

Override default route

By default, the main route of the server / is pointed to the /public/index.html file. To override this behavior, you need to create a route with an empty path / in one of your API folder (/api/**/config/routes.json).

{
+  "routes": [
+    {
+      "method": "GET",
+      "path": "/",
+      "handler": "Controller.name",
+    }
+  ]
+}
+
+ + + diff --git a/docs/.vuepress/dist/3.x.x/guides/services.html b/docs/.vuepress/dist/3.x.x/guides/services.html new file mode 100644 index 0000000000..2767e4f3df --- /dev/null +++ b/docs/.vuepress/dist/3.x.x/guides/services.html @@ -0,0 +1,63 @@ + + + + + + Services | Strapi Docs + + + + + + + +

Services

See the services concept for details.

How to create a service?

There is two ways to create a service.

  • Using the CLI strapi generate:service user. Read the CLI documentation for more information.
  • Manually create a JavaScript file named User.js in ./api/**/services/.

Example

The goal of a service is to store reusable functions. An email service could be useful, if we plan to send emails from different functions in our codebase:

Path — ./api/email/services/Email.js.

const nodemailer = require('nodemailer');
+
+// Create reusable transporter object using SMTP transport.
+const transporter = nodemailer.createTransport({
+  service: 'Gmail',
+  auth: {
+    user: 'user@gmail.com',
+    pass: 'password'
+  }
+});
+
+module.exports = {
+  send: (from, to, subject, text) => {  
+    // Setup e-mail data.
+    const options = {
+      from,
+      to,
+      subject,
+      text
+    };
+
+    // Return a promise of the function that sends the email.
+    return transporter.sendMail(options);
+  }
+};
+

please make sure you installed nodemailer (npm install nodemailer) for this example.

The service is now available through the strapi.services global variable. We can use it in another part of our codebase. For example a controller like below:

Path — ./api/user/controllers/User.js.

module.exports = {
+  // GET /hello
+  signup: async (ctx) => {
+    // Store the new user in database.
+    const user = await User.create(ctx.params);
+
+    // Send an email to validate his subscriptions.
+    strapi.services.email.send('welcome@mysite.com', user.email, 'Welcome', '...');
+
+    // Send response to the server.
+    ctx.send({
+      ok: true
+    });
+  }
+};
+
+ + + diff --git a/docs/.vuepress/dist/3.x.x/guides/upload.html b/docs/.vuepress/dist/3.x.x/guides/upload.html new file mode 100644 index 0000000000..538e67dc5c --- /dev/null +++ b/docs/.vuepress/dist/3.x.x/guides/upload.html @@ -0,0 +1,90 @@ + + + + + + File Upload | Strapi Docs + + + + + + + +

File Upload

WARNING

This feature requires the Upload plugin (installed by default).

Thanks to the plugin Upload, you can upload any kind of files on your server or externals providers such as AWS S3.

Usage

The plugin exposes a single route POST /upload to upload one or multiple files in a single request.

WARNING

Please send the request using multipart/form-data encoding

Parameters

  • files: The file(s) to upload. The value(s) can be a Buffer or Stream.
  • refId: (optional): The ID of the entry which the file(s) will be linked to.
  • ref: (optional): The name of the model which the file(s) will be linked to (see more below).
  • source: (optional): The name of the plugin where the model is located.
  • field: (optional): The field of the entry which the file(s) will be precisely linked to.

Models

To add a new file attribute in your models, it's like adding a new association. In the first example, you will be able to upload and attach one file to the avatar attribute. Whereas, in our second example, you can upload and attach multiple pictures to the product.

Path — User.settings.json.

{
+  "connection": "default",
+  "attributes": {
+    "pseudo": {
+      "type": "string",
+      "required": true
+    },
+    "email": {
+      "type": "email",
+      "required": true,
+      "unique": true
+    },
+    "avatar": {
+      "model": "file",
+      "via": "related",
+      "plugin": "upload"
+    }
+  }
+}
+

Path — Product.settings.json.

{
+  "connection": "default",
+  "attributes": {
+    "name": {
+      "type": "string",
+      "required": true
+    },
+    "price": {
+      "type": "integer",
+      "required": true
+    },
+    "pictures": {
+      "collection": "file",
+      "via": "related",
+      "plugin": "upload"
+    }
+  }
+}
+

Examples

Single file

curl -X POST -F 'files=@/path/to/pictures/file.jpg' http://localhost:1337/upload
+

Multiple files

curl -X POST -F 'files[]=@/path/to/pictures/fileX.jpg' -F 'files[]=@/path/to/pictures/fileY.jpg' http://localhost:1337/upload
+

Linking files to an entry

Let's say that you want to have a User model provided by the plugin Users & Permissions and you want to upload an avatar for a specific user.

{
+  "connection": "default",
+  "attributes": {
+    "pseudo": {
+      "type": "string",
+      "required": true
+    },
+    "email": {
+      "type": "email",
+      "required": true,
+      "unique": true
+    },
+    "avatar": {
+      "model": "file",
+      "via": "related",
+      "plugin": "upload"
+    }
+  }
+}
+
{
+  "files": "...", // Buffer or stream of file(s)
+  "refId": "5a993616b8e66660e8baf45c", // User's Id.
+  "ref": "user", // Model name.
+  "source": "users-permissions", // Plugin name.
+  "field": "avatar" // Field name in the User model.
+}
+

Here the request to make to associate the file (/path/to/pictures/avatar.jpg) to the user (id: 5a993616b8e66660e8baf45c) when the User model is provided by the Users & Permissions plugin.

curl -X POST -F 'files=@/path/to/pictures/avatar.jpg&refId=5a993616b8e66660e8baf45c&ref=user&source=users-permissions&field=avatar' http://localhost:1337/upload
+

Install providers

By default Strapi provides a local file upload system. You might want to upload your files on AWS S3 or another provider.

To install a new provider run:

$ npm install strapi-upload-aws-s3@alpha --save
+

We have two providers available strapi-upload-aws-s3 and strapi-upload-cloudinary, use the alpha tag to install one of them. Then, visit /admin/plugins/upload/configurations/development on your web browser and configure the provider.

If you want to create your own, make sure the name starts with strapi-upload- (duplicating an existing one will be easier to create), modify the auth config object and customize the upload and delete functions.

Check all community providers available on npmjs.org - Providers list

+ + + diff --git a/docs/.vuepress/dist/3.x.x/index.html b/docs/.vuepress/dist/3.x.x/index.html new file mode 100644 index 0000000000..8fa90ef7f6 --- /dev/null +++ b/docs/.vuepress/dist/3.x.x/index.html @@ -0,0 +1,32 @@ + + + + + + API creation made simple, secure and fast. | Strapi Docs + + + + + + + +

Logo

API creation made simple, secure and fast.

The most advanced open-source Content Management Framework to build powerful API with no effort.

npm version npm downloads Build status Slack status Heroku Deploy

v3@alpha.13 is available!

We've been working on a major update for Strapi during the past months, rewriting the core framework and the dashboard.

This documentation is only related to Strapi v3@alpha.13 (v1 documentation is still available).

Get Started
+Learn how to install Strapi and start developing your API.

Command Line Interface
+Get to know our CLI to make features the hacker way!

Concepts
+Get to know more about Strapi and how it works.

Guides
+Get familiar with Strapi. Discover concrete examples on how to develop the features you need.

Plugin Development
+Understand how to develop your own plugin.

API Reference
+Learn about Strapi's API, the strapi object that is available in your backend.

Migration guide

+ + + diff --git a/docs/.vuepress/dist/3.x.x/migration/migration-guide-alpha-10-to-alpha-11.html b/docs/.vuepress/dist/3.x.x/migration/migration-guide-alpha-10-to-alpha-11.html new file mode 100644 index 0000000000..71be5d3882 --- /dev/null +++ b/docs/.vuepress/dist/3.x.x/migration/migration-guide-alpha-10-to-alpha-11.html @@ -0,0 +1,30 @@ + + + + + + Migrating from 3.0.0-alpha.10 to 3.0.0-alpha.11 | Strapi Docs + + + + + + + +

Migrating from 3.0.0-alpha.10 to 3.0.0-alpha.11

Here are the major changes:

  • Add plugin upload

Feel free to join us on Slack and ask questions about the migration process.

Getting started

Install Strapi alpha.11.1 globally on your computer. To do so run npm install strapi@3.0.0-alpha.11.1 -g.

When it's done, generate a new empty project strapi new myNewProject (don't pay attention to the database configuration).

Configurations

You will have to update just 1 file: package.json

  • Edit the Strapi's dependencies version: (move Strapi's dependencies to 3.0.0-alpha.11.1 version) in package.json file
{
+  "dependencies": {
+    "lodash": "4.x.x",
+    "strapi": "3.0.0-alpha.11.1",
+    "strapi-mongoose": "3.0.0-alpha.11.1"
+  }
+}
+

Update the Admin

Delete your old admin folder and replace it by the new one.

Update the Plugins

Copy this file /plugins/users-permissions/config/jwt.json from your old project and paste it in the corresponding one in your new project.

Copy the fields and relations you had in your /plugins/users-permissions/models/User.settings.json file in the new one.

Then, delete your old plugins folder and replace it by the new one.

Update the Dependencies

Now let's update the dependencies in your package.json we edited earlier. Simply run npm install:

That's all, you have now upgraded to Strapi alpha.11.

+ + + diff --git a/docs/.vuepress/dist/3.x.x/migration/migration-guide-alpha-11-to-alpha-12.html b/docs/.vuepress/dist/3.x.x/migration/migration-guide-alpha-11-to-alpha-12.html new file mode 100644 index 0000000000..1e2a8060de --- /dev/null +++ b/docs/.vuepress/dist/3.x.x/migration/migration-guide-alpha-11-to-alpha-12.html @@ -0,0 +1,57 @@ + + + + + + Migrating from 3.0.0-alpha.11 to 3.0.0-alpha.12.1.3 | Strapi Docs + + + + + + + +

Migrating from 3.0.0-alpha.11 to 3.0.0-alpha.12.1.3

This migration guide is a mix of migrations from 3.0.0-alpha.11.1 to 3.0.0-alpha.11.2, 3.0.0-alpha.11.2 to 3.0.0-alpha.11.3 and from 3.0.0-alpha.11.3 to 3.0.0-alpha.12.1.3.

Feel free to join us on Slack and ask questions about the migration process.

Getting started

Install Strapi alpha.12.1.3 globally on your computer. To do so run npm install strapi@3.0.0-alpha.12.1.3 -g.

When it's done, generate a new empty project strapi new myNewProject (don't pay attention to the database configuration).

Configurations

You will have to update just 1 file: package.json

  • Edit the Strapi's dependencies version: (move Strapi's dependencies to 3.0.0-alpha.12.1.3 version) in package.json file
{
+  "dependencies": {
+    "lodash": "4.x.x",
+    "strapi": "3.0.0-alpha.12.1.3",
+    "strapi-mongoose": "3.0.0-alpha.12"
+  }
+}
+

Update the Admin

Delete your old admin folder and replace it by the new one.

Update the Plugins

Copy the fields and relations you had in your /plugins/users-permissions/models/User.settings.json file in the new one.

Then, delete your old plugins folder and replace it by the new one.

Update roles

This update is if you come from version before alpha-11.2

Update type of Guest role to public in your database. You can also update name and description:

{
+  "name": "Public",
+  "description": "Default role given to unauthenticated user.",
+  "type": "public"
+}
+

Create Authenticated role:

{
+  "name": "Authenticated",
+  "description": "Default role given to authenticated user.",
+  "type": "authenticated"
+}
+

In Users & Permissions > Advanced in admin panel update default role to Authenticated

You also will have to reset your roles permissions.

Update bookshelf filters

WARNING

This update is if you come from version before alpha-11.3

You will have to replace your fetchAll services queries of your generated API:

_.forEach(convertedParams.where, (where, key) => {
+   if (_.isArray(where.value)) {
+     for (const value in where.value) {
+       qb[value ? 'where' : 'orWhere'](key, where.symbol, where.value[value])
+     }
+   } else {
+     qb.where(key, where.symbol, where.value);
+   }
+ });
+
+ if (convertedParams.sort) {
+   qb.orderBy(convertedParams.sort.key, convertedParams.sort.order);
+ }
+
+ qb.offset(convertedParams.start);
+
+ qb.limit(convertedParams.limit);
+

That's all, you have now upgraded to Strapi alpha.12.1.3.

+ + + diff --git a/docs/.vuepress/dist/3.x.x/migration/migration-guide-alpha-7-4-to-alpha-8.html b/docs/.vuepress/dist/3.x.x/migration/migration-guide-alpha-7-4-to-alpha-8.html new file mode 100644 index 0000000000..fca6d2a4b2 --- /dev/null +++ b/docs/.vuepress/dist/3.x.x/migration/migration-guide-alpha-7-4-to-alpha-8.html @@ -0,0 +1,39 @@ + + + + + + Migrating from 3.0.0-alpha.7.3 to 3.0.0-alpha.8 | Strapi Docs + + + + + + + +

Migrating from 3.0.0-alpha.7.3 to 3.0.0-alpha.8

Here are the major changes:

  • Fix deployment process
  • Setup database connection on project creation
  • Helper for table creation for SQL database

Feel free to join us on Slack and ask questions about the migration process.

Getting started

Install Strapi alpha.8 globally on your computer. To do so run npm install strapi@3.0.0-alpha.8 -g.

When it's done, generate a new empty project strapi new myNewProject (don't pay attention to the database configuration).

Configurations

You will have to update just 1 file: package.json

  • Edit the scripts section: (only the setup line has changed)
{
+  "scripts": {
+    "setup": "cd admin && npm run setup",
+    "start": "node server.js",
+    "strapi": "node_modules/strapi/bin/strapi.js",
+    "lint": "node_modules/.bin/eslint api/**/*.js config/**/*.js plugins/**/*.js",
+    "postinstall": "node node_modules/strapi/lib/utils/post-install.js"
+  }
+}
+
  • Edit the Strapi's dependencies version: (move Strapi's dependencies to 3.0.0-alpha.8 version)
{
+  "dependencies": {
+    "lodash": "4.x.x",
+    "strapi": "3.0.0-alpha.8",
+    "strapi-mongoose": "3.0.0-alpha.8"
+  }
+}
+

Update the Admin

Delete your old admin folder and replace by the new one.

Update the Plugins

Copy these 3 files /plugins/users-permissions/config/jwt.json, /plugins/users-permissions/config/roles.json and /plugins/users-permissions/models/User.settings.json from your old project and paste them in the corresponding ones in your new project. It is important to save these files.

Then, delete your old plugins folder and replace it by the new one.

That's all, you have now upgraded to Strapi alpha.8.

+ + + diff --git a/docs/.vuepress/dist/3.x.x/migration/migration-guide-alpha-8-to-alpha-9.html b/docs/.vuepress/dist/3.x.x/migration/migration-guide-alpha-8-to-alpha-9.html new file mode 100644 index 0000000000..ae5ed87441 --- /dev/null +++ b/docs/.vuepress/dist/3.x.x/migration/migration-guide-alpha-8-to-alpha-9.html @@ -0,0 +1,35 @@ + + + + + + Migrating from 3.0.0-alpha.8 to 3.0.0-alpha.9 | Strapi Docs + + + + + + + +

Migrating from 3.0.0-alpha.8 to 3.0.0-alpha.9

Here are the major changes:

  • Put roles' permissions in database
  • Providers connection (Facebook, GitHub, ...)

Feel free to join us on Slack and ask questions about the migration process.

Getting started

Install Strapi alpha.9 globally on your computer. To do so run npm install strapi@3.0.0-alpha.9 -g.

When it's done, generate a new empty project strapi new myNewProject (don't pay attention to the database configuration).

Configurations

You will have to update just 2 files: package.json and request.json

  • Edit the Strapi's dependencies version: (move Strapi's dependencies to 3.0.0-alpha.9 version) in package.json file
{
+  "dependencies": {
+    "lodash": "4.x.x",
+    "strapi": "3.0.0-alpha.9",
+    "strapi-mongoose": "3.0.0-alpha.9"
+  }
+}
+
  • Edit the session.enabled settings to true in each environment file: /configs/environments/***/request.json
{
+  "session": {
+    "enabled": true
+  }
+}
+

Update the Admin

Delete your old admin folder and replace it by the new one.

Update the Plugins

Copy this file /plugins/users-permissions/config/jwt.json from your old project and paste it in the corresponding one in your new project.

Copy the fields and relations you had in your /plugins/users-permissions/models/User.settings.json file in the new one.

Then, delete your old plugins folder and replace it by the new one.

⚠️ Roles update

Roles are now stored in your database. You will have to re-create and configure them via the admin dashboard.

⚠️ User collection/table name has changed

If you have an existing set of users in your database you will have to rename the collection/table from user to users-permissions_user.

Then update all your users by changing the old role id by the new one which is in users-permissions_role collection/table.

That's all, you have now upgraded to Strapi alpha.9.

+ + + diff --git a/docs/.vuepress/dist/3.x.x/migration/migration-guide-alpha-9-to-alpha-10.html b/docs/.vuepress/dist/3.x.x/migration/migration-guide-alpha-9-to-alpha-10.html new file mode 100644 index 0000000000..f896eeb5da --- /dev/null +++ b/docs/.vuepress/dist/3.x.x/migration/migration-guide-alpha-9-to-alpha-10.html @@ -0,0 +1,30 @@ + + + + + + Migrating from 3.0.0-alpha.9 to 3.0.0-alpha.10 | Strapi Docs + + + + + + + +

Migrating from 3.0.0-alpha.9 to 3.0.0-alpha.10

Here are the major changes:

  • Add database store config
  • New lib input

Feel free to join us on Slack and ask questions about the migration process.

Getting started

Install Strapi alpha.10.1 globally on your computer. To do so run npm install strapi@3.0.0-alpha.10.1 -g.

When it's done, generate a new empty project strapi new myNewProject (don't pay attention to the database configuration).

Configurations

You will have to update just 1 file: package.json

  • Edit the Strapi's dependencies version: (move Strapi's dependencies to 3.0.0-alpha.10.1 version) in package.json file
{
+  "dependencies": {
+    "lodash": "4.x.x",
+    "strapi": "3.0.0-alpha.10.1",
+    "strapi-mongoose": "3.0.0-alpha.10.1"
+  }
+}
+

Update the Admin

Delete your old admin folder and replace it by the new one.

Update the Plugins

Copy this file /plugins/users-permissions/config/jwt.json from your old project and paste it in the corresponding one in your new project.

Copy the fields and relations you had in your /plugins/users-permissions/models/User.settings.json file in the new one.

Then, delete your old plugins folder and replace it by the new one.

⚠️ Config in database

To let you update your configurations when your application is deployed on multiple server instances, we have created a data store for settings. So we moved all the users-permissions plugin's configs in database.

You will have to reconfigure all your users-permissions configs from the admin panel. Then delete the advanced.json, email.json and grant.json files from plugins/users-permissions/config folder.

⚠️ Data type Number

We fixed how mongoose handles the model's Number type. Previously, mongoose stored Number type as String and now it's Integer. So you will have to update all your documents which have a type Number in its model and replace their String value with a Number one.

That's all, you have now upgraded to Strapi alpha.10.

+ + + diff --git a/docs/.vuepress/dist/3.x.x/migration/migration-guide.html b/docs/.vuepress/dist/3.x.x/migration/migration-guide.html new file mode 100644 index 0000000000..7558192003 --- /dev/null +++ b/docs/.vuepress/dist/3.x.x/migration/migration-guide.html @@ -0,0 +1,265 @@ + + + + + + Migrating from v1 to v3 | Strapi Docs + + + + + + + +

Migrating from v1 to v3

To be honest with all of you, the migration process won't be easy. The new version introduces a lot of breaking changes especially on the query part. Some features are still not available for the moment such as the authentication, users & permissions, email, media upload and GraphQL. If you're using one of theses features, you shouldn't be able to migrate unless you rewrite these features from scratch.

Here are the major changes:

  • Moved from Waterline to specialized ORMs such as Mongoose (MongoDB) and Bookshelf (Postgres, MySQL, Maria, SQLite).
  • New configurations structure.
  • Moved from Koa@1 (generators) to Koa@2 (async functions).
  • Removed middlewares from core (koa-graphql, koa-proxy, koa-ssl, koa-views).
  • Better error handling with Boom.

Feel free to join us on Slack and ask questions about the migration process.

Getting started

The best way to migrate your project is to generate a new empty project using the v3. Then, copy and paste your v1-app/api folder to the new app v3-app/api. The next step is to follow the categories one by one in order and you will be able to migrate your project without issues.

See the Quick start section to install the latest version of Strapi.

Configurations

The structure of the configurations has been harmonised and simplified. Files has been renamed or deleted, and some others has been added.

  • ./config/general.json renamed ./config/application.json
  • ./config/i18n.json renamed ./config/language.json
  • ./config/globals.json removed
  • ./config/studio.json removed
  • ./config/middleware.json added
  • ./config/hook.json added
  • ./config/custom.json added
  • ./config/environments/**/databases.json renamed ./config/environments/**/database.json
  • ./config/environments/**/response.json added
  • ./config/environments/**/custom.json added

Please refer to the new documentation to set the correct values in each file.

Don't forget that middlewares has been removed. Please refers to the right section of this document for more details.

Routes

The format of the routes has changed to easily integrate multiple strategies to hit the controllers' actions. It means that the routes are not REST-limited.

v1.x

{
+  "routes": {
+    "GET /post": {
+      "controller": "Post",
+      "action": "find"
+    },
+    "GET /post/:id": {
+      "controller": "Post",
+      "action": "findOne"
+    },
+    "POST /post": {
+      "controller": "Post",
+      "action": "create"
+    },
+    "PUT /post/:id": {
+      "controller": "Post",
+      "action": "update"
+    },
+    "DELETE /post/:id": {
+      "controller": "Post",
+      "action": "delete"
+    }
+  }
+}
+

v3.x

{
+  "routes": [
+    {
+      "method": "GET",
+      "path": "/post",
+      "handler": "Post.find",
+    },
+    {
+      "method": "GET",
+      "path": "/post/:id",
+      "handler": "Post.findOne",
+    },
+    {
+      "method": "POST",
+      "path": "/post",
+      "handler": "Post.create",
+    },
+    {
+      "method": "PUT",
+      "path": "/post/:id",
+      "handler": "Post.update",
+    },
+    {
+      "method": "DELETE",
+      "path": "/post/:id",
+      "handler": "Post.delete",
+    }
+  ]
+}
+

Controllers

Koa@1.x.x was based on generators whereas Koa@2.x.x is based on async functions. It means that the yield word has been replaced by the await word. Then the context was passed via the function context itself. Now, the context is passed through the function's parameters. Also, you don't need to apply the try/catch pattern in each controller's actions.

v1.x

module.exports = {
+  find: function *() {
+    try {
+      this.body = yield Post.find(this.params);
+    } catch (error) {
+      this.body = error;
+    }
+  }
+}
+

v3.x

module.exports = {
+  find: async (ctx) => {
+    ctx.body = await Post.find(this.params);
+  }
+}
+

Services

The services files should stay as they are. Your generator functions can be converted into async functions but it shouldn't be necessary.

Models

The models didn't change a lot. The autoCreatedAt, autoUpdatedAt and autoPK attributes have been removed and replaced by the hasTimestamps attribute.

The hasTimestamps options will only work with Bookshelf. Also you need to create the created_at and updated_at columns manually.

The enum type is not available for now. Also, the validations are not working properly. It means that most of the validations have to be done manually.

v1.x

{
+  "identity": "pet",
+  "connection": "mongoDBServer",
+  "schema": true,
+  "attributes": {
+    "name": {
+      "type": "string",
+      "required": true
+    },
+    "gender": {
+      "type": "string",
+      "enum": ["male", "female"]
+    },
+    "age": {
+      "type": "int",
+      "max": 100
+    },
+    "birthDate": {
+      "type": "date"
+    },
+    "breed": {
+      "type": "string"
+    }
+  },
+  "autoPK": true,
+  "autoCreatedAt": true,
+  "autoUpdatedAt": true
+}
+

v3.x

{
+  "connection": "mongoDBServer",
+  "options": {
+    "hasTimestamps": true
+  },
+  "attributes": {
+    "name": {
+      "type": "string",
+      "required": true
+    },
+    "gender": {
+      "type": "string"
+    },
+    "age": {
+      "type": "int",
+      "max": 100
+    },
+    "birthDate": {
+      "type": "date"
+    },
+    "breed": {
+      "type": "string"
+    }
+  }
+}
+

Query

We were based on the popular Waterline ORM. As we said in our blog posts, Waterline suffers from a lack of maintenance and we decided to move to more specific ORMs depending on the database. It increases the performances and unblock particular features for the users. Currently, we are supporting these databases:

  • MongoDB (through Mongoose).
  • Postgres, MySQL, SQLite3 and more (through Bookshelf).
  • Redis (through ioredis).

This major change means that you will have to rewrite every single query of your app. So, please to be sure that you need to switch to the new version of Strapi before starting the migration.

v1.x

module.exports = {
+  find: function *() {
+    try {
+      this.body = yield Post.find(this.params);
+    } catch (error) {
+      this.body = error;
+    }
+  },
+
+  findOne: function *() {
+    try {
+      this.body = yield Post.findOne(this.params);
+    } catch (error) {
+      this.body = error;
+    }
+  },
+
+  // POST request
+  create: function *() {
+    try {
+      this.body = yield Post.create(this.request.body);
+    } catch (error) {
+      this.body = error;
+    }
+  },
+
+  // PUT request
+  update: function *() {
+    try {
+      this.body = yield Post.update(this.params.id, this.request.body);
+    } catch (error) {
+      this.body = error;
+    }
+  },
+
+  // DELETE request
+  delete: function *() {
+    try {
+      this.body = yield Post.destroy(this.params);
+    } catch (error) {
+      this.body = error;
+    }
+  }
+};
+

v3.x

module.exports = {
+  find: async (ctx) => {
+    // Bookshelf
+    ctx.body = await Post.forge(this.params).fetchAll();
+    // Mongoose
+    ctx.body = await Post.find(this.params);
+  },
+
+  findOne: async (ctx) => {
+    // Bookshelf
+    ctx.body = await Post.forge(this.params).fetch();
+    // Mongoose
+    ctx.body = await Post.findOne(this.params);
+  },
+
+  create: async (ctx) => {
+    // Bookshelf
+    ctx.body = await Post.forge(this.request.body).save();
+    // Mongoose
+    ctx.body = await Post.create(this.request.body);
+  },
+
+  update: async (ctx) => {
+    // Bookshelf
+    ctx.body = await Post.forge({ id: 1234 }).save(this.request.body, {
+      patch: true
+    });
+    // Mongoose
+    ctx.body = await Post.update({ id: 1234 }, this.request.body);
+  },
+
+  delete: async (ctx) => {
+    // Bookshelf
+    ctx.body = await Post.forge({ id: 1234 }).destroy();
+    // Mongoose
+    ctx.body = await Post.findOneAndRemove({ id: 1234 });
+  }
+}
+

You will have more changes if your project is based on a SQL database. Waterline and Mongoose are almost sharing the same API.

Middlewares

We decided to reduce the core to the minimum. So, we removed middlewares with features that shouldn't be handled by a Node.js server such as:

  • GraphQL: We love GraphQL at Strapi and we will provide a strapi-plugin-graphql very soon.
  • Proxy: There are many great server solutions to handle a proxy feature such as nginx or Caddy.
  • SSL: Same as proxy.
  • Views: We are building APIs, not website. However, we know that sometimes you need to render views from your API server. That's why we created a strapi-views hook.

GraphQL

We are not able to give you a solution at the moment. As we said above, we will develop in the next weeks a dedicated plugin to integrate GraphQL into a project.

Proxy & SSL

You should take a look at these articles to configure SSL and proxy with nginx:

Views

It works exactly as before. You need to add strapi-views into your app's dependencies and configure the views as below:

Path — ./config/environments/**/custom.json

{
+  "views": {
+    "enabled": true,
+    "map": {
+      "ejs": "ejs"
+    },
+    "viewExt": "ejs",
+    "debug": true,
+    "cache": true
+  }
+}
+

You might have to install the template engine by your own (ex: npm install ejs --save).

Error handling

Boom is deeply integrated into the core which allows you to enjoy the entire Boom API through the context of your request. Every error throw in your project will be intercepted and decorated with Boom.

v1.x

module.exports = {
+  // GET request
+  find: function *() {
+    try {
+      const posts = yield Post.find(this.params);
+
+      if (posts.length === 0) {
+        ctx.status = 404;
+        ctx.body = 'There are no posts!';
+      } else {
+        ctx.body = posts;
+      }
+    } catch (error) {
+      this.body = error;
+    }
+  }
+};
+

v3.x

module.exports = {
+  // GET request
+  find: async (ctx) => {
+    const posts = await Post.find(this.params);
+
+    if (post.length === 0) {
+      ctx.notFound('There are no posts!'); // Set status to 404 and decorates error into a Boom object.
+    } else {
+      ctx.send(posts); // Set status to 200.
+    }
+  }
+};
+
+ + + diff --git a/docs/.vuepress/dist/3.x.x/plugin-development/backend-development.html b/docs/.vuepress/dist/3.x.x/plugin-development/backend-development.html new file mode 100644 index 0000000000..562d982688 --- /dev/null +++ b/docs/.vuepress/dist/3.x.x/plugin-development/backend-development.html @@ -0,0 +1,111 @@ + + + + + + Back-end Development | Strapi Docs + + + + + + + +

Back-end Development

This section explains how the 'back-end part' of your plugin works.

Routes

The plugin API routes are defined in the ./plugins/**/config/routes.json file.

Please refer to router documentation for informations.

Route prefix

Each route of a plugin is prefixed by the name of the plugin (eg: /my-plugin/my-plugin-route).

To disable the prefix, add the prefix attribute to each concerned route, like below:

{
+  "method": "GET",
+  "path": "/my-plugin-route",
+  "handler": "MyPlugin.action",
+  "prefix": false
+}
+

CLI

The CLI can be used to generate files in the plugins folders.

Please refer to the CLI documentation for more informations.

Controllers

Controllers contain functions executed according to the requested route.

Please refer to the Controllers documentation for more informations.

Models

A plugin can have its own models.

Table/Collection naming

Sometimes it happens that the plugins inject models that have the same name as yours. Let's take a quick example.

You already have User model defining in your ./api/user/models/User.settings.json API. And you decide to install the Users & Permissions plugin. This plugin also contains a User model. To avoid the conflicts, the plugins' models are not globally exposed which means you cannot access to the plugin's model like this:

module.exports = {
+  findUser: async function (params) {
+    // This `User` global variable will always make a reference the User model defining in your `./api/xxx/models/User.settings.json`.
+    return await User.find();
+  }
+}
+

Also, the table/collection name won't be users because you already have a User model. That's why, the framework will automatically prefix the table/collection name for this model with the name of the plugin. Which means in our example, the table/collection name of the User model of our plugin Users & Permissions will be users-permissions_users. If you want to force the table/collection name of the plugin's model, you can add the collectionName attribute in your model.

Please refer to the Models documentation for more informations.

Policies

Global policies

A plugin can also use a globally exposed policy in the current Strapi project.

{
+  "routes": [
+    {
+      "method": "GET",
+      "path": "/",
+      "handler": "MyPlugin.index",
+      "config": {
+        "policies": [
+          "global.isAuthenticated"
+        ]
+      }
+    }
+  ]
+}
+

Plugin policies

A plugin can have its own policies, such as adding security rules. For instance, if the plugin includes a policy named isAuthenticated, the syntax to use this policy would be:

{
+  "routes": [
+    {
+      "method": "GET",
+      "path": "/",
+      "handler": "MyPlugin.index",
+      "config": {
+        "policies": [
+          "plugins.myPlugin.isAuthenticated"
+        ]
+      }
+    }
+  ]
+}
+

Please refer to the Policies documentation for more informations.

ORM queries

Strapi supports multiple ORMs in order to let the users choose the database management system that suits their needs. Hence, each plugin must be compatible with at least one ORM. Each plugin contains a folder named queries in ./plugins/**/api/queries. A folder must be created for each ORM (eg. mongoose) with a file named mongoose.js which exports the Mongoose ORM related queries.

The queries are accessible through the strapi.query() method, which automatically contains the queries according to the ORM used by the model.

Example

Mongoose ORM queries definition:

Path — ./plugins/my-plugin/api/config/queries/mongoose/index.js.

module.exports = {
+  getUsers: async (params) => {
+    return User.find(params);
+  }
+}
+

Bookshelf ORM queries definition:

Path — ./plugins/my-plugin/api/config/queries/bookshelf/index.js.

module.exports = {
+  getUsers: async (params) => {
+    return User.fetchAll(params);
+  }
+}
+

Usage from the plugin:

Path — ./plugins/my-plugin/api/controllers/index.js.

module.exports = {
+  getUsers: async () => {
+    // Get parameters from the request
+    const { limit, sort } = ctx.request.query;
+
+    // Get the list of users using the plugins queries
+    const users = await strapi.query('User').getUsers({ limit, sort });
+
+    // Send the list of users as response
+    ctx.body = users;
+  }
+}
+

Advanced usage

Each function in the query file is bound with the ORM's model. It means that you can create generic query very easily. This feature is useful for CRUD such as we did in the Content Manager plugin.

Mongoose ORM generic queries:

Path — ./plugins/my-plugin/api/config/queries/mongoose/index.js.

module.exports = {
+  getAll: async function (params) {
+    // this refers to the Mongoose model called in the query
+    // ex: strapi.query('User').getAll(), this will be equal to the User Mongoose model.
+    return this.find(params);
+  }
+}
+

Bookshelf ORM generic queries:

Path — ./plugins/my-plugin/api/config/queries/bookshelf/index.js.

module.exports = {
+  getAll: async function (params) {
+    // this refers to the Bookshelf model called in the query
+    // ex: strapi.query('User').getAll(), this will be equal to the User Bookshelf model.
+    return this.fetchAll(params);
+  }
+}
+

Usage from the plugin:

Path — ./plugins/my-plugin/api/controllers/index.js.

module.exports = {
+  getUsers: async () => {
+    // Get parameters from the request
+    const { limit, sort } = ctx.request.query;
+
+    // Get the list of users using the plugin's queries
+    const users = await strapi.query('User').getAll({ limit, sort });
+
+    // Send the list of users as response
+    ctx.body = users;
+  }
+}
+

+ + + diff --git a/docs/.vuepress/dist/3.x.x/plugin-development/frontend-development.html b/docs/.vuepress/dist/3.x.x/plugin-development/frontend-development.html new file mode 100644 index 0000000000..2ecfbb305d --- /dev/null +++ b/docs/.vuepress/dist/3.x.x/plugin-development/frontend-development.html @@ -0,0 +1,77 @@ + + + + + + Front-end Development | Strapi Docs + + + + + + + +

Front-end Development

This section explains how to create your plugin interface in the admin panel. Refer to the Plugin Development Quick Start Section to start the project in development mode.

Introduction

Strapi's admin panel and plugins system aim to be an easy and powerful way to create new features.

The admin panel is a React application which can embed other React applications. These other React applications are the admin parts of each Strapi's plugins.

Routing

The routing is based on the React Router V4, due to it's implementation each route is declared in the containers/App/index.js file.

Also, we chose to use the Switch Router because it renders a route exclusively.

Route declaration :

Let's say that you want to create a route /user with params /:id associated with the container UserPage.

The declaration would be as followed :

Path — plugins/my-plugin/admin/src/containers/App/index.js.

import React from 'react';
+import UserPage from 'containers/UserPage';
+
+// ...
+
+class App extends React.Component {
+  // ...
+
+  render() {
+    return (
+      <div className={styles.myPlugin}>
+        <Switch>
+          <Route exact path="/plugins/my-plugin/user/:id" component={UserPage} />
+        </Switch>
+      </div>
+    );
+  }
+}
+
+// ...
+

See the Front-end Use Cases for more informations.

Data flow

Each plugin has its own data store, so it stays completely independent from the others.

Data flow is controlled thanks to Redux and redux-sagas.

Styling

The Bootstrap styles are inherited by the plugins. However, each component has its own styles, so it possible to completely customize it.

See the plugin styles for informations on its concept.

To style a plugin component:

  • Add a styles.scss file in the component directory
  • Require it from the index.js file (import styles from './styles.scss';)
  • Add some styles in the styles.scss file
.wrapper {
+    display: block;
+    background: red;
+    height: 100px;
+    width: 100px;
+}
+

Use this style in the component: <div className={styles.wrapper}></div>.

if you want to use several classes:

import cn from 'classnames';
+import styles from './styles.scss';
+
+// ...
+
+return (
+  <div className={cn(styles.wrapper, styles.otherClass)}>{this.props.children}</div>
+);
+
+// ...
+
+

i18n

React Intl provides React components and an API to format dates, numbers, and strings, including pluralization and handling translations.

Usage

We recommend to set all your components text inside the translations folder.

The example below shows how to use i18n inside your plugin.

Define all your ids with the associated message:

Path — ./plugins/my-plugin/admin/src/translations/en.json.

{
+  "notification.error.message": "An error occurred"
+}
+

Path — ./plugins/my-plugin/admin/src/translations/fr.json

{
+  "notification.error.message": "Une erreur est survenue"
+}
+

Usage inside a component

Path — ./plugins/my-plugin/admin/src/components/Foo/index.js.

import { FormattedMessage } from 'react-intl';
+import SomeOtherComponent from 'components/SomeOtherComponent';
+
+const Foo = (props) => (
+  <div className={styles.foo}>
+    <FormattedMessage id="my-plugin.notification.error.message" />
+    <SomeOtherComponent {...props} />
+  </div>
+)
+
+export default Foo;
+

See the documentation for more extensive usage.

Generators

You can use generators to create React components or containers for your plugin.

  1. In your terminal go to your plugin folder cd plugins/my-plugin
  2. Run npm run generate and choose the type of component your want to create
+ + + diff --git a/docs/.vuepress/dist/3.x.x/plugin-development/frontend-use-cases.html b/docs/.vuepress/dist/3.x.x/plugin-development/frontend-use-cases.html new file mode 100644 index 0000000000..2118a6c2a5 --- /dev/null +++ b/docs/.vuepress/dist/3.x.x/plugin-development/frontend-use-cases.html @@ -0,0 +1,541 @@ + + + + + + Front-end Use Cases | Strapi Docs + + + + + + + +

Front-end Use Cases

This section gives use cases examples on front-end plugin development.

Plugin advanced usage

This section contains advanced resources to develop plugins.

Inject design

The ExtendComponent allows you to inject design from one plugin into another.

Example

Let's say that you want to enable another plugin to inject a component into the top area of your plugin's container called FooPage;

Path — ./plugins/my-plugin/admin/src/containers/FooPage/actions.js.

import {
+  ON_TOGGLE_SHOW_LOREM,
+} from './constants';
+
+export function onToggleShowLorem() {
+  return {
+    type: ON_TOGGLE_SHOW_LOREM,
+  };
+}
+

Path — ./plugins/my-plugin/admin/src/containers/FooPage/index.js.

import React from 'react';
+import { connect } from 'react-redux';
+import { bindActionCreators, compose } from 'redux';
+import { createStructuredSelector } from 'reselect';
+import PropTypes from 'prop-types';
+
+// Import the ExtendComponent
+import ExtendComponent from 'components/ExtendComponent';
+
+// Utils
+import injectReducer from 'utils/injectReducer';
+
+// Actions
+import { onToggleShowLorem } from './action'
+
+import reducer from './reducer';
+
+// Selectors
+import { makeSelectShowLorem } from './selectors';
+
+class FooPage extends React.Component {
+  render() {
+    const lorem = this.props.showLorem ? <p>Lorem ipsum dolor sit amet, consectetur adipiscing</p> : '';
+    return (
+      <div>
+        <h1>This is FooPage container</h1>
+        <ExtendComponent
+          area="top"
+          container="FooPage"
+          plugin="my-plugin"
+          {...props}
+        />
+        {lorem}
+      </div>
+    );
+  }
+}
+
+FooPage.propTypes = {
+  onToggleShowLorem: PropTypes.func.isRequired,
+  showLorem: PropTypes.bool.isRequired,
+};
+
+function mapDispatchToProps(dispatch) {
+  return bindActionCreators(
+    {
+      onToggleShowLorem,
+    },
+    dispatch,
+  );
+}
+
+const mapStateToProps = createStructuredSelector({
+  showLorem: makeSelectShowLorem(),
+});
+
+const withConnect = connect(mapDispatchToProps, mapDispatchToProps);
+const withReducer = injectReducer({ key: 'fooPage', reducer });
+
+export default compose(
+  withReducer,
+  withConnect,
+)(FooPage);
+

Path — ./plugins/my-plugin/admin/src/containers/FooPage/reducer.js.

import { fromJS } from 'immutable';
+import { ON_TOGGLE_SHOW_LOREM } from './constants';
+
+const initialState = fromJS({
+  showLorem: false,
+});
+
+function fooPageReducer(state= initialState, action) {
+  switch (action.type) {
+    case ON_TOGGLE_SHOW_LOREM:
+      return state.set('showLorem', !state.get('showLorem'));
+    default:
+      return state;
+  }
+}
+
+export default fooPageReducer;
+

Path — ./plugins/my-plugin/admin/src/containers/FooPage/selectors.js.

import  { createSelector } from 'reselect';
+
+/**
+* Direct selector to the fooPage state domain
+*/
+
+const selectFooPageDomain = () => state => state.get('fooPage');
+
+/**
+* Other specific selectors
+*/
+
+const makeSelectShowLorem = () => createSelector(
+  selectFooPageDomain(),
+  (substate) => substate.get('showLorem'),
+);
+
+export { makeSelectShowLorem };
+

That's all now your plugin's container is injectable!

Let's see how to inject a React Component from a plugin into another.

Create your injectedComponent

Path - ./plugins/another-plugin/admin/src/extendables/BarContainer/index.js;

import React from 'react';
+import PropTypes from 'prop-types';
+
+// Import our Button component
+import Button from 'components/Button';
+
+// Other imports such as actions, selectors, sagas, reducer...
+
+class BarContainer extends React.Component {
+  render() {
+    return (
+      <div>
+        <Button primary onClick={this.props.onToggleShowLorem}>
+          Click me to show lorem paragraph
+        </Button>
+      </div>
+    );
+  }
+}
+
+BarContainer.propTypes = {
+  onToggleShowLorem: PropTypes.func,
+};
+
+BarContainer.defaultProps = {
+  onToggleShowLorem: () => {},
+};
+
+export default BarContainer;
+

Tell the admin that you want to inject a React Component from a plugin into another

You have to create a file called injectedComponents.js at the root of your another-plugin src folder.

Path — ./plugins/another-plugin/admin/src/injectedComponents.js.

import BarContainer from 'extendables/BarContainer';
+
+// export an array containing all the injected components
+export default [
+  {
+    area: 'top',
+    container: 'FooPage',
+    injectedComponent: BarContainer,
+    plugin: 'my-plugin',
+  },
+];
+

Just by doing so, the another-plugin will add a Button which toggles the lorem paragraph in the FooPage view.


Routeless container store injection

If you have a container which can be a child of several other containers (i.e. it doesn't have a route); you'll have to inject it directly in the ./plugins/my-plugin/admin/src/containers/App/index.js file as follows :

Path — ./plugins/my-plugin/admin/src/containers/App/index.js.

// ...
+import fooReducer from 'containers/Foo/reducer';
+import fooSaga from 'container/Foo/sagas';
+
+import saga from './sagas';
+import { makeSelectFoo } from './selectors';
+
+// ...
+
+export class App extends React.Component {
+  render() {
+    return (
+      <div className={styles.app}>
+        <Switch>
+          {*/ List of all your routes here */}
+        </Switch>
+      </div>
+    );
+  }
+}
+
+// ...
+
+function mapDispatchToProps(dispatch) {
+  return bindActionCreators(
+    {
+    },
+    dispatch
+  );
+}
+
+const mapStateToProps = createStructuredSelector({
+  // ...
+});
+
+const withConnect = connect(mapStateToProps, mapDispatchToProps);
+// Foo reducer
+const withFooReducer = injectReducer({ key: 'foo', reducer: fooReducer });
+// Global reducer
+const withReducer = injectReducer({ key: 'global', reducer });
+// Foo saga
+const withFooSaga = injectSaga({ key: 'foo', saga: fooSaga });
+// Global saga
+const withSaga = injectSaga({ key: 'global', saga });
+
+export default compose(
+  withFooReducer,
+  withReducer,
+  withFooSaga,
+  withSaga,
+  withConnect,
+)(App);
+

Execute logic before mounting the plugin

You can execute a business logic before your plugin is being mounted.

Usage

To do this, you need to create bootstrap.js file at the root of your src plugin's folder. +This file must contains a default functions that returns a Promise.

Example

In this example, we want to populate the left menu with links that will refer to our Content Types.

Path — ./app/plugins/content-manager/admin/src/bootstrap.js.

import { generateMenu } from 'containers/App/sagas';
+
+// This method is executed before the load of the plugin
+const bootstrap = (plugin) => new Promise((resolve, reject) => {
+  generateMenu()
+    .then(menu => {
+      plugin.leftMenuSections = menu;
+
+      resolve(plugin);
+    })
+    .catch(e => reject(e));
+});
+
+export default bootstrap;
+

Prevent plugin rendering

You can prevent your plugin from being rendered if some conditions aren't met.

Usage

To disable your plugin's rendering, you can simply create requirements.js file at the root of your src plugin's folder. +This file must contain a default function that returns a Promise.

Example

Let's say that you want to disable your plugin if the server autoReload config is disabled in development mode.

Path — ./app/config/environments/development/server.json.

{
+  "host": "localhost",
+  "port": 1337,
+  "autoReload": {
+    "enabled": true
+  },
+  "cron": {
+    "enabled": false
+  }
+}
+

You'll first create a request to check if the autoReload config is enabled.

Path — ./app/plugins/my-plugin/config/routes.json.

{
+  "routes": [
+    {
+      "method": "GET",
+      "path": "/autoReload",
+      "handler": "MyPlugin.autoReload",
+      "config": {
+        "policies": []
+      }
+    }
+  ]
+}
+

Then the associated handler:

Path — ./app/plugins/my-plugin/controllers/MyPlugin.js.

const _ = require('lodash');
+const send = require('koa-send');
+
+module.exports = {
+  autoReload: async ctx => {
+    ctx.send({ autoReload: _.get(strapi.config.environments, 'development.server.autoReload', false) });
+  }
+}
+

Finally, you'll create a file called requirements.jsat the root of your plugin's src folder.

The default function exported must return a Promise. +If you wan't to prevent the plugin from being rendered you'll have to set plugin.preventComponentRendering = true;. +In this case, you'll have to set:

plugin.blockerComponentProps = {
+  blockerComponentTitle: 'my-plugin.blocker.title',
+  blockerComponentDescription: 'my-plugin.blocker.description',
+  blockerComponentIcon: 'fa-refresh',
+};
+

To follow the example above:

Path — ./app/plugins/my-plugin/admin/src/requirements.js.

// Use our request helper
+import request from 'utils/request';
+
+const shouldRenderCompo = (plugin) => new Promise((resolve, request) => {
+  request('/my-plugin/autoReload')
+    .then(response => {
+      // If autoReload is enabled the response is `{ autoReload: true }`
+      plugin.preventComponentRendering = !response.autoReload;
+      // Set the BlockerComponent props
+      plugin.blockerComponentProps = {
+        blockerComponentTitle: 'my-plugin.blocker.title',
+        blockerComponentDescription: 'my-plugin.blocker.description',
+        blockerComponentIcon: 'fa-refresh',
+        blockerComponentContent: 'renderIde', // renderIde will add an ide section that shows the development environment server.json config
+      };
+
+      return resolve(plugin);
+    })
+    .catch(err => reject(err));
+});
+
+export default shouldRenderCompo;
+

Customization

You can render your own custom blocker by doing as follows:

Path — ./app/plugins/my-plugin/admin/src/requirements.js.

// Use our request helper
+import request from 'utils/request';
+
+// Your custom blockerComponentProps
+import MyCustomBlockerComponent from 'components/MyCustomBlockerComponent';
+
+const shouldRenderCompo = (plugin) => new Promise((resolve, request) => {
+  request('/my-plugin/autoReload')
+    .then(response => {
+      // If autoReload is enabled the response is `{ autoReload: true }`
+      plugin.preventComponentRendering = !response.autoReload;
+
+      // Tell which component to be rendered instead
+      plugin.blockerComponent = MyCustomBlockerComponent;
+
+      return resolve(plugin);
+    })
+    .catch(err => reject(err));
+});
+
+export default shouldRenderCompo;
+

Using React/Redux and sagas

If your application is going to interact with some back-end application for data, we recommend using redux saga for side effect management. +This short tutorial will show how to fetch data using actions/reducer/sagas.

Constants declaration

Path — ./plugins/my-plugin/admin/src/containers/FooPage/constants.js

export const DATA_FETCH = 'MyPlugin/FooPage/DATA_FETCH';
+export const DATA_FETCH_ERROR = 'MyPlugin/FooPage/DATA_FETCH_ERROR';
+export const DATA_FETCH_SUCCEEDED = 'MyPlugin/FooPage/DATA_FETCH_SUCCEEDED';
+

Actions declaration

Path — ./plugins/my-plugin/admin/src/containers/FooPage/actions.js

import {
+  DATA_FETCH,
+  DATA_FETCH_ERROR,
+  DATA_FETCH_SUCCEEDED,
+} from './constants';
+
+export function dataFetch(params) {
+  return {
+    type: DATA_FETCH,
+    params,
+  };
+}
+
+export function dataFetchError(errorMessage) {
+  return {
+    type: DATA_FETCH_ERROR,
+    errorMessage,
+  };
+}
+
+export function dataFetchSucceeded(data) {
+  return {
+    type: DATA_FETCH_SUCCEEDED,
+    data,
+  };
+}
+

Reducer

We strongly recommend to use Immutable.js to structure your data.

Path — ./plugins/my-plugin/admin/src/containers/FooPage/reducer.js

import { fromJS, Map } from 'immutable';
+import {
+  DATA_FETCH_ERROR,
+  DATA_FETCH_SUCCEEDED,
+} from './constants';
+
+const initialState = fromJS({
+  data: Map({}),
+  error: false,
+  errorMessage: '',
+  loading: true,
+});
+
+function fooPageReducer(state = initialState, action) {
+  switch (action.type) {
+    case DATA_FETCH_ERROR:
+      return state
+        .set('error', true)
+        .set('errorMessage', action.errorMessage)
+        .set('loading', false);
+    case DATA_FETCH_SUCCEEDED:
+      return state
+        .set('data', Map(action.data))
+        .set('error', false)
+        .set('errorMessage', '')
+        .set('loading', false);
+    default:
+      return state;
+  }
+}
+
+export default fooPageReducer;
+

Sagas

Path — ./plugins/my-plugin/admin/src/containers/FooPage/sagas.js

import { LOCATION_CHANGE } from 'react-router-redux';
+import { takeLatest, put, fork, call, take, cancel } from 'redux-saga/effects';
+
+// Use our request helper
+import request from 'utils/request';
+
+// Actions
+import { dataFetchError, dataFetchSucceeded } from './actions';
+import { DATA_FETCH } from './constants';
+
+export function* fetchData(action) {
+  try {
+    const requestUrl = `/baseUrl/${action.params}`;
+    const opts = {
+      method: 'GET',
+    };
+
+    // Fetch data
+    const response = yield call(request, requestUrl, opts);
+
+    // Pass the response to the reducer
+    yield put(dataFetchSucceeded(response));
+
+  } catch(error) {
+    yield put(dataFetchError(error));
+  }
+}
+
+// Individual export for testing
+function* defaultSaga() {
+  // Listen to DATA_FETCH event
+  const fetchDataWatcher = yield fork(takeLatest, DATA_FETCH, fetchData);
+
+  // Cancel watcher
+  yield take(LOCATION_CHANGE);
+
+  yield cancel(fetchDataWatcher);
+}
+
+export default defaultSaga;
+

N.B. You can use a selector in your sagas :

import { put, select, fork, call, take, cancel } from 'redux-saga/effects';
+import { makeSelectUserName } from './selectors';
+
+export function* foo() {
+  try {
+    const userName = yield select(makeSelectUserName());
+
+    // ...
+  } catch(error) {
+    // ...
+  }
+}
+
+function defaultSaga() {
+  // ...
+}
+
+export default defaultSaga;
+

Selectors

Reselect is a library used for slicing your redux state and providing only the relevant sub-tree to a react component. It has three key features:

  1. Computational power
  2. Memoization
  3. Composability

Creating a selector:

Path — ./plugins/my-plugin/admin/src/containers/FooPage/selectors.js

import { createSelector } from 'reselect';
+
+/**
+* Direct selector to the fooPage state domain
+*/
+const selectFooPageDomain = () => state => state.get('fooPage');
+
+/**
+ * Other specific selectors
+ */
+
+ const makeSelectLoading = () => createSelector(
+   selectFooPageDomain(),
+   (substate) => substate.get('loading'),
+ );
+
+/**
+ * Default selector used by FooPage
+ */
+
+const selectFooPage = () => createSelector(
+  selectFooDomain(),
+  (substate) => substate.toJS()
+);
+
+export default selectFooPage;
+export { makeSelectLoading };
+
+

Example

Path — ./plugins/my-plugin/admin/src/containers/FooPage/index.js

import React from 'react';
+import { bindActionCreators } from 'redux';
+import { connect, compose } from 'react-redux';
+import PropTypes from 'prop-types';
+
+// Main router
+import { router } from 'app';
+
+// Utils
+import injectSaga from 'utils/injectSaga';
+import injectReducer from 'utils/injectReducer';
+
+// Actions
+import { dataFetch } from './actions';
+// sagas
+import saga from './sagas';
+// Selectors
+import selectFooPage from './selectors';
+// Reducer
+import reducer from './reducer';
+
+export class FooPage extends React.Component {
+  componentWillReceiveProps(nextProps) {
+    if (this.props.error !== nextProps.error && nextProps.error) {
+      strapi.notification.error(nextProps.errorMessage);
+    }
+  }
+
+  componentDidUpdate(prevProps) {
+    if (prevProps.match.pathname !== this.props.pathname) {
+      this.props.dataFetch(this.props.match.params.bar);
+    }
+  }
+
+  render() {
+    if (this.props.error) return <div>An error occurred</div>;
+
+    return (
+      <div>
+        <h4>Data display</h4>
+        <span>{this.props.data.foo}</span>
+        <span>{this.props.data.bar}</span>
+      </div>
+    );
+  }
+
+  FooPage.propTypes = {
+    data: PropTypes.object.isRequired,
+    dataFetch: PropTypes.func.isRequired,
+    error: PropTypes.bool.isRequired,
+    errorMessage: PropTypes.string.isRequired,
+    match: PropTypes.object.isRequired,
+  };
+
+  const mapStateToProps = selectFoo();
+
+  function mapDispatchToProps(dispatch) {
+    return bindActionCreators(
+      {
+        dataFetch,
+      },
+      dispatch
+    );
+  }
+
+  const withConnect = connect(mapStateToProps, mapDispatchToProps);
+  const withReducer = injectReducer({ key: 'fooPage', reducer });
+  const withSagas = injectSaga({ key: 'fooPage', saga });
+
+  export default compose(
+    withReducer,
+    withSagas,
+    withConnect,
+  )(FooPage);
+}
+
+ + + diff --git a/docs/.vuepress/dist/3.x.x/plugin-development/plugin-architecture.html b/docs/.vuepress/dist/3.x.x/plugin-development/plugin-architecture.html new file mode 100644 index 0000000000..a431458bf2 --- /dev/null +++ b/docs/.vuepress/dist/3.x.x/plugin-development/plugin-architecture.html @@ -0,0 +1,55 @@ + + + + + + Plugin Folders and Files Architecture | Strapi Docs + + + + + + + +

Plugin Folders and Files Architecture

The logic of a plugin is located at his root directory ./plugins/**. The admin panel related parts of each plugin is contained in the /admin folder. +The folders and files structure is the following:

/plugin
+└─── admin // Contains the plugin's front-end
+|     └─── build // Webpack build of the plugin
+|     └─── src // Source code directory
+|          └─── bootstrap.js // (Optional) Contains the logic to execute before rendering the plugin
+|          └─── components // Contains the list of React components used by the plugin
+|          └─── containers
+|          |    └─── App // Container used by every others containers
+|          |    └─── HomePage
+|          |         └─── action.js // List of Redux actions used by the current container
+|          |         └─── constants.js // List of actions constants
+|          |         └─── index.js // React component of the current container
+|          |         └─── reducer.js // Redux reducer used by the current container
+|          |         └─── sagas.js // List of sagas functions
+|          |         └─── selectors.js // List of selectors
+|          |         └─── styles.scss // Style of the current container
+|          |
+|          └─── requirements.js // (Optional) Contains the logic to prevent a plugin from being rendered
+|          └─── translations // Contains the translations to make the plugin internationalized
+|               └─── en.json
+|               └─── fr.json
+└─── config // Contains the configurations of the plugin
+|     └─── functions
+|     |    └─── bootstrap.js // Asynchronous bootstrap function that runs before the app gets started
+|     └─── policies // Folder containing the plugin's policies
+|     └─── queries // Folder containing the plugin's models queries
+|     └─── routes.json // Contains the plugin's API routes
+└─── controllers // Contains the plugin's API controllers
+└─── middlewares // Contains the plugin's middlewares
+└─── models // Contains the plugin's API models
+└─── services // Contains the plugin's API services
+
+ + + diff --git a/docs/.vuepress/dist/3.x.x/plugin-development/plugin-left-menu.html b/docs/.vuepress/dist/3.x.x/plugin-development/plugin-left-menu.html new file mode 100644 index 0000000000..42e9a25f9c --- /dev/null +++ b/docs/.vuepress/dist/3.x.x/plugin-development/plugin-left-menu.html @@ -0,0 +1,135 @@ + + + + + + Plugin Menu library | Strapi Docs + + + + + + + +

Plugin Menu library

// ...
+
+import PluginLeftMenu from 'components/PluginLeftMenu';
+
+// ...
+
+const Foo = (props) => {
+  const sections = [
+    {
+      name: 'section 1',
+      items: [
+        { icon: 'fa-caret-square-o-right', name: 'link 1'},
+        { icon: 'fa-caret-square-o-right', name: 'link 2'},
+      ],
+    },
+  ];
+
+  return (
+    <div className={styles.foo}>
+      <div className="container-fluid">
+        <div className="row">
+          <PluginLeftMenu
+            sections={sections}
+          />
+        </div>
+      </div>
+    </div>
+  );
+}
+
+export default Foo;
+
+// ...
+

Usage

Property Type Required Description
addCustomSection function no Allows to add another section after the initial one.
basePath string yes For example the basePath of the route '/plugins/my-plugin/foo/bar' is 'my-plugin/categories'
renderCustomLink function no Allows to override the design and the behavior of a link
sections array yes Sections of the component menu

Example

// ...
+
+import PluginLeftMenu from 'components/PluginLeftMenu';
+
+// ...
+
+const addCustomSection = (sectionStyles) => (
+  // You have access to the section styles
+  <div className={sectionStyles.pluginLeftMenuSection}>
+    <p>
+      DOCUMENTATION
+    </p>
+    <ul>
+      <li>
+        Read more about strapi in our <a href="http://strapi.io/documentation" target="_blank">documentation</a>
+      </li>
+    </ul>
+  </div>
+)
+
+const renderAddLink = (props, customLinkStyles) => (
+  <li className={customLinkStyles.pluginLeftMenuLink}>
+    <div className={`${customLinkStyles.liInnerContainer}`} onClick={this.handleAddLinkClick}>
+      <div>
+        <i className={`fa ${props.link.icon}`} />
+      </div>
+      <span>{props.link.name}</span>
+    </div>
+  </li>
+)
+
+const renderCustomLink = (props, linkStyles) => {
+  if (props.link.name === 'bar') return this.renderAddLink(props, linkStyles);
+
+  return (
+    <li className={linkStyles.pluginLeftMenuLink}>
+      <NavLink className={linkStyles.link} to={`/plugins/my-plugin/foo/${props.link.name}`} activeClassName={linkStyles.linkActive}>
+        <div>
+          <i className={`fa fa-caret-square-o-right`} />
+        </div>
+        <div className={styles.contentContainer}>
+          <span className={spanStyle}>{props.link.name}</span>
+        </div>
+
+      </NavLink>
+    </li>
+  );
+}
+
+const Foo = (props) => {
+  const sections = [
+    {
+      name: 'section 1',
+      items: [
+        { icon: 'fa-caret-square-o-right', name: 'link 1'},
+        { icon: 'fa-caret-square-o-right', name: 'link 2'},
+      ],
+    },
+  ];
+
+  return (
+    <div className={styles.foo}>
+      <div className="container-fluid">
+        <div className="row">
+          <PluginLeftMenu
+            addCustomSection={addCustomSection}
+            sections={sections}
+            renderCustomLink={renderCustomLink}
+            basePath="my-plugins/foo"
+          />
+        </div>
+      </div>
+    </div>
+  );
+}
+
+// ...
+
+export default Foo;
+
+ + + diff --git a/docs/.vuepress/dist/3.x.x/plugin-development/quick-start.html b/docs/.vuepress/dist/3.x.x/plugin-development/quick-start.html new file mode 100644 index 0000000000..6ceafb403b --- /dev/null +++ b/docs/.vuepress/dist/3.x.x/plugin-development/quick-start.html @@ -0,0 +1,23 @@ + + + + + + Quick start | Strapi Docs + + + + + + + +

Quick start

To facilitate the development of a plugin, we drastically reduce the amount of commands necessary to install the entire development environment. Before getting started, you need to have Node.js (v8) and npm (v5) installed.

Development Environment Setup

To setup the development environment please follow the instructions below:

  1. Fork the repository to your own GitHub account.
  2. Clone it to your computer git clone git@github.com:strapi/strapi.git.
  3. Run npm run setup at the root of the directory.

You can run npm run setup:build to build the plugins' admin (the setup time will be longer)

If the installation failed, please remove the global packages related to Strapi. The command npm ls strapi will help you to find where your packages are installed globally.

Plugin development Setup

Create a development project

  1. Go to a folder on your computer cd /path/to/my/folder.
  2. Create a new project strapi new myDevelopmentProject --dev.

To generate a new plugin run the following commands:

  1. In your project folder cd myDevelopmentProject && strapi generate:plugin my-plugin.
  2. Link the strapi-helper-plugin dependency in your project folder cd pathToMyProject/myDevelopmentProject/plugins/my-plugin && npm link strapi-helper-plugin.
  3. Link the strapi-helper-plugin dependency in the analytics plugin folder cd pathToMyProject/myDevelopmentProject/plugins/analytics && npm link strapi-helper-plugin.
  4. Start the server in the admin folder cd pathToMyProject/myDevelopmentProject/admin && npm start and go to the following url http://localhost:4000/admin.
  5. In a new terminal window open at the root of your project launch your Strapi server strapi start.

Your are now ready to develop your own plugin and live-test your updates!

+ + + diff --git a/docs/.vuepress/dist/3.x.x/plugin-development/ui-components.html b/docs/.vuepress/dist/3.x.x/plugin-development/ui-components.html new file mode 100644 index 0000000000..75c6dfdabe --- /dev/null +++ b/docs/.vuepress/dist/3.x.x/plugin-development/ui-components.html @@ -0,0 +1,23 @@ + + + + + + Strapi Docs + + + + + + + + + + + diff --git a/docs/.vuepress/dist/3.x.x/plugin-development/utils.html b/docs/.vuepress/dist/3.x.x/plugin-development/utils.html new file mode 100644 index 0000000000..f23857dccc --- /dev/null +++ b/docs/.vuepress/dist/3.x.x/plugin-development/utils.html @@ -0,0 +1,356 @@ + + + + + + Helpers | Strapi Docs + + + + + + + +

Helpers

Strapi provides helpers so you don't have to develop again and again the same generic functions.

Auth

auth.js lets you get, set and delete data in either the browser's localStorage or sessionStorage.

Methods

Name Description
clear(key) Remove the data in either localStorage or sessionStorage
clearAppStorage() Remove all data from both storage
clearToken() Remove the user's jwt Token in the appropriate browser's storage
clearUserInfo() Remove the user's info from storage
get(key) Get the item in the browser's storage
getToken() Get the user's jwtToken
getUserInfo() Get the user's infos
set(value, key, isLocalStorage) Set an item in the sessionStorage. If true is passed as the 3rd parameter it sets the value in the localStorage
setToken(value, isLocalStorage) Set the user's jwtToken in the sessionStorage. If true is passed as the 2nd parameter it sets the value in the localStorage
setUserInfo(value, isLocalStorage) Set the user's info in the sessionStorage. If true is passed as the 2nd parameter it sets the value in the localStorage
import auth from 'utils/auth';
+
+// ...
+//
+auth.setToken('12345', true); // This will set 1234 in the browser's localStorage associated with the key: jwtToken
+

Colors

This function allows to darken a color.

Usage

import { darken } from 'utils/colors';
+
+const linkColor = darken('#f5f5f5', 1.5); // Will darken #F5F5F5 by 1.5% which gives #f2f2f2.
+

Get URL Query Parameters

The helpers allows to retrieve the query parameters in the URL.

Example

import getQueryParameters from 'utils/getQueryParameters';
+
+const URL = '/create?source=users-permissions';
+const source = getQueryParameters(URL, 'source');
+
+console.log(source); // users-permissions
+
+

Request helper

A request helper is available to handle all requests inside a plugin.

It takes three arguments:

  • requestUrl: The url we want to fetch.
  • options: Please refer to this documentation.
  • true: This third argument is optional. If true is passed the response will be sent only if the server has restarted check out the example.

Usage

Path - /plugins/my-plugin/admin/src/containers/**/sagas.js.

import { call, fork, put, takeLatest } from 'redux-saga/effects';
+
+// Our request helper
+import request from 'utils/request';
+import { dataFetchSucceeded, dataFetchError } from './actions';
+import { DATA_FETCH } from './constants';
+
+export function* fetchData(action) {
+  try {
+    const opts = {
+      method: 'GET',
+    };
+    const requestUrl = `/my-plugin/${action.endPoint}`;
+    const data = yield call(request, requestUrl, opts);
+
+    yield put(dataFetchSucceeded(data));
+  } catch(error) {
+    yield put(dataFetchError(error))
+  }
+}
+
+// Individual exports for testing
+function* defaultSaga() {
+  yield fork(takeLatest, DATA_FETCH, fetchData);
+}
+
+export default defaultSaga;
+

Simple example

Let's say that we have a container that fetches Content Type configurations depending on URL change.

Routing declaration:

Here we want to create a route /content-type/:contentTypeName for the ContentTypePage container.

Path — ./plugins/my-plugin/admin/src/container/App/index.js.

import React from 'react';
+import { connect } from 'react-redux';
+import { bindActionCreators, compose } from 'redux';
+
+import { createStructuredSelector } from 'reselect';
+import { Switch, Route, withRouter } from 'react-router-dom';
+import PropTypes from 'prop-types';
+import { pluginId } from 'app';
+
+import ContentTypePage from 'containers/ContentTypePage';
+import styles from './styles.scss';
+
+class App extends React.Component {
+  render() {
+    return (
+      <div className={`${pluginId} ${styles.app}`}>
+        <Switch>
+          <Route exact path="/plugins/my-plugin/content-type/:contentTypeName" component={ContentTypePage} />
+        </Switch>
+      </div>
+    );
+  }
+}
+
+App.contextTypes = {
+  router: PropTypes.object.isRequired,
+};
+
+export function mapDispatchToProps(dispatch) {
+  return bindActionCreators(
+    {},
+    dispatch
+  );
+}
+
+const mapStateToProps = createStructuredSelector({});
+const withConnect = connect(mapStateToProps, mapDispatchToProps);
+
+export default compose(
+  withConnect,
+)(App);
+
+

Constants declaration:

Let's declare the needed constants to handle fetching data:

Path — ./plugins/my-plugin/admin/src/containers/ContentTypePage/constants.js.

export const DATA_FETCH = 'myPlugin/ContentTypePage/DATA_FETCH';
+export const DATA_FETCH_ERROR = 'myPlugin/ContentTypePage/DATA_FETCH_ERROR';
+export const DATA_FETCH_SUCCEEDED = 'myPlugin/ContentTypePage/DATA_FETCH_SUCCEEDED';
+

Actions declaration:

Let's declare our actions.

Path — ./plugins/my-plugin/admin/src/containers/ContentTypePage/actions.js.

import {
+  DATA_FETCH,
+  DATA_FETCH_ERROR,
+  DATA_FETCH_SUCCEEDED,
+} from './constants';
+
+export function dataFetch(contentTypeName) {
+  return {
+    type: DATA_FETCH,
+    contentTypeName,
+  };
+}
+
+export function dataFetchError(errorMessage) {
+  return {
+    type: DATA_FETCH_ERROR,
+    errorMessage,
+  };
+}
+
+export function dataFetchSucceeded(data) {
+  // data will look like { data: { name: 'User', description: 'Some description' } }
+  return {
+    type: DATA_FETCH_SUCCEEDED,
+    data,
+  };
+}
+

Reducer setup:

Please refer to the Immutable documentation for informations about data structure.

Path — ./plugins/my-plugin/admin/src/containers/ContentTypePage/reducer.js.

import { fromJS, Map } from 'immutable';
+import {
+  DATA_FETCH,
+  DATA_FETCH_ERROR,
+  DATA_FETCH_SUCCEEDED
+} from './constants';
+
+const initialState = fromJS({
+  contentTypeName,
+  error: false,
+  errorMessage: '',
+  data: Map({}),
+});
+
+function contentTypePageReducer(state = initialState, action) {
+  switch (action.type) {
+    case DATA_FETCH:
+      return state.set('contentTypeName', action.contentTypeName);
+    case DATA_FETCH_ERROR:
+      return state
+        .set('error', true)
+        .set('errorMessage', action.errorMessage);
+    case DATA_FETCH_SUCCEEDED:
+      return state
+        .set('error', false)
+        .set('data', Map(action.data.data));
+    default:
+      return state;
+  }
+}
+
+export default contentTypePageReducer;
+

Selectors setup:

Path — ./plugins/my-plugin/admin/src/containers/ContentTypePage/selectors.js.

import { createSelector } from 'reselect';
+
+/**
+ * Direct selector to the contentTypePage state domain
+ */
+const selectContentTypePageDomain = () => state => state.get('contentTypePage');
+
+/**
+ * Other specific selectors
+ */
+
+
+/**
+ * Default selector used by ContentTypePage
+ */
+
+const selectContentTypePage = () => createSelector(
+  selectContentTypePageDomain(),
+  (substate) => substate.toJS()
+);
+
+const makeSelectContentTypeName = () => createSelector(
+  selectContentTypePageDomain(),
+  (substate) => substate.get('contentTypeName');
+)
+export default selectContentTypePage;
+export { makeSelectContentTypeName, selectContentTypePageDomain };
+

Handling route change:

Path — ./plugins/my-plugin/admin/src/containers/ContentTypePage/index.js.

import React from 'react';
+import { connect } from 'react-redux';
+import { createStructuredSelector } from 'reselect';
+import { bindActionCreators, compose } from 'redux';
+import { NavLink } from 'react-router-dom';
+import PropTypes from 'prop-types';
+import { map } from 'lodash';
+
+// Utils to create the container's store
+import injectSaga from 'utils/injectSaga';
+import injectReducer from 'utils/injectReducer';
+
+import { dataFetch } from './actions';
+import { selectContentTypePage } from './selectors';
+import saga from './sagas';
+import reducer from './reducer';
+import styles from './styles.scss';
+
+export class ContentTypePage extends React.Component { // eslint-disable-line react/prefer-stateless-function
+  constructor(props) {
+    super(props);
+
+    this.links = [
+      {
+        to: 'plugin/my-plugin/content-type/product',
+        info: 'Product',
+      },
+      {
+        to: 'plugin/my-plugin/content-type/user',
+        info: 'User',
+      },
+    ];
+  }
+
+  componentDidMount() {
+    this.props.dataFetch(this.props.match.params.contentTypeName);
+  }
+
+  componentWillReceiveProps(nextProps) {
+    if (nextProps.match.params.contentTypeName !== this.props.match.params.contentTypeName) {
+      this.props.dataFetch(nextProps.match.params.contentTypeName);
+    }
+  }
+
+  render() {
+    return (
+      <div className={styles.contentTypePage}>
+        <div>
+          <ul>
+            {map(this.links, (link, key) => (
+              <li key={key}>
+                <NavLink to={link.to}>{link.info}</NavLink>
+              </li>
+            ))}
+          </ul>
+        </div>
+        <div>
+          <h1>{this.props.data.name}</h1>
+          <p>{this.props.data.description}</p>
+        </div>
+      </div>
+    );
+  }
+}
+
+const mapStateToProps = selectContentTypePage();
+
+function mapDispatchToProps(dispatch) {
+  return bindActionCreators(
+    {
+      dataFetch,
+    },
+    dispatch,
+  );
+}
+
+ContentTypePage.propTypes = {
+  data: PropTypes.object.isRequired,
+  dataFetch: PropTypes.func.isRequired,
+  match: PropTypes.object.isRequired,
+};
+
+const withConnect = connect(mapStateToProps, mapDispatchToProps);
+const withSaga = injectSaga({ key: 'contentTypePage', saga });
+const withReducer = injectReducer({ key: 'contentTypePage', reducer });
+
+export default compose(
+  withReducer,
+  withSaga,
+  withConnect,
+)(ContentTypePage);
+

Fetching data:

The sagas.js file is in charge of fetching data.

Path — ./plugins/my-plugin/admin/src/containers/ContentTypePage/sagas.js.

import { LOCATION_CHANGE } from 'react-router-redux';
+import { takeLatest, call, take, put, fork, cancel, select } from 'redux-saga/effects';
+import request from 'utils/request';
+import {
+  dataFetchError,
+  dataFetchSucceeded,
+} from './actions';
+import { DATA_FETCH } from './constants';
+import { makeSelectContentTypeName } from './selectors';
+
+export function* fetchData() {
+  try {
+    const opts = { method: 'GET' };
+
+    // To make a POST request { method: 'POST', body: {Object} }
+
+    const endPoint = yield select(makeSelectContentTypeName());
+    const requestUrl = `my-plugin/**/${endPoint}`;
+
+    // Fetching data with our request helper
+    const data = yield call(request, requestUrl, opts);
+    yield put(dataFetchSucceeded(data));
+  } catch(error) {
+    yield put(dataFetchError(error.message));
+  }
+}
+
+function* defaultSaga() {
+  const loadDataWatcher = yield fork(takeLatest, DATA_FETCH, fetchData);
+
+  yield take(LOCATION_CHANGE);
+  yield cancel(loadDataWatcher);
+}
+
+export default defaultSaga;
+

Example with server autoReload watcher

Let's say that you want to develop a plugin that needs server restart on file change (like the settings-manager plugin) and you want to be aware of that to display some stuff..., you just have to send a third argument: true to our request helper and it will ping a dedicated route and send the response when the server has restarted.

Path — ./plugins/my-plugin/admin/src/containers/**/sagas.js.

import { takeLatest, call, take, put, fork, cancel, select } from 'redux-saga/effects';
+import request from 'utils/request';
+import {
+  submitSucceeded,
+  submitError,
+} from './actions';
+import { SUBMIT } from './constants';
+// Other useful imports like selectors...
+// ...
+
+export function* postData() {
+  try {
+    const body = { data: 'someData' };
+    const opts = { method: 'POST', body };
+    const requestUrl = `**yourUrl**`;
+
+    const response = yield call(request, requestUrl, opts, true);
+
+    if (response.ok) {
+      yield put(submitSucceeded());      
+    } else {
+      yield put(submitError('An error occurred'));
+    }
+  } catch(error) {
+    yield put(submitError(error.message));
+  }
+}
+
+function* defaultSaga() {
+  yield fork(takeLatest, SUBMIT, postData);
+  // ...
+}
+
+export default defaultSaga;
+
+ + + diff --git a/docs/.vuepress/dist/3.x.x/tutorials/index.html b/docs/.vuepress/dist/3.x.x/tutorials/index.html new file mode 100644 index 0000000000..a5cd13fbe5 --- /dev/null +++ b/docs/.vuepress/dist/3.x.x/tutorials/index.html @@ -0,0 +1,26 @@ + + + + + + Tutorials | Strapi Docs + + + + + + + + + + + diff --git a/docs/.vuepress/dist/404.html b/docs/.vuepress/dist/404.html new file mode 100644 index 0000000000..0df28f2f35 --- /dev/null +++ b/docs/.vuepress/dist/404.html @@ -0,0 +1,17 @@ + + + + + + Strapi Docs + + + + + + + +

404

There's nothing here.
Take me home.
+ + + diff --git a/docs/.vuepress/dist/assets/css/1.styles.77d89b12.css b/docs/.vuepress/dist/assets/css/1.styles.77d89b12.css new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/.vuepress/dist/assets/css/2.styles.08038ddb.css b/docs/.vuepress/dist/assets/css/2.styles.08038ddb.css new file mode 100644 index 0000000000..4cbd7d26ef --- /dev/null +++ b/docs/.vuepress/dist/assets/css/2.styles.08038ddb.css @@ -0,0 +1 @@ +.badge[data-v-099ab69c]{display:inline-block;font-size:14px;height:18px;line-height:18px;border-radius:3px;padding:0 6px;color:#fff;margin-right:5px;background-color:#42b983}.badge.middle[data-v-099ab69c]{vertical-align:middle}.badge.top[data-v-099ab69c]{vertical-align:top}.badge.green[data-v-099ab69c],.badge.tip[data-v-099ab69c]{background-color:#42b983}.badge.error[data-v-099ab69c]{background-color:#da5961}.badge.warn[data-v-099ab69c],.badge.warning[data-v-099ab69c],.badge.yellow[data-v-099ab69c]{background-color:#e7c000} \ No newline at end of file diff --git a/docs/.vuepress/dist/assets/css/styles.a8210063.css b/docs/.vuepress/dist/assets/css/styles.a8210063.css new file mode 100644 index 0000000000..c5cfa7df71 --- /dev/null +++ b/docs/.vuepress/dist/assets/css/styles.a8210063.css @@ -0,0 +1 @@ +.home{padding:3.6rem 2rem 0;max-width:960px;margin:0 auto}.home .hero{text-align:center}.home .hero img{max-height:280px;display:block;margin:3rem auto 1.5rem}.home .hero h1{font-size:3rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.8rem auto}.home .hero .description{max-width:35rem;font-size:1.6rem;line-height:1.3;color:#6a8bad}.home .hero .action-button{display:inline-block;font-size:1.2rem;color:#fff;background-color:#2f80ed;padding:.8rem 1.6rem;border-radius:4px;transition:background-color .1s ease;box-sizing:border-box;border-bottom:1px solid #1570eb}.home .hero .action-button:hover{background-color:#448def}.home .features{border-top:1px solid #eaecef;padding:1.2rem 0;margin-top:2.5rem;display:flex;flex-wrap:wrap;align-items:flex-start;align-content:stretch;justify-content:space-between}.home .feature{flex-grow:1;flex-basis:30%;max-width:30%}.home .feature h2{font-size:1.4rem;font-weight:500;border-bottom:none;padding-bottom:0;color:#3a5169}.home .feature p{color:#4e6e8e}.home .footer{padding:2.5rem;border-top:1px solid #eaecef;text-align:center;color:#4e6e8e}@media (max-width:719px){.home .features{flex-direction:column}.home .feature{max-width:100%;padding:0 2.5rem}}@media (max-width:419px){.home{padding-left:1.5rem;padding-right:1.5rem}.home .hero img{max-height:210px;margin:2rem auto 1.2rem}.home .hero h1{font-size:2rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.2rem auto}.home .hero .description{font-size:1.2rem}.home .hero .action-button{font-size:1rem;padding:.6rem 1.2rem}.home .feature h2{font-size:1.25rem}}.sidebar-button{display:none;width:1.25rem;height:1.25rem;position:absolute;padding:.6rem;top:.6rem;left:1rem}.sidebar-button .icon{display:block;width:1.25rem;height:1.25rem}@media (max-width:719px){.sidebar-button{display:block}}.search-box{display:inline-block;position:relative;margin-right:.5rem}.search-box input{cursor:text;width:10rem;color:#4e6e8e;display:inline-block;border:1px solid #cfd4db;border-radius:2rem;font-size:.9rem;line-height:2rem;padding:0 .5rem 0 2rem;outline:none;transition:all .2s ease;background:#fff url(/documentation/assets/img/search.83621669.svg) .6rem .5rem no-repeat;background-size:1rem}.search-box input:focus{cursor:auto;border-color:#2f80ed}.search-box .suggestions{background:#fff;width:20rem;position:absolute;top:1.5rem;border:1px solid #cfd4db;border-radius:6px;padding:.4rem;list-style-type:none}.search-box .suggestions.align-right{right:0}.search-box .suggestion{line-height:1.4;padding:.4rem .6rem;border-radius:4px;cursor:pointer}.search-box .suggestion a{color:#5d82a6}.search-box .suggestion a .page-title{font-weight:600}.search-box .suggestion a .header{font-size:.9em;margin-left:.25em}.search-box .suggestion.focused{background-color:#f3f4f5}.search-box .suggestion.focused a{color:#2f80ed}@media (max-width:959px){.search-box input{cursor:pointer;width:0;border-color:transparent;position:relative;left:1rem}.search-box input:focus{cursor:text;left:0;width:10rem}}@media (max-width:959px) and (min-width:719px){.search-box .suggestions{left:0}}@media (max-width:719px){.search-box{margin-right:0}.search-box .suggestions{right:0}}@media (max-width:419px){.search-box .suggestions{width:calc(100vw - 4rem)}.search-box input:focus{width:8rem}}.dropdown-enter,.dropdown-leave-to{height:0!important}.dropdown-wrapper .dropdown-title{display:block}.dropdown-wrapper .dropdown-title:hover{border-color:transparent}.dropdown-wrapper .dropdown-title .arrow{vertical-align:middle;margin-top:-1px;margin-left:.4rem}.dropdown-wrapper .nav-dropdown .dropdown-item{color:inherit;line-height:1.7rem}.dropdown-wrapper .nav-dropdown .dropdown-item h4{margin:.45rem 0 0;border-top:1px solid #eee;padding:.45rem 1.5rem 0 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper{padding:0;list-style:none}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper .dropdown-subitem{font-size:.9em}.dropdown-wrapper .nav-dropdown .dropdown-item a{display:block;line-height:1.7rem;position:relative;border-bottom:none;font-weight:400;margin-bottom:0;padding:0 1.5rem 0 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active,.dropdown-wrapper .nav-dropdown .dropdown-item a:hover{color:#2f80ed}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{content:"";width:0;height:0;border-left:5px solid #2f80ed;border-top:3px solid transparent;border-bottom:3px solid transparent;position:absolute;top:calc(50% - 2px);left:9px}.dropdown-wrapper .nav-dropdown .dropdown-item:first-child h4{margin-top:0;padding-top:0;border-top:0}@media (max-width:719px){.dropdown-wrapper.open .dropdown-title{margin-bottom:.5rem}.dropdown-wrapper .nav-dropdown{transition:height .1s ease-out;overflow:hidden}.dropdown-wrapper .nav-dropdown .dropdown-item h4{border-top:0;margin-top:0;padding-top:0}.dropdown-wrapper .nav-dropdown .dropdown-item>a,.dropdown-wrapper .nav-dropdown .dropdown-item h4{font-size:15px;line-height:2rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem{font-size:14px;padding-left:1rem}}@media (min-width:719px){.dropdown-wrapper{height:1.8rem}.dropdown-wrapper:hover .nav-dropdown{display:block!important}.dropdown-wrapper .dropdown-title .arrow{border-left:4px solid transparent;border-right:4px solid transparent;border-top:6px solid #ccc;border-bottom:0}.dropdown-wrapper .nav-dropdown{display:none;height:auto!important;box-sizing:border-box;max-height:calc(100vh - 2.7rem);overflow-y:auto;position:absolute;top:100%;right:0;background-color:#fff;padding:.6rem 0;border:1px solid #ddd;border-bottom-color:#ccc;text-align:left;border-radius:.25rem;white-space:nowrap;margin:0}}.nav-links{display:inline-block}.nav-links a{line-height:1.4rem;color:inherit}.nav-links a.router-link-active,.nav-links a:hover{color:#2f80ed}.nav-links .nav-item{cursor:pointer;position:relative;display:inline-block;margin-left:1.5rem;line-height:2rem}.nav-links .repo-link{margin-left:1.5rem}@media (max-width:719px){.nav-links .nav-item,.nav-links .repo-link{margin-left:0}}@media (min-width:719px){.nav-links a.router-link-active,.nav-links a:hover{color:#2c3e50}.nav-item>a:not(.external).router-link-active,.nav-item>a:not(.external):hover{margin-bottom:-2px;border-bottom:2px solid #408aee}}.navbar{padding:.7rem 1.5rem;line-height:2.2rem;position:relative}.navbar a,.navbar img,.navbar span{display:inline-block}.navbar .logo{height:2.2rem;min-width:2.2rem;margin-right:.8rem;vertical-align:top}.navbar .site-name{font-size:1.3rem;font-weight:600;color:#2c3e50;position:relative}.navbar .links{font-size:.9rem;position:absolute;right:1.5rem;top:.7rem}@media (max-width:719px){.navbar{padding-left:4rem}.navbar .can-hide{display:none}}.page-edit,.page-nav{max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.page-edit,.page-nav{padding:2rem}}@media (max-width:419px){.page-edit,.page-nav{padding:1.5rem}}.page{padding-bottom:2rem}.page-edit{padding-top:1rem;padding-bottom:1rem;overflow:auto}.page-edit .edit-link{display:inline-block}.page-edit .edit-link a{color:#4e6e8e;margin-right:.25rem}.page-edit .last-updated{float:right;font-size:.9em}.page-edit .last-updated .prefix{font-weight:500;color:#4e6e8e}.page-edit .last-updated .time{font-weight:400;color:#aaa}.page-nav{padding-top:1rem;padding-bottom:0}.page-nav .inner{min-height:2rem;margin-top:0;border-top:1px solid #eaecef;padding-top:1rem;overflow:auto}.page-nav .next{float:right}@media (max-width:719px){.page-edit .edit-link{margin-bottom:.5rem}.page-edit .last-updated{font-size:.8em;float:none;text-align:left}}.sidebar .sidebar-sub-headers{padding-left:1rem;font-size:.95em}a.sidebar-link{font-weight:400;display:inline-block;color:#2c3e50;border-left:.25rem solid transparent;padding:.35rem 1rem .35rem 1.25rem;line-height:1.4;width:100%;box-sizing:border-box}a.sidebar-link:hover{color:#2f80ed}a.sidebar-link.active{font-weight:600;color:#2f80ed;border-left-color:#2f80ed}.sidebar-group a.sidebar-link{padding-left:2rem}.sidebar-sub-headers a.sidebar-link{padding-top:.25rem;padding-bottom:.25rem;border-left:none}.sidebar-sub-headers a.sidebar-link.active{font-weight:500}.sidebar-group:not(.first){margin-top:1em}.sidebar-group .sidebar-group{padding-left:.5em}.sidebar-group:not(.collapsable) .sidebar-heading{cursor:auto;color:inherit}.sidebar-heading{color:#999;transition:color .15s ease;cursor:pointer;font-size:1.1em;font-weight:700;padding:0 1.5rem;margin-top:0;margin-bottom:.5rem}.sidebar-heading.open,.sidebar-heading:hover{color:inherit}.sidebar-heading .arrow{position:relative;top:-.12em;left:.5em}.sidebar-heading:.open .arrow{top:-.18em}.sidebar-group-items{transition:height .1s ease-out;overflow:hidden}.sidebar ul{padding:0;margin:0;list-style-type:none}.sidebar a{display:inline-block}.sidebar .nav-links{display:none;border-bottom:1px solid #eaecef;padding:.5rem 0 .75rem 0}.sidebar .nav-links a{font-weight:600}.sidebar .nav-links .nav-item,.sidebar .nav-links .repo-link{display:block;line-height:1.25rem;font-size:1.1em;padding:.5rem 0 .5rem 1.5rem}.sidebar .sidebar-links{padding:1.5rem 0}@media (max-width:719px){.sidebar .nav-links{display:block}.sidebar .nav-links .dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{top:calc(1rem - 2px)}.sidebar .sidebar-links{padding:1rem 0}}code[class*=language-],pre[class*=language-]{color:#ccc;background:none;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;tab-size:4;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#999}.token.punctuation{color:#ccc}.token.attr-name,.token.deleted,.token.namespace,.token.tag{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.function,.token.number{color:#f08d49}.token.class-name,.token.constant,.token.property,.token.symbol{color:#f8c555}.token.atrule,.token.builtin,.token.important,.token.keyword,.token.selector{color:#cc99cd}.token.attr-value,.token.char,.token.regex,.token.string,.token.variable{color:#7ec699}.token.entity,.token.operator,.token.url{color:#67cdcc}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green}#nprogress{pointer-events:none}#nprogress .bar{background:#2f80ed;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #2f80ed,0 0 5px #2f80ed;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border:2px solid transparent;border-top-color:#2f80ed;border-left-color:#2f80ed;border-radius:50%;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.content code{color:#476582;padding:.25rem .5rem;margin:0;font-size:.85em;background-color:rgba(27,31,35,.05);border-radius:3px}.content pre,.content pre[class*=language-]{line-height:1.4;padding:1.25rem 1.5rem;margin:.85rem 0;background:transparent;overflow:auto}.content pre[class*=language-] code,.content pre code{color:#fff;padding:0;background-color:transparent;border-radius:0}div[class*=language-]{position:relative;background-color:#282c34;border-radius:6px}div[class*=language-] .highlight-lines{user-select:none;padding-top:1.3rem;position:absolute;top:0;left:0;width:100%;line-height:1.4}div[class*=language-] .highlight-lines .highlighted{background-color:rgba(0,0,0,.66)}div[class*=language-] pre{position:relative;z-index:1}div[class*=language-]:before{position:absolute;z-index:3;top:.8em;right:1em;font-size:.75rem;color:hsla(0,0%,100%,.4)}div[class*=language-]:not(.line-numbers-mode) .line-numbers-wrapper{display:none}div[class*=language-].line-numbers-mode .highlight-lines .highlighted{position:relative}div[class*=language-].line-numbers-mode .highlight-lines .highlighted:before{content:" ";position:absolute;z-index:3;left:0;top:0;display:block;width:3.5rem;height:100%;background-color:rgba(0,0,0,.66)}div[class*=language-].line-numbers-mode pre{padding-left:4.5rem;vertical-align:middle}div[class*=language-].line-numbers-mode .line-numbers-wrapper{position:absolute;top:0;width:3.5rem;text-align:center;color:hsla(0,0%,100%,.3);padding:1.25rem 0;line-height:1.4}div[class*=language-].line-numbers-mode .line-numbers-wrapper br{user-select:none}div[class*=language-].line-numbers-mode .line-numbers-wrapper .line-number{position:relative;z-index:4;user-select:none;font-size:.85em}div[class*=language-].line-numbers-mode:after{content:"";position:absolute;z-index:2;top:0;left:0;width:3.5rem;height:100%;border-radius:6px 0 0 6px;border-right:1px solid rgba(0,0,0,.66);background-color:#282c34}div[class~=language-js]:before{content:"js"}div[class~=language-ts]:before{content:"ts"}div[class~=language-html]:before{content:"html"}div[class~=language-md]:before{content:"md"}div[class~=language-vue]:before{content:"vue"}div[class~=language-css]:before{content:"css"}div[class~=language-sass]:before{content:"sass"}div[class~=language-scss]:before{content:"scss"}div[class~=language-less]:before{content:"less"}div[class~=language-stylus]:before{content:"stylus"}div[class~=language-go]:before{content:"go"}div[class~=language-java]:before{content:"java"}div[class~=language-c]:before{content:"c"}div[class~=language-sh]:before{content:"sh"}div[class~=language-yaml]:before{content:"yaml"}div[class~=language-javascript]:before{content:"js"}div[class~=language-typescript]:before{content:"ts"}div[class~=language-markup]:before{content:"html"}div[class~=language-markdown]:before{content:"md"}div[class~=language-json]:before{content:"json"}div[class~=language-ruby]:before{content:"rb"}div[class~=language-python]:before{content:"py"}div[class~=language-bash]:before{content:"sh"}.custom-block .custom-block-title{font-weight:600;margin-bottom:-.4rem}.custom-block.danger,.custom-block.note,.custom-block.tip,.custom-block.warning{padding:.1rem 1.5rem;border-left-width:.5rem;border-left-style:solid;margin:1rem 0}.custom-block.tip{background-color:#f3f5f7;border-color:#42b983}.custom-block.note{background-color:#f3f5f7;border-color:#2f80ed}.custom-block.warning{background-color:rgba(255,229,100,.3);border-color:#e7c000;color:#6b5900}.custom-block.warning .custom-block-title{color:#b29400}.custom-block.warning a{color:#2c3e50}.custom-block.danger{background-color:#ffe6e6;border-color:#c00;color:#4d0000}.custom-block.danger .custom-block-title{color:#900}.custom-block.danger a{color:#2c3e50}.arrow{display:inline-block;width:0;height:0}.arrow.up{border-bottom:6px solid #ccc}.arrow.down,.arrow.up{border-left:4px solid transparent;border-right:4px solid transparent}.arrow.down{border-top:6px solid #ccc}.arrow.right{border-left:6px solid #ccc}.arrow.left,.arrow.right{border-top:4px solid transparent;border-bottom:4px solid transparent}.arrow.left{border-right:6px solid #ccc}.content:not(.custom){max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.content:not(.custom){padding:2rem}}@media (max-width:419px){.content:not(.custom){padding:1.5rem}}.table-of-contents .badge{vertical-align:middle}body,html{padding:0;margin:0}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:16px;color:#2c3e50}.intro{text-align:center;font-size:1.15em;margin:0 2em}a img+svg{display:none!important}.version-selector{margin:1em 1em 0 1.5em;color:#4e6e8e;display:block;border:1px solid #cfd4db;font-size:.9rem;line-height:2rem;padding:.5em 1rem .5em 1em;outline:none;transition:all .2s ease}.version-selector:focus{cursor:auto;border-color:#2f80ed}.text-center{text-align:center}.flex{display:flex}.justify-around{justify-content:space-around}.page{padding-left:20rem}.navbar{z-index:20;right:0;height:3.6rem;background-color:#fff;box-sizing:border-box;border-bottom:1px solid #eaecef}.navbar,.sidebar-mask{position:fixed;top:0;left:0}.sidebar-mask{z-index:9;width:100vw;height:100vh;display:none}.sidebar{font-size:15px;background-color:#fff;width:20rem;position:fixed;z-index:10;margin:0;top:3.6rem;left:0;bottom:0;box-sizing:border-box;border-right:1px solid #eaecef;overflow-y:auto}.content:not(.custom)>:first-child{margin-top:3.6rem}.content:not(.custom) a:hover{text-decoration:underline}.content:not(.custom) p.demo{padding:1rem 1.5rem;border:1px solid #ddd;border-radius:4px}.content:not(.custom) img{max-width:100%}.content.custom{padding:0;margin:0}.content.custom img{max-width:100%}a{font-weight:500;text-decoration:none}a,p a code{color:#2f80ed}p a code{font-weight:400}kbd{background:#eee;border:.15rem solid #ddd;border-bottom:.25rem solid #ddd;border-radius:.15rem;padding:0 .15em}blockquote{font-size:1.2rem;color:#999;border-left:.25rem solid #dfe2e5;margin-left:0;padding-left:1rem}ol,ul{padding-left:1.2em}strong{font-weight:600}h1,h2,h3,h4,h5,h6{font-weight:600;line-height:1.25}.content:not(.custom)>h1,.content:not(.custom)>h2,.content:not(.custom)>h3,.content:not(.custom)>h4,.content:not(.custom)>h5,.content:not(.custom)>h6{margin-top:-3.1rem;padding-top:4.6rem;margin-bottom:0}.content:not(.custom)>h1:first-child,.content:not(.custom)>h2:first-child,.content:not(.custom)>h3:first-child,.content:not(.custom)>h4:first-child,.content:not(.custom)>h5:first-child,.content:not(.custom)>h6:first-child{margin-top:-1.5rem;margin-bottom:1rem}.content:not(.custom)>h1:first-child+.custom-block,.content:not(.custom)>h1:first-child+p,.content:not(.custom)>h1:first-child+pre,.content:not(.custom)>h2:first-child+.custom-block,.content:not(.custom)>h2:first-child+p,.content:not(.custom)>h2:first-child+pre,.content:not(.custom)>h3:first-child+.custom-block,.content:not(.custom)>h3:first-child+p,.content:not(.custom)>h3:first-child+pre,.content:not(.custom)>h4:first-child+.custom-block,.content:not(.custom)>h4:first-child+p,.content:not(.custom)>h4:first-child+pre,.content:not(.custom)>h5:first-child+.custom-block,.content:not(.custom)>h5:first-child+p,.content:not(.custom)>h5:first-child+pre,.content:not(.custom)>h6:first-child+.custom-block,.content:not(.custom)>h6:first-child+p,.content:not(.custom)>h6:first-child+pre{margin-top:2rem}h1:hover .header-anchor,h2:hover .header-anchor,h3:hover .header-anchor,h4:hover .header-anchor,h5:hover .header-anchor,h6:hover .header-anchor{opacity:1}h1{font-size:2.2rem}h2{font-size:1.65rem;padding-bottom:.3rem;border-bottom:1px solid #eaecef}h3{font-size:1.35rem}a.header-anchor{font-size:.85em;float:left;margin-left:-.87em;padding-right:.23em;margin-top:.125em;opacity:0}a.header-anchor:hover{text-decoration:none}.line-number,code,kbd{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}ol,p,ul{line-height:1.7}hr{border:0;border-top:1px solid #eaecef}table{border-collapse:collapse;margin:1rem 0;display:block;overflow-x:auto}tr{border-top:1px solid #dfe2e5}tr:nth-child(2n){background-color:#f6f8fa}td,th{border:1px solid #dfe2e5;padding:.6em 1em}.custom-layout{padding-top:3.6rem}.theme-container.sidebar-open .sidebar-mask{display:block}.theme-container.no-navbar .content:not(.custom)>h1,.theme-container.no-navbar h2,.theme-container.no-navbar h3,.theme-container.no-navbar h4,.theme-container.no-navbar h5,.theme-container.no-navbar h6{margin-top:1.5rem;padding-top:0}.theme-container.no-navbar .sidebar{top:0}.theme-container.no-navbar .custom-layout{padding-top:0}@media (min-width:720px){.theme-container.no-sidebar .sidebar{display:none}.theme-container.no-sidebar .page{padding-left:0}}@media (max-width:959px){.sidebar{font-size:15px;width:16.4rem}.page{padding-left:16.4rem}}@media (max-width:719px){.sidebar{top:0;padding-top:3.6rem;transform:translateX(-100%);transition:transform .2s ease}.page{padding-left:0}.theme-container.sidebar-open .sidebar{transform:translateX(0)}.theme-container.no-navbar .sidebar{padding-top:0}}@media (max-width:419px){h1{font-size:1.9rem}.content div[class*=language-]{margin:.85rem -1.5rem;border-radius:0}}.icon.outbound{color:#aaa;display:inline-block} \ No newline at end of file diff --git a/docs/.vuepress/dist/assets/img/getting-started_add_entry.5ce15d30.png b/docs/.vuepress/dist/assets/img/getting-started_add_entry.5ce15d30.png new file mode 100644 index 0000000000000000000000000000000000000000..3641893a2d405a69c1a4780704c1055a97d16e72 GIT binary patch literal 125813 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 literal 0 HcmV?d00001 diff --git a/docs/.vuepress/dist/assets/img/getting-started_allow_access.ea852994.png b/docs/.vuepress/dist/assets/img/getting-started_allow_access.ea852994.png new file mode 100644 index 0000000000000000000000000000000000000000..3c87f056b091c7386a23a6916efdfc0def43ab67 GIT binary patch literal 294849 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

EYuy<$(wiP7Zebc?)RFK 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

Sv)c#xA zq%;$rdfqOO3=&Rmxgk!%H*|y9x14GIgOBW7>v&^0!i1bLy!93fsI!~re*Y*4+(hB> zhaZ}L9|F|S%+!cxSm3Z_@QOau+Iz`N>9^AcWt>gUZhZ8yf5UBa;Sg4 z2B1u8a@VR8uft7Ax+WD_HWNDNCPqqY(Fr{u5dl8_7%}13!OWJXD0exf+zT=_9~@mT zE;PO*fy26r2aX)wE*2y`Wi@tJ3AlqG&0(d!g4gi^znS45cK^)*{vwRXar6u|R*jPa zkhFtCV5H`F#_i{)W*6vj^T;xc3^U>_y)`U%g6&3Eg}id-^hnFfgI-+gvROcKZ*LoI zBD{NTAR!pgUwEHyYE_EnGBb9Ob*(JQubMF)fGXZx9P`i34qr2WI%DHcHjq z&59O~2aU8{hZ1y-cs=ePsX;9hZBK4N;p*JVHG{aE;a^FW`hf&5zf`Xj-hjn+>Kl!W z(VC6%Zw3E?_X-Kyt&U?Jxy zCEuaMdc39XR{GkWoAMD9>Wh5~fUOf%GsOOPauzSFC*@Rh7a{^LxEL2IUSQH6vL0aw zcV#JJXj!;Rin+@gSg+~WHV}haud1^131jEFrV#mbQSl(XC}Qc7R(f1AjUcqyuK!UE zN2Z^)pWyPboNw<9vJ8@>kw0IZ!-dv1TvcpDp_j3*z2qp$Ub5vOXu%b*QqpI}Vv5ei zQTrK@=vb*q5A-!n(0T}h*xEPBo|~{oZb8e!+{&GUxQskB*p%TexzSh#J;gU*>So;Q zK-#1ybbV(tCOPRj3si~%nZ0l?zJtg!u z*>u?o;`LcNs?&krmGwD#hFQtJHVdWtmi=}@$thK$nb`N6ne}AHU5dXAprSUjAaUB~ zos^Kr6~7)G!qY{3qLrAU721}1yn>SIyV9303Bz%XE%#HB5@5ZC@uH*uBP#4qw_yuFp5^>!P<{US<=TR*!U{=lkp5eQ|9ri?k~W+qCZ>#|p%DQ9W4RANXjGY>IzYyBbe^dgEo2JD9)FEcAyC?F1R!7Z5KPm`q2 z(a5A0F!G|M%?j$OVt*eM9$`=j9T4-iEm&gWl3CJP6y@w}>5{QYGjkplTS*4_he_S| zPT*EL*Q`AYbxBypx@|7;@16D6EwwrVA6hcrumS>WTv5>s9er9B->25&$fQ)E4)Hey zkkV(8rk&NH*xqIbjDg0;Aru-{2xb8d*O!c31V(vHuSXbX&9TMtRUKu`%*iMIeZti+g12j+aHww zpDp0qf+9eOGdq~sXo_q{SJ-BzYD!LXqjKW|j}HY^@0Hx++MsP>>HoU>Ot@B_vbA*E zkv0XS;IWREZW1r9R19&&{A}>1zmDq67^&ET)vYbzqFqI?`jVq8o&J#=~ z&Y=n~jU66UZ(;{Jqn8T>l5Cte+~Gkjbilhka6Bj9dvh(o=1bo!-`P z@0H-JnN!JfHLkhNGG@R5!+2DPTrFG`i7Z_sdin)D9#Ip3qE!5s&(4rqf-Ixlc?K|{ zSJvV`U!1gCaSdGSlHEcyl@Euc*!rSu+WZo2rKV!Z@78aI_=AZ=*3Do~)P=5+b`8zo z@}>D}^z&|xQXC%wX-6I-7|EOG$^SY1Z{H_UaN53J!E*`h-1(|q`-=8FK7CbV_|~}R zO8YpA%VB=C`_QhcJZL%HJ2>Ut-WVxN(zChbs`5wbeXn}-&dxA%LxvBK_}l(@@(f~Z&hhkSl^ALE5znX z%6+nQ%cBqyf=tsq{tDMVVY~%Yz#l$-SXr7%m{zSmPywf_1}j`o_SDimsTNw`oZ0sJ zZprevB(L4(f!kkj>$k5X9O3PE9KPx>#HhIGeWg%NGE9#S{Ltf<#SDnA9-;tL1{a)YCfFWq1S(c=ob zoUr%2*9rNJF;(==sA>LS6b~-kthsEo&|(F<`mp zPc_H?Q}oLc4cA29Hp|3SOE-_CBa1tYeYeoC$z44a6vtm(s*cB0GTqTFu8La-2tDo` vOFHjBneV)>{1uJ-4L$$={X=cO;OdtukxSDh*VC%D0WXN5r9rix%TNCWmbOdL literal 0 HcmV?d00001 diff --git a/docs/.vuepress/dist/assets/img/getting-started_create_content_type.f4e658ac.png b/docs/.vuepress/dist/assets/img/getting-started_create_content_type.f4e658ac.png new file mode 100644 index 0000000000000000000000000000000000000000..01bcb1703523778db72249385ebfcade47a78fc4 GIT binary patch literal 148411 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�SJ>;1$i03P{X7Ky$}% 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 literal 0 HcmV?d00001 diff --git a/docs/.vuepress/dist/assets/img/getting-started_list_fields.ecdf11cf.png b/docs/.vuepress/dist/assets/img/getting-started_list_fields.ecdf11cf.png new file mode 100644 index 0000000000000000000000000000000000000000..eda037d52e758a57fe2cd5fc3aa0aff402a70a95 GIT binary patch literal 138253 zcmd?RbyQqWmoAJG5`rcKhv0h!Civ8Ya>B}b#S*paF@m#hu|T&I|OM6E=@PL zfA7qlJ8OM2$@~AuI%{z_CA;LQU3>3(iqC2)a?hWVK1D)8dafWZt$~DuiFieGe}aMd zWv{>mK|(?fu$7WhQ;?FPR&#T5;u@RUpt++6sb38FW6TR=iYFh}k?W>k zALCMc5u}gzqi7Qn>|lRXLRv&ozyo1K<=~hZ1TPGed}fvaVSZDHJ} z2yR!vXchd%AuLfakd*m~6x$6GZPDHTm9cS~k|* zy%LJ2lsVX43&2GU?Pm^49}&U82(-tDaNK`N5JRwuWBo8F8D)}f<$z{(A;8H|y9RxH zY#>ENh0THNzKc~!^S})_LQ2MTEy+6m5_$C?0*(V{3S|bdWipat0?(5`X=ELgbPWvB~{NH+{E!{2LY+XETot>!vsn^Wh+0#RmhUOnZ z|Ml}9?X>i<{eP02-2by%hz_#c_3;y?_|1If1i;A%S(}n-mrT-YOe|<#^nAlSh_Wv4u zv8OZ!AGVN?B#;!O-)Z_FALn5DkPqAqn&kMggUTISbynj13l}gxY=1!tl6=A%Mkn#a z_6rho*rf!Df(_Q|Mm3bMV9vooQx4M=|5F)|UyZjAY=3!L-v6kRA;)mtH+On0;9{J= zp=(tXx_DznWJ-ffK>h#2C*(tlM1Psk*|f)+2vy0!=UuY|B&;ugc)Cd>@^`TX20v`! zF$&r?-lMnvelkbiepC;kmF?c}!d={#S-`3`qYedpM z%@~FJ_rk$wk_- zx(q#A_7&EXDR-G*F|6x-$>_ic4EcK-Hn3^&*rr$wUD1LBEW&p^avi>Ex9m-42;>}) zr6%=K{}oAy46pHj#XgzO0PiV8u*3^mMUF5gEzB;qdK3l8-7kdT=#aNBH2wwoh$-mK zkft`2)R)`xC<5NCc!0VDwIfFvLtSPU1;duaHG@Ky6T~RQn2+WEJ}7h>NfL6>AT?;% zp>vLdHPm1`TvL3iSKE3J_nUJqxaa=v)5;fjzhA+l3(!TNO|bK5={tFRzJX)xWjS#R^XVA4P}B0%Myj7MMM5 z3ahjR7s4uCCCl@kgp?IpU`(@qhL?2J5c&t=Os`!>G0$wo_SW9 zZrxoRMDqz^1i1nzEadKQqj#qRMZ!zehMw-6R)`vUh3v7UlGt#FSp}sk{BzUa^b++qIrC`e#hqPW5-+_!!>bYEis%vpFC8Cy@gZASH#gWu!Iv6=H7$Ey z|5n|{SZFNqcNY!z4GqKC|5RcEzGn)!nu2)wB0xS+*M!dEu;_*JlX!#}9sp=sT_vpbCWBP{{}n+lAfTkgx#GtG+D8RZFNQGW~#NR2DH3eaJzI>68AT47>uUkiBb?{ z3=V)CYiHH8&9aG9fh0WJ#r7`DAsZwW6*H?O{Z`9u;xBQbS#9_|MC{08bKrqW_ z44|2nYcBh$vsisHx;M$@xc8BA(!o08??NYDp!7U720t7lgtoHnT3watNf>vPh72X!j!D6FM+wyw?<6;=LK`5Qmn4>#V-3^@wPHy~NF#VF;s;p^!wcESe8V|gJcIg(cr-hK`{!K|$OX`V2_oj^u z5Zc13(;%m+Q6afM%`X!Bz?(cZGiF$LOOr*LH*8L{S0BOH+)egT=w5l zncQ&_6<*2t@digq+HneBY_huQo5riz_!RbhD3xBppQj-$WGEOw?<gi0sNPPKY6YUPA$ zAV`jqe`g9%9-A1lyU>|;+*>i^lj2_XT%7N)Vf?EiLM9NncoG#+?C~_riOFKa%*uk^5=ZRCJ#aQ$RVf;=jKfmh+f7Yw-{g)bnBt`4AgCz1tgt8o3dLJ+yWF;dn#P z=ubEh0HaAu)gQ`Ry;EI!m>qAJ1)FoHK@PzV=C}qz_^KII9OItt^`N`aZ^}Vv@oYz8 zW~g2am~QQ>@=8htx84jUXd>5a^whm=D;91woPS=k9?ZxUsUNHD0n7`A4CR0-%l5W~ zHXct|Bp#}$8U>7V&gSKmrg0M|r=;Z9CF@kiz>|1S2k5T!rk1nn%;WaCvu{EGYxRC@bI7- zGR0`TsB6$;ECzfU9v4F_o~CgjjHA~CU%cVpiW#KV)CZ+e=ze&j?NBNyE5GwpW<71L z?i>652a~YmNl0?CX2JdJ>jgVMsRU)45EQEIJAUG@e;8vUWC14uu<7-W5Y~ZzKa@nnD=z#29jwCYWt2y zyO|m*(%cXFY3_E$Df<+b6U7)g@nF3Cw#v+)F+lb+%6B_+ihsGGbA3$`b4{1x^T4wC z)Xd5W+50k?oYs4M6&}@SX{BoG*Vg^`{4{C&w1E~pG=@FWSZgJ%tr-=MpN3>q34Xmm z)UIE-@ zQ!u$w?bx&PQ+1FdCUCAz&`WpJh#m=pU~LStSHIeG;FS{tO!hQFKyS(F)qDx7RCr*E z0Rh9VB`r-og*yAJg zO!BuoMbgr;Z(b%Lv|9cs*7r_^8$%;Np+5S;Zl5dCAD53UmLZRK^<=A2z?6&;Gg9Wz zEKRORT}u7LxY%BO>#89i^p{({7vz-&+dJVzl&c1N{^jG5C9AY7M-7}}HnBTYOk6#R z5#$m5u97x-3%5xT-sq=hQTD|bOLov>HDs`{eq1q9kLB)q()_IHNXy6FvaPb4U%vE_ z?;Ftbs;dWCCmGNUv6xsM%bgu%&%@qJ%QGnnkbIQ^l|!P?@r>r)#MZQ3U!`R&S6Y@S{oMAk8-hQd34D(`xt1`L z4kMMWJ5M`a8s|gkl*L`EEVj{GjX5fNqvdh<79q#D`f{Mk*tpZHM`JU83xrBQ!&Rt<&fs30^&?Y9D})F(4Np zoTFJ87IvFI(4{|w=Md{l+B*Iy>%3nWWy>rRSMM0_i_(OTsz&T7Xo%08lS_p9rTaid z0?oViCIA3wUv+Ako$II1GO(U7@ZwVWDd#w?>4=QECGkT!d`uM?c9HL454Qf zLM|&MAh}G%T?K5cSiVT&N!KrxmOa^~n^M13i?~xwHIzdY z*sdnJd={@iY?TGF?(JWclfUknEtgy*)eNYcQ>~@WG-P|_=3bBDSI&=Xt~6#c)qH0b zYtuIM+gs?TE5{)bw%Z!8Arox2pjc@2Rm3f#7w@yfd=~O{?vu!lcZFZpG^56$@wri( zf>xMVvDpGI>D%WD@*A-PTUXWmc9@Roeiy~QmFCg@+QwJAvDQ--R%OtP?TK49JLpw` zL_3R%Pe8Ccgl?23ty@`PueR>J0&hNI;^z9_U9aF2iT57Zd*e_PC+Kzamz*jh$2*0T zl$6_L3*dJ6D`V*-?jPVd;}B^nE=^MQiV_;dcrA;chw%$lmJQ?NY?|$@HBHAXsk4)% zk#CTeFgQspU4n+IjS%()%u~l;FCsZ zbQj<-$x`E2kxd*UXwLe`7<|3?Be4QUVNxz~&T}zW)4^?K#On4wim*~p`z$IZ=Hdv< zz6Z67nat$dRLyRddn7GW1duQKwxD40f%j&esxK+|(3=CdF=Bt! zfGj+P>);IoKF7mB8)~+qUz4~vt!yagY7BucqXO$e8{Wh-wJ2!;5U~r7Pi(@8^=EO; zD-q8oDNtK`6md^`-5+nsh^iLwJ+Os`Tqqj41Ud(EWBi@Kl31gI;ZB*dXsI1=I%9+S ziI2~M&gP(xQTTe0c>}Fsu@3lFSDo9?>#k72`k`&_t`;i$#|weLrbd)Uze}fwlZlEm z_}sb0J?wWu34Z4TRm=Vvf4r^mBDUMg@4t!fMq%9E- zIQYCS9_6HrPJx{sj|sngGBFX;L&p9<(XN!qvD@o=3r7u-?NtSb^Xot$riNjVbXZ*l zt6(fJm5qB(;H;NrYS|U9rsE<*ecivMvdB42G7*(|mg6;+Bh*1F^Na9-eg zJJ&RC?j1gAP3*lX^l*q9B-t~UVmG;jF9wUnuvn~wvt6H(#?M_|dVIH@%oR1>yuUh% zJU@5a-kvor`&g@ZNn$|)29BO z{>QP?;Al;Uc|bfWY6ED;UI50i_(nP%GFN|Vm(|}i2Z(#A?XUAJ*ou0uUMxz2&-P}w za2aLSuQLA}psf7M(nnF(Gca~4PP{n7=WvUR3Buw=-KAQQCQ`yrbe_JIk-Hk>od3dA z8vPdwY<9&%MDMO738%mzqGq#*Olp*tmO@_fJ@!Hw&$;18-btNP`pYLgQzt(y?vLZa zs-HhKTX>HFr=C+Wov|wx@QyG4q;1_d{Wypc^e|d;wuS-xt*NFF!?Jhz?xfqb#p*<` zTn@Xs4T7oL@k==%kO^fSK0@xW{2@N$!{BDa-K07E5G6nzreV4g6=Gvs+MU>J+}FFC zg`Xw*{Wt7#S~*?Rn<#NcAa5dw#5u5IDqTi<0_mgHyuQ^7L(kj0SKG(Nwzp7N^VaO- z4QUP$t6{W>I1Ht_?NEarN$hL?7>}XrIB&X;8+EqluFvDR&hNEo$B5HQ_LV5|LgCvlVW3l)E9y3%LsKuai+_E!QJTKUkSDgy#UU`+1M-<+D(FsklO5^>H^& zN0C^f#$;y9iF!G_p1@R#ROEy_;IX>Z=dgfL%~qGdbvvioe6s#dU}vINhW2M&H4lk< zF*fE5QC5u@6npMe)ZC|d_j-VLJ^&rn-%ILjt;*+QVBfX2Xu_reF4*Dt+!%1x6>--Y zC-?iDsw+~gb$G#uEZlh=t`%^7-BoK9xlao1RbGF$czAbfv-<9mln47NaxPzuqD#ts?5~^-TpWC+G znJ5J#C{_SqqU#qN&6c62Jh?I=r~)y0mE9mKX8h4djeix=(&AH8T$Ep1`ort{aixQ% zwpKww!5T<3Se?@6P!(z3f^zCG^4tAX)r_a!(9@3%_VWPY9Q)SN=@3mMKy8S*t$2=o zkh{@{m!~5x{rp+z$a-mIxIyQQis-?0Kv5dyIFtYJ7A-jBCt1ZzsDDW`M!+%x6hBosiuJsNrP13?=CFbEP2=m!Re>32UxeF6{BmGie^55?v^!;Egc|tv(E4*4U;*s$^E*O zu$|{C(CJ9^W!=#8H~2t(HFe`Czbm%p^cl*QjZaFh%g@saZo4U8r08tjpTeG+vs_@TC2%DRJ0S5;3-$^o5TelOvMAHB{GK`svMT;b_OmlpW%f z&x@}NgT*?zmKlV-mhOn>x+2SmHXokt=j-I&@E*w@g^I)P%-)k_#x>csFPyzv599Pb z%*n2@9h~*vELn$<+NJzxZf-$eZ`q%3Irvm3+u_cZ9-7q!Ap1%dU3a5acS7I>c3u~g zdLZmk4HIXDf2L+~>?yju6u<^NVI&S#pAEE~; z_$VfATTkEmof?VU^;`JdP?KWlw(1X$#m z6Pq!mf=+DS>W4!Ep|}ql2J>4`Z=g2jY;32&+(w<;W4U&UEok8*I!%jbOYo8bcSJTklQC z|c78+bc@ zY6_bY>NtnL5qYeU(}&V;9J1`2-jM;f(}4ckQ_mTored=uYlehgT* z&yLspxSRJRkOoDOs|Ev`A$KK)-qLcYWkhsl$3qgWt@?faxvKW-k@>WFeh(d-k%d2* zhi^mPg<@>pA9Y1M+cyqdTGD@?D?$?Fcl-L`x12ZG`@oy!^^G1A7-=5hnnXiG<815M zq#0z%bD`7Pn`vxJKXH}T%KmLTV-W-LunYgZ=OXElp-yys-mHezB;M#hZg~j}CiSpM z_3~JtEaNm)1#kucxctoRiEEgwEZSwD9~!A1tl*02xtkXi zgeXp-;B=KN&dMrqraI)^{S6Il^Fnr93Uu_`@p`1`cK++fZVFCZ8ds>JF=TG!p1x*7 z|LQ<=<83UdF!JL~kV&sIr54$}>SimF69N7!(eWO;@ zANMUweR)hFnd2jGx$Oo)p2D0L9W#8*s|HIl-!tp=>Ehqp+jGD2yF8390^i-Pe?pH~ zT+q@n6JQs_GzwaoVOnq3+pc9BA5DAtT&0I9+HSB&Q}-I zXG#}JXlOyr1f5A|-=8@*tya0Y%MLBG_+_p8;&%m@f&H3|=py2?5sKTJ0t~i)Md>Si zspYde^Hjom>Yr+Sc~c#R=6Yp4zm>npiX01ja@qc%{kG+SY$RXWmeZVs?LJt$ zNtaB;G`AQ;P*qx~VYpPY^F+(5e74Vs6=}q52;sDVswr{k(YXE;pOnxc5P%*xoLw(p zJU>$%#4o6k15(~@;s%*wXC);$E);2KY1!T?=Ha1B_%6HwR>(Zq2mLO8lUfumayDhz z5VKgl9hC=yj*N5m8eeM{3Q-zUeKA4{a?}oLs7ZzaJWMKpMDRu*@d?fqV;90 zV*B6dzSj8tX0>&;AY3agA24q^ukoZXP~#juq;VPTO60JYr`?OQmsocIe(7lb5yG!6 zXI`g&_bT?b1T&^mon?&@C=H9!;8E2uh}|1`&7yk<3r?_GR@J+kS3gtT`mP;x@Xq0p z8N8P~_aF!wf+LfRQ&G2l>s^`A7Q=%nx6p2Jem!HLC%ISgMU^!hY+3U;+I=*8tR5e< z1`_naZ$oQnjznJgDlohNQ0tre~v zxL|8db}Dn>{jT_K-FDGHb^9^3V`Wdx#9&o>E_~}Ns$I#*Gfrmlm!r6vcHC?&hkV$o zLQ!2o+7%9V#}4$h+CKM;mPLIKzKcX9ewR0_HB##1)-BLU_9hBYfGUL+3rz{hYG@3h zPmvdJH%44?S~+c_z9tYqR3r0jl0L7ISN7X3>9SuciKLgv&&024QyUrvjc*2(<<2?{ z0%H%E0H0UYbc*>4216rlkZI zRHGz2N{o)qsxu}0%-%7(N9S$PUsQyxrh|D5aQgwe?-aROKl&tRc!miarOnp}g5R<^x6Dy#q8ghONM9}BjHJzGvg@rfF({i{=16>10#@f+ zyHv@0>xUYCm2lgGifg_V6(WC>TCp~Mg*NEM@5@k6JzD#oiT50mQvVUL)9J6O+=UqjTFZ&w-Zf zC3|)76>X*965D`m=}XV`)+3C|5l9G&lh#lg>E}sM`%t@ERk{`5+w;}w5-2uB;0TrwZO{ocU$$%&rhnw97t zW@E;ybe}9xMM~;f=kJ_T;~2v$t_7AZPezO~UtbMoZ6~Jg#uzq9mHMSME}@tF@Ly@S z2hD8a3@X;xfcwicf`_r?5JiJpg%gEV{;JalLiOspg9Ureg_eTb;WrXT?N6i*R89Vb z&Lb8xu;98-ZGNJmTH*0#3=VWC;7%Cm-4DT}>=MV?c zT|%b0$fFn`Ryy2mo)?|r-^Aa4W^H%nxhKVT>Uah%bpCK|NMXJzr-tYGvW+(=3SZfT zzm1<7S7G6R{RM~>K%x5lAckyjH8>+}-Sn2PY}OF?aB0o-qRImH=2+v@qkR`HPP1QT zvYpXH^Q3M0wCEnxeQCkG(&-ZWSX%D`17+Ybm8|D!+knsE z`YG}5o|Rtjo|4ba<@MFPktebDx+m@lbU^iYjQGRAcJZ3Y?eM3d?WrJEzC+xH+xgo& z_LE*(p#R)~2sBe0i z-?g)EAIytdz_v|lwo94=@l}-aP7L=Cg!oM%pA19yCoqgnWu>N3a zNuL`8_dQ;0C}B;G3N}vysU@ytrD)AYMPI`YQ;mX+4%2r;0Y({gftZ10KTuz6rXOilyWw)mzl_Ij$R0*I0tz7X#B+`(_`#pUcLPhBvSIksZy|96dpw`qEfT z2m4l;6om#qTvByw$j^tSJ8sc>QA{r}KnfTrCauLq@$+!XUu#lTbX6}SP9>7BTf1b@wPH5#ncA89l zOWDTn-(PD%{x;%vhv)KW^#c~)^MwYBSEQnC%2_&wk|^16o{GQixP4y|5KiOO5IsrN z^x+Fm9^84izaN8{ql_Nbv9{_`oTYV)s)~%A z`CCO``F4|gZ5@5N*x6J9lMagj1aCN-LNWdA8>|~oQ|=6v%y@EEX@Jyron$tFD&Z{b z$E*T~%+bcpw=<@;V(4SQ|2~h%1W))wa+aHOO3Y7msPwRCzGhFrQarQVZqC!%8Z*QZ zr$fuT=1Ft_Pp-74@l5E|nX#-nWa+L=j=~05cqEiYmYotlKg^o_E7Eh)yy0wX6EzNlac|yu_n8$>7^e;i6m21t`FFY zbC=s);Mfe*pS8cj*PA~F{bZ7-)nCWe(b(Bu4ZLa+_$rp8d^MY*c5g0UrhRqBUtc2_ z$@AUS?IblJ1cr%2+3@s-E=L*Mb)$dgX!`8mn~Rq&D+ywboPC|>rM_Hy zZp*=`lC@%6C4li(5OkDPs@_hHTGsLC6;*MH6u#oyNw3b&4js1qFB}o#a_FdU%2yhk zd|gYJWn^W)R)dk%-=xia1#Ls3>9%F1f8V?`>PhAN13@C53|ZJw0fQf*K+-Vl%%@uy z=zPWVuNKCFJgFMS_4%ObquO0xjt~be5C&?()FSux`o_Eas4hAaNXT*S+QU&&a3%3! zZpuMJ&T~YA7^ywi`Nt#lYs%)lXVxh5NXE{`~$4O@8AA-Is)1tChZzjTyl| z5)K8X&;kw=m)I_n>gnvAKqNR~@Lz#F_s}PVZLJk(5*NsKSt*OEBXhvZSw5q=RuJaM zK;AHJNMoa>c$EW!>n@;&RrKwAO;m64`M%5_&Ygb}J}F|)Sl%@)VpCWiw{)BqYg0a# z7+zug;`{@$xq`y8fTa&Ba%wt2s{D>r5$^9rU6fH`>v&qtPy-A> zO@oLABqOM4_r$#%N1?M~b8Vn3cL=R-e*NWipz&QkGHjev?;kd3$aJ)Xxg^T{)d4`C zf)F?2Po%Q8%xw`Z*H~y=7eE$s-@o+qZfpoul?gy-5liJV`(mfRl@R9NTN7Z zJ73)au%8dAJK9za8*e?S02ECih&+G05`f4cDRHE@R}ZoUD9rP6I?e+;oUR%!=J|56 zENruQaS`;Kp;B*6q~q_wUVt$^_eCMSRfbl!7$D*}@@Cqzp~lJL-{4czxmXd_PA87> zH4GL(B*z?@33!?_MwcchikAa+DGoy8p9X^&UV9x$k9oT54dG?6w+rSj4w+D`7Q2h$ z{PhmNzrc@&qA$m_ug%q_y!?%AIMcr}w`&f8j+=zGRtKGVfKWD7jW<#R*E?=vVI-?8 z1YskRiw~fxj>4Aq?A+|H*DY!p@m{_}zvCc5d$3h%Q|?-y)K5b)pFTxSZo5u7$5J)& zP2KH=B(k^PE;W5t4)PE&!ey8Tq~{f*k&=>r$PV;yG~5$U_n`a=GNR}bMw+{TPg zoUmwffak!Kd6Ed8Xvu3hJp)6oWW%23p8$>^S#R7Dd_m{A*Yg7aM0HR=N6I}m3i^5V zPXo;Pmn%I5hrK{-;&+>VnECI;WYO3erais_(zCY*@3|HnWH&_F;0y`n zS)d4;Ej~&-0vh?OT1`M6Y=p<3xGYajABUa0{NaQEk<=E8lvn0oz-zDAcD(yTf66gY z>1S(+m&59W9F#Kc!3Qf?8*eX^8-YYCDto<$N~#86>-fJ#K1Ng?V5?x&&W0(a6!4F= zro4|JmLm)f!YiC^QwAptQ#R-!i`ac3;L||~AS3Ay*MI&ashjy7H3P$7y7h+-(^wfb z9bZQwUSt-+6m2ARO?}07@CX%Z1Kp`F|;ssd>KR-WLk;VesYihpO+TK<-GNK45!SNXpK*hk8 z(AG|!YA-GQE}(L;)|HWw!NkUPBH^)aL|0toGIS;SwL}IS@Xs;(!$ZKfOi8#L(EJGG zSXy5GbS4Gz7vw`wc-^>0Mqyj$U;SOTDZ} z_Z07WM|Px?y#S5M`vf0G?hA)Fn(Ynb?{?En;x8tIaVNzeMdIg`>9+EsK2A+dF|n{b zvjz7EO{R0Ay6;bfcN|Y=A08fZ1i=H|8i2;q`zX9uLZBz@lgB^H>dDjklgTco2wfme^E52N%l7c|XW_Ww4|wdImjvMw>|B+9FzFCU*<)x7%9$VK)rXYY@rY>P zmLH2~1qDgU%53Eo6!`G8w6qHA>w9$#OOQCu|TQOaVA9mB8_H1zThQLZM-&X|)Rk6=O@QXYj#AKWeGv*OnOlELneqc}?jDE?2 zQV+lH?2@yCXdesz9H_w9K0j+0Ux_iI>WqA9jTXP$0+%QU6*a!U{H`MBY1uU2Y-HDL zczHVis#P!}DhA_CMdxH0?He2fZ(i=ySTrFa^;1Nf9Z#!>QlACEhaVMk)vleRyzAEr zs-X?lPbc=~PG_S8-V1w^zQKXW6_(fsFM{|PE%z-3`^^MeZtx_J%fSi+oY1Y9FB|2O z>b}bUKajpHG>W{ZTBd^HP(I(l+QB6b2d|pDHdb=wJ4;03Ow2p4sMOw&rNxP1ediVS z)O7ZQy+8z;=D++9rFu1<5pq}vRa^Z*{+sk@M$|kP5&qNOSre?Veu_hc0k3;6m%evR z86BdBwb{x)p8b$4ry};MEa8f&s`6@k;D3yihH&RdoUV0px(~kJzPmkHZBMx+T51@` z%q0EJ7E(Yr#fG53#0^L>GnWmb7Gj%g1U&rw^Y-W) z>Q`f3+zPHx;350Q&g;fITC;!1&Wmy*iT$dK?s^Vi-R~6PO959{Hm?$nrHf2)29FCz z6Aeb&*oMrU<~@g{RIJWU5wTkA)*x%)CyzQte(V(hnOtT|;AacWWPhmka)|{$-P0gVr)t7}@HgzH^Z;c~bJDW^CJ9hfe#w2Z*mF%f)nE>_u86!~NdQ zPJ!6>Adf-|LOiOY#hPWIfbUlb^sEcyn4Pj$8yR$MCUMjUv9}lFEPdrL+iU$kdHp~z zZ1UxMkwdos+WVqL6EFBmd*gVERg#d;czFizthV{-8mzS1o8$u9BhK@Xk~2XdcRm`M zWhf;X&pI>Y)chZCorI2LZa2W1bA1E8-Y2|&Z}WIJ2dKIm_E0w19~AnZ{B4Q-C*Kdd zLL+fVsVwMC_j}QgS67ZTY6y?2a~q0Ft&f`qw(S;oXXAJ#=C%c7`oPa8m*XxsqARrCzF}$1)5KD= zt!dS8UhLg2qyEEm(hGdG#Hipzp>~SW(z|-d{$L#0Sq~-^F=thfbZJ(lc3(KR-heoX z2_h5!nor?t6t4lV{PQCegwU{Y>pTDmGAgT$7R}@{tEEG7u~5>V)Ag{+9)ZL(#I~H5 zt2Z3CVtjY_x~--rR6aH%kd2G>sMcv3Czc|08qSR&ha!u86gpn9HZ*|(lmOM_lfTLp zM{ZsA-jMg?_Pe5p^0CHWgV~^GKCczt$abNOz&(tiXKBta{zWaOLFGPj3?O3Y=h=`C z*LY#@LB)zMp2*|m6@`$tO)KFte-&<3%=yH`XwQ_gf#k{j9S%iSO_wW>5!w<)N7vRz z7eR_S`)MbcCs_vb%>R|#i=P@FI?$Yg3|02{bO7{xmFq4mB|aiGDQw~`zchD>n@r`* z=E1;bCEzwsTXB0bVd(#0Q*K6r0|$UPCp&!rX2- zcQn$1^4zYD!vSiW6K$hlB|2<4hj0~HJ_Mu;%&%C@>nwXX?IZA=1NGZlKj#sBhlhHAcsYB2SE8zVvSw{ z2K451DE5F`k^rg1#ETUybShcIAYE9#gOnSz#rbx%wuJR^CZ=X!9=u~)^L8cj6`TzM zjlEtG>vM%E^PBB-8+Jqb4}nCbS{dwLdmBtkSR>e^8Fn}Q#i1Azl!>@HjwHr@=c?(C zzQU?O?h40i&*lLTtM|hG9OSGj4i5oXx%bd6wUwW*f?yZGgo4Y|3a1Awwk{Cfde_yE zjlBH3Ko!#K6Ty6GVa!9Nn@t#N`NQza)76y1)y-riW>!|2~br; z3vDj&>8j9rxbUdZ5sUYs`V=b#+vcql_j0;jm>CMmrqmN?8EGhKaF7u)-(mV_T?#QV z$aLM=aJq^CvN{@sdW{|d8{}}M0^ZY=D*?^r-i2G6ZacrQGUOn`FIy{R%Sr6wu^s|Y6Kajon;q}t>5A|sd7oRxu#u?KYjOL~Ox0ofW*dNdROu>@2QOY9vyH#ucLeH*!8-6FK zsO#{~wFfy=$MJ)`$UmNOGui4n2J!xqsg_}|)?s^j`NZsqo9VJ(n$xf#fYVbRV-4og zBowP@$YD(*7NqJ(>u`~?^+>7SgE$5gKm?9VSNCX|G`u-7m2S2=CwC$#_U!2|q1Xx0 zDQz`ZO(p5`NT_C!^u7;V^JeYrleGQ4+EWl){sOH0Kq<;EuW;4XCaE;mB{r(Um zgWAAR%H^t{hFM-dw*_jtvZLB}j{F^teL}~gKfx(BvMPMp^pWa?Dk|g^8)ZCbCJ+uC{{w>oZL|P`9iw|AsQ*ydoim{2q%6!7bd>B`P-U(CB!ZYXY<}MFD`2Fw6S}z^^ ziA+B%1oviA&3E3rwz?a^g$3Zov-#t!-$Uf0G)`mMud3T!$1O3>n&-tqIeojYCI<+C z;_+Q4%st65U7ws+eEGcsj>s1DPOt^id`;R3eHT7CuU%4S$MdW_topl-rpWmG&U@zi zDB9Hz3%Y+U1~_oOHHC;pCC@kCn8p(SB)p8P!*yxyL(9z7FJAiEVcrM7=M&x zXp@^awaoZ#FhwkE%Vme_)ca`?he`Ae);5Dmj~;48ofY(5zx8E*<7aELv?o58PZL(E zBA0$@!_|MBA_8|F@5wQ6egU=e*kz2A-cD%4CbN>lDURk%;h8Ugak`)lmPekWN3Qcy z!sQ0~OCe^WpDaBz8<%iApMWa0z!f7?Rr}QMNrfq2emi|rS3cD}Bg+4*Ne;L09RMcx zENkIKEF~u%nRY;IIR^hd3%2hUPd{0*V8{!pMDVn?~^rOn!(b&T$8iWWRWa+pZEE`H%Iq&f~&Eg?v1NOhY*#z zZsmk`SP#wfQ0UwyH+{JvtvRRP16?eYAX-eCbAR!!(k3N8s)8qGogY+;r%cpx`==YH z#UYb}K@))zFqxXQf}cS-9cQ2MbW=isB1}ion95_l0qc}?A*v<$BwfIlCPFjKqOV#q z;IfD7eU`fzjdHGSW1)U%~acP_|FLWovZKfhS`AK zS*cl(ALZiw7!6TrG*I)FHwlZWS<0VMft!)8PMBheX+>nsHisxVm)++ekFx#No0VeY z7!?ftreU?&0enQ@u8tH-4}=bVf^!v9kxqO?prXKv(Srz_+`u?#_r=r&NQgl+CG zK?MEna=3qFQcUx7yHd(&y?~gT=h<@^e^I%;sG%a;X?302=cfUn7gL`Ph{erlWLaLT zfyu_08R&772C+5w?=8sRlu62-AbA=y6q@&-BsYUU^008fiUd0Gw+(xyX0JXA{fcXr zk(npVg-koCy>HQL({Xb~>PacG&Jr3~4h?`krMKaim}AEjD#kxd=e8)X^EhiiY^RoV zED+I#`A|QF>NAr4f_Arv7svI1pI6j61ieoD*}ⓈM0*AhHr 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

582Upqb9nCU_Hd8^Mxmwp|OWB3j#d5%k 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

#07TUR~q&$5Xr`#~mqY4&-@9xXfL4!+Ix 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 literal 0 HcmV?d00001 diff --git a/docs/.vuepress/dist/assets/img/getting-started_manage_role_home.11fb8455.png b/docs/.vuepress/dist/assets/img/getting-started_manage_role_home.11fb8455.png new file mode 100644 index 0000000000000000000000000000000000000000..30844f5da0cc0f40eb2a5eb02aec9fcc4708b011 GIT binary patch literal 122683 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ℜ6lmhD7IeD=ztIth@F)o}Ln4Bs2wk*J{O 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 X@aJF5Y2+)2->+WX{fchq+aLZ94Q)kJ literal 0 HcmV?d00001 diff --git a/docs/.vuepress/dist/assets/img/getting-started_no_content_type.144f7dab.png b/docs/.vuepress/dist/assets/img/getting-started_no_content_type.144f7dab.png new file mode 100644 index 0000000000000000000000000000000000000000..4df862022e0e8baa26e0eb84fd6a3a1af3d6143e GIT binary patch literal 130776 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 literal 0 HcmV?d00001 diff --git a/docs/.vuepress/dist/assets/img/getting-started_no_entry.aef6f603.png b/docs/.vuepress/dist/assets/img/getting-started_no_entry.aef6f603.png new file mode 100644 index 0000000000000000000000000000000000000000..dfaae83f680b3201b43c4b5b21a616fd10ad0360 GIT binary patch literal 124676 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

>oK^oh%a%pl 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⋙GbHBZd}Eva>QgE1^r*H!vTssb8y{pgc)(ux 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

KAI=d(1GUF#4j@mcYMxOR@Ho5A*X>9y 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 A7XSbN literal 0 HcmV?d00001 diff --git a/docs/.vuepress/dist/assets/img/search.83621669.svg b/docs/.vuepress/dist/assets/img/search.83621669.svg new file mode 100644 index 0000000000..03d83913e8 --- /dev/null +++ b/docs/.vuepress/dist/assets/img/search.83621669.svg @@ -0,0 +1 @@ + diff --git a/docs/.vuepress/dist/assets/img/terminal_new.3f7e23c3.png b/docs/.vuepress/dist/assets/img/terminal_new.3f7e23c3.png new file mode 100644 index 0000000000000000000000000000000000000000..0ea2c51cdd665c34223d441f61454535d2e4a710 GIT binary patch literal 149517 zcmaHS2Ut^Evo^hVkPZ<=5UCcV6G5sqA?sb*3-G`KeatY&3w|>s~X2GL#LhHYqsb~>TKQsPrW+S9li2puq{;Vjpbs`Z`;mUaK zq=~7mnf#u8!Awf7{bbhDo7v3R--1+O@J!o3YEQ3cJO6XKnjQ0x#1nW7_BqYp;>{Pe zZuP40?!0>Wd$cGc*S<-ez~XOPuHgmtOsWLdWP*I1PvmK?Db-Q>8RB%5gd&3KWd2xo z3vwCM(PaE*o>h2?;?mqd4#WqaJ?XRi)AuDFEQE6;`Tg;KGta|ev!_mFyU*+QnP{lcNgx>9HH74WSI8%$R9bG9*ZJ42S=?xn$m@i4B!C(NkV#K>YCp`){cdA;Rq6GkzjP9C2uF zPqr|JP;t?=Bso*WT&Y__1-n}0Zk=NNTewX$T<|ioO9ch!8=1@ajdX~%NFh9?d@}&4 zy2E}9%K5GJ;36JsuDWjm-iJHR)S3j*iv4b%+Yu&QJ_&5_P?gFbq--g8kIcVZM7Yd3 z6_R@2QMP{rY|CYfhQ7`{y3C7g1Z<1pChdTi`+fs3U*W&I<_Li-XX96cTk6c%2$@2E zBlV)vW9>W}-EB7dme9@~5=z4^iq?en;C+~S`)jKCobk_q=p#(B;$j@`Y-_O27esgP zZ@ZW_{gh>+j~9{=(fCDDB>4q^37Zt*`@8eO)DJSGcOVMP4Qfn6?6MY+f}+m9_T_b@zARQ5?@7ris|mmxXt0 znG2sk?1**ImI6=oW?c88kqEFv_x=q|2tzO%iQx89c{vW>8m!xhx?2Z$^Ry#y;SY42 zGgNrL=1x1l$c1;hU1m)kelalohH>KnqFynIa62QS=Y^Pit6Lo_ZsC24 zealE%-s8Zc^;5s~kOyz-56Ek|ZB)#^ZwanrtzD3^it15fE;!Lt*D;WQry&EuZV<;h zk7(QvB@WBV$!#}n7($UhE@{Q<==-Bm`1sbLADA+QpT#4kg8uIx0>F1S?_;S_{1SRl zC#gtr@P;+(ta{Y}ud1r5&%Wyzgk9gWtU)1c{*0=cs^rkQq3uGP7856<$ycv0G3n^D zU%(1WWai zSRAf4sA+D}`ARWrcXxAodOA>5bUeJ}w5zrvpa+)?!)Old|IdTc5u7IS)IDX^9k)F{ zZ>yow?JWN&zW8b+(OBaPH-(-uhxZ4nd^%cOB~6`Ja*V-X+{M#0^*s0CiIfl_OGx2S z)1LDG);q9I3`h2uTye1|l`quuZfq$#E4^~@VGsrv(aZej^8I4)3yz0Irf^mA<2n&6T+fOKVRy+Py zTZ;=)5}X0#gL}It9FoK|^VS0X*Ks6Gn7QCx*}HS;QDX5b{AlWLJub~K&AD3D8K--r zG1_i!ZluQgdi9=g3FB1BKL@2?M$WsTm;Lf4-&qLjb@K9GUT7?l8e{}fl^@sl`}_OL zHMvL-M1SXEz)?m5A^!iEJb(-fPMdac<LMw+YJ)yu4VeK2rP`Cj^QYa3f*Vy__m(1w{E$1)&6Bvg&($jZcA&uYK;qalARu69 z>u{5>%h`Foya(5V^Zy+QvZBTszli>+D2$5z^V=YEHVn_(E9~q%HcTu}badUSrmq_4 zU7_JQ#lq~|a-~c8!o{>mx0jFK+^pq~z4L`$pYEAkgLRGE^SB#<4z)q@+Ah(YS@`di z?W(-zpTx2zXAkyLz?qre{iqzZ5${i-Acno=pRc9O@-zef|7BctW$ zG4n->`9iBX>FYB$`9h(fD`qYtcB)q9YV!!>(+y* z}o0o2;bVdK3R~5f;%XS}j;*eB)L;ESa!ERHNu&J8_)<>HdlJuqQU6 zpXzSu&)>WiL%eGYW&!KZSj@Q&apTmDC-_MgDMobPgkC1{96qWwO-F#4Q+C>!o+>tj z0tRSg<(f+rX-X`womsmh#0L9_}*3x7HD3I%(=pA3LNqfwy$fb=h)cusseLE+F!`W(4yAsx45 zJSPJ6Q8a$-97iHM^GE)$`z)ecR$ZVcpB_JDaOr`?t84C8$uhn4<7IT?r8IMcNu$Oh z&t!Z1?0qYjMD|*+KhTp-ODL2$!y_2g)G7@J$tbrfrKXk6Dylcpqs!8oMB{DN_k*@? zKY8+q?Gn^Fb`sH+Iw^Cztl+P>u-M~7FKKB1i9BQv9T+wSj;Ajj?nt&ANZ9Q3g606% zV4sinNxWLPAmOiSK)}%uAHZXYkWS=V3$GhG6j7gXx5E0L{yw*so3YPn^F!t_{e_+$ z&-{-f7m(9?%H2J(cBP*Uoic#Xe}|%I?eEkM?(z^e1~Z@2riW}UHyxGljx1g>Ifak8 z(RM!(2)Gd@KVEr; zbMkq+nCG48|2a6c>&WgIY^Xv{F&_6NmCJHbf1jEXKJwau|k!_u1$Q2SiY zwSlATT*@0L^z+7Nnb58vf zu>Ab|bx(orZRER^M~b6l-S>lUD4AxHbTg{Q*udvMrz66FxVACEytZXRlm0-Dji9NH z4)rpAwam=3V^-t+xLMnDWN<)5z?X7(eglei|K^LK9=|g`l-N#=*L$C7ppP2Yu3(fQ z-6v7eULoyt6JEMi3?#P$D4cv=;($`{Xnj}3W=123G|aRJ`6z6iqWI;2yR0I~4SWJh z`I`M6T#dE3j#BHOAnBY};P~0<)KTjVz}_juu-}tBQ1u#N{EpW^TOeUqs-D0c+ADYao2KLX?ipgr9Qe-teaj?m#%`PFofN;M@9)R0OJ><8 zf%Iuj&e+I9|FZwMos3tMLxI=5vo_w~YXRMawl0E3hXN|0y-Ct$M)v#T#|LqdS9O&H z?at1&v|<#4jX=YNlWT^57#mjCxF_)8BCAaG z^D_p!xhFB}>j%Ck_%#RUo$BR9lSZPj9R^o&J@kSsZD(dFhsT`uAlO1 z_SB?pd^q9jcn9a2lk58%$2?n}Io@?cL!R{g`-h*;_luSB&P|PKN#sGhrdjUIm-ysX zH`sf3Pt#6XS|R?m+)yg~RuFDhhJvID=UG)CUsGtlvv3{L6b=2p`%JdKZj{pj0kseZf8JBwY3e9~$1)Ae%F^|!=6DBL)6E|!NAW0l%--IpAm ze~r-dlCeR2M*&cML#9Z(qnYszs>x%nw^1mpqtoybwCU)xoy((D%LC!USJ564%a3F6 zbo>}pGO|hW5Vw01;bZpeodCK*=tjF!6!r(yH;s1tk!d3(m-`7f!0nxUl`-~adwwt{ zu>sdWwR>ifR2NnO5V@$phZ$m+(#JFqjcuR##<}Oo8=4zA6Skad zp4DmHiB|8m%ABMZ5@K%@rzBZjlt4}&vy=uLwEITS(gf&JBWhY1*7xCYm66|1cNEMv z1Jb`s|7BT=t&-ptM`Z{?M{Y6h6|tIV4JK<5efZEG_84-H)bl}RJklIJzqokD_UwEC zgG=HW?+%|`<_B^OfLHjHc7pWbgZpirh#{$|ni=FUaE9rK^ZGyLu7= z1!brOvjDhoDJT|i6RENu7mLew1Pm8sL?>MxHOBC3Nh{eRYeYD?K(gvRj3<^4R@B@vP)3Y!zRp5PPD@n88ByIewWG6fF zfh65~bEd_;)TR$t`Qv|H0CI=?T#&d%(878$t;G}8ELi7-L>L-o%gQzY^kzmEHofmZ z8r&|dt`OA=RuB{xW|%-HxB9hM$yr3eBK?gH6|=gLR^?DN#hf`i+C~|oE+O7sf%!as z5r3Ak>>4ck7kF)4CC_2MJ75QNde;~Xfq4xqoy&4<-m(}_-*<}@nXlpAPdL8o zB8MxKZ2M^|uJpxB;3ar^gjYYjFxNswcee+6a&pq_P9uT&qc^7JmwZ0nck0Yh8k{KX zSmp?Mo=K6j)uiP!1I7mmBumG`Tr~6B&lqh`UL z79dPRG}2ayDfFx4XP6|NqrrQSMnTDq1T(_Y_+eD_2j;_|X-8)T4e!un948?DOEjW# z@7#+|<;+{sn|?oxpon`U^M0j%bJfz_vxY4yHp!QJ$i}Ze6*=y>Xjfg%pd!AY87IMS z+Ry?Ak6BLgXrQ=4k~p#)loZUR*;3_0dD8nS&(qXjB29jqvi1E+#C4S?ru;>~%<=P0 zEhtLH3B;FSf1~YTukDiY*&#K=>ntC{Wj={U~MxK z9cW2Xv_mJ5FmH{wTsixaFsIvC%Y)hA*Pd#G)c1QqWhnxkNiDzzxM?ja{S?X&67j&a zt?)74c|U7Q^-UI{e#6gp2_5{O1HT-KDk?+&$-2vw@s)DcwxE$;6xP2Iu6VH1S6-QM z)(2{sVj68wHev3d+U=xR)SGUX$yJP1KEpj-Wis}?9IAy@gBn>=A6cqr+sBF@&Jtw ztB#ChZ>bJ25K|uv!9n`qM4P!p^2%Tti+GSP62mJDs7tVisn01=QoB5bl@H zPQL$8rdNL-PlGYHExYd#&00}fEcT>6ShwGob1lNR#bndGqMQ@xy$-ci^; zjQ4huN-sq|7-ZFkaW?K>?8?}b)*fQ+EcWFq4K-*ef}nkLehM9zuYPHA?(dgTHdadRI+3GvHeJa;Dy|`k~r|Xpu-Sy=u^HR(rBc-QCK2&TI2UC0rj>S+|x)$xnPJ znpad;O@fE*AB?D{%YW5CdSg`g zL1xrYQhQL?TYu10X;7;r*P{xkMT_I}h&wMx->s>VfS(Y-ihQV2eejYzxGJXR=AlQ$ z;|i6RNf@kF3{G+;PUj3{;iM-MbsYSYO!7oCIoLUB~!0y|P6Lj)#>% z+;g#oYbVJCt!yj5E;w}?KOPhI7vFf=V)Pxp)#Wl;W^ukrJ%?HA9{mTFQ|he&LP^)>uZl!Zyp$ZeH+MSA~5Cs~*gB(vqxu-hChyOLnM>%K8MsdiZYu=6?N zdth0-)173akEgdE)X$RgF4JXJ(WOf2q+)MgLm?9uS7A09oTeUJXHvN6beZp|=4zV} zP*qLzxfc7$T~GNS46WiCjSWE>7^IKE%K!Eyo8K!WjBtf9nd}=hz zk{)~y?Ur|Oxn}~*HSv0up|)yqLhOR7U-9e(2V02!ONKl2HK|Gm zSpI9ftD79rBG_B+Y~#ISL&|$g=MTNf!!75ip%+Rkm06v9e>uDNgjOo?7=?W4b@<4| z27_8C8fDdazkoC(tcuSesW_l~$=QiVcIdEf{dtp3*@d^qW^2XARg_EZ>xak~_YmmW1I#{j?XGkCD_#b1*V+ ze0TUuVbSeg+r$x(9d=QCDawfB3bqAo#qb6BD~H!~2Wj97^(9`AtoDCu9QJaGQ=ZUM z4YmqVQ%lhLaJuB^RAf&*r|qb3yv~&Z%#!wcSy1SzIB<=B`4Thj4f%yEM%UhIzHw+B zE#U1V5|y^ktx#ZUn=-%Awe&=gcNwSSsl3mSZW*V$v>lw$IWk>BD+I_nCz)9|t7W3_ zo;6`Zvh9w{x%6k~2K5DV`rNZLK_UV55Y;F11-5e=9J&`?-+ta^yZPFWop@G@+J4}9 z`DsW+9yjjss5wFrgk4n2+z&1HB$EHVExJs>u5Qs26FzvPDJ=5d-;yFfnrn5UhL(CD z%MtzvJ0T2Nq4XEx<2$zO)7gDtSfhcyB&MM$@R1|mvgPCEPG#q57wA^SK8~txmzM=E zIVWIvn;PJjzjJ5b5BV0*f}_p0vv@H^2d;YcKNI=_NYiq&kzNk}v8tek@Bk~?D)5J68^?=B;h|g@i?fGUAYK>js$|T55Mqs@_n~fw8U1&7J9duUgA9u(Ts}h@QV-(aV<pv=>t^+v zeHdJY=@NqSZ!+se?EHRwG8nx|e@5G`Nsss#!>^5O1ZiRN%wzo(`FEN9kX+~rW^K+( znehv#nQ_L68_kB({DjA6C%~vIX1sI5D3SDaA70Ia{vSlCfD|65ab$kr2UUY4LQA(( z{5MfnJassgUlQlbzd%QJz1v(f;#tSrjdJv;JdaG zYFf67Gis4>&->@aN^9CDEf1TKBy8u(DLBMf3BSp|x3;mlgeJcSE_t_RixqI86IwEz zYMzm|L(7tfOy?#{w}5%KV!Vo(*LM6P$DKZE6gmx6P>JQ#NA)t21FAxKC>F#}g6=NbJu+;P&j>2|VcCXb zszS}W?A>lvA3D6{)vi?lOPbp1>L@SvU8>b}_RMSMWWf-C|LnRm2Z+tHhr$~PvJJBQF?@1J;Kqni9k#%KT+jKTS_J_O)rH%pi^Jsp`0{!5Q)x4}N^TyMO=`iadIzsOnaL{)zz9 z*Y7s(V11oS%5_p%-6VtxTch6Bf=go0k0edc?unlk|9S1P)ls|g47C7XKKtRSA4NA< zJn;0pbt7px`6Vl!nbi?hgYS2G($4ywKE3{UQ!PDHu{5mWv$M2VWfnR(p5QbybOT#* zyt=UvwHxa;nIn1M2V=3ibOHLpTCn2Er)3LHiatqtk3YCTIW;hU<|)Rgf0$@=zLWFI z!yEyZt0J7;N7J0c)f4pRXJ==-*KGW4$q!6ewvHrYfVVK`eJ*TpcSnVog?)64`vgI^ zB#Yz*+hY2zolf&#CMzD~o#mPNOu3VCF5@eEOYWz*7pprwK2514vq*uD_|H&&O%9O< z;@S}{bMAFPwYv$^bD=^F!F25t5O<{m5K&-lbyf?|i4~zNcqh#zp#i)TU6Sah zRtN2<8AokN?HdaeDR_q+QdBe4(>LzgVh{bq{G*hUeuVg3t_N9g z!2h?wM27aQEs2!U0ke3LLc}}wMA(wz17dz+CYeFg`@+(wcGaIo?7oT|x?b_H(4IMbv#p?LIh zq#*xxoU-ik)4NdoL$s{i@k!Erkor=@Y0hM(e(sPTt2>?YLWgM7^ad0Qphke5s%sXg#@{ zsY!nH@xu=rXK)}|;IQ$8RDq%I$pUKqhif;a+Tl%k;2wKq>FzK?3UATe)mNo`c7 z5aA0JcqGi7{#WH=FBU+1a-)D5vOr-prk;IAgH|Oa;THpv!qk&bQsT1)l6di7*;^V#6A1TNb8ripxbVz%xyRU$Zg;xZwE?_yh!Y-nh~W>5j>|mCTx>7 zWxZW8^h;+l2+xkt2X>n~beUDqe*Xz?f z=%w#}Ynd07l_mVStgOQ|@$UV+h#QskJP$$iur~blEbVv75duu$XXGbJ4jZ%@*4vbu zUQ%-c&Ss`e0jIF#bNr)+!RKs4Z@fA!5R@&xcfN#1cJ{KD1J?JIx$NZev{y!;!G#gA z*aYhv1JSOIf%95pw455)+UBQEG7*S>f#Kf)JnO%#bV|XSH@DUB=l&IPpfOnc708x` zA|rt^9@m*G&_o!_+gE&@RZ2HWrDF@cFfKKbsngbrJgFTlap+u-&_ZBgi|*W+wAJFJ`S_b_RgLX zv)BqgvkUEcjXN)(V#VE*Gt7()2_;1|BpfVkY*hT3nmV`M(I~4X#Idyz9a^v(Ea9h9 z2ZE>J?3MVeu14S9rL3}OQNs1+1;of~G^w7&($v6N&l@vN32mB_;4AgIEOVUJuHVm- z1Uq<&6#0|pUqgDA)A6!-}Fq-!5S2=@oCP@J!XA6|8;C=7Ibx&65L zZV-K$RnaT#&?{w13=vv=z~aADBuW`tmEO!U9~+@n<`%!Py6jO*dSjF`EL`DOt`>eJ zy`O$%BUbrc19ZriE9@Eb$b)OEuR}VO^_SC?BOoh_n7g>=mugL)q%he+J3by>PAr@+ zax^$Q`Tb~DSa{%2mW@FL7@4G zRp|AkM$6@F7aEW}#y_VlRc&KHCY|qu>*pto;nd7QnK|SEJ8c^JhuIh`#+^Bb;*L`{PyYc- z`|r(#^jQwO+}*(2de&wkUwWW_F$R@36{q(3Zmuea&UZoDZwox$7p5_NDqf(^ic`I% z7YH9)O~GHUkD=ow8Aay42ry(WGv@X3nNMVOZG~THsZQ7iTnV`A4@`wcpQCsrMbT3P z-j{E(w^F|K>w5oG;=v2aZI0mqx#83!=RT`h(DyZoM?=ox5L|3`-KY=tJ6CF36x#_G z3p16aQ94HTQVhJ;-OO#WVoVe%+?I?x$gmi-u_9hAiUnYRy=SIlqWQ?H=76t5 zcD*CRP?&}s0f!=0w0d7AiRZ(R5ELt{)%pi+W;q_S!7yTD`z$m(o6fwHhh{Zax+j*h}G>_~6FF@5-~U@5`Ct#&rto?^%`UCAGB^gJsG3 z;kvXAHl;ksP8=5Az6=~oD&D=R9o7=y2~4Zf^6tw|=*e#PK)TX^ZO@hs$Kb97Y5qh~ z{I!13^W}8@F7eyp;%r0Rs@m=LTfk$w|*9 zFA(=`JU?CFdE7WWPD82OKNT`Tu{e#1=@N)ob=G=vyR-QFVce98Rr*U%IAs??-F%p8 zv{+yi6O{57B^d>jvDWMjfO^_|@W)+o=%%B-Gck(1G66{sMu*fV-~4CRMRqV^F0-=U z%sYdf_%#ONefX-)$q+&7xR!3~IYmqR$?UE-;k~QrSh|Iur+)G3nZ4^}l`^<~fbrSa=**9O|uGi{1mQ1_@aHO+})-am; zy=ZXU-F-Q(&4XX_OZyC9JDs_6#*3$1&~E_+y{&j<_x#VcfD!pl*RBD3bB{}*#wp{8 z97>=jHo)%m`=89a36tE(zi>aSX8>oMkdY;v;$g1xeo?X9X5Kh~{LSDWBV$*R?o6n$ z(D6fiIx z99T(IKS+oV8B=Cdh2@~4{7yD-hMT+1zuH9Q; zRxEuuj|hN&t*cH%i$p^Xi-k)F<3hCYo)qSg8Jt>9=F{fItMA31JdP=TSZR1R8EL{5 z*Zx@oUFmi1z30M(#8MkFA2Yt!n5fm@pa+ky>#UB}k=uMw7;H~TcN;Tmb~0Tg*xctm zy7WH4Do(I1pW{1;xNo^tWEhnLKt8K+xNn(fcwK5m|6lBPek#hkY z*<2VvOKhK$Nto4Zj-`{*5`5R+Q+E{25Hx#A4o_0lhC~rPyy$$e8D1BnHOWwohn$>F z`Sn;&RQZy)@G`2S%Zfvr+e@dX#Vzs(akc(ki$qF5LEUl%5xQb7-D^RFJk)yj(yR*5 z*U#v+5Adx?-3^QaT~2>crAwLoi9IjJ)<=4wU=_Z zzxw|AW>BQmuCX_L->IGHBO?mXdBCD9c3cscJ5My_y z74%JhUiH8CP&Y7Lb{DKxS-ae{O(ahcrVPwYHg(*7Wk=LK(B)&f!OP88&2qmzN#s;@ z0^paUJj)$!eREm;iddEkdA<)W`EJ#v)urP+CN9F&F&_ZW8-9MWb{moE+wR=n?l*lB zYrGGP76`=DDQ3c-KfPM%c*#yhTL9>I$s6L0?ajH&Ojz!{s}lk^Xu`dX#Azq>B0fd9 z-lPTlojzYsQ1DGI9GV$39-Q&~c{6gr;OVC(h9jFUZJDzUie*-baYzVn6$C_S-Ov*B z0L3EmRc;uS>%axRnROdY#?bmji+qJpE)n{7I%a{$xGhs;)O01gdvduQ{2j38FD0l= zI3s}pM^_5d4n98E7%4<>foDH$)$?_$o_fm((LDEMsgm@Zk^?Azb8-5b*%p7}(dgZG zq&E$GHnVlC)`i1!oqbY+Q+qXUEPSQC+{NhId{svWH6Qp2X$kKF zzg37`w_iX~;>-Bi?Ss5mG+AebvjWdvF3Qfr??D>u!|0q~ZPAG6&%C>wdPf zSMZvhDUTb$p7v||d2~PEZnO2xx(DB9BQCZcBhZ_Osud9dlm!g7fpgQ8&i2Y90 zI}XRDplqzz3Z@#6e>Np@Xg?E@m{Fqv+<|lXb!c`(T5CF$_xqPdB~@*z$!YK`@F6WFF1A8x$M#gi0DyTMz4o$q=e6u9fGEd;CbGh=QTr46~q~85U{%gO*;}(La_nw{H#dOwh z3e!(vZ&JQ3{yX{xaMi(fuq)r37l#l{gfxos%*js=QhSSUS?0*a z@2{m?F_DalOs?8{i{FerOX^T!%NRG(KNRTYV@Tk;RAeXF2OcAmQ?w;_QoJRSh6bkk z8%I&UE#X3i7y=4RqSU$MIF{(5WN_K6RjfTdix($P$DksIjw+e;E-C=?|vb^%9ryminRg6WS^ znyaDX-Kp*V8z-p`$E1zEoaXV%u=y2U#r*e9LTSE8=7pgjJrdJ3IqoT!bhiF&-k!t5 zdhsy86y_JC25P!hLc)0DyOQjM=R3a)O*KJJ_1ogQnLfyS)SUCDd;$g`wG$LAubB2R zcu-!gCH*0o6JJT2dpBu`>bbAV>GEQrZ$Z(3)`EkQbIq1CuW-tH>qJ>cH3Int5;w;P z3n*`C>UmOIiL`q9ijAhz^X0WV;MTB5?!S~l4v*@QA^=O7SrtQg*}x+H6d-BGi4a}` z4V?vET6Y&=rU))wCW)tZ zx6kttu|MxHnZqw6bz&Mxmem(Ff_6CkHzr`qFM0yUK2Bz;&kjR^V zdv)@Wd}MIx*3V0`w<;APxPWK^+I7_sSfvqN8EZH}DYPnfWyjWD*n=tUU)xFP#FCg0<)fByIkvf?(+K8h$z8 ze-(BF;A}1fM7H_MIU^?NPKqxDy8MHc!^AKnZh6)9lHhO4C%$e=LNM+k_Z`I8} z#?qkmKV=dBtt}nHjYd5h$uW(_15SR^D~R&M2Uu(Tnh1Jd1!aFUjXUxO#Q6hmb`ol` zzbQHZHzhI}PU>eS{Ql3{m77OXN{@RQWwQBW@hE$4G%q(Wh!qGx+f#y?p~_B^)3}%r z;P%kb<;CC`IFJnwx#_l1FI{B`k zvzRV+v&L3$uQ^r*{Bp0YI3_IQL6DG>>V*G8*U?9?TSlovS%HTEN)r){bnT~stYVIi z{E&!jA@td~PR9;HeSivT2}^RDto;V^R8@~E^6SbIKlA_5HrF9f3{b%Uwa+es4$qP? zApntm1>!^}_6{vM8+x!yAnp*rjUWI6@f%|$a(hGa~?#e*THw`j@J-O&gL3y{JO;X;ehKy(|ELJ$ud6<3#n zxiQ)_WH|o3LOAE|QZK6YPKW221SY&b9q}ldQf1e6B73h*0Ik7}KlBH2;%{26sdNx# zCFenmfImY9leQ%1QB!9igbSpj5Kt1H1_G&rCE<>0QGiEZ z8j&HcMuR{fDH&gH0HG{E;C$4LMwHrotr;?^dIYEMb_~btlD0ncqc~}_f18Nrq#@f$ zEg}+ycNZo;p{Hpf4+PQIDbzr{M%3x~LL}TQ2G{=0A3#mH3qFNw`BS?~b+Dve(`!LT zbl|3_Nh}u5wxT3YNRJgiIfC24XzMk?7>Fj8YZFVP3V%g-9PH0H#P%%6`K^y&GiIXC z{fDfR0KK~gZ_Cu)nbx?_`d?h!cDsnYhXFaRD?EIyBJ8K=UYY2BJ#D1QKdUFebGI`8 z+?tR16~$Kf3+p!&X$(!-I+uQI>?~YE&;s#0gM?kMqV}yMo1A^|qgilp-d~X!E>L-v zDeuyBc2N;`A($24K?65zD_`M*U}+)vV-HJRR6&J*Pjoa;$vlx z?p5l8DFpO{+8MaXg7l09{=&Qh@ln~($-7)3hey;SIO>x9lGz{+4E)kOPG6MjnpA15 z*EiP}<~E7`{6>hK>*3!@U#w*IzZ$k&-hSi2McL$UX!`T#L zwkBybOrdTMLi z^4sMY1YiqNYYV5T|e}w*Fg7 z1+v)7?lZwwbBd7jYn+XDaY&V6H#eN!cPqK>gA}o%Ku}a!U)n&-_oT!zk{{h4BW2j} zZv5yU_cv5d@*{`^bi@E&;=p$VB|!X}RVbFt9%$|txTc5W8$m0VPj33LBk>X3u0JXd zj(m5uBy{SQ)m7tzXEw(a_4DNl;%}}4-P234Yt<86)i)2OQ%$B3o;cRYj4@i5P2Z!- z%WgDC8hE_6BMl;JqOAYTkD2F~oq8xgRdFt_O7~iuUk>j-p}R_J+%q$u)#|4QE|(!j z(1QnLh=sJD&`lHT+2|0DO8~ShTpI{JhU8KXnu2`bXXiODJoJ?|e0qSosBA<2P8rI$ zHM5l}kM(oeD*9}h_g(SoN9~JaZ)a&;Tx_m4nan>Pop=ZPGKkP`F6UWYRF&#oU=CUn zx6=3N#AsMd7r8wvEhXRPqH8_-fSc)ENMlNRR)k^5HSuIB8tT;3%tqIEPE*IQ=Qdw^ z&ciI3a!o<9kp`D4vga5+I#ew7kyCD|YTbxF_HN7S^yP*q*ejd zS#K_t11Bc=s;>mIaP!tO|D+EP@ zw3!Q1L^u5+*vxxln;y<(SE3qN16jg|Qs_#@o1q?(3+30j@$Ae*j`VA(K^rX&wZWyJ z2)+EE)%$Ee`+j`x6XB{-<)>b_JS6L{T7NKpPfSpag>!(d!^1%Hlk5_LMJw^X-D0Le z1fNHX#n~o70{Z+*lYx%rFwOWbt8h>{_?i&Dp67U+1`78@IAw1t1#}v?)UJH&^DlnX zvX5$t`g*xg>6{-ggQmN7xpmizDws%F|M&eR-+P?L`J`y`Xs5G~#JYklHOCI{hYxOg z1_lh{A3xYWwBnOu3pz-28u#4TqR+41zU^28a{yVl5W4Cls zUR}7d(5!RW^LqQ?vBdfFOtds?L18_j$!MyJ-a>r=Ldo0td!V{iX>+@uN*#U8%-dfW74rv&g>?yJwImgx>dRP zQvGW;N=l_boYU!X)6=`J<`w3^iO1Z0<$NV`9XHjle)?$MSjEyOD|*wioY&r@eRItC zfv_5TL4D1!R?A!Ue`Ub$lU|v>nXfU0}2}BSIBjCyUl;{FBFf}O;ecuBL$uO4E(7sP!+i{4H zSgx&or2metKoM%P2fj+(9S!oe_zZ+4*#>0PPBO7n;i^uzpOIptEpfjtskr?9Uz{@q8 z>!aP+$R(g}+d{?7cZALf$GH?A(MCB|2j$oczxeb?&)%u4lpV4WA9LfcTfV>3O?9VTD@a241x*}DN6^qzi89rkYuq z++g2foo_j&=tWNrvCFq~?yRjt4FBb_=WKg+VtS3A2h5%cDaJmD6_{4OtI0R96_>a* zF>tkP`qd}f@`jeheLtQc6@;zYI6&3lNtD&)m8(ybrS{olJ=?WydSB*-nFLwazz|t` zx7b_`^QDgMS%cHlO~EFAPI`ni+~iRDTpXl zdJBXiBE1)-gpTwoorK<-^dcm5AwWV+AR+mA-h1!6?)QJ+th3JAYn`>v*?Y>K*|TTn z954Sp99T`EuoURHi6k+e7OEu7>jlfn0y~qwJY7B!SFlZ5nT5BPF+i;bdqlrA@+}_w zO)!r1QO(yQ4_p3{ZvKSqPK%}moP5tCPx2j{7am?HI? z;~)QdGyS}ClqMm3G(V>oe_|eO9U=J4_}cZJdX|M>x0YzD6ohV{jcSjEZ9XmyigV!sZA{;d}RHH_P?Ihi#9o&AtWS z3DdK%h&h~iz*XUdsRZvP<^mH1b+3PYY^67q{n1U%=qn+EE9uo#-1yQBhkf|ZY<-?e z)z{0SCL%NFf|1I#FJPmSf?{{4est_l$Ne&4|EqDsj$-N$-hV6tdb2Gy zesUL=p}4FDs8w72$6q$5g!5HbE)h{>PQ3`_KD))J=}YfhL@K3EdeyV;p~2zV?a=VA z6VmDE2*Wu^Xt+N5nR-2&y}Afz|EOp$b8K3r{uib*#d!b2x@oWAYVB36Tb`Aqkm3Ky ziTzh*?B)H)k%6G}lrgbgDBKy&4(r|$1CtoQwcWNsq@^L4Z0aa`+Im~N$}%>o1E_TW zXyyS*VJ&DWhvR5jOiNJ|7kRL?Ui)wxUB%eN>?^_M_7MQi>$j}I^N}EpLu21-HrZSK z0tdTI6TqFklkAy;FH|oMdPO&*aPOWW?XgTpjw$|d6)htFy=^q^s{07L{mj!kgHz(& zC63fqI3VPjBtIcO=CuuSEGG(2;7Cn1o=v*ULmtpSt=LVqp409v{hdus+*;!C8H}ZTDHG`a}j>Vh3*PQ{zN1s4?DtMfeW4&v%L{_cn{?*SEx47CN!XrG%zc@$x;{+)3^7aXFQh6P4Dhn<>0dk zub9DHcF~N(0vgj@5Xk6&|EF}{5bo07$tgJ*FmKh8RQ#$S=U|*|kzHP8gzg2ezwWDC z4ZK8l>cgaSjXj0V4H|#lsm7O8KS^yw#s~k)SpU-)Zs^h4en45UxcmEq$fYve)IayK zW&<)1S}c*5W)Zc8Eg~HY6Y_DsgYg^4hI%j@TBP*I_IuM`Xm>8t{o*{A?9WEwW5u1Q z(g(XOdxrV%*;KL^*Z$tFaY7Sh3+~SzZ3_H`p61JbKu-EsSUW9{S;KpWzD?Nd8x)h= zNO`9M0KhZVNgP7TmSFpv2bVMr_>TD)i8s%8nE;;Q-IJ*+Am0v*#!5H&bKMuoqox3+ zZ^+}9bZ5=^^WV;mY?X|j4Jgz*F+`R=sy3=W^*m4fQ?b}I9(knho^W46liODBdZtF8 zK{z%eap6pe;YQnXBwW=hM@H6A!)VRx9pjrQOL5v|yA&TW^TkR|T++?V+lwRaqkq7$ zp=4R1R^Q7loBS&_eywSiOrIHV4X!CqPKjUDG2R#lrz(V!VOjb5ihG{vbdRmS5%@HJ zq_775kq%Z5&VmkC6p0aVs%qKkqnZ-MlQZbg^1k&o`&qkcc1LjQ} z1{cNm)|_q9Qhgt^4BX6^j*N%S!~7Iztust|BW?Sh3=uW4MnjGdt*-4^TPpHzZ9WI9 z+F^fu1D|I#&XSlv{Gawt(_)%{`3FhOAj$hSD-2Fj45XEm*Elf@96$kGZ%h5>)}7`r ziE%;uC14%jBS3;2Y7~gu!9x6Bp0^U_@3}jPI!b-}c0vjxgvAVauU{UAFCQ{UX7qma z@5L<`@D3mdoQ2oCOz6QwH_ll+{Kh1UwWP3%L>X?O0{|?Y%KLcM^6mbUQg$X{{ur)E z#@{fg=S6(^X`}-zP`yjF(}j5|<+I@8xlbsX#X6Ur@+SdUJ!Uq|tC4x6>E%9hK2&D= z0x7cewL5Ov;#43=gA?9xuk^O&FlyH4lxEjcK0Z~7atbIJdkWCq-oqFn6NjZ441*s` zBpaw!|Jh%lPDZ4)dpSne&2P2!Klyqf`*2Ekb-JSvNTUvJwz{3=`mKJH!9|JLe@Bxk zPh*LWH3FWTNl!QOL~O$;>2!4{O8ln*b_n2$cgu@lNbcuwu#ohv4xEX!3V*O$s>4}I z$7H^4rqeX+cTB6TCoLRUIJoFV4@)i6gQWr@Skmq1dxs`(5AmIs9z0MpCg(5GfGH)aS|NCrDWU(~ z!~C1Hn=OJET8*Ml>7lwe5ZE@1I#M&r=9t>z3OM1Cvi?jsV834_6>Mzds11RK)poy> zhhGZi3?>KEv3#%RxqX57^BrD3i;a8@2W# z$6!wW(Ua~m#a{xFczY#k6;a#?OH;Z+U0db`bz(klG%yc({~atF%_2hAl{0>fI z+#`tFdf0#6EZD>KGS^0A(`^~{-ur9h*d9C)rN)1-VP#ms{A-_bE(^xmVZMw1zTw#^ z{sHNy_SZLk1A)}~WXhyZ@1OA9?$q_04QOy8HF!QOl@%PgUKzLJw!m6TFIX&@t-nzh z8l;J=2rMmmni49h^fRg2wDiZ+7IencOz3^BFF|c*?Q_(~^YUg|aLhgY;((w2nJ+-& zuc%G2c*(7)pZs#Dv-;XTgVR}iH{r4Sb&R^AlQk=u?vA;BHIr3a&1YT!MKB>b%(C$bstwhh)MPE^NQ8c^gAcQWGF3nC6B52fsD^ zQhj^sfnO!*&VT7`k}aALQqoxQm?*EkcsKEr&_#T)a$j9|A@$UA>)dZj5DxWg%mjLV zATQx1_}-H{g111T#8L)~PEz%Dg*SsQn=EGO6+L zT=(SSl7g*gTg$xt47acw5f{}swA9vu-oO0;h*u2br3>cmy(Pj%0p-ibaJsf(_ELVQ zvf~bKK&gmxB2bceF_X-fLe~w^ZOY~ zBedN00MndxTp5$ycxrV9eu~U{iNN?}S;dxg-Z(EEqtSj&06Y&O9rgwG`8Ke34pYI> z+WXEbp4veR8vl8i7>%#7$q2d$Nlbv^+~#5QRE9KzlD;)s5`mh9dzvDI1u`U#eK!6#u- zUu1mN#5-Z(5hNjCv){IRbdKQi#muQlitvWpAdP480iKeoaQ4nZwTMgUZA*X znEX;tk39Ki^2^r)kcw{TJM^gbeN!`r2T;li_7RWONRb<;TU(M5KGnPal#+gu2K0RH zcZ}@rC*jFAfOa#H!iQ(RzmJ<@@74H*E5Y<>>A}JO(C2@zZ`HyWTbClv&6igYtx-U0 zhos*C5(Vj&?cmnK-PAGmNo;OA<4XTAOx4Gk4`VFVE=4i_^#bh%jOtn5$?Hvr=Dfs$ z#~D^CUZr{SJRhi_El^P24XUI&$p$A7r{t25%LWCj99r9J8C1nkm*u-nmJpiQy|cGu zooVgR&qiu9=>nL840}o49ozbj2j(RIl~7vMG^RF+`aR+!93euw`?>4+w0MrB_}5C8 zC0fG^@}VRUsyJpIy}x~sq#0s;B>EXCfHMVzHt2n{ zA@Nn4Hth8woNaQZwCRuYQUY04^HbQ^=r2bD-+jhv9~Al%0M`93xt)}NlJVZ{kE@ZK zGs||;T@q-`ct?A7G9gyRzQ%5_&Vr+reerr3o*30j*w&xrg*gPHdJfN-stw7ZDEE6g zx=d70|Lc;1nb`1Q^j0-bI~nzus9|ZH4VEe-U)90C4~YnBVk-9y-0W*Q@Y%7V@;(2t zIBkTR;Ok4F;56W@<-UpQ;Oe3Z*bFUT0sv`v2<)RD2ghmoCOl{p&)M~AoTYazb3kc_ zs!1&`pIK_>SyNc%re25`jRFK(o>G8HxHfa{8s8u-Pyt8%zw)jG(8#tidhcEns;_d? z>RyxCMZ|uj_UAu60?~>voNN<{x5z6YBSV9V&!0>e>jZod);4yk3=5E8Y#F?+j^)s(Z`V*k4MWG)LD~eJ%b8Zz9#*`;aHxn@m z-VZVbHjC7ujIqH6;J8!6T(${SBVnt9^l!{~U!!tum?K6=zY%xbC{8tD(r5@3JzJ;P6FLt}pfvHg% zr$dHz zSa2e7tyWP_a7*YMjiRoXW2TQ2Fr6>Lo@G>`M_&+I={h-;U%yDddIt0`2$ zzD)&NIk#WwvzKy2#C1X|-|7}Tw_7IgM4)VLI;FnbKa~L*gI*Pa&0RBaioY#&|F307 z>g(bq#=ltLa@%d^g!5u4pleE;{)-d<&ISrZ)8W}w{KgTyk9iV%bzm90(mK^Gt@6d1 z0^%i~-Pi|t$a}&ELwvI0`O@NPsPul@H}S&ezWwt%tBc0=28U@*V+W3g4O=rEeN4ttY*6cP&hXPU^2wyRG-w1q$slrZ&0Y*Sq_&eeP$| zO;d_54F*88WAqrod@o=h@#GH7NKx%NF%oyXwE`a|lnPdtb}`y~FMvdwEhyP*!rH=+ zoqN~(&UV{)MapyAw>7s#C0Xkki~HW!Dc;yfYFC|ijOS4m{IJ*OBLX*$hI<)O6F)mA zkL$b(|Io&@7=-FcX(vV4(@z}|Pea57I^~qx43S$~4uhF|q%tZB8p(8|ZwC-JEr{9} zouUwyRBtIuev$F!5DG%++AfR7WFA}ho1nkaC8FuUXC1qK!9+E||DTXu`}4;}XU*xM zSqVGP*PuEI*yqG~;cT||;QTJ;#mhgj&q#hklh_9JD}-07JSD|?OukO#f<934?*feo zpZ&_P_Yz5yk`{r6&KI0)Joce!mXDOzF}LHsB)ric9{c@GbQZsmq-ecvpnZi1syarB zXmwX!R2e6q=ovmx#LRQB;uc=D$g^jli<*x><9OAa-L}Fnz_lCs{;uRk0msg2Tuu2X zZ75blT#Hp>UG{0l=6Nmf9sPx|#n;A$vF)K1#=XW?wBjhJ)V+|H=0Z4^^QoL(z!P#K zUNU9`=qW@yz)SY)1jtv@nM9gW%lUZ>Kc4tSccMe=m;$$m}iU*(oFL?1MU z5k(ag=aAd&Fe;f=p7_3-6=_Z5@480cGx+$V_A%Yfp3tgfMaY;e7d1hv^vU5YZ#`d? zg`|K$qXn2Sk8^Z`J(iJ&Vmpnu_aBpa82%cco1+MmZ%#%hBQJ1 zft|dfGeE630Bc566%{xZzk#d#n1CPqG*J<`(mOjUvh_OxKg@t`kC@o_;WC$M*)ZaW zao#+GC|UK$AK`1OI6e@LatCm+9p-ydfBhPhqm-cQ<~xpF!>wR-o=ETa6pVC`Q# zLF`K)sAn?c{L)CXL8r4W5r;(*5*P+Qukj=K5}TI8>6mB z4O=Vv@dTxroqt-jpou^>?Kp}B(S1kLFI~>49P>>0B3|piES*cMN9qj)b>eiGzr>z{o*(o2(_W5jYh zhfu$`-J4O?d^XDQO>^igS0%fQ^YT?jzlU!>O^q14N5%c^iQAs1vp~O5(~a<2zqKV` zqr9)|6UPHmg%$ZAfF>(HsN%894D|H$RlMi;wLQ-6L#)fbL%%f?I*SU*|8mA8KU#qf zNBrElxb6C3?s3YrZ?XQYrbAhcML^70Q0*594P#)7_Tu3?gPB9gSNcFtKhX@oUGw5xc_5EIn!y9nWs&H zYxA(zX9RL!N?SSPK+JOc_c<-{v*8*!;(jP7;Tx{^(fJ??X2by3*M&ynjkgymVV0Ye z0mySO{W80!qhW*TMVMcuzB7NZqPp#}S}U}b zzsCaFK?^B?fB+I~j0tmrMem`G!nDaja{d5DTp}}wOeruf-0m_UD4BgdlVLKt7v}J1 zXN?g^ET|D|8A(3IAA(n@oc}30{|~&C;$*~yi-48ejZYt)FW8&X;dJJ>2~(7?ow`5- z3lpXdb##p!L?E{H`X$$DA#TrX#mddn;o4WI34j(VLK!F2GC3LV_P{hfbvjzMrU*NM zs6^--wMnCEA*88!^oEJMvQYzKa5J)~#-vhH8~(duIfqo^QHetQCkUk7LEm&U?OilX zXjO<3cB}4B2O|TH_~@LR-0}iI4lmLshtC2qiCA>oB$gNmHBc^@-o|^kLnCnHWD9oh ziI+*7zoJyZv0~rniStpv_er{Y1EY!GUy(-KPOi4HU&BelW#HPKedVgIa;q2rnl~BQ zaN#OB=7&enzdOU5{T_O4_wafm2&w2y6Fhf+}?2DM^TLrJ~ z$=Nm&P2X$7TvgdpjNUu$RX_QuJv36g=Ofu;CB=f?&?va)cJjifu~lqn)XLvTFrv$x zBn5P@td;OwtFI6KUs%lL$+r-0y@^ckyW(z9xz6L%FNRI(z_3*D?@U$O7t`Y|C~Uy zY&47pyaBro!wVA*L3B7Ca>(@=xUpM3(LeJr3yAnQnFtd?{)gQz2bJx9{Bg+PC{x99 zy13~LE&PucH=&W1P(UO{_@9IQ+8bhFu~gupzkbs{KlJ+Dkw4G+uV|sSu**lngu>VS z0eL0H>R}!j@jQ(9WzSpwq`*o#Tmdu2{#E&58W3>{gZ(c|kR`osM>x~tV3U7mOMbNT zBFE5y@J=bD@#qcAtZ+2;cOY8Y9|mdHLuDI<-`M*TF9I=LKW&JSsf{X!?93&qN z(`+}sg^5;cm*t{>MHseQmbFp@NH61Q!Ha+WHd={o)lWaQ#!?YRG}hXfx%~mxaokkk z%eVX+1UN7X#Q&MZhiTTGdK?Dn(HSl#=9er-5jhXqaESq$@X}<~{{6g9?m4$6n5-)M^Iqe4U!W_G?LPgbqg= zaRs-1vu5Y7t8#-%D3EP=W-82Lvf20iz@zw!Km0`W4R@+^gd5&?Qk+mz zEl^`89oHPBbZc~*L<}X_ozi$S(8A#|6&Q$VBAZ+emE8F zf8I=WF?N^ZcB+kaUQIxir5*aX|NJY5rKaRj0?sIIecfQ5<&Fh;FEbjgXg5c93?L}hXRZw`lP*l-%;+5Z0 z=ho95sZ_*uAxuac6OQ33Gj8=9D=2w_o@F|o$6mHk1KW&esm0Y)8fXXMiz^=<2>U;r zLQpmLk}hybD)slG5Jit!!FTOQ)w_Vub3hCD)*;2sx!i>-A{&=XYJh9R*_-sagu zoev_GEBgNILLIN>4)V{)o!G(Kr~0cZV@#wLI!Bw;RF=Xd`@c;6CyMg1(LC6(SM|AN zh~g&Qs7-?SIj{@ffp(OndQkqj#h-BTYh6eS8{IEiws`hvVsi4}g!ReqAh0US?XkEf zR|-0((n#bc@5HT(`Z5tUB-U;-Rj%2gJHQN%2rOC(sld6P)~^l*og{j}=pA&*FJAsF zkmxw6@lw`4wbv2eQ~vx$-e~{Zp+Zbj1)m{%$QTnh->gpffD)2XiSIDWidF9s2){L( zsT1LHh*H1RaKy;9!XFREG~o$>U|ENG#|*2U|~F zfJJ4V5J+m_k@Tu9%K@L`E8y((vzD8M;eSX`YtxHp3-;Nz0+odEyowWDQdA3hSxI?& zMvbYKmyEC@<+p_9bYOqYHGEJM`=#CY4}@<=DtFsduupZc+pJWsjL&w+((fQ|-@$OY zQvpNnVkn;@6Rn<85nElDa1i>dL6V~|A)Fy;nJ#Fokb2{kLagjZXj5{nRH+>gtAa8- zxavcwCBp}Z!A>w!-iT{M#ob^KU3w+m!l-oVUY+QDAB&<`ieZ_Zu4$6kshi0PT03)E(SP(8GnvxKc<=Nz{%vXS(qVt_lp zvbi$vZdGmg3cSeda;5at*=26pI<4%IBQs5T;Z^3Tp04rpdL1DqZxIwc&lO1mnnbC# z>F}SGROu>p%G0)n1LR>4UQTJlt z%crHD7`fi5tYb^h*-wI&;jt64x_A!*s~f>;Wx^0p&3rO#kIe4uZ6U8e*I`_ifA&Y$ zTw35UOG@9pFmz`GHK^V2l{T~6s88Gb_^j?l{CV1Fe_c@4&3uXf2>#t5 zfI^Hsu9W&Uj{FXWK7biVr5L0ecgZ0st+HxJ_#SN#e2yUq9(7;p1TBJJ4rwPPWdPRt zo(OX@Jm$>8O$uX|u1&um5&d=@tARX%OYTgt;LKv)SvOV+QHzC6+#I&y2UN>=_=mRi zCdRShb~8;CAvYFe2pn?6`qBF1(!Jx?)gvJ|NmL&2ha}RUv8h0{ykdC1M7s8N4iWzR z=dA6ydRkFxv7@|$+Jp_9EjJNp)Ocvj9i)4q9&C{?l4x0!6ePK|6%^8t)iRSb*tI#3 zoH<>bAR4*Hh|&9US5DwA#ntbjb`DMn*?#5r-S92>Ywz4a@=XgoU1e=5`z~2ko6m?Zv;ogEjb?3aAF7b823;YnExo-s6lbE%4=EM~aG?T*jgg}@xUH)?_)_@v)+0`32i(|L1 z`+R|Y`4@D%tJ1i9zkN&v6J>yKzjNfJ0|(y@(&e~}%%P(LKf4SP>vZSGY-y1N!Q+qt zVAy4)vjbj?@tFn^uTRR#P>}dcMO1jXK+OGsgmR>}L$LE#g|CxW>wG^QYN1d)d$54%-SMVw~%LXi5G3$XYo#wKvEtRQAh-oi|M2`dy6|+XC|0C z*p@{^2ld?8_jDX#N31;8V;;Tveg(?n?Y?F^5Ef_Y9v^#T_LMvT*bIOQeWlKbGQVm4 z&P}?>+%yFv@W2)FlsSE?c=rzO-n;3aj?V@6yR)WVf#F_~us`wb3$>riWbGf$7)^R4 zh5_My2f6%Ck&adhpI=i*iZI&-Ompshry=a#CpsOPd-`+&39mlK46x;9Bku-iX!qIz z%T)D-uamUYJG=%4{#@76eIFK%S9+Inc(cr3=a+-(1~X!&Dx}DzT9{=~u*9g^yj;8W z^tT*ov8wwmPfsgDxTVs&gZq_Lbdj|&ymx<7NmaAZZeY|~4ZWE)85rI!Fz=|25Hr2k z7GH_YCq@Yj2RQd$jqM5c8n)*CmA=>aM~oM9TI@*jsKF};YXKq;Yu_Gva7Pg{MkJ|^ z;M`dVo!B$ZK)IBKD_B)V3sUcpC@Zutc$I-}L^0xi$K0H+j3@NN!x7#4U(@Iq@udN5 z;CedEo`4Tr;U!RU?d741;Yi7ETMY`yi;8!#bXpW`Ri|HwHT+@g6fdmeB?eOI){cuW zt0=9rzq4>*4nET5mlojU`+!*WREbCj%CUX#al6ym0f0QZ4?090v12|Q_#E0(9!SKN zc@9x5XS8^@zW8v;qRz!QEzr8cCsKT6bt~>pk=YpEyJIdZx?ZSd zR0z251yTqnm^T}VJ9BXIE^7|(GlR15&7nt_!4>40Ygr*_BfT8MGrL|#3{|*~SJ;I9 z5=mooM@0u0v014S7?-b`Je*iqO+N2!!AKHnDB{aUVIM~6u`5>ounzamQ&1|9UEoLI z1yGRhUm!(IPk4N3rtTo|8b}s1Dqu%+yHF!D?o0dSny!wd{n`%Eq%^CE+V#cxG z+aX~()O61Xm3e>ItFJ_?U0Zf~61^lGBm4N(1VNo1cz?r9ELk z9b`K}=7Xoau1<(hgJEARrc${khVHKCg+MZ1=G=&8#_KIClqN#F11y#Ln$EWDKW-PC z{>t`UYuiwz@Z$1)mL=bpy3|nM>dpRU6j~}$)=oLCqX7ok zS{9Uybze;a?XO&#j176mfqn65ribHs-$C2Zg#c=*0Gm{$A}dg-0O-zNg4VZh5Tw51 zHiF^&O~uQM9HZ}!GMU546!?imB@6$A+#cqNYy zEs=K%NgnBXGK^h$f4DRkrv{*W)u6}iU&P>&d#f?^Eb=)PKaa+Wj*bt#CBII%QcxcI z{`j!^(R^<#XHgTg*+qAZz-`En*mv=5Zh(T2xYdh|C)V)>tk9baIPQVBF=IzNB)0h2 zh*=+VLgUQC9}TB;7on#uckmi{0hZws%d+%?4ji?Bauy&OvKpKEE!+RC*B&5c>R0d< zQyUTV^GQf3&89QvtcU6HMr^Z*&N96L?cv1IQ zTV`=9-$X$w*jv6tX&7m5aP9J^GKK8%sSlsaxItp_{X^ILmW>m1#vguj%2;Kze*l@> zF|dUcj%^cbOrQM=tV)=0&`)#(6Pm~|56tB*D(w*!ET!A>Q}%UOWV_Jc%frRH7)!+< zz^+1&b1PA?196Vk`>~5}XTfnZ!(49!Sj*wtgsjqjZaqk^$EO5=CZSisnjAu# z+j+rKeWTw3n#Xv>h z5)W%kAS{UjH?n*))!u&H!n%kEG4#dQthN67{pggq10K7TNw5yf$uj+BJn{CndkI$2 zxpS%J!4#PQs<{GC&s3H z(OU|~z%EKQO<5-?g(;cr#9gK4D@f+^^E3&Ro_|>gkoN{(*XB6x1N&$%?Tp3q@fdWd z-TP&_j>Zj!%MBs{-nEckb+~y=m{Eb66O!~u6>z<*I_0ekTg%p=;_OhT2P1V6xtX17 zo3ObZBm z-b8HB^Cr6h6GWe94^R>yUflH7;T47C1zT*V0>8A*J&*;sfYFH13nEOk4(^YYgGd*<__3 z?L}#1+eMvd!1BIxAHG1qk0*z6J$4<*X_^BQZn%Fv2u+f4V6^^M?=+*#) zor*2w;XorobD!h!J0QGCd&K1U^W)2?JkCS=2}pM>?Qmu7eNxp>r3i71ZuKJN7W%qG zWwh5Vp&q=nAV!1|x+~BcwhJu05J^Pfs*lslXmc_Q*Zhf-Ja+J#fL*yR{Ojq{jCsR7 z5RjA@|JcqyIQv5?^h`CzcG+dbCTnfXgD6ve6jJBxdjq#_`@>)0SPlgr{#E%iASIt; zoH62-kyppWlP5F!qOX_R2w-uzsjWDEN_i;^ z!RiTWx$h(qgrz@anb175F_cVIJwD7alAPr^s+TdxTh!`i0Qe&8b(@y1x4@`pAV|TwY3U)1A-Qwt&UT|RV=@6+UB`f-H>F_p2}v? zdnu9Yswyq)b?cT|`bFNd;?x;%TH6?IzV(uJDgLMntJk7?QtX#}QjGP7>IF)cVctZQ7VB+~@^#9F zoaKE#Wfz6{ijmK~A#2nnw6wIO`(n%yFJ-4$ZF?xdU*tIQX&Jx1Sm-s-BdgDsft{RH z4ArzXmk`U=Phw@QmPRR&ln)RrRhRyI$ryReANLg;EDM|PQLH(11jBkWfJjexS0RGOOlVZ-vS0@XlSD>BojCrMhR=dXUn zv|QJ0{m3-8psc>scFbt5NYyBKT^ibFORhQgdhOC=)b{Bqov&GKaA~ZlOg!_~X8p^- zLW}&~2TG%pYu*K~n_rmx;!!y>TD~Z~@-)((f8!yD(90L_&D9H*HLlP#{F0^on|FMC z819o)*y!W36vP&}=L^dH)DT(W`SRPiV>M9v67%Z$cdxLa#i2X2XUR}~{ndc4htn+C zEJ!zyO$tG#L_&7}K{fuZg56O*kjc$!`bW**P6$=7r$x#VDF*(n+UAZxPn2ok9nU|x z7ySD(rug+nY9xC$%UTMih@+uNpsD$A`}`}+lCm?~Qk2Og3hTF)%9q=xFgW2Df@&?r z7qv0?&rn#_`!Tjfoklx()%m`^zpMqQ6uO=PD7K5XP!zbcE>0ChDd`1z!6pBJTK_riSGQI@Sf4L7nL zzhWSyodImn99^xG>YV7_kc?^OZ{_>SciVe`-CFxt$q$2%)q-H;db1B(Xx9k}vYy0U z$AYpbr9T&(JD~`uW3N}i$<8_6=iy+)g|b$EVN`wX=JGWdnhg%mKe|CO{jBF)MUpll zRaIp3%z02FDpODqtsI4ms=Z~RC0=nGUSsl$s=2`Ou^0Y=)hBX$j4l3WhZ{qwl9sS6 z>YG6}o57AHE*NqQANQqH3$(L8AjidB`f1vW$S{`v&&WuQYHtwsWJF)LK|RJpjR*Xf!YnS|7E1fWUb_lCHH zI`!ARuJw#7G#{5ZS!YyA?_pmwK;1hs^!&exGgz$%e(@kful?kr>4zE`DZ1V<1iYYy*Dd;@H$_h(KFi#L%+5tWHZLrEBSR zWGHXK^(z!p8-25&r3`(uv z^F-1t-fdY|17+we+2}y_bNKk-!oDX=?Bz{uXp=PI!spJ0^D07;Rw}|i!zCiel~U_*Ji*+{J(_^tW6sT&!Wba+yp+}o}vW*9iRaB z)8ekQ&QcI8i6AoE&?7RC-xV@gAc|V`MqhhFpn@1CXH$-%x2S>k@AS7)aCf`0*ioqd z4yAPI4!d-Vr{GA*S<|={3VkF>A+6gv=Mo4qAb9G)di}`6Ftty}a0O&FIq92KQqGeB z@|Kf)d|r(gSH%sK9Aq=ig2w92n2Zj{W;F;t;#H={3ipVGF*E}1dqtC|>8(w4ixywE z6u=IqV|?qJf4}oK?DO?)Hj?N~XlY)MFm|DcL7VZlTW|S#4>}qd7w%!s=!M&wE&be5 z3Jy!4aamHN#(fw1aVLxMN9A}<^rvOh$Wn>pcPAAV57g)VBX)kI7atza^lt$WaR;Ly zQ_jyEV(L=pUx1wJ%SeYJdAuwKR5RBaM}vzjKWj zHW(@t<}b_N{zMzagUAM7PljApICUB;b4g$JV<0rOeJe-JP)l9sG+vft?pxhurT$_1 zSG#*7IRz1zVc+;`Lli&m_Gv4*|3_VsMl)(`5XoCelVm7Lo3*bb#K^f8oFZoO?B2ad z%2fu(NH{c_=9BoA-R&y&Guc@H%&2TTUq1qqX^1#;^^cqBp1=B@`3>Yv3ibY~%`!PA zvjK4aoyyT`?YK76QZKtWRDaBy$rh|z&`){(-8$}zvP-;C(_1D6l&XS=+w>Rr+=?Te zH*sO0&kbMPX|mr~vbFi`Is{(JyzgY=|G`#}!xS^MvfD`|3De~hXTO)raKG{#?je!> zyK=)jbuTp}QX(Q|iun+jkhR>7D+4wEP%oGj{g}Xg<4D^y|(x{{v^1KLTrzGfV!@d$4k?>Wp=DN0@!lKPyK{$maLLvqP9J^5dJ$M zdizgpAzl}Y0?gdpO|7cppy{50KjT=6!!?&j`X`r#E@> z;_c!;$_RX^mF%0z2oBfUEs1sHu(<0;WneoAPlj`DB*PU;ky)~nfXZ(WrDX6qCL{yh zes^d9FI$qciCWP3(dv=MVmXApKrkXmGHb}j8TnA+802ybj`;H|$4+=x&H?-@U!%D+ zmG@QiI3VY?!UxJL3+M{Tk*M1b+X}=G^9o+{N&xHdYc|iV(6RLyN$giNoai*I&*ZYa zE?`o3?q7c_|8Z6s6@QgD@7~_`_wm7Y;9}H^N7;4n2%k>^*CiXMUnbw$|5Q|J3(P@C zx>I5po2%Mqm5h58i64(#w1JP=&wtga8$kQVSZdm3D<}UR%(zM`u7rlGfri4UM?6cu zhDG;=aFjYN}9zKI%dk9w(K zmAlDQvaHNlC7ppQcds{MmHrmiK1Pv=SFKNz|LCet*`xSegxPMTeWUI9H>6>4REt13 z^2D2e<`XafXv2ld==KPdp(#t0*d)h1+Ut9bq*T({^H#cQrVTPM|BLF2|8n9V@0zqT zxx$%bxd^&O-mvWIqWvjGQ`F4gpTg{Wh&cA`&5Lu@UzVlq#^LNSFnR{f`U@}vxFzPr zMY%ZM7QJb9^mwI&8al=8&(9wT)e67#)_Jov7P+(7)M9~MCqaVb^(yt~0e$FV2N>NU?Oc6Uy7vzIaeWrSNLkzV&Tf3B&hy9qh2|#l|t1ubsTs7=WR` z|KiZ0)Jj|Ro_p=7MmWy%$2jIdMmb7c3OJC2rN%&3nA;)IzO-ACBxoJv|;rSLvU z`_&A``#;X<+i%zCtkj^jIcJ?#c9d$)H9KP1bbv!D<~N3`YCIyGF*_68nW!{QYzt_V z3A1mJ+$Wa?HRm=yL3r)u)HMd+PS_f<7?Q9}2|F%HxjwBN76<5A!^DG=r~KNcme zA5Z=gtM7-yO0ipCxp7*1K6j8xqCUxuPB)Jl$h*cje_e2&bPy#(27gF67RR{IeKh5R zp_YU7dNss9<6+EP8AHl$%#pG;(i@-wOGZ3$Us_ovUia_3GyfG7`DU|0E)Y~H8FX0y z=P_-i$J2xPbVicO5zc+NWp0V!*sYB+qOMn;E#C<`c0R6RA6pqWajPo3G(yigA$r}D zRTQr=N^5iGG7GFZ!no6r0;{iFjH8o^0K5FFl*Txf@sE4z)E1~OE~s1}W33G(opcSw zjA>X4dX`N5{8X7(g+Dt&D?r5)ncxhHMAn`UkbpTh&(AjL9xpg)~(O(LK za+X0<9yo)BSw1p&o%Io_>zWcM%wq-G`^*NWZ_Xq!2^8ZQ>5nXTZ!zKH-iP?!pM$3j zUYv_4cg&pxU)uJ{MAPnR=&ayc`%pk89Bs_@946V8G<=nyKuxo!X>ZRK(-Mg`IF0OG zI1{0M-JL2ZEhybesDOylp@g8cGz>F@bcu*GLr5sy z4Ff2s#88p~Lk`Wr5X0oh?|Gl+eV=drG3Q+K$GOhgXYGCNwf0)~{pj8@=&PCfaf{wj z2n>|nRZmbF>AChc_p!`_8<{gdCurK~?v_nOE4Sk>@GmVBEbxED z*CVG;buWF!A&wU4a2$Q23MWRJkq>BL^5!o2?Y7 z5a0UXhE{GJ=|aWt#!}&1M7>=XgJo3Y-$Ep>xvI{EYNaci1s4^3`|#br0xy>W_~Z6j zW$xc-+RaU`CE2yTH1Tu$^p41hfA;;+o|(K?^tdf3&jyApBIiIgIv^nyXN13{3p8$q zv!ofjhdO;0I(LRWD=5deU&`-)ra?56pO~MZPlnaS(2SbU#}bRd94M6{*K0iRvmPgF zqGYwI%!#&Cy_}?t6w%TTdm`<0DID}e{s7=9jl?B&{H+65W@SZNrsaR@o{n8A6MR;* zE0)Xrt!##?vikx>X>Jp<6Y~lHZ#g9l{vP(Ep-Z}mV-J@q>sSTl)`8|_cHwHxjFO0k z+MiI4vlX8JIXWlX_Zbr*#M&z1;jtzAO{wN6%9Ve8|Nn_fp(GHQYnZGBV28=PAkq-( zB|%8}5(zpIYbe|!5@F^n~6+te(Kd_SF5?6+Do#3%e@0mdOt1- zU-cSo%OTFajuZ<@`{VZm6**85zec^osLEQwUo(oyL!~|B(p*#TY5@2+wq|uKY=5J$ z_VEJ=l6`HqT6QFS`qld(5rSdVTYKZ*vkc2;Nx*5Mb!m}MI4!3e#Shee8;1LL`0OKI zbG6qyi?1xZz27&HE#Fzxwy_9PON{J0nG&__ZGRGCvUHclS0yVD2$!DS|7}QwO@TY- z{!Nb9xS(xjsNx9ycC%xGElLYQrOuYSwEsKic9CiJvrg`j(KAuotI?KH5@|DLMwIc- z)L+2upeIi(#@3Dn$G~<-RZHFYJ#3XM8tZM#i3VIbFDJM% zF=iv5K!zuKI+q|HSEyhk0HNxrCEpR7LSV4=K;)B@E!p17R)D1$lcLRP9rN8AbwV&3 zSeKn^u>14qK*fni95B+ryR)^oHtMWx&DY>p$#=tmrjm%XJUh0vIZeOaB`6?#SS=DO z24Gx|c>H*iZOn3fOhJ5O=GbBMM;#cusJ;lVwXes!n1dvwbzPQ~d9G^P^_oo znIxgve)rUSb_xdnZw#mIPNXTu05NeT?hWAs_}B`-Xm^P;Hc7E!ln7T|QUD~(gh=Br zT%JfXi5PV=mT0wsymwDW@OQlB0A)KDDw#IiJde|Gr>|CaMPBAvk!Pw882q9R;LXJu z`u|yckz{6O!h72z~)9AVNk5w+Iu9t9ux9^vZU%E74 z0Vf0n*nk!-|I_KUoX`jq&*CO3JS_7vM;!Se>7$8sA!-9(^_9KIa5 zShCp~SK;@9UPme-eM(Tkv!ie(!`+10!r z8Cskqwmmbk8Ar$IUDV>b^aGwP_P0g1{#gw)=HYWq7W2hOq#LYP1aFEC^4q z{cDj;U_0L6xzIG4&;Yej08q=UlHYRA9lD3Og~tuB7tbs=MMb~Qy05T0!RH+_UriCr?Hm~G6udgqgNd?y4?wiAqT*e0 zsQ~YaI@r*OZ_ZRj6Y^8_&g#JE%cRi2+d?N*kmY<$g7ZfYK{IZZT2AkB+^jPe#77xAi2n=vZD<%np%wTqmrpCQ{fsb|{r~s3* z$Iq>gmtuEk9hx~pS}i`@b~}Cyxu6P_tLeJm{Z&6LGrqqeA>9~wSd0ul zDdEhu=C7r_1)v8Uz59hv8cX&#l9sO&nbF@*0qzFr)~2|~a^1Y(s(L1E<`U-SiUL+C zs+Jy>7Wf9H-9~-IOS^;!7pxN4?xw^oggGI3bH-I9Qro4+g2zb<#PTWAH9B0MM@v-5 zQDsetB`~=*_scFq-Q4BAQ%E@OuK8i>UE@#+roTS@SrOr)#wI6^e;rIq7Onqt=BjNs z4c78j-#-7?zfIG|c(e;Y*$9%^5tvY^TtEA+Oh4}>bJO(dK0Q+zlTrM!d14^4%Un*c z_Z8ccm7?Y)|3?+w`s#~fahm6n0@z*U%!K%8-caOV`r4>3#h)3{4`jZKp zk8*SVUcCEcR&V0FXDfFi^LYcRXmG@&7Sn#fkM(n>($>LxeXiG9T6et0l6V^8UR>A`|Q5_gW*D}0JYR>b1c^0NTP5+Txro@w0a!L0yp z#riWk&M}z_nP?^}c-e#Daq93{mhd6WgqZ!Q6uN3kBNndPSobq+gXP~goda22(}Q{E zP>=y1Jf;3;{#{Q+#5(zRfj6B^X-M$y9Y%N8h(x54 ziEhNDE4AUAYS)p+oXtjh-!EEp!(-S_Q>25%NM?c<fXop$LY5q~sel8k`W%^e0@TsLO z-HVjKS^GYzIA|eL2@k50QxCzQd^j=nl(NshQAchU4xQtH{emf7w2&HCv&^~l%wCd! z{j~gyxc?loi>$8k#lbg%gac@lT{&kVoNbYlvuvcxhlqMOcNgEYtSgS4lxRm9J!jW;G5mj_u=HgzOAb} z=2q(n%n!S-HbxWZ9T<2??dr<+5&BXJ0I03v_FCeB;c@rfjt@#(Bay?~YgxCE6D#r% zf2_^+QfW$#oSKl*8~F8zax$8LQ9wkr>yR*XdfaU9@T?X={`wQ4P$NL8WA$ zUAcrLMS1-nW@)<$MxBpwcsrkuFjpytT0OAy$JklEl8W(>cmtm$oj6Z3E~oQuXx|?b z4Hcil$Di%yNQm4CqZWFlH65o%TQVX$kba@u*~zyJmWiqVy@YyoA@E(C>C4(6L$>E} z@q{w^r8~pN5Vc}B=!^4+?DVg16$S4njs{QG^`}Qejg47RYz^~xArF)DhdP<{Y0V=T z!GX8#at+K;s)4fvRHv=XoA<*$YNbqn{Ijq@eN`9kfg%mm9Q4waYrNm704w9-6XR}} znej%ETL;Ny{j*)$pVCPl9~RW_7>iC0hdYXvdNH?X_KO?`RDJzR6UOb!k~5ZZ2F%3DJ|^?lhubV*T6vvFwP2ib zHq=4>gTHO=$BWCvkh9`D8(&3v4B<*h*Js@{LFhih3FZ;kk%R#J<_vXTU1cZLp1SCd z=vP{HrJ!Bc!|4&a9D1zsJF&ftmtG*nZvC^4FQYVml^WjD1aHW$S$!QW+ea|(L~!`# zzYE~YRU`WfUP@R{g2fP4Jh+!kC@L2cuoeqyIvT=gVF;6aKU_wa+MTm#AH^gA~olhKsY0=#9!- z1$!um*$VB#H+kq@K4|ByRJ-{LZ4HZh)suFzr9F+Htvls^(P3`@VojOnhcA_Ii9Xoe zs;(KZei!m0?UqaTMGN&fuwm3atk(5puBXStL*|2l26cd)=#i6C4xJbK(N>{Fjt=+& z^ks$b1EXU|-%8~0_$w~X(Y_5+sr*IOEsR~2{Mt|kvCL^SqWzYjV+Rik@LhvZqif*2 z_SJpRsPy#QWS@+tJ*g;{Cs^gCWBwdrGv9*!;8IMaunF8M|4U=5w|DW!;;;gKj~ei4 z&|&r7NruT&)l%HXfd_ct?_u0jECUzwD4_|%DLm;X@Y6Pps8(=Xv-)RkVSb$JeFJ2f z2@v;9n)X%uO3G=Vc(R$9grJPPj|&$GeX{JgLmy_tc*UWgGJ0UYO?JV_3W0}xAzvl} zaSS^Ce)p;$FaNBtKIS?JHeX#L;iX5}&eC5@B1s)M*;Oe2E`7;?`As56w{V%;64A+E{u;CVAK1D5aX0!&QQ z56U?W0d0(nylEcUEK&tf(CGHmPfA8NSAmPZ(>Ju=x$n1Ukrp{yCnv?jJrc)+xi`@A zm>9t|)6@(Hz0Fy6zNfr~&|gli6fWyv@717O{b3w3tgu6&9x4eA&*{_Af-nPsg zd4?v<=S=~;qPA_T>z!NSKhQja`>iVp_>t1O^^-$v>L{+BlK|K1+J>sT(Q3@8-b~y# zNeDnc77J(m%&SExBe781a-12FQU#~r|gZE2gne zuySh0UK0TK_AtyITa|5Lzxon3F4=pf#5}OReLfCr(DX;wemcF0nD67bOBeua=9qN8 zi`z5v$HUKWuMAr%(_Q)6{-=VnlLgg9stpruzAji!B-7AgK}CuoR%Z=hGF0@D(4S$2 z5dBm8YfR6|gsPL_6Nvn7P$_n->4x>hqLyYrWg8w0yWq; z9Ns4;-l_chRXBam{O4nWtF$;sXlf6MOos29ZLy|}5wD6FNHFm)TH zxO2z-rLPOQ|f_sUw%0jb5}fgLM$oED||N~?QX&cVE!5O0lL|2ki4u15j#nT zG*V`IV=#EXg8Et7)X78cz_`j=3gfz$erWuSjr)CQ^sNO!{}}T6yQ=(}wpICkXK$X0 zy=W>pxrdlzwi{o}AVHcs3ff9L8Tf&U0q{e0J+& zbUSuaoON=!#o*z-p?mx3x!gD`O$`u;J_cd2ZxF27YH=R|rJjo=o$#?lg}d;Oo_|aq zI~y2xouwZY4SSadHwB}A&k}!5 zDY{%d;jUv%$P$}xi1iR!OXtvdBzBJbcrW#hLeq+-vL1HdwUgoI4S)G%C@aaR2E`8C zwOiwVTe$u?AxX4lCj)jfl4zPgfQgon>cLnINHi6$TWN%EAxZ%(D1#LVCKT^`GL6Sz zC>8d`bwdDiwms%G^n(q}u9sWOi|9Wnv9G)db1VR|-s>1z`DG}QRjFYaIE%UZKk>r9j{U-j46ewuH)jv8XSo4PbXJ@RWhyL+V7?wm^~k=Tj3l5A z8WK&tNJyHQHcadhiKf57FRAD-J17_P#cJ!cyuBDp-F2JV{+~XdM*!kAW5{n*ty6Wzfqqk@n71Jw-T@36q9r0N)|~}krXVyP`$_Oe#c#>|DmO+Thzkq zQ#`L!EgEuHo{SPCx|?;55sVbPZ*^(Of?{E*Q_a2AR4I8A2qZ^e`Al0)WI9kTXB1OA zBm?d3pMC!DUq*E&5?mQ|eY-*kr%%^e2$g?f2!bXF$e4%J_vseKCyR@=|p8ah* z`#U%B4NX@p5~gvu`YT*>5n0e*sC+Hc@^mi(tRPQ@71xKDkYP{Bv6*i7f*>ZB$53ii zII*DkI>+0(Iojo;g5OY*J5GmImHfT*EgNaY_}v={D}phv33$iV27-#M3Z8GTLaaE% zpNl8ReY-Hsp>1HxOVK*-SUF7KP7j4`P}hJ3s=w0n3tr&2h3Jyj>Ykw^v;0 zP>fEC~@N&rFnS|cJ>v*lsl4-V;wK{k+o^F}=4 zLbP2ETVS)C1tjeqCDs7KiD)9j4*yGu2BLX!gsb=}&p?Wj;4FP2mM5~Xm%?Fmzk?&Q zc-@~nYxKv+-&=Z$@?|!$oY{%eAI3(`DB)73^3qXJ&nF_yOP)NffBM_{$%UeN7;-zG zdr?5|Hv8hWR>f54c*yE;2(*S8s;n>ak0nMBfz(L>6sQb(L`H=&1p2WtnhNol8^+4~ zUp7fchj@Jbe^XiY8+yb|3RD9#EKipXF((TV``2au{Zmp&jVSv-0!SbR9+0DsjUPrF z^RAfOg*c25fzV?t5)BQ`V!h&H30I!l3Jrd**;_L+i?w`gx($6D`2&wvQpe2wM!l1A zE_m;{2XQ}%T8fJQk2z{U98|v&t!jQ}REK17!Su}|`ef;d@!yz8u~8pLvFjbdT{oza ziSS2;6Mg#}ZqrXVdQv{+Re!c~PEkCXJN-Nh{Cs@Y&_cIY!Nzmm#kD>p@?CjdwnBoT zJd}7u5sgLISeQqnQ^kBj)excTsEVf0gS)$V4e$yFpR!)=!-9g~gPj3V48MYXS485W z6~SS!kruwUc(VD6Rf(^_&AT%)1EYD*78vk``qAUZrq4<=&X05FrZpP4=Kcnt6crY` zoYg4>R{Em%T_sGN>pjY=;bsy~!>wetLGeF_e^Gh`s|j@PRq2{?p=G>*40UrU{r%c> z^z>h$+HI6Lqqq`B%)%y0t&lKOq4WoJXUN+om}77+bSq~6N_3{+ib3$f@Ae?U$V&H^ z;7zUWQrZ!o{e~}Sp(nehKE};m%!=!g9d*PKj#rBxZ0OfcU%HrxPKks|z6cW9)EMgt z2u9Be!^z%{(E6E>PDR;W_Vvh~&zb-=eF*>Y0#hGipmzNAfZt~P#{ts$VHKkjLr1@v zT~E2=xB4#r6?1*KUL4haMsmXXW7~tBI69$w#%clnMZK@Z&Ro`iaM%Wg{sGikgrj$B zR9{;Tb`$QP)e9pI<5Xl|r41uhp&+`e896sXdtfQZXhh>L;J)KTFKZvW4l^W@!g z8Yf(wxH$LCu$N5>^@=L1J4LAlyfXSN8>N()BLmE^%M|MNxE7~Lm%7A6&&o8DKIQ&k z03LqT5@r{yf3@0CTZt)a>jzAigCITKP` z^a}ns*F?UxI{5r<XA}Ao?zhBFM?0%+7sI;R*-A z=|A|lZK$e-nX;Y=RVjo|S^<%CG%wH7oI9Ti%Xwb^5@XzNgn7s=><*2cR)3^o~lz zp_bm#PqaQhtUa!KTy&W=$5Wn^*h0go*NymwaA!J%r%?dtgQHM<^fLAXlm6txo(^kG zMjiFmHRAIpq_r9cac^am-#*5PpQ!F%6`4;@<9_ zg*M=I***y#clsUPH0&MSFLIw&WPq zty+DtntNf!%8;LRwwfACgnU_YJsFCH z6uU!*FcX!7D1IiJ#H7-ESL8o0;8cQe4w9HBU3V!UfPKCZVDG}6JQ5CFx=}NeCD$Mt z$+Ie#SZmHV8<9*y-b}ye`et-awN+C$pY+yEr`cI+8i}8NHLZx*78oY)o3oKo^QV1R zI2G!X>0MMi&`z1DO|jh?TB)(@InNBsT#|VXQH+25(5aB;4=KPZjW|4eU_N`5!>rfn zaI)1%w@HI}r9o=~y_4z^?DyDPL6RT=2nVHm#CVaPL=G`)F~h@F zwIN>x1|C!Y?BkY&SVV^H(GrLp7?aJm<$_v87WMMhDLHHXbWp{_!71i*?V|(}8 zo^RK|O3PO%r+juGLOHxA&N&ggz?@e_*biq`1gre*dkvl{q#p9oE`HVmzGfr4g1Xo{ zs20bk(Ev9yf2(7YwmNx}$*?@~QOG(i2*K(BY?|xyin|wp z${Ld#&vF+5-FkR29QmJ(S^g&D5qCH*(U( zcG5NSt}(r!M{RSV%0^>=lb&A5t7d4ndVv=Xe#|&9<&!uR^7rizc&6$}*1%@YkNKhw zx4kb1l7oD#w5x++0mBnTqeugzn=3Mw91SVS17q`@VTu}eq<)0u(R{jS{CY6BH={5A zvb#jXL=J_VNW)i43{#w_JPqr%t2tbV#V8n%v|WYIRvtCcV5JsUSx*TJfY<7^^Rt6* z)sw$9KI>+E$QBa1cFRLTVsLn=ZKFrTnlcJ-@39r{cGKl63wcm5AG_%S8=q2?8T|`D z&&F@H3kzA9KV8FlJ;Q>1HFjXfqhETG&kep+J$Uy`yy-Cyup+;h+{!;zAyJd0%3H`L z`a@1`XQ(&lf@Ft#3^x;6KtYDce|6<@=wdd~yRp?BT-Pd1?rG9$VL4$=l1R?^DS4?0@R%d(n!)9#fB)0AbcSMupGNuL7--eK|m}SmJ>3>u}cOpr3sJa z<0aj|ew`fXLKV)F62?{R z!1kf|q9u`U9Z*b|h@@mgk*mi?bXokX%$E~Mh0~M+@uK>2<@Uz&T47FNxfJRY7#lIo z_kK zTa8yjI6~4|7}gt(Q*>uz-#?;6p~DL_r^&x)kX`liba8>03Cq(rgvJZbL_tea!}SD~ zQTC??6;yAN@Vh_0$!`r^x~uMB$V^msR!#RAqn0l!FRbbD)j0RTS-6A4McmJguZQJ< z&umvk)8*;`Eaok(f1t|p2{HS>jJaKT-SS6*BF@8f7E78}#YC`$>>zDF`3n>98#>=q zNJU_&Q8Co4%^jI1n|yD7Gj9F9@#^M2OCzwZ1sL<*5-xHfcC6nA|DHp65l(u4PaXw6 zco!Q$#m?6K$pd5*JV|TiX2&`I$6$#fphpO1i8F zyfwe6G|Toa3$&LgP6_ zV15mNl_w+`Wy20mt}ksYBJ^kKmWw#|e%wRk$o!_lRy(t7XX4$SOkVeL$E`D4StKp> z-)6ZTvV1kXb=X+v>u1ZZ8Ylgp#v#XAGdzGBy?A*B2*rxbHn#Pbx?mW&$pNb`Ir$hU z7Y{6a#;wOh>qI~LRrA`4)6v;$Q9u4sAtilpj6e_I6K?693o$!9Zk%#pKbAR?lu>15 zK7`-6qQ|EbH_vNAa6Y(L9O@Cx=3u@wpw~SWT=0@*P%ln$!~<7NK)(1Wx}R< zK+$BY4aCh$(j{e3DarJw?`FTY9P+~+X^*ap!|+WZu%7kJiq%y z7N&FgLtd$*I=tqbE%!hXF&NCm7{xC>x!|d+T4~peNSRPkc(V_g^S(bKJ(1IDME1+X z3I0g5*9I6pYw}}kB>a2YqSp&aK7Fs^g-VPcOvh=_fYW^Dh108t^p;4X!d$vr zF+zu^P60ghk;g^4q7JDMaz74b8bIHD2tQ5}-R-28QLv*wah<0+0x?8D3FJ_!kF^UB z>7{)Xw$-wJbsp4>Q`fey zAl0mo;@}mRCz&Sq5Gm zPl7zmka+u?@Lc?C^sqZNH$~-P0=9SF#+iW}*ly}wYwdlG zV0a-}xYHcVZYMT__qLkl{eHN6BG9~&^ZbC+t<8fvXIPn~yTya5;k0**oW=3DaM-=% za!M!sYPpD))yav=%m?$rf#R=Ehwa&uNR2d%t(z27&iynA8Tdl;^3pafq|Loi2bG^E7<`it)nAv!@1y<<#n8C&HEv%x;Jj}}jV@QhvNT1BR zZZ@ry?#H~@sfZn?EuC6juxHuZZ%o2sCsev`oxae|{B@P%y8lOR0-c&axF{}z#k%g0 z^r-ThF43xc1~1QCGZf3-iwa~CO8VC>E>_`D=FL$?F$*ZtDjp)IMFw zwS&SXcQ})gfilbwM8U#KI^*(QGMUh`h>onoBX^GuQTe%L`v> zbdgy@)kJfD*DeQKI2U?U0Fg`ALMmV#FxC)r^W|BEdoE_0DYDL1x@d&UU*L{_GUJa< zB-8YjJbFti(xDmmru&Pm>r_%q8_pT*dph_b0G57MK4(%s@&BWX98Y2pQj!*Ro95Rw z@F2n089~ID)pFU;2b0ZLOXd+L;@FzWKM+@%MNMVoj`z0fBEfR(39(7abw1b*hySBc zJ1_2Cs&JZp(3IV3XSG2@jnWV#AvWRypLI@zTnL%dhO(DUSMOPl+06J`w6A|^E8*fXj*tpx*0w1 zB|S0lYjlSB+}PzKgB0JqxH+}DLg8;+k7Qu(Rv<@tenFQpzA&7e3%%A_*^;oXGD6?M<84ts;db@aiCC{aN=n}^uQ^X& zJB?WzPLwY$|9X93O!r|KK#=Ob847PqTCv*n9Nt$U2Gd4%EU~5p&iyogEHU1(OG#bT z#+xqGnXE;!JDk4vU7tS^`p~#jp`JirFaCa9`GCD1PwCwD?1NN9QY(P&Br44{K%y)t z?am;P3|I@9qyq!y9ujrcm0R|`69OzLsyk;bJy{+8&i8o;_q7_+X267!f38%HG>%eI z52C^X?1Y}Tg=r6kpVOqrI}qng6aN1#d@Q$N{|bdP=cuqhg5SO-UVVC5I5zAH7Ei7v zd6W`jF|7#?1)2rN=xT`i$**`1ty zAx7*FY#M=F%4G<^4=R0nrSla0@L~_mdMvME;XmuT;%fgiho}%}KbE-G(W;1UIBbiq zi@vw~01aY2&MtvO$(;w4_!by0q4Z%H5n#vlps0>=!}?L?_=sXtqUa}-ud)+|oZfDfbELD46yg-87=s+uJGdSDv`nYuIKa)5g`(2yR`+xO_qeyB_NUbq?g0 zUp!PHo?VJ-9%2;q#yOMq{&$$nlJF0PlpzNc1QUi#Bw!g-8h&KJ$8KaArk`lG#a;>Q z2i>hdRjB6{K_EXTp_#r+5Qaw=NJShp;x%+y7dVrHnq~hq!=tXW!qbh_Xd%7Gpzd4u zdZw)k*gsxeIIvC^SzoPF1?hJB6F%KJ-FrCtq~>!-Q5!K}%Wb zjj32vahgF^2Uy=9*nZ5Mm%8$`g3DpqX-ZB&4ykN*Taa(NA>OIpCT(H{N!Q^ zze!FnaD3m_>SZ~MLpj73^|0yMVU+Ye#ex?0h2vXT*?xrWqn?Pg)%Ldegg5(R*L`_n#=R-r4wAa1){`k- zDJ5RJ{7WVWBSwb}^m9eOQ?%4n2(U{7gn z7XJ19oHu_`e)vE;!>9AufDba%-&l{|IbJ2)xlxgby}cr{K1z$VYKHfx+>4Pb>~n7> zoS5I}vlSHM)h5%>%sR2v`3|Yz;EaWx)8VgKT1&pmo^a4nl`fo8GsofNPo>lP0_19-E(gB zI|9_;5N)3Qgpexu!WCBGqQqr(iW?-M-NBCuDlsECPv=Y5ec(5ukRPOMXOxXfmOvE7 zugcPE7M!Sd?Z^!cH02Elg*_T`i3L9fglPXr=acP(Y&d%|w3^rM+-uzGX@TuO!IR6h zxAwH%St|4EXRGX!+mpFN+&5Goc5L1)vm_3BEOG~$lv4mqTd}&WG>sWn>6JOgkr^rK z_alSmVCEz6pNY>rUZePXnzSuS_L;*E$rmOeKeVIZk7^$#-lj!u@|YF@F8~L(E#jDG z_Mi0B1ru7VFCFyA^^%n`DvwcJH??p^Hh1yM<1g%=yoDiwSE=#{D=lYJuRLC2&@2;^ zAy@OuCL1`$vU(#Kbe??{#zCQy?ue7@;^A3Zgy-%jkdK{VISW3~`Q%5MZ1@X*Z^EGy zi&btYvA%QCm#3|}nJPcTiZwFu2WmyuO=1b7aMHO2IJi7pGuB1@9@gVB8)>)!DBPa@ zq0~qJRCWAmQ0ANQ13cGaN;;+IMndM8SiO$vyU53;N>J7kvE@?7v5Yx4N;37E zeCcj)s_1Q5`9yxIaisVyF=sq4c(!$IRw0F+4;gNKwy-PN$)G%%``RL*e2LlaX8Y&9 zWgYNPT_IExuwt~)r?{?-zO1DH`X0>XY$1#kU5>kw2U|qMe0_4tjtf!IQhHa>YsdFV zL4L}#pPbhYbs!b@^A|=c-@dL8G%PSXR`Jj~I`Mj&rFNjLQ<=LHE-xh9Ts2UCRNF9j z5+t*@NWNeIm29*bZIZ%_tnE#JcM^tlG_Pe!8Sp46w3V~xr%8P&wxp#*jcf3Fr_ud}Qb=hCFyqC?rQ0RJgaqPp@ z(_Sr9E~euT8)aa8_Aw923hq4_e3UYCx|S5jm=rnq$toEhJ1*M)h90}NP;a$q+f-Q7 zr})~MeB`mgbG5wTrruZHJMg2^(VD>(j-u6R6LChN%ESIYB#N|+N7a3KV!PHQCZ+`S zvQLF0PQjJ;5T#Hqc=lehu=>_3Dirg!pXcp_-)hDy$JQqAuX}o%&N`g-1A$&!FPdJ5 zpBray_`HKfZ%c_%r*Y@&$J`-QK9l2?McD=Kf5>)%B+R%Ypf@wi99GTGVFn~n_gaWP4Uqcb#q=) zv5^#{(;OM<;Za74I6yy4Cj0h0pQqO;K8U=$$HSQ4PL$$XgWUTM{(;W3Eus(+PtDHq z=ozn)hNpc)B*3`I)quR^j*v8~OSKVSP{@wL!GTyupSUIHKqWYzQe=h|%zp`cAs;v{ zj}ZKrjXi2x8ggdy+vj@wS@%Aw}=$)1gkM?n18WVH%bktzdy=o?`m^E>F!^?7P9X;z5zkLNh8gA50k`QRYgKqrG|)O8*=SZ z*XtF7_5p{i92^N}AL+*z0aKpw(R1k~wRI-zc2NWpma%FtpP`e)4^U6VMnGJHhAyt4 zmVPR@p}TIlp88n-Q6q19*LOpTUQF^HPn{fIqq(?Giczu?l?d3mcpSSo7az z!xWDNg9H!bDlb>Js8>LVA;rpT(e$(TbioY~nkFY^87C^h0;DE@@%0fzUV6zFbfRn{ zcz&IJ`ak(U6oCz)m=GaDf-e<;aXxGdDZH*&=b6h3vLOXuz2>(30-E*aLV~!#j#0I%F@0+CMi+yjrX%<5H2T_&UlgGezoKq9Z042iq!)ba$Bn% z%4j(jg#7P`KVi%0d=8l<_O`%sV2`S%)xd!it&l_}z7xF4ey$Q(=C~|}-Lmw#Tzdk{?MYk3F^5nFMZ=FeKDz5wAD7Ir z#2w{Wg&OO(-DB9h%D;c?3-wB4?xW6MS(jwM7PP-BLN8G(j+_ zNG1^E0O9xp=PQH4 zt79xQVrQr0SG^yb0=?g`HXqd&W4&8RnW^!&Dv-bC+U+WFT3~gJ(#sbQ7w~dRpk@uI zx~$B?F#QRTD=pw^7kNz>kK=hrkDVWe8WYzjub0(Anc=}E3hxMLwT`#LIMc3*tu(;@ zIVuxyp6wq$y~Y8?Qphe)j061}%b7kcS7xQ@@C1`Cf~wsdfM<$9=_kbXBZ#(EUl5+A zLApA607_nzx_o1xg5UzC;~u*e{(!+fl?0b$GKT&3>H6RD71gL>jYqsBy%NKJ5n zp1>x-PqWwmMzh<#Zd{5k?P}tAyZ!QbHKmE=%A67C`_G?T6z-S$wyyM<&Etra(1IN2 z)0LaDQ>(EOMp8RF?Wu*4rq;ZCnyG^e^}d#5se|f?(Rr7=!%vNRH_o5BD}{|J`CJ5B zFvn$QG&3$bGf9rte$$M++4ZjerG-ZG>GVWwIfBHMPoAJe+}dZa5lU*9$&T((v7qd? z+PZ z2lIB}=M);$Rj(u`bzP@|Rw()ijcY)+a8cN*;tFT@s#j`9j7FW*n4Qv zGA*C_#WZfWM9n~r$o;Mh2rJ?Vg2<%icZ}feBI^Xv#^tcEj=}} z02Y&Fhq-%Fwl?6qzb(XU8mC2FVK$6j6Flp3H-jmeOfbdK+aHE&=NY{&1?$q4rI}82 z6=a4~jgZ|F@Lz)gmIBWpml+Y7-X~^V0`13yJ+cF;gO_j=@c?X7HqXHOq^>Pr_Yc=6S_glIFjAf`16Cd_mchFYA zO+uyyh9xG?N!`1f0ihtiB74pJr3>)nPr0g6K;FEwOhUc5-?%1o!Xh8*ylnTUxn!UK z$%Im7lU{ZsuvpOv!`!=HFKHTZ6L!qJiI%hQk6n`5NALsvL4^UyZiKSxvF|VUhNB3f5Z|!RSsAh#$oni=|MflNm9mM0qAg-@{qkjVHMIb zn};jrcA(7E+r~G9a6s{fu{!2`c3a-{okAtP6ghzZp<1Y<@2Ef8- zhIjjPFNd8Tq|J@%1FY4%W+|(VgPCfll_YkVuHp^MPPob|+%`^vc*VMSQKs>9Q;%z* z3ye?2#rNFZyqb%MusXz$-F{G4%C9v0((>x(Dk^vr1^nttN8C=wKaa@547~4(v!ao)@dCyruj?jpqd4oU85LMt<4f0V~`>;a#>#i#F%7cWug(dM!H#;rWgYwpY8 z-6K_gzOQX_ew#%=xy0YxEOA#ylK@*>;5Ecy_GJ4m_t^N2kbL`>Cx~azyT3g1&-`3G zSQ)xI#rD5-2-rO8u^5#csWUX=bJ zn7j>W!ExgRTZwQh|3p?t0onHfj=@y6E)KI!KpEK`-Qk5!696tB8-i7y;krV%uf9P+CoEx1O?oL6GAseB^8u?& z**ld?#(~n8*mbmaNXkhkli)YjLgs`@PS*@`&i^7_odAs+%fSqCf%v(8-G{YUwYy_@Inl1dqvjLHlZ zBb_%@=%~mw2TcdzT}?rsXUGTyZ3 zoN&i5HMiSZ6(2vo0@}DYDb|?aWhat~2EN|j^*%m9c+>r>Ps(+gze^2n_80Puc>hf} zt80{L)xk^{A!dw%pK+h+nGNu|HcW$!wti;Q@}a`=op%3g9)ICyv=MLSf39~qUKXx> zk(&Dg4uofn!9a}x0TV#mQ6Q!&Vr44j+p!P%|F0vwCsetad3q(8!yT-s7cc$u4pgP9 zREvH04w6({8Rbg)%$;U8GMlO%lRTuoc1SU43_owQeZVwd5pG%*rhka|7eMBx3+aoLVBKcR_FO;XSdl z6X4jP5c#y9u~sA8{E=Axm=aIv>9~SS}nd@<0<1CVKeQ|DKj@YJB93Oyy_D~A8v z>EM>#PB;;+#7MC|PNEjhSOnOJlJepC_;>waU0Vn|FV%fjv`xXd6_amx6X)%Ks@Gm8 zgB%ce=Unduc4BEmBc(wWcQ>eTU=Z&FVjE3yt2cv|gIiQMM*YdCiPt8U3Q+=Q(F>8I zoxOgL3KDdPG=D1N^%GcYtPnrc6Ebg-7K0^}lOr2iC<#i54YO{W-G^x48Yf@qs?C!Q{(c8hQ4^p8-3czD`H}|t^(?- z;|s2XlA+ibu!tuXM_@7SiMM=pIwb{1T#z_9aq?jFQX&U6{376$TuYHv^36KlqXAv| z!X-VRnVmQ+A{V#6AMKR#F5H@eZ!3p~S@d4-lYif9Bf+@xq)1~o0!&zf+gV-hk=pGA z?e=i;ST_mcEfGBtpJYn%sBK~3q3b8*(#`M@f^YZVoIDy(4P{&=JzXBo%t1##Bm5p zQ@vo`!e5%-@eZv;Rh1Dx$sG?;*kTu2-Fr*hzMNWuLM;T73z=H`F6wVSY#<&Ta~Z0) zRi|G}Ci4Q)TQ27jp2ol1fnllrD!4VrftFb{LI+D4gq2&*xIkzEqF>^^S}@A)Gqz)pcif^-a?x z`Q)bJW`1DF^LD1Y8u-?W*0RC!p69Z8Kf}J|+A%gGuTQ**LRm1`ov*Ju($5YlX}8cW z*yZmuaF=^>6yAm2tBPAWXCwbPGPf`OIx+(5`WIqwsIs3RyOJ#I55taY(GMd1g2cMh ze2@X?r_9$#{mK+F`;y4~)@@I)hb9+VO3NvpX0kvVo+Z@m zY>mX5scKnM^Qp&(C4KwW2@j=eG9#~wW%?SbnVQmy9M7FNzRynP(fiEKznbq@c?5n` zkeu+OzKgN=$`&Xxr(IE20u&gKEViZoSul^8#E%<*qq2aojRZl%TpCG#aOn{%cbzmB zcDyV*o=GlU_9%-EUtA#f%l~oox34U29ld}6 zJ$xSyi29SGZx^)RVxQ3pv3jNH`#^QzxnofwIajNubqzJJg@KdDssef{VFd z@aD=??1TrqhwFj+h~_2WL?1JCYZl{u33USNzB(!n5V1?)7Td1nBX*~K4`1ErjkY2( zW0UUVd_Sf1FfH$AVKTO+6UrBj5aojZny}u!y8RMiba1T0ZE_SbGU*AMPIn3HBuoBt zp@*AroPR`NcwJPa@HM_!HEErV_~f>yjyL8>BD(Kqo>PuDtI$Ol;<@&w*gT>py~##nx-qYF9;QL}Bdb*2CqM2LY5S53dNGG3#0?PNI%@@lJz z1P)thbuf$wrY`B|sp%5$7aIrOZxR5b`ZZ z9mkRpI`APl#Hda%ZuUh&N2N{}nlR)J>+Q;KPU*^AIm zZ3XM>3Qt#_7iV)n*U9=`Y(J1?nJ}`FsAe_wM1A-QlCc7!X6u7adls_g*rZuD$I0KH zks#>#LMuhVqs2!dqFKml)sVSK{V}twkBg?6(D5qpFf!r|3gR(6ow_&x8A>{!=q z^WKMSK1m_~Mlr)5W}lk{#1=F+$(nAW2A%v2g>(v8MZA$RW2R_9S&>a)X$_1W-u1ih zP>v4SvDF5ZMD3#Yq`J5w9#H8we-aP zljq(XzZm8Rf&pKLLn%cm6uSU)<;PiZWg^oz6aoKPEdT98x8~PN3D*?Rf6Sn50MO!$ z@X3sHPQ(S)kaom{&)DOnV@JX`pWm?fs2|f5F7PD`oolcRT7d?mb!MU2~ zV6>pFn!ev-29b`uRrChpm^Uf>JkKt$`Pi$1SSoi9lG52(=hd1a+P7VrlII?~Jd9V# zWBBbRJaxIeQ7j$L%=Py184DeCGk09Vd+MiwWN8c)dJYDlcJG5joQPci!O1E;y#-bK zEmCWbz^g@w5H`$uxpj9zP0CbhMmxOmXNB*e{(D_P!_;Sg2KJi#?&0Z)`x~%yVd8U1 zaY+$`5z*f&0LEr2-_#nc@MdSt36q?bI7}eEdtv^Yrx??4_ro8dUC+L?@%R&T4SEoJ ze*vai*~DCbb{@#)sKfSvThLp=-ZJ2=8^vEYQIoQi(x}3>9dHyqrkXtiM8n6StH_D@ z(-y6p&atj=nf9k+&Wk`^?)Z_jdfUDdNW9pF(p`x9!Tq6pGqS8>k~f~ML>mtTA3t|b za9Eby0+j=?dR?t0m#hldQ?cMLffVc!fi9K!BOq^E@ahcWT~NuTy1?%&!8hMS&sND23K5%1 zr)5iJ@-i=34+Jh7baPJAc9K9EF=(~6p@JO3tTlNJRuTv6^P3DBv-ev?$%(II_F8}Z zbY3cJVQbH;D^OlJd@=@jvrHf`iJTtrEbeKbdqhF4i{(8YIL=bMNG&rPnhsT zV7=j=NP&YG$s!!z7$@(ZcgrnM(62;tdhAJlb1#glJhFh{VO;Q*1l32QKUq8Z$$iQz z#so*#z!Pw@PZ*e3D#YaEbS!qxF+JHuH@aurQfzDKz^l zzmAZMAPI@)m}}khb@X#Kz%KL5Dv0nFxO{2GbJR*W+s0$sO|f?m{kc-x>*{?&0jZ#r z&m%UcH|_&lI%&4Jt=ew`ztW^6HSn7G0376ENUUg%5J4i_P4>C+6!c#(!KKW@D)01J z1!$Ua0V%!Zw!*X1{(Qb;_3=5f^7i#iKlsw?;^gz96fWtmA8ToRwweNxP1*^oVrl9V zgV+0tDoiO6C=G#Jkv{`D?$XQ2I}Z^vr&S4pO?LTQY!SkIF+X2WOg__yZfVwi@X8X) zC$e^pg-Q&e46EZ4x@>)ztxl5>>D&Ix><8~ z>S*;-x>5mQcKndmNX$Msc{b|wLm-Q&kgu$qMc7ukKI`2brEwW@cU)D9i* zcOONSxGl*%cYGbA7n4`-}U**275w-j{b6Uk33K4VA_YcCX(Xi%h=yHbGu; z?eO|&EN|Hz{C(vV4Zr_;8jqE?-wj!hH$ha- zmM(#hXcDivG}cQrL)JZ4K#F12kr0?gw-5R%6phM$a^LfTK{lpnYXo!S+yHmmc`^QB zxs)M)8ns^AUw1IdvL3+@xwq#6Cs2NL*tztLnoFFEq>|Kl=$H_Ch|9+m`Idr{7*g2a ziT6=cw{$<%=-ETrK&!9&u$iA-m@^|`WdDi1yBFH=#J0X<6xQm|4Z43>X-52~m>)-E zX!<;+Nl}peZkGUwc9J448>`$OLMWX1=#}|+DAhq}-gj3b2Abs{&>~r>4r@h>z#`D? zA>wqzh9ZcE`z0q)D#T!nuo!;q6%^*-^=W5A$~(F3C}!i8jz&TyufZB)dlM*k@5iEI zskVD^ax}gEMyA(Rq1x<^Maj?6FPUwV*B&PotkU7^H!O=rb;&-cii?&)?7Zbd-*PM8 zKW*ZPxy|>6tLZB^BX&Pnj8_FK7!4oit5a8f-Lu$U;Fh!nGq;lP)nADb6ddU&CWTUe zO4h&gaRxjQ1V83F((JPf^swSg6LnKA@kJuqsKo)hX}e0TE)zXf6|^ z@~4xf#zr)zgZ zvv?D|pwE^r{=p>wLeb;Ost^p3quACCIChEBp=fB~N$IqCRp4mMeD?{t(yv7wW@mtj zcS4?qVHEMbw*_U?3O9|ylhB=`U%^TW4-1;S&uI#*PCB*AFDp^=?7DPNIj&kQ?`l)0 zq)okp(RV2_1Nzo%o9dF+*!>~#R<>;Yo2-DpO!NuEy?>r`*2SX0`0}?(zy!qAW_2xv zxC*N45s}|zi@eNBO}dH=)`ca$CMw*#_@j{GI~5Zl+z&o&n4QI|WmC9zq;S+@qc&}b z5&txJ%P#Y3w~#GNo(&(DBTZ(VDL()4AiFlZT^R(uD5*T3Dkb}T@uHrnNp51+hIq!U z`P7y4_P=vQ8ygmDUq59m+#w^R9W^7-3c{A+WEC3ltY9%88WCb_~+7S(_)ds%47w~_fQ5{Ihb-=!MSSd&RHu#2q)5u3zht$n$B-s?X%CG}AX z5tzY$bpJk*$cs^vCAO&~wBP5#;x%XyMf9OGz-++WKkyw%nAQSZ307??f-ZQnx&9$- zf$f=`s+58u*ZJO;J&Zh3!+TC6sI?S+~WvSa5DqJ+)sX(ZV9h`uLHC|th~s22**KNDiJ1t|DUqzE=}QN62!`c#gI~{W)4%^15EM>XUI=;m9t|U|7E2x$oLi226<`#-%)Kq~0j@(FO&weY15uJJ=k${?1fU)~gOad^O0NSuwA}3s00< zTk(>*l$%|x%j^Y^uUkCwMb-4S{sw0*bmIlddxLCtp7uov!M!=^WB@NaxjW^ z%!D5}s+W!1b{kRyCt1_>thC@cIibvb8R7QhSmTiDsE2WIIHA_RQmrkfglZ$vhGxY!qkPjyHByy9kz`I4?uqI zvIO#*2r7sK{F7F14o33D$S?!6<3>?X>0ZG?D50RCP44WjB>t7F{;6=ujENdnks*ls!VN=*OeuO z+DLh1&KD-dxB_b9@UO0zS_}U4QY+-qyCp^F9G0yJyw^NzrJF~5p*(Y>MQB>H^;-mi zbf$vPSLmOl@SC)gnFvd#|11@Mtr&l;6o2`*aGZ62H9H)TBv7dTCm5#&6dn=P4Y22h z6X0T1xozi7l0uXR-dQNK(ctOv0tbUz3XdoY>&X|S~2-7EAiKhyMmxR+1k?it0P&h&ul>eZ$BdxglX`0BTZj=6~{`hNH0g|tze z6LIb|&Hy_k-y!L>Cdy9m)z?1))%qv42H#d^T8nRU_g_Hj{~$@dpCH1o8pM#{8^W-E zE&BgFeeQPpCsLh7KD_uCA&U!=0xAinZu#nc$B&4(Yx^MUqMHX75T_6+krs`hw@vf~ zcq}QG0XsZL6IDwClUb3SJnj=*ms1iUaVY7+KHmEf=L~qh-vyKElKv#uM4;^e^+mKO zVi*y5vjgEXlW{!E{7rs<22jZe#rMNw4$MxNRw;hi-~y9 z{u~fq@Yd?d{`@3)Kl)oN6;fQ01TAKzW0v{Z%sf*nV4BB#9kq>Wg{`o!ojDgVk~CuV z2{7HmcE%*=F5_pB^HbU)S8r!fuTc=0*M5$b+I-}z_cf2B3XG1PPW)lW|G|^gU7%V| zN}_w-9T8qH$m;z@&)o_w{CnRM=R$h^-p)Cb5A}y#Qv?XX=|YcP6JlGn@8s#s={6s8 zuYk()l_!2Mr9LSFFv-Ygf^T3Seu4wEOVZ_9wE*W0ZSw}Dx6+Uur${NiHesi`UdN&X zp0Pt``|=&Hd-65j=Z3TLlJ5h(H80g(Oe$Wj6o+i`WBMCXj&1f&0Df9!-7VI<&58dB*=~>CKj#-txDXwRuyH?%uxG6WyHg*=^nKN7kW1&B%-Gi- zH9;?I-}b+)S5ON858vx>GNjaKUcjeHqrj6)^wTA}Y@+H}y{G#2NOEK@-4%t2V=>%H z5?bvC@1Dy`z3H(HhCWT1E@4q5fxn+#g&X{-6Si}-SUm5XJ7nBqHn3|T#6<8wXOm!g z=G~7kk0+`{)YcC|e1;vg-b#7ZF`=Ko;c*S*sU?)J&ZR|aDNL-L;Vn65Ei4!l+REi@ zgRjR7*7XM$^tF_;yDfT5rj;@|^ELJ!sjL|LQ=l1VpM9glAt>|*kfhAUB{BLKT)fLh zW>N;sZ)S5Bq^;tCw)a1O44b?|uta0244B1(;CiF8ho!0rV9OJ6A_>uLodFt(@7pD| zp&@pT|wPlT{d)qQ}GltGvE!ZExYRd?R0EQo;eF{(tTf15Ffy1 zJIdghG5E@ieltFNQ+zbM{4v3Y0@`>3%MgU@SL_Wm4T1-HL`z8OZ4ROk^20Hu9;#VI zHAZ;<-*c;HGa+U!{nLHq_gM8EV6Bck^*$df6G_;w>U+Q6i>NKzuQuQ|7S2j}+NQ#@ zVf9lu&hl_n?1d&a{LKV!fz1P>oFkV$w}g#~4{Y&c`LGHJ_hU;K(Tc=KIO@e{WVKWH zn$rSP?3UrypL|yKS)?B6<=yZ)bB|EaY1adj>sIgv6%FSH28O)(O#JZEVF$xSp;X96 ziN_8CTzr&Ko^9o^vaNQyd`+B+NG=j|+Gp>gvu$nwbxk+ql9hR>bF~;30G!Yo=UHP< z5^94>ck)nE$48R436-9^AD2i+y(-5Kw~ z=^T`;TRGz5^7LCgJm2~{zW!p?@ksN+(?-+NiJ1yJVs=+pci_O0Ek>%Et^cZNF%+(F zIf3Cz5=-2o`L@=t6`jZ{f_J~q5)>`W+?p+%}OCd!e21~sj z8i2+ff>#eU-goek42{;0%H)WfBP4;I&2A`%0${d{t&q_iL5nCzyG1H~pEk0{79mek2E6KLXf%1W-Ho_`jb+7e$cNgkA;}V&2)YeK%3L+ zMh5AloYpwsI*v?kAyabKXfjM=#RC@@ZbV7NJozJqofJQ9%W4pYJjD zzqr4dcy#+;6vF-5<@$H;9<$=8yG+E(q9sGwS?2F~Za9Dj5T_i2QeF+qQ%{x>+1|Zy zIsk=Xcfq~&)U#<-#PPkK;4d9uS%h56dI{2I>~eDIisG1aG(&TKC#YT#0(?djw)XZt zwK=OZMPtCiFr@FozJXc)IZKI15@~46C?1GLaw3?Zi&a~OxNN~beB7Y+X?3@`lgmLs z9+?FeV+KM+FRu++$-{xG_PQR1(*v6oJlT5*CUc7JBacgn@=)3It9qD zle)Wb>+8JW|)dZ){+OU zFdeGe->O^bE)ES1b-y}ee0pJk@+tZuwYV(be5Xb8!|a~h^TfSKk5K#{{&_FkahjAR z3Tb<1NFwebUNCw8*c8wbbVT+n-IXDZ4R_l0?Uxi;^ks26tN)N6PRS!+{#$O(;r1Om z>@uAz4EBXtN%HEkii^v$@=AAEHtQ2f-(NwnPIdg^bOxak3S*9qSbpk4A{Ay@yK8mZJ7*a1zXMwaaZt zTzZ4s$OH%S6BkhRXxr7z?t2YQ;PuAP0 z_LaA%LgAjmV0Hk?b(OU=ZN7aeAeBJCB<|TY{Pf~(r8MBJ<0m6$Q^{NMr=;z15uCX< z_8gN@e=49Sl{?J&-iyW;=U|JPFQd`!s>e3YoxLwNd;<z;V_rw zH5(1c5;?u9--qevC>V>H zD}peOxMOBHhCVkUdT!G-@8FX-tJt&@SX{?`ekpT0f^Ai=%)HCI<$oNXSj)POXf*4lIritW$Q z1Z(r7+;3Tr-P)58{@oqEtod@GI4`!gtOuIugF667^x$!pPbz{mFnWQRrk0cl8o7iV z+7tEueFyBps)!b#iWw_R}xghKN$z0kCC2MJ<-x47fy6%1!h+JSOzr^#F5Mk zM(Q>kKHe?R_}huvHfop1c&_zx_}cZ&N{7Me%I3y5_SYMrklGylTXmem-~$T6WiRfV zMD5DaSwY@&#GBrD2# zN#Pe^9VJ`wXt$`)DZ1Z|LIe?VA`jZ4U?mf0AVSK{*| zH?Nd$fxhx<^-?-k2EfBG=6uYJm5o=(OeH|{+!1lS(V8dlFW`G-a+wXVn=)9Ni6d6H zV)KxT4@#8{QwqMN)AWT&HAK*`q)weZIhs&${Tjp{uDr)zht(=r#>hvM(x|e2S@$L> z^PLwhcq#HB+-$)Zp3iS_*Yp;r^1Tt$wNi;<-Z}_DKJ>0Td$6XFMBZ`fA7AL7imYYp zA6NoCv>tAs6F>4^%ZUnjqZdKyr*~-z@2r$`zNxCrRx?$>0oXvzRN6VjF%H;f>A9C~ zUeN+gv7S#up_os-_BO)r{a%gMDKxNvHwrpa)jSsE?5ISFNXxiS2OF+~^VTfFV|neaya!IdcNyL7^~_swDC(AZC1XDqa)e={(h;^jl=cYS1SY? z`iQgAtir=8M*BxFa%>&5rlZ#{au!%xTKOmfVs7yvS4q$@c`^Sj%_q{*@~T<)s-I@Y zQ4!l=4(rD>r-7IVjMj%-J<}YR1eEwha&ro$J;+2BQWk^qawz}8Mo9Bjx zR9(a1ffC|L4jX&_O?ijh(^nF?aL4B(UmE!%gts2ceF~QP(#EqMynhc3Zelpp)O+sg z$}g|+XyaANhSMhXemQu(+YE-S2kY&(egg*d1r?ORPN#iR4laX-6vC}jJ&hDmAP43` z*|4(hSJj%2OFTGK2U|REuajMzd$gJP(q)gxxUA9S65aAq(`TR6Rn}5gj6F-xv8F#= z`BS2M6(oPmVD_T~-$O1h96u)?QJN7OhhYoQHzJSPESi8+oA1KGMIbeT*Q)%OXdtUI zn3mRP;-OJGsna>;**XbRz~>XIAoUEws#;3$)J>=7%AEWq%Lm_`i>Ar&=hlrw`MKo**oPwgN|$ETs#-HA!51< zj>hP#_e7^A);_^U1LD=X3$h+%L_a>tqapX3$$Ne+t-Hx7%eYcxxfkTp_jc&5Yb-te zdRzymGt}+tDjOd7UMh5P`>Ylh08khY0kr@275twF|5wCfyZxuwU%YpEA-DWns_P$C zhPlwi-1I%-_%0)#j<};^5_8Ef6s%(|y-rG4w0~mRId1Yd7>|O$aSa__6d8JdBY{%{ z5OyZ|cGBTbNGD!2Ifoa55(gbvOTM>`Vy!`aUh8Yp*x%ElQ}fNl7s(K4OztuG&&3Ag~xAK=%_=2v*XT6iOA$LClE{-=x-I8@uryY0H6I><-0qZz?mdG7!NERV&N! zp-#J-H~X#vrULKk9_b4{znDw5aL-G>Z5y}*7Bn_Jn7%)1*Kxq%NqP`PsXSEL_jzhC z;}A{DWhJrMZ#wryIK5=AWcE|lVF~fyqaz3-LH;#Bo*uLJWd|jFd=j6dq1Uhjx9Rbl zHv+;#S6KqVWz&MfB5!CWa<%=I>VXn**etVRjd`@_%nujdHk-&Y8L^Pi zAaima;x~OV=L2X#Zahsm#5K$ZF7w6HSvl04e&tAL#mgpc>zB*nYNMAk+YVb%S0P#8 z@!I|60H_-CVw1$q4e450^!RHPQ`5{3KWkDULi#Y@vo5v`uhk@!@78OmsdZ(Gy^U)` znyqWW5?~@w^->i2A>GD%TDszr6;-LyC969YkEs(p0$f~RoQwmcc+a~9e2{$1B+>-j!Ayi~b}@2oRVU~P9i zpXSW0MVvVa=!ypUJYzTrta+2Z1bJ5HQ>#B6V112xMS@Z|>Ail0!A-LjZS1_vI$$w; zAyDhC;_fckY;O7*rU*F(roM-6$saa6UsF%!Sa4W{p;+ik2#Uxk{v)c^OPL;jSwgm@gl^hB(`7mHu$rp<{D6bRh9a|) zP*iCWhJFh8)O_YI6s%uz^@SF$Ignmrrm`A}&*g1NRGdPm)3tJE_Aq)srF$vF`8&4| z$tKUlhdt@LdO;@CVp<&;!;aaM!j7isw4u@&z~&jJBVR!LK!a|UlLUszr>m3wFK_siX;pX`>JlyzMAl8o=|Jf?lM;%6oIjHgsDPE7{2_{>T99cmQ(Ljx6Qd6a#7 z=1Ts2as2nM_C+pv183wsuQ?Un7cC9XQRdPQw_;vvjYW5i$G8k2;7C1B!%<#welr;l zRXfU!$NTEbdw3R~w!3hfaFRQLKVh<|HE!|)?G*yI+}0M&d!*=)QPR3pUue+mOSW03 zLh}ohbxCcH(c4AOjyM~hny>1l{?*_3)Fv$~YDO|)kv9fU@0sU`zv_NTJQ1Kkx14~Y zzO1TI48CGoFgT-WLqE606I>`Z*~BM+>6g?HsC9ZGw|Ho$UwK+tj9hpReykkdLhBB$ zdo`_RiBP8~fG)d(JooGCWdlnJ6t1E*-1PB7d{R;817kzrtO&)cjv++Qlh$@Z{)u#; zT#)4IW2nLUUgkkuzWkUUKsCE^OqK&NzCZg*@6+^QrfA(y(J%w}&6dHuRc-C-;E9%F zEnhhSyta2TU7FKE-(hbJDYPvy4x2{azy6Tco2)mtJira78S&|?*4*{o72ZovQf_%w zmtwh+-bD#Pch`=d2km`6Drpc5*K~NZU$dC|WW%1hww?X)?F32l*CcK5*EEh3;ef>h zF_f2>sGi;@G+KR#+f^AdUjY~72D;Z8V9O<2BWrL;v~^v=_`0n)G5l?`w#?h34wY-> z78h4T61)Waa!=1)l-kKqj|=3hu4OpvFDhuE2bk>8fwsXAP5gp%g zG0A=eXE~!Ep7vHPWNfD|%WZ<=eGg2GBJu*Xs{@~Y;~LlvvwZ(GQkc{KGII~k!#g9f z67OOB;xb3u65Kcfd)WC2)LN^O?!a&HndKvZ_^e!GrER1N4;zf=5Q3)?o}vie3i z>EUu#;_&KEx6S88hMdvSiMh!2`)aYPx|a7J=;5TDK2pfd0pY3o{QN)F@D*bHuawlFUOLEg1OpRpmS{+OL`88sT{!Tm z&=W$u1vB@ejYsH(jN0cr!21{UIId`oGc}a!g@i1xCRv7+Z{ws!Jmjh=+n}Tr)BJGb zM`fzqTxohl>!)}zW|vzU#^JPXPhkygr{`0TMx>`|$+zU-Bc#BGZ=?E{Fhaucs`x&< zjJq@kBv_%&l!tIW(KCd1!hTvSsN#@V0LqHrj$DnN59Wkp71YDr1E^(u~7>i_Zv|Ekt&Qe{cIbkD@0yHq_FMT{CEIE>y&Y)7HVuY^Gely9_ zAjZz8!~AOERm2z8)xTf;L1AI?@65-1v`>G(D%UMwa-`gc9K>GdJt0Pewk7u$@9ckg z_Ioz_2_&E8xf&;|rFAks8M8py zm`eNzTrgahviHKY#7E)r^V!8BIUOI6IMZ2d}xp zxV%E=5^TzE@*|p852fXRhj0}?b+y=!TWIGez}hT8?*+63)X8_&{m6zEFcXKLeYzg%qAUWW z3;nvxZmgn=>;Eh!KGE?;HH{@NrCahq4AQ8_y99pkj)FJBqzi3@vyK1c4$@nGcIUjj ze^^qBtsBR}3trT;ELP7?97njYsnBM+y1Vj9CuIdVaHcu@N`JSc>En873{aRwfJ_Jd zaU*`e?JjBh*OPIC_Y+6P;5F`p=xhu zommAElP~9?_&*xwMO=c1Bc|r!v!=E?F=5xb z*_ltb>}?-ABzh09XwNvi=F1_bSX~=;9a+8qfOD1)2vkBpRlcFWuI3Y#9>W|eojp>! z*orD^4p(}Ydh~44`cYLYByE(CC6%>7v`h7!ZOby7ZR3|!Pj6>4Rjxa%3;^^{owSGZe* ztI9wj5Wc4u6lWJvz%G~bhbdx;wer&xU)z@59&G8CE}VrZvh5Kt&~Se?i0E5j;f_*} z`Id0=e(?3B*t1V)iY|BJ-=J5h315vm&Lc#DvM)A)!#>SPrZkJ_gA>6kROa`$=eX1x zSs1N1NPkKsbGBxm`g?guKZ`KSnhSeyl7%ozN<(hm$}gF*W)2wFs+U|AS>#Q*(TTGU zy}qFgEGw`+0K^ayhZ<*4d>@DPYf?M|vab%2JG6x1OsWwUz6MS?ZJw8wUJMHQe}2^7 z!lAyE3YUnrSMcA?kB95lWAIQmXRX$khwh(F(gC*E`Mu}DLJ+!x(tzJ3&Lby@SV8@hn`;X6tp-HwoM4=hkUpe2e?@a0|@7tRM&F+Ldc_> zZ^8Y>;|_yF=+?CdDg`Xz2PK*XB$r|}G;4}CXHKG5CH5C-w{!@wJBtRMg9~hzzcF85 zD)iq7UueJc-;C0{q^g>?eUO@YGen+p9HG4y^K+FaFQP6FO2wCzJ^^xMc~tUJA@0K1 zAG;N-FRJqNI7T7u9 zoVDyJcKd9o?Is62Qvf)ex4~>*A^s4BEq0pj7KDMC(gGVCTmS79Kk>V?*W2;CrtvXn z8Ojg|Tu=a&O+)c>#Wz+Y+}p+y$dVCyJ=OI=b(Qz>{lNPFkFB?ii}LH*hLuKIK$@YX zRFG~)2|nP6pyGP}HXN?FLZVd|^oIACj$ER>k=C9-~W5f|@D`*+&2-5+54oRsC#hcjQ0 zNtgBgVQ=YKXvTq$l%~=9kQr0Xcm56VGI{@H<7oUP=!%~1Pe!HtL;v@J#%CteBsDiN zpsi13(?jGQEGas@*psvps-0)rx*6uTZ@_wF^4csU(V0X^=!_(40C138_NtTfUQQAmGQaNx@Rql z6{(09=O-p0k_4hx7U6X)F~~zVHT*h|2rCDlicWx0)T@=xOl_6RKU4 zADLZHmrPKPzq`eLQX(k_vA+^1gpP^0Y5Au9_857SV&f3KU+EmfuGbZFINFLQ8|>%w zk$|Y&tmA?jC?{O=iZ~LNxu{I`fy;?(`rd9g)JT%G1@yzMc<@@M&&X=>a`oHOr#)Wk z)re}vTylM&|b2*Zfl*uq%=)>Eg`2%xAsf~>7)#FDU3RqeQq!_Hg65i(08YMkM z=h3jJ<`HId6nGltI%OQ@0jJQir0FK84JcUQkunZx7*nVsv#%paf@vC!MG^mi4X2+c zq`V*x0?pWd7W-Yf^88SfY@H57_w@7c=%2~{WjM+j7;0ng9AugJ&o3EQH|`3+>%o$tq9YUYf6d6xjl1!=2+qNK=}vg>jfjPBi{4| zm7{=rZ6BYND%g07e_@$QwLGX&%y8WT%P9|`IU3g*)QC#RIh>-Thn7>FAXE&zJH z(Mi{#_aCSZ^K0(I=u@zoN5(ZVOz*2(nz_`eq=34|XE)5E4SC5}v=_O)3*N;A8R*l5 zZJ2#jhIRbeo9+(-dlx73ao`s1%!8T&#;m*Ftoi1!m$MqvsF)q-5xQrL|E+C6($g$F zI|_C#qj}Ot3T2j4UO_ZlCpV)Yr;6v)H?~n-hPewEWQ*I_Tz)I4>a1`WIPb%Gmf&J% zb{}~G){-6P6tbqC_Lu&{2A=ovKK9tm5uF6}g-guOIS=GH;k5lbckK-M*CeC5hOuTp zrF7oK9OrQRmDoLsY=;6_V%jwpSXo46gRI3yI-#QK0hn~=9tN5B@z63eNc-=5&c|8* z+zjlXrM!i6%J`8v>b%3jRQgD?^tbhO3$H$6w(H}N)+cdOeF6m-FvzpStQ(AiQ+*Kq zHb{m%SoZwwfQ8w)+ovkjILCp(@SDL3=-!amh^8wy$~PnDt+nD6b8au{#U9gINDmyj zn|9Hpu>HDp8h!j(hwBYM_{os6z8$QU+mYVI_}$huKbfJ{s!ZlUOjhQu49vxt)=L?+ z<3Ld4g;63aAnw$l`8!X)fpqsqA3tEeyva7hrraUx`?k9}DX@DW@9**0;CJ5~;`5KJ zuI6SXETKn!rZI1yeGw~u>;P*^&VKlmp>7s0&k7=e;Y>U{VXN{a*Z-2oH1+XkK(+ik zVH#!k%eP15H+yG!e#{){ z5cZ*YdGYd~2zuTV@tXh9mFX*$*n`KHB5}wT#A9t{c^uie#A^z;n{u5^1@*=;4paM6 zs@9Vmwg;4|2fUt1q^o5?Z{xOxar3%H%L^Sdm-$6pGbt&4zhmCx=OkujMW}7wcxnWY zVd;x8y_Zeg3UVzfWL(Jog|jR+&3 zxNMAp?OaFR>ia*hXtiT+()<+qUTyW8Q|QtjxV4>E@)ycbZvXaWu|3DjbD?HZwnG91 zcZ~7SK}$Gl4p@6)ws&iK46P)cQ58KQllX&r-2t{kKrKQ=!^&KenC8lvjLM-EwLwA% z0C1KNut(3o+RBkIwiHMZVJ54&ka_5_d#k!M=MPG>c)P|jDZVIBB2JJNr>A6)m~ z-l2OCKWGnMX$KCJOH>ETeW%^g*&XV4bcDnzt~*Ppx>|1A5b5#4t2<>&MKNXc7yZ4* zykq=$b^5R7N}8p&`!E~d?vR@f1m`>Hk_2K{tN$r6JO9a$@6%+!!vMe+oVGa8Rp2AY zvS?5N+2a6>@i6b-lR)c0G&6NCBzOaqr@c9OVz0kwMV6>~UakY1YIoo3Ta4)ZZIW)L zgwr;*(={iI1@W5;>a9jpED8R&&kmlN z^a(yUAo9Rv9c}!LQF57LN4`$+sClkK2LB^*&#r#Hci3D)~4L!%N4LMJJ zy&~x)FB2qbEBlhMwb#d}FeK4+*E2hzhWcsjr|w=Z7K_FaXx~?xfHI56i^nUYuPa-x z@|!OcxC~GElc4V_q08n#b_em<(t}(kZ>`q|_DcD5lU2t-zJdeSI;Yiv0a>cjN8qDB zWH*}zXj0A-fDsN_k^yTqOr24FFkL^0F`6EXse#inw*KT`r+4zb5+3knDs~wT*4N&~ ziU9jWO7<5Oew29X>UHx+CsJps?u}fkQt*|5^3Egta^7nlrJ$GvzuL`@wERE)1xL)T zhmawcy=XRuz61C5+~rS=3cp<&z_N=SVPz?7jkz9czAmM<=QM1kA15Lj#pb~eJu-Bc znR2f;HDgw`hpD%(c^(15g^lHIOt~TVQ`wpOZHM17FV-qc$o0aVNPVAHjG?btzbfyz z!SFrlL!;Ffsn0+wFw=}=KWNMSMeY`pPSf6Y?4ZrdsoC$W@ln)=)^Me;`-KFw`R+Y}da3!812L2i5W6Tq{92)b1zvmWM zr>yDkU6#0bUp1EOXf=r*n@VgCA_n*gcwVvoZSF*ZARla(b z>TLj!Yck@cXYSa5blWPTqvijNKT_}3T&bE#0sy!cWxlJT(Ef{GOjs0P3OFYghTLD{ zTp$Xo+8){?bftl?aQXEr2M~avnjNk`YJMq*&CPo9TZ2n?nsDW3B(}IdWR|6=d9c!t zo?@tQTvh+GTd!i|e(*+F`_F@Giu!v&5rhMFOFSbhFt~~&VD`m=(RVFW^7^%X!_vE8 z7K?^L4!0kC*MNT6Rr4t+sNKnn_vd_cGLxucG}_l-`O-}tzgJi#S(Y!ko2>5x zew7o1gHHZYAN0l|{EV4{V?psr$ddqIAC0j43&0n=H>T>u?Cz@MUxKS2aOd>AuYf)h zA511+^uXnJ{y_bPe#fFjHQxAw1Tkc#AW5%C>mj4x81>h~JW$sul%3=^y0dU-z^qfE zUv`DGuB&PWK;Gw3A&*@2^00nlF-p4WDvDBrCMGma#326~9`Wo2G`%fbu}&BJ=6q82 zaJEMyy#ASeoby|8m}%osZ+YPhCk-<$>5hfXTWbO5T#uKq)OPU5bv)vV#~${nRog6C z9cS=J9Cua0wJvX+`B7o%Su;5=#|5LT`OvBE*Ob8uhz6NsEzN7k5!NXrNSwv$LD_Rv4s zbT6+Exm=LWN!8kwJ z{&H`ok1)}=x7P~kIy{#={#TDuuHvt-zJ5(@Fbu5SshV9r(9S`V>j&Hd{f;}uB-)l&H!88y-|FDS_#el`u#pm*5>gO8x!Nfix~Ph0m{49 zvlV4c`RLEcDX4V;+4Hcy6UjJ*+=H;#9D#nq9UHg3qvoUCr#8%yJfN=^n3AJsY%scg zw@N(OA7z?d#y5|;9O%AyYrCs42s7fyy)_@^xt%{MEFc0( z5u|P0Ju7;n4Yadt?@E?lrOX?CoZ5wtq=(BrA^(O2+~c_m%KHH+=-0Pj=jfEu=jq~ z;m_JQwEdLzHH|!}qitz`+URvx^7u0pIH08-W!*!2N0c*Q#w$bx-!WAPIGG{!GO=Ts zAhNA=!@7%juYYrVzi*kT(Lq~5`1G!^u@nzIU3pz&Tc3w#;9bs)ZexZd+kBml0BfMG zrE?zL{N~EbaVBIX{H6bsWf`K6qj@y9Jutgxu3`z3J$hB+7E)T7ew7!jTW(YZ6(%in z34`E-2iZpNrD9k3i}}hFp(ag`ISA04M*F>z;mln{Gug&(%BVm#hYcuu;8N>TYZ^i@J{-~+1|###T^nbtq$(;k}E zmmg#!>NXA`c7C6`_~^E>RbY198`NS8#6!!|M}P~WZFEk zq~pNTR6{||u^nAOis4d?12cTLNjxev_lv3dBvqKCMW|(+drC@r{Xt=258N}-kGyffGSgL~3@9&Cnv-UF|D!X%1e?}E3AfEp7IHq#{;D}f>=hal zPY+jkya?9Y>KQvd9m&RJUEe^zxsoTMavwS>cj(3GfYa>ktwiBxQ#S7RnKr0c1aE@}(A@76l|@Uq;BP zIzmoGpT|pQpJsAa-yUeRMmsbEzdrB1h@ka6GrXVB=3>r}0|t;wR5(g+wtaT|--gr1 zc`6bBmA-#lpW&ia71oHh(2@?Y3G0k6vgz$gR&AP-rU3|s(>t-y(z`o#acBU@@RMmm z4-t!ka#q!~cLR2`w@tn}R1L=yo1D%kV_rkW5qX>Ap<&$I`7GvPA7yUM>9OX_6D;KM z-lsWO0b1&sdhgfDBJer)R9uZ?2${^KKDvFMKNuxozgBFIp6tNWCR+@*++)Sk{>7E{ zE-&FVewlP|MeY3`;dSrHtAI0_1Ua*!_Jn69(<=A1oeF>Eg)4^m#_f&zcr1_(?cKszjwXQOlvR)s z=M33HdSO(~gzMIO;O|v72i^`!7Xt;a@4FK_{K|H!4!h9d!uh8-TvcV>&H|8FNDNUT2f6kVjf}jtIlN$S0%2}W5sDIDdp`upTfw$KTAhVxdd*< zuS53@*Ei5#+a^B$v;g*^`}&{9)p((gBLOO#zt+-mds26|IfK>fv0^i&!2f9mlAvhps zXrvrEf29w7VPt`FIojE~jfbHP0VF2e{(jYB8zU!2X=H##U}YSG0El_VLVRuSC2< z|31^km93?Wy}`YW2k?4w?gLLZT+#72YszQL9a!~C*O{^YNJc@6lKoB4ga<$EM zYb>*!E3j8WZ7-Lvod#SDQvOy+i2URG$Gbxkrjyh3xb5INO!1Jo(2c z_F7etTV{XeI6@t5b2oHicIeAsrl~lW=!PrHllmUV770Iz#JW{YuZEeY(9lDg9q~V* z+`eN0Ids-G4fg1@W1YTeFMoS_z-qKNYiTwG6;?Ng2#xiiZI(A=cxOs&fGT8B(4E4~ zj9nqDxIS!XgAX_PJ7PrP>m+hG`fb~*&7VhPu38HK+H24;Wd4}+?sT*EMm%oWJ+2-@ zVTV_W31P*24oA579c8;Mg?kVq1U9%p7+1-LY?Vw6kM@(!VLo*a0&l-`bM8|are3e` z&A^(>j*!F%7ZI)?3!?ktXsaA{%~K_Ha~pCk@ODW?u?SLz1-+lZj3M<(C1+&MZj9VH zgI7Ca!dGwYA>RK<&HgJhyAOlMXXjV}F(17%YgVL-4nwH!u#WSLf)RqsN#=Ru`7R`| zZ%2QScn(i6kf)C8kg!0{1oio|zwsa1h41*LYg1&U$)JGI1T;o@xk7OmH)DH;trAG4 z%qH7Nh)arNJ0=eQ(8t;1&tCsV;OQTe&1n3c&!m#u5Rinoeul(z%&6Hj*`O9WQF z)wwsXFC+|VZ$kbgV(x4Rsl;=}V|c0H8#0svNO-TsqI1Nv(jaE=?jE#4_bxx!!$6&N z6z_fw5RVO|R8Cz?;C={gTYOP9s3xTZoiwCEYIvK!ng%T7kDOO4LrSxuT9{VrFN&}} zD&)szXB8&x{5G@>H>%5mJM2oP`;-I`GQse)j;RSi=n*@TzeO+7{e_;jp{*~9$tJy@ z^j!fVp7xrnnT_OZ*K>O;A1xT_5T?2hfDqc&_Wfp46pRuwt<;$$xvb*HEI`h5Jb!4X z_Xkrt^Jz1hRQ+*_2@nu|%TKFl#aTDvgqlLPoPty>XafNvq-!F4+AAvBXVr&&@|oV4 zwl`j&6Fpn$mwBgX3#DmD7}|3F?O*=Kfv^%ami6wso>*RI>&}y#cCK;1fm2Tif$E6pobe(~2&{tGz9vB5*Co{*faS=_5am%&i+`2ndl9acFm( z@`l!t5HiV?Q%Vo>TqkK;$K5URdM4_Hc>r-(~YrFFZjdSv)s9L|Qe z1rrO9o>Rk#Hw->(1X#mNAX(z9H)FB6?fK#z4{qfGQ4h5~Q{Ui!Lm42TlIpQc4u7Hm z<@oPiuy*h^MSL;rSWZ}u5eF|0x<}z{Lf}VlZY`>)Yvl!FEs;jKxT8mdq_27J^GW!? z9EOqXxIoohWQGI}`@GN}OMpJd0*HI%kiP8^iANpwQP}%CGgWU` z0KUa1&kVB7HvW@N{#Q0Ri_@09(FP$we(vUQ3{6Nfc-T9vs$2%!H-jHKQ}iZ2yyXJf zukmXrtXY@HQ@6bffGtH}L1W{;t=bxJpbxga^!&}EG3a6Wkwi32e zROWj-EX>A(A4Zd#vNo+Bh<4DLkDfk#`uXs1cKjM=GJ(AbhzJ2S)dqMMo8H+->HcC8 zTm<7xlgMUxfU@N33g{<&l)6}H_nks~XYDha?gag2m*lUS;$HS7-;RbmD|o?u3nW~Z z4o|rKwEfAxv5T_O=|sQ^9=)vf{7BDyQ`5O@FY*;7l7zA_vy1}E>YbG1>LzF3c|SNd zDGMAcDqeT$BN&HsB@Z$lbd6~=-IEC62ACP(S{$IQIh8W&O9`DaUlgs|En|DpXWjY{ z1IiPM9}Ej$&bU9^b!rHA^__G8Qbl$e*I-}2rGlRod3pm@wE>)YZ~R}rl(a=L1#JI; zVQDqrMyTM*R87wO4jQHSR`e)36>it)KI|QaXp3iH1 z2~S2Q#{6^u=MHZ^=J0b@2dSHK{$2x}>k!~UZtZHe=9*HM7v%JCUg!eNX|Z)pxNcZG zHsVn%j|gf5mOmM*4Y(4oDcY;q~%L!Q-YVIxHc!V?zX=Y zB)g}5f?#hFq0AA1fBY_1f<_fo0eNX}9B3KvKsJoZicufi&qV7BHAY{I?1YNwmU3G080>|QznGZN+sN(KjCGNP<*pV!qRbDy9ax0@Es zb~VEx;7pmkvK6lrdZf-@D+7<_5jL=-MZCj{NQz7<;YE`WNJ){%qRgwTfyAS)YL7O8 zkXFB}LhFY-3bcO~Q*Q>FPMF1-a|(V%DzZ=&g%!M!DsgoDCNj&{70z2F|MMrRj%n@@ zvN}tJ{3v$E7#rC8X$xbogx5ivRP(DY*S?+G9#_Q-x-Igz`6d4pV8kqZ8St3+mJ94~ z9eQDVV_j|}_4^i@!Bhf!AyqT@y~+oOjzRjElv3jx`Lq)#oL;oFMesi510cmU>Ne-g z$x%AgT;ssik9S;AY05e7>>4b&%SeO;|7dIJ7V-xH^EZ?@0x+M7l)S|+<5quOy@|8X z5lv~MA3j@x((o(G2D>nky1!NdF_i541S2x%MXJ2N9h=`=V|mEopOPN%&y#XD2hR5q&ySrC z$+EzVJ+mwVKKC{*@{_~QE&%t1YV&EEk(`M`3=r`CP<_s6wba5c$Q^#;t(pl4D)^;s zwr-7ul?QE2Xn;lDWY)P8bUsFCTpI@<#ihEhMGopW<@dk)bda8jGeaQhDpXXfOtlM< z?bh>7c7MsR=lLboHdRCeoLh-?a>w)U_meD@3}dRRtX%BuaHe0Wos@-+AgU5n0yI{c zE)dCI$?9~Gqoq~K4*Xp8^?U`+)}S&I=j&hoTWWWF+6g_df}`XxI{U#X@{hkTk=v8* z`#LTqQWL+QBhG}RmTd6Zzkak%9f{kzSPp&RE4Fr}4IxxwS_n1wzmYkou}u~Gmal-w zEVr70hU!xtZS3eyls)CXR{ZcnA#lpwZlyjAnd{2-iBCK48wlAW;4Zabk-X47&o(lv z;Ia1XbO3?_h|x}Ub$~5OXQ?2N*NjN z*{*sCxw|!N$4}uWKwx))?_Vk=u3b}jkyRrTdBkS-w&%>n4UmFiRj8cq#{#e#@hFGW zPHFbhkx(-RUz_e4)U9!hRyxzww0sup`Y5teIhCo3bkQRtvDoW4^ZNX5Zyz;=TK}Pn z@;ZV=`6(fu(G(#l9bY4aL8$K@P>;*El)L;%zP3zfP_ym^RfK`wnGuy|h<~I#@alp~ zhU;SU{sICL_^6NaAwCSF(@z_(dS7b#K2P~yLOdE%=?UX^G_hc8FV|k3n?DYjs1i=m z^Pg}6i3A8tDD+9Pfi~Y1SBBgcbDSyhuGn9_p*f-|Qp^{B*IYn}*K;SgZ0b-v>Y+&F zNatS(*^`nvTpPBdB>evUwhjK3t&ah^BXOgWp6aUp&6r!Bb8B>m<-}BUbX8B&I6cvR zz;)~I{93u_lg~2WsxRpM>d6_KBj)GHw|912Aa;zc$Ik?umsdpvgK~4926wRzN7~xd zw0RHX*SeqHM48)p=oz0NPTov-t2x}#rd{#+^yX0{LsyxagG0tS+Rpr`uY8v8DjH11 z8K2A^{FqhEh;TpJCBZQ##{WFD7#2=dGIrxI4X>)jHfbX5diip0=XDUu#`!dv>FN}Y z$T(QGf#q?2EIuDgmh=D>W-h;{o18&Z+4`FBDCSNQChT|8L}vx}>5P7#SrdLD=Q*xj z#!)(Y7m7cA;tD7oRk0smJD{jMxDVw2vjhTxG~yOGgfeNei3F zT8vRQT9(g8FtUHGcLTmF5;{J5&Yq%r?r;#HLRXbqE1umHd%~@bT-~{TEg)`{o&x7L_GwTQ~J%fd!%o=!xO;f*oz;Tbauh#ywst$g) zpJuT(!lx*)zI>o-(njh-7$T!T#3HOobf8JycVd$cCCj=`dAlJS*KjxdqVl!N4BOay ze4R^gav8{(G)DV-Dg8!zF-nZA=esZZElp9T7jnas3XXbNteyy>)7NJ2wIbWKOjV4G zcm_FJ1!e;=kAawv%-X;F+MHXcibsmKobGGFVMKrrg}25OhW`t?@LD%g33)L_ebyqg ze-${{4`onF64_k6XUk+`6Fr@8x5kE&_=U?Kaf@PpJo_egqsJ)3`IF)!wpke%V{9S) zXI?7WBY38s)e|_EeDTrm-H$g$-;AwvQjY;{b6!03Rlhpuw|`~L4rSAnBv1{?Q(wGN za7)DQ`2rXp1^E|lRf#>ALp0V7wjLq_&X8qGX4X#@B+vk`ji2Cj70g4VlIT%X~ z*SNp0dR>VkW0t{C7OyYb@aoYfd^|9T7VnZ!EDfucwpj2c9@=0$55n%B#Mb0Id3}qb z+xh^d#sjvz$ujN!Ft$@yZ;loScI|ke(E4uKx|L%xe2y9>hLA`2}d+Yni?6_bQD;>Bf(pM;C9& zmx7wF&T*<_KbH2N5Y^9o9vJd@Ysnnkf185o<6W_44hthS^mbpn{dHxD4^a0Irc^XM?g#S47+r(-P z9p`^Rq5d}}^?$*x(wzPq*ZMD1>wn~T{w>CXO#754o>DxWwp7Z0cvt%sh8Rm77*Xfa ze`H^oX4sSK)?6dBu09T|8Q&~ z1Y1IwzArDD3)GCX8tnmXx^it_3$NBo!(Gvrw_Qm~7s?`ct?Rd3By5VAdllvzl zZKltTezE-xIzqG?AIpw3UzOk1H72cpPCQ{yg_#LSK@l41f2SA8KAc?rIdR?^TIefj z11Blfk6~`<{#vG&`wiaHj*T4sy+HhZF4HpMg=%b4F_|qavU9le5;Wycfi}Y7ih8qk zD_8iwv*_u|xE>|_=DxBrx7^&)@O7Go8I;k{IB9*teb;@%As3ZcjYR78M9S5ewq$pue_Y=QHNYtVd6KR9G)>$H> zqdR3q12PvjFFL^z?x-a&D9btEhQF1V&*_GcbmuF{dn^1i!-i`iS=?t;br&KmVNqHy z_?|OEUpZi$Uk0m;C7V`+I&n<ke@8xx&SVhaY!LX*F%V$MK_aVo;Rj%Y-k zo^Hb7^_@A`|KpD^e=T)sqRaPb=REA!?IOg=?%fwQN{y+F@6LY3h7(0?zZfD9G-BAb#fR+U4Ie*`nZsSH=2b z;$0>AdV&0~+>LXXhM2=ozc9_+a`tN@%YHmX(Mc@b4_7<#2CoZ=o?-SVRnFIKTlQ8n2c&M)_@JWk!Dy?18v!ZU5|J@Je#aMCNYHobOE1n7sx ze>`2YZq-qKwc=69+bm6z+}rOour9m8U=na}zaU-3Pr{1@+?wBwqp{*U3bv7J%}loR;LJjXxqjqX1!k;i{ayV_Tefaw^QAXHP2bzouGvFeAtkx^5 zJDEaP53Zm52VoqW4H2CzF{o%s3ksYz8e8Txqx^wgrM)LNsG2$30O1mbzq(8S&D ziPM30F3V59WQMEB556aADVc?mon=O|ky$5}>=XFQBm8$4OA)AxAj z&M5oZOr_WVV-)c4cKv@EiduIz$EGmXU^_jS(N3yujbJ&>(NOy_m>P+H0Sy3%2bfuB zoD(vE2N`J?uyZIM2EM+go~!k(vEEdMd#Xqklnz+L1@MOn<5NUoP$)su_=BG0agjZ5 z7}8`*5nrPKmac&#%M=e&MavYDw>m9oK5z}3m1#Nu79i2njDRWb^+YuEyR_}ndfc74 zx>ZrU0hP=)!%omNj|K-%<-Zg9%6Xmq1zs};G)7)-RjHgVi124!EDdYp$Yf053Rq*EH*(Eh+ID6eGmofw&9#d>~*eqKK- zc&FOFiuGLxB*@S3jOjg^zv7ReLb6(zfGiL8D?K# zZZye$*LUj`eYSd!t*f%0S{ZAQndCupK>r{IR&Os?_p>&`&ayYne(*#SAV1VFtte-S zcRiBDln%TMq^^I|IgR;6)Hi1Cz4x?)_eB8fGechXMWN9IncT+Bf%B~3mPQ8165rcS zzAsCI`Yf^O5S|xYGN7uNTPVJjOf^()?2^BI*vjBu^M~NVwq*UT?XWSrCx5rE2GjUi z^!r&pmn7`&$)TLY$)ciyMvsc0vd}5^tWYLxV7nO3IxzeIl+RQ4*Nc$3BL;}_zF|-H zWUuk|RBK{2zzo=zB?A3RTVKZjF`Hps#=*NN-%809=avFuzyB@zKwF8CKkd*<6pBgL zJWo)>$b#3abnwExhfch^zR`ou5-0h_OOh{V*?u%8xsfsBnt&9XWT?7*$i2QD$#-!t zzlfPgk!b4sbAxWd|I(TzN`sow(TTt`a20@!EFN!3oi1KjS{G=LF4RUnWdE~#7ji_Z z30oZANGmCh72`5!E2cfd-sG4a5ok^72)GXKk_3zlyWzHP72qle_kzCTfk- zcJgdxHq^ylJ6yB)eqvM{X{C7KYczE)8!S;6>&}?D+Oi0-8A(}W-%i1buV+J)gb5As zdDNK6Zot4xeeg{gh7#FlmeD!6eE+H@V##n>ES% zA-p#B92@eC0-!r~;jA)Q$ThoZ#m*QNHnB}O<4AKws32(yU((1kZsQAJJ7%=r>{4EU zJ-l3e@<+!BGvMPSp=!l`#O&iS&szV>;CLtf)&$qwGglJrD00(}ARNxjhF)WOlbr(x z-G2G=Bdd8pc4*{-l1h!L7-(~`>uAuGl$FVqzv1}q5v)|n&2Iu9Cx~hw)%d8B zx_3JUgYX(|fghWeVwj7!szN?$(AVP`T1WqQcXGBmcGNgfpPpdk*4JtODf$adPwdqz7QGIq;x>!U0P6H&gBhE*mCinU`-kakr@Y>#3qv&YHHbZey7a; zTv*2-=b2xt(5CuRRO%h6K8Q#vc-uv+Acm|-OaFaH9lkn&<@Lhohd&|*Y=`ujM}D92 zf8~DK+S$p@$syJ+W*DCas?T4g*C7?FbHB25UyVP7dd2Euxv0pUZ96Q{Cg$9c;Wtef zy#L-b$_l;L!Y#jiH{^Di6@sX^hbY!BHoX)VWu48Qq*q{UgT9pEOI=FWvyV9?O8`bb zOG=ky4*H9hxv#)4-R3?!yS=Mn^6>2LJH*g+LdXEZ*&8)b@%YN+NOiGWvg1l{jjrAr z@r}RMz*F5B(M|Nrn}}w@dF|H2XQKV!22+#J#nQAN06)`a@)8*y(qg58RoaH@LJa#& z$^eA^+h-?NWkTdDp;MmGxn*C2&dulN>ST%caGH`n95%`dpItG9>L7DIv1y~p#V8sl zy`W{lwCttS=`~;4u!>84<+~M636U=iWN+tV4jM~*4adI9&Tu8lTq5a*_X@42f2Pw* zybP}~@#*#=!SSy6BN3V4tPfKB>uet7Xf6+0cL}}$4zVi#nr>wZd-0+}MMoBG$A{fK z|6oS!jmLSUk!XR^;4W;@_%eOPe{zc*bf?tf&xTq~A?oMm_;oh~l2$XEk5Yds&nIK;+ z)2ElyVQn@p9y$@#9z3IN)#`g-^i@6IrZ*+OjtfH|d|~`7h-ysF2lHo*q$)p_4%LoV zm4Av5pVxuv=B}C;nCS!*-1FkOlY_lC)jx!Qe6BK>;|F^zk+VuQMw+~*ooeK_*=-5()k48^Ug zU`+#9i$O`Qj8^G2%kCMMIvqoVPASL0JOs=(l?-| zXY7mID=GLHSFHCFxqPd#hxAHgDLF2e6?EmheYNF@PY&kfFzxvn8TW+CWhkETXGES^ zpRyTr^xiu13eamQ55l){gQS0`1s*%`cBpOG_at7CmVUod zfMa1EOZTb0V;QsO;93+T#MtcX1^Lp7+4b6Dn4A2X7C90OjKt|GT0kU_8Wi;GWxUc3mIKoW zN2)z;d0ns~`b+wxaE|!W%3_2&I;qq5hW@9M;Ya&}{GH=hU(FUF*rYEkTy13_1Srcl zlD@uW2M4X3e?3i~X3Q5zp2qg;s2?*Nc>dmbz*P?bI)r{(aY5a&2>*fz{*~Y($y{wW z3lfOywVsv!I=F?OP*Ng#$#JuhktlQE2^6t2a8mc|G=-;QO6f_)3(fiJtmG zplk2(%N}5}C-EIpm1l})%y1l>A}#c#WmDmL(rQ;}ew~rB1ttV3D! zxA`46Ic(=1oG4V?0`ICn^(urcI~0&FPo7{KbIk#g2q>MUY;JmE;mR*C4ui~316ixL zV@<}cUJkf<4zuvzv4q6aFwVYJ+;3NJfyCagQ5?K}{Hp#UBZ-%$a(|R8cKF0(iX0&0 z2|3HS$IO{j>WOj+$dwNf5vH?xxtNo`ea{wceE>?96-_~ph!K>r^9j{H`%!jr618zs z7&kc6>EjBcGR9@ootg1R)s)V*D)gVr?!Yzi{Lmge->?Sx`VskIs^=Z|uj_x?f5m1@z4}_{(6kiW zX+7uqYO-0-aH-C(>(usqmy!08ekgk9>}Chs5FRo5Q-KAy%|4Ab;G`%462~ZT_Xl5U zkjbn$tL9-?I~h)AH#~6+`vnbI$D_QQW3iu8)Wuz!2$Cw-EguSf7|7dIJK?8sBc6!J z`_H%MR`9~IhYLQTUny@#`W)}3F|~|7#37QIH=WFrjWwo@jv{M5$8T)JOiq|m`6CWp zziCU)J%ZG8017Q%VIQu^D*9q+_VIGZLjFz-8K)iM*JS5g8qU&?H=39!gS6hZ%KG$% z$ukA#lpDJEwG<}yRv6nJ5nM_0Q@k&w3~+A8PpEq#T)7$+G)Ce*6YOftds;nu^^BSZAd;jOCQ&qK%aOw_aHv_gg3i~MQGTaer|4L3T88c-!TQTlc3 zanCo)!?gCZpLg1eiFwJ~r*CD32w4@<@Q*TEXc{~jzn(w;FjnnSgHbbyN;3z)4Beq) z*3JpXJ+Oaa_;bl843n{ZG0HySmScqPm+Mjl&o*^d;6!18JfN0AR!ngb^iNo zT-x*eqeEfHPAbetdh?IHkuO0JDcY7kX)ZC8Mp##NhM3Pgg)c;4*CSKsy*xmHO$#-Mv zb07fFGrXEcU&w{%eV|Agz%+6S=p%#2BP5npZXaai&3D5DF8&X9k?Mc^#cKR6jsMp!v|5rxOio?6KX0}&~o|5dffyplE_Ip-7Q(Gq7d4jghjLa$`P}n6L1z7q1 zd&}vQz{gXGK+@;Ufq36}fF|OeV^%E-9|bDkLCT0z5yyQvcaE$RO~BA#c{51vU+~>e zBW*}gx7<_&hwn4pr4Av;p3ut=QB-zFD=8S(&(F;UB>41Ntvon>3+))Kype3=bit#&S#MTS50Ts?^7R(#m8JraTM44dF%-yisT8nsY3dDA=%~7)>@0~01s&oRhjJYl67az&3D?j zAL)ws#rBL+YZi#QA@)Z7fp!q>z{GC={b|;@Ux-8RJ(H^Wu=!1Y;Z96O9a^GpdQM=r z=Ty;p`7CJgg3_SJB9JWRafg|ew%u}>n!>Z_$dJ)u`<=mW&C+9>V-$CJggMz$ma^%A zT0fU+jYmbh>?6ol#S@v8V{!a=C)WC>n9qPXyq2`zz(YF-FI-;xY*pzcPPE8}$dZR`U z$33&vB@4>oEpFF61B>2Ls|sgEn*k$H;*5MSZ;7YYvmN8dEA9J~+)=iU>Tk*&F*oCN zX34Nx4Y4Y*@qD)DD`SC`^`WFxI%I)nK&H|gt@%QphjpE;W&7Qy>3Ii$D|OQN!<{CO zOKm)Fd1kp;g2o<@3LN0%tL79k)$5AbJ<&z@8WR%)N)|DzwdoNC#QC&lFm!}>)sSDD zqRVVDPND;FWxsTI<=MA>)~k4M6z2P);mNi|(0liVp&8iEbIuy0&4`#v1T&NxfkTDx zP_tu&>Mk~$P_iu`XnB`v!mf{>Ep;pe5Y6%VSeI_3!<>{(cGN7`X$qJ=bGasjQ6Oh3 zd>z!f*A1m*l8lUr)l6UiVp9aq*ggE5DU@kh7WqLl_yCmy znr$rU35u%AxP8f#WU6Ca<(tdlYy61-Mx8`NSr;!0STyq{bx()TIZhz?B>8yC6^(QAlsHG(N9yy^WHtwKc~6qiMN9qMG} zTwg}K>s%YT$KNx?4rwkz6tA5pnh?{*s5|Q>3XJqU_*9WI8}ik?vno6IGapCP=|=R88`V8$_;`m_czd(@WFTxd{%Bd9DAPe0Y#G}W6t_si^oIY zgv5_6x#8;`tefKJ!+SL0JKK>ZqDke_9JU@y)SNx5!Zmk zH0DG9mElggP6F=V0UM^M)V+i2?eEbFApt|tSox%b1iOnbx-cGE!g|1$q*V{Ep77kA zUdaCl??Tg`|6(>OW8~o2S>d_w$|MdvyU}v-W&8jX&IFUGvCKGZ)yad7~rKQ zMr_^JfyGp1iIF}*XtFuXXOlT!{%&Y|P}WRI+^5Sq2DN9;1Pon1UOVW*igwmsLe?+z z=Ren<+s4Op2x?mUeFmT{^gw@_41Vkg=?HlvRnw)Z$ZCl-JQR$%)4LfN{ z%87r*=Oa+6AdFokd`fv0FFH{7(f>73*L)hH{U~rB2c*TS!-PsJBvkDXfT>a-mary~ z6d&&fW4*)o=u(e2k(sJjV^+YzbuMiS4nKjldYKhdWTS38K9d9LD1(xw^W#gh=Zvnr=TrG5wyGK!snaR2gjqW!Q<9O^^BvRnWGCf{ z+9U&tK9e{K(XYell9qs0QXvXPuO0g7xg#~dcsRoFHui&x05(dpfg1noZNeYbDsog_DPY}9epIW5nr!cJ zvcLCxn+`$VN{t&!>JY_l<*#f8gk12&sO9rQO>)3A3Bu z5KCY?4{!bp>%3^DXR3TS{^0xlsN%6QFl4tF9^&@2G(Jq+@Z62P&?eQB6_vY${cPge zqG19n{J5o-Y^S1fcqkD$xQ$ZkoBz2E-mzzeF7}qu!~>&8KwlQYGeUic%2C-aP#ebQ z|3?wPcyzy_<_yY|>j7$=U0C@j5s z*a>utDu|Xpsq$|}fJYnoW{TFFT^-x9@B9-*JWo3`4KC`)<9OG?|T(nD`IW5Il zeX>fC9vLuTt;HK_S(9MsVa?BI?CR%w3V{AS4SXi^!=Xk-vUee4uC5(P*f_?;7fT)w zpIZsTnwkvW>2*8lt#FJoy-G6NSf`f{ppbd`Xv1r0c&~*u;s&K(L7e_-yrV<^U5K_V z%{V9Po2a4_+5xAzdCYX+TGN>7MiK+7!E@jI{i`gQf)8tmUQMPYyG(oT4EsPPE6gXJ z(o;2ev%clEd~C{RL>HV@DuU}hbFqo&A@r8l2Ts}gjNIaqo961Etlcx8d5u##kW_F} z%Xls0p>Ub={=|E+^uTfT_OazReoV25^Nu}~D&qwz5x}i)-n!YRPJ=U3FBPrvj4vFa-cZfA<$UND|#`H=;NzYOV~W#0F)-Ov1! ziEjeu4K{da!aB5zQixQL|M9~2CKGlevkq`g@`>0yKb;kSn#JxHP!l}1BgslLbQWcZ z<14>R#$e;ifH;b|5@dy%#{a^~{kl6IeGd|;_E2k%NU54L;>t}j8QNIyIiHG6-k3Br zd`gH)fe0@pc0#{Sh=NdV#5T9s3F-#{5eCx%r=*5_yhRk}QM#VEU5@-kxg9n;kOvib zJ@ara%w)e*eox*h#s)IlUC@&1Tk%FzAlrdLck4B);v$Zw&Uv4~0)0hGd-MkRkS!Ze zD6KNK4V76m-n-t7h=){Z(FKonbRIuWQg_WC=|X4AF3%jBY^YCYB>oCkKtugTf4?>K zVpzT0n>J|drK15^_OSJKvepm!itlw9`VErJL0`qDmch%dq4o4e)lQXY%Oj-XTqGnGs>ya>4IvOUxlO<2ZK$D+I&HkzZBNk-o20sb0}3 zD$2ae{FElV_>DU^YJ$y|{-&;+m>PBXV!-Tlp+Q<9pU`;x&&$*^b;ixg9o&J>Qnqij z2BOt$Y(05XO$6phZ$mkL-QhL+4Kmam`8u;AANd4$#b*d^tmU`KUY8amGS>EdFj()O z&p%v%8Yl&H1Wg7@wNyb?_TM~^#sjcGGrN{QXxa)Z93A6v+Uv;j0S`)Z+Rv0;gW14`jHvT-d7BG;64oQPPSU_OC_d99xksC9?9;*xxL~)je5VZL2nf=j0%UhN9 zb-%BH=clwx^-nyV={nP6*FszQ_8YrM^wBCRA#%)*32?CP4>(sNP)0lC+~>(m2HyGx0f;@U9UUXTHClIQZ=5 zVeD#Sth37bYlXBixDU0+M%mPhym~A4=&$n%?6j1KN6CM}0{|CdWC3mi0C%Avratqy zTXg10>C^&S^z4FJVK#zWGUl`d#qPM$))ou6aLW0u>QM&q*nV)lUHvg1TGx~dzdIHj zX4p;t7)cp~H{~ZL;(;Lh-VoFCiy$as1@>?%^9Sf7!*x74|HQ9F_5F~xN~7rsoQ1I! zzg>T{HW9mNN=rp z_@Wk#yMvOQX12;QoO^$tVaAJgRUBg|u)P7m${%?M9Gv`n@F8D{QU8m1Yo276z8bz4 zUC|$Rb(?R7U;G-TN5`$EwJgpEfEJ>^zryh2ss|Z=w}Zf2Qg?It!S76CYU9Vu=1S+3 za9+;6NB_Eg#%+h^elgrp2x=yg=a6j_QULzJrFG8%#BtT5391a|WuOGp<;xOq4WAAC zc-Fx3o*}dB=ILCJ7dtBa^&er@JXg}O`U7mdH>>eIe^Gn=Z%4hL7RXu0{I(Y5Tm@CF z0tM@~YtC7wn@guuX>MFf=L&lMt5eB{N#Ov_rn@eN3!-Jmv-HkK5+AH0C5PmLzJ1GO z;_?koOqomgYL1|GxW<|1Wu#D-NGIg=(~AHk=?ykz&AWx_LITkTZ0%61KiY+-+Pt{? z5Xm9h?u9qD-VH=jK{5GR^R7n@>3S+_y>R3u2)_$*UN0;7YaY2Rxs{ChBoL#Ta8aFr zkR9}M0Wo>n3y*-`=Egr5lTf=8zD2qHzSh&4FFT&z-5L7-C^#ythb;KrrRbXLU#QwI z-msU$uym-_@rKj1e2vWCTI2=+R{r32w$}#bQ{1rYscfH(>0^_`UDCic_laEetFM^O zu<4hcL#C5zdsd&V?$Nnzd{{Qe5wb@QAd#2Z0RP)Sqro5@6=zch*S-CXC>cU2pEJdR z?N_d%SE144<-avKQi+5d@!BI?Ru%A39QBCt8iU7?>PHPYK4uLv|54Kx z!n=dpD?endyrXIz7AUh>d~m*-<)$0IUH z{LhjDV_>KTZAM!_4;`i z7mRr230fy?-nnT<%FY`_n2rmrl$Fby+ejs^(E}2&eL6kqKbW@l$a-_2tzME|!NFXl zdFaKze?!0SJ(cX<>qFnOiFMMCqUPu6O?TbH?<&`{ zI?9J`i%Xt5oJxjR126fcpl<+P!zQPB071pkYW|z?=`cLD(-VgQ+JH1psVYi}*&s^{ zZnLOd1!rjHokc24%pqFLum2K<0%5$dFn;7Pc$=;D`_I^blkwu@BUkz3EyO&V_4hF| z4!ty$H{CukdW#9k*u$`knO*acmyMJ&k|7hhnMGk}>V>!XRfp#~`yLl&td_nxfy2-o z(c#9866N1rRhS@Df~z4we29%#%OrE5$4|4h@1`#1(k`^ePZ{*h(``q(uv=onOiQ(8 zNs`^vG$AR+?DuHvw|vOAL_97qTgCMEOvGhw2_6n9vi_Do=xbtq!7UY~S_x7$?`l;U zih->bXCwt`4l2$wp(1v|7PYR`r52;V%+lmBzN+m)Ng=sLghP*b1xv4_hjU{)VS3fwX}Z5bqi5%}i$pV@X#4y$M7| zvV?39>J>dS!aH9qwA;25a62RE506U`P_qaiSwBuB40K|0b42Ll7eQkFi&&17uX&sAnZa){v;?F^we{5+C61J`Vc*c`f(lF<`|5~-j z1R(OLsdC7u}61)0R4_-bNV>QqYVNe_8lK3t z91@`4RVeak8%}yn@&`_L5Nq+v3nVXS^>gEN9f1@4bdjR!ZLKzDGIO0ag08z;`~X`T zMk$B^eph+wJa)#uaeg#LYO_e%le*pIe*PuOQlEp(zQi`NZ9(H1@#hBITVki1o?qSF zqMsiKmoWCX%K!}0VaZ6T>Q{6Zn!|C>+nYZCu~4tuxnJJ#f`5rUf~6#GFr(ea(|~i; zPvsZvHftde_gB}W*`)Q6IA%VX7UkH-z@Rgy^nm5k?408^n|#^S+@jbMU4oF&1ag0@ zcG|~QnBPhI-aLt789Qy_svWST7w^x>$~r$k|4FpM#QTce7H82h8O;QJ$`ette_Bc zm{Hb6CQ8!U7OkL9oQ9azf=!lN^Cg&;r|jZ1g7yyY%shVgp$~@WR%WGm44=NW7>INq z8?3mKzES#_y1g#EB%m(r_dIHd{G?(up`|0yQH-&r;|`?b_f+0>D0iI=7&LiR50>(1 zU1R!G)^vny|5>zi;DDaOhfToCVXt>=6!)&r>r%bw=8Fpnpd$Bv8$6*6RPMEd9a!02 z%sF$8oU@Vvb@^ zy?xQjN8f;6T#`_B{k3^Q#Kpxu1v``^x=hNvjqpK^^CEA<;ms%VAC&R_f`@zHBS0Y* zq?wic4iM_s2MRp?$o#q))?&ldq#^)4dL}PunrsWeiu{$(DYbnoRDLVG{BSkhae=OT z{B(bY0ReQ3t>qVedVYS62+)Y?MvstXABec?PW%y8HL8wR&nqr2)z4$lTnpiH+o1+k z&SO~2Wl2;>85FDo`3m^@S(3M3YAs|1xE(x<`R!1%^-(kNSGAq~UF=?LM2pPiRSt2J z%d2IE--?6%Y(jWT)wT|fq`%cBddyUW_EaK$J12aQ&7>WNwQQ45Axy09L!b+LofUs| zh6)W2zBwlclM{~Lare*`8V5yx>X}D{AvKp&0WxR8(|V7eQO7=@zO$|4HY3u%J1iL8ggpr+W&TzWjCe;O4yw z{d?0GCCL)I_srtaDk+KB1^B1ZLK#lB_V*BGI$b&z-Ie=e$I4xZ$}xZRO~QH9`k{#p zYt%0{*w8wDBYV4^${c*`*iZ9DXkOXxwDnGCg6$hKzE$!l>MlJMV)T#S{~!0CAdm$b z(L;>|#v;#FS{;{u*LAS)?mXJ^;`MWA03Ii86u`n3XMnxnTZxmy3zf|~Zb&LOAqPiR zesJ5JFd*;Z4ocbL^p&7yvh0lLeBX8;3Pvukze=qKo)F_f$ps)UyHk80{a2jvU-$bb z)F8TFneU3^e#@IV9X?Fl1TC$G)7lGqoa9Hj;pm6;K%Qb@BKrGW#52JpPe@z>(L!_D z!(pnaw77Or9|I5H}GwGwgor+|O0m z=uR@q7innk>ZXLpX!kxXj|Or`@%Yua@P?`p333W!yA|8Xjq!$F*W!1W`na@7hl?^Y zR3J&c?mM%P&vO3=C?l@w3C2HJnwUs7Y<++>+Inq1JddAQ_Y9#~;+!l$vyzu*+$*-X ze7EF2YOto>-LciuulLVe3B4~1#8f{Xa;G2awolR$wR;><_^b$JLhKP{-7b`o^iYWc zTNm%5;`T|45Ldg9j^2fK=b@<~ULkNF^^7qHZU{#QcEc)BSpQ9acGoQ;nH+TNZ)5fQ z>8(@oDiU}AR22EC@{8NR+SO0?eaVnZGG~22^2*x$_R^433HprV^HN4ui>~(*C-CL#kB$@T9_XxyNu-~iFDP#F(xANsa~D@qL@_cwRyxt$yOca3eNVkc zfWYdyXI{gOuSp_S%qoH0e{aWqmD8ohu6~?MPp^D@{^k?JS!sVJ${Yl}b=Dly<%92n zVr!P_jrdj6KTH7i&7=Ezjj1NI3!OZ%zmGS4(SN&NWJjaHIP> z{a?ywEBPD%{wij?Qa*@_xYbjpZxa7_WjXLNGk>TzarRUA3X6O|Do)^4gWb}2jU@!p)?zm z|F7nMTZam9ep1kB2AqF)4_ax))pZ#9&2z%@VgRqV$v2roiA7D#+e*EQ-}SmaJVlQ$ z8+SjcAFVx~isFiB1A2m4SXm#9-Rbeo5;bA}*X93nS$o}JU`}XyT$zzhj*wQ@yXl$Z zXbhCrB6<2L-5w6GTGk~HggLy-pG&$FNNdEJ2i9>fcmTs%G81m*T8$>N!{baIqB)Py z!vXa>bTjK`k*oV*^Tz|g&RI%8YA3GU(8QLBxo}%RfK}slfr^t78m2DZ7O*-aa)tWX z_3l>~KG{x3Gp*Y<5LmG*#RZ6K9N$K58-BeO2I0f3< zV`&ZYSRPzdQCR5uL%nhBzj=AHL4V8OMJ+pUJk^%Fh^xvg$}($90H$ePd7KzD3HTuQ zzG$xAU2g8>D@GzPjkznkf5#-r9Gh^7>$62H_aXk~7p1UIEARl}5+|Gw;E@=3)3-(U zTVs>A02(+rov_?wksoJ7hh+0YL2R-IB=eWn`J%;i=b-1v*Ny0(+CtXs%PwbXBO1##-=>pbSZu?CG3gA# zO)XM!Ox7}M0o!!SfC}RK5C`@!cwx%zRN4HG#gB>K{z!fPd3!g&V#0kjjanvW=S4tMNYe+%1c_f4{UA=VBf)r#h+)M zD?_sveFw|qN3Jx|e>@wl>{>Rz{NYV!VI=E$Tt*jdvJ+vsUj)ym2b_bZL3O%sMnw8mL`lSYo;EvfK8;x4q}uPsyhvLEXihJ(^ba`q<7 zMQ|0g=A3{8S>z@PDHu<{?3tx4ik7pJX&~Trf_v9=g$XmhOEdVnBWZsZPW^v8c1%7S zlv-h?l&w>ShTFw+s7PT!-;O!Y@yR_!S@N`!57tE<)9zZ@!zX!e9keG{22I2}!uYsC z=#q*_8TC|=q{^ejH*^6n8d`^24=@Yud<4xoWKQk4pR!Y4Y6FyvY@sBk0C72K4=OaP~dD^z!4U|+w>KxQg~V( za^Ubw^3pWfbYjlRk7eQ8h$YW0Y-Y!Q@I+fIioe~tG?a-lW93$`&n+hj{4b{L;ZW-SPUeZndB@-*CV1R%cGw5D%fpX6v|O#Dy0RyN|<<-y~q;{j*lvjXh6M zD^xfwvk-kayq>6cMva4In-ju@!99fmG zpP}ui1u$|78CR-zF0nf#Plz8y_le)JuH@I}6H8;|pHf%=08)8olh#D&5z1qy9nlx{ zB7!}MuD5pz_tmW6dY@CEu9<0@hV|Zu>S#(`8;!W&Eb&&JS3kJ=M8xD%T8}Lz**_F0 zY!N-AWPU_T$M(ar-;h-~Iyg8uv_mm`QcnHS!3FXgbEVmCcsjdUTG19$N0V`W3$6Nm z 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 p|z=Z8++4des5H27WcBe+xPty;QQ~x>5MJA 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 KDg6Q2~h=?H35-nkl;|Od-UUIlh+amQ=%V-D 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≧y%|9oozo%$=7i-aE{(uO1xB58m z2IEs|CE2Vze8p21#8&Qj7(^qhCp@N#=F6fsK9rbXh_H3~N{3s9z|by~Cw$#P)+MgqKHT&zZY`*)^)$cDCC$1Un+3ki;g#&3<(*5|lpw$~4qs;uv3L>a**JWILHL+c z{>851hX^5Y2wC9V_OU)AZHUWeX4Wl^PZH(h5MSGv zUq`nuUu)%7o3pH#RqmP5EG&(jkTEZKsDJRBDl=4hSXz|!@zMCwGenel&WOXRQ1(+F zS$+j7#=@@GwCI>ViLO?cahS8qYeqE>DZ`qTV@dgH1rT9d>Dr(B9$wuysmY^G+zp=+ zPsWL*?eGb!D=Ij{jro^5AsNrZKJM?Z0Cb`8e-a(~BGjC(pJt9%yY<{j8G+dQ5qW-s z$;U|pE65o}vBqT(PqN=xdJ~*&xAWxs=}oY3aV;%tLV4j5H$1rvV9A>eW|%ZK`S^%| zZBzZZSZq`ArsdfcP>(YL5thR~w-i8YCXEHUOezbz1aF?-J z!&@kq|8sXe+tIR-0}WNmg|7Zp%Tox5XiY^;Bt&jowYzFkQKWaG5##%9Rj#Shgk>-4 z#TgaJ|Jdm8h2ssUkH?=$O_DID4BN6rf+pgKpD0L?v|{D)sAAOC)&|MWrudCY3+B$r z3K6+AwbZZ7`GcA12urH?aXqL}%@<1A|=_7 zTWlYuQvcau{*8G`5+|XenU+RBC-c@^Uo7`yt!1pfgM|=lUyGqwn!EOytL`tQH%^Rn zRR~$CaeIjr?tF;~Oy5*kDLl;eGUrtc%0Dh;zGk9~W5KQ5`qc$RmWo~9tM9z3IB+Kh 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≪Q56>xn>wK5};YJ!DMqhY%^ZOQnd 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 literal 0 HcmV?d00001 diff --git a/docs/.vuepress/dist/assets/js/1.77d89b12.js b/docs/.vuepress/dist/assets/js/1.77d89b12.js new file mode 100644 index 0000000000..2ba319f5b9 --- /dev/null +++ b/docs/.vuepress/dist/assets/js/1.77d89b12.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[1],{174:function(n,w,o){}}]); \ No newline at end of file diff --git a/docs/.vuepress/dist/assets/js/10.f9e7d997.js b/docs/.vuepress/dist/assets/js/10.f9e7d997.js new file mode 100644 index 0000000000..6d4fb11193 --- /dev/null +++ b/docs/.vuepress/dist/assets/js/10.f9e7d997.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[10],{229:function(t,s,a){"use strict";a.r(s);var e=a(0),n=Object(e.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"content"},[a("h1",{attrs:{id:"customization"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#customization","aria-hidden":"true"}},[t._v("#")]),t._v(" Customization")]),t._v(" "),a("p",[t._v("In keeping with the Node.js philosophy, Strapi aims to keep its core as small\nas possible, delegating all but the most critical functions to separate modules.")]),t._v(" "),a("p",[t._v("Generators are designed to make it easier to customize the "),a("code",[t._v("$ strapi new")]),t._v("\nand "),a("code",[t._v("$ strapi generate")]),t._v(" command-line tools, and provide better support\nfor different user features, custom admin panel, configuration options,\nview engines, etc.")]),t._v(" "),a("p",[t._v("Custom generators are linked to your machine aiming to have your personal\nconfiguration and features at any time, for every application.")]),t._v(" "),a("p",[t._v("You can edit your custom generators inside the "),a("code",[t._v(".strapirc")]),t._v(" file at "),a("code",[t._v("$HOME")]),t._v(".")]),t._v(" "),a("p",[t._v("First, make sure you this file exists:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("$ strapi config\n")])])]),a("p",[t._v("This file should look like this:")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"generators"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("At this time, you don't have any custom generators on your machine.")]),t._v(" "),a("p",[t._v("In your "),a("code",[t._v(".strapirc")]),t._v(" file, a custom generator is an object with three keys:")]),t._v(" "),a("ul",[a("li",[a("code",[t._v("repository")]),t._v(": the Git repository to clone.")]),t._v(" "),a("li",[a("code",[t._v("remote")]),t._v(": the current remote to pull updates from.")]),t._v(" "),a("li",[a("code",[t._v("branch")]),t._v(": the branch you want to pull updates from.")])]),t._v(" "),a("p",[t._v("For example, to add a custom "),a("code",[t._v("blog")]),t._v(" generator, follow this:")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"generators"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"blog"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"repository"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"git@github.com:username/strapi-generate-blog.git"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"remote"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"origin"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"branch"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"master"')]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("Once you have updated your "),a("code",[t._v(".strapirc")]),t._v(" file, you need to clone and/or update your\ngenerators. To do so, just execute:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("$ strapi update\n")])])]),a("p",[t._v("This command will clone every new repository written in your configuration file\nand pull the latest updates for the other ones.")]),t._v(" "),a("p",[t._v("Then, you can generate your "),a("code",[t._v("blog")]),t._v(" files inside your project with:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("$ strapi generate blog\n")])])])])}],!1,null,null,null);n.options.__file="customization.md";s.default=n.exports}}]); \ No newline at end of file diff --git a/docs/.vuepress/dist/assets/js/11.bfb9de0f.js b/docs/.vuepress/dist/assets/js/11.bfb9de0f.js new file mode 100644 index 0000000000..9f24d5a777 --- /dev/null +++ b/docs/.vuepress/dist/assets/js/11.bfb9de0f.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[11],{228:function(t,s,a){"use strict";a.r(s);var n=a(0),e=Object(n.a)({},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"content"},[t._m(0),t._v(" "),a("p",[t._v("Strapi contains a set of tools to send emails. This part is based on the\nfamous email node module: "),a("a",{attrs:{href:"http://nodemailer.com",target:"_blank",rel:"noopener noreferrer"}},[t._v("Nodemailer"),a("OutboundLink")],1),t._v(".")]),t._v(" "),t._m(1),t._v(" "),t._m(2),t._v(" "),t._m(3),a("p",[t._v("Options:")]),t._v(" "),t._m(4),t._v(" "),t._m(5),t._v(" "),a("p",[t._v("The email service allows you to easily send emails from anywhere in your application.")]),t._v(" "),a("p",[t._v("Usage as a promise (yieldable) :")]),t._v(" "),t._m(6),a("p",[t._v("Usage with a callback :")]),t._v(" "),t._m(7),t._m(8),t._v(" "),a("p",[t._v("The email API is a simple API which can be used from your client (front-end, mobile...) application.")]),t._v(" "),a("p",[t._v("Route used to send emails:")]),t._v(" "),t._m(9),a("p",[t._v("Request payload:")]),t._v(" "),t._m(10),a("p",[t._v("Response payload:")]),t._v(" "),t._m(11),t._m(12),t._v(" "),a("p",[t._v("Each sent email is registered in the database. So you can retrieve them whenever\nyou want. However, you can disable this option by overriding the email service logic.")])])},[function(){var t=this.$createElement,s=this._self._c||t;return s("h1",{attrs:{id:"email"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#email","aria-hidden":"true"}},[this._v("#")]),this._v(" Email")])},function(){var t=this.$createElement,s=this._self._c||t;return s("h2",{attrs:{id:"email-config"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#email-config","aria-hidden":"true"}},[this._v("#")]),this._v(" Email config")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("To change the STMP config, edit the "),s("code",[this._v("./api/email/config/environments/development/smtp.json")]),this._v(" file.")])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"smtp"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"from"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"test"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"service"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"name"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('""')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"user"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('""')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"pass"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('""')]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("ul",[a("li",[a("code",[t._v("from")]),t._v(" (string): The email address used to send emails.")]),t._v(" "),a("li",[a("code",[t._v("service")]),t._v(" (object): The SMTP service info:\n"),a("ul",[a("li",[a("code",[t._v("name")]),t._v(" (string): Name of the service used to send emails (eg. "),a("code",[t._v("Gmail")]),t._v(").")]),t._v(" "),a("li",[a("code",[t._v("user")]),t._v(" (string): Username of the service used (eg. "),a("code",[t._v("john@gmail.com")]),t._v(").")]),t._v(" "),a("li",[a("code",[t._v("pass")]),t._v(" (string): Password of the username used (eg. "),a("code",[t._v("12356")]),t._v(").")])])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("h2",{attrs:{id:"email-service"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#email-service","aria-hidden":"true"}},[this._v("#")]),this._v(" Email service")])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[t._v("strapi"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("api"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("email"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("services"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("email"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("send")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token keyword"}},[t._v("from")]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'contact@company.com'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token comment"}},[t._v("// Sender (defaults to `strapi.config.smtp.from`).")]),t._v("\n to"),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{attrs:{class:"token string"}},[t._v("'john@doe.com'")]),a("span",{attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token comment"}},[t._v("// Recipients list.")]),t._v("\n html"),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'

Hello John

'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token comment"}},[t._v("// HTML version of the email content.")]),t._v("\n text"),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'Hello John'")]),t._v(" "),a("span",{attrs:{class:"token comment"}},[t._v("// Text version of the email content.")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("then")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("log")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token keyword"}},[t._v("catch")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("err"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("log")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("err"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[t._v("strapi"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("api"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("email"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("services"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("email"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("send")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token keyword"}},[t._v("from")]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'contact@company.com'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token comment"}},[t._v("// Sender (defaults to `strapi.config.smtp.from`).")]),t._v("\n to"),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{attrs:{class:"token string"}},[t._v("'john@doe.com'")]),a("span",{attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token comment"}},[t._v("// Recipients list.")]),t._v("\n html"),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'

Hello John

'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token comment"}},[t._v("// HTML version of the email content.")]),t._v("\n text"),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'Hello John'")]),t._v(" "),a("span",{attrs:{class:"token comment"}},[t._v("// Text version of the email content.")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("err"),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" data"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("err"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("log")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("err"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("log")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("h2",{attrs:{id:"email-api"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#email-api","aria-hidden":"true"}},[this._v("#")]),this._v(" Email API")])},function(){var t=this.$createElement,s=this._self._c||t;return s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[this._v("POST /email\n")])])])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token keyword"}},[t._v("from")]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'contact@company.com'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token comment"}},[t._v("// Optional : sender (defaults to `strapi.config.smtp.from`).")]),t._v("\n to"),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{attrs:{class:"token string"}},[t._v("'john@doe.com'")]),a("span",{attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token comment"}},[t._v("// Recipients list.")]),t._v("\n html"),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'

Hello John

'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token comment"}},[t._v("// HTML version of the email content.")]),t._v("\n text"),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'Hello John'")]),t._v(" "),a("span",{attrs:{class:"token comment"}},[t._v("// Text version of the email content.")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"sent"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("true")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"from"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"contact@company.com"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"to"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"john@doe.com"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"html"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"

Hello John

"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"text"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"Hello John"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"template"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"default"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"lang"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"en"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"createdAt"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"2015-10-21T09:10:36.486Z"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"updatedAt"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"2015-10-21T09:10:36.871Z"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"id"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token number"}},[t._v("2")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("h2",{attrs:{id:"email-model"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#email-model","aria-hidden":"true"}},[this._v("#")]),this._v(" Email model")])}],!1,null,null,null);e.options.__file="email.md";s.default=e.exports}}]); \ No newline at end of file diff --git a/docs/.vuepress/dist/assets/js/12.124227d1.js b/docs/.vuepress/dist/assets/js/12.124227d1.js new file mode 100644 index 0000000000..b2d49d4fbe --- /dev/null +++ b/docs/.vuepress/dist/assets/js/12.124227d1.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[12],{227:function(t,s,a){"use strict";a.r(s);var n=a(0),e=Object(n.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"content"},[a("h1",{attrs:{id:"graphql"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#graphql","aria-hidden":"true"}},[t._v("#")]),t._v(" GraphQL")]),t._v(" "),a("p",[t._v("GraphQL is a data querying language that allows you to execute complex nested\nrequests between your clients and server applications.")]),t._v(" "),a("h2",{attrs:{id:"configuration"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#configuration","aria-hidden":"true"}},[t._v("#")]),t._v(" Configuration")]),t._v(" "),a("p",[t._v("By default, GraphQL is enabled and the HTTP endpoint is "),a("code",[t._v("/graphql")]),t._v(".\nYou can override this settings in the "),a("code",[t._v("./config/general.json")]),t._v(" file.")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"graphql"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"enabled"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("true")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"route"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"/graphql"')]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("Options:")]),t._v(" "),a("ul",[a("li",[a("code",[t._v("enabled")]),t._v(" (boolean): Enabled or disabled GraphQL.")]),t._v(" "),a("li",[a("code",[t._v("route")]),t._v(" (string): Change GraphQL endpoint.")])]),t._v(" "),a("p",[t._v("Note: If GraphQL is disabled, the GraphQL global variable is not exposed.")]),t._v(" "),a("h2",{attrs:{id:"execute-simple-query"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#execute-simple-query","aria-hidden":"true"}},[t._v("#")]),t._v(" Execute simple query")]),t._v(" "),a("h3",{attrs:{id:"programmatically"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#programmatically","aria-hidden":"true"}},[t._v("#")]),t._v(" Programmatically")]),t._v(" "),a("p",[t._v("Strapi takes over GraphQL natively. We added a function called "),a("code",[t._v("query")]),t._v(" to execute\nyour query without given as a parameters the GraphQL schemas each time.")]),t._v(" "),a("p",[t._v("An example of how to use "),a("code",[t._v("query")]),t._v(" function:")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token comment"}},[t._v("// Build your query")]),t._v("\n"),a("span",{attrs:{class:"token keyword"}},[t._v("const")]),t._v(" query "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'{ users{firstName lastName posts{title}} }'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{attrs:{class:"token comment"}},[t._v("// Execute the query")]),t._v("\ngraphql"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("query")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("query"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("then")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("result"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("log")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("result"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token keyword"}},[t._v("catch")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("error"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("log")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("error"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("And the JSON result:")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"users"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"firstname"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"John"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"lastname"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"Doe"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"posts"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),a("span",{attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"title"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"First title..."')]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"title"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"Second title..."')]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"title"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"Third title..."')]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" \n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"firstname"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"Karl"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"lastname"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"Doe"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"posts"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),a("span",{attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"title"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"Fourth title..."')]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" \n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h3",{attrs:{id:"with-a-http-request"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#with-a-http-request","aria-hidden":"true"}},[t._v("#")]),t._v(" With a HTTP request")]),t._v(" "),a("p",[t._v("Strapi also provides a HTTP GraphQL server to execute request from your front-end application.")]),t._v(" "),a("p",[t._v("An example of how to execute the same request as above with a HTTP request with jQuery.")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[t._v("$"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token keyword"}},[t._v("get")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'http://yourserver.com/graphql?query={ users{firstName lastName posts{title}} }'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("log")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("h2",{attrs:{id:"execute-complex-queries"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#execute-complex-queries","aria-hidden":"true"}},[t._v("#")]),t._v(" Execute complex queries")]),t._v(" "),a("h3",{attrs:{id:"query-parameters"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#query-parameters","aria-hidden":"true"}},[t._v("#")]),t._v(" Query parameters")]),t._v(" "),a("p",[t._v("If you're using Waterline ORM installed by default with Strapi, you have access to\nsome Waterline query parameters in your GraphQL query such as "),a("code",[t._v("sort")]),t._v(", "),a("code",[t._v("limit")]),t._v(" or "),a("code",[t._v("skip")]),t._v(".\nStrapi also provides the "),a("code",[t._v("start")]),t._v(" and "),a("code",[t._v("end")]),t._v(" parameters to select records between two dates.")]),t._v(" "),a("p",[t._v("This example will return 10 users' records sorted alphabetically by "),a("code",[t._v("firstName")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token keyword"}},[t._v("const")]),t._v(" query "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'{ users(limit: 10, sort: \"firstName ASC\"){firstName lastName post{title}} }'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("You can access to the 10 next users by adding the "),a("code",[t._v("skip")]),t._v(" parameter:")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token keyword"}},[t._v("const")]),t._v(" query "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'{ users(limit: 10, sort: \"firstName ASC\", skip: 10){firstName lastName posts{title}} }'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("And you also can select those records in a period between two dates with the "),a("code",[t._v("start")]),t._v(" and "),a("code",[t._v("end")]),t._v(" parameters:")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token keyword"}},[t._v("const")]),t._v(" query "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('\'{ users(limit: 10, sort: "firstName ASC", skip: 10, start: "09/21/2015", end:" 09/22/2015"){firstName lastName posts{title}} }\'')]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("h3",{attrs:{id:"useful-functions"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#useful-functions","aria-hidden":"true"}},[t._v("#")]),t._v(" Useful functions")]),t._v(" "),a("p",[t._v("Strapi comes with a powerful set of useful functions such as "),a("code",[t._v("getLatest")]),t._v(", "),a("code",[t._v("getFirst")]),t._v(" and "),a("code",[t._v("count")]),t._v(".")]),t._v(" "),a("p",[t._v("Returns the 5 latest users from the September 27th 2015 at 8:59:59 PM:")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token keyword"}},[t._v("const")]),t._v(" query "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'{ getLatestUsers(count: 5, start: \"9/27/2015 20:59:59\"){firstName lastName posts{title}} }'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("Returns the 5 first users:")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token keyword"}},[t._v("const")]),t._v(" query "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'{ getFirstUsers(count: 5){firstName lastName posts{title}} }'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("Returns the number of subscribers the September 28th 2015:")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token keyword"}},[t._v("const")]),t._v(" query "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('\'{ countUsers(start: "9/28/2015", end: "9/28/2015") }\'')]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])])}],!1,null,null,null);e.options.__file="graphql.md";s.default=e.exports}}]); \ No newline at end of file diff --git a/docs/.vuepress/dist/assets/js/13.d8092700.js b/docs/.vuepress/dist/assets/js/13.d8092700.js new file mode 100644 index 0000000000..cb79396dc9 --- /dev/null +++ b/docs/.vuepress/dist/assets/js/13.d8092700.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[13],{226:function(t,s,a){"use strict";a.r(s);var n=a(0),e=Object(n.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"content"},[a("h1",{attrs:{id:"internationalization"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#internationalization","aria-hidden":"true"}},[t._v("#")]),t._v(" Internationalization")]),t._v(" "),a("p",[t._v("Strapi provides built-in support for detecting user language preferences and translating\nstatic words/sentences.")]),t._v(" "),a("h2",{attrs:{id:"i18n-settings"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#i18n-settings","aria-hidden":"true"}},[t._v("#")]),t._v(" i18n settings")]),t._v(" "),a("p",[t._v("Settings for localization/internationalization may be configured in "),a("code",[t._v("strapi.config.i18n")]),t._v(".\nThe most common reason you'll need to modify these settings is to edit the list of your\napplication's supported locales and/or the location of your translation stringfiles.")]),t._v(" "),a("h2",{attrs:{id:"locales"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#locales","aria-hidden":"true"}},[t._v("#")]),t._v(" Locales")]),t._v(" "),a("p",[t._v("Strapi reads JSON-formatted translation files from your project's "),a("code",[t._v("./config/locales")]),t._v("\ndirectory. Each file corresponds with a locale (usually a language) that your backend will support.\nThese files contain locale-specific strings (as JSON key-value pairs) that you can use in your\nviews, controllers, etc.")]),t._v(" "),a("p",[t._v("When your server is in "),a("code",[t._v("production")]),t._v(" mode it will read these files only once and then cache\nthe result. It will not write any updated strings when in "),a("code",[t._v("production")]),t._v(" mode.")]),t._v(" "),a("p",[t._v("Otherwise, the files will be read on every instantiation of the "),a("code",[t._v("i18n")]),t._v(" object.\nAdditionally newly-detected strings will be automatically added, and written out,\nto the locale JSON files.")]),t._v(" "),a("p",[t._v("These files contain locale-specific strings (as JSON key-value pairs) that you can use in your views,\ncontrollers, etc. Here is an example locale file ("),a("code",[t._v("./config/locales/fr.json")]),t._v("):")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"Hello!"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"Bonjour!"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"Hello %s, how are you today?"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"Bonjour %s, comment allez-vous aujourd\'hui ?"')]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("Note that the keys in your stringfiles are case sensitive and require exact matches.\nThere are a few different schools of thought on the best approach here, and it really depends on\nwho/how often you'll be editing the stringfiles in the future. Especially if you'll be\nediting the translations by hand, simpler, all-lowercase key names may be preferable for maintainability.")]),t._v(" "),a("p",[t._v("For example, here's another pass at "),a("code",[t._v("./config/locales/fr.json")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"hello"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"Bonjour!"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"hello-how-are-you-today"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"Bonjour %s, comment allez-vous aujourd\'hui ?"')]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("And here's "),a("code",[t._v("./config/locales/en.json")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"hello"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"Hello!"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"hello-how-are-you-today"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"Hello %s, how are you today?"')]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("You can also nest locale strings. But a better approach would be to use "),a("code",[t._v(".")]),t._v(" to represent nested strings.\nFor example, here's the list of labels for the index page of a user controller:")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"user.index.label.id"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"User ID"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"user.index.label.name"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"User Name"')]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h2",{attrs:{id:"translate-responses"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#translate-responses","aria-hidden":"true"}},[t._v("#")]),t._v(" Translate responses")]),t._v(" "),a("p",[t._v("Locales are accessible from everywhere in your application.")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("body "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("i18n"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("__")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'hello-how-are-you-today'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'John'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token comment"}},[t._v('// => "Hello John, how are you today?"')]),t._v("\n")])])]),a("p",[t._v("Different plural forms are supported as a response to "),a("code",[t._v("count")]),t._v(" with "),a("code",[t._v("this.i18n.__n(one, other, count)")]),t._v(".")]),t._v(" "),a("p",[t._v("Use "),a("code",[t._v("this.i18n.__n()")]),t._v(" as you would use "),a("code",[t._v("this.i18.__()")]),t._v(" directly:")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("body "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("i18n"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("__n")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'%s cat'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'%s cats'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token number"}},[t._v("1")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token comment"}},[t._v('// => "1 cat"')]),t._v("\n\n"),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("body "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("i18n"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("__n")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'%s cat'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'%s cats'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token number"}},[t._v("3")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token comment"}},[t._v('// => "3 cats"')]),t._v("\n")])])]),a("p",[t._v("Or from locales:")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"catEat"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"one"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"%d cat eats the %s"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"other"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'%d cats eat the %s'")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("body "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("i18n"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("__n")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'catEat'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token number"}},[t._v("10")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'mouse'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token comment"}},[t._v('// => "10 cats eat the mouse"')]),t._v("\n")])])])])}],!1,null,null,null);e.options.__file="internationalization.md";s.default=e.exports}}]); \ No newline at end of file diff --git a/docs/.vuepress/dist/assets/js/14.7cfd4cb8.js b/docs/.vuepress/dist/assets/js/14.7cfd4cb8.js new file mode 100644 index 0000000000..cddcca36b9 --- /dev/null +++ b/docs/.vuepress/dist/assets/js/14.7cfd4cb8.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[14],{225:function(t,e,a){"use strict";a.r(e);var s=a(0),n=Object(s.a)({},function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"content"},[t._m(0),t._v(" "),a("hr"),t._v(" "),t._m(1),t._v(" "),a("hr"),t._v(" "),a("p",[t._v("Strapi is an open-source Node.js rich framework for building applications and services.")]),t._v(" "),a("p",[t._v("Strapi enables developers to focus on writing reusable application logic instead of spending time\nbuilding infrastructure. It is designed for building practical, production-ready Node.js applications\nin a matter of hours instead of weeks.")]),t._v(" "),a("p",[t._v("The framework sits on top of "),a("a",{attrs:{href:"http://koajs.com/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Koa"),a("OutboundLink")],1),t._v(". Its ensemble of small modules work\ntogether to provide simplicity, maintainability, and structural conventions to Node.js applications.")]),t._v(" "),t._m(2),t._v(" "),t._m(3),t._v(" "),a("p",[t._v("Install the latest stable release with the npm command-line tool:")]),t._v(" "),t._m(4),t._m(5),t._v(" "),a("p",[t._v("You now are able to use the Strapi CLI. Simply create your first application and start the server:")]),t._v(" "),t._m(6),a("p",[t._v("The default home page is accessible at "),a("a",{attrs:{href:"http://localhost:1337/",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://localhost:1337/"),a("OutboundLink")],1),t._v(".")]),t._v(" "),t._m(7),t._v(" "),t._m(8),t._m(9),t._v(" "),t._m(10),t._m(11),t._v(" "),t._m(12),t._v(" "),t._m(13),t._v(" "),t._m(14),a("p",[t._v("This will generate a Strapi application without:")]),t._v(" "),t._m(15),t._v(" "),a("p",[t._v("This feature allows you to only use Strapi for your HTTP server structure if you want to.")]),t._v(" "),t._m(16),t._v(" "),a("p",[t._v("The Strapi Studio allows you to easily build and manage your application environment\nthanks to a powerful User Interface.")]),t._v(" "),a("p",[t._v("Log into the Strapi Studio with your user account ("),a("a",{attrs:{href:"http://studio.strapi.io",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://studio.strapi.io"),a("OutboundLink")],1),t._v(")\nand follow the instructions to start the experience.")]),t._v(" "),t._m(17),t._v(" "),a("blockquote",[a("p",[t._v("We advise you to use our Studio to build APIs. To do so, you need to create a Strapi account.\n"),a("a",{attrs:{href:"http://studio.strapi.io",target:"_blank",rel:"noopener noreferrer"}},[t._v("Go to the Strapi Studio to signup"),a("OutboundLink")],1),t._v(".\nStudio is dedicated to developers to build applications without writing\nany single line of code thanks to its powerful set of tools.")])]),t._v(" "),a("p",[t._v("After creating an account on the Strapi Studio, you are able to link your machine to your\nStrapi Studio account to get access to all features offered by the Strapi ecosystem.\nUse your Strapi account credentials.")]),t._v(" "),t._m(18),t._m(19),t._v(" "),t._m(20),t._v(" "),a("p",[t._v("Building on top of Strapi means your application is written entirely in JavaScript,\nthe language you and your team are already using in the browser.")]),t._v(" "),a("p",[t._v("Since you spend less time context-shifting, you're able to write code in a more consistent style,\nwhich makes development more productive.")]),t._v(" "),a("p",[t._v("The entire Strapi framework is written in ES2015.")]),t._v(" "),t._m(21),t._v(" "),a("p",[t._v("Strapi provides a robust layer for fundamental web applications to help you write your business\nlogic, without obscuring Node.js features that you know and love. Our goal is to make writing\nbusiness logic much easier than other frameworks.")]),t._v(" "),t._m(22),t._v(" "),a("p",[t._v("Strapi comes with a generator that help jumpstart your application's backend without writing any code. Just run:")]),t._v(" "),t._m(23),a("p",[t._v("and you'll get an API that lets you read, paginate, sort, filter, create, destroy, update,\nand associate cars.")]),t._v(" "),t._m(24),t._v(" "),a("p",[t._v("We take security very seriously. This is why Strapi comes with several security layers that just work\ndepending on your needs. Strapi provides configuration for CORS, CSRF, CSP, X-Frame-Options, XSS, HSTS,\nHTTPS, SSL, proxy, IP filtering and ships reusable security policies.")]),t._v(" "),a("p",[t._v("No matter what you need to secure, Strapi is the right tool to make it right.")]),t._v(" "),t._m(25),t._v(" "),a("p",[t._v("Strapi comes installed with a powerful ORM/ODM called Waterline, a datastore-agnostic tool that\ndramatically simplifies interaction with one or more databases.")]),t._v(" "),a("p",[t._v("It provides an abstraction layer on top of the underlying database, allowing you to easily query\nand manipulate your data without writing vendor-specific integration code.")]),t._v(" "),a("p",[t._v("Strapi offers a new take on the familiar relational model, aimed at making data modeling more practical.\nYou can do all the same things you might be used to (one-to-many, many-to-many), but you can also assign\nmultiple named associations per-model. Better yet, you can assign different models to different databases,\nand your associations/joins will still work, even across NoSQL and relational boundries.")]),t._v(" "),a("p",[t._v("Strapi has no problem implicitly/automatically joining a SQL table with a NoSQL collection and vice versa.")]),t._v(" "),t._m(26),t._v(" "),a("p",[t._v("Strapi is compatible with any front-end strategy; whether it's Angular, Backbone, Ember,\niOS, Android, Windows Phone, or something else that hasn't been invented yet.")]),t._v(" "),a("p",[t._v("Plus it's easy to serve up the same API to be consumed by another web service or community of developers.")]),t._v(" "),t._m(27),t._v(" "),a("p",[t._v("Convention over configuration is a consistent approach makes developing applications more\npredictable and efficient for everybody involved.")]),t._v(" "),a("p",[t._v("If anyone on your team has worked with frameworks, Strapi will feel pretty familiar.\nNot only that, but they can look at a Strapi project and know, generally, how to code up the basic\npatterns they've implemented over and over again in the past; whether their background.\nWhat about your second application, or your third? Each time you create a new Strapi application,\nyou start with a sane, familiar boilerplate that makes you more productive.")]),t._v(" "),a("p",[t._v("Configuration files give you extra opportunities for human error.")]),t._v(" "),a("p",[t._v("In many cases, you'll even be able to recycle some of your code.")]),t._v(" "),t._m(28),t._v(" "),t._m(29),t._v(" "),t._m(30),t._m(31),t._v(" "),t._m(32),a("p",[t._v('When an error occurs and it is still possible to respond to the client,\naka no data has been written to the socket, Strapi will respond appropriately with\na 500 "Internal Server Error". In either case an app-level "error" is emitted for logging purposes.')]),t._v(" "),t._m(33),t._v(" "),a("p",[t._v("Strapi has built in support for the idea of having a different set of settings for each environment.\nReal applications have this too, but often the framework around them doesn't accommodate it and\nyou end up having to swap configuration files in and out to achieve the same effect.")]),t._v(" "),t._m(34),t._v(" "),a("p",[t._v("Strapi is flexible enough to allow you to explore and create when you have the time to but also\nprovides automation tools when you don't.")])])},[function(){var t=this.$createElement,e=this._self._c||t;return e("h1",{attrs:{id:"introduction"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#introduction","aria-hidden":"true"}},[this._v("#")]),this._v(" Introduction")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("Important Note: "),e("strong",[this._v("Strapi 1.x is on maintenance only")]),this._v(". Development focuses on the upcoming Strapi 3.0.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"getting-started"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#getting-started","aria-hidden":"true"}},[this._v("#")]),this._v(" Getting Started")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"installation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#installation","aria-hidden":"true"}},[this._v("#")]),this._v(" Installation")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[this._v("$ "),e("span",{attrs:{class:"token function"}},[this._v("npm")]),this._v(" "),e("span",{attrs:{class:"token function"}},[this._v("install")]),this._v(" strapi -g\n")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"create-your-first-project"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#create-your-first-project","aria-hidden":"true"}},[this._v("#")]),this._v(" Create your first project")])},function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("$ strapi new "),a("span",{attrs:{class:"token operator"}},[t._v("<")]),t._v("appName"),a("span",{attrs:{class:"token operator"}},[t._v(">")]),t._v("\n$ "),a("span",{attrs:{class:"token function"}},[t._v("cd")]),t._v(" "),a("span",{attrs:{class:"token operator"}},[t._v("<")]),t._v("appName"),a("span",{attrs:{class:"token operator"}},[t._v(">")]),t._v("\n$ strapi start\n")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"create-your-first-api"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#create-your-first-api","aria-hidden":"true"}},[this._v("#")]),this._v(" Create your first API")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[this._v("$ strapi generate api "),e("span",{attrs:{class:"token operator"}},[this._v("<")]),this._v("apiName"),e("span",{attrs:{class:"token operator"}},[this._v(">")]),this._v("\n")])])])},function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("p",[t._v("For example, you can create a "),a("code",[t._v("car")]),t._v(" API with a name ("),a("code",[t._v("name")]),t._v("), year ("),a("code",[t._v("year")]),t._v(") and\nthe license plate ("),a("code",[t._v("license")]),t._v(") with:")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[this._v("$ strapi generate api car name:string year:integer license:string\n")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"alternatives"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#alternatives","aria-hidden":"true"}},[this._v("#")]),this._v(" Alternatives")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"dry-application"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#dry-application","aria-hidden":"true"}},[this._v("#")]),this._v(" Dry Application")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("Note that you can generate a dry application using the "),e("code",[this._v("dry")]),this._v(" option:")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[this._v("$ strapi new "),e("span",{attrs:{class:"token operator"}},[this._v("<")]),this._v("appName"),e("span",{attrs:{class:"token operator"}},[this._v(">")]),this._v(" --dry\n")])])])},function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("ul",[a("li",[t._v("the built-in "),a("code",[t._v("user")]),t._v(", "),a("code",[t._v("email")]),t._v(" and "),a("code",[t._v("upload")]),t._v(" APIs,")]),t._v(" "),a("li",[t._v("the "),a("code",[t._v("grant")]),t._v(" hook,")]),t._v(" "),a("li",[t._v("the open-source admin panel,")]),t._v(" "),a("li",[t._v("the Waterline ORM ("),a("code",[t._v("waterline")]),t._v(" and "),a("code",[t._v("blueprints")]),t._v(" hooks disabled),")]),t._v(" "),a("li",[t._v("the Strapi Studio connection ("),a("code",[t._v("studio")]),t._v(" hook disabled).")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"create-an-api-via-the-strapi-studio"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#create-an-api-via-the-strapi-studio","aria-hidden":"true"}},[this._v("#")]),this._v(" Create an API via the Strapi Studio")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"link-to-the-strapi-studio"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#link-to-the-strapi-studio","aria-hidden":"true"}},[this._v("#")]),this._v(" Link to the Strapi Studio")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[this._v("$ strapi login\n")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"key-features"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#key-features","aria-hidden":"true"}},[this._v("#")]),this._v(" Key-features")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"_100-javascript"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#_100-javascript","aria-hidden":"true"}},[this._v("#")]),this._v(" 100% JavaScript")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"getting-started-quickly"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#getting-started-quickly","aria-hidden":"true"}},[this._v("#")]),this._v(" Getting started quickly")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"auto-generate-rest-apis"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#auto-generate-rest-apis","aria-hidden":"true"}},[this._v("#")]),this._v(" Auto-generate REST APIs")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[this._v("$ strapi generate api car\n")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"security"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#security","aria-hidden":"true"}},[this._v("#")]),this._v(" Security")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"datastore-agnostic"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#datastore-agnostic","aria-hidden":"true"}},[this._v("#")]),this._v(" Datastore-agnostic")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"front-end-agnostic"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#front-end-agnostic","aria-hidden":"true"}},[this._v("#")]),this._v(" Front-end agnostic")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"convention-over-configuration"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#convention-over-configuration","aria-hidden":"true"}},[this._v("#")]),this._v(" Convention over configuration")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"error-handling"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#error-handling","aria-hidden":"true"}},[this._v("#")]),this._v(" Error Handling")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("By default outputs all errors to "),e("code",[this._v("stderr")]),this._v(" unless "),e("code",[this._v("NODE_ENV")]),this._v(" is "),e("code",[this._v("test")]),this._v('.\nTo perform custom error-handling logic such as centralized logging you can add an "error" event listener:')])},function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[t._v("strapi"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("app"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("on")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'error'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("err"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n strapi"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("log"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("error")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'server error'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" err"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("If an error in the req/res cycle and it is not possible to respond to the client,\nthe "),e("code",[this._v("Context")]),this._v(" instance is also passed:")])},function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[t._v("strapi"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("app"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("on")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'error'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("err"),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ctx"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n strapi"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("log"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("error")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'server error'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" err"),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ctx"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"different-environments"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#different-environments","aria-hidden":"true"}},[this._v("#")]),this._v(" Different environments")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"loose-coupling"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#loose-coupling","aria-hidden":"true"}},[this._v("#")]),this._v(" Loose coupling")])}],!1,null,null,null);n.options.__file="introduction.md";e.default=n.exports}}]); \ No newline at end of file diff --git a/docs/.vuepress/dist/assets/js/15.55a20f7c.js b/docs/.vuepress/dist/assets/js/15.55a20f7c.js new file mode 100644 index 0000000000..c773c8c8d1 --- /dev/null +++ b/docs/.vuepress/dist/assets/js/15.55a20f7c.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[15],{224:function(t,s,a){"use strict";a.r(s);var n=a(0),o=Object(n.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"content"},[a("h1",{attrs:{id:"logging"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#logging","aria-hidden":"true"}},[t._v("#")]),t._v(" Logging")]),t._v(" "),a("p",[t._v("Strapi comes with a simple and useful built-in logger.\nIts usage is purposely very similar to "),a("code",[t._v("console.log()")]),t._v(", but with a handful of\nextra features; namely support for multiple log levels with colorized,\nprefixed console output.")]),t._v(" "),a("p",[t._v("The logger is accessible through the "),a("code",[t._v("strapi")]),t._v(" object directly with "),a("code",[t._v("strapi.log")]),t._v(".")]),t._v(" "),a("p",[t._v("You can work with this logger in the same way that you work with the default logger:")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[t._v("strapi"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("log"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("info")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'Logs work!'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("h2",{attrs:{id:"logging-with-metadata"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#logging-with-metadata","aria-hidden":"true"}},[t._v("#")]),t._v(" Logging with Metadata")]),t._v(" "),a("p",[t._v("In addition to logging string messages, the logger will also optionally log additional\nJSON metadata objects. Adding metadata is simple:")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[t._v("strapi"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("log"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("info")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'Test log message'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n anything"),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'This is metadata'")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("h2",{attrs:{id:"string-interpolation"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#string-interpolation","aria-hidden":"true"}},[t._v("#")]),t._v(" String interpolation")]),t._v(" "),a("p",[t._v("The log method provides the same string interpolation methods like "),a("code",[t._v("util.format")]),t._v(".")]),t._v(" "),a("p",[t._v("This allows for the following log messages.")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[t._v("strapi"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("log"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("info")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'test message %s'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'my string'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token comment"}},[t._v("// => info: test message my string")]),t._v("\n")])])]),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[t._v("strapi"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("log"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("info")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'test message %d'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token number"}},[t._v("123")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token comment"}},[t._v("// => info: test message 123")]),t._v("\n")])])]),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[t._v("strapi"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("log"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("info")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'test message %j'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n number"),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token number"}},[t._v("123")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token comment"}},[t._v('// => info: test message {"number":123}')]),t._v("\n"),a("span",{attrs:{class:"token comment"}},[t._v("// => meta = {}")]),t._v("\n")])])]),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[t._v("strapi"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("log"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("info")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'test message %s, %s'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'first'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'second'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n number"),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token number"}},[t._v("123")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token comment"}},[t._v("// => info: test message first, second")]),t._v("\n"),a("span",{attrs:{class:"token comment"}},[t._v("// => meta = {number: 123}")]),t._v("\n")])])]),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[t._v("strapi"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("log"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("info")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'test message'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'first'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'second'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n number"),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token number"}},[t._v("123")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token comment"}},[t._v("// => info: test message first second")]),t._v("\n"),a("span",{attrs:{class:"token comment"}},[t._v("// => meta = {number: 123}")]),t._v("\n")])])]),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[t._v("strapi"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("log"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("info")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'test message %s, %s'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'first'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'second'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n number"),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token number"}},[t._v("123")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("function")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token comment"}},[t._v("// => info: test message first, second")]),t._v("\n"),a("span",{attrs:{class:"token comment"}},[t._v("// => meta = {number: 123}")]),t._v("\n"),a("span",{attrs:{class:"token comment"}},[t._v("// => callback = function() {}")]),t._v("\n")])])]),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[t._v("strapi"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("log"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("info")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'test message'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'first'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'second'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n number"),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token number"}},[t._v("123")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("function")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token comment"}},[t._v("// => info: test message first second")]),t._v("\n"),a("span",{attrs:{class:"token comment"}},[t._v("// => meta = {number: 123}")]),t._v("\n"),a("span",{attrs:{class:"token comment"}},[t._v("// => callback = function() {}")]),t._v("\n")])])]),a("h2",{attrs:{id:"logging-levels"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#logging-levels","aria-hidden":"true"}},[t._v("#")]),t._v(" Logging levels")]),t._v(" "),a("p",[t._v("Setting the level for your logging message can be accomplished by using\nthe level specified methods defined.")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[t._v("strapi"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("log"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("debug")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'This is a debug log'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nstrapi"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("log"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("info")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'This is an info log'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nstrapi"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("log"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("warn")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'This is a warning log'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nstrapi"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("log"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("error")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'This is an error log '")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])])}],!1,null,null,null);o.options.__file="logging.md";s.default=o.exports}}]); \ No newline at end of file diff --git a/docs/.vuepress/dist/assets/js/16.5c84c402.js b/docs/.vuepress/dist/assets/js/16.5c84c402.js new file mode 100644 index 0000000000..a61e9acde6 --- /dev/null +++ b/docs/.vuepress/dist/assets/js/16.5c84c402.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[16],{223:function(t,s,a){"use strict";a.r(s);var n=a(0),e=Object(n.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"content"},[a("h1",{attrs:{id:"models"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#models","aria-hidden":"true"}},[t._v("#")]),t._v(" Models")]),t._v(" "),a("p",[t._v("Strapi comes installed with a powerful Object-Relational-Mapper (ORM) called Waterline,\na datastore-agnostic tool that dramatically simplifies interaction with one or more databases.")]),t._v(" "),a("p",[t._v("Models represent a structure of data which requires persistent storage. The data may live in any data-store\nbut is interfaced in the same way. This allows your users to live in PostgreSQL and your user preferences\nto live in MongoDB and you will interact with the data models in the exact same way.")]),t._v(" "),a("p",[t._v("If you're using MySQL, a model might correspond to a table. If you're using MongoDB, it might correspond\nto a collection. In either case, the goal is to provide a simple, modular way of managing data without\nrelying on any one type of database.")]),t._v(" "),a("p",[t._v("Models are defined in the "),a("code",[t._v("./api//models")]),t._v(" directory.")]),t._v(" "),a("h2",{attrs:{id:"model-settings"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#model-settings","aria-hidden":"true"}},[t._v("#")]),t._v(" Model settings")]),t._v(" "),a("p",[t._v("The following properties can be specified at the top level of your model definition to override\nthe defaults for that particular model.")]),t._v(" "),a("p",[t._v("For example, this a basic model "),a("code",[t._v("Pet")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"identity"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"pet"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"connection"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"mongoDBServer"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"schema"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("true")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"attributes"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"name"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"type"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"string"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"required"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"gender"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"type"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"string"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"enum"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{attrs:{class:"token string"}},[t._v('"male"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"female"')]),a("span",{attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"age"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"type"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"int"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"max"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token number"}},[t._v("100")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"birthDate"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"type"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"date"')]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"breed"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"type"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"string"')]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"autoPK"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("true")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"autoCreatedAt"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("true")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"autoUpdatedAt"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n")])])]),a("h3",{attrs:{id:"schema"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#schema","aria-hidden":"true"}},[t._v("#")]),t._v(" schema")]),t._v(" "),a("p",[t._v("A flag to toggle schemaless or schema mode in databases that support schemaless data structures.\nIf turned off, this will allow you to store arbitrary data in a record. If turned on, only attributes\ndefined in the model's attributes object will be stored.")]),t._v(" "),a("p",[t._v("For adapters that don't require a schema, such as MongoDB or Redis, the "),a("code",[t._v("schema")]),t._v(" key is set to "),a("code",[t._v("false")]),t._v(".")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"schema"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("true")]),a("span",{attrs:{class:"token operator"}},[t._v("|")]),a("span",{attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h3",{attrs:{id:"connection"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#connection","aria-hidden":"true"}},[t._v("#")]),t._v(" connection")]),t._v(" "),a("p",[t._v("The configured database connection where this model will fetch and save its data.\nDefaults to "),a("code",[t._v("defaultSQLite")]),t._v(", the default connection that uses the "),a("code",[t._v("waterline-sqlite3")]),t._v(" adapter.")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"connection"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"mongoDBServer"')]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h3",{attrs:{id:"identity"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#identity","aria-hidden":"true"}},[t._v("#")]),t._v(" identity")]),t._v(" "),a("p",[t._v("The lowercase unique key for the model. By default, a model's identity is inferred automatically\nby lowercasing its filename. You should never change this property on your models.")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"identity"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"petModel"')]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h3",{attrs:{id:"globalid"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#globalid","aria-hidden":"true"}},[t._v("#")]),t._v(" globalId")]),t._v(" "),a("p",[t._v("This flag changes the global name by which you can access your model (if the globalization of models\nis enabled). You should never change this property on your models.")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"globaId"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"pets"')]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("For example to access to your model function:")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[t._v("Pets"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("find")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("exec")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("error"),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" pets"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("error"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("log")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("error"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("false")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n console"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("log")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("pets"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("h3",{attrs:{id:"autopk"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#autopk","aria-hidden":"true"}},[t._v("#")]),t._v(" autoPK")]),t._v(" "),a("p",[t._v("A flag to toggle the automatic definition of a primary key in your model.\nThe details of this default primary key vary between adapters. In any case, the primary keys generated\nby "),a("code",[t._v("autoPK")]),t._v(" will be unique. If turned off no primary key will be created by default, and you will need\nto define one manually using "),a("code",[t._v("primaryKey: true")]),t._v(" for one of the model attributes.")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"autoPK"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("true")]),a("span",{attrs:{class:"token operator"}},[t._v("|")]),a("span",{attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h3",{attrs:{id:"autocreatedat"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#autocreatedat","aria-hidden":"true"}},[t._v("#")]),t._v(" autoCreatedAt")]),t._v(" "),a("p",[t._v("A flag to toggle the automatic definition of a "),a("code",[t._v("createdAt")]),t._v(" attribute in your model.\nBy default, "),a("code",[t._v("createdAt")]),t._v(" is an attribute which will be automatically set when a record is created with\nthe current timestamp.")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"autoCreatedAt"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("true")]),a("span",{attrs:{class:"token operator"}},[t._v("|")]),a("span",{attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h3",{attrs:{id:"autoupdatedat"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#autoupdatedat","aria-hidden":"true"}},[t._v("#")]),t._v(" autoUpdatedAt")]),t._v(" "),a("p",[t._v("A flag to toggle the automatic definition of a "),a("code",[t._v("updatedAt")]),t._v(" attribute in your model.\nBy default, "),a("code",[t._v("updatedAt")]),t._v(" is an attribute which will be automatically set with the current timestamp\nevery time a record is updated.")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"autoUpdatedAt"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("true")]),a("span",{attrs:{class:"token operator"}},[t._v("|")]),a("span",{attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h3",{attrs:{id:"tablename"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#tablename","aria-hidden":"true"}},[t._v("#")]),t._v(" tableName")]),t._v(" "),a("p",[t._v("You can define a custom name for the physical collection in your adapter by adding a "),a("code",[t._v("tableName")]),t._v("\nattribute. This isn't just for tables. In MySQL, PostgreSQL, Oracle, etc. this setting refers\nto the name of the table, but in MongoDB or Redis, it refers to the collection, and so forth.\nIf no "),a("code",[t._v("tableName")]),t._v(" is specified, Waterline will use the model's "),a("code",[t._v("identity")]),t._v(" as its "),a("code",[t._v("tableName")]),t._v(".")]),t._v(" "),a("p",[t._v("This is particularly useful for working with pre-existing/legacy databases.")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"tableName"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"pets_table"')]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h3",{attrs:{id:"attributes"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#attributes","aria-hidden":"true"}},[t._v("#")]),t._v(" attributes")]),t._v(" "),a("p",[t._v("Model attributes are basic pieces of information about a model.\nA model called "),a("code",[t._v("Pet")]),t._v(" might have attributes called "),a("code",[t._v("name")]),t._v(", "),a("code",[t._v("gender")]),t._v(", "),a("code",[t._v("age")]),t._v(",\n"),a("code",[t._v("birthday")]),t._v(" and "),a("code",[t._v("breed")]),t._v(".")]),t._v(" "),a("p",[t._v("Options can be used to enforce various constraints and add special enhancements to model attributes.")]),t._v(" "),a("h4",{attrs:{id:"type"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#type","aria-hidden":"true"}},[t._v("#")]),t._v(" type")]),t._v(" "),a("p",[t._v("Specifies the type of data that will be stored in this attribute. One of:")]),t._v(" "),a("ul",[a("li",[a("code",[t._v("string")])]),t._v(" "),a("li",[a("code",[t._v("text")])]),t._v(" "),a("li",[a("code",[t._v("integer")])]),t._v(" "),a("li",[a("code",[t._v("float")])]),t._v(" "),a("li",[a("code",[t._v("date")])]),t._v(" "),a("li",[a("code",[t._v("datetime")])]),t._v(" "),a("li",[a("code",[t._v("boolean")])]),t._v(" "),a("li",[a("code",[t._v("binary")])]),t._v(" "),a("li",[a("code",[t._v("array")])]),t._v(" "),a("li",[a("code",[t._v("json")])])]),t._v(" "),a("p",[t._v("Defaults to "),a("code",[t._v("string")]),t._v(" if not specified.")]),t._v(" "),a("h3",{attrs:{id:"validations"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#validations","aria-hidden":"true"}},[t._v("#")]),t._v(" Validations")]),t._v(" "),a("p",[t._v("Strapi bundles support for automatic validations of your models' attributes.\nAny time a record is updated, or a new record is created, the data for each attribute will\nbe checked against all of your predefined validation rules. This provides a convenient failsafe\nto ensure that invalid entries don't make their way into your application's database(s).")]),t._v(" "),a("p",[t._v("Validations are defined directly in your collection attributes.")]),t._v(" "),a("ul",[a("li",[a("code",[t._v("after")]),t._v(" (date): Checks if string date in this record is after the specified "),a("code",[t._v("Date")]),t._v(".\nMust be valid JavaScript "),a("code",[t._v("Date")]),t._v(".")]),t._v(" "),a("li",[a("code",[t._v("alpha")]),t._v(" (boolean): Checks if string in this record contains only letters (a-zA-Z).")]),t._v(" "),a("li",[a("code",[t._v("alphadashed")]),t._v(" (boolean): Checks if string in this record contains only numbers and/or dashes.")]),t._v(" "),a("li",[a("code",[t._v("alphanumeric")]),t._v(" (boolean): Checks if string in this record contains only letters and numbers.")]),t._v(" "),a("li",[a("code",[t._v("alphanumericdashed")]),t._v(" (boolean): Checks if string in this record contains only numbers and/or\nletters and/or dashes.")]),t._v(" "),a("li",[a("code",[t._v("array")]),t._v(" (boolean): Checks if this record is a valid JavaScript array object.\nStrings formatted as arrays will fail.")]),t._v(" "),a("li",[a("code",[t._v("before")]),t._v(" (date): Checks if string in this record is a date that's before the specified date.")]),t._v(" "),a("li",[a("code",[t._v("binary")]),t._v(" (boolean): Checks if this record is a valid binary data. Strings will pass.")]),t._v(" "),a("li",[a("code",[t._v("boolean")]),t._v(" (boolean): Checks if this record is a valid boolean. Strings will fail.")]),t._v(" "),a("li",[a("code",[t._v("contains")]),t._v(" (string): Checks if string in this record contains the seed.")]),t._v(" "),a("li",[a("code",[t._v("creditcard")]),t._v(" (boolean): Checks if string in this record is a credit card.")]),t._v(" "),a("li",[a("code",[t._v("date")]),t._v(" (boolean): Checks if string in this record is a date takes both strings and JavaScript.")]),t._v(" "),a("li",[a("code",[t._v("datetime")]),t._v(" (boolean): Checks if string in this record looks like a JavaScript "),a("code",[t._v("datetime")]),t._v(".")]),t._v(" "),a("li",[a("code",[t._v("decimal")]),t._v(" (boolean): Checks if it contains a decimal or is less than 1.")]),t._v(" "),a("li",[a("code",[t._v("email")]),t._v(" (boolean): Checks if string in this record looks like an email address.")]),t._v(" "),a("li",[a("code",[t._v("empty")]),t._v(" (boolean): Checks if the entry is empty. Arrays, strings, or arguments objects with\na length of 0 and objects with no\nown enumerable properties are considered empty.")]),t._v(" "),a("li",[a("code",[t._v("equals")]),t._v(" (integer): Checks if string in this record is equal to the specified value.\nThey must match in both value and type.")]),t._v(" "),a("li",[a("code",[t._v("falsey")]),t._v(" (boolean): Would a Javascript engine register a value of "),a("code",[t._v("false")]),t._v(" on this?.")]),t._v(" "),a("li",[a("code",[t._v("finite")]),t._v(" (boolean): Checks if given value is, or can be coerced to, a finite number.\nThis is not the same as native "),a("code",[t._v("isFinite")]),t._v("\nwhich will return "),a("code",[t._v("true")]),t._v(" for booleans and empty strings.")]),t._v(" "),a("li",[a("code",[t._v("float")]),t._v(" (boolean): Checks if string in this record is of the number type float.")]),t._v(" "),a("li",[a("code",[t._v("hexadecimal")]),t._v(" (boolean): Checks if string in this record is a hexadecimal number.")]),t._v(" "),a("li",[a("code",[t._v("hexColor")]),t._v(" (boolean): Checks if string in this record is a hexadecimal color.")]),t._v(" "),a("li",[a("code",[t._v("in")]),t._v(" (array): Checks if string in this record is in the specified array of allowed\nstring values.")]),t._v(" "),a("li",[a("code",[t._v("int")]),t._v(" (boolean): Check if string in this record is an integer.")]),t._v(" "),a("li",[a("code",[t._v("integer")]),t._v(" (boolean): Check if string in this record is an integer. Alias for "),a("code",[t._v("int")]),t._v(".")]),t._v(" "),a("li",[a("code",[t._v("ip")]),t._v(" (boolean): Checks if string in this record is a valid IP (v4 or v6).")]),t._v(" "),a("li",[a("code",[t._v("ipv4")]),t._v(" (boolean): Checks if string in this record is a valid IP v4.")]),t._v(" "),a("li",[a("code",[t._v("ipv6")]),t._v(" (boolean): Checks if string in this record is aa valid IP v6.")]),t._v(" "),a("li",[a("code",[t._v("json")]),t._v(" (boolean): Checks if the record is a JSON.")]),t._v(" "),a("li",[a("code",[t._v("lowercase")]),t._v(" (boolean): Check if string in this record is in all lowercase.")]),t._v(" "),a("li",[a("code",[t._v("max")]),t._v(" (integer): max value for an integer.")]),t._v(" "),a("li",[a("code",[t._v("maxLength")]),t._v(" (integer):")]),t._v(" "),a("li",[a("code",[t._v("min")]),t._v(" (integer): min value for an integer.")]),t._v(" "),a("li",[a("code",[t._v("minLength")]),t._v(" (integer):")]),t._v(" "),a("li",[a("code",[t._v("notContains")]),t._v(" (string): Checks if string in this record doesn't contain the seed.")]),t._v(" "),a("li",[a("code",[t._v("notIn")]),t._v(" (array): does the value of this model attribute exist inside of the defined\nvalidator value (of the same type).\nTakes strings and arrays.")]),t._v(" "),a("li",[a("code",[t._v("notNull")]),t._v(" (boolean): does this not have a value of "),a("code",[t._v("null")]),t._v(" ?.")]),t._v(" "),a("li",[a("code",[t._v("null")]),t._v(" (boolean): Checks if string in this record is null.")]),t._v(" "),a("li",[a("code",[t._v("number")]),t._v(" (boolean): Checks if this record is a number. "),a("code",[t._v("NaN")]),t._v(" is considered a number.")]),t._v(" "),a("li",[a("code",[t._v("numeric")]),t._v(" (boolean): Checks if string in this record contains only numbers.")]),t._v(" "),a("li",[a("code",[t._v("object")]),t._v(" (boolean): Checks if this attribute is the language type of Object.\nPasses for arrays, functions, objects,\nregexes, new Number(0), and new String('') !")]),t._v(" "),a("li",[a("code",[t._v("regex")]),t._v(" (regex): Checks if the record matches the specific regex.")]),t._v(" "),a("li",[a("code",[t._v("required")]),t._v(" (boolean): Must this model attribute contain valid data before a new\nrecord can be created?.")]),t._v(" "),a("li",[a("code",[t._v("string")]),t._v(" (boolean): Checks if the record is a string.")]),t._v(" "),a("li",[a("code",[t._v("text")]),t._v(" (boolean): Checks if the record is a text.")]),t._v(" "),a("li",[a("code",[t._v("truthy")]),t._v(" (boolean): Would a Javascript engine register a value of "),a("code",[t._v("false")]),t._v(" on this?")]),t._v(" "),a("li",[a("code",[t._v("undefined")]),t._v(" (boolean): Would a JavaScript engine register this thing as have the\nvalue "),a("code",[t._v("undefined")]),t._v("?")]),t._v(" "),a("li",[a("code",[t._v("uppercase")]),t._v(" (boolean): Checks if string in this record is uppercase.")]),t._v(" "),a("li",[a("code",[t._v("url")]),t._v(" (boolean): Checks if string in this record is a URL.")]),t._v(" "),a("li",[a("code",[t._v("urlish")]),t._v(" (boolean): Checks if string in this record contains something that looks like\na route, ending with a file extension.")]),t._v(" "),a("li",[a("code",[t._v("uuid")]),t._v(" (boolean): Checks if string in this record is a UUID (v3, v4, or v5).")]),t._v(" "),a("li",[a("code",[t._v("uuidv3")]),t._v(" (boolean): Checks if string in this record is a UUID (v3).")]),t._v(" "),a("li",[a("code",[t._v("uuidv4")]),t._v(" (boolean): Checks if string in this record is a UUID (v4).")])]),t._v(" "),a("h4",{attrs:{id:"defaultsto"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#defaultsto","aria-hidden":"true"}},[t._v("#")]),t._v(" defaultsTo")]),t._v(" "),a("p",[t._v("When a record is created, if no value was supplied, the record will be created with the specified\n"),a("code",[t._v("defaultsTo")]),t._v(" value.")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token string"}},[t._v('"attributes"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"usersGroup"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"type"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"string"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"defaultsTo"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"guess"')]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h4",{attrs:{id:"autoincrement"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#autoincrement","aria-hidden":"true"}},[t._v("#")]),t._v(" autoIncrement")]),t._v(" "),a("p",[t._v("Sets up the attribute as an auto-increment key. When a new record is added to the model,\nif a value for this attribute is not specified, it will be generated by incrementing the most recent\nrecord's value by one.")]),t._v(" "),a("p",[t._v("Attributes which specify "),a("code",[t._v("autoIncrement")]),t._v(" should always be of "),a("code",[t._v("type: integer")]),t._v(".\nAlso, bear in mind that the level of support varies across different datastores.\nFor instance, MySQL will not allow more than one auto-incrementing column per table.")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token string"}},[t._v('"attributes"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"placeInLine"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"type"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"integer"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"autoIncrement"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h4",{attrs:{id:"unique"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#unique","aria-hidden":"true"}},[t._v("#")]),t._v(" unique")]),t._v(" "),a("p",[t._v("Ensures no two records will be allowed with the same value for the target attribute.\nThis is an adapter-level constraint, so in most cases this will result in a unique index on the\nattribute being created in the underlying datastore.")]),t._v(" "),a("p",[t._v("Defaults to "),a("code",[t._v("false")]),t._v(" if not specified.")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token string"}},[t._v('"attributes"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"username"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"type"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"string"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"unique"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h4",{attrs:{id:"primarykey"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#primarykey","aria-hidden":"true"}},[t._v("#")]),t._v(" primaryKey")]),t._v(" "),a("p",[t._v("Use this attribute as the the primary key for the record. Only one attribute per model can be the\n"),a("code",[t._v("primaryKey")]),t._v(". Defaults to "),a("code",[t._v("false")]),t._v(" if not specified.")]),t._v(" "),a("p",[t._v("This should never be used unless "),a("code",[t._v("autoPK")]),t._v(" is set to "),a("code",[t._v("false")]),t._v(".")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token string"}},[t._v('"attributes"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"uuid"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"type"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"string"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"primaryKey"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("true")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"required"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h4",{attrs:{id:"enum"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#enum","aria-hidden":"true"}},[t._v("#")]),t._v(" enum")]),t._v(" "),a("p",[t._v("A special validation property which only saves data which matches a whitelisted set of values.")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token string"}},[t._v('"attributes"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"gender"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"type"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"string"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"enum"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{attrs:{class:"token string"}},[t._v('"male"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"female"')]),a("span",{attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h4",{attrs:{id:"size"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#size","aria-hidden":"true"}},[t._v("#")]),t._v(" size")]),t._v(" "),a("p",[t._v("If supported in the adapter, can be used to define the size of the attribute.\nFor example in MySQL, "),a("code",[t._v("size")]),t._v(" can be specified as a number ("),a("code",[t._v("n")]),t._v(") to create a column with the SQL\ndata type: "),a("code",[t._v("varchar(n)")]),t._v(".")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token string"}},[t._v('"attributes"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"name"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"type"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"string"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"size"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token number"}},[t._v("24")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h4",{attrs:{id:"columnname"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#columnname","aria-hidden":"true"}},[t._v("#")]),t._v(" columnName")]),t._v(" "),a("p",[t._v("Inside an attribute definition, you can specify a "),a("code",[t._v("columnName")]),t._v(" to force Waterline to store data\nfor that attribute in a specific column in the configured connection.\nBe aware that this is not necessarily SQL-specific. It will also work for MongoDB fields, etc.")]),t._v(" "),a("p",[t._v("While the "),a("code",[t._v("columnName")]),t._v(" property is primarily designed for working with existing/legacy databases,\nit can also be useful in situations where your database is being shared by other applications,\nor you don't have access permissions to change the schema.")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token string"}},[t._v('"attributes"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"name"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"type"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"string"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"columnName"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"pet_name"')]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h2",{attrs:{id:"associations"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#associations","aria-hidden":"true"}},[t._v("#")]),t._v(" Associations")]),t._v(" "),a("p",[t._v("With Waterline you can associate models with other models across all data stores.\nThis means that your users can live in PostgreSQL and their photos can live in MongoDB\nand you can interact with the data as if they lived together on the same database.\nYou can also have associations that live on separate connections or in different databases\nwithin the same adapter.")]),t._v(" "),a("h3",{attrs:{id:"one-way-associations"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#one-way-associations","aria-hidden":"true"}},[t._v("#")]),t._v(" One-Way associations")]),t._v(" "),a("p",[t._v("A one-way association is where a model is associated with another model.\nYou could query that model and populate to get the associated model.\nYou can't however query the associated model and populate to get the associating model.")]),t._v(" "),a("p",[t._v("In this example, we are associating a "),a("code",[t._v("User")]),t._v(" with a "),a("code",[t._v("Pet")]),t._v(" but not a "),a("code",[t._v("Pet")]),t._v(" with a "),a("code",[t._v("User")]),t._v(".\nBecause we have only formed an association on one of the models, a "),a("code",[t._v("Pet")]),t._v(" has no restrictions\non the number of "),a("code",[t._v("User")]),t._v(" models it can belong to. If we wanted to, we could change this and\nassociate the "),a("code",[t._v("Pet")]),t._v(" with exactly one "),a("code",[t._v("User")]),t._v(" and the "),a("code",[t._v("User")]),t._v(" with exactly one "),a("code",[t._v("Pet")]),t._v(".")]),t._v(" "),a("p",[a("code",[t._v("./api/pet/models/Pet.settings.json")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"attributes"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"name"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"type"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"string"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"required"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("true")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"unique"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"color"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"type"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"string"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"required"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("code",[t._v("./api/user/models/User.settings.json")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"attributes"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"name"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"type"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"string"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"required"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("true")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"unique"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"color"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"type"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"string"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"required"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"pony"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"model"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"pet"')]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h3",{attrs:{id:"one-to-one-associations"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#one-to-one-associations","aria-hidden":"true"}},[t._v("#")]),t._v(" One-to-One associations")]),t._v(" "),a("p",[t._v("A one-to-one association states that a model may only be associated with one other model.\nIn order for the model to know which other model it is associated with a foreign key must\nbe included in the record.")]),t._v(" "),a("p",[t._v("In this example, we are associating a "),a("code",[t._v("Pet")]),t._v(" with a "),a("code",[t._v("User")]),t._v(". The "),a("code",[t._v("User")]),t._v(" may only have one\n"),a("code",[t._v("Pet")]),t._v(" and viceversa, a "),a("code",[t._v("Pet")]),t._v(" can only have one "),a("code",[t._v("User")]),t._v(". However, in order to query this association\nfrom both sides, you will have to create/update both models.")]),t._v(" "),a("p",[a("code",[t._v("./api/pet/models/Pet.settings.json")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"attributes"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"name"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"type"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"string"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"required"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("true")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"unique"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"color"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"type"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"string"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"required"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"owner"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"model"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"user"')]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("code",[t._v("./api/user/models/User.settings.json")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"attributes"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"name"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"type"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"string"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"required"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("true")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"unique"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"age"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"type"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"integer"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"required"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"pony"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"model"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"pet"')]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h3",{attrs:{id:"one-to-many-associations"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#one-to-many-associations","aria-hidden":"true"}},[t._v("#")]),t._v(" One-to-Many associations")]),t._v(" "),a("p",[t._v("A one-to-many association states that a model can be associated with many other models.\nTo build this association a virtual attribute is added to a model using the "),a("code",[t._v("collection")]),t._v(" property.\nIn a one-to-many association one side must have a "),a("code",[t._v("collection")]),t._v(" attribute and the other side must contain a\n"),a("code",[t._v("model")]),t._v(" attribute. This allows the many side to know which records it needs to get when a "),a("code",[t._v("populate")]),t._v(" is used.")]),t._v(" "),a("p",[t._v("Because you may want a model to have multiple one-to-many associations on another model a "),a("code",[t._v("via")]),t._v(" key is\nneeded on the "),a("code",[t._v("collection")]),t._v(" attribute. This states which "),a("code",[t._v("model")]),t._v(" attribute on the one side of the association\nis used to populate the records.")]),t._v(" "),a("p",[t._v("In this example, a "),a("code",[t._v("User")]),t._v(" can have several "),a("code",[t._v("Pet")]),t._v(", but a "),a("code",[t._v("Pet")]),t._v(" has only one "),a("code",[t._v("owner")]),t._v(" (from the "),a("code",[t._v("User")]),t._v(" model).")]),t._v(" "),a("p",[a("code",[t._v("./api/pet/models/Pet.settings.json")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"attributes"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"name"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"type"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"string"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"required"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("true")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"unique"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"color"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"type"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"string"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"required"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"owner"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"model"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"user"')]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("code",[t._v("./api/user/models/User.settings.json")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"attributes"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"name"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"type"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"string"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"required"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("true")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"unique"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"age"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"type"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"integer"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"required"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"pets"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"collection"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"pet"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"via"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"owner"')]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h3",{attrs:{id:"many-to-many-associations"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#many-to-many-associations","aria-hidden":"true"}},[t._v("#")]),t._v(" Many-to-Many associations")]),t._v(" "),a("p",[t._v("A many-to-many association states that a model can be associated with many other models\nand vice-versa. Because both models can have many related models a new join table will\nneed to be created to keep track of these relations.")]),t._v(" "),a("p",[t._v("Waterline will look at your models and if it finds that two models both have "),a("code",[t._v("collection")]),t._v("\nattributes that point to each other, it will automatically build up a join table for you.")]),t._v(" "),a("p",[t._v("Because you may want a model to have multiple many-to-many associations on another model\na "),a("code",[t._v("via")]),t._v(" key is needed on the "),a("code",[t._v("collection")]),t._v(" attribute. This states which "),a("code",[t._v("model")]),t._v(" attribute on the\none side of the association is used to populate the records.")]),t._v(" "),a("p",[t._v("Using the "),a("code",[t._v("User")]),t._v(" and "),a("code",[t._v("Pet")]),t._v(" example lets look at how to build a schema where a "),a("code",[t._v("User")]),t._v(" may\nhave many "),a("code",[t._v("Pet")]),t._v(" records and a "),a("code",[t._v("Pet")]),t._v(" may have multiple owners.")]),t._v(" "),a("p",[t._v("In this example, we will start with an array of users and an array of pets.\nWe will create records for each element in each array then associate all of the "),a("code",[t._v("Pets")]),t._v(" with all\nof the "),a("code",[t._v("Users")]),t._v(". If everything worked properly, we should be able to query any "),a("code",[t._v("User")]),t._v(" and see that\nthey "),a("em",[t._v("own")]),t._v(" all of the "),a("code",[t._v("Pets")]),t._v(". Furthermore, we should be able to query any "),a("code",[t._v("Pet")]),t._v(" and see that\nit is "),a("em",[t._v("owned")]),t._v(" by every "),a("code",[t._v("User")]),t._v(".")]),t._v(" "),a("p",[a("code",[t._v("./api/pet/models/Pet.settings.json")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"attributes"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"name"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"type"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"string"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"required"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("true")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"unique"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"color"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"type"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"string"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"required"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"owners"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"collection"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"user"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"via"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"pets"')]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("code",[t._v("./api/user/models/User.settings.json")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"attributes"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"name"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"type"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"string"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"required"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("true")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"unique"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"age"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"type"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"integer"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"required"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"pets"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"collection"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"pet"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"via"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"owners"')]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h2",{attrs:{id:"lifecycle-callbacks"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#lifecycle-callbacks","aria-hidden":"true"}},[t._v("#")]),t._v(" Lifecycle Callbacks")]),t._v(" "),a("p",[t._v("Lifecycle callbacks are functions you can define to run at certain times in a query.\nThey are hooks that you can tap into in order to change data.")]),t._v(" "),a("p",[t._v("Strapi exposes a handful of lifecycle callbacks by default.")]),t._v(" "),a("h3",{attrs:{id:"callbacks-on-create"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#callbacks-on-create","aria-hidden":"true"}},[t._v("#")]),t._v(" Callbacks on create")]),t._v(" "),a("ul",[a("li",[a("code",[t._v("beforeValidate")]),t._v(": "),a("code",[t._v("fn(values, cb)")])]),t._v(" "),a("li",[a("code",[t._v("afterValidate")]),t._v(": "),a("code",[t._v("fn(values, cb)")])]),t._v(" "),a("li",[a("code",[t._v("beforeCreate")]),t._v(": "),a("code",[t._v("fn(values, cb)")])]),t._v(" "),a("li",[a("code",[t._v("afterCreate")]),t._v(": "),a("code",[t._v("fn(newlyInsertedRecord, cb)")])])]),t._v(" "),a("h3",{attrs:{id:"callbacks-on-update"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#callbacks-on-update","aria-hidden":"true"}},[t._v("#")]),t._v(" Callbacks on update")]),t._v(" "),a("ul",[a("li",[a("code",[t._v("beforeValidate: fn(valuesToUpdate, cb)")])]),t._v(" "),a("li",[a("code",[t._v("afterValidate: fn(valuesToUpdate, cb)")])]),t._v(" "),a("li",[a("code",[t._v("beforeUpdate: fn(valuesToUpdate, cb)")])]),t._v(" "),a("li",[a("code",[t._v("afterUpdate: fn(updatedRecord, cb)")])])]),t._v(" "),a("h3",{attrs:{id:"callbacks-on-destroy"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#callbacks-on-destroy","aria-hidden":"true"}},[t._v("#")]),t._v(" Callbacks on destroy")]),t._v(" "),a("ul",[a("li",[a("code",[t._v("beforeDestroy")]),t._v(": "),a("code",[t._v("fn(criteria, cb)")])]),t._v(" "),a("li",[a("code",[t._v("afterDestroy")]),t._v(": "),a("code",[t._v("fn(deletedRecord, cb)")])])]),t._v(" "),a("p",[t._v("For example, this could be your "),a("code",[t._v("./api/pet/models/Pet.js")]),t._v(" file:")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[t._v("module"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("exports "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token comment"}},[t._v("/**\n * Basic settings\n */")]),t._v("\n\n "),a("span",{attrs:{class:"token comment"}},[t._v("// The identity to use.")]),t._v("\n identity"),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" settings"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("identity"),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),a("span",{attrs:{class:"token comment"}},[t._v("// The connection to use.")]),t._v("\n connection"),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" settings"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("connection"),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),a("span",{attrs:{class:"token comment"}},[t._v("// Do you want to respect schema?")]),t._v("\n schema"),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" settings"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("schema"),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),a("span",{attrs:{class:"token comment"}},[t._v("// Merge simple attributes from settings with those ones.")]),t._v("\n attributes"),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" _"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("merge")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("settings"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("attributes"),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),a("span",{attrs:{class:"token comment"}},[t._v("// Do you automatically want to have time data?")]),t._v("\n autoCreatedAt"),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" settings"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("autoCreatedAt"),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n autoUpdatedAt"),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" settings"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("autoUpdatedAt"),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),a("span",{attrs:{class:"token comment"}},[t._v("/**\n * Lifecycle callbacks on create\n */")]),t._v("\n\n "),a("span",{attrs:{class:"token comment"}},[t._v("// Before creating a value.")]),t._v("\n beforeCreate"),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("values"),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" next"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token comment"}},[t._v("// Do some stuff")]),t._v("\n "),a("span",{attrs:{class:"token function"}},[t._v("next")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),a("span",{attrs:{class:"token comment"}},[t._v("// After creating a value.")]),t._v("\n afterCreate"),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("newlyInsertedRecord"),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" next"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token comment"}},[t._v("// Do some stuff")]),t._v("\n "),a("span",{attrs:{class:"token function"}},[t._v("next")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),a("span",{attrs:{class:"token comment"}},[t._v("/**\n * Lifecycle callbacks on update\n */")]),t._v("\n\n "),a("span",{attrs:{class:"token comment"}},[t._v("// Before updating a value.")]),t._v("\n beforeUpdate"),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("valuesToUpdate"),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" next"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token comment"}},[t._v("// Do some stuff")]),t._v("\n "),a("span",{attrs:{class:"token function"}},[t._v("next")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),a("span",{attrs:{class:"token comment"}},[t._v("// After updating a value.")]),t._v("\n afterUpdate"),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("updatedRecord"),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" next"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token comment"}},[t._v("// Do some stuff")]),t._v("\n "),a("span",{attrs:{class:"token function"}},[t._v("next")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),a("span",{attrs:{class:"token comment"}},[t._v("/**\n * Lifecycle callbacks on destroy\n */")]),t._v("\n\n "),a("span",{attrs:{class:"token comment"}},[t._v("// Before destroying a value.")]),t._v("\n beforeDestroy"),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("criteria"),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" next"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token comment"}},[t._v("// Do some stuff")]),t._v("\n "),a("span",{attrs:{class:"token function"}},[t._v("next")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),a("span",{attrs:{class:"token comment"}},[t._v("// After destroying a value.")]),t._v("\n afterDestroy"),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("destroyedRecords"),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" next"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token comment"}},[t._v("// Do some stuff")]),t._v("\n "),a("span",{attrs:{class:"token function"}},[t._v("next")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])])}],!1,null,null,null);e.options.__file="models.md";s.default=e.exports}}]); \ No newline at end of file diff --git a/docs/.vuepress/dist/assets/js/17.1c93d494.js b/docs/.vuepress/dist/assets/js/17.1c93d494.js new file mode 100644 index 0000000000..f1a4a58550 --- /dev/null +++ b/docs/.vuepress/dist/assets/js/17.1c93d494.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[17],{222:function(t,a,s){"use strict";s.r(a);var n=s(0),e=Object(n.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("div",{staticClass:"content"},[s("h1",{attrs:{id:"query-interface"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#query-interface","aria-hidden":"true"}},[t._v("#")]),t._v(" Query Interface")]),t._v(" "),s("p",[t._v("The Waterline Query Interface allows you to interact with your models the same\nway no matter which adapter they are using. This means you can use the same Query\nLanguage whether your data lives in MySQL, MongoDB, PostgreSQL, etc.")]),t._v(" "),s("h2",{attrs:{id:"query-methods"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#query-methods","aria-hidden":"true"}},[t._v("#")]),t._v(" Query Methods")]),t._v(" "),s("p",[t._v("Every model in Waterline will have a set of query methods exposed on it to allow\nyou to interact with the database in a normalized fashion.\nThese are known as the CRUD ("),s("code",[t._v("Create")]),t._v(", "),s("code",[t._v("Read")]),t._v(", "),s("code",[t._v("Update")]),t._v(" and "),s("code",[t._v("Delete")]),t._v(") methods and\nis the primary way of interacting with your data.")]),t._v(" "),s("p",[t._v("There are also a special set of queries known as "),s("em",[t._v("dynamic queries")]),t._v(".\nThese are special class methods that are dynamically generated when you initialize Waterline.\nWe call them dynamic finders. They perform many of the same functions as the other class\nmethods but you can call them directly on an attribute in your model.")]),t._v(" "),s("p",[t._v("For most class methods, the callback parameter is optional and if one is not supplied,\nit will return a chainable object.")]),t._v(" "),s("h3",{attrs:{id:"find-criteria-callback"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#find-criteria-callback","aria-hidden":"true"}},[t._v("#")]),t._v(" .find(criteria, [callback])")]),t._v(" "),s("p",[s("code",[t._v("find")]),t._v(" will return an array of records that match the supplied criteria.\nCriteria can be built using the Query Language.")]),t._v(" "),s("ul",[s("li",[t._v("The "),s("code",[t._v("criteria")]),t._v(" is required and accepts "),s("code",[t._v("{}")]),t._v(", "),s("code",[t._v("[{}]")]),t._v(", "),s("code",[t._v("string")]),t._v(" and "),s("code",[t._v("int")]),t._v(" data types.")]),t._v(" "),s("li",[t._v("The "),s("code",[t._v("callback")]),t._v(" function is optional.")])]),t._v(" "),s("p",[t._v("Any string arguments passed must be the ID of the record.\nThis method will always return records in an array.\nIf you are trying to find an attribute that is an array, you must wrap it in an additional\nset of brackets otherwise Waterline will think you want to perform an "),s("code",[t._v("inQuery")]),t._v(".")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("User"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("find")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n name"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token string"}},[t._v("'Walter Jr'")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("exec")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("err"),s("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" users"),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("err"),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("log")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("err"),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n console"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("log")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("users"),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h3",{attrs:{id:"findone-criteria-callback"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#findone-criteria-callback","aria-hidden":"true"}},[t._v("#")]),t._v(" .findOne(criteria, [callback])")]),t._v(" "),s("p",[s("code",[t._v("findOne")]),t._v(" will return an object with the first matching result in the data store.")]),t._v(" "),s("ul",[s("li",[t._v("The "),s("code",[t._v("criteria")]),t._v(" is required and accepts "),s("code",[t._v("{}")]),t._v(", "),s("code",[t._v("[{}]")]),t._v(", "),s("code",[t._v("string")]),t._v(" and "),s("code",[t._v("int")]),t._v(" data types.")]),t._v(" "),s("li",[t._v("The "),s("code",[t._v("callback")]),t._v(" function is optional.")])]),t._v(" "),s("p",[t._v("Any string arguments passed must be the ID of the record.\nIf you are trying to find an attribute that is an array, you must wrap it in an additional\nset of brackets otherwise Waterline will think you want to perform an "),s("code",[t._v("inQuery")]),t._v(".")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("User"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("findOne")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n name"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token string"}},[t._v("'Walter Jr'")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("exec")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("err"),s("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" user"),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("err"),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("log")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("err"),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n console"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("log")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("user"),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h3",{attrs:{id:"create-criteria-callback"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#create-criteria-callback","aria-hidden":"true"}},[t._v("#")]),t._v(" .create(criteria, [callback])")]),t._v(" "),s("p",[s("code",[t._v("create")]),t._v(" will attempt to create a new record in the datastore.\nIf the data is valid and passes all validations it will be sent to the adapters "),s("code",[t._v("create")]),t._v(" method.")]),t._v(" "),s("ul",[s("li",[t._v("The "),s("code",[t._v("criteria")]),t._v(" is required and accepts "),s("code",[t._v("{}")]),t._v(" and "),s("code",[t._v("[{}]")]),t._v(" data types.")]),t._v(" "),s("li",[t._v("The "),s("code",[t._v("callback")]),t._v(" function is optional.")])]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("User"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("create")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n name"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token string"}},[t._v("'Walter Jr'")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("exec")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("err"),s("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" user"),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("err"),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("log")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("err"),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n console"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("log")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("user"),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h3",{attrs:{id:"findorcreate-criteria-values-callback"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#findorcreate-criteria-values-callback","aria-hidden":"true"}},[t._v("#")]),t._v(" .findOrCreate(criteria, [values, callback])")]),t._v(" "),s("p",[s("code",[t._v("findOrCreate")]),t._v(" will return a single record if one was found or created,\nor an array of records if multiple get found/created via the supplied criteria or values.\nCriteria can be built using the Query Language.")]),t._v(" "),s("ul",[s("li",[t._v("The "),s("code",[t._v("criteria")]),t._v(" is required and accepts "),s("code",[t._v("{}")]),t._v(", "),s("code",[t._v("[{}]")]),t._v(", "),s("code",[t._v("string")]),t._v(" and "),s("code",[t._v("int")]),t._v(" data types.")]),t._v(" "),s("li",[t._v("The "),s("code",[t._v("values")]),t._v(" is optional and accepts "),s("code",[t._v("{}")]),t._v(" and "),s("code",[t._v("[{}]")]),t._v(" data types.")]),t._v(" "),s("li",[t._v("The "),s("code",[t._v("callback")]),t._v(" function is optional.")])]),t._v(" "),s("p",[t._v("Any string arguments passed must be the ID of the record.\nThis method can return a single record or an array of records.\nIf a model is not found and creation values are omitted, it will get created with the supplied criteria values.")]),t._v(" "),s("p",[t._v("Unless an adapter implements its own version of "),s("code",[t._v("findOrCreate")]),t._v(", "),s("code",[t._v("findOrCreate")]),t._v(" will do the\n"),s("code",[t._v("find")]),t._v(" and "),s("code",[t._v("create")]),t._v(" calls in two separate steps (not transactional).\nIn a high frequency scenario it's possible for duplicates to be created if the query field(s) are not indexed.")]),t._v(" "),s("p",[t._v('Either user(s) with the name "Walter Jr" get returned or\na single user gets created with the name "Walter Jr" and returned:')]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("User"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("findOrCreate")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n name"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token string"}},[t._v("'Walter Jr'")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("exec")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("err"),s("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" users"),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("err"),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("log")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("err"),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n console"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("log")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("users"),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h3",{attrs:{id:"update-search-criteria-values-callback"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#update-search-criteria-values-callback","aria-hidden":"true"}},[t._v("#")]),t._v(" .update(search criteria, values, [callback])")]),t._v(" "),s("p",[s("code",[t._v("update")]),t._v(" will attempt to update any records matching the criteria passed in.\nCriteria can be built using the Query Language.")]),t._v(" "),s("ul",[s("li",[t._v("The "),s("code",[t._v("criteria")]),t._v(" is required and accepts "),s("code",[t._v("{}")]),t._v(", "),s("code",[t._v("[{}]")]),t._v(", "),s("code",[t._v("string")]),t._v(" and "),s("code",[t._v("int")]),t._v(" data types.")]),t._v(" "),s("li",[t._v("The "),s("code",[t._v("values")]),t._v(" is required and accepts "),s("code",[t._v("{}")]),t._v(" and "),s("code",[t._v("[{}]")]),t._v(" data types.")]),t._v(" "),s("li",[t._v("The "),s("code",[t._v("callback")]),t._v(" function is optional.")])]),t._v(" "),s("p",[t._v("Although you may pass "),s("code",[t._v(".update()")]),t._v(" an object or an array of objects,\nit will always return an array of objects. Any string arguments passed must be the ID\nof the record. If you specify a primary key instead of a criteria object,\nany "),s("code",[t._v(".where()")]),t._v(" filters will be ignored.")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("User"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("update")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n name"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token string"}},[t._v("'Walter Jr'")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n name"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token string"}},[t._v("'Flynn'")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("exec")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("err"),s("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" user"),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("err"),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("log")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("err"),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n console"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("log")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("user"),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h3",{attrs:{id:"destroy-criteria-callback"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#destroy-criteria-callback","aria-hidden":"true"}},[t._v("#")]),t._v(" .destroy(criteria, [callback])")]),t._v(" "),s("p",[s("code",[t._v("destroy")]),t._v(" will destroy any records matching the provided criteria.\nCriteria can be built using the Query Language.")]),t._v(" "),s("ul",[s("li",[t._v("The "),s("code",[t._v("criteria")]),t._v(" is required and accepts "),s("code",[t._v("{}")]),t._v(", "),s("code",[t._v("[{}]")]),t._v(", "),s("code",[t._v("string")]),t._v(" and "),s("code",[t._v("int")]),t._v(" data types.")]),t._v(" "),s("li",[t._v("The "),s("code",[t._v("callback")]),t._v(" function is optional.")])]),t._v(" "),s("p",[t._v("If you want to confirm the record exists before you delete it,\nyou must first perform a "),s("code",[t._v(".find()")]),t._v(". Any string arguments passed must be the ID of the record.")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("User"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("destroy")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n name"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token string"}},[t._v("'Flynn'")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("exec")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("err"),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("err"),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("log")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("err"),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h3",{attrs:{id:"query-query-data-callback"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#query-query-data-callback","aria-hidden":"true"}},[t._v("#")]),t._v(" .query(query, [data], callback)")]),t._v(" "),s("p",[t._v("Some adapters, such as "),s("code",[t._v("sails-mysql")]),t._v(" and "),s("code",[t._v("sails-postgresql")]),t._v(", support the query function\nwhich will run the provided RAW query against the database.\nThis can sometimes be useful if you want to run complex queries and performance is very important.")]),t._v(" "),s("ul",[s("li",[t._v("The "),s("code",[t._v("query")]),t._v(" is required and accepts "),s("code",[t._v("string")]),t._v(" data types.")]),t._v(" "),s("li",[t._v("The "),s("code",[t._v("data")]),t._v(" is optional and accepts "),s("code",[t._v("array")]),t._v(" data types.")]),t._v(" "),s("li",[t._v("The "),s("code",[t._v("callback")]),t._v(" function is required.")])]),t._v(" "),s("p",[t._v("The type of the results returned depend on your adapter: "),s("code",[t._v("sails-mysql")]),t._v(" returns an array of objects\nand "),s("code",[t._v("sails-postgresql")]),t._v(" returns an object containing metadata and the actual results within a 'rows' array.\nThis function does currently not support promises.")]),t._v(" "),s("p",[t._v("Using PostgreSQL:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{attrs:{class:"token keyword"}},[t._v("const")]),t._v(" title "),s("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{attrs:{class:"token string"}},[t._v('"The King\'s Speech"')]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nMovie"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("query")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token string"}},[t._v("'SELECT * FROM movie WHERE title = $1'")]),s("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("[")]),t._v("title"),s("span",{attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("err"),s("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" results"),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("log")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token string"}},[t._v("'Found the following movie: '")]),s("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" results"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("rows"),s("span",{attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{attrs:{class:"token number"}},[t._v("0")]),s("span",{attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("Using MySQL:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{attrs:{class:"token keyword"}},[t._v("const")]),t._v(" title "),s("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{attrs:{class:"token string"}},[t._v('"The King\'s Speech"')]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nMovie"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("query")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token string"}},[t._v("'SELECT * FROM movie WHERE title = $1'")]),s("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("[")]),t._v("title"),s("span",{attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("err"),s("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" results"),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("log")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token string"}},[t._v("'Found the following movie: '")]),s("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" results"),s("span",{attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{attrs:{class:"token number"}},[t._v("0")]),s("span",{attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h2",{attrs:{id:"query-language"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#query-language","aria-hidden":"true"}},[t._v("#")]),t._v(" Query Language")]),t._v(" "),s("p",[t._v("The Waterline Query Language is an object based criteria used to retrieve the\nrecords from any of the supported database adapters.\nThis allows you to change your database without changing your codebase.")]),t._v(" "),s("p",[t._v("All queries inside of Waterline are case insensitive. This allows for easier querying\nbut makes indexing strings tough. This is something to be aware of if you are\nindexing and searching on string fields.")]),t._v(" "),s("h3",{attrs:{id:"query-language-basics"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#query-language-basics","aria-hidden":"true"}},[t._v("#")]),t._v(" Query Language Basics")]),t._v(" "),s("p",[t._v("The criteria objects are formed using one of four types of object keys.\nThese are the top level keys used in a query object. It is loosely based on the\ncriteria used in MongoDB with a few slight variations.")]),t._v(" "),s("p",[t._v("Queries can be built using either a "),s("code",[t._v("where")]),t._v(" key to specify attributes,\nwhich will allow you to also use query options such as "),s("code",[t._v("limit")]),t._v(" and "),s("code",[t._v("skip")]),t._v(" or\nif "),s("code",[t._v("where")]),t._v(" is excluded the entire object will be treated as a "),s("code",[t._v("where")]),t._v(" criteria.")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("User"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("find")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n where"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n name"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token string"}},[t._v("'John'")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n skip"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token number"}},[t._v("20")]),s("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n limit"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token number"}},[t._v("10")]),s("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n sort"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token string"}},[t._v("'name DESC'")]),t._v("\n"),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("Or:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("User"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("find")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n name"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token string"}},[t._v("'John'")]),t._v("\n"),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h4",{attrs:{id:"key-pairs"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#key-pairs","aria-hidden":"true"}},[t._v("#")]),t._v(" Key Pairs")]),t._v(" "),s("p",[t._v("A key pair can be used to search records for values matching exactly what is specified.\nThis is the base of a criteria object where the key represents an attribute on a model\nand the value is a strict equality check of the records for matching values.")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("User"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("find")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n name"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token string"}},[t._v("'John'")]),t._v("\n"),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("They can be used together to search multiple attributes:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("User"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("find")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n name"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token string"}},[t._v("'John'")]),s("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n country"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token string"}},[t._v("'France'")]),t._v("\n"),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h4",{attrs:{id:"modified-pairs"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#modified-pairs","aria-hidden":"true"}},[t._v("#")]),t._v(" Modified Pairs")]),t._v(" "),s("p",[t._v("Modified pairs also have model attributes for keys but they also use any of the\nsupported criteria modifiers to perform queries where a strict equality check wouldn't work.")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("User"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("find")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n name"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n contains"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token string"}},[t._v("'alt'")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("h4",{attrs:{id:"in-pairs"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#in-pairs","aria-hidden":"true"}},[t._v("#")]),t._v(" In Pairs")]),t._v(" "),s("p",[t._v("In queries work similarly to MySQL "),s("code",[t._v("in")]),t._v(" queries. Each element in the array is treated as "),s("code",[t._v("or")]),t._v(".")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("User"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("find")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n name"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{attrs:{class:"token string"}},[t._v("'John'")]),s("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{attrs:{class:"token string"}},[t._v("'Walter'")]),s("span",{attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h4",{attrs:{id:"not-in-pairs"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#not-in-pairs","aria-hidden":"true"}},[t._v("#")]),t._v(" Not-In Pairs")]),t._v(" "),s("p",[t._v("Not-In queries work similar to "),s("code",[t._v("in")]),t._v(" queries, except for the nested object criteria.")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("User"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("find")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n name"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{attrs:{class:"token string"}},[t._v("'!'")]),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{attrs:{class:"token string"}},[t._v("'John'")]),s("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{attrs:{class:"token string"}},[t._v("'Walter'")]),s("span",{attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h4",{attrs:{id:"or-pairs"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#or-pairs","aria-hidden":"true"}},[t._v("#")]),t._v(" Or Pairs")]),t._v(" "),s("p",[t._v("Performing "),s("code",[t._v("OR")]),t._v(" queries is done by using an array of query pairs.\nResults will be returned that match any of the criteria objects inside the array.")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("User"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("find")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n or"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n name"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token string"}},[t._v("'John'")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n occupation"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token string"}},[t._v("'Developer'")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h3",{attrs:{id:"criteria-modifiers"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#criteria-modifiers","aria-hidden":"true"}},[t._v("#")]),t._v(" Criteria Modifiers")]),t._v(" "),s("p",[t._v("The following modifiers are available to use when building queries:")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("<")]),t._v(" or "),s("code",[t._v("lessThan")])]),t._v(" "),s("li",[s("code",[t._v("<=")]),t._v(" or "),s("code",[t._v("lessThanOrEqual")])]),t._v(" "),s("li",[s("code",[t._v(">")]),t._v(" or "),s("code",[t._v("greaterThan")])]),t._v(" "),s("li",[s("code",[t._v(">=")]),t._v(" or "),s("code",[t._v("greaterThanOrEqual")])]),t._v(" "),s("li",[s("code",[t._v("!")]),t._v(" or "),s("code",[t._v("not")])]),t._v(" "),s("li",[s("code",[t._v("like")])]),t._v(" "),s("li",[s("code",[t._v("contains")])]),t._v(" "),s("li",[s("code",[t._v("startsWith")])]),t._v(" "),s("li",[s("code",[t._v("endsWith")])])]),t._v(" "),s("h4",{attrs:{id:"or-lessthan"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#or-lessthan","aria-hidden":"true"}},[t._v("#")]),t._v(" < or lessThan")]),t._v(" "),s("p",[t._v("Searches for records where the value is less than the value specified.")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("User"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("find")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n age"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{attrs:{class:"token string"}},[t._v("'<'")]),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token number"}},[t._v("30")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h4",{attrs:{id:"or-lessthanorequal"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#or-lessthanorequal","aria-hidden":"true"}},[t._v("#")]),t._v(" <= or lessThanOrEqual")]),t._v(" "),s("p",[t._v("Searches for records where the value is less or equal to the value specified.")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("User"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("find")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n age"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{attrs:{class:"token string"}},[t._v("'<='")]),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token number"}},[t._v("21")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h4",{attrs:{id:"or-greaterthan"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#or-greaterthan","aria-hidden":"true"}},[t._v("#")]),t._v(" > or greaterThan")]),t._v(" "),s("p",[t._v("Searches for records where the value is more than the value specified.")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("User"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("find")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n age"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{attrs:{class:"token string"}},[t._v("'>'")]),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token number"}},[t._v("18")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h4",{attrs:{id:"or-greaterthanorequal"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#or-greaterthanorequal","aria-hidden":"true"}},[t._v("#")]),t._v(" >= or greaterThanOrEqual")]),t._v(" "),s("p",[t._v("Searches for records where the value is more or equal to the value specified.")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("User"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("find")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n age"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{attrs:{class:"token string"}},[t._v("'>='")]),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token number"}},[t._v("21")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h4",{attrs:{id:"or-not"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#or-not","aria-hidden":"true"}},[t._v("#")]),t._v(" ! or not")]),t._v(" "),s("p",[t._v("Searches for records where the value is not equal to the value specified.")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("User"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("find")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n name"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{attrs:{class:"token string"}},[t._v("'!'")]),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token string"}},[t._v("'John'")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h4",{attrs:{id:"like"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#like","aria-hidden":"true"}},[t._v("#")]),t._v(" like")]),t._v(" "),s("p",[t._v("Searches for records using pattern matching with the "),s("code",[t._v("%")]),t._v(" sign.")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("User"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("find")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n food"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{attrs:{class:"token string"}},[t._v("'like'")]),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token string"}},[t._v("'%burgers'")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h4",{attrs:{id:"contains"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#contains","aria-hidden":"true"}},[t._v("#")]),t._v(" contains")]),t._v(" "),s("p",[t._v("A shorthand for pattern matching both sides of a string.\nWill return records where the value contains the string anywhere inside of it.")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("User"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("find")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{attrs:{class:"token keyword"}},[t._v("class")]),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{attrs:{class:"token string"}},[t._v("'like'")]),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token string"}},[t._v("'%history%'")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("User"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("find")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{attrs:{class:"token keyword"}},[t._v("class")]),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{attrs:{class:"token string"}},[t._v("'contains'")]),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token string"}},[t._v("'history'")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h4",{attrs:{id:"startswith"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#startswith","aria-hidden":"true"}},[t._v("#")]),t._v(" startsWith")]),t._v(" "),s("p",[t._v("A shorthand for pattern matching the right side of a string\nWill return records where the value starts with the supplied string value.")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("User"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("find")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{attrs:{class:"token keyword"}},[t._v("class")]),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{attrs:{class:"token string"}},[t._v("'startsWith'")]),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token string"}},[t._v("'french'")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("User"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("find")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{attrs:{class:"token keyword"}},[t._v("class")]),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{attrs:{class:"token string"}},[t._v("'like'")]),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token string"}},[t._v("'french%'")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h4",{attrs:{id:"endswith"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#endswith","aria-hidden":"true"}},[t._v("#")]),t._v(" endsWith")]),t._v(" "),s("p",[t._v("A shorthand for pattern matching the left side of a string.\nWill return records where the value ends with the supplied string value.")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("User"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("find")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{attrs:{class:"token keyword"}},[t._v("class")]),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{attrs:{class:"token string"}},[t._v("'endsWith'")]),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token string"}},[t._v("'can'")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("User"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("find")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{attrs:{class:"token keyword"}},[t._v("class")]),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{attrs:{class:"token string"}},[t._v("'like'")]),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token string"}},[t._v("'%can'")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h4",{attrs:{id:"date-ranges"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#date-ranges","aria-hidden":"true"}},[t._v("#")]),t._v(" Date Ranges")]),t._v(" "),s("p",[t._v("You can do date range queries using the comparison operators.")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("User"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("find")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n date"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{attrs:{class:"token string"}},[t._v("'>'")]),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{attrs:{class:"token class-name"}},[t._v("Date")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token string"}},[t._v("'2/4/2014'")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{attrs:{class:"token string"}},[t._v("'<'")]),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{attrs:{class:"token class-name"}},[t._v("Date")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token string"}},[t._v("'2/7/2014'")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h3",{attrs:{id:"query-options"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#query-options","aria-hidden":"true"}},[t._v("#")]),t._v(" Query Options")]),t._v(" "),s("p",[t._v("Query options allow you refine the results that are returned from a query.")]),t._v(" "),s("h4",{attrs:{id:"limit-results"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#limit-results","aria-hidden":"true"}},[t._v("#")]),t._v(" Limit results")]),t._v(" "),s("p",[t._v("Limit the number of results returned from a query.")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("User"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("find")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n where"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n name"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token string"}},[t._v("'John'")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n limit"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token number"}},[t._v("20")]),t._v("\n"),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h4",{attrs:{id:"skip-results"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#skip-results","aria-hidden":"true"}},[t._v("#")]),t._v(" Skip results")]),t._v(" "),s("p",[t._v("Return all the results excluding the number of items to skip.")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("User"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("find")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n where"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n name"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token string"}},[t._v("'John'")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n skip"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token number"}},[t._v("10")]),t._v("\n"),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h4",{attrs:{id:"pagination"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#pagination","aria-hidden":"true"}},[t._v("#")]),t._v(" Pagination")]),t._v(" "),s("p",[s("code",[t._v("skip")]),t._v(" and "),s("code",[t._v("limit")]),t._v(" can be used together to build up a pagination system.")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("User"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("find")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n where"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n name"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token string"}},[t._v("'John'")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n limit"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token number"}},[t._v("10")]),s("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n skip"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token number"}},[t._v("10")]),t._v("\n"),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h4",{attrs:{id:"sort-results"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#sort-results","aria-hidden":"true"}},[t._v("#")]),t._v(" Sort results")]),t._v(" "),s("p",[t._v("Results can be sorted by attribute name. Simply specify an attribute name for\nnatural (ascending) sort, or specify an "),s("code",[t._v("asc")]),t._v(" or "),s("code",[t._v("desc")]),t._v(" flag for ascending or\ndescending orders respectively.")]),t._v(" "),s("p",[t._v("Sort by name in ascending order:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("User"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("find")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n where"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n name"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token string"}},[t._v("'John'")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n sort"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token string"}},[t._v("'name'")]),t._v("\n"),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("Sort by name in descending order:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("User"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("find")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n where"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n name"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token string"}},[t._v("'John'")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n sort"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token string"}},[t._v("'name DESC'")]),t._v("\n"),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("Sort by name in ascending order:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("User"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("find")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n where"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n name"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token string"}},[t._v("'John'")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n sort"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token string"}},[t._v("'name ASC'")]),t._v("\n"),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("Sort by binary notation")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("User"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("find")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n where"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n name"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token string"}},[t._v("'John'")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n sort"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n name"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token number"}},[t._v("1")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("Sort by multiple attributes:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("User"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("find")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n where"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n name"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token string"}},[t._v("'John'")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n sort"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n name"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token number"}},[t._v("1")]),s("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n age"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token number"}},[t._v("0")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h4",{attrs:{id:"select-a-field"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#select-a-field","aria-hidden":"true"}},[t._v("#")]),t._v(" Select a field")]),t._v(" "),s("p",[t._v("Apply a projection to a Waterline query.")]),t._v(" "),s("p",[t._v("This example only returns the field name:")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("User"),s("span",{attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{attrs:{class:"token function"}},[t._v("find")]),s("span",{attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n where"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n age"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{attrs:{class:"token string"}},[t._v("'<'")]),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token number"}},[t._v("30")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n select"),s("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{attrs:{class:"token string"}},[t._v("'name'")]),s("span",{attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])])}],!1,null,null,null);e.options.__file="queries.md";a.default=e.exports}}]); \ No newline at end of file diff --git a/docs/.vuepress/dist/assets/js/18.e1f1758f.js b/docs/.vuepress/dist/assets/js/18.e1f1758f.js new file mode 100644 index 0000000000..469d3450bc --- /dev/null +++ b/docs/.vuepress/dist/assets/js/18.e1f1758f.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[18],{221:function(t,s,a){"use strict";a.r(s);var e=a(0),n=Object(e.a)({},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"content"},[t._m(0),t._v(" "),t._m(1),t._v(" "),t._m(2),t._v(" "),t._m(3),t._v(" "),a("p",[t._v("Request header object.")]),t._v(" "),t._m(4),t._v(" "),t._m(5),t._v(" "),t._m(6),t._v(" "),a("p",[t._v("Request method.")]),t._v(" "),t._m(7),t._v(" "),t._m(8),t._v(" "),t._m(9),t._v(" "),t._m(10),t._v(" "),t._m(11),t._v(" "),a("p",[t._v("Get request URL.")]),t._v(" "),t._m(12),t._v(" "),a("p",[t._v("Set request URL, useful for url rewrites.")]),t._v(" "),t._m(13),t._v(" "),a("p",[t._v("Get request original URL.")]),t._v(" "),t._m(14),t._v(" "),t._m(15),t._v(" "),t._m(16),t._m(17),t._v(" "),t._m(18),t._v(" "),t._m(19),t._m(20),t._v(" "),a("p",[t._v("Get request pathname.")]),t._v(" "),t._m(21),t._v(" "),a("p",[t._v("Set request pathname and retain query-string when present.")]),t._v(" "),t._m(22),t._v(" "),t._m(23),t._v(" "),t._m(24),t._v(" "),a("p",[t._v("Set raw query string.")]),t._v(" "),t._m(25),t._v(" "),t._m(26),t._v(" "),t._m(27),t._v(" "),a("p",[t._v("Set raw query string.")]),t._v(" "),t._m(28),t._v(" "),t._m(29),t._v(" "),t._m(30),t._v(" "),t._m(31),t._v(" "),t._m(32),t._v(" "),t._m(33),t._v(" "),t._m(34),t._m(35),t._v(" "),t._m(36),t._v(" "),t._m(37),t._m(38),t._v(" "),t._m(39),t._v(" "),a("p",[t._v('For example "color=blue&size=small":')]),t._v(" "),t._m(40),t._m(41),t._v(" "),t._m(42),t._v(" "),t._m(43),t._m(44),t._v(" "),t._m(45),t._v(" "),t._m(46),t._m(47),t._v(" "),t._m(48),t._v(" "),t._m(49),t._v(" "),t._m(50),t._v(" "),t._m(51),t._v(" "),t._m(52),t._v(" "),t._m(53),t._v(" "),t._m(54),t._v(" "),t._m(55),t._v(" "),t._m(56),t._v(" "),t._m(57),t._v(" "),a("p",[t._v("Return subdomains as an array.")]),t._v(" "),t._m(58),t._v(" "),t._m(59),t._v(" "),t._m(60),t._v(" "),t._m(61),t._v(" "),t._m(62),a("p",[t._v("For example if you want to ensure that\nonly images are sent to a given route:")]),t._v(" "),t._m(63),t._m(64),t._v(" "),a("p",[t._v("Strapi's "),a("code",[t._v("request")]),t._v(" object includes helpful content negotiation utilities powered by\n"),a("a",{attrs:{href:"http://github.com/expressjs/accepts",target:"_blank",rel:"noopener noreferrer"}},[t._v("accepts"),a("OutboundLink")],1),t._v(" and\n"),a("a",{attrs:{href:"https://github.com/federomero/negotiator",target:"_blank",rel:"noopener noreferrer"}},[t._v("negotiator"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("p",[t._v("These utilities are:")]),t._v(" "),t._m(65),t._v(" "),a("p",[t._v("If no types are supplied, all acceptable types are returned.")]),t._v(" "),t._m(66),t._v(" "),a("p",[t._v("In the case of missing accept headers where any type is acceptable, the first type will\nbe returned. Thus, the order of types you supply is important.")]),t._v(" "),t._m(67),t._v(" "),t._m(68),t._v(" "),t._m(69),t._m(70),t._v(" "),t._m(71),t._m(72),t._v(" "),t._m(73),t._v(" "),t._m(74),a("p",[t._v("When no arguments are given all accepted encodings\nare returned as an array:")]),t._v(" "),t._m(75),t._m(76),t._v(" "),t._m(77),t._v(" "),t._m(78),t._v(" "),t._m(79),a("p",[t._v("When no arguments are given all accepted charsets\nare returned as an array:")]),t._v(" "),t._m(80),t._m(81),t._v(" "),t._m(82),t._v(" "),t._m(83),a("p",[t._v("When no arguments are given all accepted languages\nare returned as an array:")]),t._v(" "),t._m(84),t._m(85),t._v(" "),a("p",[t._v("Check if the request is idempotent.")]),t._v(" "),t._m(86),t._v(" "),a("p",[t._v("Return the request socket.")]),t._v(" "),t._m(87),t._v(" "),a("p",[t._v("Return request header.")])])},[function(){var t=this.$createElement,s=this._self._c||t;return s("h1",{attrs:{id:"request"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#request","aria-hidden":"true"}},[this._v("#")]),this._v(" Request")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("A Strapi "),s("code",[this._v("Request")]),this._v(" object is an abstraction on top of Node's vanilla request object,\nproviding additional functionality that is useful for every day HTTP server\ndevelopment.")])},function(){var t=this.$createElement,s=this._self._c||t;return s("h2",{attrs:{id:"api"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#api","aria-hidden":"true"}},[this._v("#")]),this._v(" API")])},function(){var t=this.$createElement,s=this._self._c||t;return s("h3",{attrs:{id:"request-header"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#request-header","aria-hidden":"true"}},[this._v("#")]),this._v(" request.header")])},function(){var t=this.$createElement,s=this._self._c||t;return s("h3",{attrs:{id:"request-headers"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#request-headers","aria-hidden":"true"}},[this._v("#")]),this._v(" request.headers")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("Request header object. Alias as "),s("code",[this._v("request.header")]),this._v(".")])},function(){var t=this.$createElement,s=this._self._c||t;return s("h3",{attrs:{id:"request-method"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#request-method","aria-hidden":"true"}},[this._v("#")]),this._v(" request.method")])},function(){var t=this.$createElement,s=this._self._c||t;return s("h3",{attrs:{id:"request-method-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#request-method-2","aria-hidden":"true"}},[this._v("#")]),this._v(" request.method=")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("Set request method, useful for implementing middleware\nsuch as "),s("code",[this._v("methodOverride()")]),this._v(".")])},function(){var t=this.$createElement,s=this._self._c||t;return s("h3",{attrs:{id:"request-length"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#request-length","aria-hidden":"true"}},[this._v("#")]),this._v(" request.length")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("Return request Content-Length as a number when present, or "),s("code",[this._v("undefined")]),this._v(".")])},function(){var t=this.$createElement,s=this._self._c||t;return s("h3",{attrs:{id:"request-url"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#request-url","aria-hidden":"true"}},[this._v("#")]),this._v(" request.url")])},function(){var t=this.$createElement,s=this._self._c||t;return s("h3",{attrs:{id:"request-url-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#request-url-2","aria-hidden":"true"}},[this._v("#")]),this._v(" request.url=")])},function(){var t=this.$createElement,s=this._self._c||t;return s("h3",{attrs:{id:"request-originalurl"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#request-originalurl","aria-hidden":"true"}},[this._v("#")]),this._v(" request.originalUrl")])},function(){var t=this.$createElement,s=this._self._c||t;return s("h3",{attrs:{id:"request-origin"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#request-origin","aria-hidden":"true"}},[this._v("#")]),this._v(" request.origin")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("Get origin of URL, include "),s("code",[this._v("protocol")]),this._v(" and "),s("code",[this._v("host")]),this._v(".")])},function(){var t=this.$createElement,s=this._self._c||t;return s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{attrs:{class:"token keyword"}},[this._v("this")]),s("span",{attrs:{class:"token punctuation"}},[this._v(".")]),this._v("request"),s("span",{attrs:{class:"token punctuation"}},[this._v(".")]),this._v("origin\n"),s("span",{attrs:{class:"token comment"}},[this._v("// => http://example.com")]),this._v("\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("h3",{attrs:{id:"request-href"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#request-href","aria-hidden":"true"}},[this._v("#")]),this._v(" request.href")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("Get full request URL, include "),s("code",[this._v("protocol")]),this._v(", "),s("code",[this._v("host")]),this._v(" and "),s("code",[this._v("url")]),this._v(".")])},function(){var t=this.$createElement,s=this._self._c||t;return s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{attrs:{class:"token keyword"}},[this._v("this")]),s("span",{attrs:{class:"token punctuation"}},[this._v(".")]),this._v("request"),s("span",{attrs:{class:"token punctuation"}},[this._v(".")]),this._v("href\n"),s("span",{attrs:{class:"token comment"}},[this._v("// => http://example.com/foo/bar?q=1")]),this._v("\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("h3",{attrs:{id:"request-path"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#request-path","aria-hidden":"true"}},[this._v("#")]),this._v(" request.path")])},function(){var t=this.$createElement,s=this._self._c||t;return s("h3",{attrs:{id:"request-path-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#request-path-2","aria-hidden":"true"}},[this._v("#")]),this._v(" request.path=")])},function(){var t=this.$createElement,s=this._self._c||t;return s("h3",{attrs:{id:"request-querystring"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#request-querystring","aria-hidden":"true"}},[this._v("#")]),this._v(" request.querystring")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("Get raw query string void of "),s("code",[this._v("?")]),this._v(".")])},function(){var t=this.$createElement,s=this._self._c||t;return s("h3",{attrs:{id:"request-querystring-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#request-querystring-2","aria-hidden":"true"}},[this._v("#")]),this._v(" request.querystring=")])},function(){var t=this.$createElement,s=this._self._c||t;return s("h3",{attrs:{id:"request-search"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#request-search","aria-hidden":"true"}},[this._v("#")]),this._v(" request.search")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("Get raw query string with the "),s("code",[this._v("?")]),this._v(".")])},function(){var t=this.$createElement,s=this._self._c||t;return s("h3",{attrs:{id:"request-search-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#request-search-2","aria-hidden":"true"}},[this._v("#")]),this._v(" request.search=")])},function(){var t=this.$createElement,s=this._self._c||t;return s("h3",{attrs:{id:"request-host"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#request-host","aria-hidden":"true"}},[this._v("#")]),this._v(" request.host")])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("p",[t._v("Get host (hostname:port) when present. Supports "),a("code",[t._v("X-Forwarded-Host")]),t._v("\nwhen "),a("code",[t._v("strapi.app.proxy")]),t._v(" is "),a("code",[t._v("true")]),t._v(", otherwise "),a("code",[t._v("Host")]),t._v(" is used.")])},function(){var t=this.$createElement,s=this._self._c||t;return s("h3",{attrs:{id:"request-hostname"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#request-hostname","aria-hidden":"true"}},[this._v("#")]),this._v(" request.hostname")])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("p",[t._v("Get hostname when present. Supports "),a("code",[t._v("X-Forwarded-Host")]),t._v("\nwhen "),a("code",[t._v("strapi.app.proxy")]),t._v(" is "),a("code",[t._v("true")]),t._v(", otherwise "),a("code",[t._v("Host")]),t._v(" is used.")])},function(){var t=this.$createElement,s=this._self._c||t;return s("h3",{attrs:{id:"request-type"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#request-type","aria-hidden":"true"}},[this._v("#")]),this._v(" request.type")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("Get request "),s("code",[this._v("Content-Type")]),this._v(' void of parameters such as "charset".')])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ct "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("request"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("type"),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token comment"}},[t._v('// => "image/png"')]),t._v("\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("h3",{attrs:{id:"request-charset"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#request-charset","aria-hidden":"true"}},[this._v("#")]),this._v(" request.charset")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("Get request charset when present, or "),s("code",[this._v("undefined")]),this._v(":")])},function(){var t=this.$createElement,s=this._self._c||t;return s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{attrs:{class:"token keyword"}},[this._v("this")]),s("span",{attrs:{class:"token punctuation"}},[this._v(".")]),this._v("request"),s("span",{attrs:{class:"token punctuation"}},[this._v(".")]),this._v("charset\n"),s("span",{attrs:{class:"token comment"}},[this._v('// => "utf-8"')]),this._v("\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("h3",{attrs:{id:"request-query"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#request-query","aria-hidden":"true"}},[this._v("#")]),this._v(" request.query")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("Get parsed query-string, returning an empty object when no\nquery-string is present. Note that this getter does "),s("em",[this._v("not")]),this._v("\nsupport nested parsing.")])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n color"),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'blue'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n size"),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'small'")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("h3",{attrs:{id:"request-query-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#request-query-2","aria-hidden":"true"}},[this._v("#")]),this._v(" request.query=")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("Set query-string to the given object. Note that this\nsetter does "),s("em",[this._v("not")]),this._v(" support nested objects.")])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("query "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" next"),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'/login'")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("h3",{attrs:{id:"request-fresh"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#request-fresh","aria-hidden":"true"}},[this._v("#")]),this._v(" request.fresh")])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("p",[t._v('Check if a request cache is "fresh", aka the contents have not changed. This\nmethod is for cache negotiation between '),a("code",[t._v("If-None-Match")]),t._v(" / "),a("code",[t._v("ETag")]),t._v(", and\n"),a("code",[t._v("If-Modified-Since")]),t._v(" and "),a("code",[t._v("Last-Modified")]),t._v(". It should be referenced after setting\none or more of these response headers.")])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token comment"}},[t._v("// freshness check requires status 20x or 304")]),t._v("\n"),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("status "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{attrs:{class:"token number"}},[t._v("200")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token keyword"}},[t._v("set")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'ETag'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'123'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{attrs:{class:"token comment"}},[t._v("// cache is ok")]),t._v("\n"),a("span",{attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("fresh"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("status "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{attrs:{class:"token number"}},[t._v("304")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{attrs:{class:"token keyword"}},[t._v("return")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),a("span",{attrs:{class:"token comment"}},[t._v("// cache is stale")]),t._v("\n"),a("span",{attrs:{class:"token comment"}},[t._v("// fetch new data")]),t._v("\n"),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("body "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("yield")]),t._v(" db"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("find")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'something'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("h3",{attrs:{id:"request-stale"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#request-stale","aria-hidden":"true"}},[this._v("#")]),this._v(" request.stale")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("Inverse of "),s("code",[this._v("request.fresh")]),this._v(".")])},function(){var t=this.$createElement,s=this._self._c||t;return s("h3",{attrs:{id:"request-protocol"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#request-protocol","aria-hidden":"true"}},[this._v("#")]),this._v(" request.protocol")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v('Return request protocol, "https" or "http". Supports '),s("code",[this._v("X-Forwarded-Proto")]),this._v("\nwhen "),s("code",[this._v("strapi.app.proxy")]),this._v(" is "),s("code",[this._v("true")]),this._v(".")])},function(){var t=this.$createElement,s=this._self._c||t;return s("h3",{attrs:{id:"request-secure"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#request-secure","aria-hidden":"true"}},[this._v("#")]),this._v(" request.secure")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("Shorthand for "),s("code",[this._v('this.protocol == "https"')]),this._v(" to check if a request was\nissued via TLS.")])},function(){var t=this.$createElement,s=this._self._c||t;return s("h3",{attrs:{id:"request-ip"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#request-ip","aria-hidden":"true"}},[this._v("#")]),this._v(" request.ip")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("Request remote address. Supports "),s("code",[this._v("X-Forwarded-For")]),this._v(" when "),s("code",[this._v("strapi.app.proxy")]),this._v("\nis "),s("code",[this._v("true")]),this._v(".")])},function(){var t=this.$createElement,s=this._self._c||t;return s("h3",{attrs:{id:"request-ips"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#request-ips","aria-hidden":"true"}},[this._v("#")]),this._v(" request.ips")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("When "),s("code",[this._v("X-Forwarded-For")]),this._v(" is present and "),s("code",[this._v("strapi.app.proxy")]),this._v(" is enabled an array\nof these ips is returned, ordered from upstream -> downstream. When disabled\nan empty array is returned.")])},function(){var t=this.$createElement,s=this._self._c||t;return s("h3",{attrs:{id:"request-subdomains"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#request-subdomains","aria-hidden":"true"}},[this._v("#")]),this._v(" request.subdomains")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("Subdomains are the dot-separated parts of the host before the main domain of\nthe app. By default, the domain of the app is assumed to be the last two\nparts of the host. This can be changed by setting "),s("code",[this._v("strapi.app.subdomainOffset")]),this._v(".")])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("p",[t._v('For example, if the domain is "tobi.ferrets.example.com":\nIf '),a("code",[t._v("strapi.app.subdomainOffset")]),t._v(" is not set, this.subdomains is "),a("code",[t._v('["ferrets", "tobi"]')]),t._v(".\nIf "),a("code",[t._v("strapi.app.subdomainOffset")]),t._v(" is 3, this.subdomains is "),a("code",[t._v('["tobi"]')]),t._v(".")])},function(){var t=this.$createElement,s=this._self._c||t;return s("h3",{attrs:{id:"request-is-types"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#request-is-types","aria-hidden":"true"}},[this._v("#")]),this._v(" request.is(types...)")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v('Check if the incoming request contains the "Content-Type"\nheader field, and it contains any of the give mime '),s("code",[this._v("type")]),this._v("s.\nIf there is no request body, "),s("code",[this._v("undefined")]),this._v(" is returned.\nIf there is no content type, or the match fails "),s("code",[this._v("false")]),this._v(" is returned.\nOtherwise, it returns the matching content-type.")])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token comment"}},[t._v("// With Content-Type: text/html; charset=utf-8")]),t._v("\n"),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("is")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'html'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{attrs:{class:"token comment"}},[t._v("// => 'html'")]),t._v("\n"),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("is")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'text/html'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{attrs:{class:"token comment"}},[t._v("// => 'text/html'")]),t._v("\n"),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("is")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'text/*'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'text/html'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{attrs:{class:"token comment"}},[t._v("// => 'text/html'")]),t._v("\n\n"),a("span",{attrs:{class:"token operator"}},[t._v("/")]),a("span",{attrs:{class:"token operator"}},[t._v("/")]),t._v(" When Content"),a("span",{attrs:{class:"token operator"}},[t._v("-")]),t._v("Type is application"),a("span",{attrs:{class:"token operator"}},[t._v("/")]),t._v("json\n"),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("is")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'json'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'urlencoded'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{attrs:{class:"token operator"}},[t._v("/")]),a("span",{attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),a("span",{attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'json'")]),t._v("\n"),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("is")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'application/json'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{attrs:{class:"token operator"}},[t._v("/")]),a("span",{attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),a("span",{attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'application/json'")]),t._v("\n"),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("is")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'html'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'application/*'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{attrs:{class:"token comment"}},[t._v("// => 'application/json'")]),t._v("\n\n"),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("is")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'html'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{attrs:{class:"token operator"}},[t._v("/")]),a("span",{attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),a("span",{attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n")])])])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("is")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'image/*'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token comment"}},[t._v("// process")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token keyword"}},[t._v("throw")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token number"}},[t._v("415")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'images only!'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("h3",{attrs:{id:"content-negotiation"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#content-negotiation","aria-hidden":"true"}},[this._v("#")]),this._v(" Content Negotiation")])},function(){var t=this.$createElement,s=this._self._c||t;return s("ul",[s("li",[s("code",[this._v("request.accepts(types)")])]),this._v(" "),s("li",[s("code",[this._v("request.acceptsEncodings(types)")])]),this._v(" "),s("li",[s("code",[this._v("request.acceptsCharsets(charsets)")])]),this._v(" "),s("li",[s("code",[this._v("request.acceptsLanguages(langs)")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("If multiple types are supplied, the best match will be returned. If no matches are found,\na "),s("code",[this._v("false")]),this._v(" is returned, and you should send a "),s("code",[this._v('406 "Not Acceptable"')]),this._v(" response to the client.")])},function(){var t=this.$createElement,s=this._self._c||t;return s("h3",{attrs:{id:"request-accepts-types"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#request-accepts-types","aria-hidden":"true"}},[this._v("#")]),this._v(" request.accepts(types)")])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("p",[t._v("Check if the given "),a("code",[t._v("type(s)")]),t._v(" is acceptable, returning the best match when true, otherwise\n"),a("code",[t._v("false")]),t._v(". The "),a("code",[t._v("type")]),t._v(' value may be one or more mime type string\nsuch as "application/json", the extension name\nsuch as "json", or an array '),a("code",[t._v('["json", "html", "text/plain"]')]),t._v(".")])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token comment"}},[t._v("// Accept: text/html")]),t._v("\n"),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("accepts")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'html'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token comment"}},[t._v('// => "html"')]),t._v("\n\n"),a("span",{attrs:{class:"token comment"}},[t._v("// Accept: text/*, application/json")]),t._v("\n"),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("accepts")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'html'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token comment"}},[t._v('// => "html"')]),t._v("\n"),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("accepts")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'text/html'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token comment"}},[t._v('// => "text/html"')]),t._v("\n"),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("accepts")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'json'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'text'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token comment"}},[t._v('// => "json"')]),t._v("\n"),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("accepts")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'application/json'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token comment"}},[t._v('// => "application/json"')]),t._v("\n\n"),a("span",{attrs:{class:"token comment"}},[t._v("// Accept: text/*, application/json")]),t._v("\n"),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("accepts")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'image/png'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("accepts")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'png'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token comment"}},[t._v("// => false")]),t._v("\n\n"),a("span",{attrs:{class:"token comment"}},[t._v("// Accept: text/*;q=.5, application/json")]),t._v("\n"),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("accepts")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{attrs:{class:"token string"}},[t._v("'html'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'json'")]),a("span",{attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("accepts")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'html'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'json'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token comment"}},[t._v('// => "json"')]),t._v("\n\n"),a("span",{attrs:{class:"token comment"}},[t._v("// No Accept header")]),t._v("\n"),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("accepts")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'html'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'json'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token comment"}},[t._v('// => "html"')]),t._v("\n"),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("accepts")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'json'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'html'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token comment"}},[t._v('// => "json"')]),t._v("\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("You may call "),s("code",[this._v("this.accepts()")]),this._v(" as many times as you like,\nor use a switch:")])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token keyword"}},[t._v("switch")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("accepts")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'json'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'html'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'text'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token keyword"}},[t._v("case")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'json'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("break")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{attrs:{class:"token keyword"}},[t._v("case")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'html'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("break")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{attrs:{class:"token keyword"}},[t._v("case")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'text'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("break")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{attrs:{class:"token keyword"}},[t._v("default")]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token keyword"}},[t._v("throw")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token number"}},[t._v("406")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'json, html, or text only'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("h3",{attrs:{id:"request-acceptsencodings-encodings"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#request-acceptsencodings-encodings","aria-hidden":"true"}},[this._v("#")]),this._v(" request.acceptsEncodings(encodings)")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("Check if "),s("code",[this._v("encodings")]),this._v(" are acceptable, returning the best match when true, otherwise "),s("code",[this._v("false")]),this._v(".\nNote that you should include "),s("code",[this._v("identity")]),this._v(" as one of the encodings!")])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token comment"}},[t._v("// Accept-Encoding: gzip")]),t._v("\n"),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("acceptsEncodings")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'gzip'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'deflate'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'identity'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token comment"}},[t._v('// => "gzip"')]),t._v("\n\n"),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("acceptsEncodings")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{attrs:{class:"token string"}},[t._v("'gzip'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'deflate'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'identity'")]),a("span",{attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token comment"}},[t._v('// => "gzip"')]),t._v("\n")])])])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token comment"}},[t._v("// Accept-Encoding: gzip, deflate")]),t._v("\n"),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("acceptsEncodings")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token comment"}},[t._v('// => ["gzip", "deflate", "identity"]')]),t._v("\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("Note that the "),s("code",[this._v("identity")]),this._v(" encoding (which means no encoding) could be unacceptable if\nthe client explicitly sends "),s("code",[this._v("identity;q=0")]),this._v(". Although this is an edge case, you should\nstill handle the case where this method returns "),s("code",[this._v("false")]),this._v(".")])},function(){var t=this.$createElement,s=this._self._c||t;return s("h3",{attrs:{id:"request-acceptscharsets-charsets"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#request-acceptscharsets-charsets","aria-hidden":"true"}},[this._v("#")]),this._v(" request.acceptsCharsets(charsets)")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("Check if "),s("code",[this._v("charsets")]),this._v(" are acceptable, returning\nthe best match when true, otherwise "),s("code",[this._v("false")]),this._v(".")])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token comment"}},[t._v("// Accept-Charset: utf-8, iso-8859-1;q=0.2, utf-7;q=0.5")]),t._v("\n"),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("acceptsCharsets")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'utf-8'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'utf-7'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token comment"}},[t._v('// => "utf-8"')]),t._v("\n\n"),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("acceptsCharsets")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{attrs:{class:"token string"}},[t._v("'utf-7'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'utf-8'")]),a("span",{attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token comment"}},[t._v('// => "utf-8"')]),t._v("\n")])])])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token comment"}},[t._v("// Accept-Charset: utf-8, iso-8859-1;q=0.2, utf-7;q=0.5")]),t._v("\n"),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("acceptsCharsets")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token comment"}},[t._v('// => ["utf-8", "utf-7", "iso-8859-1"]')]),t._v("\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("h3",{attrs:{id:"request-acceptslanguages-langs"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#request-acceptslanguages-langs","aria-hidden":"true"}},[this._v("#")]),this._v(" request.acceptsLanguages(langs)")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("Check if "),s("code",[this._v("langs")]),this._v(" are acceptable, returning\nthe best match when true, otherwise "),s("code",[this._v("false")]),this._v(".")])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token comment"}},[t._v("// Accept-Language: en;q=0.8, es, pt")]),t._v("\n"),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("acceptsLanguages")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'es'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'en'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token comment"}},[t._v('// => "es"')]),t._v("\n\n"),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("acceptsLanguages")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{attrs:{class:"token string"}},[t._v("'en'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'es'")]),a("span",{attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token comment"}},[t._v('// => "es"')]),t._v("\n")])])])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token comment"}},[t._v("// Accept-Language: en;q=0.8, es, pt")]),t._v("\n"),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("acceptsLanguages")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token comment"}},[t._v('// => ["es", "pt", "en"]')]),t._v("\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("h3",{attrs:{id:"request-idempotent"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#request-idempotent","aria-hidden":"true"}},[this._v("#")]),this._v(" request.idempotent")])},function(){var t=this.$createElement,s=this._self._c||t;return s("h3",{attrs:{id:"request-socket"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#request-socket","aria-hidden":"true"}},[this._v("#")]),this._v(" request.socket")])},function(){var t=this.$createElement,s=this._self._c||t;return s("h3",{attrs:{id:"request-get-field"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#request-get-field","aria-hidden":"true"}},[this._v("#")]),this._v(" request.get(field)")])}],!1,null,null,null);n.options.__file="request.md";s.default=n.exports}}]); \ No newline at end of file diff --git a/docs/.vuepress/dist/assets/js/19.8d1b00cd.js b/docs/.vuepress/dist/assets/js/19.8d1b00cd.js new file mode 100644 index 0000000000..03d98c928c --- /dev/null +++ b/docs/.vuepress/dist/assets/js/19.8d1b00cd.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[19],{220:function(t,s,a){"use strict";a.r(s);var e=a(0),n=Object(e.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"content"},[a("h1",{attrs:{id:"response"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#response","aria-hidden":"true"}},[t._v("#")]),t._v(" Response")]),t._v(" "),a("p",[t._v("A Strapi "),a("code",[t._v("Response")]),t._v(" object is an abstraction on top of Node's vanilla response object,\nproviding additional functionality that is useful for every day HTTP server\ndevelopment.")]),t._v(" "),a("h2",{attrs:{id:"api"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#api","aria-hidden":"true"}},[t._v("#")]),t._v(" API")]),t._v(" "),a("h3",{attrs:{id:"response-header"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#response-header","aria-hidden":"true"}},[t._v("#")]),t._v(" response.header")]),t._v(" "),a("p",[t._v("Response header object.")]),t._v(" "),a("h3",{attrs:{id:"response-headers"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#response-headers","aria-hidden":"true"}},[t._v("#")]),t._v(" response.headers")]),t._v(" "),a("p",[t._v("Response header object. Alias as "),a("code",[t._v("response.header")]),t._v(".")]),t._v(" "),a("h3",{attrs:{id:"response-socket"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#response-socket","aria-hidden":"true"}},[t._v("#")]),t._v(" response.socket")]),t._v(" "),a("p",[t._v("Request socket.")]),t._v(" "),a("h3",{attrs:{id:"response-status"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#response-status","aria-hidden":"true"}},[t._v("#")]),t._v(" response.status")]),t._v(" "),a("p",[t._v("Get response status. By default, "),a("code",[t._v("response.status")]),t._v(" is not set unlike Node's\n"),a("code",[t._v("res.statusCode")]),t._v(" which defaults to "),a("code",[t._v("200")]),t._v(".")]),t._v(" "),a("h3",{attrs:{id:"response-status-2"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#response-status-2","aria-hidden":"true"}},[t._v("#")]),t._v(" response.status=")]),t._v(" "),a("p",[t._v("Set response status via numeric code:")]),t._v(" "),a("ul",[a("li",[t._v('100 "continue"')]),t._v(" "),a("li",[t._v('101 "switching protocols"')]),t._v(" "),a("li",[t._v('102 "processing"')]),t._v(" "),a("li",[t._v('200 "ok"')]),t._v(" "),a("li",[t._v('201 "created"')]),t._v(" "),a("li",[t._v('202 "accepted"')]),t._v(" "),a("li",[t._v('203 "non-authoritative information"')]),t._v(" "),a("li",[t._v('204 "no content"')]),t._v(" "),a("li",[t._v('205 "reset content"')]),t._v(" "),a("li",[t._v('206 "partial content"')]),t._v(" "),a("li",[t._v('207 "multi-status"')]),t._v(" "),a("li",[t._v('300 "multiple choices"')]),t._v(" "),a("li",[t._v('301 "moved permanently"')]),t._v(" "),a("li",[t._v('302 "moved temporarily"')]),t._v(" "),a("li",[t._v('303 "see other"')]),t._v(" "),a("li",[t._v('304 "not modified"')]),t._v(" "),a("li",[t._v('305 "use proxy"')]),t._v(" "),a("li",[t._v('307 "temporary redirect"')]),t._v(" "),a("li",[t._v('400 "bad request"')]),t._v(" "),a("li",[t._v('401 "unauthorized"')]),t._v(" "),a("li",[t._v('402 "payment required"')]),t._v(" "),a("li",[t._v('403 "forbidden"')]),t._v(" "),a("li",[t._v('404 "not found"')]),t._v(" "),a("li",[t._v('405 "method not allowed"')]),t._v(" "),a("li",[t._v('406 "not acceptable"')]),t._v(" "),a("li",[t._v('407 "proxy authentication required"')]),t._v(" "),a("li",[t._v('408 "request time-out"')]),t._v(" "),a("li",[t._v('409 "conflict"')]),t._v(" "),a("li",[t._v('410 "gone"')]),t._v(" "),a("li",[t._v('411 "length required"')]),t._v(" "),a("li",[t._v('412 "precondition failed"')]),t._v(" "),a("li",[t._v('413 "request entity too large"')]),t._v(" "),a("li",[t._v('414 "request-uri too large"')]),t._v(" "),a("li",[t._v('415 "unsupported media type"')]),t._v(" "),a("li",[t._v('416 "requested range not satisfiable"')]),t._v(" "),a("li",[t._v('417 "expectation failed"')]),t._v(" "),a("li",[t._v('418 "i\'m a teapot"')]),t._v(" "),a("li",[t._v('422 "unprocessable entity"')]),t._v(" "),a("li",[t._v('423 "locked"')]),t._v(" "),a("li",[t._v('424 "failed dependency"')]),t._v(" "),a("li",[t._v('425 "unordered collection"')]),t._v(" "),a("li",[t._v('426 "upgrade required"')]),t._v(" "),a("li",[t._v('428 "precondition required"')]),t._v(" "),a("li",[t._v('429 "too many requests"')]),t._v(" "),a("li",[t._v('431 "request header fields too large"')]),t._v(" "),a("li",[t._v('500 "internal server error"')]),t._v(" "),a("li",[t._v('501 "not implemented"')]),t._v(" "),a("li",[t._v('502 "bad gateway"')]),t._v(" "),a("li",[t._v('503 "service unavailable"')]),t._v(" "),a("li",[t._v('504 "gateway time-out"')]),t._v(" "),a("li",[t._v('505 "http version not supported"')]),t._v(" "),a("li",[t._v('506 "variant also negotiates"')]),t._v(" "),a("li",[t._v('507 "insufficient storage"')]),t._v(" "),a("li",[t._v('509 "bandwidth limit exceeded"')]),t._v(" "),a("li",[t._v('510 "not extended"')]),t._v(" "),a("li",[t._v('511 "network authentication required"')])]),t._v(" "),a("p",[t._v("Don't worry too much about memorizing these strings, if you have a typo an error will be thrown,\ndisplaying this list so you can make a correction.")]),t._v(" "),a("h3",{attrs:{id:"response-message"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#response-message","aria-hidden":"true"}},[t._v("#")]),t._v(" response.message")]),t._v(" "),a("p",[t._v("Get response status message. By default, "),a("code",[t._v("response.message")]),t._v(" is\nassociated with "),a("code",[t._v("response.status")]),t._v(".")]),t._v(" "),a("h3",{attrs:{id:"response-message-2"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#response-message-2","aria-hidden":"true"}},[t._v("#")]),t._v(" response.message=")]),t._v(" "),a("p",[t._v("Set response status message to the given value.")]),t._v(" "),a("h3",{attrs:{id:"response-length"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#response-length","aria-hidden":"true"}},[t._v("#")]),t._v(" response.length=")]),t._v(" "),a("p",[t._v("Set response Content-Length to the given value.")]),t._v(" "),a("h3",{attrs:{id:"response-length-2"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#response-length-2","aria-hidden":"true"}},[t._v("#")]),t._v(" response.length")]),t._v(" "),a("p",[t._v("Return response Content-Length as a number when present, or deduce\nfrom "),a("code",[t._v("this.body")]),t._v(" when possible, or "),a("code",[t._v("undefined")]),t._v(".")]),t._v(" "),a("h3",{attrs:{id:"response-body"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#response-body","aria-hidden":"true"}},[t._v("#")]),t._v(" response.body")]),t._v(" "),a("p",[t._v("Get response body.")]),t._v(" "),a("h3",{attrs:{id:"response-body-2"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#response-body-2","aria-hidden":"true"}},[t._v("#")]),t._v(" response.body=")]),t._v(" "),a("p",[t._v("Set response body to one of the following:")]),t._v(" "),a("ul",[a("li",[a("code",[t._v("string")]),t._v(" written")]),t._v(" "),a("li",[a("code",[t._v("Buffer")]),t._v(" written")]),t._v(" "),a("li",[a("code",[t._v("Stream")]),t._v(" piped")]),t._v(" "),a("li",[a("code",[t._v("Object")]),t._v(" json-stringified")]),t._v(" "),a("li",[a("code",[t._v("null")]),t._v(" no content response")])]),t._v(" "),a("p",[t._v("If "),a("code",[t._v("response.status")]),t._v(" has not been set, Strapi will automatically set the status to "),a("code",[t._v("200")]),t._v(" or "),a("code",[t._v("204")]),t._v(".")]),t._v(" "),a("h4",{attrs:{id:"string"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#string","aria-hidden":"true"}},[t._v("#")]),t._v(" String")]),t._v(" "),a("p",[t._v("The Content-Type is defaulted to text/html or text/plain, both with\na default charset of utf-8. The Content-Length field is also set.")]),t._v(" "),a("h4",{attrs:{id:"buffer"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#buffer","aria-hidden":"true"}},[t._v("#")]),t._v(" Buffer")]),t._v(" "),a("p",[t._v("The Content-Type is defaulted to application/octet-stream, and Content-Length\nis also set.")]),t._v(" "),a("h4",{attrs:{id:"stream"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#stream","aria-hidden":"true"}},[t._v("#")]),t._v(" Stream")]),t._v(" "),a("p",[t._v("The Content-Type is defaulted to application/octet-stream.")]),t._v(" "),a("h4",{attrs:{id:"object"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#object","aria-hidden":"true"}},[t._v("#")]),t._v(" Object")]),t._v(" "),a("p",[t._v("The Content-Type is defaulted to application/json.")]),t._v(" "),a("h3",{attrs:{id:"response-get-field"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#response-get-field","aria-hidden":"true"}},[t._v("#")]),t._v(" response.get(field)")]),t._v(" "),a("p",[t._v("Get a response header field value with case-insensitive "),a("code",[t._v("field")]),t._v(".")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token keyword"}},[t._v("const")]),t._v(" etag "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token keyword"}},[t._v("get")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'ETag'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("h3",{attrs:{id:"response-set-field-value"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#response-set-field-value","aria-hidden":"true"}},[t._v("#")]),t._v(" response.set(field, value)")]),t._v(" "),a("p",[t._v("Set response header "),a("code",[t._v("field")]),t._v(" to "),a("code",[t._v("value")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token keyword"}},[t._v("set")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'Cache-Control'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'no-cache'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("h3",{attrs:{id:"response-append-field-value"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#response-append-field-value","aria-hidden":"true"}},[t._v("#")]),t._v(" response.append(field, value)")]),t._v(" "),a("p",[t._v("Append additional header "),a("code",[t._v("field")]),t._v(" with value "),a("code",[t._v("val")]),t._v(".")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("append")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'Link'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("''")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("h3",{attrs:{id:"response-set-fields"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#response-set-fields","aria-hidden":"true"}},[t._v("#")]),t._v(" response.set(fields)")]),t._v(" "),a("p",[t._v("Set several response header "),a("code",[t._v("fields")]),t._v(" with an object:")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token keyword"}},[t._v("set")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v("'Etag'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'1234'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v("'Last-Modified'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" date\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("h3",{attrs:{id:"response-remove-field"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#response-remove-field","aria-hidden":"true"}},[t._v("#")]),t._v(" response.remove(field)")]),t._v(" "),a("p",[t._v("Remove header "),a("code",[t._v("field")]),t._v(".")]),t._v(" "),a("h3",{attrs:{id:"response-type"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#response-type","aria-hidden":"true"}},[t._v("#")]),t._v(" response.type")]),t._v(" "),a("p",[t._v("Get response "),a("code",[t._v("Content-Type")]),t._v(' void of parameters such as "charset".')]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ct "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("type"),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token comment"}},[t._v('// => "image/png"')]),t._v("\n")])])]),a("h3",{attrs:{id:"response-type-2"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#response-type-2","aria-hidden":"true"}},[t._v("#")]),t._v(" response.type=")]),t._v(" "),a("p",[t._v("Set response "),a("code",[t._v("Content-Type")]),t._v(" via mime string or file extension.")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("type "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'text/plain; charset=utf-8'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("type "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'image/png'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("type "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'.png'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("type "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'png'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("Note: when appropriate a "),a("code",[t._v("charset")]),t._v(" is selected for you, for\nexample "),a("code",[t._v("response.type = 'html'")]),t._v(' will default to "utf-8", however\nwhen explicitly defined in full as '),a("code",[t._v("response.type = 'text/html'")]),t._v("\nno charset is assigned.")]),t._v(" "),a("h3",{attrs:{id:"response-is-types"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#response-is-types","aria-hidden":"true"}},[t._v("#")]),t._v(" response.is(types...)")]),t._v(" "),a("p",[t._v("Very similar to "),a("code",[t._v("this.request.is()")]),t._v(".\nCheck whether the response type is one of the supplied types.\nThis is particularly useful for creating middleware that\nmanipulate responses.")]),t._v(" "),a("p",[t._v("For example, this is a middleware that minifies\nall HTML responses except for streams.")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token keyword"}},[t._v("const")]),t._v(" minify "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{attrs:{class:"token function"}},[t._v("require")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'html-minifier'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nstrapi"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("app"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("use")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{attrs:{class:"token operator"}},[t._v("*")]),a("span",{attrs:{class:"token function"}},[t._v("minifyHTML")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("next"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token keyword"}},[t._v("yield")]),t._v(" next"),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token operator"}},[t._v("!")]),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("response"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("is")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'html'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token keyword"}},[t._v("return")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),a("span",{attrs:{class:"token keyword"}},[t._v("const")]),t._v(" body "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("body"),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token operator"}},[t._v("!")]),t._v("body "),a("span",{attrs:{class:"token operator"}},[t._v("||")]),t._v(" body"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pipe"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token keyword"}},[t._v("return")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),a("span",{attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("Buffer"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("isBuffer")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("body"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n body "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" body"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("toString")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("body "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{attrs:{class:"token function"}},[t._v("minify")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("body"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("h3",{attrs:{id:"response-redirect-url-alt"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#response-redirect-url-alt","aria-hidden":"true"}},[t._v("#")]),t._v(" response.redirect(url, [alt])")]),t._v(" "),a("p",[t._v("Perform a [302] redirect to "),a("code",[t._v("url")]),t._v(".")]),t._v(" "),a("p",[t._v('The string "back" is special-cased\nto provide Referrer support, when Referrer\nis not present '),a("code",[t._v("alt")]),t._v(' or "/" is used.')]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("redirect")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'back'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("redirect")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'back'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'/index.html'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("redirect")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'/login'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("redirect")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'http://google.com'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("To alter the default status of "),a("code",[t._v("302")]),t._v(", simply assign the status\nbefore or after this call. To alter the body, assign it after this call:")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("status "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{attrs:{class:"token number"}},[t._v("301")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("redirect")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'/cart'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("body "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'Redirecting to shopping cart'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("h3",{attrs:{id:"response-attachment-filename"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#response-attachment-filename","aria-hidden":"true"}},[t._v("#")]),t._v(" response.attachment([filename])")]),t._v(" "),a("p",[t._v("Set "),a("code",[t._v("Content-Disposition")]),t._v(' to "attachment" to signal the client\nto prompt for download. Optionally specify the '),a("code",[t._v("filename")]),t._v(" of the\ndownload.")]),t._v(" "),a("h3",{attrs:{id:"response-headersent"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#response-headersent","aria-hidden":"true"}},[t._v("#")]),t._v(" response.headerSent")]),t._v(" "),a("p",[t._v("Check if a response header has already been sent. Useful for seeing\nif the client may be notified on error.")]),t._v(" "),a("h3",{attrs:{id:"response-lastmodified"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#response-lastmodified","aria-hidden":"true"}},[t._v("#")]),t._v(" response.lastModified")]),t._v(" "),a("p",[t._v("Return the "),a("code",[t._v("Last-Modified")]),t._v(" header as a "),a("code",[t._v("Date")]),t._v(", if it exists.")]),t._v(" "),a("h3",{attrs:{id:"response-lastmodified-2"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#response-lastmodified-2","aria-hidden":"true"}},[t._v("#")]),t._v(" response.lastModified=")]),t._v(" "),a("p",[t._v("Set the "),a("code",[t._v("Last-Modified")]),t._v(" header as an appropriate UTC string.\nYou can either set it as a "),a("code",[t._v("Date")]),t._v(" or date string.")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("response"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("lastModified "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{attrs:{class:"token class-name"}},[t._v("Date")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("h3",{attrs:{id:"response-etag"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#response-etag","aria-hidden":"true"}},[t._v("#")]),t._v(" response.etag=")]),t._v(" "),a("p",[t._v("Set the ETag of a response including the wrapped "),a("code",[t._v('"')]),t._v("s.\nNote that there is no corresponding "),a("code",[t._v("response.etag")]),t._v(" getter.")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("response"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("etag "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" crypto"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("createHash")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'md5'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("update")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("body"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("digest")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'hex'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("h3",{attrs:{id:"response-vary-field"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#response-vary-field","aria-hidden":"true"}},[t._v("#")]),t._v(" response.vary(field)")]),t._v(" "),a("p",[t._v("Vary on "),a("code",[t._v("field")]),t._v(".")])])}],!1,null,null,null);n.options.__file="response.md";s.default=n.exports}}]); \ No newline at end of file diff --git a/docs/.vuepress/dist/assets/js/2.08038ddb.js b/docs/.vuepress/dist/assets/js/2.08038ddb.js new file mode 100644 index 0000000000..39eba92a07 --- /dev/null +++ b/docs/.vuepress/dist/assets/js/2.08038ddb.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[2],{159:function(t,e,n){},161:function(t,e,n){"use strict";var a=n(159);n.n(a).a},209:function(t,e,n){"use strict";n.r(e);var a={functional:!0,props:{type:{type:String,default:"tip"},text:String,vertical:{type:String,default:"top"}},render:function(t,e){var n=e.props,a=e.slots;return t("span",{class:["badge",n.type,n.vertical]},n.text||a().default)}},i=(n(161),n(0)),o=Object(i.a)(a,void 0,void 0,!1,null,"099ab69c",null);o.options.__file="Badge.vue";e.default=o.exports}}]); \ No newline at end of file diff --git a/docs/.vuepress/dist/assets/js/20.856d7bdd.js b/docs/.vuepress/dist/assets/js/20.856d7bdd.js new file mode 100644 index 0000000000..c22013c044 --- /dev/null +++ b/docs/.vuepress/dist/assets/js/20.856d7bdd.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[20],{240:function(t,s,a){"use strict";a.r(s);var n=a(0),o=Object(n.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"content"},[a("h1",{attrs:{id:"router"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#router","aria-hidden":"true"}},[t._v("#")]),t._v(" Router")]),t._v(" "),a("p",[t._v("The most basic feature of any web application is the ability to interpret a request sent to a URL,\nthen send back a response. In order to do this, your application has to be able to distinguish one URL\nfrom another.")]),t._v(" "),a("p",[t._v("Like most web frameworks, Strapi provides a router: a mechanism for mapping URLs to controllers.\nRoutes are rules that tell Strapi what to do when faced with an incoming request.")]),t._v(" "),a("p",[t._v("Routes can be found in "),a("code",[t._v("./api//config/routes.json")]),t._v(".")]),t._v(" "),a("h2",{attrs:{id:"route-format"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#route-format","aria-hidden":"true"}},[t._v("#")]),t._v(" Route format")]),t._v(" "),a("p",[t._v("Each route consists of an address (as a key) and a target (as an object value).\nThe address is a URL path and a specific HTTP method. The target is defined by an object with a\n"),a("code",[t._v("controller")]),t._v(" and an "),a("code",[t._v("action")]),t._v(". When the router receives an incoming request, it checks the address\nof all routes for matches. If a matching route is found, the request is then passed to its target.")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"routes"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"VERB /endpoint/:param"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"controller"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"controllerName"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"action"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"actionName"')]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("For example to manage your "),a("code",[t._v("Post")]),t._v(" records with a CRUD, your route should look like this:")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"routes"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"GET /post"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"controller"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"Post"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"action"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"find"')]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"GET /post/:id"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"controller"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"Post"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"action"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"findOne"')]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"POST /post"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"controller"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"Post"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"action"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"create"')]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"PUT /post/:id"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"controller"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"Post"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"action"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"update"')]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"DELETE /post/:id"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"controller"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"Post"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"action"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"delete"')]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h2",{attrs:{id:"route-parameters"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#route-parameters","aria-hidden":"true"}},[t._v("#")]),t._v(" Route parameters")]),t._v(" "),a("p",[t._v("Route paths will be translated to regular expressions used to match requests.\nQuery strings will not be considered when matching requests.")]),t._v(" "),a("p",[t._v("Route parameters are captured and added to "),a("code",[t._v("ctx.params")]),t._v(" or "),a("code",[t._v("ctx.request.body")]),t._v(".")]),t._v(" "),a("p",[t._v("By taking the previous example, your "),a("code",[t._v("Post")]),t._v(" controller should look like this:")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[t._v("module"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("exports "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\n "),a("span",{attrs:{class:"token comment"}},[t._v("// GET request")]),t._v("\n find"),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{attrs:{class:"token operator"}},[t._v("*")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token keyword"}},[t._v("try")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("body "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("yield")]),t._v(" Post"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("find")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("params"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("catch")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token class-name"}},[t._v("error")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("body "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" error"),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n findOne"),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{attrs:{class:"token operator"}},[t._v("*")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token keyword"}},[t._v("try")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("body "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("yield")]),t._v(" Post"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("findOne")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("params"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("catch")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token class-name"}},[t._v("error")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("body "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" error"),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),a("span",{attrs:{class:"token comment"}},[t._v("// POST request")]),t._v("\n create"),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{attrs:{class:"token operator"}},[t._v("*")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token keyword"}},[t._v("try")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("body "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("yield")]),t._v(" Post"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("create")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("request"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("body"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("catch")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token class-name"}},[t._v("error")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("body "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" error"),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),a("span",{attrs:{class:"token comment"}},[t._v("// PUT request")]),t._v("\n update"),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{attrs:{class:"token operator"}},[t._v("*")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token keyword"}},[t._v("try")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("body "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("yield")]),t._v(" Post"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("update")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("params"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("id"),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("request"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("body"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("catch")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token class-name"}},[t._v("error")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("body "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" error"),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),a("span",{attrs:{class:"token comment"}},[t._v("// DELETE request")]),t._v("\n "),a("span",{attrs:{class:"token keyword"}},[t._v("delete")]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{attrs:{class:"token operator"}},[t._v("*")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token keyword"}},[t._v("try")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("body "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("yield")]),t._v(" Post"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("destroy")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("params"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("catch")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token class-name"}},[t._v("error")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("body "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" error"),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n\n")])])]),a("h2",{attrs:{id:"router-prefix"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#router-prefix","aria-hidden":"true"}},[t._v("#")]),t._v(" Router prefix")]),t._v(" "),a("p",[t._v("Keep in mind routes can automatically be prefixed in "),a("code",[t._v("./config/general.json")]),t._v(" with the "),a("code",[t._v("prefix")]),t._v(" key.\nLet an empty string if you don't want to prefix your API. The prefix must starts with a "),a("code",[t._v("/")]),t._v(", e.g. "),a("code",[t._v("/api")]),t._v(".")]),t._v(" "),a("h2",{attrs:{id:"policies-and-route-process"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#policies-and-route-process","aria-hidden":"true"}},[t._v("#")]),t._v(" Policies and route process")]),t._v(" "),a("p",[t._v("Just because a request matches a route address doesn't necessarily mean it will be passed to that\nroute's target directly. The request will need to pass through any configured policies first.\nPolicies are versatile tools for authorization and access control. They let you allow or deny\naccess to your controllers down to a fine level of granularity.")]),t._v(" "),a("p",[t._v("Policies are defined in the "),a("code",[t._v("policies")]),t._v(" directory of every of your APIs.")]),t._v(" "),a("p",[t._v("Each policy file should contain a single function. When it comes down to it, policies are\nreally just functions which run before your controllers. You can chain as many of them\ntogether as you like. In fact they're designed to be used this way. Ideally, each middleware\nfunction should really check just one thing.")]),t._v(" "),a("p",[t._v("For example to access "),a("code",[t._v("DELETE /post/:id")]),t._v(", the request will go through the "),a("code",[t._v("isAdmin")]),t._v(" policy first.\nIf the policy allows the request, then the "),a("code",[t._v("delete")]),t._v(" action from the "),a("code",[t._v("Post")]),t._v(" controller is executed.")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"routes"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"DELETE /post/:id"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"controller"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"Post"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"action"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"delete"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"policies"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{attrs:{class:"token string"}},[t._v('"isAdmin"')]),a("span",{attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("Do not forget to yield "),a("code",[t._v("next")]),t._v(" when you need to move on.")])])}],!1,null,null,null);o.options.__file="router.md";s.default=o.exports}}]); \ No newline at end of file diff --git a/docs/.vuepress/dist/assets/js/21.6f851286.js b/docs/.vuepress/dist/assets/js/21.6f851286.js new file mode 100644 index 0000000000..4b10715fd1 --- /dev/null +++ b/docs/.vuepress/dist/assets/js/21.6f851286.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[21],{218:function(t,s,n){"use strict";n.r(s);var a=n(0),o=Object(a.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("div",{staticClass:"content"},[n("h1",{attrs:{id:"services"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#services","aria-hidden":"true"}},[t._v("#")]),t._v(" Services")]),t._v(" "),n("p",[t._v("Services can be thought of as libraries which contain functions that you might want to use\nin many places of your application. For example, you might have an "),n("code",[t._v("Email")]),t._v(" service which\nwraps some default email message boilerplate code that you would want to use in many parts\nof your application.")]),t._v(" "),n("p",[t._v("Simply create a JavaScript file containing a function or an object into your\n"),n("code",[t._v("./api//services")]),t._v(" directory.")]),t._v(" "),n("p",[t._v("For example, you could have an "),n("code",[t._v("Email service")]),t._v(" like this:")]),t._v(" "),n("div",{staticClass:"language-js extra-class"},[n("pre",{pre:!0,attrs:{class:"language-js"}},[n("code",[n("span",{attrs:{class:"token keyword"}},[t._v("const")]),t._v(" nodemailer "),n("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{attrs:{class:"token function"}},[t._v("require")]),n("span",{attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{attrs:{class:"token string"}},[t._v("'nodemailer'")]),n("span",{attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nmodule"),n("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("exports "),n("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n sendEmail"),n("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),n("span",{attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),n("span",{attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{attrs:{class:"token keyword"}},[t._v("from")]),n("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" to"),n("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" subject"),n("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" text"),n("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\n "),n("span",{attrs:{class:"token comment"}},[t._v("// Create reusable transporter object using SMTP transport")]),t._v("\n "),n("span",{attrs:{class:"token keyword"}},[t._v("const")]),t._v(" transporter "),n("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" nodemailer"),n("span",{attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{attrs:{class:"token function"}},[t._v("createTransport")]),n("span",{attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n service"),n("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),n("span",{attrs:{class:"token string"}},[t._v("'Gmail'")]),n("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n auth"),n("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),n("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n user"),n("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),n("span",{attrs:{class:"token string"}},[t._v("'gmail.user@gmail.com'")]),n("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n pass"),n("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),n("span",{attrs:{class:"token string"}},[t._v("'userpass'")]),t._v("\n "),n("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{attrs:{class:"token punctuation"}},[t._v("}")]),n("span",{attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),n("span",{attrs:{class:"token comment"}},[t._v("// Setup e-mail data")]),t._v("\n "),n("span",{attrs:{class:"token keyword"}},[t._v("const")]),t._v(" options "),n("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{attrs:{class:"token keyword"}},[t._v("from")]),n("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),n("span",{attrs:{class:"token keyword"}},[t._v("from")]),n("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n to"),n("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" to"),n("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n subject"),n("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" subject"),n("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n text"),n("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" text\n "),n("span",{attrs:{class:"token punctuation"}},[t._v("}")]),n("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),n("span",{attrs:{class:"token comment"}},[t._v("// Send mail")]),t._v("\n transporter"),n("span",{attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{attrs:{class:"token function"}},[t._v("sendMail")]),n("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("options"),n("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{attrs:{class:"token keyword"}},[t._v("function")]),n("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("error"),n("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" info"),n("span",{attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("error"),n("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),n("span",{attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{attrs:{class:"token function"}},[t._v("log")]),n("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("error"),n("span",{attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{attrs:{class:"token boolean"}},[t._v("false")]),n("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n console"),n("span",{attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{attrs:{class:"token function"}},[t._v("log")]),n("span",{attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{attrs:{class:"token string"}},[t._v("'Message sent: '")]),t._v(" "),n("span",{attrs:{class:"token operator"}},[t._v("+")]),t._v(" info"),n("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("response"),n("span",{attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{attrs:{class:"token punctuation"}},[t._v("}")]),n("span",{attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{attrs:{class:"token punctuation"}},[t._v("}")]),n("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])])}],!1,null,null,null);o.options.__file="services.md";s.default=o.exports}}]); \ No newline at end of file diff --git a/docs/.vuepress/dist/assets/js/22.7ddb4e1d.js b/docs/.vuepress/dist/assets/js/22.7ddb4e1d.js new file mode 100644 index 0000000000..b5f476ef82 --- /dev/null +++ b/docs/.vuepress/dist/assets/js/22.7ddb4e1d.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[22],{217:function(s,t,a){"use strict";a.r(t);var n=a(0),o=Object(n.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var s=this,t=s.$createElement,a=s._self._c||t;return a("div",{staticClass:"content"},[a("h1",{attrs:{id:"sessions"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#sessions","aria-hidden":"true"}},[s._v("#")]),s._v(" Sessions")]),s._v(" "),a("p",[s._v("Since HTTP driven applications are stateless, sessions provide a way to store information\nabout the user across requests.")]),s._v(" "),a("p",[s._v('Strapi provides "guest" sessions, meaning any visitor will have a session,\nauthenticated or not. If a session is new a '),a("code",[s._v("Set-Cookie")]),s._v(" will be produced regardless\nof populating the session.")]),s._v(" "),a("p",[s._v("Strapi only supports cookie sessions, for now.")]),s._v(" "),a("p",[s._v("The current session is available in "),a("code",[s._v("this.session")]),s._v(" inside a controller action.")]),s._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[s._v("module"),a("span",{attrs:{class:"token punctuation"}},[s._v(".")]),s._v("exports "),a("span",{attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n find"),a("span",{attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{attrs:{class:"token keyword"}},[s._v("function")]),s._v(" "),a("span",{attrs:{class:"token operator"}},[s._v("*")]),a("span",{attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),a("span",{attrs:{class:"token comment"}},[s._v("// Limit request rate to 100")]),s._v("\n "),a("span",{attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{attrs:{class:"token keyword"}},[s._v("this")]),a("span",{attrs:{class:"token punctuation"}},[s._v(".")]),s._v("session"),a("span",{attrs:{class:"token punctuation"}},[s._v(".")]),s._v("views "),a("span",{attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),a("span",{attrs:{class:"token number"}},[s._v("100")]),a("span",{attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{attrs:{class:"token keyword"}},[s._v("try")]),s._v(" "),a("span",{attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{attrs:{class:"token keyword"}},[s._v("this")]),a("span",{attrs:{class:"token punctuation"}},[s._v(".")]),s._v("session"),a("span",{attrs:{class:"token punctuation"}},[s._v(".")]),s._v("views"),a("span",{attrs:{class:"token operator"}},[s._v("++")]),a("span",{attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{attrs:{class:"token keyword"}},[s._v("this")]),a("span",{attrs:{class:"token punctuation"}},[s._v(".")]),s._v("body "),a("span",{attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{attrs:{class:"token keyword"}},[s._v("yield")]),s._v(" Post"),a("span",{attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{attrs:{class:"token function"}},[s._v("find")]),a("span",{attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{attrs:{class:"token keyword"}},[s._v("this")]),a("span",{attrs:{class:"token punctuation"}},[s._v(".")]),s._v("params"),a("span",{attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),a("span",{attrs:{class:"token keyword"}},[s._v("catch")]),s._v(" "),a("span",{attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{attrs:{class:"token class-name"}},[s._v("error")]),a("span",{attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{attrs:{class:"token keyword"}},[s._v("this")]),a("span",{attrs:{class:"token punctuation"}},[s._v(".")]),s._v("body "),a("span",{attrs:{class:"token operator"}},[s._v("=")]),s._v(" error"),a("span",{attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),a("span",{attrs:{class:"token keyword"}},[s._v("else")]),s._v(" "),a("span",{attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{attrs:{class:"token keyword"}},[s._v("this")]),a("span",{attrs:{class:"token punctuation"}},[s._v(".")]),s._v("body "),a("span",{attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{attrs:{class:"token string"}},[s._v("'You have reached your request rate limit'")]),a("span",{attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),a("span",{attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n")])])]),a("p",[s._v("To destroy an active session, simply set it to "),a("code",[s._v("null")]),s._v(":")]),s._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[s._v("module"),a("span",{attrs:{class:"token punctuation"}},[s._v(".")]),s._v("exports "),a("span",{attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n logout"),a("span",{attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),a("span",{attrs:{class:"token keyword"}},[s._v("function")]),s._v(" "),a("span",{attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{attrs:{class:"token keyword"}},[s._v("try")]),s._v(" "),a("span",{attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{attrs:{class:"token keyword"}},[s._v("this")]),a("span",{attrs:{class:"token punctuation"}},[s._v(".")]),s._v("session "),a("span",{attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{attrs:{class:"token keyword"}},[s._v("null")]),a("span",{attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{attrs:{class:"token keyword"}},[s._v("this")]),a("span",{attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{attrs:{class:"token function"}},[s._v("redirect")]),a("span",{attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{attrs:{class:"token string"}},[s._v("'./'")]),a("span",{attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),a("span",{attrs:{class:"token keyword"}},[s._v("catch")]),s._v(" "),a("span",{attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{attrs:{class:"token class-name"}},[s._v("error")]),a("span",{attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{attrs:{class:"token keyword"}},[s._v("this")]),a("span",{attrs:{class:"token punctuation"}},[s._v(".")]),s._v("body "),a("span",{attrs:{class:"token operator"}},[s._v("=")]),s._v(" error"),a("span",{attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),a("span",{attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n")])])])])}],!1,null,null,null);o.options.__file="sessions.md";t.default=o.exports}}]); \ No newline at end of file diff --git a/docs/.vuepress/dist/assets/js/23.15e5a0c3.js b/docs/.vuepress/dist/assets/js/23.15e5a0c3.js new file mode 100644 index 0000000000..7b46d9df82 --- /dev/null +++ b/docs/.vuepress/dist/assets/js/23.15e5a0c3.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[23],{216:function(t,s,n){"use strict";n.r(s);var a=n(0),e=Object(a.a)({},function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("div",{staticClass:"content"},[t._m(0),t._v(" "),n("p",[t._v("Strapi's test suite is written using "),n("a",{attrs:{href:"https://mochajs.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("mocha"),n("OutboundLink")],1),t._v(" and although\nStrapi doesn't impose any testing framework for your apps, in this example we\nwill setup tests using the mocha framework.")]),t._v(" "),t._m(1),t._v(" "),n("p",[t._v("Before writing tests, you should setup a basic directory structure, like this:")]),t._v(" "),t._m(2),t._m(3),t._v(" "),t._m(4),t._v(" "),t._m(5),t._v(" "),t._m(6),t._m(7),t._v(" "),n("p",[t._v("Once you have setup your directory structure, you can start writing your tests.\nIn this example we use "),n("a",{attrs:{href:"https://github.com/avbel/co-supertest",target:"_blank",rel:"noopener noreferrer"}},[t._v("co-supertest"),n("OutboundLink")],1),t._v(",\na "),n("code",[t._v("co")]),t._v(" and "),n("code",[t._v("Supertest")]),t._v(" integration library.\n"),n("a",{attrs:{href:"https://github.com/visionmedia/supertest",target:"_blank",rel:"noopener noreferrer"}},[t._v("Supertest"),n("OutboundLink")],1),t._v(" provides several useful\nmethods for testing HTTP requests."),n("br"),t._v("\nIf you want to test an api endpoint, you can do it like this:")]),t._v(" "),t._m(8),t._v(" "),t._m(9),t._m(10),t._v(" "),t._m(11),t._v(" "),t._m(12),t._v(" "),t._m(13),t._m(14)])},[function(){var t=this.$createElement,s=this._self._c||t;return s("h1",{attrs:{id:"testing"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#testing","aria-hidden":"true"}},[this._v("#")]),this._v(" Testing")])},function(){var t=this.$createElement,s=this._self._c||t;return s("h2",{attrs:{id:"setup"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#setup","aria-hidden":"true"}},[this._v("#")]),this._v(" Setup")])},function(){var t=this.$createElement,s=this._self._c||t;return s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[this._v("./strapiApp\n├── api/\n├── ...\n├── test/\n│ ├── integration/\n│ │ ├── controllers/\n│ │ │ └── my_endpoint.test.js\n│ │ ├── models/\n│ │ │ └── my_model.test.js\n│ │ └── ...\n| ├── ...\n│ ├── bootstrap.js\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("h2",{attrs:{id:"boostrap"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#boostrap","aria-hidden":"true"}},[this._v("#")]),this._v(" Boostrap")])},function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("p",[t._v("We are going to setup a "),n("code",[t._v("bootstrap.js")]),t._v(" with "),n("code",[t._v("before")]),t._v(" and "),n("code",[t._v("after")]),t._v(" hooks to\nperform any actions before and after our tests."),n("br"),t._v("\nIn this example, the app server is started before running any tests an stop\nthe server after tests are completed.")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[s("em",[this._v("./test/bootstrap.js")])])},function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("div",{staticClass:"language-js extra-class"},[n("pre",{pre:!0,attrs:{class:"language-js"}},[n("code",[n("span",{attrs:{class:"token keyword"}},[t._v("const")]),t._v(" strapi "),n("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{attrs:{class:"token function"}},[t._v("require")]),n("span",{attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{attrs:{class:"token string"}},[t._v("'strapi'")]),n("span",{attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),n("span",{attrs:{class:"token function"}},[t._v("before")]),n("span",{attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),n("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("done"),n("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n strapi"),n("span",{attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{attrs:{class:"token function"}},[t._v("start")]),n("span",{attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{attrs:{class:"token punctuation"}},[t._v("{")]),n("span",{attrs:{class:"token punctuation"}},[t._v("}")]),n("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{attrs:{class:"token keyword"}},[t._v("function")]),n("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("err"),n("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("err"),n("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{attrs:{class:"token function"}},[t._v("done")]),n("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("err"),n("span",{attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),n("span",{attrs:{class:"token function"}},[t._v("done")]),n("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("err"),n("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" strapi"),n("span",{attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{attrs:{class:"token punctuation"}},[t._v("}")]),n("span",{attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{attrs:{class:"token punctuation"}},[t._v("}")]),n("span",{attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),n("span",{attrs:{class:"token function"}},[t._v("after")]),n("span",{attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),n("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("done"),n("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n strapi"),n("span",{attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{attrs:{class:"token function"}},[t._v("stop")]),n("span",{attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{attrs:{class:"token function"}},[t._v("done")]),n("span",{attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{attrs:{class:"token punctuation"}},[t._v("}")]),n("span",{attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("h2",{attrs:{id:"writing-tests"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#writing-tests","aria-hidden":"true"}},[this._v("#")]),this._v(" Writing tests")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[s("em",[this._v("./test/integration/controllers/my_endpoint.js")])])},function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("div",{staticClass:"language-js extra-class"},[n("pre",{pre:!0,attrs:{class:"language-js"}},[n("code",[n("span",{attrs:{class:"token keyword"}},[t._v("const")]),t._v(" request "),n("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{attrs:{class:"token function"}},[t._v("require")]),n("span",{attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{attrs:{class:"token string"}},[t._v("'co-supertest'")]),n("span",{attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),n("span",{attrs:{class:"token function"}},[t._v("describe")]),n("span",{attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{attrs:{class:"token string"}},[t._v("'MyEndpoint Controller Integration'")]),n("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{attrs:{class:"token keyword"}},[t._v("function")]),n("span",{attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{attrs:{class:"token function"}},[t._v("describe")]),n("span",{attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{attrs:{class:"token string"}},[t._v("'GET /my_endpoint'")]),n("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{attrs:{class:"token keyword"}},[t._v("function")]),n("span",{attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{attrs:{class:"token function"}},[t._v("it")]),n("span",{attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{attrs:{class:"token string"}},[t._v("'should return 200 status code'")]),n("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),n("span",{attrs:{class:"token operator"}},[t._v("*")]),n("span",{attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{attrs:{class:"token keyword"}},[t._v("yield")]),t._v(" "),n("span",{attrs:{class:"token function"}},[t._v("request")]),n("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("strapi"),n("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("config"),n("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("url"),n("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{attrs:{class:"token keyword"}},[t._v("get")]),n("span",{attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{attrs:{class:"token string"}},[t._v("'/my_endpoint'")]),n("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{attrs:{class:"token function"}},[t._v("expect")]),n("span",{attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{attrs:{class:"token number"}},[t._v("200")]),n("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{attrs:{class:"token function"}},[t._v("expect")]),n("span",{attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{attrs:{class:"token string"}},[t._v("'Content-Type'")]),n("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{attrs:{class:"token regex"}},[t._v("/json/")]),n("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{attrs:{class:"token function"}},[t._v("end")]),n("span",{attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{attrs:{class:"token punctuation"}},[t._v("}")]),n("span",{attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{attrs:{class:"token punctuation"}},[t._v("}")]),n("span",{attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{attrs:{class:"token punctuation"}},[t._v("}")]),n("span",{attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("h2",{attrs:{id:"running-tests"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#running-tests","aria-hidden":"true"}},[this._v("#")]),this._v(" Running tests")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("In order to run tests you can use "),s("code",[this._v("npm test")]),this._v(". In your "),s("code",[this._v("package.json")]),this._v(", in the\n"),s("code",[this._v("scripts")]),this._v(" section, add this:")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[s("em",[this._v("./package.json")])])},function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("div",{staticClass:"language-js extra-class"},[n("pre",{pre:!0,attrs:{class:"language-js"}},[n("code",[n("span",{attrs:{class:"token string"}},[t._v('"scripts"')]),n("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),n("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{attrs:{class:"token string"}},[t._v('"test"')]),n("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),n("span",{attrs:{class:"token string"}},[t._v('"mocha --require co-mocha test/bootstrap.js test/**/*.test.js"')]),t._v("\n"),n("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("Remember to run "),s("code",[this._v("test/bootstrap.js")]),this._v(" before any other tests and, if you want,\nuse the "),s("code",[this._v("--require")]),this._v(" option to pass any required dependencies you need available\nin your tests.")])}],!1,null,null,null);e.options.__file="testing.md";s.default=e.exports}}]); \ No newline at end of file diff --git a/docs/.vuepress/dist/assets/js/24.6fdf34d0.js b/docs/.vuepress/dist/assets/js/24.6fdf34d0.js new file mode 100644 index 0000000000..365ff551cd --- /dev/null +++ b/docs/.vuepress/dist/assets/js/24.6fdf34d0.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[24],{215:function(t,s,a){"use strict";a.r(s);var n=a(0),e=Object(n.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"content"},[a("h1",{attrs:{id:"upload"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#upload","aria-hidden":"true"}},[t._v("#")]),t._v(" Upload")]),t._v(" "),a("p",[t._v("Strapi contains a set of tools to upload files.")]),t._v(" "),a("h2",{attrs:{id:"upload-config"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#upload-config","aria-hidden":"true"}},[t._v("#")]),t._v(" Upload config")]),t._v(" "),a("p",[t._v("To change the upload config, edit the "),a("code",[t._v("./api/upload/config/settings.json")]),t._v(" file.")]),t._v(" "),a("p",[t._v("For the config bellow, please use refer to the "),a("code",[t._v("[co-busboy](https://github.com/cojs/busboy)")]),t._v(" node module documentation.")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"upload"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"folder"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"public/upload"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"acceptedExtensions"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"*"')]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"headers"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"highWaterMark"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('""')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"fileHwm"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('""')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"defCharset"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('""')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"preservePath"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('""')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"limits"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"fieldNameSize"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('""')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"fieldSize"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('""')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"fields"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('""')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"fileSize"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('""')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"files"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('""')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"parts"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('""')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"headerPairs"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('""')]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h2",{attrs:{id:"upload-service"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#upload-service","aria-hidden":"true"}},[t._v("#")]),t._v(" Upload service")]),t._v(" "),a("p",[t._v("The upload service allows you to easily upload files from anywhere in your application.")]),t._v(" "),a("p",[t._v("Usage as a promise (yieldable) :")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token keyword"}},[t._v("yield")]),t._v(" strapi"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("api"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("upload"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("services"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("upload"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("upload")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("part"),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("h2",{attrs:{id:"upload-api"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#upload-api","aria-hidden":"true"}},[t._v("#")]),t._v(" Upload API")]),t._v(" "),a("p",[t._v("The upload API is a simple API which can be used from your client\n(front-end, mobile...) application to upload files.")]),t._v(" "),a("p",[t._v("Route used to upload files:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("POST /upload\n")])])]),a("p",[t._v("To use this route, you have to submit a HTML form with "),a("code",[t._v("multipart/*")]),t._v(" enctype\n(or fake it if you are using a web front-end framework like AngularJS).")]),t._v(" "),a("p",[t._v("Response payload:")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"readable"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("true")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"domain"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("null")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"truncated"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("false")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"fieldname"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"file"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"filename"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"1445421755771-image.jpg"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"encoding"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"7bit"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"transferEncoding"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"7bit"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"mime"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"image/jpeg"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"mimeType"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"image/jpeg"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"originalFilenameFormatted"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"image.jpg"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"originalFilename"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"image.jpg"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"template"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"default"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"lang"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"en"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"createdAt"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"2015-10-21T10:02:35.776Z"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"updatedAt"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"2015-10-21T10:02:35.776Z"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"id"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token number"}},[t._v("2")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n")])])]),a("h2",{attrs:{id:"upload-model"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#upload-model","aria-hidden":"true"}},[t._v("#")]),t._v(" Upload model")]),t._v(" "),a("p",[t._v("Each uploaded file description is registered in the database. So you can retrieve\nthem whenever you want. However, you can disable this option by overriding the\nupload service logic.")])])}],!1,null,null,null);e.options.__file="upload.md";s.default=e.exports}}]); \ No newline at end of file diff --git a/docs/.vuepress/dist/assets/js/25.21c9a549.js b/docs/.vuepress/dist/assets/js/25.21c9a549.js new file mode 100644 index 0000000000..13cdcd7ed8 --- /dev/null +++ b/docs/.vuepress/dist/assets/js/25.21c9a549.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[25],{214:function(t,s,a){"use strict";a.r(s);var n=a(0),e=Object(n.a)({},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"content"},[t._m(0),t._v(" "),a("p",[t._v("Most of the web applications require a user management system: registration, login,\nreset password, etc.")]),t._v(" "),a("p",[t._v("To avoid you to reinvent the wheel, Strapi embedded a full featured user management\nsystem powered by "),a("a",{attrs:{href:"https://github.com/simov/grant",target:"_blank",rel:"noopener noreferrer"}},[t._v("Grant"),a("OutboundLink")],1),t._v(" and JSON Web Token (JWT).")]),t._v(" "),t._m(1),t._v(" "),t._m(2),t._v(" "),a("p",[t._v("Request payload:")]),t._v(" "),t._m(3),a("p",[t._v("Response payload:")]),t._v(" "),t._m(4),t._m(5),t._v(" "),t._m(6),t._v(" "),a("p",[t._v("Request payload:")]),t._v(" "),t._m(7),a("p",[t._v("Response payload:")]),t._v(" "),t._m(8),t._m(9),t._v(" "),t._m(10),t._v(" "),t._m(11),t._v(" "),t._m(12),t._v(" "),a("p",[t._v("Thanks to "),a("a",{attrs:{href:"https://github.com/simov/grant",target:"_blank",rel:"noopener noreferrer"}},[t._v("Grant"),a("OutboundLink")],1),t._v(" and "),a("a",{attrs:{href:"https://github.com/simov/purest",target:"_blank",rel:"noopener noreferrer"}},[t._v("Purest"),a("OutboundLink")],1),t._v(", you can easily use OAuth and OAuth2\nproviders to enable authentication in your application. By default,\nStrapi comes with four providers:")]),t._v(" "),t._m(13),t._v(" "),t._m(14),t._v(" "),t._m(15),t._v(" "),t._m(16),t._v(" "),a("p",[t._v("Response payload:")]),t._v(" "),t._m(17),t._m(18),t._v(" "),a("p",[t._v("Strapi comes with 5 providers. If you want to add another one, it can be easily done thanks to "),a("a",{attrs:{href:"https://github.com/simov/purest",target:"_blank",rel:"noopener noreferrer"}},[t._v("Purest"),a("OutboundLink")],1),t._v(", by adding it in the Grant service.")]),t._v(" "),t._m(19),t._v(" "),t._m(20),t._v(" "),a("p",[t._v("Request payload:")]),t._v(" "),t._m(21),t._m(22),t._v(" "),t._m(23),t._v(" "),a("p",[t._v("Request payload:")]),t._v(" "),t._m(24),a("p",[t._v("Response payload:")]),t._v(" "),t._m(25),t._m(26),t._v(" "),t._m(27)])},[function(){var t=this.$createElement,s=this._self._c||t;return s("h1",{attrs:{id:"users"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#users","aria-hidden":"true"}},[this._v("#")]),this._v(" Users")])},function(){var t=this.$createElement,s=this._self._c||t;return s("h2",{attrs:{id:"local-registration"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#local-registration","aria-hidden":"true"}},[this._v("#")]),this._v(" Local Registration")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("Route used to register a user to your application: "),s("code",[this._v("POST /auth/local/register")]),this._v(".")])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"username"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"John DOE"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"email"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"contact@company.com"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"password"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"123456"')]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"user"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"jwt"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('""')]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("h2",{attrs:{id:"local-login"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#local-login","aria-hidden":"true"}},[this._v("#")]),this._v(" Local Login")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("Route used to login a user to your application: "),s("code",[this._v("POST /auth/local")]),this._v(".")])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"identifier"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"contact@company.com"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"password"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"123456"')]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"user"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"jwt"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('""')]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("h2",{attrs:{id:"authentication"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#authentication","aria-hidden":"true"}},[this._v("#")]),this._v(" Authentication")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("JWT does not use session. Once you get the token, it has to be stored in front (for\nexample in the "),s("code",[this._v("localstorage")]),this._v("), and sent within each request. The token can be sent:")])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("ul",[a("li",[t._v("in the header ("),a("code",[t._v("Bearer")]),t._v(")")]),t._v(" "),a("li",[t._v("in the body ("),a("code",[t._v("token")]),t._v(" field)")]),t._v(" "),a("li",[t._v("in the querystring ("),a("code",[t._v("token")]),t._v(" field)")])])},function(){var t=this.$createElement,s=this._self._c||t;return s("h2",{attrs:{id:"providers"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#providers","aria-hidden":"true"}},[this._v("#")]),this._v(" Providers")])},function(){var t=this.$createElement,s=this._self._c||t;return s("ul",[s("li",[this._v("Facebook")]),this._v(" "),s("li",[this._v("Google")]),this._v(" "),s("li",[this._v("Github")]),this._v(" "),s("li",[this._v("Linkedin2 (Oauth2 Provider for Linkedin)")])])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("To use the providers authentication, set your credentials in\n"),s("code",[this._v("./api/user/config/environments/development/grant.json")]),this._v(".")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("Redirect your user to: "),s("code",[this._v("GET /connect/:provider")]),this._v(".")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("After his approval, he will be redirected to "),s("code",[this._v("/auth/:provider/callback")]),this._v(". The jwt and user will be available in the querystring.")])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"user"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"jwt"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('""')]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("h2",{attrs:{id:"custom-providers"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#custom-providers","aria-hidden":"true"}},[this._v("#")]),this._v(" Custom providers")])},function(){var t=this.$createElement,s=this._self._c||t;return s("h2",{attrs:{id:"forgot-password"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#forgot-password","aria-hidden":"true"}},[this._v("#")]),this._v(" Forgot password")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("Send an email to the user with an activation code: "),s("code",[this._v("POST /auth/forgot-password")]),this._v(".")])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"email"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"contact@company.com"')]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("h2",{attrs:{id:"change-password"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#change-password","aria-hidden":"true"}},[this._v("#")]),this._v(" Change password")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v('Route used to update the password of a user after he asked for a\n"forgot-password" email: '),s("code",[this._v("POST /auth/change-password")]),this._v(".")])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"code"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('""')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"password"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"123456"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"passwordConfirmation"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"123456"')]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"user"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"jwt"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('""')]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("h2",{attrs:{id:"accessing-user-from-requests"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#accessing-user-from-requests","aria-hidden":"true"}},[this._v("#")]),this._v(" Accessing user from requests.")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("If you want to access attributes of the logged in user, you can use "),s("code",[this._v("this.user")]),this._v(" inside of your controller action.")])}],!1,null,null,null);e.options.__file="users.md";s.default=e.exports}}]); \ No newline at end of file diff --git a/docs/.vuepress/dist/assets/js/26.6608295c.js b/docs/.vuepress/dist/assets/js/26.6608295c.js new file mode 100644 index 0000000000..3e8011f154 --- /dev/null +++ b/docs/.vuepress/dist/assets/js/26.6608295c.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[26],{213:function(t,s,n){"use strict";n.r(s);var e=n(0),a=Object(e.a)({},function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("div",{staticClass:"content"},[t._m(0),t._v(" "),n("p",[t._v("In Strapi, views are markup templates that are compiled on the server into HTML pages.\nIn most cases, views are used as the response to an incoming HTTP request.")]),t._v(" "),n("p",[t._v("By default, Strapi doesn't use views. The philosophy of the framework is to\nseparate the reusable backend application logic from the frontend.")]),t._v(" "),t._m(1),t._v(" "),t._m(2),t._v(" "),t._m(3),t._m(4),t._v(" "),t._m(5),t._v(" "),t._m(6),t._v(" "),n("p",[t._v("You don't need to specify the view extension if you use the default one sets in config.")]),t._v(" "),t._m(7),t._v(" "),t._m(8),t._m(9),t._m(10),t._v(" "),t._m(11),t._m(12),t._v(" "),t._m(13),t._v(" "),t._m(14),n("p",[t._v("Strapi supports all of those view engines:")]),t._v(" "),n("ul",[n("li",[n("a",{attrs:{href:"https://github.com/soywiz/atpl.js",target:"_blank",rel:"noopener noreferrer"}},[t._v("atpl"),n("OutboundLink")],1)]),t._v(" "),n("li",[n("a",{attrs:{href:"https://github.com/olado/doT",target:"_blank",rel:"noopener noreferrer"}},[t._v("doT.js"),n("OutboundLink")],1)]),t._v(" "),n("li",[n("a",{attrs:{href:"https://github.com/akdubya/dustjs",target:"_blank",rel:"noopener noreferrer"}},[t._v("dust (unmaintained)"),n("OutboundLink")],1)]),t._v(" "),n("li",[n("a",{attrs:{href:"https://github.com/linkedin/dustjs",target:"_blank",rel:"noopener noreferrer"}},[t._v("dustjs-linkedin (maintained fork of dust)"),n("OutboundLink")],1)]),t._v(" "),n("li",[n("a",{attrs:{href:"https://github.com/sstephenson/eco",target:"_blank",rel:"noopener noreferrer"}},[t._v("eco"),n("OutboundLink")],1)]),t._v(" "),n("li",[n("a",{attrs:{href:"https://github.com/baryshev/ect",target:"_blank",rel:"noopener noreferrer"}},[t._v("ect"),n("OutboundLink")],1)]),t._v(" "),n("li",[n("a",{attrs:{href:"https://github.com/visionmedia/ejs",target:"_blank",rel:"noopener noreferrer"}},[t._v("ejs"),n("OutboundLink")],1)]),t._v(" "),n("li",[n("a",{attrs:{href:"https://github.com/visionmedia/haml.js",target:"_blank",rel:"noopener noreferrer"}},[t._v("haml"),n("OutboundLink")],1)]),t._v(" "),n("li",[n("a",{attrs:{href:"https://github.com/9elements/haml-coffee",target:"_blank",rel:"noopener noreferrer"}},[t._v("haml-coffee"),n("OutboundLink")],1)]),t._v(" "),n("li",[n("a",{attrs:{href:"https://github.com/gregwebs/hamlet.js",target:"_blank",rel:"noopener noreferrer"}},[t._v("hamlet"),n("OutboundLink")],1)]),t._v(" "),n("li",[n("a",{attrs:{href:"https://github.com/wycats/handlebars.js/",target:"_blank",rel:"noopener noreferrer"}},[t._v("handlebars"),n("OutboundLink")],1)]),t._v(" "),n("li",[n("a",{attrs:{href:"https://github.com/twitter/hogan.js",target:"_blank",rel:"noopener noreferrer"}},[t._v("hogan"),n("OutboundLink")],1)]),t._v(" "),n("li",[n("a",{attrs:{href:"https://github.com/codemix/htmling",target:"_blank",rel:"noopener noreferrer"}},[t._v("htmling"),n("OutboundLink")],1)]),t._v(" "),n("li",[n("a",{attrs:{href:"https://github.com/visionmedia/jade",target:"_blank",rel:"noopener noreferrer"}},[t._v("jade"),n("OutboundLink")],1)]),t._v(" "),n("li",[n("a",{attrs:{href:"https://github.com/shinetech/jazz",target:"_blank",rel:"noopener noreferrer"}},[t._v("jazz"),n("OutboundLink")],1)]),t._v(" "),n("li",[n("a",{attrs:{href:"https://github.com/kof/node-jqtpl",target:"_blank",rel:"noopener noreferrer"}},[t._v("jqtpl"),n("OutboundLink")],1)]),t._v(" "),n("li",[n("a",{attrs:{href:"https://github.com/baryshev/just",target:"_blank",rel:"noopener noreferrer"}},[t._v("JUST"),n("OutboundLink")],1)]),t._v(" "),n("li",[n("a",{attrs:{href:"https://github.com/chjj/liquor",target:"_blank",rel:"noopener noreferrer"}},[t._v("liquor"),n("OutboundLink")],1)]),t._v(" "),n("li",[n("a",{attrs:{href:"https://github.com/bestiejs/lodash",target:"_blank",rel:"noopener noreferrer"}},[t._v("lodash"),n("OutboundLink")],1)]),t._v(" "),n("li",[n("a",{attrs:{href:"https://github.com/satchmorun/mote",target:"_blank",rel:"noopener noreferrer"}},[t._v("mote"),n("OutboundLink")],1)]),t._v(" "),n("li",[n("a",{attrs:{href:"https://github.com/janl/mustache.js",target:"_blank",rel:"noopener noreferrer"}},[t._v("mustache"),n("OutboundLink")],1)]),t._v(" "),n("li",[n("a",{attrs:{href:"https://github.com/mozilla/nunjucks",target:"_blank",rel:"noopener noreferrer"}},[t._v("nunjucks"),n("OutboundLink")],1)]),t._v(" "),n("li",[n("a",{attrs:{href:"https://github.com/jepso/QEJS",target:"_blank",rel:"noopener noreferrer"}},[t._v("QEJS"),n("OutboundLink")],1)]),t._v(" "),n("li",[n("a",{attrs:{href:"https://github.com/Rich-Harris/Ractive",target:"_blank",rel:"noopener noreferrer"}},[t._v("ractive"),n("OutboundLink")],1)]),t._v(" "),n("li",[n("a",{attrs:{href:"https://github.com/facebook/react",target:"_blank",rel:"noopener noreferrer"}},[t._v("react"),n("OutboundLink")],1)]),t._v(" "),n("li",[n("a",{attrs:{href:"https://github.com/paularmstrong/swig",target:"_blank",rel:"noopener noreferrer"}},[t._v("swig"),n("OutboundLink")],1)]),t._v(" "),n("li",[n("a",{attrs:{href:"http://archan937.github.com/templayed.js/",target:"_blank",rel:"noopener noreferrer"}},[t._v("templayed"),n("OutboundLink")],1)]),t._v(" "),n("li",[n("a",{attrs:{href:"https://github.com/leizongmin/tinyliquid",target:"_blank",rel:"noopener noreferrer"}},[t._v("liquid"),n("OutboundLink")],1)]),t._v(" "),n("li",[n("a",{attrs:{href:"https://github.com/malgorithms/toffee",target:"_blank",rel:"noopener noreferrer"}},[t._v("toffee"),n("OutboundLink")],1)]),t._v(" "),n("li",[n("a",{attrs:{href:"https://github.com/documentcloud/underscore",target:"_blank",rel:"noopener noreferrer"}},[t._v("underscore"),n("OutboundLink")],1)]),t._v(" "),n("li",[n("a",{attrs:{href:"https://github.com/jeremyruppel/walrus",target:"_blank",rel:"noopener noreferrer"}},[t._v("walrus"),n("OutboundLink")],1)]),t._v(" "),n("li",[n("a",{attrs:{href:"https://github.com/gsf/whiskers.js",target:"_blank",rel:"noopener noreferrer"}},[t._v("whiskers"),n("OutboundLink")],1)])])])},[function(){var t=this.$createElement,s=this._self._c||t;return s("h1",{attrs:{id:"views"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#views","aria-hidden":"true"}},[this._v("#")]),this._v(" Views")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("If you want to activate views, set the "),s("code",[this._v("views")]),this._v(" in "),s("code",[this._v("./config/general.json")]),this._v(".")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("For example, if you want to use "),s("code",[this._v("lodash")]),this._v(" for "),s("code",[this._v(".html")]),this._v(" files and use it by default,\nyou may set up your "),s("code",[this._v("views")]),this._v(" object as below:")])},function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("div",{staticClass:"language-js extra-class"},[n("pre",{pre:!0,attrs:{class:"language-js"}},[n("code",[n("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{attrs:{class:"token string"}},[t._v('"views"')]),n("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),n("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{attrs:{class:"token string"}},[t._v('"map"')]),n("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),n("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{attrs:{class:"token string"}},[t._v('"html"')]),n("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),n("span",{attrs:{class:"token string"}},[t._v('"lodash"')]),t._v("\n "),n("span",{attrs:{class:"token punctuation"}},[t._v("}")]),n("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),n("span",{attrs:{class:"token string"}},[t._v('"default"')]),n("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),n("span",{attrs:{class:"token string"}},[t._v('"html"')]),t._v("\n "),n("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("Views are defined in your application's "),s("code",[this._v("./views")]),this._v(" directory.")])},function(){var t=this.$createElement,s=this._self._c||t;return s("h2",{attrs:{id:"render-a-view"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#render-a-view","aria-hidden":"true"}},[this._v("#")]),this._v(" Render a view")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("Simply use "),s("code",[this._v("this.render")]),this._v(" instead of "),s("code",[this._v("this.body")]),this._v(" to render a view.")])},function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("p",[t._v("Using the config we wrote above with "),n("code",[t._v("lodash")]),t._v(" for "),n("code",[t._v(".html")]),t._v(" files and use the "),n("code",[t._v("html")]),t._v("\nextension by default, this example will render "),n("code",[t._v("./views/user.html")]),t._v(" with\nLodash as template engine.")])},function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("div",{staticClass:"language-js extra-class"},[n("pre",{pre:!0,attrs:{class:"language-js"}},[n("code",[n("span",{attrs:{class:"token keyword"}},[t._v("yield")]),t._v(" "),n("span",{attrs:{class:"token keyword"}},[t._v("this")]),n("span",{attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{attrs:{class:"token function"}},[t._v("render")]),n("span",{attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{attrs:{class:"token string"}},[t._v("'user'")]),n("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n firstname"),n("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),n("span",{attrs:{class:"token string"}},[t._v("'John'")]),n("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n lastname"),n("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),n("span",{attrs:{class:"token string"}},[t._v("'Doe'")]),t._v("\n"),n("span",{attrs:{class:"token punctuation"}},[t._v("}")]),n("span",{attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])},function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("div",{staticClass:"language-html extra-class"},[n("pre",{pre:!0,attrs:{class:"language-html"}},[n("code",[n("span",{attrs:{class:"token tag"}},[n("span",{attrs:{class:"token tag"}},[n("span",{attrs:{class:"token punctuation"}},[t._v("<")]),t._v("html")]),n("span",{attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),n("span",{attrs:{class:"token tag"}},[n("span",{attrs:{class:"token tag"}},[n("span",{attrs:{class:"token punctuation"}},[t._v("<")]),t._v("head")]),n("span",{attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("..."),n("span",{attrs:{class:"token tag"}},[n("span",{attrs:{class:"token tag"}},[n("span",{attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),n("span",{attrs:{class:"token tag"}},[n("span",{attrs:{class:"token tag"}},[n("span",{attrs:{class:"token punctuation"}},[t._v("<")]),t._v("body")]),n("span",{attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),n("span",{attrs:{class:"token tag"}},[n("span",{attrs:{class:"token tag"}},[n("span",{attrs:{class:"token punctuation"}},[t._v("<")]),t._v("p")]),n("span",{attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("Firstname: <% firstname %>"),n("span",{attrs:{class:"token tag"}},[n("span",{attrs:{class:"token tag"}},[n("span",{attrs:{class:"token punctuation"}},[t._v("<")]),t._v("br")]),n("span",{attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("Lastname: <% lastname %>"),n("span",{attrs:{class:"token tag"}},[n("span",{attrs:{class:"token tag"}},[n("span",{attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),n("span",{attrs:{class:"token tag"}},[n("span",{attrs:{class:"token tag"}},[n("span",{attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),n("span",{attrs:{class:"token tag"}},[n("span",{attrs:{class:"token tag"}},[n("span",{attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("Here is the same example with the "),s("code",[this._v("jade")]),this._v(" extension, not used by default:")])},function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("div",{staticClass:"language-js extra-class"},[n("pre",{pre:!0,attrs:{class:"language-js"}},[n("code",[n("span",{attrs:{class:"token keyword"}},[t._v("yield")]),t._v(" "),n("span",{attrs:{class:"token keyword"}},[t._v("this")]),n("span",{attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{attrs:{class:"token function"}},[t._v("render")]),n("span",{attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{attrs:{class:"token string"}},[t._v("'user.jade'")]),n("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n firstname"),n("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),n("span",{attrs:{class:"token string"}},[t._v("'John'")]),n("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n lastname"),n("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),n("span",{attrs:{class:"token string"}},[t._v("'Doe'")]),t._v("\n"),n("span",{attrs:{class:"token punctuation"}},[t._v("}")]),n("span",{attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("h2",{attrs:{id:"supported-template-engines"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#supported-template-engines","aria-hidden":"true"}},[this._v("#")]),this._v(" Supported template engines")])},function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("p",[t._v("To use a view engine, you should use npm to install it in your project and\nset the "),n("code",[t._v("map")]),t._v(" object in "),n("code",[t._v("strapi.config.views")]),t._v(". For example, if you want to use\n"),n("code",[t._v("swig")]),t._v(" for "),n("code",[t._v(".html")]),t._v(" files and "),n("code",[t._v("hogan")]),t._v(" for "),n("code",[t._v(".md")]),t._v(" files, you may configure the\n"),n("code",[t._v("map")]),t._v(" object as below:")])},function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("div",{staticClass:"language-js extra-class"},[n("pre",{pre:!0,attrs:{class:"language-js"}},[n("code",[n("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{attrs:{class:"token string"}},[t._v('"views"')]),n("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),n("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{attrs:{class:"token string"}},[t._v('"map"')]),n("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),n("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{attrs:{class:"token string"}},[t._v('"html"')]),n("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),n("span",{attrs:{class:"token string"}},[t._v('"swig"')]),n("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),n("span",{attrs:{class:"token string"}},[t._v('"md"')]),n("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),n("span",{attrs:{class:"token string"}},[t._v('"hogan"')]),t._v("\n "),n("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])}],!1,null,null,null);a.options.__file="views.md";s.default=a.exports}}]); \ No newline at end of file diff --git a/docs/.vuepress/dist/assets/js/27.2c9596ea.js b/docs/.vuepress/dist/assets/js/27.2c9596ea.js new file mode 100644 index 0000000000..d686f06f04 --- /dev/null +++ b/docs/.vuepress/dist/assets/js/27.2c9596ea.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[27],{212:function(t,e,r){"use strict";r.r(e);var a=r(0),n=Object(a.a)({},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("div",{staticClass:"content"},[r("div",{staticClass:"intro custom-block"},[t._m(0),t._v(" "),t._m(1),t._v(" "),r("p",[t._v("The most advanced open-source Content Management Framework to build powerful API with no effort.")]),t._v(" "),r("p",{staticClass:"flex justify-around"},[r("a",{attrs:{href:"https://www.npmjs.org/package/strapi",target:"_blank",rel:"noopener noreferrer"}},[r("img",{attrs:{src:"https://img.shields.io/npm/v/strapi.svg",alt:"npm version"}}),r("OutboundLink")],1),t._v(" "),r("a",{attrs:{href:"https://www.npmjs.org/package/strapi",target:"_blank",rel:"noopener noreferrer"}},[r("img",{attrs:{src:"https://img.shields.io/npm/dm/strapi.svg",alt:"npm downloads"}}),r("OutboundLink")],1),t._v(" "),r("a",{attrs:{href:"https://travis-ci.org/strapi/strapi",target:"_blank",rel:"noopener noreferrer"}},[r("img",{attrs:{src:"https://travis-ci.org/strapi/strapi.svg?branch=master",alt:"Build status"}}),r("OutboundLink")],1),t._v(" "),r("a",{attrs:{href:"http://slack.strapi.io",target:"_blank",rel:"noopener noreferrer"}},[r("img",{attrs:{src:"http://strapi-slack.herokuapp.com/badge.svg",alt:"Slack status"}}),r("OutboundLink")],1),t._v(" "),r("a",{attrs:{href:"https://heroku.com/deploy?template=https://github.com/strapi/strapi-heroku-app",target:"_blank",rel:"noopener noreferrer"}},[r("img",{attrs:{src:"https://www.herokucdn.com/deploy/button.svg",alt:"Heroku Deploy",height:"20"}}),r("OutboundLink")],1)])]),t._v(" "),t._m(2),t._v(" "),r("p",[t._v("We've been working on a major update for Strapi during the past months, rewriting the core framework and the dashboard.")]),t._v(" "),r("p",[t._v("This documentation is only related to Strapi v3@alpha.13 ("),r("a",{attrs:{href:"http://strapi.io/documentation/1.x.x",target:"_blank",rel:"noopener noreferrer"}},[t._v("v1 documentation is still available"),r("OutboundLink")],1),t._v(").")]),t._v(" "),r("p",[r("strong",[r("router-link",{attrs:{to:"./getting-started/installation.html"}},[t._v("Get Started")])],1),r("br"),t._v("\nLearn how to install Strapi and start developing your API.")]),t._v(" "),r("p",[r("strong",[r("router-link",{attrs:{to:"./cli/CLI.html"}},[t._v("Command Line Interface")])],1),r("br"),t._v("\nGet to know our CLI to make features the hacker way!")]),t._v(" "),r("p",[r("strong",[r("router-link",{attrs:{to:"./concepts/concepts.html"}},[t._v("Concepts")])],1),r("br"),t._v("\nGet to know more about Strapi and how it works.")]),t._v(" "),r("p",[r("strong",[r("router-link",{attrs:{to:"./configurations/configurations.html"}},[t._v("Guides")])],1),r("br"),t._v("\nGet familiar with Strapi. Discover concrete examples on how to develop the features you need.")]),t._v(" "),r("p",[r("strong",[r("router-link",{attrs:{to:"./plugin-development/quick-start.html"}},[t._v("Plugin Development")])],1),r("br"),t._v("\nUnderstand how to develop your own plugin.")]),t._v(" "),r("p",[r("strong",[r("router-link",{attrs:{to:"./api-reference/reference.html"}},[t._v("API Reference")])],1),r("br"),t._v("\nLearn about Strapi's API, the "),r("code",[t._v("strapi")]),t._v(" object that is available in your backend.")]),t._v(" "),r("p",[r("strong",[r("router-link",{attrs:{to:"./migration/migration-guide.html"}},[t._v("Migration guide")])],1),r("br")])])},[function(){var t=this.$createElement,e=this._self._c||t;return e("p",[e("img",{attrs:{src:"https://cldup.com/7umchwdUBh.png",alt:"Logo"}})])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"api-creation-made-simple-secure-and-fast"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#api-creation-made-simple-secure-and-fast","aria-hidden":"true"}},[this._v("#")]),this._v(" API creation made simple, secure and fast.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"v3-alpha-13-is-available"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#v3-alpha-13-is-available","aria-hidden":"true"}},[this._v("#")]),this._v(" v3@alpha.13 is available!")])}],!1,null,null,null);n.options.__file="README.md";e.default=n.exports}}]); \ No newline at end of file diff --git a/docs/.vuepress/dist/assets/js/28.9b077c15.js b/docs/.vuepress/dist/assets/js/28.9b077c15.js new file mode 100644 index 0000000000..32aa13c44d --- /dev/null +++ b/docs/.vuepress/dist/assets/js/28.9b077c15.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[28],{211:function(t,e,r){"use strict";r.r(e);var i=r(0),s=Object(i.a)({},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("div",{staticClass:"content"},[t._m(0),t._v(" "),t._m(1),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"http://strapi.io",target:"_blank",rel:"noopener noreferrer"}},[t._v("Strapi Website"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://github.com/strapi/strapi",target:"_blank",rel:"noopener noreferrer"}},[t._v("GitHub Repository"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://github.com/strapi/strapi/blob/master/CONTRIBUTING.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("Contributing Guide"),r("OutboundLink")],1)])]),t._v(" "),t._m(2),t._v(" "),r("ul",[r("li",[r("router-link",{attrs:{to:"./getting-started/installation.html"}},[t._v("Installation")])],1),t._v(" "),r("li",[r("router-link",{attrs:{to:"./getting-started/quick-start.html"}},[t._v("Quick start")])],1)]),t._v(" "),t._m(3),t._v(" "),r("ul",[r("li",[r("router-link",{attrs:{to:"./cli/CLI.html"}},[t._v("Command line interface")])],1)]),t._v(" "),t._m(4),t._v(" "),r("ul",[r("li",[r("router-link",{attrs:{to:"./concepts/concepts.html"}},[t._v("Table of contents")])],1)]),t._v(" "),t._m(5),t._v(" "),r("ul",[r("li",[r("router-link",{attrs:{to:"./guides/authentication.html"}},[t._v("Authentication")])],1),t._v(" "),r("li",[r("router-link",{attrs:{to:"./configurations/configurations.html"}},[t._v("Configurations")])],1),t._v(" "),r("li",[r("router-link",{attrs:{to:"./guides/controllers.html"}},[t._v("Controllers")])],1),t._v(" "),r("li",[r("router-link",{attrs:{to:"./guides/deployment.html"}},[t._v("Deployment")])],1),t._v(" "),r("li",[r("router-link",{attrs:{to:"./guides/email.html"}},[t._v("Email")])],1),t._v(" "),r("li",[r("router-link",{attrs:{to:"./guides/upload.html"}},[t._v("File Upload")])],1),t._v(" "),r("li",[r("router-link",{attrs:{to:"./guides/filters.html"}},[t._v("Filters")])],1),t._v(" "),r("li",[r("router-link",{attrs:{to:"./guides/graphql.html"}},[t._v("GraphQL")])],1),t._v(" "),r("li",[r("router-link",{attrs:{to:"./guides/i18n.html"}},[t._v("Internationalization")])],1),t._v(" "),r("li",[r("router-link",{attrs:{to:"./guides/models.html"}},[t._v("Models")])],1),t._v(" "),r("li",[r("router-link",{attrs:{to:"./guides/policies.html"}},[t._v("Policies")])],1),t._v(" "),r("li",[r("router-link",{attrs:{to:"./guides/public-assets.html"}},[t._v("Public Assets")])],1),t._v(" "),r("li",[r("router-link",{attrs:{to:"./guides/requests.html"}},[t._v("Requests")])],1),t._v(" "),r("li",[r("router-link",{attrs:{to:"./guides/responses.html"}},[t._v("Responses")])],1),t._v(" "),r("li",[r("router-link",{attrs:{to:"./guides/routing.html"}},[t._v("Routing")])],1),t._v(" "),r("li",[r("router-link",{attrs:{to:"./guides/services.html"}},[t._v("Services")])],1)]),t._v(" "),t._m(6),t._v(" "),r("ul",[r("li",[r("router-link",{attrs:{to:"./plugin-development/quick-start.html"}},[t._v("Quick start")])],1),t._v(" "),r("li",[r("router-link",{attrs:{to:"./plugin-development/plugin-architecture.html"}},[t._v("Plugin Folders and Files Architecture")])],1),t._v(" "),r("li",[r("router-link",{attrs:{to:"./plugin-development/backend-development.html"}},[t._v("Back-end Development")])],1),t._v(" "),r("li",[r("router-link",{attrs:{to:"./plugin-development/frontend-development.html"}},[t._v("Front-end Development")])],1),t._v(" "),r("li",[r("router-link",{attrs:{to:"./plugin-development/frontend-use-cases.html"}},[t._v("Front-end Use Cases")])],1),t._v(" "),r("li",[r("router-link",{attrs:{to:"./plugin-development/utils.html"}},[t._v("Front-end Helpers")])],1),t._v(" "),r("li",[r("router-link",{attrs:{to:"./plugin-development/ui-components.html"}},[t._v("Front-end UI Components")])],1)]),t._v(" "),t._m(7),t._v(" "),r("ul",[r("li",[r("router-link",{attrs:{to:"./advanced/customize-admin.html"}},[t._v("Admin panel")])],1),t._v(" "),r("li",[r("router-link",{attrs:{to:"./advanced/logging.html"}},[t._v("Logging")])],1),t._v(" "),r("li",[r("router-link",{attrs:{to:"./advanced/hooks.html"}},[t._v("Hooks")])],1),t._v(" "),r("li",[r("router-link",{attrs:{to:"./advanced/middlewares.html"}},[t._v("Middlewares")])],1),t._v(" "),r("li",[r("router-link",{attrs:{to:"./advanced/usage-tracking.html"}},[t._v("Tracking usage")])],1)]),t._v(" "),t._m(8),t._v(" "),r("ul",[r("li",[r("router-link",{attrs:{to:"./api-reference/reference.html"}},[t._v("Table of contents")])],1)]),t._v(" "),t._m(9),t._v(" "),r("ul",[r("li",[r("router-link",{attrs:{to:"./tutorials/"}},[t._v("Table of contents")])],1)]),t._v(" "),t._m(10),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://github.com/strapi/strapi/wiki",target:"_blank",rel:"noopener noreferrer"}},[t._v("Migration guides"),r("OutboundLink")],1)])])])},[function(){var t=this.$createElement,e=this._self._c||t;return e("h1",{attrs:{id:"summary"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#summary","aria-hidden":"true"}},[this._v("#")]),this._v(" Summary")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"useful-links"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#useful-links","aria-hidden":"true"}},[this._v("#")]),this._v(" Useful links")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"getting-started"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#getting-started","aria-hidden":"true"}},[this._v("#")]),this._v(" Getting started")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"cli"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#cli","aria-hidden":"true"}},[this._v("#")]),this._v(" CLI")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"concepts"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#concepts","aria-hidden":"true"}},[this._v("#")]),this._v(" Concepts")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"guides"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#guides","aria-hidden":"true"}},[this._v("#")]),this._v(" Guides")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"plugin-development"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#plugin-development","aria-hidden":"true"}},[this._v("#")]),this._v(" Plugin Development")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"advanced-usage"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#advanced-usage","aria-hidden":"true"}},[this._v("#")]),this._v(" Advanced Usage")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"api-reference"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#api-reference","aria-hidden":"true"}},[this._v("#")]),this._v(" API Reference")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"tutorials"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#tutorials","aria-hidden":"true"}},[this._v("#")]),this._v(" Tutorials")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"migration"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#migration","aria-hidden":"true"}},[this._v("#")]),this._v(" Migration")])}],!1,null,null,null);s.options.__file="SUMMARY.md";e.default=s.exports}}]); \ No newline at end of file diff --git a/docs/.vuepress/dist/assets/js/29.8ea8ecc1.js b/docs/.vuepress/dist/assets/js/29.8ea8ecc1.js new file mode 100644 index 0000000000..6accb642b4 --- /dev/null +++ b/docs/.vuepress/dist/assets/js/29.8ea8ecc1.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[29],{210:function(t,s,a){"use strict";a.r(s);var n=a(0),e=Object(n.a)({},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"content"},[t._m(0),t._v(" "),a("p",[t._v("One of Strapi's main feature is its fully extendable and customizable admin panel. This section explains how the admin panel section is structured and how to customize it.")]),t._v(" "),a("p",[t._v("See the "),a("a",{attrs:{href:"https://github.com/strapi/strapi/blob/master/CONTRIBUTING.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("Contributing Guide"),a("OutboundLink")],1),t._v(" for informations on how to develop the Strapi's admin interface.")]),t._v(" "),t._m(1),t._v(" "),t._m(2),t._v(" "),t._m(3),a("hr"),t._v(" "),t._m(4),t._v(" "),a("p",[t._v("The administration panel can be customised according to your needs, so you can make it reflects your identity: colors, fonts, logo, etc.")]),t._v(" "),t._m(5),t._v(" "),a("p",[t._v("By default, the administration panel is exposed via "),a("a",{attrs:{href:"http://localhost:1337/admin",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://localhost:1337/admin"),a("OutboundLink")],1),t._v(". However, for security reasons, you can easily update this path.")]),t._v(" "),t._m(6),t._v(" "),t._m(7),a("p",[t._v("The panel will be available through "),a("a",{attrs:{href:"http://localhost:1337/dashboard",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://localhost:1337/dashboard"),a("OutboundLink")],1),t._v(" with the configurations above.")]),t._v(" "),t._m(8),t._v(" "),t._m(9),t._v(" "),t._m(10),t._v(" "),t._m(11),t._v(" "),t._m(12),t._v(" "),t._m(13),t._v(" "),t._m(14),t._v(" "),a("p",[t._v("You should be able to see the admin at "),a("a",{attrs:{href:"http://localhost:4000/admin",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://localhost:4000/admin"),a("OutboundLink")],1),t._v(".")]),t._v(" "),t._m(15),t._v(" "),t._m(16),t._v(" "),a("p",[t._v("Admin's styles use "),a("a",{attrs:{href:"https://github.com/postcss/postcss",target:"_blank",rel:"noopener noreferrer"}},[t._v("PostCSS"),a("OutboundLink")],1),t._v(", and more precisely "),a("a",{attrs:{href:"https://github.com/postcss/postcss-scss",target:"_blank",rel:"noopener noreferrer"}},[t._v("PostCSS-SCSS"),a("OutboundLink")],1),t._v(". In this way, colors are stored in variables. The values of these variables can be easily changed in files located in "),a("code",[t._v("./admin/admin/src/styles/variables/")]),t._v(".")]),t._v(" "),a("p",[t._v("The changes should be automatically visible.")]),t._v(" "),t._m(17),t._v(" "),a("p",[t._v("Fonts can also be overridden:")]),t._v(" "),t._m(18),t._v(" "),t._m(19),t._v(" "),t._m(20),t._v(" "),t._m(21),t._v(" "),a("hr"),t._v(" "),t._m(22),t._v(" "),a("p",[t._v("To build the administration, run the following command from the root directory of your project.")]),t._v(" "),t._m(23),t._m(24),t._v(" "),a("p",[t._v("After you have built the admininistration you can now create a new project to develop your API with the changes implemented.")]),t._v(" "),t._m(25),t._v(" "),a("hr"),t._v(" "),t._m(26),t._v(" "),a("p",[t._v("The administration is nothing more than a React front-end application calling an API. The front-end and the back-end are independent and can be deployed on different servers which brings us to different scenarios:")]),t._v(" "),t._m(27),t._v(" "),a("p",[t._v("Let's dive into the build configurations for each case.")]),t._v(" "),t._m(28),t._v(" "),a("p",[t._v("You don't need to touch anything in your configuration file. This is the default behaviour and the build configurations will be automatically set. The server will start on the defined port and the administration panel will be accessible through http://yourdomain.com:1337/dashboard.")]),t._v(" "),a("p",[t._v("You might want to change the path to access to the administration panel. Here the required configurations to change the path:")]),t._v(" "),t._m(29),t._v(" "),t._m(30),a("p",[a("strong",[t._v("You have to rebuild the administration panel to make this work.")]),t._v(" Please follow the "),a("router-link",{attrs:{to:"./../guides/deployment.html"}},[t._v("step #2 of the deployment guide")]),t._v(".")],1),t._v(" "),t._m(31),t._v(" "),a("p",[t._v("It's very common to deploy the front-end and the back-end on different servers. Here the required configurations to handle this case:")]),t._v(" "),t._m(32),t._v(" "),t._m(33),t._m(34),t._v(" "),t._m(35),t._v(" "),a("p",[t._v("The DOM should look like this:")]),t._v(" "),t._m(36),t._v(" "),t._m(37),t._m(38),t._v(" "),t._m(39),t._v(" "),a("p",[t._v("In this case, we suppose that you decided to put your administration and the plugins on the same server but on a different server as the API.")]),t._v(" "),t._m(40),t._v(" "),t._m(41),t._m(42),t._v(" "),t._m(43),t._v(" "),t._m(44),t._m(45),t._v(" "),t._m(46),t._v(" "),t._m(47),t._m(48)])},[function(){var t=this.$createElement,s=this._self._c||t;return s("h1",{attrs:{id:"admin-panel"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#admin-panel","aria-hidden":"true"}},[this._v("#")]),this._v(" Admin panel")])},function(){var t=this.$createElement,s=this._self._c||t;return s("h2",{attrs:{id:"files-structure"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#files-structure","aria-hidden":"true"}},[this._v("#")]),this._v(" Files structure")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("The entire logic of the admin panel is located in a single folder named "),s("code",[this._v("./admin/")]),this._v(". This directory contains the following structure:")])},function(){var t=this.$createElement,s=this._self._c||t;return s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[this._v("/admin\n└─── admin\n| └─── build // Webpack generated build of the front-end\n| └─── src // Front-end directory\n| └─── app.js // Entry point of the React application\n| └─── assets // Assets directory containing images,...\n| └─── components // Admin's React components directory\n| └─── containers // Admin's high level components directory\n| └─── favicon.ico // Favicon displayed in web browser\n| └─── i18n.js // Internalization logic\n| └─── index.html // Basic html file in which are injected necessary styles and scripts\n| └─── reducers.js // Redux reducers logic\n| └─── store.js // Redux store logic\n| └─── styles // Directory containing the global styles. Specific styles are defined at the component level\n| └─── translations // Directory containing text messages for each supported languages\n└─── config\n| └─── routes.json // Admin's API routes\n| └─── layout.json // Admin's specific settings\n└─── controllers // Admin's API controllers\n└─── services // Admin's API services\n└─── packages.json // Admin's npm dependencies\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("h2",{attrs:{id:"customization"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#customization","aria-hidden":"true"}},[this._v("#")]),this._v(" Customization")])},function(){var t=this.$createElement,s=this._self._c||t;return s("h3",{attrs:{id:"change-access-url"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#change-access-url","aria-hidden":"true"}},[this._v("#")]),this._v(" Change access URL")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[s("strong",[this._v("Path —")]),this._v(" "),s("code",[this._v("./config/environment/**/server.json")]),this._v(".")])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"language-json extra-class"},[a("pre",{pre:!0,attrs:{class:"language-json"}},[a("code",[a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token property"}},[t._v('"host"')]),a("span",{attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"localhost"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token property"}},[t._v('"port"')]),a("span",{attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token number"}},[t._v("1337")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token property"}},[t._v('"autoReload"')]),a("span",{attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token property"}},[t._v('"enabled"')]),a("span",{attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token property"}},[t._v('"cron"')]),a("span",{attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token property"}},[t._v('"enabled"')]),a("span",{attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token property"}},[t._v('"admin"')]),a("span",{attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token property"}},[t._v('"path"')]),a("span",{attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"/dashboard"')]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("h3",{attrs:{id:"development-mode"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#development-mode","aria-hidden":"true"}},[this._v("#")]),this._v(" Development mode")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("Note that to modify the administration panel, your project needs to be created with using the "),s("code",[this._v("dev")]),this._v(" flag, an example of such would be: "),s("code",[this._v("strapi new strapi --dev")]),this._v(".")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[s("strong",[this._v("#1 — Install its own dependencies")])])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("Run "),s("code",[this._v("npm install")]),this._v(" from the "),s("code",[this._v("./admin")]),this._v(" folder.")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[s("strong",[this._v("#2 — Launch the development server")])])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("Run "),s("code",[this._v("npm start")]),this._v(" from the "),s("code",[this._v("./admin")]),this._v(" folder. That's all.")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[s("strong",[this._v("#3 — Go to the browser")])])},function(){var t=this.$createElement,s=this._self._c||t;return s("div",{staticClass:"note custom-block"},[s("p",[this._v("In development, all the plugins of your app are mounted in the same build as the administration panel.")])])},function(){var t=this.$createElement,s=this._self._c||t;return s("h3",{attrs:{id:"colors"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#colors","aria-hidden":"true"}},[this._v("#")]),this._v(" Colors")])},function(){var t=this.$createElement,s=this._self._c||t;return s("h3",{attrs:{id:"fonts"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#fonts","aria-hidden":"true"}},[this._v("#")]),this._v(" Fonts")])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("ul",[a("li",[t._v("Add the fonts files you need in "),a("code",[t._v("./admin/admin/src/styles/fonts")]),t._v(".")]),t._v(" "),a("li",[t._v("Import them from "),a("code",[t._v("./admin/admin/src/styles/base/fonts.scss")]),t._v(".")]),t._v(" "),a("li",[t._v("Use them by replacing the variables' values in "),a("code",[t._v("./admin/admin/src/styles/variables/variables.bootstrap.scss")]),t._v(".")])])},function(){var t=this.$createElement,s=this._self._c||t;return s("h3",{attrs:{id:"logo"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#logo","aria-hidden":"true"}},[this._v("#")]),this._v(" Logo")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("To change the top-left displayed admin panel's logo, replace the image located at "),s("code",[this._v("./admin/admin/src/assets/images/logo-strapi.png")]),this._v(".")])},function(){var t=this.$createElement,s=this._self._c||t;return s("div",{staticClass:"note custom-block"},[s("p",[this._v("make sure the size of your image is the same as the existing one (434px x 120px).")])])},function(){var t=this.$createElement,s=this._self._c||t;return s("h2",{attrs:{id:"build"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#build","aria-hidden":"true"}},[this._v("#")]),this._v(" Build")])},function(){var t=this.$createElement,s=this._self._c||t;return s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[this._v("npm run setup\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("This will replace the folder's content located at "),s("code",[this._v("./admin/admin/build")]),this._v(". Visit http://localhost:1337/admin/ to make sure your updates have been taken in account.")])},function(){var t=this.$createElement,s=this._self._c||t;return s("div",{staticClass:"note custom-block"},[s("p",[this._v("You should now create a project without "),s("code",[this._v("--dev")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("h2",{attrs:{id:"deployment"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#deployment","aria-hidden":"true"}},[this._v("#")]),this._v(" Deployment")])},function(){var t=this.$createElement,s=this._self._c||t;return s("ol",[s("li",[this._v("Deploy the entire project on the same server.")]),this._v(" "),s("li",[this._v("Deploy the administration panel on another server (AWS S3, Azure, etc) than the API.")]),this._v(" "),s("li",[this._v("Deploy the administration panel and the plugins on another server than the API.")])])},function(){var t=this.$createElement,s=this._self._c||t;return s("h4",{attrs:{id:"deploy-the-entire-project-on-the-same-server"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#deploy-the-entire-project-on-the-same-server","aria-hidden":"true"}},[this._v("#")]),this._v(" Deploy the entire project on the same server.")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[s("strong",[this._v("Path —")]),this._v(" "),s("code",[this._v("./config/environment/**/server.json")]),this._v(".")])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"host"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"localhost"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"port"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token number"}},[t._v("1337")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"autoReload"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"enabled"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"cron"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"enabled"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"admin"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"path"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"/dashboard"')]),t._v(" "),a("span",{attrs:{class:"token comment"}},[t._v("// We change the path to access to the admin (highly recommended for security reasons).")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("h4",{attrs:{id:"deploy-the-administration-panel-on-another-server-aws-s3-azure-etc-than-the-api"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#deploy-the-administration-panel-on-another-server-aws-s3-azure-etc-than-the-api","aria-hidden":"true"}},[this._v("#")]),this._v(" Deploy the administration panel on another server (AWS S3, Azure, etc) than the API.")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[s("strong",[this._v("Path —")]),this._v(" "),s("code",[this._v("./config/environment/**/server.json")]),this._v(".")])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"host"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"localhost"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"port"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token number"}},[t._v("1337")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"autoReload"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"enabled"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"cron"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"enabled"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"admin"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"path"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"/dashboard"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"build"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"host"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"/"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token comment"}},[t._v("// Note: The administration will be accessible from the root of the domain (ex: http//yourfrontend.com/)")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"backend"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"http://yourbackend.com"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"plugins"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"source"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"backend"')]),t._v(" "),a("span",{attrs:{class:"token comment"}},[t._v("// What does it means? The script tags in the index.html will use the backend value to load the plugins (ex: http://yourbackend.com/dashboard/content-manager/main.js).")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("The administration URL will be http://yourfrontend.com and every request from the panel will hit the backend at http://yourbackend.com. The plugins will be injected through the "),s("code",[this._v("origin")]),this._v(" (means the API itself). In other words, the plugins URLs will be "),s("code",[this._v("http://yourbackend.com/dashboard/content-manager/main.js")]),this._v(".")])},function(){var t=this.$createElement,s=this._self._c||t;return s("div",{staticClass:"note custom-block"},[s("p",[this._v("How it is possible? The API (the Strapi server) owns the plugin and these plugins are exposed through "),s("code",[this._v("http://yourbackend.com/admin/**/main.js")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[s("strong",[this._v("Path —")]),this._v(" "),s("code",[this._v("./admin/admin/build/index.html")]),this._v(".")])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"language-html extra-class"},[a("pre",{pre:!0,attrs:{class:"language-html"}},[a("code",[a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("<")]),t._v("html")]),a("span",{attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("<")]),t._v("head")]),a("span",{attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("<")]),t._v("body")]),a("span",{attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("<")]),t._v("div")]),t._v(" "),a("span",{attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{attrs:{class:"token attr-value"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("=")]),a("span",{attrs:{class:"token punctuation"}},[t._v('"')]),t._v("app"),a("span",{attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{attrs:{class:"token attr-name"}},[t._v("type")]),a("span",{attrs:{class:"token attr-value"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("=")]),a("span",{attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text/javascript"),a("span",{attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{attrs:{class:"token attr-name"}},[t._v("src")]),a("span",{attrs:{class:"token attr-value"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("=")]),a("span",{attrs:{class:"token punctuation"}},[t._v('"')]),t._v("/vendor.dll.js"),a("span",{attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{attrs:{class:"token script language-javascript"}}),a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{attrs:{class:"token attr-name"}},[t._v("type")]),a("span",{attrs:{class:"token attr-value"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("=")]),a("span",{attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text/javascript"),a("span",{attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{attrs:{class:"token attr-name"}},[t._v("src")]),a("span",{attrs:{class:"token attr-value"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("=")]),a("span",{attrs:{class:"token punctuation"}},[t._v('"')]),t._v("/main.js"),a("span",{attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{attrs:{class:"token script language-javascript"}}),a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{attrs:{class:"token attr-name"}},[t._v("src")]),a("span",{attrs:{class:"token attr-value"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("=")]),a("span",{attrs:{class:"token punctuation"}},[t._v('"')]),t._v("http://yourbackend.com/dashboard/content-manager/main.js"),a("span",{attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{attrs:{class:"token script language-javascript"}}),a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{attrs:{class:"token attr-name"}},[t._v("src")]),a("span",{attrs:{class:"token attr-value"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("=")]),a("span",{attrs:{class:"token punctuation"}},[t._v('"')]),t._v("http://yourbackend.com/dashboard/settings-manager/main.js"),a("span",{attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{attrs:{class:"token script language-javascript"}}),a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{attrs:{class:"token attr-name"}},[t._v("src")]),a("span",{attrs:{class:"token attr-value"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("=")]),a("span",{attrs:{class:"token punctuation"}},[t._v('"')]),t._v("http://yourbackend.com/dashboard/content-type-builder/main.js"),a("span",{attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{attrs:{class:"token script language-javascript"}}),a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("div",{staticClass:"note custom-block"},[s("p",[this._v("The plugins are injected using the "),s("code",[this._v("./admin/admin/build/config/plugins.json")]),this._v(". To see the plugins URLs in the "),s("code",[this._v("index.html")]),this._v(", you need to launch the administration panel in the browser.")])])},function(){var t=this.$createElement,s=this._self._c||t;return s("h4",{attrs:{id:"deploy-the-administration-panel-and-the-plugins-on-another-server-than-the-api"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#deploy-the-administration-panel-and-the-plugins-on-another-server-than-the-api","aria-hidden":"true"}},[this._v("#")]),this._v(" Deploy the administration panel and the plugins on another server than the API")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[s("strong",[this._v("Path —")]),this._v(" "),s("code",[this._v("./config/environment/**/server.json")]),this._v(".")])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"host"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"localhost"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"port"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token number"}},[t._v("1337")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"autoReload"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"enabled"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"cron"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"enabled"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"admin"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"build"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"host"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"http://yourfrontend.com/dashboard"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token comment"}},[t._v("// Note: The custom path has moved directly in the host URL.")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"backend"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"http://yourbackend.com"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"plugins"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"source"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"host"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token comment"}},[t._v("// What does it means? The script tags in the index.html will use the host value to load the plugins (ex: http://yourfrontend.com/dashboard/plugins/content-manager/main.js).")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"folder"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"/plugins"')]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("The administration URL will be http://yourfrontend.com/dashboard and every request from the panel will hit the backend at http://yourbackend.com. The plugins will be injected through the "),s("code",[this._v("host")]),this._v(". It means that the plugins URLs will use the host URL as the origin. So the plugins URLs will be "),s("code",[this._v("http://yourfrontend.com/dashboard/plugins/content-manager/main.js")]),this._v(".")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("We also added a "),s("code",[this._v("folder")]),this._v(" setting to separate the plugins from the administration build. In your server, the files structure should look like this:")])},function(){var t=this.$createElement,s=this._self._c||t;return s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[this._v("- src/\n - 0bd35bad03d09ca61ac6cce225112e36.svg\n - 1d51d8767683a24635702f720cda4e26.svg\n - af3aefd0529349e40e4817c87c620836.png\n - config/\n - plugins.json\n - main.js\n - main.js.map\n - plugins/\n - content-type-builder/\n - 0bd35bad03d09ca61ac6cce225112e36.svg\n - 1d51d8767683a24635702f720cda4e26.svg\n - af3aefd0529349e40e4817c87c620836.png\n - main.js\n - main.js.map\n - content-manager/\n - ...\n - main.js\n - main.js.map\n - settings-manager/\n - ...\n - main.js\n - main.js.map\n - vendor.dll.js\n - vendor.dll.js.map\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("The generated "),s("code",[this._v("index.html")]),this._v(" will look like this:")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[s("strong",[this._v("Path —")]),this._v(" "),s("code",[this._v("./admin/admin/build/index.html")]),this._v(".")])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"language-html extra-class"},[a("pre",{pre:!0,attrs:{class:"language-html"}},[a("code",[a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("<")]),t._v("html")]),a("span",{attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("<")]),t._v("head")]),a("span",{attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("<")]),t._v("body")]),a("span",{attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("<")]),t._v("div")]),t._v(" "),a("span",{attrs:{class:"token attr-name"}},[t._v("id")]),a("span",{attrs:{class:"token attr-value"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("=")]),a("span",{attrs:{class:"token punctuation"}},[t._v('"')]),t._v("app"),a("span",{attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{attrs:{class:"token attr-name"}},[t._v("type")]),a("span",{attrs:{class:"token attr-value"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("=")]),a("span",{attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text/javascript"),a("span",{attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{attrs:{class:"token attr-name"}},[t._v("src")]),a("span",{attrs:{class:"token attr-value"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("=")]),a("span",{attrs:{class:"token punctuation"}},[t._v('"')]),t._v("/dashboard/vendor.dll.js"),a("span",{attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{attrs:{class:"token script language-javascript"}}),a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{attrs:{class:"token attr-name"}},[t._v("type")]),a("span",{attrs:{class:"token attr-value"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("=")]),a("span",{attrs:{class:"token punctuation"}},[t._v('"')]),t._v("text/javascript"),a("span",{attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),a("span",{attrs:{class:"token attr-name"}},[t._v("src")]),a("span",{attrs:{class:"token attr-value"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("=")]),a("span",{attrs:{class:"token punctuation"}},[t._v('"')]),t._v("/dashboard/main.js"),a("span",{attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{attrs:{class:"token script language-javascript"}}),a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{attrs:{class:"token attr-name"}},[t._v("src")]),a("span",{attrs:{class:"token attr-value"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("=")]),a("span",{attrs:{class:"token punctuation"}},[t._v('"')]),t._v("/dashboard/plugins/content-manager/main.js"),a("span",{attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{attrs:{class:"token script language-javascript"}}),a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{attrs:{class:"token attr-name"}},[t._v("src")]),a("span",{attrs:{class:"token attr-value"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("=")]),a("span",{attrs:{class:"token punctuation"}},[t._v('"')]),t._v("/dashboard/plugins/settings-manager/main.js"),a("span",{attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{attrs:{class:"token script language-javascript"}}),a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{attrs:{class:"token attr-name"}},[t._v("src")]),a("span",{attrs:{class:"token attr-value"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("=")]),a("span",{attrs:{class:"token punctuation"}},[t._v('"')]),t._v("/dashboard/plugins/content-type-builder/main.js"),a("span",{attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{attrs:{class:"token script language-javascript"}}),a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token tag"}},[a("span",{attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("div",{staticClass:"note custom-block"},[s("p",[this._v("The plugins are injected using the "),s("code",[this._v("./admin/admin/build/config/plugins.json")]),this._v(". To see the plugins URLs in the "),s("code",[this._v("index.html")]),this._v(", you need to launch the administration panel in the browser.")])])}],!1,null,null,null);e.options.__file="customize-admin.md";s.default=e.exports}}]); \ No newline at end of file diff --git a/docs/.vuepress/dist/assets/js/3.4d92d5e3.js b/docs/.vuepress/dist/assets/js/3.4d92d5e3.js new file mode 100644 index 0000000000..2d847c73db --- /dev/null +++ b/docs/.vuepress/dist/assets/js/3.4d92d5e3.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[3],{236:function(t,e,a){"use strict";a.r(e);var s=a(0),r=Object(s.a)({},function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"content"},[a("div",{staticClass:"intro custom-block"},[t._m(0),t._v(" "),a("p",[a("a",{attrs:{href:"https://travis-ci.org/wistityhq/strapi",target:"_blank",rel:"noopener noreferrer"}},[a("img",{attrs:{src:"https://travis-ci.org/wistityhq/strapi.svg?branch=master",alt:"Build Status"}}),a("OutboundLink")],1),t._v(" "),a("a",{attrs:{href:"http://slack.strapi.io",target:"_blank",rel:"noopener noreferrer"}},[a("img",{attrs:{src:"http://strapi-slack.herokuapp.com/badge.svg",alt:"Slack Status"}}),a("OutboundLink")],1)]),t._v(" "),a("p",[t._v("Strapi is an open-source Node.js rich framework for building applications and services.")])]),t._v(" "),a("p",[t._v("Strapi enables developers to focus on writing reusable application logic instead of spending time\nbuilding infrastructure. It is designed for building practical, production-ready Node.js applications\nin a matter of hours instead of weeks.")]),t._v(" "),a("p",[t._v("The framework sits on top of "),a("a",{attrs:{href:"http://koajs.com/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Koa"),a("OutboundLink")],1),t._v(". Its ensemble of small modules work\ntogether to provide simplicity, maintainability, and structural conventions to Node.js applications.")]),t._v(" "),t._m(1),t._v(" "),t._m(2),t._v(" "),t._m(3),t._v(" "),a("p",[t._v("Install the latest stable release with the npm command-line tool:")]),t._v(" "),t._m(4),t._m(5),t._v(" "),a("blockquote",[a("p",[t._v("We advise you to use our Studio to build APIs. To do so, you need to create a Strapi account.\n"),a("a",{attrs:{href:"http://studio.strapi.io",target:"_blank",rel:"noopener noreferrer"}},[t._v("Go to the Strapi Studio to signup"),a("OutboundLink")],1),t._v(".\nStudio is dedicated to developers to build applications without writing\nany single line of code thanks to its powerful set of tools.")])]),t._v(" "),a("p",[t._v("After creating an account on the Strapi Studio, you are able to link your machine to your\nStrapi Studio account to get access to all features offered by the Strapi ecosystem.\nUse your Strapi account credentials.")]),t._v(" "),t._m(6),t._m(7),t._v(" "),a("p",[t._v("You now are able to use the Strapi CLI. Simply create your first application and start the server:")]),t._v(" "),t._m(8),t._m(9),t._v(" "),t._m(10),a("p",[t._v("This will generate a Strapi application without:")]),t._v(" "),t._m(11),t._v(" "),a("p",[t._v("This feature allows you to only use Strapi for your HTTP server structure if you want to.")]),t._v(" "),t._m(12),t._v(" "),t._m(13),a("p",[t._v("The default home page is accessible at "),a("a",{attrs:{href:"http://localhost:1337/",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://localhost:1337/"),a("OutboundLink")],1),t._v(".")]),t._v(" "),t._m(14),t._v(" "),a("p",[t._v("The Strapi ecosystem offers you two possibilities to create a complete RESTful API.")]),t._v(" "),t._m(15),t._v(" "),t._m(16),t._m(17),t._v(" "),t._m(18),t._m(19),t._v(" "),a("p",[t._v("The Strapi Studio allows you to easily build and manage your application environment\nthanks to a powerful User Interface.")]),t._v(" "),a("p",[t._v("Log into the Strapi Studio with your user account ("),a("a",{attrs:{href:"http://studio.strapi.io",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://studio.strapi.io"),a("OutboundLink")],1),t._v(")\nand follow the instructions to start the experience.")]),t._v(" "),t._m(20),t._v(" "),t._m(21),t._v(" "),a("p",[t._v("Strapi comes with a simple but yet powerful dashboard.")]),t._v(" "),t._m(22),t._v(" "),t._m(23),t._v(" "),t._m(24),t._v(" "),t._m(25),t._v(" "),t._m(26),t._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://strapi.io/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Strapi website"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://twitter.com/strapijs",target:"_blank",rel:"noopener noreferrer"}},[t._v("Strapi news on Twitter"),a("OutboundLink")],1)])])])},[function(){var t=this.$createElement,e=this._self._c||t;return e("h1",{attrs:{id:"strapi"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#strapi","aria-hidden":"true"}},[this._v("#")]),this._v(" Strapi")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[e("strong",[this._v("DISCLAIMER")]),this._v(": "),e("em",[this._v("This version is maintained for criticals issues only")]),this._v(".")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"getting-started-in-a-minute"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#getting-started-in-a-minute","aria-hidden":"true"}},[this._v("#")]),this._v(" Getting started in a minute")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"installation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#installation","aria-hidden":"true"}},[this._v("#")]),this._v(" Installation")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[this._v("$ "),e("span",{attrs:{class:"token function"}},[this._v("npm")]),this._v(" "),e("span",{attrs:{class:"token function"}},[this._v("install")]),this._v(" strapi -g\n")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"link-to-the-strapi-studio"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#link-to-the-strapi-studio","aria-hidden":"true"}},[this._v("#")]),this._v(" Link to the Strapi Studio")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[this._v("$ strapi login\n")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"create-your-first-project"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#create-your-first-project","aria-hidden":"true"}},[this._v("#")]),this._v(" Create your first project")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[this._v("$ strapi new "),e("span",{attrs:{class:"token operator"}},[this._v("<")]),this._v("appName"),e("span",{attrs:{class:"token operator"}},[this._v(">")]),this._v("\n")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("Note that you can generate a dry application using the "),e("code",[this._v("dry")]),this._v(" option:")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[this._v("$ strapi new "),e("span",{attrs:{class:"token operator"}},[this._v("<")]),this._v("appName"),e("span",{attrs:{class:"token operator"}},[this._v(">")]),this._v(" --dry\n")])])])},function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("ul",[a("li",[t._v("the built-in "),a("code",[t._v("user")]),t._v(", "),a("code",[t._v("email")]),t._v(" and "),a("code",[t._v("upload")]),t._v(" APIs,")]),t._v(" "),a("li",[t._v("the "),a("code",[t._v("grant")]),t._v(" hook,")]),t._v(" "),a("li",[t._v("the open-source admin panel,")]),t._v(" "),a("li",[t._v("the Waterline ORM ("),a("code",[t._v("waterline")]),t._v(" and "),a("code",[t._v("blueprints")]),t._v(" hooks disabled),")]),t._v(" "),a("li",[t._v("the Strapi Studio connection ("),a("code",[t._v("studio")]),t._v(" hook disabled).")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"start-your-application"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#start-your-application","aria-hidden":"true"}},[this._v("#")]),this._v(" Start your application")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[this._v("$ "),e("span",{attrs:{class:"token function"}},[this._v("cd")]),this._v(" "),e("span",{attrs:{class:"token operator"}},[this._v("<")]),this._v("appName"),e("span",{attrs:{class:"token operator"}},[this._v(">")]),this._v("\n$ strapi start\n")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"create-your-first-api"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#create-your-first-api","aria-hidden":"true"}},[this._v("#")]),this._v(" Create your first API")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h4",{attrs:{id:"via-the-cli"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#via-the-cli","aria-hidden":"true"}},[this._v("#")]),this._v(" Via the CLI")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[this._v("$ strapi generate api "),e("span",{attrs:{class:"token operator"}},[this._v("<")]),this._v("apiName"),e("span",{attrs:{class:"token operator"}},[this._v(">")]),this._v("\n")])])])},function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("p",[t._v("For example, you can create a "),a("code",[t._v("car")]),t._v(" API with a name ("),a("code",[t._v("name")]),t._v("), year ("),a("code",[t._v("year")]),t._v(") and\nthe license plate ("),a("code",[t._v("license")]),t._v(") with:")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[this._v("$ strapi generate api car name:string year:integer license:string\n")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h4",{attrs:{id:"via-the-strapi-studio"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#via-the-strapi-studio","aria-hidden":"true"}},[this._v("#")]),this._v(" Via the Strapi Studio")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[e("img",{attrs:{src:"http://strapi.io/assets/screenshots/studio.png",alt:"Strapi Studio",title:"Strapi Studio"}}),this._v(" "),e("em",[this._v("Simply manage your APIs and relations thanks to the Strapi Studio.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"manage-your-data"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#manage-your-data","aria-hidden":"true"}},[this._v("#")]),this._v(" Manage your data")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[e("img",{attrs:{src:"http://strapi.io/assets/screenshots/create.png",alt:"Strapi Dashboard",title:"Strapi Dashboard"}}),this._v(" "),e("em",[this._v("Create, read, update and delete your data.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[e("img",{attrs:{src:"http://strapi.io/assets/screenshots/permissions.png",alt:"Strapi Dashboard",title:"Strapi Dashboard"}}),this._v(" "),e("em",[this._v("Manage user settings, login, registration, groups and permissions on the fly.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"resources"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#resources","aria-hidden":"true"}},[this._v("#")]),this._v(" Resources")])},function(){var t=this.$createElement,e=this._self._c||t;return e("ul",[e("li",[e("a",{attrs:{href:"(https://github.com/strapi/strapi/blob/master/CONTRIBUTING.md)"}},[this._v("Contributing guide")])]),this._v(" "),e("li",[e("a",{attrs:{href:"(https://github.com/strapi/strapi/blob/master/LICENSE.md)"}},[this._v("MIT License")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"links"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#links","aria-hidden":"true"}},[this._v("#")]),this._v(" Links")])}],!1,null,null,null);r.options.__file="README.md";e.default=r.exports}}]); \ No newline at end of file diff --git a/docs/.vuepress/dist/assets/js/30.5d2829b8.js b/docs/.vuepress/dist/assets/js/30.5d2829b8.js new file mode 100644 index 0000000000..17c4a7c341 --- /dev/null +++ b/docs/.vuepress/dist/assets/js/30.5d2829b8.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[30],{244:function(t,s,a){"use strict";a.r(s);var n=a(0),o=Object(n.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"content"},[a("h1",{attrs:{id:"hooks"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#hooks","aria-hidden":"true"}},[t._v("#")]),t._v(" Hooks")]),t._v(" "),a("p",[t._v("The hooks are modules that add functionality to the core. They are loaded during the server boot. For example, if your project needs to work with a SQL database, your will have to add the hook "),a("code",[t._v("strapi-hook-bookshelf")]),t._v(" to be able to connect your app with your database.")]),t._v(" "),a("p",[a("strong",[t._v("Path —")]),t._v(" "),a("code",[t._v("./hooks/documentation/lib/index.js")]),t._v(".")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{attrs:{class:"token keyword"}},[t._v("const")]),t._v(" fs "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{attrs:{class:"token function"}},[t._v("require")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'fs'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token keyword"}},[t._v("const")]),t._v(" path "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{attrs:{class:"token function"}},[t._v("require")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'path'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nmodule"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function-variable function"}},[t._v("exports")]),t._v(" "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" strapi "),a("span",{attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token keyword"}},[t._v("const")]),t._v(" hook "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\n "),a("span",{attrs:{class:"token comment"}},[t._v("/**\n * Default options\n */")]),t._v("\n\n defaults"),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n documentation"),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n path"),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'/public/documentation'")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),a("span",{attrs:{class:"token comment"}},[t._v("/**\n * Initialize the hook\n */")]),t._v("\n\n initialize"),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" cb "),a("span",{attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token keyword"}},[t._v("try")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token comment"}},[t._v("// Check if documentation folder exist.")]),t._v("\n fs"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("accessSync")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("path"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("resolve")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("process"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("cwd")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("defaults"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("documentation"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("path"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("catch")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token class-name"}},[t._v("e")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token comment"}},[t._v("// Otherwise, create the folder.")]),t._v("\n fs"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("mkdirSync")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("path"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("resolve")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("process"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("cwd")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("defaults"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("documentation"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("path"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),a("span",{attrs:{class:"token comment"}},[t._v("// This function doesn't really exist,")]),t._v("\n "),a("span",{attrs:{class:"token comment"}},[t._v("// it's just an example to tell you that you")]),t._v("\n "),a("span",{attrs:{class:"token comment"}},[t._v("// run your business logic and when it's done")]),t._v("\n "),a("span",{attrs:{class:"token comment"}},[t._v("// you just need to call the callback `cb`")]),t._v("\n "),a("span",{attrs:{class:"token function"}},[t._v("generateDocumentation")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("path"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("resolve")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("process"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("cwd")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("this")]),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("defaults"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("documentation"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("path"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("function")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("err"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("err"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token comment"}},[t._v("// Error: it will display the error to the user")]),t._v("\n "),a("span",{attrs:{class:"token comment"}},[t._v("// and the hook won't be loaded.")]),t._v("\n "),a("span",{attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{attrs:{class:"token function"}},[t._v("cb")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("err"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),a("span",{attrs:{class:"token comment"}},[t._v("// Success.")]),t._v("\n "),a("span",{attrs:{class:"token function"}},[t._v("cb")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{attrs:{class:"token keyword"}},[t._v("return")]),t._v(" hook"),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("ul",[a("li",[a("code",[t._v("defaults")]),t._v(" (object): Contains the defaults configurations. This object is merged to "),a("code",[t._v("strapi.config.hook.settings.**")]),t._v(".")]),t._v(" "),a("li",[a("code",[t._v("initialize")]),t._v(" (function): Called during the server boot. The callback "),a("code",[t._v("cb")]),t._v(" needs to be called. Otherwise, the hook won't be loaded.")])]),t._v(" "),a("p",[t._v("Every folder that follows this name pattern "),a("code",[t._v("strapi-*")]),t._v(" in your "),a("code",[t._v("./node_modules")]),t._v(" folder will be loaded as a hook. The hooks are accessible through the "),a("code",[t._v("strapi.hook")]),t._v(" variable.")]),t._v(" "),a("h2",{attrs:{id:"structure"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#structure","aria-hidden":"true"}},[t._v("#")]),t._v(" Structure")]),t._v(" "),a("p",[t._v("A hook needs to follow the structure below:")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("/hook\n└─── lib\n - index.js\n- LICENSE.md\n- package.json\n- README.md\n")])])]),a("p",[t._v("The "),a("code",[t._v("index.js")]),t._v(" is the entry point to your hook. It should look like the example above.")]),t._v(" "),a("h2",{attrs:{id:"dependencies"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#dependencies","aria-hidden":"true"}},[t._v("#")]),t._v(" Dependencies")]),t._v(" "),a("p",[t._v("It happens that a hook has a dependency to another one. For example, the "),a("code",[t._v("strapi-hook-bookshelf")]),t._v(" has a dependency to "),a("code",[t._v("strapi-hook-knex")]),t._v(". Without it, the "),a("code",[t._v("strapi-hook-bookshelf")]),t._v(" can't work correctly. It also means that the "),a("code",[t._v("strapi-hook-knex")]),t._v(" hook has to be loaded before.")]),t._v(" "),a("p",[t._v("To handle this case, you need to update the "),a("code",[t._v("package.json")]),t._v(" at the root of your hook.")]),t._v(" "),a("div",{staticClass:"language-json extra-class"},[a("pre",{pre:!0,attrs:{class:"language-json"}},[a("code",[a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token property"}},[t._v('"name"')]),a("span",{attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"strapi-hook-bookshelf"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token property"}},[t._v('"version"')]),a("span",{attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"x.x.x"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token property"}},[t._v('"description"')]),a("span",{attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v('"Bookshelf hook for the Strapi framework"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token property"}},[t._v('"dependencies"')]),a("span",{attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n ...\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token property"}},[t._v('"strapi"')]),a("span",{attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token property"}},[t._v('"dependencies"')]),a("span",{attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"strapi-hook-knex"')]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h2",{attrs:{id:"custom-hooks"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#custom-hooks","aria-hidden":"true"}},[t._v("#")]),t._v(" Custom hooks")]),t._v(" "),a("p",[t._v("The framework allows to load hooks from the project directly without having to install them from npm. It's great way to take advantage of the features of the hooks system for code that doesn't need to be shared between apps. To achieve this, you have to create a "),a("code",[t._v("./hooks")]),t._v(" folder at the root of your project and put the hooks into it.")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("/project\n└─── admin\n└─── api\n└─── config\n└─── hooks\n│ └─── strapi-documentation\n│ - index.js\n│ └─── strapi-server-side-rendering\n│ - index.js\n└─── plugins\n└─── public\n- favicon.ico\n- package.json\n- server.js\n")])])])])}],!1,null,null,null);o.options.__file="hooks.md";s.default=o.exports}}]); \ No newline at end of file diff --git a/docs/.vuepress/dist/assets/js/31.fad00a3a.js b/docs/.vuepress/dist/assets/js/31.fad00a3a.js new file mode 100644 index 0000000000..c281480e56 --- /dev/null +++ b/docs/.vuepress/dist/assets/js/31.fad00a3a.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[31],{208:function(t,s,n){"use strict";n.r(s);var a=n(0),e=Object(a.a)({},function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("div",{staticClass:"content"},[t._m(0),t._v(" "),t._m(1),t._v(" "),t._m(2),t._m(3),t._v(" "),n("p",[t._v("The global logger is configured by environment variables.")]),t._v(" "),t._m(4),t._v(" "),t._m(5),t._v(" "),t._m(6),t._v(" "),t._m(7),t._m(8),t._v(" "),n("p",[t._v("To find more details about the logger API, please refer to the "),n("a",{attrs:{href:"http://getpino.io/#/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Pino documentation"),n("OutboundLink")],1),t._v(".")])])},[function(){var t=this.$createElement,s=this._self._c||t;return s("h1",{attrs:{id:"logging"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#logging","aria-hidden":"true"}},[this._v("#")]),this._v(" Logging")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("Strapi relies on an extremely fast Node.js logger called Pino that includes a shell utility to pretty-print its log files. It provides great performances and doesn't slow down your app. The logger is accessible through the global variable "),s("code",[this._v("strapi.log")]),this._v(" or the request's context "),s("code",[this._v("ctx.log")]),this._v(" if enabled.")])},function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("div",{staticClass:"language-js extra-class"},[n("pre",{pre:!0,attrs:{class:"language-js"}},[n("code",[n("span",{attrs:{class:"token comment"}},[t._v("// Folder.js controller")]),t._v("\n"),n("span",{attrs:{class:"token keyword"}},[t._v("const")]),t._v(" fs "),n("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{attrs:{class:"token function"}},[t._v("require")]),n("span",{attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{attrs:{class:"token string"}},[t._v("'fs'")]),n("span",{attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{attrs:{class:"token keyword"}},[t._v("const")]),t._v(" path "),n("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{attrs:{class:"token function"}},[t._v("require")]),n("span",{attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{attrs:{class:"token string"}},[t._v("'path'")]),n("span",{attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nmodule"),n("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("exports "),n("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\n "),n("span",{attrs:{class:"token comment"}},[t._v("/**\n * Retrieve app's folders.\n *\n * @return {Object|Array}\n */")]),t._v("\n\n findFolders"),n("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),n("span",{attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),n("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),n("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),n("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{attrs:{class:"token keyword"}},[t._v("try")]),t._v(" "),n("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{attrs:{class:"token keyword"}},[t._v("const")]),t._v(" folders "),n("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" fs"),n("span",{attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{attrs:{class:"token function"}},[t._v("readdirSync")]),n("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("path"),n("span",{attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{attrs:{class:"token function"}},[t._v("resolve")]),n("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("process"),n("span",{attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{attrs:{class:"token function"}},[t._v("cwd")]),n("span",{attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n strapi"),n("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("log"),n("span",{attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{attrs:{class:"token function"}},[t._v("info")]),n("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("folders"),n("span",{attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),n("span",{attrs:{class:"token comment"}},[t._v("// ctx.log.info(folders);")]),t._v("\n\n ctx"),n("span",{attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{attrs:{class:"token function"}},[t._v("send")]),n("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("folders"),n("span",{attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),n("span",{attrs:{class:"token keyword"}},[t._v("catch")]),t._v(" "),n("span",{attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{attrs:{class:"token class-name"}},[t._v("error")]),n("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n strapi"),n("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("log"),n("span",{attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{attrs:{class:"token function"}},[t._v("fatal")]),n("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("error"),n("span",{attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),n("span",{attrs:{class:"token comment"}},[t._v("// ctx.log.fatal(error);")]),t._v("\n ctx"),n("span",{attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{attrs:{class:"token function"}},[t._v("badImplementation")]),n("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("error"),n("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("message"),n("span",{attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("h2",{attrs:{id:"global-logger-configuration"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#global-logger-configuration","aria-hidden":"true"}},[this._v("#")]),this._v(" Global logger configuration")])},function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("p",[n("code",[t._v("STRAPI_LOG_LEVEL")]),t._v(": Can be 'fatal', 'error', 'warn', 'info', 'debug' or 'trace'.\n"),n("code",[t._v("STRAPI_LOG_TIMESTAMP")]),t._v(": Can be true/false\n"),n("code",[t._v("STRAPI_LOG_PRETTY_PRINT")]),t._v(": Can be true/false\n"),n("code",[t._v("STRAPI_LOG_FORCE_COLOR")]),t._v(": Can be true/false")])},function(){var t=this.$createElement,s=this._self._c||t;return s("h2",{attrs:{id:"request-logging-middleware"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#request-logging-middleware","aria-hidden":"true"}},[this._v("#")]),this._v(" Request logging middleware")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("To configure the request-logger middleware, you have to edit the following file "),s("code",[this._v("./config/environments/*/request.json")]),this._v(".")])},function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("div",{staticClass:"language-json extra-class"},[n("pre",{pre:!0,attrs:{class:"language-json"}},[n("code",[n("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n ...\n "),n("span",{attrs:{class:"token property"}},[t._v('"logger"')]),n("span",{attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),n("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{attrs:{class:"token property"}},[t._v('"level"')]),n("span",{attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),n("span",{attrs:{class:"token string"}},[t._v('"debug"')]),n("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),n("span",{attrs:{class:"token property"}},[t._v('"exposeInContext"')]),n("span",{attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),n("span",{attrs:{class:"token boolean"}},[t._v("true")]),n("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),n("span",{attrs:{class:"token property"}},[t._v('"requests"')]),n("span",{attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),n("span",{attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n "),n("span",{attrs:{class:"token punctuation"}},[t._v("}")]),n("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n ...\n"),n("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])},function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("ul",[n("li",[n("code",[t._v("level")]),t._v(": defines the desired logging level (fatal, error, warn, info, debug, trace).")]),t._v(" "),n("li",[n("code",[t._v("exposeInContext")]),t._v(": allows access to the logger through the context.")]),t._v(" "),n("li",[n("code",[t._v("requests")]),t._v(": incoming HTTP requests will be logged.")])])}],!1,null,null,null);e.options.__file="logging.md";s.default=e.exports}}]); \ No newline at end of file diff --git a/docs/.vuepress/dist/assets/js/32.a6900221.js b/docs/.vuepress/dist/assets/js/32.a6900221.js new file mode 100644 index 0000000000..8297923103 --- /dev/null +++ b/docs/.vuepress/dist/assets/js/32.a6900221.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[32],{207:function(t,s,a){"use strict";a.r(s);var n=a(0),e=Object(n.a)({},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"content"},[t._m(0),t._v(" "),a("p",[t._v("The middlewares are functions which are composed and executed in a stack-like manner upon request. If you are not familiar with the middleware stack in Koa, we highly recommend you to read the "),a("a",{attrs:{href:"http://koajs.com/#introduction",target:"_blank",rel:"noopener noreferrer"}},[t._v("Koa's documentation introduction"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("p",[t._v("Enable the middleware in environments settings")]),t._v(" "),t._m(1),t._v(" "),t._m(2),a("p",[a("strong",[t._v("Path —")]),t._v(" "),a("a",{attrs:{href:"https://github.com/strapi/strapi/blob/master/packages/strapi/lib/middlewares/responseTime/index.js",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("strapi/lib/middlewares/responseTime/index.js")]),a("OutboundLink")],1),t._v(".")]),t._v(" "),t._m(3),t._m(4),t._v(" "),a("p",[t._v("The core of Strapi embraces a small list of middlewares for performances, security and great error handling.")]),t._v(" "),t._m(5),t._v(" "),t._m(6),t._v(" "),t._m(7),t._v(" "),a("p",[t._v("A middleware needs to follow the structure below:")]),t._v(" "),t._m(8),t._m(9),t._v(" "),t._m(10),t._v(" "),t._m(11),t._v(" "),t._m(12),t._m(13),t._v(" "),t._m(14),t._v(" "),t._m(15),t._v(" "),t._m(16),t._v(" "),t._m(17),t._m(18),t._v(" "),t._m(19),t._v(" "),t._m(20),t._v(" "),t._m(21),t._v(" "),t._m(22),t._m(23),t._v(" "),t._m(24),t._v(" "),t._m(25),t._v(" "),t._m(26),t._m(27),t._v(" "),t._m(28),t._v(" "),t._m(29),t._v(" "),t._m(30),t._m(31),t._v(" "),t._m(32),t._v(" "),a("p",[t._v("For this example, we are going to imagine that we have 10 middlewares to load:")]),t._v(" "),t._m(33),t._v(" "),t._m(34),t._v(" "),t._m(35),a("p",[t._v("Here is the loader order:")]),t._v(" "),t._m(36)])},[function(){var t=this.$createElement,s=this._self._c||t;return s("h1",{attrs:{id:"middlewares"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#middlewares","aria-hidden":"true"}},[this._v("#")]),this._v(" Middlewares")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[s("strong",[this._v("Path —")]),this._v(" ["),s("code",[this._v("config/environments/**")]),this._v("]")])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"language-json extra-class"},[a("pre",{pre:!0,attrs:{class:"language-json"}},[a("code",[t._v(" "),a("span",{attrs:{class:"token property"}},[t._v('"urlReader"')]),a("span",{attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token property"}},[t._v('"enabled"')]),a("span",{attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[t._v("module"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function-variable function"}},[t._v("exports")]),t._v(" "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" strapi "),a("span",{attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n initialize"),a("span",{attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token keyword"}},[t._v("function")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cb"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n strapi"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),t._v("app"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("use")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ctx"),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" next"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token keyword"}},[t._v("const")]),t._v(" start "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" Date"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("now")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),a("span",{attrs:{class:"token function"}},[t._v("next")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{attrs:{class:"token keyword"}},[t._v("const")]),t._v(" delta "),a("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" Math"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("ceil")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),t._v("Date"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token function"}},[t._v("now")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{attrs:{class:"token operator"}},[t._v("-")]),t._v(" start"),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{attrs:{class:"token comment"}},[t._v("// Set X-Response-Time header")]),t._v("\n ctx"),a("span",{attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{attrs:{class:"token keyword"}},[t._v("set")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token string"}},[t._v("'X-Response-Time'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" delta "),a("span",{attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),a("span",{attrs:{class:"token string"}},[t._v("'ms'")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{attrs:{class:"token function"}},[t._v("cb")]),a("span",{attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("ul",[s("li",[s("code",[this._v("initialize")]),this._v(" (function): Called during the server boot. The callback "),s("code",[this._v("cb")]),this._v(" needs to be called. Otherwise, the middleware won't be loaded into the stack.")])])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("ul",[a("li",[t._v("boom")]),t._v(" "),a("li",[t._v("cors")]),t._v(" "),a("li",[t._v("cron")]),t._v(" "),a("li",[t._v("csp")]),t._v(" "),a("li",[t._v("csrf")]),t._v(" "),a("li",[t._v("favicon")]),t._v(" "),a("li",[t._v("gzip")]),t._v(" "),a("li",[t._v("hsts")]),t._v(" "),a("li",[t._v("ip")]),t._v(" "),a("li",[t._v("language")]),t._v(" "),a("li",[t._v("logger")]),t._v(" "),a("li",[t._v("p3p")]),t._v(" "),a("li",[t._v("parser")]),t._v(" "),a("li",[t._v("public")]),t._v(" "),a("li",[t._v("responses")]),t._v(" "),a("li",[t._v("responseTime")]),t._v(" "),a("li",[t._v("router")]),t._v(" "),a("li",[t._v("session")]),t._v(" "),a("li",[t._v("xframe")]),t._v(" "),a("li",[t._v("xss")])])},function(){var t=this.$createElement,s=this._self._c||t;return s("div",{staticClass:"note custom-block"},[s("p",[this._v("The following middlewares cannot be disabled: responses, router, logger and boom.")])])},function(){var t=this.$createElement,s=this._self._c||t;return s("h2",{attrs:{id:"structure"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#structure","aria-hidden":"true"}},[this._v("#")]),this._v(" Structure")])},function(){var t=this.$createElement,s=this._self._c||t;return s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[this._v("/middleware\n└─── lib\n - index.js\n- LICENSE.md\n- package.json\n- README.md\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("The "),s("code",[this._v("index.js")]),this._v(" is the entry point to your middleware. It should look like the example above.")])},function(){var t=this.$createElement,s=this._self._c||t;return s("h2",{attrs:{id:"custom-middlewares"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#custom-middlewares","aria-hidden":"true"}},[this._v("#")]),this._v(" Custom middlewares")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("The framework allows the application to override the default middlewares and add new ones. You have to create a "),s("code",[this._v("./middlewares")]),this._v(" folder at the root of your project and put the middlewares into it.")])},function(){var t=this.$createElement,s=this._self._c||t;return s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[this._v("/project\n└─── admin\n└─── api\n└─── config\n└─── middlewares\n│ └─── responseTime // It will override the core default responseTime middleware\n│ - index.js\n│ └─── views // It will be added into the stack of middleware\n│ - index.js\n└─── plugins\n└─── public\n- favicon.ico\n- package.json\n- server.js\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("Every middleware will be injected into the Koa stack. To manage the load order, please refer to the "),s("a",{attrs:{href:"#load-order"}},[this._v("Middleware order section")]),this._v(".")])},function(){var t=this.$createElement,s=this._self._c||t;return s("h2",{attrs:{id:"load-order"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#load-order","aria-hidden":"true"}},[this._v("#")]),this._v(" Load order")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("The middlewares are injected into the Koa stack asynchronously. Sometimes it happens that some of these middlewares need to be loaded in a specific order. To define a load order, we created a dedicated file located in "),s("code",[this._v("./config/middleware.json")]),this._v(".")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[s("strong",[this._v("Path —")]),this._v(" "),s("code",[this._v("./config/middleware.json")]),this._v(".")])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"language-json extra-class"},[a("pre",{pre:!0,attrs:{class:"language-json"}},[a("code",[a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token property"}},[t._v('"timeout"')]),a("span",{attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token number"}},[t._v("100")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token property"}},[t._v('"load"')]),a("span",{attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token property"}},[t._v('"before"')]),a("span",{attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"responseTime"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"logger"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"cors"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"responses"')]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token property"}},[t._v('"order"')]),a("span",{attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"Define the middlewares\' load order by putting their name in this array in the right order"')]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token property"}},[t._v('"after"')]),a("span",{attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"parser"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"router"')]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("ul",[a("li",[a("code",[t._v("timeout")]),t._v(": defines the maximum allowed milliseconds to load a middleware.")]),t._v(" "),a("li",[a("code",[t._v("load")]),t._v(":\n"),a("ul",[a("li",[a("code",[t._v("before")]),t._v(": array of middlewares that need to be loaded in the first place. The order of this array matters.")]),t._v(" "),a("li",[a("code",[t._v("order")]),t._v(": array of middlewares that need to be loaded in a specific order.")]),t._v(" "),a("li",[a("code",[t._v("after")]),t._v(": array of middlewares that need to be loaded at the end of the stack. The order of this array matters.")])])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("h4",{attrs:{id:"examples"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#examples","aria-hidden":"true"}},[this._v("#")]),this._v(" Examples")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[s("strong",[this._v("Load a middleware at the very first place")])])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[s("strong",[this._v("Path —")]),this._v(" "),s("code",[this._v("./config/middleware.json")])])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"language-json extra-class"},[a("pre",{pre:!0,attrs:{class:"language-json"}},[a("code",[t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token property"}},[t._v('"timeout"')]),a("span",{attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token number"}},[t._v("100")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token property"}},[t._v('"load"')]),a("span",{attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token property"}},[t._v('"before"')]),a("span",{attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"responseTime"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"logger"')]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token property"}},[t._v('"order"')]),a("span",{attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token property"}},[t._v('"after"')]),a("span",{attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("The "),s("code",[this._v("responseTime")]),this._v(" middleware will be loaded first. Immediately followed by the "),s("code",[this._v("logger")]),this._v(" middleware. Then, the others middlewares will be loaded asynchronously.")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[s("strong",[this._v("Load a middleware after another one")])])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[s("strong",[this._v("Path —")]),this._v(" "),s("code",[this._v("./config/middleware.json")]),this._v(".")])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"language-json extra-class"},[a("pre",{pre:!0,attrs:{class:"language-json"}},[a("code",[t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token property"}},[t._v('"timeout"')]),a("span",{attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token number"}},[t._v("100")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token property"}},[t._v('"load"')]),a("span",{attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token property"}},[t._v('"before"')]),a("span",{attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token property"}},[t._v('"order"')]),a("span",{attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"p3p"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"gzip"')]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token property"}},[t._v('"after"')]),a("span",{attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("The "),s("code",[this._v("gzip")]),this._v(" middleware will be loaded after the "),s("code",[this._v("p3p")]),this._v(" middleware. All the others will be loaded asynchronously.")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[s("strong",[this._v("Load a middleware at the very end")])])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[s("strong",[this._v("Path —")]),this._v(" "),s("code",[this._v("./config/middleware.json")]),this._v(".")])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"language-json extra-class"},[a("pre",{pre:!0,attrs:{class:"language-json"}},[a("code",[t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token property"}},[t._v('"timeout"')]),a("span",{attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token number"}},[t._v("100")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token property"}},[t._v('"load"')]),a("span",{attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token property"}},[t._v('"before"')]),a("span",{attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n ...\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token property"}},[t._v('"order"')]),a("span",{attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token property"}},[t._v('"after"')]),a("span",{attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"parser"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"router"')]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("The "),s("code",[this._v("router")]),this._v(" middleware will be loaded at the very end. The "),s("code",[this._v("parser")]),this._v(" middleware will be loaded after all the others and just before the "),s("code",[this._v("router")]),this._v(" middleware.")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[s("strong",[this._v("Complete example")])])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("ul",[a("li",[t._v("cors")]),t._v(" "),a("li",[t._v("cron")]),t._v(" "),a("li",[t._v("favicon")]),t._v(" "),a("li",[t._v("gzip")]),t._v(" "),a("li",[t._v("logger")]),t._v(" "),a("li",[t._v("p3p")]),t._v(" "),a("li",[t._v("parser")]),t._v(" "),a("li",[t._v("response")]),t._v(" "),a("li",[t._v("responseTime")]),t._v(" "),a("li",[t._v("router")])])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("We assume that we set the "),s("code",[this._v("./config/middleware.json")]),this._v(" file like this:")])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"language-json extra-class"},[a("pre",{pre:!0,attrs:{class:"language-json"}},[a("code",[t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token property"}},[t._v('"timeout"')]),a("span",{attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token number"}},[t._v("100")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token property"}},[t._v('"load"')]),a("span",{attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{attrs:{class:"token property"}},[t._v('"before"')]),a("span",{attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"responseTime"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"logger"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"cors"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token property"}},[t._v('"order"')]),a("span",{attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"p3p"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"gzip"')]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token property"}},[t._v('"after"')]),a("span",{attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"parser"')]),a("span",{attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{attrs:{class:"token string"}},[t._v('"router"')]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("ol",[a("li",[t._v("responseTime (loaded at the very first place)")]),t._v(" "),a("li",[t._v("logger")]),t._v(" "),a("li",[t._v("cors")]),t._v(" "),a("li",[t._v("favicon (position order not guarantee)")]),t._v(" "),a("li",[t._v("p3p")]),t._v(" "),a("li",[t._v("cron")]),t._v(" "),a("li",[t._v("gzip (loaded after the p3p middlewares)")]),t._v(" "),a("li",[t._v("response (position order not guarantee)")]),t._v(" "),a("li",[t._v("parser")]),t._v(" "),a("li",[t._v("router (loaded at the very end place)")])])}],!1,null,null,null);e.options.__file="middlewares.md";s.default=e.exports}}]); \ No newline at end of file diff --git a/docs/.vuepress/dist/assets/js/33.bbfb3084.js b/docs/.vuepress/dist/assets/js/33.bbfb3084.js new file mode 100644 index 0000000000..dca0213a57 --- /dev/null +++ b/docs/.vuepress/dist/assets/js/33.bbfb3084.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[33],{206:function(e,t,i){"use strict";i.r(t);var a=i(0),n=Object(a.a)({},function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",{staticClass:"content"},[e._m(0),e._v(" "),i("p",[e._v("In order to improve the product and understand how the community is using it, we are collecting non-sensitive data.")]),e._v(" "),e._m(1),e._v(" "),i("p",[e._v("Here is the list of the collected data and why we need them.")]),e._v(" "),e._m(2),e._v(" "),i("p",[e._v("We are not collecting sensitive data such as databases configurations, environment or custom variables. The data are encrypted and anonymised.")]),e._v(" "),i("div",{staticClass:"warning custom-block"},[i("p",{staticClass:"custom-block-title"},[e._v("GDPR")]),e._v(" "),i("p",[e._v("The collected data are non-sensitive or personal data. We are compliant with the European recommendations (see our "),i("a",{attrs:{href:"https://strapi.io/privacy",target:"_blank",rel:"noopener noreferrer"}},[e._v("Privacy Policy"),i("OutboundLink")],1),e._v(").")])]),e._v(" "),e._m(3),e._v(" "),e._m(4)])},[function(){var e=this.$createElement,t=this._self._c||e;return t("h1",{attrs:{id:"usage-tracking"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#usage-tracking","aria-hidden":"true"}},[this._v("#")]),this._v(" Usage tracking")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"collected-data"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#collected-data","aria-hidden":"true"}},[this._v("#")]),this._v(" Collected data")])},function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("ul",[i("li",[i("strong",[e._v("UUID")]),e._v(" "),i("em",[e._v("Identify the app with a unique identifier.")])]),e._v(" "),i("li",[i("strong",[e._v("Model names and attributes names")]),e._v(" "),i("em",[e._v("Understand what kind of APIs are built with Strapi (content or product or service?)")])]),e._v(" "),i("li",[i("strong",[e._v("Environment state (development, staging, production)")]),e._v(" "),i("em",[e._v("Understand how the developers are using the different configurations? How many projects are started in production mode?")])]),e._v(" "),i("li",[i("strong",[e._v("Node modules names")]),e._v(" "),i("em",[e._v("Are developers integrating Strapi with Stripe? It means that we should develop a plugin to simplify the development process with Stripe.\nAre developers using Strapi with strapi-hook-bookshelf or strapi-hook-mongoose? It helps us prioritize the issues.")])]),e._v(" "),i("li",[i("strong",[e._v("OS")]),e._v(" "),i("em",[e._v("Is the community using Windows, Linux or Mac? It helps us prioritize the issues.")])]),e._v(" "),i("li",[i("strong",[e._v("Build configurations")]),e._v(" "),i("em",[e._v("How many people are deploying the admin on another server?")])])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"disable"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#disable","aria-hidden":"true"}},[this._v("#")]),this._v(" Disable")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("You can disable the tracking by removing the "),t("code",[this._v("uuid")]),this._v(" property in the "),t("code",[this._v("package.json")]),this._v(" file at the root of your project.")])}],!1,null,null,null);n.options.__file="usage-tracking.md";t.default=n.exports}}]); \ No newline at end of file diff --git a/docs/.vuepress/dist/assets/js/34.0eb2f8aa.js b/docs/.vuepress/dist/assets/js/34.0eb2f8aa.js new file mode 100644 index 0000000000..dfdf74f875 --- /dev/null +++ b/docs/.vuepress/dist/assets/js/34.0eb2f8aa.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[34],{205:function(t,e,r){"use strict";r.r(e);var s=r(0),a=Object(s.a)({},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("div",{staticClass:"content"},[t._m(0),t._v(" "),t._m(1),t._v(" "),t._m(2),t._v(" "),t._m(3),t._v(" "),t._m(4),t._v(" "),r("p",[t._v("Returns the Koa instance.")]),t._v(" "),t._m(5),t._v(" "),t._m(6),t._v(" "),t._m(7),t._v(" "),t._m(8),t._v(" "),t._m(9),t._v(" "),t._m(10),t._v(" "),t._m(11),t._v(" "),t._m(12),t._v(" "),t._m(13),t._v(" "),t._m(14),t._v(" "),t._m(15),t._v(" "),t._m(16),t._v(" "),t._m(17),t._v(" "),t._m(18),t._v(" "),t._m(19),t._v(" "),r("p",[t._v("Returns the Logger (Pino) instance.")]),t._v(" "),t._m(20),t._v(" "),t._m(21),t._v(" "),t._m(22),t._v(" "),t._m(23),t._v(" "),t._m(24),t._v(" "),t._m(25),t._v(" "),t._m(26),t._v(" "),r("p",[t._v("Returns a function that will returns the available queries for this model. This feature is only available inside the plugin's files (controllers, services, custom functions). For more details, see the [ORM queries section](../plugin-development/backend-development.md#ORM queries).")]),t._v(" "),t._m(27),t._v(" "),r("p",[t._v("Returns a function that reloads the entire app (with downtime).")]),t._v(" "),t._m(28),t._v(" "),r("p",[t._v("Returns the Router (Joi router) instance.")]),t._v(" "),t._m(29),t._v(" "),r("p",[t._v("Returns the "),r("a",{attrs:{href:"https://nodejs.org/api/http.html#http_class_http_server",target:"_blank",rel:"noopener noreferrer"}},[r("code",[t._v("http.Server")]),r("OutboundLink")],1),t._v(" instance.")]),t._v(" "),t._m(30),t._v(" "),t._m(31),t._v(" "),t._m(32),t._v(" "),r("p",[t._v("Returns a function that loads the configurations, middlewares and hooks. Then, it executes the bootstrap file, freezes the global variable and listens the configured port.")]),t._v(" "),t._m(33),t._v(" "),r("p",[t._v("Returns a function that shuts down the server and destroys the current connections.")]),t._v(" "),t._m(34),t._v(" "),r("p",[t._v("Returns a set of utils.")])])},[function(){var t=this.$createElement,e=this._self._c||t;return e("h1",{attrs:{id:"api-reference"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#api-reference","aria-hidden":"true"}},[this._v("#")]),this._v(" API Reference")])},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("ul",[r("li",[t._v("strapi\n"),r("ul",[r("li",[r("a",{attrs:{href:"#strapiadmin"}},[t._v(".admin")])]),t._v(" "),r("li",[r("a",{attrs:{href:"#strapiapp"}},[t._v(".app")])]),t._v(" "),r("li",[r("a",{attrs:{href:"#strapibootstrap"}},[t._v(".bootstrap()")])]),t._v(" "),r("li",[r("a",{attrs:{href:"#strapiconfig"}},[t._v(".config")])]),t._v(" "),r("li",[r("a",{attrs:{href:"#strapicontrollers"}},[t._v(".controllers")])]),t._v(" "),r("li",[r("a",{attrs:{href:"#strapihook"}},[t._v(".hook")])]),t._v(" "),r("li",[r("a",{attrs:{href:"#strapikoaMiddlewares"}},[t._v(".koaMiddlewares")])]),t._v(" "),r("li",[r("a",{attrs:{href:"#strapiload"}},[t._v(".load()")])]),t._v(" "),r("li",[r("a",{attrs:{href:"#strapilog"}},[t._v(".log")])]),t._v(" "),r("li",[r("a",{attrs:{href:"#strapimiddleware"}},[t._v(".middleware")])]),t._v(" "),r("li",[r("a",{attrs:{href:"#strapimodels"}},[t._v(".models")])]),t._v(" "),r("li",[r("a",{attrs:{href:"#strapiplugins"}},[t._v(".plugins")])]),t._v(" "),r("li",[r("a",{attrs:{href:"#strapiquery"}},[t._v(".query()")])]),t._v(" "),r("li",[r("a",{attrs:{href:"#strapireload"}},[t._v(".reload()")])]),t._v(" "),r("li",[r("a",{attrs:{href:"#strapirouter"}},[t._v(".router")])]),t._v(" "),r("li",[r("a",{attrs:{href:"#strapiserver"}},[t._v(".server")])]),t._v(" "),r("li",[r("a",{attrs:{href:"#strapiservices"}},[t._v(".services")])]),t._v(" "),r("li",[r("a",{attrs:{href:"#strapistart"}},[t._v(".start()")])]),t._v(" "),r("li",[r("a",{attrs:{href:"#strapistop"}},[t._v(".stop()")])]),t._v(" "),r("li",[r("a",{attrs:{href:"#strapiutils"}},[t._v(".utils")])])])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"strapi-admin"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#strapi-admin","aria-hidden":"true"}},[this._v("#")]),this._v(" strapi.admin")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("This object contains the controllers, models, services and configurations contained in the "),e("code",[this._v("./admin")]),this._v(" folder.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"strapi-app"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#strapi-app","aria-hidden":"true"}},[this._v("#")]),this._v(" strapi.app")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"strapi-bootstrap"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#strapi-bootstrap","aria-hidden":"true"}},[this._v("#")]),this._v(" strapi.bootstrap")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("Returns a "),e("code",[this._v("Promise")]),this._v(". When resolved, it means that the "),e("code",[this._v("./config/functions/bootstrap.js")]),this._v(" has been executed. Otherwise, it throws an error.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"note custom-block"},[e("p",[this._v("You can also access to the bootstrap function through "),e("code",[this._v("strapi.config.functions.boostrap")]),this._v(".")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"strapi-config"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#strapi-config","aria-hidden":"true"}},[this._v("#")]),this._v(" strapi.config")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("Returns an object that represents the configurations of the project. Every JavaScript or JSON file located in the "),e("code",[this._v("./config")]),this._v(" folder will be parsed into the "),e("code",[this._v("strapi.config")]),this._v(" object.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"strapi-controllers"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#strapi-controllers","aria-hidden":"true"}},[this._v("#")]),this._v(" strapi.controllers")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("Returns an object of the controllers wich is available in the project. Every JavaScript file located in the "),e("code",[this._v("./api/**/controllers")]),this._v(" folder will be parsed into the "),e("code",[this._v("strapi.controllers")]),this._v(" object. Thanks to this object, you can access to every controller's actions everywhere in the project.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"note custom-block"},[e("p",[this._v("This object doesn't include the admin's controllers and plugin's controllers.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"strapi-hook"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#strapi-hook","aria-hidden":"true"}},[this._v("#")]),this._v(" strapi.hook")])},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("p",[t._v("Returns an object of the hooks available in the project. Every folder that follows this pattern "),r("code",[t._v("strapi-*")]),t._v(" and located in the "),r("code",[t._v("./node_modules")]),t._v(" or "),r("code",[t._v("/hooks")]),t._v(" folder will be mounted into the "),r("code",[t._v("strapi.hook")]),t._v(" object.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"strapi-koamiddlewares"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#strapi-koamiddlewares","aria-hidden":"true"}},[this._v("#")]),this._v(" strapi.koaMiddlewares")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("Returns an object of the Koa middlewares found in the "),e("code",[this._v("./node_modules")]),this._v(" folder of the project. This reference is very useful for the Strapi's core.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"strapi-load"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#strapi-load","aria-hidden":"true"}},[this._v("#")]),this._v(" strapi.load")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("Returns a function that parses the configurations, hooks, middlewares and APIs of your app. It also loads the middlewares and hooks with the previously loaded configurations. This method could be useful to update references available through the "),e("code",[this._v("strapi")]),this._v(" global variable without having to restart the server. However, without restarting the server, the new configurations will not be taken in account.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"strapi-log"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#strapi-log","aria-hidden":"true"}},[this._v("#")]),this._v(" strapi.log")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"strapi-middleware"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#strapi-middleware","aria-hidden":"true"}},[this._v("#")]),this._v(" strapi.middleware")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("Returns an object of the middlewares available in the project. Every folder in the "),e("code",[this._v("./middlewares")]),this._v(" folder will be also mounted into the "),e("code",[this._v("strapi.middleware")]),this._v(" object.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"strapi-models"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#strapi-models","aria-hidden":"true"}},[this._v("#")]),this._v(" strapi.models")])},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("p",[t._v("Returns an object of models available in the project. Every JavaScript or JSON file located in the "),r("code",[t._v("./api/**/models")]),t._v(" folders will be parsed into the "),r("code",[t._v("strapi.models")]),t._v(" object. Also every "),r("code",[t._v("strapi.models.**")]),t._v(" object is merged with the model's instance returned by the ORM (Mongoose, Bookshelf). It allows to call the ORM methods through the "),r("code",[t._v("strapi.models.**")]),t._v(" object (ex: "),r("code",[t._v("strapi.models.users.find()")]),t._v(").")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"strapi-plugins"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#strapi-plugins","aria-hidden":"true"}},[this._v("#")]),this._v(" strapi.plugins")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("Returns an object of plugins available in the project. Each plugin object contains the associated controllers, models, services and configurations contained in the "),e("code",[this._v("./plugins/**/")]),this._v(" folder.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"strapi-query"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#strapi-query","aria-hidden":"true"}},[this._v("#")]),this._v(" strapi.query")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"strapi-reload"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#strapi-reload","aria-hidden":"true"}},[this._v("#")]),this._v(" strapi.reload")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"strapi-router"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#strapi-router","aria-hidden":"true"}},[this._v("#")]),this._v(" strapi.router")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"strapi-server"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#strapi-server","aria-hidden":"true"}},[this._v("#")]),this._v(" strapi.server")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"strapi-services"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#strapi-services","aria-hidden":"true"}},[this._v("#")]),this._v(" strapi.services")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("Returns an object of services available in the project. Every JavaScript file located in the "),e("code",[this._v("./api/**/services")]),this._v(" folders will be parsed into the "),e("code",[this._v("strapi.services")]),this._v(" object.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"strapi-start"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#strapi-start","aria-hidden":"true"}},[this._v("#")]),this._v(" strapi.start")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"strapi-stop"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#strapi-stop","aria-hidden":"true"}},[this._v("#")]),this._v(" strapi.stop")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"strapi-utils"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#strapi-utils","aria-hidden":"true"}},[this._v("#")]),this._v(" strapi.utils")])}],!1,null,null,null);a.options.__file="reference.md";e.default=a.exports}}]); \ No newline at end of file diff --git a/docs/.vuepress/dist/assets/js/35.76c29241.js b/docs/.vuepress/dist/assets/js/35.76c29241.js new file mode 100644 index 0000000000..c383101a55 --- /dev/null +++ b/docs/.vuepress/dist/assets/js/35.76c29241.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[35],{204:function(e,t,a){"use strict";a.r(t);var s=a(0),r=Object(s.a)({},function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("div",{staticClass:"content"},[e._m(0),e._v(" "),a("p",[e._v("Strapi comes with a full featured Command Line Interface (CLI) which lets you scaffold and manage your project in seconds.")]),e._v(" "),a("hr"),e._v(" "),e._m(1),e._v(" "),a("p",[e._v("Create a new project")]),e._v(" "),e._m(2),a("ul",[e._m(3),e._v(" "),e._m(4),e._v(" "),a("li",[e._m(5),e._v(" "),a("p",[e._v("See the "),a("a",{attrs:{href:"https://github.com/strapi/strapi/blob/master/CONTRIBUTING.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("CONTRIBUTING guide"),a("OutboundLink")],1),e._v(" for more details.")])])]),e._v(" "),a("hr"),e._v(" "),e._m(6),e._v(" "),a("p",[e._v("Scaffold a complete API with its configurations, controller, model and service.")]),e._v(" "),e._m(7),e._m(8),e._v(" "),e._m(9),e._v(" "),e._m(10),e._v(" "),a("p",[e._v("Create a new controller")]),e._v(" "),e._m(11),e._m(12),e._v(" "),e._m(13),e._v(" "),e._m(14),e._v(" "),a("p",[e._v("Create a new model")]),e._v(" "),e._m(15),e._m(16),e._v(" "),e._m(17),e._v(" "),e._m(18),e._v(" "),a("p",[e._v("Create a new service")]),e._v(" "),e._m(19),e._m(20),e._v(" "),e._m(21),e._v(" "),e._m(22),e._v(" "),a("p",[e._v("Create a new policy")]),e._v(" "),e._m(23),e._m(24),e._v(" "),e._m(25),e._v(" "),a("p",[e._v("Create a new plugin skeleton.")]),e._v(" "),e._m(26),e._m(27),e._v(" "),a("p",[e._v("Please refer to the "),a("router-link",{attrs:{to:"./../plugin-development/quick-start.html"}},[e._v("plugin develoment documentation")]),e._v(" to know more.")],1),e._v(" "),a("hr"),e._v(" "),e._m(28),e._v(" "),a("p",[e._v("Install a plugin in the project.")]),e._v(" "),e._m(29),e._m(30),e._v(" "),a("blockquote",[a("p",[e._v("Checkout the "),a("a",{attrs:{href:"https://github.com/strapi/strapi/blob/master/CONTRIBUTING.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("CONTRIBUTING guide"),a("OutboundLink")],1),e._v(" for more details about the local Strapi development workflow.")])]),e._v(" "),e._m(31),e._v(" "),a("p",[e._v("Please refer to the "),a("router-link",{attrs:{to:"./../plugin-development/quick-start.html"}},[e._v("plugins documentation")]),e._v(" to know more.")],1),e._v(" "),a("hr"),e._v(" "),e._m(32),e._v(" "),a("p",[e._v("Uninstall a plugin from the project.")]),e._v(" "),e._m(33),e._m(34),e._v(" "),a("p",[e._v("Please refer to the "),a("router-link",{attrs:{to:"./../plugin-development/quick-start.html"}},[e._v("plugins documentation")]),e._v(" to know more.")],1),e._v(" "),a("hr"),e._v(" "),e._m(35),e._v(" "),a("p",[e._v("Print the current globally installed Strapi version.")]),e._v(" "),e._m(36),a("hr"),e._v(" "),e._m(37),e._v(" "),a("p",[e._v("List CLI commands.")]),e._v(" "),e._m(38)])},[function(){var e=this.$createElement,t=this._self._c||e;return t("h1",{attrs:{id:"command-line-interface-cli"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#command-line-interface-cli","aria-hidden":"true"}},[this._v("#")]),this._v(" Command Line Interface (CLI)")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"strapi-new"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#strapi-new","aria-hidden":"true"}},[this._v("#")]),this._v(" strapi new")])},function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("strapi new "),a("span",{attrs:{class:"token operator"}},[e._v("<")]),e._v("name"),a("span",{attrs:{class:"token operator"}},[e._v(">")]),e._v("\n\noptions: "),a("span",{attrs:{class:"token punctuation"}},[e._v("[")]),e._v("--dev"),a("span",{attrs:{class:"token operator"}},[e._v("|")]),e._v("--dbclient"),a("span",{attrs:{class:"token operator"}},[e._v("=")]),a("span",{attrs:{class:"token operator"}},[e._v("<")]),e._v("dbclient"),a("span",{attrs:{class:"token operator"}},[e._v(">")]),e._v(" --dbhost"),a("span",{attrs:{class:"token operator"}},[e._v("=")]),a("span",{attrs:{class:"token operator"}},[e._v("<")]),e._v("dbhost"),a("span",{attrs:{class:"token operator"}},[e._v(">")]),e._v(" --dbport"),a("span",{attrs:{class:"token operator"}},[e._v("=")]),a("span",{attrs:{class:"token operator"}},[e._v("<")]),e._v("dbport"),a("span",{attrs:{class:"token operator"}},[e._v(">")]),e._v(" --dbname"),a("span",{attrs:{class:"token operator"}},[e._v("=")]),a("span",{attrs:{class:"token operator"}},[e._v("<")]),e._v("dbname"),a("span",{attrs:{class:"token operator"}},[e._v(">")]),e._v(" --dbusername"),a("span",{attrs:{class:"token operator"}},[e._v("=")]),a("span",{attrs:{class:"token operator"}},[e._v("<")]),e._v("dbusername"),a("span",{attrs:{class:"token operator"}},[e._v(">")]),e._v(" --dbpassword"),a("span",{attrs:{class:"token operator"}},[e._v("=")]),a("span",{attrs:{class:"token operator"}},[e._v("<")]),e._v("dbpassword"),a("span",{attrs:{class:"token operator"}},[e._v(">")]),e._v(" --dbssl"),a("span",{attrs:{class:"token operator"}},[e._v("=")]),a("span",{attrs:{class:"token operator"}},[e._v("<")]),e._v("dbssl"),a("span",{attrs:{class:"token operator"}},[e._v(">")]),e._v(" --dbauth"),a("span",{attrs:{class:"token operator"}},[e._v("=")]),a("span",{attrs:{class:"token operator"}},[e._v("<")]),e._v("dbauth"),a("span",{attrs:{class:"token operator"}},[e._v(">")]),a("span",{attrs:{class:"token punctuation"}},[e._v("]")]),e._v("\n")])])])},function(){var e=this.$createElement,t=this._self._c||e;return t("li",[t("p",[t("strong",[this._v("strapi new ")]),t("br"),this._v("\nGenerates a new project called "),t("strong",[this._v("")]),this._v(" and installs the default plugins through the npm registry.")])])},function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("li",[a("p",[a("strong",[e._v("strapi new --dev")]),a("br"),e._v("\nGenerates a new project called "),a("strong",[e._v("")]),e._v(" and creates symlinks for the "),a("code",[e._v("./admin")]),e._v(" folder and each plugin inside the "),a("code",[e._v("./plugin")]),e._v(" folder. It means that the Strapi's development workflow has been set up on the machine earlier.")])])},function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("p",[a("strong",[e._v("strapi new --dbclient= --dbhost= --dbport= --dbname= --dbusername= --dbpassword= --dbssl= --dbauth=")]),a("br"),e._v("\nGenerates a new project called "),a("strong",[e._v("")]),e._v(" and skip the interactive database configuration and initilize with these options. "),a("strong",[e._v("")]),e._v(" can be "),a("code",[e._v("mongo")]),e._v(", "),a("code",[e._v("postgres")]),e._v(", "),a("code",[e._v("mysql")]),e._v(", "),a("code",[e._v("sqlite3")]),e._v(" or "),a("code",[e._v("redis")]),e._v(". "),a("strong",[e._v("")]),e._v(" and "),a("strong",[e._v("")]),e._v(" are optional.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"strapi-generate-api"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#strapi-generate-api","aria-hidden":"true"}},[this._v("#")]),this._v(" strapi generate:api")])},function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("strapi generate:api "),a("span",{attrs:{class:"token operator"}},[e._v("<")]),e._v("name"),a("span",{attrs:{class:"token operator"}},[e._v(">")]),e._v(" "),a("span",{attrs:{class:"token punctuation"}},[e._v("[")]),a("span",{attrs:{class:"token operator"}},[e._v("<")]),e._v("attribute:type"),a("span",{attrs:{class:"token operator"}},[e._v(">")]),a("span",{attrs:{class:"token punctuation"}},[e._v("]")]),e._v("\n\noptions: "),a("span",{attrs:{class:"token punctuation"}},[e._v("[")]),e._v("--tpl "),a("span",{attrs:{class:"token operator"}},[e._v("<")]),e._v("name"),a("span",{attrs:{class:"token operator"}},[e._v(">")]),a("span",{attrs:{class:"token operator"}},[e._v("|")]),e._v("--plugin "),a("span",{attrs:{class:"token operator"}},[e._v("<")]),e._v("name"),a("span",{attrs:{class:"token operator"}},[e._v(">")]),a("span",{attrs:{class:"token punctuation"}},[e._v("]")]),e._v("\n")])])])},function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("ul",[a("li",[a("p",[a("strong",[e._v("strapi generate:api ")]),a("br"),e._v("\nGenerates an API called "),a("strong",[e._v("")]),e._v(" in the "),a("code",[e._v("./api")]),e._v(" folder at the root of your project.")])]),e._v(" "),a("li",[a("p",[a("strong",[e._v("strapi generate:api ")]),a("br"),e._v("\nGenerates an API called "),a("strong",[e._v("")]),e._v(" in the "),a("code",[e._v("./api")]),e._v(" folder at the root of your project. The model will already contain an attribute called "),a("strong",[e._v("")]),e._v(" with the type property set to "),a("strong",[e._v("")]),e._v(".")]),e._v(" "),a("p",[e._v("Example: "),a("code",[e._v("strapi generate:api product name:string description:text price:integer")])])]),e._v(" "),a("li",[a("p",[a("strong",[e._v("strapi generate:api --plugin ")]),a("br"),e._v("\nGenerates an API called "),a("strong",[e._v("")]),e._v(" in the "),a("code",[e._v("./plugins/")]),e._v(" folder.")]),e._v(" "),a("p",[e._v("Example: "),a("code",[e._v("strapi generate:api product --plugin content-manager")])])]),e._v(" "),a("li",[a("p",[a("strong",[e._v("strapi generate:api --tpl

>oK^oh%a%pl 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