Files
immich-folio/lib/i18n/locales/es.ts
2026-10-04 09:49:35 +02:00

294 lines
11 KiB
TypeScript

/**
* Spanish dictionary.
*
* Typed as `Dictionary` (derived from `en.ts`), so a key added to English but
* forgotten here fails the type-check rather than falling through to English
* at runtime.
*/
import type { Dictionary } from '../index';
const plural = (n: number, one: string, other: string) => `${n} ${n === 1 ? one : other}`;
export const es: Dictionary = {
dateLocale: 'es-ES',
nav: {
home: 'Inicio',
about: 'Sobre mí',
map: 'Mapa',
journal: 'Diario',
skipToContent: 'Saltar al contenido',
mainNavAria: 'Navegación principal',
heroNavAria: 'Secciones',
openMenu: 'Abrir menú',
closeMenu: 'Cerrar menú',
},
common: {
backTo: (label: string) => `Volver a ${label}`,
backToGallery: 'Volver a la galería',
backToJournal: 'Volver al diario',
email: 'Correo electrónico',
website: 'Sitio web',
home: 'Inicio',
photos: (n: number) => plural(n, 'foto', 'fotos'),
albums: (n: number) => plural(n, 'álbum', 'álbumes'),
collections: (n: number) => plural(n, 'colección', 'colecciones'),
prevAlbum: 'Álbum anterior',
nextAlbum: 'Álbum siguiente',
prevAlbumAria: (name: string) => `Álbum anterior: ${name}`,
nextAlbumAria: (name: string) => `Álbum siguiente: ${name}`,
albumNavAria: 'Navegación entre álbumes',
prevEntry: 'Entrada anterior',
nextEntry: 'Entrada siguiente',
prevEntryAria: (title: string) => `Entrada anterior: ${title}`,
nextEntryAria: (title: string) => `Entrada siguiente: ${title}`,
entryNavAria: 'Navegación entre entradas del diario',
loadingGallery: 'Cargando la galería',
gallery: 'Galería',
loadingPhotos: 'Cargando fotos',
downloadAlbum: 'Descargar álbum',
},
home: {
enter: 'Entrar',
pauseSlideshow: 'Pausar la presentación',
playSlideshow: 'Reproducir la presentación',
},
error: {
notFoundTitle: 'No encontrado',
notFoundText: 'Esta página no existe o el álbum ya no está publicado.',
errorTitle: 'Algo ha salido mal',
errorText:
'No se ha podido cargar esta página. Suele ser algo temporal: inténtalo de nuevo en un momento.',
tryAgain: 'Reintentar',
reference: (digest: string) => `Referencia: ${digest}`,
},
download: {
unavailableTitle: 'Descarga no disponible',
notAvailable: 'Esta descarga no está disponible.',
rateLimited: 'Demasiadas solicitudes de descarga. Espera un momento y vuelve a intentarlo.',
immichUnavailable:
'La fototeca no está disponible en este momento. Vuelve a intentarlo en breve.',
back: 'Volver a la galería',
limitReached: 'Se ha alcanzado el límite de descargas de este enlace.',
},
theme: {
switchToLight: 'Cambiar a modo claro',
switchToDark: 'Cambiar a modo oscuro',
scrollToTop: 'Volver arriba',
},
password: {
subtitle: 'Esta galería está protegida con contraseña.',
siteSubtitle: 'Este sitio está protegido con contraseña.',
pageSubtitle: 'Esta página está protegida con contraseña.',
journalSubtitle: 'Esta entrada del diario está protegida con contraseña.',
protectedPage: 'Página protegida',
placeholder: 'Introduce la contraseña',
submit: 'Entrar',
verifying: 'Verificando…',
incorrect: 'Contraseña incorrecta. Inténtalo de nuevo.',
failed: 'No se ha podido verificar la contraseña. Inténtalo más tarde.',
tooManyAttempts: (seconds: number | null) =>
seconds
? `Demasiados intentos. Inténtalo de nuevo en ${seconds} ${seconds === 1 ? 'segundo' : 'segundos'}.`
: 'Demasiados intentos. Inténtalo más tarde.',
legalNavAria: 'Información legal',
},
about: {
kicker: 'Sobre mí',
title: 'Sobre mí',
metaTitle: (name: string) => `Sobre mí — ${name}`,
portraitAlt: 'Retrato',
gear: 'Equipo',
},
map: {
title: 'Mapa',
kicker: 'Dónde',
subtitle: 'Dónde se tomaron las fotos',
loading: 'Cargando el mapa…',
loadFailed: (status: number) => `No se pudieron cargar los datos del mapa (${status})`,
initFailed: 'No se pudo inicializar el mapa',
zoomIn: 'Acercar',
zoomOut: 'Alejar',
leafletTitle: 'Una biblioteca de JavaScript para mapas interactivos',
},
subpage: {
collectionKicker: (index: string) => `${index} — Colección`,
sectionsNav: 'Secciones',
coverAria: (albumName: string, count: string) => `${albumName}, ${count}`,
nextSubpage: 'Siguiente',
nextSubpageAria: (name: string) => `Siguiente: ${name}`,
},
journal: {
title: 'Diario',
kicker: 'Historias y ensayos',
subtitle: 'Ensayos fotográficos, historias visuales y notas de campo.',
entryDescription: 'Entrada del diario',
empty: 'Todavía no hay entradas publicadas.',
readStory: 'Leer historia →',
minRead: (n: number) => `${n} min de lectura`,
draft: 'Borrador',
by: (author: string) => `por ${author}`,
notFound: 'No encontrado',
},
lightbox: {
viewer: 'Visor de imágenes',
position: (n: number, total: number) => `Foto ${n} de ${total}`,
openPhoto: (n: number) => `Ver foto ${n}`,
close: 'Cerrar',
closeTitle: 'Cerrar (Esc)',
previous: 'Foto anterior',
previousTitle: 'Foto anterior (flecha izquierda)',
next: 'Foto siguiente',
nextTitle: 'Foto siguiente (flecha derecha)',
toggleInfo: 'Mostrar/ocultar información',
toggleInfoTitle: 'Mostrar/ocultar información (i)',
hideInfo: 'Ocultar info',
info: 'Info',
loading: 'Cargando…',
camera: 'Cámara',
lens: 'Objetivo',
focalLength: 'Distancia focal',
aperture: 'Apertura',
shutter: 'Obturación',
iso: 'ISO',
location: 'Ubicación',
noExif: 'No hay datos EXIF disponibles',
copyLink: 'Copiar enlace a esta foto',
copyLinkTitle: 'Copiar enlace a esta foto (c)',
copyLinkShort: 'Enlace',
copied: 'Copiado',
copyManual: 'Copia este enlace',
shortcuts: 'Atajos de teclado',
shortcutNavigate: 'Foto anterior / siguiente',
shortcutInfo: 'Información de la foto',
shortcutFullscreen: 'Pantalla completa',
shortcutExitFullscreen: 'Salir de pantalla completa',
download: 'Descargar el archivo original',
downloadTitle: 'Descargar el archivo original (d)',
downloadShort: 'Original',
shortcutDownload: 'Descargar el original',
shortcutSlideshow: 'Presentación',
shortcutSlideshowRunning: (seconds: number) => `Presentación — cada ${seconds} s`,
slideshowStopped: 'Presentación detenida',
slideshowRunning: (seconds: number) => `Presentación en curso, avanza cada ${seconds} segundos`,
shortcutCopyLink: 'Copiar enlace a esta foto',
shortcutList: 'Esta lista',
shortcutClose: 'Cerrar el visor',
zoomIn: 'Ampliar a resolución completa',
zoomInTitle: 'Ampliar a resolución completa (+)',
zoomOut: 'Ajustar la foto a la pantalla',
zoomOutTitle: 'Ajustar a la pantalla (0 o Esc)',
zoomLoading: 'Cargando la resolución completa…',
zoomUnavailable: 'La resolución completa no está disponible para esta foto.',
shortcutZoom: 'Acercar / alejar',
shortcutZoomReset: 'Ajustar a la pantalla',
},
proofing: {
addFavorite: 'Añadir favorito',
removeFavorite: 'Quitar favorito',
addToFavorites: 'Añadir a favoritos',
removeFromFavorites: 'Quitar de favoritos',
saved: 'Guardado',
favorite: 'Favorito',
showAll: 'Mostrar todo',
filterEmpty: 'No hay fotos seleccionadas.',
selected: (n: number) => `❤️ ${n} ${n === 1 ? 'seleccionada' : 'seleccionadas'}`,
shareExport: 'Compartir y exportar',
modalTitle: (n: number) => `❤️ Selección (${n})`,
closeModal: 'Cerrar ventana',
intro: (n: number) =>
`Has seleccionado ${plural(n, 'foto', 'fotos')}. Elige una opción de exportación para compartir tu selección:`,
copyLink: 'Copiar enlace para compartir',
linkCopied: '¡Enlace copiado!',
copyList: 'Copiar lista de texto (#1, #2…)',
listCopied: '¡Lista copiada!',
copyManualLink: 'Copia este enlace',
copyManualList: 'Copia esta lista',
sendEmail: '✉️ Enviar correo al fotógrafo',
downloadSelected: 'Descargar selección (.zip)',
clearSelection: 'Borrar selección',
confirmClear: '¿Quitar todos los favoritos seleccionados?',
listEmpty: (albumName: string) => `${albumName}: ninguna foto seleccionada.`,
listSummary: (albumName: string, count: number, indices: string) =>
`${albumName} — Fotos seleccionadas (${count}): ${indices}`,
mailSubject: (n: number) => `Selección de fotos (${n})`,
mailBody: (list: string, url: string) =>
`Hola:\n\nEsta es mi selección de fotos:\n\n${list}\n\nEnlace: ${url}\n\nUn saludo,`,
},
proofSession: {
greeting: (name: string) => `Selección para ${name}`,
intro:
'Toca el corazón en las fotos que quieras. Tu selección se guarda sobre la marcha: puedes volver con este enlace cuando quieras.',
saving: 'Guardando…',
saved: 'Selección guardada',
saveFailed: 'No se ha podido guardar tu selección. Revisa la conexión e inténtalo de nuevo.',
review: 'Revisar y enviar',
modalTitle: (n: number) => `Tu selección (${n})`,
empty: 'Todavía no has seleccionado ninguna foto.',
submit: 'Enviar selección',
submitting: 'Enviando…',
confirmSubmit: (n: number) =>
`¿Enviar ${plural(n, 'foto', 'fotos')}? Después no podrás cambiar la selección.`,
submitted: 'Gracias: tu selección se ha enviado.',
locked: 'Esta selección ya se ha enviado y no se puede modificar.',
validUntil: (date: string) => `Este enlace es válido hasta el ${date}.`,
expiredTitle: 'Este enlace ha caducado',
expiredText: 'Pide un enlace nuevo a tu fotógrafo.',
downloadSelection: 'Descargar selección (.zip)',
downloadAll: 'Descargar todas las fotos (.zip)',
downloadsLeft: (n: number) => `${plural(n, 'descarga restante', 'descargas restantes')}`,
},
legal: {
navLabel: 'Aviso legal',
title: 'Aviso legal',
subtitle: 'Información conforme al § 5 DDG',
address: 'Dirección',
contact: 'Contacto',
email: 'Correo electrónico',
phone: 'Teléfono',
contactForm: 'Formulario de contacto',
taxSection: 'Información fiscal',
taxId: 'Número de identificación fiscal',
vatId: 'Número de IVA',
extraInfo: 'Información adicional',
},
contact: {
navLabel: 'Contacto',
title: 'Contacto',
subtitle: 'Escríbeme un mensaje',
name: 'Nombre',
email: 'Correo electrónico',
message: 'Mensaje',
submit: 'Enviar mensaje',
sending: 'Enviando…',
successTitle: 'Gracias',
successText: 'Tu mensaje ha llegado. Te responderé por correo electrónico.',
invalid: 'Rellena todos los campos con una dirección de correo válida.',
tooMany: 'Demasiados mensajes en poco tiempo. Inténtalo de nuevo en un minuto.',
failed: 'No se ha podido enviar el mensaje. Inténtalo más tarde.',
privacy: (days: number) =>
`Tu mensaje se guarda en el propio servidor de este sitio, solo se usa para responderte y se borra después de ${days} ${days === 1 ? 'día' : 'días'}.`,
},
privacy: {
navLabel: 'Privacidad',
title: 'Política de privacidad',
},
};