diff --git a/README.md b/README.md index 63877d3e468..edc11c888f8 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,30 @@ You can build your own or choose from the community released ones: You can try a Volto online demo at [https://demo.plone.org/](https://demo.plone.org/). +## Monorepo structure + +Since version 18.0.0-alpha4, the Volto core repository has had the shape of a monorepo, where "mono" means "single" and "repo" is short for "repository". +This means that several apps and libraries related to each other are stored in the same repository. +They are managed together but released individually. +This allows the code to be shared effectively, and unifies tracking of changes across all of the apps and libraries. + +| Package | Location | +|---|---| +| [`@plone/client`](https://www.npmjs.com/package/@plone/client) | [`packages/client`](https://github.com/plone/volto/tree/main/packages/client#readme) | +| [`@plone/components`](https://www.npmjs.com/package/@plone/components) | [`packages/components`](https://github.com/plone/volto/tree/main/packages/components#readme) | +| [`@plone/generator-volto`](https://www.npmjs.com/package/@plone/generator-volto) | [`packages/generator-volto`](https://github.com/plone/volto/tree/main/packages/generator-volto#readme) | +| [`@plone/helpers`](https://www.npmjs.com/package/@plone/helpers) | [`packages/helpers`](https://github.com/plone/volto/tree/main/packages/helpers#readme) | +| [`@plone/providers`](https://www.npmjs.com/package/@plone/providers) | [`packages/providers`](https://github.com/plone/volto/tree/main/packages/providers#readme) | +| [`@plone/registry`](https://www.npmjs.com/package/@plone/registry) | [`packages/registry`](https://github.com/plone/volto/tree/main/packages/registry#readme) | +| [`@plone/scripts`](https://www.npmjs.com/package/@plone/scripts) | [`packages/scripts`](https://github.com/plone/volto/tree/main/packages/scripts#readme) | +| [`@plone/types`](https://www.npmjs.com/package/@plone/types) | [`packages/types`](https://github.com/plone/volto/tree/main/packages/types#readme) | +| none | [`packages/volto-guillotina`](https://github.com/plone/volto/tree/main/packages/volto-guillotina) | +| [`@plone/volto-slate`](https://www.npmjs.com/package/@plone/volto-slate) | [`packages/volto-slate`](https://github.com/plone/volto/tree/main/packages/volto-slate#readme) | +| [`@plone/volto-testing`](https://www.npmjs.com/package/@plone/volto-testing) | [`packages/volto-testing`](https://github.com/plone/volto/tree/main/packages/volto-testing) | + +See also [Monorepo structure](https://6.docs.plone.org/volto/contributing/developing-core.html#monorepo-structure). + + ## Create a Volto project To start a new project using Volto, follow the [Plone installation documentation](https://6.docs.plone.org/install/create-project.html). @@ -118,12 +142,12 @@ To ensure your website gets the greatest exposure, add it both to [Awesome Volto - [Debako Udala / Ayuntamiento de Deba](https://www.deba.eus/eu) (Website of the municipality of Deba, developed by [CodeSyntax](https://www.codesyntax.com/en), 2022) - [European Environment Agency](https://www.eea.europa.eu/en) (Website of the European Environment Agency. Developed by [Eau de Web](https://eaudeweb.ro), 2023) - [Energy Climate Union portal for Europe](https://climate-energy.eea.europa.eu/) (Thematic website focusing on European strides towards mitigating climate change, developed by [Eau de Web](https://eaudeweb.ro/), 2020) -- [Excellence at Humboldt-Universität zu Berlin](https://www.alles-beginnt-mit-einer-frage.de) (Website for the excellence initiative of the [Humboldt University Berlin](https://www.hu-berlin.de/de), developed by [kitconcept GmbH](https://kitconcept.com), 2019) +- [Excellence at Humboldt-Universität zu Berlin](https://www.alles-beginnt-mit-einer-frage.de) (Website for the excellence initiative of the [Humboldt University Berlin](https://www.hu-berlin.de/de), developed by [kitconcept GmbH](https://kitconcept.com/en), 2019) - [Forest Information System for Europe](https://forest.eea.europa.eu) (Thematic website focusing on European forests, developed by [Eau de Web](https://eaudeweb.ro/), 2019) -- [Forschungszentrum Jülich](https://www.fz-juelich.de/de) (Website for Forschungzentrum Jülich, which is one of the largest research institutions in Europe, developed by [kitconcept GmbH](https://kitconcept.com), 2022) -- [German Aerospace Center (DLR)](https://www.dlr.de/de) (The German Aerospace Center (DLR) is the Federal Republic of Germany's research center for aeronautics. With more than 10.000 employees and a yearly budget of more than 1 billion euros, it is one of the largest research institutions in Germany, developed by [kitconcept GmbH](https://kitconcept.com), 2023) -- [Helmholtz-Institut Erlangen-Nürnberg für Erneuerbare Energien (HI-ERN)](https://www.hi-ern.de/de) (Website for HI ERN, a research institution for renewable energies, developed by [kitconcept GmbH](https://kitconcept.com), 2022) -- [Humboldt Labor](https://www.humboldtforum.org/de/programm/dauerangebot/ausstellung/nach-der-natur-14144/) (The Humboldt Lab is a website where the Humboldt University Berlin presents its latest research projects and findings. Developed by [WLDX](https://wldx.de/) and [kitconcept GmbH](https://kitconcept.com), 2020) +- [Forschungszentrum Jülich](https://www.fz-juelich.de/de) (Website for Forschungzentrum Jülich, which is one of the largest research institutions in Europe, developed by [kitconcept GmbH](https://kitconcept.com/en), 2022) +- [German Aerospace Center (DLR)](https://www.dlr.de/de) (The German Aerospace Center (DLR) is the Federal Republic of Germany's research center for aeronautics. With more than 10.000 employees and a yearly budget of more than 1 billion euros, it is one of the largest research institutions in Germany, developed by [kitconcept GmbH](https://kitconcept.com/en), 2023) +- [Helmholtz-Institut Erlangen-Nürnberg für Erneuerbare Energien (HI-ERN)](https://www.hi-ern.de/de) (Website for HI ERN, a research institution for renewable energies, developed by [kitconcept GmbH](https://kitconcept.com/en), 2022) +- [Humboldt Labor](https://www.humboldtforum.org/de/programm/dauerangebot/ausstellung/nach-der-natur-14144/) (The Humboldt Lab is a website where the Humboldt University Berlin presents its latest research projects and findings. Developed by [WLDX](https://wldx.de/) and [kitconcept GmbH](https://kitconcept.com/en), 2020) - [ILPO](https://ilpo.jyu.fi/) (the registration portal of continuous learning at the University of Jyväskylä. Developed by University of Jyväskylä, 2022) - [Industrial Emissions portal for Europe](https://industry.eea.europa.eu) (Thematic website focusing on European industrial emissions, developed by [Eau de Web](https://eaudeweb.ro/), 2020) - [Jobfamilie MEDICE](https://jobfamilie.medice.de/de) (Carrer website for MEDICE Arzneimittel Pütter GmbH & Co. KG), developed by [Werkbank GmbH](https://werkbank.de/), 2020) @@ -135,13 +159,13 @@ To ensure your website gets the greatest exposure, add it both to [Awesome Volto - [ResOU](https://resou.osaka-u.ac.jp/ja) (ResOU is introducing official researched releases by the University of Osaka, Japan. Developed by [CMScom](https://www.cmscom.jp), 2020) - [Stradanove](https://www.stradanove.it/) (Website of the Department of Youth Policies of the Municipality of Modena, developed by [RedTurtle](https://www.redturtle.it), 2020) - [Study guide at University of Jyväskylä](https://studyguide.jyu.fi/2020/en/) (Static website where [Volto is used as a headless CMS for authoring additional content](https://tech.blog.jyu.fi/2020/06/plone-volto-hasura-gatsbyjs-mashup/), 2020) -- [Talke Carrer Website](https://karriere.talke.com/) (Carrer website for [Talke](https://www.talke.com), one of the leading a chemical and petrochemical logistics companies in Germany, developed by [kitconcept GmbH](https://kitconcept.com), 2020) +- [Talke Carrer Website](https://karriere.talke.com/) (Carrer website for [Talke](https://www.talke.com), one of the leading a chemical and petrochemical logistics companies in Germany, developed by [kitconcept GmbH](https://kitconcept.com/en), 2020) - [UEU](https://www.ueu.eus) (Website for Udako Euskal Unibertsitatea, a non-profit University offering all its service only in Basque: courses, publications, ... developed by [CodeSyntax](https://www.codesyntax.com/en), 2023) - [Unione dei Comuni della Val Bisenzio](https://www.bisenzio.it/) (Website of the Municipality union of Val Bisenzio. Developed by [RedTurtle](https://www.redturtle.it), 2021) -- [VHS Ehrenamtsportal](https://vhs-ehrenamtsportal.de) (Website to help volunteers that help refugees for the [German Adult Education Association](https://www.volkshochschule.de/), developed by [kitconcept GmbH](https://kitconcept.com), 2018) +- [VHS Ehrenamtsportal](https://vhs-ehrenamtsportal.de) (Website to help volunteers that help refugees for the [German Adult Education Association](https://www.volkshochschule.de/), developed by [kitconcept GmbH](https://kitconcept.com/en), 2018) - [VisitModena](https://www.visitmodena.it/it) (Tourist website of the Municipality of Modena, developed by [RedTurtle](https://www.redturtle.it), 2020) - [WISE-Freshwater](https://water.europa.eu/freshwater) (WISE-Freshwater, the Freshwater Information System for Europe. Developed by [Eau de web](https://eaudeweb.ro) for the European Environmental Agency, 2021) -- [Zeelandia](https://www.zeelandia.de/) (Corporate website for one of the leading bakery ingredients manufacturers in Germany, developed by [kitconcept GmbH](https://kitconcept.com), 2019) +- [Zeelandia](https://www.zeelandia.de/) (Corporate website for one of the leading bakery ingredients manufacturers in Germany, developed by [kitconcept GmbH](https://kitconcept.com/en), 2019) ### Open-source websites built with Volto diff --git a/docs/source/_static/add-document.svg b/docs/source/_static/add-document.svg new file mode 100644 index 00000000000..29594b298e6 --- /dev/null +++ b/docs/source/_static/add-document.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/docs/source/_static/pen.svg b/docs/source/_static/pen.svg new file mode 100644 index 00000000000..3c535f378e4 --- /dev/null +++ b/docs/source/_static/pen.svg @@ -0,0 +1,3 @@ + + + diff --git a/docs/source/blocks/anatomy.md b/docs/source/blocks/anatomy.md index 4c17b89ce9a..4ac83fa9d9d 100644 --- a/docs/source/blocks/anatomy.md +++ b/docs/source/blocks/anatomy.md @@ -82,7 +82,7 @@ You can use all these props to render your edit block and model its behavior. Volto later then 16.0.0 ships with a set of default Edit and View components. The view component is mostly a placeholder, with an auto-generated listing of the block fields, while the default Edit component is the most interesting, as -it can use the `schema` that you can specify in the block configuration to +it can use the `blockSchema` that you can specify in the block configuration to automatically render a form for the Block settings, in the Volto Sidebar. In the main editing area, it will render the view component, so for many blocks you can just develop a schema and the View component. diff --git a/docs/source/blocks/editcomponent.md b/docs/source/blocks/editcomponent.md index d1f0191711d..46b52a18319 100644 --- a/docs/source/blocks/editcomponent.md +++ b/docs/source/blocks/editcomponent.md @@ -11,7 +11,7 @@ myst: The edit component part of a block anatomy is specially different to the view component because they have to support the UX for editing the block. This UX can be very complex depending on the kind of block and the feature that it is trying to provide. -The project requirements will tell how far you should go with the UX story of each tile, and how complex it will become. +The project requirements will tell how far you should go with the UX story of each block, and how complex it will become. You can use all the props that the edit component is receiving to model the UX for the block and how it will render. See the complete list of {ref}`block-edit-component-props-label`. @@ -28,22 +28,36 @@ You need to instantiate it this way: ```jsx import { SidebarPortal } from '@plone/volto/components'; -[...] +const Edit = (props) => { + const { selected } = props; + return ( + + [...] - - // ... - + + // ... + + ) + +} ``` Everything that's inside the `SidebarPortal` component will be rendered in the sidebar. If you need an extra layer of configuration within `SidebarPortal`, you can use `SidebarPopup`. ```jsx - import { SidebarPopup } from '@plone/volto/components'; - - ... - +const Edit = (props) => { + const { sidebarOpen } = props; + + return ( + [...] + + + ... + + ) +} ``` ## Schema driven automated block settings forms @@ -107,24 +121,30 @@ import schema from './schema'; import BlockDataForm from '@plone/volto/components/manage/Form/BlockDataForm'; import { Icon } from '@plone/volto/components'; - - } - schema={schema} - title={schema.title} - headerActions={} - footer={
I am footer
} - onChangeField={(id, value) => { - this.props.onChangeBlock(this.props.block, { - ...this.props.data, - [id]: value, - }); - }} - onChangeBlock={onChangeBlock} - formData={this.props.data} - block={block} - /> -
; +const Edit = (props) => { + const {selected, block, data, onChangeBlock} = props; + + return ( + + } + schema={schema} + title={schema.title} + headerActions={} + footer={
I am footer
} + onChangeField={(id, value) => { + onChangeBlock(block, { + ...data, + [id]: value, + }); + }} + onChangeBlock={onChangeBlock} + formData={data} + block={block} + /> +
; + ) +} ``` ## Object Browser diff --git a/docs/source/blocks/examples/custom-schema-and-view.md b/docs/source/blocks/examples/custom-schema-and-view.md new file mode 100644 index 00000000000..cf099fc5540 --- /dev/null +++ b/docs/source/blocks/examples/custom-schema-and-view.md @@ -0,0 +1,154 @@ +--- +myst: + html_meta: + 'description': 'Volto block with custom schema and view components' + 'property=og:description': 'Volto block with custom schema and view components' + 'property=og:title': 'Volto block with custom schema and view components' + 'keywords': 'Volto, React, blocks, grid, container, Plone' +--- + +(custom-schema-and-view)= + +# Block with a custom schema + +You can create a block with several settings defined using a schema, and let Volto render the edit form by itself. + +To do so, define the schema, the view component, and configure the block settings. + +## Preparations + +In your Volto add-on, create a subfolder {file}`ExampleBlock01` inside the {file}`components` folder to save all the files required to create a block. + +## Schema + +Create a {file}`Schema.js` file inside the {file}`ExampleBlock01` folder, with the following contents. + +```js +import messages from './messages'; + +const Schema = ({ intl }) => { + return { + title: intl.formatMessage(messages.block01), + block: 'block01', + fieldsets: [ + { + id: 'default', + title: intl.formatMessage(messages.default), + fields: ['url', 'title'], + }, + ], + + properties: { + url: { + title: intl.formatMessage(messages.URL), + widget: 'url', + }, + title: { + title: intl.formatMessage(messages.title), + }, + }, + required: [], + }; +}; + +export default Schema; +``` + +## Messages + +As you may have noted, you prepared the block for internationalization. +{term}`Internationalization` (i18n) is the process of creating user interfaces which are suitable for different languages and cultural contexts. +To add translatable messages, create a file {file}`messages.js` in the same {file}`ExampleBlock01` folder with the following contents. + +```js +import { defineMessages } from 'react-intl'; + +const messages = defineMessages({ + block01: { + id: 'block01', + defaultMessage: 'Block 01', + }, + default: { + id: 'default', + defaultMessage: 'Default', + }, + URL: { + id: 'URL', + defaultMessage: 'URL', + }, + title: { + id: 'title', + defaultMessage: 'Title', + }, +}); + +export default messages; +``` + +## View component + +The view component will have all the required logic to show the information saved on the block. +It will be a small HTML fragment. + +Create a file {file}`View.jsx` in the {file}`ExampleBlock01` folder with the following contents. + +```jsx +import cx from 'classnames'; +import React from 'react'; + +const View = (props) => { + // - `data` holds the values entered in the block edit form. + // - `className` holds the CSS class names injected into this block + // by Volto's `styleClassNameExtenders`. + // - `style` holds the CSS properties injected into this block + // by Volto's `Block Style Wrapper`. + const { data, className, style } = props; + return ( +
+ I am the Block view component! + +
+ ); +}; + +export default View; +``` + +## Block configuration + +With all the block components ready, you need to register the block into Volto. + +To do so, open your add-on's {file}`index.js` file, and insert the following contents before the last `return config;` statement. + +```js +config.blocks.blocksConfig.block01 = { + id: 'block01', // this is the block id, it must match the id on the previous line + title: 'Block 01', // this is the block title + view: View01, // this is the block's view component + // We do not need a specific edit component, Volto will use the default + // edit: null; + blockSchema: Schema01, // this is the schema that will be used to render the edit form + icon: imagesSVG, // this is the image that will be shown in the block selector + sidebarTab: 1, // this is set to 1 to have the `Block` tab selected in the sidebar + // editor when editing this block +}; +``` + +At the top of the file, import the relevant components as follows. + +```js +import View01 from './components/ExampleBlock01/View'; +import Schema01 from './components/ExampleBlock01/Schema'; + +// This is the icon we use for the example, use a meaningful one or provide your own image. +import imagesSVG from '@plone/volto/icons/images.svg'; +``` + +## See it in action + +Your block is ready to be used in your site. + +Restart your Volto site, and now you can add the new block from the block chooser found in the {guilabel}`Edit` Edit icon or {guilabel}`Add` Add icon content views. diff --git a/docs/source/blocks/examples/custom-schema-view-and-edit.md b/docs/source/blocks/examples/custom-schema-view-and-edit.md new file mode 100644 index 00000000000..a5fd7d57e1a --- /dev/null +++ b/docs/source/blocks/examples/custom-schema-view-and-edit.md @@ -0,0 +1,212 @@ +--- +myst: + html_meta: + "description": "Volto block with custom schema and edit components" + "property=og:description": "Volto block with custom schema and edit components" + "property=og:title": "Volto block with custom schema and edit components" + "keywords": "Volto, React, blocks, custom, schema, edit, component, Plone" +--- + +(custom-schema-edit-and-view)= + +# Block with a custom schema and edit components + +You can create a block with several settings defined using a schema, and write a custom edit form instead of using the one provided by Volto. + +To do so, define the schema, the view component, the edit component, and configure the block settings. + +## Preparations + +In your Volto add-on, create a subfolder {file}`ExampleBlock02` inside the {file}`components` folder to save all the files required to create a block. + +## Schema + +Create a {file}`Schema.js` file inside the {file}`ExampleBlock02` folder, with the following contents. + +```js +import messages from './messages'; + +const Schema = ({ intl }) => { + return { + title: intl.formatMessage(messages.block02), + block: 'block02', + fieldsets: [ + { + id: 'default', + title: intl.formatMessage(messages.default), + fields: ['url', 'title'], + }, + ], + + properties: { + url: { + title: intl.formatMessage(messages.URL), + widget: 'url', + }, + title: { + title: intl.formatMessage(messages.title), + }, + }, + required: [], + }; +}; + +export default Schema; +``` + +## Messages + +As you may have noted, you prepared the block for internationalization. +{term}`Internationalization` (i18n) is the process of creating user interfaces which are suitable for different languages and cultural contexts. +To add translatable messages, create a file {file}`messages.js` in the same {file}`ExampleBlock02` folder with the following contents. + +```js +import { defineMessages } from 'react-intl'; + +const messages = defineMessages({ + block02: { + id: 'block02', + defaultMessage: 'Block 02', + }, + default: { + id: 'default', + defaultMessage: 'Default', + }, + URL: { + id: 'URL', + defaultMessage: 'URL', + }, + title: { + id: 'title', + defaultMessage: 'Title', + }, +}); + +export default messages; +``` + +## View component + +The view component will have all the required logic to show the information saved on the block. +It will be a small HTML fragment. + +Create a file {file}`View.jsx` in the {file}`ExampleBlock02` folder with the following contents. + +```jsx +import cx from 'classnames'; +import React from 'react'; + +const View = (props) => { + // - `data` holds the values entered in the block edit form. + // - `className` holds the CSS class names injected into this block + // by Volto's `styleClassNameExtenders`. + // - `style` holds the CSS properties injected into this block + // by Volto's `Block Style Wrapper`. + const { data, className, style } = props; + return ( +
+ I am the Block view component! + +
+ ); +}; + +export default View; +``` + +## Edit component + +The edit component renders a form where the editor can change the block settings. +This edit component is a minimal component that renders the block and the same edit form as the one rendered automatically. + +Create a file {file}`Edit.jsx` in the {file}`ExampleBlock02` folder with the following contents. + +```jsx + +// manually import the schema +import schema from './Schema'; +import BlockDataForm from '@plone/volto/components/manage/Form/BlockDataForm'; +import { SidebarPortal } from '@plone/volto/components'; +// The edit component also renders the view of the block, +// not only the form. +// So you must import the view component that you just wrote +// to render its contents. +import View from './View'; + + +const Edit = (props) => { + const { onChangeBlock, block, data, selected, className, style } = props; + + // The schema is a function. Call it to get its definition. + const blockSchema = schema(props); + + return ( + <> + + + + { + onChangeBlock(block, { + ...data, + [id]: value, + }); + }} + onChangeBlock={onChangeBlock} + formData={data} + block={block} + /> + + + ); +}; + +export default Edit; +``` + +## Block configuration + +With all the block components ready, you need to register the block into Volto. + +To do so, open your add-on's {file}`index.js` file, and insert the following contents before the last `return config;` statement. + +```js +config.blocks.blocksConfig.block02 = { + id: 'block02', // this is the block id, it must match the id on the previous line + title: 'Block 02', // this is the block title + view: View02, // this is the block's view component + edit: Edit02, // this is the block's edit component + // You do not need to define the schema here, + // because you are using a custom edit component + // blockSchema: Schema02, + + // this is the image that will be shown in the block selector + icon: imagesSVG, + // this is set to 1, which selects the `Block` tab in the sidebar editor + // when editing this block + sidebarTab: 1, + }; +``` + +At the top of the file, import the relevant components as follows. + +```js +import View02 from './components/ExampleBlock02/View'; +import Edit02 from './components/ExampleBlock02/Edit'; +import Schema02 from './components/ExampleBlock02/Schema'; + +// This is the icon to use for this example. +// Use a meaningful one or provide your own image. +import imagesSVG from '@plone/volto/icons/images.svg'; +``` + +## See it in action + +Your block is ready to use in your site. + +Restart your Volto site, and now you can add the new block from the block chooser found in the {guilabel}`Edit` Edit icon or {guilabel}`Add` Add icon content views. diff --git a/docs/source/blocks/examples/custom-view-and-variations.md b/docs/source/blocks/examples/custom-view-and-variations.md new file mode 100644 index 00000000000..5fc95e3e97b --- /dev/null +++ b/docs/source/blocks/examples/custom-view-and-variations.md @@ -0,0 +1,239 @@ +--- +myst: + html_meta: + 'description': 'Volto block with custom schema and view components using variations' + 'property=og:description': 'Volto block with custom schema and view components using variations' + 'property=og:title': 'Volto block with custom schema and view components using variations' + 'keywords': 'Volto, React, blocks, schema, variation, view component, Plone' +--- + +(custom-schema-view-and-variations)= + +# Block with a custom schema and variations + +We can create a block that uses `variations`. +A {term}`variation` is an alternative view of a block. +This variation is shown as an additional option in the block settings sidebar and lets the editor change how this block is rendered. + +To do so, define the schema, view component, and variations, then configure the block settings. + +## Preparations + +In your Volto add-on, create a subfolder {file}`ExampleBlock03` inside the {file}`components` folder to save all the files required to create a block and its variations. + +## Schema + +Create a {file}`Schema.js` file inside the {file}`ExampleBlock03` folder, with the following contents. + +```js +import messages from './messages'; + +const Schema = ({ intl }) => { + return { + title: intl.formatMessage(messages.block03), + block: 'block03', + fieldsets: [ + { + id: 'default', + title: intl.formatMessage(messages.default), + fields: ['url', 'title'], + }, + ], + + properties: { + url: { + title: intl.formatMessage(messages.URL), + widget: 'url', + }, + title: { + title: intl.formatMessage(messages.title), + }, + }, + required: [], + }; +}; + +export default Schema; +``` + +## Messages + +As you may have noted, you prepared the block for internationalization. +{term}`Internationalization` (i18n) is the process of creating user interfaces which are suitable for different languages and cultural contexts. + +To do so, create a file {file}`messages.js` in the same {file}`ExampleBlock03` folder with the following contents. + +```js +import { defineMessages } from 'react-intl'; + +const messages = defineMessages({ + block03: { + id: 'block03', + defaultMessage: 'Block 03', + }, + default: { + id: 'default', + defaultMessage: 'Default', + }, + URL: { + id: 'URL', + defaultMessage: 'URL', + }, + title: { + id: 'title', + defaultMessage: 'Title', + }, +}); + +export default messages; +``` + +## View component + +For variations, the view component needs to use the variation template to render the contents of the block. +You can do so using the `variation` from the `props` of the block. + +Create a file {file}`View.jsx` in the {file}`ExampleBlock03` folder with the following contents. + +```jsx +import withBlockExtensions from '@plone/volto/helpers/Extensions/withBlockExtensions'; +import cx from 'classnames'; +import React from 'react'; + +const View = (props) => { + // - `data` holds the values entered in the block edit form. + // - `className` holds the CSS class names injected into this block + // by Volto's `styleClassNameExtenders`. + // - `style` holds the CSS properties injected into this block + // by Volto's `Block Style Wrapper`. + // - `variation` holds the variation selected in the block editor, + // and it is an object as defined in the block configuration. + const { data, className, style, variation } = props; + + const BodyTemplate = variation?.template; + + return ( +
+ +
+ ); +}; + +export default withBlockExtensions(View); +``` + +The `withBlockExtensions` {term}`HOC` makes the variation selector available in the block edit form and provides the `variation` property in the props. + +## Variations + +Next create one or more variations that will be available for this block. + +Create a file {file}`VariationView01.jsx` in the {file}`ExampleBlock03` folder with the following contents. + +```jsx +import React from 'react'; + +const View = (props) => { + const { data } = props; + return ( + <> +

Variation View 01

+
+ +
+ + ); +}; + +export default View; +``` + +Create a file {file}`VariationView02.jsx` in the {file}`ExampleBlock03` folder with the following contents. + +```jsx +import React from 'react'; + +const View = (props) => { + const { data } = props; + return ( + <> +

Variation View 02

+
+ +
+ + ); +}; + +export default View; +``` + +As you can see in this basic example, the variations are pretty much the same. +The only difference is the text that is rendered in the `

` tag. +But it can be anything. + +## Block configuration + +With all the block components ready, you need to register the block into Volto. + +To do so, open your add-on's {file}`index.js` file, and insert the following contents before the last `return config;` statement. + +```js +config.blocks.blocksConfig.block03 = { + id: 'block03', // this is the block id, it must match the id on the previous line + title: 'Block 03', // this is the block title + view: View03, // this is the block's view component + // We do not need a specific edit component, Volto will use the default + // edit: null, + blockSchema: Schema03, // this is the schema that will be used to render the edit form + icon: imagesSVG, // this is the image that will be shown in the block selector + sidebarTab: 1, // this is set to 1 to have the `Block` tab selected in the sidebar + // editor when editing this block these are the variations available for this block + variations: [ + { + id: 'variation01', // this is the id of the variation + title: 'Variation 01', // this is the title of the variation + isDefault: true, // this signals if this is the default variation for this block + template: VariationView0301, // this is the component that will render the variation + }, + { + id: 'variation02', + title: 'Variation 02', + isDefault: false, + template: VariationView0302, + }, + ], +}; +``` + +At the top of the file, import the relevant components as follows. + +```js +import View03 from './components/ExampleBlock03/View'; +import Schema03 from './components/ExampleBlock03/Schema'; +import VariationView0301 from './components/ExampleBlock03/VariationView01'; +import VariationView0302 from './components/ExampleBlock03/VariationView02'; + +// This is the icon we use for the example, use a meaningful one or provide your own image. +import imagesSVG from '@plone/volto/icons/images.svg'; +``` + +## See it in action + +Your block is ready to be used in your site. + +Restart your Volto site, and now you can add the new block from the block chooser found in the {guilabel}`Edit` Edit icon or {guilabel}`Add` Add icon content views. diff --git a/docs/source/blocks/examples/custom-view-variations-and-schema-enhancer.md b/docs/source/blocks/examples/custom-view-variations-and-schema-enhancer.md new file mode 100644 index 00000000000..90f6ffebe02 --- /dev/null +++ b/docs/source/blocks/examples/custom-view-variations-and-schema-enhancer.md @@ -0,0 +1,278 @@ +--- +myst: + html_meta: + 'description': 'Volto block with custom schema and view components using variations and a schema enhancer in one of the variations' + 'property=og:description': 'Volto block with custom schema and view components using variations and a schema enhancer in one of the variations' + 'property=og:title': 'Volto block with custom schema, variations, and schema enhancer' + 'keywords': 'Volto, React, blocks, variation, custom, schema, enhancer, Plone' +--- + +(custom-schema-view-variations-schema-enhancer)= + +# Block with a custom schema, variations, and a schema enhancer in a variation + +This example builds upon the previous example, {doc}`custom-view-and-variations`, where you can create a block with a custom schema, variations, and a schema enhancer in one of the variations. +A {term}`variation` is an alternative view of a block. +The variation is shown as an additional option in the schema editor, and lets the editor change how this block is viewed. + +A {term}`schema enhancer` is an option of a variation. +Using this schema enhancer, you can extend the block schema to have additional fields. + +To do so, define the schema, view component, variations, and schema enhancer, then configure the block settings. + +## Preparations + +In your Volto add-on, create a subfolder {file}`ExampleBlock04` inside the {file}`components` folder to save all the files required to create a block, its variations, and the schema enhancer. + +## Schema + +Create a {file}`Schema.js` file inside the {file}`ExampleBlock04` folder, with the following contents. + +```js +import messages from './messages'; + +const Schema = ({ intl }) => { + return { + title: intl.formatMessage(messages.block04), + block: 'block04', + fieldsets: [ + { + id: 'default', + title: intl.formatMessage(messages.default), + fields: ['url', 'title'], + }, + ], + + properties: { + url: { + title: intl.formatMessage(messages.URL), + widget: 'url', + }, + title: { + title: intl.formatMessage(messages.title), + }, + }, + required: [], + }; +}; + +export default Schema; +``` + +## Messages + +As you may have noted, you prepared the block for internationalization. +{term}`Internationalization` (i18n) is the process of creating user interfaces which are suitable for different languages and cultural contexts. + +Create a file {file}`messages.js` in the same {file}`ExampleBlock04` folder with the following contents. + +```js +import { defineMessages } from 'react-intl'; + +const messages = defineMessages({ + block04: { + id: 'block04', + defaultMessage: 'Block 04', + }, + default: { + id: 'default', + defaultMessage: 'Default', + }, + URL: { + id: 'URL', + defaultMessage: 'URL', + }, + title: { + id: 'title', + defaultMessage: 'Title', + }, + color: { + id: 'color', + defaultMessage: 'Color', + }, +}); + +export default messages; +``` + +## View component + +For variations, the view component needs to use the variation template to render the contents of the block. + +You can do so using the `variation` from the `props` of the block. + +Create a file {file}`View.jsx` in the {file}`ExampleBlock04` folder with the following contents. + +```jsx +import withBlockExtensions from '@plone/volto/helpers/Extensions/withBlockExtensions'; +import cx from 'classnames'; +import React from 'react'; + +const View = (props) => { + // - `data` holds the values entered in the block edit form. + // - `className` holds the CSS class names injected into this block + // by Volto's `styleClassNameExtenders`. + // - `style` holds the CSS properties injected into this block + // by Volto's `Block Style Wrapper`. + // - `variation` holds the variation selected in the block editor, + // and it is an object as defined in the block configuration. + const { data, className, style, variation } = props; + + const BodyTemplate = variation?.template; + + return ( +
+ +
+ ); +}; + +export default withBlockExtensions(View); +``` + +The `withBlockExtensions` {term}`HOC` makes the variation selector available in the block edit form and provides the `variation` property in the props. + +## Schema enhancer + +Next you need to configure the schema enhancer function. +In this example, you will add a new field named `color` when using `schemaEnhancerVariation02`. + +Create a file {file}`enhancers.js` in the {file}`BlockSchema04` folder with the following content: + +```js +import messages from './messages'; + +const schemaEnhancerVariation02 = ({ formData, schema, intl }) => { + // schema holds the original schema (see the Schema.js file) + // so you need to define the new property under `schema.properties` + // and push its name to the relevant fieldset, in this case the first one + // (note the `fieldsets[0]`) + schema.properties.color = { + title: intl.formatMessage(messages.color), + }; + schema.fieldsets[0].fields.push('color'); + return schema; +}; + +export default schemaEnhancerVariation02; +``` + +## Variations + +Next create one or more variations that will be available for this block. + +Create a file {file}`VariationView01.jsx` in the {file}`ExampleBlock04` folder with the following contents. + +```jsx +import React from 'react'; + +const View = (props) => { + const { data } = props; + return ( + <> +

Variation View 01

+
+ +
+ + ); +}; + +export default View; +``` + +Create a file {file}`VariationView02.jsx` in the {file}`ExampleBlock04` folder with the following contents. + +```jsx +import React from 'react'; + +const View = (props) => { + const { data } = props; + return ( + <> +

Variation View 02

+
+ +
+ + ); +}; + +export default View; +``` + +As you can see, the variations are pretty much the same. +The differences are the text that is rendered in the `

` tag, and the new field that you added with the schema enhancer. +But it can be anything. + +## Block configuration + +With all the block components ready, you need to register the block into Volto. + +To do so, open your add-on's {file}`index.js` file, and insert the following contents before the last `return config;` statement. + +```js +config.blocks.blocksConfig.block04 = { + id: 'block04', // this is the block id, it must match the id on the previous line + title: 'Block 04', // this is the block title + view: View04, // this is the block's view component + // We do not need a specific edit component, Volto will use the default + // edit: null, + blockSchema: Schema04, // this is the schema that will be used to render the edit form + icon: imagesSVG, // this is the image that will be shown in the block selector + sidebarTab: 1, // this is set to 1 to have the `Block` tab selected in the sidebar + // editor when editing this block these are the variations available for this block + // these are the variations available for this block + variations: [ + { + id: 'variation01', // this is the id of the variation + title: 'Variation 01', // this is the title of the variation + isDefault: true, // this signals if this is the default variation for this block + template: VariationView0401, // this is the component that will render + // the variation + }, + { + id: 'variation02', + title: 'Variation 02', + isDefault: false, + template: VariationView0402, + schemaEnhancer: schemaEnhancerBlock04Variation02, // this is the schema enhancer + // definition + }, + ], +}; +``` + +At the top of the file, import the relevant components as follows. + +```js +import View04 from './components/ExampleBlock04/View'; +import Schema04 from './components/ExampleBlock04/Schema'; +import VariationView0401 from './components/ExampleBlock04/VariationView01'; +import VariationView0402 from './components/ExampleBlock04/VariationView02'; +import schemaEnhancerBlock04Variation02 from './components/ExampleBlock04/enhancers'; + +// This is the icon we use for the example, use a meaningful one or provide your own image. +import imagesSVG from '@plone/volto/icons/images.svg'; +``` + +## See it in action + +Your block is ready to use in your site. + +Restart your Volto site, and now you can add the new block from the block chooser found in the {guilabel}`Edit` Edit icon or {guilabel}`Add` Add icon content views. diff --git a/docs/source/blocks/examples/index.md b/docs/source/blocks/examples/index.md new file mode 100644 index 00000000000..f64f6c1ea80 --- /dev/null +++ b/docs/source/blocks/examples/index.md @@ -0,0 +1,23 @@ +--- +myst: + html_meta: + "description": "Volto block examples" + "property=og:description": "Volto block examples" + "property=og:title": "Volto block examples" + "keywords": "Volto, React, blocks, example, edit, view, Plone" +--- + +# Volto block examples + +This part of the documentation shows some examples of custom blocks that you can use as a base to develop your own blocks. + +These blocks have been tested using Volto 18.4.0. + +```{toctree} +:maxdepth: 1 + +custom-schema-and-view +custom-schema-view-and-edit +custom-view-and-variations +custom-view-variations-and-schema-enhancer +``` diff --git a/docs/source/blocks/index.md b/docs/source/blocks/index.md index 2a8e4853492..5283c494c99 100644 --- a/docs/source/blocks/index.md +++ b/docs/source/blocks/index.md @@ -20,4 +20,5 @@ block-style-wrapper extensions ssr core/index +examples/index ``` diff --git a/docs/source/blocks/settings.md b/docs/source/blocks/settings.md index 0dcb406c45b..1a08cc3fd09 100644 --- a/docs/source/blocks/settings.md +++ b/docs/source/blocks/settings.md @@ -48,6 +48,10 @@ const customBlocks = { // Required for alternate default block types implementations. // See also [Settings reference](/configuration/settings-reference) }, + // The `blockSchema` property can either be a schema by itself + // (a JavaScript object describing the schema), + // or a function that returns a schema. + blockSchema: CustomSchema, // A block can have an schema enhancer function with the signature: (schema) => schema // It can be either be at block level (it's applied always), at a variation level // or both. It's up to the developer to make them work nicely (not conflict) between them diff --git a/docs/source/configuration/settings-reference.md b/docs/source/configuration/settings-reference.md index 54eaebef205..b8601cffef1 100644 --- a/docs/source/configuration/settings-reference.md +++ b/docs/source/configuration/settings-reference.md @@ -463,6 +463,23 @@ querystringSearchGet [See an explanation of character limits in URLs](https://stackoverflow.com/questions/417142/what-is-the-maximum-length-of-a-url-in-different-browsers/417184#417184). Please test this setting properly before enabling in a production site. +cssLayers + To use CSS layers when styling Volto, you can define and apply them at the very top level of the page, where they appear in the `` tag. + By using this configuration, you can pass the layer list definition as an array: + + ```js + config.settings.cssLayers = ['reset', 'plone-components', 'layout', 'addons', 'theme']; + ``` + +showRelatedItems + If true, the `RelatedItems` component will show items from the `relatedItems` field. Default: false. + + ```{versionadded} 18.5.0 + ``` + + +showTags + If true, the `Tags` component will show tags from the `subjects` field. Default: true. ``` ## Views settings diff --git a/docs/source/contributing/developing-core.md b/docs/source/contributing/developing-core.md index f0ffb5462e0..ace0d1de633 100644 --- a/docs/source/contributing/developing-core.md +++ b/docs/source/contributing/developing-core.md @@ -42,32 +42,35 @@ The workspaces are located in the `packages` or `apps` folder. ### Folder layout Volto has the following folder structure. +The package `volto` is the core code of Volto. ```text -(volto-monorepo)/ +/ ├─ apps/ -│ ├─ plone │ ├─ nextjs │ ├─ remix -│ └─ rr7 +│ ├─ rr7 +│ ├─ vite +│ └─ vite-ssr +├─ ... ├─ packages/ -│ ├─ volto +│ ├─ blocks │ ├─ client │ ├─ components -│ ├─ registry -│ ├─ types │ ├─ coresandbox │ ├─ generator-volto +│ ├─ helpers +│ ├─ providers +│ ├─ registry │ ├─ scripts +│ ├─ slots +│ ├─ theming │ ├─ tsconfig +│ ├─ types +│ ├─ volto │ ├─ volto-guillotina │ ├─ volto-slate │ └─ volto-testing -├─ .gitignore -├─ package.json -├─ pnpm-workspace.yaml -├─ turbo.json -├─ tsconfig.json ├─ ... ``` diff --git a/docs/source/development/images.md b/docs/source/development/images.md index 1980200a186..2a5dedc5ebc 100644 --- a/docs/source/development/images.md +++ b/docs/source/development/images.md @@ -88,5 +88,5 @@ If the image is rendered at full viewport width when the viewport is less than ` More information on this subject can be found at the following resources. -- https://developer.mozilla.org/en-US/docs/Learn/HTML/Multimedia_and_embedding/Responsive_images +- https://developer.mozilla.org/en-US/docs/Web/HTML/Responsive_images - https://www.builder.io/blog/fast-images diff --git a/docs/source/release-notes/index.md b/docs/source/release-notes/index.md index 0db013fbbd8..4d4ce90838c 100644 --- a/docs/source/release-notes/index.md +++ b/docs/source/release-notes/index.md @@ -17,6 +17,39 @@ myst: +## 18.5.0 (2025-01-09) + +### Feature + +- Add component to show related items, which can be enabled using the `showRelatedItems` setting. @wesleybl [#3740](https://github.com/plone/volto/issues/3740) +- Added {file}sv/LC_MESSAGES/volto.poinlocales and updated{file}/volto/src/constants/Languages.js to include Swedish @TechSubham [#5957](https://github.com/plone/volto/issues/5957) + +### Bugfix + +- The depth field in the base search query of the search block was ignored, causing search results to include items beyond the specified depth level. Search results now respect the specified depth configuration. @TechSubham [#5856](https://github.com/plone/volto/issues/5856) +- No longer add classes from the query string search text in the `body` tag. @Abhishek-17h [#6493](https://github.com/plone/volto/issues/6493) +- Fixed folder contents issues with persistent selection across page changes. @pnicolli [#6554](https://github.com/plone/volto/issues/6554) +- Fix robots.txt in devmode @reebalazs [#6572](https://github.com/plone/volto/issues/6572) + +### Documentation + +- Fix redirecting links to Mozilla Developer Network's responsive images. @stevepiercy [#6552](https://github.com/plone/volto/issues/6552) +- Add Volto block examples in the documentation. @erral [#6560](https://github.com/plone/volto/issues/6560) + +## 18.4.0 (2024-12-17) + +### Feature + +- Added a setting in the `config` object to set the site's CSS layers, if required. @sneridagh [#6539](https://github.com/plone/volto/issues/6539) + +### Internal + +- Fixed and re-enabled the types declaration extractor from core Volto. @sneridagh [#6534](https://github.com/plone/volto/issues/6534) + +### Documentation + +- Add monorepo structure to the README. Update the monorepo structure file tree. @stevepiercy [#6542](https://github.com/plone/volto/issues/6542) + ## 18.3.0 (2024-12-12) ### Feature diff --git a/packages/components/CHANGELOG.md b/packages/components/CHANGELOG.md index 9f3d4cbaa6c..dbcbbff45ac 100644 --- a/packages/components/CHANGELOG.md +++ b/packages/components/CHANGELOG.md @@ -8,6 +8,16 @@ +## 3.0.1 (2024-12-17) + +### Bugfix + +- Fixed precedence of the Quanta layer by adding a base layer for all the basic components. @sneridagh [#6539](https://github.com/plone/volto/issues/6539) + +### Internal + +- Update `@plone/components`'s URLs in its `package.json`. @stevepiercy [#6542](https://github.com/plone/volto/issues/6542) + ## 3.0.0 (2024-12-12) ### Breaking diff --git a/packages/components/README.md b/packages/components/README.md index af2f8c0589c..136e6b09c47 100644 --- a/packages/components/README.md +++ b/packages/components/README.md @@ -62,11 +62,19 @@ Using them as a baseline will allow you to quickly build your theme around them. `@plone/components` basic styles provide a simple, yet powerful, set of tokenized custom CSS properties that will help you customize your own styles on the top of the basic styling. You can override them in your classes while maintaining them for others. +### CSS layers + +This package uses CSS layers to style the components in a more flexible way. +It uses the `plone-components` layer name to scope all the CSS declarations in the package. +The basic styling uses the nested `plone-components.base` named layer. +You can use the `plone-components` layer to override the basic styling, or use the `plone-components.base` layer to override the basic styling in a more specific way. + ### Quanta This package also features the Quanta components. -The Quanta theme is an example of it. -These components use the basic styling as a baseline, not only in styling, but also in the component side, reusing the CSS and custom CSS properties in it. +These components use the basic styling as a baseline, extending them to achieve the Quanta look and feel. +They also extend the basic React components in a composable way. +The Quanta styling is scoped in the `plone-components.quanta` named layer. Quanta is built upon the basic styles in an additive way. The use of the Quanta CSS implies using it upon basic styling. diff --git a/packages/components/package.json b/packages/components/package.json index 3ca411ac977..bafdbfe3770 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -8,13 +8,13 @@ } ], "license": "MIT", - "version": "3.0.0", + "version": "3.0.1", "repository": { "type": "git", - "url": "http://github.com/plone/components.git" + "url": "http://github.com/plone/volto.git" }, "bugs": { - "url": "https://github.com/plone/components/issues" + "url": "https://github.com/plone/volto/issues" }, "type": "module", "files": [ diff --git a/packages/components/src/stories/Introduction.mdx b/packages/components/src/stories/Introduction.mdx index 41ecc9f5d6c..13c00951848 100644 --- a/packages/components/src/stories/Introduction.mdx +++ b/packages/components/src/stories/Introduction.mdx @@ -5,16 +5,17 @@ import { Meta } from '@storybook/blocks'; # `@plone/components` -This package contains ReactJS components for using Plone as a headless CMS. +This package contains ReactJS components for Plone 7 and Plone's API-first CMS story. The purpose of this package is to provide an agnostic set of baseline components to build Plone sites upon. ## Usage -Using the package manager of your choice (npm, yarn, pnpm) install the package: +You can use your choice of package manager (npm, yarn, or pnpm) to install the package in your app. +If you add the components to a Volto add-on or workspace, use pnpm, as shown. ```shell -yarn add @plone/components +pnpm add @plone/components ``` Whenever you want to use the components, all are exported as named exports: @@ -53,12 +54,19 @@ or selectively: import '@plone/components/src/styles/basic/TextField.css'; ``` +### CSS layers -## Quanta +This package uses CSS layers to style the components in a more flexible way. +It uses the `plone-components` layer name to scope all the CSS declarations in the package. +The basic styling uses the nested `plone-components.base` named layer. +You can use the `plone-components` layer to override the basic styling, or use the `plone-components.base` layer to override the basic styling in a more specific way. + +### Quanta This package also features the Quanta components. -The Quanta theme is an example of it. -These components use the basic styling as a baseline, not only in styling, but also in the component side, reusing the CSS and custom CSS properties in it. +These components use the basic styling as a baseline, extending them to achieve the Quanta look and feel. +They also extend the basic React components in a composable way. +The Quanta styling is scoped in the `plone-components.quanta` named layer. Quanta is built upon the basic styles in an additive way. The use of the Quanta CSS implies using it upon basic styling. diff --git a/packages/components/src/styles/basic/BlockToolbar.css b/packages/components/src/styles/basic/BlockToolbar.css index 19c101a2903..1799ce9bb0e 100644 --- a/packages/components/src/styles/basic/BlockToolbar.css +++ b/packages/components/src/styles/basic/BlockToolbar.css @@ -4,7 +4,7 @@ @import './Menu.css'; @import './theme.css'; -@layer plone-components { +@layer plone-components.base { .blocks-toolbar { display: flex; flex-wrap: wrap; diff --git a/packages/components/src/styles/basic/Breadcrumbs.css b/packages/components/src/styles/basic/Breadcrumbs.css index 0aaa86cac19..d6d5a8e83ce 100644 --- a/packages/components/src/styles/basic/Breadcrumbs.css +++ b/packages/components/src/styles/basic/Breadcrumbs.css @@ -1,6 +1,6 @@ @import './theme.css'; -@layer plone-components { +@layer plone-components.base { .react-aria-Breadcrumbs { display: flex; align-items: center; diff --git a/packages/components/src/styles/basic/Button.css b/packages/components/src/styles/basic/Button.css index c6849f7fb49..d4e79025e34 100644 --- a/packages/components/src/styles/basic/Button.css +++ b/packages/components/src/styles/basic/Button.css @@ -1,6 +1,6 @@ @import './theme.css'; -@layer plone-components { +@layer plone-components.base { .react-aria-Button { padding: 8px 8px; border: 1px solid var(--border-color); diff --git a/packages/components/src/styles/basic/Calendar.css b/packages/components/src/styles/basic/Calendar.css index ec81b10c4d7..0c16b5071c2 100644 --- a/packages/components/src/styles/basic/Calendar.css +++ b/packages/components/src/styles/basic/Calendar.css @@ -1,7 +1,7 @@ @import './Button.css'; @import './theme.css'; -@layer plone-components { +@layer plone-components.base { .react-aria-Calendar { width: fit-content; max-width: 100%; diff --git a/packages/components/src/styles/basic/Checkbox.css b/packages/components/src/styles/basic/Checkbox.css index 46f856ac1d6..7ca3ed1197b 100644 --- a/packages/components/src/styles/basic/Checkbox.css +++ b/packages/components/src/styles/basic/Checkbox.css @@ -1,6 +1,6 @@ @import './theme.css'; -@layer plone-components { +@layer plone-components.base { .react-aria-Checkbox { --selected-color: var(--highlight-background); --selected-color-pressed: var(--highlight-background-pressed); diff --git a/packages/components/src/styles/basic/CheckboxGroup.css b/packages/components/src/styles/basic/CheckboxGroup.css index 1939115950a..ca543fcb411 100644 --- a/packages/components/src/styles/basic/CheckboxGroup.css +++ b/packages/components/src/styles/basic/CheckboxGroup.css @@ -3,7 +3,7 @@ @import './Button.css'; @import './theme.css'; -@layer plone-components { +@layer plone-components.base { .react-aria-CheckboxGroup { display: flex; flex-direction: column; diff --git a/packages/components/src/styles/basic/ColorArea.css b/packages/components/src/styles/basic/ColorArea.css index e5a81b7512f..fa49256001f 100644 --- a/packages/components/src/styles/basic/ColorArea.css +++ b/packages/components/src/styles/basic/ColorArea.css @@ -1,6 +1,6 @@ @import './ColorSlider.css'; -@layer plone-components { +@layer plone-components.base { .react-aria-ColorArea { width: 192px; height: 192px; diff --git a/packages/components/src/styles/basic/ColorField.css b/packages/components/src/styles/basic/ColorField.css index 41442cbbe8c..d09a7709f57 100644 --- a/packages/components/src/styles/basic/ColorField.css +++ b/packages/components/src/styles/basic/ColorField.css @@ -2,7 +2,7 @@ @import './Form.css'; @import './theme.css'; -@layer plone-components { +@layer plone-components.base { .react-aria-ColorField { display: flex; flex-direction: column; diff --git a/packages/components/src/styles/basic/ColorPicker.css b/packages/components/src/styles/basic/ColorPicker.css index 9bfd25e9cb3..344565fdbf9 100644 --- a/packages/components/src/styles/basic/ColorPicker.css +++ b/packages/components/src/styles/basic/ColorPicker.css @@ -10,7 +10,7 @@ @import './Select.css'; @import './theme.css'; -@layer plone-components { +@layer plone-components.base { .color-picker { display: flex; align-items: center; diff --git a/packages/components/src/styles/basic/ColorSlider.css b/packages/components/src/styles/basic/ColorSlider.css index f61f4b0d5e5..cd54265e3a5 100644 --- a/packages/components/src/styles/basic/ColorSlider.css +++ b/packages/components/src/styles/basic/ColorSlider.css @@ -1,4 +1,4 @@ -@layer plone-components { +@layer plone-components.base { .react-aria-ColorSlider { display: grid; max-width: 300px; diff --git a/packages/components/src/styles/basic/ColorSwatch.css b/packages/components/src/styles/basic/ColorSwatch.css index f617ec53413..f8127e87567 100644 --- a/packages/components/src/styles/basic/ColorSwatch.css +++ b/packages/components/src/styles/basic/ColorSwatch.css @@ -1,6 +1,6 @@ @import './ColorSlider.css'; -@layer plone-components { +@layer plone-components.base { .react-aria-ColorSwatch { width: 32px; height: 32px; diff --git a/packages/components/src/styles/basic/ColorSwatchPicker.css b/packages/components/src/styles/basic/ColorSwatchPicker.css index 5a82e24a96b..c91c37180a7 100644 --- a/packages/components/src/styles/basic/ColorSwatchPicker.css +++ b/packages/components/src/styles/basic/ColorSwatchPicker.css @@ -2,7 +2,7 @@ @import './ColorField.css'; @import './theme.css'; -@layer plone-components { +@layer plone-components.base { .react-aria-ColorSwatchPicker { display: flex; flex-wrap: wrap; diff --git a/packages/components/src/styles/basic/ColorWheel.css b/packages/components/src/styles/basic/ColorWheel.css index c7a953896d2..fcff7697379 100644 --- a/packages/components/src/styles/basic/ColorWheel.css +++ b/packages/components/src/styles/basic/ColorWheel.css @@ -1,4 +1,4 @@ -@layer plone-components { +@layer plone-components.base { .react-aria-ColorThumb { width: 20px; height: 20px; diff --git a/packages/components/src/styles/basic/ComboBox.css b/packages/components/src/styles/basic/ComboBox.css index fc597eb7ee7..f3a2d64b7d6 100644 --- a/packages/components/src/styles/basic/ComboBox.css +++ b/packages/components/src/styles/basic/ComboBox.css @@ -5,7 +5,7 @@ @import './Button.css'; @import './theme.css'; -@layer plone-components { +@layer plone-components.base { .react-aria-ComboBox { color: var(--text-color); diff --git a/packages/components/src/styles/basic/Container.css b/packages/components/src/styles/basic/Container.css index f7448a20b2e..da97f93bf34 100644 --- a/packages/components/src/styles/basic/Container.css +++ b/packages/components/src/styles/basic/Container.css @@ -1,4 +1,4 @@ -@layer plone-components { +@layer plone-components.base { .q.container { container-type: inline-size; diff --git a/packages/components/src/styles/basic/DateField.css b/packages/components/src/styles/basic/DateField.css index d0220e4999b..7eca458b11b 100644 --- a/packages/components/src/styles/basic/DateField.css +++ b/packages/components/src/styles/basic/DateField.css @@ -2,7 +2,7 @@ @import './Button.css'; @import './theme.css'; -@layer plone-components { +@layer plone-components.base { .react-aria-DateField { color: var(--text-color); } diff --git a/packages/components/src/styles/basic/DatePicker.css b/packages/components/src/styles/basic/DatePicker.css index dcfd458c831..796e0439e56 100644 --- a/packages/components/src/styles/basic/DatePicker.css +++ b/packages/components/src/styles/basic/DatePicker.css @@ -6,7 +6,7 @@ @import './Form.css'; @import './theme.css'; -@layer plone-components { +@layer plone-components.base { .react-aria-DatePicker { color: var(--text-color); diff --git a/packages/components/src/styles/basic/DateRangePicker.css b/packages/components/src/styles/basic/DateRangePicker.css index bb44b073c1d..c48d9ac33fa 100644 --- a/packages/components/src/styles/basic/DateRangePicker.css +++ b/packages/components/src/styles/basic/DateRangePicker.css @@ -6,7 +6,7 @@ @import './Form.css'; @import './theme.css'; -@layer plone-components { +@layer plone-components.base { .react-aria-DateRangePicker { color: var(--text-color); diff --git a/packages/components/src/styles/basic/Dialog.css b/packages/components/src/styles/basic/Dialog.css index 45ca2210c8a..64366c4693b 100644 --- a/packages/components/src/styles/basic/Dialog.css +++ b/packages/components/src/styles/basic/Dialog.css @@ -3,7 +3,7 @@ @import './Modal.css'; @import './theme.css'; -@layer plone-components { +@layer plone-components.base { .react-aria-Dialog { padding: 30px; outline: none; diff --git a/packages/components/src/styles/basic/Disclosure.css b/packages/components/src/styles/basic/Disclosure.css index 5704d093c16..cb8cb529dbb 100644 --- a/packages/components/src/styles/basic/Disclosure.css +++ b/packages/components/src/styles/basic/Disclosure.css @@ -1,7 +1,7 @@ @import './theme.css'; @import './Button.css'; -@layer plone-components { +@layer plone-components.base { .react-aria-Disclosure { .react-aria-Button[slot='trigger'] { display: flex; diff --git a/packages/components/src/styles/basic/Form.css b/packages/components/src/styles/basic/Form.css index cebcb43466b..00b864fa21c 100644 --- a/packages/components/src/styles/basic/Form.css +++ b/packages/components/src/styles/basic/Form.css @@ -2,7 +2,7 @@ @import './Button.css'; @import './theme.css'; -@layer plone-components { +@layer plone-components.base { .react-aria-Form { display: flex; flex-direction: column; diff --git a/packages/components/src/styles/basic/GridList.css b/packages/components/src/styles/basic/GridList.css index 22ab490bcfc..91944e9b212 100644 --- a/packages/components/src/styles/basic/GridList.css +++ b/packages/components/src/styles/basic/GridList.css @@ -3,7 +3,7 @@ @import './ToggleButton.css'; @import './theme.css'; -@layer plone-components { +@layer plone-components.base { .react-aria-GridList { display: flex; overflow: auto; diff --git a/packages/components/src/styles/basic/Label.css b/packages/components/src/styles/basic/Label.css index f3755f1ddca..1544ab27d97 100644 --- a/packages/components/src/styles/basic/Label.css +++ b/packages/components/src/styles/basic/Label.css @@ -1,6 +1,6 @@ @import './theme.css'; -@layer plone-components { +@layer plone-components.base { .react-aria-Label { /* TODO: Review since taken from default quanta */ font-size: 0.9rem; diff --git a/packages/components/src/styles/basic/Link.css b/packages/components/src/styles/basic/Link.css index 8f91a261ed6..08e46bddd51 100644 --- a/packages/components/src/styles/basic/Link.css +++ b/packages/components/src/styles/basic/Link.css @@ -1,6 +1,6 @@ @import './theme.css'; -@layer plone-components { +@layer plone-components.base { .react-aria-Link { position: relative; color: var(--link-color); diff --git a/packages/components/src/styles/basic/ListBox.css b/packages/components/src/styles/basic/ListBox.css index 9cec61d80a7..e9a5d92adf3 100644 --- a/packages/components/src/styles/basic/ListBox.css +++ b/packages/components/src/styles/basic/ListBox.css @@ -1,7 +1,7 @@ @import './Checkbox.css'; @import './theme.css'; -@layer plone-components { +@layer plone-components.base { .react-aria-ListBox { display: flex; overflow: auto; diff --git a/packages/components/src/styles/basic/Menu.css b/packages/components/src/styles/basic/Menu.css index 594f7b7ea1c..dbf93702097 100644 --- a/packages/components/src/styles/basic/Menu.css +++ b/packages/components/src/styles/basic/Menu.css @@ -2,7 +2,7 @@ @import './Popover.css'; @import './theme.css'; -@layer plone-components { +@layer plone-components.base { .react-aria-Menu { overflow: auto; min-width: 150px; diff --git a/packages/components/src/styles/basic/Meter.css b/packages/components/src/styles/basic/Meter.css index 2ab67095105..2947240afeb 100644 --- a/packages/components/src/styles/basic/Meter.css +++ b/packages/components/src/styles/basic/Meter.css @@ -1,6 +1,6 @@ @import './theme.css'; -@layer plone-components { +@layer plone-components.base { .react-aria-Meter { --fill-color: forestgreen; diff --git a/packages/components/src/styles/basic/Modal.css b/packages/components/src/styles/basic/Modal.css index 544e1c224dc..b1c90d8578f 100644 --- a/packages/components/src/styles/basic/Modal.css +++ b/packages/components/src/styles/basic/Modal.css @@ -2,7 +2,7 @@ @import './TextField.css'; @import './theme.css'; -@layer plone-components { +@layer plone-components.base { .react-aria-ModalOverlay { position: fixed; z-index: 100; diff --git a/packages/components/src/styles/basic/NumberField.css b/packages/components/src/styles/basic/NumberField.css index a5ed24c70ab..b657f6b201c 100644 --- a/packages/components/src/styles/basic/NumberField.css +++ b/packages/components/src/styles/basic/NumberField.css @@ -2,7 +2,7 @@ @import './Form.css'; @import './theme.css'; -@layer plone-components { +@layer plone-components.base { .react-aria-NumberField { margin-bottom: 8px; color: var(--text-color); diff --git a/packages/components/src/styles/basic/Popover.css b/packages/components/src/styles/basic/Popover.css index 89e8f419e54..5712ae8fcf7 100644 --- a/packages/components/src/styles/basic/Popover.css +++ b/packages/components/src/styles/basic/Popover.css @@ -3,7 +3,7 @@ @import './Switch.css'; @import './theme.css'; -@layer plone-components { +@layer plone-components.base { .react-aria-Popover { --background-color: var(--overlay-background); max-width: 250px; diff --git a/packages/components/src/styles/basic/ProgressBar.css b/packages/components/src/styles/basic/ProgressBar.css index 2a171ea53b3..12119e67eb8 100644 --- a/packages/components/src/styles/basic/ProgressBar.css +++ b/packages/components/src/styles/basic/ProgressBar.css @@ -1,6 +1,6 @@ @import './theme.css'; -@layer plone-components { +@layer plone-components.base { .react-aria-ProgressBar { display: grid; width: 250px; diff --git a/packages/components/src/styles/basic/RadioGroup.css b/packages/components/src/styles/basic/RadioGroup.css index 2a05774dccf..07b905498df 100644 --- a/packages/components/src/styles/basic/RadioGroup.css +++ b/packages/components/src/styles/basic/RadioGroup.css @@ -2,7 +2,7 @@ @import './Form.css'; @import './theme.css'; -@layer plone-components { +@layer plone-components.base { .react-aria-RadioGroup { display: flex; flex-direction: column; diff --git a/packages/components/src/styles/basic/RangeCalendar.css b/packages/components/src/styles/basic/RangeCalendar.css index 025c9ee54d8..f409bb678bf 100644 --- a/packages/components/src/styles/basic/RangeCalendar.css +++ b/packages/components/src/styles/basic/RangeCalendar.css @@ -1,7 +1,7 @@ @import './Button.css'; @import './theme.css'; -@layer plone-components { +@layer plone-components.base { .react-aria-RangeCalendar { width: fit-content; max-width: 100%; diff --git a/packages/components/src/styles/basic/SearchField.css b/packages/components/src/styles/basic/SearchField.css index ef23082851e..ccd7d27570e 100644 --- a/packages/components/src/styles/basic/SearchField.css +++ b/packages/components/src/styles/basic/SearchField.css @@ -2,7 +2,7 @@ @import './Form.css'; @import './theme.css'; -@layer plone-components { +@layer plone-components.base { .react-aria-SearchField { display: grid; width: fit-content; diff --git a/packages/components/src/styles/basic/Select.css b/packages/components/src/styles/basic/Select.css index bcffcaedf13..592796bc13e 100644 --- a/packages/components/src/styles/basic/Select.css +++ b/packages/components/src/styles/basic/Select.css @@ -4,7 +4,7 @@ @import './Form.css'; @import './theme.css'; -@layer plone-components { +@layer plone-components.base { .react-aria-Select { color: var(--text-color); diff --git a/packages/components/src/styles/basic/Slider.css b/packages/components/src/styles/basic/Slider.css index 00f6a8bb760..2de10680783 100644 --- a/packages/components/src/styles/basic/Slider.css +++ b/packages/components/src/styles/basic/Slider.css @@ -1,7 +1,7 @@ @import './NumberField.css'; @import './theme.css'; -@layer plone-components { +@layer plone-components.base { .react-aria-Slider { display: grid; max-width: 300px; diff --git a/packages/components/src/styles/basic/Switch.css b/packages/components/src/styles/basic/Switch.css index 85b4e44b9f3..0508d2aa29a 100644 --- a/packages/components/src/styles/basic/Switch.css +++ b/packages/components/src/styles/basic/Switch.css @@ -1,6 +1,6 @@ @import './theme.css'; -@layer plone-components { +@layer plone-components.base { .react-aria-Switch { display: flex; align-items: center; diff --git a/packages/components/src/styles/basic/Table.css b/packages/components/src/styles/basic/Table.css index 5ac6d90256a..6a55a242ccd 100644 --- a/packages/components/src/styles/basic/Table.css +++ b/packages/components/src/styles/basic/Table.css @@ -5,7 +5,7 @@ @import './Menu.css'; @import './theme.css'; -@layer plone-components { +@layer plone-components.base { :root { --plone-table-border: 0 none; --plone-table-border-radius: 0; diff --git a/packages/components/src/styles/basic/Tabs.css b/packages/components/src/styles/basic/Tabs.css index 9662ecd6a4c..811168c931d 100644 --- a/packages/components/src/styles/basic/Tabs.css +++ b/packages/components/src/styles/basic/Tabs.css @@ -2,7 +2,7 @@ @import './Link.css'; @import './theme.css'; -@layer plone-components { +@layer plone-components.base { .react-aria-Tabs { display: flex; color: var(--text-color); diff --git a/packages/components/src/styles/basic/TagGroup.css b/packages/components/src/styles/basic/TagGroup.css index d50abf91403..9fc9df89161 100644 --- a/packages/components/src/styles/basic/TagGroup.css +++ b/packages/components/src/styles/basic/TagGroup.css @@ -1,7 +1,7 @@ @import './ToggleButton.css'; @import './theme.css'; -@layer plone-components { +@layer plone-components.base { .react-aria-TagGroup { display: flex; flex-direction: column; diff --git a/packages/components/src/styles/basic/TextField.css b/packages/components/src/styles/basic/TextField.css index f99b9178dfd..4be3b73c95a 100644 --- a/packages/components/src/styles/basic/TextField.css +++ b/packages/components/src/styles/basic/TextField.css @@ -2,7 +2,7 @@ @import './Label.css'; @import './theme.css'; -@layer plone-components { +@layer plone-components.base { .react-aria-TextField { display: flex; width: fit-content; diff --git a/packages/components/src/styles/basic/TimeField.css b/packages/components/src/styles/basic/TimeField.css index 4fb876a93bd..b1ca5453e75 100644 --- a/packages/components/src/styles/basic/TimeField.css +++ b/packages/components/src/styles/basic/TimeField.css @@ -2,7 +2,7 @@ @import './Button.css'; @import './theme.css'; -@layer plone-components { +@layer plone-components.base { .react-aria-TimeField { color: var(--text-color); } diff --git a/packages/components/src/styles/basic/ToggleButton.css b/packages/components/src/styles/basic/ToggleButton.css index 6e7ad2bb393..50dd494b1ac 100644 --- a/packages/components/src/styles/basic/ToggleButton.css +++ b/packages/components/src/styles/basic/ToggleButton.css @@ -1,6 +1,6 @@ @import './theme.css'; -@layer plone-components { +@layer plone-components.base { .react-aria-ToggleButton { padding: 8px 8px; border: 1px solid var(--border-color); diff --git a/packages/components/src/styles/basic/Toolbar.css b/packages/components/src/styles/basic/Toolbar.css index 306f570fc7a..07b03e84a90 100644 --- a/packages/components/src/styles/basic/Toolbar.css +++ b/packages/components/src/styles/basic/Toolbar.css @@ -4,7 +4,7 @@ @import './Menu.css'; @import './theme.css'; -@layer plone-components { +@layer plone-components.base { .react-aria-Toolbar { display: flex; flex-wrap: wrap; diff --git a/packages/components/src/styles/basic/Tooltip.css b/packages/components/src/styles/basic/Tooltip.css index 8965f2bd7ef..8bec7761ed4 100644 --- a/packages/components/src/styles/basic/Tooltip.css +++ b/packages/components/src/styles/basic/Tooltip.css @@ -1,7 +1,7 @@ @import './Button.css'; @import './theme.css'; -@layer plone-components { +@layer plone-components.base { .react-aria-Tooltip { max-width: 150px; padding: 2px 8px; diff --git a/packages/components/src/styles/basic/icons.css b/packages/components/src/styles/basic/icons.css index ec69303237a..6cfd1b3a503 100644 --- a/packages/components/src/styles/basic/icons.css +++ b/packages/components/src/styles/basic/icons.css @@ -1,6 +1,6 @@ @import './theme.css'; -@layer plone-components { +@layer plone-components.base { :root { /* These has to be mapped to global css custom properties based on the SG scales */ --quanta-icon-default-size-s: 18px; diff --git a/packages/types/CHANGELOG.md b/packages/types/CHANGELOG.md index f22cfb03e74..348c5059307 100644 --- a/packages/types/CHANGELOG.md +++ b/packages/types/CHANGELOG.md @@ -8,6 +8,12 @@ +## 1.2.0 (2024-12-17) + +### Feature + +- Added the typing for the new `cssLayers` configuration object setting. @sneridagh [#6539](https://github.com/plone/volto/issues/6539) + ## 1.1.0 (2024-12-12) ### Feature diff --git a/packages/types/package.json b/packages/types/package.json index 5af91ff0e47..6c2370a0644 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -9,7 +9,7 @@ ], "funding": "https://github.com/sponsors/plone", "license": "MIT", - "version": "1.1.0", + "version": "1.2.0", "repository": { "type": "git", "url": "https://github.com/plone/volto.git" diff --git a/packages/types/src/config/Settings.d.ts b/packages/types/src/config/Settings.d.ts index 68419e2db21..2053fde0f50 100644 --- a/packages/types/src/config/Settings.d.ts +++ b/packages/types/src/config/Settings.d.ts @@ -76,6 +76,7 @@ export interface SettingsConfig { serverConfig: unknown; storeExtenders: unknown[]; showTags: boolean; + showRelatedItems: boolean; controlpanels: unknown[]; controlPanelsIcons: Record; filterControlPanels: unknown; @@ -101,4 +102,5 @@ export interface SettingsConfig { includeSiteTitle: boolean; titleAndSiteTitleSeparator: string; }; + cssLayers: string[]; } diff --git a/packages/volto-slate/locales/it/LC_MESSAGES/volto.po b/packages/volto-slate/locales/it/LC_MESSAGES/volto.po new file mode 100644 index 00000000000..7ddb1bdb360 --- /dev/null +++ b/packages/volto-slate/locales/it/LC_MESSAGES/volto.po @@ -0,0 +1,148 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language: \n" +"Language-Team: \n" +"Content-Type: \n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#: editor/plugins/Link/index +msgid "Add link" +msgstr "Aggiungi un link" + +#: widgets/HtmlSlateWidget +msgid "An error has occurred while editing \"{name}\" field. We have been notified and we are looking into it. Please save your work and retry. If the issue persists please contact the site administrator." +msgstr "E' occorso un errore durante la modifica del campo \"{name}\". Siamo stati notificati e stiamo indagando. Si prega di salvare il lavoro e riprovare. Se il problema persiste, contattare l'amministratore del sito." + +#: widgets/RichTextWidgetView +msgid "An error has occurred while rendering \"{name}\" field. We have been notified and we are looking into it. If the issue persists please contact the site administrator." +msgstr "E' occorso un errore durante il rendering del campo \"{name}\". Siamo stati notificati e stiamo indagando. Se il problema persiste, contattare l'amministratore del sito." + +#: blocks/Table/TableBlockEdit +msgid "Bottom" +msgstr "In basso" + +#: blocks/Table/TableBlockEdit +msgid "Center" +msgstr "Al centro" + +#: blocks/Table/TableBlockEdit +#: editor/plugins/Table/index +msgid "Delete col" +msgstr "Elimina colonna" + +#: blocks/Table/TableBlockEdit +#: editor/plugins/Table/index +msgid "Delete row" +msgstr "Elimina riga" + +#: editor/plugins/Table/index +msgid "Delete table" +msgstr "Elimina tabella" + +#: blocks/Table/TableBlockEdit +msgid "Divide each row into separate cells" +msgstr "Mostra i margini delle colonne" + +#: elementEditor/messages +msgid "Edit element" +msgstr "Modifica elemento" + +#: editor/plugins/AdvancedLink/index +#: editor/plugins/Link/index +msgid "Edit link" +msgstr "Modifica link" + +#: blocks/Table/TableBlockEdit +msgid "Fixed width table cells" +msgstr "Celle della tabella a larghezza fissa" + +#: blocks/Table/TableBlockEdit +msgid "Hide headers" +msgstr "Nascodi intestazioni" + +#: blocks/Table/TableBlockEdit +#: editor/plugins/Table/index +msgid "Insert col after" +msgstr "Inserisci una colonna dopo" + +#: blocks/Table/TableBlockEdit +#: editor/plugins/Table/index +msgid "Insert col before" +msgstr "Inserisci una colonna prima" + +#: blocks/Table/TableBlockEdit +#: editor/plugins/Table/index +msgid "Insert row after" +msgstr "Inserisci una riga dopo" + +#: blocks/Table/TableBlockEdit +#: editor/plugins/Table/index +msgid "Insert row before" +msgstr "Inserisci una riga prima" + +#: blocks/Table/TableBlockEdit +msgid "Left" +msgstr "A sinistra" + +#: blocks/Table/TableBlockEdit +msgid "Make the table compact" +msgstr "Rendi la tabella compatta" + +#: blocks/Table/TableBlockEdit +msgid "Make the table sortable" +msgstr "Rendi la tabella ordinabile" + +#: blocks/Table/TableBlockEdit +msgid "Middle" +msgstr "Al centro" + +#: blocks/Text/SlashMenu +msgid "No matching blocks" +msgstr "Nessun blocco corrispondente" + +#: blocks/Table/TableBlockEdit +msgid "Reduce complexity" +msgstr "Riduci complessita" + +#: elementEditor/messages +msgid "Remove element" +msgstr "Rimuovi elemento" + +#: editor/plugins/AdvancedLink/index +msgid "Remove link" +msgstr "Rimuovi link" + +#: blocks/Table/TableBlockEdit +msgid "Right" +msgstr "A destra" + +#: blocks/Table/TableBlockEdit +msgid "Stripe alternate rows with color" +msgstr "Evidezia le righe alternate con un colore" + +#: blocks/Table/TableBlockEdit +msgid "Table" +msgstr "Tabella" + +#: blocks/Table/TableBlockEdit +msgid "Table color inverted" +msgstr "Inverti i colori della tabella" + +#: blocks/Table/TableBlockEdit +msgid "Top" +msgstr "In alto" + +#: blocks/Text/DefaultTextBlockEditor +#: blocks/Text/DetachedTextBlockEditor +msgid "Type text…" +msgstr "Inserisci il testo…" + +#: blocks/Table/TableBlockEdit +msgid "Visible only in view mode" +msgstr "Visibile solo in modalità di visualizzazione" diff --git a/packages/volto-slate/news/6563.feature b/packages/volto-slate/news/6563.feature new file mode 100644 index 00000000000..121eff781fe --- /dev/null +++ b/packages/volto-slate/news/6563.feature @@ -0,0 +1 @@ +Added Italian translations. @giuliaghisini \ No newline at end of file diff --git a/packages/volto-slate/src/blocks/Table/schema.js b/packages/volto-slate/src/blocks/Table/schema.js index 94ab07a4db7..561f9df777a 100644 --- a/packages/volto-slate/src/blocks/Table/schema.js +++ b/packages/volto-slate/src/blocks/Table/schema.js @@ -37,12 +37,16 @@ const messages = defineMessages({ id: 'Stripe alternate rows with color', defaultMessage: 'Stripe alternate rows with color', }, + table_block: { + id: 'Table block', + defaultMessage: 'Table block', + }, }); function TableSchema(props) { const { intl } = props; return { - title: 'Table block', + title: intl.formatMessage(messages.table_block), fieldsets: [ { id: 'default', diff --git a/packages/volto/CHANGELOG.md b/packages/volto/CHANGELOG.md index 0db013fbbd8..4d4ce90838c 100644 --- a/packages/volto/CHANGELOG.md +++ b/packages/volto/CHANGELOG.md @@ -17,6 +17,39 @@ myst: +## 18.5.0 (2025-01-09) + +### Feature + +- Add component to show related items, which can be enabled using the `showRelatedItems` setting. @wesleybl [#3740](https://github.com/plone/volto/issues/3740) +- Added {file}sv/LC_MESSAGES/volto.poinlocales and updated{file}/volto/src/constants/Languages.js to include Swedish @TechSubham [#5957](https://github.com/plone/volto/issues/5957) + +### Bugfix + +- The depth field in the base search query of the search block was ignored, causing search results to include items beyond the specified depth level. Search results now respect the specified depth configuration. @TechSubham [#5856](https://github.com/plone/volto/issues/5856) +- No longer add classes from the query string search text in the `body` tag. @Abhishek-17h [#6493](https://github.com/plone/volto/issues/6493) +- Fixed folder contents issues with persistent selection across page changes. @pnicolli [#6554](https://github.com/plone/volto/issues/6554) +- Fix robots.txt in devmode @reebalazs [#6572](https://github.com/plone/volto/issues/6572) + +### Documentation + +- Fix redirecting links to Mozilla Developer Network's responsive images. @stevepiercy [#6552](https://github.com/plone/volto/issues/6552) +- Add Volto block examples in the documentation. @erral [#6560](https://github.com/plone/volto/issues/6560) + +## 18.4.0 (2024-12-17) + +### Feature + +- Added a setting in the `config` object to set the site's CSS layers, if required. @sneridagh [#6539](https://github.com/plone/volto/issues/6539) + +### Internal + +- Fixed and re-enabled the types declaration extractor from core Volto. @sneridagh [#6534](https://github.com/plone/volto/issues/6534) + +### Documentation + +- Add monorepo structure to the README. Update the monorepo structure file tree. @stevepiercy [#6542](https://github.com/plone/volto/issues/6542) + ## 18.3.0 (2024-12-12) ### Feature diff --git a/packages/volto/README.md b/packages/volto/README.md index 63877d3e468..edc11c888f8 100644 --- a/packages/volto/README.md +++ b/packages/volto/README.md @@ -36,6 +36,30 @@ You can build your own or choose from the community released ones: You can try a Volto online demo at [https://demo.plone.org/](https://demo.plone.org/). +## Monorepo structure + +Since version 18.0.0-alpha4, the Volto core repository has had the shape of a monorepo, where "mono" means "single" and "repo" is short for "repository". +This means that several apps and libraries related to each other are stored in the same repository. +They are managed together but released individually. +This allows the code to be shared effectively, and unifies tracking of changes across all of the apps and libraries. + +| Package | Location | +|---|---| +| [`@plone/client`](https://www.npmjs.com/package/@plone/client) | [`packages/client`](https://github.com/plone/volto/tree/main/packages/client#readme) | +| [`@plone/components`](https://www.npmjs.com/package/@plone/components) | [`packages/components`](https://github.com/plone/volto/tree/main/packages/components#readme) | +| [`@plone/generator-volto`](https://www.npmjs.com/package/@plone/generator-volto) | [`packages/generator-volto`](https://github.com/plone/volto/tree/main/packages/generator-volto#readme) | +| [`@plone/helpers`](https://www.npmjs.com/package/@plone/helpers) | [`packages/helpers`](https://github.com/plone/volto/tree/main/packages/helpers#readme) | +| [`@plone/providers`](https://www.npmjs.com/package/@plone/providers) | [`packages/providers`](https://github.com/plone/volto/tree/main/packages/providers#readme) | +| [`@plone/registry`](https://www.npmjs.com/package/@plone/registry) | [`packages/registry`](https://github.com/plone/volto/tree/main/packages/registry#readme) | +| [`@plone/scripts`](https://www.npmjs.com/package/@plone/scripts) | [`packages/scripts`](https://github.com/plone/volto/tree/main/packages/scripts#readme) | +| [`@plone/types`](https://www.npmjs.com/package/@plone/types) | [`packages/types`](https://github.com/plone/volto/tree/main/packages/types#readme) | +| none | [`packages/volto-guillotina`](https://github.com/plone/volto/tree/main/packages/volto-guillotina) | +| [`@plone/volto-slate`](https://www.npmjs.com/package/@plone/volto-slate) | [`packages/volto-slate`](https://github.com/plone/volto/tree/main/packages/volto-slate#readme) | +| [`@plone/volto-testing`](https://www.npmjs.com/package/@plone/volto-testing) | [`packages/volto-testing`](https://github.com/plone/volto/tree/main/packages/volto-testing) | + +See also [Monorepo structure](https://6.docs.plone.org/volto/contributing/developing-core.html#monorepo-structure). + + ## Create a Volto project To start a new project using Volto, follow the [Plone installation documentation](https://6.docs.plone.org/install/create-project.html). @@ -118,12 +142,12 @@ To ensure your website gets the greatest exposure, add it both to [Awesome Volto - [Debako Udala / Ayuntamiento de Deba](https://www.deba.eus/eu) (Website of the municipality of Deba, developed by [CodeSyntax](https://www.codesyntax.com/en), 2022) - [European Environment Agency](https://www.eea.europa.eu/en) (Website of the European Environment Agency. Developed by [Eau de Web](https://eaudeweb.ro), 2023) - [Energy Climate Union portal for Europe](https://climate-energy.eea.europa.eu/) (Thematic website focusing on European strides towards mitigating climate change, developed by [Eau de Web](https://eaudeweb.ro/), 2020) -- [Excellence at Humboldt-Universität zu Berlin](https://www.alles-beginnt-mit-einer-frage.de) (Website for the excellence initiative of the [Humboldt University Berlin](https://www.hu-berlin.de/de), developed by [kitconcept GmbH](https://kitconcept.com), 2019) +- [Excellence at Humboldt-Universität zu Berlin](https://www.alles-beginnt-mit-einer-frage.de) (Website for the excellence initiative of the [Humboldt University Berlin](https://www.hu-berlin.de/de), developed by [kitconcept GmbH](https://kitconcept.com/en), 2019) - [Forest Information System for Europe](https://forest.eea.europa.eu) (Thematic website focusing on European forests, developed by [Eau de Web](https://eaudeweb.ro/), 2019) -- [Forschungszentrum Jülich](https://www.fz-juelich.de/de) (Website for Forschungzentrum Jülich, which is one of the largest research institutions in Europe, developed by [kitconcept GmbH](https://kitconcept.com), 2022) -- [German Aerospace Center (DLR)](https://www.dlr.de/de) (The German Aerospace Center (DLR) is the Federal Republic of Germany's research center for aeronautics. With more than 10.000 employees and a yearly budget of more than 1 billion euros, it is one of the largest research institutions in Germany, developed by [kitconcept GmbH](https://kitconcept.com), 2023) -- [Helmholtz-Institut Erlangen-Nürnberg für Erneuerbare Energien (HI-ERN)](https://www.hi-ern.de/de) (Website for HI ERN, a research institution for renewable energies, developed by [kitconcept GmbH](https://kitconcept.com), 2022) -- [Humboldt Labor](https://www.humboldtforum.org/de/programm/dauerangebot/ausstellung/nach-der-natur-14144/) (The Humboldt Lab is a website where the Humboldt University Berlin presents its latest research projects and findings. Developed by [WLDX](https://wldx.de/) and [kitconcept GmbH](https://kitconcept.com), 2020) +- [Forschungszentrum Jülich](https://www.fz-juelich.de/de) (Website for Forschungzentrum Jülich, which is one of the largest research institutions in Europe, developed by [kitconcept GmbH](https://kitconcept.com/en), 2022) +- [German Aerospace Center (DLR)](https://www.dlr.de/de) (The German Aerospace Center (DLR) is the Federal Republic of Germany's research center for aeronautics. With more than 10.000 employees and a yearly budget of more than 1 billion euros, it is one of the largest research institutions in Germany, developed by [kitconcept GmbH](https://kitconcept.com/en), 2023) +- [Helmholtz-Institut Erlangen-Nürnberg für Erneuerbare Energien (HI-ERN)](https://www.hi-ern.de/de) (Website for HI ERN, a research institution for renewable energies, developed by [kitconcept GmbH](https://kitconcept.com/en), 2022) +- [Humboldt Labor](https://www.humboldtforum.org/de/programm/dauerangebot/ausstellung/nach-der-natur-14144/) (The Humboldt Lab is a website where the Humboldt University Berlin presents its latest research projects and findings. Developed by [WLDX](https://wldx.de/) and [kitconcept GmbH](https://kitconcept.com/en), 2020) - [ILPO](https://ilpo.jyu.fi/) (the registration portal of continuous learning at the University of Jyväskylä. Developed by University of Jyväskylä, 2022) - [Industrial Emissions portal for Europe](https://industry.eea.europa.eu) (Thematic website focusing on European industrial emissions, developed by [Eau de Web](https://eaudeweb.ro/), 2020) - [Jobfamilie MEDICE](https://jobfamilie.medice.de/de) (Carrer website for MEDICE Arzneimittel Pütter GmbH & Co. KG), developed by [Werkbank GmbH](https://werkbank.de/), 2020) @@ -135,13 +159,13 @@ To ensure your website gets the greatest exposure, add it both to [Awesome Volto - [ResOU](https://resou.osaka-u.ac.jp/ja) (ResOU is introducing official researched releases by the University of Osaka, Japan. Developed by [CMScom](https://www.cmscom.jp), 2020) - [Stradanove](https://www.stradanove.it/) (Website of the Department of Youth Policies of the Municipality of Modena, developed by [RedTurtle](https://www.redturtle.it), 2020) - [Study guide at University of Jyväskylä](https://studyguide.jyu.fi/2020/en/) (Static website where [Volto is used as a headless CMS for authoring additional content](https://tech.blog.jyu.fi/2020/06/plone-volto-hasura-gatsbyjs-mashup/), 2020) -- [Talke Carrer Website](https://karriere.talke.com/) (Carrer website for [Talke](https://www.talke.com), one of the leading a chemical and petrochemical logistics companies in Germany, developed by [kitconcept GmbH](https://kitconcept.com), 2020) +- [Talke Carrer Website](https://karriere.talke.com/) (Carrer website for [Talke](https://www.talke.com), one of the leading a chemical and petrochemical logistics companies in Germany, developed by [kitconcept GmbH](https://kitconcept.com/en), 2020) - [UEU](https://www.ueu.eus) (Website for Udako Euskal Unibertsitatea, a non-profit University offering all its service only in Basque: courses, publications, ... developed by [CodeSyntax](https://www.codesyntax.com/en), 2023) - [Unione dei Comuni della Val Bisenzio](https://www.bisenzio.it/) (Website of the Municipality union of Val Bisenzio. Developed by [RedTurtle](https://www.redturtle.it), 2021) -- [VHS Ehrenamtsportal](https://vhs-ehrenamtsportal.de) (Website to help volunteers that help refugees for the [German Adult Education Association](https://www.volkshochschule.de/), developed by [kitconcept GmbH](https://kitconcept.com), 2018) +- [VHS Ehrenamtsportal](https://vhs-ehrenamtsportal.de) (Website to help volunteers that help refugees for the [German Adult Education Association](https://www.volkshochschule.de/), developed by [kitconcept GmbH](https://kitconcept.com/en), 2018) - [VisitModena](https://www.visitmodena.it/it) (Tourist website of the Municipality of Modena, developed by [RedTurtle](https://www.redturtle.it), 2020) - [WISE-Freshwater](https://water.europa.eu/freshwater) (WISE-Freshwater, the Freshwater Information System for Europe. Developed by [Eau de web](https://eaudeweb.ro) for the European Environmental Agency, 2021) -- [Zeelandia](https://www.zeelandia.de/) (Corporate website for one of the leading bakery ingredients manufacturers in Germany, developed by [kitconcept GmbH](https://kitconcept.com), 2019) +- [Zeelandia](https://www.zeelandia.de/) (Corporate website for one of the leading bakery ingredients manufacturers in Germany, developed by [kitconcept GmbH](https://kitconcept.com/en), 2019) ### Open-source websites built with Volto diff --git a/packages/volto/locales/ca/LC_MESSAGES/volto.po b/packages/volto/locales/ca/LC_MESSAGES/volto.po index f004a71968f..3e7b0dfe67b 100644 --- a/packages/volto/locales/ca/LC_MESSAGES/volto.po +++ b/packages/volto/locales/ca/LC_MESSAGES/volto.po @@ -2872,6 +2872,11 @@ msgstr "Registrar-se" msgid "Registration form" msgstr "Formulari d'inscripció" +#. Default: "Related Items" +#: components/theme/RelatedItems/RelatedItems +msgid "Related Items" +msgstr "" + #. Default: "Relation" #: components/manage/Controlpanels/Relations/RelationsMatrix #: helpers/MessageLabels/MessageLabels diff --git a/packages/volto/locales/de/LC_MESSAGES/volto.po b/packages/volto/locales/de/LC_MESSAGES/volto.po index 688a7886f25..043109a013a 100644 --- a/packages/volto/locales/de/LC_MESSAGES/volto.po +++ b/packages/volto/locales/de/LC_MESSAGES/volto.po @@ -2871,6 +2871,11 @@ msgstr "Registrieren" msgid "Registration form" msgstr "Registrierungsformular" +#. Default: "Related Items" +#: components/theme/RelatedItems/RelatedItems +msgid "Related Items" +msgstr "" + #. Default: "Relation" #: components/manage/Controlpanels/Relations/RelationsMatrix #: helpers/MessageLabels/MessageLabels diff --git a/packages/volto/locales/en/LC_MESSAGES/volto.po b/packages/volto/locales/en/LC_MESSAGES/volto.po index 3ed645594cf..9ad7a604aaa 100644 --- a/packages/volto/locales/en/LC_MESSAGES/volto.po +++ b/packages/volto/locales/en/LC_MESSAGES/volto.po @@ -2866,6 +2866,11 @@ msgstr "" msgid "Registration form" msgstr "" +#. Default: "Related Items" +#: components/theme/RelatedItems/RelatedItems +msgid "Related Items" +msgstr "" + #. Default: "Relation" #: components/manage/Controlpanels/Relations/RelationsMatrix #: helpers/MessageLabels/MessageLabels diff --git a/packages/volto/locales/es/LC_MESSAGES/volto.po b/packages/volto/locales/es/LC_MESSAGES/volto.po index 095307a2a05..ff5b8c2299c 100644 --- a/packages/volto/locales/es/LC_MESSAGES/volto.po +++ b/packages/volto/locales/es/LC_MESSAGES/volto.po @@ -2873,6 +2873,11 @@ msgstr "Registro" msgid "Registration form" msgstr "Formulario de registro" +#. Default: "Related Items" +#: components/theme/RelatedItems/RelatedItems +msgid "Related Items" +msgstr "" + #. Default: "Relation" #: components/manage/Controlpanels/Relations/RelationsMatrix #: helpers/MessageLabels/MessageLabels diff --git a/packages/volto/locales/eu/LC_MESSAGES/volto.po b/packages/volto/locales/eu/LC_MESSAGES/volto.po index a67988bc0ce..aa260e34fa6 100644 --- a/packages/volto/locales/eu/LC_MESSAGES/volto.po +++ b/packages/volto/locales/eu/LC_MESSAGES/volto.po @@ -2873,6 +2873,11 @@ msgstr "Izena eman" msgid "Registration form" msgstr "Erregistro formularioa" +#. Default: "Related Items" +#: components/theme/RelatedItems/RelatedItems +msgid "Related Items" +msgstr "" + #. Default: "Relation" #: components/manage/Controlpanels/Relations/RelationsMatrix #: helpers/MessageLabels/MessageLabels diff --git a/packages/volto/locales/fi/LC_MESSAGES/volto.po b/packages/volto/locales/fi/LC_MESSAGES/volto.po index 595f3076a27..99c1f6ff046 100644 --- a/packages/volto/locales/fi/LC_MESSAGES/volto.po +++ b/packages/volto/locales/fi/LC_MESSAGES/volto.po @@ -2871,6 +2871,11 @@ msgstr "Rekisteröidy" msgid "Registration form" msgstr "Rekisteröitymislomake" +#. Default: "Related Items" +#: components/theme/RelatedItems/RelatedItems +msgid "Related Items" +msgstr "" + #. Default: "Relation" #: components/manage/Controlpanels/Relations/RelationsMatrix #: helpers/MessageLabels/MessageLabels diff --git a/packages/volto/locales/fr/LC_MESSAGES/volto.po b/packages/volto/locales/fr/LC_MESSAGES/volto.po index ebc33cfdece..120eda4ebef 100644 --- a/packages/volto/locales/fr/LC_MESSAGES/volto.po +++ b/packages/volto/locales/fr/LC_MESSAGES/volto.po @@ -2873,6 +2873,11 @@ msgstr "S'enregistrer" msgid "Registration form" msgstr "Formulaire d'enregistrement" +#. Default: "Related Items" +#: components/theme/RelatedItems/RelatedItems +msgid "Related Items" +msgstr "" + #. Default: "Relation" #: components/manage/Controlpanels/Relations/RelationsMatrix #: helpers/MessageLabels/MessageLabels diff --git a/packages/volto/locales/hi/LC_MESSAGES/volto.po b/packages/volto/locales/hi/LC_MESSAGES/volto.po index 3a381829f04..02196516423 100644 --- a/packages/volto/locales/hi/LC_MESSAGES/volto.po +++ b/packages/volto/locales/hi/LC_MESSAGES/volto.po @@ -2866,6 +2866,11 @@ msgstr "रजिस्टर करें" msgid "Registration form" msgstr "रजिस्ट्रेशन फ़ॉर्म" +#. Default: "Related Items" +#: components/theme/RelatedItems/RelatedItems +msgid "Related Items" +msgstr "" + #. Default: "Relation" #: components/manage/Controlpanels/Relations/RelationsMatrix #: helpers/MessageLabels/MessageLabels diff --git a/packages/volto/locales/it/LC_MESSAGES/volto.po b/packages/volto/locales/it/LC_MESSAGES/volto.po index d5ae249f684..6cccb3d46be 100644 --- a/packages/volto/locales/it/LC_MESSAGES/volto.po +++ b/packages/volto/locales/it/LC_MESSAGES/volto.po @@ -2866,6 +2866,11 @@ msgstr "Registrati" msgid "Registration form" msgstr "Form di iscrizione" +#. Default: "Related Items" +#: components/theme/RelatedItems/RelatedItems +msgid "Related Items" +msgstr "" + #. Default: "Relation" #: components/manage/Controlpanels/Relations/RelationsMatrix #: helpers/MessageLabels/MessageLabels diff --git a/packages/volto/locales/ja/LC_MESSAGES/volto.po b/packages/volto/locales/ja/LC_MESSAGES/volto.po index 6d51320e2d2..e4c74c3188a 100644 --- a/packages/volto/locales/ja/LC_MESSAGES/volto.po +++ b/packages/volto/locales/ja/LC_MESSAGES/volto.po @@ -2871,6 +2871,11 @@ msgstr "登録" msgid "Registration form" msgstr "登録フォーム" +#. Default: "Related Items" +#: components/theme/RelatedItems/RelatedItems +msgid "Related Items" +msgstr "" + #. Default: "Relation" #: components/manage/Controlpanels/Relations/RelationsMatrix #: helpers/MessageLabels/MessageLabels diff --git a/packages/volto/locales/nl/LC_MESSAGES/volto.po b/packages/volto/locales/nl/LC_MESSAGES/volto.po index 2b038800b5c..281135a55c6 100644 --- a/packages/volto/locales/nl/LC_MESSAGES/volto.po +++ b/packages/volto/locales/nl/LC_MESSAGES/volto.po @@ -2870,6 +2870,11 @@ msgstr "Registreer" msgid "Registration form" msgstr "Registratie formulier" +#. Default: "Related Items" +#: components/theme/RelatedItems/RelatedItems +msgid "Related Items" +msgstr "" + #. Default: "Relation" #: components/manage/Controlpanels/Relations/RelationsMatrix #: helpers/MessageLabels/MessageLabels diff --git a/packages/volto/locales/pt/LC_MESSAGES/volto.po b/packages/volto/locales/pt/LC_MESSAGES/volto.po index 61736fb8a39..8f4040495a1 100644 --- a/packages/volto/locales/pt/LC_MESSAGES/volto.po +++ b/packages/volto/locales/pt/LC_MESSAGES/volto.po @@ -2871,6 +2871,11 @@ msgstr "Registar" msgid "Registration form" msgstr "Formulário de registo" +#. Default: "Related Items" +#: components/theme/RelatedItems/RelatedItems +msgid "Related Items" +msgstr "" + #. Default: "Relation" #: components/manage/Controlpanels/Relations/RelationsMatrix #: helpers/MessageLabels/MessageLabels diff --git a/packages/volto/locales/pt_BR/LC_MESSAGES/volto.po b/packages/volto/locales/pt_BR/LC_MESSAGES/volto.po index aa504377c56..76a25c310ca 100644 --- a/packages/volto/locales/pt_BR/LC_MESSAGES/volto.po +++ b/packages/volto/locales/pt_BR/LC_MESSAGES/volto.po @@ -2872,6 +2872,11 @@ msgstr "Cadastro" msgid "Registration form" msgstr "Formulário de cadastro" +#. Default: "Related Items" +#: components/theme/RelatedItems/RelatedItems +msgid "Related Items" +msgstr "Itens relacionados" + #. Default: "Relation" #: components/manage/Controlpanels/Relations/RelationsMatrix #: helpers/MessageLabels/MessageLabels diff --git a/packages/volto/locales/ro/LC_MESSAGES/volto.po b/packages/volto/locales/ro/LC_MESSAGES/volto.po index 58314bb4613..9199570724a 100644 --- a/packages/volto/locales/ro/LC_MESSAGES/volto.po +++ b/packages/volto/locales/ro/LC_MESSAGES/volto.po @@ -2872,6 +2872,11 @@ msgstr "Înregistrare" msgid "Registration form" msgstr "Formular de înregistrare" +#. Default: "Related Items" +#: components/theme/RelatedItems/RelatedItems +msgid "Related Items" +msgstr "" + #. Default: "Relation" #: components/manage/Controlpanels/Relations/RelationsMatrix #: helpers/MessageLabels/MessageLabels diff --git a/packages/volto/locales/sv/LC_MESSAGES/volto.po b/packages/volto/locales/sv/LC_MESSAGES/volto.po new file mode 100644 index 00000000000..ed8e565172f --- /dev/null +++ b/packages/volto/locales/sv/LC_MESSAGES/volto.po @@ -0,0 +1,5193 @@ +msgid "" +msgstr "" +"Project-Id-Version: Plone\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-02-23T10:42:17.489Z\n" +"PO-Revision-Date: 2024-04-14 17:50+0200\n" +"Last-Translator: Andreas Jonsson \n" +"Language: Swedish\n" +"Language-Team: Plone i18n \n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"MIME-Version: 1.0\n" +"Language-Code: sv\n" +"Language-Name: Svenska\n" +"Preferred-Encodings: utf-8\n" +"Domain: volto\n" +"X-Is-Fallback-For: sv-fi sv-se\n" + +#. Default: "

Add some HTML here

" +#: components/manage/Blocks/HTML/Edit +msgid "

Add some HTML here

" +msgstr "

Lägg till HTML här

" + +#. Default: "Account Registration Completed" +#: components/theme/Register/Register +msgid "Account Registration Completed" +msgstr "Kontoregistrering färdigställd" + +#. Default: "Account activation completed" +#: components/theme/PasswordReset/PasswordReset +msgid "Account activation completed" +msgstr "Kontoaktivering färdiställd" + +#. Default: "Action" +#: components/manage/Controlpanels/ModerateComments +msgid "Action" +msgstr "Åtgärd" + +#. Default: "Action changed" +#: components/manage/Controlpanels/Rules/ConfigureRule +msgid "Action changed" +msgstr "Åtgärd ändrad" + +#. Default: "Action:" +#: components/manage/Controlpanels/Rules/ConfigureRule +msgid "Action: " +msgstr "Åtgärd: " + +#. Default: "Actions" +#: components/manage/Actions/Actions +#: components/manage/Contents/Contents +#: components/manage/Controlpanels/ContentTypes +#: components/manage/Controlpanels/Groups/GroupsControlpanel +#: components/manage/Controlpanels/Rules/Rules +#: components/manage/Controlpanels/Users/UsersControlpanel +msgid "Actions" +msgstr "Åtgärder" + +#. Default: "Activate and deactivate add-ons in the lists below." +#: components/manage/Controlpanels/AddonsControlpanel +msgid "Activate and deactivate" +msgstr "Aktivera och avaktivera" + +#. Default: "Active" +#: components/manage/Rules/Rules +msgid "Active" +msgstr "Aktiv" + +#. Default: "Active content rules in this Page" +#: components/manage/Rules/Rules +msgid "Active content rules in this Page" +msgstr "Aktiva innehållsregler på denna sida" + +#. Default: "Add" +#: components/manage/Aliases/Aliases +#: components/manage/Controlpanels/ContentTypes +#: components/manage/Controlpanels/Rules/ConfigureRule +#: components/manage/Rules/Rules +#: components/manage/Toolbar/Toolbar +#: components/manage/Widgets/SchemaWidget +#: helpers/MessageLabels/MessageLabels +msgid "Add" +msgstr "Lägg till" + +#. Default: "Add" +#: components/manage/Widgets/ObjectListWidget +msgid "Add (object list)" +msgstr "Lägg till (objektlista)" + +#. Default: "To make new add-ons show up here, add them to your configuration, build, and restart the server process. For detailed instructions see" +#: components/manage/Controlpanels/AddonsControlpanel +msgid "Add Addons" +msgstr "Lägg till tillägsfunktioner" + +#. Default: "Add Alternative URL" +#: components/manage/Controlpanels/Aliases +msgid "Add Alternative URL" +msgstr "" + +#. Default: "Add Content…" +#: components/manage/Toolbar/Types +msgid "Add Content" +msgstr "Lägg till innehåll" + +#. Default: "Add Content Rule" +#: components/manage/Controlpanels/Rules/AddRule +msgid "Add Content Rule" +msgstr "Lägg till innehållsregel" + +#. Default: "Add Rule" +#: components/manage/Controlpanels/Rules/AddRule +msgid "Add Rule" +msgstr "Lägg till regel" + +#. Default: "Add Translation…" +#: components/manage/Toolbar/Types +msgid "Add Translation…" +msgstr "Lägg till översättning…" + +#. Default: "Add User" +#: helpers/MessageLabels/MessageLabels +msgid "Add User" +msgstr "Lägg till användare" + +#. Default: "Add a description…" +#: components/manage/Blocks/Description/Edit +msgid "Add a description…" +msgstr "Lägg till beskrivning…" + +#. Default: "Add a new alternative url" +#: components/manage/Aliases/Aliases +msgid "Add a new alternative url" +msgstr "Lägg till alternativ url" + +#. Default: "Action added" +#: components/manage/Controlpanels/Rules/ConfigureRule +msgid "Add action" +msgstr "Åtgärd tillagd" + +#. Default: "Add block" +#: components/manage/BlockChooser/BlockChooserButton +msgid "Add block" +msgstr "Lägg till block" + +#. Default: "Add block in position {index}" +#: components/manage/Blocks/Container/NewBlockAddButton +msgid "Add block in position {index}" +msgstr "" + +#. Default: "Add block…" +#: helpers/MessageLabels/MessageLabels +msgid "Add block…" +msgstr "Lägg till block…" + +#. Default: "Condition added" +#: components/manage/Controlpanels/Rules/ConfigureRule +msgid "Add condition" +msgstr "Lägg till villkor" + +#. Default: "Add content rule" +#: components/manage/Controlpanels/Rules/Rules +msgid "Add content rule" +msgstr "Lägg till innehållsregel" + +#. Default: "Add criteria" +#: components/manage/Widgets/QueryWidget +msgid "Add criteria" +msgstr "Lägg till kriterium" + +#. Default: "Add date" +#: components/manage/Widgets/RecurrenceWidget/RecurrenceWidget +msgid "Add date" +msgstr "Lägg till datum" + +#. Default: "Add element to container" +#: components/manage/Blocks/Container/SimpleContainerToolbar +msgid "Add element to container" +msgstr "" + +#. Default: "Add field" +#: components/manage/Widgets/SchemaWidget +msgid "Add field" +msgstr "Lägg till fält" + +#. Default: "Add fieldset" +#: components/manage/Widgets/SchemaWidget +msgid "Add fieldset" +msgstr "Lägg till fältgrupp" + +#. Default: "Add group" +#: helpers/MessageLabels/MessageLabels +msgid "Add group" +msgstr "Lägg till grupp" + +#. Default: "Add new content type" +#: components/manage/Controlpanels/ContentTypes +msgid "Add new content type" +msgstr "Lägg till ny innehållstyp" + +#. Default: "Add new group" +#: helpers/MessageLabels/MessageLabels +msgid "Add new group" +msgstr "Lägg till ny grupp" + +#. Default: "Add new user" +#: helpers/MessageLabels/MessageLabels +msgid "Add new user" +msgstr "Lägg till ny användare" + +#. Default: "Add to Groups" +#: helpers/MessageLabels/MessageLabels +msgid "Add to Groups" +msgstr "Lägg till grupper" + +#. Default: "Add users to group" +#: helpers/MessageLabels/MessageLabels +msgid "Add users to group" +msgstr "Lägg till användare till grupp" + +#. Default: "Add term" +#: components/manage/Widgets/VocabularyTermsWidget +msgid "Add vocabulary term" +msgstr "Lägg till vokabulärterm" + +#. Default: "Add {type}" +#: components/manage/Add/Add +msgid "Add {type}" +msgstr "Lägg till {type}" + +#. Default: "Add-Ons" +#: components/manage/Controlpanels/Controlpanels +msgid "Add-Ons" +msgstr "Tillägg" + +#. Default: "Add-on Configuration" +#: components/manage/Controlpanels/Controlpanels +msgid "Add-on Configuration" +msgstr "Tilläggskonfiguration" + +#. Default: "Add-ons" +#: components/manage/Controlpanels/AddonsControlpanel +msgid "Add-ons" +msgstr "Tillägg" + +#. Default: "Add-ons Settings" +#: components/manage/Controlpanels/AddonsControlpanel +msgid "Add-ons Settings" +msgstr "Tilläggsinställningar" + +#. Default: "Added" +#: components/manage/Rules/Rules +msgid "Added" +msgstr "Lade till" + +#. Default: "Additional date" +#: components/manage/Widgets/RecurrenceWidget/Occurences +msgid "Additional date" +msgstr "Ytterligare datum" + +#. Default: "Addon could not be installed" +#: components/manage/Controlpanels/AddonsControlpanel +msgid "Addon could not be installed" +msgstr "Tillägg kunde ej installeras" + +#. Default: "Addon could not be uninstalled" +#: components/manage/Controlpanels/AddonsControlpanel +msgid "Addon could not be uninstalled" +msgstr "Tillägg kunde ej avinstalleras" + +#. Default: "Addon could not be upgraded" +#: components/manage/Controlpanels/AddonsControlpanel +msgid "Addon could not be upgraded" +msgstr "Tillägg kunde inte uppgraderas" + +#. Default: "Addon installed succesfuly" +#: components/manage/Controlpanels/AddonsControlpanel +msgid "Addon installed succesfuly" +msgstr "Lyckades installera tillägg" + +#. Default: "Addon uninstalled succesfuly" +#: components/manage/Controlpanels/AddonsControlpanel +msgid "Addon uninstalled succesfuly" +msgstr "Lyckades avinstallera tillägg" + +#. Default: "Addon upgraded succesfuly" +#: components/manage/Controlpanels/AddonsControlpanel +msgid "Addon upgraded succesfuly" +msgstr "Lyckades uppgradera tillägg" + +#. Default: "Advanced facet?" +#: components/manage/Blocks/Search/schema +msgid "Advanced facet?" +msgstr "" + +#. Default: "Advanced facets are initially hidden and displayed on demand" +#: components/manage/Blocks/Search/schema +msgid "Advanced facets are initially hidden and displayed on demand" +msgstr "" + +#. Default: "Album view" +#: config/Views +msgid "Album view" +msgstr "Albumvy" + +#. Default: "Alias" +#: components/manage/Controlpanels/Aliases +msgid "Alias" +msgstr "Alias" + +#. Default: "Alias has been added" +#: components/manage/Aliases/Aliases +#: components/manage/Controlpanels/Aliases +msgid "Alias has been added" +msgstr "Aliaset har lagts till" + +#. Default: "Aliases have been removed." +#: components/manage/Controlpanels/Aliases +msgid "Aliases have been removed." +msgstr "" + +#. Default: "Aliases have been uploaded." +#: components/manage/Controlpanels/Aliases +msgid "Aliases have been uploaded." +msgstr "" + +#. Default: "Alignment" +#: components/manage/Blocks/Image/schema +#: components/manage/Blocks/LeadImage/LeadImageSidebar +#: components/manage/Blocks/Maps/schema +#: components/manage/Blocks/Teaser/schema +#: components/manage/Blocks/Video/schema +msgid "Alignment" +msgstr "Placering" + +#. Default: "All" +#: components/manage/Contents/Contents +msgid "All" +msgstr "Allihop" + +#. Default: "All content" +#: config/Views +msgid "All content" +msgstr "Allt innehåll" + +#. Default: "Existing alternative URLs for this site" +#: components/manage/Controlpanels/Aliases +msgid "All existing alternative urls for this site" +msgstr "Alla existerande alternativa url:er för denna webbplats" + +#. Default: "Alphabetically" +#: components/theme/Search/Search +msgid "Alphabetically" +msgstr "Alfabetisk" + +#. Default: "Alt text" +#: components/manage/Blocks/Image/schema +#: components/manage/Blocks/LeadImage/LeadImageSidebar +#: components/manage/Blocks/Maps/schema +msgid "Alt text" +msgstr "Alt-text" + +#. Default: "Leave empty if the image is purely decorative." +#: components/manage/Blocks/Image/schema +msgid "Alt text hint" +msgstr "Lämna tom om bilden endast är dekorativ." + +#. Default: "Describe the purpose of the image." +#: components/manage/Blocks/Image/schema +msgid "Alt text hint link text" +msgstr "Beskriv bildens syfte." + +#. Default: "Alternative URL path (Required)" +#: components/manage/Controlpanels/Aliases +msgid "Alternative url path (Required)" +msgstr "Alternativ url-sökväg (Obligatorisk)" + +#. Default: "Alternative url path must start with a slash." +#: components/manage/Aliases/Aliases +#: components/manage/Controlpanels/Aliases +msgid "Alternative url path must start with a slash." +msgstr "Alternativa urlsökvägar måste inledas med snedstreck (/)." + +#. Default: "Alternative URL path → target URL path (date and time of creation, manually created yes/no)" +#: components/manage/Controlpanels/Aliases +msgid "Alternative url path → target url path (date and time of creation, manually created yes/no)" +msgstr "Alternativ url-sökväg → målurl-sökväg (datum och tid för skapande, manellt skapad ja/nej)" + +#. Default: "Applied to subfolders" +#: components/manage/Rules/Rules +msgid "Applied to subfolders" +msgstr "Appliceras på undermappar" + +#. Default: "Applies to subfolders?" +#: components/manage/Rules/Rules +msgid "Applies to subfolders?" +msgstr "Aliceras på undermappar?" + +#. Default: "Apply to subfolders" +#: components/manage/Rules/Rules +msgid "Apply to subfolders" +msgstr "Applicera på undermappar" + +#. Default: "Apply working copy" +#: components/manage/Toolbar/More +msgid "Apply working copy" +msgstr "Applicera arbetskopia" + +#. Default: "Are you sure you want to delete this field?" +#: components/manage/Widgets/SchemaWidget +msgid "Are you sure you want to delete this field?" +msgstr "Är du säker på att du vill radera det här fältet?" + +#. Default: "Are you sure you want to delete this fieldset including all fields?" +#: components/manage/Widgets/SchemaWidget +msgid "Are you sure you want to delete this fieldset including all fields?" +msgstr "Är du säker på att du vill radera den här fältgruppen inklusive alla fält?" + +#. Default: "Ascending" +#: components/manage/Blocks/Search/components/SortOn +#: components/manage/Contents/Contents +msgid "Ascending" +msgstr "Stigande" + +#. Default: "Assign the {role} role to {entry}" +#: components/manage/Sharing/Sharing +msgid "Assign the {role} role to {entry}" +msgstr "" + +#. Default: "Assignments" +#: components/manage/Controlpanels/Rules/ConfigureRule +msgid "Assignments" +msgstr "Uppgifter" + +#. Default: "Automatically" +#: components/manage/Controlpanels/Aliases +msgid "Automatically" +msgstr "" + +#. Default: "Available" +#: components/manage/Controlpanels/AddonsControlpanel +msgid "Available" +msgstr "Tillgänglig" + +#. Default: "Available content rules:" +#: components/manage/Rules/Rules +msgid "Available content rules:" +msgstr "Tillgängliga innehållsregler" + +#. Default: "Back" +#: components/manage/Aliases/Aliases +#: components/manage/Contents/Contents +#: components/manage/Controlpanels/AddonsControlpanel +#: components/manage/Controlpanels/Aliases +#: components/manage/Controlpanels/ContentType +#: components/manage/Controlpanels/ContentTypeLayout +#: components/manage/Controlpanels/ContentTypes +#: components/manage/Controlpanels/Controlpanel +#: components/manage/Controlpanels/Controlpanels +#: components/manage/Controlpanels/DatabaseInformation +#: components/manage/Controlpanels/ModerateComments +#: components/manage/Controlpanels/Rules/AddRule +#: components/manage/Controlpanels/Rules/ConfigureRule +#: components/manage/Controlpanels/Rules/EditRule +#: components/manage/Controlpanels/Rules/Rules +#: components/manage/Controlpanels/UndoControlpanel +#: components/manage/Controlpanels/UpgradeControlPanel +#: components/manage/Diff/Diff +#: components/manage/History/History +#: components/manage/LinksToItem/LinksToItem +#: components/manage/Multilingual/ManageTranslations +#: components/manage/Preferences/ChangePassword +#: components/manage/Preferences/PersonalPreferences +#: components/manage/Rules/Rules +#: components/manage/Sharing/Sharing +#: components/manage/Sidebar/ObjectBrowserBody +#: components/manage/Toolbar/PersonalTools +#: components/manage/Toolbar/Toolbar +#: components/theme/ContactForm/ContactForm +#: helpers/MessageLabels/MessageLabels +msgid "Back" +msgstr "Tillbaka" + +#. Default: "Base" +#: components/manage/Diff/Diff +msgid "Base" +msgstr "Bas" + +#. Default: "Base search query" +#: components/manage/Blocks/Search/schema +msgid "Base search query" +msgstr "Bassökfråga" + +#. Default: "Block" +#: components/manage/Sidebar/Sidebar +msgid "Block" +msgstr "Block" + +#. Default: "Both" +#: components/manage/Controlpanels/Aliases +msgid "Both" +msgstr "" + +#. Default: "Both email address and password are case sensitive, check that caps lock is not enabled." +#: components/theme/Login/Login +msgid "Both email address and password are case sensitive, check that caps lock is not enabled." +msgstr "Både epostadress och lösenord är känsliga för stor och liten bokstav. Kontrollera att caps-lock inte är aktiverad." + +#. Default: "Breadcrumbs" +#: components/theme/Breadcrumbs/Breadcrumbs +msgid "Breadcrumbs" +msgstr "Brödsmulor" + +#. Default: "Broken relations" +#: components/manage/Controlpanels/Relations/BrokenRelations +msgid "Broken relations" +msgstr "" + +#. Default: "Browse" +#: components/manage/Contents/ContentsUploadModal +#: components/manage/Sidebar/ObjectBrowserNav +msgid "Browse" +msgstr "Bläddra" + +#. Default: "Browse the site, drop an image, or use a URL" +#: components/manage/Widgets/ImageWidget +msgid "Browse the site, drop an image, or type a URL" +msgstr "" + +#. Default: "Bulk upload CSV" +#: components/manage/Controlpanels/Aliases +msgid "BulkUploadAltUrls" +msgstr "" + +#. Default: "By default, permissions from the container of this item are inherited. If you disable this, only the explicitly defined sharing permissions will be valid. In the overview, the symbol {inherited} indicates an inherited value. Similarly, the symbol {global} indicates a global role, which is managed by the site administrator." +#: components/manage/Sharing/Sharing +msgid "By default, permissions from the container of this item are inherited. If you disable this, only the explicitly defined sharing permissions will be valid. In the overview, the symbol {inherited} indicates an inherited value. Similarly, the symbol {global} indicates a global role, which is managed by the site administrator." +msgstr "Om inget annat anges ärvs accessreglerna för detta objekt från containern. Om du avaktiverar detta kommer endast utryckligen angivna accessregler för delning att vara giltiga. I översikten indikerar symbolen {inherited} att accessregeln är ärvd. Symbolen {global} indikerar en global roll som styrs av webblatsens adminstratör." + +#. Default: "CSV file" +#: components/manage/Controlpanels/Aliases +msgid "CSVFile" +msgstr "" + +#. Default: "Cache Name" +#: components/manage/Controlpanels/DatabaseInformation +msgid "Cache Name" +msgstr "Namn på cache" + +#. Default: "Can not edit Layout for {type} content-type as it doesn't have support for Volto Blocks enabled" +#: components/manage/Controlpanels/ContentTypeLayout +msgid "Can not edit Layout for {type} content-type as it doesn't have support for Volto Blocks enabled" +msgstr "Kan ej redigera layout för innehållstypen {type} eftersom den ej har stöd för Volto-block." + +#. Default: "Can not edit Layout for {type} content-type as the Blocks behavior is enabled and read-only" +#: components/manage/Controlpanels/ContentTypeLayout +msgid "Can not edit Layout for {type} content-type as the Blocks behavior is enabled and read-only" +msgstr "Kan ej redigera layout för innehållstypen {type} för blockets beteende är aktiverat och i endast läsläge" + +#. Default: "Cancel" +#: components/manage/Add/Add +#: components/manage/Contents/ContentsDeleteModal +#: components/manage/Contents/ContentsUploadModal +#: components/manage/Controlpanels/ContentType +#: components/manage/Controlpanels/ContentTypeLayout +#: components/manage/Controlpanels/ContentTypeSchema +#: components/manage/Controlpanels/Controlpanel +#: components/manage/Controlpanels/Rules/AddRule +#: components/manage/Controlpanels/Rules/EditRule +#: components/manage/Delete/Delete +#: components/manage/Edit/Edit +#: components/manage/Form/ModalForm +#: components/manage/Sharing/Sharing +#: components/theme/Login/Login +#: helpers/MessageLabels/MessageLabels +msgid "Cancel" +msgstr "Avbryt" + +#. Default: "Cell" +#: config/Blocks +msgid "Cell" +msgstr "Cell" + +#. Default: "Center" +#: components/manage/Blocks/Maps/Edit +#: components/manage/Sidebar/AlignBlock +#: components/manage/Widgets/AlignWidget +msgid "Center" +msgstr "Centrerad" + +#. Default: "Change Note" +#: components/manage/History/History +msgid "Change Note" +msgstr "Ändringsmeddelande" + +#. Default: "Change Password" +#: components/manage/Preferences/ChangePassword +msgid "Change Password" +msgstr "Ändra lösenord" + +#. Default: "Change State" +#: components/manage/Contents/ContentsWorkflowModal +msgid "Change State" +msgstr "Ändra tillstånd" + +#. Default: "Change workflow state recursively" +#: components/manage/Contents/ContentsWorkflowModal +msgid "Change workflow state recursively" +msgstr "Ändra arbetsflödets tillstånd rekursivt" + +#. Default: "Changes applied" +#: components/manage/Toolbar/More +msgid "Changes applied." +msgstr "Ändringar applicerade." + +#. Default: "Changes saved" +#: components/manage/Preferences/ChangePassword +#: components/manage/Preferences/PersonalPreferences +msgid "Changes saved" +msgstr "Ändringar sparade" + +#. Default: "Changes saved." +#: components/manage/Controlpanels/ContentType +#: components/manage/Controlpanels/ContentTypeLayout +#: components/manage/Controlpanels/ContentTypeSchema +#: components/manage/Controlpanels/Controlpanel +msgid "Changes saved." +msgstr "Ändringar sparade." + +#. Default: "Check this box to customize the title, description, or image of the target content item for this teaser. Leave it unchecked to show updates to the target content item if it is edited later." +#: components/manage/Blocks/Teaser/schema +msgid "Check this box to customize the title, description, or image of the target content item for this teaser. Leave it unchecked to show updates to the target content item if it is edited later." +msgstr "" + +#. Default: "Checkbox" +#: components/manage/Widgets/SchemaWidget +msgid "Checkbox" +msgstr "Kryssruta" + +#. Default: "Choices" +#: components/manage/Widgets/SelectWidget +msgid "Choices" +msgstr "Alternativ" + +#. Default: "Choose Image" +#: components/manage/Sidebar/ObjectBrowserBody +msgid "Choose Image" +msgstr "Välj bild" + +#. Default: "Choose Target" +#: components/manage/Sidebar/ObjectBrowserBody +msgid "Choose Target" +msgstr "Välj mål" + +#. Default: "Choose a file" +#: components/manage/Widgets/FileWidget +#: components/manage/Widgets/RegistryImageWidget +msgid "Choose a file" +msgstr "Välj en fil" + +#. Default: "Clear" +#: components/manage/AnchorPlugin/components/LinkButton/AddLinkForm +#: components/manage/Blocks/HTML/Edit +msgid "Clear" +msgstr "Rensa" + +#. Default: "Clear filters" +#: components/manage/Blocks/Search/components/FilterList +msgid "Clear filters" +msgstr "Rensa filter" + +#. Default: "Clear search" +#: components/manage/BlockChooser/BlockChooserSearch +msgid "Clear search" +msgstr "" + +#. Default: "Click to download full sized image" +#: components/theme/View/ImageView +msgid "Click to download full sized image" +msgstr "Klicka för att hämta bild i full storlek" + +#. Default: "Close" +#: components/manage/Widgets/SelectWidget +msgid "Close" +msgstr "Stäng" + +#. Default: "Close menu" +#: components/theme/Navigation/Navigation +msgid "Close menu" +msgstr "Stäng meny" + +#. Default: "Code" +#: components/manage/Blocks/HTML/Edit +msgid "Code" +msgstr "Kod" + +#. Default: "Collapse item" +#: components/manage/Widgets/ObjectListWidget +msgid "Collapse item" +msgstr "Fäll ihop objekt" + +#. Default: "Collection" +#: components/manage/Toolbar/Toolbar +msgid "Collection" +msgstr "Samling" + +#. Default: "Color" +#: components/manage/Widgets/ColorPickerWidget +msgid "Color" +msgstr "Färg" + +#. Default: "Comment" +#: components/manage/Controlpanels/ModerateComments +#: components/theme/Comments/CommentEditModal +#: components/theme/Comments/Comments +msgid "Comment" +msgstr "Kommentar" + +#. Default: "Commenter" +#: components/manage/Controlpanels/ModerateComments +msgid "Commenter" +msgstr "Kommentator" + +#. Default: "Comments" +#: components/theme/Comments/Comments +msgid "Comments" +msgstr "Kommentarer" + +#. Default: "Compare" +#: components/manage/Diff/Diff +msgid "Compare" +msgstr "Jämför" + +#. Default: "Condition changed" +#: components/manage/Controlpanels/Rules/ConfigureRule +msgid "Condition changed" +msgstr "Villkor ändrat" + +#. Default: "Condition:" +#: components/manage/Controlpanels/Rules/ConfigureRule +msgid "Condition: " +msgstr "Villkor: " + +#. Default: "Configuration Versions" +#: components/manage/Controlpanels/UpgradeControlPanel +msgid "Configuration Versions" +msgstr "Konfigurationsversioner" + +#. Default: "Configure Content Rule" +#: components/manage/Controlpanels/Rules/EditRule +msgid "Configure Content Rule" +msgstr "Konfigurera innehållsregel" + +#. Default: "Configure Content Rule: {title}" +#: components/manage/Controlpanels/Rules/ConfigureRule +msgid "Configure Content Rule: {title}" +msgstr "Konfigurera innehålldregel: {title}" + +#. Default: "Configure content rule" +#: components/manage/Controlpanels/Rules/ConfigureRule +msgid "Configure content rule" +msgstr "Konfigurera innehållsregel" + +#. Default: "Confirm password" +#: components/manage/Preferences/ChangePassword +#: components/theme/PasswordReset/PasswordReset +msgid "Confirm password" +msgstr "Bekräfta lösenord" + +#. Default: "Connection refused" +#: components/theme/ConnectionRefused/ConnectionRefused +msgid "Connection refused" +msgstr "Förbindelse vägrad" + +#. Default: "Contact form" +#: components/theme/ContactForm/ContactForm +msgid "Contact form" +msgstr "Kontaktformulär" + +#. Default: "Contained items" +#: components/manage/Blocks/Listing/Edit +msgid "Contained items" +msgstr "Inneslutna objekt" + +#. Default: "Container settings" +#: components/manage/Blocks/Container/SimpleContainerToolbar +msgid "Container settings" +msgstr "" + +#. Default: "Content" +#: components/manage/Controlpanels/Controlpanels +msgid "Content" +msgstr "Innehåll" + +#. Default: "Content Rule" +#: components/manage/Controlpanels/Rules/Rules +msgid "Content Rule" +msgstr "Innehållsregel" + +#. Default: "Content Rules" +#: components/manage/Controlpanels/Controlpanels +#: components/manage/Controlpanels/Rules/Rules +msgid "Content Rules" +msgstr "Innehållsregler" + +#. Default: "Content rules for {title}" +#: components/manage/Rules/Rules +msgid "Content rules for {title}" +msgstr "Innehållsregler för {title}" + +#. Default: "Content rules from parent folders" +#: components/manage/Rules/Rules +msgid "Content rules from parent folders" +msgstr "Innehållsregler från föräldermapp" + +#. Default: "Content that links to or references {title}" +#: components/manage/LinksToItem/LinksToItem +msgid "Content that links to or references {title}" +msgstr "Innehåll som länkar eller hänvisar till {title}" + +#. Default: "Content type created" +#: components/manage/Controlpanels/ContentTypes +msgid "Content type created" +msgstr "Innehållstyp skapad" + +#. Default: "Content type deleted" +#: components/manage/Controlpanels/ContentTypes +msgid "Content type deleted" +msgstr "Innehållstyp borttagen" + +#. Default: "Contents" +#: components/manage/Contents/Contents +#: components/manage/Toolbar/Toolbar +msgid "Contents" +msgstr "Innehåll" + +#. Default: "Controls" +#: components/manage/Blocks/Search/schema +msgid "Controls" +msgstr "Kontroller" + +#. Default: "Copy" +#: components/manage/Actions/Actions +#: components/manage/Contents/Contents +#: components/manage/Contents/ContentsItem +msgid "Copy" +msgstr "Kopiera" + +#. Default: "Copy blocks" +#: helpers/MessageLabels/MessageLabels +msgid "Copy blocks" +msgstr "Kopera block" + +#. Default: "Copyright" +#: components/theme/Footer/Footer +msgid "Copyright" +msgstr "Copyright" + +#. Default: "Copyright statement or other rights information on this item." +#: components/manage/Contents/ContentsPropertiesModal +msgid "Copyright statement or other rights information on this item." +msgstr "Upphovsrättsdeklaration eller annan rättighetsinformation för detta objekt." + +#. Default: "Create or delete relations to target" +#: helpers/MessageLabels/MessageLabels +msgid "Create or delete relations to target" +msgstr "Skapa eller radera relationer till mål" + +#. Default: "Create working copy" +#: components/manage/Toolbar/More +msgid "Create working copy" +msgstr "Skapa arbetskopia" + +#. Default: "Created after" +#: components/manage/Controlpanels/Aliases +msgid "Created after" +msgstr "" + +#. Default: "Created before" +#: components/manage/Controlpanels/Aliases +msgid "Created before" +msgstr "" + +#. Default: "Created by {creator} on {date}" +#: components/manage/WorkingCopyToastsFactory/WorkingCopyToastsFactory +msgid "Created by {creator} on {date}" +msgstr "Skapad av {creator} on {date}" + +#. Default: "Created on" +#: components/manage/Contents/Contents +msgid "Created on" +msgstr "Skapad den" + +#. Default: "Creator" +#: components/manage/Contents/Contents +msgid "Creator" +msgstr "Upphovsman" + +#. Default: "Creators" +#: components/manage/Contents/ContentsPropertiesModal +msgid "Creators" +msgstr "Upphovsmän" + +#. Default: "Criteria" +#: components/manage/Widgets/QuerystringWidget +#: components/manage/Widgets/QueryWidget +msgid "Criteria" +msgstr "Kriterium" + +#. Default: "Current active configuration" +#: components/manage/Controlpanels/UpgradeControlPanel +msgid "Current active configuration" +msgstr "Nu aktiva konfigurationer" + +#. Default: "Current filters applied" +#: components/manage/Blocks/Search/components/FilterList +msgid "Current filters applied" +msgstr "Aktuella filter applicerade" + +#. Default: "Current password" +#: components/manage/Preferences/ChangePassword +msgid "Current password" +msgstr "Nuvarande lösenord" + +#. Default: "Customize teaser content" +#: components/manage/Blocks/Teaser/schema +msgid "Customize teaser content" +msgstr "" + +#. Default: "Cut" +#: components/manage/Actions/Actions +#: components/manage/Contents/Contents +#: components/manage/Contents/ContentsItem +msgid "Cut" +msgstr "Klipp ut" + +#. Default: "Cut blocks" +#: helpers/MessageLabels/MessageLabels +msgid "Cut blocks" +msgstr "Klipp ut block" + +#. Default: "Daily" +#: components/manage/Widgets/RecurrenceWidget/RecurrenceWidget +msgid "Daily" +msgstr "Dagligen" + +#. Default: "Database" +#: components/manage/Controlpanels/Controlpanels +msgid "Database" +msgstr "Databas" + +#. Default: "Database Information" +#: components/manage/Controlpanels/DatabaseInformation +msgid "Database Information" +msgstr "Databasinformation" + +#. Default: "Database Location" +#: components/manage/Controlpanels/DatabaseInformation +msgid "Database Location" +msgstr "Databasplats" + +#. Default: "Database Size" +#: components/manage/Controlpanels/DatabaseInformation +msgid "Database Size" +msgstr "Databasstorlek" + +#. Default: "Database main" +#: components/manage/Controlpanels/DatabaseInformation +msgid "Database main" +msgstr "Huvuddatabas" + +#. Default: "Date" +#: components/manage/Controlpanels/Aliases +#: components/manage/Controlpanels/ModerateComments +#: components/manage/Widgets/DatetimeWidget +msgid "Date" +msgstr "Datum" + +#. Default: "Date (newest first)" +#: components/theme/Search/Search +msgid "Date (newest first)" +msgstr "Datum (nyast först)" + +#. Default: "Default" +#: components/manage/Contents/ContentsPropertiesModal +#: components/manage/Contents/ContentsRenameModal +#: components/manage/Contents/ContentsTagsModal +#: components/manage/Contents/ContentsWorkflowModal +#: components/manage/Controlpanels/UndoControlpanel +#: components/manage/Preferences/ChangePassword +#: components/manage/Preferences/PersonalPreferences +#: components/manage/Widgets/SchemaWidget +#: components/manage/Widgets/SelectWidget +#: components/theme/Comments/CommentEditModal +#: components/theme/Comments/Comments +#: components/theme/ContactForm/ContactForm +#: components/theme/PasswordReset/PasswordReset +#: components/theme/PasswordReset/RequestPasswordReset +#: components/theme/Register/Register +msgid "Default" +msgstr "Förvalt" + +#. Default: "Default view" +#: config/Views +msgid "Default view" +msgstr "Förvald vy" + +#. Default: "Delete" +#: components/manage/Contents/Contents +#: components/manage/Contents/ContentsItem +#: components/manage/Controlpanels/ContentTypesActions +#: components/manage/Controlpanels/Groups/RenderGroups +#: components/manage/Controlpanels/ModerateComments +#: components/manage/Controlpanels/Users/RenderUsers +#: components/manage/Delete/Delete +#: components/manage/Widgets/FormFieldWrapper +#: components/manage/Widgets/ObjectBrowserWidget +#: components/theme/Comments/Comments +msgid "Delete" +msgstr "Ta bort" + +#. Default: "Delete Group" +#: helpers/MessageLabels/MessageLabels +msgid "Delete Group" +msgstr "Ta bort grupp" + +#. Default: "Delete Type" +#: components/manage/Controlpanels/ContentTypes +msgid "Delete Type" +msgstr "Ta bort typ" + +#. Default: "Delete User" +#: helpers/MessageLabels/MessageLabels +msgid "Delete User" +msgstr "Ta bort användare" + +#. Default: "Action deleted" +#: components/manage/Controlpanels/Rules/ConfigureRule +msgid "Delete action" +msgstr "Ta bort åtgärd" + +#. Default: "Delete blocks" +#: helpers/MessageLabels/MessageLabels +msgid "Delete blocks" +msgstr "Ta bort block" + +#. Default: "Delete col" +#: config/Blocks +msgid "Delete col" +msgstr "Ta bort kol" + +#. Default: "Condition deleted" +#: components/manage/Controlpanels/Rules/ConfigureRule +msgid "Delete condition" +msgstr "Ta bort villkor" + +#. Default: "Delete row" +#: config/Blocks +msgid "Delete row" +msgstr "Ta bort rad" + +#. Default: "Delete selected items?" +#: components/manage/Contents/ContentsDeleteModal +msgid "Delete selected items?" +msgstr "Ta bort valda objekt?" + +#. Default: "Delete this item?" +#: components/manage/Contents/ContentsDeleteModal +msgid "Delete this item?" +msgstr "Ta bort det här objektet?" + +#. Default: "Deleted" +#: components/manage/Controlpanels/Rules/Rules +msgid "Deleted" +msgstr "Borttagen" + +#. Default: "Deleting this item breaks {brokenReferences} {variation}." +#: components/manage/Contents/ContentsDeleteModal +msgid "Deleting this item breaks {brokenReferences} {variation}." +msgstr "Att ta bort detta objekt trasar sönder {brokenReferences} {variation}." + +#. Default: "Depth" +#: components/manage/Widgets/QuerystringWidget +msgid "Depth" +msgstr "Djup" + +#. Default: "Descending" +#: components/manage/Blocks/Search/components/SortOn +#: components/manage/Contents/Contents +msgid "Descending" +msgstr "Fallande" + +#. Default: "Description" +#: components/manage/Blocks/Teaser/schema +#: components/manage/Controlpanels/ContentTypes +#: components/manage/Widgets/SchemaWidget +#: components/manage/Widgets/SelectWidget +#: components/theme/View/TabularView +#: helpers/MessageLabels/MessageLabels +msgid "Description" +msgstr "Beskrivning" + +#. Default: "Diff" +#: components/manage/Diff/Diff +msgid "Diff" +msgstr "Skillnad" + +#. Default: "Difference between revision {one} and {two} of {title}" +#: components/manage/Diff/Diff +msgid "Difference between revision {one} and {two} of {title}" +msgstr "Skillnad mellan revision {one} och {två} för {title}" + +#. Default: "Disable" +#: components/manage/Rules/Rules +msgid "Disable" +msgstr "Avaktivera" + +#. Default: "Disable apply to subfolders" +#: components/manage/Rules/Rules +msgid "Disable apply to subfolders" +msgstr "Avaktivera applicerande på undermappar" + +#. Default: "Disabled" +#: components/manage/Rules/Rules +msgid "Disabled" +msgstr "Avaktiverad" + +#. Default: "Disabled apply to subfolders" +#: components/manage/Rules/Rules +msgid "Disabled apply to subfolders" +msgstr "Applicering på undermapp avaktiverad" + +#. Default: "Distributed under the {license}." +#: components/theme/Footer/Footer +msgid "Distributed under the {license}." +msgstr "Distribueras enligt villkor i {license}" + +#. Default: "Add border to inner columns" +#: config/Blocks +msgid "Divide each row into separate cells" +msgstr "Dela upp varje rad i separata celler" + +#. Default: "Do you really want to delete the group {groupname}?" +#: components/manage/Controlpanels/Groups/GroupsControlpanel +msgid "Do you really want to delete the group {groupname}?" +msgstr "Vill du verkligen ta bort gruppen {groupname}?" + +#. Default: "Do you really want to delete type {typename}?" +#: components/manage/Controlpanels/ContentTypes +msgid "Do you really want to delete the type {typename}?" +msgstr "Vill du verkligen ta bort typen {typename}?" + +#. Default: "Do you really want to delete the user {username}?" +#: components/manage/Controlpanels/Users/UsersControlpanel +msgid "Do you really want to delete the user {username}?" +msgstr "Vill du verkligen ta bort användaren {username}?" + +#. Default: "Do you really want to delete this item?" +#: components/manage/Delete/Delete +msgid "Do you really want to delete this item?" +msgstr "Vill du verkligen ta bort detta objekt?" + +#. Default: "Document" +#: components/manage/Multilingual/TranslationObject +#: components/manage/Sidebar/Sidebar +msgid "Document" +msgstr "Dokument" + +#. Default: "Document view" +#: config/Views +msgid "Document view" +msgstr "Dokumentvy" + +#. Default: "Download Event" +#: components/theme/EventDetails/EventDetails +msgid "Download Event" +msgstr "Ladda ned händelse" + +#. Default: "Drag and drop files from your computer onto this area or click the “Browse” button." +#: components/manage/Contents/ContentsUploadModal +msgid "Drag and drop files from your computer onto this area or click the “Browse” button." +msgstr "Dra och släpp filer från din dator till den här arean eller klicka på knappen “Bläddra”." + +#. Default: "Drop file here to replace the existing file" +#: components/manage/Widgets/FileWidget +#: components/manage/Widgets/RegistryImageWidget +msgid "Drop file here to replace the existing file" +msgstr "Släpp filen här för att ersätta befintlig fil" + +#. Default: "Drop file here to upload a new file" +#: components/manage/Widgets/FileWidget +#: components/manage/Widgets/RegistryImageWidget +msgid "Drop file here to upload a new file" +msgstr "Släpp filen här för att ladda upp ny fil" + +#. Default: "Drop files here ..." +#: components/manage/Widgets/FileWidget +#: components/manage/Widgets/RegistryImageWidget +msgid "Drop files here ..." +msgstr "Släpp filer här ..." + +#. Default: "Dry run selected, transaction aborted." +#: components/manage/Controlpanels/UpgradeControlPanel +msgid "Dry run selected, transaction aborted." +msgstr "Torrkörning vald, transaktionen avbröts." + +#. Default: "E-mail" +#: components/theme/Register/Register +msgid "E-mail" +msgstr "Epost" + +#. Default: "E-mail addresses do not match." +#: components/theme/PasswordReset/PasswordReset +msgid "E-mail addresses do not match." +msgstr "Epostadresserna matchar inte" + +#. Default: "Edit" +#: components/manage/Contents/ContentsItem +#: components/manage/Controlpanels/ContentTypesActions +#: components/manage/Controlpanels/ModerateComments +#: components/manage/Controlpanels/Rules/EditRule +#: components/manage/Controlpanels/Users/RenderUsers +#: components/manage/Toolbar/Toolbar +#: components/manage/Widgets/FormFieldWrapper +#: components/manage/Widgets/ObjectBrowserWidget +#: components/theme/Comments/Comments +msgid "Edit" +msgstr "Redigera" + +#. Default: "Edit Alternative URL" +#: components/manage/Controlpanels/Aliases +msgid "Edit Alternative URL" +msgstr "" + +#. Default: "Edit Rule" +#: components/manage/Controlpanels/Rules/EditRule +msgid "Edit Rule" +msgstr "Redigera regel" + +#. Default: "Edit comment" +#: components/theme/Comments/CommentEditModal +msgid "Edit comment" +msgstr "Redigera kommentar" + +#. Default: "Edit field" +#: components/manage/Widgets/SchemaWidget +msgid "Edit field" +msgstr "Redigera fält" + +#. Default: "Edit fieldset" +#: components/manage/Widgets/SchemaWidget +msgid "Edit fieldset" +msgstr "Redigera fältgrupp" + +#. Default: "Edit recurrence" +#: components/manage/Widgets/RecurrenceWidget/RecurrenceWidget +msgid "Edit recurrence" +msgstr "Redigera återkommande" + +#. Default: "Edit values" +#: components/manage/Form/InlineForm +msgid "Edit values" +msgstr "Redigera värden" + +#. Default: "Edit {title}" +#: components/manage/Edit/Edit +msgid "Edit {title}" +msgstr "Redigera {title}" + +#. Default: "Email" +#: helpers/MessageLabels/MessageLabels +msgid "Email" +msgstr "Epost" + +#. Default: "Email sent" +#: components/theme/ContactForm/ContactForm +msgid "Email sent" +msgstr "Epost skickat" + +#. Default: "Embed code error, please follow the instructions and try again." +#: components/manage/Blocks/Maps/Edit +msgid "Embed code error, please follow the instructions and try again." +msgstr "Fel på inbäddningskod, kontrollera instruktionerna och försök igen." + +#. Default: "Empty object list" +#: components/manage/Widgets/ObjectListWidget +msgid "Empty object list" +msgstr "Tom objektlista" + +#. Default: "Enable" +#: components/manage/Rules/Rules +msgid "Enable" +msgstr "Aktivera" + +#. Default: "Enable editable Blocks" +#: components/manage/Controlpanels/ContentTypeLayout +msgid "Enable editable Blocks" +msgstr "Aktivera redigerbara block" + +#. Default: "Enabled" +#: components/manage/Rules/Rules +msgid "Enabled" +msgstr "Aktiverad" + +#. Default: "Enabled here?" +#: components/manage/Rules/Rules +msgid "Enabled here?" +msgstr "Aktiverad här?" + +#. Default: "Enabled?" +#: components/manage/Rules/Rules +msgid "Enabled?" +msgstr "Aktiverad?" + +#. Default: "End Date" +#: components/manage/Blocks/Search/components/DateRangeFacet +#: components/manage/Contents/Contents +msgid "End Date" +msgstr "Slutdatum" + +#. Default: "Enter URL or select an item" +#: components/manage/AnchorPlugin/components/LinkButton/AddLinkForm +msgid "Enter URL or select an item" +msgstr "Skriv in URL eller välj ett objekt" + +#. Default: "Enter a username above to search or click 'Show All'" +#: helpers/MessageLabels/MessageLabels +msgid "Enter a username above to search or click 'Show All'" +msgstr "Skriv in ett användarnamn ovan för att söka eller klicka 'Visa alla'" + +#. Default: "Enter an email address. This will be your login name. We respect your privacy, and will not give the address away to any third parties or expose it anywhere." +#: components/theme/Register/Register +msgid "Enter an email address. This will be your login name. We respect your privacy, and will not give the address away to any third parties or expose it anywhere." +msgstr "Skriv in en epostadress. Den blir ditt inloggningsnamn. Vi respekterar din integritet och lämnar inte ut adressen till någon tredjepart eller exponerar den någonstans." + +#. Default: "Enter full name, e.g. John Smith." +#: components/theme/Register/Register +msgid "Enter full name, e.g. John Smith." +msgstr "Skriv in fullständigt namn, e.g. Jon Johansson." + +#. Default: "Enter map Embed Code" +#: components/manage/Blocks/Maps/Edit +msgid "Enter map Embed Code" +msgstr "Ange inbäddningskod" + +#. Default: "Enter the absolute path of the target. Target must exist or be an existing alternative URL path to the target." +#: components/manage/Controlpanels/Aliases +msgid "Enter the absolute path of the target. Target must exist or be an existing alternative url path to the target." +msgstr "" + +#. Default: "Enter the absolute path where the alternative URL should exist. The path must start with '/'. Only URLs that result in a 404 not found page will result in a redirect occurring." +#: components/manage/Controlpanels/Aliases +msgid "Enter the absolute path where the alternative url should exist. The path must start with '/'. Only URLs that result in a 404 not found page will result in a redirect occurring." +msgstr "" + +#. Default: "Enter the absolute path where the alternative url should exist. The path must start with '/'. Only urls that result in a 404 not found page will result in a redirect occurring." +#: components/manage/Aliases/Aliases +msgid "Enter the absolute path where the alternative url should exist. The path must start with '/'. Only urls that result in a 404 not found page will result in a redirect occurring." +msgstr "Skriv in absolut sökväg där den alternativa url:en måste finnas. Sökvägen måste börja med snedstreck '/'. Endast url:er som svarar med felkod 404 "not found" kommer att redigeras om." + +#. Default: "Enter your current password." +#: components/manage/Preferences/ChangePassword +msgid "Enter your current password." +msgstr "Skriv in ditt nuvarande lösenord." + +#. Default: "Enter your email for verification." +#: components/theme/PasswordReset/PasswordReset +msgid "Enter your email for verification." +msgstr "Skriv in din epostadress för verifiering." + +#. Default: "Enter your new password. Minimum 8 characters." +#: components/manage/Preferences/ChangePassword +#: components/theme/PasswordReset/PasswordReset +msgid "Enter your new password. Minimum 8 characters." +msgstr "Skriv in ditt nya lösenord. Minst 8 tecken." + +#. Default: "Enter your username for verification." +#: components/theme/PasswordReset/PasswordReset +msgid "Enter your username for verification." +msgstr "Skriv in ditt användarnamn för verifiering." + +#. Default: "Entries" +#: components/manage/Blocks/ToC/Schema +msgid "Entries" +msgstr "Artiklar" + +#. Default: "Error" +#: components/manage/Add/Add +#: components/manage/Controlpanels/AddonsControlpanel +#: components/manage/Controlpanels/ContentTypeSchema +#: components/manage/Controlpanels/Controlpanel +#: components/manage/Controlpanels/UndoControlpanel +#: components/manage/Edit/Edit +#: components/manage/Form/InlineForm +#: components/manage/Toolbar/More +#: components/manage/Widgets/SchemaWidget +#: components/theme/ContactForm/ContactForm +#: components/theme/Login/Login +#: helpers/MessageLabels/MessageLabels +msgid "Error" +msgstr "Fel" + +#. Default: "Event" +#: components/manage/Controlpanels/Rules/Rules +msgid "Event" +msgstr "Händelse" + +#. Default: "Event end date must be on or after {startDateValueOrStartFieldName}" +#: helpers/MessageLabels/MessageLabels +msgid "Event end date must be on or after {startDateValueOrStartFieldName}" +msgstr "" + +#. Default: "Event listing" +#: config/Views +msgid "Event listing" +msgstr "Händelselista" + +#. Default: "Event start date must be on or before {endDateValueOrEndFieldName}" +#: helpers/MessageLabels/MessageLabels +msgid "Event start date must be on or before {endDateValueOrEndFieldName}" +msgstr "" + +#. Default: "Event view" +#: config/Views +msgid "Event view" +msgstr "Händelsevy" + +#. Default: "Example" +#: components/manage/Controlpanels/Aliases +msgid "Example" +msgstr "" + +#. Default: "Exclude from navigation" +#: components/manage/Contents/ContentsPropertiesModal +msgid "Exclude from navigation" +msgstr "Exkludera från navigering" + +#. Default: "Exclude this occurence" +#: components/manage/Widgets/RecurrenceWidget/Occurences +msgid "Exclude this occurence" +msgstr "Exkludera detta inträffande" + +#. Default: "Excluded from navigation" +#: components/manage/Contents/Contents +msgid "Excluded from navigation" +msgstr "Exkludera från navigering" + +#. Default: "Existing alternative urls for this item" +#: components/manage/Aliases/Aliases +msgid "Existing alternative urls for this item" +msgstr "Existerande alternativa url:er för detta objekt" + +#. Default: "Expand sidebar" +#: components/manage/Sidebar/Sidebar +msgid "Expand sidebar" +msgstr "Fäll ut sidomeny" + +#. Default: "Expiration Date" +#: components/manage/Contents/ContentsPropertiesModal +msgid "Expiration Date" +msgstr "Utgångsdatum" + +#. Default: "Expiration date" +#: components/manage/Contents/Contents +msgid "Expiration date" +msgstr "Utgångsdatum" + +#. Default: "Expired" +#: components/manage/Contents/ContentsItem +msgid "Expired" +msgstr "Utgången" + +#. Default: "External URL" +#: components/manage/Blocks/LeadImage/LeadImageSidebar +msgid "External URL" +msgstr "Extern URL" + +#. Default: "Facet" +#: components/manage/Blocks/Search/schema +msgid "Facet" +msgstr "Facett" + +#. Default: "Facet widget" +#: components/manage/Blocks/Search/schema +msgid "Facet widget" +msgstr "Facettwidget" + +#. Default: "Facets" +#: components/manage/Blocks/Search/schema +msgid "Facets" +msgstr "Facetter" + +#. Default: "Facets on left side" +#: config/Blocks +msgid "Facets on left side" +msgstr "Facetter på vänster sida" + +#. Default: "Facets on right side" +#: config/Blocks +msgid "Facets on right side" +msgstr "Facetter på höger sida" + +#. Default: "Facets on top" +#: config/Blocks +msgid "Facets on top" +msgstr "Facetter överst" + +#. Default: "Failed to undo transactions" +#: components/manage/Controlpanels/UndoControlpanel +msgid "Failed To Undo Transactions" +msgstr "Misslyckades att rulla tillbaka transaktion" + +#. Default: "Field" +#: components/manage/Blocks/Search/schema +msgid "Field" +msgstr "Fält" + +#. Default: "File" +#: components/manage/Toolbar/Toolbar +msgid "File" +msgstr "Fil" + +#. Default: "File size" +#: components/manage/Contents/ContentsUploadModal +msgid "File size" +msgstr "Filstorlek" + +#. Default: "File view" +#: config/Views +msgid "File view" +msgstr "Filvy" + +#. Default: "Filename" +#: components/manage/Contents/ContentsUploadModal +msgid "Filename" +msgstr "Filnamn" + +#. Default: "Files uploaded: {uploadedFiles}" +#: components/manage/Contents/ContentsUploadModal +msgid "Files uploaded: {uploadedFiles}" +msgstr "" + +#. Default: "Filter" +#: components/manage/Controlpanels/Aliases +#: helpers/MessageLabels/MessageLabels +msgid "Filter" +msgstr "Filter" + +#. Default: "Filter Rules:" +#: components/manage/Controlpanels/Rules/Rules +msgid "Filter Rules:" +msgstr "Filterregler:" + +#. Default: "Filter by path" +#: components/manage/Controlpanels/Aliases +msgid "Filter by prefix" +msgstr "Filtrera på prefix" + +#. Default: "Filter users by groups" +#: helpers/MessageLabels/MessageLabels +msgid "Filter users by groups" +msgstr "Filtrera användare på grupptillhörighet" + +#. Default: "Filter…" +#: components/manage/Contents/Contents +msgid "Filter…" +msgstr "Filtrera…" + +#. Default: "First" +#: components/manage/Widgets/RecurrenceWidget/WeekdayOfTheMonthIndexField +msgid "First" +msgstr "Första" + +#. Default: "Fix relations" +#: helpers/MessageLabels/MessageLabels +msgid "Fix relations" +msgstr "Fixa relationer" + +#. Default: "Fixed width columns" +#: config/Blocks +msgid "Fixed width table cells" +msgstr "Fast bredd på tabellceller" + +#. Default: "Fold" +#: components/manage/BlockChooser/BlockChooser +msgid "Fold" +msgstr "Fäll ihop" + +#. Default: "Folder" +#: components/manage/Contents/Contents +msgid "Folder" +msgstr "Mapp" + +#. Default: "Folder listing" +#: config/Views +msgid "Folder listing" +msgstr "Mapplistning" + +#. Default: "Forbidden" +#: components/theme/Forbidden/Forbidden +msgid "Forbidden" +msgstr "Förbjuden" + +#. Default: "Fourth" +#: components/manage/Widgets/RecurrenceWidget/WeekdayOfTheMonthIndexField +msgid "Fourth" +msgstr "Fjärde" + +#. Default: "From" +#: components/theme/ContactForm/ContactForm +msgid "From" +msgstr "Från" + +#. Default: "Full" +#: components/manage/Blocks/Maps/Edit +#: components/manage/Sidebar/AlignBlock +#: components/manage/Widgets/AlignWidget +msgid "Full" +msgstr "Full" + +#. Default: "Full Name" +#: components/theme/Register/Register +msgid "Full Name" +msgstr "Fullständigt namn" + +#. Default: "Fullname" +#: helpers/MessageLabels/MessageLabels +msgid "Fullname" +msgstr "Fullständigt namn" + +#. Default: "GNU GPL license" +#: components/theme/Footer/Footer +msgid "GNU GPL license" +msgstr "GNU GPL licens" + +#. Default: "General" +#: components/manage/Controlpanels/Controlpanels +msgid "General" +msgstr "Allmän" + +#. Default: "Global role" +#: components/manage/Sharing/Sharing +msgid "Global role" +msgstr "Global roll" + +#. Default: "Google Maps Embedded Block" +#: components/manage/Blocks/Maps/Edit +msgid "Google Maps Embedded Block" +msgstr "Block med inbäddad Google-karta" + +#. Default: "Grid" +#: components/manage/Blocks/Grid/schema +msgid "Grid" +msgstr "" + +#. Default: "Group" +#: components/manage/Sharing/Sharing +msgid "Group" +msgstr "Grupp" + +#. Default: "Group created" +#: helpers/MessageLabels/MessageLabels +msgid "Group created" +msgstr "Grupp skapad" + +#. Default: "Group deleted" +#: helpers/MessageLabels/MessageLabels +msgid "Group deleted" +msgstr "" + +#. Default: "Group roles updated" +#: helpers/MessageLabels/MessageLabels +msgid "Group roles updated" +msgstr "Grupproller uppdaterade" + +#. Default: "Groupname" +#: components/manage/Controlpanels/Groups/GroupsControlpanel +#: helpers/MessageLabels/MessageLabels +msgid "Groupname" +msgstr "Gruppnamn" + +#. Default: "Groups" +#: components/manage/Controlpanels/Controlpanels +#: components/manage/Controlpanels/Groups/GroupsControlpanel +#: helpers/MessageLabels/MessageLabels +msgid "Groups" +msgstr "Grupper" + +#. Default: "Groups are logical collections of users, such as departments and business units. Groups are not directly related to permissions on a global level, you normally use Roles for that - and let certain Groups have a particular role. The symbol{plone_svg}indicates a role inherited from membership in another group." +#: components/manage/Controlpanels/Groups/GroupsControlpanel +msgid "Groups are logical collections of users, such as departments and business units. Groups are not directly related to permissions on a global level, you normally use Roles for that - and let certain Groups have a particular role. The symbol{plone_svg}indicates a role inherited from membership in another group." +msgstr "Grupper består av meningsfulla sammanslutningar av användare exempelvis avdelningar eller företagsenheter. Grupper är inte direkt relaterade till accessrättigheter på global nivå, normalt används roller för detta och grupper kan tilldelas specifika roller. Symbolen{plone_svg}indikerar att en roll ärvts via medlemskap i en annan grupp." + +#. Default: "Header cell" +#: config/Blocks +msgid "Header cell" +msgstr "Rubrikcell" + +#. Default: "Headline" +#: components/manage/Blocks/Grid/schema +#: components/manage/Blocks/Listing/schema +#: components/manage/Blocks/Search/schema +msgid "Headline" +msgstr "Rubrik" + +#. Default: "Headline level" +#: components/manage/Blocks/Listing/schema +msgid "Headline level" +msgstr "Rubriknivå" + +#. Default: "Hidden facets will still filter the results if proper parameters are passed in URLs" +#: components/manage/Blocks/Search/schema +msgid "Hidden facets will still filter the results if proper parameters are passed in URLs" +msgstr "Dolda facetter filtrerar resultatet även om andra parametrar används i URL:erna" + +#. Default: "Hide Replies" +#: components/theme/Comments/Comments +msgid "Hide Replies" +msgstr "Dölj svar" + +#. Default: "Hide facet?" +#: components/manage/Blocks/Search/schema +msgid "Hide facet?" +msgstr "Dölj facett?" + +#. Default: "Hide filters" +#: components/manage/Blocks/Search/components/Facets +msgid "Hide filters" +msgstr "" + +#. Default: "Hide title" +#: components/manage/Blocks/ToC/Schema +msgid "Hide title" +msgstr "Dölj titel" + +#. Default: "History" +#: components/manage/History/History +#: components/manage/Toolbar/More +msgid "History" +msgstr "Historik" + +#. Default: "#" +#: components/manage/History/History +msgid "History Version Number" +msgstr "#" + +#. Default: "History of {title}" +#: components/manage/History/History +msgid "History of {title}" +msgstr "Historik för {title}" + +#. Default: "Home" +#: components/manage/Contents/Contents +#: components/manage/Contents/ContentsBreadcrumbs +#: components/manage/Contents/ContentsBreadcrumbsHomeItem +#: components/manage/Sidebar/ObjectBrowserBody +#: components/theme/Breadcrumbs/Breadcrumbs +#: components/theme/Logo/Logo +msgid "Home" +msgstr "Förstasidan" + +#. Default: "ID" +#: components/manage/Contents/Contents +msgid "ID" +msgstr "ID" + +#. Default: "Icon View" +#: components/manage/Sidebar/ObjectBrowserBody +msgid "Icon View" +msgstr "" + +#. Default: "If all of the following conditions are met:" +#: components/manage/Controlpanels/Rules/ConfigureRule +msgid "If all of the following conditions are met:" +msgstr "Om alla följande vilkor är uppfyllda:" + +#. Default: "If selected, this item will not appear in the navigation tree" +#: components/manage/Contents/ContentsPropertiesModal +msgid "If selected, this item will not appear in the navigation tree" +msgstr "Det här objektet kommer ej att visas i navigationsträdet" + +#. Default: "If this date is in the future, the content will not show up in listings and searches until this date." +#: components/manage/Contents/ContentsPropertiesModal +msgid "If this date is in the future, the content will not show up in listings and searches until this date." +msgstr "Ett framtida datum innebär att innehållet inte visas i listningar och sökningar förrän detta datum." + +#. Default: "If you are certain this user has abandoned the object, you may unlock the object. You will then be able to edit it." +#: components/manage/LockingToastsFactory/LockingToastsFactory +msgid "If you are certain this user has abandoned the object, you may unlock the object. You will then be able to edit it." +msgstr "Om du är säker på att den här användaren har övergett objektet kan du låsa upp det. Sedan kan du redigera." + +#. Default: "If you are certain you have the correct web address but are encountering an error, please contact the {site_admin}." +#: components/theme/NotFound/NotFound +#: components/theme/Unauthorized/Unauthorized +msgid "If you are certain you have the correct web address but are encountering an error, please contact the {site_admin}." +msgstr "Om du är säker på att du har rätt webbadress men stöter på detta fel kan du kontakta {site_admin}." + +#. Default: "Image" +#: components/manage/Blocks/Image/ImageSidebar +#: components/manage/Blocks/Image/schema +#: components/manage/Blocks/LeadImage/LeadImageSidebar +msgid "Image" +msgstr "Bild" + +#. Default: "Image gallery" +#: config/Blocks +msgid "Image gallery" +msgstr "Bildgalleri" + +#. Default: "Image override" +#: components/manage/Blocks/Teaser/schema +msgid "Image override" +msgstr "Åsidosättande bild" + +#. Default: "Image size" +#: components/manage/Blocks/Image/schema +msgid "Image size" +msgstr "Bildstorlek" + +#. Default: "Image view" +#: config/Views +msgid "Image view" +msgstr "Bildvy" + +#. Default: "Include this occurrence" +#: components/manage/Widgets/RecurrenceWidget/Occurences +msgid "Include this occurence" +msgstr "Inkludera detta inträffande" + +#. Default: "Info" +#: components/manage/Controlpanels/ContentType +#: components/manage/Controlpanels/ContentTypeLayout +#: components/manage/Controlpanels/ContentTypeSchema +#: components/manage/Controlpanels/Controlpanel +msgid "Info" +msgstr "Info" + +#. Default: "You have selected the option 'many users' or 'many groups'. Thus this control panel asks for input to show users and groups. If you want to see users and groups instantaneous, head over to user group settings. See the button on the left." +#: components/manage/Controlpanels/Users/UserGroupMembershipControlPanel +msgid "InfoUserGroupSettings" +msgstr "Du har valt alternativet 'många användare' eller 'många grupper'. Därför visas den här panelen för inmatning av användare och grupepr. Om du vill se användare och grupper omedelbart, gå till användargruppinställningarna. Se knapp till vänster." + +#. Default: "Inherit permissions from higher levels" +#: components/manage/Sharing/Sharing +msgid "Inherit permissions from higher levels" +msgstr "Ärv accessrättigheter från högre nivåer" + +#. Default: "Inherited value" +#: components/manage/Sharing/Sharing +msgid "Inherited value" +msgstr "Ärvt värde" + +#. Default: "Insert col after" +#: config/Blocks +msgid "Insert col after" +msgstr "Infoga kol efter" + +#. Default: "Insert col before" +#: config/Blocks +msgid "Insert col before" +msgstr "Infoga kol före" + +#. Default: "Insert row after" +#: config/Blocks +msgid "Insert row after" +msgstr "Infoga rad efter" + +#. Default: "Insert row before" +#: config/Blocks +msgid "Insert row before" +msgstr "Infoga rad före" + +#. Default: "Inspect relations" +#: helpers/MessageLabels/MessageLabels +msgid "Inspect relations" +msgstr "Inspektera relationer" + +#. Default: "Install" +#: components/manage/Controlpanels/AddonsControlpanel +msgid "Install" +msgstr "Installera" + +#. Default: "Installed" +#: components/manage/Controlpanels/AddonsControlpanel +msgid "Installed" +msgstr "Installerad" + +#. Default: "Installed version" +#: components/manage/Controlpanels/AddonsControlpanel +msgid "Installed version" +msgstr "Installerade versioner" + +#. Default: "Installing a third party add-on" +#: components/manage/Controlpanels/AddonsControlpanel +msgid "Installing a third party add-on" +msgstr "Installerar tredjepartstillägg" + +#. Default: "days" +#: components/manage/Widgets/RecurrenceWidget/RecurrenceWidget +msgid "Interval Daily" +msgstr "dagar" + +#. Default: "Month(s)" +#: components/manage/Widgets/RecurrenceWidget/RecurrenceWidget +msgid "Interval Monthly" +msgstr "månader" + +#. Default: "week(s)" +#: components/manage/Widgets/RecurrenceWidget/RecurrenceWidget +msgid "Interval Weekly" +msgstr "veckor" + +#. Default: "year(s)" +#: components/manage/Widgets/RecurrenceWidget/RecurrenceWidget +msgid "Interval Yearly" +msgstr "år" + +#. Default: "Invalid block - Will be removed on saving" +#: components/manage/Blocks/Block/DefaultView +#: components/theme/View/RenderBlocks +msgid "Invalid Block" +msgstr "Felaktigt block" + +#. Default: "Invalid teaser source" +#: components/manage/Blocks/Teaser/Data +msgid "Invalid teaser source" +msgstr "" + +#. Default: "It is not allowed to define both the password and to request sending the password reset message by e-mail. You need to select one of them." +#: helpers/MessageLabels/MessageLabels +msgid "It is not allowed to define both the password and to request sending the password reset message by e-mail. You need to select one of them." +msgstr "Det är ej tillåtet att både sätta lösenor och begära lösenordsåterställning via epost. Du måste välja endera." + +#. Default: "Item batch size" +#: components/manage/Widgets/QuerystringWidget +msgid "Item batch size" +msgstr "Storlek på objektsats" + +#. Default: "Item successfully moved." +#: components/manage/Contents/Contents +msgid "Item successfully moved." +msgstr "" + +#. Default: "Item(s) copied." +#: components/manage/Contents/Contents +msgid "Item(s) copied." +msgstr "Objekt kopierade." + +#. Default: "Item(s) cut." +#: components/manage/Contents/Contents +msgid "Item(s) cut." +msgstr "Objekt utklippt." + +#. Default: "Item(s) has been updated." +#: components/manage/Contents/Contents +msgid "Item(s) has been updated." +msgstr "Objekt uppdaterat." + +#. Default: "Item(s) pasted." +#: components/manage/Actions/Actions +#: components/manage/Contents/Contents +msgid "Item(s) pasted." +msgstr "Objekt inklistrat" + +#. Default: "Item(s) state has been updated." +#: components/manage/Contents/Contents +msgid "Item(s) state has been updated." +msgstr "Objettillstånd uppdaterat." + +#. Default: "Items" +#: components/manage/Controlpanels/ContentTypes +msgid "Items" +msgstr "Objekt" + +#. Default: "Items must be unique." +#: components/manage/Form/ModalForm +#: helpers/MessageLabels/MessageLabels +msgid "Items must be unique." +msgstr "Objekt måste vara unika." + +#. Default: "Label" +#: components/manage/Blocks/Search/schema +msgid "Label" +msgstr "Etikett" + +#. Default: "Language" +#: components/manage/Preferences/PersonalPreferences +msgid "Language" +msgstr "Språk" + +#. Default: "Language independent field." +#: components/manage/Widgets/FormFieldWrapper +msgid "Language independent field." +msgstr "Språkoberoende fält." + +#. Default: "This is a language independent field. Any value you enter here will overwrite the corresponding field of all members of the translation group when you save this form." +#: components/manage/Widgets/FormFieldWrapper +msgid "Language independent icon title" +msgstr "" + +#. Default: "Large" +#: components/manage/Widgets/ImageSizeWidget +msgid "Large" +msgstr "Stor" + +#. Default: "Last" +#: components/manage/Widgets/RecurrenceWidget/WeekdayOfTheMonthIndexField +msgid "Last" +msgstr "Sist" + +#. Default: "Last comment date" +#: components/manage/Contents/Contents +msgid "Last comment date" +msgstr "Datum för senaste kommentar" + +#. Default: "Last modified" +#: components/manage/Contents/ContentsUploadModal +msgid "Last modified" +msgstr "Senast modifierad" + +#. Default: "Latest available configuration" +#: components/manage/Controlpanels/UpgradeControlPanel +msgid "Latest available configuration" +msgstr "Senast tillgängliga konfiguration" + +#. Default: "Latest version" +#: components/manage/Controlpanels/AddonsControlpanel +msgid "Latest version" +msgstr "Senaste version" + +#. Default: "Layout" +#: components/manage/Controlpanels/ContentTypesActions +msgid "Layout" +msgstr "Layout" + +#. Default: "Lead Image" +#: components/manage/Blocks/LeadImage/LeadImageSidebar +msgid "Lead Image" +msgstr "Försättsbild" + +#. Default: "Left" +#: components/manage/Blocks/Maps/Edit +#: components/manage/Sidebar/AlignBlock +#: components/manage/Widgets/AlignWidget +msgid "Left" +msgstr "Vänster" + +#. Default: "Less filters" +#: components/manage/Blocks/Search/components/Facets +msgid "Less filters" +msgstr "" + +#. Default: "Link" +#: components/manage/Toolbar/Toolbar +msgid "Link" +msgstr "Länk" + +#. Default: "Anchor link copied to the clipboard" +#: helpers/MessageLabels/MessageLabels +msgid "Link copied to clipboard" +msgstr "" + +#. Default: "Link more" +#: components/manage/Blocks/Listing/schema +msgid "Link more" +msgstr "Länka fler" + +#. Default: "Link redirect view" +#: config/Views +msgid "Link redirect view" +msgstr "Länkomdirigeringsvy" + +#. Default: "Link settings" +#: components/manage/Blocks/Image/schema +msgid "Link settings" +msgstr "Länkinställningar" + +#. Default: "Link Title" +#: components/manage/Blocks/Listing/schema +msgid "Link title" +msgstr "Länktitel" + +#. Default: "Link to" +#: components/manage/Blocks/Image/schema +#: components/manage/Blocks/LeadImage/LeadImageSidebar +#: components/manage/Blocks/Listing/schema +msgid "Link to" +msgstr "Länka till" + +#. Default: "Link translation for" +#: components/manage/Multilingual/ManageTranslations +msgid "Link translation for" +msgstr "Länka översättning för" + +#. Default: "Linking this item with hyperlink in text" +#: components/manage/LinksToItem/LinksToItem +msgid "Linking this item with hyperlink in text" +msgstr "Länka till det här objektet med en hyperlänk i text" + +#. Default: "Links and references" +#: components/manage/LinksToItem/LinksToItem +#: components/manage/Toolbar/More +msgid "Links and references" +msgstr "Länkar och hänvisningar" + +#. Default: "List View" +#: components/manage/Sidebar/ObjectBrowserBody +msgid "List View" +msgstr "" + +#. Default: "Listing" +#: components/manage/Blocks/Listing/schema +msgid "Listing" +msgstr "Listning" + +#. Default: "Listing view" +#: config/Views +msgid "Listing view" +msgstr "Listningsvy" + +#. Default: "Load more..." +#: components/theme/Comments/Comments +msgid "Load more" +msgstr "Ladda fler..." + +#. Default: "Loading." +#: components/manage/Controlpanels/Groups/GroupsControlpanel +#: components/manage/Controlpanels/Users/UsersControlpanel +#: components/manage/Form/ModalForm +msgid "Loading" +msgstr "Laddar." + +#. Default: "Login" +#: components/theme/Login/Login +msgid "Log In" +msgstr "Logga in" + +#. Default: "Log in" +#: components/theme/Anontools/Anontools +#: components/theme/Login/Login +msgid "Log in" +msgstr "Logga in" + +#. Default: "Logged out" +#: components/theme/Logout/Logout +msgid "Logged out" +msgstr "Utloggad" + +#. Default: "Login" +#: components/theme/Login/Login +msgid "Login" +msgstr "Logga in" + +#. Default: "Login Failed" +#: components/theme/Login/Login +msgid "Login Failed" +msgstr "Inloggningen misslyckades" + +#. Default: "Login Name" +#: components/theme/Login/Login +msgid "Login Name" +msgstr "Inloggningsnamn" + +#. Default: "Logo of" +#: components/theme/Logo/Logo +msgid "Logo of" +msgstr "" + +#. Default: "Logout" +#: components/manage/Toolbar/PersonalTools +msgid "Logout" +msgstr "Logga ut" + +#. Default: "Made by {creator} on {date}. This is not a working copy anymore, but the main content." +#: components/manage/Toolbar/More +msgid "Made by {creator} on {date}. This is not a working copy anymore, but the main content." +msgstr "Skapad av {creator} den {date}. Det här är inte längre en arbetskopia utan huvudkopian." + +#. Default: "Reduce cell padding" +#: config/Blocks +msgid "Make the table compact" +msgstr "Minska luftigheten i cellerna" + +#. Default: "Manage Translations" +#: components/manage/Multilingual/ManageTranslations +#: components/manage/Toolbar/More +msgid "Manage Translations" +msgstr "Hantera översättningar" + +#. Default: "Manage content…" +#: components/manage/Toolbar/More +msgid "Manage content…" +msgstr "Hantera innehåll…" + +#. Default: "Manage translations for {title}" +#: components/manage/Multilingual/ManageTranslations +msgid "Manage translations for {title}" +msgstr "Hantera översättningar för {title}" + +#. Default: "Manual" +#: components/manage/Controlpanels/Aliases +msgid "Manual" +msgstr "Manuell" + +#. Default: "Manually" +#: components/manage/Controlpanels/Aliases +msgid "Manually" +msgstr "" + +#. Default: "Manually or automatically added?" +#: components/manage/Controlpanels/Aliases +msgid "Manually or automatically added?" +msgstr "Manuellt ellr automatiskt tillagd?" + +#. Default: "Many relations found. Please search." +#: helpers/MessageLabels/MessageLabels +msgid "Many relations found. Please search." +msgstr "Flera relationer hittades. Vänligen sök." + +#. Default: "Maps" +#: components/manage/Blocks/Maps/MapsSidebar +#: components/manage/Blocks/Maps/schema +msgid "Maps" +msgstr "Kartor" + +#. Default: "Maps URL" +#: components/manage/Blocks/Maps/schema +msgid "Maps URL" +msgstr "Kart-URL" + +#. Default: "Maximum length is {len}." +#: helpers/MessageLabels/MessageLabels +msgid "Maximum length is {len}." +msgstr "Maximal längd är {len}." + +#. Default: "Maximum value is {len}." +#: helpers/MessageLabels/MessageLabels +msgid "Maximum value is {len}." +msgstr "Maximalt värde är {len}." + +#. Default: "Medium" +#: components/manage/Widgets/ImageSizeWidget +msgid "Medium" +msgstr "Medium" + +#. Default: "Membership updated" +#: helpers/MessageLabels/MessageLabels +msgid "Membership updated" +msgstr "Medlesskap uppdaterat" + +#. Default: "Message" +#: components/theme/ContactForm/ContactForm +msgid "Message" +msgstr "Meddelande" + +#. Default: "Minimum length is {len}." +#: components/manage/Form/ModalForm +#: helpers/MessageLabels/MessageLabels +msgid "Minimum length is {len}." +msgstr "Minsta längd är {len}." + +#. Default: "Minimum value is {len}." +#: helpers/MessageLabels/MessageLabels +msgid "Minimum value is {len}." +msgstr "Minsta värde är {len}." + +#. Default: "Moderate Comments" +#: components/manage/Controlpanels/Controlpanels +msgid "Moderate Comments" +msgstr "Moderera kommentarer" + +#. Default: "Moderate comments" +#: components/manage/Controlpanels/ModerateComments +msgid "Moderate comments" +msgstr "Moderera kommentarer" + +#. Default: "Monday and Friday" +#: components/manage/Widgets/RecurrenceWidget/RecurrenceWidget +msgid "Monday and Friday" +msgstr "Måndag och fredag" + +#. Default: "Day" +#: components/manage/Widgets/RecurrenceWidget/ByMonthDayField +msgid "Month day" +msgstr "Dag i månad" + +#. Default: "Monthly" +#: components/manage/Widgets/RecurrenceWidget/RecurrenceWidget +msgid "Monthly" +msgstr "Månatligen" + +#. Default: "More" +#: components/manage/Toolbar/Toolbar +msgid "More" +msgstr "Mer" + +#. Default: "More filters" +#: components/manage/Blocks/Search/components/Facets +msgid "More filters" +msgstr "" + +#. Default: "More information about the upgrade procedure can be found in the documentation section of plone.org in the Upgrade Guide." +#: components/manage/Controlpanels/UpgradeControlPanel +msgid "More information about the upgrade procedure can be found in the documentation section of plone.org in the Upgrade Guide." +msgstr "Mer information om uppgraderingsproceduren finns i avsnittet "Upgrade Guide" på plone.org." + +#. Default: "Mosaic layout" +#: config/Views +msgid "Mosaic layout" +msgstr "Mosaic layout" + +#. Default: "Move down" +#: components/manage/Controlpanels/Rules/ConfigureRule +msgid "Move down" +msgstr "Flytta ned" + +#. Default: "Move to bottom of folder" +#: components/manage/Contents/ContentsItem +msgid "Move to bottom of folder" +msgstr "Flytta nederst i mapp" + +#. Default: "Move to top of folder" +#: components/manage/Contents/ContentsItem +msgid "Move to top of folder" +msgstr "Flytta överst i mapp" + +#. Default: "Move up" +#: components/manage/Controlpanels/Rules/ConfigureRule +msgid "Move up" +msgstr "Flytta upp" + +#. Default: "Multiple choices?" +#: components/manage/Blocks/Search/schema +msgid "Multiple choices?" +msgstr "Flerval?" + +#. Default: "My email is" +#: components/theme/PasswordReset/PasswordReset +msgid "My email is" +msgstr "Min epost är" + +#. Default: "My user name is" +#: components/theme/PasswordReset/PasswordReset +msgid "My username is" +msgstr "Mitt användarnamn är" + +#. Default: "Name" +#: components/manage/Sharing/Sharing +#: components/theme/ContactForm/ContactForm +msgid "Name" +msgstr "Namn" + +#. Default: "Narrow" +#: components/manage/Widgets/AlignWidget +msgid "Narrow" +msgstr "Smal" + +#. Default: "Navigate back" +#: error +msgid "Navigate back" +msgstr "Navigera tillbaka" + +#. Default: "Navigate to this item" +#: components/manage/Contents/ContentsDeleteModal +msgid "Navigate to this item" +msgstr "" + +#. Default: "Navigation" +#: components/theme/Navigation/ContextNavigation +msgid "Navigation" +msgstr "Navigering" + +#. Default: "New password" +#: components/manage/Preferences/ChangePassword +#: components/theme/PasswordReset/PasswordReset +msgid "New password" +msgstr "Nytt lösenord" + +#. Default: "News Item" +#: components/manage/Toolbar/Toolbar +msgid "News Item" +msgstr "Nyhet" + +#. Default: "News item view" +#: config/Views +msgid "News item view" +msgstr "Nyhetsvy" + +#. Default: "No" +#: components/manage/Contents/ContentsItem +#: components/manage/Controlpanels/ContentTypes +msgid "No" +msgstr "Nej" + +#. Default: "No transactions found" +#: components/manage/Controlpanels/UndoControlpanel +msgid "No Transactions Found" +msgstr "Ingen transaktion kunde hittas" + +#. Default: "No transactions selected" +#: components/manage/Controlpanels/UndoControlpanel +msgid "No Transactions Selected" +msgstr "Ingen transaktion vald" + +#. Default: "No transactions selected to do undo" +#: components/manage/Controlpanels/UndoControlpanel +msgid "No Transactions Selected To Do Undo" +msgstr "Inga transaktioner att ångra är valda" + +#. Default: "No Video selected" +#: components/manage/Blocks/Video/VideoSidebar +msgid "No Video selected" +msgstr "Ingen video vald" + +#. Default: "No addons found" +#: components/manage/Controlpanels/VersionOverview +msgid "No addons found" +msgstr "Inga tillägg funna" + +#. Default: "No broken relations found." +#: components/manage/Controlpanels/Relations/RelationsMatrix +msgid "No broken relations found." +msgstr "" + +#. Default: "There is no connection to the server, due to a timeout o no network connection." +#: components/theme/RequestTimeout/RequestTimeout +msgid "No connection to the server" +msgstr "Ingen förbindelse till server" + +#. Default: "No image selected" +#: components/manage/Blocks/Image/ImageSidebar +msgid "No image selected" +msgstr "Ingen bild vald" + +#. Default: "No image set in Lead Image content field" +#: components/manage/Blocks/LeadImage/LeadImageSidebar +msgid "No image set in Lead Image content field" +msgstr "Ingen bild vald som försättsbild" + +#. Default: "No image set in image content field" +#: components/manage/Blocks/LeadImage/LeadImageSidebar +msgid "No image set in image content field" +msgstr "Ingen bild vald i bildfältet" + +#. Default: "No images found." +#: components/manage/Blocks/Listing/GalleryNoResultsComponent +msgid "No images found." +msgstr "Inga bilder kunde hittas." + +#. Default: "No items found in this container." +#: components/manage/Blocks/Listing/ListingBody +msgid "No items found in this container." +msgstr "Inga objekt finns i den här containern." + +#. Default: "No items selected" +#: components/manage/Widgets/ObjectBrowserWidget +msgid "No items selected" +msgstr "Inga objekt valda" + +#. Default: "No links to this item found." +#: components/manage/LinksToItem/LinksToItem +msgid "No links to this item found." +msgstr "Inga länkar till detta objekt kunde hittas." + +#. Default: "No map selected" +#: components/manage/Blocks/Maps/MapsSidebar +msgid "No map selected" +msgstr "Ingen karta vald" + +#. Default: "No occurences set" +#: components/manage/Widgets/RecurrenceWidget/Occurences +msgid "No occurences set" +msgstr "Inga förekomster valda" + +#. Default: "No options" +#: components/manage/Widgets/ArrayWidget +#: components/manage/Widgets/SelectAutoComplete +#: components/manage/Widgets/SelectWidget +#: components/manage/Widgets/TokenWidget +msgid "No options" +msgstr "Inga alternativ" + +#. Default: "No relation found" +#: helpers/MessageLabels/MessageLabels +msgid "No relation found" +msgstr "Inga relationer kunde hittas" + +#. Default: "No results found" +#: components/manage/BlockChooser/BlockChooser +#: components/theme/Search/Search +msgid "No results found" +msgstr "Inga resultat" + +#. Default: "No results found." +#: components/manage/Blocks/Listing/DefaultNoResultsComponent +#: components/manage/Widgets/ReferenceWidget +msgid "No results found." +msgstr "Inga resultat." + +#. Default: "No selection" +#: components/manage/Blocks/Search/components/SortOn +#: components/manage/Widgets/QuerySortOnWidget +#: components/manage/Widgets/QuerystringWidget +msgid "No selection" +msgstr "Inget valt" + +#. Default: "This addon does not provide an uninstall profile." +#: components/manage/Controlpanels/AddonsControlpanel +msgid "No uninstall profile" +msgstr "Ingen avinstallationsprofil" + +#. Default: "No user found" +#: helpers/MessageLabels/MessageLabels +msgid "No user found" +msgstr "Ingen användare kunde hittas" + +#. Default: "No value" +#: components/manage/Widgets/ArrayWidget +#: components/manage/Widgets/ReferenceWidget +#: components/manage/Widgets/SelectUtils +#: components/manage/Widgets/SelectWidget +msgid "No value" +msgstr "Inget värde" + +#. Default: "No workflow" +#: components/manage/Workflow/Workflow +msgid "No workflow" +msgstr "Inget arbetsflöde" + +#. Default: "None" +#: components/manage/Contents/Contents +#: components/manage/Contents/ContentsItem +msgid "None" +msgstr "Ingen" + +#. Default: "Note" +#: components/manage/Controlpanels/UndoControlpanel +msgid "Note" +msgstr "Notera" + +#. Default: "Note that roles set here apply directly to a user. The symbol{plone_svg}indicates a role inherited from membership in a group." +#: components/manage/Controlpanels/Users/UsersControlpanel +msgid "Note that roles set here apply directly to a user. The symbol{plone_svg}indicates a role inherited from membership in a group." +msgstr "Notera att rollerna som väljs här appliceras direkt på en användare. Symbolen{plone_svt}indikerar att en roll ärvts via ett medlemsskap i en grupp." + +#. Default: "Number of active objects" +#: components/manage/Controlpanels/DatabaseInformation +msgid "Number of active objects" +msgstr "Antal aktiva objekt" + +#. Default: "Object Size" +#: components/manage/Contents/Contents +msgid "Object Size" +msgstr "Objektsstorlek" + +#. Default: "occurrence(s)" +#: components/manage/Widgets/RecurrenceWidget/EndField +msgid "Occurences" +msgstr "Förekomster" + +#. Default: "Ok" +#: components/manage/Delete/Delete +msgid "Ok" +msgstr "Ok" + +#. Default: "Only 7-bit bytes characters are allowed. Cannot contain uppercase letters, special characters: <, >, &, #, /, ?, or others that are illegal in URLs. Cannot start with: _, aq_, @@, ++. Cannot end with __. Cannot be: request,contributors, ., .., "". Cannot contain new lines." +#: components/manage/Widgets/IdWidget +msgid "Only 7-bit bytes characters are allowed. Cannot contain uppercase letters, special characters: <, >, &, #, /, ?, or others that are illegal in URLs. Cannot start with: _, aq_, @@, ++. Cannot end with __. Cannot be: request,contributors, ., .., "". Cannot contain new lines." +msgstr "" + +#. Default: "Open in a new tab" +#: components/manage/Blocks/Image/schema +#: components/manage/Blocks/LeadImage/LeadImageSidebar +#: components/manage/Blocks/Teaser/schema +msgid "Open in a new tab" +msgstr "Öppna i ny tabb" + +#. Default: "Open menu" +#: components/theme/Navigation/Navigation +msgid "Open menu" +msgstr "Öppna meny" + +#. Default: "Open object browser" +#: components/manage/AnchorPlugin/components/LinkButton/AddLinkForm +#: components/manage/Widgets/ObjectBrowserWidget +msgid "Open object browser" +msgstr "Öppna objektbläddrare" + +#. Default: "Order" +#: components/manage/Sidebar/Sidebar +msgid "Order" +msgstr "" + +#. Default: "Ordered" +#: components/manage/Blocks/ToC/Schema +msgid "Ordered" +msgstr "Sorterad" + +#. Default: "Origin" +#: components/manage/Blocks/LeadImage/LeadImageSidebar +msgid "Origin" +msgstr "Ursprung" + +#. Default: "Overview of relations of all content items" +#: components/manage/LinksToItem/LinksToItem +msgid "Overview of relations of all content items" +msgstr "Översikt över relationer mellan alla innehållsobjekt" + +#. Default: "Page" +#: components/manage/Toolbar/Toolbar +msgid "Page" +msgstr "Sida" + +#. Default: "Parent fieldset" +#: components/manage/Widgets/SchemaWidget +msgid "Parent fieldset" +msgstr "Föräldrafältgrupp" + +#. Default: "Password" +#: components/theme/Login/Login +#: helpers/MessageLabels/MessageLabels +msgid "Password" +msgstr "Lösenord" + +#. Default: "Password reset" +#: components/theme/PasswordReset/PasswordReset +#: components/theme/PasswordReset/RequestPasswordReset +msgid "Password reset" +msgstr "Återställ lösenord" + +#. Default: "Passwords do not match." +#: components/theme/PasswordReset/PasswordReset +msgid "Passwords do not match." +msgstr "Lösenorden matchar ej" + +#. Default: "Paste" +#: components/manage/Actions/Actions +#: components/manage/Contents/Contents +msgid "Paste" +msgstr "Klistra in" + +#. Default: "Paste blocks" +#: helpers/MessageLabels/MessageLabels +msgid "Paste blocks" +msgstr "Klistra in block" + +#. Default: "Perform the following actions:" +#: components/manage/Controlpanels/Rules/ConfigureRule +msgid "Perform the following actions:" +msgstr "Utför följande åtgärder:" + +#. Default: "Permissions have been updated successfully" +#: components/manage/Sharing/Sharing +msgid "Permissions have been updated successfully" +msgstr "Lyckades uppdatera accessrättigheter" + +#. Default: "Permissions updated" +#: components/manage/Sharing/Sharing +msgid "Permissions updated" +msgstr "Accessrättigheter uppdaterade" + +#. Default: "Personal Information" +#: components/manage/Toolbar/Toolbar +msgid "Personal Information" +msgstr "Personlig information" + +#. Default: "Personal Preferences" +#: components/manage/Preferences/PersonalPreferences +#: components/manage/Toolbar/Toolbar +msgid "Personal Preferences" +msgstr "Preferenser" + +#. Default: "Personal tools" +#: components/manage/Toolbar/More +#: components/manage/Toolbar/Toolbar +msgid "Personal tools" +msgstr "Personliga verktyg" + +#. Default: "Persons responsible for creating the content of this item. Please enter a list of user names, one per line. The principal creator should come first." +#: components/manage/Contents/ContentsPropertiesModal +msgid "Persons responsible for creating the content of this item. Please enter a list of user names, one per line. The principal creator should come first." +msgstr "Personer ansvariga för innehållet i detta objekt. Ange en lista av användarnamn, ett per rad. Den huvudsakliga skaparen av innehåll bör stå först." + +#. Default: "Please choose an existing content as source for this element" +#: components/manage/Blocks/Teaser/DefaultBody +msgid "Please choose an existing content as source for this element" +msgstr "Var god välj befintligt innehåll som källa till detta element" + +#. Default: "Please continue with the upgrade." +#: components/manage/Controlpanels/Controlpanels +msgid "Please continue with the upgrade." +msgstr "Fortsätt uppgraderingen." + +#. Default: "Please ensure you have a backup of your site before performing the upgrade." +#: components/manage/Controlpanels/UpgradeControlPanel +msgid "Please ensure you have a backup of your site before performing the upgrade." +msgstr "Verifiera att det finns backup av webbplatsen innan du genomför uppgraderingen." + +#. Default: "Please enter a valid URL by deleting the block and adding a new video block." +#: components/manage/Blocks/Video/Body +msgid "Please enter a valid URL by deleting the block and adding a new video block." +msgstr "Ta bort videoblocket och lägg till ett nytt med en giltig URL." + +#. Default: "Please enter the Embed Code provided by Google Maps -> Share -> Embed map. It should contain the