From 1bc508a07e82db3f1de746ef023fdf318d4f72db Mon Sep 17 00:00:00 2001 From: SirLouen Date: Fri, 23 Oct 2026 15:18:02 +0200 Subject: [PATCH 1/9] build(deps): take godmin 0.25.0 and react-auth 0.15.0 in the admin and the plugin sdk --- frontend/package.json | 7 +++--- pnpm-lock.yaml | 51 ++++++++++++++++++++++++--------------- sdk/frontend/package.json | 6 ++--- 3 files changed, 38 insertions(+), 26 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index cfab9046..9dd89b24 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -21,13 +21,14 @@ }, "dependencies": { "@gophenberg/frontend-sdk": "workspace:*", - "@gopherium/godmin": "0.23.1", + "@gopherium/godmin": "0.25.0", "@gopherium/gottext": "0.7.0", - "@gopherium/react-auth": "0.13.0", + "@gopherium/react-auth": "0.15.0", "@tanstack/react-query": "^5.102.8", - "@tanstack/react-router": "^1.170.36", + "@tanstack/react-router": "^1.170.44", "@wordpress/date": "5.57.0", "@wordpress/i18n": "6.30.0", + "@wordpress/icons": "18.0.0", "@wordpress/theme": "2.3.0", "@wordpress/ui": "0.24.0", "react": "^19.2.8", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 471a8c84..25df412b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -141,19 +141,19 @@ importers: specifier: workspace:* version: link:../sdk/frontend '@gopherium/godmin': - specifier: 0.23.1 - version: 0.23.1(95cb8e83355dc3cd0ae6db4441fc2ea1) + specifier: 0.25.0 + version: 0.25.0(95cb8e83355dc3cd0ae6db4441fc2ea1) '@gopherium/gottext': specifier: 0.7.0 version: 0.7.0(@wordpress/i18n@6.30.0)(gettext-extractor@4.0.6)(react@19.3.1) '@gopherium/react-auth': - specifier: 0.13.0 - version: 0.13.0(a5835c01ae64bb1b13002b90bd755989) + specifier: 0.15.0 + version: 0.15.0(2d3f16a3b2e3dd70991c065c2099a2ee) '@tanstack/react-query': specifier: ^5.102.8 version: 5.104.3(react@19.3.1) '@tanstack/react-router': - specifier: ^1.170.36 + specifier: ^1.170.44 version: 1.170.45(react-dom@19.3.1(react@19.3.1))(react@19.3.1) '@wordpress/date': specifier: 5.57.0 @@ -161,6 +161,9 @@ importers: '@wordpress/i18n': specifier: 6.30.0 version: 6.30.0 + '@wordpress/icons': + specifier: 18.0.0 + version: 18.0.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) '@wordpress/theme': specifier: 2.3.0 version: 2.3.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(stylelint@17.16.0(supports-color@10.2.2)(typescript@6.0.3))(vite@8.3.4(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)) @@ -263,11 +266,11 @@ importers: sdk/frontend: dependencies: '@gopherium/godmin': - specifier: 0.23.1 - version: 0.23.1(95cb8e83355dc3cd0ae6db4441fc2ea1) + specifier: 0.25.0 + version: 0.25.0(95cb8e83355dc3cd0ae6db4441fc2ea1) '@gopherium/react-auth': - specifier: 0.13.0 - version: 0.13.0(a5835c01ae64bb1b13002b90bd755989) + specifier: 0.15.0 + version: 0.15.0(2d3f16a3b2e3dd70991c065c2099a2ee) '@tanstack/react-query': specifier: ^5.102.8 version: 5.104.3(react@19.3.1) @@ -321,7 +324,7 @@ importers: version: 19.3.1 devDependencies: '@tanstack/react-router': - specifier: ^1.170.36 + specifier: ^1.170.44 version: 1.170.45(react-dom@19.3.1(react@19.3.1))(react@19.3.1) '@testing-library/jest-dom': specifier: ^7.0.0 @@ -1282,10 +1285,10 @@ packages: '@floating-ui/utils@0.2.12': resolution: {integrity: sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==} - '@gopherium/godmin@0.23.1': - resolution: {integrity: sha512-OttAJApRY5Ye5WcMgFaJUQXy0KkvtxWfP5S1nhsjEtiakzD2WwAkWcnFkOrxIpNQTd5Cwn2YyUfAH1UVaeJllA==} + '@gopherium/godmin@0.25.0': + resolution: {integrity: sha512-X1stZFI7Hg1voaruRqjj59HmfLdPblw+9FaioyJZ6fc1nNwYz6m2DwxSJeDPRwdNbVp4RLcMo/fB4l6Us3UUsA==} peerDependencies: - '@tanstack/react-router': ^1.170.0 + '@tanstack/react-router': ^1.170.44 '@testing-library/react': ^16.3.2 '@wordpress/a11y': '>=4.57.0 <5.0.0' '@wordpress/components': '>=42.0.0 <43.0.0' @@ -1310,8 +1313,6 @@ packages: optional: true '@wordpress/date': optional: true - '@wordpress/i18n': - optional: true stylelint: optional: true vitest: @@ -1330,13 +1331,14 @@ packages: react: optional: true - '@gopherium/react-auth@0.13.0': - resolution: {integrity: sha512-Ho1aB6x24NEpHkRmTJ3EywpLrNSJJ8El+tz5wQdTRc6bdxt0JLQEAF9RSripvdMUEXrD2p6zG3rIb8H1srWnpw==} + '@gopherium/react-auth@0.15.0': + resolution: {integrity: sha512-L1kQHGX2Unl9MBidGDlxJBsVprCn+LZfErdjXp68kZhT1qyqpfIep+TXb2iVttAqBSJPOBhIAsYLwQ40bmLOqA==} peerDependencies: '@tanstack/react-query': ^5.101.2 '@testing-library/jest-dom': ^6.9.1 || ^7.0.0 '@testing-library/react': ^16.3.2 '@wordpress/i18n': '>=6.30.0 <7.0.0' + '@wordpress/icons': '>=18.0.0 <19.0.0' '@wordpress/theme': '>=2.3.0 <3.0.0' '@wordpress/ui': '>=0.24.0 <0.25.0' msw: ^2.15.0 @@ -1347,6 +1349,8 @@ packages: optional: true '@testing-library/react': optional: true + '@wordpress/icons': + optional: true '@wordpress/theme': optional: true '@wordpress/ui': @@ -6077,6 +6081,9 @@ packages: zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + zxcvbn@4.4.1: + resolution: {integrity: sha512-x0E4LO+bSbjKdhIxEgNzLfXokvdqd1EkBF7Yu1NJIB/3mDw1kaCgc4V33pGEYDYDhnjTGbD2RhmRpvuYTUp8TA==} + snapshots: '@adobe/css-tools@4.5.0': {} @@ -6998,9 +7005,10 @@ snapshots: '@floating-ui/utils@0.2.12': {} - '@gopherium/godmin@0.23.1(95cb8e83355dc3cd0ae6db4441fc2ea1)': + '@gopherium/godmin@0.25.0(95cb8e83355dc3cd0ae6db4441fc2ea1)': dependencies: '@wordpress/a11y': 4.57.0 + '@wordpress/i18n': 6.30.0 '@wordpress/icons': 18.0.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) '@wordpress/style-runtime': 0.13.0 '@wordpress/theme': 2.3.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(stylelint@17.16.0(supports-color@10.2.2)(typescript@6.0.3))(vite@8.3.4(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)) @@ -7012,7 +7020,6 @@ snapshots: '@wordpress/components': 42.0.0(@date-fns/tz@1.5.0)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(stylelint@17.16.0(supports-color@10.2.2)(typescript@6.0.3))(supports-color@10.2.2)(vite@8.3.4(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)) '@wordpress/dataviews': 20.0.0(@emotion/is-prop-valid@1.4.0)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(stylelint@17.16.0(supports-color@10.2.2)(typescript@6.0.3))(supports-color@10.2.2)(vite@8.3.4(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)) '@wordpress/date': 5.57.0 - '@wordpress/i18n': 6.30.0 stylelint: 17.16.0(supports-color@10.2.2)(typescript@6.0.3) vitest: 5.0.5(@types/node@26.6.5)(@vitest/coverage-v8@5.0.5)(jsdom@30.1.3)(msw@2.15.0(@types/node@26.6.5)(typescript@6.0.3))(vite@8.3.4(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)) @@ -7024,15 +7031,17 @@ snapshots: gettext-extractor: 4.0.6 react: 19.3.1 - '@gopherium/react-auth@0.13.0(a5835c01ae64bb1b13002b90bd755989)': + '@gopherium/react-auth@0.15.0(2d3f16a3b2e3dd70991c065c2099a2ee)': dependencies: '@tanstack/react-query': 5.104.3(react@19.3.1) '@wordpress/i18n': 6.30.0 react: 19.3.1 zod: 4.6.7 + zxcvbn: 4.4.1 optionalDependencies: '@testing-library/jest-dom': 7.0.1(@testing-library/dom@10.4.1)(vitest@5.0.5) '@testing-library/react': 16.3.3(@testing-library/dom@10.4.1)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) + '@wordpress/icons': 18.0.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1) '@wordpress/theme': 2.3.0(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(stylelint@17.16.0(supports-color@10.2.2)(typescript@6.0.3))(vite@8.3.4(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)) '@wordpress/ui': 0.24.0(@date-fns/tz@1.5.0)(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.28)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(stylelint@17.16.0(supports-color@10.2.2)(typescript@6.0.3))(vite@8.3.4(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)) msw: 2.15.0(@types/node@26.6.5)(typescript@6.0.3) @@ -11978,3 +11987,5 @@ snapshots: zod@4.6.7: {} zwitch@2.0.4: {} + + zxcvbn@4.4.1: {} diff --git a/sdk/frontend/package.json b/sdk/frontend/package.json index c7cf65c4..6437f31d 100644 --- a/sdk/frontend/package.json +++ b/sdk/frontend/package.json @@ -11,8 +11,8 @@ "./testing": "./testing.tsx" }, "dependencies": { - "@gopherium/godmin": "0.23.1", - "@gopherium/react-auth": "0.13.0", + "@gopherium/godmin": "0.25.0", + "@gopherium/react-auth": "0.15.0", "@tanstack/react-query": "^5.102.8", "@wordpress/a11y": "4.57.0", "@wordpress/api-fetch": "7.57.0", @@ -32,7 +32,7 @@ "react": "^19.2.8" }, "devDependencies": { - "@tanstack/react-router": "^1.170.36", + "@tanstack/react-router": "^1.170.44", "@testing-library/jest-dom": "^7.0.0", "@testing-library/react": "^16.3.3", "@types/node": "^26.5.0", From f97093dfc3d37b1cd6a2923168faf26d011f7cdf Mon Sep 17 00:00:00 2001 From: SirLouen Date: Fri, 23 Oct 2026 15:18:02 +0200 Subject: [PATCH 2/9] feat(sdk): hand plugins the menu row type, the sub menu parts and the menu icons --- frontend/src/content/nav.tsx | 93 ++++++++++++++--------- frontend/src/i18n/nav.tsx | 18 ++--- frontend/src/media/nav.tsx | 11 +-- frontend/src/menu/coreNav.tsx | 30 ++++---- frontend/src/menu/test/navLabels.test.tsx | 29 ++++--- frontend/src/settings/nav.tsx | 20 ++--- frontend/src/test/boot-locale.test.ts | 4 +- frontend/src/themes/nav.tsx | 17 ++--- sdk/frontend/index.ts | 41 +++++----- sdk/frontend/test/menu-icons.test.ts | 28 +++++++ 10 files changed, 158 insertions(+), 133 deletions(-) create mode 100644 sdk/frontend/test/menu-icons.test.ts diff --git a/frontend/src/content/nav.tsx b/frontend/src/content/nav.tsx index 0d30a659..7b037475 100644 --- a/frontend/src/content/nav.tsx +++ b/frontend/src/content/nav.tsx @@ -1,75 +1,92 @@ // SPDX-License-Identifier: Apache-2.0 -import type { NavItem } from '@gophenberg/frontend-sdk' -import { __ } from '@wordpress/i18n' +import { categoryIcon, customPostTypeIcon, listIcon, pageIcon, postIcon } from '@gophenberg/frontend-sdk' +import type { MenuItem } from '@gophenberg/frontend-sdk' +import { _x } from '@wordpress/i18n' import { useQuery } from '@tanstack/react-query' import { pluralOf } from './typeText' import { listTypes } from './types' import type { ContentType } from './types' -const contentIcon = ( - - - -) - -const typesIcon = ( - - - -) - /** The registry section, which is not itself a content type. */ -export const typesNavItem: NavItem = { +export const typesMenuItem = { get label() { - return __('Content Types', 'gophenberg') + return _x('Content Types', 'admin section', 'gophenberg') }, to: '/content-types', - icon: typesIcon, -} + icon: customPostTypeIcon, +} satisfies MenuItem /** The key the registry is cached under. */ export const typesQueryKey = ['content-types'] -const groupsIcon = ( - - - -) - /** The field groups section, where fields live and their rules are set. */ -export const groupsNavItem: NavItem = { +export const groupsMenuItem: MenuItem = { get label() { - return __('Field Groups', 'gophenberg') + return _x('Field Groups', 'admin section', 'gophenberg') }, to: '/field-groups', - icon: groupsIcon, + icon: listIcon, +} + +/** The glyphs of the built-in types WordPress draws apart from posts, by type key. */ +const TYPE_GLYPHS = new Map([ + ['page', pageIcon], + ['category', categoryIcon], +]) + +/** + * Returns the glyph of a type's row: WordPress's own for a built-in type no plugin declared, the Posts glyph otherwise. + * @param registered - The type the row stands for. + * @returns The glyph the row draws. + */ +function glyphOf(registered: ContentType): MenuItem['icon'] { + const shipped = (registered.origin ?? '') === '' ? TYPE_GLYPHS.get(registered.key) : undefined + return shipped ?? postIcon } /** - * Returns the nav entry a content type is reached through. - * @param registered - The type the entry stands for. - * @returns The nav entry for that type. + * Returns the menu row a content type is reached through. + * @param registered - The type the row stands for. + * @returns The menu row for that type. */ -function typeNavItem(registered: ContentType): NavItem { +function typeMenuItem(registered: ContentType): MenuItem { return { label: pluralOf(registered), to: `/content/${registered.key}`, - icon: contentIcon, + icon: glyphOf(registered), } } /** - * Returns one nav entry per active content type, the root type first. - * @returns The entries, empty until the registry answers. + * Returns one menu row per active content type, the root type first. + * @returns The rows, empty until the registry answers. */ -export function useContentNav(): NavItem[] { +export function useContentNav(): MenuItem[] { const types = useQuery({ queryKey: typesQueryKey, queryFn: listTypes }) return (types.data ?? []) .filter((registered) => registered.active) .sort((left, right) => Number(right.isDefault) - Number(left.isDefault)) - .map(typeNavItem) + .map(typeMenuItem) +} + +/** What the registry says of the type the root opens. */ +interface DefaultType { + /** The key of the default type, undefined until the registry answers or when it could not be read. */ + key: string | undefined + /** Whether the registry could not be read. */ + failed: boolean +} + +/** + * Returns the type the root opens, read from the same registry the menu rows come from. + * @returns The default type's key once the registry answers, and whether it failed. + */ +export function useDefaultType(): DefaultType { + const types = useQuery({ queryKey: typesQueryKey, queryFn: listTypes }) + return { + key: types.data?.find((registered) => registered.isDefault)?.key, + failed: types.isError, + } } diff --git a/frontend/src/i18n/nav.tsx b/frontend/src/i18n/nav.tsx index 94b0c0da..cc84e729 100644 --- a/frontend/src/i18n/nav.tsx +++ b/frontend/src/i18n/nav.tsx @@ -1,20 +1,12 @@ // SPDX-License-Identifier: Apache-2.0 -import type { NavItem } from '@gophenberg/frontend-sdk' -import { __ } from '@wordpress/i18n' +import { languageIcon } from '@gophenberg/frontend-sdk' +import type { MenuItem } from '@gophenberg/frontend-sdk' +import { _x } from '@wordpress/i18n' -const languageIcon = ( - - - -) - -export const languageNavItem: NavItem = { +export const languageMenuItem: MenuItem = { get label() { - return __('Language', 'gophenberg') + return _x('Language', 'admin section', 'gophenberg') }, to: '/language', icon: languageIcon, diff --git a/frontend/src/media/nav.tsx b/frontend/src/media/nav.tsx index b5ba22f6..66d88802 100644 --- a/frontend/src/media/nav.tsx +++ b/frontend/src/media/nav.tsx @@ -1,15 +1,10 @@ // SPDX-License-Identifier: Apache-2.0 -import type { NavItem } from '@gophenberg/frontend-sdk' +import { mediaIcon } from '@gophenberg/frontend-sdk' +import type { MenuItem } from '@gophenberg/frontend-sdk' import { _x } from '@wordpress/i18n' -const mediaIcon = ( - - - -) - -export const mediaNavItem: NavItem = { +export const mediaMenuItem: MenuItem = { get label() { return _x('Media', 'admin section', 'gophenberg') }, diff --git a/frontend/src/menu/coreNav.tsx b/frontend/src/menu/coreNav.tsx index b848471d..67fb3900 100644 --- a/frontend/src/menu/coreNav.tsx +++ b/frontend/src/menu/coreNav.tsx @@ -1,20 +1,20 @@ // SPDX-License-Identifier: Apache-2.0 -import type { NavItem } from '@gophenberg/frontend-sdk' -import { usersNavItem } from '@gopherium/react-auth/wpds' +import type { MenuItem } from '@gophenberg/frontend-sdk' +import { usersMenuItem } from '@gopherium/react-auth/wpds' -import { languageNavItem } from '../i18n/nav' -import { mediaNavItem } from '../media/nav' -import { groupsNavItem, typesNavItem } from '../content/nav' -import { settingsNavItem } from '../settings/nav' -import { themesNavItem } from '../themes/nav' +import { languageMenuItem } from '../i18n/nav' +import { mediaMenuItem } from '../media/nav' +import { groupsMenuItem, typesMenuItem } from '../content/nav' +import { settingsMenuItem } from '../settings/nav' +import { themesMenuItem } from '../themes/nav' -export const coreNav: NavItem[] = [ - mediaNavItem, - themesNavItem, - typesNavItem, - groupsNavItem, - usersNavItem, - languageNavItem, - settingsNavItem, +export const coreNav: MenuItem[] = [ + mediaMenuItem, + themesMenuItem, + typesMenuItem, + groupsMenuItem, + usersMenuItem, + languageMenuItem, + settingsMenuItem, ] diff --git a/frontend/src/menu/test/navLabels.test.tsx b/frontend/src/menu/test/navLabels.test.tsx index a81deefa..95801ce9 100644 --- a/frontend/src/menu/test/navLabels.test.tsx +++ b/frontend/src/menu/test/navLabels.test.tsx @@ -3,24 +3,29 @@ import { setLocaleData } from '@wordpress/i18n' import { expect, test } from 'vitest' -import { typesNavItem } from '../../content/nav' -import { languageNavItem } from '../../i18n/nav' -import { mediaNavItem } from '../../media/nav' -import { themesNavItem } from '../../themes/nav' +import { groupsMenuItem, typesMenuItem } from '../../content/nav' +import { languageMenuItem } from '../../i18n/nav' +import { mediaMenuItem } from '../../media/nav' +import { settingsMenuItem } from '../../settings/nav' +import { themesMenuItem } from '../../themes/nav' setLocaleData( { 'admin section\u0004Media': ['Medios'], - Themes: ['Temas'], - 'Content Types': ['Tipos de contenido'], - Language: ['Idioma'], + 'admin section\u0004Themes': ['Temas'], + 'admin section\u0004Content Types': ['Tipos de contenido'], + 'admin section\u0004Field Groups': ['Grupos de campos'], + 'admin section\u0004Language': ['Idioma'], + 'admin section\u0004Settings': ['Ajustes'], }, 'gophenberg', ) -test('every core nav label follows the catalogue the reader loaded', () => { - expect(mediaNavItem.label).toBe('Medios') - expect(themesNavItem.label).toBe('Temas') - expect(typesNavItem.label).toBe('Tipos de contenido') - expect(languageNavItem.label).toBe('Idioma') +test('every core menu label follows the catalogue the reader loaded, under the admin section context', () => { + expect(mediaMenuItem.label).toBe('Medios') + expect(themesMenuItem.label).toBe('Temas') + expect(typesMenuItem.label).toBe('Tipos de contenido') + expect(groupsMenuItem.label).toBe('Grupos de campos') + expect(languageMenuItem.label).toBe('Idioma') + expect(settingsMenuItem.label).toBe('Ajustes') }) diff --git a/frontend/src/settings/nav.tsx b/frontend/src/settings/nav.tsx index 9bda4409..52cacd4e 100644 --- a/frontend/src/settings/nav.tsx +++ b/frontend/src/settings/nav.tsx @@ -1,22 +1,12 @@ // SPDX-License-Identifier: Apache-2.0 -import type { NavItem } from '@gophenberg/frontend-sdk' -import { __ } from '@wordpress/i18n' +import { settingsIcon } from '@gophenberg/frontend-sdk' +import type { MenuItem } from '@gophenberg/frontend-sdk' +import { _x } from '@wordpress/i18n' -const settingsIcon = ( - - - -) - -export const settingsNavItem: NavItem = { +export const settingsMenuItem: MenuItem = { get label() { - return __('Settings', 'gophenberg') + return _x('Settings', 'admin section', 'gophenberg') }, to: '/settings', icon: settingsIcon, diff --git a/frontend/src/test/boot-locale.test.ts b/frontend/src/test/boot-locale.test.ts index da2772a8..2bc92757 100644 --- a/frontend/src/test/boot-locale.test.ts +++ b/frontend/src/test/boot-locale.test.ts @@ -6,7 +6,7 @@ import { dateI18n, getDate, getSettings, setSettings } from '@wordpress/date' import { __, getLocaleData, resetLocaleData } from '@wordpress/i18n' import { afterEach, beforeEach, expect, test } from 'vitest' -import { usersNavItem } from '@gopherium/react-auth/wpds' +import { usersMenuItem } from '@gopherium/react-auth/wpds' import { displayLocale } from '@gopherium/gottext' import { DOMAIN, startLocale } from '../i18n/start' @@ -221,5 +221,5 @@ test('loads the brick catalogue so its screens speak the same language', async ( await startLocale() - expect(usersNavItem.label).toBe('Usuarios') + expect(usersMenuItem.label).toBe('Usuarios') }) diff --git a/frontend/src/themes/nav.tsx b/frontend/src/themes/nav.tsx index 1cae0983..44f7fa72 100644 --- a/frontend/src/themes/nav.tsx +++ b/frontend/src/themes/nav.tsx @@ -1,18 +1,13 @@ // SPDX-License-Identifier: Apache-2.0 -import type { NavItem } from '@gophenberg/frontend-sdk' -import { __ } from '@wordpress/i18n' +import { brushIcon } from '@gophenberg/frontend-sdk' +import type { MenuItem } from '@gophenberg/frontend-sdk' +import { _x } from '@wordpress/i18n' -const themesIcon = ( - - - -) - -export const themesNavItem: NavItem = { +export const themesMenuItem: MenuItem = { get label() { - return __('Themes', 'gophenberg') + return _x('Themes', 'admin section', 'gophenberg') }, to: '/themes', - icon: themesIcon, + icon: brushIcon, } diff --git a/sdk/frontend/index.ts b/sdk/frontend/index.ts index dbde8e13..fed9e213 100644 --- a/sdk/frontend/index.ts +++ b/sdk/frontend/index.ts @@ -1,9 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 +import type { MenuItem } from '@gopherium/godmin/router' import type { AnyRoute } from '@tanstack/react-router' -import type { ComponentProps, ComponentType, ReactElement } from 'react' - -import type { Capability } from './capabilities' export type { BulkRun, @@ -19,26 +17,24 @@ export type { RunSettled, ToasterHandle, } from '@gopherium/godmin' -export { ConfirmBody, FormBody, RenameBody, RunConfirm, useBulkRun, useListRun, useToaster } from '@gopherium/godmin' - -declare module '@tanstack/react-router' { - interface StaticDataRouteOption { - Sidebar?: ComponentType - capability?: Capability - } -} - -export interface NavItem { - label: string - to: string - icon: ReactElement> - capability?: Capability -} +export { + ConfirmBody, + FormBody, + MenuCount, + NavigationScreen, + RenameBody, + RunConfirm, + useBulkRun, + useListRun, + useToaster, +} from '@gopherium/godmin' +export type { MenuItem } from '@gopherium/godmin/router' +export { DrilldownItem, NavigationItem, NavigationList } from '@gopherium/godmin/router' export interface FrontendPlugin { id: string routes: (parent: AnyRoute) => AnyRoute[] - nav: NavItem[] + nav: MenuItem[] } export { @@ -61,13 +57,20 @@ export { commentAuthorAvatar as authorIcon, chevronLeft as backIcon, backup as backupIcon, + brush as brushIcon, + category as categoryIcon, closeSmall as closeIcon, + customPostType as customPostTypeIcon, chevronDown as downIcon, + language as languageIcon, + list as listIcon, listView as listViewIcon, media as mediaIcon, + page as pageIcon, post as postIcon, redo as redoIcon, cloudUpload as saveIcon, + settings as settingsIcon, drawerRight as sidebarIcon, drawerLeft as sidebarRtlIcon, trash as trashIcon, diff --git a/sdk/frontend/test/menu-icons.test.ts b/sdk/frontend/test/menu-icons.test.ts new file mode 100644 index 00000000..2c5fae7e --- /dev/null +++ b/sdk/frontend/test/menu-icons.test.ts @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: Apache-2.0 + +import { brush, category, customPostType, language, list, media, page, post, settings } from '@wordpress/icons' +import { expect, test } from 'vitest' + +import { + brushIcon, + categoryIcon, + customPostTypeIcon, + languageIcon, + listIcon, + mediaIcon, + pageIcon, + postIcon, + settingsIcon, +} from '../index' + +test('hands the sidebar rows the glyphs WordPress draws them with', () => { + expect(postIcon).toBe(post) + expect(pageIcon).toBe(page) + expect(categoryIcon).toBe(category) + expect(mediaIcon).toBe(media) + expect(brushIcon).toBe(brush) + expect(settingsIcon).toBe(settings) + expect(languageIcon).toBe(language) + expect(customPostTypeIcon).toBe(customPostType) + expect(listIcon).toBe(list) +}) From 147c557e8cc1af0209bdb213306c52299e47573a Mon Sep 17 00:00:00 2001 From: SirLouen Date: Fri, 23 Oct 2026 15:18:03 +0200 Subject: [PATCH 3/9] feat(frontend): frame the admin with the shared godmin sidebar and drop its own menu --- frontend/src/Layout.tsx | 40 +++- frontend/src/RailContent.tsx | 38 ---- frontend/src/content/fields.tsx | 3 +- frontend/src/index.css | 82 ------- frontend/src/menu/MainMenu.tsx | 91 -------- frontend/src/menu/test/MainMenu.test.tsx | 105 --------- frontend/src/menu/test/menuStyles.test.ts | 39 ---- frontend/src/router.tsx | 29 +-- frontend/src/test/account.test.tsx | 2 +- frontend/src/test/brick-labels.test.tsx | 22 +- frontend/src/test/canvas.test.tsx | 10 +- frontend/src/test/content-nav.test.tsx | 31 ++- frontend/src/test/drilldown.test.tsx | 206 +++++++++++++----- frontend/src/test/editor-route.test.tsx | 6 +- frontend/src/test/layout-brand.test.tsx | 4 +- frontend/src/test/navigation-items.test.tsx | 114 ++++++++++ frontend/src/test/posts-section.test.tsx | 32 +-- frontend/src/test/rail-rows.test.tsx | 35 --- frontend/src/test/route-pending.test.tsx | 23 -- frontend/src/test/route-preload.test.tsx | 51 +++++ frontend/src/test/router.test.tsx | 52 ++--- frontend/src/test/sectionPlugin.tsx | 39 ++++ ...sion.test.tsx => sidebar-version.test.tsx} | 0 frontend/src/test/small-shell.test.tsx | 52 +++-- frontend/src/test/version-display.test.tsx | 16 +- frontend/vite.config.ts | 3 +- sdk/frontend/test/testing.test.tsx | 113 ++++++++-- sdk/frontend/testing.tsx | 55 +++-- 28 files changed, 645 insertions(+), 648 deletions(-) delete mode 100644 frontend/src/RailContent.tsx delete mode 100644 frontend/src/menu/MainMenu.tsx delete mode 100644 frontend/src/menu/test/MainMenu.test.tsx delete mode 100644 frontend/src/menu/test/menuStyles.test.ts create mode 100644 frontend/src/test/navigation-items.test.tsx delete mode 100644 frontend/src/test/rail-rows.test.tsx delete mode 100644 frontend/src/test/route-pending.test.tsx create mode 100644 frontend/src/test/route-preload.test.tsx create mode 100644 frontend/src/test/sectionPlugin.tsx rename frontend/src/test/{rail-version.test.tsx => sidebar-version.test.tsx} (100%) diff --git a/frontend/src/Layout.tsx b/frontend/src/Layout.tsx index 639b48ea..dae1cb33 100644 --- a/frontend/src/Layout.tsx +++ b/frontend/src/Layout.tsx @@ -1,26 +1,48 @@ // SPDX-License-Identifier: Apache-2.0 -import { Text } from '@gophenberg/frontend-sdk' +import { Text, can } from '@gophenberg/frontend-sdk' import { Frame } from '@gopherium/godmin' -import { __ } from '@wordpress/i18n' -import { useCanvas, useFrameLocation } from '@gopherium/godmin/router' -import { Outlet } from '@tanstack/react-router' +import { Navigation, useCanvas, useFrameLocation } from '@gopherium/godmin/router' +import { useSession } from '@gopherium/react-auth' +import { AccountPanel } from '@gopherium/react-auth/wpds' +import { Link, Outlet } from '@tanstack/react-router' +import { __, sprintf } from '@wordpress/i18n' -import { RailContent } from './RailContent' +import { useContentNav, useDefaultType } from './content/nav' +import { coreNav } from './menu/coreNav' +import { plugins } from './plugins' +import { useAppVersion } from './version' + +/** + * Returns the link to the list the root lands on, where Back on a sub menu goes. + * @returns The default type's list once the types answer, else the root, which waits on them or reports them. + */ +function useHome() { + const { key } = useDefaultType() + return key === undefined ? : +} /** * Renders the admin layout framing the active route. * @returns The layout element. */ export function Layout() { + const session = useSession().data + const version = useAppVersion().data return ( - {'Gophenberg'}} - menuLabel={__('Open navigation', 'gophenberg')} + footer={} + footerNote={version ? sprintf(__('v%(version)s', 'gophenberg'), { version }) : undefined} > - - + plugin.nav)]} + home={useHome()} + can={(capability) => can(session, capability)} + /> + diff --git a/frontend/src/RailContent.tsx b/frontend/src/RailContent.tsx deleted file mode 100644 index cebcee3f..00000000 --- a/frontend/src/RailContent.tsx +++ /dev/null @@ -1,38 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 - -import { Stack, Text } from '@gophenberg/frontend-sdk' -import { AccountPanel } from '@gopherium/react-auth/wpds' -import { Link, useRouterState } from '@tanstack/react-router' -import { __, sprintf } from '@wordpress/i18n' - -import { MainMenu } from './menu/MainMenu' -import { useAppVersion } from './version' - -/** - * Renders the navigation region's contents. - * @returns The rail content element. - */ -export function RailContent() { - const matches = useRouterState({ select: (state) => state.matches }) - const Sidebar = [...matches].reverse().find((match) => match.staticData.Sidebar) - ?.staticData.Sidebar - const version = useAppVersion().data - return ( - <> - - - {'Gophenberg'} - - - - - {version ? ( - - {sprintf(__('v%(version)s', 'gophenberg'), { version })} - - ) : null} - - ) -} diff --git a/frontend/src/content/fields.tsx b/frontend/src/content/fields.tsx index 0a68fca3..9792d661 100644 --- a/frontend/src/content/fields.tsx +++ b/frontend/src/content/fields.tsx @@ -2,6 +2,7 @@ import { Badge } from '@gophenberg/frontend-sdk' import type { Field, Filter } from '@gophenberg/frontend-sdk/dataviews' +import { HUGE_BREAKPOINT } from '@gopherium/godmin' import type { ViewGuard } from '@gopherium/godmin' import { listDate } from '@gopherium/godmin/dates' import { formatDate } from '@gopherium/gottext' @@ -143,7 +144,7 @@ export const PHONE_COLUMNS = ['status', 'date'] export const TABLE_LAYOUT = { layout: { styles: { author: { align: 'start', maxWidth: '15ch' } } } } as const /** The viewports below WordPress's huge breakpoint, where a table opens on its built-in columns alone. */ -export const BELOW_HUGE_QUERY = '(max-width: 1439px)' +export const BELOW_HUGE_QUERY = `(max-width: ${HUGE_BREAKPOINT - 1}px)` /** * Returns the ids of the columns a list shows before a reader picks any, the fields a type marks for the list last. diff --git a/frontend/src/index.css b/frontend/src/index.css index 9be1bf60..7cd38426 100644 --- a/frontend/src/index.css +++ b/frontend/src/index.css @@ -1,87 +1,5 @@ /* SPDX-License-Identifier: Apache-2.0 */ -.godmin-layout__rail { - scrollbar-width: thin; - scrollbar-color: transparent transparent; -} - -.godmin-layout__rail:hover, -.godmin-layout__rail:focus-within { - scrollbar-color: var(--wpds-color-stroke-surface-neutral-strong) transparent; -} - -.godmin-layout__rail::-webkit-scrollbar { - width: 12px; - height: 12px; -} - -.godmin-layout__rail::-webkit-scrollbar-track { - background-color: transparent; -} - -.godmin-layout__rail::-webkit-scrollbar-thumb { - background-color: transparent; - border-radius: 8px; - border: 3px solid transparent; - background-clip: padding-box; -} - -.godmin-layout__rail:hover::-webkit-scrollbar-thumb, -.godmin-layout__rail:focus-within::-webkit-scrollbar-thumb { - background-color: var(--wpds-color-stroke-surface-neutral-strong); -} - -.gophenberg-rail__brand { - color: inherit; - text-decoration: none; -} - -.gophenberg-rail__account { - margin-top: auto; - padding-top: 16px; - border-top: 1px solid var(--wpds-color-stroke-surface-neutral); -} - -.gophenberg-rail__version { - padding-top: 8px; - color: var(--wpds-color-foreground-content-neutral-weak); - font-size: var(--wpds-typography-font-size-sm); -} - -.gophenberg-menu__item { - display: block; - box-sizing: border-box; - min-height: 40px; - padding: 8px 6px 8px 16px; - border-radius: var(--wpds-border-radius-md); - color: var(--wpds-color-foreground-interactive-neutral-weak); - font-size: var(--wpds-typography-font-size-md); - text-decoration: none; -} - -.gophenberg-menu__item:hover { - color: var(--wpds-color-foreground-interactive-neutral-weak-active); -} - -.gophenberg-menu__item:focus-visible { - outline: var(--wpds-border-width-focus) solid var(--wpds-color-stroke-focus); - outline-offset: 2px; -} - -.gophenberg-menu__item[data-status='active'] { - background: var(--wpds-color-background-interactive-neutral-weak-active); - color: var(--wpds-color-foreground-interactive-neutral-weak-active); - font-weight: var(--wpds-typography-font-weight-emphasis); -} - -.gophenberg-menu__label { - flex: 1; -} - -.gophenberg-menu__chevron { - opacity: 0.5; -} - .gophenberg-author { display: flex; align-items: center; diff --git a/frontend/src/menu/MainMenu.tsx b/frontend/src/menu/MainMenu.tsx deleted file mode 100644 index 20ba4c7f..00000000 --- a/frontend/src/menu/MainMenu.tsx +++ /dev/null @@ -1,91 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 - -import { Icon, Stack, can } from '@gophenberg/frontend-sdk' -import type { NavItem } from '@gophenberg/frontend-sdk' -import { useSession } from '@gopherium/react-auth' -import { Link, useRouter } from '@tanstack/react-router' -import type { AnyRoute } from '@tanstack/react-router' - - -import { useContentNav } from '../content/nav' -import { plugins } from '../plugins' -import { coreNav } from './coreNav' - -const chevronRightSmall = ( - - - -) - -/** - * Reports whether the route or one of its ancestors declares a sidebar section. - * @param route - The route the nav entry points at. - * @returns Whether navigating there swaps the sidebar to a section screen. - */ -function drillsIntoSection(route: AnyRoute | undefined): boolean { - for (let current = route; current; current = current.parentRoute) { - if (current.options.staticData?.Sidebar) { - return true - } - } - return false -} - -/** - * Renders a single sidebar menu row: an icon, the label, and when the - * target route declares a sidebar section, a chevron marking the drill-down. - * @param item - The nav entry the row links to. - * @returns The menu link for the given nav item. - */ -function MenuItem({ item }: { item: NavItem }) { - const routesByPath: Record = - useRouter().routesByPath - const drillsDown = drillsIntoSection(routesByPath[item.to]) - return ( - - - - {item.label} - {drillsDown ? ( - - ) : null} - - - ) -} - -/** - * Renders the top-level navigation menu: the core sections first, then one - * row per plugin nav entry, each row shown when the session carries the - * capability it names and the one its route asks for. - * @returns The navigation landmark containing the menu rows. - */ -export function MainMenu() { - const contentNav = useContentNav() - const session = useSession().data - const routesByPath: Record = useRouter().routesByPath - const reachable = (items: NavItem[]) => - items.filter((item) => - [item.capability, routesByPath[item.to]?.options.staticData?.capability].every( - (asked) => asked === undefined || can(session, asked), - ), - ) - return ( - - {reachable(contentNav).map((item) => ( - - ))} - {reachable(coreNav).map((item) => ( - - ))} - {plugins.flatMap((plugin) => - reachable(plugin.nav).map((item) => ), - )} - - ) -} diff --git a/frontend/src/menu/test/MainMenu.test.tsx b/frontend/src/menu/test/MainMenu.test.tsx deleted file mode 100644 index 8da5dc73..00000000 --- a/frontend/src/menu/test/MainMenu.test.tsx +++ /dev/null @@ -1,105 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 - -import { QueryClient, QueryClientProvider } from '@tanstack/react-query' -import { - Outlet, - RouterProvider, - createMemoryHistory, - createRootRoute, - createRoute, - createRouter, -} from '@tanstack/react-router' -import { defaultUser, seedSession } from '@gopherium/react-auth/testing' -import { render, screen, within } from '@testing-library/react' -import { expect, test } from 'vitest' - -import { plugins } from '../../plugins' -import { coreNav } from '../coreNav' -import { MainMenu } from '../MainMenu' - -const navItems = [...coreNav, ...plugins.flatMap((plugin) => plugin.nav)] - -/** - * Renders the main menu as an admin over a route for every navigation item. - * @param path - The path to start at. - * @param withSections - Whether each route carries a sidebar of its own. - */ -function renderMenuAt(path: string, withSections = false) { - const rootRoute = createRootRoute({ - component: function MenuHost() { - return ( - <> - - - - ) - }, - }) - const routes = [{ to: '/' }, ...navItems].map((item) => - createRoute({ - getParentRoute: () => rootRoute, - path: item.to, - staticData: withSections - ? { - Sidebar: function SectionSidebar() { - return null - }, - } - : {}, - component: function Blank() { - return null - }, - }), - ) - const router = createRouter({ - routeTree: rootRoute.addChildren(routes), - history: createMemoryHistory({ initialEntries: [path] }), - }) - const client = new QueryClient({ defaultOptions: { queries: { retry: false } } }) - seedSession(client, { - ...defaultUser, - role: 'admin', - capabilities: ['manage_users', 'manage_themes', 'manage_types', 'manage_settings', 'change_others_work'], - }) - render( - - - , - ) -} - -test('renders a menu link for every core and plugin nav entry', async () => { - renderMenuAt('/') - - const nav = await screen.findByRole('navigation', { name: 'Navigation' }) - expect(within(nav).getAllByRole('link')).toHaveLength(navItems.length) - for (const item of navItems) { - expect( - within(nav).getByRole('link', { name: item.label }), - ).toBeInTheDocument() - } -}) - -test('marks the item for the active route as current', async () => { - const [target] = navItems - renderMenuAt(target.to) - - const link = await screen.findByRole('link', { name: target.label }) - expect(link).toHaveAttribute('aria-current', 'page') -}) - -test('omits the drill-down chevron when the target has no section screen', async () => { - renderMenuAt('/') - - const link = await screen.findByRole('link', { name: navItems[0].label }) - expect(link.querySelector('.gophenberg-menu__chevron')).toBeNull() -}) - -test('marks entries whose target declares a section screen with a chevron', async () => { - renderMenuAt('/', true) - - const link = await screen.findByRole('link', { name: navItems[0].label }) - expect(link.querySelector('.gophenberg-menu__chevron')).not.toBeNull() -}) diff --git a/frontend/src/menu/test/menuStyles.test.ts b/frontend/src/menu/test/menuStyles.test.ts deleted file mode 100644 index 45d3b5e5..00000000 --- a/frontend/src/menu/test/menuStyles.test.ts +++ /dev/null @@ -1,39 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 - -import { expect, test } from 'vitest' - -import { declarations } from '../../test/stylesheet' - -/** The token the phone drawer paints its surface with. */ -const DRAWER_SURFACE = /^var\(--wpds-color-background-surface-neutral-strong\)$/ - -test('sets a menu row as the Site Editor sets a navigation item, a 13px label on a 40px row', () => { - expect(declarations('.gophenberg-menu__item')).toMatchObject({ - 'box-sizing': 'border-box', - 'min-height': '40px', - padding: '8px 6px 8px 16px', - 'font-size': expect.stringMatching(/^var\(--wpds-typography-font-size-md\)$/), - color: expect.stringMatching(/^var\(--wpds-color-foreground-interactive-neutral-weak\)$/), - }) -}) - -test('sets the current row in the emphasis weight on the interactive fill', () => { - expect(declarations(".gophenberg-menu__item[data-status='active']")).toMatchObject({ - 'font-weight': expect.stringMatching(/^var\(--wpds-typography-font-weight-emphasis\)$/), - background: expect.stringMatching(/^var\(--wpds-color-background-interactive-neutral-weak-active\)$/), - color: expect.stringMatching(/^var\(--wpds-color-foreground-interactive-neutral-weak-active\)$/), - }) -}) - -test('fills the current row apart from the drawer surface it sits on', () => { - const fill = declarations(".gophenberg-menu__item[data-status='active']").background - - expect(fill).toMatch(/^var\(--wpds-/) - expect(fill).not.toMatch(DRAWER_SURFACE) -}) - -test('changes only the text colour of a row under the pointer', () => { - expect(declarations('.gophenberg-menu__item:hover')).toEqual({ - color: expect.stringMatching(/^var\(--wpds-color-foreground-interactive-neutral-weak-active\)$/), - }) -}) diff --git a/frontend/src/router.tsx b/frontend/src/router.tsx index d79e5c4b..19842879 100644 --- a/frontend/src/router.tsx +++ b/frontend/src/router.tsx @@ -1,8 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 import { ErrorNotice, LoadingScreen, Page } from '@gopherium/godmin' -import { listSearch } from '@gopherium/godmin/router' -import { useQuery } from '@tanstack/react-query' +import { listSearch, routerDefaults } from '@gopherium/godmin/router' import { Navigate, createRootRoute, @@ -19,9 +18,8 @@ import { adminBasepath } from './basepath' import { CapabilityGate } from './CapabilityGate' import { Layout } from './Layout' import { plugins } from './plugins' -import { typesQueryKey } from './content/nav' +import { useDefaultType } from './content/nav' import { statusSearch } from './content/StatusTabs' -import { listTypes } from './content/types' const rootRoute = createRootRoute() @@ -36,19 +34,18 @@ const framedRoute = createRoute({ * @returns The redirect once a default type is held, else the registry failure under a title, or the loading ghost. */ function DefaultList() { - const types = useQuery({ queryKey: typesQueryKey, queryFn: listTypes }) - const landing = types.data?.find((registered) => registered.isDefault) - if (landing !== undefined) { + const landing = useDefaultType() + if (landing.key !== undefined) { return } - if (types.isError) { + if (landing.failed) { return ( - + {__('The content types could not be loaded.', 'gophenberg')} ) } - return + return } const homeRoute = createRoute({ @@ -150,14 +147,6 @@ const routeTree = rootRoute.addChildren([ editorRoute, ]) -/** - * Renders the ghost a route shows while its chunk or data arrives. - * @returns The pending element. - */ -function RoutePending() { - return -} - /** * Creates the application router with the assembled route tree. * @param history - Optional router history instance for controlling navigation state. @@ -165,12 +154,10 @@ function RoutePending() { */ export function createAppRouter(history?: RouterHistory) { return createRouter({ + ...routerDefaults(), routeTree, history, basepath: adminBasepath, - defaultPendingComponent: RoutePending, - defaultPendingMs: 200, - defaultPendingMinMs: 0, }) } diff --git a/frontend/src/test/account.test.tsx b/frontend/src/test/account.test.tsx index b28ddf7f..c06fe797 100644 --- a/frontend/src/test/account.test.tsx +++ b/frontend/src/test/account.test.tsx @@ -53,6 +53,6 @@ test('shows an error when logging out fails', async () => { test('omits the account section when no user is present', async () => { renderAt('/', null) - expect(await screen.findByRole('link', { name: 'Gophenberg' })).toBeInTheDocument() + expect(await screen.findByRole('heading', { name: 'Gophenberg' })).toBeInTheDocument() expect(screen.queryByRole('button', { name: 'Log out' })).toBeNull() }) diff --git a/frontend/src/test/brick-labels.test.tsx b/frontend/src/test/brick-labels.test.tsx index a87f0407..032e1094 100644 --- a/frontend/src/test/brick-labels.test.tsx +++ b/frontend/src/test/brick-labels.test.tsx @@ -1,24 +1,16 @@ // SPDX-License-Identifier: Apache-2.0 import { setViewport } from '@gopherium/godmin/testing' -import { useToaster } from '@gopherium/godmin' +import { LIST_CHROME_DOMAIN, listChromeCatalogFor, useToaster } from '@gopherium/godmin' import { QueryClient, QueryClientProvider } from '@tanstack/react-query' -import { setLocaleData } from '@wordpress/i18n' +import { resetLocaleData, setLocaleData } from '@wordpress/i18n' import { render, screen } from '@testing-library/react' import userEvent from '@testing-library/user-event' -import { expect, test } from 'vitest' +import { expect, onTestFinished, test } from 'vitest' import { AdminToaster } from '../toasts' import { renderAt } from './render' -setLocaleData( - { - Dismiss: ['Descartar'], - 'Open navigation': ['Abrir navegacion'], - }, - 'gophenberg', -) - /** * Renders a control raising one toast inside the admin toast region. * @returns The rendered region. @@ -41,17 +33,21 @@ function renderToast() { ) } -test('names the menu button in the language the reader loaded', async () => { +test('names the menu button in the language the reader loaded, from the words godmin ships', async () => { + setLocaleData(await listChromeCatalogFor('es-ES'), LIST_CHROME_DOMAIN) + onTestFinished(() => resetLocaleData({}, LIST_CHROME_DOMAIN)) setViewport({ matches: true }) renderAt('/') expect( - await screen.findByRole('button', { name: 'Abrir navegacion' }), + await screen.findByRole('button', { name: 'Abrir el panel de navegación' }), ).toBeInTheDocument() }) test('describes how to dismiss a toast in the language the reader loaded', async () => { + setLocaleData({ Dismiss: ['Descartar'] }, 'gophenberg') + onTestFinished(() => resetLocaleData({}, 'gophenberg')) renderToast() await userEvent.click(screen.getByRole('button', { name: 'raise' })) diff --git a/frontend/src/test/canvas.test.tsx b/frontend/src/test/canvas.test.tsx index 7a0a1c70..67688526 100644 --- a/frontend/src/test/canvas.test.tsx +++ b/frontend/src/test/canvas.test.tsx @@ -21,7 +21,7 @@ import { versionQueryKey } from '../version' const BLEED = 'godmin-layout__canvas--bleed' -const RAIL_TOKEN = '--wpds-color-background-surface-neutral-weak' +const SIDEBAR_TOKEN = '--wpds-color-background-surface-neutral-weak' const LINE_TOKEN = '--wpds-color-stroke-surface-neutral-weak' @@ -78,12 +78,12 @@ function tokenAround(element: Element, token: string): string { } /** - * Returns the rail and canvas line colours of the frame on screen. - * @returns The rail background and the canvas line colour. + * Returns the sidebar and canvas line colours of the frame on screen. + * @returns The sidebar background and the canvas line colour. */ -function frameColours(): { rail: string, line: string } { +function frameColours(): { sidebar: string, line: string } { return { - rail: tokenAround(document.querySelector('.godmin-layout') as Element, RAIL_TOKEN), + sidebar: tokenAround(document.querySelector('.godmin-layout') as Element, SIDEBAR_TOKEN), line: tokenAround(canvas(), LINE_TOKEN), } } diff --git a/frontend/src/test/content-nav.test.tsx b/frontend/src/test/content-nav.test.tsx index 75106360..7077e808 100644 --- a/frontend/src/test/content-nav.test.tsx +++ b/frontend/src/test/content-nav.test.tsx @@ -1,6 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 import { http, HttpResponse, server } from '@gophenberg/frontend-sdk/testing' +import { LIST_CHROME_DOMAIN, listChromeCatalogFor } from '@gopherium/godmin' import { screen, within } from '@testing-library/react' import { resetLocaleData, setLocaleData } from '@wordpress/i18n' import { beforeEach, expect, onTestFinished, test } from 'vitest' @@ -57,26 +58,36 @@ beforeEach(() => { test('lists a navigation row for every active type', async () => { renderAt('/') - const menu = await screen.findByRole('navigation', { name: 'Navigation' }) + const menu = await screen.findByRole('region', { name: 'Navigation' }) expect(await within(menu).findByRole('link', { name: 'Posts' })).toBeInTheDocument() expect(await within(menu).findByRole('link', { name: 'Pages' })).toBeInTheDocument() }) -test('names the built-in types in the words of WordPress es_ES for a Spanish reader', async () => { +/** + * Loads the Spanish words of the admin and of godmin for one test, as the admin loads them at boot. + */ +async function readSpanish() { setLocaleData(await catalogFor('es-ES'), 'gophenberg') - onTestFinished(() => resetLocaleData({}, 'gophenberg')) + setLocaleData(await listChromeCatalogFor('es-ES'), LIST_CHROME_DOMAIN) + onTestFinished(() => { + resetLocaleData({}, 'gophenberg') + resetLocaleData({}, LIST_CHROME_DOMAIN) + }) +} + +test('names the built-in types in the words of WordPress es_ES for a Spanish reader', async () => { + await readSpanish() renderAt('/') - const menu = await screen.findByRole('navigation', { name: 'Navegación' }) + const menu = await screen.findByRole('region', { name: 'Navegación' }) expect(await within(menu).findByRole('link', { name: 'Entradas' })).toBeInTheDocument() expect(within(menu).getByRole('link', { name: 'Páginas' })).toBeInTheDocument() }) test('names a built-in type a person renamed as they typed it for a Spanish reader', async () => { - setLocaleData(await catalogFor('es-ES'), 'gophenberg') - onTestFinished(() => resetLocaleData({}, 'gophenberg')) + await readSpanish() server.use( http.get('/api/types', () => HttpResponse.json({ items: [{ ...POST_TYPE, plural_label: 'Articles' }, PAGE_TYPE] }), @@ -84,7 +95,7 @@ test('names a built-in type a person renamed as they typed it for a Spanish read ) renderAt('/') - const menu = await screen.findByRole('navigation', { name: 'Navegación' }) + const menu = await screen.findByRole('region', { name: 'Navegación' }) expect(await within(menu).findByRole('link', { name: 'Articles' })).toBeInTheDocument() expect(within(menu).queryByRole('link', { name: 'Entradas' })).not.toBeInTheDocument() @@ -96,7 +107,7 @@ test('puts the type that answers at the root first', async () => { ) renderAt('/') - const menu = await screen.findByRole('navigation', { name: 'Navigation' }) + const menu = await screen.findByRole('region', { name: 'Navigation' }) await within(menu).findByRole('link', { name: 'Pages' }) const rows = within(menu) @@ -108,7 +119,7 @@ test('puts the type that answers at the root first', async () => { test('leaves an inactive type out of the navigation', async () => { renderAt('/') - const menu = await screen.findByRole('navigation', { name: 'Navigation' }) + const menu = await screen.findByRole('region', { name: 'Navigation' }) await within(menu).findByRole('link', { name: 'Pages' }) expect(within(menu).queryByRole('link', { name: 'Guides' })).not.toBeInTheDocument() @@ -117,7 +128,7 @@ test('leaves an inactive type out of the navigation', async () => { test('keeps the sections that do not come from the registry', async () => { renderAt('/') - const menu = await screen.findByRole('navigation', { name: 'Navigation' }) + const menu = await screen.findByRole('region', { name: 'Navigation' }) await within(menu).findByRole('link', { name: 'Pages' }) expect(within(menu).getByRole('link', { name: 'Media' })).toBeInTheDocument() diff --git a/frontend/src/test/drilldown.test.tsx b/frontend/src/test/drilldown.test.tsx index 9f82f253..50d1e631 100644 --- a/frontend/src/test/drilldown.test.tsx +++ b/frontend/src/test/drilldown.test.tsx @@ -1,73 +1,161 @@ // SPDX-License-Identifier: Apache-2.0 -import { createAuthQueryClient } from '@gopherium/react-auth' -import { defaultUser, seedSession } from '@gopherium/react-auth/testing' -import { QueryClientProvider } from '@tanstack/react-query' -import { - RouterProvider, - createMemoryHistory, - createRootRoute, - createRoute, - createRouter, -} from '@tanstack/react-router' -import { render, screen } from '@testing-library/react' -import { expect, test } from 'vitest' - -import { Layout } from '../Layout' -import { versionQueryKey } from '../version' +import { http, HttpResponse, server } from '@gophenberg/frontend-sdk/testing' +import { setViewport } from '@gopherium/godmin/testing' +import { screen, waitFor, within } from '@testing-library/react' +import userEvent from '@testing-library/user-event' +import { beforeEach, expect, test, vi } from 'vitest' + +import { gate } from './gate' +import { renderAt, renderRoutedAt } from './render' +import { warmPostsScreen } from './warm' + +vi.mock('../plugins', async () => ({ plugins: [(await import('./sectionPlugin')).sectionPlugin] })) + +warmPostsScreen() + +/** The class of the wrapper a sidebar screen slides in. */ +const WRAPPER = 'godmin-navigation__screen-wrapper' + +/** The page type, which a test makes the default. */ +const pageType = { + key: 'page', + singular_label: 'Page', + plural_label: 'Pages', + description: '', + route_word: 'pages', + hierarchical: true, + revisions: true, + revision_cap: 100, + page_kind: 'single', + default: true, + active: true, + fields: [], +} + +beforeEach(() => { + server.use( + http.get('/api/content', () => HttpResponse.json({ items: [], total: 0 })), + http.get('/api/content/counts', () => HttpResponse.json({})), + ) +}) /** - * Renders the layout over a home route and a section route carrying a sidebar. - * @param path - The path to start at. + * Returns the sidebar region. + * @returns The region named Navigation. */ -function renderSectionAt(path: string) { - const rootRoute = createRootRoute({ component: Layout }) - const homeRoute = createRoute({ - getParentRoute: () => rootRoute, - path: '/', - component: function SectionHome() { - return

home canvas

- }, - }) - const sectionRoute = createRoute({ - getParentRoute: () => rootRoute, - path: '/section', - staticData: { - Sidebar: function SectionSidebar() { - return

section sidebar

- }, - }, - component: function SectionCanvas() { - return

section canvas

- }, - }) - const router = createRouter({ - routeTree: rootRoute.addChildren([homeRoute, sectionRoute]), - history: createMemoryHistory({ initialEntries: [path] }), - }) - const client = createAuthQueryClient({ - queries: { retry: false, staleTime: Infinity }, - }) - seedSession(client, defaultUser) - client.setQueryData(versionQueryKey, '0.0.0') - render( - - - , - ) +function sidebar(): Promise { + return screen.findByRole('region', { name: 'Navigation' }) +} + +/** + * Returns the section row once the type rows above it have arrived, so the menu holds still. + * @param where - Where the row sits, the sidebar when absent. + * @returns The section row link. + */ +async function sectionRow(where?: HTMLElement): Promise { + const holder = where ?? (await sidebar()) + await within(holder).findByRole('link', { name: 'Posts' }) + return within(holder).getByRole('link', { name: 'Section' }) +} + +/** + * Opens the section sub menu from its row in the sidebar. + * @param where - Where the row sits, the sidebar when absent. + */ +async function openSection(where?: HTMLElement) { + await userEvent.click(await sectionRow(where)) } test('swaps the sidebar for the section screen on a section route', async () => { - renderSectionAt('/section') + renderAt('/section') - expect(await screen.findByText('section sidebar')).toBeInTheDocument() + const shown = await sidebar() + expect(await within(shown).findByText('section sidebar')).toBeInTheDocument() expect(screen.getByText('section canvas')).toBeInTheDocument() - expect(screen.queryByRole('link', { name: 'Users' })).toBeNull() + expect(within(shown).queryByRole('link', { name: 'Users' })).toBeNull() }) -test('shows the main menu, not a section screen, at the root', async () => { - renderSectionAt('/') +test('shows the main menu, not a section screen, at the list the root opens', async () => { + renderAt('/content/post') + + expect(await sectionRow()).toBeInTheDocument() + expect(within(await sidebar()).queryByText('section sidebar')).toBeNull() +}) + +test('slides the section in from its row and puts focus on Back', async () => { + renderAt('/content/post') + + await openSection() + + const back = await within(await sidebar()).findByRole('link', { name: 'Back' }) + expect(within(await sidebar()).getByRole('heading', { level: 1, name: 'Section' })).toBeInTheDocument() + await waitFor(() => expect(back).toHaveFocus()) + expect(back.closest(`.${WRAPPER}`)).toHaveClass(`${WRAPPER}--forward`) +}) + +test('slides the main menu back in with focus on the section row', async () => { + const { router } = renderRoutedAt('/content/post') + await openSection() + + await userEvent.click(await within(await sidebar()).findByRole('link', { name: 'Back' })) + + const row = await within(await sidebar()).findByRole('link', { name: 'Section' }) + await waitFor(() => expect(row).toHaveFocus()) + expect(row.closest(`.${WRAPPER}`)).toHaveClass(`${WRAPPER}--backward`) + expect(router.state.location.pathname).toBe('/content/post') +}) + +test('sends Back to the list of the default type once the types answer', async () => { + server.use(http.get('/api/types', () => HttpResponse.json({ items: [pageType] }))) + const { router } = renderRoutedAt('/section') + + await userEvent.click(await within(await sidebar()).findByRole('link', { name: 'Back' })) + + await waitFor(() => expect(router.state.location.pathname).toBe('/content/page')) + expect(await screen.findByRole('heading', { level: 2, name: 'Pages' })).toBeInTheDocument() +}) + +test('sends Back to the root while the types load, which opens the default list once they answer', async () => { + const registry = gate() + server.use( + http.get('/api/types', async () => { + await registry.held + return HttpResponse.json({ items: [pageType] }) + }), + ) + const { router } = renderRoutedAt('/section') + + await userEvent.click(await within(await sidebar()).findByRole('link', { name: 'Back' })) + + await waitFor(() => expect(router.state.location.pathname).toBe('/')) + expect(await screen.findByRole('status')).toHaveTextContent('Loading the screen.') + registry.release() + await waitFor(() => expect(router.state.location.pathname).toBe('/content/page')) +}) + +test('sends Back to the root after the types fail, which reports the failure', async () => { + vi.spyOn(console, 'error').mockImplementation(() => {}) + server.use(http.get('/api/types', () => HttpResponse.json({}, { status: 500 }))) + const { router } = renderRoutedAt('/section') + + await userEvent.click(await within(await sidebar()).findByRole('link', { name: 'Back' })) + + expect(await screen.findByRole('alert')).toHaveTextContent('The content types could not be loaded.') + expect(router.state.location.pathname).toBe('/') +}) + +test('keeps the drawer open on a phone going into the section and coming back', async () => { + setViewport({ matches: true }) + const { router } = renderRoutedAt('/content/post') + await userEvent.click(await screen.findByRole('button', { name: 'Open navigation panel' })) + const drawer = await screen.findByRole('dialog') + + await openSection(drawer) + await within(drawer).findByRole('heading', { level: 1, name: 'Section' }) + await userEvent.click(within(drawer).getByRole('link', { name: 'Back' })) - expect(await screen.findByText('home canvas')).toBeInTheDocument() - expect(screen.queryByText('section sidebar')).toBeNull() + expect(await within(drawer).findByRole('link', { name: 'Section' })).toBeInTheDocument() + await waitFor(() => expect(router.state.location.pathname).toBe('/content/post')) + expect(screen.getByRole('dialog')).toBe(drawer) }) diff --git a/frontend/src/test/editor-route.test.tsx b/frontend/src/test/editor-route.test.tsx index 5ad7d6b2..f7a3b85e 100644 --- a/frontend/src/test/editor-route.test.tsx +++ b/frontend/src/test/editor-route.test.tsx @@ -24,8 +24,8 @@ test('the editor route carries none of the admin chrome', async () => { await screen.findByTitle('Editor canvas') - expect(screen.queryByRole('navigation')).not.toBeInTheDocument() - expect(screen.queryByRole('link', { name: 'Gophenberg' })).not.toBeInTheDocument() + expect(screen.queryByRole('region', { name: 'Navigation' })).not.toBeInTheDocument() + expect(screen.queryByRole('heading', { name: 'Gophenberg' })).not.toBeInTheDocument() expect(document.querySelector('.godmin-layout')).toBeNull() expect(document.querySelector('.godmin-layout__canvas')).toBeNull() }) @@ -33,7 +33,7 @@ test('the editor route carries none of the admin chrome', async () => { test('framed routes still render the admin chrome', async () => { renderAt('/') - expect(await screen.findByRole('navigation', { name: 'Navigation' })).toBeInTheDocument() + expect(await screen.findByRole('region', { name: 'Navigation' })).toBeInTheDocument() expect(document.querySelector('.godmin-layout')).not.toBeNull() }) diff --git a/frontend/src/test/layout-brand.test.tsx b/frontend/src/test/layout-brand.test.tsx index 78d058e3..ccf1ed1d 100644 --- a/frontend/src/test/layout-brand.test.tsx +++ b/frontend/src/test/layout-brand.test.tsx @@ -12,11 +12,11 @@ beforeEach(() => { }) /** - * Returns the bar a narrow viewport draws in place of the rail. + * Returns the bar a narrow viewport draws in place of the sidebar. * @returns The top bar element. */ async function topBar(): Promise { - const menu = await screen.findByRole('button', { name: 'Open navigation' }) + const menu = await screen.findByRole('button', { name: 'Open navigation panel' }) return menu.closest('.godmin-layout__topbar') as HTMLElement } diff --git a/frontend/src/test/navigation-items.test.tsx b/frontend/src/test/navigation-items.test.tsx new file mode 100644 index 00000000..33249ebb --- /dev/null +++ b/frontend/src/test/navigation-items.test.tsx @@ -0,0 +1,114 @@ +// SPDX-License-Identifier: Apache-2.0 + +import { + brushIcon, + categoryIcon, + customPostTypeIcon, + languageIcon, + listIcon, + mediaIcon, + pageIcon, + postIcon, + settingsIcon, +} from '@gophenberg/frontend-sdk' +import { http, HttpResponse, server } from '@gophenberg/frontend-sdk/testing' +import { render, screen, within } from '@testing-library/react' +import { people } from '@wordpress/icons' +import type { ReactElement } from 'react' +import { beforeEach, expect, test } from 'vitest' + +import { renderAt } from './render' +import { GUIDE_TYPE, PAGE_TYPE, POST_TYPE, serveTypes } from './typeFixtures' + +const ROW = 'godmin-navigation-item' + +/** The built-in type that groups posts, as the registry answers it. */ +const CATEGORY_TYPE = { + ...POST_TYPE, + key: 'category', + singular_label: 'Category', + plural_label: 'Categories', + description: 'Manage the categories on this site.', + route_word: 'categories', + derived_route_word: 'categories', + default: false, +} + +beforeEach(() => { + server.use( + http.get('/api/content', () => HttpResponse.json({ items: [], total: 0 })), + http.get('/api/content/counts', () => HttpResponse.json({})), + ) +}) + +/** + * Returns what a glyph draws, read from the row holding it or from the glyph itself. + * @param held - The row link holding the glyph, or the glyph. + * @returns The markup inside its svg. + */ +function drawingOf(held: Element | ReactElement): string | undefined { + const element = held instanceof Element ? held : render(held).container + return element.querySelector('svg')?.innerHTML +} + +test('dresses a content type row like every other sidebar row', async () => { + renderAt('/content/post') + + const sidebar = await screen.findByRole('region', { name: 'Navigation' }) + expect(await within(sidebar).findByRole('link', { name: 'Posts' })).toHaveClass(ROW) + expect(within(sidebar).getByRole('link', { name: 'Media' })).toHaveClass(ROW) +}) + +test('lists every sidebar row as an item of one list, the types first', async () => { + renderAt('/content/post') + + const sidebar = await screen.findByRole('region', { name: 'Navigation' }) + await within(sidebar).findByRole('link', { name: 'Posts' }) + + const rows = within(within(sidebar).getByRole('list')).getAllByRole('listitem') + expect(rows.map((row) => row.textContent)).toEqual([ + 'Posts', + 'Media', + 'Themes', + 'Content Types', + 'Field Groups', + 'Users', + 'Language', + 'Settings', + ]) +}) + +test('draws each sidebar row with the glyph WordPress draws for it, other types with the Posts glyph', async () => { + serveTypes(POST_TYPE, PAGE_TYPE, CATEGORY_TYPE, GUIDE_TYPE) + renderAt('/content/post') + + const sidebar = within(await screen.findByRole('region', { name: 'Navigation' })) + await sidebar.findByRole('link', { name: 'Guides' }) + + const glyphs: [string, ReactElement][] = [ + ['Posts', postIcon], + ['Pages', pageIcon], + ['Categories', categoryIcon], + ['Guides', postIcon], + ['Media', mediaIcon], + ['Themes', brushIcon], + ['Content Types', customPostTypeIcon], + ['Field Groups', listIcon], + ['Users', people], + ['Language', languageIcon], + ['Settings', settingsIcon], + ] + for (const [name, glyph] of glyphs) { + expect(drawingOf(sidebar.getByRole('link', { name })), name).toBe(drawingOf(glyph)) + } +}) + +test('draws the Posts glyph for a plugin type under a built-in key, as it keeps the plugin words', async () => { + serveTypes(POST_TYPE, { ...PAGE_TYPE, origin: 'shop' }) + renderAt('/content/post') + + const sidebar = within(await screen.findByRole('region', { name: 'Navigation' })) + const row = await sidebar.findByRole('link', { name: 'Pages' }) + + expect(drawingOf(row)).toBe(drawingOf(postIcon)) +}) diff --git a/frontend/src/test/posts-section.test.tsx b/frontend/src/test/posts-section.test.tsx index e12bf523..191490f9 100644 --- a/frontend/src/test/posts-section.test.tsx +++ b/frontend/src/test/posts-section.test.tsx @@ -14,44 +14,44 @@ beforeEach(() => { }) /** - * Returns the rail once the posts list has drawn its heading. - * @returns The navigation landmark of the rail. + * Returns the sidebar once the posts list has drawn its heading. + * @returns The sidebar region, named Navigation. */ -async function railBesidePosts(): Promise { - await screen.findByRole('heading', { name: 'Posts', level: 1 }) - return screen.getByRole('navigation', { name: 'Navigation' }) +async function sidebarBesidePosts(): Promise { + await screen.findByRole('heading', { name: 'Posts', level: 2 }) + return screen.getByRole('region', { name: 'Navigation' }) } test('the main menu offers the posts section', async () => { renderAt('/content/post') - expect(await within(await railBesidePosts()).findByRole('link', { name: 'Posts' })).toBeInTheDocument() + expect(await within(await sidebarBesidePosts()).findByRole('link', { name: 'Posts' })).toBeInTheDocument() }) -test('keeps the main menu in the rail while the posts list shows', async () => { +test('keeps the main menu in the sidebar while the posts list shows', async () => { renderAt('/content/post') - const rail = await railBesidePosts() + const sidebar = await sidebarBesidePosts() - expect(await within(rail).findByRole('link', { name: 'Users' })).toBeInTheDocument() - expect(within(rail).queryByRole('link', { name: 'Back' })).not.toBeInTheDocument() + expect(await within(sidebar).findByRole('link', { name: 'Users' })).toBeInTheDocument() + expect(within(sidebar).queryByRole('link', { name: 'Back' })).not.toBeInTheDocument() }) test('marks the posts row as the current page while its list shows', async () => { renderAt('/content/post') - const row = await within(await railBesidePosts()).findByRole('link', { name: 'Posts' }) + const row = await within(await sidebarBesidePosts()).findByRole('link', { name: 'Posts' }) expect(row).toHaveAttribute('aria-current', 'page') }) -test('adds from the list header alone, the rail offering no row of its own', async () => { +test('adds from the list header alone, the sidebar offering no row of its own', async () => { renderAt('/content/post') - const rail = await railBesidePosts() - await within(rail).findByRole('link', { name: 'Posts' }) + const sidebar = await sidebarBesidePosts() + await within(sidebar).findByRole('link', { name: 'Posts' }) - expect(within(rail).queryByRole('link', { name: 'All Posts' })).not.toBeInTheDocument() - expect(within(rail).queryByRole('button', { name: 'Add Post' })).not.toBeInTheDocument() + expect(within(sidebar).queryByRole('link', { name: 'All Posts' })).not.toBeInTheDocument() + expect(within(sidebar).queryByRole('button', { name: 'Add Post' })).not.toBeInTheDocument() expect(within(screen.getByRole('main')).getByRole('button', { name: 'Add Post' })).toBeInTheDocument() }) diff --git a/frontend/src/test/rail-rows.test.tsx b/frontend/src/test/rail-rows.test.tsx deleted file mode 100644 index 63d72b53..00000000 --- a/frontend/src/test/rail-rows.test.tsx +++ /dev/null @@ -1,35 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 - -import { screen, within } from '@testing-library/react' -import { expect, test } from 'vitest' - -import '../index.css' -import { renderAt } from './render' - -const ROW = 'gophenberg-menu__item' - -/** - * Returns the rules the application stylesheet holds. - * @returns The stylesheet text. - */ -function stylesheet(): string { - return Array.from(document.styleSheets) - .flatMap((sheet) => Array.from(sheet.cssRules ?? [])) - .map((rule) => rule.cssText) - .join('\n') -} - -test('dresses a content type row like every other rail row', async () => { - renderAt('/content/post') - - const rail = await screen.findByRole('navigation', { name: 'Navigation' }) - expect(await within(rail).findByRole('link', { name: 'Posts' })).toHaveClass(ROW) - expect(within(rail).getByRole('link', { name: 'Media' })).toHaveClass(ROW) -}) - -test('gives a rail row its own colour rather than the browser default', () => { - const rules = stylesheet() - - expect(rules).toMatch(/menu__item[^}]*color:/) - expect(rules).toMatch(/menu__item[^}]*text-decoration:\s*none/) -}) diff --git a/frontend/src/test/route-pending.test.tsx b/frontend/src/test/route-pending.test.tsx deleted file mode 100644 index e5627bb7..00000000 --- a/frontend/src/test/route-pending.test.tsx +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 - -import { expect, test } from 'vitest' - -import { createAppRouter } from '../router' - -const SPLIT_ROUTES = [ - '/framed/content/$typeKey', - '/framed/admin/content-types', - '/framed/admin/users', - '/framed/admin/users/new', - '/content/$typeKey/$postId/edit', -] - -test('splits every heavy route behind a component the pending seam can wait on', () => { - const router = createAppRouter() - - for (const path of SPLIT_ROUTES) { - const route = router.routesById[path as keyof typeof router.routesById] - const component = route.options.component as { preload?: unknown } | undefined - expect(typeof component?.preload, `${path} cannot arm the pending seam`).toBe('function') - } -}) diff --git a/frontend/src/test/route-preload.test.tsx b/frontend/src/test/route-preload.test.tsx new file mode 100644 index 00000000..9a9b7f20 --- /dev/null +++ b/frontend/src/test/route-preload.test.tsx @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: Apache-2.0 + +import { http, HttpResponse, server } from '@gophenberg/frontend-sdk/testing' +import { screen } from '@testing-library/react' +import { expect, test, vi } from 'vitest' + +import { createAppRouter } from '../router' +import { renderRoutedAt } from './render' + +const settingsCode = await vi.hoisted(async () => (await import('./gate')).gate()) + +vi.mock('../settings/SettingsScreen', async (importOriginal) => { + await settingsCode.held + return importOriginal() +}) + +const SPLIT_ROUTES = [ + '/framed/content/$typeKey', + '/framed/admin/content-types', + '/framed/admin/users', + '/framed/admin/users/new', + '/content/$typeKey/$postId/edit', +] + +/** Longer than the second the router waits before it draws a pending screen, had one been set. */ +const PAST_PENDING_DELAY = 1100 + +test('splits every heavy route behind a component a preload can fetch before the click', () => { + const router = createAppRouter() + + for (const path of SPLIT_ROUTES) { + const route = router.routesById[path as keyof typeof router.routesById] + const component = route.options.component as { preload?: unknown } | undefined + expect(typeof component?.preload, `${path} cannot be preloaded`).toBe('function') + } +}) + +test('keeps the screen on show while the next one arrives, with no loading screen between them', async () => { + server.use(http.get('/api/content', () => HttpResponse.json({ items: [], total: 0 }))) + const { router } = renderRoutedAt('/content-types') + await screen.findByRole('heading', { name: 'Content Types', level: 2 }) + + const moving = router.navigate({ to: '/settings' }) + await new Promise((resolve) => setTimeout(resolve, PAST_PENDING_DELAY)) + + expect(screen.getByRole('heading', { name: 'Content Types', level: 2 })).toBeInTheDocument() + expect(screen.queryByRole('status')).toBeNull() + settingsCode.release() + await moving + expect(await screen.findByRole('heading', { name: 'Settings', level: 2 })).toBeInTheDocument() +}) diff --git a/frontend/src/test/router.test.tsx b/frontend/src/test/router.test.tsx index e397d0eb..97ae1fd0 100644 --- a/frontend/src/test/router.test.tsx +++ b/frontend/src/test/router.test.tsx @@ -1,9 +1,8 @@ // SPDX-License-Identifier: Apache-2.0 import { http, HttpResponse, server } from '@gophenberg/frontend-sdk/testing' -import { render, screen, within } from '@testing-library/react' +import { screen, within } from '@testing-library/react' import { beforeEach, expect, test, vi } from 'vitest' -import type { ComponentType } from 'react' import { typesQueryKey } from '../content/nav' import { coreNav } from '../menu/coreNav' @@ -45,7 +44,7 @@ test('mounts the application under the admin basepath', () => { test('opens the list of the default content type at the root path', async () => { const { router } = renderRoutedAt('/') - expect(await screen.findByRole('heading', { name: 'Posts', level: 1 })).toBeInTheDocument() + expect(await screen.findByRole('heading', { name: 'Posts', level: 2 })).toBeInTheDocument() expect(router.state.location.pathname).toBe('/content/post') }) @@ -57,14 +56,14 @@ test('opens whichever type is the default, not the first one listed', async () = ) const { router } = renderRoutedAt('/') - expect(await screen.findByRole('heading', { name: 'Pages', level: 1 })).toBeInTheDocument() + expect(await screen.findByRole('heading', { name: 'Pages', level: 2 })).toBeInTheDocument() expect(router.state.location.pathname).toBe('/content/page') }) test('leaves the root out of the history, so going back never lands on it', async () => { const { router } = renderRoutedAt('/') - await screen.findByRole('heading', { name: 'Posts', level: 1 }) + await screen.findByRole('heading', { name: 'Posts', level: 2 }) expect(router.history.length).toBe(1) }) @@ -81,7 +80,7 @@ test('holds the loading ghost at the root until the type registry answers', asyn expect(await screen.findByRole('status')).toHaveTextContent('Loading the screen.') registry.release() - await screen.findByRole('heading', { name: 'Posts', level: 1 }) + await screen.findByRole('heading', { name: 'Posts', level: 2 }) expect(router.state.location.pathname).toBe('/content/post') }) @@ -93,15 +92,16 @@ test('reports a type registry it could not read in place of the list the root op expect(await screen.findByRole('alert')).toHaveTextContent('The content types could not be loaded.') }) -test('keeps one first level heading over a type registry the root could not read', async () => { +test('titles a type registry the root could not read at the second level, under the sidebar title', async () => { vi.spyOn(console, 'error').mockImplementation(() => {}) server.use(http.get('/api/types', () => HttpResponse.json({}, { status: 500 }))) renderAt('/') await screen.findByRole('alert') const main = screen.getByRole('main') - expect(within(main).getAllByRole('heading', { level: 1 })).toHaveLength(1) - expect(within(main).getByRole('heading', { level: 1 })).toHaveTextContent('Content') + expect(within(main).getAllByRole('heading', { level: 2 })).toHaveLength(1) + expect(within(main).getByRole('heading', { level: 2 })).toHaveTextContent('Content') + expect(within(main).queryAllByRole('heading', { level: 1 })).toHaveLength(0) }) test('opens the default list from the types it holds even when their last refresh failed', async () => { @@ -114,21 +114,22 @@ test('opens the default list from the types it holds even when their last refres await router.navigate({ to: '/' }) - expect(await screen.findByRole('heading', { name: 'Posts', level: 1 })).toBeInTheDocument() + expect(await screen.findByRole('heading', { name: 'Posts', level: 2 })).toBeInTheDocument() expect(router.state.location.pathname).toBe('/content/post') }) -test('leaves the heading rank to the screen, not the masthead', async () => { +test('names the site in plain text at the head of the sidebar, as the Site Editor titles its own', async () => { renderAt('/') - expect(await screen.findByRole('link', { name: 'Gophenberg' })).toBeInTheDocument() - expect(screen.queryByRole('heading', { name: 'Gophenberg' })).toBeNull() + const nav = await screen.findByRole('region', { name: 'Navigation' }) + expect(within(nav).getByRole('heading', { name: 'Gophenberg' })).toBeInTheDocument() + expect(screen.queryByRole('link', { name: 'Gophenberg' })).toBeNull() }) test('renders a navigation entry for every active type, core and plugin section', async () => { renderAt('/') - const nav = await screen.findByRole('navigation', { name: 'Navigation' }) + const nav = await screen.findByRole('region', { name: 'Navigation' }) await within(nav).findByRole('link', { name: 'Posts' }) expect(within(nav).queryAllByRole('link')).toHaveLength( 1 + coreNav.length + plugins.flatMap((plugin) => plugin.nav).length, @@ -138,7 +139,7 @@ test('renders a navigation entry for every active type, core and plugin section' test('offers the field groups a way in from the menu', async () => { renderAt('/') - const nav = await screen.findByRole('navigation', { name: 'Navigation' }) + const nav = await screen.findByRole('region', { name: 'Navigation' }) expect(within(nav).getByRole('link', { name: 'Field Groups' })).toHaveAttribute( 'href', @@ -150,22 +151,17 @@ test('frames the active route inside the main content region', async () => { renderAt('/') const main = await screen.findByRole('main') - expect(await within(main).findByRole('heading', { name: 'Posts', level: 1 })).toBeInTheDocument() - expect(within(main).queryByRole('navigation', { name: 'Navigation' })).toBeNull() + expect(await within(main).findByRole('heading', { name: 'Posts', level: 2 })).toBeInTheDocument() + expect(within(main).queryByRole('region', { name: 'Navigation' })).toBeNull() }) -test('holds a loading ghost for routes whose chunk is still arriving', () => { - const Pending = createAppRouter().options.defaultPendingComponent as ComponentType - render() - - const status = screen.getByRole('status') - expect(status).toHaveTextContent('Loading the screen.') - expect(status.closest('.godmin-loading-screen')).not.toBeNull() +test('sets the router to preload a screen on intent, as the new WordPress admin does', () => { + expect(createAppRouter().options.defaultPreload).toBe('intent') }) -test('holds the previous screen briefly and never holds the ghost', () => { - const options = createAppRouter().options +test('sets no pending screen on the router or on any route', () => { + const router = createAppRouter() - expect(options.defaultPendingMs).toBe(200) - expect(options.defaultPendingMinMs).toBe(0) + expect(router.options.defaultPendingComponent).toBeUndefined() + expect(Object.values(router.routesById).filter((route) => route.options.pendingComponent)).toEqual([]) }) diff --git a/frontend/src/test/sectionPlugin.tsx b/frontend/src/test/sectionPlugin.tsx new file mode 100644 index 00000000..d3105328 --- /dev/null +++ b/frontend/src/test/sectionPlugin.tsx @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: Apache-2.0 + +import { NavigationScreen } from '@gophenberg/frontend-sdk' +import type { FrontendPlugin } from '@gophenberg/frontend-sdk' +import { createRoute } from '@tanstack/react-router' + +/** + * Renders the sub menu the section opens. + * @returns The section's sidebar screen. + */ +function SectionSidebar() { + return ( + +

section sidebar

+
+ ) +} + +/** + * Renders the page the section opens. + * @returns The section's canvas. + */ +function SectionCanvas() { + return

section canvas

+} + +/** A plugin whose one row opens a sub menu, the way a plugin brings one into the admin. */ +export const sectionPlugin: FrontendPlugin = { + id: 'section', + nav: [{ label: 'Section', to: '/section' }], + routes: (parent) => [ + createRoute({ + getParentRoute: () => parent, + path: '/section', + staticData: { Sidebar: SectionSidebar }, + component: SectionCanvas, + }), + ], +} diff --git a/frontend/src/test/rail-version.test.tsx b/frontend/src/test/sidebar-version.test.tsx similarity index 100% rename from frontend/src/test/rail-version.test.tsx rename to frontend/src/test/sidebar-version.test.tsx diff --git a/frontend/src/test/small-shell.test.tsx b/frontend/src/test/small-shell.test.tsx index 2df44b81..286d2144 100644 --- a/frontend/src/test/small-shell.test.tsx +++ b/frontend/src/test/small-shell.test.tsx @@ -8,9 +8,13 @@ import { beforeEach, expect, test } from 'vitest' import { renderAt, renderRoutedAt } from './render' +/** The name godmin gives the button that opens the sidebar on a phone, as WordPress's new admin names it. */ +const MENU_BUTTON = 'Open navigation panel' + beforeEach(() => { server.use( http.get('/api/content', () => HttpResponse.json({ items: [], total: 0 })), + http.get('/api/content/counts', () => HttpResponse.json({})), http.get('/api/media', () => HttpResponse.json({ items: [], total: 0, per_page: 20 })), ) }) @@ -20,52 +24,68 @@ test('holds the navigation behind a menu button on a narrow viewport', async () renderAt('/') - expect(await screen.findByRole('button', { name: 'Open navigation' })).toBeInTheDocument() - expect(screen.queryByRole('navigation', { name: 'Navigation' })).toBeNull() + expect(await screen.findByRole('button', { name: MENU_BUTTON })).toBeInTheDocument() + expect(screen.queryByRole('region', { name: 'Navigation' })).toBeNull() }) -test('opens the navigation in a drawer', async () => { +test('opens the navigation in a drawer named for it, holding no region of its own', async () => { setViewport({ matches: true }) renderAt('/') - await userEvent.click(await screen.findByRole('button', { name: 'Open navigation' })) + await userEvent.click(await screen.findByRole('button', { name: MENU_BUTTON })) - const drawer = await screen.findByRole('dialog') - expect(within(drawer).getByRole('navigation', { name: 'Navigation' })).toBeInTheDocument() + const drawer = await screen.findByRole('dialog', { name: 'Navigation' }) expect(await within(drawer).findByRole('link', { name: 'Posts' })).toBeInTheDocument() + expect(within(drawer).queryByRole('region')).toBeNull() }) test('puts the navigation away once it takes the reader somewhere', async () => { setViewport({ matches: true }) renderAt('/media') - await userEvent.click(await screen.findByRole('button', { name: 'Open navigation' })) + await userEvent.click(await screen.findByRole('button', { name: MENU_BUTTON })) const drawer = await screen.findByRole('dialog') await userEvent.click(await within(drawer).findByRole('link', { name: 'Posts' })) - expect(await screen.findByRole('button', { name: 'Open navigation' })).toBeInTheDocument() + expect(await screen.findByRole('button', { name: MENU_BUTTON })).toBeInTheDocument() await waitFor(() => expect(screen.queryByRole('dialog')).toBeNull()) }) -test('keeps the navigation open when its row names the list the root already opened', async () => { +/** + * Opens the drawer on a phone over the Posts list at the path, and follows its Posts row. + * @param path - The address the reader starts on. + * @returns The router and the drawer the row was followed from. + */ +async function openPostsFromDrawer(path: string) { setViewport({ matches: true }) - const { router } = renderRoutedAt('/') - await screen.findByRole('heading', { name: 'Posts', level: 1 }) - await userEvent.click(await screen.findByRole('button', { name: 'Open navigation' })) + const { router } = renderRoutedAt(path) + await screen.findByRole('heading', { name: 'Posts', level: 2 }) + await userEvent.click(await screen.findByRole('button', { name: MENU_BUTTON })) const drawer = await screen.findByRole('dialog') - await userEvent.click(await within(drawer).findByRole('link', { name: 'Posts' })) + return { router, drawer } +} + +test('puts the navigation away when its row leaves a status view of the same list', async () => { + const { router } = await openPostsFromDrawer('/content/post?status=trash') + + await waitFor(() => expect(router.state.location.searchStr).toBe('')) + await waitFor(() => expect(screen.queryByRole('dialog')).toBeNull()) +}) + +test('keeps the navigation open when its row names the list the root already opened', async () => { + const { router, drawer } = await openPostsFromDrawer('/') await waitFor(() => expect(router.state.status).toBe('idle')) expect(router.state.location.pathname).toBe('/content/post') expect(screen.getByRole('dialog')).toBe(drawer) }) -test('keeps the rail beside the canvas when there is room', async () => { +test('keeps the sidebar beside the canvas when there is room', async () => { setViewport({ matches: false }) renderAt('/') - expect(await screen.findByRole('navigation', { name: 'Navigation' })).toBeInTheDocument() - expect(screen.queryByRole('button', { name: 'Open navigation' })).toBeNull() + expect(await screen.findByRole('region', { name: 'Navigation' })).toBeInTheDocument() + expect(screen.queryByRole('button', { name: MENU_BUTTON })).toBeNull() }) diff --git a/frontend/src/test/version-display.test.tsx b/frontend/src/test/version-display.test.tsx index 5a6e358b..261964c6 100644 --- a/frontend/src/test/version-display.test.tsx +++ b/frontend/src/test/version-display.test.tsx @@ -1,6 +1,6 @@ // SPDX-License-Identifier: Apache-2.0 -import { screen } from '@testing-library/react' +import { screen, within } from '@testing-library/react' import { expect, test } from 'vitest' import { renderAt } from './render' @@ -11,9 +11,21 @@ test('shows the app version in the sidebar', async () => { expect(await screen.findByText('v2.5.1')).toBeInTheDocument() }) +test('notes the version under the account panel, in the sidebar footer outside the menu', async () => { + renderAt('/', undefined, '2.5.1') + + const note = await screen.findByText('v2.5.1') + const footer = note.closest('.godmin-sidebar__footer') as HTMLElement + expect(note).toHaveClass('godmin-sidebar__footer-note') + expect(within(footer).getByRole('button', { name: 'Log out' })).toBeInTheDocument() + const sidebar = screen.getByRole('region', { name: 'Navigation' }) + expect(sidebar).toContainElement(footer) + expect(within(within(sidebar).getByRole('list')).queryByText('v2.5.1')).toBeNull() +}) + test('omits the version when it is unavailable', async () => { renderAt('/', undefined, null) - await screen.findByRole('link', { name: 'Gophenberg' }) + await screen.findByRole('heading', { name: 'Gophenberg' }) expect(screen.queryByText(/^v\d/)).toBeNull() }) diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts index acb443c3..e11b2c3a 100644 --- a/frontend/vite.config.ts +++ b/frontend/vite.config.ts @@ -22,9 +22,10 @@ const testFiles = [ /** The test files that replace a module or leave module state behind, each needing its own worker. */ const moduleStateFiles = [ 'src/test/plugin-wiring.test.tsx', + 'src/test/drilldown.test.tsx', 'src/test/errors.test.ts', 'src/test/role-navigation.test.tsx', - 'src/test/route-pending.test.tsx', + 'src/test/route-preload.test.tsx', ] // The workers @wordpress/upload-media reaches for, stubbed out until the media cycle ships. diff --git a/sdk/frontend/test/testing.test.tsx b/sdk/frontend/test/testing.test.tsx index acc069ba..1056b961 100644 --- a/sdk/frontend/test/testing.test.tsx +++ b/sdk/frontend/test/testing.test.tsx @@ -1,21 +1,27 @@ // SPDX-License-Identifier: Apache-2.0 -import { defaultUser } from '@gopherium/react-auth/testing' +import { defaultUser, sessionOk } from '@gopherium/react-auth/testing' import { createRoute } from '@tanstack/react-router' -import { screen } from '@testing-library/react' +import { fireEvent, screen, waitFor, within } from '@testing-library/react' +import { delay } from 'msw' import { expect, test } from 'vitest' -import { can, useSession } from '../index' -import type { FrontendPlugin } from '../index' -import { renderPluginAt } from '../testing' +import { NavigationScreen, can, useSession } from '../index' +import type { FrontendPlugin, MenuItem } from '../index' +import { http, renderPluginAt, server } from '../testing' /** - * Renders whether the signed in account may manage events. - * @returns The reported reading. + * Renders whether the signed in account may manage events, and whether the session is being asked of the server. + * @returns The reported readings. */ function EventsCanvas() { - const session = useSession().data - return

{`manages events:${String(can(session, 'events.manage'))}`}

+ const session = useSession() + return ( + <> +

{`manages events:${String(can(session.data, 'events.manage'))}`}

+

{`asking the server:${String(session.isFetching)}`}

+ + ) } const eventsPlugin: FrontendPlugin = { @@ -30,47 +36,97 @@ const eventsPlugin: FrontendPlugin = { ], } +/** The rows of the section plugin, one open to every reader and one asking for a capability. */ +const sectionRows: MenuItem[] = [ + { label: 'Section', to: '/section' }, + { label: 'Section settings', to: '/section-settings', capability: 'section.manage' }, +] + const sectionPlugin: FrontendPlugin = { id: 'section', - nav: [ - { - label: 'Section', - to: '/section', - icon: , - }, - ], + nav: sectionRows, routes: (parent) => [ createRoute({ getParentRoute: () => parent, path: '/section', staticData: { Sidebar: function SectionSidebar() { - return

section sidebar

+ return ( + +

section sidebar

+
+ ) }, }, component: function SectionCanvas() { return

section canvas

}, }), + createRoute({ + getParentRoute: () => parent, + path: '/section-settings', + component: function SectionSettings() { + return

section settings

+ }, + }), ], } -test('renders the plugin nav on routes without a section screen', async () => { - renderPluginAt(sectionPlugin, '/') +/** A signed in account carrying no capability. */ +const reader = { ...defaultUser, role: 'reader', capabilities: [] } + +/** + * Returns the sidebar the test host draws. + * @returns The region named Navigation. + */ +function sidebar(): Promise { + return screen.findByRole('region', { name: 'Navigation' }) +} + +test('draws the plugin rows as a list in the real sidebar, under the host title', async () => { + renderPluginAt(sectionPlugin, '/', { session: reader }) expect(await screen.findByText('Test host home')).toBeInTheDocument() - expect( - screen.getByRole('link', { name: 'Section' }), - ).toBeInTheDocument() + const shown = await sidebar() + expect(within(shown).getByRole('heading', { level: 1, name: 'Test host' })).toBeInTheDocument() + const rows = within(within(shown).getByRole('list')).getAllByRole('listitem') + expect(rows.map((row) => row.textContent)).toEqual(['Section']) + expect(document.querySelector('.godmin-layout__canvas')).toContainElement(screen.getByText('Test host home')) +}) + +test('shows a plugin row naming a capability to a session holding it', async () => { + renderPluginAt(sectionPlugin, '/', { session: { ...reader, capabilities: ['section.manage'] } }) + + expect(await within(await sidebar()).findByRole('link', { name: 'Section settings' })).toBeInTheDocument() +}) + +test('asks the server for the account when the test seeds none, showing the rows that account may open', async () => { + server.use(sessionOk({ ...reader, capabilities: ['section.manage'] })) + + renderPluginAt(sectionPlugin, '/') + + expect(await within(await sidebar()).findByRole('link', { name: 'Section settings' })).toBeInTheDocument() }) test('renders the section sidebar and canvas on a section route', async () => { - renderPluginAt(sectionPlugin, '/section') + renderPluginAt(sectionPlugin, '/section', { session: reader }) - expect(await screen.findByText('section sidebar')).toBeInTheDocument() + const shown = await sidebar() + expect(await within(shown).findByText('section sidebar')).toBeInTheDocument() + expect(within(shown).getByRole('heading', { level: 1, name: 'Section' })).toBeInTheDocument() expect(screen.getByText('section canvas')).toBeInTheDocument() }) +test('takes Back on a plugin sub menu to the host home', async () => { + renderPluginAt(sectionPlugin, '/section', { session: reader }) + + fireEvent.click(await within(await sidebar()).findByRole('link', { name: 'Back' })) + + expect(await screen.findByText('Test host home')).toBeInTheDocument() + const row = within(await sidebar()).getByRole('link', { name: 'Section' }) + await waitFor(() => expect(row).toHaveFocus()) +}) + test('renders a plugin screen with the session the test seeds', async () => { const session = { ...defaultUser, role: 'moderator', capabilities: ['events.manage'] } @@ -79,6 +135,15 @@ test('renders a plugin screen with the session the test seeds', async () => { expect(await screen.findByText('manages events:true')).toBeInTheDocument() }) +test('keeps the session the test seeds without asking the server for it', async () => { + server.use(http.get('/api/auth/session', () => delay('infinite'))) + + renderPluginAt(eventsPlugin, '/events', { session: { ...reader, capabilities: ['events.manage'] } }) + + expect(await screen.findByText('asking the server:false')).toBeInTheDocument() + expect(screen.getByText('manages events:true')).toBeInTheDocument() +}) + test('renders a plugin screen signed out when the test seeds no account', async () => { renderPluginAt(eventsPlugin, '/events', { session: null }) diff --git a/sdk/frontend/testing.tsx b/sdk/frontend/testing.tsx index 772a2a6f..72341629 100644 --- a/sdk/frontend/testing.tsx +++ b/sdk/frontend/testing.tsx @@ -1,7 +1,10 @@ // SPDX-License-Identifier: Apache-2.0 import '@testing-library/jest-dom/vitest' +import { Frame } from '@gopherium/godmin' +import { Navigation, useFrameLocation } from '@gopherium/godmin/router' import { installTestEnvironment as installGodminTestEnvironment } from '@gopherium/godmin/testing' +import { can, sessionQueryKey, useSession } from '@gopherium/react-auth' import { installTestEnvironment as installAuthTestEnvironment, seedSession } from '@gopherium/react-auth/testing' import { QueryClient, QueryClientProvider } from '@tanstack/react-query' import { @@ -12,11 +15,10 @@ import { createRootRoute, createRoute, createRouter, - useRouterState, } from '@tanstack/react-router' import { render } from '@testing-library/react' -import type { FrontendPlugin, Session } from './index' +import type { FrontendPlugin, MenuItem, Session } from './index' export { HttpResponse, http, server } from '@gopherium/react-auth/testing' @@ -28,6 +30,30 @@ export function installTestEnvironment() { installAuthTestEnvironment() } +/** + * Renders the frame the admin draws around a plugin's screens: the sidebar holding the plugin's rows, and the canvas. + * @param props - The rows the plugin adds to the menu. + * @returns The frame element. + */ +function TestHost({ nav }: { nav: readonly MenuItem[] }) { + const session = useSession().data + return ( + + + } + can={(capability) => can(session, capability)} + /> + + + + + + ) +} + /** * Renders the given frontend plugin mounted at a specific route path, with the signed in account the test seeds. * @param plugin - The frontend plugin whose nav and routes are mounted. @@ -36,28 +62,8 @@ export function installTestEnvironment() { */ export function renderPluginAt(plugin: FrontendPlugin, path: string, options: { session?: Session | null } = {}) { const rootRoute = createRootRoute({ - component: function TestHost() { - const matches = useRouterState({ select: (state) => state.matches }) - const sidebarMatch = [...matches] - .reverse() - .find((match) => match.staticData.Sidebar) - const Sidebar = sidebarMatch?.staticData.Sidebar - return ( - <> - - - - ) + component: function TestHostFrame() { + return }, }) const homeRoute = createRoute({ @@ -79,6 +85,7 @@ export function renderPluginAt(plugin: FrontendPlugin, path: string, options: { defaultOptions: { queries: { retry: false } }, }) if (options.session !== undefined) { + client.setQueryDefaults(sessionQueryKey, { staleTime: Infinity }) seedSession(client, options.session) } render( From 84be1bc81da882a444a3f16b5f70f99e1c93dbeb Mon Sep 17 00:00:00 2001 From: SirLouen Date: Fri, 23 Oct 2026 15:18:03 +0200 Subject: [PATCH 4/9] feat(frontend): title each screen at the second level under the sidebar title --- frontend/src/content/PostsScreen.tsx | 1 + frontend/src/content/TypesScreen.tsx | 5 +- frontend/src/i18n/LanguageScreen.tsx | 1 + frontend/src/media/MediaScreen.tsx | 1 + frontend/src/settings/SettingsScreen.tsx | 1 + frontend/src/test/add-new-post.test.tsx | 4 +- frontend/src/test/editor-trash.test.tsx | 14 ++--- frontend/src/test/outline.test.tsx | 73 +++++++++++++++++----- frontend/src/test/posts-list.test.tsx | 2 +- frontend/src/test/posts-tabs.test.tsx | 2 +- frontend/src/test/posts-trash.test.tsx | 2 +- frontend/src/test/role-navigation.test.tsx | 6 +- frontend/src/test/screen-headings.test.tsx | 35 ++++++----- frontend/src/test/users-route.test.tsx | 14 ++--- frontend/src/themes/ThemesScreen.tsx | 1 + frontend/src/users/NewUserScreen.tsx | 2 +- frontend/src/users/UsersScreen.tsx | 1 + 17 files changed, 109 insertions(+), 56 deletions(-) diff --git a/frontend/src/content/PostsScreen.tsx b/frontend/src/content/PostsScreen.tsx index 06435160..42435c69 100644 --- a/frontend/src/content/PostsScreen.tsx +++ b/frontend/src/content/PostsScreen.tsx @@ -324,6 +324,7 @@ export function PostsScreen() { return ( diff --git a/frontend/src/content/TypesScreen.tsx b/frontend/src/content/TypesScreen.tsx index adf3c7b0..01d5be7a 100644 --- a/frontend/src/content/TypesScreen.tsx +++ b/frontend/src/content/TypesScreen.tsx @@ -15,7 +15,7 @@ import { useCallback, useLayoutEffect, useMemo, useRef, useState } from 'react' import { useFocusOnList } from '../lists/focusOnList' import type { ListSettings } from '../settings/api' import { useListSettings } from '../settings/useListSettings' -import { typesNavItem, typesQueryKey } from './nav' +import { typesMenuItem, typesQueryKey } from './nav' import { TYPE_COLUMNS, TYPE_PHONE_COLUMNS, TYPE_SORT, TYPE_VIEW_GUARD, originsOf, typeFields } from './typeFields' import { useTypeActions } from './typeActions' import { AddTypeDialog } from './TypeModals' @@ -100,7 +100,7 @@ function TypesTable(props: { data={shown.data} paginationInfo={shown.paginationInfo} config={{ perPageSizes: props.settings?.list_page_sizes ?? [] }} - empty={} + empty={} fields={fields} actions={props.actions} view={view} @@ -147,6 +147,7 @@ export function TypesScreen() { return ( } list diff --git a/frontend/src/i18n/LanguageScreen.tsx b/frontend/src/i18n/LanguageScreen.tsx index e8fb474c..18b328e5 100644 --- a/frontend/src/i18n/LanguageScreen.tsx +++ b/frontend/src/i18n/LanguageScreen.tsx @@ -64,6 +64,7 @@ export function LanguageScreen() { return ( diff --git a/frontend/src/media/MediaScreen.tsx b/frontend/src/media/MediaScreen.tsx index e2eebdc6..f2274cbd 100644 --- a/frontend/src/media/MediaScreen.tsx +++ b/frontend/src/media/MediaScreen.tsx @@ -252,6 +252,7 @@ export function MediaScreen() { return ( diff --git a/frontend/src/settings/SettingsScreen.tsx b/frontend/src/settings/SettingsScreen.tsx index 06049b89..51c67fd1 100644 --- a/frontend/src/settings/SettingsScreen.tsx +++ b/frontend/src/settings/SettingsScreen.tsx @@ -124,6 +124,7 @@ export function SettingsScreen() { return ( {settingsBody(held)} diff --git a/frontend/src/test/add-new-post.test.tsx b/frontend/src/test/add-new-post.test.tsx index babd8025..9aabd921 100644 --- a/frontend/src/test/add-new-post.test.tsx +++ b/frontend/src/test/add-new-post.test.tsx @@ -44,7 +44,7 @@ function captureCreate(): { bodies: unknown[] } { } /** - * Returns the add button the list header holds, apart from the rail's. + * Returns the add button the list header holds, apart from the sidebar's. * @param name - The words the button shows, Add Post unless a test names others. * @returns The header's add button. */ @@ -160,7 +160,7 @@ test('draws no add button until the type registry answers, then drafts on its de const recorded = captureCreate() renderAt('/content/post') const main = await screen.findByRole('main') - await within(main).findByRole('heading', { level: 1, name: 'Content' }) + await within(main).findByRole('heading', { level: 2, name: 'Content' }) expect(within(main).queryByRole('button', { name: 'Add Content' })).not.toBeInTheDocument() expect(within(main).queryByRole('button', { name: 'Add Post' })).not.toBeInTheDocument() diff --git a/frontend/src/test/editor-trash.test.tsx b/frontend/src/test/editor-trash.test.tsx index afff13a2..08dff474 100644 --- a/frontend/src/test/editor-trash.test.tsx +++ b/frontend/src/test/editor-trash.test.tsx @@ -325,7 +325,7 @@ test('closes the confirm at once and shows the trash running on Move to trash, a expect(trigger).toHaveAttribute('aria-disabled', 'true') expect(trashed).toEqual([]) answer.release() - expect(await screen.findByRole('heading', { name: 'Posts', level: 1 })).toBeInTheDocument() + expect(await screen.findByRole('heading', { name: 'Posts', level: 2 })).toBeInTheDocument() }) test('asks nothing more when Move to trash is pressed while the trash runs', async () => { @@ -342,7 +342,7 @@ test('asks nothing more when Move to trash is pressed while the trash runs', asy expect(screen.queryByRole('dialog')).not.toBeInTheDocument() answer.release() - expect(await screen.findByRole('heading', { name: 'Posts', level: 1 })).toBeInTheDocument() + expect(await screen.findByRole('heading', { name: 'Posts', level: 2 })).toBeInTheDocument() expect(trashed).toEqual([storedPost.id]) }) @@ -356,7 +356,7 @@ test('gives the focus back to Move to trash as the confirm closes for the trash' await waitFor(() => expect(screen.queryByRole('dialog')).not.toBeInTheDocument()) expect(trigger).toHaveFocus() answer.release() - expect(await screen.findByRole('heading', { name: 'Posts', level: 1 })).toBeInTheDocument() + expect(await screen.findByRole('heading', { name: 'Posts', level: 2 })).toBeInTheDocument() }) test('keeps the reader on a post opened while the trash ran, naming the trashed post in a toast', async () => { @@ -380,7 +380,7 @@ test('keeps the reader on a post opened while the trash ran, naming the trashed .toBeInTheDocument() expect(trashed).toEqual([storedPost.id]) expect(screen.getByRole('textbox', { name: 'Title' })).toHaveValue('A second post') - expect(screen.queryByRole('heading', { name: 'Posts', level: 1 })).not.toBeInTheDocument() + expect(screen.queryByRole('heading', { name: 'Posts', level: 2 })).not.toBeInTheDocument() }) test('trashes the post once confirmed', async () => { @@ -407,7 +407,7 @@ test('lands on the list of the type it left', async () => { await userEvent.click(await screen.findByRole('button', { name: 'Move to trash' })) - expect(await screen.findByRole('heading', { name: 'Posts', level: 1 })).toBeInTheDocument() + expect(await screen.findByRole('heading', { name: 'Posts', level: 2 })).toBeInTheDocument() }) test('names the post it trashed in a toast carried to the list, with no undo', async () => { @@ -572,7 +572,7 @@ test('speaks nothing when the reader left before the restore failed', async () = await act(async () => { await router.navigate({ to: '/content/$typeKey', params: { typeKey: 'post' } }) }) - await screen.findByRole('heading', { name: 'Posts', level: 1 }) + await screen.findByRole('heading', { name: 'Posts', level: 2 }) answer.release() @@ -616,7 +616,7 @@ test('opens a post trashed from the editor as a reading view', async () => { const { router } = renderRoutedAt(EDITOR_PATH) await userEvent.click(await screen.findByRole('button', { name: 'Move to trash' })) await userEvent.click(await screen.findByRole('button', { name: 'Move to trash' })) - await screen.findByRole('heading', { name: 'Posts', level: 1 }) + await screen.findByRole('heading', { name: 'Posts', level: 2 }) await openEditor(router, storedPost.id) diff --git a/frontend/src/test/outline.test.tsx b/frontend/src/test/outline.test.tsx index 44b68d83..ec6b137d 100644 --- a/frontend/src/test/outline.test.tsx +++ b/frontend/src/test/outline.test.tsx @@ -9,21 +9,28 @@ import { renderAt } from './render' import { storedPost } from './postFixture' import { siteSettings } from './siteSettings' -const FRAMED = [ - '/', - '/content/$typeKey', - '/content-types', - '/field-groups', - '/media', - '/users', - '/users/new', - '/themes', - '/language', - '/settings', +const TITLES: Record = { + '/': 'Posts', + '/content/$typeKey': 'Posts', + '/content-types': 'Content Types', + '/field-groups': 'Field Groups', + '/media': 'Media', + '/users': 'Users', + '/users/new': 'Add User', + '/themes': 'Themes', + '/language': 'Language', + '/settings': 'Settings', +} + +const FRAMED = Object.keys(TITLES) + +const VISITABLE = Object.entries(TITLES).map(([path, title]) => [path.replace('$typeKey', 'post'), title]) + +const EMPTY = [ + ['/content/post', 'No items yet.'], + ['/media', 'No media items yet.'], ] -const VISITABLE = FRAMED.map((path) => path.replace('$typeKey', 'post')) - const CHROMELESS = ['/content/$typeKey/$postId/edit'] const EDITOR_URL = `/content/post/${storedPost.id}/edit` @@ -39,6 +46,8 @@ beforeEach(() => { http.get('/api/users', () => HttpResponse.json([])), http.get('/api/themes', () => HttpResponse.json({ themes: [] })), http.get('/api/media', () => HttpResponse.json({ items: [], total: 0, per_page: siteSettings.list_page_size })), + http.get('/api/locale', () => HttpResponse.json({ locale: 'en-US', supported: ['en-US'] })), + http.get('/api/definitions/drift', () => HttpResponse.json({ orphans: [], collisions: [], nesting_kept: [] })), http.get(`/api/content/${storedPost.id}`, () => HttpResponse.json(storedPost)), http.get(`/api/content/${storedPost.id}/autosave`, () => HttpResponse.json({}, { status: 404 }), @@ -56,13 +65,34 @@ test('covers every route the application serves', () => { expect([...served].sort()).toEqual([...FRAMED, ...CHROMELESS].sort()) }) -test.each(VISITABLE)('gives %s exactly one first level heading', async (path) => { +test.each(VISITABLE)('titles %s as %s at the second level, under the sidebar title', async (path, title) => { renderAt(path) const main = await screen.findByRole('main') - await within(main).findByRole('heading', { level: 1 }) - expect(within(main).getAllByRole('heading', { level: 1 })).toHaveLength(1) + await within(main).findByRole('heading', { level: 2, name: title }) + expect(within(main).getAllByRole('heading', { level: 2 })).toHaveLength(1) + expect(within(main).queryAllByRole('heading', { level: 1 })).toHaveLength(0) +}) + +test.each(EMPTY)('titles the empty list on %s as %s one level under the page title', async (path, empty) => { + renderAt(path) + + const main = await screen.findByRole('main') + + await within(main).findByRole('heading', { level: 3, name: empty }) + expect(within(main).getAllByRole('heading', { level: 2 })).toHaveLength(1) +}) + +test.each(VISITABLE)('leaves %s the sidebar title as its only first level heading', async (path, title) => { + renderAt(path) + + await within(await screen.findByRole('main')).findByRole('heading', { level: 2, name: title }) + + const sidebar = screen.getByRole('region', { name: 'Navigation' }) + expect(screen.getAllByRole('heading', { level: 1 })).toEqual([ + within(sidebar).getByRole('heading', { level: 1, name: 'Gophenberg' }), + ]) }) test('leaves the design canvas without a page heading', async () => { @@ -72,3 +102,14 @@ test('leaves the design canvas without a page heading', async () => { expect(screen.queryAllByRole('heading', { level: 1 })).toHaveLength(0) }) + +test('keeps the title of a trashed post at the first level in the editor, with no sidebar beside it', async () => { + server.use( + http.get(`/api/content/${storedPost.id}`, () => HttpResponse.json({ ...storedPost, status: 'trash' })), + ) + renderAt(EDITOR_URL) + + expect(await screen.findByRole('heading', { level: 1, name: storedPost.title })).toBeInTheDocument() + expect(screen.getAllByRole('heading', { level: 1 })).toHaveLength(1) + expect(screen.queryByRole('region', { name: 'Navigation' })).toBeNull() +}) diff --git a/frontend/src/test/posts-list.test.tsx b/frontend/src/test/posts-list.test.tsx index 8aae1ea4..1e589062 100644 --- a/frontend/src/test/posts-list.test.tsx +++ b/frontend/src/test/posts-list.test.tsx @@ -211,7 +211,7 @@ test('never shows the rows of one type while the list of another loads', async ( await router.navigate({ to: '/content/$typeKey', params: { typeKey: 'page' } }) }) - expect(await screen.findByRole('heading', { level: 1, name: 'Pages' })).toBeInTheDocument() + expect(await screen.findByRole('heading', { level: 2, name: 'Pages' })).toBeInTheDocument() expect(screen.queryByText('Welcome to Gophenberg')).not.toBeInTheDocument() pages.release() expect(await screen.findByText('About Us')).toBeInTheDocument() diff --git a/frontend/src/test/posts-tabs.test.tsx b/frontend/src/test/posts-tabs.test.tsx index 509c7d5a..ff37267b 100644 --- a/frontend/src/test/posts-tabs.test.tsx +++ b/frontend/src/test/posts-tabs.test.tsx @@ -310,7 +310,7 @@ test('offers no Empty Trash from the trash of another type while an empty trash await router.navigate({ to: '/content/$typeKey', params: { typeKey: 'page' }, search: { status: 'trash' } }) }) - expect(await screen.findByRole('heading', { level: 1, name: 'Pages' })).toBeInTheDocument() + expect(await screen.findByRole('heading', { level: 2, name: 'Pages' })).toBeInTheDocument() expect(screen.queryByRole('button', { name: 'Empty Trash' })).not.toBeInTheDocument() pages.release() expect(await screen.findByText('No items found.')).toBeInTheDocument() diff --git a/frontend/src/test/posts-trash.test.tsx b/frontend/src/test/posts-trash.test.tsx index 5e367c68..cc42e255 100644 --- a/frontend/src/test/posts-trash.test.tsx +++ b/frontend/src/test/posts-trash.test.tsx @@ -448,7 +448,7 @@ test('reports a run that settles after the list moved to another type in its toa await act(async () => { await router.navigate({ to: '/content/$typeKey', params: { typeKey: 'page' } }) }) - await screen.findByRole('heading', { name: 'Pages', level: 1 }) + await screen.findByRole('heading', { name: 'Pages', level: 2 }) answer.release() expect(await screen.findByText('1 item could not be restored.', { selector: '.godmin-toast' })).toBeInTheDocument() diff --git a/frontend/src/test/role-navigation.test.tsx b/frontend/src/test/role-navigation.test.tsx index ea1259ff..98108b5e 100644 --- a/frontend/src/test/role-navigation.test.tsx +++ b/frontend/src/test/role-navigation.test.tsx @@ -98,21 +98,21 @@ test('leaves a role carrying only the themes capability on the themes screen it test('answers a deep link into a gated screen by opening the default list', async () => { renderAt('/users', holding('author', [])) - expect(await screen.findByRole('heading', { name: 'Posts', level: 1 })).toBeInTheDocument() + expect(await screen.findByRole('heading', { name: 'Posts', level: 2 })).toBeInTheDocument() await waitFor(() => expect(screen.queryByRole('heading', { name: 'Users' })).toBeNull()) }) test('returns a role named admin that carries no capability from a deep link the same way', async () => { renderAt('/users', holding('admin', [])) - expect(await screen.findByRole('heading', { name: 'Posts', level: 1 })).toBeInTheDocument() + expect(await screen.findByRole('heading', { name: 'Posts', level: 2 })).toBeInTheDocument() await waitFor(() => expect(screen.queryByRole('heading', { name: 'Users' })).toBeNull()) }) test('answers a deep link into the new user form the same way', async () => { renderAt('/users/new', holding('editor', [CHANGE_OTHERS_WORK])) - expect(await screen.findByRole('heading', { name: 'Posts', level: 1 })).toBeInTheDocument() + expect(await screen.findByRole('heading', { name: 'Posts', level: 2 })).toBeInTheDocument() }) test('leaves an administrator on the gated screen it asked for', async () => { diff --git a/frontend/src/test/screen-headings.test.tsx b/frontend/src/test/screen-headings.test.tsx index 408cd351..88c879aa 100644 --- a/frontend/src/test/screen-headings.test.tsx +++ b/frontend/src/test/screen-headings.test.tsx @@ -43,24 +43,26 @@ function serveOnly(row: Record) { server.use(http.get('/api/types', () => HttpResponse.json({ items: [row] }))) } -test('names the list the root opens with its only first level heading', async () => { +test('names the list the root opens with its only second level heading, beside the sidebar', async () => { servePosts() renderAt('/') const main = await screen.findByRole('main') - expect(await within(main).findByRole('heading', { level: 1 })).toHaveTextContent('Posts') - expect(within(main).getAllByRole('heading', { level: 1 })).toHaveLength(1) + await within(main).findByRole('heading', { level: 3, name: 'No items yet.' }) + expect(within(main).getByRole('heading', { level: 2 })).toHaveTextContent('Posts') + expect(within(main).queryAllByRole('heading', { level: 1 })).toHaveLength(0) }) -test('names the posts screen with its only first level heading', async () => { +test('names the posts screen with its only second level heading, beside the sidebar', async () => { servePosts() renderAt('/content/post') const main = await screen.findByRole('main') - expect(await within(main).findByRole('heading', { level: 1 })).toHaveTextContent('Posts') - expect(within(main).getAllByRole('heading', { level: 1 })).toHaveLength(1) + await within(main).findByRole('heading', { level: 3, name: 'No items yet.' }) + expect(within(main).getByRole('heading', { level: 2 })).toHaveTextContent('Posts') + expect(within(main).queryAllByRole('heading', { level: 1 })).toHaveLength(0) }) test('says under the posts title what the type describes itself as', async () => { @@ -79,7 +81,7 @@ test('names the posts list in the words of WordPress es_ES and says what it is f renderAt('/content/post') const main = await screen.findByRole('main') - expect(await within(main).findByRole('heading', { level: 1 })).toHaveTextContent('Entradas') + expect(await within(main).findByRole('heading', { level: 2, name: 'Entradas' })).toBeInTheDocument() expect(await screen.findByText('Gestiona las entradas de este sitio.')).toHaveClass('godmin-page__subtitle') expect(screen.getByRole('region', { name: 'Entradas' })).toBeInTheDocument() expect(screen.getByRole('searchbox', { name: 'Buscar entradas…' })).toBeInTheDocument() @@ -101,7 +103,7 @@ test('keeps the list of a plugin type under a built-in key in the plugin words f renderAt('/content/page') - await screen.findByRole('heading', { level: 1, name: 'Pages' }) + await screen.findByRole('heading', { level: 2, name: 'Pages' }) expect(await screen.findByText('Manage the pages on this site.')).toHaveClass('godmin-page__subtitle') }) @@ -123,7 +125,7 @@ test('shows a description a person wrote for posts as they typed it to a Spanish renderAt('/content/post') - await screen.findByRole('heading', { level: 1, name: 'Entradas' }) + await screen.findByRole('heading', { level: 2, name: 'Entradas' }) expect(await screen.findByText('Everything the team writes.')).toHaveClass('godmin-page__subtitle') }) @@ -133,7 +135,7 @@ test('says what a list is for in words of its own when the type describes nothin renderAt('/content/post') - await screen.findByRole('heading', { level: 1, name: 'Posts' }) + await screen.findByRole('heading', { level: 2, name: 'Posts' }) expect(screen.getByText('Manage the items of this content type.')).toHaveClass('godmin-page__subtitle') }) @@ -149,19 +151,22 @@ test('says nothing under the posts title until the type registry answers', async renderAt('/content/post') - await screen.findByRole('heading', { level: 1, name: 'Content' }) + await screen.findByRole('heading', { level: 2, name: 'Content' }) expect(screen.queryByText('Manage the items of this content type.')).not.toBeInTheDocument() registry.release() expect(await screen.findByText('Manage the posts on this site.')).toHaveClass('godmin-page__subtitle') }) -test('leaves the rail out of the heading outline', async () => { +test('titles the sidebar with the site name, the only first level heading of the page', async () => { servePosts() renderAt('/') - await screen.findByRole('heading', { level: 1, name: 'Posts' }) - expect(screen.getAllByRole('heading', { level: 1 })).toHaveLength(1) + await screen.findByRole('heading', { level: 2, name: 'Posts' }) + const sidebar = screen.getByRole('region', { name: 'Navigation' }) + expect(within(sidebar).getAllByRole('heading')).toHaveLength(1) + expect(within(sidebar).getByRole('heading', { level: 1 })).toHaveTextContent('Gophenberg') + expect(screen.getAllByRole('heading', { level: 1 })).toEqual([within(sidebar).getByRole('heading')]) }) test('announces a posts listing it could not load in place of the list', async () => { @@ -182,5 +187,5 @@ test('keeps the posts heading when the listing fails', async () => { await screen.findByRole('alert') const main = screen.getByRole('main') - expect(within(main).getByRole('heading', { level: 1 })).toHaveTextContent('Posts') + expect(within(main).getByRole('heading', { level: 2 })).toHaveTextContent('Posts') }) diff --git a/frontend/src/test/users-route.test.tsx b/frontend/src/test/users-route.test.tsx index 7af41936..b83ee862 100644 --- a/frontend/src/test/users-route.test.tsx +++ b/frontend/src/test/users-route.test.tsx @@ -31,7 +31,7 @@ test('keeps the users heading while the accounts are on their way', async () => const main = await screen.findByRole('main') - expect(await within(main).findByRole('heading', { level: 1 })).toHaveTextContent('Users') + expect(await within(main).findByRole('heading', { level: 2 })).toHaveTextContent('Users') const status = await within(main).findByRole('status') expect(status).toHaveTextContent('Loading users.') expect(status.closest('.godmin-loading-rows')).not.toBeNull() @@ -53,17 +53,17 @@ test('keeps the users heading when the accounts cannot be loaded', async () => { expect(alert).toHaveTextContent(/could not be loaded/i) const main = screen.getByRole('main') - expect(within(main).getByRole('heading', { level: 1 })).toHaveTextContent('Users') - expect(within(main).getAllByRole('heading', { level: 1 })).toHaveLength(1) + expect(within(main).getByRole('heading', { level: 2 })).toHaveTextContent('Users') + expect(within(main).getAllByRole('heading', { level: 2 })).toHaveLength(1) }) -test('names the add user screen with its only first level heading, as WordPress does', async () => { +test('names the add user screen with its only second level heading, under the sidebar title', async () => { renderAt('/users/new') const main = await screen.findByRole('main') - expect(within(main).getByRole('heading', { level: 1 })).toHaveTextContent('Add User') - expect(within(main).getAllByRole('heading', { level: 1 })).toHaveLength(1) + expect(within(main).getByRole('heading', { level: 2 })).toHaveTextContent('Add User') + expect(within(main).getAllByRole('heading', { level: 2 })).toHaveLength(1) }) test('names the add user screen as WordPress es_ES does for a Spanish reader', async () => { @@ -71,7 +71,7 @@ test('names the add user screen as WordPress es_ES does for a Spanish reader', a onTestFinished(() => resetLocaleData({}, 'gophenberg')) renderAt('/users/new') - expect(await screen.findByRole('heading', { level: 1, name: 'Añadir usuario' })).toBeInTheDocument() + expect(await screen.findByRole('heading', { level: 2, name: 'Añadir usuario' })).toBeInTheDocument() }) test('serves the users screen at /users', async () => { diff --git a/frontend/src/themes/ThemesScreen.tsx b/frontend/src/themes/ThemesScreen.tsx index 2e813f5b..e57d1c10 100644 --- a/frontend/src/themes/ThemesScreen.tsx +++ b/frontend/src/themes/ThemesScreen.tsx @@ -133,6 +133,7 @@ export function ThemesScreen() { return ( } > diff --git a/frontend/src/users/NewUserScreen.tsx b/frontend/src/users/NewUserScreen.tsx index 7853ab1c..61c1a45f 100644 --- a/frontend/src/users/NewUserScreen.tsx +++ b/frontend/src/users/NewUserScreen.tsx @@ -56,7 +56,7 @@ export function NewUserScreen() { const incomplete = email.trim() === '' || name.trim() === '' || password === '' const roles = grantable.map((offered) => ({ value: offered, label: roleLabel(offered) })) return ( - +
{ diff --git a/frontend/src/users/UsersScreen.tsx b/frontend/src/users/UsersScreen.tsx index aaa384e9..413c54a4 100644 --- a/frontend/src/users/UsersScreen.tsx +++ b/frontend/src/users/UsersScreen.tsx @@ -26,6 +26,7 @@ export function UsersScreen() { return ( }> {__('Add User', 'gophenberg')} From ef448473c4673f1a34976a15ef235015436c8108 Mon Sep 17 00:00:00 2001 From: SirLouen Date: Fri, 23 Oct 2026 15:18:03 +0200 Subject: [PATCH 5/9] refactor(frontend): split the field group overlap walk and the theme test helper --- frontend/src/content/GroupsScreen.tsx | 62 ++++++++++-------------- frontend/src/test/themes-manage.test.tsx | 27 ++++++----- 2 files changed, 40 insertions(+), 49 deletions(-) diff --git a/frontend/src/content/GroupsScreen.tsx b/frontend/src/content/GroupsScreen.tsx index 843028a7..526947cb 100644 --- a/frontend/src/content/GroupsScreen.tsx +++ b/frontend/src/content/GroupsScreen.tsx @@ -137,69 +137,58 @@ export interface Shadowing { */ export function shadowings(groups: PlacedGroup[], types: NamedType[]): Shadowing[] { const active = groups.filter((held) => held.active) - const found: Shadowing[] = [] const noted = new Map() for (const listed of types) { - collectOverlaps(active, listed, noted, found) + const reaching = active.filter((held) => matchesType(held.location, listed.key)) + for (const overlap of overlapsAmong(reaching)) { + noteOverlap(noted, overlap, pluralOf(listed)) + } } - return found + return [...noted.values()] +} + +/** One field key two groups on the same type both hold. */ +interface Overlap { + key: string + winner: PlacedGroup + loser: PlacedGroup } /** - * Adds every overlap one type carries to the overlaps already found. - * @param active - The active groups in listing order. - * @param listed - The type walked. - * @param noted - The overlaps already found, by key and pair. - * @param found - The overlaps in the order they were found. + * Returns every field key a later group holds while an earlier one serves it. + * @param reaching - The active groups that reach one type, in listing order. + * @returns The overlaps in the order they were found. */ -function collectOverlaps( - active: PlacedGroup[], - listed: NamedType, - noted: Map, - found: Shadowing[], -) { +function overlapsAmong(reaching: PlacedGroup[]): Overlap[] { const winners = new Map() - for (const held of active) { - if (!matchesType(held.location, listed.key)) { - continue - } + const overlaps: Overlap[] = [] + for (const held of reaching) { for (const f of held.fields) { const winner = winners.get(f.key) if (winner === undefined) { winners.set(f.key, held) - continue + } else { + overlaps.push({ key: f.key, winner, loser: held }) } - noteOverlap(noted, found, f.key, winner, held, pluralOf(listed)) } } + return overlaps } /** * Records the overlap between two groups on one type. - * @param noted - The overlaps already found, by key and pair. - * @param found - The overlaps in the order they were found. - * @param key - The field key both groups hold. - * @param winner - The group serving the key. - * @param loser - The group holding the key without showing it. + * @param noted - The overlaps already found, by key and pair, in the order they were found. + * @param overlap - The field key and the two groups holding it. * @param label - The plural label of the type both reach. */ -function noteOverlap( - noted: Map, - found: Shadowing[], - key: string, - winner: PlacedGroup, - loser: PlacedGroup, - label: string, -) { +function noteOverlap(noted: Map, { key, winner, loser }: Overlap, label: string) { const at = `${key}:${winner.id}:${loser.id}` const known = noted.get(at) if (known !== undefined) { known.where.push(label) return } - const fresh = { key, winner: winner.title, loser: loser.title, loserID: loser.id, where: [label] } - noted.set(at, fresh) - found.push(fresh) + noted.set(at, { key, winner: winner.title, loser: loser.title, loserID: loser.id, where: [label] }) } /** @@ -261,6 +250,7 @@ export function GroupsScreen() { return ( diff --git a/frontend/src/test/themes-manage.test.tsx b/frontend/src/test/themes-manage.test.tsx index bb1e45ea..55e7c2d0 100644 --- a/frontend/src/test/themes-manage.test.tsx +++ b/frontend/src/test/themes-manage.test.tsx @@ -53,14 +53,15 @@ beforeEach(() => * Returns a theme as the screen models it. * @param name - The theme name. * @param active - Whether it is the chosen theme. - * @param broken - The reason it will not load, empty when it loads. - * @param version - The version its manifest declares. - * @param serving - Whether the public site is answered by it. - * @param startFailed - Whether its supervisor stopped trying to start it. + * @param state - What differs from a theme that loads, declares 1.0.0 and answers the site while chosen. * @returns The theme. */ -function theme(name: string, active: boolean, broken = '', version = '1.0.0', serving = active, startFailed = false) { - return { name, version, broken, active, serving, startFailed } +function theme( + name: string, + active: boolean, + state: { broken?: string, version?: string, serving?: boolean, startFailed?: boolean } = {}, +) { + return { name, version: '1.0.0', broken: '', active, serving: active, startFailed: false, ...state } } test('names the theme serving the public site', async () => { @@ -97,7 +98,7 @@ test('says the built-in renderer is serving when no theme is active', async () = }) test('says the renderer is serving when the active theme will not load', async () => { - listing([theme('aurora', true, 'the manifest is missing', '1.0.0', false)]) + listing([theme('aurora', true, { broken: 'the manifest is missing', serving: false })]) renderAt('/themes') expect( @@ -106,7 +107,7 @@ test('says the renderer is serving when the active theme will not load', async ( }) test('still offers to deactivate a chosen theme whose files are gone', async () => { - listing([theme('aurora', true, 'the theme is not installed', '', false)]) + listing([theme('aurora', true, { broken: 'the theme is not installed', version: '', serving: false })]) renderAt('/themes') const listed = await screen.findByRole('row', { name: /aurora/ }) @@ -134,20 +135,20 @@ test('phrases what is serving from the themes alone', () => { expect(servingLine({ themes: [theme('aurora', true)], rollback: null })).toBe( 'aurora 1.0.0 is serving the public site.', ) - expect(servingLine({ themes: [theme('aurora', true, '', '')], rollback: null })).toBe( + expect(servingLine({ themes: [theme('aurora', true, { version: '' })], rollback: null })).toBe( 'aurora is serving the public site.', ) expect( servingLine({ - themes: [theme('aurora', true, 'the manifest is missing')], + themes: [theme('aurora', true, { broken: 'the manifest is missing' })], rollback: null, }), ).toBe('aurora will not load, so the built-in renderer is serving.') expect( - servingLine({ themes: [theme('aurora', true, '', '1.0.0', false)], rollback: null }), + servingLine({ themes: [theme('aurora', true, { serving: false })], rollback: null }), ).toBe('aurora is still starting, so the built-in renderer is serving.') expect( - servingLine({ themes: [theme('aurora', true, '', '1.0.0', false, true)], rollback: null }), + servingLine({ themes: [theme('aurora', true, { serving: false, startFailed: true })], rollback: null }), ).toBe('aurora failed to start, so the built-in renderer is serving.') }) @@ -199,7 +200,7 @@ test('keeps the themes heading when the themes cannot be listed', async () => { renderAt('/themes') expect(await screen.findByRole('alert')).toHaveTextContent('Themes could not be loaded.') - expect(screen.getByRole('heading', { level: 1, name: 'Themes' })).toBeTruthy() + expect(screen.getByRole('heading', { level: 2, name: 'Themes' })).toBeTruthy() }) test('serves the public site through a theme at the reader s request', async () => { From b82b9666849460da6ae51c2c385269f688d6db04 Mon Sep 17 00:00:00 2001 From: SirLouen Date: Fri, 23 Oct 2026 15:18:04 +0200 Subject: [PATCH 6/9] test(e2e): find the sidebar, its footer and the second level page titles --- test/e2e/tests/auth.setup.ts | 4 +-- test/e2e/tests/proof-locale.spec.ts | 4 +-- test/e2e/tests/proof.setup.ts | 2 +- test/e2e/tests/roles.setup.ts | 4 +-- test/e2e/tests/roles.spec.ts | 8 ++--- test/e2e/tests/shell.spec.ts | 48 ++++++++++++++++++++++------- test/e2e/tests/smoke.spec.ts | 7 +++-- test/e2e/tests/themes.spec.ts | 2 +- test/e2e/tests/users-role.spec.ts | 2 +- 9 files changed, 54 insertions(+), 27 deletions(-) diff --git a/test/e2e/tests/auth.setup.ts b/test/e2e/tests/auth.setup.ts index 0ffd57a2..cc6c594d 100644 --- a/test/e2e/tests/auth.setup.ts +++ b/test/e2e/tests/auth.setup.ts @@ -11,8 +11,8 @@ setup('logs in and stores the session', async ({ page }) => { await page.getByLabel('Password').fill(credentials.password) await page.getByRole('button', { name: 'Log in' }).click() - await expect(page.getByRole('heading', { name: 'Posts', level: 1 })).toBeVisible() - await expect(page.locator('.gophenberg-rail__account').getByText(credentials.name)).toBeVisible() + await expect(page.getByRole('heading', { name: 'Posts', level: 2 })).toBeVisible() + await expect(page.locator('.godmin-sidebar__footer').getByText(credentials.name)).toBeVisible() await page.context().storageState({ path: authFile }) }) diff --git a/test/e2e/tests/proof-locale.spec.ts b/test/e2e/tests/proof-locale.spec.ts index 6f35d911..93520618 100644 --- a/test/e2e/tests/proof-locale.spec.ts +++ b/test/e2e/tests/proof-locale.spec.ts @@ -8,7 +8,7 @@ test.describe('the admin read in the proof locale', () => { test('names the main menu in the reader language', async ({ page }) => { await page.goto('/admin/') - const nav = page.getByRole('navigation', { name: 'Navegación' }) + const nav = page.getByRole('region', { name: 'Navegación' }) await expect(nav.getByRole('link', { name: 'Entradas' })).toBeVisible() await expect(nav.getByRole('link', { name: 'Medios' })).toBeVisible() await expect(nav.getByRole('link', { name: 'Temas' })).toBeVisible() @@ -27,7 +27,7 @@ test.describe('the admin read in the proof locale', () => { test('names the content list and its controls in the reader language', async ({ page }) => { await page.goto('/admin/content/post') - await expect(page.getByRole('heading', { level: 1, name: 'Entradas' })).toBeVisible() + await expect(page.getByRole('heading', { level: 2, name: 'Entradas' })).toBeVisible() await expect(page.getByText('Gestiona las entradas de este sitio.')).toBeVisible() await expect(page.getByRole('main').getByRole('button', { name: 'Añadir entrada', exact: true })).toBeVisible() await expect(page.getByRole('button', { name: 'Ver opciones' })).toBeVisible() diff --git a/test/e2e/tests/proof.setup.ts b/test/e2e/tests/proof.setup.ts index de576e06..1898da7e 100644 --- a/test/e2e/tests/proof.setup.ts +++ b/test/e2e/tests/proof.setup.ts @@ -11,7 +11,7 @@ setup('signs the proof reader in and stores their language', async ({ page }) => await page.getByLabel('Password').fill(proofCredentials.password) await page.getByRole('button', { name: 'Log in' }).click() - await expect(page.locator('.gophenberg-rail__account').getByText(proofCredentials.name)).toBeVisible() + await expect(page.locator('.godmin-sidebar__footer').getByText(proofCredentials.name)).toBeVisible() const stored = await page.request.patch('/api/locale', { data: { locale: proofLocale.locale }, diff --git a/test/e2e/tests/roles.setup.ts b/test/e2e/tests/roles.setup.ts index 07b56885..18e52d65 100644 --- a/test/e2e/tests/roles.setup.ts +++ b/test/e2e/tests/roles.setup.ts @@ -11,7 +11,7 @@ setup('logs in as the seeded editor and stores the session', async ({ page }) => await page.getByLabel('Password').fill(seededRoles.editor.password) await page.getByRole('button', { name: 'Log in' }).click() - await expect(page.getByRole('heading', { name: 'Posts', level: 1 })).toBeVisible() + await expect(page.getByRole('heading', { name: 'Posts', level: 2 })).toBeVisible() await page.context().storageState({ path: editorAuthFile }) }) @@ -22,7 +22,7 @@ setup('logs in as the seeded author and stores the session', async ({ page }) => await page.getByLabel('Password').fill(seededRoles.author.password) await page.getByRole('button', { name: 'Log in' }).click() - await expect(page.getByRole('heading', { name: 'Posts', level: 1 })).toBeVisible() + await expect(page.getByRole('heading', { name: 'Posts', level: 2 })).toBeVisible() await page.context().storageState({ path: authorAuthFile }) }) diff --git a/test/e2e/tests/roles.spec.ts b/test/e2e/tests/roles.spec.ts index 9fb44ec5..5d80b69a 100644 --- a/test/e2e/tests/roles.spec.ts +++ b/test/e2e/tests/roles.spec.ts @@ -41,7 +41,7 @@ test.describe('an author', () => { test('sees only the screens its role reaches', async ({ page }) => { await page.goto('/admin/') - const menu = page.getByRole('navigation', { name: 'Navigation' }) + const menu = page.getByRole('region', { name: 'Navigation' }) await expect(menu.getByRole('link', { name: 'Media' })).toBeVisible() await expect(menu.getByRole('link', { name: 'Language' })).toBeVisible() @@ -53,7 +53,7 @@ test.describe('an author', () => { test('is returned to the default list from a pasted admin link', async ({ page }) => { await page.goto('/admin/users') - await expect(page.getByRole('heading', { name: 'Posts', level: 1 })).toBeVisible() + await expect(page.getByRole('heading', { name: 'Posts', level: 2 })).toBeVisible() await expect(page).toHaveURL(/\/admin\/content\/post$/) await expect(page.getByRole('heading', { name: 'Users' })).toHaveCount(0) }) @@ -95,7 +95,7 @@ test.describe('an editor', () => { test('sees the content screens and not the keys to the site', async ({ page }) => { await page.goto('/admin/') - const menu = page.getByRole('navigation', { name: 'Navigation' }) + const menu = page.getByRole('region', { name: 'Navigation' }) await expect(menu.getByRole('link', { name: 'Media' })).toBeVisible() await expect(menu.getByRole('link', { name: 'Users' })).toHaveCount(0) @@ -128,7 +128,7 @@ test.describe('a member', () => { await expect(page.getByText('Sorry, you are not allowed to access this page.')).toBeVisible() await expect(page.getByRole('link', { name: 'Visit Site' })).toHaveAttribute('href', '/') - await expect(page.getByRole('navigation')).toHaveCount(0) + await expect(page.getByRole('region', { name: 'Navigation' })).toHaveCount(0) }) test('is refused the content list by the API for the admin capability', async ({ request }) => { diff --git a/test/e2e/tests/shell.spec.ts b/test/e2e/tests/shell.spec.ts index 490c2821..0ea90669 100644 --- a/test/e2e/tests/shell.spec.ts +++ b/test/e2e/tests/shell.spec.ts @@ -4,22 +4,23 @@ import { expect, test } from '@playwright/test' const PHONE = { width: 390, height: 844 } -test('pads the canvas and keeps the rail beside it on a desktop', async ({ page }) => { +test('pads the canvas and keeps the sidebar beside it on a desktop', async ({ page }) => { await page.goto('/admin/') - await expect(page.getByRole('navigation', { name: 'Navigation' })).toBeVisible() - await expect(page.getByRole('button', { name: 'Open navigation' })).toBeHidden() + await expect(page.getByRole('region', { name: 'Navigation' })).toBeVisible() + await expect(page.getByRole('button', { name: 'Open navigation panel' })).toBeHidden() const padding = await page .locator('.godmin-layout__canvas') .evaluate((canvas) => getComputedStyle(canvas).padding) expect(padding).toBe('16px 24px') }) -test('reads every rail row clearly against the chrome', async ({ page }) => { +test('reads every sidebar row clearly against the chrome', async ({ page }) => { await page.goto('/admin/content/post') - await expect(page.getByRole('navigation', { name: 'Navigation' }).getByRole('link', { name: 'Users' })).toBeVisible() + const sidebar = page.getByRole('region', { name: 'Navigation' }) + await expect(sidebar.getByRole('link', { name: 'Users' })).toBeVisible() - const rows = await page.locator('.gophenberg-menu__item').evaluateAll((found) => + const rows = await sidebar.getByRole('listitem').getByRole('link').evaluateAll((found) => found.map((row) => { const luminance = (colour: string) => { const [r = 0, g = 0, b = 0] = (colour.match(/\d+/g) ?? []).map((raw) => { @@ -46,7 +47,7 @@ test('reads every rail row clearly against the chrome', async ({ page }) => { test('spans the posts listing across the canvas', async ({ page }) => { await page.goto('/admin/content/post') - await expect(page.getByRole('heading', { level: 1, name: 'Posts' })).toBeVisible() + await expect(page.getByRole('heading', { level: 2, name: 'Posts' })).toBeVisible() await expect(page.locator('.dataviews-view-table')).toBeVisible() const fit = await page.evaluate(() => { @@ -69,13 +70,13 @@ test('spans the posts listing across the canvas', async ({ page }) => { expect(fit.filled).toBeGreaterThan(0.99) }) -test('folds the rail into a drawer on a phone', async ({ page }) => { +test('folds the sidebar into a drawer on a phone', async ({ page }) => { await page.setViewportSize(PHONE) await page.goto('/admin/') - await expect(page.locator('.godmin-layout__rail')).toHaveCount(0) - await page.getByRole('button', { name: 'Open navigation' }).click() + await expect(page.locator('.godmin-layout__sidebar')).toHaveCount(0) + await page.getByRole('button', { name: 'Open navigation panel' }).click() const drawer = page.getByRole('dialog') await expect(drawer.getByRole('link', { name: 'Posts' })).toBeVisible() }) @@ -84,7 +85,7 @@ test('marks the current row apart from the drawer surface on a phone', async ({ await page.setViewportSize(PHONE) await page.goto('/admin/content/post') - await page.getByRole('button', { name: 'Open navigation' }).click() + await page.getByRole('button', { name: 'Open navigation panel' }).click() const current = page.getByRole('dialog').getByRole('link', { name: 'Posts', exact: true }) await expect(current).toHaveAttribute('data-status', 'active') @@ -101,6 +102,31 @@ test('marks the current row apart from the drawer surface on a phone', async ({ expect(fills.row).not.toBe(fills.drawer) }) +test.describe('on a phone with a touch screen', () => { + test.use({ viewport: PHONE, isMobile: true, hasTouch: true }) + + test('closes the drawer on a tap beside it and on Escape', async ({ page }) => { + await page.goto('/admin/content/post') + await expect(page.getByRole('heading', { level: 2, name: 'Posts' })).toBeVisible() + const address = page.url() + const menu = page.getByRole('button', { name: 'Open navigation panel' }) + const drawer = page.getByRole('dialog') + + await menu.tap() + await expect(drawer).toBeVisible() + await page.touchscreen.tap(PHONE.width - 16, PHONE.height / 2) + + await expect(drawer).toBeHidden() + await expect(page).toHaveURL(address) + + await menu.tap() + await expect(drawer).toBeVisible() + await page.keyboard.press('Escape') + + await expect(drawer).toBeHidden() + }) +}) + test('names the site beside the menu button on a phone', async ({ page }) => { await page.setViewportSize(PHONE) diff --git a/test/e2e/tests/smoke.spec.ts b/test/e2e/tests/smoke.spec.ts index f720a6e4..53cbf9ac 100644 --- a/test/e2e/tests/smoke.spec.ts +++ b/test/e2e/tests/smoke.spec.ts @@ -7,10 +7,11 @@ import { credentials } from '../env' test('serves the admin shell to a stored session', async ({ page }) => { await page.goto('/admin/') - await expect(page.getByRole('link', { name: 'Gophenberg', exact: true })).toBeVisible() - await expect(page.getByRole('heading', { name: 'Posts', level: 1 })).toBeVisible() + await expect(page.getByRole('heading', { name: 'Gophenberg', level: 1, exact: true })).toBeVisible() + await expect(page.getByRole('heading', { name: 'Posts', level: 2 })).toBeVisible() + await expect(page.getByRole('heading', { level: 1 })).toHaveCount(1) await expect(page).toHaveURL(/\/admin\/content\/post$/) - await expect(page.locator('.gophenberg-rail__account').getByText(credentials.name)).toBeVisible() + await expect(page.locator('.godmin-sidebar__footer').getByText(credentials.name)).toBeVisible() await expect(page.getByRole('link', { name: 'Users' })).toBeVisible() }) diff --git a/test/e2e/tests/themes.spec.ts b/test/e2e/tests/themes.spec.ts index cee50d21..980d7691 100644 --- a/test/e2e/tests/themes.spec.ts +++ b/test/e2e/tests/themes.spec.ts @@ -18,7 +18,7 @@ test.beforeEach(async ({ request }) => { test('installs a theme, serves the site through it, and rolls back', async ({ page }) => { await page.goto('/admin/themes') - await expect(page.getByRole('heading', { level: 1, name: 'Themes' })).toBeVisible() + await expect(page.getByRole('heading', { level: 2, name: 'Themes' })).toBeVisible() await expect( page.getByText(`${starterTheme.name} ${starterTheme.version} is serving the public site.`), ).toBeVisible() diff --git a/test/e2e/tests/users-role.spec.ts b/test/e2e/tests/users-role.spec.ts index 3713ef3d..05815702 100644 --- a/test/e2e/tests/users-role.spec.ts +++ b/test/e2e/tests/users-role.spec.ts @@ -95,7 +95,7 @@ test('explains a role write refused after the reader lost the right to give role await page.getByLabel('Email').fill(lowered.email) await page.getByLabel('Password').fill(credentials.password) await page.getByRole('button', { name: 'Log in' }).click() - await expect(page.getByRole('heading', { name: 'Posts', level: 1 })).toBeVisible() + await expect(page.getByRole('heading', { name: 'Posts', level: 2 })).toBeVisible() await page.goto('/admin/users') await pickRole(page, kept, 'Editor') From ea5911c5210027a2ca87889e2ef681b696491290 Mon Sep 17 00:00:00 2001 From: SirLouen Date: Fri, 23 Oct 2026 15:18:04 +0200 Subject: [PATCH 7/9] chore(i18n): add the section labels and drop the old menu words --- frontend/src/languages/es-ES.json | 2 +- frontend/src/languages/fr-FR.json | 2 +- internal/i18n/catalogs/es-ES.json | 2 +- internal/i18n/catalogs/fr-FR.json | 2 +- languages/es-ES.po | 28 ++++++++++++++++++++------ languages/fr-FR.po | 33 +++++++++++++++++++++++-------- languages/gophenberg.pot | 26 ++++++++++++++++++------ 7 files changed, 71 insertions(+), 24 deletions(-) diff --git a/frontend/src/languages/es-ES.json b/frontend/src/languages/es-ES.json index 76e8c9ef..d26fa461 100644 --- a/frontend/src/languages/es-ES.json +++ b/frontend/src/languages/es-ES.json @@ -1 +1 @@ -{"":{"lang":"es","plural-forms":"nplurals=3; plural=((n == 1) ? 0 : ((n != 0 && n % 1000000 == 0) ? 1 : 2));"}," and ":[" y "]," or ":[" o "],"\"%s\" activated.":["Se ha activado «%s»."],"\"%s\" deactivated.":["Se ha desactivado «%s»."],"\"%s\" has been restored.":["«%s» se ha restaurado."],"\"%s\" moved to the trash.":["«%s» trasladado a la papelera."],"\"%s\" permanently deleted.":["«%s» borrado permanentemente."],"\"%s\" successfully created.":["«%s» creado correctamente."],"\"%s\" uploaded.":["«%s» subido."],"%(field)s address":["Dirección de %(field)s"],"%(field)s cannot move inside itself. Pick a container that is not one of its own.":["%(field)s no puede moverse dentro de sí mismo. Elige un contenedor que no sea uno de los suyos."],"%(field)s declared.":["%(field)s declarado."],"%(field)s deleted.":["%(field)s borrado."],"%(field)s does not match the format its field asks for. Check it and save again.":["%(field)s no tiene el formato que su campo requiere. Revísalo y guarda de nuevo."],"%(field)s goes no higher than %(limit)s. Lower the value and save again.":["%(field)s no pasa de %(limit)s. Baja el valor y guarda de nuevo."],"%(field)s goes no lower than %(limit)s. Raise the value and save again.":["%(field)s no baja de %(limit)s. Sube el valor y guarda de nuevo."],"%(field)s holds no value of its own, so it cannot be required. Make it optional.":["%(field)s no guarda ningún valor propio, así que no puede ser obligatorio. Hazlo opcional."],"%(field)s is optional again.":["%(field)s vuelve a ser opcional."],"%(field)s is required now.":["%(field)s ahora es obligatorio."],"%(field)s moved.":["%(field)s movido."],"%(field)s names the same one twice. Remove the repeat and save again.":["%(field)s nombra el mismo dos veces. Quita la repetición y guarda de nuevo."],"%(field)s needs at least %(limit)s files. Add one and save again.":["%(field)s necesita al menos %(limit)s archivos. Añade uno y guarda de nuevo."],"%(field)s needs at least %(limit)s rows. Add one and save again.":["%(field)s necesita al menos %(limit)s filas. Añade una y guarda de nuevo."],"%(field)s only takes one of its listed choices. Pick one and save again.":["%(field)s solo admite una de las opciones de su lista. Elige una y guarda de nuevo."],"%(field)s reads a relation field that is not there. Pick a group and a relation field it holds.":["%(field)s lee un campo de relación que no existe. Elige un grupo y un campo de relación que contenga."],"%(field)s reads a relation pointing at %(type)s, so it would list nothing here. Pick a relation pointing at the items this group is shown on.":["%(field)s lee una relación que apunta a %(type)s, así que aquí no mostraría nada. Elige una relación que apunte a los elementos donde se muestra este grupo."],"%(field)s renamed.":["%(field)s renombrado."],"%(field)s settled.":["%(field)s ajustado."],"%(field)s shows by its rules now.":["%(field)s ahora se muestra según sus reglas."],"%(field)s stands in the list.":["%(field)s aparece en la lista."],"%(field)s stays out of the list.":["%(field)s se queda fuera de la lista."],"%(field)s takes at most %(limit)s files. Remove one and save again.":["%(field)s acepta como mucho %(limit)s archivos. Quita uno y guarda de nuevo."],"%(field)s takes at most %(limit)s letters. Shorten what you wrote and save again.":["%(field)s acepta como mucho %(limit)s letras. Acorta lo que has escrito y guarda de nuevo."],"%(field)s takes at most %(limit)s rows. Remove one and save again.":["%(field)s admite como mucho %(limit)s filas. Quita una y guarda de nuevo."],"%(field)s title":["Título de %(field)s"],"%(file)s is larger than one upload may be.":["%(file)s es más grande de lo que una subida permite."],"%(file)s is not a file this block accepts.":["%(file)s no es un archivo que este bloque acepte."],"%(file)s: %(reason)s":["%(file)s: %(reason)s"],"%(group)s created.":["%(group)s creado."],"%(group)s now appears where you said.":["%(group)s ya aparece donde has dicho."],"%(group)s removed.":["%(group)s eliminado."],"%(group)s updated.":["%(group)s actualizado."],"%(key)s is served by %(winner)s, so %(loser)s does not show it on %(where)s.":["%(key)s lo sirve %(winner)s, así que %(loser)s no lo muestra en %(where)s."],"%(name)s %(version)s is serving the public site.":["%(name)s %(version)s está publicado en la web."],"%(name)s belongs to the site now.":["%(name)s ya pertenece al sitio."],"%(name)s came from the %(plugin)s plugin, which no longer declares it.":["%(name)s vino del plugin %(plugin)s, que ya no lo declara."],"%(name)s cannot be used as a theme name. Name the zip file after the theme, with no dot at the start and no slashes in it.":["%(name)s no se puede usar como nombre de tema. Nombra el archivo zip como el tema, sin punto al principio y sin barras."],"%(name)s moves to /%(word)s. Every address of both types changes.":["El tipo %(name)s pasa a /%(word)s. Cambian todas las direcciones de ambos tipos."],"%(name)s would move to /%(word)s, which Gophenberg keeps for itself. Change its plural name and try again.":["El tipo %(name)s pasaría a /%(word)s, que Gophenberg reserva para sí mismo. Cambia su nombre en plural e inténtalo de nuevo."],"%(source)s is %(value)s":["%(source)s es %(value)s"],"%(theme)s failed to start, so the built-in renderer is serving.":["%(theme)s no pudo arrancar, así que el renderizador ha tomado el relevo."],"%(theme)s is now serving the public site.":["%(theme)s ya sirve el sitio público."],"%(theme)s is serving the public site.":["%(theme)s sirve el sitio público."],"%(theme)s is still starting, so the built-in renderer is serving.":["%(theme)s todavía está arrancando, así que el renderizador ha tomado el relevo."],"%(theme)s was installed.":["%(theme)s se ha instalado."],"%(theme)s will not load, so the built-in renderer is serving.":["%(theme)s no se carga, así que el renderizador ha tomado el relevo."],"%(type)s answers on a new address, and stored links move with it.":["%(type)s responde en una dirección nueva, y los enlaces guardados se mueven con ella."],"%(type)s becomes the type the site opens on, and the old one takes an address.":["%(type)s pasa a ser el tipo con el que abre el sitio, y el anterior toma una dirección."],"%(type)s keeps nesting while %(items)s of its items sit inside another. Move those to the top level first, the ones in the trash included.":["%(type)s sigue anidando mientras %(items)s de sus elementos están dentro de otro. Muévelos primero al nivel superior, incluidos los de la papelera."],"%(type)s keeps nesting, because some of its items sit inside another.":["%(type)s sigue anidando, porque algunos de sus elementos están dentro de otro."],"%(type)s will answer at the root.":["El tipo %(type)s responderá en la raíz."],"%s content type activated.":["Se ha activado %s tipo de contenido.","Se han activado %s de tipos de contenido.","Se han activado %s tipos de contenido."],"%s content type could not be activated.":["No se ha podido activar %s tipo de contenido.","No se han podido activar %s de tipos de contenido.","No se han podido activar %s tipos de contenido."],"%s content type could not be deactivated.":["No se ha podido desactivar %s tipo de contenido.","No se han podido desactivar %s de tipos de contenido.","No se han podido desactivar %s tipos de contenido."],"%s content type could not be permanently deleted.":["No se ha podido borrar permanentemente %s tipo de contenido.","No se han podido borrar permanentemente %s de tipos de contenido.","No se han podido borrar permanentemente %s tipos de contenido."],"%s content type deactivated.":["Se ha desactivado %s tipo de contenido.","Se han desactivado %s de tipos de contenido.","Se han desactivado %s tipos de contenido."],"%s content type permanently deleted.":["Se ha borrado permanentemente %s tipo de contenido.","Se han borrado permanentemente %s de tipos de contenido.","Se han borrado permanentemente %s tipos de contenido."],"%s item could not be moved to the trash.":["No se ha podido mover %s elemento a la papelera.","No se han podido mover %s de elementos a la papelera.","No se han podido mover %s elementos a la papelera."],"%s item could not be permanently deleted.":["No se ha podido borrar permanentemente %s elemento.","No se han podido borrar permanentemente %s de elementos.","No se han podido borrar permanentemente %s elementos."],"%s item could not be restored.":["No se ha podido restaurar %s elemento.","No se han podido restaurar %s de elementos.","No se han podido restaurar %s elementos."],"%s item moved to the trash.":["%s elemento movido a la papelera.","%s de elementos movidos a la papelera.","%s elementos movidos a la papelera."],"%s item permanently deleted.":["%s elemento borrado permanentemente.","%s de elementos borrados permanentemente.","%s elementos borrados permanentemente."],"%s item stays in the trash.":["%s elemento sigue en la papelera.","%s de elementos siguen en la papelera.","%s elementos siguen en la papelera."],"%s page has been restored.":["Se ha restaurado %s página.","Se han restaurado %s de páginas.","Se han restaurado %s páginas."],"%s post has been restored.":["Se ha restaurado %s entrada.","Se han restaurado %s de entradas.","Se han restaurado %s entradas."],"(no title)":["(sin título)"],"A %(kind)s field does not take a setting called %(setting)s. Remove it and try again.":["Un campo %(kind)s no acepta un ajuste llamado %(setting)s. Quítalo y prueba de nuevo."],"A Linked from field stands on its own, not inside a section or a repeater. Declare %(field)s beside the container.":["Un campo Enlazado desde va por su cuenta, no dentro de una sección ni de un repetidor. Declara %(field)s junto al contenedor."],"A content type needs a singular and a plural name, like Guide and Guides. Fill both in and try again.":["Un tipo de contenido necesita un nombre en singular y otro en plural, como Guía y Guías. Rellena ambos e inténtalo de nuevo."],"A descriptive summary of the content type.":["Un resumen descriptivo del tipo de contenido."],"A field group key has to start with a lowercase letter and then hold only lowercase letters, numbers and hyphens. Rename the group in the file so its key comes out in that shape.":["La clave de un grupo de campos tiene que empezar por una letra minúscula y después llevar solo letras minúsculas, números y guiones. Cambia el nombre del grupo en el archivo para que su clave salga con esa forma."],"A field key has to start with a lowercase letter and then hold only lowercase letters, numbers and hyphens. Rename the field so its key comes out in that shape.":["La clave de un campo tiene que empezar por una letra minúscula y contener solo letras minúsculas, números y guiones. Renombra el campo para que su clave tenga esa forma."],"A field needs a name. Type one and try again.":["El campo necesita un nombre. Escribe uno e inténtalo de nuevo."],"A field with that name already exists on the items this group reaches. Pick another name.":["Ya existe un campo con ese nombre en los elementos que este grupo alcanza. Elige otro nombre."],"A flexible content field holds layouts, and %(field)s is not one. Add a layout first, then declare the field inside that layout.":["Un campo de contenido flexible contiene diseños, y %(field)s no lo es. Añade primero un diseño y después declara el campo dentro de ese diseño."],"A higher quality stores larger files, and it applies to pictures uploaded from now on.":["Una calidad más alta almacena archivos más grandes, y se aplica a las imágenes que subas a partir de ahora."],"A layout stands inside a flexible content field only. Put %(field)s inside one of those instead.":["Un diseño solo va dentro de un campo de contenido flexible. Pon %(field)s dentro de uno de ellos."],"A layout stands inside a flexible content field, never on its own. Declare a flexible content field first, then add %(field)s inside it.":["Un diseño va dentro de un campo de contenido flexible, nunca por su cuenta. Declara primero un campo de contenido flexible y después añade %(field)s dentro."],"A listing carries between 1 and %(max)s items, so %(value)s is not a size Gophenberg takes. Pick a number inside that range.":["Un listado muestra entre 1 y %(max)s elementos, así que %(value)s no es un tamaño que Gophenberg acepte. Elige un número dentro de ese rango."],"A relation field has to say which content type it points at. Pick that type and try again.":["Un campo de relación tiene que indicar a qué tipo de contenido apunta. Elige ese tipo e inténtalo de nuevo."],"A reload shows the admin in the language you chose.":["Al recargar verás el panel de administración en el idioma que has elegido."],"A route word has to start with a lowercase letter and then hold only lowercase letters, numbers and hyphens. Change it and try again.":["La palabra de ruta de la URL tiene que empezar por una letra minúscula y contener solo letras minúsculas, números y guiones. Cámbiala e inténtalo de nuevo."],"A row of %(field)s has to name the layout it takes. Pick a layout for the row, or remove the row.":["Una fila de %(field)s tiene que nombrar el diseño que toma. Elige un diseño para la fila, o quita la fila."],"A row of %(field)s takes one layout and no more. Reload the page and build the row again.":["Una fila de %(field)s toma un solo diseño. Recarga la página y crea la fila otra vez."],"A rule matching any %(source)s cannot be turned into an exclusion. Leave it as is, or name the ones to leave out instead.":["Una regla que vale para cualquier %(source)s no se puede convertir en exclusión. Déjala como está, o nombra los que quieras dejar fuera."],"A theme naming its own page size uses that instead.":["Un tema que indica su propio tamaño de página usa ese en su lugar."],"A type key has to start with a lowercase letter and then hold only lowercase letters, numbers and hyphens. Change the key and try again.":["La clave de un tipo tiene que empezar por una letra minúscula y contener solo letras minúsculas, números y guiones. Cambia la clave e inténtalo de nuevo."],"Actions":["Acciones"],"Activate":["Activar"],"Activate %(theme)s":["Activar %(theme)s"],"Active":["Activo"],"Add":["Añadir"],"Add %(layout)s":["Añadir %(layout)s"],"Add %(name)s":["Añadir %(name)s"],"Add %(type)s":["Añadir %(type)s"],"Add Category":["Añadir categoría"],"Add Content Type":["Añadir tipo de contenido"],"Add Field Group":["Añadir grupo de campos"],"Add Media File":["Añadir medios"],"Add Page":["Añadir página"],"Add Post":["Añadir entrada"],"Add User":["Añadir usuario"],"Add block":["Añadir bloque"],"Add choice":["Añadir opción"],"Add condition":["Añadir condición"],"Add field":["Añadir campo"],"Add field to %(field)s":["Añadir campo a %(field)s"],"Add layout":["Añadir diseño"],"Add layout to %(field)s":["Añadir diseño a %(field)s"],"Add one with %(button)s.":["Añade un elemento con %(button)s."],"Add row":["Añadir fila"],"Add rule set":["Añadir conjunto de reglas"],"Add title":["Añadir título"],"Add to %(field)s":["Añadir a %(field)s"],"Address":["Dirección"],"Address updated.":["Dirección actualizada."],"Adopt":["Adoptar"],"Allow custom":["Permitir valores propios"],"Allow empty":["Permitir vacío"],"Alt text":["Texto alternativo"],"An item cannot point at itself. Pick a different item for %(field)s.":["Un elemento no puede apuntarse a sí mismo. Elige otro elemento para %(field)s."],"An item cannot sit inside itself, or inside one of the items nested under it. Pick a parent outside this branch.":["Un elemento no puede estar dentro de sí mismo, ni dentro de otro anidado bajo él. Elige un nivel superior fuera de esta rama."],"Another account wrote this, and only its author, an editor or an administrator may change it. You can still read it.":["Otra cuenta escribió esto, y solo su autor, un editor o un administrador pueden cambiarlo. Todavía puedes leerlo."],"Another account wrote this, so you are reading it rather than editing it.":["Otra cuenta escribió esto, así que lo estás leyendo, no editando."],"Another content type already answers under this route word. Pick a different word.":["Ya hay otro tipo de contenido que responde con esta palabra de ruta de URL. Elige una palabra distinta."],"Another content type already lives at the root of your site, and only one can. Give this type a route word, or hand the root over with Make default.":["Ya hay otro tipo de contenido en la raíz de tu sitio, y solo puede haber uno. Dale a este tipo de contenido una palabra de ruta de URL, o cede la raíz con Establecer como predeterminado."],"Another content type already uses this key. Give this type a different name.":["Ya hay otro tipo de contenido que usa esta clave. Dale a este tipo un nombre distinto."],"Another item of this content type already uses that address. Pick a different slug and save again.":["Ya hay otro elemento de este tipo de contenido que usa esa dirección. Elige un slug distinto y guarda de nuevo."],"Another update is currently in progress.":["En este momento hay otra actualización en marcha."],"Appears on":["Aparece en"],"Apply":["Aplicar"],"April":["abril"],"Are you sure you want to move \"%s\" to the trash?":["¿Seguro que quieres mover «%s» a la papelera?"],"Audio":["Audio"],"August":["agosto"],"Author":["Autor"],"Back to %(type)s":["Volver a %(type)s"],"Back to the latest posts":["Volver a las últimas entradas"],"Block":["Bloque"],"Broken":["Roto"],"Bundles of fields, shown where their rules place them.":["Conjuntos de campos, mostrados donde sus reglas los colocan."],"Button group":["Grupo de botones"],"Cancel":["Cancelar"],"Caption":["Leyenda"],"Change %(name)s":["Cambiar %(name)s"],"Change address":["Cambiar la dirección"],"Change address…":["Cambiar la dirección…"],"Change role":["Cambiar el rol"],"Change the role of %(name)s":["Cambiar el rol de %(name)s"],"Checkbox group":["Grupo de casillas"],"Choices":["Opciones"],"Choose %(field)s":["Elegir %(field)s"],"Choose how the site serves its content.":["Elige cómo el sitio sirve su contenido."],"Choose the language the admin reads in.":["Elige el idioma en el que se lee el panel de administración."],"Choose the role of %(name)s.":["Elige el rol de %(name)s."],"Choose the version to update to.":["Elige la versión a la que actualizar."],"Clear %(field)s":["Vaciar %(field)s"],"Close":["Cerrar"],"Close Settings":["Cerrar ajustes"],"Closed":["Cerrado"],"Condition":["Condición"],"Content":["Contenido"],"Content Types":["Tipos de contenido"],"Content nests at most %(max)s levels deep, and this item would sit deeper. Pick a parent closer to the top.":["El contenido se anida como mucho %(max)s niveles, y este elemento quedaría más abajo. Elige un nivel superior más cercano al inicio."],"Content type":["Tipo de contenido"],"Content type updated.":["Tipo de contenido actualizado."],"Could not delete that item.":["No se ha podido borrar ese elemento.","No se han podido borrar todos los elementos.","No se han podido borrar todos los elementos."],"Could not load that post.":["No se ha podido cargar esa entrada."],"Could not save that post.":["No se ha podido guardar esa entrada."],"Create":["Crear"],"Create a field group":["Crear un grupo de campos"],"Create user":["Crear usuario"],"Created":["Fecha de creación"],"Date added":["Fecha de subida"],"Deactivate":["Desactivar"],"Deactivate %(theme)s":["Desactivar %(theme)s"],"December":["diciembre"],"Default":["Por defecto"],"Default content type updated.":["Tipo de contenido predeterminado actualizado."],"Definitions file":["Archivo de definiciones"],"Delete":["Borrar"],"Delete \"%(title)s\" for good? This cannot be undone.":["¿Borrar permanentemente «%(title)s»? Esto no se puede deshacer."],"Delete %(field)s":["Borrar %(field)s"],"Delete %(group)s":["Eliminar %(group)s"],"Delete %(title)s for good? This cannot be undone.":["¿Borrar %(title)s para siempre? Esto no se puede deshacer."],"Delete %s content type for good? This cannot be undone.":["¿Borrar permanentemente %s tipo de contenido? Esto no se puede deshacer.","¿Borrar permanentemente %s de tipos de contenido? Esto no se puede deshacer.","¿Borrar permanentemente %s tipos de contenido? Esto no se puede deshacer."],"Delete %s item for good? This cannot be undone.":["¿Borrar permanentemente %s elemento? Esto no se puede deshacer.","¿Borrar permanentemente %s de elementos? Esto no se puede deshacer.","¿Borrar permanentemente %s elementos? Esto no se puede deshacer."],"Delete Permanently":["Borrar permanentemente"],"Delete the field":["Borrar el campo"],"Delete the group":["Eliminar el grupo"],"Delete this %(count)s item for good? This cannot be undone.":["¿Borrar este %(count)s elemento para siempre? Esto no se puede deshacer.","¿Borrar estos %(count)s elementos para siempre? Esto no se puede deshacer.","¿Borrar estos %(count)s elementos para siempre? Esto no se puede deshacer."],"Delete…":["Borrar…"],"Describe":["Describir"],"Describe…":["Describir…"],"Description":["Descripción"],"Description updated.":["Descripción actualizada."],"Desktop":["Escritorio"],"Destination":["Destino"],"Dimensions":["Dimensiones"],"Disable":["Desactivar"],"Disable %(name)s":["Desactivar a %(name)s"],"Disabled":["Desactivado"],"Dismiss":["Descartar"],"Document":["Documento"],"Done. The site now holds what the file describes.":["Hecho. El sitio ya tiene lo que describe el archivo."],"Draft saved.":["Borrador guardado."],"Drop files to upload":["Arrastra los archivos para subirlos"],"Email":["Correo electrónico"],"Empty Trash":["Vaciar papelera"],"Empty trash":["Vaciar papelera"],"Enable":["Activar"],"Enable %(name)s":["Activar a %(name)s"],"Every address of this type moves. Links kept elsewhere to the old addresses stop working.":["Cambian todas las direcciones de este tipo. Los enlaces guardados en otro sitio hacia las direcciones antiguas dejan de funcionar."],"Every content type":["Todos los tipos de contenido"],"Every field group needs a title. Give it a name and save again.":["Todo grupo de campos necesita un título. Ponle un nombre y guarda otra vez."],"Every item needs an author who exists. Pick one from the list and save again.":["Cada elemento necesita un autor que exista. Elige uno de la lista y guarda de nuevo."],"Every kind of content this site holds.":["Todos los tipos de contenido que hay en este sitio."],"Every value stored under this field goes with it, in every item the group reaches and in the revisions behind them.":["Todos los valores guardados en este campo se van con él, en cada elemento que el grupo alcanza y en las revisiones que hay detrás."],"Excerpt":["Extracto"],"Export definitions":["Exportar definiciones"],"February":["febrero"],"Fewest files":["Mínimo de archivos"],"Fewest rows":["Mínimo de filas"],"Field":["Campo"],"Field Groups":["Grupos de campos"],"Field group":["Grupo de campos"],"Fields":["Campos"],"Fields of %(group)s":["Campos de %(group)s"],"File name":["Nombre del archivo"],"File size":["Tamaño del archivo"],"File type":["Tipo de archivo"],"Files":["Archivos"],"Filter by status":["Filtrar por estado"],"Follow the browser":["Sigue al navegador"],"From %(plugin)s":["De %(plugin)s"],"Full Size":["Tamaño completo"],"Gophenberg cannot start this update: %(reason)s":["Gophenberg no puede empezar esta actualización: %(reason)s"],"Gophenberg checked for updates moments ago. Try again later.":["Gophenberg ha buscado actualizaciones hace un momento. Inténtalo de nuevo más tarde."],"Gophenberg could not read what your browser sent. Reload the page and try again, and tell whoever looks after your site if it keeps happening.":["Gophenberg no ha podido leer lo que ha enviado tu navegador. Recarga la página e inténtalo de nuevo, y avisa a quien gestiona tu sitio si sigue pasando."],"Gophenberg could not read which item you picked as parent. Reload the page and pick it again.":["Gophenberg no ha podido leer qué elemento has elegido como elemento superior. Recarga la página y vuelve a elegirlo."],"Gophenberg does not accept %(extension)s files. Upload a picture, a video, an audio file, a PDF or a zip instead.":["Gophenberg no acepta archivos %(extension)s. Sube una imagen, un vídeo, un audio, un PDF o un zip."],"Gophenberg does not answer in %(value)s. Pick one of the languages on the list.":["Gophenberg no responde en %(value)s. Elige uno de los idiomas de la lista."],"Gophenberg has no autosave of yours for this item. Open the item to see the version that is stored.":["Gophenberg no tiene ningún guardado automático tuyo de este elemento. Ábrelo para ver la versión guardada."],"Gophenberg holds no kind of definition called %(subject)s, so nothing was taken over. Reload the page so the admin and the server agree again.":["Gophenberg no tiene ninguna clase de definición llamada %(subject)s, así que no se ha adoptado nada. Recarga la página para que el admin y el servidor vuelvan a coincidir."],"Gophenberg keeps /%(path)s for itself or for another content type, so your content cannot answer there. Give the item a different slug.":["Gophenberg reserva la dirección /%(path)s para sí mismo o para otro tipo de contenido, así que tu contenido no puede usarla. Dale al elemento otro slug."],"Gophenberg keeps this word for itself, so no content type can answer under it. Pick a different route word.":["Gophenberg reserva esta palabra para sí mismo, así que ningún tipo de contenido puede usarla. Elige otra palabra de ruta de URL."],"Group":["Grupo"],"Highest":["Máximo"],"Holds":["Contiene"],"Images":["Imágenes"],"Import definitions":["Importar definiciones"],"In list":["En la lista"],"Inactive":["Inactivo"],"Installed":["Instalado"],"Instructions":["Instrucciones"],"It moves here from another group and keeps its stored values.":["Se mueve aquí desde otro grupo y conserva sus valores guardados."],"It moves to another group and keeps its stored values.":["Se mueve a otro grupo y conserva sus valores guardados."],"It moves to another group, so its stored values do not follow.":["Se mueve a otro grupo, así que sus valores guardados no le siguen."],"It reads a relation inside a container, and only an import can point it elsewhere.":["Lee una relación dentro de un contenedor, y solo una importación puede apuntarlo a otro sitio."],"It starts on %(type)s, and the rules may be edited afterwards.":["Empieza en %(type)s, y las reglas se pueden editar después."],"Items could not be loaded.":["No se han podido cargar los elementos."],"Its items sit inside one another, so it keeps nesting.":["Sus elementos están unos dentro de otros, así que sigue anidando."],"Its kind changed, so its stored values go with it.":["Su tipo ha cambiado, así que sus valores guardados se van con él."],"January":["enero"],"July":["julio"],"June":["junio"],"Keep %(field)s out of the list":["Dejar %(field)s fuera de la lista"],"Keep it":["Conservarlo"],"Keep it here":["Dejarlo aquí"],"Key":["Clave"],"Label":["Etiqueta"],"Language":["Idioma"],"Large":["Grande"],"Let items nest":["Permitir anidar"],"Linked from":["Enlazado desde"],"List view":["Vista de lista"],"Loading field groups.":["Cargando los grupos de campos."],"Loading the post.":["Cargando la entrada."],"Loading the screen.":["Cargando la pantalla."],"Loading themes.":["Cargando los temas."],"Loading users.":["Cargando los usuarios."],"Loading…":["Cargando…"],"Longest":["Largo máximo"],"Lowest":["Mínimo"],"Make %(field)s optional":["Hacer %(field)s opcional"],"Make default":["Establecer como predeterminado"],"Make default…":["Establecer como predeterminado…"],"Make optional":["Hacer opcional"],"Manage the categories on this site.":["Gestiona las categorías de este sitio."],"Manage the images and files this site holds.":["Gestiona las imágenes y los archivos que hay en este sitio."],"Manage the items of this content type.":["Gestiona los elementos de este tipo de contenido."],"Manage the pages on this site.":["Gestiona las páginas de este sitio."],"Manage the posts on this site.":["Gestiona las entradas de este sitio."],"Many targets":["Varios destinos"],"Many values":["Varios valores"],"March":["marzo"],"May":["mayo"],"Media %(id)s":["Medio %(id)s"],"Media Library":["Biblioteca de medios"],"Medium":["Mediano"],"Mobile":["Móvil"],"Modified: %s":["Modificado: %s"],"Most files":["Máximo de archivos"],"Most rows":["Máximo de filas"],"Move":["Mover"],"Move \"%(title)s\" to the trash?":["¿Mover «%(title)s» a la papelera?"],"Move %(field)s down":["Bajar %(field)s"],"Move %(field)s elsewhere":["Mover %(field)s a otro sitio"],"Move %(field)s up":["Subir %(field)s"],"Move %(group)s down":["Bajar %(group)s"],"Move %(group)s up":["Subir %(group)s"],"Move %(name)s down":["Bajar %(name)s"],"Move %(name)s up":["Subir %(name)s"],"Move %s item to the trash?":["¿Mover %s elemento a la papelera?","¿Mover %s de elementos a la papelera?","¿Mover %s elementos a la papelera?"],"Move every address":["Mover todas las direcciones"],"Move row down":["Bajar la fila"],"Move row up":["Subir la fila"],"Move the field":["Mover el campo"],"Move to trash":["Mover a la papelera"],"Name":["Nombre"],"Name updated.":["Nombre actualizado."],"Navigation":["Navegación"],"Nests":["Anida"],"Newer posts":["Entradas más recientes"],"No":["No"],"No content types found.":["No se han encontrado tipos de contenido."],"No description":["Sin descripción"],"No file arrived with this upload. Choose a file and try again.":["No ha llegado ningún archivo con esta subida. Elige un archivo e inténtalo de nuevo."],"No items found.":["No se han encontrado elementos."],"No items yet.":["Todavía no hay elementos."],"No media chosen":["Ningún medio elegido"],"No media has been uploaded yet.":["Todavía no se ha subido ningún medio."],"No media items found.":["No se han encontrado archivos de medios."],"No media items yet.":["Todavía no hay archivos de medios."],"No page lives at this address.":["No existe ninguna página en esta dirección."],"No parent":["Sin elemento superior"],"No theme arrived with this upload. Choose a zip file and try again.":["No ha llegado ningún tema con esta subida. Elige un archivo zip e inténtalo de nuevo."],"No themes are installed.":["No hay ningún tema instalado."],"No title":["Sin título"],"None":["Ninguno"],"Not %(type)s":["Excepto %(type)s"],"Not found":["No encontrado"],"Not serving":["No está sirviendo"],"Nothing declares that role.":["Nada declara ese rol."],"Nothing points here yet.":["Todavía no apunta nada aquí."],"Nothing published here yet.":["Todavía no hay nada publicado aquí."],"Nothing published yet.":["Todavía no hay nada publicado."],"November":["noviembre"],"Nowhere":["En ningún sitio"],"Number":["Número"],"October":["octubre"],"Older posts":["Entradas anteriores"],"One frame of this animation holds more than %(max)s pixels, which is more than Gophenberg opens. Upload a smaller animation.":["Un fotograma de esta animación tiene más de %(max)s píxeles, más de lo que Gophenberg abre. Sube una animación más pequeña."],"One of the filters on this list is not one Gophenberg understands. Clear the filters and try again.":["Uno de los filtros de esta lista no es un filtro que Gophenberg entienda. Quita los filtros e inténtalo de nuevo."],"One of the items picked for %(field)s is not the kind of content that field points at. Reload the page and pick from the list the field offers.":["Uno de los elementos elegidos para %(field)s no es del tipo de contenido al que apunta ese campo. Recarga la página y elige de la lista que ofrece el campo."],"One of the items picked for %(field)s was not named in a way Gophenberg understands. Reload the page and pick the items again.":["Uno de los elementos elegidos para %(field)s no venía nombrado de una forma que Gophenberg entienda. Recarga la página y vuelve a elegir los elementos."],"One of the items picked no longer exists. Reload the page and pick again.":["Uno de los elementos elegidos ya no existe. Recarga la página y vuelve a elegir."],"One target":["Un destino"],"Only a relation field points at another content type or holds many items. Pick the Relation kind, or leave the target and the many option empty.":["Solo un campo de relación apunta a otro tipo de contenido o guarda varios elementos. Elige el tipo Relación, o deja vacío el destino y la opción de varios."],"Only one file may be placed here.":["Aquí solo se puede colocar un archivo."],"Only the content type at the root of your site may go without a route word. Give this type one and try again.":["Solo el tipo de contenido que está en la raíz de tu sitio puede ir sin palabra de ruta de URL. Dale una a este tipo e inténtalo de nuevo."],"Open %(field)s in a new tab":["Abrir %(field)s en una pestaña nueva"],"Open navigation":["Abrir la navegación"],"Order stored.":["Orden guardado."],"Other":["Otro"],"Out of list":["Fuera de la lista"],"Parent":["Elemento superior"],"Password":["Contraseña"],"Pending":["Pendiente"],"Pending Review":["Pendiente de revisión"],"Permanently delete":["Borrar permanentemente"],"Permanently delete…":["Borrar permanentemente…"],"Picture quality":["Calidad de imagen"],"Picture quality runs from 1 to %(max)s, so %(value)s is not a quality Gophenberg stores at. Pick a number inside that range.":["La calidad de imagen va de 1 a %(max)s, así que %(value)s no es una calidad con la que Gophenberg guarde. Elige un número dentro de ese rango."],"Placeholder":["Texto de ejemplo"],"Plural name":["Nombre en plural"],"Points at":["Apunta a"],"Post published.":["Entrada publicada."],"Posts per page":["Entradas por página"],"Preview":["Vista previa"],"Private":["Privada"],"Publish":["Publicar"],"Published: %s":["Publicado: %s"],"Radio group":["Grupo de botones de radio"],"Reads from":["Lee de"],"Redo":["Rehacer"],"Relation":["Relación"],"Remove":["Quitar"],"Remove %(name)s":["Quitar %(name)s"],"Remove %(title)s":["Quitar %(title)s"],"Remove row":["Quitar fila"],"Rename":["Renombrar"],"Rename %(field)s":["Renombrar %(field)s"],"Rename…":["Renombrar…"],"Require":["Hacer obligatorio"],"Require %(field)s":["Hacer %(field)s obligatorio"],"Required":["Obligatorio"],"Restore":["Restaurar"],"Role changed.":["Rol cambiado."],"Roll back to %(theme)s":["Revertir a %(theme)s"],"Roll back to the built-in renderer":["Revertir al renderizador integrado"],"Route word":["Palabra de ruta"],"Rule %(number)s of set %(set)s":["Regla %(number)s del conjunto %(set)s"],"Rule set %(number)s":["Conjunto de reglas %(number)s"],"Rules":["Reglas"],"Rules showing %(field)s":["Reglas que muestran %(field)s"],"Save":["Guardar"],"Save draft":["Guardar el borrador"],"Save rules":["Guardar las reglas"],"Save settings":["Guardar los ajustes"],"Saved":["Guardado"],"Saving":["Guardando"],"Scheduled":["Programada"],"Scheduled: %s":["Programado: %s"],"Search %(type)s…":["Buscar %(type)s…"],"Search audio":["Buscar audios"],"Search images":["Buscar imágenes"],"Search media":["Buscar medios"],"Search videos":["Buscar vídeos"],"Select":["Seleccionar"],"September":["septiembre"],"Serving":["Atendiendo"],"Settings":["Ajustes"],"Settings of %(field)s":["Ajustes de %(field)s"],"Shadowed":["Eclipsado"],"Show %(field)s in the list":["Mostrar %(field)s en la lista"],"Showing %(held)s of %(total)s.":["Mostrando %(held)s de %(total)s."],"Singular name":["Nombre en singular"],"Slug":["Slug"],"Somebody must be able to manage users.":["Alguien tiene que poder gestionar los usuarios."],"Someone else changed this media item while you were editing it. Reload the page and make your change again.":["Otra persona ha cambiado este medio mientras lo editabas. Recarga la página y vuelve a hacer tu cambio."],"Someone else saved changes to this item while you were editing, so yours were not saved. Copy your text somewhere safe, then reload the item and put your changes back in.":["Otra persona ha guardado cambios en este elemento mientras editabas, así que los tuyos no se han guardado. Copia tu texto a un lugar seguro, recarga el elemento y vuelve a colocarlos de vuelta."],"Something went wrong inside Gophenberg. Try again in a moment, and tell whoever looks after your site if it keeps happening.":["Algo ha fallado dentro de Gophenberg. Inténtalo de nuevo en un momento, y avisa a quien gestione tu sitio si sigue pasando."],"Something went wrong.":["Algo ha ido mal."],"Something went wrong. Try again.":["Algo ha ido mal. Inténtalo de nuevo."],"Sorry, you are not allowed to access this page.":["Lo siento, no tienes permisos para acceder a esta página."],"Source":["Origen"],"Steps of":["Pasos de"],"Stop nesting":["Dejar de anidar"],"Tablet":["Tableta"],"Text":["Texto"],"Text area":["Área de texto"],"That email is already in use.":["Ese correo electrónico ya está en uso."],"That field group no longer exists. Reload the page to see the groups your site holds now.":["Ese grupo de campos ya no existe. Recarga la página para ver los grupos que tiene ahora tu sitio."],"That field is not on this content type any more. Reload the page to see the fields it has now.":["Ese campo ya no está en este tipo de contenido. Recarga la página para ver los campos que tiene ahora."],"That revision does not exist, and older ones drop off once a type holds more than it keeps. Open the item to see which revisions are left.":["Esa revisión no existe, y las más antiguas se pierden cuando un tipo guarda más de las que conserva. Abre el elemento para ver qué revisiones quedan."],"That role holds more than your own.":["Ese rol abarca más que el tuyo."],"That web address does not name a media item Gophenberg can look up. Open the media library and pick the item from there.":["Esa dirección web no nombra ningún medio que Gophenberg pueda encontrar. Abre la biblioteca de medios y elige el elemento desde ahí."],"That web address does not name a revision Gophenberg can look up. Open the item and pick a revision from its history.":["Esa dirección web no alude a ninguna revisión que Gophenberg pueda identificar. Abre el elemento y elige una revisión de su historial."],"That web address does not name an item Gophenberg can look up. Go back to the list and open the item from there.":["Esa dirección web no alude a ningún elemento que Gophenberg pueda identificar. Vuelve a la lista y abre el elemento desde ahí."],"The %(count)s item in the trash is deleted for good. This cannot be undone.":["%(count)s elemento de la papelera se borrará permanentemente. Esto no se puede deshacer.","%(count)s de elementos de la papelera se borrarán permanentemente. Esto no se puede deshacer.","Los %(count)s elementos de la papelera se borrarán permanentemente. Esto no se puede deshacer."],"The %(file)s calls this theme %(declared)s, but it is being installed as %(installed)s. Rename the zip file to match, or change the name inside %(file)s.":["El archivo %(file)s llama a este tema %(declared)s, pero se está instalando como %(installed)s. Renombra el zip para que coincida, o cambia el nombre dentro de %(file)s."],"The %(file)s inside %(name)s is not valid JSON, so it could not be read. Fix that file and package the theme again.":["El archivo %(file)s dentro de %(name)s no es JSON válido, así que no se ha podido leer. Corrige ese archivo y vuelve a empaquetar el tema."],"The %(file)s inside %(name)s names its theme kit as %(declared)s, which is not a version number. Build the theme again, and the build will fill that in.":["El %(file)s dentro de %(name)s identifica su kit de temas como %(declared)s, que no srive como número de versión. Compila el tema de nuevo y la compilación lo rellenará."],"The %(origin)s plugin declared this, so it can only be changed in that plugin. Turning it off is still yours to do.":["El plugin %(origin)s lo declaró, así que solo se puede cambiar en ese plugin. Desactivarlo sigue estando en tu mano."],"The %(plugin)s plugin also declares %(name)s, and the site keeps the key.":["El plugin %(plugin)s también declara %(name)s, y el sitio se queda con la clave."],"The %(plugin)s plugin declared these fields, so they change only in its code.":["El plugin %(plugin)s declaró estos campos, así que solo cambian en su código."],"The %(plugin)s plugin declares %(name)s flat, and the site keeps it nesting while its items sit inside another.":["El plugin %(plugin)s declara %(name)s sin anidar, y el sitio lo mantiene anidando mientras sus elementos están dentro de otro."],"The browser kept an unsaved version of this post.":["El navegador ha guardado una versión sin guardar de esta entrada."],"The built-in renderer is now serving the public site.":["El renderizador integrado ya presta servicio al sitio público."],"The built-in renderer is serving the public site.":["El renderizador integrado presta servicio al sitio público."],"The content type this field points at is not named in a shape Gophenberg accepts. Give it a key that starts with a lowercase letter and then holds only lowercase letters, numbers and hyphens.":["El tipo de contenido al que apunta este campo no está nombrado con un formato que Gophenberg acepte. Dale una clave que empiece por una letra minúscula y contenga solo letras minúsculas, números y guiones."],"The content types could not be loaded, so where these groups appear and which fields they shadow are not shown.":["No se han podido cargar los tipos de contenido, así que no se muestra dónde aparecen estos grupos ni qué campos eclipsan."],"The content types could not be loaded.":["No se han podido cargar los tipos de contenido."],"The content types could not be refreshed, so where these groups appear and what they shadow may be out of date.":["No se han podido actualizar los tipos de contenido, así que dónde aparecen estos grupos y qué eclipsan puede estar desactualizado."],"The draft could not be created.":["No se ha podido crear el borrador."],"The entry %(entry)s in this zip would be written outside the theme folder, so nothing was installed. Package the theme again.":["La entrada %(entry)s de este zip se escribiría fuera de la carpeta del tema, así que no se ha instalado nada. Vuelve a empaquetar el tema."],"The field %(field)s cannot go, because %(by)s reads it. Change %(by)s first.":["El campo %(field)s no se puede quitar, porque %(by)s lo lee. Cambia antes %(by)s."],"The field %(field)s cannot hold the value it was given. Check what kind of field it is and enter a value that matches.":["El campo %(field)s no puede guardar el valor que se le ha dado. Comprueba de qué tipo de campo se trata e introduce un valor que encaje."],"The field %(field)s has to hold a value before this item can be published. Fill it in, or leave the item as a draft.":["El campo %(field)s tiene que tener un valor antes de poder publicar este elemento. Rellénalo, o deja el elemento como borrador."],"The field %(field)s in %(group)s still points at this content type. Delete that field first, then delete this type.":["El campo %(field)s de %(group)s todavía apunta a este tipo de contenido. Borra antes ese campo y luego borra este tipo."],"The field %(field)s is hidden by its own rules right now, so it cannot hold a value. Show it again before filling it in.":["El campo %(field)s está oculto por sus propias reglas ahora mismo, así que no puede guardar ningún valor. Vuelve a mostrarlo antes de rellenarlo."],"The field %(field)s points at one item only. Remove the extra choices and keep one.":["El campo %(field)s apunta a un solo elemento. Quita las opciones de más y deja una."],"The field %(field)s points at other items, so it does not take a plain value. Pick the items it points at instead.":["El campo %(field)s apunta a otros elementos, así que no admite un valor suelto. Elige en su lugar los elementos a los que apunta."],"The field %(field)s takes a list of items, and what arrived was not a list. Reload the page and pick the items again.":["El campo %(field)s admite una lista de elementos, y lo que ha llegado no era una lista. Recarga la página y vuelve a elegir los elementos."],"The field %(source)s cannot hold the value %(value)s, so no rule can compare it. Write a value of the kind %(source)s stores.":["El campo %(source)s no puede guardar el valor %(value)s, así que ninguna regla puede compararlo. Escribe un valor de la clase que %(source)s guarda."],"The field groups could not be loaded.":["No se han podido cargar los grupos de campos."],"The field groups could not be reached.":["No se ha podido contactar con los grupos de campos."],"The field keeps its values on the content both groups reach.":["El campo conserva sus valores en el contenido al que llegan ambos grupos."],"The fields this group holds go with it, and so do the values every item stored in them.":["Los campos que contiene este grupo se van con él, y también los valores que cada elemento guardó en ellos."],"The groups were reordered.":["Los grupos se han reordenado."],"The item could not be duplicated.":["No se ha podido duplicar el elemento."],"The item could not be moved to the trash.":["No se ha podido mover el elemento a la papelera."],"The item could not be permanently deleted.":["No se ha podido borrar permanentemente el elemento."],"The item could not be restored.":["No se ha podido restaurar el elemento."],"The item you picked as parent holds another kind of content. Pick a parent of the same content type as this item.":["El elemento que has elegido como superior tiene otro tipo de contenido. Elige un elemento superior del mismo tipo de contenido que este elemento."],"The item you picked as parent is in the trash. Restore it, or pick another parent.":["El elemento que has elegido como superior está en la papelera. Restáuralo, o elige otro elemento superior."],"The item you picked as parent no longer exists. Reload the page and pick another parent.":["El elemento que has elegido como superior ya no existe. Recarga la página y elige otro."],"The media library could not be loaded.":["No se ha podido cargar la biblioteca de medios."],"The name changes. Nothing stored under this field moves.":["El nombre cambia. Nada de lo guardado en este campo se mueve."],"The name could not be updated.":["No se ha podido actualizar el nombre."],"The new order has to name every field group exactly once. Reload the page and move the groups again.":["El nuevo orden tiene que nombrar cada grupo de campos exactamente una vez. Recarga la página y mueve los grupos otra vez."],"The new order has to name every field of this content type exactly once. Reload the page and move the fields again.":["El nuevo orden tiene que nombrar cada campo de este tipo de contenido exactamente una vez. Recarga la página y mueve los campos de nuevo."],"The number of revisions to keep has to be a whole number, and it cannot be negative. Enter a different number.":["El número de revisiones que se conservan tiene que ser un número entero, y no puede ser negativo. Introduce otro número."],"The registry could not be reached.":["No se ha podido acceder al registro."],"The role could not be changed.":["No se ha podido cambiar el rol."],"The rule on %(source)s names nothing to match. Pick a value, or remove the rule.":["La regla sobre %(source)s no nombra nada con lo que coincidir. Elige un valor, o quita la regla."],"The rules could not be loaded.":["No se han podido cargar las reglas."],"The rules on %(field)s lead back to %(field)s itself, so nothing can decide whether to show it. Point one of them at another field.":["Las reglas de %(field)s vuelven al propio %(field)s, así que nada puede decidir si mostrarlo. Apunta una de ellas a otro campo."],"The same item was picked twice for %(field)s. Pick each item once.":["El mismo elemento se ha elegido dos veces para %(field)s. Elige cada elemento una sola vez."],"The server could not be reached, so nothing was changed.":["No se ha podido acceder al servidor, así que no se ha cambiado nada."],"The server could not be reached, so nothing was saved.":["No se ha podido acceder al servidor, así que no se ha guardado nada."],"The server could not be reached, so nothing was uploaded.":["No se ha podido acceder al servidor, así que no se ha subido nada."],"The setting %(setting)s cannot hold the value it was given. Check what this setting takes and try again.":["El ajuste %(setting)s no puede contener el valor que se le dio. Comprueba qué acepta este ajuste y prueba de nuevo."],"The setting %(setting)s falls outside the others. Keep min below max and the default inside the bounds.":["El ajuste %(setting)s queda fuera de los demás. Mantén min por debajo de max y el valor por defecto dentro de los límites."],"The settings could not be read, so nothing can be changed here yet.":["No se han podido leer los ajustes, así que todavía no se puede cambiar nada aquí."],"The site default":["El idioma por defecto del sitio"],"The site may already hold part of this file. Import it again to see what is left.":["Puede que el sitio ya tenga parte de este archivo. Impórtalo de nuevo para ver lo que queda."],"The source %(source)s does not offer %(operator)s. Pick one of the comparisons it does offer.":["La fuente %(source)s no ofrece %(operator)s. Elige una de las comparaciones que sí ofrece."],"The theme %(name)s carries no %(file)s, so Gophenberg cannot tell what it is. Put that file at the top level of the zip and package the theme again.":["El tema %(name)s no lleva ningún %(file)s, así que Gophenberg no puede saber qué es. Pon ese archivo en el primer nivel del zip y vuelve a empaquetar el tema."],"The theme %(name)s could not be read, so it cannot serve your site. Upload it again, or choose another theme.":["El tema %(name)s no se ha podido leer, así que no puede servir tu sitio. Vuelve a subirlo, o elige otro tema."],"The theme %(name)s did not start, so your site is still served by the theme it had. Ask whoever looks after your site to check the server log for what the theme reported.":["El tema %(name)s no ha arrancado, así que tu sitio lo sigue sirviendo el tema que tenía. Pide a quien gestiona tu sitio que mire en el registro del servidor para saber qué problema ha informado el tema."],"The theme %(name)s does not carry %(path)s as a file, so there is nothing to run. Package the built theme rather than its source.":["El tema %(name)s no lleva %(path)s como archivo, así que no hay nada que ejecutar. Empaqueta el tema ya construido, no su código fuente."],"The theme %(name)s does not carry %(path)s as a folder, so its styles and scripts are missing. Package the built theme rather than its source.":["El tema %(name)s no lleva %(path)s como carpeta, así que le faltan los estilos y los scripts. Empaqueta el tema ya construido, no su código fuente."],"The theme %(name)s holds a link to another file at %(path)s, and a theme may only carry real files. Replace it and package the theme again.":["El tema %(name)s lleva un enlace a otro archivo en %(path)s, y un tema solo puede llevar archivos de verdad. Sustitúyelo y vuelve a empaquetar el tema."],"The theme %(name)s is serving your site right now, so it cannot be replaced. Deactivate it first, or install this copy under another name.":["El tema %(name)s sirve tu sitio ahora mismo, así que no se puede sustituir. Desactívalo primero, o instala esta copia con otro nombre."],"The theme %(name)s is the one chosen, but it is not installed, so your site is served by the built-in renderer. Upload the theme again, or choose another one.":["El tema %(name)s es el elegido, pero no está instalado, así que el renderizador integrado está prestando servicio a tu sitio. Vuelve a subir el tema, o elige otro."],"The theme %(name)s was built on theme kit %(declared)s, and this site serves %(served)s. Build the theme again against a kit this site serves, then install it.":["El tema %(name)s se compiló con el kit de temas %(declared)s y este sitio sirve %(served)s. Compila el tema de nuevo con un kit que este sitio sirva y después instálalo."],"The trash could not be emptied.":["No se ha podido vaciar la papelera."],"The user could not be created.":["No se ha podido crear el usuario."],"The values stored under it do not follow.":["Los valores guardados debajo no le siguen."],"Theme":["Tema"],"Themes":["Temas"],"Themes could not be loaded.":["No se han podido cargar los temas."],"There is no content type called %(value)s. Pick a type your site holds, or register it first.":["No existe ningún tipo de contenido llamado %(value)s. Elige un tipo que tenga tu sitio, o regístralo primero."],"There is no content type called %(value)s. Pick one of the types your site holds and try again.":["No existe ningún tipo de contenido llamado %(value)s. Elige uno de los tipos que tiene tu sitio e inténtalo de nuevo."],"There is no kind of field called %(value)s. Pick one of these instead: %(allowed)s.":["No existe ningún tipo de campo llamado %(value)s. Elige uno de estos: %(allowed)s."],"There is no page kind called %(value)s. Pick one of these instead: %(allowed)s.":["No existe ningún tipo de página llamado %(value)s. Elige uno de estos: %(allowed)s."],"There is no status called %(value)s. Pick one of these instead: %(allowed)s.":["No existe ningún estado llamado %(value)s. Elige uno de estos: %(allowed)s."],"There is nothing at this address. Check the link and try again.":["No hay nada en esta dirección. Comprueba el enlace e inténtalo de nuevo."],"There is nothing to roll back to, because your site has not been through a theme change yet. Install a theme first, then a rollback has somewhere to go.":["No hay nada a lo que retornar, porque tu sitio todavía no ha cambiado de tema. Instala un tema primero y así el retorno tendrá adónde ir."],"These files could not be read.":["No se han podido leer estos archivos."],"These were left alone, because nobody confirmed losing them.":["Estos se han dejado como estaban, porque nadie confirmó perderlos."],"This content type does not exist any more. Reload the page to see the types your site holds now.":["Este tipo de contenido ya no existe. Recarga la página para ver los tipos que tiene ahora tu sitio."],"This content type does not nest, so one of its items cannot sit inside another. Mark the type as Nests first.":["Este tipo de contenido no anida, así que uno de sus elementos no puede estar dentro de otro. Marca el tipo como Anida primero."],"This content type has no field called %(field)s. Check the name, or declare the field on the type first.":["Este tipo de contenido no tiene ningún campo llamado %(field)s. Comprueba el nombre, o declara antes el campo en el tipo."],"This content type is turned off, so its content is not served or edited. Activate it first.":["Este tipo de contenido está desactivado, así que su contenido ni se sirve ni se edita. Actívalo primero."],"This content type still holds content, so it cannot be deleted. Move or delete its items first.":["Este tipo de contenido todavía tiene contenido, así que no se puede borrar. Mueve o borra antes sus elementos."],"This definitions file is larger than the %(max)s bytes Gophenberg reads in one request. Split it, or raise the limit your site runs with.":["Este archivo de definiciones es mayor que los %(max)s bytes que Gophenberg lee en una petición. Divídelo, o sube el límite con el que funciona tu sitio."],"This field holds no layouts yet.":["Este campo todavía no tiene diseños."],"This field would stand inside too many containers. Put it nearer the top and try again.":["Este campo quedaría dentro de demasiados contenedores. Ponlo más cerca del nivel superior e inténtalo de nuevo."],"This file could not be opened as a zip. Package the theme again and upload the new file.":["Este archivo no se ha podido abrir como zip. Vuelve a empaquetar el tema y sube el archivo nuevo."],"This file is larger than the upload limit. Upload a smaller file.":["Este archivo es más grande que el límite de subida. Sube un archivo más pequeño."],"This file is named %(extension)s but it holds %(detected)s content. Upload it under a name that matches what is inside it.":["Este archivo se llama %(extension)s pero lleva contenido %(detected)s. Súbelo con un nombre que coincida con lo que lleva dentro."],"This file matches the site, so there is nothing to change.":["Este archivo coincide con el sitio, así que no hay nada que cambiar."],"This file says it was written in format %(declared)s, which is not a version Gophenberg can read. Export the definitions again from the site they came from.":["Este archivo dice estar escrito en el formato %(declared)s, que no es una versión que Gophenberg pueda leer. Vuelve a exportar las definiciones desde el sitio del que vinieron."],"This file was written in format %(declared)s, and this release reads %(served)s. Upgrade the site the file came from, or this one.":["Este archivo está escrito en el formato %(declared)s, y esta versión lee %(served)s. Actualiza el sitio del que viene el archivo, o este."],"This group holds no fields yet.":["Este grupo todavía no tiene campos."],"This install of Gophenberg has no install root, so it updates by hand.":["Esta instalación de Gophenberg no tiene raíz de instalación, así que se actualiza a mano."],"This is a custom build of Gophenberg, so it updates by hand.":["Esta es una compilación propia de Gophenberg, así que se actualiza a mano."],"This item cannot go straight to that status from the one it holds now. Save it as a draft first, then try again.":["Este elemento no puede pasar directamente a ese estado desde el que tiene ahora. Guárdalo antes como borrador e inténtalo de nuevo."],"This item changed while you were describing it. Reload and try again.":["Este elemento ha cambiado mientras lo describías. Recarga e inténtalo de nuevo."],"This item does not exist, and it may have been deleted. Go back to the list to see what is there.":["Este elemento no existe, y puede que se haya borrado. Vuelve a la lista para ver qué hay."],"This item is already in the trash. Restore it first to work on it again.":["Este elemento ya está en la papelera. Restáuralo primero para volver a trabajar en él."],"This item is in the trash. Restore it first to work on it again.":["Este elemento está en la papelera. Restáuralo primero para volver a trabajar en él."],"This item is not in the trash, so there is nothing to restore. Open it from the list to work on it as it is.":["Este elemento no está en la papelera, así que no hay nada que restaurar. Ábrelo desde la lista para trabajar en él tal como está."],"This item still holds items nested inside it. Move or delete those first.":["Este elemento todavía tiene elementos anidados dentro. Mueve o borra antes esos."],"This kind of field holds no fields inside it. Put the field in a section or a repeater instead.":["Este tipo de campo no contiene campos dentro. Pon el campo en una sección o en un repetidor."],"This media item is not in the library, and someone may have deleted it. Reload the page to see what is there now.":["Este medio no está en la biblioteca, y puede que alguien lo haya borrado. Recarga la página para ver qué hay ahora."],"This picture could not be read, so nothing was stored. The file may be damaged, so open it on your computer and upload it again.":["Esta imagen no se ha podido leer, así que no se ha guardado nada. Puede que el archivo esté dañado, así que ábrelo en tu ordenador y vuelve a subirlo."],"This picture is %(width)s by %(height)s pixels, over the limit of %(max)s pixels in all. Make it smaller and upload it again.":["Esta imagen tiene %(width)s por %(height)s píxeles, por encima del límite de %(max)s píxeles en total. Hazla más pequeña y vuelve a subirla."],"This post changed elsewhere. Reload before saving again.":["Esta entrada ha cambiado en otro sitio. Recarga antes de volver a guardar."],"This request came from a page on another site, so it was refused. Open the admin on this site and try again.":["Esta petición vino de una página de otro sitio, así que se rechazó. Abre la administración en este sitio e inténtalo de nuevo."],"This request carried %(attribute)s, which fields do not take. Reload the page so the admin and the server agree again.":["Esta petición llevaba %(attribute)s, que los campos no aceptan. Recarga la página para que la administración y el servidor vuelvan a coincidir."],"This request left out %(field)s, which Gophenberg needs. Reload the page and try again.":["En esta petición faltaba %(field)s, que Gophenberg necesita. Recarga la página e inténtalo de nuevo."],"This rule reads a source called %(source)s, and nothing on your site declares one. A plugin that added it may have been removed.":["Esta regla lee una fuente llamada %(source)s, y nada en tu sitio declara ninguna. Puede que se haya quitado un plugin que la añadía."],"This site cannot write to its themes folder, so no theme can be installed. Ask whoever looks after your site to make the folder that %(setting)s points at writable. A read-only mount is the usual cause.":["Este sitio no puede escribir en su carpeta de temas, así que no se puede instalar ninguno. Pide a quien gestione tu sitio que haga escribible la carpeta a la que apunta %(setting)s. La causa habitual es un montaje de solo lectura."],"This site has nowhere to keep themes, so no theme can be installed. Ask whoever looks after your site to point %(setting)s at a folder the server can write to.":["Este sitio no tiene dónde guardar los temas, así que no se puede instalar ninguno. Pide a quien gestione tu sitio que apunte %(setting)s a una carpeta en la que el servidor pueda escribir."],"This site has nowhere to store uploads, so nothing can be uploaded. Ask whoever looks after your site to point %(setting)s at a folder the server can write to.":["Este sitio no tiene dónde guardar las subidas, así que no se puede subir nada. Pide a quien gestione tu sitio que apunte %(setting)s a una carpeta en la que el servidor pueda escribir."],"This theme is over the limit of %(max)s bytes, packed or unpacked. Leave out what the theme does not need and package it again.":["Este tema pasa del límite de %(max)s bytes, comprimido o sin comprimir. Saca lo que el tema no necesite y vuelve a empaquetarlo."],"This type will answer under /%(word)s.":["Este tipo responderá como /%(word)s."],"This zip holds %(entries)s files, more than the %(max)s a theme may carry. Package only the built theme.":["Este zip lleva %(entries)s archivos, más de los %(max)s que puede llevar un tema. Empaqueta solo el tema ya construido."],"Through":["A través de"],"Thumbnail":["Miniatura"],"Title":["Título"],"Two field groups in this file share the key %(key)s. Give one of them a different key and import again.":["Dos grupos de campos de este archivo comparten la clave %(key)s. Dale una clave distinta a uno de ellos e importa de nuevo."],"Two rule sources are registered under the name %(param)s. A plugin is declaring a source your site already holds.":["Hay dos fuentes de reglas registradas con el nombre %(param)s. Un plugin declara una fuente que tu sitio ya tiene."],"Type":["Tipo"],"Type a whole number in both boxes before saving.":["Escribe un número entero en las dos casillas antes de guardar."],"Undo":["Deshacer"],"Unsaved changes":["Cambios sin guardar"],"Update":["Actualizar"],"Update failed.":["No se ha podido actualizar."],"Upload theme":["Subir tema"],"Uploaded %s file.":["%s archivo subido.","%s de archivos subidos.","%s archivos subidos."],"Users":["Usuarios"],"Users could not be loaded.":["No se han podido cargar los usuarios."],"Value":["Valor"],"Version":["Versión"],"Videos":["Vídeos"],"Visit Site":["Visitar el sitio"],"Web address":["Dirección web"],"What each Linked from field reads":["Qué lee cada campo Enlazado desde"],"What it points at changed, so its stored values go with it.":["Aquello a lo que apunta ha cambiado, así que sus valores guardados se van con él."],"Where %(group)s appears":["Dónde aparece %(group)s"],"Without a rule this field always shows.":["Sin ninguna regla este campo siempre se muestra."],"Without a rule this group appears nowhere.":["Sin una regla este grupo no aparece en ningún sitio."],"Yes":["Sí"],"Yes or no":["Sí o no"],"You cannot change your own role.":["No puedes cambiar tu propio rol."],"Your language":["Tu idioma"],"Your role does not allow %(capability)s.":["Tu rol no permite %(capability)s."],"Your server pins the site to the theme %(name)s, so themes cannot be changed here. Ask whoever looks after your site to remove the pin.":["Tu servidor bloque el sitio al tema %(name)s, así que los temas no se pueden cambiar desde aquí. Pide a quien gestiona tu sitio que quite ese bloqueo."],"Your site always needs one default content type, so this one cannot be turned off or deleted. Make another type the default first.":["Tu sitio siempre necesita un tipo de contenido por defecto, así que este no se puede desactivar ni borrar. Haz antes que otro tipo sea el que está por defecto."],"a content type":["un tipo de contenido"],"account\u0004Role":["Rol"],"account\u0004Status":["Estado"],"action label\u0004Duplicate":["Duplicar"],"action label\u0004Duplicate…":["Duplicar…"],"address":["dirección"],"admin section\u0004Media":["Medios"],"column\u0004Date":["Fecha"],"content type\u0004\"%s\" permanently deleted.":["Se ha borrado permanentemente el tipo de contenido «%s»."],"content type\u0004\"%s\" successfully created.":["Se ha creado correctamente el tipo de contenido «%s»."],"content type\u0004Status":["Estado"],"field\u0004Name":["Nombre"],"field group\u0004Status":["Estado"],"field type\u0004Choice":["Elección"],"field type\u0004Color":["Color"],"field type\u0004Date":["Fecha"],"field type\u0004Flexible content":["Contenido flexible"],"field type\u0004Gallery":["Galería"],"field type\u0004Kind":["Tipo"],"field type\u0004Layout":["Diseño"],"field type\u0004Link":["Enlace"],"field type\u0004Media":["Medio"],"field type\u0004Range":["Rango"],"field type\u0004Repeater":["Repetidor"],"field type\u0004Section":["Sección"],"field type\u0004Select":["Desplegable"],"holds":["contiene"],"holds anything":["contiene algo"],"is":["es"],"is above":["es mayor que"],"is below":["es menor que"],"is empty":["está vacío"],"is not":["no es"],"media family\u0004Kind":["Clase"],"panel button label\u0004Settings":["Ajustes"],"person\u0004Name":["Nombre"],"post\u0004%s (Copy)":["%s (copia)"],"post\u0004Status":["Estado"],"post status\u0004Draft":["Borrador"],"post status\u0004Published":["Publicada"],"post status\u0004Trash":["Papelera"],"post type general name\u0004Pages":["Páginas"],"post type general name\u0004Posts":["Entradas"],"post type singular name\u0004Page":["Página"],"post type singular name\u0004Post":["Entrada"],"relation target\u0004None":["Ninguno"],"role\u0004Administrator":["Administrador"],"role\u0004Author":["Autor"],"role\u0004Editor":["Editor"],"role\u0004Member":["Miembro"],"role\u0004No role":["Sin rol"],"status filter\u0004All":["Todo"],"taxonomy general name\u0004Categories":["Categorías"],"taxonomy singular name\u0004Category":["Categoría"],"theme\u0004Status":["Estado"],"trash\u0004Restore":["Restaurar"],"v%(version)s":["v%(version)s"],"verb\u0004Trash…":["Papelera…"],"verb\u0004View":["Ver"],"{day} {month} {year}":["{day} de {month} de {year}"]} +{"":{"lang":"es","plural-forms":"nplurals=3; plural=((n == 1) ? 0 : ((n != 0 && n % 1000000 == 0) ? 1 : 2));"}," and ":[" y "]," or ":[" o "],"\"%s\" activated.":["Se ha activado «%s»."],"\"%s\" deactivated.":["Se ha desactivado «%s»."],"\"%s\" has been restored.":["«%s» se ha restaurado."],"\"%s\" moved to the trash.":["«%s» trasladado a la papelera."],"\"%s\" permanently deleted.":["«%s» borrado permanentemente."],"\"%s\" successfully created.":["«%s» creado correctamente."],"\"%s\" uploaded.":["«%s» subido."],"%(field)s address":["Dirección de %(field)s"],"%(field)s cannot move inside itself. Pick a container that is not one of its own.":["%(field)s no puede moverse dentro de sí mismo. Elige un contenedor que no sea uno de los suyos."],"%(field)s declared.":["%(field)s declarado."],"%(field)s deleted.":["%(field)s borrado."],"%(field)s does not match the format its field asks for. Check it and save again.":["%(field)s no tiene el formato que su campo requiere. Revísalo y guarda de nuevo."],"%(field)s goes no higher than %(limit)s. Lower the value and save again.":["%(field)s no pasa de %(limit)s. Baja el valor y guarda de nuevo."],"%(field)s goes no lower than %(limit)s. Raise the value and save again.":["%(field)s no baja de %(limit)s. Sube el valor y guarda de nuevo."],"%(field)s holds no value of its own, so it cannot be required. Make it optional.":["%(field)s no guarda ningún valor propio, así que no puede ser obligatorio. Hazlo opcional."],"%(field)s is optional again.":["%(field)s vuelve a ser opcional."],"%(field)s is required now.":["%(field)s ahora es obligatorio."],"%(field)s moved.":["%(field)s movido."],"%(field)s names the same one twice. Remove the repeat and save again.":["%(field)s nombra el mismo dos veces. Quita la repetición y guarda de nuevo."],"%(field)s needs at least %(limit)s files. Add one and save again.":["%(field)s necesita al menos %(limit)s archivos. Añade uno y guarda de nuevo."],"%(field)s needs at least %(limit)s rows. Add one and save again.":["%(field)s necesita al menos %(limit)s filas. Añade una y guarda de nuevo."],"%(field)s only takes one of its listed choices. Pick one and save again.":["%(field)s solo admite una de las opciones de su lista. Elige una y guarda de nuevo."],"%(field)s reads a relation field that is not there. Pick a group and a relation field it holds.":["%(field)s lee un campo de relación que no existe. Elige un grupo y un campo de relación que contenga."],"%(field)s reads a relation pointing at %(type)s, so it would list nothing here. Pick a relation pointing at the items this group is shown on.":["%(field)s lee una relación que apunta a %(type)s, así que aquí no mostraría nada. Elige una relación que apunte a los elementos donde se muestra este grupo."],"%(field)s renamed.":["%(field)s renombrado."],"%(field)s settled.":["%(field)s ajustado."],"%(field)s shows by its rules now.":["%(field)s ahora se muestra según sus reglas."],"%(field)s stands in the list.":["%(field)s aparece en la lista."],"%(field)s stays out of the list.":["%(field)s se queda fuera de la lista."],"%(field)s takes at most %(limit)s files. Remove one and save again.":["%(field)s acepta como mucho %(limit)s archivos. Quita uno y guarda de nuevo."],"%(field)s takes at most %(limit)s letters. Shorten what you wrote and save again.":["%(field)s acepta como mucho %(limit)s letras. Acorta lo que has escrito y guarda de nuevo."],"%(field)s takes at most %(limit)s rows. Remove one and save again.":["%(field)s admite como mucho %(limit)s filas. Quita una y guarda de nuevo."],"%(field)s title":["Título de %(field)s"],"%(file)s is larger than one upload may be.":["%(file)s es más grande de lo que una subida permite."],"%(file)s is not a file this block accepts.":["%(file)s no es un archivo que este bloque acepte."],"%(file)s: %(reason)s":["%(file)s: %(reason)s"],"%(group)s created.":["%(group)s creado."],"%(group)s now appears where you said.":["%(group)s ya aparece donde has dicho."],"%(group)s removed.":["%(group)s eliminado."],"%(group)s updated.":["%(group)s actualizado."],"%(key)s is served by %(winner)s, so %(loser)s does not show it on %(where)s.":["%(key)s lo sirve %(winner)s, así que %(loser)s no lo muestra en %(where)s."],"%(name)s %(version)s is serving the public site.":["%(name)s %(version)s está publicado en la web."],"%(name)s belongs to the site now.":["%(name)s ya pertenece al sitio."],"%(name)s came from the %(plugin)s plugin, which no longer declares it.":["%(name)s vino del plugin %(plugin)s, que ya no lo declara."],"%(name)s cannot be used as a theme name. Name the zip file after the theme, with no dot at the start and no slashes in it.":["%(name)s no se puede usar como nombre de tema. Nombra el archivo zip como el tema, sin punto al principio y sin barras."],"%(name)s moves to /%(word)s. Every address of both types changes.":["El tipo %(name)s pasa a /%(word)s. Cambian todas las direcciones de ambos tipos."],"%(name)s would move to /%(word)s, which Gophenberg keeps for itself. Change its plural name and try again.":["El tipo %(name)s pasaría a /%(word)s, que Gophenberg reserva para sí mismo. Cambia su nombre en plural e inténtalo de nuevo."],"%(source)s is %(value)s":["%(source)s es %(value)s"],"%(theme)s failed to start, so the built-in renderer is serving.":["%(theme)s no pudo arrancar, así que el renderizador ha tomado el relevo."],"%(theme)s is now serving the public site.":["%(theme)s ya sirve el sitio público."],"%(theme)s is serving the public site.":["%(theme)s sirve el sitio público."],"%(theme)s is still starting, so the built-in renderer is serving.":["%(theme)s todavía está arrancando, así que el renderizador ha tomado el relevo."],"%(theme)s was installed.":["%(theme)s se ha instalado."],"%(theme)s will not load, so the built-in renderer is serving.":["%(theme)s no se carga, así que el renderizador ha tomado el relevo."],"%(type)s answers on a new address, and stored links move with it.":["%(type)s responde en una dirección nueva, y los enlaces guardados se mueven con ella."],"%(type)s becomes the type the site opens on, and the old one takes an address.":["%(type)s pasa a ser el tipo con el que abre el sitio, y el anterior toma una dirección."],"%(type)s keeps nesting while %(items)s of its items sit inside another. Move those to the top level first, the ones in the trash included.":["%(type)s sigue anidando mientras %(items)s de sus elementos están dentro de otro. Muévelos primero al nivel superior, incluidos los de la papelera."],"%(type)s keeps nesting, because some of its items sit inside another.":["%(type)s sigue anidando, porque algunos de sus elementos están dentro de otro."],"%(type)s will answer at the root.":["El tipo %(type)s responderá en la raíz."],"%s content type activated.":["Se ha activado %s tipo de contenido.","Se han activado %s de tipos de contenido.","Se han activado %s tipos de contenido."],"%s content type could not be activated.":["No se ha podido activar %s tipo de contenido.","No se han podido activar %s de tipos de contenido.","No se han podido activar %s tipos de contenido."],"%s content type could not be deactivated.":["No se ha podido desactivar %s tipo de contenido.","No se han podido desactivar %s de tipos de contenido.","No se han podido desactivar %s tipos de contenido."],"%s content type could not be permanently deleted.":["No se ha podido borrar permanentemente %s tipo de contenido.","No se han podido borrar permanentemente %s de tipos de contenido.","No se han podido borrar permanentemente %s tipos de contenido."],"%s content type deactivated.":["Se ha desactivado %s tipo de contenido.","Se han desactivado %s de tipos de contenido.","Se han desactivado %s tipos de contenido."],"%s content type permanently deleted.":["Se ha borrado permanentemente %s tipo de contenido.","Se han borrado permanentemente %s de tipos de contenido.","Se han borrado permanentemente %s tipos de contenido."],"%s item could not be moved to the trash.":["No se ha podido mover %s elemento a la papelera.","No se han podido mover %s de elementos a la papelera.","No se han podido mover %s elementos a la papelera."],"%s item could not be permanently deleted.":["No se ha podido borrar permanentemente %s elemento.","No se han podido borrar permanentemente %s de elementos.","No se han podido borrar permanentemente %s elementos."],"%s item could not be restored.":["No se ha podido restaurar %s elemento.","No se han podido restaurar %s de elementos.","No se han podido restaurar %s elementos."],"%s item moved to the trash.":["%s elemento movido a la papelera.","%s de elementos movidos a la papelera.","%s elementos movidos a la papelera."],"%s item permanently deleted.":["%s elemento borrado permanentemente.","%s de elementos borrados permanentemente.","%s elementos borrados permanentemente."],"%s item stays in the trash.":["%s elemento sigue en la papelera.","%s de elementos siguen en la papelera.","%s elementos siguen en la papelera."],"%s page has been restored.":["Se ha restaurado %s página.","Se han restaurado %s de páginas.","Se han restaurado %s páginas."],"%s post has been restored.":["Se ha restaurado %s entrada.","Se han restaurado %s de entradas.","Se han restaurado %s entradas."],"(no title)":["(sin título)"],"A %(kind)s field does not take a setting called %(setting)s. Remove it and try again.":["Un campo %(kind)s no acepta un ajuste llamado %(setting)s. Quítalo y prueba de nuevo."],"A Linked from field stands on its own, not inside a section or a repeater. Declare %(field)s beside the container.":["Un campo Enlazado desde va por su cuenta, no dentro de una sección ni de un repetidor. Declara %(field)s junto al contenedor."],"A content type needs a singular and a plural name, like Guide and Guides. Fill both in and try again.":["Un tipo de contenido necesita un nombre en singular y otro en plural, como Guía y Guías. Rellena ambos e inténtalo de nuevo."],"A descriptive summary of the content type.":["Un resumen descriptivo del tipo de contenido."],"A field group key has to start with a lowercase letter and then hold only lowercase letters, numbers and hyphens. Rename the group in the file so its key comes out in that shape.":["La clave de un grupo de campos tiene que empezar por una letra minúscula y después llevar solo letras minúsculas, números y guiones. Cambia el nombre del grupo en el archivo para que su clave salga con esa forma."],"A field key has to start with a lowercase letter and then hold only lowercase letters, numbers and hyphens. Rename the field so its key comes out in that shape.":["La clave de un campo tiene que empezar por una letra minúscula y contener solo letras minúsculas, números y guiones. Renombra el campo para que su clave tenga esa forma."],"A field needs a name. Type one and try again.":["El campo necesita un nombre. Escribe uno e inténtalo de nuevo."],"A field with that name already exists on the items this group reaches. Pick another name.":["Ya existe un campo con ese nombre en los elementos que este grupo alcanza. Elige otro nombre."],"A flexible content field holds layouts, and %(field)s is not one. Add a layout first, then declare the field inside that layout.":["Un campo de contenido flexible contiene diseños, y %(field)s no lo es. Añade primero un diseño y después declara el campo dentro de ese diseño."],"A higher quality stores larger files, and it applies to pictures uploaded from now on.":["Una calidad más alta almacena archivos más grandes, y se aplica a las imágenes que subas a partir de ahora."],"A layout stands inside a flexible content field only. Put %(field)s inside one of those instead.":["Un diseño solo va dentro de un campo de contenido flexible. Pon %(field)s dentro de uno de ellos."],"A layout stands inside a flexible content field, never on its own. Declare a flexible content field first, then add %(field)s inside it.":["Un diseño va dentro de un campo de contenido flexible, nunca por su cuenta. Declara primero un campo de contenido flexible y después añade %(field)s dentro."],"A listing carries between 1 and %(max)s items, so %(value)s is not a size Gophenberg takes. Pick a number inside that range.":["Un listado muestra entre 1 y %(max)s elementos, así que %(value)s no es un tamaño que Gophenberg acepte. Elige un número dentro de ese rango."],"A relation field has to say which content type it points at. Pick that type and try again.":["Un campo de relación tiene que indicar a qué tipo de contenido apunta. Elige ese tipo e inténtalo de nuevo."],"A reload shows the admin in the language you chose.":["Al recargar verás el panel de administración en el idioma que has elegido."],"A route word has to start with a lowercase letter and then hold only lowercase letters, numbers and hyphens. Change it and try again.":["La palabra de ruta de la URL tiene que empezar por una letra minúscula y contener solo letras minúsculas, números y guiones. Cámbiala e inténtalo de nuevo."],"A row of %(field)s has to name the layout it takes. Pick a layout for the row, or remove the row.":["Una fila de %(field)s tiene que nombrar el diseño que toma. Elige un diseño para la fila, o quita la fila."],"A row of %(field)s takes one layout and no more. Reload the page and build the row again.":["Una fila de %(field)s toma un solo diseño. Recarga la página y crea la fila otra vez."],"A rule matching any %(source)s cannot be turned into an exclusion. Leave it as is, or name the ones to leave out instead.":["Una regla que vale para cualquier %(source)s no se puede convertir en exclusión. Déjala como está, o nombra los que quieras dejar fuera."],"A theme naming its own page size uses that instead.":["Un tema que indica su propio tamaño de página usa ese en su lugar."],"A type key has to start with a lowercase letter and then hold only lowercase letters, numbers and hyphens. Change the key and try again.":["La clave de un tipo tiene que empezar por una letra minúscula y contener solo letras minúsculas, números y guiones. Cambia la clave e inténtalo de nuevo."],"Actions":["Acciones"],"Activate":["Activar"],"Activate %(theme)s":["Activar %(theme)s"],"Active":["Activo"],"Add":["Añadir"],"Add %(layout)s":["Añadir %(layout)s"],"Add %(name)s":["Añadir %(name)s"],"Add %(type)s":["Añadir %(type)s"],"Add Category":["Añadir categoría"],"Add Content Type":["Añadir tipo de contenido"],"Add Field Group":["Añadir grupo de campos"],"Add Media File":["Añadir medios"],"Add Page":["Añadir página"],"Add Post":["Añadir entrada"],"Add User":["Añadir usuario"],"Add block":["Añadir bloque"],"Add choice":["Añadir opción"],"Add condition":["Añadir condición"],"Add field":["Añadir campo"],"Add field to %(field)s":["Añadir campo a %(field)s"],"Add layout":["Añadir diseño"],"Add layout to %(field)s":["Añadir diseño a %(field)s"],"Add one with %(button)s.":["Añade un elemento con %(button)s."],"Add row":["Añadir fila"],"Add rule set":["Añadir conjunto de reglas"],"Add title":["Añadir título"],"Add to %(field)s":["Añadir a %(field)s"],"Address":["Dirección"],"Address updated.":["Dirección actualizada."],"Adopt":["Adoptar"],"Allow custom":["Permitir valores propios"],"Allow empty":["Permitir vacío"],"Alt text":["Texto alternativo"],"An item cannot point at itself. Pick a different item for %(field)s.":["Un elemento no puede apuntarse a sí mismo. Elige otro elemento para %(field)s."],"An item cannot sit inside itself, or inside one of the items nested under it. Pick a parent outside this branch.":["Un elemento no puede estar dentro de sí mismo, ni dentro de otro anidado bajo él. Elige un nivel superior fuera de esta rama."],"Another account wrote this, and only its author, an editor or an administrator may change it. You can still read it.":["Otra cuenta escribió esto, y solo su autor, un editor o un administrador pueden cambiarlo. Todavía puedes leerlo."],"Another account wrote this, so you are reading it rather than editing it.":["Otra cuenta escribió esto, así que lo estás leyendo, no editando."],"Another content type already answers under this route word. Pick a different word.":["Ya hay otro tipo de contenido que responde con esta palabra de ruta de URL. Elige una palabra distinta."],"Another content type already lives at the root of your site, and only one can. Give this type a route word, or hand the root over with Make default.":["Ya hay otro tipo de contenido en la raíz de tu sitio, y solo puede haber uno. Dale a este tipo de contenido una palabra de ruta de URL, o cede la raíz con Establecer como predeterminado."],"Another content type already uses this key. Give this type a different name.":["Ya hay otro tipo de contenido que usa esta clave. Dale a este tipo un nombre distinto."],"Another item of this content type already uses that address. Pick a different slug and save again.":["Ya hay otro elemento de este tipo de contenido que usa esa dirección. Elige un slug distinto y guarda de nuevo."],"Another update is currently in progress.":["En este momento hay otra actualización en marcha."],"Appears on":["Aparece en"],"Apply":["Aplicar"],"April":["abril"],"Are you sure you want to move \"%s\" to the trash?":["¿Seguro que quieres mover «%s» a la papelera?"],"Audio":["Audio"],"August":["agosto"],"Author":["Autor"],"Back to %(type)s":["Volver a %(type)s"],"Back to the latest posts":["Volver a las últimas entradas"],"Block":["Bloque"],"Broken":["Roto"],"Bundles of fields, shown where their rules place them.":["Conjuntos de campos, mostrados donde sus reglas los colocan."],"Button group":["Grupo de botones"],"Cancel":["Cancelar"],"Caption":["Leyenda"],"Change %(name)s":["Cambiar %(name)s"],"Change address":["Cambiar la dirección"],"Change address…":["Cambiar la dirección…"],"Change role":["Cambiar el rol"],"Change the role of %(name)s":["Cambiar el rol de %(name)s"],"Checkbox group":["Grupo de casillas"],"Choices":["Opciones"],"Choose %(field)s":["Elegir %(field)s"],"Choose how the site serves its content.":["Elige cómo el sitio sirve su contenido."],"Choose the language the admin reads in.":["Elige el idioma en el que se lee el panel de administración."],"Choose the role of %(name)s.":["Elige el rol de %(name)s."],"Choose the version to update to.":["Elige la versión a la que actualizar."],"Clear %(field)s":["Vaciar %(field)s"],"Close":["Cerrar"],"Close Settings":["Cerrar ajustes"],"Closed":["Cerrado"],"Condition":["Condición"],"Content":["Contenido"],"Content Types":["Tipos de contenido"],"Content nests at most %(max)s levels deep, and this item would sit deeper. Pick a parent closer to the top.":["El contenido se anida como mucho %(max)s niveles, y este elemento quedaría más abajo. Elige un nivel superior más cercano al inicio."],"Content type":["Tipo de contenido"],"Content type updated.":["Tipo de contenido actualizado."],"Could not delete that item.":["No se ha podido borrar ese elemento.","No se han podido borrar todos los elementos.","No se han podido borrar todos los elementos."],"Could not load that post.":["No se ha podido cargar esa entrada."],"Could not save that post.":["No se ha podido guardar esa entrada."],"Create":["Crear"],"Create a field group":["Crear un grupo de campos"],"Create user":["Crear usuario"],"Created":["Fecha de creación"],"Date added":["Fecha de subida"],"Deactivate":["Desactivar"],"Deactivate %(theme)s":["Desactivar %(theme)s"],"December":["diciembre"],"Default":["Por defecto"],"Default content type updated.":["Tipo de contenido predeterminado actualizado."],"Definitions file":["Archivo de definiciones"],"Delete":["Borrar"],"Delete \"%(title)s\" for good? This cannot be undone.":["¿Borrar permanentemente «%(title)s»? Esto no se puede deshacer."],"Delete %(field)s":["Borrar %(field)s"],"Delete %(group)s":["Eliminar %(group)s"],"Delete %(title)s for good? This cannot be undone.":["¿Borrar %(title)s para siempre? Esto no se puede deshacer."],"Delete %s content type for good? This cannot be undone.":["¿Borrar permanentemente %s tipo de contenido? Esto no se puede deshacer.","¿Borrar permanentemente %s de tipos de contenido? Esto no se puede deshacer.","¿Borrar permanentemente %s tipos de contenido? Esto no se puede deshacer."],"Delete %s item for good? This cannot be undone.":["¿Borrar permanentemente %s elemento? Esto no se puede deshacer.","¿Borrar permanentemente %s de elementos? Esto no se puede deshacer.","¿Borrar permanentemente %s elementos? Esto no se puede deshacer."],"Delete Permanently":["Borrar permanentemente"],"Delete the field":["Borrar el campo"],"Delete the group":["Eliminar el grupo"],"Delete this %(count)s item for good? This cannot be undone.":["¿Borrar este %(count)s elemento para siempre? Esto no se puede deshacer.","¿Borrar estos %(count)s elementos para siempre? Esto no se puede deshacer.","¿Borrar estos %(count)s elementos para siempre? Esto no se puede deshacer."],"Delete…":["Borrar…"],"Describe":["Describir"],"Describe…":["Describir…"],"Description":["Descripción"],"Description updated.":["Descripción actualizada."],"Desktop":["Escritorio"],"Destination":["Destino"],"Dimensions":["Dimensiones"],"Disable":["Desactivar"],"Disable %(name)s":["Desactivar a %(name)s"],"Disabled":["Desactivado"],"Dismiss":["Descartar"],"Document":["Documento"],"Done. The site now holds what the file describes.":["Hecho. El sitio ya tiene lo que describe el archivo."],"Draft saved.":["Borrador guardado."],"Drop files to upload":["Arrastra los archivos para subirlos"],"Email":["Correo electrónico"],"Empty Trash":["Vaciar papelera"],"Empty trash":["Vaciar papelera"],"Enable":["Activar"],"Enable %(name)s":["Activar a %(name)s"],"Every address of this type moves. Links kept elsewhere to the old addresses stop working.":["Cambian todas las direcciones de este tipo. Los enlaces guardados en otro sitio hacia las direcciones antiguas dejan de funcionar."],"Every content type":["Todos los tipos de contenido"],"Every field group needs a title. Give it a name and save again.":["Todo grupo de campos necesita un título. Ponle un nombre y guarda otra vez."],"Every item needs an author who exists. Pick one from the list and save again.":["Cada elemento necesita un autor que exista. Elige uno de la lista y guarda de nuevo."],"Every kind of content this site holds.":["Todos los tipos de contenido que hay en este sitio."],"Every value stored under this field goes with it, in every item the group reaches and in the revisions behind them.":["Todos los valores guardados en este campo se van con él, en cada elemento que el grupo alcanza y en las revisiones que hay detrás."],"Excerpt":["Extracto"],"Export definitions":["Exportar definiciones"],"February":["febrero"],"Fewest files":["Mínimo de archivos"],"Fewest rows":["Mínimo de filas"],"Field":["Campo"],"Field Groups":["Grupos de campos"],"Field group":["Grupo de campos"],"Fields":["Campos"],"Fields of %(group)s":["Campos de %(group)s"],"File name":["Nombre del archivo"],"File size":["Tamaño del archivo"],"File type":["Tipo de archivo"],"Files":["Archivos"],"Filter by status":["Filtrar por estado"],"Follow the browser":["Sigue al navegador"],"From %(plugin)s":["De %(plugin)s"],"Full Size":["Tamaño completo"],"Gophenberg cannot start this update: %(reason)s":["Gophenberg no puede empezar esta actualización: %(reason)s"],"Gophenberg checked for updates moments ago. Try again later.":["Gophenberg ha buscado actualizaciones hace un momento. Inténtalo de nuevo más tarde."],"Gophenberg could not read what your browser sent. Reload the page and try again, and tell whoever looks after your site if it keeps happening.":["Gophenberg no ha podido leer lo que ha enviado tu navegador. Recarga la página e inténtalo de nuevo, y avisa a quien gestiona tu sitio si sigue pasando."],"Gophenberg could not read which item you picked as parent. Reload the page and pick it again.":["Gophenberg no ha podido leer qué elemento has elegido como elemento superior. Recarga la página y vuelve a elegirlo."],"Gophenberg does not accept %(extension)s files. Upload a picture, a video, an audio file, a PDF or a zip instead.":["Gophenberg no acepta archivos %(extension)s. Sube una imagen, un vídeo, un audio, un PDF o un zip."],"Gophenberg does not answer in %(value)s. Pick one of the languages on the list.":["Gophenberg no responde en %(value)s. Elige uno de los idiomas de la lista."],"Gophenberg has no autosave of yours for this item. Open the item to see the version that is stored.":["Gophenberg no tiene ningún guardado automático tuyo de este elemento. Ábrelo para ver la versión guardada."],"Gophenberg holds no kind of definition called %(subject)s, so nothing was taken over. Reload the page so the admin and the server agree again.":["Gophenberg no tiene ninguna clase de definición llamada %(subject)s, así que no se ha adoptado nada. Recarga la página para que el admin y el servidor vuelvan a coincidir."],"Gophenberg keeps /%(path)s for itself or for another content type, so your content cannot answer there. Give the item a different slug.":["Gophenberg reserva la dirección /%(path)s para sí mismo o para otro tipo de contenido, así que tu contenido no puede usarla. Dale al elemento otro slug."],"Gophenberg keeps this word for itself, so no content type can answer under it. Pick a different route word.":["Gophenberg reserva esta palabra para sí mismo, así que ningún tipo de contenido puede usarla. Elige otra palabra de ruta de URL."],"Group":["Grupo"],"Highest":["Máximo"],"Holds":["Contiene"],"Images":["Imágenes"],"Import definitions":["Importar definiciones"],"In list":["En la lista"],"Inactive":["Inactivo"],"Installed":["Instalado"],"Instructions":["Instrucciones"],"It moves here from another group and keeps its stored values.":["Se mueve aquí desde otro grupo y conserva sus valores guardados."],"It moves to another group and keeps its stored values.":["Se mueve a otro grupo y conserva sus valores guardados."],"It moves to another group, so its stored values do not follow.":["Se mueve a otro grupo, así que sus valores guardados no le siguen."],"It reads a relation inside a container, and only an import can point it elsewhere.":["Lee una relación dentro de un contenedor, y solo una importación puede apuntarlo a otro sitio."],"It starts on %(type)s, and the rules may be edited afterwards.":["Empieza en %(type)s, y las reglas se pueden editar después."],"Items could not be loaded.":["No se han podido cargar los elementos."],"Its items sit inside one another, so it keeps nesting.":["Sus elementos están unos dentro de otros, así que sigue anidando."],"Its kind changed, so its stored values go with it.":["Su tipo ha cambiado, así que sus valores guardados se van con él."],"January":["enero"],"July":["julio"],"June":["junio"],"Keep %(field)s out of the list":["Dejar %(field)s fuera de la lista"],"Keep it":["Conservarlo"],"Keep it here":["Dejarlo aquí"],"Key":["Clave"],"Label":["Etiqueta"],"Language":["Idioma"],"Large":["Grande"],"Let items nest":["Permitir anidar"],"Linked from":["Enlazado desde"],"List view":["Vista de lista"],"Loading field groups.":["Cargando los grupos de campos."],"Loading the post.":["Cargando la entrada."],"Loading the screen.":["Cargando la pantalla."],"Loading themes.":["Cargando los temas."],"Loading users.":["Cargando los usuarios."],"Loading…":["Cargando…"],"Longest":["Largo máximo"],"Lowest":["Mínimo"],"Make %(field)s optional":["Hacer %(field)s opcional"],"Make default":["Establecer como predeterminado"],"Make default…":["Establecer como predeterminado…"],"Make optional":["Hacer opcional"],"Manage the categories on this site.":["Gestiona las categorías de este sitio."],"Manage the images and files this site holds.":["Gestiona las imágenes y los archivos que hay en este sitio."],"Manage the items of this content type.":["Gestiona los elementos de este tipo de contenido."],"Manage the pages on this site.":["Gestiona las páginas de este sitio."],"Manage the posts on this site.":["Gestiona las entradas de este sitio."],"Many targets":["Varios destinos"],"Many values":["Varios valores"],"March":["marzo"],"May":["mayo"],"Media %(id)s":["Medio %(id)s"],"Media Library":["Biblioteca de medios"],"Medium":["Mediano"],"Mobile":["Móvil"],"Modified: %s":["Modificado: %s"],"Most files":["Máximo de archivos"],"Most rows":["Máximo de filas"],"Move":["Mover"],"Move \"%(title)s\" to the trash?":["¿Mover «%(title)s» a la papelera?"],"Move %(field)s down":["Bajar %(field)s"],"Move %(field)s elsewhere":["Mover %(field)s a otro sitio"],"Move %(field)s up":["Subir %(field)s"],"Move %(group)s down":["Bajar %(group)s"],"Move %(group)s up":["Subir %(group)s"],"Move %(name)s down":["Bajar %(name)s"],"Move %(name)s up":["Subir %(name)s"],"Move %s item to the trash?":["¿Mover %s elemento a la papelera?","¿Mover %s de elementos a la papelera?","¿Mover %s elementos a la papelera?"],"Move every address":["Mover todas las direcciones"],"Move row down":["Bajar la fila"],"Move row up":["Subir la fila"],"Move the field":["Mover el campo"],"Move to trash":["Mover a la papelera"],"Name":["Nombre"],"Name updated.":["Nombre actualizado."],"Nests":["Anida"],"Newer posts":["Entradas más recientes"],"No":["No"],"No content types found.":["No se han encontrado tipos de contenido."],"No description":["Sin descripción"],"No file arrived with this upload. Choose a file and try again.":["No ha llegado ningún archivo con esta subida. Elige un archivo e inténtalo de nuevo."],"No items found.":["No se han encontrado elementos."],"No items yet.":["Todavía no hay elementos."],"No media chosen":["Ningún medio elegido"],"No media has been uploaded yet.":["Todavía no se ha subido ningún medio."],"No media items found.":["No se han encontrado archivos de medios."],"No media items yet.":["Todavía no hay archivos de medios."],"No page lives at this address.":["No existe ninguna página en esta dirección."],"No parent":["Sin elemento superior"],"No theme arrived with this upload. Choose a zip file and try again.":["No ha llegado ningún tema con esta subida. Elige un archivo zip e inténtalo de nuevo."],"No themes are installed.":["No hay ningún tema instalado."],"No title":["Sin título"],"None":["Ninguno"],"Not %(type)s":["Excepto %(type)s"],"Not found":["No encontrado"],"Not serving":["No está sirviendo"],"Nothing declares that role.":["Nada declara ese rol."],"Nothing points here yet.":["Todavía no apunta nada aquí."],"Nothing published here yet.":["Todavía no hay nada publicado aquí."],"Nothing published yet.":["Todavía no hay nada publicado."],"November":["noviembre"],"Nowhere":["En ningún sitio"],"Number":["Número"],"October":["octubre"],"Older posts":["Entradas anteriores"],"One frame of this animation holds more than %(max)s pixels, which is more than Gophenberg opens. Upload a smaller animation.":["Un fotograma de esta animación tiene más de %(max)s píxeles, más de lo que Gophenberg abre. Sube una animación más pequeña."],"One of the filters on this list is not one Gophenberg understands. Clear the filters and try again.":["Uno de los filtros de esta lista no es un filtro que Gophenberg entienda. Quita los filtros e inténtalo de nuevo."],"One of the items picked for %(field)s is not the kind of content that field points at. Reload the page and pick from the list the field offers.":["Uno de los elementos elegidos para %(field)s no es del tipo de contenido al que apunta ese campo. Recarga la página y elige de la lista que ofrece el campo."],"One of the items picked for %(field)s was not named in a way Gophenberg understands. Reload the page and pick the items again.":["Uno de los elementos elegidos para %(field)s no venía nombrado de una forma que Gophenberg entienda. Recarga la página y vuelve a elegir los elementos."],"One of the items picked no longer exists. Reload the page and pick again.":["Uno de los elementos elegidos ya no existe. Recarga la página y vuelve a elegir."],"One target":["Un destino"],"Only a relation field points at another content type or holds many items. Pick the Relation kind, or leave the target and the many option empty.":["Solo un campo de relación apunta a otro tipo de contenido o guarda varios elementos. Elige el tipo Relación, o deja vacío el destino y la opción de varios."],"Only one file may be placed here.":["Aquí solo se puede colocar un archivo."],"Only the content type at the root of your site may go without a route word. Give this type one and try again.":["Solo el tipo de contenido que está en la raíz de tu sitio puede ir sin palabra de ruta de URL. Dale una a este tipo e inténtalo de nuevo."],"Open %(field)s in a new tab":["Abrir %(field)s en una pestaña nueva"],"Order stored.":["Orden guardado."],"Other":["Otro"],"Out of list":["Fuera de la lista"],"Parent":["Elemento superior"],"Password":["Contraseña"],"Pending":["Pendiente"],"Pending Review":["Pendiente de revisión"],"Permanently delete":["Borrar permanentemente"],"Permanently delete…":["Borrar permanentemente…"],"Picture quality":["Calidad de imagen"],"Picture quality runs from 1 to %(max)s, so %(value)s is not a quality Gophenberg stores at. Pick a number inside that range.":["La calidad de imagen va de 1 a %(max)s, así que %(value)s no es una calidad con la que Gophenberg guarde. Elige un número dentro de ese rango."],"Placeholder":["Texto de ejemplo"],"Plural name":["Nombre en plural"],"Points at":["Apunta a"],"Post published.":["Entrada publicada."],"Posts per page":["Entradas por página"],"Preview":["Vista previa"],"Private":["Privada"],"Publish":["Publicar"],"Published: %s":["Publicado: %s"],"Radio group":["Grupo de botones de radio"],"Reads from":["Lee de"],"Redo":["Rehacer"],"Relation":["Relación"],"Remove":["Quitar"],"Remove %(name)s":["Quitar %(name)s"],"Remove %(title)s":["Quitar %(title)s"],"Remove row":["Quitar fila"],"Rename":["Renombrar"],"Rename %(field)s":["Renombrar %(field)s"],"Rename…":["Renombrar…"],"Require":["Hacer obligatorio"],"Require %(field)s":["Hacer %(field)s obligatorio"],"Required":["Obligatorio"],"Restore":["Restaurar"],"Role changed.":["Rol cambiado."],"Roll back to %(theme)s":["Revertir a %(theme)s"],"Roll back to the built-in renderer":["Revertir al renderizador integrado"],"Route word":["Palabra de ruta"],"Rule %(number)s of set %(set)s":["Regla %(number)s del conjunto %(set)s"],"Rule set %(number)s":["Conjunto de reglas %(number)s"],"Rules":["Reglas"],"Rules showing %(field)s":["Reglas que muestran %(field)s"],"Save":["Guardar"],"Save draft":["Guardar el borrador"],"Save rules":["Guardar las reglas"],"Save settings":["Guardar los ajustes"],"Saved":["Guardado"],"Saving":["Guardando"],"Scheduled":["Programada"],"Scheduled: %s":["Programado: %s"],"Search %(type)s…":["Buscar %(type)s…"],"Search audio":["Buscar audios"],"Search images":["Buscar imágenes"],"Search media":["Buscar medios"],"Search videos":["Buscar vídeos"],"Select":["Seleccionar"],"September":["septiembre"],"Serving":["Atendiendo"],"Settings":["Ajustes"],"Settings of %(field)s":["Ajustes de %(field)s"],"Shadowed":["Eclipsado"],"Show %(field)s in the list":["Mostrar %(field)s en la lista"],"Showing %(held)s of %(total)s.":["Mostrando %(held)s de %(total)s."],"Singular name":["Nombre en singular"],"Slug":["Slug"],"Somebody must be able to manage users.":["Alguien tiene que poder gestionar los usuarios."],"Someone else changed this media item while you were editing it. Reload the page and make your change again.":["Otra persona ha cambiado este medio mientras lo editabas. Recarga la página y vuelve a hacer tu cambio."],"Someone else saved changes to this item while you were editing, so yours were not saved. Copy your text somewhere safe, then reload the item and put your changes back in.":["Otra persona ha guardado cambios en este elemento mientras editabas, así que los tuyos no se han guardado. Copia tu texto a un lugar seguro, recarga el elemento y vuelve a colocarlos de vuelta."],"Something went wrong inside Gophenberg. Try again in a moment, and tell whoever looks after your site if it keeps happening.":["Algo ha fallado dentro de Gophenberg. Inténtalo de nuevo en un momento, y avisa a quien gestione tu sitio si sigue pasando."],"Something went wrong.":["Algo ha ido mal."],"Something went wrong. Try again.":["Algo ha ido mal. Inténtalo de nuevo."],"Sorry, you are not allowed to access this page.":["Lo siento, no tienes permisos para acceder a esta página."],"Source":["Origen"],"Steps of":["Pasos de"],"Stop nesting":["Dejar de anidar"],"Tablet":["Tableta"],"Text":["Texto"],"Text area":["Área de texto"],"That email is already in use.":["Ese correo electrónico ya está en uso."],"That field group no longer exists. Reload the page to see the groups your site holds now.":["Ese grupo de campos ya no existe. Recarga la página para ver los grupos que tiene ahora tu sitio."],"That field is not on this content type any more. Reload the page to see the fields it has now.":["Ese campo ya no está en este tipo de contenido. Recarga la página para ver los campos que tiene ahora."],"That revision does not exist, and older ones drop off once a type holds more than it keeps. Open the item to see which revisions are left.":["Esa revisión no existe, y las más antiguas se pierden cuando un tipo guarda más de las que conserva. Abre el elemento para ver qué revisiones quedan."],"That role holds more than your own.":["Ese rol abarca más que el tuyo."],"That web address does not name a media item Gophenberg can look up. Open the media library and pick the item from there.":["Esa dirección web no nombra ningún medio que Gophenberg pueda encontrar. Abre la biblioteca de medios y elige el elemento desde ahí."],"That web address does not name a revision Gophenberg can look up. Open the item and pick a revision from its history.":["Esa dirección web no alude a ninguna revisión que Gophenberg pueda identificar. Abre el elemento y elige una revisión de su historial."],"That web address does not name an item Gophenberg can look up. Go back to the list and open the item from there.":["Esa dirección web no alude a ningún elemento que Gophenberg pueda identificar. Vuelve a la lista y abre el elemento desde ahí."],"The %(count)s item in the trash is deleted for good. This cannot be undone.":["%(count)s elemento de la papelera se borrará permanentemente. Esto no se puede deshacer.","%(count)s de elementos de la papelera se borrarán permanentemente. Esto no se puede deshacer.","Los %(count)s elementos de la papelera se borrarán permanentemente. Esto no se puede deshacer."],"The %(file)s calls this theme %(declared)s, but it is being installed as %(installed)s. Rename the zip file to match, or change the name inside %(file)s.":["El archivo %(file)s llama a este tema %(declared)s, pero se está instalando como %(installed)s. Renombra el zip para que coincida, o cambia el nombre dentro de %(file)s."],"The %(file)s inside %(name)s is not valid JSON, so it could not be read. Fix that file and package the theme again.":["El archivo %(file)s dentro de %(name)s no es JSON válido, así que no se ha podido leer. Corrige ese archivo y vuelve a empaquetar el tema."],"The %(file)s inside %(name)s names its theme kit as %(declared)s, which is not a version number. Build the theme again, and the build will fill that in.":["El %(file)s dentro de %(name)s identifica su kit de temas como %(declared)s, que no srive como número de versión. Compila el tema de nuevo y la compilación lo rellenará."],"The %(origin)s plugin declared this, so it can only be changed in that plugin. Turning it off is still yours to do.":["El plugin %(origin)s lo declaró, así que solo se puede cambiar en ese plugin. Desactivarlo sigue estando en tu mano."],"The %(plugin)s plugin also declares %(name)s, and the site keeps the key.":["El plugin %(plugin)s también declara %(name)s, y el sitio se queda con la clave."],"The %(plugin)s plugin declared these fields, so they change only in its code.":["El plugin %(plugin)s declaró estos campos, así que solo cambian en su código."],"The %(plugin)s plugin declares %(name)s flat, and the site keeps it nesting while its items sit inside another.":["El plugin %(plugin)s declara %(name)s sin anidar, y el sitio lo mantiene anidando mientras sus elementos están dentro de otro."],"The browser kept an unsaved version of this post.":["El navegador ha guardado una versión sin guardar de esta entrada."],"The built-in renderer is now serving the public site.":["El renderizador integrado ya presta servicio al sitio público."],"The built-in renderer is serving the public site.":["El renderizador integrado presta servicio al sitio público."],"The content type this field points at is not named in a shape Gophenberg accepts. Give it a key that starts with a lowercase letter and then holds only lowercase letters, numbers and hyphens.":["El tipo de contenido al que apunta este campo no está nombrado con un formato que Gophenberg acepte. Dale una clave que empiece por una letra minúscula y contenga solo letras minúsculas, números y guiones."],"The content types could not be loaded, so where these groups appear and which fields they shadow are not shown.":["No se han podido cargar los tipos de contenido, así que no se muestra dónde aparecen estos grupos ni qué campos eclipsan."],"The content types could not be loaded.":["No se han podido cargar los tipos de contenido."],"The content types could not be refreshed, so where these groups appear and what they shadow may be out of date.":["No se han podido actualizar los tipos de contenido, así que dónde aparecen estos grupos y qué eclipsan puede estar desactualizado."],"The draft could not be created.":["No se ha podido crear el borrador."],"The entry %(entry)s in this zip would be written outside the theme folder, so nothing was installed. Package the theme again.":["La entrada %(entry)s de este zip se escribiría fuera de la carpeta del tema, así que no se ha instalado nada. Vuelve a empaquetar el tema."],"The field %(field)s cannot go, because %(by)s reads it. Change %(by)s first.":["El campo %(field)s no se puede quitar, porque %(by)s lo lee. Cambia antes %(by)s."],"The field %(field)s cannot hold the value it was given. Check what kind of field it is and enter a value that matches.":["El campo %(field)s no puede guardar el valor que se le ha dado. Comprueba de qué tipo de campo se trata e introduce un valor que encaje."],"The field %(field)s has to hold a value before this item can be published. Fill it in, or leave the item as a draft.":["El campo %(field)s tiene que tener un valor antes de poder publicar este elemento. Rellénalo, o deja el elemento como borrador."],"The field %(field)s in %(group)s still points at this content type. Delete that field first, then delete this type.":["El campo %(field)s de %(group)s todavía apunta a este tipo de contenido. Borra antes ese campo y luego borra este tipo."],"The field %(field)s is hidden by its own rules right now, so it cannot hold a value. Show it again before filling it in.":["El campo %(field)s está oculto por sus propias reglas ahora mismo, así que no puede guardar ningún valor. Vuelve a mostrarlo antes de rellenarlo."],"The field %(field)s points at one item only. Remove the extra choices and keep one.":["El campo %(field)s apunta a un solo elemento. Quita las opciones de más y deja una."],"The field %(field)s points at other items, so it does not take a plain value. Pick the items it points at instead.":["El campo %(field)s apunta a otros elementos, así que no admite un valor suelto. Elige en su lugar los elementos a los que apunta."],"The field %(field)s takes a list of items, and what arrived was not a list. Reload the page and pick the items again.":["El campo %(field)s admite una lista de elementos, y lo que ha llegado no era una lista. Recarga la página y vuelve a elegir los elementos."],"The field %(source)s cannot hold the value %(value)s, so no rule can compare it. Write a value of the kind %(source)s stores.":["El campo %(source)s no puede guardar el valor %(value)s, así que ninguna regla puede compararlo. Escribe un valor de la clase que %(source)s guarda."],"The field groups could not be loaded.":["No se han podido cargar los grupos de campos."],"The field groups could not be reached.":["No se ha podido contactar con los grupos de campos."],"The field keeps its values on the content both groups reach.":["El campo conserva sus valores en el contenido al que llegan ambos grupos."],"The fields this group holds go with it, and so do the values every item stored in them.":["Los campos que contiene este grupo se van con él, y también los valores que cada elemento guardó en ellos."],"The groups were reordered.":["Los grupos se han reordenado."],"The item could not be duplicated.":["No se ha podido duplicar el elemento."],"The item could not be moved to the trash.":["No se ha podido mover el elemento a la papelera."],"The item could not be permanently deleted.":["No se ha podido borrar permanentemente el elemento."],"The item could not be restored.":["No se ha podido restaurar el elemento."],"The item you picked as parent holds another kind of content. Pick a parent of the same content type as this item.":["El elemento que has elegido como superior tiene otro tipo de contenido. Elige un elemento superior del mismo tipo de contenido que este elemento."],"The item you picked as parent is in the trash. Restore it, or pick another parent.":["El elemento que has elegido como superior está en la papelera. Restáuralo, o elige otro elemento superior."],"The item you picked as parent no longer exists. Reload the page and pick another parent.":["El elemento que has elegido como superior ya no existe. Recarga la página y elige otro."],"The media library could not be loaded.":["No se ha podido cargar la biblioteca de medios."],"The name changes. Nothing stored under this field moves.":["El nombre cambia. Nada de lo guardado en este campo se mueve."],"The name could not be updated.":["No se ha podido actualizar el nombre."],"The new order has to name every field group exactly once. Reload the page and move the groups again.":["El nuevo orden tiene que nombrar cada grupo de campos exactamente una vez. Recarga la página y mueve los grupos otra vez."],"The new order has to name every field of this content type exactly once. Reload the page and move the fields again.":["El nuevo orden tiene que nombrar cada campo de este tipo de contenido exactamente una vez. Recarga la página y mueve los campos de nuevo."],"The number of revisions to keep has to be a whole number, and it cannot be negative. Enter a different number.":["El número de revisiones que se conservan tiene que ser un número entero, y no puede ser negativo. Introduce otro número."],"The registry could not be reached.":["No se ha podido acceder al registro."],"The role could not be changed.":["No se ha podido cambiar el rol."],"The rule on %(source)s names nothing to match. Pick a value, or remove the rule.":["La regla sobre %(source)s no nombra nada con lo que coincidir. Elige un valor, o quita la regla."],"The rules could not be loaded.":["No se han podido cargar las reglas."],"The rules on %(field)s lead back to %(field)s itself, so nothing can decide whether to show it. Point one of them at another field.":["Las reglas de %(field)s vuelven al propio %(field)s, así que nada puede decidir si mostrarlo. Apunta una de ellas a otro campo."],"The same item was picked twice for %(field)s. Pick each item once.":["El mismo elemento se ha elegido dos veces para %(field)s. Elige cada elemento una sola vez."],"The server could not be reached, so nothing was changed.":["No se ha podido acceder al servidor, así que no se ha cambiado nada."],"The server could not be reached, so nothing was saved.":["No se ha podido acceder al servidor, así que no se ha guardado nada."],"The server could not be reached, so nothing was uploaded.":["No se ha podido acceder al servidor, así que no se ha subido nada."],"The setting %(setting)s cannot hold the value it was given. Check what this setting takes and try again.":["El ajuste %(setting)s no puede contener el valor que se le dio. Comprueba qué acepta este ajuste y prueba de nuevo."],"The setting %(setting)s falls outside the others. Keep min below max and the default inside the bounds.":["El ajuste %(setting)s queda fuera de los demás. Mantén min por debajo de max y el valor por defecto dentro de los límites."],"The settings could not be read, so nothing can be changed here yet.":["No se han podido leer los ajustes, así que todavía no se puede cambiar nada aquí."],"The site default":["El idioma por defecto del sitio"],"The site may already hold part of this file. Import it again to see what is left.":["Puede que el sitio ya tenga parte de este archivo. Impórtalo de nuevo para ver lo que queda."],"The source %(source)s does not offer %(operator)s. Pick one of the comparisons it does offer.":["La fuente %(source)s no ofrece %(operator)s. Elige una de las comparaciones que sí ofrece."],"The theme %(name)s carries no %(file)s, so Gophenberg cannot tell what it is. Put that file at the top level of the zip and package the theme again.":["El tema %(name)s no lleva ningún %(file)s, así que Gophenberg no puede saber qué es. Pon ese archivo en el primer nivel del zip y vuelve a empaquetar el tema."],"The theme %(name)s could not be read, so it cannot serve your site. Upload it again, or choose another theme.":["El tema %(name)s no se ha podido leer, así que no puede servir tu sitio. Vuelve a subirlo, o elige otro tema."],"The theme %(name)s did not start, so your site is still served by the theme it had. Ask whoever looks after your site to check the server log for what the theme reported.":["El tema %(name)s no ha arrancado, así que tu sitio lo sigue sirviendo el tema que tenía. Pide a quien gestiona tu sitio que mire en el registro del servidor para saber qué problema ha informado el tema."],"The theme %(name)s does not carry %(path)s as a file, so there is nothing to run. Package the built theme rather than its source.":["El tema %(name)s no lleva %(path)s como archivo, así que no hay nada que ejecutar. Empaqueta el tema ya construido, no su código fuente."],"The theme %(name)s does not carry %(path)s as a folder, so its styles and scripts are missing. Package the built theme rather than its source.":["El tema %(name)s no lleva %(path)s como carpeta, así que le faltan los estilos y los scripts. Empaqueta el tema ya construido, no su código fuente."],"The theme %(name)s holds a link to another file at %(path)s, and a theme may only carry real files. Replace it and package the theme again.":["El tema %(name)s lleva un enlace a otro archivo en %(path)s, y un tema solo puede llevar archivos de verdad. Sustitúyelo y vuelve a empaquetar el tema."],"The theme %(name)s is serving your site right now, so it cannot be replaced. Deactivate it first, or install this copy under another name.":["El tema %(name)s sirve tu sitio ahora mismo, así que no se puede sustituir. Desactívalo primero, o instala esta copia con otro nombre."],"The theme %(name)s is the one chosen, but it is not installed, so your site is served by the built-in renderer. Upload the theme again, or choose another one.":["El tema %(name)s es el elegido, pero no está instalado, así que el renderizador integrado está prestando servicio a tu sitio. Vuelve a subir el tema, o elige otro."],"The theme %(name)s was built on theme kit %(declared)s, and this site serves %(served)s. Build the theme again against a kit this site serves, then install it.":["El tema %(name)s se compiló con el kit de temas %(declared)s y este sitio sirve %(served)s. Compila el tema de nuevo con un kit que este sitio sirva y después instálalo."],"The trash could not be emptied.":["No se ha podido vaciar la papelera."],"The user could not be created.":["No se ha podido crear el usuario."],"The values stored under it do not follow.":["Los valores guardados debajo no le siguen."],"Theme":["Tema"],"Themes":["Temas"],"Themes could not be loaded.":["No se han podido cargar los temas."],"There is no content type called %(value)s. Pick a type your site holds, or register it first.":["No existe ningún tipo de contenido llamado %(value)s. Elige un tipo que tenga tu sitio, o regístralo primero."],"There is no content type called %(value)s. Pick one of the types your site holds and try again.":["No existe ningún tipo de contenido llamado %(value)s. Elige uno de los tipos que tiene tu sitio e inténtalo de nuevo."],"There is no kind of field called %(value)s. Pick one of these instead: %(allowed)s.":["No existe ningún tipo de campo llamado %(value)s. Elige uno de estos: %(allowed)s."],"There is no page kind called %(value)s. Pick one of these instead: %(allowed)s.":["No existe ningún tipo de página llamado %(value)s. Elige uno de estos: %(allowed)s."],"There is no status called %(value)s. Pick one of these instead: %(allowed)s.":["No existe ningún estado llamado %(value)s. Elige uno de estos: %(allowed)s."],"There is nothing at this address. Check the link and try again.":["No hay nada en esta dirección. Comprueba el enlace e inténtalo de nuevo."],"There is nothing to roll back to, because your site has not been through a theme change yet. Install a theme first, then a rollback has somewhere to go.":["No hay nada a lo que retornar, porque tu sitio todavía no ha cambiado de tema. Instala un tema primero y así el retorno tendrá adónde ir."],"These files could not be read.":["No se han podido leer estos archivos."],"These were left alone, because nobody confirmed losing them.":["Estos se han dejado como estaban, porque nadie confirmó perderlos."],"This content type does not exist any more. Reload the page to see the types your site holds now.":["Este tipo de contenido ya no existe. Recarga la página para ver los tipos que tiene ahora tu sitio."],"This content type does not nest, so one of its items cannot sit inside another. Mark the type as Nests first.":["Este tipo de contenido no anida, así que uno de sus elementos no puede estar dentro de otro. Marca el tipo como Anida primero."],"This content type has no field called %(field)s. Check the name, or declare the field on the type first.":["Este tipo de contenido no tiene ningún campo llamado %(field)s. Comprueba el nombre, o declara antes el campo en el tipo."],"This content type is turned off, so its content is not served or edited. Activate it first.":["Este tipo de contenido está desactivado, así que su contenido ni se sirve ni se edita. Actívalo primero."],"This content type still holds content, so it cannot be deleted. Move or delete its items first.":["Este tipo de contenido todavía tiene contenido, así que no se puede borrar. Mueve o borra antes sus elementos."],"This definitions file is larger than the %(max)s bytes Gophenberg reads in one request. Split it, or raise the limit your site runs with.":["Este archivo de definiciones es mayor que los %(max)s bytes que Gophenberg lee en una petición. Divídelo, o sube el límite con el que funciona tu sitio."],"This field holds no layouts yet.":["Este campo todavía no tiene diseños."],"This field would stand inside too many containers. Put it nearer the top and try again.":["Este campo quedaría dentro de demasiados contenedores. Ponlo más cerca del nivel superior e inténtalo de nuevo."],"This file could not be opened as a zip. Package the theme again and upload the new file.":["Este archivo no se ha podido abrir como zip. Vuelve a empaquetar el tema y sube el archivo nuevo."],"This file is larger than the upload limit. Upload a smaller file.":["Este archivo es más grande que el límite de subida. Sube un archivo más pequeño."],"This file is named %(extension)s but it holds %(detected)s content. Upload it under a name that matches what is inside it.":["Este archivo se llama %(extension)s pero lleva contenido %(detected)s. Súbelo con un nombre que coincida con lo que lleva dentro."],"This file matches the site, so there is nothing to change.":["Este archivo coincide con el sitio, así que no hay nada que cambiar."],"This file says it was written in format %(declared)s, which is not a version Gophenberg can read. Export the definitions again from the site they came from.":["Este archivo dice estar escrito en el formato %(declared)s, que no es una versión que Gophenberg pueda leer. Vuelve a exportar las definiciones desde el sitio del que vinieron."],"This file was written in format %(declared)s, and this release reads %(served)s. Upgrade the site the file came from, or this one.":["Este archivo está escrito en el formato %(declared)s, y esta versión lee %(served)s. Actualiza el sitio del que viene el archivo, o este."],"This group holds no fields yet.":["Este grupo todavía no tiene campos."],"This install of Gophenberg has no install root, so it updates by hand.":["Esta instalación de Gophenberg no tiene raíz de instalación, así que se actualiza a mano."],"This is a custom build of Gophenberg, so it updates by hand.":["Esta es una compilación propia de Gophenberg, así que se actualiza a mano."],"This item cannot go straight to that status from the one it holds now. Save it as a draft first, then try again.":["Este elemento no puede pasar directamente a ese estado desde el que tiene ahora. Guárdalo antes como borrador e inténtalo de nuevo."],"This item changed while you were describing it. Reload and try again.":["Este elemento ha cambiado mientras lo describías. Recarga e inténtalo de nuevo."],"This item does not exist, and it may have been deleted. Go back to the list to see what is there.":["Este elemento no existe, y puede que se haya borrado. Vuelve a la lista para ver qué hay."],"This item is already in the trash. Restore it first to work on it again.":["Este elemento ya está en la papelera. Restáuralo primero para volver a trabajar en él."],"This item is in the trash. Restore it first to work on it again.":["Este elemento está en la papelera. Restáuralo primero para volver a trabajar en él."],"This item is not in the trash, so there is nothing to restore. Open it from the list to work on it as it is.":["Este elemento no está en la papelera, así que no hay nada que restaurar. Ábrelo desde la lista para trabajar en él tal como está."],"This item still holds items nested inside it. Move or delete those first.":["Este elemento todavía tiene elementos anidados dentro. Mueve o borra antes esos."],"This kind of field holds no fields inside it. Put the field in a section or a repeater instead.":["Este tipo de campo no contiene campos dentro. Pon el campo en una sección o en un repetidor."],"This media item is not in the library, and someone may have deleted it. Reload the page to see what is there now.":["Este medio no está en la biblioteca, y puede que alguien lo haya borrado. Recarga la página para ver qué hay ahora."],"This picture could not be read, so nothing was stored. The file may be damaged, so open it on your computer and upload it again.":["Esta imagen no se ha podido leer, así que no se ha guardado nada. Puede que el archivo esté dañado, así que ábrelo en tu ordenador y vuelve a subirlo."],"This picture is %(width)s by %(height)s pixels, over the limit of %(max)s pixels in all. Make it smaller and upload it again.":["Esta imagen tiene %(width)s por %(height)s píxeles, por encima del límite de %(max)s píxeles en total. Hazla más pequeña y vuelve a subirla."],"This post changed elsewhere. Reload before saving again.":["Esta entrada ha cambiado en otro sitio. Recarga antes de volver a guardar."],"This request came from a page on another site, so it was refused. Open the admin on this site and try again.":["Esta petición vino de una página de otro sitio, así que se rechazó. Abre la administración en este sitio e inténtalo de nuevo."],"This request carried %(attribute)s, which fields do not take. Reload the page so the admin and the server agree again.":["Esta petición llevaba %(attribute)s, que los campos no aceptan. Recarga la página para que la administración y el servidor vuelvan a coincidir."],"This request left out %(field)s, which Gophenberg needs. Reload the page and try again.":["En esta petición faltaba %(field)s, que Gophenberg necesita. Recarga la página e inténtalo de nuevo."],"This rule reads a source called %(source)s, and nothing on your site declares one. A plugin that added it may have been removed.":["Esta regla lee una fuente llamada %(source)s, y nada en tu sitio declara ninguna. Puede que se haya quitado un plugin que la añadía."],"This site cannot write to its themes folder, so no theme can be installed. Ask whoever looks after your site to make the folder that %(setting)s points at writable. A read-only mount is the usual cause.":["Este sitio no puede escribir en su carpeta de temas, así que no se puede instalar ninguno. Pide a quien gestione tu sitio que haga escribible la carpeta a la que apunta %(setting)s. La causa habitual es un montaje de solo lectura."],"This site has nowhere to keep themes, so no theme can be installed. Ask whoever looks after your site to point %(setting)s at a folder the server can write to.":["Este sitio no tiene dónde guardar los temas, así que no se puede instalar ninguno. Pide a quien gestione tu sitio que apunte %(setting)s a una carpeta en la que el servidor pueda escribir."],"This site has nowhere to store uploads, so nothing can be uploaded. Ask whoever looks after your site to point %(setting)s at a folder the server can write to.":["Este sitio no tiene dónde guardar las subidas, así que no se puede subir nada. Pide a quien gestione tu sitio que apunte %(setting)s a una carpeta en la que el servidor pueda escribir."],"This theme is over the limit of %(max)s bytes, packed or unpacked. Leave out what the theme does not need and package it again.":["Este tema pasa del límite de %(max)s bytes, comprimido o sin comprimir. Saca lo que el tema no necesite y vuelve a empaquetarlo."],"This type will answer under /%(word)s.":["Este tipo responderá como /%(word)s."],"This zip holds %(entries)s files, more than the %(max)s a theme may carry. Package only the built theme.":["Este zip lleva %(entries)s archivos, más de los %(max)s que puede llevar un tema. Empaqueta solo el tema ya construido."],"Through":["A través de"],"Thumbnail":["Miniatura"],"Title":["Título"],"Two field groups in this file share the key %(key)s. Give one of them a different key and import again.":["Dos grupos de campos de este archivo comparten la clave %(key)s. Dale una clave distinta a uno de ellos e importa de nuevo."],"Two rule sources are registered under the name %(param)s. A plugin is declaring a source your site already holds.":["Hay dos fuentes de reglas registradas con el nombre %(param)s. Un plugin declara una fuente que tu sitio ya tiene."],"Type":["Tipo"],"Type a whole number in both boxes before saving.":["Escribe un número entero en las dos casillas antes de guardar."],"Undo":["Deshacer"],"Unsaved changes":["Cambios sin guardar"],"Update":["Actualizar"],"Update failed.":["No se ha podido actualizar."],"Upload theme":["Subir tema"],"Uploaded %s file.":["%s archivo subido.","%s de archivos subidos.","%s archivos subidos."],"Users":["Usuarios"],"Users could not be loaded.":["No se han podido cargar los usuarios."],"Value":["Valor"],"Version":["Versión"],"Videos":["Vídeos"],"Visit Site":["Visitar el sitio"],"Web address":["Dirección web"],"What each Linked from field reads":["Qué lee cada campo Enlazado desde"],"What it points at changed, so its stored values go with it.":["Aquello a lo que apunta ha cambiado, así que sus valores guardados se van con él."],"Where %(group)s appears":["Dónde aparece %(group)s"],"Without a rule this field always shows.":["Sin ninguna regla este campo siempre se muestra."],"Without a rule this group appears nowhere.":["Sin una regla este grupo no aparece en ningún sitio."],"Yes":["Sí"],"Yes or no":["Sí o no"],"You cannot change your own role.":["No puedes cambiar tu propio rol."],"Your language":["Tu idioma"],"Your role does not allow %(capability)s.":["Tu rol no permite %(capability)s."],"Your server pins the site to the theme %(name)s, so themes cannot be changed here. Ask whoever looks after your site to remove the pin.":["Tu servidor bloque el sitio al tema %(name)s, así que los temas no se pueden cambiar desde aquí. Pide a quien gestiona tu sitio que quite ese bloqueo."],"Your site always needs one default content type, so this one cannot be turned off or deleted. Make another type the default first.":["Tu sitio siempre necesita un tipo de contenido por defecto, así que este no se puede desactivar ni borrar. Haz antes que otro tipo sea el que está por defecto."],"a content type":["un tipo de contenido"],"account\u0004Role":["Rol"],"account\u0004Status":["Estado"],"action label\u0004Duplicate":["Duplicar"],"action label\u0004Duplicate…":["Duplicar…"],"address":["dirección"],"admin section\u0004Content Types":["Tipos de contenido"],"admin section\u0004Field Groups":["Grupos de campos"],"admin section\u0004Language":["Idioma"],"admin section\u0004Media":["Medios"],"admin section\u0004Settings":["Ajustes"],"admin section\u0004Themes":["Temas"],"column\u0004Date":["Fecha"],"content type\u0004\"%s\" permanently deleted.":["Se ha borrado permanentemente el tipo de contenido «%s»."],"content type\u0004\"%s\" successfully created.":["Se ha creado correctamente el tipo de contenido «%s»."],"content type\u0004Status":["Estado"],"field\u0004Name":["Nombre"],"field group\u0004Status":["Estado"],"field type\u0004Choice":["Elección"],"field type\u0004Color":["Color"],"field type\u0004Date":["Fecha"],"field type\u0004Flexible content":["Contenido flexible"],"field type\u0004Gallery":["Galería"],"field type\u0004Kind":["Tipo"],"field type\u0004Layout":["Diseño"],"field type\u0004Link":["Enlace"],"field type\u0004Media":["Medio"],"field type\u0004Range":["Rango"],"field type\u0004Repeater":["Repetidor"],"field type\u0004Section":["Sección"],"field type\u0004Select":["Desplegable"],"holds":["contiene"],"holds anything":["contiene algo"],"is":["es"],"is above":["es mayor que"],"is below":["es menor que"],"is empty":["está vacío"],"is not":["no es"],"media family\u0004Kind":["Clase"],"panel button label\u0004Settings":["Ajustes"],"person\u0004Name":["Nombre"],"post\u0004%s (Copy)":["%s (copia)"],"post\u0004Status":["Estado"],"post status\u0004Draft":["Borrador"],"post status\u0004Published":["Publicada"],"post status\u0004Trash":["Papelera"],"post type general name\u0004Pages":["Páginas"],"post type general name\u0004Posts":["Entradas"],"post type singular name\u0004Page":["Página"],"post type singular name\u0004Post":["Entrada"],"relation target\u0004None":["Ninguno"],"role\u0004Administrator":["Administrador"],"role\u0004Author":["Autor"],"role\u0004Editor":["Editor"],"role\u0004Member":["Miembro"],"role\u0004No role":["Sin rol"],"status filter\u0004All":["Todo"],"taxonomy general name\u0004Categories":["Categorías"],"taxonomy singular name\u0004Category":["Categoría"],"theme\u0004Status":["Estado"],"trash\u0004Restore":["Restaurar"],"v%(version)s":["v%(version)s"],"verb\u0004Trash…":["Papelera…"],"verb\u0004View":["Ver"],"{day} {month} {year}":["{day} de {month} de {year}"]} diff --git a/frontend/src/languages/fr-FR.json b/frontend/src/languages/fr-FR.json index 9868f589..b2c4a848 100644 --- a/frontend/src/languages/fr-FR.json +++ b/frontend/src/languages/fr-FR.json @@ -1 +1 @@ -{"":{"lang":"fr","plural-forms":"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"}," and ":[" et "]," or ":[" ou "],"\"%s\" activated.":["Type de contenu « %s » activé."],"\"%s\" deactivated.":["Type de contenu « %s » désactivé."],"\"%s\" has been restored.":["« %s » a été rétabli."],"\"%s\" moved to the trash.":["« %s » déplacé dans la corbeille."],"\"%s\" permanently deleted.":["« %s » supprimé définitivement."],"\"%s\" successfully created.":["« %s » créé avec succès."],"\"%s\" uploaded.":["« %s » téléversé."],"%(field)s address":["Adresse de %(field)s"],"%(field)s cannot move inside itself. Pick a container that is not one of its own.":["%(field)s ne peut pas être déplacé à l'intérieur de lui-même. Choisissez un conteneur qui n'est pas l'un des siens."],"%(field)s declared.":["%(field)s déclaré."],"%(field)s deleted.":["%(field)s supprimé."],"%(field)s does not match the format its field asks for. Check it and save again.":["%(field)s ne respecte pas le format demandé par son champ. Vérifiez-le et enregistrez de nouveau."],"%(field)s goes no higher than %(limit)s. Lower the value and save again.":["%(field)s ne dépasse pas %(limit)s. Baissez la valeur et enregistrez de nouveau."],"%(field)s goes no lower than %(limit)s. Raise the value and save again.":["%(field)s ne descend pas sous %(limit)s. Augmentez la valeur et enregistrez de nouveau."],"%(field)s holds no value of its own, so it cannot be required. Make it optional.":["%(field)s ne contient aucune valeur propre, il ne peut donc pas être obligatoire. Rendez-le facultatif."],"%(field)s is optional again.":["%(field)s est de nouveau facultatif."],"%(field)s is required now.":["%(field)s est maintenant obligatoire."],"%(field)s moved.":["%(field)s déplacé."],"%(field)s names the same one twice. Remove the repeat and save again.":["%(field)s nomme le même deux fois. Retirez la répétition et enregistrez de nouveau."],"%(field)s needs at least %(limit)s files. Add one and save again.":["%(field)s demande au moins %(limit)s fichiers. Ajoutez-en un et enregistrez."],"%(field)s needs at least %(limit)s rows. Add one and save again.":["%(field)s demande au moins %(limit)s lignes. Ajoutez-en une et enregistrez."],"%(field)s only takes one of its listed choices. Pick one and save again.":["%(field)s accepte uniquement un des choix de sa liste. Choisissez-en un et enregistrez de nouveau."],"%(field)s reads a relation field that is not there. Pick a group and a relation field it holds.":["%(field)s lit un champ de relation qui n'existe pas. Choisissez un groupe et un champ de relation qu'il contient."],"%(field)s reads a relation pointing at %(type)s, so it would list nothing here. Pick a relation pointing at the items this group is shown on.":["%(field)s lit une relation qui pointe vers %(type)s, elle n'afficherait donc rien ici. Choisissez une relation qui pointe vers les éléments où ce groupe s'affiche."],"%(field)s renamed.":["%(field)s renommé."],"%(field)s settled.":["%(field)s réglé."],"%(field)s shows by its rules now.":["%(field)s s'affiche désormais selon ses règles."],"%(field)s stands in the list.":["%(field)s figure dans la liste."],"%(field)s stays out of the list.":["%(field)s reste hors de la liste."],"%(field)s takes at most %(limit)s files. Remove one and save again.":["%(field)s accepte au plus %(limit)s fichiers. Retirez-en un et enregistrez."],"%(field)s takes at most %(limit)s letters. Shorten what you wrote and save again.":["%(field)s accepte au plus %(limit)s lettres. Raccourcissez ce que vous avez écrit et enregistrez de nouveau."],"%(field)s takes at most %(limit)s rows. Remove one and save again.":["%(field)s accepte au plus %(limit)s lignes. Retirez-en une et enregistrez."],"%(field)s title":["Titre de %(field)s"],"%(file)s is larger than one upload may be.":["%(file)s dépasse la taille maximale d'un téléversement."],"%(file)s is not a file this block accepts.":["%(file)s n'est pas un fichier que ce bloc accepte."],"%(file)s: %(reason)s":["%(file)s : %(reason)s"],"%(group)s created.":["%(group)s créé."],"%(group)s now appears where you said.":["%(group)s apparaît maintenant là où vous avez dit."],"%(group)s removed.":["%(group)s supprimé."],"%(group)s updated.":["%(group)s mis à jour."],"%(key)s is served by %(winner)s, so %(loser)s does not show it on %(where)s.":["%(key)s est servi par %(winner)s, donc %(loser)s ne le montre pas sur %(where)s."],"%(name)s %(version)s is serving the public site.":["%(name)s %(version)s sert le site public."],"%(name)s belongs to the site now.":["%(name)s appartient désormais au site."],"%(name)s came from the %(plugin)s plugin, which no longer declares it.":["%(name)s venait de l'extension %(plugin)s, qui ne le déclare plus."],"%(name)s cannot be used as a theme name. Name the zip file after the theme, with no dot at the start and no slashes in it.":["%(name)s ne peut pas servir de nom de thème. Nommez le fichier zip comme le thème, sans point au début et sans barre oblique."],"%(name)s moves to /%(word)s. Every address of both types changes.":["Le type %(name)s passe à /%(word)s. Toutes les adresses des deux types changent."],"%(name)s would move to /%(word)s, which Gophenberg keeps for itself. Change its plural name and try again.":["Le type %(name)s passerait à /%(word)s, que Gophenberg garde pour lui. Modifiez son nom au pluriel et réessayez."],"%(source)s is %(value)s":["%(source)s est %(value)s"],"%(theme)s failed to start, so the built-in renderer is serving.":["%(theme)s n'a pas pu démarrer, le moteur de rendu intégré sert donc le site."],"%(theme)s is now serving the public site.":["%(theme)s sert désormais le site public."],"%(theme)s is serving the public site.":["%(theme)s sert le site public."],"%(theme)s is still starting, so the built-in renderer is serving.":["%(theme)s démarre encore, le moteur de rendu intégré sert donc le site."],"%(theme)s was installed.":["%(theme)s a été installé."],"%(theme)s will not load, so the built-in renderer is serving.":["%(theme)s ne se charge pas, le moteur de rendu intégré sert donc le site."],"%(type)s answers on a new address, and stored links move with it.":["%(type)s répond à une nouvelle adresse, et les liens enregistrés la suivent."],"%(type)s becomes the type the site opens on, and the old one takes an address.":["%(type)s devient le type sur lequel le site ouvre, et l'ancien prend une adresse."],"%(type)s keeps nesting while %(items)s of its items sit inside another. Move those to the top level first, the ones in the trash included.":["%(type)s continue de s'imbriquer tant que %(items)s de ses éléments se trouvent dans un autre. Déplacez-les d'abord au niveau supérieur, ceux de la corbeille compris."],"%(type)s keeps nesting, because some of its items sit inside another.":["%(type)s continue de s'imbriquer, car certains de ses éléments se trouvent dans un autre."],"%(type)s will answer at the root.":["Le type %(type)s répondra à la racine."],"%s content type activated.":["%s type de contenu activé.","%s types de contenu activés.","%s types de contenu activés."],"%s content type could not be activated.":["%s type de contenu n'a pas pu être activé.","%s types de contenu n'ont pas pu être activés.","%s types de contenu n'ont pas pu être activés."],"%s content type could not be deactivated.":["%s type de contenu n'a pas pu être désactivé.","%s types de contenu n'ont pas pu être désactivés.","%s types de contenu n'ont pas pu être désactivés."],"%s content type could not be permanently deleted.":["%s type de contenu n'a pas pu être supprimé définitivement.","%s types de contenu n'ont pas pu être supprimés définitivement.","%s types de contenu n'ont pas pu être supprimés définitivement."],"%s content type deactivated.":["%s type de contenu désactivé.","%s types de contenu désactivés.","%s types de contenu désactivés."],"%s content type permanently deleted.":["%s type de contenu supprimé définitivement.","%s types de contenu supprimés définitivement.","%s types de contenu supprimés définitivement."],"%s item could not be moved to the trash.":["%s élément n'a pas pu être déplacé dans la corbeille.","%s éléments n'ont pas pu être déplacés dans la corbeille.","%s éléments n'ont pas pu être déplacés dans la corbeille."],"%s item could not be permanently deleted.":["%s élément n'a pas pu être supprimé définitivement.","%s éléments n'ont pas pu être supprimés définitivement.","%s éléments n'ont pas pu être supprimés définitivement."],"%s item could not be restored.":["%s élément n'a pas pu être rétabli.","%s éléments n'ont pas pu être rétablis.","%s éléments n'ont pas pu être rétablis."],"%s item moved to the trash.":["%s élément déplacé dans la corbeille.","%s éléments déplacés dans la corbeille.","%s éléments déplacés dans la corbeille."],"%s item permanently deleted.":["%s élément supprimé définitivement.","%s éléments supprimés définitivement.","%s éléments supprimés définitivement."],"%s item stays in the trash.":["%s élément reste dans la corbeille.","%s éléments restent dans la corbeille.","%s éléments restent dans la corbeille."],"%s page has been restored.":["%s page a été rétablie.","%s pages ont été rétablies.","%s pages ont été rétablies."],"%s post has been restored.":["%s article a été rétabli.","%s articles ont été rétablis.","%s articles ont été rétablis."],"(no title)":["(sans titre)"],"A %(kind)s field does not take a setting called %(setting)s. Remove it and try again.":["Un champ %(kind)s n'accepte pas de réglage nommé %(setting)s. Retirez-le et réessayez."],"A Linked from field stands on its own, not inside a section or a repeater. Declare %(field)s beside the container.":["Un champ Lié depuis se place seul, ni dans une section ni dans un répéteur. Déclarez %(field)s à côté du conteneur."],"A content type needs a singular and a plural name, like Guide and Guides. Fill both in and try again.":["Un type de contenu a besoin d'un nom au singulier et d'un nom au pluriel, comme Guide et Guides. Remplissez les deux et réessayez."],"A descriptive summary of the content type.":["Un résumé descriptif du type de contenu."],"A field group key has to start with a lowercase letter and then hold only lowercase letters, numbers and hyphens. Rename the group in the file so its key comes out in that shape.":["La clé d'un groupe de champs doit commencer par une lettre minuscule puis ne contenir que des lettres minuscules, des chiffres et des tirets. Renommez le groupe dans le fichier pour que sa clé prenne cette forme."],"A field key has to start with a lowercase letter and then hold only lowercase letters, numbers and hyphens. Rename the field so its key comes out in that shape.":["La clé d'un champ doit commencer par une lettre minuscule et ne contenir ensuite que des lettres minuscules, des chiffres et des tirets. Renommez le champ pour que sa clé prenne cette forme."],"A field needs a name. Type one and try again.":["Un champ a besoin d'un nom. Saisissez-en un et réessayez."],"A field with that name already exists on the items this group reaches. Pick another name.":["Un champ portant ce nom existe déjà sur les éléments que ce groupe atteint. Choisissez un autre nom."],"A flexible content field holds layouts, and %(field)s is not one. Add a layout first, then declare the field inside that layout.":["Un champ de contenu flexible contient des dispositions, et %(field)s n'en est pas une. Ajoutez d'abord une disposition, puis déclarez le champ dans cette disposition."],"A higher quality stores larger files, and it applies to pictures uploaded from now on.":["Une qualité plus élevée stocke des fichiers plus grands, et elle s'applique aux images téléversées à partir de maintenant."],"A layout stands inside a flexible content field only. Put %(field)s inside one of those instead.":["Une disposition ne se place que dans un champ de contenu flexible. Placez %(field)s dans l'un d'eux."],"A layout stands inside a flexible content field, never on its own. Declare a flexible content field first, then add %(field)s inside it.":["Une disposition se place dans un champ de contenu flexible, jamais seule. Déclarez d'abord un champ de contenu flexible, puis ajoutez %(field)s dedans."],"A listing carries between 1 and %(max)s items, so %(value)s is not a size Gophenberg takes. Pick a number inside that range.":["Une liste affiche entre 1 et %(max)s éléments, donc %(value)s n'est pas une taille que Gophenberg accepte. Choisissez un nombre dans cet intervalle."],"A relation field has to say which content type it points at. Pick that type and try again.":["Un champ de relation doit indiquer le type de contenu qu'il vise. Choisissez ce type et réessayez."],"A reload shows the admin in the language you chose.":["Un rechargement affiche l'administration dans la langue que vous avez choisie."],"A route word has to start with a lowercase letter and then hold only lowercase letters, numbers and hyphens. Change it and try again.":["Un mot de route doit commencer par une lettre minuscule et ne contenir ensuite que des lettres minuscules, des chiffres et des tirets. Modifiez-le et réessayez."],"A row of %(field)s has to name the layout it takes. Pick a layout for the row, or remove the row.":["Une ligne de %(field)s doit nommer la disposition qu'elle prend. Choisissez une disposition pour la ligne, ou retirez la ligne."],"A row of %(field)s takes one layout and no more. Reload the page and build the row again.":["Une ligne de %(field)s prend une seule disposition. Rechargez la page et reconstruisez la ligne."],"A rule matching any %(source)s cannot be turned into an exclusion. Leave it as is, or name the ones to leave out instead.":["Une règle valable pour n'importe quel %(source)s ne peut pas devenir une exclusion. Laissez-la telle quelle, ou nommez ceux à écarter."],"A theme naming its own page size uses that instead.":["Un thème qui indique sa propre taille de page utilise celle-ci à la place."],"A type key has to start with a lowercase letter and then hold only lowercase letters, numbers and hyphens. Change the key and try again.":["La clé d'un type doit commencer par une lettre minuscule et ne contenir ensuite que des lettres minuscules, des chiffres et des tirets. Modifiez la clé et réessayez."],"Actions":["Actions"],"Activate":["Activer"],"Activate %(theme)s":["Activer %(theme)s"],"Active":["Actif"],"Add":["Ajouter"],"Add %(layout)s":["Ajouter %(layout)s"],"Add %(name)s":["Ajouter %(name)s"],"Add %(type)s":["Ajouter %(type)s"],"Add Category":["Ajouter une catégorie"],"Add Content Type":["Ajouter un type de contenu"],"Add Field Group":["Ajouter un groupe de champs"],"Add Media File":["Ajouter un fichier média"],"Add Page":["Ajouter une page"],"Add Post":["Ajouter un article"],"Add User":["Ajouter un utilisateur"],"Add block":["Ajouter un bloc"],"Add choice":["Ajouter un choix"],"Add condition":["Ajouter une condition"],"Add field":["Ajouter un champ"],"Add field to %(field)s":["Ajouter un champ à %(field)s"],"Add layout":["Ajouter une disposition"],"Add layout to %(field)s":["Ajouter une disposition à %(field)s"],"Add one with %(button)s.":["Ajoutez un élément avec %(button)s."],"Add row":["Ajouter une ligne"],"Add rule set":["Ajouter un ensemble de règles"],"Add title":["Ajouter un titre"],"Add to %(field)s":["Ajouter à %(field)s"],"Address":["Adresse"],"Address updated.":["Adresse mise à jour."],"Adopt":["Adopter"],"Allow custom":["Autoriser les valeurs libres"],"Allow empty":["Autoriser le vide"],"Alt text":["Texte alternatif"],"An item cannot point at itself. Pick a different item for %(field)s.":["Un élément ne peut pas se viser lui-même. Choisissez un autre élément pour %(field)s."],"An item cannot sit inside itself, or inside one of the items nested under it. Pick a parent outside this branch.":["Un élément ne peut pas se trouver dans lui-même, ni dans un élément imbriqué sous lui. Choisissez un parent hors de cette branche."],"Another account wrote this, and only its author, an editor or an administrator may change it. You can still read it.":["Un autre compte a écrit ceci, et seuls son auteur, un éditeur ou un administrateur peuvent le modifier. Vous pouvez toujours le lire."],"Another account wrote this, so you are reading it rather than editing it.":["Un autre compte a écrit ceci, alors vous le lisez au lieu de le modifier."],"Another content type already answers under this route word. Pick a different word.":["Un autre type de contenu répond déjà sous ce mot de route. Choisissez un autre mot."],"Another content type already lives at the root of your site, and only one can. Give this type a route word, or hand the root over with Make default.":["Un autre type de contenu occupe déjà la racine de votre site, et un seul le peut. Donnez un mot de route à ce type, ou cédez la racine avec Rendre par défaut."],"Another content type already uses this key. Give this type a different name.":["Un autre type de contenu utilise déjà cette clé. Donnez un autre nom à ce type."],"Another item of this content type already uses that address. Pick a different slug and save again.":["Un autre élément de ce type de contenu utilise déjà cette adresse. Choisissez un autre slug et enregistrez de nouveau."],"Another update is currently in progress.":["Une autre mise à jour est actuellement en cours."],"Appears on":["Apparaît sur"],"Apply":["Appliquer"],"April":["avril"],"Are you sure you want to move \"%s\" to the trash?":["Voulez-vous vraiment déplacer « %s » dans la corbeille ?"],"Audio":["Audio"],"August":["août"],"Author":["Auteur"],"Back to %(type)s":["Retour aux %(type)s"],"Back to the latest posts":["Retour aux derniers articles"],"Block":["Bloc"],"Broken":["Cassé"],"Bundles of fields, shown where their rules place them.":["Ensembles de champs, affichés là où leurs règles les placent."],"Button group":["Groupe de boutons"],"Cancel":["Annuler"],"Caption":["Légende"],"Change %(name)s":["Modifier %(name)s"],"Change address":["Changer l'adresse"],"Change address…":["Changer l'adresse…"],"Change role":["Changer le rôle"],"Change the role of %(name)s":["Changer le rôle de %(name)s"],"Checkbox group":["Groupe de cases à cocher"],"Choices":["Choix"],"Choose %(field)s":["Choisir %(field)s"],"Choose how the site serves its content.":["Choisissez comment le site sert son contenu."],"Choose the language the admin reads in.":["Choisissez la langue dans laquelle se lit l'administration."],"Choose the role of %(name)s.":["Choisissez le rôle de %(name)s."],"Choose the version to update to.":["Choisissez la version vers laquelle mettre à jour."],"Clear %(field)s":["Vider %(field)s"],"Close":["Fermer"],"Close Settings":["Fermer les réglages"],"Closed":["Fermé"],"Condition":["Condition"],"Content":["Contenu"],"Content Types":["Types de contenu"],"Content nests at most %(max)s levels deep, and this item would sit deeper. Pick a parent closer to the top.":["Le contenu s'imbrique sur au plus %(max)s niveaux, et cet élément irait plus profond. Choisissez un parent plus proche du sommet."],"Content type":["Type de contenu"],"Content type updated.":["Type de contenu mis à jour."],"Could not delete that item.":["Impossible de supprimer cet élément.","Impossible de supprimer tous les éléments.","Impossible de supprimer tous les éléments."],"Could not load that post.":["Impossible de charger cet article."],"Could not save that post.":["Impossible d'enregistrer cet article."],"Create":["Créer"],"Create a field group":["Créer un groupe de champs"],"Create user":["Créer l'utilisateur"],"Created":["Date de création"],"Date added":["Date d'ajout"],"Deactivate":["Désactiver"],"Deactivate %(theme)s":["Désactiver %(theme)s"],"December":["décembre"],"Default":["Par défaut"],"Default content type updated.":["Type de contenu par défaut mis à jour."],"Definitions file":["Fichier de définitions"],"Delete":["Supprimer"],"Delete \"%(title)s\" for good? This cannot be undone.":["Supprimer « %(title)s » définitivement ? Cette action est irréversible."],"Delete %(field)s":["Supprimer %(field)s"],"Delete %(group)s":["Supprimer %(group)s"],"Delete %(title)s for good? This cannot be undone.":["Supprimer %(title)s définitivement ? Cette action est irréversible."],"Delete %s content type for good? This cannot be undone.":["Supprimer %s type de contenu définitivement ? Cette action est irréversible.","Supprimer %s types de contenu définitivement ? Cette action est irréversible.","Supprimer %s types de contenu définitivement ? Cette action est irréversible."],"Delete %s item for good? This cannot be undone.":["Supprimer %s élément définitivement ? Cette action est irréversible.","Supprimer %s éléments définitivement ? Cette action est irréversible.","Supprimer %s éléments définitivement ? Cette action est irréversible."],"Delete Permanently":["Supprimer définitivement"],"Delete the field":["Supprimer le champ"],"Delete the group":["Supprimer le groupe"],"Delete this %(count)s item for good? This cannot be undone.":["Supprimer définitivement ce %(count)s élément ? Cette action est irréversible.","Supprimer définitivement ces %(count)s éléments ? Cette action est irréversible.","Supprimer définitivement ces %(count)s éléments ? Cette action est irréversible."],"Delete…":["Supprimer…"],"Describe":["Décrire"],"Describe…":["Décrire…"],"Description":["Description"],"Description updated.":["Description mise à jour."],"Desktop":["Ordinateur"],"Destination":["Destination"],"Dimensions":["Dimensions"],"Disable":["Désactiver"],"Disable %(name)s":["Désactiver %(name)s"],"Disabled":["Désactivé"],"Dismiss":["Ignorer"],"Document":["Document"],"Done. The site now holds what the file describes.":["Terminé. Le site contient maintenant ce que décrit le fichier."],"Draft saved.":["Brouillon enregistré."],"Drop files to upload":["Déposez vos fichiers pour les téléverser"],"Email":["E-mail"],"Empty Trash":["Vider la corbeille"],"Empty trash":["Vider la corbeille"],"Enable":["Activer"],"Enable %(name)s":["Activer %(name)s"],"Every address of this type moves. Links kept elsewhere to the old addresses stop working.":["Toutes les adresses de ce type changent. Les liens conservés ailleurs vers les anciennes adresses cessent de fonctionner."],"Every content type":["Tous les types de contenu"],"Every field group needs a title. Give it a name and save again.":["Chaque groupe de champs a besoin d'un titre. Donnez-lui un nom et enregistrez à nouveau."],"Every item needs an author who exists. Pick one from the list and save again.":["Chaque élément a besoin d'un auteur existant. Choisissez-en un dans la liste et enregistrez de nouveau."],"Every kind of content this site holds.":["Toutes les sortes de contenu que ce site contient."],"Every value stored under this field goes with it, in every item the group reaches and in the revisions behind them.":["Toutes les valeurs enregistrées dans ce champ partent avec lui, dans chaque élément que le groupe atteint et dans les révisions qui les suivent."],"Excerpt":["Extrait"],"Export definitions":["Exporter les définitions"],"February":["février"],"Fewest files":["Minimum de fichiers"],"Fewest rows":["Minimum de lignes"],"Field":["Champ"],"Field Groups":["Groupes de champs"],"Field group":["Groupe de champs"],"Fields":["Champs"],"Fields of %(group)s":["Champs de %(group)s"],"File name":["Nom du fichier"],"File size":["Taille du fichier"],"File type":["Type de fichier"],"Files":["Fichiers"],"Filter by status":["Filtrer par état"],"Follow the browser":["Suivre le navigateur"],"From %(plugin)s":["De %(plugin)s"],"Full Size":["Taille originale"],"Gophenberg cannot start this update: %(reason)s":["Gophenberg ne peut pas lancer cette mise à jour : %(reason)s"],"Gophenberg checked for updates moments ago. Try again later.":["Gophenberg a cherché des mises à jour il y a un instant. Réessayez plus tard."],"Gophenberg could not read what your browser sent. Reload the page and try again, and tell whoever looks after your site if it keeps happening.":["Gophenberg n'a pas pu lire ce que votre navigateur a envoyé. Rechargez la page et réessayez, et prévenez la personne qui s'occupe de votre site si cela continue."],"Gophenberg could not read which item you picked as parent. Reload the page and pick it again.":["Gophenberg n'a pas pu lire quel élément vous avez choisi comme parent. Rechargez la page et choisissez-le de nouveau."],"Gophenberg does not accept %(extension)s files. Upload a picture, a video, an audio file, a PDF or a zip instead.":["Gophenberg n'accepte pas les fichiers %(extension)s. Téléversez plutôt une image, une vidéo, un fichier audio, un PDF ou un zip."],"Gophenberg does not answer in %(value)s. Pick one of the languages on the list.":["Gophenberg ne répond pas en %(value)s. Choisissez une des langues de la liste."],"Gophenberg has no autosave of yours for this item. Open the item to see the version that is stored.":["Gophenberg n'a aucun enregistrement automatique de vous pour cet élément. Ouvrez l'élément pour voir la version stockée."],"Gophenberg holds no kind of definition called %(subject)s, so nothing was taken over. Reload the page so the admin and the server agree again.":["Gophenberg ne connaît aucune sorte de définition nommée %(subject)s, rien n'a donc été repris. Rechargez la page pour que l'admin et le serveur se rejoignent à nouveau."],"Gophenberg keeps /%(path)s for itself or for another content type, so your content cannot answer there. Give the item a different slug.":["Gophenberg garde l'adresse /%(path)s pour lui ou pour un autre type de contenu, votre contenu ne peut donc pas y répondre. Donnez un autre slug à l'élément."],"Gophenberg keeps this word for itself, so no content type can answer under it. Pick a different route word.":["Gophenberg garde ce mot pour lui, aucun type de contenu ne peut donc répondre sous ce mot. Choisissez un autre mot de route."],"Group":["Groupe"],"Highest":["Maximum"],"Holds":["Contient"],"Images":["Images"],"Import definitions":["Importer les définitions"],"In list":["Dans la liste"],"Inactive":["Inactif"],"Installed":["Installé"],"Instructions":["Instructions"],"It moves here from another group and keeps its stored values.":["Il arrive ici depuis un autre groupe et garde ses valeurs enregistrées."],"It moves to another group and keeps its stored values.":["Il passe dans un autre groupe et garde ses valeurs enregistrées."],"It moves to another group, so its stored values do not follow.":["Il passe dans un autre groupe, donc ses valeurs enregistrées ne le suivent pas."],"It reads a relation inside a container, and only an import can point it elsewhere.":["Il lit une relation dans un conteneur, et seule une importation peut le faire pointer ailleurs."],"It starts on %(type)s, and the rules may be edited afterwards.":["Il commence sur %(type)s, et les règles peuvent être modifiées ensuite."],"Items could not be loaded.":["Les éléments n'ont pas pu être chargés."],"Its items sit inside one another, so it keeps nesting.":["Ses éléments se trouvent les uns dans les autres, donc il continue de s'imbriquer."],"Its kind changed, so its stored values go with it.":["Son type a changé, donc ses valeurs enregistrées partent avec lui."],"January":["janvier"],"July":["juillet"],"June":["juin"],"Keep %(field)s out of the list":["Garder %(field)s hors de la liste"],"Keep it":["Le conserver"],"Keep it here":["Le laisser ici"],"Key":["Clé"],"Label":["Libellé"],"Language":["Langue"],"Large":["Grande"],"Let items nest":["Autoriser l'imbrication"],"Linked from":["Lié depuis"],"List view":["Vue en liste"],"Loading field groups.":["Chargement des groupes de champs."],"Loading the post.":["Chargement de l'article."],"Loading the screen.":["Chargement de l'écran."],"Loading themes.":["Chargement des thèmes."],"Loading users.":["Chargement des utilisateurs."],"Loading…":["Chargement…"],"Longest":["Longueur maximale"],"Lowest":["Minimum"],"Make %(field)s optional":["Rendre %(field)s facultatif"],"Make default":["Rendre par défaut"],"Make default…":["Rendre par défaut…"],"Make optional":["Rendre facultatif"],"Manage the categories on this site.":["Gérez les catégories de ce site."],"Manage the images and files this site holds.":["Gérez les images et les fichiers que ce site contient."],"Manage the items of this content type.":["Gérez les éléments de ce type de contenu."],"Manage the pages on this site.":["Gérez les pages de ce site."],"Manage the posts on this site.":["Gérez les articles de ce site."],"Many targets":["Plusieurs cibles"],"Many values":["Plusieurs valeurs"],"March":["mars"],"May":["mai"],"Media %(id)s":["Média %(id)s"],"Media Library":["Bibliothèque de médias"],"Medium":["Moyenne"],"Mobile":["Mobile"],"Modified: %s":["Modifié : %s"],"Most files":["Maximum de fichiers"],"Most rows":["Maximum de lignes"],"Move":["Déplacer"],"Move \"%(title)s\" to the trash?":["Déplacer « %(title)s » dans la corbeille ?"],"Move %(field)s down":["Descendre %(field)s"],"Move %(field)s elsewhere":["Déplacer %(field)s ailleurs"],"Move %(field)s up":["Monter %(field)s"],"Move %(group)s down":["Descendre %(group)s"],"Move %(group)s up":["Monter %(group)s"],"Move %(name)s down":["Descendre %(name)s"],"Move %(name)s up":["Monter %(name)s"],"Move %s item to the trash?":["Déplacer %s élément dans la corbeille ?","Déplacer %s éléments dans la corbeille ?","Déplacer %s éléments dans la corbeille ?"],"Move every address":["Déplacer toutes les adresses"],"Move row down":["Descendre la ligne"],"Move row up":["Monter la ligne"],"Move the field":["Déplacer le champ"],"Move to trash":["Déplacer dans la corbeille"],"Name":["Nom"],"Name updated.":["Nom mis à jour."],"Navigation":["Navigation"],"Nests":["Imbriqué"],"Newer posts":["Articles plus récents"],"No":["Non"],"No content types found.":["Aucun type de contenu trouvé."],"No description":["Aucune description"],"No file arrived with this upload. Choose a file and try again.":["Aucun fichier n'est arrivé avec ce téléversement. Choisissez un fichier et réessayez."],"No items found.":["Aucun élément trouvé."],"No items yet.":["Aucun élément pour l'instant."],"No media chosen":["Aucun média choisi"],"No media has been uploaded yet.":["Aucun média n'a encore été téléversé."],"No media items found.":["Aucun fichier média trouvé."],"No media items yet.":["Aucun fichier média pour l’instant."],"No page lives at this address.":["Aucune page n'existe à cette adresse."],"No parent":["Pas de parent"],"No theme arrived with this upload. Choose a zip file and try again.":["Aucun thème n'est arrivé avec ce téléversement. Choisissez un fichier zip et réessayez."],"No themes are installed.":["Aucun thème n'est installé."],"No title":["Sans titre"],"None":["Aucun"],"Not %(type)s":["Sauf %(type)s"],"Not found":["Introuvable"],"Not serving":["Hors service"],"Nothing declares that role.":["Rien ne déclare ce rôle."],"Nothing points here yet.":["Rien ne pointe encore ici."],"Nothing published here yet.":["Rien n'est encore publié ici."],"Nothing published yet.":["Rien n'est encore publié."],"November":["novembre"],"Nowhere":["Nulle part"],"Number":["Nombre"],"October":["octobre"],"Older posts":["Articles plus anciens"],"One frame of this animation holds more than %(max)s pixels, which is more than Gophenberg opens. Upload a smaller animation.":["Une image de cette animation dépasse %(max)s pixels, plus que ce que Gophenberg ouvre. Téléversez une animation plus petite."],"One of the filters on this list is not one Gophenberg understands. Clear the filters and try again.":["Un des filtres de cette liste n'est pas un filtre que Gophenberg comprend. Videz les filtres et réessayez."],"One of the items picked for %(field)s is not the kind of content that field points at. Reload the page and pick from the list the field offers.":["Un des éléments choisis pour %(field)s n'est pas le genre de contenu que vise ce champ. Rechargez la page et choisissez dans la liste que le champ propose."],"One of the items picked for %(field)s was not named in a way Gophenberg understands. Reload the page and pick the items again.":["Un des éléments choisis pour %(field)s n'était pas nommé d'une façon que Gophenberg comprend. Rechargez la page et choisissez de nouveau les éléments."],"One of the items picked no longer exists. Reload the page and pick again.":["Un des éléments choisis n'existe plus. Rechargez la page et choisissez de nouveau."],"One target":["Une cible"],"Only a relation field points at another content type or holds many items. Pick the Relation kind, or leave the target and the many option empty.":["Seul un champ de relation vise un autre type de contenu ou contient plusieurs éléments. Choisissez le genre Relation, ou laissez vides la cible et l'option plusieurs."],"Only one file may be placed here.":["Un seul fichier peut être placé ici."],"Only the content type at the root of your site may go without a route word. Give this type one and try again.":["Seul le type de contenu à la racine de votre site peut se passer de mot de route. Donnez-en un à ce type et réessayez."],"Open %(field)s in a new tab":["Ouvrir %(field)s dans un nouvel onglet"],"Open navigation":["Ouvrir la navigation"],"Order stored.":["Ordre enregistré."],"Other":["Autre"],"Out of list":["Hors de la liste"],"Parent":["Parent"],"Password":["Mot de passe"],"Pending":["En attente"],"Pending Review":["En attente de relecture"],"Permanently delete":["Supprimer définitivement"],"Permanently delete…":["Supprimer définitivement…"],"Picture quality":["Qualité d'image"],"Picture quality runs from 1 to %(max)s, so %(value)s is not a quality Gophenberg stores at. Pick a number inside that range.":["La qualité d'image va de 1 à %(max)s, donc %(value)s n'est pas une qualité avec laquelle Gophenberg enregistre. Choisissez un nombre dans cet intervalle."],"Placeholder":["Texte indicatif"],"Plural name":["Nom au pluriel"],"Points at":["Vise"],"Post published.":["Article publié."],"Posts per page":["Articles par page"],"Preview":["Prévisualiser"],"Private":["Privé"],"Publish":["Publier"],"Published: %s":["Publié : %s"],"Radio group":["Groupe de boutons radio"],"Reads from":["Lit depuis"],"Redo":["Rétablir"],"Relation":["Relation"],"Remove":["Retirer"],"Remove %(name)s":["Retirer %(name)s"],"Remove %(title)s":["Retirer %(title)s"],"Remove row":["Retirer la ligne"],"Rename":["Renommer"],"Rename %(field)s":["Renommer %(field)s"],"Rename…":["Renommer…"],"Require":["Rendre obligatoire"],"Require %(field)s":["Rendre %(field)s obligatoire"],"Required":["Obligatoire"],"Restore":["Rétablir"],"Role changed.":["Rôle modifié."],"Roll back to %(theme)s":["Revenir à %(theme)s"],"Roll back to the built-in renderer":["Revenir au moteur de rendu intégré"],"Route word":["Mot de route"],"Rule %(number)s of set %(set)s":["Règle %(number)s de l'ensemble %(set)s"],"Rule set %(number)s":["Ensemble de règles %(number)s"],"Rules":["Règles"],"Rules showing %(field)s":["Règles affichant %(field)s"],"Save":["Enregistrer"],"Save draft":["Enregistrer le brouillon"],"Save rules":["Enregistrer les règles"],"Save settings":["Enregistrer les réglages"],"Saved":["Enregistré"],"Saving":["Enregistrement"],"Scheduled":["Planifié"],"Scheduled: %s":["Planifié : %s"],"Search %(type)s…":["Rechercher des %(type)s…"],"Search audio":["Rechercher un audio"],"Search images":["Rechercher des images"],"Search media":["Rechercher des médias"],"Search videos":["Rechercher des vidéos"],"Select":["Sélectionner"],"September":["septembre"],"Serving":["En service"],"Settings":["Réglages"],"Settings of %(field)s":["Réglages de %(field)s"],"Shadowed":["Masqué"],"Show %(field)s in the list":["Afficher %(field)s dans la liste"],"Showing %(held)s of %(total)s.":["Affichage de %(held)s sur %(total)s."],"Singular name":["Nom au singulier"],"Slug":["Slug"],"Somebody must be able to manage users.":["Quelqu'un doit pouvoir gérer les utilisateurs."],"Someone else changed this media item while you were editing it. Reload the page and make your change again.":["Quelqu'un d'autre a modifié ce média pendant que vous le modifiiez. Rechargez la page et refaites votre modification."],"Someone else saved changes to this item while you were editing, so yours were not saved. Copy your text somewhere safe, then reload the item and put your changes back in.":["Quelqu'un d'autre a enregistré des modifications sur cet élément pendant que vous éditiez, les vôtres n'ont donc pas été enregistrées. Copiez votre texte en lieu sûr, puis rechargez l'élément et remettez vos modifications."],"Something went wrong inside Gophenberg. Try again in a moment, and tell whoever looks after your site if it keeps happening.":["Quelque chose a mal tourné dans Gophenberg. Réessayez dans un instant, et prévenez la personne qui s'occupe de votre site si cela continue."],"Something went wrong.":["Quelque chose a mal tourné."],"Something went wrong. Try again.":["Quelque chose a mal tourné. Réessayez."],"Sorry, you are not allowed to access this page.":["Désolé, vous n’avez pas l’autorisation d’accéder à cette page."],"Source":["Source"],"Steps of":["Pas de"],"Stop nesting":["Arrêter l'imbrication"],"Tablet":["Tablette"],"Text":["Texte"],"Text area":["Zone de texte"],"That email is already in use.":["Cet e-mail est déjà utilisé."],"That field group no longer exists. Reload the page to see the groups your site holds now.":["Ce groupe de champs n'existe plus. Rechargez la page pour voir les groupes que votre site contient maintenant."],"That field is not on this content type any more. Reload the page to see the fields it has now.":["Ce champ n'est plus sur ce type de contenu. Rechargez la page pour voir les champs qu'il possède maintenant."],"That revision does not exist, and older ones drop off once a type holds more than it keeps. Open the item to see which revisions are left.":["Cette révision n'existe pas, et les plus anciennes disparaissent quand un type en détient plus qu'il n'en conserve. Ouvrez l'élément pour voir les révisions restantes."],"That role holds more than your own.":["Ce rôle va au-delà du vôtre."],"That web address does not name a media item Gophenberg can look up. Open the media library and pick the item from there.":["Cette adresse web ne désigne aucun média que Gophenberg puisse trouver. Ouvrez la bibliothèque de médias et choisissez l'élément depuis là."],"That web address does not name a revision Gophenberg can look up. Open the item and pick a revision from its history.":["Cette adresse web ne désigne aucune révision que Gophenberg puisse trouver. Ouvrez l'élément et choisissez une révision dans son historique."],"That web address does not name an item Gophenberg can look up. Go back to the list and open the item from there.":["Cette adresse web ne désigne aucun élément que Gophenberg puisse trouver. Revenez à la liste et ouvrez l'élément depuis là."],"The %(count)s item in the trash is deleted for good. This cannot be undone.":["%(count)s élément de la corbeille est supprimé définitivement. Cette action est irréversible.","Les %(count)s éléments de la corbeille sont supprimés définitivement. Cette action est irréversible.","Les %(count)s éléments de la corbeille sont supprimés définitivement. Cette action est irréversible."],"The %(file)s calls this theme %(declared)s, but it is being installed as %(installed)s. Rename the zip file to match, or change the name inside %(file)s.":["Le fichier %(file)s appelle ce thème %(declared)s, mais il s'installe sous %(installed)s. Renommez le fichier zip pour qu'ils correspondent, ou changez le nom dans %(file)s."],"The %(file)s inside %(name)s is not valid JSON, so it could not be read. Fix that file and package the theme again.":["Le fichier %(file)s dans %(name)s n'est pas du JSON valide, il n'a donc pas pu être lu. Corrigez ce fichier et réempaquetez le thème."],"The %(file)s inside %(name)s names its theme kit as %(declared)s, which is not a version number. Build the theme again, and the build will fill that in.":["Le %(file)s dans %(name)s indique son kit de thèmes comme %(declared)s, ce qui n'est pas un numéro de version. Compilez le thème à nouveau et la compilation le renseignera."],"The %(origin)s plugin declared this, so it can only be changed in that plugin. Turning it off is still yours to do.":["L'extension %(origin)s l'a déclaré, donc il ne peut être modifié que dans cette extension. Le désactiver reste entre vos mains."],"The %(plugin)s plugin also declares %(name)s, and the site keeps the key.":["L'extension %(plugin)s déclare aussi %(name)s, et le site garde la clé."],"The %(plugin)s plugin declared these fields, so they change only in its code.":["L'extension %(plugin)s a déclaré ces champs, donc ils ne changent que dans son code."],"The %(plugin)s plugin declares %(name)s flat, and the site keeps it nesting while its items sit inside another.":["L'extension %(plugin)s déclare %(name)s sans imbrication, et le site continue de l'imbriquer tant que ses éléments se trouvent dans un autre."],"The browser kept an unsaved version of this post.":["Le navigateur a gardé une version non enregistrée de cet article."],"The built-in renderer is now serving the public site.":["Le moteur de rendu intégré sert désormais le site public."],"The built-in renderer is serving the public site.":["Le moteur de rendu intégré sert le site public."],"The content type this field points at is not named in a shape Gophenberg accepts. Give it a key that starts with a lowercase letter and then holds only lowercase letters, numbers and hyphens.":["Le type de contenu que vise ce champ n'est pas nommé sous une forme que Gophenberg accepte. Donnez-lui une clé qui commence par une lettre minuscule et ne contient ensuite que des lettres minuscules, des chiffres et des tirets."],"The content types could not be loaded, so where these groups appear and which fields they shadow are not shown.":["Les types de contenu n'ont pas pu être chargés, donc où ces groupes apparaissent et quels champs ils masquent ne sont pas affichés."],"The content types could not be loaded.":["Les types de contenu n'ont pas pu être chargés."],"The content types could not be refreshed, so where these groups appear and what they shadow may be out of date.":["Les types de contenu n'ont pas pu être actualisés, donc où ces groupes apparaissent et ce qu'ils masquent peut être obsolète."],"The draft could not be created.":["Le brouillon n'a pas pu être créé."],"The entry %(entry)s in this zip would be written outside the theme folder, so nothing was installed. Package the theme again.":["L'entrée %(entry)s de ce zip s'écrirait hors du dossier du thème, rien n'a donc été installé. Réempaquetez le thème."],"The field %(field)s cannot go, because %(by)s reads it. Change %(by)s first.":["Le champ %(field)s ne peut pas être retiré, car %(by)s le lit. Modifiez d'abord %(by)s."],"The field %(field)s cannot hold the value it was given. Check what kind of field it is and enter a value that matches.":["Le champ %(field)s ne peut pas contenir la valeur qui lui a été donnée. Vérifiez de quel genre de champ il s'agit et saisissez une valeur qui convient."],"The field %(field)s has to hold a value before this item can be published. Fill it in, or leave the item as a draft.":["Le champ %(field)s doit contenir une valeur avant que cet élément puisse être publié. Remplissez-le, ou laissez l'élément en brouillon."],"The field %(field)s in %(group)s still points at this content type. Delete that field first, then delete this type.":["Le champ %(field)s dans %(group)s vise encore ce type de contenu. Supprimez d'abord ce champ, puis supprimez ce type."],"The field %(field)s is hidden by its own rules right now, so it cannot hold a value. Show it again before filling it in.":["Le champ %(field)s est masqué par ses propres règles pour le moment, il ne peut donc contenir aucune valeur. Affichez-le de nouveau avant de le remplir."],"The field %(field)s points at one item only. Remove the extra choices and keep one.":["Le champ %(field)s ne vise qu'un seul élément. Retirez les choix en trop et gardez-en un."],"The field %(field)s points at other items, so it does not take a plain value. Pick the items it points at instead.":["Le champ %(field)s vise d'autres éléments, il n'accepte donc pas une valeur simple. Choisissez plutôt les éléments qu'il vise."],"The field %(field)s takes a list of items, and what arrived was not a list. Reload the page and pick the items again.":["Le champ %(field)s attend une liste d'éléments, et ce qui est arrivé n'était pas une liste. Rechargez la page et choisissez de nouveau les éléments."],"The field %(source)s cannot hold the value %(value)s, so no rule can compare it. Write a value of the kind %(source)s stores.":["Le champ %(source)s ne peut pas contenir la valeur %(value)s, aucune règle ne peut donc la comparer. Écrivez une valeur du type que %(source)s enregistre."],"The field groups could not be loaded.":["Les groupes de champs n'ont pas pu être chargés."],"The field groups could not be reached.":["Les groupes de champs n'ont pas pu être joints."],"The field keeps its values on the content both groups reach.":["Le champ garde ses valeurs sur le contenu que les deux groupes atteignent."],"The fields this group holds go with it, and so do the values every item stored in them.":["Les champs que ce groupe contient partent avec lui, ainsi que les valeurs que chaque élément y a enregistrées."],"The groups were reordered.":["Les groupes ont été réordonnés."],"The item could not be duplicated.":["L'élément n'a pas pu être dupliqué."],"The item could not be moved to the trash.":["L'élément n'a pas pu être déplacé dans la corbeille."],"The item could not be permanently deleted.":["L'élément n'a pas pu être supprimé définitivement."],"The item could not be restored.":["L'élément n'a pas pu être rétabli."],"The item you picked as parent holds another kind of content. Pick a parent of the same content type as this item.":["L'élément que vous avez choisi comme parent contient un autre genre de contenu. Choisissez un parent du même type de contenu que cet élément."],"The item you picked as parent is in the trash. Restore it, or pick another parent.":["L'élément que vous avez choisi comme parent est dans la corbeille. Rétablissez-le, ou choisissez un autre parent."],"The item you picked as parent no longer exists. Reload the page and pick another parent.":["L'élément que vous avez choisi comme parent n'existe plus. Rechargez la page et choisissez un autre parent."],"The media library could not be loaded.":["La bibliothèque de médias n'a pas pu être chargée."],"The name changes. Nothing stored under this field moves.":["Le nom change. Rien de ce qui est stocké sous ce champ ne bouge."],"The name could not be updated.":["Le nom n'a pas pu être mis à jour."],"The new order has to name every field group exactly once. Reload the page and move the groups again.":["Le nouvel ordre doit nommer chaque groupe de champs exactement une fois. Rechargez la page et déplacez les groupes à nouveau."],"The new order has to name every field of this content type exactly once. Reload the page and move the fields again.":["Le nouvel ordre doit nommer chaque champ de ce type de contenu exactement une fois. Rechargez la page et déplacez les champs à nouveau."],"The number of revisions to keep has to be a whole number, and it cannot be negative. Enter a different number.":["Le nombre de révisions à conserver doit être un nombre entier, et il ne peut pas être négatif. Saisissez un autre nombre."],"The registry could not be reached.":["Le registre n'a pas pu être joint."],"The role could not be changed.":["Le rôle n'a pas pu être modifié."],"The rule on %(source)s names nothing to match. Pick a value, or remove the rule.":["La règle sur %(source)s ne nomme rien à faire correspondre. Choisissez une valeur, ou retirez la règle."],"The rules could not be loaded.":["Les règles n'ont pas pu être chargées."],"The rules on %(field)s lead back to %(field)s itself, so nothing can decide whether to show it. Point one of them at another field.":["Les règles de %(field)s reviennent à %(field)s lui-même, rien ne peut donc décider de l'afficher. Faites pointer l'une d'elles vers un autre champ."],"The same item was picked twice for %(field)s. Pick each item once.":["Le même élément a été choisi deux fois pour %(field)s. Choisissez chaque élément une seule fois."],"The server could not be reached, so nothing was changed.":["Le serveur n'a pas pu être joint, rien n'a donc été changé."],"The server could not be reached, so nothing was saved.":["Le serveur n'a pas pu être joint, rien n'a donc été enregistré."],"The server could not be reached, so nothing was uploaded.":["Le serveur n'a pas pu être joint, rien n'a donc été téléversé."],"The setting %(setting)s cannot hold the value it was given. Check what this setting takes and try again.":["Le réglage %(setting)s ne peut pas contenir la valeur donnée. Vérifiez ce que ce réglage accepte et réessayez."],"The setting %(setting)s falls outside the others. Keep min below max and the default inside the bounds.":["Le réglage %(setting)s sort des autres. Gardez min sous max et la valeur par défaut dans les limites."],"The settings could not be read, so nothing can be changed here yet.":["Les réglages n'ont pas pu être lus, donc rien ne peut encore être modifié ici."],"The site default":["La langue par défaut du site"],"The site may already hold part of this file. Import it again to see what is left.":["Le site contient peut-être déjà une partie de ce fichier. Importez-le à nouveau pour voir ce qu'il reste."],"The source %(source)s does not offer %(operator)s. Pick one of the comparisons it does offer.":["La source %(source)s n'offre pas %(operator)s. Choisissez une des comparaisons qu'elle offre."],"The theme %(name)s carries no %(file)s, so Gophenberg cannot tell what it is. Put that file at the top level of the zip and package the theme again.":["Le thème %(name)s ne contient aucun %(file)s, Gophenberg ne peut donc pas savoir ce que c'est. Placez ce fichier au premier niveau du zip et réempaquetez le thème."],"The theme %(name)s could not be read, so it cannot serve your site. Upload it again, or choose another theme.":["Le thème %(name)s n'a pas pu être lu, il ne peut donc pas servir votre site. Téléversez-le de nouveau, ou choisissez un autre thème."],"The theme %(name)s did not start, so your site is still served by the theme it had. Ask whoever looks after your site to check the server log for what the theme reported.":["Le thème %(name)s n'a pas démarré, votre site est donc toujours servi par le thème qu'il avait. Demandez à la personne qui s'occupe de votre site de regarder ce que le thème a signalé dans le journal du serveur."],"The theme %(name)s does not carry %(path)s as a file, so there is nothing to run. Package the built theme rather than its source.":["Le thème %(name)s ne contient pas %(path)s comme fichier, il n'y a donc rien à exécuter. Empaquetez le thème construit plutôt que sa source."],"The theme %(name)s does not carry %(path)s as a folder, so its styles and scripts are missing. Package the built theme rather than its source.":["Le thème %(name)s ne contient pas %(path)s comme dossier, ses styles et ses scripts manquent donc. Empaquetez le thème construit plutôt que sa source."],"The theme %(name)s holds a link to another file at %(path)s, and a theme may only carry real files. Replace it and package the theme again.":["Le thème %(name)s contient un lien vers un autre fichier à %(path)s, et un thème ne peut contenir que de vrais fichiers. Remplacez-le et réempaquetez le thème."],"The theme %(name)s is serving your site right now, so it cannot be replaced. Deactivate it first, or install this copy under another name.":["Le thème %(name)s sert votre site en ce moment, il ne peut donc pas être remplacé. Désactivez-le d'abord, ou installez cette copie sous un autre nom."],"The theme %(name)s is the one chosen, but it is not installed, so your site is served by the built-in renderer. Upload the theme again, or choose another one.":["Le thème %(name)s est celui choisi, mais il n'est pas installé, votre site est donc servi par le moteur de rendu intégré. Téléversez de nouveau le thème, ou choisissez-en un autre."],"The theme %(name)s was built on theme kit %(declared)s, and this site serves %(served)s. Build the theme again against a kit this site serves, then install it.":["Le thème %(name)s a été compilé avec le kit de thèmes %(declared)s, et ce site sert %(served)s. Compilez le thème à nouveau avec un kit que ce site sert, puis installez-le."],"The trash could not be emptied.":["La corbeille n'a pas pu être vidée."],"The user could not be created.":["L'utilisateur n'a pas pu être créé."],"The values stored under it do not follow.":["Les valeurs enregistrées dessous ne le suivent pas."],"Theme":["Thème"],"Themes":["Thèmes"],"Themes could not be loaded.":["Les thèmes n'ont pas pu être chargés."],"There is no content type called %(value)s. Pick a type your site holds, or register it first.":["Il n'existe aucun type de contenu appelé %(value)s. Choisissez un type que votre site possède, ou déclarez-le d'abord."],"There is no content type called %(value)s. Pick one of the types your site holds and try again.":["Il n'existe aucun type de contenu appelé %(value)s. Choisissez un des types que votre site possède et réessayez."],"There is no kind of field called %(value)s. Pick one of these instead: %(allowed)s.":["Il n'existe aucun genre de champ appelé %(value)s. Choisissez plutôt parmi ceux-ci : %(allowed)s."],"There is no page kind called %(value)s. Pick one of these instead: %(allowed)s.":["Il n'existe aucun genre de page appelé %(value)s. Choisissez plutôt parmi ceux-ci : %(allowed)s."],"There is no status called %(value)s. Pick one of these instead: %(allowed)s.":["Il n'existe aucun état appelé %(value)s. Choisissez plutôt parmi ceux-ci : %(allowed)s."],"There is nothing at this address. Check the link and try again.":["Il n'y a rien à cette adresse. Vérifiez le lien et réessayez."],"There is nothing to roll back to, because your site has not been through a theme change yet. Install a theme first, then a rollback has somewhere to go.":["Il n'y a rien vers quoi revenir, car votre site n'a pas encore changé de thème. Installez d'abord un thème, et le retour aura alors une destination."],"These files could not be read.":["Ces fichiers n'ont pas pu être lus."],"These were left alone, because nobody confirmed losing them.":["Ceux-ci ont été laissés tels quels, car personne n'a confirmé leur perte."],"This content type does not exist any more. Reload the page to see the types your site holds now.":["Ce type de contenu n'existe plus. Rechargez la page pour voir les types que votre site possède maintenant."],"This content type does not nest, so one of its items cannot sit inside another. Mark the type as Nests first.":["Ce type de contenu ne s'imbrique pas, un de ses éléments ne peut donc pas se trouver dans un autre. Marquez d'abord le type comme Imbriqué."],"This content type has no field called %(field)s. Check the name, or declare the field on the type first.":["Ce type de contenu n'a aucun champ appelé %(field)s. Vérifiez le nom, ou déclarez d'abord le champ sur le type."],"This content type is turned off, so its content is not served or edited. Activate it first.":["Ce type de contenu est désactivé, son contenu n'est donc ni servi ni modifié. Activez-le d'abord."],"This content type still holds content, so it cannot be deleted. Move or delete its items first.":["Ce type de contenu contient encore du contenu, il ne peut donc pas être supprimé. Déplacez ou supprimez d'abord ses éléments."],"This definitions file is larger than the %(max)s bytes Gophenberg reads in one request. Split it, or raise the limit your site runs with.":["Ce fichier de définitions dépasse les %(max)s octets que Gophenberg lit en une requête. Divisez-le, ou relevez la limite de votre site."],"This field holds no layouts yet.":["Ce champ ne contient pas encore de dispositions."],"This field would stand inside too many containers. Put it nearer the top and try again.":["Ce champ se trouverait dans trop de conteneurs. Placez-le plus près du niveau supérieur et réessayez."],"This file could not be opened as a zip. Package the theme again and upload the new file.":["Ce fichier n'a pas pu être ouvert comme zip. Réempaquetez le thème et téléversez le nouveau fichier."],"This file is larger than the upload limit. Upload a smaller file.":["Ce fichier dépasse la limite de téléversement. Téléversez un fichier plus petit."],"This file is named %(extension)s but it holds %(detected)s content. Upload it under a name that matches what is inside it.":["Ce fichier est nommé %(extension)s mais il contient du %(detected)s. Téléversez-le sous un nom qui correspond à ce qu'il contient."],"This file matches the site, so there is nothing to change.":["Ce fichier correspond au site, il n'y a donc rien à changer."],"This file says it was written in format %(declared)s, which is not a version Gophenberg can read. Export the definitions again from the site they came from.":["Ce fichier indique le format %(declared)s, qui n'est pas une version que Gophenberg sait lire. Exportez à nouveau les définitions depuis le site d'origine."],"This file was written in format %(declared)s, and this release reads %(served)s. Upgrade the site the file came from, or this one.":["Ce fichier est écrit au format %(declared)s, et cette version lit %(served)s. Mettez à jour le site d'origine du fichier, ou celui-ci."],"This group holds no fields yet.":["Ce groupe ne contient pas encore de champs."],"This install of Gophenberg has no install root, so it updates by hand.":["Cette installation de Gophenberg n'a pas de racine d'installation, elle se met donc à jour à la main."],"This is a custom build of Gophenberg, so it updates by hand.":["Il s'agit d'une version compilée sur mesure de Gophenberg, elle se met donc à jour à la main."],"This item cannot go straight to that status from the one it holds now. Save it as a draft first, then try again.":["Cet élément ne peut pas passer directement à cet état depuis celui qu'il a maintenant. Enregistrez-le d'abord comme brouillon, puis réessayez."],"This item changed while you were describing it. Reload and try again.":["Cet élément a changé pendant que vous le décriviez. Rechargez et réessayez."],"This item does not exist, and it may have been deleted. Go back to the list to see what is there.":["Cet élément n'existe pas, et il a peut-être été supprimé. Revenez à la liste pour voir ce qui s'y trouve."],"This item is already in the trash. Restore it first to work on it again.":["Cet élément est déjà dans la corbeille. Rétablissez-le d'abord pour y retravailler."],"This item is in the trash. Restore it first to work on it again.":["Cet élément est dans la corbeille. Rétablissez-le d'abord pour y retravailler."],"This item is not in the trash, so there is nothing to restore. Open it from the list to work on it as it is.":["Cet élément n'est pas dans la corbeille, il n'y a donc rien à rétablir. Ouvrez-le depuis la liste pour travailler dessus tel quel."],"This item still holds items nested inside it. Move or delete those first.":["Cet élément contient encore des éléments imbriqués. Déplacez-les ou supprimez-les d'abord."],"This kind of field holds no fields inside it. Put the field in a section or a repeater instead.":["Ce type de champ ne contient aucun champ. Placez le champ dans une section ou dans un répéteur."],"This media item is not in the library, and someone may have deleted it. Reload the page to see what is there now.":["Ce média n'est pas dans la bibliothèque, et quelqu'un l'a peut-être supprimé. Rechargez la page pour voir ce qui s'y trouve maintenant."],"This picture could not be read, so nothing was stored. The file may be damaged, so open it on your computer and upload it again.":["Cette image n'a pas pu être lue, rien n'a donc été stocké. Le fichier est peut-être endommagé, ouvrez-le sur votre ordinateur et téléversez-le de nouveau."],"This picture is %(width)s by %(height)s pixels, over the limit of %(max)s pixels in all. Make it smaller and upload it again.":["Cette image fait %(width)s par %(height)s pixels, au-delà de la limite de %(max)s pixels au total. Réduisez-la et téléversez-la de nouveau."],"This post changed elsewhere. Reload before saving again.":["Cet article a changé ailleurs. Rechargez avant d'enregistrer de nouveau."],"This request came from a page on another site, so it was refused. Open the admin on this site and try again.":["Cette requête vient d'une page d'un autre site, elle a donc été refusée. Ouvrez l'administration sur ce site et réessayez."],"This request carried %(attribute)s, which fields do not take. Reload the page so the admin and the server agree again.":["Cette requête portait %(attribute)s, que les champs n'acceptent pas. Rechargez la page pour que l'administration et le serveur concordent à nouveau."],"This request left out %(field)s, which Gophenberg needs. Reload the page and try again.":["Cette requête a omis %(field)s, dont Gophenberg a besoin. Rechargez la page et réessayez."],"This rule reads a source called %(source)s, and nothing on your site declares one. A plugin that added it may have been removed.":["Cette règle lit une source nommée %(source)s, et rien sur votre site n'en déclare. Une extension qui l'ajoutait a pu être retirée."],"This site cannot write to its themes folder, so no theme can be installed. Ask whoever looks after your site to make the folder that %(setting)s points at writable. A read-only mount is the usual cause.":["Ce site ne peut pas écrire dans son dossier de thèmes, aucun thème ne peut donc être installé. Demandez à la personne qui s'occupe de votre site de rendre accessible en écriture le dossier vers lequel pointe %(setting)s. Un montage en lecture seule en est la cause habituelle."],"This site has nowhere to keep themes, so no theme can be installed. Ask whoever looks after your site to point %(setting)s at a folder the server can write to.":["Ce site n'a nulle part où garder les thèmes, aucun thème ne peut donc être installé. Demandez à la personne qui s'occupe de votre site de faire pointer %(setting)s vers un dossier où le serveur peut écrire."],"This site has nowhere to store uploads, so nothing can be uploaded. Ask whoever looks after your site to point %(setting)s at a folder the server can write to.":["Ce site n'a nulle part où stocker les téléversements, rien ne peut donc être téléversé. Demandez à la personne qui s'occupe de votre site de faire pointer %(setting)s vers un dossier où le serveur peut écrire."],"This theme is over the limit of %(max)s bytes, packed or unpacked. Leave out what the theme does not need and package it again.":["Ce thème dépasse la limite de %(max)s octets, compressé ou non. Retirez ce dont le thème n'a pas besoin et réempaquetez-le."],"This type will answer under /%(word)s.":["Ce type répondra sous /%(word)s."],"This zip holds %(entries)s files, more than the %(max)s a theme may carry. Package only the built theme.":["Ce zip contient %(entries)s fichiers, plus que les %(max)s qu'un thème peut contenir. Empaquetez seulement le thème construit."],"Through":["Via"],"Thumbnail":["Miniature"],"Title":["Titre"],"Two field groups in this file share the key %(key)s. Give one of them a different key and import again.":["Deux groupes de champs de ce fichier partagent la clé %(key)s. Donnez une clé différente à l'un d'eux et importez à nouveau."],"Two rule sources are registered under the name %(param)s. A plugin is declaring a source your site already holds.":["Deux sources de règles sont enregistrées sous le nom %(param)s. Une extension déclare une source que votre site possède déjà."],"Type":["Type"],"Type a whole number in both boxes before saving.":["Saisissez un nombre entier dans les deux cases avant d'enregistrer."],"Undo":["Annuler"],"Unsaved changes":["Modifications non enregistrées"],"Update":["Mettre à jour"],"Update failed.":["La mise à jour a échoué."],"Upload theme":["Téléverser un thème"],"Uploaded %s file.":["%s fichier téléversé.","%s fichiers téléversés.","%s fichiers téléversés."],"Users":["Utilisateurs"],"Users could not be loaded.":["Les utilisateurs n'ont pas pu être chargés."],"Value":["Valeur"],"Version":["Version"],"Videos":["Vidéos"],"Visit Site":["Aller sur le site"],"Web address":["Adresse web"],"What each Linked from field reads":["Ce que lit chaque champ Lié depuis"],"What it points at changed, so its stored values go with it.":["Ce qu'il vise a changé, donc ses valeurs enregistrées partent avec lui."],"Where %(group)s appears":["Où apparaît %(group)s"],"Without a rule this field always shows.":["Sans aucune règle ce champ s'affiche toujours."],"Without a rule this group appears nowhere.":["Sans une règle ce groupe n'apparaît nulle part."],"Yes":["Oui"],"Yes or no":["Oui ou non"],"You cannot change your own role.":["Vous ne pouvez pas changer votre propre rôle."],"Your language":["Votre langue"],"Your role does not allow %(capability)s.":["Votre rôle ne permet pas %(capability)s."],"Your server pins the site to the theme %(name)s, so themes cannot be changed here. Ask whoever looks after your site to remove the pin.":["Votre serveur fixe le site au thème %(name)s, les thèmes ne peuvent donc pas être changés ici. Demandez à la personne qui s'occupe de votre site de retirer cette fixation."],"Your site always needs one default content type, so this one cannot be turned off or deleted. Make another type the default first.":["Votre site a toujours besoin d'un type de contenu par défaut, celui-ci ne peut donc être ni désactivé ni supprimé. Rendez d'abord un autre type par défaut."],"a content type":["un type de contenu"],"account\u0004Role":["Rôle"],"account\u0004Status":["État"],"action label\u0004Duplicate":["Dupliquer"],"action label\u0004Duplicate…":["Dupliquer…"],"address":["adresse"],"admin section\u0004Media":["Médias"],"column\u0004Date":["Date"],"content type\u0004\"%s\" permanently deleted.":["Type de contenu « %s » supprimé définitivement."],"content type\u0004\"%s\" successfully created.":["Type de contenu « %s » créé avec succès."],"content type\u0004Status":["État"],"field\u0004Name":["Nom"],"field group\u0004Status":["Statut"],"field type\u0004Choice":["Choix"],"field type\u0004Color":["Couleur"],"field type\u0004Date":["Date"],"field type\u0004Flexible content":["Contenu flexible"],"field type\u0004Gallery":["Galerie"],"field type\u0004Kind":["Genre"],"field type\u0004Layout":["Disposition"],"field type\u0004Link":["Lien"],"field type\u0004Media":["Média"],"field type\u0004Range":["Plage"],"field type\u0004Repeater":["Répéteur"],"field type\u0004Section":["Section"],"field type\u0004Select":["Liste déroulante"],"holds":["contient"],"holds anything":["contient quelque chose"],"is":["est"],"is above":["est supérieur à"],"is below":["est inférieur à"],"is empty":["est vide"],"is not":["n'est pas"],"media family\u0004Kind":["Type"],"panel button label\u0004Settings":["Réglages"],"person\u0004Name":["Nom"],"post\u0004%s (Copy)":["%s (copie)"],"post\u0004Status":["État"],"post status\u0004Draft":["Brouillon"],"post status\u0004Published":["Publié"],"post status\u0004Trash":["Corbeille"],"post type general name\u0004Pages":["Pages"],"post type general name\u0004Posts":["Articles"],"post type singular name\u0004Page":["Page"],"post type singular name\u0004Post":["Article"],"relation target\u0004None":["Aucun"],"role\u0004Administrator":["Administrateur"],"role\u0004Author":["Auteur"],"role\u0004Editor":["Éditeur"],"role\u0004Member":["Membre"],"role\u0004No role":["Sans rôle"],"status filter\u0004All":["Tout"],"taxonomy general name\u0004Categories":["Catégories"],"taxonomy singular name\u0004Category":["Catégorie"],"theme\u0004Status":["État"],"trash\u0004Restore":["Rétablir"],"v%(version)s":["v%(version)s"],"verb\u0004Trash…":["Mettre à la corbeille…"],"verb\u0004View":["Voir"],"{day} {month} {year}":["{day} {month} {year}"]} +{"":{"lang":"fr","plural-forms":"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"}," and ":[" et "]," or ":[" ou "],"\"%s\" activated.":["Type de contenu « %s » activé."],"\"%s\" deactivated.":["Type de contenu « %s » désactivé."],"\"%s\" has been restored.":["« %s » a été rétabli."],"\"%s\" moved to the trash.":["« %s » déplacé dans la corbeille."],"\"%s\" permanently deleted.":["« %s » supprimé définitivement."],"\"%s\" successfully created.":["« %s » créé avec succès."],"\"%s\" uploaded.":["« %s » téléversé."],"%(field)s address":["Adresse de %(field)s"],"%(field)s cannot move inside itself. Pick a container that is not one of its own.":["%(field)s ne peut pas être déplacé à l'intérieur de lui-même. Choisissez un conteneur qui n'est pas l'un des siens."],"%(field)s declared.":["%(field)s déclaré."],"%(field)s deleted.":["%(field)s supprimé."],"%(field)s does not match the format its field asks for. Check it and save again.":["%(field)s ne respecte pas le format demandé par son champ. Vérifiez-le et enregistrez de nouveau."],"%(field)s goes no higher than %(limit)s. Lower the value and save again.":["%(field)s ne dépasse pas %(limit)s. Baissez la valeur et enregistrez de nouveau."],"%(field)s goes no lower than %(limit)s. Raise the value and save again.":["%(field)s ne descend pas sous %(limit)s. Augmentez la valeur et enregistrez de nouveau."],"%(field)s holds no value of its own, so it cannot be required. Make it optional.":["%(field)s ne contient aucune valeur propre, il ne peut donc pas être obligatoire. Rendez-le facultatif."],"%(field)s is optional again.":["%(field)s est de nouveau facultatif."],"%(field)s is required now.":["%(field)s est maintenant obligatoire."],"%(field)s moved.":["%(field)s déplacé."],"%(field)s names the same one twice. Remove the repeat and save again.":["%(field)s nomme le même deux fois. Retirez la répétition et enregistrez de nouveau."],"%(field)s needs at least %(limit)s files. Add one and save again.":["%(field)s demande au moins %(limit)s fichiers. Ajoutez-en un et enregistrez."],"%(field)s needs at least %(limit)s rows. Add one and save again.":["%(field)s demande au moins %(limit)s lignes. Ajoutez-en une et enregistrez."],"%(field)s only takes one of its listed choices. Pick one and save again.":["%(field)s accepte uniquement un des choix de sa liste. Choisissez-en un et enregistrez de nouveau."],"%(field)s reads a relation field that is not there. Pick a group and a relation field it holds.":["%(field)s lit un champ de relation qui n'existe pas. Choisissez un groupe et un champ de relation qu'il contient."],"%(field)s reads a relation pointing at %(type)s, so it would list nothing here. Pick a relation pointing at the items this group is shown on.":["%(field)s lit une relation qui pointe vers %(type)s, elle n'afficherait donc rien ici. Choisissez une relation qui pointe vers les éléments où ce groupe s'affiche."],"%(field)s renamed.":["%(field)s renommé."],"%(field)s settled.":["%(field)s réglé."],"%(field)s shows by its rules now.":["%(field)s s'affiche désormais selon ses règles."],"%(field)s stands in the list.":["%(field)s figure dans la liste."],"%(field)s stays out of the list.":["%(field)s reste hors de la liste."],"%(field)s takes at most %(limit)s files. Remove one and save again.":["%(field)s accepte au plus %(limit)s fichiers. Retirez-en un et enregistrez."],"%(field)s takes at most %(limit)s letters. Shorten what you wrote and save again.":["%(field)s accepte au plus %(limit)s lettres. Raccourcissez ce que vous avez écrit et enregistrez de nouveau."],"%(field)s takes at most %(limit)s rows. Remove one and save again.":["%(field)s accepte au plus %(limit)s lignes. Retirez-en une et enregistrez."],"%(field)s title":["Titre de %(field)s"],"%(file)s is larger than one upload may be.":["%(file)s dépasse la taille maximale d'un téléversement."],"%(file)s is not a file this block accepts.":["%(file)s n'est pas un fichier que ce bloc accepte."],"%(file)s: %(reason)s":["%(file)s : %(reason)s"],"%(group)s created.":["%(group)s créé."],"%(group)s now appears where you said.":["%(group)s apparaît maintenant là où vous avez dit."],"%(group)s removed.":["%(group)s supprimé."],"%(group)s updated.":["%(group)s mis à jour."],"%(key)s is served by %(winner)s, so %(loser)s does not show it on %(where)s.":["%(key)s est servi par %(winner)s, donc %(loser)s ne le montre pas sur %(where)s."],"%(name)s %(version)s is serving the public site.":["%(name)s %(version)s sert le site public."],"%(name)s belongs to the site now.":["%(name)s appartient désormais au site."],"%(name)s came from the %(plugin)s plugin, which no longer declares it.":["%(name)s venait de l'extension %(plugin)s, qui ne le déclare plus."],"%(name)s cannot be used as a theme name. Name the zip file after the theme, with no dot at the start and no slashes in it.":["%(name)s ne peut pas servir de nom de thème. Nommez le fichier zip comme le thème, sans point au début et sans barre oblique."],"%(name)s moves to /%(word)s. Every address of both types changes.":["Le type %(name)s passe à /%(word)s. Toutes les adresses des deux types changent."],"%(name)s would move to /%(word)s, which Gophenberg keeps for itself. Change its plural name and try again.":["Le type %(name)s passerait à /%(word)s, que Gophenberg garde pour lui. Modifiez son nom au pluriel et réessayez."],"%(source)s is %(value)s":["%(source)s est %(value)s"],"%(theme)s failed to start, so the built-in renderer is serving.":["%(theme)s n'a pas pu démarrer, le moteur de rendu intégré sert donc le site."],"%(theme)s is now serving the public site.":["%(theme)s sert désormais le site public."],"%(theme)s is serving the public site.":["%(theme)s sert le site public."],"%(theme)s is still starting, so the built-in renderer is serving.":["%(theme)s démarre encore, le moteur de rendu intégré sert donc le site."],"%(theme)s was installed.":["%(theme)s a été installé."],"%(theme)s will not load, so the built-in renderer is serving.":["%(theme)s ne se charge pas, le moteur de rendu intégré sert donc le site."],"%(type)s answers on a new address, and stored links move with it.":["%(type)s répond à une nouvelle adresse, et les liens enregistrés la suivent."],"%(type)s becomes the type the site opens on, and the old one takes an address.":["%(type)s devient le type sur lequel le site ouvre, et l'ancien prend une adresse."],"%(type)s keeps nesting while %(items)s of its items sit inside another. Move those to the top level first, the ones in the trash included.":["%(type)s continue de s'imbriquer tant que %(items)s de ses éléments se trouvent dans un autre. Déplacez-les d'abord au niveau supérieur, ceux de la corbeille compris."],"%(type)s keeps nesting, because some of its items sit inside another.":["%(type)s continue de s'imbriquer, car certains de ses éléments se trouvent dans un autre."],"%(type)s will answer at the root.":["Le type %(type)s répondra à la racine."],"%s content type activated.":["%s type de contenu activé.","%s types de contenu activés.","%s types de contenu activés."],"%s content type could not be activated.":["%s type de contenu n'a pas pu être activé.","%s types de contenu n'ont pas pu être activés.","%s types de contenu n'ont pas pu être activés."],"%s content type could not be deactivated.":["%s type de contenu n'a pas pu être désactivé.","%s types de contenu n'ont pas pu être désactivés.","%s types de contenu n'ont pas pu être désactivés."],"%s content type could not be permanently deleted.":["%s type de contenu n'a pas pu être supprimé définitivement.","%s types de contenu n'ont pas pu être supprimés définitivement.","%s types de contenu n'ont pas pu être supprimés définitivement."],"%s content type deactivated.":["%s type de contenu désactivé.","%s types de contenu désactivés.","%s types de contenu désactivés."],"%s content type permanently deleted.":["%s type de contenu supprimé définitivement.","%s types de contenu supprimés définitivement.","%s types de contenu supprimés définitivement."],"%s item could not be moved to the trash.":["%s élément n'a pas pu être déplacé dans la corbeille.","%s éléments n'ont pas pu être déplacés dans la corbeille.","%s éléments n'ont pas pu être déplacés dans la corbeille."],"%s item could not be permanently deleted.":["%s élément n'a pas pu être supprimé définitivement.","%s éléments n'ont pas pu être supprimés définitivement.","%s éléments n'ont pas pu être supprimés définitivement."],"%s item could not be restored.":["%s élément n'a pas pu être rétabli.","%s éléments n'ont pas pu être rétablis.","%s éléments n'ont pas pu être rétablis."],"%s item moved to the trash.":["%s élément déplacé dans la corbeille.","%s éléments déplacés dans la corbeille.","%s éléments déplacés dans la corbeille."],"%s item permanently deleted.":["%s élément supprimé définitivement.","%s éléments supprimés définitivement.","%s éléments supprimés définitivement."],"%s item stays in the trash.":["%s élément reste dans la corbeille.","%s éléments restent dans la corbeille.","%s éléments restent dans la corbeille."],"%s page has been restored.":["%s page a été rétablie.","%s pages ont été rétablies.","%s pages ont été rétablies."],"%s post has been restored.":["%s article a été rétabli.","%s articles ont été rétablis.","%s articles ont été rétablis."],"(no title)":["(sans titre)"],"A %(kind)s field does not take a setting called %(setting)s. Remove it and try again.":["Un champ %(kind)s n'accepte pas de réglage nommé %(setting)s. Retirez-le et réessayez."],"A Linked from field stands on its own, not inside a section or a repeater. Declare %(field)s beside the container.":["Un champ Lié depuis se place seul, ni dans une section ni dans un répéteur. Déclarez %(field)s à côté du conteneur."],"A content type needs a singular and a plural name, like Guide and Guides. Fill both in and try again.":["Un type de contenu a besoin d'un nom au singulier et d'un nom au pluriel, comme Guide et Guides. Remplissez les deux et réessayez."],"A descriptive summary of the content type.":["Un résumé descriptif du type de contenu."],"A field group key has to start with a lowercase letter and then hold only lowercase letters, numbers and hyphens. Rename the group in the file so its key comes out in that shape.":["La clé d'un groupe de champs doit commencer par une lettre minuscule puis ne contenir que des lettres minuscules, des chiffres et des tirets. Renommez le groupe dans le fichier pour que sa clé prenne cette forme."],"A field key has to start with a lowercase letter and then hold only lowercase letters, numbers and hyphens. Rename the field so its key comes out in that shape.":["La clé d'un champ doit commencer par une lettre minuscule et ne contenir ensuite que des lettres minuscules, des chiffres et des tirets. Renommez le champ pour que sa clé prenne cette forme."],"A field needs a name. Type one and try again.":["Un champ a besoin d'un nom. Saisissez-en un et réessayez."],"A field with that name already exists on the items this group reaches. Pick another name.":["Un champ portant ce nom existe déjà sur les éléments que ce groupe atteint. Choisissez un autre nom."],"A flexible content field holds layouts, and %(field)s is not one. Add a layout first, then declare the field inside that layout.":["Un champ de contenu flexible contient des dispositions, et %(field)s n'en est pas une. Ajoutez d'abord une disposition, puis déclarez le champ dans cette disposition."],"A higher quality stores larger files, and it applies to pictures uploaded from now on.":["Une qualité plus élevée stocke des fichiers plus grands, et elle s'applique aux images téléversées à partir de maintenant."],"A layout stands inside a flexible content field only. Put %(field)s inside one of those instead.":["Une disposition ne se place que dans un champ de contenu flexible. Placez %(field)s dans l'un d'eux."],"A layout stands inside a flexible content field, never on its own. Declare a flexible content field first, then add %(field)s inside it.":["Une disposition se place dans un champ de contenu flexible, jamais seule. Déclarez d'abord un champ de contenu flexible, puis ajoutez %(field)s dedans."],"A listing carries between 1 and %(max)s items, so %(value)s is not a size Gophenberg takes. Pick a number inside that range.":["Une liste affiche entre 1 et %(max)s éléments, donc %(value)s n'est pas une taille que Gophenberg accepte. Choisissez un nombre dans cet intervalle."],"A relation field has to say which content type it points at. Pick that type and try again.":["Un champ de relation doit indiquer le type de contenu qu'il vise. Choisissez ce type et réessayez."],"A reload shows the admin in the language you chose.":["Un rechargement affiche l'administration dans la langue que vous avez choisie."],"A route word has to start with a lowercase letter and then hold only lowercase letters, numbers and hyphens. Change it and try again.":["Un mot de route doit commencer par une lettre minuscule et ne contenir ensuite que des lettres minuscules, des chiffres et des tirets. Modifiez-le et réessayez."],"A row of %(field)s has to name the layout it takes. Pick a layout for the row, or remove the row.":["Une ligne de %(field)s doit nommer la disposition qu'elle prend. Choisissez une disposition pour la ligne, ou retirez la ligne."],"A row of %(field)s takes one layout and no more. Reload the page and build the row again.":["Une ligne de %(field)s prend une seule disposition. Rechargez la page et reconstruisez la ligne."],"A rule matching any %(source)s cannot be turned into an exclusion. Leave it as is, or name the ones to leave out instead.":["Une règle valable pour n'importe quel %(source)s ne peut pas devenir une exclusion. Laissez-la telle quelle, ou nommez ceux à écarter."],"A theme naming its own page size uses that instead.":["Un thème qui indique sa propre taille de page utilise celle-ci à la place."],"A type key has to start with a lowercase letter and then hold only lowercase letters, numbers and hyphens. Change the key and try again.":["La clé d'un type doit commencer par une lettre minuscule et ne contenir ensuite que des lettres minuscules, des chiffres et des tirets. Modifiez la clé et réessayez."],"Actions":["Actions"],"Activate":["Activer"],"Activate %(theme)s":["Activer %(theme)s"],"Active":["Actif"],"Add":["Ajouter"],"Add %(layout)s":["Ajouter %(layout)s"],"Add %(name)s":["Ajouter %(name)s"],"Add %(type)s":["Ajouter %(type)s"],"Add Category":["Ajouter une catégorie"],"Add Content Type":["Ajouter un type de contenu"],"Add Field Group":["Ajouter un groupe de champs"],"Add Media File":["Ajouter un fichier média"],"Add Page":["Ajouter une page"],"Add Post":["Ajouter un article"],"Add User":["Ajouter un utilisateur"],"Add block":["Ajouter un bloc"],"Add choice":["Ajouter un choix"],"Add condition":["Ajouter une condition"],"Add field":["Ajouter un champ"],"Add field to %(field)s":["Ajouter un champ à %(field)s"],"Add layout":["Ajouter une disposition"],"Add layout to %(field)s":["Ajouter une disposition à %(field)s"],"Add one with %(button)s.":["Ajoutez un élément avec %(button)s."],"Add row":["Ajouter une ligne"],"Add rule set":["Ajouter un ensemble de règles"],"Add title":["Ajouter un titre"],"Add to %(field)s":["Ajouter à %(field)s"],"Address":["Adresse"],"Address updated.":["Adresse mise à jour."],"Adopt":["Adopter"],"Allow custom":["Autoriser les valeurs libres"],"Allow empty":["Autoriser le vide"],"Alt text":["Texte alternatif"],"An item cannot point at itself. Pick a different item for %(field)s.":["Un élément ne peut pas se viser lui-même. Choisissez un autre élément pour %(field)s."],"An item cannot sit inside itself, or inside one of the items nested under it. Pick a parent outside this branch.":["Un élément ne peut pas se trouver dans lui-même, ni dans un élément imbriqué sous lui. Choisissez un parent hors de cette branche."],"Another account wrote this, and only its author, an editor or an administrator may change it. You can still read it.":["Un autre compte a écrit ceci, et seuls son auteur, un éditeur ou un administrateur peuvent le modifier. Vous pouvez toujours le lire."],"Another account wrote this, so you are reading it rather than editing it.":["Un autre compte a écrit ceci, alors vous le lisez au lieu de le modifier."],"Another content type already answers under this route word. Pick a different word.":["Un autre type de contenu répond déjà sous ce mot de route. Choisissez un autre mot."],"Another content type already lives at the root of your site, and only one can. Give this type a route word, or hand the root over with Make default.":["Un autre type de contenu occupe déjà la racine de votre site, et un seul le peut. Donnez un mot de route à ce type, ou cédez la racine avec Rendre par défaut."],"Another content type already uses this key. Give this type a different name.":["Un autre type de contenu utilise déjà cette clé. Donnez un autre nom à ce type."],"Another item of this content type already uses that address. Pick a different slug and save again.":["Un autre élément de ce type de contenu utilise déjà cette adresse. Choisissez un autre slug et enregistrez de nouveau."],"Another update is currently in progress.":["Une autre mise à jour est actuellement en cours."],"Appears on":["Apparaît sur"],"Apply":["Appliquer"],"April":["avril"],"Are you sure you want to move \"%s\" to the trash?":["Voulez-vous vraiment déplacer « %s » dans la corbeille ?"],"Audio":["Audio"],"August":["août"],"Author":["Auteur"],"Back to %(type)s":["Retour aux %(type)s"],"Back to the latest posts":["Retour aux derniers articles"],"Block":["Bloc"],"Broken":["Cassé"],"Bundles of fields, shown where their rules place them.":["Ensembles de champs, affichés là où leurs règles les placent."],"Button group":["Groupe de boutons"],"Cancel":["Annuler"],"Caption":["Légende"],"Change %(name)s":["Modifier %(name)s"],"Change address":["Changer l'adresse"],"Change address…":["Changer l'adresse…"],"Change role":["Changer le rôle"],"Change the role of %(name)s":["Changer le rôle de %(name)s"],"Checkbox group":["Groupe de cases à cocher"],"Choices":["Choix"],"Choose %(field)s":["Choisir %(field)s"],"Choose how the site serves its content.":["Choisissez comment le site sert son contenu."],"Choose the language the admin reads in.":["Choisissez la langue dans laquelle se lit l'administration."],"Choose the role of %(name)s.":["Choisissez le rôle de %(name)s."],"Choose the version to update to.":["Choisissez la version vers laquelle mettre à jour."],"Clear %(field)s":["Vider %(field)s"],"Close":["Fermer"],"Close Settings":["Fermer les réglages"],"Closed":["Fermé"],"Condition":["Condition"],"Content":["Contenu"],"Content Types":["Types de contenu"],"Content nests at most %(max)s levels deep, and this item would sit deeper. Pick a parent closer to the top.":["Le contenu s'imbrique sur au plus %(max)s niveaux, et cet élément irait plus profond. Choisissez un parent plus proche du sommet."],"Content type":["Type de contenu"],"Content type updated.":["Type de contenu mis à jour."],"Could not delete that item.":["Impossible de supprimer cet élément.","Impossible de supprimer tous les éléments.","Impossible de supprimer tous les éléments."],"Could not load that post.":["Impossible de charger cet article."],"Could not save that post.":["Impossible d'enregistrer cet article."],"Create":["Créer"],"Create a field group":["Créer un groupe de champs"],"Create user":["Créer l'utilisateur"],"Created":["Date de création"],"Date added":["Date d'ajout"],"Deactivate":["Désactiver"],"Deactivate %(theme)s":["Désactiver %(theme)s"],"December":["décembre"],"Default":["Par défaut"],"Default content type updated.":["Type de contenu par défaut mis à jour."],"Definitions file":["Fichier de définitions"],"Delete":["Supprimer"],"Delete \"%(title)s\" for good? This cannot be undone.":["Supprimer « %(title)s » définitivement ? Cette action est irréversible."],"Delete %(field)s":["Supprimer %(field)s"],"Delete %(group)s":["Supprimer %(group)s"],"Delete %(title)s for good? This cannot be undone.":["Supprimer %(title)s définitivement ? Cette action est irréversible."],"Delete %s content type for good? This cannot be undone.":["Supprimer %s type de contenu définitivement ? Cette action est irréversible.","Supprimer %s types de contenu définitivement ? Cette action est irréversible.","Supprimer %s types de contenu définitivement ? Cette action est irréversible."],"Delete %s item for good? This cannot be undone.":["Supprimer %s élément définitivement ? Cette action est irréversible.","Supprimer %s éléments définitivement ? Cette action est irréversible.","Supprimer %s éléments définitivement ? Cette action est irréversible."],"Delete Permanently":["Supprimer définitivement"],"Delete the field":["Supprimer le champ"],"Delete the group":["Supprimer le groupe"],"Delete this %(count)s item for good? This cannot be undone.":["Supprimer définitivement ce %(count)s élément ? Cette action est irréversible.","Supprimer définitivement ces %(count)s éléments ? Cette action est irréversible.","Supprimer définitivement ces %(count)s éléments ? Cette action est irréversible."],"Delete…":["Supprimer…"],"Describe":["Décrire"],"Describe…":["Décrire…"],"Description":["Description"],"Description updated.":["Description mise à jour."],"Desktop":["Ordinateur"],"Destination":["Destination"],"Dimensions":["Dimensions"],"Disable":["Désactiver"],"Disable %(name)s":["Désactiver %(name)s"],"Disabled":["Désactivé"],"Dismiss":["Ignorer"],"Document":["Document"],"Done. The site now holds what the file describes.":["Terminé. Le site contient maintenant ce que décrit le fichier."],"Draft saved.":["Brouillon enregistré."],"Drop files to upload":["Déposez vos fichiers pour les téléverser"],"Email":["E-mail"],"Empty Trash":["Vider la corbeille"],"Empty trash":["Vider la corbeille"],"Enable":["Activer"],"Enable %(name)s":["Activer %(name)s"],"Every address of this type moves. Links kept elsewhere to the old addresses stop working.":["Toutes les adresses de ce type changent. Les liens conservés ailleurs vers les anciennes adresses cessent de fonctionner."],"Every content type":["Tous les types de contenu"],"Every field group needs a title. Give it a name and save again.":["Chaque groupe de champs a besoin d'un titre. Donnez-lui un nom et enregistrez à nouveau."],"Every item needs an author who exists. Pick one from the list and save again.":["Chaque élément a besoin d'un auteur existant. Choisissez-en un dans la liste et enregistrez de nouveau."],"Every kind of content this site holds.":["Toutes les sortes de contenu que ce site contient."],"Every value stored under this field goes with it, in every item the group reaches and in the revisions behind them.":["Toutes les valeurs enregistrées dans ce champ partent avec lui, dans chaque élément que le groupe atteint et dans les révisions qui les suivent."],"Excerpt":["Extrait"],"Export definitions":["Exporter les définitions"],"February":["février"],"Fewest files":["Minimum de fichiers"],"Fewest rows":["Minimum de lignes"],"Field":["Champ"],"Field Groups":["Groupes de champs"],"Field group":["Groupe de champs"],"Fields":["Champs"],"Fields of %(group)s":["Champs de %(group)s"],"File name":["Nom du fichier"],"File size":["Taille du fichier"],"File type":["Type de fichier"],"Files":["Fichiers"],"Filter by status":["Filtrer par état"],"Follow the browser":["Suivre le navigateur"],"From %(plugin)s":["De %(plugin)s"],"Full Size":["Taille originale"],"Gophenberg cannot start this update: %(reason)s":["Gophenberg ne peut pas lancer cette mise à jour : %(reason)s"],"Gophenberg checked for updates moments ago. Try again later.":["Gophenberg a cherché des mises à jour il y a un instant. Réessayez plus tard."],"Gophenberg could not read what your browser sent. Reload the page and try again, and tell whoever looks after your site if it keeps happening.":["Gophenberg n'a pas pu lire ce que votre navigateur a envoyé. Rechargez la page et réessayez, et prévenez la personne qui s'occupe de votre site si cela continue."],"Gophenberg could not read which item you picked as parent. Reload the page and pick it again.":["Gophenberg n'a pas pu lire quel élément vous avez choisi comme parent. Rechargez la page et choisissez-le de nouveau."],"Gophenberg does not accept %(extension)s files. Upload a picture, a video, an audio file, a PDF or a zip instead.":["Gophenberg n'accepte pas les fichiers %(extension)s. Téléversez plutôt une image, une vidéo, un fichier audio, un PDF ou un zip."],"Gophenberg does not answer in %(value)s. Pick one of the languages on the list.":["Gophenberg ne répond pas en %(value)s. Choisissez une des langues de la liste."],"Gophenberg has no autosave of yours for this item. Open the item to see the version that is stored.":["Gophenberg n'a aucun enregistrement automatique de vous pour cet élément. Ouvrez l'élément pour voir la version stockée."],"Gophenberg holds no kind of definition called %(subject)s, so nothing was taken over. Reload the page so the admin and the server agree again.":["Gophenberg ne connaît aucune sorte de définition nommée %(subject)s, rien n'a donc été repris. Rechargez la page pour que l'admin et le serveur se rejoignent à nouveau."],"Gophenberg keeps /%(path)s for itself or for another content type, so your content cannot answer there. Give the item a different slug.":["Gophenberg garde l'adresse /%(path)s pour lui ou pour un autre type de contenu, votre contenu ne peut donc pas y répondre. Donnez un autre slug à l'élément."],"Gophenberg keeps this word for itself, so no content type can answer under it. Pick a different route word.":["Gophenberg garde ce mot pour lui, aucun type de contenu ne peut donc répondre sous ce mot. Choisissez un autre mot de route."],"Group":["Groupe"],"Highest":["Maximum"],"Holds":["Contient"],"Images":["Images"],"Import definitions":["Importer les définitions"],"In list":["Dans la liste"],"Inactive":["Inactif"],"Installed":["Installé"],"Instructions":["Instructions"],"It moves here from another group and keeps its stored values.":["Il arrive ici depuis un autre groupe et garde ses valeurs enregistrées."],"It moves to another group and keeps its stored values.":["Il passe dans un autre groupe et garde ses valeurs enregistrées."],"It moves to another group, so its stored values do not follow.":["Il passe dans un autre groupe, donc ses valeurs enregistrées ne le suivent pas."],"It reads a relation inside a container, and only an import can point it elsewhere.":["Il lit une relation dans un conteneur, et seule une importation peut le faire pointer ailleurs."],"It starts on %(type)s, and the rules may be edited afterwards.":["Il commence sur %(type)s, et les règles peuvent être modifiées ensuite."],"Items could not be loaded.":["Les éléments n'ont pas pu être chargés."],"Its items sit inside one another, so it keeps nesting.":["Ses éléments se trouvent les uns dans les autres, donc il continue de s'imbriquer."],"Its kind changed, so its stored values go with it.":["Son type a changé, donc ses valeurs enregistrées partent avec lui."],"January":["janvier"],"July":["juillet"],"June":["juin"],"Keep %(field)s out of the list":["Garder %(field)s hors de la liste"],"Keep it":["Le conserver"],"Keep it here":["Le laisser ici"],"Key":["Clé"],"Label":["Libellé"],"Language":["Langue"],"Large":["Grande"],"Let items nest":["Autoriser l'imbrication"],"Linked from":["Lié depuis"],"List view":["Vue en liste"],"Loading field groups.":["Chargement des groupes de champs."],"Loading the post.":["Chargement de l'article."],"Loading the screen.":["Chargement de l'écran."],"Loading themes.":["Chargement des thèmes."],"Loading users.":["Chargement des utilisateurs."],"Loading…":["Chargement…"],"Longest":["Longueur maximale"],"Lowest":["Minimum"],"Make %(field)s optional":["Rendre %(field)s facultatif"],"Make default":["Rendre par défaut"],"Make default…":["Rendre par défaut…"],"Make optional":["Rendre facultatif"],"Manage the categories on this site.":["Gérez les catégories de ce site."],"Manage the images and files this site holds.":["Gérez les images et les fichiers que ce site contient."],"Manage the items of this content type.":["Gérez les éléments de ce type de contenu."],"Manage the pages on this site.":["Gérez les pages de ce site."],"Manage the posts on this site.":["Gérez les articles de ce site."],"Many targets":["Plusieurs cibles"],"Many values":["Plusieurs valeurs"],"March":["mars"],"May":["mai"],"Media %(id)s":["Média %(id)s"],"Media Library":["Bibliothèque de médias"],"Medium":["Moyenne"],"Mobile":["Mobile"],"Modified: %s":["Modifié : %s"],"Most files":["Maximum de fichiers"],"Most rows":["Maximum de lignes"],"Move":["Déplacer"],"Move \"%(title)s\" to the trash?":["Déplacer « %(title)s » dans la corbeille ?"],"Move %(field)s down":["Descendre %(field)s"],"Move %(field)s elsewhere":["Déplacer %(field)s ailleurs"],"Move %(field)s up":["Monter %(field)s"],"Move %(group)s down":["Descendre %(group)s"],"Move %(group)s up":["Monter %(group)s"],"Move %(name)s down":["Descendre %(name)s"],"Move %(name)s up":["Monter %(name)s"],"Move %s item to the trash?":["Déplacer %s élément dans la corbeille ?","Déplacer %s éléments dans la corbeille ?","Déplacer %s éléments dans la corbeille ?"],"Move every address":["Déplacer toutes les adresses"],"Move row down":["Descendre la ligne"],"Move row up":["Monter la ligne"],"Move the field":["Déplacer le champ"],"Move to trash":["Déplacer dans la corbeille"],"Name":["Nom"],"Name updated.":["Nom mis à jour."],"Nests":["Imbriqué"],"Newer posts":["Articles plus récents"],"No":["Non"],"No content types found.":["Aucun type de contenu trouvé."],"No description":["Aucune description"],"No file arrived with this upload. Choose a file and try again.":["Aucun fichier n'est arrivé avec ce téléversement. Choisissez un fichier et réessayez."],"No items found.":["Aucun élément trouvé."],"No items yet.":["Aucun élément pour l'instant."],"No media chosen":["Aucun média choisi"],"No media has been uploaded yet.":["Aucun média n'a encore été téléversé."],"No media items found.":["Aucun fichier média trouvé."],"No media items yet.":["Aucun fichier média pour l’instant."],"No page lives at this address.":["Aucune page n'existe à cette adresse."],"No parent":["Pas de parent"],"No theme arrived with this upload. Choose a zip file and try again.":["Aucun thème n'est arrivé avec ce téléversement. Choisissez un fichier zip et réessayez."],"No themes are installed.":["Aucun thème n'est installé."],"No title":["Sans titre"],"None":["Aucun"],"Not %(type)s":["Sauf %(type)s"],"Not found":["Introuvable"],"Not serving":["Hors service"],"Nothing declares that role.":["Rien ne déclare ce rôle."],"Nothing points here yet.":["Rien ne pointe encore ici."],"Nothing published here yet.":["Rien n'est encore publié ici."],"Nothing published yet.":["Rien n'est encore publié."],"November":["novembre"],"Nowhere":["Nulle part"],"Number":["Nombre"],"October":["octobre"],"Older posts":["Articles plus anciens"],"One frame of this animation holds more than %(max)s pixels, which is more than Gophenberg opens. Upload a smaller animation.":["Une image de cette animation dépasse %(max)s pixels, plus que ce que Gophenberg ouvre. Téléversez une animation plus petite."],"One of the filters on this list is not one Gophenberg understands. Clear the filters and try again.":["Un des filtres de cette liste n'est pas un filtre que Gophenberg comprend. Videz les filtres et réessayez."],"One of the items picked for %(field)s is not the kind of content that field points at. Reload the page and pick from the list the field offers.":["Un des éléments choisis pour %(field)s n'est pas le genre de contenu que vise ce champ. Rechargez la page et choisissez dans la liste que le champ propose."],"One of the items picked for %(field)s was not named in a way Gophenberg understands. Reload the page and pick the items again.":["Un des éléments choisis pour %(field)s n'était pas nommé d'une façon que Gophenberg comprend. Rechargez la page et choisissez de nouveau les éléments."],"One of the items picked no longer exists. Reload the page and pick again.":["Un des éléments choisis n'existe plus. Rechargez la page et choisissez de nouveau."],"One target":["Une cible"],"Only a relation field points at another content type or holds many items. Pick the Relation kind, or leave the target and the many option empty.":["Seul un champ de relation vise un autre type de contenu ou contient plusieurs éléments. Choisissez le genre Relation, ou laissez vides la cible et l'option plusieurs."],"Only one file may be placed here.":["Un seul fichier peut être placé ici."],"Only the content type at the root of your site may go without a route word. Give this type one and try again.":["Seul le type de contenu à la racine de votre site peut se passer de mot de route. Donnez-en un à ce type et réessayez."],"Open %(field)s in a new tab":["Ouvrir %(field)s dans un nouvel onglet"],"Order stored.":["Ordre enregistré."],"Other":["Autre"],"Out of list":["Hors de la liste"],"Parent":["Parent"],"Password":["Mot de passe"],"Pending":["En attente"],"Pending Review":["En attente de relecture"],"Permanently delete":["Supprimer définitivement"],"Permanently delete…":["Supprimer définitivement…"],"Picture quality":["Qualité d'image"],"Picture quality runs from 1 to %(max)s, so %(value)s is not a quality Gophenberg stores at. Pick a number inside that range.":["La qualité d'image va de 1 à %(max)s, donc %(value)s n'est pas une qualité avec laquelle Gophenberg enregistre. Choisissez un nombre dans cet intervalle."],"Placeholder":["Texte indicatif"],"Plural name":["Nom au pluriel"],"Points at":["Vise"],"Post published.":["Article publié."],"Posts per page":["Articles par page"],"Preview":["Prévisualiser"],"Private":["Privé"],"Publish":["Publier"],"Published: %s":["Publié : %s"],"Radio group":["Groupe de boutons radio"],"Reads from":["Lit depuis"],"Redo":["Rétablir"],"Relation":["Relation"],"Remove":["Retirer"],"Remove %(name)s":["Retirer %(name)s"],"Remove %(title)s":["Retirer %(title)s"],"Remove row":["Retirer la ligne"],"Rename":["Renommer"],"Rename %(field)s":["Renommer %(field)s"],"Rename…":["Renommer…"],"Require":["Rendre obligatoire"],"Require %(field)s":["Rendre %(field)s obligatoire"],"Required":["Obligatoire"],"Restore":["Rétablir"],"Role changed.":["Rôle modifié."],"Roll back to %(theme)s":["Revenir à %(theme)s"],"Roll back to the built-in renderer":["Revenir au moteur de rendu intégré"],"Route word":["Mot de route"],"Rule %(number)s of set %(set)s":["Règle %(number)s de l'ensemble %(set)s"],"Rule set %(number)s":["Ensemble de règles %(number)s"],"Rules":["Règles"],"Rules showing %(field)s":["Règles affichant %(field)s"],"Save":["Enregistrer"],"Save draft":["Enregistrer le brouillon"],"Save rules":["Enregistrer les règles"],"Save settings":["Enregistrer les réglages"],"Saved":["Enregistré"],"Saving":["Enregistrement"],"Scheduled":["Planifié"],"Scheduled: %s":["Planifié : %s"],"Search %(type)s…":["Rechercher des %(type)s…"],"Search audio":["Rechercher un audio"],"Search images":["Rechercher des images"],"Search media":["Rechercher des médias"],"Search videos":["Rechercher des vidéos"],"Select":["Sélectionner"],"September":["septembre"],"Serving":["En service"],"Settings":["Réglages"],"Settings of %(field)s":["Réglages de %(field)s"],"Shadowed":["Masqué"],"Show %(field)s in the list":["Afficher %(field)s dans la liste"],"Showing %(held)s of %(total)s.":["Affichage de %(held)s sur %(total)s."],"Singular name":["Nom au singulier"],"Slug":["Slug"],"Somebody must be able to manage users.":["Quelqu'un doit pouvoir gérer les utilisateurs."],"Someone else changed this media item while you were editing it. Reload the page and make your change again.":["Quelqu'un d'autre a modifié ce média pendant que vous le modifiiez. Rechargez la page et refaites votre modification."],"Someone else saved changes to this item while you were editing, so yours were not saved. Copy your text somewhere safe, then reload the item and put your changes back in.":["Quelqu'un d'autre a enregistré des modifications sur cet élément pendant que vous éditiez, les vôtres n'ont donc pas été enregistrées. Copiez votre texte en lieu sûr, puis rechargez l'élément et remettez vos modifications."],"Something went wrong inside Gophenberg. Try again in a moment, and tell whoever looks after your site if it keeps happening.":["Quelque chose a mal tourné dans Gophenberg. Réessayez dans un instant, et prévenez la personne qui s'occupe de votre site si cela continue."],"Something went wrong.":["Quelque chose a mal tourné."],"Something went wrong. Try again.":["Quelque chose a mal tourné. Réessayez."],"Sorry, you are not allowed to access this page.":["Désolé, vous n’avez pas l’autorisation d’accéder à cette page."],"Source":["Source"],"Steps of":["Pas de"],"Stop nesting":["Arrêter l'imbrication"],"Tablet":["Tablette"],"Text":["Texte"],"Text area":["Zone de texte"],"That email is already in use.":["Cet e-mail est déjà utilisé."],"That field group no longer exists. Reload the page to see the groups your site holds now.":["Ce groupe de champs n'existe plus. Rechargez la page pour voir les groupes que votre site contient maintenant."],"That field is not on this content type any more. Reload the page to see the fields it has now.":["Ce champ n'est plus sur ce type de contenu. Rechargez la page pour voir les champs qu'il possède maintenant."],"That revision does not exist, and older ones drop off once a type holds more than it keeps. Open the item to see which revisions are left.":["Cette révision n'existe pas, et les plus anciennes disparaissent quand un type en détient plus qu'il n'en conserve. Ouvrez l'élément pour voir les révisions restantes."],"That role holds more than your own.":["Ce rôle va au-delà du vôtre."],"That web address does not name a media item Gophenberg can look up. Open the media library and pick the item from there.":["Cette adresse web ne désigne aucun média que Gophenberg puisse trouver. Ouvrez la bibliothèque de médias et choisissez l'élément depuis là."],"That web address does not name a revision Gophenberg can look up. Open the item and pick a revision from its history.":["Cette adresse web ne désigne aucune révision que Gophenberg puisse trouver. Ouvrez l'élément et choisissez une révision dans son historique."],"That web address does not name an item Gophenberg can look up. Go back to the list and open the item from there.":["Cette adresse web ne désigne aucun élément que Gophenberg puisse trouver. Revenez à la liste et ouvrez l'élément depuis là."],"The %(count)s item in the trash is deleted for good. This cannot be undone.":["%(count)s élément de la corbeille est supprimé définitivement. Cette action est irréversible.","Les %(count)s éléments de la corbeille sont supprimés définitivement. Cette action est irréversible.","Les %(count)s éléments de la corbeille sont supprimés définitivement. Cette action est irréversible."],"The %(file)s calls this theme %(declared)s, but it is being installed as %(installed)s. Rename the zip file to match, or change the name inside %(file)s.":["Le fichier %(file)s appelle ce thème %(declared)s, mais il s'installe sous %(installed)s. Renommez le fichier zip pour qu'ils correspondent, ou changez le nom dans %(file)s."],"The %(file)s inside %(name)s is not valid JSON, so it could not be read. Fix that file and package the theme again.":["Le fichier %(file)s dans %(name)s n'est pas du JSON valide, il n'a donc pas pu être lu. Corrigez ce fichier et réempaquetez le thème."],"The %(file)s inside %(name)s names its theme kit as %(declared)s, which is not a version number. Build the theme again, and the build will fill that in.":["Le %(file)s dans %(name)s indique son kit de thèmes comme %(declared)s, ce qui n'est pas un numéro de version. Compilez le thème à nouveau et la compilation le renseignera."],"The %(origin)s plugin declared this, so it can only be changed in that plugin. Turning it off is still yours to do.":["L'extension %(origin)s l'a déclaré, donc il ne peut être modifié que dans cette extension. Le désactiver reste entre vos mains."],"The %(plugin)s plugin also declares %(name)s, and the site keeps the key.":["L'extension %(plugin)s déclare aussi %(name)s, et le site garde la clé."],"The %(plugin)s plugin declared these fields, so they change only in its code.":["L'extension %(plugin)s a déclaré ces champs, donc ils ne changent que dans son code."],"The %(plugin)s plugin declares %(name)s flat, and the site keeps it nesting while its items sit inside another.":["L'extension %(plugin)s déclare %(name)s sans imbrication, et le site continue de l'imbriquer tant que ses éléments se trouvent dans un autre."],"The browser kept an unsaved version of this post.":["Le navigateur a gardé une version non enregistrée de cet article."],"The built-in renderer is now serving the public site.":["Le moteur de rendu intégré sert désormais le site public."],"The built-in renderer is serving the public site.":["Le moteur de rendu intégré sert le site public."],"The content type this field points at is not named in a shape Gophenberg accepts. Give it a key that starts with a lowercase letter and then holds only lowercase letters, numbers and hyphens.":["Le type de contenu que vise ce champ n'est pas nommé sous une forme que Gophenberg accepte. Donnez-lui une clé qui commence par une lettre minuscule et ne contient ensuite que des lettres minuscules, des chiffres et des tirets."],"The content types could not be loaded, so where these groups appear and which fields they shadow are not shown.":["Les types de contenu n'ont pas pu être chargés, donc où ces groupes apparaissent et quels champs ils masquent ne sont pas affichés."],"The content types could not be loaded.":["Les types de contenu n'ont pas pu être chargés."],"The content types could not be refreshed, so where these groups appear and what they shadow may be out of date.":["Les types de contenu n'ont pas pu être actualisés, donc où ces groupes apparaissent et ce qu'ils masquent peut être obsolète."],"The draft could not be created.":["Le brouillon n'a pas pu être créé."],"The entry %(entry)s in this zip would be written outside the theme folder, so nothing was installed. Package the theme again.":["L'entrée %(entry)s de ce zip s'écrirait hors du dossier du thème, rien n'a donc été installé. Réempaquetez le thème."],"The field %(field)s cannot go, because %(by)s reads it. Change %(by)s first.":["Le champ %(field)s ne peut pas être retiré, car %(by)s le lit. Modifiez d'abord %(by)s."],"The field %(field)s cannot hold the value it was given. Check what kind of field it is and enter a value that matches.":["Le champ %(field)s ne peut pas contenir la valeur qui lui a été donnée. Vérifiez de quel genre de champ il s'agit et saisissez une valeur qui convient."],"The field %(field)s has to hold a value before this item can be published. Fill it in, or leave the item as a draft.":["Le champ %(field)s doit contenir une valeur avant que cet élément puisse être publié. Remplissez-le, ou laissez l'élément en brouillon."],"The field %(field)s in %(group)s still points at this content type. Delete that field first, then delete this type.":["Le champ %(field)s dans %(group)s vise encore ce type de contenu. Supprimez d'abord ce champ, puis supprimez ce type."],"The field %(field)s is hidden by its own rules right now, so it cannot hold a value. Show it again before filling it in.":["Le champ %(field)s est masqué par ses propres règles pour le moment, il ne peut donc contenir aucune valeur. Affichez-le de nouveau avant de le remplir."],"The field %(field)s points at one item only. Remove the extra choices and keep one.":["Le champ %(field)s ne vise qu'un seul élément. Retirez les choix en trop et gardez-en un."],"The field %(field)s points at other items, so it does not take a plain value. Pick the items it points at instead.":["Le champ %(field)s vise d'autres éléments, il n'accepte donc pas une valeur simple. Choisissez plutôt les éléments qu'il vise."],"The field %(field)s takes a list of items, and what arrived was not a list. Reload the page and pick the items again.":["Le champ %(field)s attend une liste d'éléments, et ce qui est arrivé n'était pas une liste. Rechargez la page et choisissez de nouveau les éléments."],"The field %(source)s cannot hold the value %(value)s, so no rule can compare it. Write a value of the kind %(source)s stores.":["Le champ %(source)s ne peut pas contenir la valeur %(value)s, aucune règle ne peut donc la comparer. Écrivez une valeur du type que %(source)s enregistre."],"The field groups could not be loaded.":["Les groupes de champs n'ont pas pu être chargés."],"The field groups could not be reached.":["Les groupes de champs n'ont pas pu être joints."],"The field keeps its values on the content both groups reach.":["Le champ garde ses valeurs sur le contenu que les deux groupes atteignent."],"The fields this group holds go with it, and so do the values every item stored in them.":["Les champs que ce groupe contient partent avec lui, ainsi que les valeurs que chaque élément y a enregistrées."],"The groups were reordered.":["Les groupes ont été réordonnés."],"The item could not be duplicated.":["L'élément n'a pas pu être dupliqué."],"The item could not be moved to the trash.":["L'élément n'a pas pu être déplacé dans la corbeille."],"The item could not be permanently deleted.":["L'élément n'a pas pu être supprimé définitivement."],"The item could not be restored.":["L'élément n'a pas pu être rétabli."],"The item you picked as parent holds another kind of content. Pick a parent of the same content type as this item.":["L'élément que vous avez choisi comme parent contient un autre genre de contenu. Choisissez un parent du même type de contenu que cet élément."],"The item you picked as parent is in the trash. Restore it, or pick another parent.":["L'élément que vous avez choisi comme parent est dans la corbeille. Rétablissez-le, ou choisissez un autre parent."],"The item you picked as parent no longer exists. Reload the page and pick another parent.":["L'élément que vous avez choisi comme parent n'existe plus. Rechargez la page et choisissez un autre parent."],"The media library could not be loaded.":["La bibliothèque de médias n'a pas pu être chargée."],"The name changes. Nothing stored under this field moves.":["Le nom change. Rien de ce qui est stocké sous ce champ ne bouge."],"The name could not be updated.":["Le nom n'a pas pu être mis à jour."],"The new order has to name every field group exactly once. Reload the page and move the groups again.":["Le nouvel ordre doit nommer chaque groupe de champs exactement une fois. Rechargez la page et déplacez les groupes à nouveau."],"The new order has to name every field of this content type exactly once. Reload the page and move the fields again.":["Le nouvel ordre doit nommer chaque champ de ce type de contenu exactement une fois. Rechargez la page et déplacez les champs à nouveau."],"The number of revisions to keep has to be a whole number, and it cannot be negative. Enter a different number.":["Le nombre de révisions à conserver doit être un nombre entier, et il ne peut pas être négatif. Saisissez un autre nombre."],"The registry could not be reached.":["Le registre n'a pas pu être joint."],"The role could not be changed.":["Le rôle n'a pas pu être modifié."],"The rule on %(source)s names nothing to match. Pick a value, or remove the rule.":["La règle sur %(source)s ne nomme rien à faire correspondre. Choisissez une valeur, ou retirez la règle."],"The rules could not be loaded.":["Les règles n'ont pas pu être chargées."],"The rules on %(field)s lead back to %(field)s itself, so nothing can decide whether to show it. Point one of them at another field.":["Les règles de %(field)s reviennent à %(field)s lui-même, rien ne peut donc décider de l'afficher. Faites pointer l'une d'elles vers un autre champ."],"The same item was picked twice for %(field)s. Pick each item once.":["Le même élément a été choisi deux fois pour %(field)s. Choisissez chaque élément une seule fois."],"The server could not be reached, so nothing was changed.":["Le serveur n'a pas pu être joint, rien n'a donc été changé."],"The server could not be reached, so nothing was saved.":["Le serveur n'a pas pu être joint, rien n'a donc été enregistré."],"The server could not be reached, so nothing was uploaded.":["Le serveur n'a pas pu être joint, rien n'a donc été téléversé."],"The setting %(setting)s cannot hold the value it was given. Check what this setting takes and try again.":["Le réglage %(setting)s ne peut pas contenir la valeur donnée. Vérifiez ce que ce réglage accepte et réessayez."],"The setting %(setting)s falls outside the others. Keep min below max and the default inside the bounds.":["Le réglage %(setting)s sort des autres. Gardez min sous max et la valeur par défaut dans les limites."],"The settings could not be read, so nothing can be changed here yet.":["Les réglages n'ont pas pu être lus, donc rien ne peut encore être modifié ici."],"The site default":["La langue par défaut du site"],"The site may already hold part of this file. Import it again to see what is left.":["Le site contient peut-être déjà une partie de ce fichier. Importez-le à nouveau pour voir ce qu'il reste."],"The source %(source)s does not offer %(operator)s. Pick one of the comparisons it does offer.":["La source %(source)s n'offre pas %(operator)s. Choisissez une des comparaisons qu'elle offre."],"The theme %(name)s carries no %(file)s, so Gophenberg cannot tell what it is. Put that file at the top level of the zip and package the theme again.":["Le thème %(name)s ne contient aucun %(file)s, Gophenberg ne peut donc pas savoir ce que c'est. Placez ce fichier au premier niveau du zip et réempaquetez le thème."],"The theme %(name)s could not be read, so it cannot serve your site. Upload it again, or choose another theme.":["Le thème %(name)s n'a pas pu être lu, il ne peut donc pas servir votre site. Téléversez-le de nouveau, ou choisissez un autre thème."],"The theme %(name)s did not start, so your site is still served by the theme it had. Ask whoever looks after your site to check the server log for what the theme reported.":["Le thème %(name)s n'a pas démarré, votre site est donc toujours servi par le thème qu'il avait. Demandez à la personne qui s'occupe de votre site de regarder ce que le thème a signalé dans le journal du serveur."],"The theme %(name)s does not carry %(path)s as a file, so there is nothing to run. Package the built theme rather than its source.":["Le thème %(name)s ne contient pas %(path)s comme fichier, il n'y a donc rien à exécuter. Empaquetez le thème construit plutôt que sa source."],"The theme %(name)s does not carry %(path)s as a folder, so its styles and scripts are missing. Package the built theme rather than its source.":["Le thème %(name)s ne contient pas %(path)s comme dossier, ses styles et ses scripts manquent donc. Empaquetez le thème construit plutôt que sa source."],"The theme %(name)s holds a link to another file at %(path)s, and a theme may only carry real files. Replace it and package the theme again.":["Le thème %(name)s contient un lien vers un autre fichier à %(path)s, et un thème ne peut contenir que de vrais fichiers. Remplacez-le et réempaquetez le thème."],"The theme %(name)s is serving your site right now, so it cannot be replaced. Deactivate it first, or install this copy under another name.":["Le thème %(name)s sert votre site en ce moment, il ne peut donc pas être remplacé. Désactivez-le d'abord, ou installez cette copie sous un autre nom."],"The theme %(name)s is the one chosen, but it is not installed, so your site is served by the built-in renderer. Upload the theme again, or choose another one.":["Le thème %(name)s est celui choisi, mais il n'est pas installé, votre site est donc servi par le moteur de rendu intégré. Téléversez de nouveau le thème, ou choisissez-en un autre."],"The theme %(name)s was built on theme kit %(declared)s, and this site serves %(served)s. Build the theme again against a kit this site serves, then install it.":["Le thème %(name)s a été compilé avec le kit de thèmes %(declared)s, et ce site sert %(served)s. Compilez le thème à nouveau avec un kit que ce site sert, puis installez-le."],"The trash could not be emptied.":["La corbeille n'a pas pu être vidée."],"The user could not be created.":["L'utilisateur n'a pas pu être créé."],"The values stored under it do not follow.":["Les valeurs enregistrées dessous ne le suivent pas."],"Theme":["Thème"],"Themes":["Thèmes"],"Themes could not be loaded.":["Les thèmes n'ont pas pu être chargés."],"There is no content type called %(value)s. Pick a type your site holds, or register it first.":["Il n'existe aucun type de contenu appelé %(value)s. Choisissez un type que votre site possède, ou déclarez-le d'abord."],"There is no content type called %(value)s. Pick one of the types your site holds and try again.":["Il n'existe aucun type de contenu appelé %(value)s. Choisissez un des types que votre site possède et réessayez."],"There is no kind of field called %(value)s. Pick one of these instead: %(allowed)s.":["Il n'existe aucun genre de champ appelé %(value)s. Choisissez plutôt parmi ceux-ci : %(allowed)s."],"There is no page kind called %(value)s. Pick one of these instead: %(allowed)s.":["Il n'existe aucun genre de page appelé %(value)s. Choisissez plutôt parmi ceux-ci : %(allowed)s."],"There is no status called %(value)s. Pick one of these instead: %(allowed)s.":["Il n'existe aucun état appelé %(value)s. Choisissez plutôt parmi ceux-ci : %(allowed)s."],"There is nothing at this address. Check the link and try again.":["Il n'y a rien à cette adresse. Vérifiez le lien et réessayez."],"There is nothing to roll back to, because your site has not been through a theme change yet. Install a theme first, then a rollback has somewhere to go.":["Il n'y a rien vers quoi revenir, car votre site n'a pas encore changé de thème. Installez d'abord un thème, et le retour aura alors une destination."],"These files could not be read.":["Ces fichiers n'ont pas pu être lus."],"These were left alone, because nobody confirmed losing them.":["Ceux-ci ont été laissés tels quels, car personne n'a confirmé leur perte."],"This content type does not exist any more. Reload the page to see the types your site holds now.":["Ce type de contenu n'existe plus. Rechargez la page pour voir les types que votre site possède maintenant."],"This content type does not nest, so one of its items cannot sit inside another. Mark the type as Nests first.":["Ce type de contenu ne s'imbrique pas, un de ses éléments ne peut donc pas se trouver dans un autre. Marquez d'abord le type comme Imbriqué."],"This content type has no field called %(field)s. Check the name, or declare the field on the type first.":["Ce type de contenu n'a aucun champ appelé %(field)s. Vérifiez le nom, ou déclarez d'abord le champ sur le type."],"This content type is turned off, so its content is not served or edited. Activate it first.":["Ce type de contenu est désactivé, son contenu n'est donc ni servi ni modifié. Activez-le d'abord."],"This content type still holds content, so it cannot be deleted. Move or delete its items first.":["Ce type de contenu contient encore du contenu, il ne peut donc pas être supprimé. Déplacez ou supprimez d'abord ses éléments."],"This definitions file is larger than the %(max)s bytes Gophenberg reads in one request. Split it, or raise the limit your site runs with.":["Ce fichier de définitions dépasse les %(max)s octets que Gophenberg lit en une requête. Divisez-le, ou relevez la limite de votre site."],"This field holds no layouts yet.":["Ce champ ne contient pas encore de dispositions."],"This field would stand inside too many containers. Put it nearer the top and try again.":["Ce champ se trouverait dans trop de conteneurs. Placez-le plus près du niveau supérieur et réessayez."],"This file could not be opened as a zip. Package the theme again and upload the new file.":["Ce fichier n'a pas pu être ouvert comme zip. Réempaquetez le thème et téléversez le nouveau fichier."],"This file is larger than the upload limit. Upload a smaller file.":["Ce fichier dépasse la limite de téléversement. Téléversez un fichier plus petit."],"This file is named %(extension)s but it holds %(detected)s content. Upload it under a name that matches what is inside it.":["Ce fichier est nommé %(extension)s mais il contient du %(detected)s. Téléversez-le sous un nom qui correspond à ce qu'il contient."],"This file matches the site, so there is nothing to change.":["Ce fichier correspond au site, il n'y a donc rien à changer."],"This file says it was written in format %(declared)s, which is not a version Gophenberg can read. Export the definitions again from the site they came from.":["Ce fichier indique le format %(declared)s, qui n'est pas une version que Gophenberg sait lire. Exportez à nouveau les définitions depuis le site d'origine."],"This file was written in format %(declared)s, and this release reads %(served)s. Upgrade the site the file came from, or this one.":["Ce fichier est écrit au format %(declared)s, et cette version lit %(served)s. Mettez à jour le site d'origine du fichier, ou celui-ci."],"This group holds no fields yet.":["Ce groupe ne contient pas encore de champs."],"This install of Gophenberg has no install root, so it updates by hand.":["Cette installation de Gophenberg n'a pas de racine d'installation, elle se met donc à jour à la main."],"This is a custom build of Gophenberg, so it updates by hand.":["Il s'agit d'une version compilée sur mesure de Gophenberg, elle se met donc à jour à la main."],"This item cannot go straight to that status from the one it holds now. Save it as a draft first, then try again.":["Cet élément ne peut pas passer directement à cet état depuis celui qu'il a maintenant. Enregistrez-le d'abord comme brouillon, puis réessayez."],"This item changed while you were describing it. Reload and try again.":["Cet élément a changé pendant que vous le décriviez. Rechargez et réessayez."],"This item does not exist, and it may have been deleted. Go back to the list to see what is there.":["Cet élément n'existe pas, et il a peut-être été supprimé. Revenez à la liste pour voir ce qui s'y trouve."],"This item is already in the trash. Restore it first to work on it again.":["Cet élément est déjà dans la corbeille. Rétablissez-le d'abord pour y retravailler."],"This item is in the trash. Restore it first to work on it again.":["Cet élément est dans la corbeille. Rétablissez-le d'abord pour y retravailler."],"This item is not in the trash, so there is nothing to restore. Open it from the list to work on it as it is.":["Cet élément n'est pas dans la corbeille, il n'y a donc rien à rétablir. Ouvrez-le depuis la liste pour travailler dessus tel quel."],"This item still holds items nested inside it. Move or delete those first.":["Cet élément contient encore des éléments imbriqués. Déplacez-les ou supprimez-les d'abord."],"This kind of field holds no fields inside it. Put the field in a section or a repeater instead.":["Ce type de champ ne contient aucun champ. Placez le champ dans une section ou dans un répéteur."],"This media item is not in the library, and someone may have deleted it. Reload the page to see what is there now.":["Ce média n'est pas dans la bibliothèque, et quelqu'un l'a peut-être supprimé. Rechargez la page pour voir ce qui s'y trouve maintenant."],"This picture could not be read, so nothing was stored. The file may be damaged, so open it on your computer and upload it again.":["Cette image n'a pas pu être lue, rien n'a donc été stocké. Le fichier est peut-être endommagé, ouvrez-le sur votre ordinateur et téléversez-le de nouveau."],"This picture is %(width)s by %(height)s pixels, over the limit of %(max)s pixels in all. Make it smaller and upload it again.":["Cette image fait %(width)s par %(height)s pixels, au-delà de la limite de %(max)s pixels au total. Réduisez-la et téléversez-la de nouveau."],"This post changed elsewhere. Reload before saving again.":["Cet article a changé ailleurs. Rechargez avant d'enregistrer de nouveau."],"This request came from a page on another site, so it was refused. Open the admin on this site and try again.":["Cette requête vient d'une page d'un autre site, elle a donc été refusée. Ouvrez l'administration sur ce site et réessayez."],"This request carried %(attribute)s, which fields do not take. Reload the page so the admin and the server agree again.":["Cette requête portait %(attribute)s, que les champs n'acceptent pas. Rechargez la page pour que l'administration et le serveur concordent à nouveau."],"This request left out %(field)s, which Gophenberg needs. Reload the page and try again.":["Cette requête a omis %(field)s, dont Gophenberg a besoin. Rechargez la page et réessayez."],"This rule reads a source called %(source)s, and nothing on your site declares one. A plugin that added it may have been removed.":["Cette règle lit une source nommée %(source)s, et rien sur votre site n'en déclare. Une extension qui l'ajoutait a pu être retirée."],"This site cannot write to its themes folder, so no theme can be installed. Ask whoever looks after your site to make the folder that %(setting)s points at writable. A read-only mount is the usual cause.":["Ce site ne peut pas écrire dans son dossier de thèmes, aucun thème ne peut donc être installé. Demandez à la personne qui s'occupe de votre site de rendre accessible en écriture le dossier vers lequel pointe %(setting)s. Un montage en lecture seule en est la cause habituelle."],"This site has nowhere to keep themes, so no theme can be installed. Ask whoever looks after your site to point %(setting)s at a folder the server can write to.":["Ce site n'a nulle part où garder les thèmes, aucun thème ne peut donc être installé. Demandez à la personne qui s'occupe de votre site de faire pointer %(setting)s vers un dossier où le serveur peut écrire."],"This site has nowhere to store uploads, so nothing can be uploaded. Ask whoever looks after your site to point %(setting)s at a folder the server can write to.":["Ce site n'a nulle part où stocker les téléversements, rien ne peut donc être téléversé. Demandez à la personne qui s'occupe de votre site de faire pointer %(setting)s vers un dossier où le serveur peut écrire."],"This theme is over the limit of %(max)s bytes, packed or unpacked. Leave out what the theme does not need and package it again.":["Ce thème dépasse la limite de %(max)s octets, compressé ou non. Retirez ce dont le thème n'a pas besoin et réempaquetez-le."],"This type will answer under /%(word)s.":["Ce type répondra sous /%(word)s."],"This zip holds %(entries)s files, more than the %(max)s a theme may carry. Package only the built theme.":["Ce zip contient %(entries)s fichiers, plus que les %(max)s qu'un thème peut contenir. Empaquetez seulement le thème construit."],"Through":["Via"],"Thumbnail":["Miniature"],"Title":["Titre"],"Two field groups in this file share the key %(key)s. Give one of them a different key and import again.":["Deux groupes de champs de ce fichier partagent la clé %(key)s. Donnez une clé différente à l'un d'eux et importez à nouveau."],"Two rule sources are registered under the name %(param)s. A plugin is declaring a source your site already holds.":["Deux sources de règles sont enregistrées sous le nom %(param)s. Une extension déclare une source que votre site possède déjà."],"Type":["Type"],"Type a whole number in both boxes before saving.":["Saisissez un nombre entier dans les deux cases avant d'enregistrer."],"Undo":["Annuler"],"Unsaved changes":["Modifications non enregistrées"],"Update":["Mettre à jour"],"Update failed.":["La mise à jour a échoué."],"Upload theme":["Téléverser un thème"],"Uploaded %s file.":["%s fichier téléversé.","%s fichiers téléversés.","%s fichiers téléversés."],"Users":["Utilisateurs"],"Users could not be loaded.":["Les utilisateurs n'ont pas pu être chargés."],"Value":["Valeur"],"Version":["Version"],"Videos":["Vidéos"],"Visit Site":["Aller sur le site"],"Web address":["Adresse web"],"What each Linked from field reads":["Ce que lit chaque champ Lié depuis"],"What it points at changed, so its stored values go with it.":["Ce qu'il vise a changé, donc ses valeurs enregistrées partent avec lui."],"Where %(group)s appears":["Où apparaît %(group)s"],"Without a rule this field always shows.":["Sans aucune règle ce champ s'affiche toujours."],"Without a rule this group appears nowhere.":["Sans une règle ce groupe n'apparaît nulle part."],"Yes":["Oui"],"Yes or no":["Oui ou non"],"You cannot change your own role.":["Vous ne pouvez pas changer votre propre rôle."],"Your language":["Votre langue"],"Your role does not allow %(capability)s.":["Votre rôle ne permet pas %(capability)s."],"Your server pins the site to the theme %(name)s, so themes cannot be changed here. Ask whoever looks after your site to remove the pin.":["Votre serveur fixe le site au thème %(name)s, les thèmes ne peuvent donc pas être changés ici. Demandez à la personne qui s'occupe de votre site de retirer cette fixation."],"Your site always needs one default content type, so this one cannot be turned off or deleted. Make another type the default first.":["Votre site a toujours besoin d'un type de contenu par défaut, celui-ci ne peut donc être ni désactivé ni supprimé. Rendez d'abord un autre type par défaut."],"a content type":["un type de contenu"],"account\u0004Role":["Rôle"],"account\u0004Status":["État"],"action label\u0004Duplicate":["Dupliquer"],"action label\u0004Duplicate…":["Dupliquer…"],"address":["adresse"],"admin section\u0004Content Types":["Types de contenu"],"admin section\u0004Field Groups":["Groupes de champs"],"admin section\u0004Language":["Langue"],"admin section\u0004Media":["Médias"],"admin section\u0004Settings":["Réglages"],"admin section\u0004Themes":["Thèmes"],"column\u0004Date":["Date"],"content type\u0004\"%s\" permanently deleted.":["Type de contenu « %s » supprimé définitivement."],"content type\u0004\"%s\" successfully created.":["Type de contenu « %s » créé avec succès."],"content type\u0004Status":["État"],"field\u0004Name":["Nom"],"field group\u0004Status":["Statut"],"field type\u0004Choice":["Choix"],"field type\u0004Color":["Couleur"],"field type\u0004Date":["Date"],"field type\u0004Flexible content":["Contenu flexible"],"field type\u0004Gallery":["Galerie"],"field type\u0004Kind":["Genre"],"field type\u0004Layout":["Disposition"],"field type\u0004Link":["Lien"],"field type\u0004Media":["Média"],"field type\u0004Range":["Plage"],"field type\u0004Repeater":["Répéteur"],"field type\u0004Section":["Section"],"field type\u0004Select":["Liste déroulante"],"holds":["contient"],"holds anything":["contient quelque chose"],"is":["est"],"is above":["est supérieur à"],"is below":["est inférieur à"],"is empty":["est vide"],"is not":["n'est pas"],"media family\u0004Kind":["Type"],"panel button label\u0004Settings":["Réglages"],"person\u0004Name":["Nom"],"post\u0004%s (Copy)":["%s (copie)"],"post\u0004Status":["État"],"post status\u0004Draft":["Brouillon"],"post status\u0004Published":["Publié"],"post status\u0004Trash":["Corbeille"],"post type general name\u0004Pages":["Pages"],"post type general name\u0004Posts":["Articles"],"post type singular name\u0004Page":["Page"],"post type singular name\u0004Post":["Article"],"relation target\u0004None":["Aucun"],"role\u0004Administrator":["Administrateur"],"role\u0004Author":["Auteur"],"role\u0004Editor":["Éditeur"],"role\u0004Member":["Membre"],"role\u0004No role":["Sans rôle"],"status filter\u0004All":["Tout"],"taxonomy general name\u0004Categories":["Catégories"],"taxonomy singular name\u0004Category":["Catégorie"],"theme\u0004Status":["État"],"trash\u0004Restore":["Rétablir"],"v%(version)s":["v%(version)s"],"verb\u0004Trash…":["Mettre à la corbeille…"],"verb\u0004View":["Voir"],"{day} {month} {year}":["{day} {month} {year}"]} diff --git a/internal/i18n/catalogs/es-ES.json b/internal/i18n/catalogs/es-ES.json index 76e8c9ef..d26fa461 100644 --- a/internal/i18n/catalogs/es-ES.json +++ b/internal/i18n/catalogs/es-ES.json @@ -1 +1 @@ -{"":{"lang":"es","plural-forms":"nplurals=3; plural=((n == 1) ? 0 : ((n != 0 && n % 1000000 == 0) ? 1 : 2));"}," and ":[" y "]," or ":[" o "],"\"%s\" activated.":["Se ha activado «%s»."],"\"%s\" deactivated.":["Se ha desactivado «%s»."],"\"%s\" has been restored.":["«%s» se ha restaurado."],"\"%s\" moved to the trash.":["«%s» trasladado a la papelera."],"\"%s\" permanently deleted.":["«%s» borrado permanentemente."],"\"%s\" successfully created.":["«%s» creado correctamente."],"\"%s\" uploaded.":["«%s» subido."],"%(field)s address":["Dirección de %(field)s"],"%(field)s cannot move inside itself. Pick a container that is not one of its own.":["%(field)s no puede moverse dentro de sí mismo. Elige un contenedor que no sea uno de los suyos."],"%(field)s declared.":["%(field)s declarado."],"%(field)s deleted.":["%(field)s borrado."],"%(field)s does not match the format its field asks for. Check it and save again.":["%(field)s no tiene el formato que su campo requiere. Revísalo y guarda de nuevo."],"%(field)s goes no higher than %(limit)s. Lower the value and save again.":["%(field)s no pasa de %(limit)s. Baja el valor y guarda de nuevo."],"%(field)s goes no lower than %(limit)s. Raise the value and save again.":["%(field)s no baja de %(limit)s. Sube el valor y guarda de nuevo."],"%(field)s holds no value of its own, so it cannot be required. Make it optional.":["%(field)s no guarda ningún valor propio, así que no puede ser obligatorio. Hazlo opcional."],"%(field)s is optional again.":["%(field)s vuelve a ser opcional."],"%(field)s is required now.":["%(field)s ahora es obligatorio."],"%(field)s moved.":["%(field)s movido."],"%(field)s names the same one twice. Remove the repeat and save again.":["%(field)s nombra el mismo dos veces. Quita la repetición y guarda de nuevo."],"%(field)s needs at least %(limit)s files. Add one and save again.":["%(field)s necesita al menos %(limit)s archivos. Añade uno y guarda de nuevo."],"%(field)s needs at least %(limit)s rows. Add one and save again.":["%(field)s necesita al menos %(limit)s filas. Añade una y guarda de nuevo."],"%(field)s only takes one of its listed choices. Pick one and save again.":["%(field)s solo admite una de las opciones de su lista. Elige una y guarda de nuevo."],"%(field)s reads a relation field that is not there. Pick a group and a relation field it holds.":["%(field)s lee un campo de relación que no existe. Elige un grupo y un campo de relación que contenga."],"%(field)s reads a relation pointing at %(type)s, so it would list nothing here. Pick a relation pointing at the items this group is shown on.":["%(field)s lee una relación que apunta a %(type)s, así que aquí no mostraría nada. Elige una relación que apunte a los elementos donde se muestra este grupo."],"%(field)s renamed.":["%(field)s renombrado."],"%(field)s settled.":["%(field)s ajustado."],"%(field)s shows by its rules now.":["%(field)s ahora se muestra según sus reglas."],"%(field)s stands in the list.":["%(field)s aparece en la lista."],"%(field)s stays out of the list.":["%(field)s se queda fuera de la lista."],"%(field)s takes at most %(limit)s files. Remove one and save again.":["%(field)s acepta como mucho %(limit)s archivos. Quita uno y guarda de nuevo."],"%(field)s takes at most %(limit)s letters. Shorten what you wrote and save again.":["%(field)s acepta como mucho %(limit)s letras. Acorta lo que has escrito y guarda de nuevo."],"%(field)s takes at most %(limit)s rows. Remove one and save again.":["%(field)s admite como mucho %(limit)s filas. Quita una y guarda de nuevo."],"%(field)s title":["Título de %(field)s"],"%(file)s is larger than one upload may be.":["%(file)s es más grande de lo que una subida permite."],"%(file)s is not a file this block accepts.":["%(file)s no es un archivo que este bloque acepte."],"%(file)s: %(reason)s":["%(file)s: %(reason)s"],"%(group)s created.":["%(group)s creado."],"%(group)s now appears where you said.":["%(group)s ya aparece donde has dicho."],"%(group)s removed.":["%(group)s eliminado."],"%(group)s updated.":["%(group)s actualizado."],"%(key)s is served by %(winner)s, so %(loser)s does not show it on %(where)s.":["%(key)s lo sirve %(winner)s, así que %(loser)s no lo muestra en %(where)s."],"%(name)s %(version)s is serving the public site.":["%(name)s %(version)s está publicado en la web."],"%(name)s belongs to the site now.":["%(name)s ya pertenece al sitio."],"%(name)s came from the %(plugin)s plugin, which no longer declares it.":["%(name)s vino del plugin %(plugin)s, que ya no lo declara."],"%(name)s cannot be used as a theme name. Name the zip file after the theme, with no dot at the start and no slashes in it.":["%(name)s no se puede usar como nombre de tema. Nombra el archivo zip como el tema, sin punto al principio y sin barras."],"%(name)s moves to /%(word)s. Every address of both types changes.":["El tipo %(name)s pasa a /%(word)s. Cambian todas las direcciones de ambos tipos."],"%(name)s would move to /%(word)s, which Gophenberg keeps for itself. Change its plural name and try again.":["El tipo %(name)s pasaría a /%(word)s, que Gophenberg reserva para sí mismo. Cambia su nombre en plural e inténtalo de nuevo."],"%(source)s is %(value)s":["%(source)s es %(value)s"],"%(theme)s failed to start, so the built-in renderer is serving.":["%(theme)s no pudo arrancar, así que el renderizador ha tomado el relevo."],"%(theme)s is now serving the public site.":["%(theme)s ya sirve el sitio público."],"%(theme)s is serving the public site.":["%(theme)s sirve el sitio público."],"%(theme)s is still starting, so the built-in renderer is serving.":["%(theme)s todavía está arrancando, así que el renderizador ha tomado el relevo."],"%(theme)s was installed.":["%(theme)s se ha instalado."],"%(theme)s will not load, so the built-in renderer is serving.":["%(theme)s no se carga, así que el renderizador ha tomado el relevo."],"%(type)s answers on a new address, and stored links move with it.":["%(type)s responde en una dirección nueva, y los enlaces guardados se mueven con ella."],"%(type)s becomes the type the site opens on, and the old one takes an address.":["%(type)s pasa a ser el tipo con el que abre el sitio, y el anterior toma una dirección."],"%(type)s keeps nesting while %(items)s of its items sit inside another. Move those to the top level first, the ones in the trash included.":["%(type)s sigue anidando mientras %(items)s de sus elementos están dentro de otro. Muévelos primero al nivel superior, incluidos los de la papelera."],"%(type)s keeps nesting, because some of its items sit inside another.":["%(type)s sigue anidando, porque algunos de sus elementos están dentro de otro."],"%(type)s will answer at the root.":["El tipo %(type)s responderá en la raíz."],"%s content type activated.":["Se ha activado %s tipo de contenido.","Se han activado %s de tipos de contenido.","Se han activado %s tipos de contenido."],"%s content type could not be activated.":["No se ha podido activar %s tipo de contenido.","No se han podido activar %s de tipos de contenido.","No se han podido activar %s tipos de contenido."],"%s content type could not be deactivated.":["No se ha podido desactivar %s tipo de contenido.","No se han podido desactivar %s de tipos de contenido.","No se han podido desactivar %s tipos de contenido."],"%s content type could not be permanently deleted.":["No se ha podido borrar permanentemente %s tipo de contenido.","No se han podido borrar permanentemente %s de tipos de contenido.","No se han podido borrar permanentemente %s tipos de contenido."],"%s content type deactivated.":["Se ha desactivado %s tipo de contenido.","Se han desactivado %s de tipos de contenido.","Se han desactivado %s tipos de contenido."],"%s content type permanently deleted.":["Se ha borrado permanentemente %s tipo de contenido.","Se han borrado permanentemente %s de tipos de contenido.","Se han borrado permanentemente %s tipos de contenido."],"%s item could not be moved to the trash.":["No se ha podido mover %s elemento a la papelera.","No se han podido mover %s de elementos a la papelera.","No se han podido mover %s elementos a la papelera."],"%s item could not be permanently deleted.":["No se ha podido borrar permanentemente %s elemento.","No se han podido borrar permanentemente %s de elementos.","No se han podido borrar permanentemente %s elementos."],"%s item could not be restored.":["No se ha podido restaurar %s elemento.","No se han podido restaurar %s de elementos.","No se han podido restaurar %s elementos."],"%s item moved to the trash.":["%s elemento movido a la papelera.","%s de elementos movidos a la papelera.","%s elementos movidos a la papelera."],"%s item permanently deleted.":["%s elemento borrado permanentemente.","%s de elementos borrados permanentemente.","%s elementos borrados permanentemente."],"%s item stays in the trash.":["%s elemento sigue en la papelera.","%s de elementos siguen en la papelera.","%s elementos siguen en la papelera."],"%s page has been restored.":["Se ha restaurado %s página.","Se han restaurado %s de páginas.","Se han restaurado %s páginas."],"%s post has been restored.":["Se ha restaurado %s entrada.","Se han restaurado %s de entradas.","Se han restaurado %s entradas."],"(no title)":["(sin título)"],"A %(kind)s field does not take a setting called %(setting)s. Remove it and try again.":["Un campo %(kind)s no acepta un ajuste llamado %(setting)s. Quítalo y prueba de nuevo."],"A Linked from field stands on its own, not inside a section or a repeater. Declare %(field)s beside the container.":["Un campo Enlazado desde va por su cuenta, no dentro de una sección ni de un repetidor. Declara %(field)s junto al contenedor."],"A content type needs a singular and a plural name, like Guide and Guides. Fill both in and try again.":["Un tipo de contenido necesita un nombre en singular y otro en plural, como Guía y Guías. Rellena ambos e inténtalo de nuevo."],"A descriptive summary of the content type.":["Un resumen descriptivo del tipo de contenido."],"A field group key has to start with a lowercase letter and then hold only lowercase letters, numbers and hyphens. Rename the group in the file so its key comes out in that shape.":["La clave de un grupo de campos tiene que empezar por una letra minúscula y después llevar solo letras minúsculas, números y guiones. Cambia el nombre del grupo en el archivo para que su clave salga con esa forma."],"A field key has to start with a lowercase letter and then hold only lowercase letters, numbers and hyphens. Rename the field so its key comes out in that shape.":["La clave de un campo tiene que empezar por una letra minúscula y contener solo letras minúsculas, números y guiones. Renombra el campo para que su clave tenga esa forma."],"A field needs a name. Type one and try again.":["El campo necesita un nombre. Escribe uno e inténtalo de nuevo."],"A field with that name already exists on the items this group reaches. Pick another name.":["Ya existe un campo con ese nombre en los elementos que este grupo alcanza. Elige otro nombre."],"A flexible content field holds layouts, and %(field)s is not one. Add a layout first, then declare the field inside that layout.":["Un campo de contenido flexible contiene diseños, y %(field)s no lo es. Añade primero un diseño y después declara el campo dentro de ese diseño."],"A higher quality stores larger files, and it applies to pictures uploaded from now on.":["Una calidad más alta almacena archivos más grandes, y se aplica a las imágenes que subas a partir de ahora."],"A layout stands inside a flexible content field only. Put %(field)s inside one of those instead.":["Un diseño solo va dentro de un campo de contenido flexible. Pon %(field)s dentro de uno de ellos."],"A layout stands inside a flexible content field, never on its own. Declare a flexible content field first, then add %(field)s inside it.":["Un diseño va dentro de un campo de contenido flexible, nunca por su cuenta. Declara primero un campo de contenido flexible y después añade %(field)s dentro."],"A listing carries between 1 and %(max)s items, so %(value)s is not a size Gophenberg takes. Pick a number inside that range.":["Un listado muestra entre 1 y %(max)s elementos, así que %(value)s no es un tamaño que Gophenberg acepte. Elige un número dentro de ese rango."],"A relation field has to say which content type it points at. Pick that type and try again.":["Un campo de relación tiene que indicar a qué tipo de contenido apunta. Elige ese tipo e inténtalo de nuevo."],"A reload shows the admin in the language you chose.":["Al recargar verás el panel de administración en el idioma que has elegido."],"A route word has to start with a lowercase letter and then hold only lowercase letters, numbers and hyphens. Change it and try again.":["La palabra de ruta de la URL tiene que empezar por una letra minúscula y contener solo letras minúsculas, números y guiones. Cámbiala e inténtalo de nuevo."],"A row of %(field)s has to name the layout it takes. Pick a layout for the row, or remove the row.":["Una fila de %(field)s tiene que nombrar el diseño que toma. Elige un diseño para la fila, o quita la fila."],"A row of %(field)s takes one layout and no more. Reload the page and build the row again.":["Una fila de %(field)s toma un solo diseño. Recarga la página y crea la fila otra vez."],"A rule matching any %(source)s cannot be turned into an exclusion. Leave it as is, or name the ones to leave out instead.":["Una regla que vale para cualquier %(source)s no se puede convertir en exclusión. Déjala como está, o nombra los que quieras dejar fuera."],"A theme naming its own page size uses that instead.":["Un tema que indica su propio tamaño de página usa ese en su lugar."],"A type key has to start with a lowercase letter and then hold only lowercase letters, numbers and hyphens. Change the key and try again.":["La clave de un tipo tiene que empezar por una letra minúscula y contener solo letras minúsculas, números y guiones. Cambia la clave e inténtalo de nuevo."],"Actions":["Acciones"],"Activate":["Activar"],"Activate %(theme)s":["Activar %(theme)s"],"Active":["Activo"],"Add":["Añadir"],"Add %(layout)s":["Añadir %(layout)s"],"Add %(name)s":["Añadir %(name)s"],"Add %(type)s":["Añadir %(type)s"],"Add Category":["Añadir categoría"],"Add Content Type":["Añadir tipo de contenido"],"Add Field Group":["Añadir grupo de campos"],"Add Media File":["Añadir medios"],"Add Page":["Añadir página"],"Add Post":["Añadir entrada"],"Add User":["Añadir usuario"],"Add block":["Añadir bloque"],"Add choice":["Añadir opción"],"Add condition":["Añadir condición"],"Add field":["Añadir campo"],"Add field to %(field)s":["Añadir campo a %(field)s"],"Add layout":["Añadir diseño"],"Add layout to %(field)s":["Añadir diseño a %(field)s"],"Add one with %(button)s.":["Añade un elemento con %(button)s."],"Add row":["Añadir fila"],"Add rule set":["Añadir conjunto de reglas"],"Add title":["Añadir título"],"Add to %(field)s":["Añadir a %(field)s"],"Address":["Dirección"],"Address updated.":["Dirección actualizada."],"Adopt":["Adoptar"],"Allow custom":["Permitir valores propios"],"Allow empty":["Permitir vacío"],"Alt text":["Texto alternativo"],"An item cannot point at itself. Pick a different item for %(field)s.":["Un elemento no puede apuntarse a sí mismo. Elige otro elemento para %(field)s."],"An item cannot sit inside itself, or inside one of the items nested under it. Pick a parent outside this branch.":["Un elemento no puede estar dentro de sí mismo, ni dentro de otro anidado bajo él. Elige un nivel superior fuera de esta rama."],"Another account wrote this, and only its author, an editor or an administrator may change it. You can still read it.":["Otra cuenta escribió esto, y solo su autor, un editor o un administrador pueden cambiarlo. Todavía puedes leerlo."],"Another account wrote this, so you are reading it rather than editing it.":["Otra cuenta escribió esto, así que lo estás leyendo, no editando."],"Another content type already answers under this route word. Pick a different word.":["Ya hay otro tipo de contenido que responde con esta palabra de ruta de URL. Elige una palabra distinta."],"Another content type already lives at the root of your site, and only one can. Give this type a route word, or hand the root over with Make default.":["Ya hay otro tipo de contenido en la raíz de tu sitio, y solo puede haber uno. Dale a este tipo de contenido una palabra de ruta de URL, o cede la raíz con Establecer como predeterminado."],"Another content type already uses this key. Give this type a different name.":["Ya hay otro tipo de contenido que usa esta clave. Dale a este tipo un nombre distinto."],"Another item of this content type already uses that address. Pick a different slug and save again.":["Ya hay otro elemento de este tipo de contenido que usa esa dirección. Elige un slug distinto y guarda de nuevo."],"Another update is currently in progress.":["En este momento hay otra actualización en marcha."],"Appears on":["Aparece en"],"Apply":["Aplicar"],"April":["abril"],"Are you sure you want to move \"%s\" to the trash?":["¿Seguro que quieres mover «%s» a la papelera?"],"Audio":["Audio"],"August":["agosto"],"Author":["Autor"],"Back to %(type)s":["Volver a %(type)s"],"Back to the latest posts":["Volver a las últimas entradas"],"Block":["Bloque"],"Broken":["Roto"],"Bundles of fields, shown where their rules place them.":["Conjuntos de campos, mostrados donde sus reglas los colocan."],"Button group":["Grupo de botones"],"Cancel":["Cancelar"],"Caption":["Leyenda"],"Change %(name)s":["Cambiar %(name)s"],"Change address":["Cambiar la dirección"],"Change address…":["Cambiar la dirección…"],"Change role":["Cambiar el rol"],"Change the role of %(name)s":["Cambiar el rol de %(name)s"],"Checkbox group":["Grupo de casillas"],"Choices":["Opciones"],"Choose %(field)s":["Elegir %(field)s"],"Choose how the site serves its content.":["Elige cómo el sitio sirve su contenido."],"Choose the language the admin reads in.":["Elige el idioma en el que se lee el panel de administración."],"Choose the role of %(name)s.":["Elige el rol de %(name)s."],"Choose the version to update to.":["Elige la versión a la que actualizar."],"Clear %(field)s":["Vaciar %(field)s"],"Close":["Cerrar"],"Close Settings":["Cerrar ajustes"],"Closed":["Cerrado"],"Condition":["Condición"],"Content":["Contenido"],"Content Types":["Tipos de contenido"],"Content nests at most %(max)s levels deep, and this item would sit deeper. Pick a parent closer to the top.":["El contenido se anida como mucho %(max)s niveles, y este elemento quedaría más abajo. Elige un nivel superior más cercano al inicio."],"Content type":["Tipo de contenido"],"Content type updated.":["Tipo de contenido actualizado."],"Could not delete that item.":["No se ha podido borrar ese elemento.","No se han podido borrar todos los elementos.","No se han podido borrar todos los elementos."],"Could not load that post.":["No se ha podido cargar esa entrada."],"Could not save that post.":["No se ha podido guardar esa entrada."],"Create":["Crear"],"Create a field group":["Crear un grupo de campos"],"Create user":["Crear usuario"],"Created":["Fecha de creación"],"Date added":["Fecha de subida"],"Deactivate":["Desactivar"],"Deactivate %(theme)s":["Desactivar %(theme)s"],"December":["diciembre"],"Default":["Por defecto"],"Default content type updated.":["Tipo de contenido predeterminado actualizado."],"Definitions file":["Archivo de definiciones"],"Delete":["Borrar"],"Delete \"%(title)s\" for good? This cannot be undone.":["¿Borrar permanentemente «%(title)s»? Esto no se puede deshacer."],"Delete %(field)s":["Borrar %(field)s"],"Delete %(group)s":["Eliminar %(group)s"],"Delete %(title)s for good? This cannot be undone.":["¿Borrar %(title)s para siempre? Esto no se puede deshacer."],"Delete %s content type for good? This cannot be undone.":["¿Borrar permanentemente %s tipo de contenido? Esto no se puede deshacer.","¿Borrar permanentemente %s de tipos de contenido? Esto no se puede deshacer.","¿Borrar permanentemente %s tipos de contenido? Esto no se puede deshacer."],"Delete %s item for good? This cannot be undone.":["¿Borrar permanentemente %s elemento? Esto no se puede deshacer.","¿Borrar permanentemente %s de elementos? Esto no se puede deshacer.","¿Borrar permanentemente %s elementos? Esto no se puede deshacer."],"Delete Permanently":["Borrar permanentemente"],"Delete the field":["Borrar el campo"],"Delete the group":["Eliminar el grupo"],"Delete this %(count)s item for good? This cannot be undone.":["¿Borrar este %(count)s elemento para siempre? Esto no se puede deshacer.","¿Borrar estos %(count)s elementos para siempre? Esto no se puede deshacer.","¿Borrar estos %(count)s elementos para siempre? Esto no se puede deshacer."],"Delete…":["Borrar…"],"Describe":["Describir"],"Describe…":["Describir…"],"Description":["Descripción"],"Description updated.":["Descripción actualizada."],"Desktop":["Escritorio"],"Destination":["Destino"],"Dimensions":["Dimensiones"],"Disable":["Desactivar"],"Disable %(name)s":["Desactivar a %(name)s"],"Disabled":["Desactivado"],"Dismiss":["Descartar"],"Document":["Documento"],"Done. The site now holds what the file describes.":["Hecho. El sitio ya tiene lo que describe el archivo."],"Draft saved.":["Borrador guardado."],"Drop files to upload":["Arrastra los archivos para subirlos"],"Email":["Correo electrónico"],"Empty Trash":["Vaciar papelera"],"Empty trash":["Vaciar papelera"],"Enable":["Activar"],"Enable %(name)s":["Activar a %(name)s"],"Every address of this type moves. Links kept elsewhere to the old addresses stop working.":["Cambian todas las direcciones de este tipo. Los enlaces guardados en otro sitio hacia las direcciones antiguas dejan de funcionar."],"Every content type":["Todos los tipos de contenido"],"Every field group needs a title. Give it a name and save again.":["Todo grupo de campos necesita un título. Ponle un nombre y guarda otra vez."],"Every item needs an author who exists. Pick one from the list and save again.":["Cada elemento necesita un autor que exista. Elige uno de la lista y guarda de nuevo."],"Every kind of content this site holds.":["Todos los tipos de contenido que hay en este sitio."],"Every value stored under this field goes with it, in every item the group reaches and in the revisions behind them.":["Todos los valores guardados en este campo se van con él, en cada elemento que el grupo alcanza y en las revisiones que hay detrás."],"Excerpt":["Extracto"],"Export definitions":["Exportar definiciones"],"February":["febrero"],"Fewest files":["Mínimo de archivos"],"Fewest rows":["Mínimo de filas"],"Field":["Campo"],"Field Groups":["Grupos de campos"],"Field group":["Grupo de campos"],"Fields":["Campos"],"Fields of %(group)s":["Campos de %(group)s"],"File name":["Nombre del archivo"],"File size":["Tamaño del archivo"],"File type":["Tipo de archivo"],"Files":["Archivos"],"Filter by status":["Filtrar por estado"],"Follow the browser":["Sigue al navegador"],"From %(plugin)s":["De %(plugin)s"],"Full Size":["Tamaño completo"],"Gophenberg cannot start this update: %(reason)s":["Gophenberg no puede empezar esta actualización: %(reason)s"],"Gophenberg checked for updates moments ago. Try again later.":["Gophenberg ha buscado actualizaciones hace un momento. Inténtalo de nuevo más tarde."],"Gophenberg could not read what your browser sent. Reload the page and try again, and tell whoever looks after your site if it keeps happening.":["Gophenberg no ha podido leer lo que ha enviado tu navegador. Recarga la página e inténtalo de nuevo, y avisa a quien gestiona tu sitio si sigue pasando."],"Gophenberg could not read which item you picked as parent. Reload the page and pick it again.":["Gophenberg no ha podido leer qué elemento has elegido como elemento superior. Recarga la página y vuelve a elegirlo."],"Gophenberg does not accept %(extension)s files. Upload a picture, a video, an audio file, a PDF or a zip instead.":["Gophenberg no acepta archivos %(extension)s. Sube una imagen, un vídeo, un audio, un PDF o un zip."],"Gophenberg does not answer in %(value)s. Pick one of the languages on the list.":["Gophenberg no responde en %(value)s. Elige uno de los idiomas de la lista."],"Gophenberg has no autosave of yours for this item. Open the item to see the version that is stored.":["Gophenberg no tiene ningún guardado automático tuyo de este elemento. Ábrelo para ver la versión guardada."],"Gophenberg holds no kind of definition called %(subject)s, so nothing was taken over. Reload the page so the admin and the server agree again.":["Gophenberg no tiene ninguna clase de definición llamada %(subject)s, así que no se ha adoptado nada. Recarga la página para que el admin y el servidor vuelvan a coincidir."],"Gophenberg keeps /%(path)s for itself or for another content type, so your content cannot answer there. Give the item a different slug.":["Gophenberg reserva la dirección /%(path)s para sí mismo o para otro tipo de contenido, así que tu contenido no puede usarla. Dale al elemento otro slug."],"Gophenberg keeps this word for itself, so no content type can answer under it. Pick a different route word.":["Gophenberg reserva esta palabra para sí mismo, así que ningún tipo de contenido puede usarla. Elige otra palabra de ruta de URL."],"Group":["Grupo"],"Highest":["Máximo"],"Holds":["Contiene"],"Images":["Imágenes"],"Import definitions":["Importar definiciones"],"In list":["En la lista"],"Inactive":["Inactivo"],"Installed":["Instalado"],"Instructions":["Instrucciones"],"It moves here from another group and keeps its stored values.":["Se mueve aquí desde otro grupo y conserva sus valores guardados."],"It moves to another group and keeps its stored values.":["Se mueve a otro grupo y conserva sus valores guardados."],"It moves to another group, so its stored values do not follow.":["Se mueve a otro grupo, así que sus valores guardados no le siguen."],"It reads a relation inside a container, and only an import can point it elsewhere.":["Lee una relación dentro de un contenedor, y solo una importación puede apuntarlo a otro sitio."],"It starts on %(type)s, and the rules may be edited afterwards.":["Empieza en %(type)s, y las reglas se pueden editar después."],"Items could not be loaded.":["No se han podido cargar los elementos."],"Its items sit inside one another, so it keeps nesting.":["Sus elementos están unos dentro de otros, así que sigue anidando."],"Its kind changed, so its stored values go with it.":["Su tipo ha cambiado, así que sus valores guardados se van con él."],"January":["enero"],"July":["julio"],"June":["junio"],"Keep %(field)s out of the list":["Dejar %(field)s fuera de la lista"],"Keep it":["Conservarlo"],"Keep it here":["Dejarlo aquí"],"Key":["Clave"],"Label":["Etiqueta"],"Language":["Idioma"],"Large":["Grande"],"Let items nest":["Permitir anidar"],"Linked from":["Enlazado desde"],"List view":["Vista de lista"],"Loading field groups.":["Cargando los grupos de campos."],"Loading the post.":["Cargando la entrada."],"Loading the screen.":["Cargando la pantalla."],"Loading themes.":["Cargando los temas."],"Loading users.":["Cargando los usuarios."],"Loading…":["Cargando…"],"Longest":["Largo máximo"],"Lowest":["Mínimo"],"Make %(field)s optional":["Hacer %(field)s opcional"],"Make default":["Establecer como predeterminado"],"Make default…":["Establecer como predeterminado…"],"Make optional":["Hacer opcional"],"Manage the categories on this site.":["Gestiona las categorías de este sitio."],"Manage the images and files this site holds.":["Gestiona las imágenes y los archivos que hay en este sitio."],"Manage the items of this content type.":["Gestiona los elementos de este tipo de contenido."],"Manage the pages on this site.":["Gestiona las páginas de este sitio."],"Manage the posts on this site.":["Gestiona las entradas de este sitio."],"Many targets":["Varios destinos"],"Many values":["Varios valores"],"March":["marzo"],"May":["mayo"],"Media %(id)s":["Medio %(id)s"],"Media Library":["Biblioteca de medios"],"Medium":["Mediano"],"Mobile":["Móvil"],"Modified: %s":["Modificado: %s"],"Most files":["Máximo de archivos"],"Most rows":["Máximo de filas"],"Move":["Mover"],"Move \"%(title)s\" to the trash?":["¿Mover «%(title)s» a la papelera?"],"Move %(field)s down":["Bajar %(field)s"],"Move %(field)s elsewhere":["Mover %(field)s a otro sitio"],"Move %(field)s up":["Subir %(field)s"],"Move %(group)s down":["Bajar %(group)s"],"Move %(group)s up":["Subir %(group)s"],"Move %(name)s down":["Bajar %(name)s"],"Move %(name)s up":["Subir %(name)s"],"Move %s item to the trash?":["¿Mover %s elemento a la papelera?","¿Mover %s de elementos a la papelera?","¿Mover %s elementos a la papelera?"],"Move every address":["Mover todas las direcciones"],"Move row down":["Bajar la fila"],"Move row up":["Subir la fila"],"Move the field":["Mover el campo"],"Move to trash":["Mover a la papelera"],"Name":["Nombre"],"Name updated.":["Nombre actualizado."],"Navigation":["Navegación"],"Nests":["Anida"],"Newer posts":["Entradas más recientes"],"No":["No"],"No content types found.":["No se han encontrado tipos de contenido."],"No description":["Sin descripción"],"No file arrived with this upload. Choose a file and try again.":["No ha llegado ningún archivo con esta subida. Elige un archivo e inténtalo de nuevo."],"No items found.":["No se han encontrado elementos."],"No items yet.":["Todavía no hay elementos."],"No media chosen":["Ningún medio elegido"],"No media has been uploaded yet.":["Todavía no se ha subido ningún medio."],"No media items found.":["No se han encontrado archivos de medios."],"No media items yet.":["Todavía no hay archivos de medios."],"No page lives at this address.":["No existe ninguna página en esta dirección."],"No parent":["Sin elemento superior"],"No theme arrived with this upload. Choose a zip file and try again.":["No ha llegado ningún tema con esta subida. Elige un archivo zip e inténtalo de nuevo."],"No themes are installed.":["No hay ningún tema instalado."],"No title":["Sin título"],"None":["Ninguno"],"Not %(type)s":["Excepto %(type)s"],"Not found":["No encontrado"],"Not serving":["No está sirviendo"],"Nothing declares that role.":["Nada declara ese rol."],"Nothing points here yet.":["Todavía no apunta nada aquí."],"Nothing published here yet.":["Todavía no hay nada publicado aquí."],"Nothing published yet.":["Todavía no hay nada publicado."],"November":["noviembre"],"Nowhere":["En ningún sitio"],"Number":["Número"],"October":["octubre"],"Older posts":["Entradas anteriores"],"One frame of this animation holds more than %(max)s pixels, which is more than Gophenberg opens. Upload a smaller animation.":["Un fotograma de esta animación tiene más de %(max)s píxeles, más de lo que Gophenberg abre. Sube una animación más pequeña."],"One of the filters on this list is not one Gophenberg understands. Clear the filters and try again.":["Uno de los filtros de esta lista no es un filtro que Gophenberg entienda. Quita los filtros e inténtalo de nuevo."],"One of the items picked for %(field)s is not the kind of content that field points at. Reload the page and pick from the list the field offers.":["Uno de los elementos elegidos para %(field)s no es del tipo de contenido al que apunta ese campo. Recarga la página y elige de la lista que ofrece el campo."],"One of the items picked for %(field)s was not named in a way Gophenberg understands. Reload the page and pick the items again.":["Uno de los elementos elegidos para %(field)s no venía nombrado de una forma que Gophenberg entienda. Recarga la página y vuelve a elegir los elementos."],"One of the items picked no longer exists. Reload the page and pick again.":["Uno de los elementos elegidos ya no existe. Recarga la página y vuelve a elegir."],"One target":["Un destino"],"Only a relation field points at another content type or holds many items. Pick the Relation kind, or leave the target and the many option empty.":["Solo un campo de relación apunta a otro tipo de contenido o guarda varios elementos. Elige el tipo Relación, o deja vacío el destino y la opción de varios."],"Only one file may be placed here.":["Aquí solo se puede colocar un archivo."],"Only the content type at the root of your site may go without a route word. Give this type one and try again.":["Solo el tipo de contenido que está en la raíz de tu sitio puede ir sin palabra de ruta de URL. Dale una a este tipo e inténtalo de nuevo."],"Open %(field)s in a new tab":["Abrir %(field)s en una pestaña nueva"],"Open navigation":["Abrir la navegación"],"Order stored.":["Orden guardado."],"Other":["Otro"],"Out of list":["Fuera de la lista"],"Parent":["Elemento superior"],"Password":["Contraseña"],"Pending":["Pendiente"],"Pending Review":["Pendiente de revisión"],"Permanently delete":["Borrar permanentemente"],"Permanently delete…":["Borrar permanentemente…"],"Picture quality":["Calidad de imagen"],"Picture quality runs from 1 to %(max)s, so %(value)s is not a quality Gophenberg stores at. Pick a number inside that range.":["La calidad de imagen va de 1 a %(max)s, así que %(value)s no es una calidad con la que Gophenberg guarde. Elige un número dentro de ese rango."],"Placeholder":["Texto de ejemplo"],"Plural name":["Nombre en plural"],"Points at":["Apunta a"],"Post published.":["Entrada publicada."],"Posts per page":["Entradas por página"],"Preview":["Vista previa"],"Private":["Privada"],"Publish":["Publicar"],"Published: %s":["Publicado: %s"],"Radio group":["Grupo de botones de radio"],"Reads from":["Lee de"],"Redo":["Rehacer"],"Relation":["Relación"],"Remove":["Quitar"],"Remove %(name)s":["Quitar %(name)s"],"Remove %(title)s":["Quitar %(title)s"],"Remove row":["Quitar fila"],"Rename":["Renombrar"],"Rename %(field)s":["Renombrar %(field)s"],"Rename…":["Renombrar…"],"Require":["Hacer obligatorio"],"Require %(field)s":["Hacer %(field)s obligatorio"],"Required":["Obligatorio"],"Restore":["Restaurar"],"Role changed.":["Rol cambiado."],"Roll back to %(theme)s":["Revertir a %(theme)s"],"Roll back to the built-in renderer":["Revertir al renderizador integrado"],"Route word":["Palabra de ruta"],"Rule %(number)s of set %(set)s":["Regla %(number)s del conjunto %(set)s"],"Rule set %(number)s":["Conjunto de reglas %(number)s"],"Rules":["Reglas"],"Rules showing %(field)s":["Reglas que muestran %(field)s"],"Save":["Guardar"],"Save draft":["Guardar el borrador"],"Save rules":["Guardar las reglas"],"Save settings":["Guardar los ajustes"],"Saved":["Guardado"],"Saving":["Guardando"],"Scheduled":["Programada"],"Scheduled: %s":["Programado: %s"],"Search %(type)s…":["Buscar %(type)s…"],"Search audio":["Buscar audios"],"Search images":["Buscar imágenes"],"Search media":["Buscar medios"],"Search videos":["Buscar vídeos"],"Select":["Seleccionar"],"September":["septiembre"],"Serving":["Atendiendo"],"Settings":["Ajustes"],"Settings of %(field)s":["Ajustes de %(field)s"],"Shadowed":["Eclipsado"],"Show %(field)s in the list":["Mostrar %(field)s en la lista"],"Showing %(held)s of %(total)s.":["Mostrando %(held)s de %(total)s."],"Singular name":["Nombre en singular"],"Slug":["Slug"],"Somebody must be able to manage users.":["Alguien tiene que poder gestionar los usuarios."],"Someone else changed this media item while you were editing it. Reload the page and make your change again.":["Otra persona ha cambiado este medio mientras lo editabas. Recarga la página y vuelve a hacer tu cambio."],"Someone else saved changes to this item while you were editing, so yours were not saved. Copy your text somewhere safe, then reload the item and put your changes back in.":["Otra persona ha guardado cambios en este elemento mientras editabas, así que los tuyos no se han guardado. Copia tu texto a un lugar seguro, recarga el elemento y vuelve a colocarlos de vuelta."],"Something went wrong inside Gophenberg. Try again in a moment, and tell whoever looks after your site if it keeps happening.":["Algo ha fallado dentro de Gophenberg. Inténtalo de nuevo en un momento, y avisa a quien gestione tu sitio si sigue pasando."],"Something went wrong.":["Algo ha ido mal."],"Something went wrong. Try again.":["Algo ha ido mal. Inténtalo de nuevo."],"Sorry, you are not allowed to access this page.":["Lo siento, no tienes permisos para acceder a esta página."],"Source":["Origen"],"Steps of":["Pasos de"],"Stop nesting":["Dejar de anidar"],"Tablet":["Tableta"],"Text":["Texto"],"Text area":["Área de texto"],"That email is already in use.":["Ese correo electrónico ya está en uso."],"That field group no longer exists. Reload the page to see the groups your site holds now.":["Ese grupo de campos ya no existe. Recarga la página para ver los grupos que tiene ahora tu sitio."],"That field is not on this content type any more. Reload the page to see the fields it has now.":["Ese campo ya no está en este tipo de contenido. Recarga la página para ver los campos que tiene ahora."],"That revision does not exist, and older ones drop off once a type holds more than it keeps. Open the item to see which revisions are left.":["Esa revisión no existe, y las más antiguas se pierden cuando un tipo guarda más de las que conserva. Abre el elemento para ver qué revisiones quedan."],"That role holds more than your own.":["Ese rol abarca más que el tuyo."],"That web address does not name a media item Gophenberg can look up. Open the media library and pick the item from there.":["Esa dirección web no nombra ningún medio que Gophenberg pueda encontrar. Abre la biblioteca de medios y elige el elemento desde ahí."],"That web address does not name a revision Gophenberg can look up. Open the item and pick a revision from its history.":["Esa dirección web no alude a ninguna revisión que Gophenberg pueda identificar. Abre el elemento y elige una revisión de su historial."],"That web address does not name an item Gophenberg can look up. Go back to the list and open the item from there.":["Esa dirección web no alude a ningún elemento que Gophenberg pueda identificar. Vuelve a la lista y abre el elemento desde ahí."],"The %(count)s item in the trash is deleted for good. This cannot be undone.":["%(count)s elemento de la papelera se borrará permanentemente. Esto no se puede deshacer.","%(count)s de elementos de la papelera se borrarán permanentemente. Esto no se puede deshacer.","Los %(count)s elementos de la papelera se borrarán permanentemente. Esto no se puede deshacer."],"The %(file)s calls this theme %(declared)s, but it is being installed as %(installed)s. Rename the zip file to match, or change the name inside %(file)s.":["El archivo %(file)s llama a este tema %(declared)s, pero se está instalando como %(installed)s. Renombra el zip para que coincida, o cambia el nombre dentro de %(file)s."],"The %(file)s inside %(name)s is not valid JSON, so it could not be read. Fix that file and package the theme again.":["El archivo %(file)s dentro de %(name)s no es JSON válido, así que no se ha podido leer. Corrige ese archivo y vuelve a empaquetar el tema."],"The %(file)s inside %(name)s names its theme kit as %(declared)s, which is not a version number. Build the theme again, and the build will fill that in.":["El %(file)s dentro de %(name)s identifica su kit de temas como %(declared)s, que no srive como número de versión. Compila el tema de nuevo y la compilación lo rellenará."],"The %(origin)s plugin declared this, so it can only be changed in that plugin. Turning it off is still yours to do.":["El plugin %(origin)s lo declaró, así que solo se puede cambiar en ese plugin. Desactivarlo sigue estando en tu mano."],"The %(plugin)s plugin also declares %(name)s, and the site keeps the key.":["El plugin %(plugin)s también declara %(name)s, y el sitio se queda con la clave."],"The %(plugin)s plugin declared these fields, so they change only in its code.":["El plugin %(plugin)s declaró estos campos, así que solo cambian en su código."],"The %(plugin)s plugin declares %(name)s flat, and the site keeps it nesting while its items sit inside another.":["El plugin %(plugin)s declara %(name)s sin anidar, y el sitio lo mantiene anidando mientras sus elementos están dentro de otro."],"The browser kept an unsaved version of this post.":["El navegador ha guardado una versión sin guardar de esta entrada."],"The built-in renderer is now serving the public site.":["El renderizador integrado ya presta servicio al sitio público."],"The built-in renderer is serving the public site.":["El renderizador integrado presta servicio al sitio público."],"The content type this field points at is not named in a shape Gophenberg accepts. Give it a key that starts with a lowercase letter and then holds only lowercase letters, numbers and hyphens.":["El tipo de contenido al que apunta este campo no está nombrado con un formato que Gophenberg acepte. Dale una clave que empiece por una letra minúscula y contenga solo letras minúsculas, números y guiones."],"The content types could not be loaded, so where these groups appear and which fields they shadow are not shown.":["No se han podido cargar los tipos de contenido, así que no se muestra dónde aparecen estos grupos ni qué campos eclipsan."],"The content types could not be loaded.":["No se han podido cargar los tipos de contenido."],"The content types could not be refreshed, so where these groups appear and what they shadow may be out of date.":["No se han podido actualizar los tipos de contenido, así que dónde aparecen estos grupos y qué eclipsan puede estar desactualizado."],"The draft could not be created.":["No se ha podido crear el borrador."],"The entry %(entry)s in this zip would be written outside the theme folder, so nothing was installed. Package the theme again.":["La entrada %(entry)s de este zip se escribiría fuera de la carpeta del tema, así que no se ha instalado nada. Vuelve a empaquetar el tema."],"The field %(field)s cannot go, because %(by)s reads it. Change %(by)s first.":["El campo %(field)s no se puede quitar, porque %(by)s lo lee. Cambia antes %(by)s."],"The field %(field)s cannot hold the value it was given. Check what kind of field it is and enter a value that matches.":["El campo %(field)s no puede guardar el valor que se le ha dado. Comprueba de qué tipo de campo se trata e introduce un valor que encaje."],"The field %(field)s has to hold a value before this item can be published. Fill it in, or leave the item as a draft.":["El campo %(field)s tiene que tener un valor antes de poder publicar este elemento. Rellénalo, o deja el elemento como borrador."],"The field %(field)s in %(group)s still points at this content type. Delete that field first, then delete this type.":["El campo %(field)s de %(group)s todavía apunta a este tipo de contenido. Borra antes ese campo y luego borra este tipo."],"The field %(field)s is hidden by its own rules right now, so it cannot hold a value. Show it again before filling it in.":["El campo %(field)s está oculto por sus propias reglas ahora mismo, así que no puede guardar ningún valor. Vuelve a mostrarlo antes de rellenarlo."],"The field %(field)s points at one item only. Remove the extra choices and keep one.":["El campo %(field)s apunta a un solo elemento. Quita las opciones de más y deja una."],"The field %(field)s points at other items, so it does not take a plain value. Pick the items it points at instead.":["El campo %(field)s apunta a otros elementos, así que no admite un valor suelto. Elige en su lugar los elementos a los que apunta."],"The field %(field)s takes a list of items, and what arrived was not a list. Reload the page and pick the items again.":["El campo %(field)s admite una lista de elementos, y lo que ha llegado no era una lista. Recarga la página y vuelve a elegir los elementos."],"The field %(source)s cannot hold the value %(value)s, so no rule can compare it. Write a value of the kind %(source)s stores.":["El campo %(source)s no puede guardar el valor %(value)s, así que ninguna regla puede compararlo. Escribe un valor de la clase que %(source)s guarda."],"The field groups could not be loaded.":["No se han podido cargar los grupos de campos."],"The field groups could not be reached.":["No se ha podido contactar con los grupos de campos."],"The field keeps its values on the content both groups reach.":["El campo conserva sus valores en el contenido al que llegan ambos grupos."],"The fields this group holds go with it, and so do the values every item stored in them.":["Los campos que contiene este grupo se van con él, y también los valores que cada elemento guardó en ellos."],"The groups were reordered.":["Los grupos se han reordenado."],"The item could not be duplicated.":["No se ha podido duplicar el elemento."],"The item could not be moved to the trash.":["No se ha podido mover el elemento a la papelera."],"The item could not be permanently deleted.":["No se ha podido borrar permanentemente el elemento."],"The item could not be restored.":["No se ha podido restaurar el elemento."],"The item you picked as parent holds another kind of content. Pick a parent of the same content type as this item.":["El elemento que has elegido como superior tiene otro tipo de contenido. Elige un elemento superior del mismo tipo de contenido que este elemento."],"The item you picked as parent is in the trash. Restore it, or pick another parent.":["El elemento que has elegido como superior está en la papelera. Restáuralo, o elige otro elemento superior."],"The item you picked as parent no longer exists. Reload the page and pick another parent.":["El elemento que has elegido como superior ya no existe. Recarga la página y elige otro."],"The media library could not be loaded.":["No se ha podido cargar la biblioteca de medios."],"The name changes. Nothing stored under this field moves.":["El nombre cambia. Nada de lo guardado en este campo se mueve."],"The name could not be updated.":["No se ha podido actualizar el nombre."],"The new order has to name every field group exactly once. Reload the page and move the groups again.":["El nuevo orden tiene que nombrar cada grupo de campos exactamente una vez. Recarga la página y mueve los grupos otra vez."],"The new order has to name every field of this content type exactly once. Reload the page and move the fields again.":["El nuevo orden tiene que nombrar cada campo de este tipo de contenido exactamente una vez. Recarga la página y mueve los campos de nuevo."],"The number of revisions to keep has to be a whole number, and it cannot be negative. Enter a different number.":["El número de revisiones que se conservan tiene que ser un número entero, y no puede ser negativo. Introduce otro número."],"The registry could not be reached.":["No se ha podido acceder al registro."],"The role could not be changed.":["No se ha podido cambiar el rol."],"The rule on %(source)s names nothing to match. Pick a value, or remove the rule.":["La regla sobre %(source)s no nombra nada con lo que coincidir. Elige un valor, o quita la regla."],"The rules could not be loaded.":["No se han podido cargar las reglas."],"The rules on %(field)s lead back to %(field)s itself, so nothing can decide whether to show it. Point one of them at another field.":["Las reglas de %(field)s vuelven al propio %(field)s, así que nada puede decidir si mostrarlo. Apunta una de ellas a otro campo."],"The same item was picked twice for %(field)s. Pick each item once.":["El mismo elemento se ha elegido dos veces para %(field)s. Elige cada elemento una sola vez."],"The server could not be reached, so nothing was changed.":["No se ha podido acceder al servidor, así que no se ha cambiado nada."],"The server could not be reached, so nothing was saved.":["No se ha podido acceder al servidor, así que no se ha guardado nada."],"The server could not be reached, so nothing was uploaded.":["No se ha podido acceder al servidor, así que no se ha subido nada."],"The setting %(setting)s cannot hold the value it was given. Check what this setting takes and try again.":["El ajuste %(setting)s no puede contener el valor que se le dio. Comprueba qué acepta este ajuste y prueba de nuevo."],"The setting %(setting)s falls outside the others. Keep min below max and the default inside the bounds.":["El ajuste %(setting)s queda fuera de los demás. Mantén min por debajo de max y el valor por defecto dentro de los límites."],"The settings could not be read, so nothing can be changed here yet.":["No se han podido leer los ajustes, así que todavía no se puede cambiar nada aquí."],"The site default":["El idioma por defecto del sitio"],"The site may already hold part of this file. Import it again to see what is left.":["Puede que el sitio ya tenga parte de este archivo. Impórtalo de nuevo para ver lo que queda."],"The source %(source)s does not offer %(operator)s. Pick one of the comparisons it does offer.":["La fuente %(source)s no ofrece %(operator)s. Elige una de las comparaciones que sí ofrece."],"The theme %(name)s carries no %(file)s, so Gophenberg cannot tell what it is. Put that file at the top level of the zip and package the theme again.":["El tema %(name)s no lleva ningún %(file)s, así que Gophenberg no puede saber qué es. Pon ese archivo en el primer nivel del zip y vuelve a empaquetar el tema."],"The theme %(name)s could not be read, so it cannot serve your site. Upload it again, or choose another theme.":["El tema %(name)s no se ha podido leer, así que no puede servir tu sitio. Vuelve a subirlo, o elige otro tema."],"The theme %(name)s did not start, so your site is still served by the theme it had. Ask whoever looks after your site to check the server log for what the theme reported.":["El tema %(name)s no ha arrancado, así que tu sitio lo sigue sirviendo el tema que tenía. Pide a quien gestiona tu sitio que mire en el registro del servidor para saber qué problema ha informado el tema."],"The theme %(name)s does not carry %(path)s as a file, so there is nothing to run. Package the built theme rather than its source.":["El tema %(name)s no lleva %(path)s como archivo, así que no hay nada que ejecutar. Empaqueta el tema ya construido, no su código fuente."],"The theme %(name)s does not carry %(path)s as a folder, so its styles and scripts are missing. Package the built theme rather than its source.":["El tema %(name)s no lleva %(path)s como carpeta, así que le faltan los estilos y los scripts. Empaqueta el tema ya construido, no su código fuente."],"The theme %(name)s holds a link to another file at %(path)s, and a theme may only carry real files. Replace it and package the theme again.":["El tema %(name)s lleva un enlace a otro archivo en %(path)s, y un tema solo puede llevar archivos de verdad. Sustitúyelo y vuelve a empaquetar el tema."],"The theme %(name)s is serving your site right now, so it cannot be replaced. Deactivate it first, or install this copy under another name.":["El tema %(name)s sirve tu sitio ahora mismo, así que no se puede sustituir. Desactívalo primero, o instala esta copia con otro nombre."],"The theme %(name)s is the one chosen, but it is not installed, so your site is served by the built-in renderer. Upload the theme again, or choose another one.":["El tema %(name)s es el elegido, pero no está instalado, así que el renderizador integrado está prestando servicio a tu sitio. Vuelve a subir el tema, o elige otro."],"The theme %(name)s was built on theme kit %(declared)s, and this site serves %(served)s. Build the theme again against a kit this site serves, then install it.":["El tema %(name)s se compiló con el kit de temas %(declared)s y este sitio sirve %(served)s. Compila el tema de nuevo con un kit que este sitio sirva y después instálalo."],"The trash could not be emptied.":["No se ha podido vaciar la papelera."],"The user could not be created.":["No se ha podido crear el usuario."],"The values stored under it do not follow.":["Los valores guardados debajo no le siguen."],"Theme":["Tema"],"Themes":["Temas"],"Themes could not be loaded.":["No se han podido cargar los temas."],"There is no content type called %(value)s. Pick a type your site holds, or register it first.":["No existe ningún tipo de contenido llamado %(value)s. Elige un tipo que tenga tu sitio, o regístralo primero."],"There is no content type called %(value)s. Pick one of the types your site holds and try again.":["No existe ningún tipo de contenido llamado %(value)s. Elige uno de los tipos que tiene tu sitio e inténtalo de nuevo."],"There is no kind of field called %(value)s. Pick one of these instead: %(allowed)s.":["No existe ningún tipo de campo llamado %(value)s. Elige uno de estos: %(allowed)s."],"There is no page kind called %(value)s. Pick one of these instead: %(allowed)s.":["No existe ningún tipo de página llamado %(value)s. Elige uno de estos: %(allowed)s."],"There is no status called %(value)s. Pick one of these instead: %(allowed)s.":["No existe ningún estado llamado %(value)s. Elige uno de estos: %(allowed)s."],"There is nothing at this address. Check the link and try again.":["No hay nada en esta dirección. Comprueba el enlace e inténtalo de nuevo."],"There is nothing to roll back to, because your site has not been through a theme change yet. Install a theme first, then a rollback has somewhere to go.":["No hay nada a lo que retornar, porque tu sitio todavía no ha cambiado de tema. Instala un tema primero y así el retorno tendrá adónde ir."],"These files could not be read.":["No se han podido leer estos archivos."],"These were left alone, because nobody confirmed losing them.":["Estos se han dejado como estaban, porque nadie confirmó perderlos."],"This content type does not exist any more. Reload the page to see the types your site holds now.":["Este tipo de contenido ya no existe. Recarga la página para ver los tipos que tiene ahora tu sitio."],"This content type does not nest, so one of its items cannot sit inside another. Mark the type as Nests first.":["Este tipo de contenido no anida, así que uno de sus elementos no puede estar dentro de otro. Marca el tipo como Anida primero."],"This content type has no field called %(field)s. Check the name, or declare the field on the type first.":["Este tipo de contenido no tiene ningún campo llamado %(field)s. Comprueba el nombre, o declara antes el campo en el tipo."],"This content type is turned off, so its content is not served or edited. Activate it first.":["Este tipo de contenido está desactivado, así que su contenido ni se sirve ni se edita. Actívalo primero."],"This content type still holds content, so it cannot be deleted. Move or delete its items first.":["Este tipo de contenido todavía tiene contenido, así que no se puede borrar. Mueve o borra antes sus elementos."],"This definitions file is larger than the %(max)s bytes Gophenberg reads in one request. Split it, or raise the limit your site runs with.":["Este archivo de definiciones es mayor que los %(max)s bytes que Gophenberg lee en una petición. Divídelo, o sube el límite con el que funciona tu sitio."],"This field holds no layouts yet.":["Este campo todavía no tiene diseños."],"This field would stand inside too many containers. Put it nearer the top and try again.":["Este campo quedaría dentro de demasiados contenedores. Ponlo más cerca del nivel superior e inténtalo de nuevo."],"This file could not be opened as a zip. Package the theme again and upload the new file.":["Este archivo no se ha podido abrir como zip. Vuelve a empaquetar el tema y sube el archivo nuevo."],"This file is larger than the upload limit. Upload a smaller file.":["Este archivo es más grande que el límite de subida. Sube un archivo más pequeño."],"This file is named %(extension)s but it holds %(detected)s content. Upload it under a name that matches what is inside it.":["Este archivo se llama %(extension)s pero lleva contenido %(detected)s. Súbelo con un nombre que coincida con lo que lleva dentro."],"This file matches the site, so there is nothing to change.":["Este archivo coincide con el sitio, así que no hay nada que cambiar."],"This file says it was written in format %(declared)s, which is not a version Gophenberg can read. Export the definitions again from the site they came from.":["Este archivo dice estar escrito en el formato %(declared)s, que no es una versión que Gophenberg pueda leer. Vuelve a exportar las definiciones desde el sitio del que vinieron."],"This file was written in format %(declared)s, and this release reads %(served)s. Upgrade the site the file came from, or this one.":["Este archivo está escrito en el formato %(declared)s, y esta versión lee %(served)s. Actualiza el sitio del que viene el archivo, o este."],"This group holds no fields yet.":["Este grupo todavía no tiene campos."],"This install of Gophenberg has no install root, so it updates by hand.":["Esta instalación de Gophenberg no tiene raíz de instalación, así que se actualiza a mano."],"This is a custom build of Gophenberg, so it updates by hand.":["Esta es una compilación propia de Gophenberg, así que se actualiza a mano."],"This item cannot go straight to that status from the one it holds now. Save it as a draft first, then try again.":["Este elemento no puede pasar directamente a ese estado desde el que tiene ahora. Guárdalo antes como borrador e inténtalo de nuevo."],"This item changed while you were describing it. Reload and try again.":["Este elemento ha cambiado mientras lo describías. Recarga e inténtalo de nuevo."],"This item does not exist, and it may have been deleted. Go back to the list to see what is there.":["Este elemento no existe, y puede que se haya borrado. Vuelve a la lista para ver qué hay."],"This item is already in the trash. Restore it first to work on it again.":["Este elemento ya está en la papelera. Restáuralo primero para volver a trabajar en él."],"This item is in the trash. Restore it first to work on it again.":["Este elemento está en la papelera. Restáuralo primero para volver a trabajar en él."],"This item is not in the trash, so there is nothing to restore. Open it from the list to work on it as it is.":["Este elemento no está en la papelera, así que no hay nada que restaurar. Ábrelo desde la lista para trabajar en él tal como está."],"This item still holds items nested inside it. Move or delete those first.":["Este elemento todavía tiene elementos anidados dentro. Mueve o borra antes esos."],"This kind of field holds no fields inside it. Put the field in a section or a repeater instead.":["Este tipo de campo no contiene campos dentro. Pon el campo en una sección o en un repetidor."],"This media item is not in the library, and someone may have deleted it. Reload the page to see what is there now.":["Este medio no está en la biblioteca, y puede que alguien lo haya borrado. Recarga la página para ver qué hay ahora."],"This picture could not be read, so nothing was stored. The file may be damaged, so open it on your computer and upload it again.":["Esta imagen no se ha podido leer, así que no se ha guardado nada. Puede que el archivo esté dañado, así que ábrelo en tu ordenador y vuelve a subirlo."],"This picture is %(width)s by %(height)s pixels, over the limit of %(max)s pixels in all. Make it smaller and upload it again.":["Esta imagen tiene %(width)s por %(height)s píxeles, por encima del límite de %(max)s píxeles en total. Hazla más pequeña y vuelve a subirla."],"This post changed elsewhere. Reload before saving again.":["Esta entrada ha cambiado en otro sitio. Recarga antes de volver a guardar."],"This request came from a page on another site, so it was refused. Open the admin on this site and try again.":["Esta petición vino de una página de otro sitio, así que se rechazó. Abre la administración en este sitio e inténtalo de nuevo."],"This request carried %(attribute)s, which fields do not take. Reload the page so the admin and the server agree again.":["Esta petición llevaba %(attribute)s, que los campos no aceptan. Recarga la página para que la administración y el servidor vuelvan a coincidir."],"This request left out %(field)s, which Gophenberg needs. Reload the page and try again.":["En esta petición faltaba %(field)s, que Gophenberg necesita. Recarga la página e inténtalo de nuevo."],"This rule reads a source called %(source)s, and nothing on your site declares one. A plugin that added it may have been removed.":["Esta regla lee una fuente llamada %(source)s, y nada en tu sitio declara ninguna. Puede que se haya quitado un plugin que la añadía."],"This site cannot write to its themes folder, so no theme can be installed. Ask whoever looks after your site to make the folder that %(setting)s points at writable. A read-only mount is the usual cause.":["Este sitio no puede escribir en su carpeta de temas, así que no se puede instalar ninguno. Pide a quien gestione tu sitio que haga escribible la carpeta a la que apunta %(setting)s. La causa habitual es un montaje de solo lectura."],"This site has nowhere to keep themes, so no theme can be installed. Ask whoever looks after your site to point %(setting)s at a folder the server can write to.":["Este sitio no tiene dónde guardar los temas, así que no se puede instalar ninguno. Pide a quien gestione tu sitio que apunte %(setting)s a una carpeta en la que el servidor pueda escribir."],"This site has nowhere to store uploads, so nothing can be uploaded. Ask whoever looks after your site to point %(setting)s at a folder the server can write to.":["Este sitio no tiene dónde guardar las subidas, así que no se puede subir nada. Pide a quien gestione tu sitio que apunte %(setting)s a una carpeta en la que el servidor pueda escribir."],"This theme is over the limit of %(max)s bytes, packed or unpacked. Leave out what the theme does not need and package it again.":["Este tema pasa del límite de %(max)s bytes, comprimido o sin comprimir. Saca lo que el tema no necesite y vuelve a empaquetarlo."],"This type will answer under /%(word)s.":["Este tipo responderá como /%(word)s."],"This zip holds %(entries)s files, more than the %(max)s a theme may carry. Package only the built theme.":["Este zip lleva %(entries)s archivos, más de los %(max)s que puede llevar un tema. Empaqueta solo el tema ya construido."],"Through":["A través de"],"Thumbnail":["Miniatura"],"Title":["Título"],"Two field groups in this file share the key %(key)s. Give one of them a different key and import again.":["Dos grupos de campos de este archivo comparten la clave %(key)s. Dale una clave distinta a uno de ellos e importa de nuevo."],"Two rule sources are registered under the name %(param)s. A plugin is declaring a source your site already holds.":["Hay dos fuentes de reglas registradas con el nombre %(param)s. Un plugin declara una fuente que tu sitio ya tiene."],"Type":["Tipo"],"Type a whole number in both boxes before saving.":["Escribe un número entero en las dos casillas antes de guardar."],"Undo":["Deshacer"],"Unsaved changes":["Cambios sin guardar"],"Update":["Actualizar"],"Update failed.":["No se ha podido actualizar."],"Upload theme":["Subir tema"],"Uploaded %s file.":["%s archivo subido.","%s de archivos subidos.","%s archivos subidos."],"Users":["Usuarios"],"Users could not be loaded.":["No se han podido cargar los usuarios."],"Value":["Valor"],"Version":["Versión"],"Videos":["Vídeos"],"Visit Site":["Visitar el sitio"],"Web address":["Dirección web"],"What each Linked from field reads":["Qué lee cada campo Enlazado desde"],"What it points at changed, so its stored values go with it.":["Aquello a lo que apunta ha cambiado, así que sus valores guardados se van con él."],"Where %(group)s appears":["Dónde aparece %(group)s"],"Without a rule this field always shows.":["Sin ninguna regla este campo siempre se muestra."],"Without a rule this group appears nowhere.":["Sin una regla este grupo no aparece en ningún sitio."],"Yes":["Sí"],"Yes or no":["Sí o no"],"You cannot change your own role.":["No puedes cambiar tu propio rol."],"Your language":["Tu idioma"],"Your role does not allow %(capability)s.":["Tu rol no permite %(capability)s."],"Your server pins the site to the theme %(name)s, so themes cannot be changed here. Ask whoever looks after your site to remove the pin.":["Tu servidor bloque el sitio al tema %(name)s, así que los temas no se pueden cambiar desde aquí. Pide a quien gestiona tu sitio que quite ese bloqueo."],"Your site always needs one default content type, so this one cannot be turned off or deleted. Make another type the default first.":["Tu sitio siempre necesita un tipo de contenido por defecto, así que este no se puede desactivar ni borrar. Haz antes que otro tipo sea el que está por defecto."],"a content type":["un tipo de contenido"],"account\u0004Role":["Rol"],"account\u0004Status":["Estado"],"action label\u0004Duplicate":["Duplicar"],"action label\u0004Duplicate…":["Duplicar…"],"address":["dirección"],"admin section\u0004Media":["Medios"],"column\u0004Date":["Fecha"],"content type\u0004\"%s\" permanently deleted.":["Se ha borrado permanentemente el tipo de contenido «%s»."],"content type\u0004\"%s\" successfully created.":["Se ha creado correctamente el tipo de contenido «%s»."],"content type\u0004Status":["Estado"],"field\u0004Name":["Nombre"],"field group\u0004Status":["Estado"],"field type\u0004Choice":["Elección"],"field type\u0004Color":["Color"],"field type\u0004Date":["Fecha"],"field type\u0004Flexible content":["Contenido flexible"],"field type\u0004Gallery":["Galería"],"field type\u0004Kind":["Tipo"],"field type\u0004Layout":["Diseño"],"field type\u0004Link":["Enlace"],"field type\u0004Media":["Medio"],"field type\u0004Range":["Rango"],"field type\u0004Repeater":["Repetidor"],"field type\u0004Section":["Sección"],"field type\u0004Select":["Desplegable"],"holds":["contiene"],"holds anything":["contiene algo"],"is":["es"],"is above":["es mayor que"],"is below":["es menor que"],"is empty":["está vacío"],"is not":["no es"],"media family\u0004Kind":["Clase"],"panel button label\u0004Settings":["Ajustes"],"person\u0004Name":["Nombre"],"post\u0004%s (Copy)":["%s (copia)"],"post\u0004Status":["Estado"],"post status\u0004Draft":["Borrador"],"post status\u0004Published":["Publicada"],"post status\u0004Trash":["Papelera"],"post type general name\u0004Pages":["Páginas"],"post type general name\u0004Posts":["Entradas"],"post type singular name\u0004Page":["Página"],"post type singular name\u0004Post":["Entrada"],"relation target\u0004None":["Ninguno"],"role\u0004Administrator":["Administrador"],"role\u0004Author":["Autor"],"role\u0004Editor":["Editor"],"role\u0004Member":["Miembro"],"role\u0004No role":["Sin rol"],"status filter\u0004All":["Todo"],"taxonomy general name\u0004Categories":["Categorías"],"taxonomy singular name\u0004Category":["Categoría"],"theme\u0004Status":["Estado"],"trash\u0004Restore":["Restaurar"],"v%(version)s":["v%(version)s"],"verb\u0004Trash…":["Papelera…"],"verb\u0004View":["Ver"],"{day} {month} {year}":["{day} de {month} de {year}"]} +{"":{"lang":"es","plural-forms":"nplurals=3; plural=((n == 1) ? 0 : ((n != 0 && n % 1000000 == 0) ? 1 : 2));"}," and ":[" y "]," or ":[" o "],"\"%s\" activated.":["Se ha activado «%s»."],"\"%s\" deactivated.":["Se ha desactivado «%s»."],"\"%s\" has been restored.":["«%s» se ha restaurado."],"\"%s\" moved to the trash.":["«%s» trasladado a la papelera."],"\"%s\" permanently deleted.":["«%s» borrado permanentemente."],"\"%s\" successfully created.":["«%s» creado correctamente."],"\"%s\" uploaded.":["«%s» subido."],"%(field)s address":["Dirección de %(field)s"],"%(field)s cannot move inside itself. Pick a container that is not one of its own.":["%(field)s no puede moverse dentro de sí mismo. Elige un contenedor que no sea uno de los suyos."],"%(field)s declared.":["%(field)s declarado."],"%(field)s deleted.":["%(field)s borrado."],"%(field)s does not match the format its field asks for. Check it and save again.":["%(field)s no tiene el formato que su campo requiere. Revísalo y guarda de nuevo."],"%(field)s goes no higher than %(limit)s. Lower the value and save again.":["%(field)s no pasa de %(limit)s. Baja el valor y guarda de nuevo."],"%(field)s goes no lower than %(limit)s. Raise the value and save again.":["%(field)s no baja de %(limit)s. Sube el valor y guarda de nuevo."],"%(field)s holds no value of its own, so it cannot be required. Make it optional.":["%(field)s no guarda ningún valor propio, así que no puede ser obligatorio. Hazlo opcional."],"%(field)s is optional again.":["%(field)s vuelve a ser opcional."],"%(field)s is required now.":["%(field)s ahora es obligatorio."],"%(field)s moved.":["%(field)s movido."],"%(field)s names the same one twice. Remove the repeat and save again.":["%(field)s nombra el mismo dos veces. Quita la repetición y guarda de nuevo."],"%(field)s needs at least %(limit)s files. Add one and save again.":["%(field)s necesita al menos %(limit)s archivos. Añade uno y guarda de nuevo."],"%(field)s needs at least %(limit)s rows. Add one and save again.":["%(field)s necesita al menos %(limit)s filas. Añade una y guarda de nuevo."],"%(field)s only takes one of its listed choices. Pick one and save again.":["%(field)s solo admite una de las opciones de su lista. Elige una y guarda de nuevo."],"%(field)s reads a relation field that is not there. Pick a group and a relation field it holds.":["%(field)s lee un campo de relación que no existe. Elige un grupo y un campo de relación que contenga."],"%(field)s reads a relation pointing at %(type)s, so it would list nothing here. Pick a relation pointing at the items this group is shown on.":["%(field)s lee una relación que apunta a %(type)s, así que aquí no mostraría nada. Elige una relación que apunte a los elementos donde se muestra este grupo."],"%(field)s renamed.":["%(field)s renombrado."],"%(field)s settled.":["%(field)s ajustado."],"%(field)s shows by its rules now.":["%(field)s ahora se muestra según sus reglas."],"%(field)s stands in the list.":["%(field)s aparece en la lista."],"%(field)s stays out of the list.":["%(field)s se queda fuera de la lista."],"%(field)s takes at most %(limit)s files. Remove one and save again.":["%(field)s acepta como mucho %(limit)s archivos. Quita uno y guarda de nuevo."],"%(field)s takes at most %(limit)s letters. Shorten what you wrote and save again.":["%(field)s acepta como mucho %(limit)s letras. Acorta lo que has escrito y guarda de nuevo."],"%(field)s takes at most %(limit)s rows. Remove one and save again.":["%(field)s admite como mucho %(limit)s filas. Quita una y guarda de nuevo."],"%(field)s title":["Título de %(field)s"],"%(file)s is larger than one upload may be.":["%(file)s es más grande de lo que una subida permite."],"%(file)s is not a file this block accepts.":["%(file)s no es un archivo que este bloque acepte."],"%(file)s: %(reason)s":["%(file)s: %(reason)s"],"%(group)s created.":["%(group)s creado."],"%(group)s now appears where you said.":["%(group)s ya aparece donde has dicho."],"%(group)s removed.":["%(group)s eliminado."],"%(group)s updated.":["%(group)s actualizado."],"%(key)s is served by %(winner)s, so %(loser)s does not show it on %(where)s.":["%(key)s lo sirve %(winner)s, así que %(loser)s no lo muestra en %(where)s."],"%(name)s %(version)s is serving the public site.":["%(name)s %(version)s está publicado en la web."],"%(name)s belongs to the site now.":["%(name)s ya pertenece al sitio."],"%(name)s came from the %(plugin)s plugin, which no longer declares it.":["%(name)s vino del plugin %(plugin)s, que ya no lo declara."],"%(name)s cannot be used as a theme name. Name the zip file after the theme, with no dot at the start and no slashes in it.":["%(name)s no se puede usar como nombre de tema. Nombra el archivo zip como el tema, sin punto al principio y sin barras."],"%(name)s moves to /%(word)s. Every address of both types changes.":["El tipo %(name)s pasa a /%(word)s. Cambian todas las direcciones de ambos tipos."],"%(name)s would move to /%(word)s, which Gophenberg keeps for itself. Change its plural name and try again.":["El tipo %(name)s pasaría a /%(word)s, que Gophenberg reserva para sí mismo. Cambia su nombre en plural e inténtalo de nuevo."],"%(source)s is %(value)s":["%(source)s es %(value)s"],"%(theme)s failed to start, so the built-in renderer is serving.":["%(theme)s no pudo arrancar, así que el renderizador ha tomado el relevo."],"%(theme)s is now serving the public site.":["%(theme)s ya sirve el sitio público."],"%(theme)s is serving the public site.":["%(theme)s sirve el sitio público."],"%(theme)s is still starting, so the built-in renderer is serving.":["%(theme)s todavía está arrancando, así que el renderizador ha tomado el relevo."],"%(theme)s was installed.":["%(theme)s se ha instalado."],"%(theme)s will not load, so the built-in renderer is serving.":["%(theme)s no se carga, así que el renderizador ha tomado el relevo."],"%(type)s answers on a new address, and stored links move with it.":["%(type)s responde en una dirección nueva, y los enlaces guardados se mueven con ella."],"%(type)s becomes the type the site opens on, and the old one takes an address.":["%(type)s pasa a ser el tipo con el que abre el sitio, y el anterior toma una dirección."],"%(type)s keeps nesting while %(items)s of its items sit inside another. Move those to the top level first, the ones in the trash included.":["%(type)s sigue anidando mientras %(items)s de sus elementos están dentro de otro. Muévelos primero al nivel superior, incluidos los de la papelera."],"%(type)s keeps nesting, because some of its items sit inside another.":["%(type)s sigue anidando, porque algunos de sus elementos están dentro de otro."],"%(type)s will answer at the root.":["El tipo %(type)s responderá en la raíz."],"%s content type activated.":["Se ha activado %s tipo de contenido.","Se han activado %s de tipos de contenido.","Se han activado %s tipos de contenido."],"%s content type could not be activated.":["No se ha podido activar %s tipo de contenido.","No se han podido activar %s de tipos de contenido.","No se han podido activar %s tipos de contenido."],"%s content type could not be deactivated.":["No se ha podido desactivar %s tipo de contenido.","No se han podido desactivar %s de tipos de contenido.","No se han podido desactivar %s tipos de contenido."],"%s content type could not be permanently deleted.":["No se ha podido borrar permanentemente %s tipo de contenido.","No se han podido borrar permanentemente %s de tipos de contenido.","No se han podido borrar permanentemente %s tipos de contenido."],"%s content type deactivated.":["Se ha desactivado %s tipo de contenido.","Se han desactivado %s de tipos de contenido.","Se han desactivado %s tipos de contenido."],"%s content type permanently deleted.":["Se ha borrado permanentemente %s tipo de contenido.","Se han borrado permanentemente %s de tipos de contenido.","Se han borrado permanentemente %s tipos de contenido."],"%s item could not be moved to the trash.":["No se ha podido mover %s elemento a la papelera.","No se han podido mover %s de elementos a la papelera.","No se han podido mover %s elementos a la papelera."],"%s item could not be permanently deleted.":["No se ha podido borrar permanentemente %s elemento.","No se han podido borrar permanentemente %s de elementos.","No se han podido borrar permanentemente %s elementos."],"%s item could not be restored.":["No se ha podido restaurar %s elemento.","No se han podido restaurar %s de elementos.","No se han podido restaurar %s elementos."],"%s item moved to the trash.":["%s elemento movido a la papelera.","%s de elementos movidos a la papelera.","%s elementos movidos a la papelera."],"%s item permanently deleted.":["%s elemento borrado permanentemente.","%s de elementos borrados permanentemente.","%s elementos borrados permanentemente."],"%s item stays in the trash.":["%s elemento sigue en la papelera.","%s de elementos siguen en la papelera.","%s elementos siguen en la papelera."],"%s page has been restored.":["Se ha restaurado %s página.","Se han restaurado %s de páginas.","Se han restaurado %s páginas."],"%s post has been restored.":["Se ha restaurado %s entrada.","Se han restaurado %s de entradas.","Se han restaurado %s entradas."],"(no title)":["(sin título)"],"A %(kind)s field does not take a setting called %(setting)s. Remove it and try again.":["Un campo %(kind)s no acepta un ajuste llamado %(setting)s. Quítalo y prueba de nuevo."],"A Linked from field stands on its own, not inside a section or a repeater. Declare %(field)s beside the container.":["Un campo Enlazado desde va por su cuenta, no dentro de una sección ni de un repetidor. Declara %(field)s junto al contenedor."],"A content type needs a singular and a plural name, like Guide and Guides. Fill both in and try again.":["Un tipo de contenido necesita un nombre en singular y otro en plural, como Guía y Guías. Rellena ambos e inténtalo de nuevo."],"A descriptive summary of the content type.":["Un resumen descriptivo del tipo de contenido."],"A field group key has to start with a lowercase letter and then hold only lowercase letters, numbers and hyphens. Rename the group in the file so its key comes out in that shape.":["La clave de un grupo de campos tiene que empezar por una letra minúscula y después llevar solo letras minúsculas, números y guiones. Cambia el nombre del grupo en el archivo para que su clave salga con esa forma."],"A field key has to start with a lowercase letter and then hold only lowercase letters, numbers and hyphens. Rename the field so its key comes out in that shape.":["La clave de un campo tiene que empezar por una letra minúscula y contener solo letras minúsculas, números y guiones. Renombra el campo para que su clave tenga esa forma."],"A field needs a name. Type one and try again.":["El campo necesita un nombre. Escribe uno e inténtalo de nuevo."],"A field with that name already exists on the items this group reaches. Pick another name.":["Ya existe un campo con ese nombre en los elementos que este grupo alcanza. Elige otro nombre."],"A flexible content field holds layouts, and %(field)s is not one. Add a layout first, then declare the field inside that layout.":["Un campo de contenido flexible contiene diseños, y %(field)s no lo es. Añade primero un diseño y después declara el campo dentro de ese diseño."],"A higher quality stores larger files, and it applies to pictures uploaded from now on.":["Una calidad más alta almacena archivos más grandes, y se aplica a las imágenes que subas a partir de ahora."],"A layout stands inside a flexible content field only. Put %(field)s inside one of those instead.":["Un diseño solo va dentro de un campo de contenido flexible. Pon %(field)s dentro de uno de ellos."],"A layout stands inside a flexible content field, never on its own. Declare a flexible content field first, then add %(field)s inside it.":["Un diseño va dentro de un campo de contenido flexible, nunca por su cuenta. Declara primero un campo de contenido flexible y después añade %(field)s dentro."],"A listing carries between 1 and %(max)s items, so %(value)s is not a size Gophenberg takes. Pick a number inside that range.":["Un listado muestra entre 1 y %(max)s elementos, así que %(value)s no es un tamaño que Gophenberg acepte. Elige un número dentro de ese rango."],"A relation field has to say which content type it points at. Pick that type and try again.":["Un campo de relación tiene que indicar a qué tipo de contenido apunta. Elige ese tipo e inténtalo de nuevo."],"A reload shows the admin in the language you chose.":["Al recargar verás el panel de administración en el idioma que has elegido."],"A route word has to start with a lowercase letter and then hold only lowercase letters, numbers and hyphens. Change it and try again.":["La palabra de ruta de la URL tiene que empezar por una letra minúscula y contener solo letras minúsculas, números y guiones. Cámbiala e inténtalo de nuevo."],"A row of %(field)s has to name the layout it takes. Pick a layout for the row, or remove the row.":["Una fila de %(field)s tiene que nombrar el diseño que toma. Elige un diseño para la fila, o quita la fila."],"A row of %(field)s takes one layout and no more. Reload the page and build the row again.":["Una fila de %(field)s toma un solo diseño. Recarga la página y crea la fila otra vez."],"A rule matching any %(source)s cannot be turned into an exclusion. Leave it as is, or name the ones to leave out instead.":["Una regla que vale para cualquier %(source)s no se puede convertir en exclusión. Déjala como está, o nombra los que quieras dejar fuera."],"A theme naming its own page size uses that instead.":["Un tema que indica su propio tamaño de página usa ese en su lugar."],"A type key has to start with a lowercase letter and then hold only lowercase letters, numbers and hyphens. Change the key and try again.":["La clave de un tipo tiene que empezar por una letra minúscula y contener solo letras minúsculas, números y guiones. Cambia la clave e inténtalo de nuevo."],"Actions":["Acciones"],"Activate":["Activar"],"Activate %(theme)s":["Activar %(theme)s"],"Active":["Activo"],"Add":["Añadir"],"Add %(layout)s":["Añadir %(layout)s"],"Add %(name)s":["Añadir %(name)s"],"Add %(type)s":["Añadir %(type)s"],"Add Category":["Añadir categoría"],"Add Content Type":["Añadir tipo de contenido"],"Add Field Group":["Añadir grupo de campos"],"Add Media File":["Añadir medios"],"Add Page":["Añadir página"],"Add Post":["Añadir entrada"],"Add User":["Añadir usuario"],"Add block":["Añadir bloque"],"Add choice":["Añadir opción"],"Add condition":["Añadir condición"],"Add field":["Añadir campo"],"Add field to %(field)s":["Añadir campo a %(field)s"],"Add layout":["Añadir diseño"],"Add layout to %(field)s":["Añadir diseño a %(field)s"],"Add one with %(button)s.":["Añade un elemento con %(button)s."],"Add row":["Añadir fila"],"Add rule set":["Añadir conjunto de reglas"],"Add title":["Añadir título"],"Add to %(field)s":["Añadir a %(field)s"],"Address":["Dirección"],"Address updated.":["Dirección actualizada."],"Adopt":["Adoptar"],"Allow custom":["Permitir valores propios"],"Allow empty":["Permitir vacío"],"Alt text":["Texto alternativo"],"An item cannot point at itself. Pick a different item for %(field)s.":["Un elemento no puede apuntarse a sí mismo. Elige otro elemento para %(field)s."],"An item cannot sit inside itself, or inside one of the items nested under it. Pick a parent outside this branch.":["Un elemento no puede estar dentro de sí mismo, ni dentro de otro anidado bajo él. Elige un nivel superior fuera de esta rama."],"Another account wrote this, and only its author, an editor or an administrator may change it. You can still read it.":["Otra cuenta escribió esto, y solo su autor, un editor o un administrador pueden cambiarlo. Todavía puedes leerlo."],"Another account wrote this, so you are reading it rather than editing it.":["Otra cuenta escribió esto, así que lo estás leyendo, no editando."],"Another content type already answers under this route word. Pick a different word.":["Ya hay otro tipo de contenido que responde con esta palabra de ruta de URL. Elige una palabra distinta."],"Another content type already lives at the root of your site, and only one can. Give this type a route word, or hand the root over with Make default.":["Ya hay otro tipo de contenido en la raíz de tu sitio, y solo puede haber uno. Dale a este tipo de contenido una palabra de ruta de URL, o cede la raíz con Establecer como predeterminado."],"Another content type already uses this key. Give this type a different name.":["Ya hay otro tipo de contenido que usa esta clave. Dale a este tipo un nombre distinto."],"Another item of this content type already uses that address. Pick a different slug and save again.":["Ya hay otro elemento de este tipo de contenido que usa esa dirección. Elige un slug distinto y guarda de nuevo."],"Another update is currently in progress.":["En este momento hay otra actualización en marcha."],"Appears on":["Aparece en"],"Apply":["Aplicar"],"April":["abril"],"Are you sure you want to move \"%s\" to the trash?":["¿Seguro que quieres mover «%s» a la papelera?"],"Audio":["Audio"],"August":["agosto"],"Author":["Autor"],"Back to %(type)s":["Volver a %(type)s"],"Back to the latest posts":["Volver a las últimas entradas"],"Block":["Bloque"],"Broken":["Roto"],"Bundles of fields, shown where their rules place them.":["Conjuntos de campos, mostrados donde sus reglas los colocan."],"Button group":["Grupo de botones"],"Cancel":["Cancelar"],"Caption":["Leyenda"],"Change %(name)s":["Cambiar %(name)s"],"Change address":["Cambiar la dirección"],"Change address…":["Cambiar la dirección…"],"Change role":["Cambiar el rol"],"Change the role of %(name)s":["Cambiar el rol de %(name)s"],"Checkbox group":["Grupo de casillas"],"Choices":["Opciones"],"Choose %(field)s":["Elegir %(field)s"],"Choose how the site serves its content.":["Elige cómo el sitio sirve su contenido."],"Choose the language the admin reads in.":["Elige el idioma en el que se lee el panel de administración."],"Choose the role of %(name)s.":["Elige el rol de %(name)s."],"Choose the version to update to.":["Elige la versión a la que actualizar."],"Clear %(field)s":["Vaciar %(field)s"],"Close":["Cerrar"],"Close Settings":["Cerrar ajustes"],"Closed":["Cerrado"],"Condition":["Condición"],"Content":["Contenido"],"Content Types":["Tipos de contenido"],"Content nests at most %(max)s levels deep, and this item would sit deeper. Pick a parent closer to the top.":["El contenido se anida como mucho %(max)s niveles, y este elemento quedaría más abajo. Elige un nivel superior más cercano al inicio."],"Content type":["Tipo de contenido"],"Content type updated.":["Tipo de contenido actualizado."],"Could not delete that item.":["No se ha podido borrar ese elemento.","No se han podido borrar todos los elementos.","No se han podido borrar todos los elementos."],"Could not load that post.":["No se ha podido cargar esa entrada."],"Could not save that post.":["No se ha podido guardar esa entrada."],"Create":["Crear"],"Create a field group":["Crear un grupo de campos"],"Create user":["Crear usuario"],"Created":["Fecha de creación"],"Date added":["Fecha de subida"],"Deactivate":["Desactivar"],"Deactivate %(theme)s":["Desactivar %(theme)s"],"December":["diciembre"],"Default":["Por defecto"],"Default content type updated.":["Tipo de contenido predeterminado actualizado."],"Definitions file":["Archivo de definiciones"],"Delete":["Borrar"],"Delete \"%(title)s\" for good? This cannot be undone.":["¿Borrar permanentemente «%(title)s»? Esto no se puede deshacer."],"Delete %(field)s":["Borrar %(field)s"],"Delete %(group)s":["Eliminar %(group)s"],"Delete %(title)s for good? This cannot be undone.":["¿Borrar %(title)s para siempre? Esto no se puede deshacer."],"Delete %s content type for good? This cannot be undone.":["¿Borrar permanentemente %s tipo de contenido? Esto no se puede deshacer.","¿Borrar permanentemente %s de tipos de contenido? Esto no se puede deshacer.","¿Borrar permanentemente %s tipos de contenido? Esto no se puede deshacer."],"Delete %s item for good? This cannot be undone.":["¿Borrar permanentemente %s elemento? Esto no se puede deshacer.","¿Borrar permanentemente %s de elementos? Esto no se puede deshacer.","¿Borrar permanentemente %s elementos? Esto no se puede deshacer."],"Delete Permanently":["Borrar permanentemente"],"Delete the field":["Borrar el campo"],"Delete the group":["Eliminar el grupo"],"Delete this %(count)s item for good? This cannot be undone.":["¿Borrar este %(count)s elemento para siempre? Esto no se puede deshacer.","¿Borrar estos %(count)s elementos para siempre? Esto no se puede deshacer.","¿Borrar estos %(count)s elementos para siempre? Esto no se puede deshacer."],"Delete…":["Borrar…"],"Describe":["Describir"],"Describe…":["Describir…"],"Description":["Descripción"],"Description updated.":["Descripción actualizada."],"Desktop":["Escritorio"],"Destination":["Destino"],"Dimensions":["Dimensiones"],"Disable":["Desactivar"],"Disable %(name)s":["Desactivar a %(name)s"],"Disabled":["Desactivado"],"Dismiss":["Descartar"],"Document":["Documento"],"Done. The site now holds what the file describes.":["Hecho. El sitio ya tiene lo que describe el archivo."],"Draft saved.":["Borrador guardado."],"Drop files to upload":["Arrastra los archivos para subirlos"],"Email":["Correo electrónico"],"Empty Trash":["Vaciar papelera"],"Empty trash":["Vaciar papelera"],"Enable":["Activar"],"Enable %(name)s":["Activar a %(name)s"],"Every address of this type moves. Links kept elsewhere to the old addresses stop working.":["Cambian todas las direcciones de este tipo. Los enlaces guardados en otro sitio hacia las direcciones antiguas dejan de funcionar."],"Every content type":["Todos los tipos de contenido"],"Every field group needs a title. Give it a name and save again.":["Todo grupo de campos necesita un título. Ponle un nombre y guarda otra vez."],"Every item needs an author who exists. Pick one from the list and save again.":["Cada elemento necesita un autor que exista. Elige uno de la lista y guarda de nuevo."],"Every kind of content this site holds.":["Todos los tipos de contenido que hay en este sitio."],"Every value stored under this field goes with it, in every item the group reaches and in the revisions behind them.":["Todos los valores guardados en este campo se van con él, en cada elemento que el grupo alcanza y en las revisiones que hay detrás."],"Excerpt":["Extracto"],"Export definitions":["Exportar definiciones"],"February":["febrero"],"Fewest files":["Mínimo de archivos"],"Fewest rows":["Mínimo de filas"],"Field":["Campo"],"Field Groups":["Grupos de campos"],"Field group":["Grupo de campos"],"Fields":["Campos"],"Fields of %(group)s":["Campos de %(group)s"],"File name":["Nombre del archivo"],"File size":["Tamaño del archivo"],"File type":["Tipo de archivo"],"Files":["Archivos"],"Filter by status":["Filtrar por estado"],"Follow the browser":["Sigue al navegador"],"From %(plugin)s":["De %(plugin)s"],"Full Size":["Tamaño completo"],"Gophenberg cannot start this update: %(reason)s":["Gophenberg no puede empezar esta actualización: %(reason)s"],"Gophenberg checked for updates moments ago. Try again later.":["Gophenberg ha buscado actualizaciones hace un momento. Inténtalo de nuevo más tarde."],"Gophenberg could not read what your browser sent. Reload the page and try again, and tell whoever looks after your site if it keeps happening.":["Gophenberg no ha podido leer lo que ha enviado tu navegador. Recarga la página e inténtalo de nuevo, y avisa a quien gestiona tu sitio si sigue pasando."],"Gophenberg could not read which item you picked as parent. Reload the page and pick it again.":["Gophenberg no ha podido leer qué elemento has elegido como elemento superior. Recarga la página y vuelve a elegirlo."],"Gophenberg does not accept %(extension)s files. Upload a picture, a video, an audio file, a PDF or a zip instead.":["Gophenberg no acepta archivos %(extension)s. Sube una imagen, un vídeo, un audio, un PDF o un zip."],"Gophenberg does not answer in %(value)s. Pick one of the languages on the list.":["Gophenberg no responde en %(value)s. Elige uno de los idiomas de la lista."],"Gophenberg has no autosave of yours for this item. Open the item to see the version that is stored.":["Gophenberg no tiene ningún guardado automático tuyo de este elemento. Ábrelo para ver la versión guardada."],"Gophenberg holds no kind of definition called %(subject)s, so nothing was taken over. Reload the page so the admin and the server agree again.":["Gophenberg no tiene ninguna clase de definición llamada %(subject)s, así que no se ha adoptado nada. Recarga la página para que el admin y el servidor vuelvan a coincidir."],"Gophenberg keeps /%(path)s for itself or for another content type, so your content cannot answer there. Give the item a different slug.":["Gophenberg reserva la dirección /%(path)s para sí mismo o para otro tipo de contenido, así que tu contenido no puede usarla. Dale al elemento otro slug."],"Gophenberg keeps this word for itself, so no content type can answer under it. Pick a different route word.":["Gophenberg reserva esta palabra para sí mismo, así que ningún tipo de contenido puede usarla. Elige otra palabra de ruta de URL."],"Group":["Grupo"],"Highest":["Máximo"],"Holds":["Contiene"],"Images":["Imágenes"],"Import definitions":["Importar definiciones"],"In list":["En la lista"],"Inactive":["Inactivo"],"Installed":["Instalado"],"Instructions":["Instrucciones"],"It moves here from another group and keeps its stored values.":["Se mueve aquí desde otro grupo y conserva sus valores guardados."],"It moves to another group and keeps its stored values.":["Se mueve a otro grupo y conserva sus valores guardados."],"It moves to another group, so its stored values do not follow.":["Se mueve a otro grupo, así que sus valores guardados no le siguen."],"It reads a relation inside a container, and only an import can point it elsewhere.":["Lee una relación dentro de un contenedor, y solo una importación puede apuntarlo a otro sitio."],"It starts on %(type)s, and the rules may be edited afterwards.":["Empieza en %(type)s, y las reglas se pueden editar después."],"Items could not be loaded.":["No se han podido cargar los elementos."],"Its items sit inside one another, so it keeps nesting.":["Sus elementos están unos dentro de otros, así que sigue anidando."],"Its kind changed, so its stored values go with it.":["Su tipo ha cambiado, así que sus valores guardados se van con él."],"January":["enero"],"July":["julio"],"June":["junio"],"Keep %(field)s out of the list":["Dejar %(field)s fuera de la lista"],"Keep it":["Conservarlo"],"Keep it here":["Dejarlo aquí"],"Key":["Clave"],"Label":["Etiqueta"],"Language":["Idioma"],"Large":["Grande"],"Let items nest":["Permitir anidar"],"Linked from":["Enlazado desde"],"List view":["Vista de lista"],"Loading field groups.":["Cargando los grupos de campos."],"Loading the post.":["Cargando la entrada."],"Loading the screen.":["Cargando la pantalla."],"Loading themes.":["Cargando los temas."],"Loading users.":["Cargando los usuarios."],"Loading…":["Cargando…"],"Longest":["Largo máximo"],"Lowest":["Mínimo"],"Make %(field)s optional":["Hacer %(field)s opcional"],"Make default":["Establecer como predeterminado"],"Make default…":["Establecer como predeterminado…"],"Make optional":["Hacer opcional"],"Manage the categories on this site.":["Gestiona las categorías de este sitio."],"Manage the images and files this site holds.":["Gestiona las imágenes y los archivos que hay en este sitio."],"Manage the items of this content type.":["Gestiona los elementos de este tipo de contenido."],"Manage the pages on this site.":["Gestiona las páginas de este sitio."],"Manage the posts on this site.":["Gestiona las entradas de este sitio."],"Many targets":["Varios destinos"],"Many values":["Varios valores"],"March":["marzo"],"May":["mayo"],"Media %(id)s":["Medio %(id)s"],"Media Library":["Biblioteca de medios"],"Medium":["Mediano"],"Mobile":["Móvil"],"Modified: %s":["Modificado: %s"],"Most files":["Máximo de archivos"],"Most rows":["Máximo de filas"],"Move":["Mover"],"Move \"%(title)s\" to the trash?":["¿Mover «%(title)s» a la papelera?"],"Move %(field)s down":["Bajar %(field)s"],"Move %(field)s elsewhere":["Mover %(field)s a otro sitio"],"Move %(field)s up":["Subir %(field)s"],"Move %(group)s down":["Bajar %(group)s"],"Move %(group)s up":["Subir %(group)s"],"Move %(name)s down":["Bajar %(name)s"],"Move %(name)s up":["Subir %(name)s"],"Move %s item to the trash?":["¿Mover %s elemento a la papelera?","¿Mover %s de elementos a la papelera?","¿Mover %s elementos a la papelera?"],"Move every address":["Mover todas las direcciones"],"Move row down":["Bajar la fila"],"Move row up":["Subir la fila"],"Move the field":["Mover el campo"],"Move to trash":["Mover a la papelera"],"Name":["Nombre"],"Name updated.":["Nombre actualizado."],"Nests":["Anida"],"Newer posts":["Entradas más recientes"],"No":["No"],"No content types found.":["No se han encontrado tipos de contenido."],"No description":["Sin descripción"],"No file arrived with this upload. Choose a file and try again.":["No ha llegado ningún archivo con esta subida. Elige un archivo e inténtalo de nuevo."],"No items found.":["No se han encontrado elementos."],"No items yet.":["Todavía no hay elementos."],"No media chosen":["Ningún medio elegido"],"No media has been uploaded yet.":["Todavía no se ha subido ningún medio."],"No media items found.":["No se han encontrado archivos de medios."],"No media items yet.":["Todavía no hay archivos de medios."],"No page lives at this address.":["No existe ninguna página en esta dirección."],"No parent":["Sin elemento superior"],"No theme arrived with this upload. Choose a zip file and try again.":["No ha llegado ningún tema con esta subida. Elige un archivo zip e inténtalo de nuevo."],"No themes are installed.":["No hay ningún tema instalado."],"No title":["Sin título"],"None":["Ninguno"],"Not %(type)s":["Excepto %(type)s"],"Not found":["No encontrado"],"Not serving":["No está sirviendo"],"Nothing declares that role.":["Nada declara ese rol."],"Nothing points here yet.":["Todavía no apunta nada aquí."],"Nothing published here yet.":["Todavía no hay nada publicado aquí."],"Nothing published yet.":["Todavía no hay nada publicado."],"November":["noviembre"],"Nowhere":["En ningún sitio"],"Number":["Número"],"October":["octubre"],"Older posts":["Entradas anteriores"],"One frame of this animation holds more than %(max)s pixels, which is more than Gophenberg opens. Upload a smaller animation.":["Un fotograma de esta animación tiene más de %(max)s píxeles, más de lo que Gophenberg abre. Sube una animación más pequeña."],"One of the filters on this list is not one Gophenberg understands. Clear the filters and try again.":["Uno de los filtros de esta lista no es un filtro que Gophenberg entienda. Quita los filtros e inténtalo de nuevo."],"One of the items picked for %(field)s is not the kind of content that field points at. Reload the page and pick from the list the field offers.":["Uno de los elementos elegidos para %(field)s no es del tipo de contenido al que apunta ese campo. Recarga la página y elige de la lista que ofrece el campo."],"One of the items picked for %(field)s was not named in a way Gophenberg understands. Reload the page and pick the items again.":["Uno de los elementos elegidos para %(field)s no venía nombrado de una forma que Gophenberg entienda. Recarga la página y vuelve a elegir los elementos."],"One of the items picked no longer exists. Reload the page and pick again.":["Uno de los elementos elegidos ya no existe. Recarga la página y vuelve a elegir."],"One target":["Un destino"],"Only a relation field points at another content type or holds many items. Pick the Relation kind, or leave the target and the many option empty.":["Solo un campo de relación apunta a otro tipo de contenido o guarda varios elementos. Elige el tipo Relación, o deja vacío el destino y la opción de varios."],"Only one file may be placed here.":["Aquí solo se puede colocar un archivo."],"Only the content type at the root of your site may go without a route word. Give this type one and try again.":["Solo el tipo de contenido que está en la raíz de tu sitio puede ir sin palabra de ruta de URL. Dale una a este tipo e inténtalo de nuevo."],"Open %(field)s in a new tab":["Abrir %(field)s en una pestaña nueva"],"Order stored.":["Orden guardado."],"Other":["Otro"],"Out of list":["Fuera de la lista"],"Parent":["Elemento superior"],"Password":["Contraseña"],"Pending":["Pendiente"],"Pending Review":["Pendiente de revisión"],"Permanently delete":["Borrar permanentemente"],"Permanently delete…":["Borrar permanentemente…"],"Picture quality":["Calidad de imagen"],"Picture quality runs from 1 to %(max)s, so %(value)s is not a quality Gophenberg stores at. Pick a number inside that range.":["La calidad de imagen va de 1 a %(max)s, así que %(value)s no es una calidad con la que Gophenberg guarde. Elige un número dentro de ese rango."],"Placeholder":["Texto de ejemplo"],"Plural name":["Nombre en plural"],"Points at":["Apunta a"],"Post published.":["Entrada publicada."],"Posts per page":["Entradas por página"],"Preview":["Vista previa"],"Private":["Privada"],"Publish":["Publicar"],"Published: %s":["Publicado: %s"],"Radio group":["Grupo de botones de radio"],"Reads from":["Lee de"],"Redo":["Rehacer"],"Relation":["Relación"],"Remove":["Quitar"],"Remove %(name)s":["Quitar %(name)s"],"Remove %(title)s":["Quitar %(title)s"],"Remove row":["Quitar fila"],"Rename":["Renombrar"],"Rename %(field)s":["Renombrar %(field)s"],"Rename…":["Renombrar…"],"Require":["Hacer obligatorio"],"Require %(field)s":["Hacer %(field)s obligatorio"],"Required":["Obligatorio"],"Restore":["Restaurar"],"Role changed.":["Rol cambiado."],"Roll back to %(theme)s":["Revertir a %(theme)s"],"Roll back to the built-in renderer":["Revertir al renderizador integrado"],"Route word":["Palabra de ruta"],"Rule %(number)s of set %(set)s":["Regla %(number)s del conjunto %(set)s"],"Rule set %(number)s":["Conjunto de reglas %(number)s"],"Rules":["Reglas"],"Rules showing %(field)s":["Reglas que muestran %(field)s"],"Save":["Guardar"],"Save draft":["Guardar el borrador"],"Save rules":["Guardar las reglas"],"Save settings":["Guardar los ajustes"],"Saved":["Guardado"],"Saving":["Guardando"],"Scheduled":["Programada"],"Scheduled: %s":["Programado: %s"],"Search %(type)s…":["Buscar %(type)s…"],"Search audio":["Buscar audios"],"Search images":["Buscar imágenes"],"Search media":["Buscar medios"],"Search videos":["Buscar vídeos"],"Select":["Seleccionar"],"September":["septiembre"],"Serving":["Atendiendo"],"Settings":["Ajustes"],"Settings of %(field)s":["Ajustes de %(field)s"],"Shadowed":["Eclipsado"],"Show %(field)s in the list":["Mostrar %(field)s en la lista"],"Showing %(held)s of %(total)s.":["Mostrando %(held)s de %(total)s."],"Singular name":["Nombre en singular"],"Slug":["Slug"],"Somebody must be able to manage users.":["Alguien tiene que poder gestionar los usuarios."],"Someone else changed this media item while you were editing it. Reload the page and make your change again.":["Otra persona ha cambiado este medio mientras lo editabas. Recarga la página y vuelve a hacer tu cambio."],"Someone else saved changes to this item while you were editing, so yours were not saved. Copy your text somewhere safe, then reload the item and put your changes back in.":["Otra persona ha guardado cambios en este elemento mientras editabas, así que los tuyos no se han guardado. Copia tu texto a un lugar seguro, recarga el elemento y vuelve a colocarlos de vuelta."],"Something went wrong inside Gophenberg. Try again in a moment, and tell whoever looks after your site if it keeps happening.":["Algo ha fallado dentro de Gophenberg. Inténtalo de nuevo en un momento, y avisa a quien gestione tu sitio si sigue pasando."],"Something went wrong.":["Algo ha ido mal."],"Something went wrong. Try again.":["Algo ha ido mal. Inténtalo de nuevo."],"Sorry, you are not allowed to access this page.":["Lo siento, no tienes permisos para acceder a esta página."],"Source":["Origen"],"Steps of":["Pasos de"],"Stop nesting":["Dejar de anidar"],"Tablet":["Tableta"],"Text":["Texto"],"Text area":["Área de texto"],"That email is already in use.":["Ese correo electrónico ya está en uso."],"That field group no longer exists. Reload the page to see the groups your site holds now.":["Ese grupo de campos ya no existe. Recarga la página para ver los grupos que tiene ahora tu sitio."],"That field is not on this content type any more. Reload the page to see the fields it has now.":["Ese campo ya no está en este tipo de contenido. Recarga la página para ver los campos que tiene ahora."],"That revision does not exist, and older ones drop off once a type holds more than it keeps. Open the item to see which revisions are left.":["Esa revisión no existe, y las más antiguas se pierden cuando un tipo guarda más de las que conserva. Abre el elemento para ver qué revisiones quedan."],"That role holds more than your own.":["Ese rol abarca más que el tuyo."],"That web address does not name a media item Gophenberg can look up. Open the media library and pick the item from there.":["Esa dirección web no nombra ningún medio que Gophenberg pueda encontrar. Abre la biblioteca de medios y elige el elemento desde ahí."],"That web address does not name a revision Gophenberg can look up. Open the item and pick a revision from its history.":["Esa dirección web no alude a ninguna revisión que Gophenberg pueda identificar. Abre el elemento y elige una revisión de su historial."],"That web address does not name an item Gophenberg can look up. Go back to the list and open the item from there.":["Esa dirección web no alude a ningún elemento que Gophenberg pueda identificar. Vuelve a la lista y abre el elemento desde ahí."],"The %(count)s item in the trash is deleted for good. This cannot be undone.":["%(count)s elemento de la papelera se borrará permanentemente. Esto no se puede deshacer.","%(count)s de elementos de la papelera se borrarán permanentemente. Esto no se puede deshacer.","Los %(count)s elementos de la papelera se borrarán permanentemente. Esto no se puede deshacer."],"The %(file)s calls this theme %(declared)s, but it is being installed as %(installed)s. Rename the zip file to match, or change the name inside %(file)s.":["El archivo %(file)s llama a este tema %(declared)s, pero se está instalando como %(installed)s. Renombra el zip para que coincida, o cambia el nombre dentro de %(file)s."],"The %(file)s inside %(name)s is not valid JSON, so it could not be read. Fix that file and package the theme again.":["El archivo %(file)s dentro de %(name)s no es JSON válido, así que no se ha podido leer. Corrige ese archivo y vuelve a empaquetar el tema."],"The %(file)s inside %(name)s names its theme kit as %(declared)s, which is not a version number. Build the theme again, and the build will fill that in.":["El %(file)s dentro de %(name)s identifica su kit de temas como %(declared)s, que no srive como número de versión. Compila el tema de nuevo y la compilación lo rellenará."],"The %(origin)s plugin declared this, so it can only be changed in that plugin. Turning it off is still yours to do.":["El plugin %(origin)s lo declaró, así que solo se puede cambiar en ese plugin. Desactivarlo sigue estando en tu mano."],"The %(plugin)s plugin also declares %(name)s, and the site keeps the key.":["El plugin %(plugin)s también declara %(name)s, y el sitio se queda con la clave."],"The %(plugin)s plugin declared these fields, so they change only in its code.":["El plugin %(plugin)s declaró estos campos, así que solo cambian en su código."],"The %(plugin)s plugin declares %(name)s flat, and the site keeps it nesting while its items sit inside another.":["El plugin %(plugin)s declara %(name)s sin anidar, y el sitio lo mantiene anidando mientras sus elementos están dentro de otro."],"The browser kept an unsaved version of this post.":["El navegador ha guardado una versión sin guardar de esta entrada."],"The built-in renderer is now serving the public site.":["El renderizador integrado ya presta servicio al sitio público."],"The built-in renderer is serving the public site.":["El renderizador integrado presta servicio al sitio público."],"The content type this field points at is not named in a shape Gophenberg accepts. Give it a key that starts with a lowercase letter and then holds only lowercase letters, numbers and hyphens.":["El tipo de contenido al que apunta este campo no está nombrado con un formato que Gophenberg acepte. Dale una clave que empiece por una letra minúscula y contenga solo letras minúsculas, números y guiones."],"The content types could not be loaded, so where these groups appear and which fields they shadow are not shown.":["No se han podido cargar los tipos de contenido, así que no se muestra dónde aparecen estos grupos ni qué campos eclipsan."],"The content types could not be loaded.":["No se han podido cargar los tipos de contenido."],"The content types could not be refreshed, so where these groups appear and what they shadow may be out of date.":["No se han podido actualizar los tipos de contenido, así que dónde aparecen estos grupos y qué eclipsan puede estar desactualizado."],"The draft could not be created.":["No se ha podido crear el borrador."],"The entry %(entry)s in this zip would be written outside the theme folder, so nothing was installed. Package the theme again.":["La entrada %(entry)s de este zip se escribiría fuera de la carpeta del tema, así que no se ha instalado nada. Vuelve a empaquetar el tema."],"The field %(field)s cannot go, because %(by)s reads it. Change %(by)s first.":["El campo %(field)s no se puede quitar, porque %(by)s lo lee. Cambia antes %(by)s."],"The field %(field)s cannot hold the value it was given. Check what kind of field it is and enter a value that matches.":["El campo %(field)s no puede guardar el valor que se le ha dado. Comprueba de qué tipo de campo se trata e introduce un valor que encaje."],"The field %(field)s has to hold a value before this item can be published. Fill it in, or leave the item as a draft.":["El campo %(field)s tiene que tener un valor antes de poder publicar este elemento. Rellénalo, o deja el elemento como borrador."],"The field %(field)s in %(group)s still points at this content type. Delete that field first, then delete this type.":["El campo %(field)s de %(group)s todavía apunta a este tipo de contenido. Borra antes ese campo y luego borra este tipo."],"The field %(field)s is hidden by its own rules right now, so it cannot hold a value. Show it again before filling it in.":["El campo %(field)s está oculto por sus propias reglas ahora mismo, así que no puede guardar ningún valor. Vuelve a mostrarlo antes de rellenarlo."],"The field %(field)s points at one item only. Remove the extra choices and keep one.":["El campo %(field)s apunta a un solo elemento. Quita las opciones de más y deja una."],"The field %(field)s points at other items, so it does not take a plain value. Pick the items it points at instead.":["El campo %(field)s apunta a otros elementos, así que no admite un valor suelto. Elige en su lugar los elementos a los que apunta."],"The field %(field)s takes a list of items, and what arrived was not a list. Reload the page and pick the items again.":["El campo %(field)s admite una lista de elementos, y lo que ha llegado no era una lista. Recarga la página y vuelve a elegir los elementos."],"The field %(source)s cannot hold the value %(value)s, so no rule can compare it. Write a value of the kind %(source)s stores.":["El campo %(source)s no puede guardar el valor %(value)s, así que ninguna regla puede compararlo. Escribe un valor de la clase que %(source)s guarda."],"The field groups could not be loaded.":["No se han podido cargar los grupos de campos."],"The field groups could not be reached.":["No se ha podido contactar con los grupos de campos."],"The field keeps its values on the content both groups reach.":["El campo conserva sus valores en el contenido al que llegan ambos grupos."],"The fields this group holds go with it, and so do the values every item stored in them.":["Los campos que contiene este grupo se van con él, y también los valores que cada elemento guardó en ellos."],"The groups were reordered.":["Los grupos se han reordenado."],"The item could not be duplicated.":["No se ha podido duplicar el elemento."],"The item could not be moved to the trash.":["No se ha podido mover el elemento a la papelera."],"The item could not be permanently deleted.":["No se ha podido borrar permanentemente el elemento."],"The item could not be restored.":["No se ha podido restaurar el elemento."],"The item you picked as parent holds another kind of content. Pick a parent of the same content type as this item.":["El elemento que has elegido como superior tiene otro tipo de contenido. Elige un elemento superior del mismo tipo de contenido que este elemento."],"The item you picked as parent is in the trash. Restore it, or pick another parent.":["El elemento que has elegido como superior está en la papelera. Restáuralo, o elige otro elemento superior."],"The item you picked as parent no longer exists. Reload the page and pick another parent.":["El elemento que has elegido como superior ya no existe. Recarga la página y elige otro."],"The media library could not be loaded.":["No se ha podido cargar la biblioteca de medios."],"The name changes. Nothing stored under this field moves.":["El nombre cambia. Nada de lo guardado en este campo se mueve."],"The name could not be updated.":["No se ha podido actualizar el nombre."],"The new order has to name every field group exactly once. Reload the page and move the groups again.":["El nuevo orden tiene que nombrar cada grupo de campos exactamente una vez. Recarga la página y mueve los grupos otra vez."],"The new order has to name every field of this content type exactly once. Reload the page and move the fields again.":["El nuevo orden tiene que nombrar cada campo de este tipo de contenido exactamente una vez. Recarga la página y mueve los campos de nuevo."],"The number of revisions to keep has to be a whole number, and it cannot be negative. Enter a different number.":["El número de revisiones que se conservan tiene que ser un número entero, y no puede ser negativo. Introduce otro número."],"The registry could not be reached.":["No se ha podido acceder al registro."],"The role could not be changed.":["No se ha podido cambiar el rol."],"The rule on %(source)s names nothing to match. Pick a value, or remove the rule.":["La regla sobre %(source)s no nombra nada con lo que coincidir. Elige un valor, o quita la regla."],"The rules could not be loaded.":["No se han podido cargar las reglas."],"The rules on %(field)s lead back to %(field)s itself, so nothing can decide whether to show it. Point one of them at another field.":["Las reglas de %(field)s vuelven al propio %(field)s, así que nada puede decidir si mostrarlo. Apunta una de ellas a otro campo."],"The same item was picked twice for %(field)s. Pick each item once.":["El mismo elemento se ha elegido dos veces para %(field)s. Elige cada elemento una sola vez."],"The server could not be reached, so nothing was changed.":["No se ha podido acceder al servidor, así que no se ha cambiado nada."],"The server could not be reached, so nothing was saved.":["No se ha podido acceder al servidor, así que no se ha guardado nada."],"The server could not be reached, so nothing was uploaded.":["No se ha podido acceder al servidor, así que no se ha subido nada."],"The setting %(setting)s cannot hold the value it was given. Check what this setting takes and try again.":["El ajuste %(setting)s no puede contener el valor que se le dio. Comprueba qué acepta este ajuste y prueba de nuevo."],"The setting %(setting)s falls outside the others. Keep min below max and the default inside the bounds.":["El ajuste %(setting)s queda fuera de los demás. Mantén min por debajo de max y el valor por defecto dentro de los límites."],"The settings could not be read, so nothing can be changed here yet.":["No se han podido leer los ajustes, así que todavía no se puede cambiar nada aquí."],"The site default":["El idioma por defecto del sitio"],"The site may already hold part of this file. Import it again to see what is left.":["Puede que el sitio ya tenga parte de este archivo. Impórtalo de nuevo para ver lo que queda."],"The source %(source)s does not offer %(operator)s. Pick one of the comparisons it does offer.":["La fuente %(source)s no ofrece %(operator)s. Elige una de las comparaciones que sí ofrece."],"The theme %(name)s carries no %(file)s, so Gophenberg cannot tell what it is. Put that file at the top level of the zip and package the theme again.":["El tema %(name)s no lleva ningún %(file)s, así que Gophenberg no puede saber qué es. Pon ese archivo en el primer nivel del zip y vuelve a empaquetar el tema."],"The theme %(name)s could not be read, so it cannot serve your site. Upload it again, or choose another theme.":["El tema %(name)s no se ha podido leer, así que no puede servir tu sitio. Vuelve a subirlo, o elige otro tema."],"The theme %(name)s did not start, so your site is still served by the theme it had. Ask whoever looks after your site to check the server log for what the theme reported.":["El tema %(name)s no ha arrancado, así que tu sitio lo sigue sirviendo el tema que tenía. Pide a quien gestiona tu sitio que mire en el registro del servidor para saber qué problema ha informado el tema."],"The theme %(name)s does not carry %(path)s as a file, so there is nothing to run. Package the built theme rather than its source.":["El tema %(name)s no lleva %(path)s como archivo, así que no hay nada que ejecutar. Empaqueta el tema ya construido, no su código fuente."],"The theme %(name)s does not carry %(path)s as a folder, so its styles and scripts are missing. Package the built theme rather than its source.":["El tema %(name)s no lleva %(path)s como carpeta, así que le faltan los estilos y los scripts. Empaqueta el tema ya construido, no su código fuente."],"The theme %(name)s holds a link to another file at %(path)s, and a theme may only carry real files. Replace it and package the theme again.":["El tema %(name)s lleva un enlace a otro archivo en %(path)s, y un tema solo puede llevar archivos de verdad. Sustitúyelo y vuelve a empaquetar el tema."],"The theme %(name)s is serving your site right now, so it cannot be replaced. Deactivate it first, or install this copy under another name.":["El tema %(name)s sirve tu sitio ahora mismo, así que no se puede sustituir. Desactívalo primero, o instala esta copia con otro nombre."],"The theme %(name)s is the one chosen, but it is not installed, so your site is served by the built-in renderer. Upload the theme again, or choose another one.":["El tema %(name)s es el elegido, pero no está instalado, así que el renderizador integrado está prestando servicio a tu sitio. Vuelve a subir el tema, o elige otro."],"The theme %(name)s was built on theme kit %(declared)s, and this site serves %(served)s. Build the theme again against a kit this site serves, then install it.":["El tema %(name)s se compiló con el kit de temas %(declared)s y este sitio sirve %(served)s. Compila el tema de nuevo con un kit que este sitio sirva y después instálalo."],"The trash could not be emptied.":["No se ha podido vaciar la papelera."],"The user could not be created.":["No se ha podido crear el usuario."],"The values stored under it do not follow.":["Los valores guardados debajo no le siguen."],"Theme":["Tema"],"Themes":["Temas"],"Themes could not be loaded.":["No se han podido cargar los temas."],"There is no content type called %(value)s. Pick a type your site holds, or register it first.":["No existe ningún tipo de contenido llamado %(value)s. Elige un tipo que tenga tu sitio, o regístralo primero."],"There is no content type called %(value)s. Pick one of the types your site holds and try again.":["No existe ningún tipo de contenido llamado %(value)s. Elige uno de los tipos que tiene tu sitio e inténtalo de nuevo."],"There is no kind of field called %(value)s. Pick one of these instead: %(allowed)s.":["No existe ningún tipo de campo llamado %(value)s. Elige uno de estos: %(allowed)s."],"There is no page kind called %(value)s. Pick one of these instead: %(allowed)s.":["No existe ningún tipo de página llamado %(value)s. Elige uno de estos: %(allowed)s."],"There is no status called %(value)s. Pick one of these instead: %(allowed)s.":["No existe ningún estado llamado %(value)s. Elige uno de estos: %(allowed)s."],"There is nothing at this address. Check the link and try again.":["No hay nada en esta dirección. Comprueba el enlace e inténtalo de nuevo."],"There is nothing to roll back to, because your site has not been through a theme change yet. Install a theme first, then a rollback has somewhere to go.":["No hay nada a lo que retornar, porque tu sitio todavía no ha cambiado de tema. Instala un tema primero y así el retorno tendrá adónde ir."],"These files could not be read.":["No se han podido leer estos archivos."],"These were left alone, because nobody confirmed losing them.":["Estos se han dejado como estaban, porque nadie confirmó perderlos."],"This content type does not exist any more. Reload the page to see the types your site holds now.":["Este tipo de contenido ya no existe. Recarga la página para ver los tipos que tiene ahora tu sitio."],"This content type does not nest, so one of its items cannot sit inside another. Mark the type as Nests first.":["Este tipo de contenido no anida, así que uno de sus elementos no puede estar dentro de otro. Marca el tipo como Anida primero."],"This content type has no field called %(field)s. Check the name, or declare the field on the type first.":["Este tipo de contenido no tiene ningún campo llamado %(field)s. Comprueba el nombre, o declara antes el campo en el tipo."],"This content type is turned off, so its content is not served or edited. Activate it first.":["Este tipo de contenido está desactivado, así que su contenido ni se sirve ni se edita. Actívalo primero."],"This content type still holds content, so it cannot be deleted. Move or delete its items first.":["Este tipo de contenido todavía tiene contenido, así que no se puede borrar. Mueve o borra antes sus elementos."],"This definitions file is larger than the %(max)s bytes Gophenberg reads in one request. Split it, or raise the limit your site runs with.":["Este archivo de definiciones es mayor que los %(max)s bytes que Gophenberg lee en una petición. Divídelo, o sube el límite con el que funciona tu sitio."],"This field holds no layouts yet.":["Este campo todavía no tiene diseños."],"This field would stand inside too many containers. Put it nearer the top and try again.":["Este campo quedaría dentro de demasiados contenedores. Ponlo más cerca del nivel superior e inténtalo de nuevo."],"This file could not be opened as a zip. Package the theme again and upload the new file.":["Este archivo no se ha podido abrir como zip. Vuelve a empaquetar el tema y sube el archivo nuevo."],"This file is larger than the upload limit. Upload a smaller file.":["Este archivo es más grande que el límite de subida. Sube un archivo más pequeño."],"This file is named %(extension)s but it holds %(detected)s content. Upload it under a name that matches what is inside it.":["Este archivo se llama %(extension)s pero lleva contenido %(detected)s. Súbelo con un nombre que coincida con lo que lleva dentro."],"This file matches the site, so there is nothing to change.":["Este archivo coincide con el sitio, así que no hay nada que cambiar."],"This file says it was written in format %(declared)s, which is not a version Gophenberg can read. Export the definitions again from the site they came from.":["Este archivo dice estar escrito en el formato %(declared)s, que no es una versión que Gophenberg pueda leer. Vuelve a exportar las definiciones desde el sitio del que vinieron."],"This file was written in format %(declared)s, and this release reads %(served)s. Upgrade the site the file came from, or this one.":["Este archivo está escrito en el formato %(declared)s, y esta versión lee %(served)s. Actualiza el sitio del que viene el archivo, o este."],"This group holds no fields yet.":["Este grupo todavía no tiene campos."],"This install of Gophenberg has no install root, so it updates by hand.":["Esta instalación de Gophenberg no tiene raíz de instalación, así que se actualiza a mano."],"This is a custom build of Gophenberg, so it updates by hand.":["Esta es una compilación propia de Gophenberg, así que se actualiza a mano."],"This item cannot go straight to that status from the one it holds now. Save it as a draft first, then try again.":["Este elemento no puede pasar directamente a ese estado desde el que tiene ahora. Guárdalo antes como borrador e inténtalo de nuevo."],"This item changed while you were describing it. Reload and try again.":["Este elemento ha cambiado mientras lo describías. Recarga e inténtalo de nuevo."],"This item does not exist, and it may have been deleted. Go back to the list to see what is there.":["Este elemento no existe, y puede que se haya borrado. Vuelve a la lista para ver qué hay."],"This item is already in the trash. Restore it first to work on it again.":["Este elemento ya está en la papelera. Restáuralo primero para volver a trabajar en él."],"This item is in the trash. Restore it first to work on it again.":["Este elemento está en la papelera. Restáuralo primero para volver a trabajar en él."],"This item is not in the trash, so there is nothing to restore. Open it from the list to work on it as it is.":["Este elemento no está en la papelera, así que no hay nada que restaurar. Ábrelo desde la lista para trabajar en él tal como está."],"This item still holds items nested inside it. Move or delete those first.":["Este elemento todavía tiene elementos anidados dentro. Mueve o borra antes esos."],"This kind of field holds no fields inside it. Put the field in a section or a repeater instead.":["Este tipo de campo no contiene campos dentro. Pon el campo en una sección o en un repetidor."],"This media item is not in the library, and someone may have deleted it. Reload the page to see what is there now.":["Este medio no está en la biblioteca, y puede que alguien lo haya borrado. Recarga la página para ver qué hay ahora."],"This picture could not be read, so nothing was stored. The file may be damaged, so open it on your computer and upload it again.":["Esta imagen no se ha podido leer, así que no se ha guardado nada. Puede que el archivo esté dañado, así que ábrelo en tu ordenador y vuelve a subirlo."],"This picture is %(width)s by %(height)s pixels, over the limit of %(max)s pixels in all. Make it smaller and upload it again.":["Esta imagen tiene %(width)s por %(height)s píxeles, por encima del límite de %(max)s píxeles en total. Hazla más pequeña y vuelve a subirla."],"This post changed elsewhere. Reload before saving again.":["Esta entrada ha cambiado en otro sitio. Recarga antes de volver a guardar."],"This request came from a page on another site, so it was refused. Open the admin on this site and try again.":["Esta petición vino de una página de otro sitio, así que se rechazó. Abre la administración en este sitio e inténtalo de nuevo."],"This request carried %(attribute)s, which fields do not take. Reload the page so the admin and the server agree again.":["Esta petición llevaba %(attribute)s, que los campos no aceptan. Recarga la página para que la administración y el servidor vuelvan a coincidir."],"This request left out %(field)s, which Gophenberg needs. Reload the page and try again.":["En esta petición faltaba %(field)s, que Gophenberg necesita. Recarga la página e inténtalo de nuevo."],"This rule reads a source called %(source)s, and nothing on your site declares one. A plugin that added it may have been removed.":["Esta regla lee una fuente llamada %(source)s, y nada en tu sitio declara ninguna. Puede que se haya quitado un plugin que la añadía."],"This site cannot write to its themes folder, so no theme can be installed. Ask whoever looks after your site to make the folder that %(setting)s points at writable. A read-only mount is the usual cause.":["Este sitio no puede escribir en su carpeta de temas, así que no se puede instalar ninguno. Pide a quien gestione tu sitio que haga escribible la carpeta a la que apunta %(setting)s. La causa habitual es un montaje de solo lectura."],"This site has nowhere to keep themes, so no theme can be installed. Ask whoever looks after your site to point %(setting)s at a folder the server can write to.":["Este sitio no tiene dónde guardar los temas, así que no se puede instalar ninguno. Pide a quien gestione tu sitio que apunte %(setting)s a una carpeta en la que el servidor pueda escribir."],"This site has nowhere to store uploads, so nothing can be uploaded. Ask whoever looks after your site to point %(setting)s at a folder the server can write to.":["Este sitio no tiene dónde guardar las subidas, así que no se puede subir nada. Pide a quien gestione tu sitio que apunte %(setting)s a una carpeta en la que el servidor pueda escribir."],"This theme is over the limit of %(max)s bytes, packed or unpacked. Leave out what the theme does not need and package it again.":["Este tema pasa del límite de %(max)s bytes, comprimido o sin comprimir. Saca lo que el tema no necesite y vuelve a empaquetarlo."],"This type will answer under /%(word)s.":["Este tipo responderá como /%(word)s."],"This zip holds %(entries)s files, more than the %(max)s a theme may carry. Package only the built theme.":["Este zip lleva %(entries)s archivos, más de los %(max)s que puede llevar un tema. Empaqueta solo el tema ya construido."],"Through":["A través de"],"Thumbnail":["Miniatura"],"Title":["Título"],"Two field groups in this file share the key %(key)s. Give one of them a different key and import again.":["Dos grupos de campos de este archivo comparten la clave %(key)s. Dale una clave distinta a uno de ellos e importa de nuevo."],"Two rule sources are registered under the name %(param)s. A plugin is declaring a source your site already holds.":["Hay dos fuentes de reglas registradas con el nombre %(param)s. Un plugin declara una fuente que tu sitio ya tiene."],"Type":["Tipo"],"Type a whole number in both boxes before saving.":["Escribe un número entero en las dos casillas antes de guardar."],"Undo":["Deshacer"],"Unsaved changes":["Cambios sin guardar"],"Update":["Actualizar"],"Update failed.":["No se ha podido actualizar."],"Upload theme":["Subir tema"],"Uploaded %s file.":["%s archivo subido.","%s de archivos subidos.","%s archivos subidos."],"Users":["Usuarios"],"Users could not be loaded.":["No se han podido cargar los usuarios."],"Value":["Valor"],"Version":["Versión"],"Videos":["Vídeos"],"Visit Site":["Visitar el sitio"],"Web address":["Dirección web"],"What each Linked from field reads":["Qué lee cada campo Enlazado desde"],"What it points at changed, so its stored values go with it.":["Aquello a lo que apunta ha cambiado, así que sus valores guardados se van con él."],"Where %(group)s appears":["Dónde aparece %(group)s"],"Without a rule this field always shows.":["Sin ninguna regla este campo siempre se muestra."],"Without a rule this group appears nowhere.":["Sin una regla este grupo no aparece en ningún sitio."],"Yes":["Sí"],"Yes or no":["Sí o no"],"You cannot change your own role.":["No puedes cambiar tu propio rol."],"Your language":["Tu idioma"],"Your role does not allow %(capability)s.":["Tu rol no permite %(capability)s."],"Your server pins the site to the theme %(name)s, so themes cannot be changed here. Ask whoever looks after your site to remove the pin.":["Tu servidor bloque el sitio al tema %(name)s, así que los temas no se pueden cambiar desde aquí. Pide a quien gestiona tu sitio que quite ese bloqueo."],"Your site always needs one default content type, so this one cannot be turned off or deleted. Make another type the default first.":["Tu sitio siempre necesita un tipo de contenido por defecto, así que este no se puede desactivar ni borrar. Haz antes que otro tipo sea el que está por defecto."],"a content type":["un tipo de contenido"],"account\u0004Role":["Rol"],"account\u0004Status":["Estado"],"action label\u0004Duplicate":["Duplicar"],"action label\u0004Duplicate…":["Duplicar…"],"address":["dirección"],"admin section\u0004Content Types":["Tipos de contenido"],"admin section\u0004Field Groups":["Grupos de campos"],"admin section\u0004Language":["Idioma"],"admin section\u0004Media":["Medios"],"admin section\u0004Settings":["Ajustes"],"admin section\u0004Themes":["Temas"],"column\u0004Date":["Fecha"],"content type\u0004\"%s\" permanently deleted.":["Se ha borrado permanentemente el tipo de contenido «%s»."],"content type\u0004\"%s\" successfully created.":["Se ha creado correctamente el tipo de contenido «%s»."],"content type\u0004Status":["Estado"],"field\u0004Name":["Nombre"],"field group\u0004Status":["Estado"],"field type\u0004Choice":["Elección"],"field type\u0004Color":["Color"],"field type\u0004Date":["Fecha"],"field type\u0004Flexible content":["Contenido flexible"],"field type\u0004Gallery":["Galería"],"field type\u0004Kind":["Tipo"],"field type\u0004Layout":["Diseño"],"field type\u0004Link":["Enlace"],"field type\u0004Media":["Medio"],"field type\u0004Range":["Rango"],"field type\u0004Repeater":["Repetidor"],"field type\u0004Section":["Sección"],"field type\u0004Select":["Desplegable"],"holds":["contiene"],"holds anything":["contiene algo"],"is":["es"],"is above":["es mayor que"],"is below":["es menor que"],"is empty":["está vacío"],"is not":["no es"],"media family\u0004Kind":["Clase"],"panel button label\u0004Settings":["Ajustes"],"person\u0004Name":["Nombre"],"post\u0004%s (Copy)":["%s (copia)"],"post\u0004Status":["Estado"],"post status\u0004Draft":["Borrador"],"post status\u0004Published":["Publicada"],"post status\u0004Trash":["Papelera"],"post type general name\u0004Pages":["Páginas"],"post type general name\u0004Posts":["Entradas"],"post type singular name\u0004Page":["Página"],"post type singular name\u0004Post":["Entrada"],"relation target\u0004None":["Ninguno"],"role\u0004Administrator":["Administrador"],"role\u0004Author":["Autor"],"role\u0004Editor":["Editor"],"role\u0004Member":["Miembro"],"role\u0004No role":["Sin rol"],"status filter\u0004All":["Todo"],"taxonomy general name\u0004Categories":["Categorías"],"taxonomy singular name\u0004Category":["Categoría"],"theme\u0004Status":["Estado"],"trash\u0004Restore":["Restaurar"],"v%(version)s":["v%(version)s"],"verb\u0004Trash…":["Papelera…"],"verb\u0004View":["Ver"],"{day} {month} {year}":["{day} de {month} de {year}"]} diff --git a/internal/i18n/catalogs/fr-FR.json b/internal/i18n/catalogs/fr-FR.json index 9868f589..b2c4a848 100644 --- a/internal/i18n/catalogs/fr-FR.json +++ b/internal/i18n/catalogs/fr-FR.json @@ -1 +1 @@ -{"":{"lang":"fr","plural-forms":"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"}," and ":[" et "]," or ":[" ou "],"\"%s\" activated.":["Type de contenu « %s » activé."],"\"%s\" deactivated.":["Type de contenu « %s » désactivé."],"\"%s\" has been restored.":["« %s » a été rétabli."],"\"%s\" moved to the trash.":["« %s » déplacé dans la corbeille."],"\"%s\" permanently deleted.":["« %s » supprimé définitivement."],"\"%s\" successfully created.":["« %s » créé avec succès."],"\"%s\" uploaded.":["« %s » téléversé."],"%(field)s address":["Adresse de %(field)s"],"%(field)s cannot move inside itself. Pick a container that is not one of its own.":["%(field)s ne peut pas être déplacé à l'intérieur de lui-même. Choisissez un conteneur qui n'est pas l'un des siens."],"%(field)s declared.":["%(field)s déclaré."],"%(field)s deleted.":["%(field)s supprimé."],"%(field)s does not match the format its field asks for. Check it and save again.":["%(field)s ne respecte pas le format demandé par son champ. Vérifiez-le et enregistrez de nouveau."],"%(field)s goes no higher than %(limit)s. Lower the value and save again.":["%(field)s ne dépasse pas %(limit)s. Baissez la valeur et enregistrez de nouveau."],"%(field)s goes no lower than %(limit)s. Raise the value and save again.":["%(field)s ne descend pas sous %(limit)s. Augmentez la valeur et enregistrez de nouveau."],"%(field)s holds no value of its own, so it cannot be required. Make it optional.":["%(field)s ne contient aucune valeur propre, il ne peut donc pas être obligatoire. Rendez-le facultatif."],"%(field)s is optional again.":["%(field)s est de nouveau facultatif."],"%(field)s is required now.":["%(field)s est maintenant obligatoire."],"%(field)s moved.":["%(field)s déplacé."],"%(field)s names the same one twice. Remove the repeat and save again.":["%(field)s nomme le même deux fois. Retirez la répétition et enregistrez de nouveau."],"%(field)s needs at least %(limit)s files. Add one and save again.":["%(field)s demande au moins %(limit)s fichiers. Ajoutez-en un et enregistrez."],"%(field)s needs at least %(limit)s rows. Add one and save again.":["%(field)s demande au moins %(limit)s lignes. Ajoutez-en une et enregistrez."],"%(field)s only takes one of its listed choices. Pick one and save again.":["%(field)s accepte uniquement un des choix de sa liste. Choisissez-en un et enregistrez de nouveau."],"%(field)s reads a relation field that is not there. Pick a group and a relation field it holds.":["%(field)s lit un champ de relation qui n'existe pas. Choisissez un groupe et un champ de relation qu'il contient."],"%(field)s reads a relation pointing at %(type)s, so it would list nothing here. Pick a relation pointing at the items this group is shown on.":["%(field)s lit une relation qui pointe vers %(type)s, elle n'afficherait donc rien ici. Choisissez une relation qui pointe vers les éléments où ce groupe s'affiche."],"%(field)s renamed.":["%(field)s renommé."],"%(field)s settled.":["%(field)s réglé."],"%(field)s shows by its rules now.":["%(field)s s'affiche désormais selon ses règles."],"%(field)s stands in the list.":["%(field)s figure dans la liste."],"%(field)s stays out of the list.":["%(field)s reste hors de la liste."],"%(field)s takes at most %(limit)s files. Remove one and save again.":["%(field)s accepte au plus %(limit)s fichiers. Retirez-en un et enregistrez."],"%(field)s takes at most %(limit)s letters. Shorten what you wrote and save again.":["%(field)s accepte au plus %(limit)s lettres. Raccourcissez ce que vous avez écrit et enregistrez de nouveau."],"%(field)s takes at most %(limit)s rows. Remove one and save again.":["%(field)s accepte au plus %(limit)s lignes. Retirez-en une et enregistrez."],"%(field)s title":["Titre de %(field)s"],"%(file)s is larger than one upload may be.":["%(file)s dépasse la taille maximale d'un téléversement."],"%(file)s is not a file this block accepts.":["%(file)s n'est pas un fichier que ce bloc accepte."],"%(file)s: %(reason)s":["%(file)s : %(reason)s"],"%(group)s created.":["%(group)s créé."],"%(group)s now appears where you said.":["%(group)s apparaît maintenant là où vous avez dit."],"%(group)s removed.":["%(group)s supprimé."],"%(group)s updated.":["%(group)s mis à jour."],"%(key)s is served by %(winner)s, so %(loser)s does not show it on %(where)s.":["%(key)s est servi par %(winner)s, donc %(loser)s ne le montre pas sur %(where)s."],"%(name)s %(version)s is serving the public site.":["%(name)s %(version)s sert le site public."],"%(name)s belongs to the site now.":["%(name)s appartient désormais au site."],"%(name)s came from the %(plugin)s plugin, which no longer declares it.":["%(name)s venait de l'extension %(plugin)s, qui ne le déclare plus."],"%(name)s cannot be used as a theme name. Name the zip file after the theme, with no dot at the start and no slashes in it.":["%(name)s ne peut pas servir de nom de thème. Nommez le fichier zip comme le thème, sans point au début et sans barre oblique."],"%(name)s moves to /%(word)s. Every address of both types changes.":["Le type %(name)s passe à /%(word)s. Toutes les adresses des deux types changent."],"%(name)s would move to /%(word)s, which Gophenberg keeps for itself. Change its plural name and try again.":["Le type %(name)s passerait à /%(word)s, que Gophenberg garde pour lui. Modifiez son nom au pluriel et réessayez."],"%(source)s is %(value)s":["%(source)s est %(value)s"],"%(theme)s failed to start, so the built-in renderer is serving.":["%(theme)s n'a pas pu démarrer, le moteur de rendu intégré sert donc le site."],"%(theme)s is now serving the public site.":["%(theme)s sert désormais le site public."],"%(theme)s is serving the public site.":["%(theme)s sert le site public."],"%(theme)s is still starting, so the built-in renderer is serving.":["%(theme)s démarre encore, le moteur de rendu intégré sert donc le site."],"%(theme)s was installed.":["%(theme)s a été installé."],"%(theme)s will not load, so the built-in renderer is serving.":["%(theme)s ne se charge pas, le moteur de rendu intégré sert donc le site."],"%(type)s answers on a new address, and stored links move with it.":["%(type)s répond à une nouvelle adresse, et les liens enregistrés la suivent."],"%(type)s becomes the type the site opens on, and the old one takes an address.":["%(type)s devient le type sur lequel le site ouvre, et l'ancien prend une adresse."],"%(type)s keeps nesting while %(items)s of its items sit inside another. Move those to the top level first, the ones in the trash included.":["%(type)s continue de s'imbriquer tant que %(items)s de ses éléments se trouvent dans un autre. Déplacez-les d'abord au niveau supérieur, ceux de la corbeille compris."],"%(type)s keeps nesting, because some of its items sit inside another.":["%(type)s continue de s'imbriquer, car certains de ses éléments se trouvent dans un autre."],"%(type)s will answer at the root.":["Le type %(type)s répondra à la racine."],"%s content type activated.":["%s type de contenu activé.","%s types de contenu activés.","%s types de contenu activés."],"%s content type could not be activated.":["%s type de contenu n'a pas pu être activé.","%s types de contenu n'ont pas pu être activés.","%s types de contenu n'ont pas pu être activés."],"%s content type could not be deactivated.":["%s type de contenu n'a pas pu être désactivé.","%s types de contenu n'ont pas pu être désactivés.","%s types de contenu n'ont pas pu être désactivés."],"%s content type could not be permanently deleted.":["%s type de contenu n'a pas pu être supprimé définitivement.","%s types de contenu n'ont pas pu être supprimés définitivement.","%s types de contenu n'ont pas pu être supprimés définitivement."],"%s content type deactivated.":["%s type de contenu désactivé.","%s types de contenu désactivés.","%s types de contenu désactivés."],"%s content type permanently deleted.":["%s type de contenu supprimé définitivement.","%s types de contenu supprimés définitivement.","%s types de contenu supprimés définitivement."],"%s item could not be moved to the trash.":["%s élément n'a pas pu être déplacé dans la corbeille.","%s éléments n'ont pas pu être déplacés dans la corbeille.","%s éléments n'ont pas pu être déplacés dans la corbeille."],"%s item could not be permanently deleted.":["%s élément n'a pas pu être supprimé définitivement.","%s éléments n'ont pas pu être supprimés définitivement.","%s éléments n'ont pas pu être supprimés définitivement."],"%s item could not be restored.":["%s élément n'a pas pu être rétabli.","%s éléments n'ont pas pu être rétablis.","%s éléments n'ont pas pu être rétablis."],"%s item moved to the trash.":["%s élément déplacé dans la corbeille.","%s éléments déplacés dans la corbeille.","%s éléments déplacés dans la corbeille."],"%s item permanently deleted.":["%s élément supprimé définitivement.","%s éléments supprimés définitivement.","%s éléments supprimés définitivement."],"%s item stays in the trash.":["%s élément reste dans la corbeille.","%s éléments restent dans la corbeille.","%s éléments restent dans la corbeille."],"%s page has been restored.":["%s page a été rétablie.","%s pages ont été rétablies.","%s pages ont été rétablies."],"%s post has been restored.":["%s article a été rétabli.","%s articles ont été rétablis.","%s articles ont été rétablis."],"(no title)":["(sans titre)"],"A %(kind)s field does not take a setting called %(setting)s. Remove it and try again.":["Un champ %(kind)s n'accepte pas de réglage nommé %(setting)s. Retirez-le et réessayez."],"A Linked from field stands on its own, not inside a section or a repeater. Declare %(field)s beside the container.":["Un champ Lié depuis se place seul, ni dans une section ni dans un répéteur. Déclarez %(field)s à côté du conteneur."],"A content type needs a singular and a plural name, like Guide and Guides. Fill both in and try again.":["Un type de contenu a besoin d'un nom au singulier et d'un nom au pluriel, comme Guide et Guides. Remplissez les deux et réessayez."],"A descriptive summary of the content type.":["Un résumé descriptif du type de contenu."],"A field group key has to start with a lowercase letter and then hold only lowercase letters, numbers and hyphens. Rename the group in the file so its key comes out in that shape.":["La clé d'un groupe de champs doit commencer par une lettre minuscule puis ne contenir que des lettres minuscules, des chiffres et des tirets. Renommez le groupe dans le fichier pour que sa clé prenne cette forme."],"A field key has to start with a lowercase letter and then hold only lowercase letters, numbers and hyphens. Rename the field so its key comes out in that shape.":["La clé d'un champ doit commencer par une lettre minuscule et ne contenir ensuite que des lettres minuscules, des chiffres et des tirets. Renommez le champ pour que sa clé prenne cette forme."],"A field needs a name. Type one and try again.":["Un champ a besoin d'un nom. Saisissez-en un et réessayez."],"A field with that name already exists on the items this group reaches. Pick another name.":["Un champ portant ce nom existe déjà sur les éléments que ce groupe atteint. Choisissez un autre nom."],"A flexible content field holds layouts, and %(field)s is not one. Add a layout first, then declare the field inside that layout.":["Un champ de contenu flexible contient des dispositions, et %(field)s n'en est pas une. Ajoutez d'abord une disposition, puis déclarez le champ dans cette disposition."],"A higher quality stores larger files, and it applies to pictures uploaded from now on.":["Une qualité plus élevée stocke des fichiers plus grands, et elle s'applique aux images téléversées à partir de maintenant."],"A layout stands inside a flexible content field only. Put %(field)s inside one of those instead.":["Une disposition ne se place que dans un champ de contenu flexible. Placez %(field)s dans l'un d'eux."],"A layout stands inside a flexible content field, never on its own. Declare a flexible content field first, then add %(field)s inside it.":["Une disposition se place dans un champ de contenu flexible, jamais seule. Déclarez d'abord un champ de contenu flexible, puis ajoutez %(field)s dedans."],"A listing carries between 1 and %(max)s items, so %(value)s is not a size Gophenberg takes. Pick a number inside that range.":["Une liste affiche entre 1 et %(max)s éléments, donc %(value)s n'est pas une taille que Gophenberg accepte. Choisissez un nombre dans cet intervalle."],"A relation field has to say which content type it points at. Pick that type and try again.":["Un champ de relation doit indiquer le type de contenu qu'il vise. Choisissez ce type et réessayez."],"A reload shows the admin in the language you chose.":["Un rechargement affiche l'administration dans la langue que vous avez choisie."],"A route word has to start with a lowercase letter and then hold only lowercase letters, numbers and hyphens. Change it and try again.":["Un mot de route doit commencer par une lettre minuscule et ne contenir ensuite que des lettres minuscules, des chiffres et des tirets. Modifiez-le et réessayez."],"A row of %(field)s has to name the layout it takes. Pick a layout for the row, or remove the row.":["Une ligne de %(field)s doit nommer la disposition qu'elle prend. Choisissez une disposition pour la ligne, ou retirez la ligne."],"A row of %(field)s takes one layout and no more. Reload the page and build the row again.":["Une ligne de %(field)s prend une seule disposition. Rechargez la page et reconstruisez la ligne."],"A rule matching any %(source)s cannot be turned into an exclusion. Leave it as is, or name the ones to leave out instead.":["Une règle valable pour n'importe quel %(source)s ne peut pas devenir une exclusion. Laissez-la telle quelle, ou nommez ceux à écarter."],"A theme naming its own page size uses that instead.":["Un thème qui indique sa propre taille de page utilise celle-ci à la place."],"A type key has to start with a lowercase letter and then hold only lowercase letters, numbers and hyphens. Change the key and try again.":["La clé d'un type doit commencer par une lettre minuscule et ne contenir ensuite que des lettres minuscules, des chiffres et des tirets. Modifiez la clé et réessayez."],"Actions":["Actions"],"Activate":["Activer"],"Activate %(theme)s":["Activer %(theme)s"],"Active":["Actif"],"Add":["Ajouter"],"Add %(layout)s":["Ajouter %(layout)s"],"Add %(name)s":["Ajouter %(name)s"],"Add %(type)s":["Ajouter %(type)s"],"Add Category":["Ajouter une catégorie"],"Add Content Type":["Ajouter un type de contenu"],"Add Field Group":["Ajouter un groupe de champs"],"Add Media File":["Ajouter un fichier média"],"Add Page":["Ajouter une page"],"Add Post":["Ajouter un article"],"Add User":["Ajouter un utilisateur"],"Add block":["Ajouter un bloc"],"Add choice":["Ajouter un choix"],"Add condition":["Ajouter une condition"],"Add field":["Ajouter un champ"],"Add field to %(field)s":["Ajouter un champ à %(field)s"],"Add layout":["Ajouter une disposition"],"Add layout to %(field)s":["Ajouter une disposition à %(field)s"],"Add one with %(button)s.":["Ajoutez un élément avec %(button)s."],"Add row":["Ajouter une ligne"],"Add rule set":["Ajouter un ensemble de règles"],"Add title":["Ajouter un titre"],"Add to %(field)s":["Ajouter à %(field)s"],"Address":["Adresse"],"Address updated.":["Adresse mise à jour."],"Adopt":["Adopter"],"Allow custom":["Autoriser les valeurs libres"],"Allow empty":["Autoriser le vide"],"Alt text":["Texte alternatif"],"An item cannot point at itself. Pick a different item for %(field)s.":["Un élément ne peut pas se viser lui-même. Choisissez un autre élément pour %(field)s."],"An item cannot sit inside itself, or inside one of the items nested under it. Pick a parent outside this branch.":["Un élément ne peut pas se trouver dans lui-même, ni dans un élément imbriqué sous lui. Choisissez un parent hors de cette branche."],"Another account wrote this, and only its author, an editor or an administrator may change it. You can still read it.":["Un autre compte a écrit ceci, et seuls son auteur, un éditeur ou un administrateur peuvent le modifier. Vous pouvez toujours le lire."],"Another account wrote this, so you are reading it rather than editing it.":["Un autre compte a écrit ceci, alors vous le lisez au lieu de le modifier."],"Another content type already answers under this route word. Pick a different word.":["Un autre type de contenu répond déjà sous ce mot de route. Choisissez un autre mot."],"Another content type already lives at the root of your site, and only one can. Give this type a route word, or hand the root over with Make default.":["Un autre type de contenu occupe déjà la racine de votre site, et un seul le peut. Donnez un mot de route à ce type, ou cédez la racine avec Rendre par défaut."],"Another content type already uses this key. Give this type a different name.":["Un autre type de contenu utilise déjà cette clé. Donnez un autre nom à ce type."],"Another item of this content type already uses that address. Pick a different slug and save again.":["Un autre élément de ce type de contenu utilise déjà cette adresse. Choisissez un autre slug et enregistrez de nouveau."],"Another update is currently in progress.":["Une autre mise à jour est actuellement en cours."],"Appears on":["Apparaît sur"],"Apply":["Appliquer"],"April":["avril"],"Are you sure you want to move \"%s\" to the trash?":["Voulez-vous vraiment déplacer « %s » dans la corbeille ?"],"Audio":["Audio"],"August":["août"],"Author":["Auteur"],"Back to %(type)s":["Retour aux %(type)s"],"Back to the latest posts":["Retour aux derniers articles"],"Block":["Bloc"],"Broken":["Cassé"],"Bundles of fields, shown where their rules place them.":["Ensembles de champs, affichés là où leurs règles les placent."],"Button group":["Groupe de boutons"],"Cancel":["Annuler"],"Caption":["Légende"],"Change %(name)s":["Modifier %(name)s"],"Change address":["Changer l'adresse"],"Change address…":["Changer l'adresse…"],"Change role":["Changer le rôle"],"Change the role of %(name)s":["Changer le rôle de %(name)s"],"Checkbox group":["Groupe de cases à cocher"],"Choices":["Choix"],"Choose %(field)s":["Choisir %(field)s"],"Choose how the site serves its content.":["Choisissez comment le site sert son contenu."],"Choose the language the admin reads in.":["Choisissez la langue dans laquelle se lit l'administration."],"Choose the role of %(name)s.":["Choisissez le rôle de %(name)s."],"Choose the version to update to.":["Choisissez la version vers laquelle mettre à jour."],"Clear %(field)s":["Vider %(field)s"],"Close":["Fermer"],"Close Settings":["Fermer les réglages"],"Closed":["Fermé"],"Condition":["Condition"],"Content":["Contenu"],"Content Types":["Types de contenu"],"Content nests at most %(max)s levels deep, and this item would sit deeper. Pick a parent closer to the top.":["Le contenu s'imbrique sur au plus %(max)s niveaux, et cet élément irait plus profond. Choisissez un parent plus proche du sommet."],"Content type":["Type de contenu"],"Content type updated.":["Type de contenu mis à jour."],"Could not delete that item.":["Impossible de supprimer cet élément.","Impossible de supprimer tous les éléments.","Impossible de supprimer tous les éléments."],"Could not load that post.":["Impossible de charger cet article."],"Could not save that post.":["Impossible d'enregistrer cet article."],"Create":["Créer"],"Create a field group":["Créer un groupe de champs"],"Create user":["Créer l'utilisateur"],"Created":["Date de création"],"Date added":["Date d'ajout"],"Deactivate":["Désactiver"],"Deactivate %(theme)s":["Désactiver %(theme)s"],"December":["décembre"],"Default":["Par défaut"],"Default content type updated.":["Type de contenu par défaut mis à jour."],"Definitions file":["Fichier de définitions"],"Delete":["Supprimer"],"Delete \"%(title)s\" for good? This cannot be undone.":["Supprimer « %(title)s » définitivement ? Cette action est irréversible."],"Delete %(field)s":["Supprimer %(field)s"],"Delete %(group)s":["Supprimer %(group)s"],"Delete %(title)s for good? This cannot be undone.":["Supprimer %(title)s définitivement ? Cette action est irréversible."],"Delete %s content type for good? This cannot be undone.":["Supprimer %s type de contenu définitivement ? Cette action est irréversible.","Supprimer %s types de contenu définitivement ? Cette action est irréversible.","Supprimer %s types de contenu définitivement ? Cette action est irréversible."],"Delete %s item for good? This cannot be undone.":["Supprimer %s élément définitivement ? Cette action est irréversible.","Supprimer %s éléments définitivement ? Cette action est irréversible.","Supprimer %s éléments définitivement ? Cette action est irréversible."],"Delete Permanently":["Supprimer définitivement"],"Delete the field":["Supprimer le champ"],"Delete the group":["Supprimer le groupe"],"Delete this %(count)s item for good? This cannot be undone.":["Supprimer définitivement ce %(count)s élément ? Cette action est irréversible.","Supprimer définitivement ces %(count)s éléments ? Cette action est irréversible.","Supprimer définitivement ces %(count)s éléments ? Cette action est irréversible."],"Delete…":["Supprimer…"],"Describe":["Décrire"],"Describe…":["Décrire…"],"Description":["Description"],"Description updated.":["Description mise à jour."],"Desktop":["Ordinateur"],"Destination":["Destination"],"Dimensions":["Dimensions"],"Disable":["Désactiver"],"Disable %(name)s":["Désactiver %(name)s"],"Disabled":["Désactivé"],"Dismiss":["Ignorer"],"Document":["Document"],"Done. The site now holds what the file describes.":["Terminé. Le site contient maintenant ce que décrit le fichier."],"Draft saved.":["Brouillon enregistré."],"Drop files to upload":["Déposez vos fichiers pour les téléverser"],"Email":["E-mail"],"Empty Trash":["Vider la corbeille"],"Empty trash":["Vider la corbeille"],"Enable":["Activer"],"Enable %(name)s":["Activer %(name)s"],"Every address of this type moves. Links kept elsewhere to the old addresses stop working.":["Toutes les adresses de ce type changent. Les liens conservés ailleurs vers les anciennes adresses cessent de fonctionner."],"Every content type":["Tous les types de contenu"],"Every field group needs a title. Give it a name and save again.":["Chaque groupe de champs a besoin d'un titre. Donnez-lui un nom et enregistrez à nouveau."],"Every item needs an author who exists. Pick one from the list and save again.":["Chaque élément a besoin d'un auteur existant. Choisissez-en un dans la liste et enregistrez de nouveau."],"Every kind of content this site holds.":["Toutes les sortes de contenu que ce site contient."],"Every value stored under this field goes with it, in every item the group reaches and in the revisions behind them.":["Toutes les valeurs enregistrées dans ce champ partent avec lui, dans chaque élément que le groupe atteint et dans les révisions qui les suivent."],"Excerpt":["Extrait"],"Export definitions":["Exporter les définitions"],"February":["février"],"Fewest files":["Minimum de fichiers"],"Fewest rows":["Minimum de lignes"],"Field":["Champ"],"Field Groups":["Groupes de champs"],"Field group":["Groupe de champs"],"Fields":["Champs"],"Fields of %(group)s":["Champs de %(group)s"],"File name":["Nom du fichier"],"File size":["Taille du fichier"],"File type":["Type de fichier"],"Files":["Fichiers"],"Filter by status":["Filtrer par état"],"Follow the browser":["Suivre le navigateur"],"From %(plugin)s":["De %(plugin)s"],"Full Size":["Taille originale"],"Gophenberg cannot start this update: %(reason)s":["Gophenberg ne peut pas lancer cette mise à jour : %(reason)s"],"Gophenberg checked for updates moments ago. Try again later.":["Gophenberg a cherché des mises à jour il y a un instant. Réessayez plus tard."],"Gophenberg could not read what your browser sent. Reload the page and try again, and tell whoever looks after your site if it keeps happening.":["Gophenberg n'a pas pu lire ce que votre navigateur a envoyé. Rechargez la page et réessayez, et prévenez la personne qui s'occupe de votre site si cela continue."],"Gophenberg could not read which item you picked as parent. Reload the page and pick it again.":["Gophenberg n'a pas pu lire quel élément vous avez choisi comme parent. Rechargez la page et choisissez-le de nouveau."],"Gophenberg does not accept %(extension)s files. Upload a picture, a video, an audio file, a PDF or a zip instead.":["Gophenberg n'accepte pas les fichiers %(extension)s. Téléversez plutôt une image, une vidéo, un fichier audio, un PDF ou un zip."],"Gophenberg does not answer in %(value)s. Pick one of the languages on the list.":["Gophenberg ne répond pas en %(value)s. Choisissez une des langues de la liste."],"Gophenberg has no autosave of yours for this item. Open the item to see the version that is stored.":["Gophenberg n'a aucun enregistrement automatique de vous pour cet élément. Ouvrez l'élément pour voir la version stockée."],"Gophenberg holds no kind of definition called %(subject)s, so nothing was taken over. Reload the page so the admin and the server agree again.":["Gophenberg ne connaît aucune sorte de définition nommée %(subject)s, rien n'a donc été repris. Rechargez la page pour que l'admin et le serveur se rejoignent à nouveau."],"Gophenberg keeps /%(path)s for itself or for another content type, so your content cannot answer there. Give the item a different slug.":["Gophenberg garde l'adresse /%(path)s pour lui ou pour un autre type de contenu, votre contenu ne peut donc pas y répondre. Donnez un autre slug à l'élément."],"Gophenberg keeps this word for itself, so no content type can answer under it. Pick a different route word.":["Gophenberg garde ce mot pour lui, aucun type de contenu ne peut donc répondre sous ce mot. Choisissez un autre mot de route."],"Group":["Groupe"],"Highest":["Maximum"],"Holds":["Contient"],"Images":["Images"],"Import definitions":["Importer les définitions"],"In list":["Dans la liste"],"Inactive":["Inactif"],"Installed":["Installé"],"Instructions":["Instructions"],"It moves here from another group and keeps its stored values.":["Il arrive ici depuis un autre groupe et garde ses valeurs enregistrées."],"It moves to another group and keeps its stored values.":["Il passe dans un autre groupe et garde ses valeurs enregistrées."],"It moves to another group, so its stored values do not follow.":["Il passe dans un autre groupe, donc ses valeurs enregistrées ne le suivent pas."],"It reads a relation inside a container, and only an import can point it elsewhere.":["Il lit une relation dans un conteneur, et seule une importation peut le faire pointer ailleurs."],"It starts on %(type)s, and the rules may be edited afterwards.":["Il commence sur %(type)s, et les règles peuvent être modifiées ensuite."],"Items could not be loaded.":["Les éléments n'ont pas pu être chargés."],"Its items sit inside one another, so it keeps nesting.":["Ses éléments se trouvent les uns dans les autres, donc il continue de s'imbriquer."],"Its kind changed, so its stored values go with it.":["Son type a changé, donc ses valeurs enregistrées partent avec lui."],"January":["janvier"],"July":["juillet"],"June":["juin"],"Keep %(field)s out of the list":["Garder %(field)s hors de la liste"],"Keep it":["Le conserver"],"Keep it here":["Le laisser ici"],"Key":["Clé"],"Label":["Libellé"],"Language":["Langue"],"Large":["Grande"],"Let items nest":["Autoriser l'imbrication"],"Linked from":["Lié depuis"],"List view":["Vue en liste"],"Loading field groups.":["Chargement des groupes de champs."],"Loading the post.":["Chargement de l'article."],"Loading the screen.":["Chargement de l'écran."],"Loading themes.":["Chargement des thèmes."],"Loading users.":["Chargement des utilisateurs."],"Loading…":["Chargement…"],"Longest":["Longueur maximale"],"Lowest":["Minimum"],"Make %(field)s optional":["Rendre %(field)s facultatif"],"Make default":["Rendre par défaut"],"Make default…":["Rendre par défaut…"],"Make optional":["Rendre facultatif"],"Manage the categories on this site.":["Gérez les catégories de ce site."],"Manage the images and files this site holds.":["Gérez les images et les fichiers que ce site contient."],"Manage the items of this content type.":["Gérez les éléments de ce type de contenu."],"Manage the pages on this site.":["Gérez les pages de ce site."],"Manage the posts on this site.":["Gérez les articles de ce site."],"Many targets":["Plusieurs cibles"],"Many values":["Plusieurs valeurs"],"March":["mars"],"May":["mai"],"Media %(id)s":["Média %(id)s"],"Media Library":["Bibliothèque de médias"],"Medium":["Moyenne"],"Mobile":["Mobile"],"Modified: %s":["Modifié : %s"],"Most files":["Maximum de fichiers"],"Most rows":["Maximum de lignes"],"Move":["Déplacer"],"Move \"%(title)s\" to the trash?":["Déplacer « %(title)s » dans la corbeille ?"],"Move %(field)s down":["Descendre %(field)s"],"Move %(field)s elsewhere":["Déplacer %(field)s ailleurs"],"Move %(field)s up":["Monter %(field)s"],"Move %(group)s down":["Descendre %(group)s"],"Move %(group)s up":["Monter %(group)s"],"Move %(name)s down":["Descendre %(name)s"],"Move %(name)s up":["Monter %(name)s"],"Move %s item to the trash?":["Déplacer %s élément dans la corbeille ?","Déplacer %s éléments dans la corbeille ?","Déplacer %s éléments dans la corbeille ?"],"Move every address":["Déplacer toutes les adresses"],"Move row down":["Descendre la ligne"],"Move row up":["Monter la ligne"],"Move the field":["Déplacer le champ"],"Move to trash":["Déplacer dans la corbeille"],"Name":["Nom"],"Name updated.":["Nom mis à jour."],"Navigation":["Navigation"],"Nests":["Imbriqué"],"Newer posts":["Articles plus récents"],"No":["Non"],"No content types found.":["Aucun type de contenu trouvé."],"No description":["Aucune description"],"No file arrived with this upload. Choose a file and try again.":["Aucun fichier n'est arrivé avec ce téléversement. Choisissez un fichier et réessayez."],"No items found.":["Aucun élément trouvé."],"No items yet.":["Aucun élément pour l'instant."],"No media chosen":["Aucun média choisi"],"No media has been uploaded yet.":["Aucun média n'a encore été téléversé."],"No media items found.":["Aucun fichier média trouvé."],"No media items yet.":["Aucun fichier média pour l’instant."],"No page lives at this address.":["Aucune page n'existe à cette adresse."],"No parent":["Pas de parent"],"No theme arrived with this upload. Choose a zip file and try again.":["Aucun thème n'est arrivé avec ce téléversement. Choisissez un fichier zip et réessayez."],"No themes are installed.":["Aucun thème n'est installé."],"No title":["Sans titre"],"None":["Aucun"],"Not %(type)s":["Sauf %(type)s"],"Not found":["Introuvable"],"Not serving":["Hors service"],"Nothing declares that role.":["Rien ne déclare ce rôle."],"Nothing points here yet.":["Rien ne pointe encore ici."],"Nothing published here yet.":["Rien n'est encore publié ici."],"Nothing published yet.":["Rien n'est encore publié."],"November":["novembre"],"Nowhere":["Nulle part"],"Number":["Nombre"],"October":["octobre"],"Older posts":["Articles plus anciens"],"One frame of this animation holds more than %(max)s pixels, which is more than Gophenberg opens. Upload a smaller animation.":["Une image de cette animation dépasse %(max)s pixels, plus que ce que Gophenberg ouvre. Téléversez une animation plus petite."],"One of the filters on this list is not one Gophenberg understands. Clear the filters and try again.":["Un des filtres de cette liste n'est pas un filtre que Gophenberg comprend. Videz les filtres et réessayez."],"One of the items picked for %(field)s is not the kind of content that field points at. Reload the page and pick from the list the field offers.":["Un des éléments choisis pour %(field)s n'est pas le genre de contenu que vise ce champ. Rechargez la page et choisissez dans la liste que le champ propose."],"One of the items picked for %(field)s was not named in a way Gophenberg understands. Reload the page and pick the items again.":["Un des éléments choisis pour %(field)s n'était pas nommé d'une façon que Gophenberg comprend. Rechargez la page et choisissez de nouveau les éléments."],"One of the items picked no longer exists. Reload the page and pick again.":["Un des éléments choisis n'existe plus. Rechargez la page et choisissez de nouveau."],"One target":["Une cible"],"Only a relation field points at another content type or holds many items. Pick the Relation kind, or leave the target and the many option empty.":["Seul un champ de relation vise un autre type de contenu ou contient plusieurs éléments. Choisissez le genre Relation, ou laissez vides la cible et l'option plusieurs."],"Only one file may be placed here.":["Un seul fichier peut être placé ici."],"Only the content type at the root of your site may go without a route word. Give this type one and try again.":["Seul le type de contenu à la racine de votre site peut se passer de mot de route. Donnez-en un à ce type et réessayez."],"Open %(field)s in a new tab":["Ouvrir %(field)s dans un nouvel onglet"],"Open navigation":["Ouvrir la navigation"],"Order stored.":["Ordre enregistré."],"Other":["Autre"],"Out of list":["Hors de la liste"],"Parent":["Parent"],"Password":["Mot de passe"],"Pending":["En attente"],"Pending Review":["En attente de relecture"],"Permanently delete":["Supprimer définitivement"],"Permanently delete…":["Supprimer définitivement…"],"Picture quality":["Qualité d'image"],"Picture quality runs from 1 to %(max)s, so %(value)s is not a quality Gophenberg stores at. Pick a number inside that range.":["La qualité d'image va de 1 à %(max)s, donc %(value)s n'est pas une qualité avec laquelle Gophenberg enregistre. Choisissez un nombre dans cet intervalle."],"Placeholder":["Texte indicatif"],"Plural name":["Nom au pluriel"],"Points at":["Vise"],"Post published.":["Article publié."],"Posts per page":["Articles par page"],"Preview":["Prévisualiser"],"Private":["Privé"],"Publish":["Publier"],"Published: %s":["Publié : %s"],"Radio group":["Groupe de boutons radio"],"Reads from":["Lit depuis"],"Redo":["Rétablir"],"Relation":["Relation"],"Remove":["Retirer"],"Remove %(name)s":["Retirer %(name)s"],"Remove %(title)s":["Retirer %(title)s"],"Remove row":["Retirer la ligne"],"Rename":["Renommer"],"Rename %(field)s":["Renommer %(field)s"],"Rename…":["Renommer…"],"Require":["Rendre obligatoire"],"Require %(field)s":["Rendre %(field)s obligatoire"],"Required":["Obligatoire"],"Restore":["Rétablir"],"Role changed.":["Rôle modifié."],"Roll back to %(theme)s":["Revenir à %(theme)s"],"Roll back to the built-in renderer":["Revenir au moteur de rendu intégré"],"Route word":["Mot de route"],"Rule %(number)s of set %(set)s":["Règle %(number)s de l'ensemble %(set)s"],"Rule set %(number)s":["Ensemble de règles %(number)s"],"Rules":["Règles"],"Rules showing %(field)s":["Règles affichant %(field)s"],"Save":["Enregistrer"],"Save draft":["Enregistrer le brouillon"],"Save rules":["Enregistrer les règles"],"Save settings":["Enregistrer les réglages"],"Saved":["Enregistré"],"Saving":["Enregistrement"],"Scheduled":["Planifié"],"Scheduled: %s":["Planifié : %s"],"Search %(type)s…":["Rechercher des %(type)s…"],"Search audio":["Rechercher un audio"],"Search images":["Rechercher des images"],"Search media":["Rechercher des médias"],"Search videos":["Rechercher des vidéos"],"Select":["Sélectionner"],"September":["septembre"],"Serving":["En service"],"Settings":["Réglages"],"Settings of %(field)s":["Réglages de %(field)s"],"Shadowed":["Masqué"],"Show %(field)s in the list":["Afficher %(field)s dans la liste"],"Showing %(held)s of %(total)s.":["Affichage de %(held)s sur %(total)s."],"Singular name":["Nom au singulier"],"Slug":["Slug"],"Somebody must be able to manage users.":["Quelqu'un doit pouvoir gérer les utilisateurs."],"Someone else changed this media item while you were editing it. Reload the page and make your change again.":["Quelqu'un d'autre a modifié ce média pendant que vous le modifiiez. Rechargez la page et refaites votre modification."],"Someone else saved changes to this item while you were editing, so yours were not saved. Copy your text somewhere safe, then reload the item and put your changes back in.":["Quelqu'un d'autre a enregistré des modifications sur cet élément pendant que vous éditiez, les vôtres n'ont donc pas été enregistrées. Copiez votre texte en lieu sûr, puis rechargez l'élément et remettez vos modifications."],"Something went wrong inside Gophenberg. Try again in a moment, and tell whoever looks after your site if it keeps happening.":["Quelque chose a mal tourné dans Gophenberg. Réessayez dans un instant, et prévenez la personne qui s'occupe de votre site si cela continue."],"Something went wrong.":["Quelque chose a mal tourné."],"Something went wrong. Try again.":["Quelque chose a mal tourné. Réessayez."],"Sorry, you are not allowed to access this page.":["Désolé, vous n’avez pas l’autorisation d’accéder à cette page."],"Source":["Source"],"Steps of":["Pas de"],"Stop nesting":["Arrêter l'imbrication"],"Tablet":["Tablette"],"Text":["Texte"],"Text area":["Zone de texte"],"That email is already in use.":["Cet e-mail est déjà utilisé."],"That field group no longer exists. Reload the page to see the groups your site holds now.":["Ce groupe de champs n'existe plus. Rechargez la page pour voir les groupes que votre site contient maintenant."],"That field is not on this content type any more. Reload the page to see the fields it has now.":["Ce champ n'est plus sur ce type de contenu. Rechargez la page pour voir les champs qu'il possède maintenant."],"That revision does not exist, and older ones drop off once a type holds more than it keeps. Open the item to see which revisions are left.":["Cette révision n'existe pas, et les plus anciennes disparaissent quand un type en détient plus qu'il n'en conserve. Ouvrez l'élément pour voir les révisions restantes."],"That role holds more than your own.":["Ce rôle va au-delà du vôtre."],"That web address does not name a media item Gophenberg can look up. Open the media library and pick the item from there.":["Cette adresse web ne désigne aucun média que Gophenberg puisse trouver. Ouvrez la bibliothèque de médias et choisissez l'élément depuis là."],"That web address does not name a revision Gophenberg can look up. Open the item and pick a revision from its history.":["Cette adresse web ne désigne aucune révision que Gophenberg puisse trouver. Ouvrez l'élément et choisissez une révision dans son historique."],"That web address does not name an item Gophenberg can look up. Go back to the list and open the item from there.":["Cette adresse web ne désigne aucun élément que Gophenberg puisse trouver. Revenez à la liste et ouvrez l'élément depuis là."],"The %(count)s item in the trash is deleted for good. This cannot be undone.":["%(count)s élément de la corbeille est supprimé définitivement. Cette action est irréversible.","Les %(count)s éléments de la corbeille sont supprimés définitivement. Cette action est irréversible.","Les %(count)s éléments de la corbeille sont supprimés définitivement. Cette action est irréversible."],"The %(file)s calls this theme %(declared)s, but it is being installed as %(installed)s. Rename the zip file to match, or change the name inside %(file)s.":["Le fichier %(file)s appelle ce thème %(declared)s, mais il s'installe sous %(installed)s. Renommez le fichier zip pour qu'ils correspondent, ou changez le nom dans %(file)s."],"The %(file)s inside %(name)s is not valid JSON, so it could not be read. Fix that file and package the theme again.":["Le fichier %(file)s dans %(name)s n'est pas du JSON valide, il n'a donc pas pu être lu. Corrigez ce fichier et réempaquetez le thème."],"The %(file)s inside %(name)s names its theme kit as %(declared)s, which is not a version number. Build the theme again, and the build will fill that in.":["Le %(file)s dans %(name)s indique son kit de thèmes comme %(declared)s, ce qui n'est pas un numéro de version. Compilez le thème à nouveau et la compilation le renseignera."],"The %(origin)s plugin declared this, so it can only be changed in that plugin. Turning it off is still yours to do.":["L'extension %(origin)s l'a déclaré, donc il ne peut être modifié que dans cette extension. Le désactiver reste entre vos mains."],"The %(plugin)s plugin also declares %(name)s, and the site keeps the key.":["L'extension %(plugin)s déclare aussi %(name)s, et le site garde la clé."],"The %(plugin)s plugin declared these fields, so they change only in its code.":["L'extension %(plugin)s a déclaré ces champs, donc ils ne changent que dans son code."],"The %(plugin)s plugin declares %(name)s flat, and the site keeps it nesting while its items sit inside another.":["L'extension %(plugin)s déclare %(name)s sans imbrication, et le site continue de l'imbriquer tant que ses éléments se trouvent dans un autre."],"The browser kept an unsaved version of this post.":["Le navigateur a gardé une version non enregistrée de cet article."],"The built-in renderer is now serving the public site.":["Le moteur de rendu intégré sert désormais le site public."],"The built-in renderer is serving the public site.":["Le moteur de rendu intégré sert le site public."],"The content type this field points at is not named in a shape Gophenberg accepts. Give it a key that starts with a lowercase letter and then holds only lowercase letters, numbers and hyphens.":["Le type de contenu que vise ce champ n'est pas nommé sous une forme que Gophenberg accepte. Donnez-lui une clé qui commence par une lettre minuscule et ne contient ensuite que des lettres minuscules, des chiffres et des tirets."],"The content types could not be loaded, so where these groups appear and which fields they shadow are not shown.":["Les types de contenu n'ont pas pu être chargés, donc où ces groupes apparaissent et quels champs ils masquent ne sont pas affichés."],"The content types could not be loaded.":["Les types de contenu n'ont pas pu être chargés."],"The content types could not be refreshed, so where these groups appear and what they shadow may be out of date.":["Les types de contenu n'ont pas pu être actualisés, donc où ces groupes apparaissent et ce qu'ils masquent peut être obsolète."],"The draft could not be created.":["Le brouillon n'a pas pu être créé."],"The entry %(entry)s in this zip would be written outside the theme folder, so nothing was installed. Package the theme again.":["L'entrée %(entry)s de ce zip s'écrirait hors du dossier du thème, rien n'a donc été installé. Réempaquetez le thème."],"The field %(field)s cannot go, because %(by)s reads it. Change %(by)s first.":["Le champ %(field)s ne peut pas être retiré, car %(by)s le lit. Modifiez d'abord %(by)s."],"The field %(field)s cannot hold the value it was given. Check what kind of field it is and enter a value that matches.":["Le champ %(field)s ne peut pas contenir la valeur qui lui a été donnée. Vérifiez de quel genre de champ il s'agit et saisissez une valeur qui convient."],"The field %(field)s has to hold a value before this item can be published. Fill it in, or leave the item as a draft.":["Le champ %(field)s doit contenir une valeur avant que cet élément puisse être publié. Remplissez-le, ou laissez l'élément en brouillon."],"The field %(field)s in %(group)s still points at this content type. Delete that field first, then delete this type.":["Le champ %(field)s dans %(group)s vise encore ce type de contenu. Supprimez d'abord ce champ, puis supprimez ce type."],"The field %(field)s is hidden by its own rules right now, so it cannot hold a value. Show it again before filling it in.":["Le champ %(field)s est masqué par ses propres règles pour le moment, il ne peut donc contenir aucune valeur. Affichez-le de nouveau avant de le remplir."],"The field %(field)s points at one item only. Remove the extra choices and keep one.":["Le champ %(field)s ne vise qu'un seul élément. Retirez les choix en trop et gardez-en un."],"The field %(field)s points at other items, so it does not take a plain value. Pick the items it points at instead.":["Le champ %(field)s vise d'autres éléments, il n'accepte donc pas une valeur simple. Choisissez plutôt les éléments qu'il vise."],"The field %(field)s takes a list of items, and what arrived was not a list. Reload the page and pick the items again.":["Le champ %(field)s attend une liste d'éléments, et ce qui est arrivé n'était pas une liste. Rechargez la page et choisissez de nouveau les éléments."],"The field %(source)s cannot hold the value %(value)s, so no rule can compare it. Write a value of the kind %(source)s stores.":["Le champ %(source)s ne peut pas contenir la valeur %(value)s, aucune règle ne peut donc la comparer. Écrivez une valeur du type que %(source)s enregistre."],"The field groups could not be loaded.":["Les groupes de champs n'ont pas pu être chargés."],"The field groups could not be reached.":["Les groupes de champs n'ont pas pu être joints."],"The field keeps its values on the content both groups reach.":["Le champ garde ses valeurs sur le contenu que les deux groupes atteignent."],"The fields this group holds go with it, and so do the values every item stored in them.":["Les champs que ce groupe contient partent avec lui, ainsi que les valeurs que chaque élément y a enregistrées."],"The groups were reordered.":["Les groupes ont été réordonnés."],"The item could not be duplicated.":["L'élément n'a pas pu être dupliqué."],"The item could not be moved to the trash.":["L'élément n'a pas pu être déplacé dans la corbeille."],"The item could not be permanently deleted.":["L'élément n'a pas pu être supprimé définitivement."],"The item could not be restored.":["L'élément n'a pas pu être rétabli."],"The item you picked as parent holds another kind of content. Pick a parent of the same content type as this item.":["L'élément que vous avez choisi comme parent contient un autre genre de contenu. Choisissez un parent du même type de contenu que cet élément."],"The item you picked as parent is in the trash. Restore it, or pick another parent.":["L'élément que vous avez choisi comme parent est dans la corbeille. Rétablissez-le, ou choisissez un autre parent."],"The item you picked as parent no longer exists. Reload the page and pick another parent.":["L'élément que vous avez choisi comme parent n'existe plus. Rechargez la page et choisissez un autre parent."],"The media library could not be loaded.":["La bibliothèque de médias n'a pas pu être chargée."],"The name changes. Nothing stored under this field moves.":["Le nom change. Rien de ce qui est stocké sous ce champ ne bouge."],"The name could not be updated.":["Le nom n'a pas pu être mis à jour."],"The new order has to name every field group exactly once. Reload the page and move the groups again.":["Le nouvel ordre doit nommer chaque groupe de champs exactement une fois. Rechargez la page et déplacez les groupes à nouveau."],"The new order has to name every field of this content type exactly once. Reload the page and move the fields again.":["Le nouvel ordre doit nommer chaque champ de ce type de contenu exactement une fois. Rechargez la page et déplacez les champs à nouveau."],"The number of revisions to keep has to be a whole number, and it cannot be negative. Enter a different number.":["Le nombre de révisions à conserver doit être un nombre entier, et il ne peut pas être négatif. Saisissez un autre nombre."],"The registry could not be reached.":["Le registre n'a pas pu être joint."],"The role could not be changed.":["Le rôle n'a pas pu être modifié."],"The rule on %(source)s names nothing to match. Pick a value, or remove the rule.":["La règle sur %(source)s ne nomme rien à faire correspondre. Choisissez une valeur, ou retirez la règle."],"The rules could not be loaded.":["Les règles n'ont pas pu être chargées."],"The rules on %(field)s lead back to %(field)s itself, so nothing can decide whether to show it. Point one of them at another field.":["Les règles de %(field)s reviennent à %(field)s lui-même, rien ne peut donc décider de l'afficher. Faites pointer l'une d'elles vers un autre champ."],"The same item was picked twice for %(field)s. Pick each item once.":["Le même élément a été choisi deux fois pour %(field)s. Choisissez chaque élément une seule fois."],"The server could not be reached, so nothing was changed.":["Le serveur n'a pas pu être joint, rien n'a donc été changé."],"The server could not be reached, so nothing was saved.":["Le serveur n'a pas pu être joint, rien n'a donc été enregistré."],"The server could not be reached, so nothing was uploaded.":["Le serveur n'a pas pu être joint, rien n'a donc été téléversé."],"The setting %(setting)s cannot hold the value it was given. Check what this setting takes and try again.":["Le réglage %(setting)s ne peut pas contenir la valeur donnée. Vérifiez ce que ce réglage accepte et réessayez."],"The setting %(setting)s falls outside the others. Keep min below max and the default inside the bounds.":["Le réglage %(setting)s sort des autres. Gardez min sous max et la valeur par défaut dans les limites."],"The settings could not be read, so nothing can be changed here yet.":["Les réglages n'ont pas pu être lus, donc rien ne peut encore être modifié ici."],"The site default":["La langue par défaut du site"],"The site may already hold part of this file. Import it again to see what is left.":["Le site contient peut-être déjà une partie de ce fichier. Importez-le à nouveau pour voir ce qu'il reste."],"The source %(source)s does not offer %(operator)s. Pick one of the comparisons it does offer.":["La source %(source)s n'offre pas %(operator)s. Choisissez une des comparaisons qu'elle offre."],"The theme %(name)s carries no %(file)s, so Gophenberg cannot tell what it is. Put that file at the top level of the zip and package the theme again.":["Le thème %(name)s ne contient aucun %(file)s, Gophenberg ne peut donc pas savoir ce que c'est. Placez ce fichier au premier niveau du zip et réempaquetez le thème."],"The theme %(name)s could not be read, so it cannot serve your site. Upload it again, or choose another theme.":["Le thème %(name)s n'a pas pu être lu, il ne peut donc pas servir votre site. Téléversez-le de nouveau, ou choisissez un autre thème."],"The theme %(name)s did not start, so your site is still served by the theme it had. Ask whoever looks after your site to check the server log for what the theme reported.":["Le thème %(name)s n'a pas démarré, votre site est donc toujours servi par le thème qu'il avait. Demandez à la personne qui s'occupe de votre site de regarder ce que le thème a signalé dans le journal du serveur."],"The theme %(name)s does not carry %(path)s as a file, so there is nothing to run. Package the built theme rather than its source.":["Le thème %(name)s ne contient pas %(path)s comme fichier, il n'y a donc rien à exécuter. Empaquetez le thème construit plutôt que sa source."],"The theme %(name)s does not carry %(path)s as a folder, so its styles and scripts are missing. Package the built theme rather than its source.":["Le thème %(name)s ne contient pas %(path)s comme dossier, ses styles et ses scripts manquent donc. Empaquetez le thème construit plutôt que sa source."],"The theme %(name)s holds a link to another file at %(path)s, and a theme may only carry real files. Replace it and package the theme again.":["Le thème %(name)s contient un lien vers un autre fichier à %(path)s, et un thème ne peut contenir que de vrais fichiers. Remplacez-le et réempaquetez le thème."],"The theme %(name)s is serving your site right now, so it cannot be replaced. Deactivate it first, or install this copy under another name.":["Le thème %(name)s sert votre site en ce moment, il ne peut donc pas être remplacé. Désactivez-le d'abord, ou installez cette copie sous un autre nom."],"The theme %(name)s is the one chosen, but it is not installed, so your site is served by the built-in renderer. Upload the theme again, or choose another one.":["Le thème %(name)s est celui choisi, mais il n'est pas installé, votre site est donc servi par le moteur de rendu intégré. Téléversez de nouveau le thème, ou choisissez-en un autre."],"The theme %(name)s was built on theme kit %(declared)s, and this site serves %(served)s. Build the theme again against a kit this site serves, then install it.":["Le thème %(name)s a été compilé avec le kit de thèmes %(declared)s, et ce site sert %(served)s. Compilez le thème à nouveau avec un kit que ce site sert, puis installez-le."],"The trash could not be emptied.":["La corbeille n'a pas pu être vidée."],"The user could not be created.":["L'utilisateur n'a pas pu être créé."],"The values stored under it do not follow.":["Les valeurs enregistrées dessous ne le suivent pas."],"Theme":["Thème"],"Themes":["Thèmes"],"Themes could not be loaded.":["Les thèmes n'ont pas pu être chargés."],"There is no content type called %(value)s. Pick a type your site holds, or register it first.":["Il n'existe aucun type de contenu appelé %(value)s. Choisissez un type que votre site possède, ou déclarez-le d'abord."],"There is no content type called %(value)s. Pick one of the types your site holds and try again.":["Il n'existe aucun type de contenu appelé %(value)s. Choisissez un des types que votre site possède et réessayez."],"There is no kind of field called %(value)s. Pick one of these instead: %(allowed)s.":["Il n'existe aucun genre de champ appelé %(value)s. Choisissez plutôt parmi ceux-ci : %(allowed)s."],"There is no page kind called %(value)s. Pick one of these instead: %(allowed)s.":["Il n'existe aucun genre de page appelé %(value)s. Choisissez plutôt parmi ceux-ci : %(allowed)s."],"There is no status called %(value)s. Pick one of these instead: %(allowed)s.":["Il n'existe aucun état appelé %(value)s. Choisissez plutôt parmi ceux-ci : %(allowed)s."],"There is nothing at this address. Check the link and try again.":["Il n'y a rien à cette adresse. Vérifiez le lien et réessayez."],"There is nothing to roll back to, because your site has not been through a theme change yet. Install a theme first, then a rollback has somewhere to go.":["Il n'y a rien vers quoi revenir, car votre site n'a pas encore changé de thème. Installez d'abord un thème, et le retour aura alors une destination."],"These files could not be read.":["Ces fichiers n'ont pas pu être lus."],"These were left alone, because nobody confirmed losing them.":["Ceux-ci ont été laissés tels quels, car personne n'a confirmé leur perte."],"This content type does not exist any more. Reload the page to see the types your site holds now.":["Ce type de contenu n'existe plus. Rechargez la page pour voir les types que votre site possède maintenant."],"This content type does not nest, so one of its items cannot sit inside another. Mark the type as Nests first.":["Ce type de contenu ne s'imbrique pas, un de ses éléments ne peut donc pas se trouver dans un autre. Marquez d'abord le type comme Imbriqué."],"This content type has no field called %(field)s. Check the name, or declare the field on the type first.":["Ce type de contenu n'a aucun champ appelé %(field)s. Vérifiez le nom, ou déclarez d'abord le champ sur le type."],"This content type is turned off, so its content is not served or edited. Activate it first.":["Ce type de contenu est désactivé, son contenu n'est donc ni servi ni modifié. Activez-le d'abord."],"This content type still holds content, so it cannot be deleted. Move or delete its items first.":["Ce type de contenu contient encore du contenu, il ne peut donc pas être supprimé. Déplacez ou supprimez d'abord ses éléments."],"This definitions file is larger than the %(max)s bytes Gophenberg reads in one request. Split it, or raise the limit your site runs with.":["Ce fichier de définitions dépasse les %(max)s octets que Gophenberg lit en une requête. Divisez-le, ou relevez la limite de votre site."],"This field holds no layouts yet.":["Ce champ ne contient pas encore de dispositions."],"This field would stand inside too many containers. Put it nearer the top and try again.":["Ce champ se trouverait dans trop de conteneurs. Placez-le plus près du niveau supérieur et réessayez."],"This file could not be opened as a zip. Package the theme again and upload the new file.":["Ce fichier n'a pas pu être ouvert comme zip. Réempaquetez le thème et téléversez le nouveau fichier."],"This file is larger than the upload limit. Upload a smaller file.":["Ce fichier dépasse la limite de téléversement. Téléversez un fichier plus petit."],"This file is named %(extension)s but it holds %(detected)s content. Upload it under a name that matches what is inside it.":["Ce fichier est nommé %(extension)s mais il contient du %(detected)s. Téléversez-le sous un nom qui correspond à ce qu'il contient."],"This file matches the site, so there is nothing to change.":["Ce fichier correspond au site, il n'y a donc rien à changer."],"This file says it was written in format %(declared)s, which is not a version Gophenberg can read. Export the definitions again from the site they came from.":["Ce fichier indique le format %(declared)s, qui n'est pas une version que Gophenberg sait lire. Exportez à nouveau les définitions depuis le site d'origine."],"This file was written in format %(declared)s, and this release reads %(served)s. Upgrade the site the file came from, or this one.":["Ce fichier est écrit au format %(declared)s, et cette version lit %(served)s. Mettez à jour le site d'origine du fichier, ou celui-ci."],"This group holds no fields yet.":["Ce groupe ne contient pas encore de champs."],"This install of Gophenberg has no install root, so it updates by hand.":["Cette installation de Gophenberg n'a pas de racine d'installation, elle se met donc à jour à la main."],"This is a custom build of Gophenberg, so it updates by hand.":["Il s'agit d'une version compilée sur mesure de Gophenberg, elle se met donc à jour à la main."],"This item cannot go straight to that status from the one it holds now. Save it as a draft first, then try again.":["Cet élément ne peut pas passer directement à cet état depuis celui qu'il a maintenant. Enregistrez-le d'abord comme brouillon, puis réessayez."],"This item changed while you were describing it. Reload and try again.":["Cet élément a changé pendant que vous le décriviez. Rechargez et réessayez."],"This item does not exist, and it may have been deleted. Go back to the list to see what is there.":["Cet élément n'existe pas, et il a peut-être été supprimé. Revenez à la liste pour voir ce qui s'y trouve."],"This item is already in the trash. Restore it first to work on it again.":["Cet élément est déjà dans la corbeille. Rétablissez-le d'abord pour y retravailler."],"This item is in the trash. Restore it first to work on it again.":["Cet élément est dans la corbeille. Rétablissez-le d'abord pour y retravailler."],"This item is not in the trash, so there is nothing to restore. Open it from the list to work on it as it is.":["Cet élément n'est pas dans la corbeille, il n'y a donc rien à rétablir. Ouvrez-le depuis la liste pour travailler dessus tel quel."],"This item still holds items nested inside it. Move or delete those first.":["Cet élément contient encore des éléments imbriqués. Déplacez-les ou supprimez-les d'abord."],"This kind of field holds no fields inside it. Put the field in a section or a repeater instead.":["Ce type de champ ne contient aucun champ. Placez le champ dans une section ou dans un répéteur."],"This media item is not in the library, and someone may have deleted it. Reload the page to see what is there now.":["Ce média n'est pas dans la bibliothèque, et quelqu'un l'a peut-être supprimé. Rechargez la page pour voir ce qui s'y trouve maintenant."],"This picture could not be read, so nothing was stored. The file may be damaged, so open it on your computer and upload it again.":["Cette image n'a pas pu être lue, rien n'a donc été stocké. Le fichier est peut-être endommagé, ouvrez-le sur votre ordinateur et téléversez-le de nouveau."],"This picture is %(width)s by %(height)s pixels, over the limit of %(max)s pixels in all. Make it smaller and upload it again.":["Cette image fait %(width)s par %(height)s pixels, au-delà de la limite de %(max)s pixels au total. Réduisez-la et téléversez-la de nouveau."],"This post changed elsewhere. Reload before saving again.":["Cet article a changé ailleurs. Rechargez avant d'enregistrer de nouveau."],"This request came from a page on another site, so it was refused. Open the admin on this site and try again.":["Cette requête vient d'une page d'un autre site, elle a donc été refusée. Ouvrez l'administration sur ce site et réessayez."],"This request carried %(attribute)s, which fields do not take. Reload the page so the admin and the server agree again.":["Cette requête portait %(attribute)s, que les champs n'acceptent pas. Rechargez la page pour que l'administration et le serveur concordent à nouveau."],"This request left out %(field)s, which Gophenberg needs. Reload the page and try again.":["Cette requête a omis %(field)s, dont Gophenberg a besoin. Rechargez la page et réessayez."],"This rule reads a source called %(source)s, and nothing on your site declares one. A plugin that added it may have been removed.":["Cette règle lit une source nommée %(source)s, et rien sur votre site n'en déclare. Une extension qui l'ajoutait a pu être retirée."],"This site cannot write to its themes folder, so no theme can be installed. Ask whoever looks after your site to make the folder that %(setting)s points at writable. A read-only mount is the usual cause.":["Ce site ne peut pas écrire dans son dossier de thèmes, aucun thème ne peut donc être installé. Demandez à la personne qui s'occupe de votre site de rendre accessible en écriture le dossier vers lequel pointe %(setting)s. Un montage en lecture seule en est la cause habituelle."],"This site has nowhere to keep themes, so no theme can be installed. Ask whoever looks after your site to point %(setting)s at a folder the server can write to.":["Ce site n'a nulle part où garder les thèmes, aucun thème ne peut donc être installé. Demandez à la personne qui s'occupe de votre site de faire pointer %(setting)s vers un dossier où le serveur peut écrire."],"This site has nowhere to store uploads, so nothing can be uploaded. Ask whoever looks after your site to point %(setting)s at a folder the server can write to.":["Ce site n'a nulle part où stocker les téléversements, rien ne peut donc être téléversé. Demandez à la personne qui s'occupe de votre site de faire pointer %(setting)s vers un dossier où le serveur peut écrire."],"This theme is over the limit of %(max)s bytes, packed or unpacked. Leave out what the theme does not need and package it again.":["Ce thème dépasse la limite de %(max)s octets, compressé ou non. Retirez ce dont le thème n'a pas besoin et réempaquetez-le."],"This type will answer under /%(word)s.":["Ce type répondra sous /%(word)s."],"This zip holds %(entries)s files, more than the %(max)s a theme may carry. Package only the built theme.":["Ce zip contient %(entries)s fichiers, plus que les %(max)s qu'un thème peut contenir. Empaquetez seulement le thème construit."],"Through":["Via"],"Thumbnail":["Miniature"],"Title":["Titre"],"Two field groups in this file share the key %(key)s. Give one of them a different key and import again.":["Deux groupes de champs de ce fichier partagent la clé %(key)s. Donnez une clé différente à l'un d'eux et importez à nouveau."],"Two rule sources are registered under the name %(param)s. A plugin is declaring a source your site already holds.":["Deux sources de règles sont enregistrées sous le nom %(param)s. Une extension déclare une source que votre site possède déjà."],"Type":["Type"],"Type a whole number in both boxes before saving.":["Saisissez un nombre entier dans les deux cases avant d'enregistrer."],"Undo":["Annuler"],"Unsaved changes":["Modifications non enregistrées"],"Update":["Mettre à jour"],"Update failed.":["La mise à jour a échoué."],"Upload theme":["Téléverser un thème"],"Uploaded %s file.":["%s fichier téléversé.","%s fichiers téléversés.","%s fichiers téléversés."],"Users":["Utilisateurs"],"Users could not be loaded.":["Les utilisateurs n'ont pas pu être chargés."],"Value":["Valeur"],"Version":["Version"],"Videos":["Vidéos"],"Visit Site":["Aller sur le site"],"Web address":["Adresse web"],"What each Linked from field reads":["Ce que lit chaque champ Lié depuis"],"What it points at changed, so its stored values go with it.":["Ce qu'il vise a changé, donc ses valeurs enregistrées partent avec lui."],"Where %(group)s appears":["Où apparaît %(group)s"],"Without a rule this field always shows.":["Sans aucune règle ce champ s'affiche toujours."],"Without a rule this group appears nowhere.":["Sans une règle ce groupe n'apparaît nulle part."],"Yes":["Oui"],"Yes or no":["Oui ou non"],"You cannot change your own role.":["Vous ne pouvez pas changer votre propre rôle."],"Your language":["Votre langue"],"Your role does not allow %(capability)s.":["Votre rôle ne permet pas %(capability)s."],"Your server pins the site to the theme %(name)s, so themes cannot be changed here. Ask whoever looks after your site to remove the pin.":["Votre serveur fixe le site au thème %(name)s, les thèmes ne peuvent donc pas être changés ici. Demandez à la personne qui s'occupe de votre site de retirer cette fixation."],"Your site always needs one default content type, so this one cannot be turned off or deleted. Make another type the default first.":["Votre site a toujours besoin d'un type de contenu par défaut, celui-ci ne peut donc être ni désactivé ni supprimé. Rendez d'abord un autre type par défaut."],"a content type":["un type de contenu"],"account\u0004Role":["Rôle"],"account\u0004Status":["État"],"action label\u0004Duplicate":["Dupliquer"],"action label\u0004Duplicate…":["Dupliquer…"],"address":["adresse"],"admin section\u0004Media":["Médias"],"column\u0004Date":["Date"],"content type\u0004\"%s\" permanently deleted.":["Type de contenu « %s » supprimé définitivement."],"content type\u0004\"%s\" successfully created.":["Type de contenu « %s » créé avec succès."],"content type\u0004Status":["État"],"field\u0004Name":["Nom"],"field group\u0004Status":["Statut"],"field type\u0004Choice":["Choix"],"field type\u0004Color":["Couleur"],"field type\u0004Date":["Date"],"field type\u0004Flexible content":["Contenu flexible"],"field type\u0004Gallery":["Galerie"],"field type\u0004Kind":["Genre"],"field type\u0004Layout":["Disposition"],"field type\u0004Link":["Lien"],"field type\u0004Media":["Média"],"field type\u0004Range":["Plage"],"field type\u0004Repeater":["Répéteur"],"field type\u0004Section":["Section"],"field type\u0004Select":["Liste déroulante"],"holds":["contient"],"holds anything":["contient quelque chose"],"is":["est"],"is above":["est supérieur à"],"is below":["est inférieur à"],"is empty":["est vide"],"is not":["n'est pas"],"media family\u0004Kind":["Type"],"panel button label\u0004Settings":["Réglages"],"person\u0004Name":["Nom"],"post\u0004%s (Copy)":["%s (copie)"],"post\u0004Status":["État"],"post status\u0004Draft":["Brouillon"],"post status\u0004Published":["Publié"],"post status\u0004Trash":["Corbeille"],"post type general name\u0004Pages":["Pages"],"post type general name\u0004Posts":["Articles"],"post type singular name\u0004Page":["Page"],"post type singular name\u0004Post":["Article"],"relation target\u0004None":["Aucun"],"role\u0004Administrator":["Administrateur"],"role\u0004Author":["Auteur"],"role\u0004Editor":["Éditeur"],"role\u0004Member":["Membre"],"role\u0004No role":["Sans rôle"],"status filter\u0004All":["Tout"],"taxonomy general name\u0004Categories":["Catégories"],"taxonomy singular name\u0004Category":["Catégorie"],"theme\u0004Status":["État"],"trash\u0004Restore":["Rétablir"],"v%(version)s":["v%(version)s"],"verb\u0004Trash…":["Mettre à la corbeille…"],"verb\u0004View":["Voir"],"{day} {month} {year}":["{day} {month} {year}"]} +{"":{"lang":"fr","plural-forms":"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"}," and ":[" et "]," or ":[" ou "],"\"%s\" activated.":["Type de contenu « %s » activé."],"\"%s\" deactivated.":["Type de contenu « %s » désactivé."],"\"%s\" has been restored.":["« %s » a été rétabli."],"\"%s\" moved to the trash.":["« %s » déplacé dans la corbeille."],"\"%s\" permanently deleted.":["« %s » supprimé définitivement."],"\"%s\" successfully created.":["« %s » créé avec succès."],"\"%s\" uploaded.":["« %s » téléversé."],"%(field)s address":["Adresse de %(field)s"],"%(field)s cannot move inside itself. Pick a container that is not one of its own.":["%(field)s ne peut pas être déplacé à l'intérieur de lui-même. Choisissez un conteneur qui n'est pas l'un des siens."],"%(field)s declared.":["%(field)s déclaré."],"%(field)s deleted.":["%(field)s supprimé."],"%(field)s does not match the format its field asks for. Check it and save again.":["%(field)s ne respecte pas le format demandé par son champ. Vérifiez-le et enregistrez de nouveau."],"%(field)s goes no higher than %(limit)s. Lower the value and save again.":["%(field)s ne dépasse pas %(limit)s. Baissez la valeur et enregistrez de nouveau."],"%(field)s goes no lower than %(limit)s. Raise the value and save again.":["%(field)s ne descend pas sous %(limit)s. Augmentez la valeur et enregistrez de nouveau."],"%(field)s holds no value of its own, so it cannot be required. Make it optional.":["%(field)s ne contient aucune valeur propre, il ne peut donc pas être obligatoire. Rendez-le facultatif."],"%(field)s is optional again.":["%(field)s est de nouveau facultatif."],"%(field)s is required now.":["%(field)s est maintenant obligatoire."],"%(field)s moved.":["%(field)s déplacé."],"%(field)s names the same one twice. Remove the repeat and save again.":["%(field)s nomme le même deux fois. Retirez la répétition et enregistrez de nouveau."],"%(field)s needs at least %(limit)s files. Add one and save again.":["%(field)s demande au moins %(limit)s fichiers. Ajoutez-en un et enregistrez."],"%(field)s needs at least %(limit)s rows. Add one and save again.":["%(field)s demande au moins %(limit)s lignes. Ajoutez-en une et enregistrez."],"%(field)s only takes one of its listed choices. Pick one and save again.":["%(field)s accepte uniquement un des choix de sa liste. Choisissez-en un et enregistrez de nouveau."],"%(field)s reads a relation field that is not there. Pick a group and a relation field it holds.":["%(field)s lit un champ de relation qui n'existe pas. Choisissez un groupe et un champ de relation qu'il contient."],"%(field)s reads a relation pointing at %(type)s, so it would list nothing here. Pick a relation pointing at the items this group is shown on.":["%(field)s lit une relation qui pointe vers %(type)s, elle n'afficherait donc rien ici. Choisissez une relation qui pointe vers les éléments où ce groupe s'affiche."],"%(field)s renamed.":["%(field)s renommé."],"%(field)s settled.":["%(field)s réglé."],"%(field)s shows by its rules now.":["%(field)s s'affiche désormais selon ses règles."],"%(field)s stands in the list.":["%(field)s figure dans la liste."],"%(field)s stays out of the list.":["%(field)s reste hors de la liste."],"%(field)s takes at most %(limit)s files. Remove one and save again.":["%(field)s accepte au plus %(limit)s fichiers. Retirez-en un et enregistrez."],"%(field)s takes at most %(limit)s letters. Shorten what you wrote and save again.":["%(field)s accepte au plus %(limit)s lettres. Raccourcissez ce que vous avez écrit et enregistrez de nouveau."],"%(field)s takes at most %(limit)s rows. Remove one and save again.":["%(field)s accepte au plus %(limit)s lignes. Retirez-en une et enregistrez."],"%(field)s title":["Titre de %(field)s"],"%(file)s is larger than one upload may be.":["%(file)s dépasse la taille maximale d'un téléversement."],"%(file)s is not a file this block accepts.":["%(file)s n'est pas un fichier que ce bloc accepte."],"%(file)s: %(reason)s":["%(file)s : %(reason)s"],"%(group)s created.":["%(group)s créé."],"%(group)s now appears where you said.":["%(group)s apparaît maintenant là où vous avez dit."],"%(group)s removed.":["%(group)s supprimé."],"%(group)s updated.":["%(group)s mis à jour."],"%(key)s is served by %(winner)s, so %(loser)s does not show it on %(where)s.":["%(key)s est servi par %(winner)s, donc %(loser)s ne le montre pas sur %(where)s."],"%(name)s %(version)s is serving the public site.":["%(name)s %(version)s sert le site public."],"%(name)s belongs to the site now.":["%(name)s appartient désormais au site."],"%(name)s came from the %(plugin)s plugin, which no longer declares it.":["%(name)s venait de l'extension %(plugin)s, qui ne le déclare plus."],"%(name)s cannot be used as a theme name. Name the zip file after the theme, with no dot at the start and no slashes in it.":["%(name)s ne peut pas servir de nom de thème. Nommez le fichier zip comme le thème, sans point au début et sans barre oblique."],"%(name)s moves to /%(word)s. Every address of both types changes.":["Le type %(name)s passe à /%(word)s. Toutes les adresses des deux types changent."],"%(name)s would move to /%(word)s, which Gophenberg keeps for itself. Change its plural name and try again.":["Le type %(name)s passerait à /%(word)s, que Gophenberg garde pour lui. Modifiez son nom au pluriel et réessayez."],"%(source)s is %(value)s":["%(source)s est %(value)s"],"%(theme)s failed to start, so the built-in renderer is serving.":["%(theme)s n'a pas pu démarrer, le moteur de rendu intégré sert donc le site."],"%(theme)s is now serving the public site.":["%(theme)s sert désormais le site public."],"%(theme)s is serving the public site.":["%(theme)s sert le site public."],"%(theme)s is still starting, so the built-in renderer is serving.":["%(theme)s démarre encore, le moteur de rendu intégré sert donc le site."],"%(theme)s was installed.":["%(theme)s a été installé."],"%(theme)s will not load, so the built-in renderer is serving.":["%(theme)s ne se charge pas, le moteur de rendu intégré sert donc le site."],"%(type)s answers on a new address, and stored links move with it.":["%(type)s répond à une nouvelle adresse, et les liens enregistrés la suivent."],"%(type)s becomes the type the site opens on, and the old one takes an address.":["%(type)s devient le type sur lequel le site ouvre, et l'ancien prend une adresse."],"%(type)s keeps nesting while %(items)s of its items sit inside another. Move those to the top level first, the ones in the trash included.":["%(type)s continue de s'imbriquer tant que %(items)s de ses éléments se trouvent dans un autre. Déplacez-les d'abord au niveau supérieur, ceux de la corbeille compris."],"%(type)s keeps nesting, because some of its items sit inside another.":["%(type)s continue de s'imbriquer, car certains de ses éléments se trouvent dans un autre."],"%(type)s will answer at the root.":["Le type %(type)s répondra à la racine."],"%s content type activated.":["%s type de contenu activé.","%s types de contenu activés.","%s types de contenu activés."],"%s content type could not be activated.":["%s type de contenu n'a pas pu être activé.","%s types de contenu n'ont pas pu être activés.","%s types de contenu n'ont pas pu être activés."],"%s content type could not be deactivated.":["%s type de contenu n'a pas pu être désactivé.","%s types de contenu n'ont pas pu être désactivés.","%s types de contenu n'ont pas pu être désactivés."],"%s content type could not be permanently deleted.":["%s type de contenu n'a pas pu être supprimé définitivement.","%s types de contenu n'ont pas pu être supprimés définitivement.","%s types de contenu n'ont pas pu être supprimés définitivement."],"%s content type deactivated.":["%s type de contenu désactivé.","%s types de contenu désactivés.","%s types de contenu désactivés."],"%s content type permanently deleted.":["%s type de contenu supprimé définitivement.","%s types de contenu supprimés définitivement.","%s types de contenu supprimés définitivement."],"%s item could not be moved to the trash.":["%s élément n'a pas pu être déplacé dans la corbeille.","%s éléments n'ont pas pu être déplacés dans la corbeille.","%s éléments n'ont pas pu être déplacés dans la corbeille."],"%s item could not be permanently deleted.":["%s élément n'a pas pu être supprimé définitivement.","%s éléments n'ont pas pu être supprimés définitivement.","%s éléments n'ont pas pu être supprimés définitivement."],"%s item could not be restored.":["%s élément n'a pas pu être rétabli.","%s éléments n'ont pas pu être rétablis.","%s éléments n'ont pas pu être rétablis."],"%s item moved to the trash.":["%s élément déplacé dans la corbeille.","%s éléments déplacés dans la corbeille.","%s éléments déplacés dans la corbeille."],"%s item permanently deleted.":["%s élément supprimé définitivement.","%s éléments supprimés définitivement.","%s éléments supprimés définitivement."],"%s item stays in the trash.":["%s élément reste dans la corbeille.","%s éléments restent dans la corbeille.","%s éléments restent dans la corbeille."],"%s page has been restored.":["%s page a été rétablie.","%s pages ont été rétablies.","%s pages ont été rétablies."],"%s post has been restored.":["%s article a été rétabli.","%s articles ont été rétablis.","%s articles ont été rétablis."],"(no title)":["(sans titre)"],"A %(kind)s field does not take a setting called %(setting)s. Remove it and try again.":["Un champ %(kind)s n'accepte pas de réglage nommé %(setting)s. Retirez-le et réessayez."],"A Linked from field stands on its own, not inside a section or a repeater. Declare %(field)s beside the container.":["Un champ Lié depuis se place seul, ni dans une section ni dans un répéteur. Déclarez %(field)s à côté du conteneur."],"A content type needs a singular and a plural name, like Guide and Guides. Fill both in and try again.":["Un type de contenu a besoin d'un nom au singulier et d'un nom au pluriel, comme Guide et Guides. Remplissez les deux et réessayez."],"A descriptive summary of the content type.":["Un résumé descriptif du type de contenu."],"A field group key has to start with a lowercase letter and then hold only lowercase letters, numbers and hyphens. Rename the group in the file so its key comes out in that shape.":["La clé d'un groupe de champs doit commencer par une lettre minuscule puis ne contenir que des lettres minuscules, des chiffres et des tirets. Renommez le groupe dans le fichier pour que sa clé prenne cette forme."],"A field key has to start with a lowercase letter and then hold only lowercase letters, numbers and hyphens. Rename the field so its key comes out in that shape.":["La clé d'un champ doit commencer par une lettre minuscule et ne contenir ensuite que des lettres minuscules, des chiffres et des tirets. Renommez le champ pour que sa clé prenne cette forme."],"A field needs a name. Type one and try again.":["Un champ a besoin d'un nom. Saisissez-en un et réessayez."],"A field with that name already exists on the items this group reaches. Pick another name.":["Un champ portant ce nom existe déjà sur les éléments que ce groupe atteint. Choisissez un autre nom."],"A flexible content field holds layouts, and %(field)s is not one. Add a layout first, then declare the field inside that layout.":["Un champ de contenu flexible contient des dispositions, et %(field)s n'en est pas une. Ajoutez d'abord une disposition, puis déclarez le champ dans cette disposition."],"A higher quality stores larger files, and it applies to pictures uploaded from now on.":["Une qualité plus élevée stocke des fichiers plus grands, et elle s'applique aux images téléversées à partir de maintenant."],"A layout stands inside a flexible content field only. Put %(field)s inside one of those instead.":["Une disposition ne se place que dans un champ de contenu flexible. Placez %(field)s dans l'un d'eux."],"A layout stands inside a flexible content field, never on its own. Declare a flexible content field first, then add %(field)s inside it.":["Une disposition se place dans un champ de contenu flexible, jamais seule. Déclarez d'abord un champ de contenu flexible, puis ajoutez %(field)s dedans."],"A listing carries between 1 and %(max)s items, so %(value)s is not a size Gophenberg takes. Pick a number inside that range.":["Une liste affiche entre 1 et %(max)s éléments, donc %(value)s n'est pas une taille que Gophenberg accepte. Choisissez un nombre dans cet intervalle."],"A relation field has to say which content type it points at. Pick that type and try again.":["Un champ de relation doit indiquer le type de contenu qu'il vise. Choisissez ce type et réessayez."],"A reload shows the admin in the language you chose.":["Un rechargement affiche l'administration dans la langue que vous avez choisie."],"A route word has to start with a lowercase letter and then hold only lowercase letters, numbers and hyphens. Change it and try again.":["Un mot de route doit commencer par une lettre minuscule et ne contenir ensuite que des lettres minuscules, des chiffres et des tirets. Modifiez-le et réessayez."],"A row of %(field)s has to name the layout it takes. Pick a layout for the row, or remove the row.":["Une ligne de %(field)s doit nommer la disposition qu'elle prend. Choisissez une disposition pour la ligne, ou retirez la ligne."],"A row of %(field)s takes one layout and no more. Reload the page and build the row again.":["Une ligne de %(field)s prend une seule disposition. Rechargez la page et reconstruisez la ligne."],"A rule matching any %(source)s cannot be turned into an exclusion. Leave it as is, or name the ones to leave out instead.":["Une règle valable pour n'importe quel %(source)s ne peut pas devenir une exclusion. Laissez-la telle quelle, ou nommez ceux à écarter."],"A theme naming its own page size uses that instead.":["Un thème qui indique sa propre taille de page utilise celle-ci à la place."],"A type key has to start with a lowercase letter and then hold only lowercase letters, numbers and hyphens. Change the key and try again.":["La clé d'un type doit commencer par une lettre minuscule et ne contenir ensuite que des lettres minuscules, des chiffres et des tirets. Modifiez la clé et réessayez."],"Actions":["Actions"],"Activate":["Activer"],"Activate %(theme)s":["Activer %(theme)s"],"Active":["Actif"],"Add":["Ajouter"],"Add %(layout)s":["Ajouter %(layout)s"],"Add %(name)s":["Ajouter %(name)s"],"Add %(type)s":["Ajouter %(type)s"],"Add Category":["Ajouter une catégorie"],"Add Content Type":["Ajouter un type de contenu"],"Add Field Group":["Ajouter un groupe de champs"],"Add Media File":["Ajouter un fichier média"],"Add Page":["Ajouter une page"],"Add Post":["Ajouter un article"],"Add User":["Ajouter un utilisateur"],"Add block":["Ajouter un bloc"],"Add choice":["Ajouter un choix"],"Add condition":["Ajouter une condition"],"Add field":["Ajouter un champ"],"Add field to %(field)s":["Ajouter un champ à %(field)s"],"Add layout":["Ajouter une disposition"],"Add layout to %(field)s":["Ajouter une disposition à %(field)s"],"Add one with %(button)s.":["Ajoutez un élément avec %(button)s."],"Add row":["Ajouter une ligne"],"Add rule set":["Ajouter un ensemble de règles"],"Add title":["Ajouter un titre"],"Add to %(field)s":["Ajouter à %(field)s"],"Address":["Adresse"],"Address updated.":["Adresse mise à jour."],"Adopt":["Adopter"],"Allow custom":["Autoriser les valeurs libres"],"Allow empty":["Autoriser le vide"],"Alt text":["Texte alternatif"],"An item cannot point at itself. Pick a different item for %(field)s.":["Un élément ne peut pas se viser lui-même. Choisissez un autre élément pour %(field)s."],"An item cannot sit inside itself, or inside one of the items nested under it. Pick a parent outside this branch.":["Un élément ne peut pas se trouver dans lui-même, ni dans un élément imbriqué sous lui. Choisissez un parent hors de cette branche."],"Another account wrote this, and only its author, an editor or an administrator may change it. You can still read it.":["Un autre compte a écrit ceci, et seuls son auteur, un éditeur ou un administrateur peuvent le modifier. Vous pouvez toujours le lire."],"Another account wrote this, so you are reading it rather than editing it.":["Un autre compte a écrit ceci, alors vous le lisez au lieu de le modifier."],"Another content type already answers under this route word. Pick a different word.":["Un autre type de contenu répond déjà sous ce mot de route. Choisissez un autre mot."],"Another content type already lives at the root of your site, and only one can. Give this type a route word, or hand the root over with Make default.":["Un autre type de contenu occupe déjà la racine de votre site, et un seul le peut. Donnez un mot de route à ce type, ou cédez la racine avec Rendre par défaut."],"Another content type already uses this key. Give this type a different name.":["Un autre type de contenu utilise déjà cette clé. Donnez un autre nom à ce type."],"Another item of this content type already uses that address. Pick a different slug and save again.":["Un autre élément de ce type de contenu utilise déjà cette adresse. Choisissez un autre slug et enregistrez de nouveau."],"Another update is currently in progress.":["Une autre mise à jour est actuellement en cours."],"Appears on":["Apparaît sur"],"Apply":["Appliquer"],"April":["avril"],"Are you sure you want to move \"%s\" to the trash?":["Voulez-vous vraiment déplacer « %s » dans la corbeille ?"],"Audio":["Audio"],"August":["août"],"Author":["Auteur"],"Back to %(type)s":["Retour aux %(type)s"],"Back to the latest posts":["Retour aux derniers articles"],"Block":["Bloc"],"Broken":["Cassé"],"Bundles of fields, shown where their rules place them.":["Ensembles de champs, affichés là où leurs règles les placent."],"Button group":["Groupe de boutons"],"Cancel":["Annuler"],"Caption":["Légende"],"Change %(name)s":["Modifier %(name)s"],"Change address":["Changer l'adresse"],"Change address…":["Changer l'adresse…"],"Change role":["Changer le rôle"],"Change the role of %(name)s":["Changer le rôle de %(name)s"],"Checkbox group":["Groupe de cases à cocher"],"Choices":["Choix"],"Choose %(field)s":["Choisir %(field)s"],"Choose how the site serves its content.":["Choisissez comment le site sert son contenu."],"Choose the language the admin reads in.":["Choisissez la langue dans laquelle se lit l'administration."],"Choose the role of %(name)s.":["Choisissez le rôle de %(name)s."],"Choose the version to update to.":["Choisissez la version vers laquelle mettre à jour."],"Clear %(field)s":["Vider %(field)s"],"Close":["Fermer"],"Close Settings":["Fermer les réglages"],"Closed":["Fermé"],"Condition":["Condition"],"Content":["Contenu"],"Content Types":["Types de contenu"],"Content nests at most %(max)s levels deep, and this item would sit deeper. Pick a parent closer to the top.":["Le contenu s'imbrique sur au plus %(max)s niveaux, et cet élément irait plus profond. Choisissez un parent plus proche du sommet."],"Content type":["Type de contenu"],"Content type updated.":["Type de contenu mis à jour."],"Could not delete that item.":["Impossible de supprimer cet élément.","Impossible de supprimer tous les éléments.","Impossible de supprimer tous les éléments."],"Could not load that post.":["Impossible de charger cet article."],"Could not save that post.":["Impossible d'enregistrer cet article."],"Create":["Créer"],"Create a field group":["Créer un groupe de champs"],"Create user":["Créer l'utilisateur"],"Created":["Date de création"],"Date added":["Date d'ajout"],"Deactivate":["Désactiver"],"Deactivate %(theme)s":["Désactiver %(theme)s"],"December":["décembre"],"Default":["Par défaut"],"Default content type updated.":["Type de contenu par défaut mis à jour."],"Definitions file":["Fichier de définitions"],"Delete":["Supprimer"],"Delete \"%(title)s\" for good? This cannot be undone.":["Supprimer « %(title)s » définitivement ? Cette action est irréversible."],"Delete %(field)s":["Supprimer %(field)s"],"Delete %(group)s":["Supprimer %(group)s"],"Delete %(title)s for good? This cannot be undone.":["Supprimer %(title)s définitivement ? Cette action est irréversible."],"Delete %s content type for good? This cannot be undone.":["Supprimer %s type de contenu définitivement ? Cette action est irréversible.","Supprimer %s types de contenu définitivement ? Cette action est irréversible.","Supprimer %s types de contenu définitivement ? Cette action est irréversible."],"Delete %s item for good? This cannot be undone.":["Supprimer %s élément définitivement ? Cette action est irréversible.","Supprimer %s éléments définitivement ? Cette action est irréversible.","Supprimer %s éléments définitivement ? Cette action est irréversible."],"Delete Permanently":["Supprimer définitivement"],"Delete the field":["Supprimer le champ"],"Delete the group":["Supprimer le groupe"],"Delete this %(count)s item for good? This cannot be undone.":["Supprimer définitivement ce %(count)s élément ? Cette action est irréversible.","Supprimer définitivement ces %(count)s éléments ? Cette action est irréversible.","Supprimer définitivement ces %(count)s éléments ? Cette action est irréversible."],"Delete…":["Supprimer…"],"Describe":["Décrire"],"Describe…":["Décrire…"],"Description":["Description"],"Description updated.":["Description mise à jour."],"Desktop":["Ordinateur"],"Destination":["Destination"],"Dimensions":["Dimensions"],"Disable":["Désactiver"],"Disable %(name)s":["Désactiver %(name)s"],"Disabled":["Désactivé"],"Dismiss":["Ignorer"],"Document":["Document"],"Done. The site now holds what the file describes.":["Terminé. Le site contient maintenant ce que décrit le fichier."],"Draft saved.":["Brouillon enregistré."],"Drop files to upload":["Déposez vos fichiers pour les téléverser"],"Email":["E-mail"],"Empty Trash":["Vider la corbeille"],"Empty trash":["Vider la corbeille"],"Enable":["Activer"],"Enable %(name)s":["Activer %(name)s"],"Every address of this type moves. Links kept elsewhere to the old addresses stop working.":["Toutes les adresses de ce type changent. Les liens conservés ailleurs vers les anciennes adresses cessent de fonctionner."],"Every content type":["Tous les types de contenu"],"Every field group needs a title. Give it a name and save again.":["Chaque groupe de champs a besoin d'un titre. Donnez-lui un nom et enregistrez à nouveau."],"Every item needs an author who exists. Pick one from the list and save again.":["Chaque élément a besoin d'un auteur existant. Choisissez-en un dans la liste et enregistrez de nouveau."],"Every kind of content this site holds.":["Toutes les sortes de contenu que ce site contient."],"Every value stored under this field goes with it, in every item the group reaches and in the revisions behind them.":["Toutes les valeurs enregistrées dans ce champ partent avec lui, dans chaque élément que le groupe atteint et dans les révisions qui les suivent."],"Excerpt":["Extrait"],"Export definitions":["Exporter les définitions"],"February":["février"],"Fewest files":["Minimum de fichiers"],"Fewest rows":["Minimum de lignes"],"Field":["Champ"],"Field Groups":["Groupes de champs"],"Field group":["Groupe de champs"],"Fields":["Champs"],"Fields of %(group)s":["Champs de %(group)s"],"File name":["Nom du fichier"],"File size":["Taille du fichier"],"File type":["Type de fichier"],"Files":["Fichiers"],"Filter by status":["Filtrer par état"],"Follow the browser":["Suivre le navigateur"],"From %(plugin)s":["De %(plugin)s"],"Full Size":["Taille originale"],"Gophenberg cannot start this update: %(reason)s":["Gophenberg ne peut pas lancer cette mise à jour : %(reason)s"],"Gophenberg checked for updates moments ago. Try again later.":["Gophenberg a cherché des mises à jour il y a un instant. Réessayez plus tard."],"Gophenberg could not read what your browser sent. Reload the page and try again, and tell whoever looks after your site if it keeps happening.":["Gophenberg n'a pas pu lire ce que votre navigateur a envoyé. Rechargez la page et réessayez, et prévenez la personne qui s'occupe de votre site si cela continue."],"Gophenberg could not read which item you picked as parent. Reload the page and pick it again.":["Gophenberg n'a pas pu lire quel élément vous avez choisi comme parent. Rechargez la page et choisissez-le de nouveau."],"Gophenberg does not accept %(extension)s files. Upload a picture, a video, an audio file, a PDF or a zip instead.":["Gophenberg n'accepte pas les fichiers %(extension)s. Téléversez plutôt une image, une vidéo, un fichier audio, un PDF ou un zip."],"Gophenberg does not answer in %(value)s. Pick one of the languages on the list.":["Gophenberg ne répond pas en %(value)s. Choisissez une des langues de la liste."],"Gophenberg has no autosave of yours for this item. Open the item to see the version that is stored.":["Gophenberg n'a aucun enregistrement automatique de vous pour cet élément. Ouvrez l'élément pour voir la version stockée."],"Gophenberg holds no kind of definition called %(subject)s, so nothing was taken over. Reload the page so the admin and the server agree again.":["Gophenberg ne connaît aucune sorte de définition nommée %(subject)s, rien n'a donc été repris. Rechargez la page pour que l'admin et le serveur se rejoignent à nouveau."],"Gophenberg keeps /%(path)s for itself or for another content type, so your content cannot answer there. Give the item a different slug.":["Gophenberg garde l'adresse /%(path)s pour lui ou pour un autre type de contenu, votre contenu ne peut donc pas y répondre. Donnez un autre slug à l'élément."],"Gophenberg keeps this word for itself, so no content type can answer under it. Pick a different route word.":["Gophenberg garde ce mot pour lui, aucun type de contenu ne peut donc répondre sous ce mot. Choisissez un autre mot de route."],"Group":["Groupe"],"Highest":["Maximum"],"Holds":["Contient"],"Images":["Images"],"Import definitions":["Importer les définitions"],"In list":["Dans la liste"],"Inactive":["Inactif"],"Installed":["Installé"],"Instructions":["Instructions"],"It moves here from another group and keeps its stored values.":["Il arrive ici depuis un autre groupe et garde ses valeurs enregistrées."],"It moves to another group and keeps its stored values.":["Il passe dans un autre groupe et garde ses valeurs enregistrées."],"It moves to another group, so its stored values do not follow.":["Il passe dans un autre groupe, donc ses valeurs enregistrées ne le suivent pas."],"It reads a relation inside a container, and only an import can point it elsewhere.":["Il lit une relation dans un conteneur, et seule une importation peut le faire pointer ailleurs."],"It starts on %(type)s, and the rules may be edited afterwards.":["Il commence sur %(type)s, et les règles peuvent être modifiées ensuite."],"Items could not be loaded.":["Les éléments n'ont pas pu être chargés."],"Its items sit inside one another, so it keeps nesting.":["Ses éléments se trouvent les uns dans les autres, donc il continue de s'imbriquer."],"Its kind changed, so its stored values go with it.":["Son type a changé, donc ses valeurs enregistrées partent avec lui."],"January":["janvier"],"July":["juillet"],"June":["juin"],"Keep %(field)s out of the list":["Garder %(field)s hors de la liste"],"Keep it":["Le conserver"],"Keep it here":["Le laisser ici"],"Key":["Clé"],"Label":["Libellé"],"Language":["Langue"],"Large":["Grande"],"Let items nest":["Autoriser l'imbrication"],"Linked from":["Lié depuis"],"List view":["Vue en liste"],"Loading field groups.":["Chargement des groupes de champs."],"Loading the post.":["Chargement de l'article."],"Loading the screen.":["Chargement de l'écran."],"Loading themes.":["Chargement des thèmes."],"Loading users.":["Chargement des utilisateurs."],"Loading…":["Chargement…"],"Longest":["Longueur maximale"],"Lowest":["Minimum"],"Make %(field)s optional":["Rendre %(field)s facultatif"],"Make default":["Rendre par défaut"],"Make default…":["Rendre par défaut…"],"Make optional":["Rendre facultatif"],"Manage the categories on this site.":["Gérez les catégories de ce site."],"Manage the images and files this site holds.":["Gérez les images et les fichiers que ce site contient."],"Manage the items of this content type.":["Gérez les éléments de ce type de contenu."],"Manage the pages on this site.":["Gérez les pages de ce site."],"Manage the posts on this site.":["Gérez les articles de ce site."],"Many targets":["Plusieurs cibles"],"Many values":["Plusieurs valeurs"],"March":["mars"],"May":["mai"],"Media %(id)s":["Média %(id)s"],"Media Library":["Bibliothèque de médias"],"Medium":["Moyenne"],"Mobile":["Mobile"],"Modified: %s":["Modifié : %s"],"Most files":["Maximum de fichiers"],"Most rows":["Maximum de lignes"],"Move":["Déplacer"],"Move \"%(title)s\" to the trash?":["Déplacer « %(title)s » dans la corbeille ?"],"Move %(field)s down":["Descendre %(field)s"],"Move %(field)s elsewhere":["Déplacer %(field)s ailleurs"],"Move %(field)s up":["Monter %(field)s"],"Move %(group)s down":["Descendre %(group)s"],"Move %(group)s up":["Monter %(group)s"],"Move %(name)s down":["Descendre %(name)s"],"Move %(name)s up":["Monter %(name)s"],"Move %s item to the trash?":["Déplacer %s élément dans la corbeille ?","Déplacer %s éléments dans la corbeille ?","Déplacer %s éléments dans la corbeille ?"],"Move every address":["Déplacer toutes les adresses"],"Move row down":["Descendre la ligne"],"Move row up":["Monter la ligne"],"Move the field":["Déplacer le champ"],"Move to trash":["Déplacer dans la corbeille"],"Name":["Nom"],"Name updated.":["Nom mis à jour."],"Nests":["Imbriqué"],"Newer posts":["Articles plus récents"],"No":["Non"],"No content types found.":["Aucun type de contenu trouvé."],"No description":["Aucune description"],"No file arrived with this upload. Choose a file and try again.":["Aucun fichier n'est arrivé avec ce téléversement. Choisissez un fichier et réessayez."],"No items found.":["Aucun élément trouvé."],"No items yet.":["Aucun élément pour l'instant."],"No media chosen":["Aucun média choisi"],"No media has been uploaded yet.":["Aucun média n'a encore été téléversé."],"No media items found.":["Aucun fichier média trouvé."],"No media items yet.":["Aucun fichier média pour l’instant."],"No page lives at this address.":["Aucune page n'existe à cette adresse."],"No parent":["Pas de parent"],"No theme arrived with this upload. Choose a zip file and try again.":["Aucun thème n'est arrivé avec ce téléversement. Choisissez un fichier zip et réessayez."],"No themes are installed.":["Aucun thème n'est installé."],"No title":["Sans titre"],"None":["Aucun"],"Not %(type)s":["Sauf %(type)s"],"Not found":["Introuvable"],"Not serving":["Hors service"],"Nothing declares that role.":["Rien ne déclare ce rôle."],"Nothing points here yet.":["Rien ne pointe encore ici."],"Nothing published here yet.":["Rien n'est encore publié ici."],"Nothing published yet.":["Rien n'est encore publié."],"November":["novembre"],"Nowhere":["Nulle part"],"Number":["Nombre"],"October":["octobre"],"Older posts":["Articles plus anciens"],"One frame of this animation holds more than %(max)s pixels, which is more than Gophenberg opens. Upload a smaller animation.":["Une image de cette animation dépasse %(max)s pixels, plus que ce que Gophenberg ouvre. Téléversez une animation plus petite."],"One of the filters on this list is not one Gophenberg understands. Clear the filters and try again.":["Un des filtres de cette liste n'est pas un filtre que Gophenberg comprend. Videz les filtres et réessayez."],"One of the items picked for %(field)s is not the kind of content that field points at. Reload the page and pick from the list the field offers.":["Un des éléments choisis pour %(field)s n'est pas le genre de contenu que vise ce champ. Rechargez la page et choisissez dans la liste que le champ propose."],"One of the items picked for %(field)s was not named in a way Gophenberg understands. Reload the page and pick the items again.":["Un des éléments choisis pour %(field)s n'était pas nommé d'une façon que Gophenberg comprend. Rechargez la page et choisissez de nouveau les éléments."],"One of the items picked no longer exists. Reload the page and pick again.":["Un des éléments choisis n'existe plus. Rechargez la page et choisissez de nouveau."],"One target":["Une cible"],"Only a relation field points at another content type or holds many items. Pick the Relation kind, or leave the target and the many option empty.":["Seul un champ de relation vise un autre type de contenu ou contient plusieurs éléments. Choisissez le genre Relation, ou laissez vides la cible et l'option plusieurs."],"Only one file may be placed here.":["Un seul fichier peut être placé ici."],"Only the content type at the root of your site may go without a route word. Give this type one and try again.":["Seul le type de contenu à la racine de votre site peut se passer de mot de route. Donnez-en un à ce type et réessayez."],"Open %(field)s in a new tab":["Ouvrir %(field)s dans un nouvel onglet"],"Order stored.":["Ordre enregistré."],"Other":["Autre"],"Out of list":["Hors de la liste"],"Parent":["Parent"],"Password":["Mot de passe"],"Pending":["En attente"],"Pending Review":["En attente de relecture"],"Permanently delete":["Supprimer définitivement"],"Permanently delete…":["Supprimer définitivement…"],"Picture quality":["Qualité d'image"],"Picture quality runs from 1 to %(max)s, so %(value)s is not a quality Gophenberg stores at. Pick a number inside that range.":["La qualité d'image va de 1 à %(max)s, donc %(value)s n'est pas une qualité avec laquelle Gophenberg enregistre. Choisissez un nombre dans cet intervalle."],"Placeholder":["Texte indicatif"],"Plural name":["Nom au pluriel"],"Points at":["Vise"],"Post published.":["Article publié."],"Posts per page":["Articles par page"],"Preview":["Prévisualiser"],"Private":["Privé"],"Publish":["Publier"],"Published: %s":["Publié : %s"],"Radio group":["Groupe de boutons radio"],"Reads from":["Lit depuis"],"Redo":["Rétablir"],"Relation":["Relation"],"Remove":["Retirer"],"Remove %(name)s":["Retirer %(name)s"],"Remove %(title)s":["Retirer %(title)s"],"Remove row":["Retirer la ligne"],"Rename":["Renommer"],"Rename %(field)s":["Renommer %(field)s"],"Rename…":["Renommer…"],"Require":["Rendre obligatoire"],"Require %(field)s":["Rendre %(field)s obligatoire"],"Required":["Obligatoire"],"Restore":["Rétablir"],"Role changed.":["Rôle modifié."],"Roll back to %(theme)s":["Revenir à %(theme)s"],"Roll back to the built-in renderer":["Revenir au moteur de rendu intégré"],"Route word":["Mot de route"],"Rule %(number)s of set %(set)s":["Règle %(number)s de l'ensemble %(set)s"],"Rule set %(number)s":["Ensemble de règles %(number)s"],"Rules":["Règles"],"Rules showing %(field)s":["Règles affichant %(field)s"],"Save":["Enregistrer"],"Save draft":["Enregistrer le brouillon"],"Save rules":["Enregistrer les règles"],"Save settings":["Enregistrer les réglages"],"Saved":["Enregistré"],"Saving":["Enregistrement"],"Scheduled":["Planifié"],"Scheduled: %s":["Planifié : %s"],"Search %(type)s…":["Rechercher des %(type)s…"],"Search audio":["Rechercher un audio"],"Search images":["Rechercher des images"],"Search media":["Rechercher des médias"],"Search videos":["Rechercher des vidéos"],"Select":["Sélectionner"],"September":["septembre"],"Serving":["En service"],"Settings":["Réglages"],"Settings of %(field)s":["Réglages de %(field)s"],"Shadowed":["Masqué"],"Show %(field)s in the list":["Afficher %(field)s dans la liste"],"Showing %(held)s of %(total)s.":["Affichage de %(held)s sur %(total)s."],"Singular name":["Nom au singulier"],"Slug":["Slug"],"Somebody must be able to manage users.":["Quelqu'un doit pouvoir gérer les utilisateurs."],"Someone else changed this media item while you were editing it. Reload the page and make your change again.":["Quelqu'un d'autre a modifié ce média pendant que vous le modifiiez. Rechargez la page et refaites votre modification."],"Someone else saved changes to this item while you were editing, so yours were not saved. Copy your text somewhere safe, then reload the item and put your changes back in.":["Quelqu'un d'autre a enregistré des modifications sur cet élément pendant que vous éditiez, les vôtres n'ont donc pas été enregistrées. Copiez votre texte en lieu sûr, puis rechargez l'élément et remettez vos modifications."],"Something went wrong inside Gophenberg. Try again in a moment, and tell whoever looks after your site if it keeps happening.":["Quelque chose a mal tourné dans Gophenberg. Réessayez dans un instant, et prévenez la personne qui s'occupe de votre site si cela continue."],"Something went wrong.":["Quelque chose a mal tourné."],"Something went wrong. Try again.":["Quelque chose a mal tourné. Réessayez."],"Sorry, you are not allowed to access this page.":["Désolé, vous n’avez pas l’autorisation d’accéder à cette page."],"Source":["Source"],"Steps of":["Pas de"],"Stop nesting":["Arrêter l'imbrication"],"Tablet":["Tablette"],"Text":["Texte"],"Text area":["Zone de texte"],"That email is already in use.":["Cet e-mail est déjà utilisé."],"That field group no longer exists. Reload the page to see the groups your site holds now.":["Ce groupe de champs n'existe plus. Rechargez la page pour voir les groupes que votre site contient maintenant."],"That field is not on this content type any more. Reload the page to see the fields it has now.":["Ce champ n'est plus sur ce type de contenu. Rechargez la page pour voir les champs qu'il possède maintenant."],"That revision does not exist, and older ones drop off once a type holds more than it keeps. Open the item to see which revisions are left.":["Cette révision n'existe pas, et les plus anciennes disparaissent quand un type en détient plus qu'il n'en conserve. Ouvrez l'élément pour voir les révisions restantes."],"That role holds more than your own.":["Ce rôle va au-delà du vôtre."],"That web address does not name a media item Gophenberg can look up. Open the media library and pick the item from there.":["Cette adresse web ne désigne aucun média que Gophenberg puisse trouver. Ouvrez la bibliothèque de médias et choisissez l'élément depuis là."],"That web address does not name a revision Gophenberg can look up. Open the item and pick a revision from its history.":["Cette adresse web ne désigne aucune révision que Gophenberg puisse trouver. Ouvrez l'élément et choisissez une révision dans son historique."],"That web address does not name an item Gophenberg can look up. Go back to the list and open the item from there.":["Cette adresse web ne désigne aucun élément que Gophenberg puisse trouver. Revenez à la liste et ouvrez l'élément depuis là."],"The %(count)s item in the trash is deleted for good. This cannot be undone.":["%(count)s élément de la corbeille est supprimé définitivement. Cette action est irréversible.","Les %(count)s éléments de la corbeille sont supprimés définitivement. Cette action est irréversible.","Les %(count)s éléments de la corbeille sont supprimés définitivement. Cette action est irréversible."],"The %(file)s calls this theme %(declared)s, but it is being installed as %(installed)s. Rename the zip file to match, or change the name inside %(file)s.":["Le fichier %(file)s appelle ce thème %(declared)s, mais il s'installe sous %(installed)s. Renommez le fichier zip pour qu'ils correspondent, ou changez le nom dans %(file)s."],"The %(file)s inside %(name)s is not valid JSON, so it could not be read. Fix that file and package the theme again.":["Le fichier %(file)s dans %(name)s n'est pas du JSON valide, il n'a donc pas pu être lu. Corrigez ce fichier et réempaquetez le thème."],"The %(file)s inside %(name)s names its theme kit as %(declared)s, which is not a version number. Build the theme again, and the build will fill that in.":["Le %(file)s dans %(name)s indique son kit de thèmes comme %(declared)s, ce qui n'est pas un numéro de version. Compilez le thème à nouveau et la compilation le renseignera."],"The %(origin)s plugin declared this, so it can only be changed in that plugin. Turning it off is still yours to do.":["L'extension %(origin)s l'a déclaré, donc il ne peut être modifié que dans cette extension. Le désactiver reste entre vos mains."],"The %(plugin)s plugin also declares %(name)s, and the site keeps the key.":["L'extension %(plugin)s déclare aussi %(name)s, et le site garde la clé."],"The %(plugin)s plugin declared these fields, so they change only in its code.":["L'extension %(plugin)s a déclaré ces champs, donc ils ne changent que dans son code."],"The %(plugin)s plugin declares %(name)s flat, and the site keeps it nesting while its items sit inside another.":["L'extension %(plugin)s déclare %(name)s sans imbrication, et le site continue de l'imbriquer tant que ses éléments se trouvent dans un autre."],"The browser kept an unsaved version of this post.":["Le navigateur a gardé une version non enregistrée de cet article."],"The built-in renderer is now serving the public site.":["Le moteur de rendu intégré sert désormais le site public."],"The built-in renderer is serving the public site.":["Le moteur de rendu intégré sert le site public."],"The content type this field points at is not named in a shape Gophenberg accepts. Give it a key that starts with a lowercase letter and then holds only lowercase letters, numbers and hyphens.":["Le type de contenu que vise ce champ n'est pas nommé sous une forme que Gophenberg accepte. Donnez-lui une clé qui commence par une lettre minuscule et ne contient ensuite que des lettres minuscules, des chiffres et des tirets."],"The content types could not be loaded, so where these groups appear and which fields they shadow are not shown.":["Les types de contenu n'ont pas pu être chargés, donc où ces groupes apparaissent et quels champs ils masquent ne sont pas affichés."],"The content types could not be loaded.":["Les types de contenu n'ont pas pu être chargés."],"The content types could not be refreshed, so where these groups appear and what they shadow may be out of date.":["Les types de contenu n'ont pas pu être actualisés, donc où ces groupes apparaissent et ce qu'ils masquent peut être obsolète."],"The draft could not be created.":["Le brouillon n'a pas pu être créé."],"The entry %(entry)s in this zip would be written outside the theme folder, so nothing was installed. Package the theme again.":["L'entrée %(entry)s de ce zip s'écrirait hors du dossier du thème, rien n'a donc été installé. Réempaquetez le thème."],"The field %(field)s cannot go, because %(by)s reads it. Change %(by)s first.":["Le champ %(field)s ne peut pas être retiré, car %(by)s le lit. Modifiez d'abord %(by)s."],"The field %(field)s cannot hold the value it was given. Check what kind of field it is and enter a value that matches.":["Le champ %(field)s ne peut pas contenir la valeur qui lui a été donnée. Vérifiez de quel genre de champ il s'agit et saisissez une valeur qui convient."],"The field %(field)s has to hold a value before this item can be published. Fill it in, or leave the item as a draft.":["Le champ %(field)s doit contenir une valeur avant que cet élément puisse être publié. Remplissez-le, ou laissez l'élément en brouillon."],"The field %(field)s in %(group)s still points at this content type. Delete that field first, then delete this type.":["Le champ %(field)s dans %(group)s vise encore ce type de contenu. Supprimez d'abord ce champ, puis supprimez ce type."],"The field %(field)s is hidden by its own rules right now, so it cannot hold a value. Show it again before filling it in.":["Le champ %(field)s est masqué par ses propres règles pour le moment, il ne peut donc contenir aucune valeur. Affichez-le de nouveau avant de le remplir."],"The field %(field)s points at one item only. Remove the extra choices and keep one.":["Le champ %(field)s ne vise qu'un seul élément. Retirez les choix en trop et gardez-en un."],"The field %(field)s points at other items, so it does not take a plain value. Pick the items it points at instead.":["Le champ %(field)s vise d'autres éléments, il n'accepte donc pas une valeur simple. Choisissez plutôt les éléments qu'il vise."],"The field %(field)s takes a list of items, and what arrived was not a list. Reload the page and pick the items again.":["Le champ %(field)s attend une liste d'éléments, et ce qui est arrivé n'était pas une liste. Rechargez la page et choisissez de nouveau les éléments."],"The field %(source)s cannot hold the value %(value)s, so no rule can compare it. Write a value of the kind %(source)s stores.":["Le champ %(source)s ne peut pas contenir la valeur %(value)s, aucune règle ne peut donc la comparer. Écrivez une valeur du type que %(source)s enregistre."],"The field groups could not be loaded.":["Les groupes de champs n'ont pas pu être chargés."],"The field groups could not be reached.":["Les groupes de champs n'ont pas pu être joints."],"The field keeps its values on the content both groups reach.":["Le champ garde ses valeurs sur le contenu que les deux groupes atteignent."],"The fields this group holds go with it, and so do the values every item stored in them.":["Les champs que ce groupe contient partent avec lui, ainsi que les valeurs que chaque élément y a enregistrées."],"The groups were reordered.":["Les groupes ont été réordonnés."],"The item could not be duplicated.":["L'élément n'a pas pu être dupliqué."],"The item could not be moved to the trash.":["L'élément n'a pas pu être déplacé dans la corbeille."],"The item could not be permanently deleted.":["L'élément n'a pas pu être supprimé définitivement."],"The item could not be restored.":["L'élément n'a pas pu être rétabli."],"The item you picked as parent holds another kind of content. Pick a parent of the same content type as this item.":["L'élément que vous avez choisi comme parent contient un autre genre de contenu. Choisissez un parent du même type de contenu que cet élément."],"The item you picked as parent is in the trash. Restore it, or pick another parent.":["L'élément que vous avez choisi comme parent est dans la corbeille. Rétablissez-le, ou choisissez un autre parent."],"The item you picked as parent no longer exists. Reload the page and pick another parent.":["L'élément que vous avez choisi comme parent n'existe plus. Rechargez la page et choisissez un autre parent."],"The media library could not be loaded.":["La bibliothèque de médias n'a pas pu être chargée."],"The name changes. Nothing stored under this field moves.":["Le nom change. Rien de ce qui est stocké sous ce champ ne bouge."],"The name could not be updated.":["Le nom n'a pas pu être mis à jour."],"The new order has to name every field group exactly once. Reload the page and move the groups again.":["Le nouvel ordre doit nommer chaque groupe de champs exactement une fois. Rechargez la page et déplacez les groupes à nouveau."],"The new order has to name every field of this content type exactly once. Reload the page and move the fields again.":["Le nouvel ordre doit nommer chaque champ de ce type de contenu exactement une fois. Rechargez la page et déplacez les champs à nouveau."],"The number of revisions to keep has to be a whole number, and it cannot be negative. Enter a different number.":["Le nombre de révisions à conserver doit être un nombre entier, et il ne peut pas être négatif. Saisissez un autre nombre."],"The registry could not be reached.":["Le registre n'a pas pu être joint."],"The role could not be changed.":["Le rôle n'a pas pu être modifié."],"The rule on %(source)s names nothing to match. Pick a value, or remove the rule.":["La règle sur %(source)s ne nomme rien à faire correspondre. Choisissez une valeur, ou retirez la règle."],"The rules could not be loaded.":["Les règles n'ont pas pu être chargées."],"The rules on %(field)s lead back to %(field)s itself, so nothing can decide whether to show it. Point one of them at another field.":["Les règles de %(field)s reviennent à %(field)s lui-même, rien ne peut donc décider de l'afficher. Faites pointer l'une d'elles vers un autre champ."],"The same item was picked twice for %(field)s. Pick each item once.":["Le même élément a été choisi deux fois pour %(field)s. Choisissez chaque élément une seule fois."],"The server could not be reached, so nothing was changed.":["Le serveur n'a pas pu être joint, rien n'a donc été changé."],"The server could not be reached, so nothing was saved.":["Le serveur n'a pas pu être joint, rien n'a donc été enregistré."],"The server could not be reached, so nothing was uploaded.":["Le serveur n'a pas pu être joint, rien n'a donc été téléversé."],"The setting %(setting)s cannot hold the value it was given. Check what this setting takes and try again.":["Le réglage %(setting)s ne peut pas contenir la valeur donnée. Vérifiez ce que ce réglage accepte et réessayez."],"The setting %(setting)s falls outside the others. Keep min below max and the default inside the bounds.":["Le réglage %(setting)s sort des autres. Gardez min sous max et la valeur par défaut dans les limites."],"The settings could not be read, so nothing can be changed here yet.":["Les réglages n'ont pas pu être lus, donc rien ne peut encore être modifié ici."],"The site default":["La langue par défaut du site"],"The site may already hold part of this file. Import it again to see what is left.":["Le site contient peut-être déjà une partie de ce fichier. Importez-le à nouveau pour voir ce qu'il reste."],"The source %(source)s does not offer %(operator)s. Pick one of the comparisons it does offer.":["La source %(source)s n'offre pas %(operator)s. Choisissez une des comparaisons qu'elle offre."],"The theme %(name)s carries no %(file)s, so Gophenberg cannot tell what it is. Put that file at the top level of the zip and package the theme again.":["Le thème %(name)s ne contient aucun %(file)s, Gophenberg ne peut donc pas savoir ce que c'est. Placez ce fichier au premier niveau du zip et réempaquetez le thème."],"The theme %(name)s could not be read, so it cannot serve your site. Upload it again, or choose another theme.":["Le thème %(name)s n'a pas pu être lu, il ne peut donc pas servir votre site. Téléversez-le de nouveau, ou choisissez un autre thème."],"The theme %(name)s did not start, so your site is still served by the theme it had. Ask whoever looks after your site to check the server log for what the theme reported.":["Le thème %(name)s n'a pas démarré, votre site est donc toujours servi par le thème qu'il avait. Demandez à la personne qui s'occupe de votre site de regarder ce que le thème a signalé dans le journal du serveur."],"The theme %(name)s does not carry %(path)s as a file, so there is nothing to run. Package the built theme rather than its source.":["Le thème %(name)s ne contient pas %(path)s comme fichier, il n'y a donc rien à exécuter. Empaquetez le thème construit plutôt que sa source."],"The theme %(name)s does not carry %(path)s as a folder, so its styles and scripts are missing. Package the built theme rather than its source.":["Le thème %(name)s ne contient pas %(path)s comme dossier, ses styles et ses scripts manquent donc. Empaquetez le thème construit plutôt que sa source."],"The theme %(name)s holds a link to another file at %(path)s, and a theme may only carry real files. Replace it and package the theme again.":["Le thème %(name)s contient un lien vers un autre fichier à %(path)s, et un thème ne peut contenir que de vrais fichiers. Remplacez-le et réempaquetez le thème."],"The theme %(name)s is serving your site right now, so it cannot be replaced. Deactivate it first, or install this copy under another name.":["Le thème %(name)s sert votre site en ce moment, il ne peut donc pas être remplacé. Désactivez-le d'abord, ou installez cette copie sous un autre nom."],"The theme %(name)s is the one chosen, but it is not installed, so your site is served by the built-in renderer. Upload the theme again, or choose another one.":["Le thème %(name)s est celui choisi, mais il n'est pas installé, votre site est donc servi par le moteur de rendu intégré. Téléversez de nouveau le thème, ou choisissez-en un autre."],"The theme %(name)s was built on theme kit %(declared)s, and this site serves %(served)s. Build the theme again against a kit this site serves, then install it.":["Le thème %(name)s a été compilé avec le kit de thèmes %(declared)s, et ce site sert %(served)s. Compilez le thème à nouveau avec un kit que ce site sert, puis installez-le."],"The trash could not be emptied.":["La corbeille n'a pas pu être vidée."],"The user could not be created.":["L'utilisateur n'a pas pu être créé."],"The values stored under it do not follow.":["Les valeurs enregistrées dessous ne le suivent pas."],"Theme":["Thème"],"Themes":["Thèmes"],"Themes could not be loaded.":["Les thèmes n'ont pas pu être chargés."],"There is no content type called %(value)s. Pick a type your site holds, or register it first.":["Il n'existe aucun type de contenu appelé %(value)s. Choisissez un type que votre site possède, ou déclarez-le d'abord."],"There is no content type called %(value)s. Pick one of the types your site holds and try again.":["Il n'existe aucun type de contenu appelé %(value)s. Choisissez un des types que votre site possède et réessayez."],"There is no kind of field called %(value)s. Pick one of these instead: %(allowed)s.":["Il n'existe aucun genre de champ appelé %(value)s. Choisissez plutôt parmi ceux-ci : %(allowed)s."],"There is no page kind called %(value)s. Pick one of these instead: %(allowed)s.":["Il n'existe aucun genre de page appelé %(value)s. Choisissez plutôt parmi ceux-ci : %(allowed)s."],"There is no status called %(value)s. Pick one of these instead: %(allowed)s.":["Il n'existe aucun état appelé %(value)s. Choisissez plutôt parmi ceux-ci : %(allowed)s."],"There is nothing at this address. Check the link and try again.":["Il n'y a rien à cette adresse. Vérifiez le lien et réessayez."],"There is nothing to roll back to, because your site has not been through a theme change yet. Install a theme first, then a rollback has somewhere to go.":["Il n'y a rien vers quoi revenir, car votre site n'a pas encore changé de thème. Installez d'abord un thème, et le retour aura alors une destination."],"These files could not be read.":["Ces fichiers n'ont pas pu être lus."],"These were left alone, because nobody confirmed losing them.":["Ceux-ci ont été laissés tels quels, car personne n'a confirmé leur perte."],"This content type does not exist any more. Reload the page to see the types your site holds now.":["Ce type de contenu n'existe plus. Rechargez la page pour voir les types que votre site possède maintenant."],"This content type does not nest, so one of its items cannot sit inside another. Mark the type as Nests first.":["Ce type de contenu ne s'imbrique pas, un de ses éléments ne peut donc pas se trouver dans un autre. Marquez d'abord le type comme Imbriqué."],"This content type has no field called %(field)s. Check the name, or declare the field on the type first.":["Ce type de contenu n'a aucun champ appelé %(field)s. Vérifiez le nom, ou déclarez d'abord le champ sur le type."],"This content type is turned off, so its content is not served or edited. Activate it first.":["Ce type de contenu est désactivé, son contenu n'est donc ni servi ni modifié. Activez-le d'abord."],"This content type still holds content, so it cannot be deleted. Move or delete its items first.":["Ce type de contenu contient encore du contenu, il ne peut donc pas être supprimé. Déplacez ou supprimez d'abord ses éléments."],"This definitions file is larger than the %(max)s bytes Gophenberg reads in one request. Split it, or raise the limit your site runs with.":["Ce fichier de définitions dépasse les %(max)s octets que Gophenberg lit en une requête. Divisez-le, ou relevez la limite de votre site."],"This field holds no layouts yet.":["Ce champ ne contient pas encore de dispositions."],"This field would stand inside too many containers. Put it nearer the top and try again.":["Ce champ se trouverait dans trop de conteneurs. Placez-le plus près du niveau supérieur et réessayez."],"This file could not be opened as a zip. Package the theme again and upload the new file.":["Ce fichier n'a pas pu être ouvert comme zip. Réempaquetez le thème et téléversez le nouveau fichier."],"This file is larger than the upload limit. Upload a smaller file.":["Ce fichier dépasse la limite de téléversement. Téléversez un fichier plus petit."],"This file is named %(extension)s but it holds %(detected)s content. Upload it under a name that matches what is inside it.":["Ce fichier est nommé %(extension)s mais il contient du %(detected)s. Téléversez-le sous un nom qui correspond à ce qu'il contient."],"This file matches the site, so there is nothing to change.":["Ce fichier correspond au site, il n'y a donc rien à changer."],"This file says it was written in format %(declared)s, which is not a version Gophenberg can read. Export the definitions again from the site they came from.":["Ce fichier indique le format %(declared)s, qui n'est pas une version que Gophenberg sait lire. Exportez à nouveau les définitions depuis le site d'origine."],"This file was written in format %(declared)s, and this release reads %(served)s. Upgrade the site the file came from, or this one.":["Ce fichier est écrit au format %(declared)s, et cette version lit %(served)s. Mettez à jour le site d'origine du fichier, ou celui-ci."],"This group holds no fields yet.":["Ce groupe ne contient pas encore de champs."],"This install of Gophenberg has no install root, so it updates by hand.":["Cette installation de Gophenberg n'a pas de racine d'installation, elle se met donc à jour à la main."],"This is a custom build of Gophenberg, so it updates by hand.":["Il s'agit d'une version compilée sur mesure de Gophenberg, elle se met donc à jour à la main."],"This item cannot go straight to that status from the one it holds now. Save it as a draft first, then try again.":["Cet élément ne peut pas passer directement à cet état depuis celui qu'il a maintenant. Enregistrez-le d'abord comme brouillon, puis réessayez."],"This item changed while you were describing it. Reload and try again.":["Cet élément a changé pendant que vous le décriviez. Rechargez et réessayez."],"This item does not exist, and it may have been deleted. Go back to the list to see what is there.":["Cet élément n'existe pas, et il a peut-être été supprimé. Revenez à la liste pour voir ce qui s'y trouve."],"This item is already in the trash. Restore it first to work on it again.":["Cet élément est déjà dans la corbeille. Rétablissez-le d'abord pour y retravailler."],"This item is in the trash. Restore it first to work on it again.":["Cet élément est dans la corbeille. Rétablissez-le d'abord pour y retravailler."],"This item is not in the trash, so there is nothing to restore. Open it from the list to work on it as it is.":["Cet élément n'est pas dans la corbeille, il n'y a donc rien à rétablir. Ouvrez-le depuis la liste pour travailler dessus tel quel."],"This item still holds items nested inside it. Move or delete those first.":["Cet élément contient encore des éléments imbriqués. Déplacez-les ou supprimez-les d'abord."],"This kind of field holds no fields inside it. Put the field in a section or a repeater instead.":["Ce type de champ ne contient aucun champ. Placez le champ dans une section ou dans un répéteur."],"This media item is not in the library, and someone may have deleted it. Reload the page to see what is there now.":["Ce média n'est pas dans la bibliothèque, et quelqu'un l'a peut-être supprimé. Rechargez la page pour voir ce qui s'y trouve maintenant."],"This picture could not be read, so nothing was stored. The file may be damaged, so open it on your computer and upload it again.":["Cette image n'a pas pu être lue, rien n'a donc été stocké. Le fichier est peut-être endommagé, ouvrez-le sur votre ordinateur et téléversez-le de nouveau."],"This picture is %(width)s by %(height)s pixels, over the limit of %(max)s pixels in all. Make it smaller and upload it again.":["Cette image fait %(width)s par %(height)s pixels, au-delà de la limite de %(max)s pixels au total. Réduisez-la et téléversez-la de nouveau."],"This post changed elsewhere. Reload before saving again.":["Cet article a changé ailleurs. Rechargez avant d'enregistrer de nouveau."],"This request came from a page on another site, so it was refused. Open the admin on this site and try again.":["Cette requête vient d'une page d'un autre site, elle a donc été refusée. Ouvrez l'administration sur ce site et réessayez."],"This request carried %(attribute)s, which fields do not take. Reload the page so the admin and the server agree again.":["Cette requête portait %(attribute)s, que les champs n'acceptent pas. Rechargez la page pour que l'administration et le serveur concordent à nouveau."],"This request left out %(field)s, which Gophenberg needs. Reload the page and try again.":["Cette requête a omis %(field)s, dont Gophenberg a besoin. Rechargez la page et réessayez."],"This rule reads a source called %(source)s, and nothing on your site declares one. A plugin that added it may have been removed.":["Cette règle lit une source nommée %(source)s, et rien sur votre site n'en déclare. Une extension qui l'ajoutait a pu être retirée."],"This site cannot write to its themes folder, so no theme can be installed. Ask whoever looks after your site to make the folder that %(setting)s points at writable. A read-only mount is the usual cause.":["Ce site ne peut pas écrire dans son dossier de thèmes, aucun thème ne peut donc être installé. Demandez à la personne qui s'occupe de votre site de rendre accessible en écriture le dossier vers lequel pointe %(setting)s. Un montage en lecture seule en est la cause habituelle."],"This site has nowhere to keep themes, so no theme can be installed. Ask whoever looks after your site to point %(setting)s at a folder the server can write to.":["Ce site n'a nulle part où garder les thèmes, aucun thème ne peut donc être installé. Demandez à la personne qui s'occupe de votre site de faire pointer %(setting)s vers un dossier où le serveur peut écrire."],"This site has nowhere to store uploads, so nothing can be uploaded. Ask whoever looks after your site to point %(setting)s at a folder the server can write to.":["Ce site n'a nulle part où stocker les téléversements, rien ne peut donc être téléversé. Demandez à la personne qui s'occupe de votre site de faire pointer %(setting)s vers un dossier où le serveur peut écrire."],"This theme is over the limit of %(max)s bytes, packed or unpacked. Leave out what the theme does not need and package it again.":["Ce thème dépasse la limite de %(max)s octets, compressé ou non. Retirez ce dont le thème n'a pas besoin et réempaquetez-le."],"This type will answer under /%(word)s.":["Ce type répondra sous /%(word)s."],"This zip holds %(entries)s files, more than the %(max)s a theme may carry. Package only the built theme.":["Ce zip contient %(entries)s fichiers, plus que les %(max)s qu'un thème peut contenir. Empaquetez seulement le thème construit."],"Through":["Via"],"Thumbnail":["Miniature"],"Title":["Titre"],"Two field groups in this file share the key %(key)s. Give one of them a different key and import again.":["Deux groupes de champs de ce fichier partagent la clé %(key)s. Donnez une clé différente à l'un d'eux et importez à nouveau."],"Two rule sources are registered under the name %(param)s. A plugin is declaring a source your site already holds.":["Deux sources de règles sont enregistrées sous le nom %(param)s. Une extension déclare une source que votre site possède déjà."],"Type":["Type"],"Type a whole number in both boxes before saving.":["Saisissez un nombre entier dans les deux cases avant d'enregistrer."],"Undo":["Annuler"],"Unsaved changes":["Modifications non enregistrées"],"Update":["Mettre à jour"],"Update failed.":["La mise à jour a échoué."],"Upload theme":["Téléverser un thème"],"Uploaded %s file.":["%s fichier téléversé.","%s fichiers téléversés.","%s fichiers téléversés."],"Users":["Utilisateurs"],"Users could not be loaded.":["Les utilisateurs n'ont pas pu être chargés."],"Value":["Valeur"],"Version":["Version"],"Videos":["Vidéos"],"Visit Site":["Aller sur le site"],"Web address":["Adresse web"],"What each Linked from field reads":["Ce que lit chaque champ Lié depuis"],"What it points at changed, so its stored values go with it.":["Ce qu'il vise a changé, donc ses valeurs enregistrées partent avec lui."],"Where %(group)s appears":["Où apparaît %(group)s"],"Without a rule this field always shows.":["Sans aucune règle ce champ s'affiche toujours."],"Without a rule this group appears nowhere.":["Sans une règle ce groupe n'apparaît nulle part."],"Yes":["Oui"],"Yes or no":["Oui ou non"],"You cannot change your own role.":["Vous ne pouvez pas changer votre propre rôle."],"Your language":["Votre langue"],"Your role does not allow %(capability)s.":["Votre rôle ne permet pas %(capability)s."],"Your server pins the site to the theme %(name)s, so themes cannot be changed here. Ask whoever looks after your site to remove the pin.":["Votre serveur fixe le site au thème %(name)s, les thèmes ne peuvent donc pas être changés ici. Demandez à la personne qui s'occupe de votre site de retirer cette fixation."],"Your site always needs one default content type, so this one cannot be turned off or deleted. Make another type the default first.":["Votre site a toujours besoin d'un type de contenu par défaut, celui-ci ne peut donc être ni désactivé ni supprimé. Rendez d'abord un autre type par défaut."],"a content type":["un type de contenu"],"account\u0004Role":["Rôle"],"account\u0004Status":["État"],"action label\u0004Duplicate":["Dupliquer"],"action label\u0004Duplicate…":["Dupliquer…"],"address":["adresse"],"admin section\u0004Content Types":["Types de contenu"],"admin section\u0004Field Groups":["Groupes de champs"],"admin section\u0004Language":["Langue"],"admin section\u0004Media":["Médias"],"admin section\u0004Settings":["Réglages"],"admin section\u0004Themes":["Thèmes"],"column\u0004Date":["Date"],"content type\u0004\"%s\" permanently deleted.":["Type de contenu « %s » supprimé définitivement."],"content type\u0004\"%s\" successfully created.":["Type de contenu « %s » créé avec succès."],"content type\u0004Status":["État"],"field\u0004Name":["Nom"],"field group\u0004Status":["Statut"],"field type\u0004Choice":["Choix"],"field type\u0004Color":["Couleur"],"field type\u0004Date":["Date"],"field type\u0004Flexible content":["Contenu flexible"],"field type\u0004Gallery":["Galerie"],"field type\u0004Kind":["Genre"],"field type\u0004Layout":["Disposition"],"field type\u0004Link":["Lien"],"field type\u0004Media":["Média"],"field type\u0004Range":["Plage"],"field type\u0004Repeater":["Répéteur"],"field type\u0004Section":["Section"],"field type\u0004Select":["Liste déroulante"],"holds":["contient"],"holds anything":["contient quelque chose"],"is":["est"],"is above":["est supérieur à"],"is below":["est inférieur à"],"is empty":["est vide"],"is not":["n'est pas"],"media family\u0004Kind":["Type"],"panel button label\u0004Settings":["Réglages"],"person\u0004Name":["Nom"],"post\u0004%s (Copy)":["%s (copie)"],"post\u0004Status":["État"],"post status\u0004Draft":["Brouillon"],"post status\u0004Published":["Publié"],"post status\u0004Trash":["Corbeille"],"post type general name\u0004Pages":["Pages"],"post type general name\u0004Posts":["Articles"],"post type singular name\u0004Page":["Page"],"post type singular name\u0004Post":["Article"],"relation target\u0004None":["Aucun"],"role\u0004Administrator":["Administrateur"],"role\u0004Author":["Auteur"],"role\u0004Editor":["Éditeur"],"role\u0004Member":["Membre"],"role\u0004No role":["Sans rôle"],"status filter\u0004All":["Tout"],"taxonomy general name\u0004Categories":["Catégories"],"taxonomy singular name\u0004Category":["Catégorie"],"theme\u0004Status":["État"],"trash\u0004Restore":["Rétablir"],"v%(version)s":["v%(version)s"],"verb\u0004Trash…":["Mettre à la corbeille…"],"verb\u0004View":["Voir"],"{day} {month} {year}":["{day} {month} {year}"]} diff --git a/languages/es-ES.po b/languages/es-ES.po index 0f868ef6..0d0f4e8b 100644 --- a/languages/es-ES.po +++ b/languages/es-ES.po @@ -329,9 +329,6 @@ msgstr "Mover todas las direcciones" msgid "Move to trash" msgstr "Mover a la papelera" -msgid "Navigation" -msgstr "Navegación" - msgid "Nests" msgstr "Anida" @@ -410,9 +407,6 @@ msgstr "Aquí solo se puede colocar un archivo." msgid "Only the content type at the root of your site may go without a route word. Give this type one and try again." msgstr "Solo el tipo de contenido que está en la raíz de tu sitio puede ir sin palabra de ruta de URL. Dale una a este tipo e inténtalo de nuevo." -msgid "Open navigation" -msgstr "Abrir la navegación" - msgid "Parent" msgstr "Elemento superior" @@ -2163,10 +2157,32 @@ msgctxt "account" msgid "Role" msgstr "Rol" +msgctxt "admin section" +msgid "Content Types" +msgstr "Tipos de contenido" + +#, fuzzy +msgctxt "admin section" +msgid "Field Groups" +msgstr "Grupos de campos" + +msgctxt "admin section" +msgid "Language" +msgstr "Idioma" + msgctxt "admin section" msgid "Media" msgstr "Medios" +#, fuzzy +msgctxt "admin section" +msgid "Settings" +msgstr "Ajustes" + +msgctxt "admin section" +msgid "Themes" +msgstr "Temas" + msgctxt "column" msgid "Date" msgstr "Fecha" diff --git a/languages/fr-FR.po b/languages/fr-FR.po index 333faa7d..1e1704d6 100644 --- a/languages/fr-FR.po +++ b/languages/fr-FR.po @@ -753,10 +753,6 @@ msgstr "Déplacer le champ" msgid "Move to trash" msgstr "Déplacer dans la corbeille" -#, fuzzy -msgid "Navigation" -msgstr "Navigation" - #, fuzzy msgid "Nests" msgstr "Imbriqué" @@ -881,10 +877,6 @@ msgstr "Un seul fichier peut être placé ici." msgid "Only the content type at the root of your site may go without a route word. Give this type one and try again." msgstr "Seul le type de contenu à la racine de votre site peut se passer de mot de route. Donnez-en un à ce type et réessayez." -#, fuzzy -msgid "Open navigation" -msgstr "Ouvrir la navigation" - #, fuzzy msgid "Open %(field)s in a new tab" msgstr "Ouvrir %(field)s dans un nouvel onglet" @@ -1770,11 +1762,36 @@ msgctxt "account" msgid "Status" msgstr "État" +#, fuzzy +msgctxt "admin section" +msgid "Content Types" +msgstr "Types de contenu" + +#, fuzzy +msgctxt "admin section" +msgid "Field Groups" +msgstr "Groupes de champs" + +#, fuzzy +msgctxt "admin section" +msgid "Language" +msgstr "Langue" + #, fuzzy msgctxt "admin section" msgid "Media" msgstr "Médias" +#, fuzzy +msgctxt "admin section" +msgid "Settings" +msgstr "Réglages" + +#, fuzzy +msgctxt "admin section" +msgid "Themes" +msgstr "Thèmes" + #, fuzzy msgctxt "column" msgid "Date" diff --git a/languages/gophenberg.pot b/languages/gophenberg.pot index 78fa2a00..dad878c4 100644 --- a/languages/gophenberg.pot +++ b/languages/gophenberg.pot @@ -1038,9 +1038,6 @@ msgstr "" msgid "Name updated." msgstr "" -msgid "Navigation" -msgstr "" - msgid "Nests" msgstr "" @@ -1161,9 +1158,6 @@ msgstr "" msgid "Open %(field)s in a new tab" msgstr "" -msgid "Open navigation" -msgstr "" - msgid "Order stored." msgstr "" @@ -1940,10 +1934,30 @@ msgctxt "action label" msgid "Duplicate…" msgstr "" +msgctxt "admin section" +msgid "Content Types" +msgstr "" + +msgctxt "admin section" +msgid "Field Groups" +msgstr "" + +msgctxt "admin section" +msgid "Language" +msgstr "" + msgctxt "admin section" msgid "Media" msgstr "" +msgctxt "admin section" +msgid "Settings" +msgstr "" + +msgctxt "admin section" +msgid "Themes" +msgstr "" + msgctxt "column" msgid "Date" msgstr "" From d821ecf3b3d26908ad2b562852303275df9e01ef Mon Sep 17 00:00:00 2001 From: SirLouen Date: Fri, 23 Oct 2026 15:18:05 +0200 Subject: [PATCH 8/9] docs(extending): describe the sidebar rows, sub menus and menu icons for plugins --- .../contributing/add-a-translatable-string.md | 2 +- .../content/docs/extending/the-plugin-sdk.md | 82 +++++++++++++++++-- 2 files changed, 76 insertions(+), 8 deletions(-) diff --git a/docs/src/content/docs/contributing/add-a-translatable-string.md b/docs/src/content/docs/contributing/add-a-translatable-string.md index 01d7fc4f..cbff2d6e 100644 --- a/docs/src/content/docs/contributing/add-a-translatable-string.md +++ b/docs/src/content/docs/contributing/add-a-translatable-string.md @@ -94,7 +94,7 @@ The fix is to read the string when it is used rather than when the file loads. ```tsx -export const mediaNavItem = { +export const mediaMenuItem = { get label() { return _x('Media', 'admin section', 'gophenberg') }, diff --git a/docs/src/content/docs/extending/the-plugin-sdk.md b/docs/src/content/docs/extending/the-plugin-sdk.md index 3815b195..cab2c321 100644 --- a/docs/src/content/docs/extending/the-plugin-sdk.md +++ b/docs/src/content/docs/extending/the-plugin-sdk.md @@ -461,10 +461,12 @@ export const plugin = { ``` `make generate` wires it in: routes mount inside the admin layout -and nav rows appear after the built-in ones. No built-in plugin -uses this path yet, so expect to be the first through it. +and the rows of `nav` appear in the sidebar after the built-in ones. +Each row is a `MenuItem`: the `label` it shows, the address `to`, and +an optional `icon` and `capability`. No built-in plugin uses this path +yet, so expect to be the first through it. -A nav row naming a `capability` shows only to an account whose role +A row naming a `capability` shows only to an account whose role carries it. The screen still opens from a pasted link, so the Go routes your plugin serves must check `session.Can` themselves, as [the signed-in account](#the-signed-in-account) shows. In the @@ -479,12 +481,72 @@ const session = useSession().data const manages = can(session, 'hello.manage') ``` +A row can open a sub menu of its own, as the Site Editor's Navigation +row opens the list of menus. Give the route a `staticData.Sidebar` +component that draws a `NavigationScreen`. The admin swaps the main +menu for it, slides it in, and puts Back at its top, which leads to +the list the admin opens on. Put its rows in a `NavigationList`, each +one a `NavigationItem`. A sub menu on a parent route stays while the +reader moves between the screens under it: + +```tsx +import { NavigationItem, NavigationList, NavigationScreen } from '@gophenberg/frontend-sdk' +import { createRoute } from '@tanstack/react-router' + +function HelloSidebar() { + return ( + + + Drafts + Archive + + + ) +} + +const helloRoute = createRoute({ + getParentRoute: () => parent, + path: '/hello', + staticData: { Sidebar: HelloSidebar }, +}) +``` + +Leave out the screen's `back`, so Back goes where the admin's own sub +menus go. `NavigationList` also takes `items`, rows as `MenuItem` +data, and hides a row whose `capability` the reader lacks. A +`NavigationItem` hides itself when its address opens a route the +reader may not open. `DrilldownItem` draws a row that opens a further +sub menu, with a chevron, and `MenuCount` draws a number at the end of +a row, such as the updates waiting. + +`renderPluginAt` from `@gophenberg/frontend-sdk/testing` mounts your +plugin inside the admin's real sidebar, with Back, the focus moves and +the phone drawer. Pass `session` to seed the account a test reads, or +`null` for none. A row that names a `capability` shows only when that +account carries it. Leave `session` out and the test asks the server +for the account at `/api/auth/session`, so serve that address with +`http` and `server` from the same entry. + +**To move** a plugin written for Gophenberg v0.19.0 or earlier: + +1. Replace the type `NavItem` with `MenuItem` from + `@gophenberg/frontend-sdk`. `NavItem` is gone, with no alias. +2. If a route declares `staticData.Sidebar`, draw it as a + `NavigationScreen` with its rows in a `NavigationList`, so it gets + its title, Back and the focus the admin moves to it. +3. In a test through `renderPluginAt`, seed a session that carries + the capability a row names, or serve the session address. The test + host now hides a row the reader cannot open, and asks the server + for the session when the test seeds none. + The frontend SDK, `@gophenberg/frontend-sdk`, passes on a few icons from `@wordpress/icons`, each named after the job it does in the -admin: `authorIcon`, `backIcon`, `backupIcon`, `closeIcon`, -`downIcon`, `listViewIcon`, `mediaIcon`, `postIcon`, `redoIcon`, -`saveIcon`, `sidebarIcon`, `sidebarRtlIcon`, `trashIcon`, -`undoIcon`, `upIcon` and `uploadIcon`. `authorIcon` is the one an +admin: `authorIcon`, `backIcon`, `backupIcon`, `brushIcon`, +`categoryIcon`, `closeIcon`, `customPostTypeIcon`, `downIcon`, +`languageIcon`, `listIcon`, `listViewIcon`, `mediaIcon`, `pageIcon`, +`postIcon`, `redoIcon`, `saveIcon`, `settingsIcon`, `sidebarIcon`, +`sidebarRtlIcon`, `trashIcon`, `undoIcon`, `upIcon` and +`uploadIcon`. `authorIcon` is the one an author cell shows when the site shows no avatars, `postIcon` the one an empty content list shows, `mediaIcon` the one an empty media library shows, and `uploadIcon` the one an upload button carries. @@ -492,6 +554,12 @@ library shows, and `uploadIcon` the one an upload button carries. `sidebarRtlIcon` its mirror for a language written right to left. `saveIcon` is the one Save draft shows on a phone, and `closeIcon` the one a panel's close button carries. +The sidebar rows carry the icons WordPress draws for the same rows: +`postIcon` for Posts and every type a site adds, `pageIcon` for +Pages, `categoryIcon` for Categories, `mediaIcon` for Media, +`brushIcon` for Themes, `customPostTypeIcon` for Content Types, +`listIcon` for Field Groups, `languageIcon` for Language and +`settingsIcon` for Settings. Import them from the SDK, so the admin keeps one copy of the icon set: ```ts From cdad5e7fad69bece3021dbf2a50b5441532f36d2 Mon Sep 17 00:00:00 2001 From: SirLouen Date: Fri, 23 Oct 2026 20:08:05 +0200 Subject: [PATCH 9/9] docs(extending): declare the parent route in the plugin sub menu example --- .../content/docs/extending/the-plugin-sdk.md | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/docs/src/content/docs/extending/the-plugin-sdk.md b/docs/src/content/docs/extending/the-plugin-sdk.md index cab2c321..b13db584 100644 --- a/docs/src/content/docs/extending/the-plugin-sdk.md +++ b/docs/src/content/docs/extending/the-plugin-sdk.md @@ -492,6 +492,7 @@ reader moves between the screens under it: ```tsx import { NavigationItem, NavigationList, NavigationScreen } from '@gophenberg/frontend-sdk' import { createRoute } from '@tanstack/react-router' +import type { AnyRoute } from '@tanstack/react-router' function HelloSidebar() { return ( @@ -504,11 +505,17 @@ function HelloSidebar() { ) } -const helloRoute = createRoute({ - getParentRoute: () => parent, - path: '/hello', - staticData: { Sidebar: HelloSidebar }, -}) +export const plugin = { + id: 'hello', + routes: (parent: AnyRoute) => [ + createRoute({ + getParentRoute: () => parent, + path: '/hello', + staticData: { Sidebar: HelloSidebar }, + }), + ], + nav: [{ label: 'Hello', to: '/hello' }], +} ``` Leave out the screen's `back`, so Back goes where the admin's own sub