@eponyme/locale 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Karibsen Studio
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,117 @@
1
+ # @eponyme/locale
2
+
3
+ Dashboard interface translations for [Eponyme](https://github.com/karibsen-studio/eponyme).
4
+
5
+ Eponyme ships English only. This package carries the other languages, so a catalogue can be
6
+ corrected and released without waiting for a version of the core.
7
+
8
+ ## Install
9
+
10
+ ```bash
11
+ npm i -D @eponyme/locale
12
+ ```
13
+
14
+ ## Use
15
+
16
+ Import the language you want and call it. The result goes into `nuxt.config`:
17
+
18
+ ```ts
19
+ import { fr } from '@eponyme/locale/fr'
20
+
21
+ export default defineNuxtConfig({
22
+ eponyme: {
23
+ locale: fr(),
24
+ },
25
+ })
26
+ ```
27
+
28
+ One import per language, never an index: a single entry point would load every catalogue the
29
+ moment `nuxt.config` is evaluated.
30
+
31
+ The call matters. `locale: fr` passes the function itself and Eponyme refuses it at setup with a
32
+ message saying so.
33
+
34
+ ## Available languages
35
+
36
+ | Import | Language | `code` |
37
+ |---|---|---|
38
+ | `@eponyme/locale/es` | Spanish | `es-ES` |
39
+ | `@eponyme/locale/fr` | French | `fr-FR` |
40
+
41
+ `code` is handed to `Intl`, so dates, numbers and lists in the dashboard follow the same language
42
+ as the words around them.
43
+
44
+ ## Overrides
45
+
46
+ The argument replaces individual messages without forking the catalogue:
47
+
48
+ ```ts
49
+ locale: fr({
50
+ 'array.add': 'Ajouter un bloc',
51
+ 'collection.create': '+ Nouvel article',
52
+ }),
53
+ ```
54
+
55
+ The merge happens in the call, so what Eponyme receives is already resolved.
56
+
57
+ ## What happens to a missing key
58
+
59
+ Eponyme merges English underneath every catalogue. A key this package does not carry reads in
60
+ English rather than showing its own name, and the build says which ones:
61
+
62
+ ```
63
+ [eponyme] WARN The fr-FR catalogue is missing 2 keys, which fall back to English:
64
+ - select.empty
65
+ - field.color
66
+ ```
67
+
68
+ That warning is the point of keeping translations in their own release cycle: the core adds a key,
69
+ this package does not know yet, and nothing breaks in the meantime.
70
+
71
+ ## Adding a language
72
+
73
+ 1. Copy `src/en.json` — the reference catalogue, which Eponyme exposes at
74
+ `@karibsen/eponyme/locales/en.json` — to `src/<code>.json`.
75
+ 2. Translate the values. Never touch the keys.
76
+ 3. Add `src/<code>.ts` with the factory, and its `plural` rule if the language needs one.
77
+ 4. Add the entry to `build.config.ts` and the subpath to `exports` in `package.json`.
78
+ 5. Run `npm run check`, which fails when a catalogue has drifted from the reference.
79
+
80
+ ### Plural forms
81
+
82
+ A message with plural forms separates them with `|`, in this order: none, one, many.
83
+
84
+ ```json
85
+ {
86
+ "array.counterMax": "{count} / {max} elementos | {count} / {max} elemento | {count} / {max} elementos"
87
+ }
88
+ ```
89
+
90
+ `plural` maps a count to one of those three indices. The default is
91
+ `count => count === 0 ? 0 : count === 1 ? 1 : 2`, which is what French and Spanish use — what
92
+ differs between them is the wording of the zero form (`0 élément`, `0 elementos`), and that lives
93
+ in the catalogue, not in the rule.
94
+
95
+ A language that groups counts differently declares its own:
96
+
97
+ ```ts
98
+ export function ru(overrides: Record<string, string> = {}): EponymeLocaleDefinition {
99
+ return {
100
+ code: 'ru-RU',
101
+ messages: { ...messages, ...overrides },
102
+ plural: count => (count % 10 === 1 && count % 100 !== 11 ? 0 : 1),
103
+ }
104
+ }
105
+ ```
106
+
107
+ `plural` is serialised into the generated catalogue with `Function.prototype.toString()`, so **it
108
+ must stand alone**: a closure over anything outside the function does not survive the crossing.
109
+
110
+ ### Placeholders
111
+
112
+ `{name}` is replaced from the parameters Eponyme passes. Keep every placeholder a message has —
113
+ one that is dropped shows as literal `{count}` in the interface.
114
+
115
+ ## Licence
116
+
117
+ MIT
package/dist/es.d.mts ADDED
@@ -0,0 +1,23 @@
1
+ import { EponymeLocaleDefinition } from '@karibsen/eponyme';
2
+
3
+ /**
4
+ * The dashboard interface in Spanish.
5
+ *
6
+ * A function rather than a plain object so a project can override a wording without forking the
7
+ * catalogue. The merge happens here, so what the module receives is already resolved.
8
+ *
9
+ * ```ts
10
+ * import { es } from '@eponyme/locale/es'
11
+ *
12
+ * export default defineNuxtConfig({
13
+ * eponyme: { locale: es({ 'array.add': 'Añadir un bloque' }) },
14
+ * })
15
+ * ```
16
+ *
17
+ * No `plural`: Spanish selects the same three forms as the default rule. It differs from English
18
+ * in that nought takes the plural — `0 elementos`, not `0 elemento` — and that is a matter of
19
+ * wording, which lives in `es.json`, not of which form is chosen.
20
+ */
21
+ declare function es(overrides?: Record<string, string>): EponymeLocaleDefinition;
22
+
23
+ export { es };
package/dist/es.d.ts ADDED
@@ -0,0 +1,23 @@
1
+ import { EponymeLocaleDefinition } from '@karibsen/eponyme';
2
+
3
+ /**
4
+ * The dashboard interface in Spanish.
5
+ *
6
+ * A function rather than a plain object so a project can override a wording without forking the
7
+ * catalogue. The merge happens here, so what the module receives is already resolved.
8
+ *
9
+ * ```ts
10
+ * import { es } from '@eponyme/locale/es'
11
+ *
12
+ * export default defineNuxtConfig({
13
+ * eponyme: { locale: es({ 'array.add': 'Añadir un bloque' }) },
14
+ * })
15
+ * ```
16
+ *
17
+ * No `plural`: Spanish selects the same three forms as the default rule. It differs from English
18
+ * in that nought takes the plural — `0 elementos`, not `0 elemento` — and that is a matter of
19
+ * wording, which lives in `es.json`, not of which form is chosen.
20
+ */
21
+ declare function es(overrides?: Record<string, string>): EponymeLocaleDefinition;
22
+
23
+ export { es };
package/dist/es.mjs ADDED
@@ -0,0 +1,348 @@
1
+ import { g as getDefaultExportFromCjs } from './shared/locale.B85MJLTf.mjs';
2
+
3
+ var es$1;
4
+ var hasRequiredEs;
5
+
6
+ function requireEs () {
7
+ if (hasRequiredEs) return es$1;
8
+ hasRequiredEs = 1;
9
+ es$1 = {
10
+ "action.delete": "Eliminar",
11
+ "array.add": "Añadir elemento",
12
+ "array.drag": "Arrastra para reordenar",
13
+ "array.move": "Mover {item}",
14
+ "array.remove": "Quitar {item}",
15
+ "array.delete": "Eliminar {item}",
16
+ "array.counterMin": "{count} elementos · mín. {min} | {count} elemento · mín. {min} | {count} elementos · mín. {min}",
17
+ "array.counterMax": "{count} / {max} elementos | {count} / {max} elemento | {count} / {max} elementos",
18
+ "array.counterMinMax": "{count} / {max} elementos · mín. {min} | {count} / {max} elemento · mín. {min} | {count} / {max} elementos · mín. {min}",
19
+ "select.search": "Buscar entre las opciones",
20
+ "select.searchPlaceholder": "Buscar…",
21
+ "select.empty": "Sin resultados.",
22
+ "field.required": "Este campo es obligatorio.",
23
+ "field.custom": "La validación personalizada ha fallado.",
24
+ "field.object": "Debe ser un objeto.",
25
+ "field.array": "Debe ser una lista.",
26
+ "field.string": "Debe ser una cadena de texto.",
27
+ "field.number": "Debe ser un número.",
28
+ "field.boolean": "Debe ser un booleano.",
29
+ "field.unknown": "Campo desconocido.",
30
+ "field.unknownTab": "Pestaña desconocida.",
31
+ "field.pattern": "El formato no es válido.",
32
+ "field.minItems": "Debe contener al menos {min} elementos.",
33
+ "field.maxItems": "Debe contener como máximo {max} elementos.",
34
+ "field.minLength": "Debe contener al menos {min} caracteres.",
35
+ "field.maxLength": "Debe contener como máximo {max} caracteres.",
36
+ "field.min": "Debe ser como mínimo {min}.",
37
+ "field.max": "Debe ser como máximo {max}.",
38
+ "field.tagsNotEmpty": "Solo puede contener etiquetas no vacías.",
39
+ "field.optionsOnly": "Solo puede contener opciones disponibles.",
40
+ "field.option": "Debe ser una de las opciones disponibles.",
41
+ "field.date": "Debe ser una fecha válida.",
42
+ "field.dateMin": "Debe ser igual o posterior a {min}.",
43
+ "field.dateMax": "Debe ser igual o anterior a {max}.",
44
+ "field.email": "Debe ser una dirección de correo válida.",
45
+ "field.color": "Debe ser un color hexadecimal válido.",
46
+ "field.slug": "Solo puede contener minúsculas, números y guiones simples.",
47
+ "field.image": "Debe ser una URL HTTP(S).",
48
+ "field.phone": "Debe ser un número de teléfono válido.",
49
+ "field.phoneInternational": "Debe ser un número de teléfono en formato internacional, empezando por el prefijo del país.",
50
+ "field.phoneCountry": "No se aceptan números de {country}. Usa un número de: {accepted}.",
51
+ "field.phoneCountries": "Debe ser un número de: {accepted}.",
52
+ "field.link": "Debe ser un enlace.",
53
+ "field.linkInvalid": "Debe ser un enlace válido.",
54
+ "field.linkHttp": "Los enlaces externos deben ser URL HTTP(S).",
55
+ "field.linkProtocols": "Los enlaces externos deben empezar por {protocols}.",
56
+ "field.linkInternal": "Los enlaces internos deben empezar por / o #.",
57
+ "field.video": "Debe ser un vídeo.",
58
+ "field.videoInvalid": "Debe ser un vídeo válido.",
59
+ "field.videoProviders": "Debe ser {providers}.",
60
+ "field.videoYoutube": "un enlace de YouTube",
61
+ "field.videoVimeo": "un enlace de Vimeo",
62
+ "field.videoUrl": "una URL de vídeo directa",
63
+ "form.body": "El cuerpo de la petición debe ser un objeto.",
64
+ "action.cancel": "Cancelar",
65
+ "action.confirm": "Confirmar",
66
+ "action.close": "Cerrar",
67
+ "accordion.open": "Abrir la carpeta",
68
+ "accordion.close": "Cerrar la carpeta",
69
+ "color.custom": "Color personalizado",
70
+ "password.show": "Mostrar la contraseña",
71
+ "password.hide": "Ocultar la contraseña",
72
+ "media.preview": "Vista previa del vídeo",
73
+ "tags.remove": "Quitar {tag}",
74
+ "toast.label": "Notificación",
75
+ "toast.close": "Cerrar la notificación",
76
+ "link.configure": "Configurar el enlace",
77
+ "link.configureDescription": "Elige a dónde apunta el enlace y cómo debe abrirse.",
78
+ "link.type": "Tipo de enlace",
79
+ "link.internal": "Enlace interno",
80
+ "link.external": "Enlace externo",
81
+ "link.destination": "Destino",
82
+ "link.internalPlaceholder": "/contacto",
83
+ "link.externalPlaceholder": "https://ejemplo.com",
84
+ "link.internalHint": "Usa una ruta que empiece por / o un ancla que empiece por #.",
85
+ "link.externalHint": "Usa una dirección HTTP(S) completa.",
86
+ "link.download": "Descargar el archivo",
87
+ "link.downloadHint": "Se ha detectado un archivo .{extension}. Pedir al navegador que lo descargue en lugar de abrirlo.",
88
+ "link.newTab": "Abrir en una pestaña nueva",
89
+ "link.newTabHint": "Mantener abierta la página actual cuando un visitante siga este enlace.",
90
+ "link.apply": "Aplicar el enlace",
91
+ "link.none": "Sin enlace configurado",
92
+ "link.kindInternal": "Interno",
93
+ "link.kindExternal": "Externo",
94
+ "link.stateDownload": "Descarga",
95
+ "link.stateNewTab": "Pestaña nueva",
96
+ "link.stateSameTab": "Misma pestaña",
97
+ "link.open": "Abrir el enlace",
98
+ "link.openNamed": "Abrir {field}",
99
+ "link.configureNamed": "Configurar {field}",
100
+ "richText.placeholder": "Empieza a escribir…",
101
+ "richText.imageUrl": "URL de la imagen",
102
+ "richText.imageUrlPlaceholder": "https://",
103
+ "richText.imageUrlInvalid": "Debe ser una URL HTTP(S).",
104
+ "richText.imageAlt": "Texto alternativo (describe la imagen)",
105
+ "richText.toolbar": "Formato de {field}",
106
+ "richText.loading": "Cargando el editor…",
107
+ "richText.variable": "Insertar una variable",
108
+ "richText.variablePreview": "{label} — {preview}",
109
+ "richText.paragraph": "Párrafo",
110
+ "richText.heading2": "Título 2",
111
+ "richText.heading3": "Título 3",
112
+ "richText.bold": "Negrita",
113
+ "richText.italic": "Cursiva",
114
+ "richText.strike": "Tachado",
115
+ "richText.link": "Enlace",
116
+ "richText.image": "Imagen",
117
+ "richText.bulletList": "Lista con viñetas",
118
+ "richText.orderedList": "Lista numerada",
119
+ "richText.quote": "Cita",
120
+ "richText.undo": "Deshacer",
121
+ "richText.redo": "Rehacer",
122
+ "media.youtube": "YouTube",
123
+ "media.vimeo": "Vimeo",
124
+ "media.direct": "Vídeo directo",
125
+ "media.unknown": "Dirección no reconocida",
126
+ "media.placeholder": "Dirección de {providers}",
127
+ "tabs.hasErrors": "{tab} contiene errores",
128
+ "action.copy": "Copiar",
129
+ "action.copied": "Copiado",
130
+ "action.previous": "Anterior",
131
+ "action.next": "Siguiente",
132
+ "action.restore": "Restaurar",
133
+ "action.create": "Crear",
134
+ "action.import": "Importar",
135
+ "action.export": "Exportar",
136
+ "nav.label": "Navegación de Eponyme",
137
+ "nav.hiddenFolders": "Carpetas ocultas",
138
+ "nav.hiddenFoldersCount": "{count} carpetas ocultas | {count} carpeta oculta | {count} carpetas ocultas",
139
+ "nav.scroll": "Desplazar ↓",
140
+ "nav.entryPagination": "Paginación de entradas",
141
+ "nav.createIn": "Crear en {folder}",
142
+ "nav.createEntry": "Crear una entrada",
143
+ "kind.folder": "Carpeta",
144
+ "kind.collection": "Colección",
145
+ "kind.form": "Formulario",
146
+ "kind.page": "Página",
147
+ "folder.choose": "Elige una página o abre una carpeta anidada.",
148
+ "folder.entries": "Entradas de {folder}",
149
+ "entry.draft": "Borrador",
150
+ "sidebar.logo": "Eponyme",
151
+ "sidebar.expand": "Desplegar la barra lateral",
152
+ "sidebar.collapse": "Plegar la barra lateral",
153
+ "sidebar.contentEntries": "Entradas de contenido",
154
+ "sidebar.search": "Buscar",
155
+ "sidebar.searchLabel": "Buscar en las entradas de contenido",
156
+ "sidebar.allEntries": "Todas las entradas",
157
+ "sidebar.users": "Usuarios",
158
+ "sidebar.editables": "Editables",
159
+ "sidebar.noMatch": "Sin resultados para «{query}».",
160
+ "sidebar.logout": "Cerrar sesión",
161
+ "action.loading": "Cargando…",
162
+ "status.draft": "Borrador",
163
+ "status.published": "Publicado",
164
+ "status.unpublished": "Despublicado",
165
+ "form.unsaved": "Sin guardar",
166
+ "form.history": "Historial",
167
+ "form.openHistory": "Abrir el historial",
168
+ "form.publish": "Publicar",
169
+ "form.publishing": "Publicando…",
170
+ "form.saveDraft": "Guardar el borrador",
171
+ "form.saving": "Guardando…",
172
+ "form.saveShortcut": "Guardar el borrador (Ctrl/Comando + S)",
173
+ "form.preview": "Vista previa",
174
+ "form.hidePreview": "Ocultar la vista previa",
175
+ "form.leaveTitle": "Hay cambios sin guardar. ¿Salir de esta página de todos modos?",
176
+ "form.invalidTitle": "Algunos campos necesitan tu atención",
177
+ "form.invalidBody": "Revisa los campos señalados y vuelve a intentarlo.",
178
+ "form.publishedTitle": "Cambios publicados",
179
+ "form.publishedBody": "El contenido público ya está actualizado.",
180
+ "form.draftTitle": "Borrador guardado",
181
+ "form.draftBody": "Tus cambios están guardados pero aún no son públicos.",
182
+ "form.conflictTitle": "Otra persona ha guardado antes",
183
+ "form.conflictBody": "Esta entrada ha cambiado mientras la editabas. Recarga la página para obtener la última versión.",
184
+ "form.publishFailed": "No se ha podido publicar",
185
+ "form.draftFailed": "No se ha podido guardar el borrador",
186
+ "form.unexpected": "Se ha producido un error inesperado. Vuelve a intentarlo.",
187
+ "form.restoredTitle": "Versión restaurada",
188
+ "form.restoredBody": "La versión seleccionada es ahora el borrador actual.",
189
+ "collection.create": "+ Nueva entrada",
190
+ "collection.createTitle": "Nueva entrada",
191
+ "collection.createDescription": "Dale un título a la entrada y una URL permanente.",
192
+ "collection.createFailed": "No se ha podido crear esta entrada.",
193
+ "collection.trash": "Papelera ({count})",
194
+ "collection.trashHint": "Las entradas en la papelera conservan su historial y su slug. Restaura una para recuperarla.",
195
+ "collection.deleted": "Eliminada",
196
+ "collection.deletedOn": "Eliminada el {date}",
197
+ "collection.purge": "Eliminar definitivamente",
198
+ "collection.empty": "Aún no hay entradas.",
199
+ "collection.createFirst": "Crear la primera",
200
+ "collection.confirmTrash": "¿Mover «{title}» a la papelera? Su slug queda reservado hasta que la restaures o la elimines definitivamente.",
201
+ "collection.confirmPurge": "¿Eliminar definitivamente «{title}»? Su contenido y todo su historial se perderán. Esta acción no se puede deshacer.",
202
+ "action.clearAll": "Eliminar todo",
203
+ "action.actions": "Acciones",
204
+ "action.yes": "Sí",
205
+ "action.no": "No",
206
+ "action.empty": "—",
207
+ "submissions.received": "Recibida el",
208
+ "submissions.mode": "Formulario",
209
+ "submissions.customTitle": "Este formulario usa el modo de envío custom, así que Eponyme no almacena sus envíos.",
210
+ "submissions.empty": "Aún no hay envíos.",
211
+ "submissions.detail": "Envío",
212
+ "submissions.confirmClear": "¿Eliminar los {count} envíos de «{form}»? Esta acción no se puede deshacer.",
213
+ "submissions.confirmDelete": "¿Eliminar este envío? Esta acción no se puede deshacer.",
214
+ "submissions.pager": "{count} envíos · página {page} de {pages} | {count} envío · página {page} de {pages} | {count} envíos · página {page} de {pages}",
215
+ "history.title": "Historial de versiones",
216
+ "history.description": "Restaura un borrador o una versión publicada anterior de esta entrada.",
217
+ "history.loading": "Cargando las versiones…",
218
+ "history.empty": "Aún no hay versiones guardadas.",
219
+ "history.version": "Versión n.º {id} ·",
220
+ "history.by": "por {user}",
221
+ "history.unknownAuthor": "autor desconocido",
222
+ "history.confirmRestore": "¿Restaurar la versión del {date}?",
223
+ "history.restoreFailed": "No se ha podido restaurar esta versión.",
224
+ "preview.draft": "Borrador (último guardado)",
225
+ "preview.published": "Publicado",
226
+ "preview.label": "Vista previa",
227
+ "preview.version": "Versión a previsualizar",
228
+ "preview.reload": "Recargar la vista previa",
229
+ "preview.openTab": "Abrir la vista previa en una pestaña nueva",
230
+ "preview.close": "Cerrar la vista previa",
231
+ "preview.hint": "Muestra el contenido guardado: los cambios sin guardar aparecen después de guardar.",
232
+ "preview.frame": "Vista previa de la entrada",
233
+ "index.title": "Eponyme",
234
+ "index.heading": "Entradas de contenido",
235
+ "index.subheading": "Elige el área de contenido que quieres actualizar.",
236
+ "index.exportTitle": "Descargar todas las entradas en un archivo JSON",
237
+ "index.importTitle": "Aplicar un archivo de exportación de otro entorno",
238
+ "index.exportFailed": "Exportación fallida",
239
+ "index.exportFailedBody": "No se ha podido exportar el contenido.",
240
+ "index.importRefused": "Importación rechazada",
241
+ "index.importInvalidJson": "Este archivo no es JSON válido.",
242
+ "index.importUnreadable": "No se ha podido leer este archivo de exportación.",
243
+ "index.imported": "Contenido importado",
244
+ "index.importedBody": "{created} creadas, {updated} actualizadas.",
245
+ "index.importedBodySkipped": "{created} creadas, {updated} actualizadas, {skipped} omitidas.",
246
+ "index.importFailed": "Importación fallida",
247
+ "index.importFailedBody": "No se ha podido importar este archivo.",
248
+ "index.importDialog": "Importar contenido",
249
+ "index.importDialogDescription": "Las entradas del archivo sobrescriben su equivalente. Nunca se elimina nada.",
250
+ "index.toCreate": "por crear",
251
+ "index.toOverwrite": "por sobrescribir",
252
+ "index.skipped": "omitidas",
253
+ "index.mismatch": "{message} ({entries})",
254
+ "users.title": "Usuarios · Eponyme",
255
+ "users.heading": "Usuarios",
256
+ "users.subheading": "Gestiona el acceso al panel y los permisos sobre el contenido.",
257
+ "users.add": "Añadir usuario",
258
+ "users.addDescription": "Se generará una contraseña temporal y se mostrará una sola vez.",
259
+ "users.loading": "Cargando los usuarios…",
260
+ "users.mustChangePassword": "Cambio de contraseña obligatorio",
261
+ "users.role": "Rol",
262
+ "users.resetPassword": "Restablecer la contraseña",
263
+ "users.active": "Activo",
264
+ "users.disabled": "Desactivado",
265
+ "users.activate": "Activar {user}",
266
+ "users.deactivate": "Desactivar {user}",
267
+ "users.confirmReset": "¿Restablecer la contraseña de {user}?",
268
+ "users.updateFailed": "No se ha podido modificar este usuario.",
269
+ "users.resetFailed": "No se ha podido restablecer la contraseña.",
270
+ "users.username": "Nombre de usuario",
271
+ "users.usernameHint": "De 3 a 50 letras, números, puntos, guiones bajos o guiones.",
272
+ "users.create": "Crear el usuario",
273
+ "users.credentials": "Credenciales temporales",
274
+ "users.credentialsHint": "Copia esta contraseña ahora. No se volverá a mostrar.",
275
+ "users.temporaryPassword": "Contraseña temporal",
276
+ "users.credentialsFooter": "El usuario debe sustituirla nada más iniciar sesión.",
277
+ "login.title": "Iniciar sesión · Eponyme",
278
+ "login.heading": "Iniciar sesión",
279
+ "login.subheading": "Usa tu nombre de usuario y tu contraseña de Eponyme para abrir el panel de contenido.",
280
+ "login.username": "Nombre de usuario",
281
+ "login.password": "Contraseña",
282
+ "password.title": "Cambiar la contraseña · Eponyme",
283
+ "password.heading": "Elige una contraseña nueva",
284
+ "password.subheading": "Tu contraseña temporal debe sustituirse antes de usar el panel. Usa al menos 12 caracteres.",
285
+ "password.current": "Contraseña actual",
286
+ "password.new": "Contraseña nueva",
287
+ "password.newHint": "De 12 a 128 caracteres, distinta de la actual.",
288
+ "password.confirm": "Confirmar la contraseña nueva",
289
+ "password.submit": "Cambiar la contraseña",
290
+ "password.signOut": "Cerrar sesión",
291
+ "password.mismatch": "La confirmación no coincide con la contraseña.",
292
+ "entry.title": "{entry} · Eponyme",
293
+ "server.authRequired": "Se requiere autenticación.",
294
+ "server.passwordChangeRequired": "Se requiere cambiar la contraseña.",
295
+ "server.forbidden": "Permisos insuficientes.",
296
+ "server.badOrigin": "Origen de la petición no válido.",
297
+ "server.badCredentials": "Nombre de usuario o contraseña no válidos.",
298
+ "server.entryNotFound": "Entrada de Eponyme no encontrada.",
299
+ "server.collectionNotFound": "Colección de Eponyme no encontrada.",
300
+ "server.collectionEntryNotFound": "Entrada de colección de Eponyme no encontrada.",
301
+ "server.formNotFound": "Formulario de Eponyme no encontrado.",
302
+ "server.submissionNotFound": "Envío de Eponyme no encontrado.",
303
+ "server.trashedNotFound": "Entrada de Eponyme en la papelera no encontrada.",
304
+ "server.versionNotFound": "Versión de Eponyme no encontrada.",
305
+ "server.versionIdRequired": "Se requiere un identificador de versión válido.",
306
+ "server.submissionTooLarge": "El envío es demasiado grande.",
307
+ "server.importTooLarge": "El archivo de importación es demasiado grande.",
308
+ "server.importInvalidJson": "El archivo de importación debe ser JSON válido.",
309
+ "server.importFailed": "No se ha podido aplicar esta importación.",
310
+ "server.hookRejected": "Rechazado por el hook «{hook}».",
311
+ "server.unknownFilterKey": "Clave de filtro «{key}» desconocida. Claves disponibles: {keys}.",
312
+ "server.unknownFilterOperator": "Operador de filtro «{operator}» desconocido. Operadores disponibles: {operators}.",
313
+ "server.unknownSortKey": "Clave de orden «{key}» desconocida. Claves disponibles: {keys}.",
314
+ "server.noKeys": "ninguna",
315
+ "server.userUnavailable": "Esta cuenta de usuario no está disponible.",
316
+ "server.currentPasswordWrong": "La contraseña actual es incorrecta.",
317
+ "server.passwordContainsUsername": "La contraseña no debe contener el nombre de usuario.",
318
+ "server.passwordUnchanged": "La contraseña nueva debe ser distinta de la actual.",
319
+ "server.roleRequired": "Se requiere un rol válido.",
320
+ "server.usernameTaken": "Este nombre de usuario ya está en uso.",
321
+ "server.userNotFound": "Usuario no encontrado.",
322
+ "server.activeMustBeBoolean": "El campo activo debe ser un booleano.",
323
+ "server.lastOwner": "El último propietario activo no puede desactivarse ni degradarse.",
324
+ "server.concurrentChange": "Se ha aplicado otro cambio al mismo tiempo. Vuelve a intentarlo.",
325
+ "server.slugTaken": "Este slug ya está en uso.",
326
+ "server.slugInTrash": "Hay una entrada con este slug en la papelera. Restáurala o elimínala definitivamente.",
327
+ "server.importNoSchema": "No hay ningún esquema configurado para esta entrada.",
328
+ "server.importInTrash": "Hay una entrada con este nombre en la papelera. Restáurala o elimínala definitivamente.",
329
+ "server.passwordChangeFailed": "No se ha podido cambiar la contraseña.",
330
+ "server.userCreateFailed": "No se ha podido crear este usuario.",
331
+ "role.viewer": "Lector",
332
+ "role.editor": "Editor",
333
+ "role.owner": "Propietario"
334
+ };
335
+ return es$1;
336
+ }
337
+
338
+ var esExports = /*@__PURE__*/ requireEs();
339
+ const messages = /*@__PURE__*/getDefaultExportFromCjs(esExports);
340
+
341
+ function es(overrides = {}) {
342
+ return {
343
+ code: "es-ES",
344
+ messages: { ...messages, ...overrides }
345
+ };
346
+ }
347
+
348
+ export { es };
package/dist/fr.d.mts ADDED
@@ -0,0 +1,23 @@
1
+ import { EponymeLocaleDefinition } from '@karibsen/eponyme';
2
+
3
+ /**
4
+ * The dashboard interface in French.
5
+ *
6
+ * A function rather than a plain object so a project can override a wording without forking the
7
+ * catalogue. The merge happens here, so what the module receives is already resolved.
8
+ *
9
+ * ```ts
10
+ * import { fr } from '@eponyme/locale/fr'
11
+ *
12
+ * export default defineNuxtConfig({
13
+ * eponyme: { locale: fr({ 'array.add': 'Ajouter un bloc' }) },
14
+ * })
15
+ * ```
16
+ *
17
+ * No `plural`: French selects the same three forms as the default rule — nought and one take the
18
+ * singular, everything above takes the plural. What differs from English is the wording of the
19
+ * zero form, and that lives in `fr.json`, not in the rule.
20
+ */
21
+ declare function fr(overrides?: Record<string, string>): EponymeLocaleDefinition;
22
+
23
+ export { fr };
package/dist/fr.d.ts ADDED
@@ -0,0 +1,23 @@
1
+ import { EponymeLocaleDefinition } from '@karibsen/eponyme';
2
+
3
+ /**
4
+ * The dashboard interface in French.
5
+ *
6
+ * A function rather than a plain object so a project can override a wording without forking the
7
+ * catalogue. The merge happens here, so what the module receives is already resolved.
8
+ *
9
+ * ```ts
10
+ * import { fr } from '@eponyme/locale/fr'
11
+ *
12
+ * export default defineNuxtConfig({
13
+ * eponyme: { locale: fr({ 'array.add': 'Ajouter un bloc' }) },
14
+ * })
15
+ * ```
16
+ *
17
+ * No `plural`: French selects the same three forms as the default rule — nought and one take the
18
+ * singular, everything above takes the plural. What differs from English is the wording of the
19
+ * zero form, and that lives in `fr.json`, not in the rule.
20
+ */
21
+ declare function fr(overrides?: Record<string, string>): EponymeLocaleDefinition;
22
+
23
+ export { fr };
package/dist/fr.mjs ADDED
@@ -0,0 +1,348 @@
1
+ import { g as getDefaultExportFromCjs } from './shared/locale.B85MJLTf.mjs';
2
+
3
+ var fr$1;
4
+ var hasRequiredFr;
5
+
6
+ function requireFr () {
7
+ if (hasRequiredFr) return fr$1;
8
+ hasRequiredFr = 1;
9
+ fr$1 = {
10
+ "action.delete": "Supprimer",
11
+ "array.add": "Ajouter un élément",
12
+ "array.drag": "Faire glisser pour réorganiser",
13
+ "array.move": "Déplacer {item}",
14
+ "array.remove": "Retirer {item}",
15
+ "array.delete": "Supprimer {item}",
16
+ "array.counterMin": "{count} élément · min {min} | {count} élément · min {min} | {count} éléments · min {min}",
17
+ "array.counterMax": "{count} / {max} élément | {count} / {max} élément | {count} / {max} éléments",
18
+ "array.counterMinMax": "{count} / {max} élément · min {min} | {count} / {max} élément · min {min} | {count} / {max} éléments · min {min}",
19
+ "select.search": "Rechercher une option",
20
+ "select.searchPlaceholder": "Rechercher…",
21
+ "select.empty": "Aucune option trouvée.",
22
+ "field.required": "Ce champ est obligatoire.",
23
+ "field.custom": "Cette valeur n'est pas valide.",
24
+ "field.object": "La valeur attendue doit être un objet.",
25
+ "field.array": "La valeur attendue doit être un tableau.",
26
+ "field.string": "La valeur attendue doit être du texte.",
27
+ "field.number": "La valeur attendue doit être un nombre.",
28
+ "field.boolean": "La valeur attendue doit être oui ou non.",
29
+ "field.unknown": "Ce champ n'existe pas.",
30
+ "field.unknownTab": "Cet onglet n'existe pas.",
31
+ "field.pattern": "Ce format n'est pas valide.",
32
+ "field.minItems": "Doit contenir au moins {min} éléments.",
33
+ "field.maxItems": "Doit contenir au plus {max} éléments.",
34
+ "field.minLength": "Doit contenir au moins {min} caractères.",
35
+ "field.maxLength": "Doit contenir au plus {max} caractères.",
36
+ "field.min": "La valeur minimale est {min}.",
37
+ "field.max": "La valeur maximale est {max}.",
38
+ "field.tagsNotEmpty": "Supprimez les étiquettes vides.",
39
+ "field.optionsOnly": "Choisissez uniquement parmi les options proposées.",
40
+ "field.option": "Choisissez l'une des options proposées.",
41
+ "field.date": "Saisissez une date valide.",
42
+ "field.dateMin": "Choisissez une date à partir du {min}.",
43
+ "field.dateMax": "Choisissez une date au plus tard le {max}.",
44
+ "field.email": "Saisissez une adresse e-mail valide.",
45
+ "field.color": "Saisissez une couleur hexadécimale valide.",
46
+ "field.slug": "Utilisez uniquement des lettres minuscules, des chiffres et des tirets simples.",
47
+ "field.image": "Saisissez une URL HTTP(S) valide.",
48
+ "field.phone": "Saisissez un numéro de téléphone valide.",
49
+ "field.phoneInternational": "Saisissez un numéro au format international, avec l'indicatif du pays.",
50
+ "field.phoneCountry": "Les numéros de {country} ne sont pas acceptés. Pays acceptés : {accepted}.",
51
+ "field.phoneCountries": "Utilisez un numéro provenant de l'un de ces pays : {accepted}.",
52
+ "field.link": "Ajoutez un lien.",
53
+ "field.linkInvalid": "Saisissez un lien valide.",
54
+ "field.linkHttp": "Saisissez une URL externe commençant par http:// ou https://.",
55
+ "field.linkProtocols": "Le lien externe doit commencer par {protocols}.",
56
+ "field.linkInternal": "Le lien interne doit commencer par / ou #.",
57
+ "field.video": "Ajoutez une vidéo.",
58
+ "field.videoInvalid": "Saisissez une adresse de vidéo valide.",
59
+ "field.videoProviders": "Formats acceptés : {providers}.",
60
+ "field.videoYoutube": "un lien YouTube",
61
+ "field.videoVimeo": "un lien Vimeo",
62
+ "field.videoUrl": "une URL de vidéo directe",
63
+ "form.body": "Les données envoyées ne sont pas au bon format.",
64
+ "action.cancel": "Annuler",
65
+ "action.confirm": "Confirmer",
66
+ "action.close": "Fermer",
67
+ "action.copy": "Copier",
68
+ "action.copied": "Copié !",
69
+ "action.previous": "Précédent",
70
+ "action.next": "Suivant",
71
+ "action.restore": "Restaurer",
72
+ "action.create": "Créer",
73
+ "action.import": "Importer",
74
+ "action.export": "Exporter",
75
+ "action.loading": "Chargement…",
76
+ "action.clearAll": "Tout supprimer",
77
+ "action.actions": "Actions",
78
+ "action.yes": "Oui",
79
+ "action.no": "Non",
80
+ "action.empty": "—",
81
+ "accordion.open": "Ouvrir le dossier",
82
+ "accordion.close": "Fermer le dossier",
83
+ "color.custom": "Couleur personnalisée",
84
+ "password.show": "Afficher le mot de passe",
85
+ "password.hide": "Masquer le mot de passe",
86
+ "media.preview": "Aperçu de la vidéo",
87
+ "tags.remove": "Retirer {tag}",
88
+ "toast.label": "Notification",
89
+ "toast.close": "Fermer la notification",
90
+ "link.configure": "Configurer le lien",
91
+ "link.configureDescription": "Choisissez la destination du lien et son mode d'ouverture.",
92
+ "link.type": "Type de lien",
93
+ "link.internal": "Lien interne",
94
+ "link.external": "Lien externe",
95
+ "link.destination": "Destination",
96
+ "link.internalPlaceholder": "/contact",
97
+ "link.externalPlaceholder": "https://exemple.com",
98
+ "link.internalHint": "Utilisez un chemin commençant par / ou une ancre commençant par #.",
99
+ "link.externalHint": "Saisissez l'adresse complète, avec http:// ou https://.",
100
+ "link.download": "Télécharger le fichier",
101
+ "link.downloadHint": "Ce lien pointe vers un fichier .{extension}. Le navigateur le téléchargera au lieu de l'ouvrir.",
102
+ "link.newTab": "Ouvrir dans un nouvel onglet",
103
+ "link.newTabHint": "La page actuelle restera ouverte lorsque le visiteur suivra ce lien.",
104
+ "link.apply": "Appliquer le lien",
105
+ "link.none": "Aucun lien ajouté",
106
+ "link.kindInternal": "Interne",
107
+ "link.kindExternal": "Externe",
108
+ "link.stateDownload": "Téléchargement",
109
+ "link.stateNewTab": "Nouvel onglet",
110
+ "link.stateSameTab": "Même onglet",
111
+ "link.open": "Ouvrir le lien",
112
+ "link.openNamed": "Ouvrir {field}",
113
+ "link.configureNamed": "Configurer {field}",
114
+ "richText.placeholder": "Commencez à écrire…",
115
+ "richText.imageUrl": "URL de l'image",
116
+ "richText.imageUrlPlaceholder": "https://",
117
+ "richText.imageUrlInvalid": "Doit être une URL HTTP(S).",
118
+ "richText.imageAlt": "Texte alternatif (description de l'image)",
119
+ "richText.toolbar": "Mise en forme de {field}",
120
+ "richText.loading": "Ouverture de l'éditeur…",
121
+ "richText.variable": "Insérer une variable",
122
+ "richText.variablePreview": "{label} — {preview}",
123
+ "richText.paragraph": "Paragraphe",
124
+ "richText.heading2": "Titre 2",
125
+ "richText.heading3": "Titre 3",
126
+ "richText.bold": "Gras",
127
+ "richText.italic": "Italique",
128
+ "richText.strike": "Barré",
129
+ "richText.link": "Lien",
130
+ "richText.image": "Image",
131
+ "richText.bulletList": "Liste à puces",
132
+ "richText.orderedList": "Liste numérotée",
133
+ "richText.quote": "Citation",
134
+ "richText.undo": "Annuler",
135
+ "richText.redo": "Rétablir",
136
+ "media.youtube": "YouTube",
137
+ "media.vimeo": "Vimeo",
138
+ "media.direct": "Vidéo directe",
139
+ "media.unknown": "Adresse vidéo non reconnue",
140
+ "media.placeholder": "Adresse {providers}",
141
+ "tabs.hasErrors": "Des champs sont à corriger dans {tab}",
142
+ "nav.label": "Navigation Eponyme",
143
+ "nav.hiddenFolders": "Dossiers masqués",
144
+ "nav.hiddenFoldersCount": "{count} dossier masqué | {count} dossier masqué | {count} dossiers masqués",
145
+ "nav.scroll": "Voir la suite ↓",
146
+ "nav.entryPagination": "Pagination des entrées",
147
+ "nav.createIn": "Créer dans {folder}",
148
+ "nav.createEntry": "Créer une entrée",
149
+ "kind.folder": "Dossier",
150
+ "kind.collection": "Collection",
151
+ "kind.form": "Formulaire",
152
+ "kind.page": "Page",
153
+ "folder.choose": "Sélectionnez une page ou ouvrez un sous-dossier.",
154
+ "folder.entries": "Entrées de {folder}",
155
+ "entry.draft": "Brouillon",
156
+ "sidebar.logo": "Eponyme",
157
+ "sidebar.expand": "Déplier la barre latérale",
158
+ "sidebar.collapse": "Replier la barre latérale",
159
+ "sidebar.contentEntries": "Contenus",
160
+ "sidebar.search": "Rechercher",
161
+ "sidebar.searchLabel": "Rechercher dans les contenus",
162
+ "sidebar.allEntries": "Toutes les entrées",
163
+ "sidebar.users": "Utilisateurs",
164
+ "sidebar.editables": "Contenus modifiables",
165
+ "sidebar.noMatch": "Aucun contenu ne correspond à « {query} ».",
166
+ "sidebar.logout": "Se déconnecter",
167
+ "status.draft": "Brouillon",
168
+ "status.published": "Publié",
169
+ "status.unpublished": "Non publié",
170
+ "form.unsaved": "Non enregistré",
171
+ "form.history": "Historique",
172
+ "form.openHistory": "Ouvrir l'historique",
173
+ "form.publish": "Publier",
174
+ "form.publishing": "Publication…",
175
+ "form.saveDraft": "Enregistrer le brouillon",
176
+ "form.saving": "Enregistrement…",
177
+ "form.saveShortcut": "Enregistrer le brouillon (Ctrl/Commande + S)",
178
+ "form.preview": "Aperçu",
179
+ "form.hidePreview": "Masquer l'aperçu",
180
+ "form.leaveTitle": "Vos modifications ne sont pas enregistrées. Voulez-vous vraiment quitter cette page ?",
181
+ "form.invalidTitle": "Certains champs doivent être corrigés",
182
+ "form.invalidBody": "Vérifiez les champs signalés, puis réessayez.",
183
+ "form.publishedTitle": "Modifications publiées",
184
+ "form.publishedBody": "Le contenu public est à jour.",
185
+ "form.draftTitle": "Brouillon enregistré",
186
+ "form.draftBody": "Vos modifications sont enregistrées dans le brouillon, mais ne sont pas encore visibles publiquement.",
187
+ "form.conflictTitle": "Une autre personne a enregistré ses modifications avant vous",
188
+ "form.conflictBody": "Cette entrée a été modifiée pendant votre travail. Rechargez la page pour récupérer la version la plus récente.",
189
+ "form.publishFailed": "Publication impossible",
190
+ "form.draftFailed": "Enregistrement du brouillon impossible",
191
+ "form.unexpected": "Une erreur inattendue s'est produite. Veuillez réessayer.",
192
+ "form.restoredTitle": "Version restaurée",
193
+ "form.restoredBody": "La version sélectionnée est désormais le brouillon courant.",
194
+ "collection.create": "+ Nouvelle entrée",
195
+ "collection.createTitle": "Nouvelle entrée",
196
+ "collection.createDescription": "Donnez un titre à cette entrée et choisissez son adresse permanente.",
197
+ "collection.createFailed": "Impossible de créer cette entrée.",
198
+ "collection.trash": "Corbeille ({count})",
199
+ "collection.trashHint": "Les entrées placées dans la corbeille conservent leur historique et leur slug. Vous pouvez les restaurer à tout moment.",
200
+ "collection.deleted": "Supprimée",
201
+ "collection.deletedOn": "Supprimée le {date}",
202
+ "collection.purge": "Supprimer définitivement",
203
+ "collection.empty": "Aucune entrée pour l'instant.",
204
+ "collection.createFirst": "Créer la première",
205
+ "collection.confirmTrash": "Placer « {title} » dans la corbeille ? Son slug restera réservé jusqu'à sa restauration ou sa suppression définitive.",
206
+ "collection.confirmPurge": "Supprimer définitivement « {title} » ? Son contenu et tout son historique seront perdus. Cette action est irréversible.",
207
+ "submissions.received": "Reçue le",
208
+ "submissions.mode": "Formulaire",
209
+ "submissions.customTitle": "Ce formulaire utilise un mode d'envoi personnalisé. Les réponses ne sont donc pas enregistrées dans Eponyme.",
210
+ "submissions.empty": "Aucune réponse pour l'instant.",
211
+ "submissions.detail": "Réponse",
212
+ "submissions.confirmClear": "Supprimer toutes les réponses de « {form} » ({count}) ? Cette action est irréversible.",
213
+ "submissions.confirmDelete": "Supprimer cette réponse ? Cette action est irréversible.",
214
+ "submissions.pager": "{count} réponse · page {page} sur {pages} | {count} réponse · page {page} sur {pages} | {count} réponses · page {page} sur {pages}",
215
+ "history.title": "Historique des versions",
216
+ "history.description": "Retrouvez et restaurez une ancienne version, publiée ou enregistrée comme brouillon.",
217
+ "history.loading": "Chargement des versions…",
218
+ "history.empty": "Aucune ancienne version pour le moment.",
219
+ "history.version": "Version n° {id} ·",
220
+ "history.by": "par {user}",
221
+ "history.unknownAuthor": "auteur inconnu",
222
+ "history.confirmRestore": "Restaurer la version du {date} ?",
223
+ "history.restoreFailed": "Impossible de restaurer cette version.",
224
+ "preview.draft": "Brouillon (dernier enregistrement)",
225
+ "preview.published": "Publié",
226
+ "preview.label": "Aperçu",
227
+ "preview.version": "Version à prévisualiser",
228
+ "preview.reload": "Recharger l'aperçu",
229
+ "preview.openTab": "Ouvrir l'aperçu dans un nouvel onglet",
230
+ "preview.close": "Fermer l'aperçu",
231
+ "preview.hint": "L'aperçu affiche la dernière version enregistrée. Enregistrez vos modifications pour les voir apparaître.",
232
+ "preview.frame": "Aperçu de l'entrée",
233
+ "index.title": "Eponyme",
234
+ "index.heading": "Tous les contenus",
235
+ "index.subheading": "Choisissez le contenu que vous souhaitez modifier.",
236
+ "index.exportTitle": "Télécharger tous les contenus dans un fichier JSON",
237
+ "index.importTitle": "Importer un fichier provenant d'un autre environnement",
238
+ "index.exportFailed": "Export impossible",
239
+ "index.exportFailedBody": "Impossible d'exporter le contenu.",
240
+ "index.importRefused": "Import impossible",
241
+ "index.importInvalidJson": "Ce fichier n'est pas du JSON valide.",
242
+ "index.importUnreadable": "Impossible de lire ce fichier d'exportation.",
243
+ "index.imported": "Contenu importé",
244
+ "index.importedBody": "{created} créées, {updated} mises à jour.",
245
+ "index.importedBodySkipped": "{created} créées, {updated} mises à jour, {skipped} ignorées.",
246
+ "index.importFailed": "Import impossible",
247
+ "index.importFailedBody": "Impossible d'importer ce fichier.",
248
+ "index.importDialog": "Importer du contenu",
249
+ "index.importDialogDescription": "Les contenus importés remplaceront les contenus correspondants. Les autres contenus ne seront pas supprimés.",
250
+ "index.toCreate": "à créer",
251
+ "index.toOverwrite": "à écraser",
252
+ "index.skipped": "ignorées",
253
+ "index.mismatch": "{message} ({entries})",
254
+ "users.title": "Utilisateurs · Eponyme",
255
+ "users.heading": "Utilisateurs",
256
+ "users.subheading": "Gérez les personnes qui peuvent accéder à Eponyme et modifier vos contenus.",
257
+ "users.add": "Ajouter un utilisateur",
258
+ "users.addDescription": "Un mot de passe temporaire sera généré et affiché une seule fois.",
259
+ "users.loading": "Chargement des utilisateurs…",
260
+ "users.mustChangePassword": "Doit changer son mot de passe",
261
+ "users.role": "Rôle",
262
+ "users.resetPassword": "Réinitialiser le mot de passe",
263
+ "users.active": "Actif",
264
+ "users.disabled": "Désactivé",
265
+ "users.activate": "Activer {user}",
266
+ "users.deactivate": "Désactiver {user}",
267
+ "users.confirmReset": "Réinitialiser le mot de passe de {user} ?",
268
+ "users.updateFailed": "Impossible de modifier cet utilisateur.",
269
+ "users.resetFailed": "Impossible de réinitialiser le mot de passe.",
270
+ "users.username": "Nom d'utilisateur",
271
+ "users.usernameHint": "Entre 3 et 50 caractères : lettres, chiffres, points, tirets bas ou tirets.",
272
+ "users.create": "Créer l'utilisateur",
273
+ "users.credentials": "Identifiants temporaires",
274
+ "users.credentialsHint": "Copiez ce mot de passe maintenant : vous ne pourrez plus l'afficher ensuite.",
275
+ "users.temporaryPassword": "Mot de passe temporaire",
276
+ "users.credentialsFooter": "Cette personne devra choisir un nouveau mot de passe lors de sa première connexion.",
277
+ "login.title": "Connexion · Eponyme",
278
+ "login.heading": "Se connecter",
279
+ "login.subheading": "Saisissez vos identifiants pour accéder à Eponyme.",
280
+ "login.username": "Nom d'utilisateur",
281
+ "login.password": "Mot de passe",
282
+ "password.title": "Changer de mot de passe · Eponyme",
283
+ "password.heading": "Choisissez un nouveau mot de passe",
284
+ "password.subheading": "Avant d'accéder à Eponyme, remplacez votre mot de passe temporaire par un mot de passe d'au moins 12 caractères.",
285
+ "password.current": "Mot de passe actuel",
286
+ "password.new": "Nouveau mot de passe",
287
+ "password.newHint": "Entre 12 et 128 caractères, et différent de votre mot de passe actuel.",
288
+ "password.confirm": "Confirmer le nouveau mot de passe",
289
+ "password.submit": "Changer le mot de passe",
290
+ "password.signOut": "Se déconnecter",
291
+ "password.mismatch": "Les deux mots de passe ne correspondent pas.",
292
+ "entry.title": "{entry} · Eponyme",
293
+ "server.authRequired": "Connectez-vous pour continuer.",
294
+ "server.passwordChangeRequired": "Vous devez changer votre mot de passe pour continuer.",
295
+ "server.forbidden": "Vous n'avez pas les droits nécessaires pour effectuer cette action.",
296
+ "server.badOrigin": "Cette requête ne provient pas d'une source autorisée.",
297
+ "server.badCredentials": "Le nom d'utilisateur ou le mot de passe est incorrect.",
298
+ "server.entryNotFound": "Cette entrée est introuvable.",
299
+ "server.collectionNotFound": "Cette collection est introuvable.",
300
+ "server.collectionEntryNotFound": "Cette entrée de collection est introuvable.",
301
+ "server.formNotFound": "Ce formulaire est introuvable.",
302
+ "server.submissionNotFound": "Cette réponse est introuvable.",
303
+ "server.trashedNotFound": "Cette entrée est introuvable dans la corbeille.",
304
+ "server.versionNotFound": "Cette version est introuvable.",
305
+ "server.versionIdRequired": "Un identifiant de version valide est requis.",
306
+ "server.submissionTooLarge": "Les données envoyées sont trop volumineuses.",
307
+ "server.importTooLarge": "Le fichier à importer est trop volumineux.",
308
+ "server.importInvalidJson": "Le fichier à importer doit contenir du JSON valide.",
309
+ "server.importFailed": "Impossible d'appliquer cet import.",
310
+ "server.hookRejected": "La règle « {hook} » a refusé cette opération.",
311
+ "server.unknownFilterKey": "Le filtre « {key} » n'existe pas. Filtres disponibles : {keys}.",
312
+ "server.unknownFilterOperator": "L'opérateur « {operator} » n'existe pas. Opérateurs disponibles : {operators}.",
313
+ "server.unknownSortKey": "Le critère de tri « {key} » n'existe pas. Critères disponibles : {keys}.",
314
+ "server.noKeys": "aucune",
315
+ "server.userUnavailable": "Ce compte n'est pas disponible.",
316
+ "server.currentPasswordWrong": "Le mot de passe actuel est incorrect.",
317
+ "server.passwordContainsUsername": "Votre mot de passe ne doit pas contenir votre nom d'utilisateur.",
318
+ "server.passwordUnchanged": "Choisissez un mot de passe différent de l'actuel.",
319
+ "server.roleRequired": "Choisissez un rôle valide.",
320
+ "server.usernameTaken": "Ce nom d'utilisateur est déjà utilisé.",
321
+ "server.userNotFound": "Utilisateur introuvable.",
322
+ "server.activeMustBeBoolean": "L'état du compte doit être actif ou désactivé.",
323
+ "server.lastOwner": "Vous ne pouvez pas désactiver ni rétrograder le dernier propriétaire actif.",
324
+ "server.concurrentChange": "Une autre modification a été enregistrée au même moment. Veuillez réessayer.",
325
+ "server.slugTaken": "Cette adresse est déjà utilisée.",
326
+ "server.slugInTrash": "Une entrée utilisant cette adresse se trouve dans la corbeille. Restaurez-la ou supprimez-la définitivement.",
327
+ "server.importNoSchema": "Aucun schéma n'est configuré pour cette entrée.",
328
+ "server.importInTrash": "Une entrée portant ce nom se trouve dans la corbeille. Restaurez-la ou supprimez-la définitivement.",
329
+ "server.passwordChangeFailed": "Impossible de changer le mot de passe.",
330
+ "server.userCreateFailed": "Impossible de créer cet utilisateur.",
331
+ "role.viewer": "Lecteur",
332
+ "role.editor": "Éditeur",
333
+ "role.owner": "Propriétaire"
334
+ };
335
+ return fr$1;
336
+ }
337
+
338
+ var frExports = /*@__PURE__*/ requireFr();
339
+ const messages = /*@__PURE__*/getDefaultExportFromCjs(frExports);
340
+
341
+ function fr(overrides = {}) {
342
+ return {
343
+ code: "fr-FR",
344
+ messages: { ...messages, ...overrides }
345
+ };
346
+ }
347
+
348
+ export { fr };
@@ -0,0 +1,5 @@
1
+ function getDefaultExportFromCjs (x) {
2
+ return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
3
+ }
4
+
5
+ export { getDefaultExportFromCjs as g };
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "@eponyme/locale",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "description": "Dashboard interface translations for Eponyme.",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/eponymejs/locale.git"
9
+ },
10
+ "license": "MIT",
11
+ "sideEffects": false,
12
+ "exports": {
13
+ "./es": {
14
+ "types": "./dist/es.d.mts",
15
+ "import": "./dist/es.mjs"
16
+ },
17
+ "./fr": {
18
+ "types": "./dist/fr.d.mts",
19
+ "import": "./dist/fr.mjs"
20
+ },
21
+ "./package.json": "./package.json"
22
+ },
23
+ "files": [
24
+ "dist"
25
+ ],
26
+ "scripts": {
27
+ "build": "unbuild",
28
+ "check": "node scripts/check-keys.mjs",
29
+ "prepack": "npm run build"
30
+ },
31
+ "peerDependencies": {
32
+ "@karibsen/eponyme": ">=0.8.0"
33
+ },
34
+ "devDependencies": {
35
+ "unbuild": "^3.6.1"
36
+ },
37
+ "publishConfig": {
38
+ "access": "public"
39
+ }
40
+ }