i18n: translate PlaylistModal to Spanish

- Translated modal titles (new/edit/add to playlist)
- Translated form labels and placeholders
- Translated buttons (create, save, cancel, delete)
- Translated track count and playlist count labels
- Added missing translation keys for actions (add, create, deleteConfirm)
- Used get(t) in $derived() to avoid PostCSS extraction issues
This commit is contained in:
vicrodh committed 2026-02-02 18:14:32 -06:00
1 parent e2c3c9447d
commit 059dce3114
3 files changed
+68 -28

No files matched your search

+28 -26
View File
@@ -5,6 +5,7 @@
import { subscribe as subscribeOffline, getStatus, createPendingPlaylist } from '$lib/stores/offlineStore'; import { subscribe as subscribeOffline, getStatus, createPendingPlaylist } from '$lib/stores/offlineStore';
import { showToast } from '$lib/stores/toastStore'; import { showToast } from '$lib/stores/toastStore';
import { t } from '$lib/i18n'; import { t } from '$lib/i18n';
import { get } from 'svelte/store';
import { import {
subscribe as subscribeFolders, subscribe as subscribeFolders,
getVisibleFolders, getVisibleFolders,
@@ -107,10 +108,11 @@
// Get display text for selected playlist // Get display text for selected playlist
const selectedPlaylistDisplay = $derived(() => { const selectedPlaylistDisplay = $derived(() => {
const translate = get(t);
if (selectedPlaylistId === null) return ''; if (selectedPlaylistId === null) return '';
if (selectedPlaylistId === CREATE_NEW_PLAYLIST) return '+ Create new playlist'; if (selectedPlaylistId === CREATE_NEW_PLAYLIST) return '+ ' + translate('playlist.createNewPlaylist');
const pl = userPlaylists.find(p => p.id === selectedPlaylistId); const pl = userPlaylists.find(p => p.id === selectedPlaylistId);
return pl ? `${pl.name} (${getTotalTrackCount(pl)} tracks)` : ''; return pl ? translate('playlist.playlistWithTracks', { count: getTotalTrackCount(pl), name: pl.name }) : '';
}); });
// Handle dropdown item click // Handle dropdown item click
@@ -519,11 +521,11 @@
<div class="modal-header"> <div class="modal-header">
<h2> <h2>
{#if mode === 'create'} {#if mode === 'create'}
New Playlist {$t('playlist.newPlaylist')}
{:else if mode === 'edit'} {:else if mode === 'edit'}
Edit Playlist {$t('playlist.editPlaylist')}
{:else} {:else}
Add to Playlist {$t('playlist.addToPlaylist')}
{/if} {/if}
</h2> </h2>
<button class="close-btn" onclick={onClose}> <button class="close-btn" onclick={onClose}>
@@ -539,9 +541,9 @@
{#if mode === 'addTrack'} {#if mode === 'addTrack'}
<div class="form-group"> <div class="form-group">
<div class="label-row"> <div class="label-row">
<label for="playlist-search">Choose playlist</label> <label for="playlist-search">{$t('playlist.choosePlaylist')}</label>
<span class="track-info-inline"> <span class="track-info-inline">
Adding {trackIds.length} {isLocalTracks ? 'local ' : ''}track{trackIds.length !== 1 ? 's' : ''} {$t('playlist.addingTracks', { values: { count: trackIds.length, type: isLocalTracks ? $t('playlist.local') : '' } })}
</span> </span>
</div> </div>
<div class="playlist-dropdown" bind:this={dropdownRef}> <div class="playlist-dropdown" bind:this={dropdownRef}>
@@ -550,7 +552,7 @@
id="playlist-search" id="playlist-search"
bind:this={inputRef} bind:this={inputRef}
bind:value={playlistSearchQuery} bind:value={playlistSearchQuery}
placeholder={selectedPlaylistId ? selectedPlaylistDisplay() : 'Search playlists...'} placeholder={selectedPlaylistId ? selectedPlaylistDisplay() : $t('placeholders.searchPlaylists')}
disabled={loading} disabled={loading}
onfocus={() => isPlaylistDropdownOpen = true} onfocus={() => isPlaylistDropdownOpen = true}
onkeydown={handleDropdownKeydown} onkeydown={handleDropdownKeydown}
@@ -574,7 +576,7 @@
class:highlighted={highlightedIndex === 0} class:highlighted={highlightedIndex === 0}
onclick={() => selectPlaylist(CREATE_NEW_PLAYLIST)} onclick={() => selectPlaylist(CREATE_NEW_PLAYLIST)}
> >
+ Create new playlist + {$t('playlist.createNewPlaylist')}
</button> </button>
{#each filteredPlaylists.slice(0, 8) as pl, i (pl.id)} {#each filteredPlaylists.slice(0, 8) as pl, i (pl.id)}
<button <button
@@ -584,15 +586,15 @@
onclick={() => selectPlaylist(pl.id)} onclick={() => selectPlaylist(pl.id)}
> >
<span class="playlist-name">{pl.name}</span> <span class="playlist-name">{pl.name}</span>
<span class="playlist-count">{getTotalTrackCount(pl)} tracks</span> <span class="playlist-count">{$t('playlist.trackCount', { values: { count: getTotalTrackCount(pl) } })}</span>
</button> </button>
{/each} {/each}
{#if filteredPlaylists.length === 0 && playlistSearchQuery.trim()} {#if filteredPlaylists.length === 0 && playlistSearchQuery.trim()}
<div class="no-results">No playlists found</div> <div class="no-results">{$t('playlist.noPlaylistsFound')}</div>
{/if} {/if}
{#if filteredPlaylists.length > 8} {#if filteredPlaylists.length > 8}
<div class="more-results"> <div class="more-results">
{filteredPlaylists.length - 8} more playlist{filteredPlaylists.length - 8 !== 1 ? 's' : ''}... {$t('playlist.morePlaylists', { values: { count: filteredPlaylists.length - 8 } })}
</div> </div>
{/if} {/if}
</div> </div>
@@ -639,14 +641,14 @@
<div class="form-group"> <div class="form-group">
<label for="folder-select"> <label for="folder-select">
<Folder size={14} class="icon-inline" /> <Folder size={14} class="icon-inline" />
Folder {$t('playlist.folder')}
</label> </label>
<select <select
id="folder-select" id="folder-select"
bind:value={folderId} bind:value={folderId}
disabled={loading} disabled={loading}
> >
<option value={null}>No folder</option> <option value={null}>{$t('playlist.noFolder')}</option>
{#each folders as folder (folder.id)} {#each folders as folder (folder.id)}
<option value={folder.id}>{folder.name}</option> <option value={folder.id}>{folder.name}</option>
{/each} {/each}
@@ -662,7 +664,7 @@
bind:checked={isPublic} bind:checked={isPublic}
disabled={loading} disabled={loading}
/> />
<span>Make playlist public</span> <span>{$t('playlist.makePublic')}</span>
</label> </label>
</div> </div>
@@ -680,7 +682,7 @@
{:else} {:else}
<Eye size={14} /> <Eye size={14} />
{/if} {/if}
Hide from sidebar {$t('playlist.hideFromSidebar')}
</span> </span>
</label> </label>
</div> </div>
@@ -694,37 +696,37 @@
<div class="footer-left"> <div class="footer-left">
{#if showDeleteConfirm} {#if showDeleteConfirm}
<div class="delete-confirm-inline"> <div class="delete-confirm-inline">
<span>Delete?</span> <span>{$t('actions.deleteConfirm')}</span>
<button class="btn-delete-sm" onclick={handleDelete} disabled={loading}> <button class="btn-delete-sm" onclick={handleDelete} disabled={loading}>
Yes {$t('actions.yes')}
</button> </button>
<button class="btn-cancel-sm" onclick={() => showDeleteConfirm = false} disabled={loading}> <button class="btn-cancel-sm" onclick={() => showDeleteConfirm = false} disabled={loading}>
No {$t('actions.no')}
</button> </button>
</div> </div>
{:else} {:else}
<button class="btn-danger-sm" onclick={() => showDeleteConfirm = true} disabled={loading}> <button class="btn-danger-sm" onclick={() => showDeleteConfirm = true} disabled={loading}>
<Trash2 size={12} /> <Trash2 size={12} />
Delete {$t('actions.delete')}
</button> </button>
{/if} {/if}
</div> </div>
{/if} {/if}
<div class="footer-right"> <div class="footer-right">
<button class="btn btn-secondary" onclick={onClose} disabled={loading}> <button class="btn btn-secondary" onclick={onClose} disabled={loading}>
Cancel {$t('actions.cancel')}
</button> </button>
<button class="btn btn-primary" onclick={handleSubmit} disabled={loading}> <button class="btn btn-primary" onclick={handleSubmit} disabled={loading}>
{#if loading} {#if loading}
Saving... {$t('actions.saving')}
{:else if mode === 'create'} {:else if mode === 'create'}
Create {$t('actions.create')}
{:else if mode === 'edit'} {:else if mode === 'edit'}
Save {$t('actions.save')}
{:else if selectedPlaylistId === CREATE_NEW_PLAYLIST} {:else if selectedPlaylistId === CREATE_NEW_PLAYLIST}
Create & Add {$t('playlist.createAndAdd')}
{:else} {:else}
Add {$t('actions.add')}
{/if} {/if}
</button> </button>
</div> </div>
+20 -1
View File
@@ -220,6 +220,10 @@
"track": "track", "track": "track",
"createNew": "Create New...", "createNew": "Create New...",
"createPlaylist": "Create Playlist", "createPlaylist": "Create Playlist",
"createNewPlaylist": "Create new playlist",
"newPlaylist": "New Playlist",
"editPlaylist": "Edit Playlist",
"addToPlaylist": "Add to Playlist",
"deletePlaylist": "Delete Playlist", "deletePlaylist": "Delete Playlist",
"renamePlaylist": "Rename Playlist", "renamePlaylist": "Rename Playlist",
"allPlaylists": "All Playlists", "allPlaylists": "All Playlists",
@@ -249,7 +253,19 @@
"searchButton": "Search", "searchButton": "Search",
"cancel": "Cancel", "cancel": "Cancel",
"loading": "Searching...", "loading": "Searching...",
"preview": "Preview" "preview": "Preview",
"choosePlaylist": "Choose playlist",
"addingTracks": "Adding {count} {type}track(s)",
"local": "local ",
"trackCount": "{count} tracks",
"noPlaylistsFound": "No playlists found",
"morePlaylists": "{count} more playlist(s)...",
"folder": "Folder",
"noFolder": "No folder",
"makePublic": "Make playlist public",
"hideFromSidebar": "Hide from sidebar",
"createAndAdd": "Create & Add",
"playlistWithTracks": "{name} ({count} tracks)"
}, },
"sort": { "sort": {
"nameAZ": "Name (A-Z)", "nameAZ": "Name (A-Z)",
@@ -433,6 +449,9 @@
"yes": "Yes", "yes": "Yes",
"no": "No", "no": "No",
"ok": "OK", "ok": "OK",
"add": "Add",
"create": "Create",
"deleteConfirm": "Delete?",
"loading": "Loading...", "loading": "Loading...",
"loadMore": "Load More", "loadMore": "Load More",
"collapse": "Collapse sidebar", "collapse": "Collapse sidebar",
+20 -1
View File
@@ -220,6 +220,10 @@
"track": "pista", "track": "pista",
"createNew": "Crear Nueva...", "createNew": "Crear Nueva...",
"createPlaylist": "Crear Lista", "createPlaylist": "Crear Lista",
"createNewPlaylist": "Crear nueva lista",
"newPlaylist": "Nueva Lista",
"editPlaylist": "Editar Lista",
"addToPlaylist": "Agregar a Lista",
"deletePlaylist": "Eliminar Lista", "deletePlaylist": "Eliminar Lista",
"renamePlaylist": "Renombrar Lista", "renamePlaylist": "Renombrar Lista",
"allPlaylists": "Todas las Listas", "allPlaylists": "Todas las Listas",
@@ -249,7 +253,19 @@
"searchButton": "Buscar", "searchButton": "Buscar",
"cancel": "Cancelar", "cancel": "Cancelar",
"loading": "Buscando...", "loading": "Buscando...",
"preview": "Vista previa" "preview": "Vista previa",
"choosePlaylist": "Elegir lista",
"addingTracks": "Agregando {count} {type}pista(s)",
"local": "local ",
"trackCount": "{count} pistas",
"noPlaylistsFound": "No se encontraron listas",
"morePlaylists": "{count} lista(s) más...",
"folder": "Carpeta",
"noFolder": "Sin carpeta",
"makePublic": "Hacer lista pública",
"hideFromSidebar": "Ocultar de la barra lateral",
"createAndAdd": "Crear y Agregar",
"playlistWithTracks": "{name} ({count} pistas)"
}, },
"sort": { "sort": {
"nameAZ": "Nombre (A-Z)", "nameAZ": "Nombre (A-Z)",
@@ -433,6 +449,9 @@
"yes": "Sí", "yes": "Sí",
"no": "No", "no": "No",
"ok": "OK", "ok": "OK",
"add": "Agregar",
"create": "Crear",
"deleteConfirm": "¿Eliminar?",
"loading": "Cargando...", "loading": "Cargando...",
"loadMore": "Cargar Más", "loadMore": "Cargar Más",
"collapse": "Contraer barra lateral", "collapse": "Contraer barra lateral",