release: v0.19.0

Release v0.19.0. See the `## [0.19.0] — 2026-09-29` section of
[CHANGELOG.md](https://github.com/ralksta/immich-folio/blob/dev/CHANGELOG.md)
for the full list.

Highlights: client proofing links (#683), custom content pages (#738),
asset picker search (#740), concurrent-edit detection (#742), env-locked
settings (#739), an accessibility baseline (#741), three security fixes
with advisories (#737, #755, #759), and a pre-release quality pass
(#780–#797).

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: ralksta <ralksta@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: Ralf <rohlenbo79@gmail.com>
Co-authored-by: Paul Thies <110185070+ImScheinox@users.noreply.github.com>
Co-authored-by: lancetm714 <108419425+lancetm714@users.noreply.github.com>
Co-authored-by: Lance Martin <lancetaylor95@gmail.com>
This commit is contained in:
Ralksta
2026-09-29 22:50:30 +02:00
committed by GitHub
parent 5f251923f0
commit ad8b09700b
297 changed files with 19398 additions and 1800 deletions

View File

@@ -19,6 +19,8 @@ export const es: Dictionary = {
map: 'Mapa',
journal: 'Diario',
skipToContent: 'Saltar al contenido',
mainNavAria: 'Navegación principal',
heroNavAria: 'Secciones',
openMenu: 'Abrir menú',
closeMenu: 'Cerrar menú',
},
@@ -44,12 +46,15 @@ export const es: Dictionary = {
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: {
@@ -58,8 +63,6 @@ export const es: Dictionary = {
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.',
siteErrorText:
'No se ha podido cargar este sitio. Suele ser algo temporal: inténtalo de nuevo en un momento.',
tryAgain: 'Reintentar',
reference: (digest: string) => `Referencia: ${digest}`,
},
@@ -71,6 +74,7 @@ export const es: Dictionary = {
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: {
@@ -82,11 +86,18 @@ export const es: Dictionary = {
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.',
},
about: {
@@ -104,6 +115,9 @@ export const es: Dictionary = {
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: {
@@ -130,6 +144,7 @@ export const es: Dictionary = {
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)',
@@ -181,6 +196,7 @@ export const es: Dictionary = {
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})`,
@@ -205,6 +221,30 @@ export const es: Dictionary = {
`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',