refactor(i18n): split locale files into per-namespace modules (Phase K) (#688)

Each src/locales/<lang>.ts (~1800 LOC) becomes a folder src/locales/<lang>/
with one module per i18n namespace (44 each) plus an index.ts barrel that
reassembles <lang>Translation in the original key order.

Mechanical, script-driven split with a JSON round-trip check: every
locale object is byte-identical to its pre-split form. i18n.ts is
unchanged — './locales/<lang>' now resolves to the folder index.

The per-namespace settings.ts files land ~440-460 LOC; a single i18n
namespace is the natural, non-arbitrary split unit for a flat string
table, so they are intentionally left whole.
This commit is contained in:
Frank Stellmacher
2026-05-14 14:06:31 +02:00
committed by GitHub
parent ec112922a2
commit 2409a1fec8
414 changed files with 17424 additions and 16624 deletions
+101
View File
@@ -0,0 +1,101 @@
export const playlists = {
title: 'Listas de Reproducción',
newPlaylist: 'Nueva Lista',
unnamed: 'Lista sin nombre',
createName: 'Nombre de lista…',
create: 'Crear',
cancel: 'Cancelar',
empty: 'Aún no hay listas.',
emptyPlaylist: 'Esta lista está vacía.',
addFirstSong: 'Agrega tu primera canción',
notFound: 'Lista no encontrada.',
songs: '{{n}} canciones',
playAll: 'Reproducir Todo',
shuffle: 'Aleatorio',
addToQueue: 'Agregar a Cola',
back: 'Volver a Listas',
deletePlaylist: 'Eliminar',
confirmDelete: 'Click de nuevo para confirmar',
removeSong: 'Quitar de lista',
addSongs: 'Agregar Canciones',
searchPlaceholder: 'Buscar en tu biblioteca…',
noResults: 'Sin resultados.',
suggestions: 'Canciones Sugeridas',
noSuggestions: 'No hay sugerencias disponibles.',
titleBadge: 'Lista',
refreshSuggestions: 'Nuevas sugerencias',
addSong: 'Agregar a lista',
preview: 'Vista previa (30 s)',
previewStop: 'Detener vista previa',
playNextSuggestion: 'Reproducir a continuación',
suggestionsHint: 'Doble clic en una fila para añadirla a la lista',
addSelected: 'Agregar seleccionados',
cacheOffline: 'Guardar lista offline',
offlineCached: 'Lista guardada',
removeOffline: 'Quitar de caché offline',
offlineDownloading: 'Descargando… ({{done}}/{{total}} álbumes)',
publicLabel: 'Pública',
privateLabel: 'Privada',
editMeta: 'Editar lista',
editNamePlaceholder: 'Nombre de lista…',
editCommentPlaceholder: 'Agregar descripción…',
editPublic: 'Lista pública',
editSave: 'Guardar',
editCancel: 'Cancelar',
changeCover: 'Cambiar imagen de portada',
changeCoverLabel: 'Cambiar foto',
removeCover: 'Quitar foto',
coverUpdated: 'Portada actualizada',
metaSaved: 'Lista actualizada',
downloadZip: 'Descargar (ZIP)',
// Toast notifications for multi-select
addSuccess: '{{count}} canciones agregadas a {{playlist}}',
addPartial: '{{added}} agregadas, {{skipped}} skippeadas por duplicadas',
addAllSkipped: 'Todas skippeadas ({{count}} duplicadas)',
addedAsDuplicates: '{{count}} canciones añadidas a {{playlist}} (como duplicados)',
duplicateConfirmTitle: 'Ya en la lista',
duplicateConfirmMessage: 'Las {{count}} canciones ya están en "{{playlist}}". ¿Añadirlas igualmente como duplicados?',
duplicateConfirmAction: 'Añadir igualmente',
addError: 'Error al agregar canciones',
createAndAddSuccess: 'Lista "{{playlist}}" creada con {{count}} canciones',
createError: 'Error al crear lista',
deleteSuccess: '{{count}} listas eliminadas',
deleteFailed: 'Error al eliminar {{name}}',
deleteSelected: 'Eliminar seleccionadas',
deleteSelectedPartial: 'Solo {{n}} de {{total}} listas seleccionadas pueden eliminarse (las demás pertenecen a otro usuario).',
mergeSuccess: '{{count}} canciones unificadas en {{playlist}}',
mergeNoNewSongs: 'No hay canciones nuevas para agregar',
mergeError: 'Error al unificar listas',
mergeInto: 'Unificar en',
selectionCount: '{{count}} seleccionadas',
select: 'Seleccionar',
startSelect: 'Activar selección',
cancelSelect: 'Cancelar',
loadingAlbums: 'Resolviendo {{count}} álbumes…',
loadingArtists: 'Resolviendo {{count}} artistas…',
myPlaylists: 'Mis Listas',
noOtherPlaylists: 'No hay otras listas disponibles',
addToPlaylistSuccess: '{{count}} canciones agregadas a {{playlist}}',
addToPlaylistNoNew: 'No hay canciones nuevas para agregar a {{playlist}}',
addToPlaylistError: 'Error al agregar a la lista',
removeSuccess: 'Canción quitada de la playlist',
removeError: 'Error al quitar la canción de la playlist',
importCSV: 'Importar CSV',
importCSVTooltip: 'Importar desde CSV de Spotify',
csvImportReport: 'Reporte de Importación CSV',
csvImportTotal: 'Total',
csvImportAdded: 'Agregadas',
csvImportDuplicates: 'Duplicadas',
csvImportNotFound: 'No Encontradas',
csvImportNetworkErrors: 'Errores de Red',
csvImportDuplicatesTitle: 'Canciones Duplicadas (Ya en la Lista):',
csvImportNotFoundTitle: 'Canciones No Encontradas:',
csvImportNetworkErrorsTitle: 'Errores de Red (puede reintentar la importación):',
csvImportDownloadReport: 'Descargar Reporte',
csvImportClose: 'Cerrar',
csvImportNoValidTracks: 'No se encontraron canciones válidas en el archivo CSV',
csvImportFailed: 'Error al importar el archivo CSV',
csvImportToast: '{{added}} agregadas, {{notFound}} no encontradas, {{duplicates}} duplicadas',
csvImportDownloadSuccess: 'Reporte descargado exitosamente',
csvImportDownloadError: 'Error al descargar el reporte',
};