i18n: translate GenreFilter module to Spanish
- Add genreFilter section to en.json and es.json with all filter UI strings - Translate GenreFilterButton: genre prefix, genre count, filter title - Translate GenreFilterPopup: title, options, expand/collapse, clear - Use get(t) pattern for translations inside functions
This commit is contained in:
1 parent
3919b59eb2
commit
739c29b2c9
4 files changed
+43
-14
No files matched your search
@@ -1,6 +1,8 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { onMount } from 'svelte';
|
import { onMount } from 'svelte';
|
||||||
import { SlidersHorizontal, ChevronDown } from 'lucide-svelte';
|
import { SlidersHorizontal, ChevronDown } from 'lucide-svelte';
|
||||||
|
import { t } from '$lib/i18n';
|
||||||
|
import { get } from 'svelte/store';
|
||||||
import GenreFilterPopup from './GenreFilterPopup.svelte';
|
import GenreFilterPopup from './GenreFilterPopup.svelte';
|
||||||
import {
|
import {
|
||||||
hasActiveFilter,
|
hasActiveFilter,
|
||||||
@@ -58,7 +60,8 @@
|
|||||||
if (selectedNames.length === 1) {
|
if (selectedNames.length === 1) {
|
||||||
selectedGenreName = selectedNames[0];
|
selectedGenreName = selectedNames[0];
|
||||||
} else if (selectedNames.length > 1) {
|
} else if (selectedNames.length > 1) {
|
||||||
selectedGenreName = `${selectedNames.length} genres`;
|
const translate = get(t);
|
||||||
|
selectedGenreName = translate('genreFilter.genresCount', { values: { count: selectedNames.length } });
|
||||||
} else {
|
} else {
|
||||||
selectedGenreName = null;
|
selectedGenreName = null;
|
||||||
}
|
}
|
||||||
@@ -84,9 +87,9 @@
|
|||||||
>
|
>
|
||||||
<span>
|
<span>
|
||||||
{#if selectedGenreName}
|
{#if selectedGenreName}
|
||||||
Genre: {selectedGenreName}
|
{$t('genreFilter.genrePrefix')} {selectedGenreName}
|
||||||
{:else}
|
{:else}
|
||||||
Genre: All
|
{$t('genreFilter.genreAll')}
|
||||||
{/if}
|
{/if}
|
||||||
</span>
|
</span>
|
||||||
<ChevronDown size={14} />
|
<ChevronDown size={14} />
|
||||||
@@ -103,7 +106,7 @@
|
|||||||
{#if selectedGenreName}
|
{#if selectedGenreName}
|
||||||
<span class="filter-label">{selectedGenreName}</span>
|
<span class="filter-label">{selectedGenreName}</span>
|
||||||
{:else}
|
{:else}
|
||||||
<span class="filter-label">Filter by genre</span>
|
<span class="filter-label">{$t('genreFilter.title')}</span>
|
||||||
{/if}
|
{/if}
|
||||||
</button>
|
</button>
|
||||||
{/if}
|
{/if}
|
||||||
|
|||||||
@@ -230,36 +230,36 @@
|
|||||||
<div class="popup-header">
|
<div class="popup-header">
|
||||||
<div class="header-title">
|
<div class="header-title">
|
||||||
<SlidersHorizontal size={16} />
|
<SlidersHorizontal size={16} />
|
||||||
<span>Filter by genre</span>
|
<span>{$t('genreFilter.title')}</span>
|
||||||
</div>
|
</div>
|
||||||
<button class="close-btn" onclick={onClose} type="button" title="Close">
|
<button class="close-btn" onclick={onClose} type="button" title={$t('actions.close')}>
|
||||||
<X size={16} />
|
<X size={16} />
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="options-row">
|
<div class="options-row">
|
||||||
<div class="option-item">
|
<div class="option-item">
|
||||||
<span>Remember selection</span>
|
<span>{$t('genreFilter.rememberSelection')}</span>
|
||||||
<button
|
<button
|
||||||
class="toggle-switch"
|
class="toggle-switch"
|
||||||
class:active={rememberSelection}
|
class:active={rememberSelection}
|
||||||
onclick={handleRememberToggle}
|
onclick={handleRememberToggle}
|
||||||
type="button"
|
type="button"
|
||||||
aria-pressed={rememberSelection}
|
aria-pressed={rememberSelection}
|
||||||
title="Remember selection"
|
title={$t('genreFilter.rememberSelection')}
|
||||||
>
|
>
|
||||||
<span class="toggle-thumb"></span>
|
<span class="toggle-thumb"></span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="option-item">
|
<div class="option-item">
|
||||||
<span>Advanced view</span>
|
<span>{$t('genreFilter.advancedView')}</span>
|
||||||
<button
|
<button
|
||||||
class="toggle-switch"
|
class="toggle-switch"
|
||||||
class:active={showAllGenres}
|
class:active={showAllGenres}
|
||||||
onclick={() => showAllGenres = !showAllGenres}
|
onclick={() => showAllGenres = !showAllGenres}
|
||||||
type="button"
|
type="button"
|
||||||
aria-pressed={showAllGenres}
|
aria-pressed={showAllGenres}
|
||||||
title="Toggle advanced view"
|
title={$t('genreFilter.toggleAdvancedView')}
|
||||||
>
|
>
|
||||||
<span class="toggle-thumb"></span>
|
<span class="toggle-thumb"></span>
|
||||||
</button>
|
</button>
|
||||||
@@ -276,7 +276,7 @@
|
|||||||
class="search-input"
|
class="search-input"
|
||||||
/>
|
/>
|
||||||
{#if searchQuery}
|
{#if searchQuery}
|
||||||
<button class="clear-search" onclick={() => searchQuery = ''} type="button" title="Clear search">
|
<button class="clear-search" onclick={() => searchQuery = ''} type="button" title={$t('genreFilter.clearSearch')}>
|
||||||
<X size={12} />
|
<X size={12} />
|
||||||
</button>
|
</button>
|
||||||
{/if}
|
{/if}
|
||||||
@@ -297,7 +297,7 @@
|
|||||||
<div class="tree-node">
|
<div class="tree-node">
|
||||||
<div class="node-row level-0" class:selected={parentState === 'all'} class:partial={parentState === 'partial'}>
|
<div class="node-row level-0" class:selected={parentState === 'all'} class:partial={parentState === 'partial'}>
|
||||||
{#if hasLoadedChildren || !areChildrenLoaded(parentNode.genre.id)}
|
{#if hasLoadedChildren || !areChildrenLoaded(parentNode.genre.id)}
|
||||||
<button class="expand-btn" onclick={(e) => { e.stopPropagation(); toggleExpanded(parentNode.genre.id); }} type="button" title={isExpanded ? 'Collapse' : 'Expand'}>
|
<button class="expand-btn" onclick={(e) => { e.stopPropagation(); toggleExpanded(parentNode.genre.id); }} type="button" title={isExpanded ? $t('genreFilter.collapse') : $t('genreFilter.expand')}>
|
||||||
{#if isLoading}
|
{#if isLoading}
|
||||||
<Loader2 size={14} class="animate-spin" />
|
<Loader2 size={14} class="animate-spin" />
|
||||||
{:else if isExpanded}
|
{:else if isExpanded}
|
||||||
@@ -337,7 +337,7 @@
|
|||||||
<div class="tree-node">
|
<div class="tree-node">
|
||||||
<div class="node-row level-1" class:selected={childState === 'all'} class:partial={childState === 'partial'}>
|
<div class="node-row level-1" class:selected={childState === 'all'} class:partial={childState === 'partial'}>
|
||||||
{#if hasGrandchildren}
|
{#if hasGrandchildren}
|
||||||
<button class="expand-btn" onclick={(e) => { e.stopPropagation(); toggleExpanded(childNode.genre.id); }} type="button" title={childExpanded ? 'Collapse' : 'Expand'}>
|
<button class="expand-btn" onclick={(e) => { e.stopPropagation(); toggleExpanded(childNode.genre.id); }} type="button" title={childExpanded ? $t('genreFilter.collapse') : $t('genreFilter.expand')}>
|
||||||
{#if childLoading}
|
{#if childLoading}
|
||||||
<Loader2 size={12} class="animate-spin" />
|
<Loader2 size={12} class="animate-spin" />
|
||||||
{:else if childExpanded}
|
{:else if childExpanded}
|
||||||
@@ -414,7 +414,7 @@
|
|||||||
type="button"
|
type="button"
|
||||||
disabled={!hasActiveFilter(context)}
|
disabled={!hasActiveFilter(context)}
|
||||||
>
|
>
|
||||||
Clear filter
|
{$t('genreFilter.clearFilter')}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -957,5 +957,18 @@
|
|||||||
},
|
},
|
||||||
"filter": {
|
"filter": {
|
||||||
"all": "All"
|
"all": "All"
|
||||||
|
},
|
||||||
|
"genreFilter": {
|
||||||
|
"title": "Filter by genre",
|
||||||
|
"genreAll": "Genre: All",
|
||||||
|
"genrePrefix": "Genre:",
|
||||||
|
"genresCount": "{count} genres",
|
||||||
|
"rememberSelection": "Remember selection",
|
||||||
|
"advancedView": "Advanced view",
|
||||||
|
"toggleAdvancedView": "Toggle advanced view",
|
||||||
|
"clearSearch": "Clear search",
|
||||||
|
"collapse": "Collapse",
|
||||||
|
"expand": "Expand",
|
||||||
|
"clearFilter": "Clear filter"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -957,5 +957,18 @@
|
|||||||
},
|
},
|
||||||
"filter": {
|
"filter": {
|
||||||
"all": "Todos"
|
"all": "Todos"
|
||||||
|
},
|
||||||
|
"genreFilter": {
|
||||||
|
"title": "Filtrar por género",
|
||||||
|
"genreAll": "Género: Todos",
|
||||||
|
"genrePrefix": "Género:",
|
||||||
|
"genresCount": "{count} géneros",
|
||||||
|
"rememberSelection": "Recordar selección",
|
||||||
|
"advancedView": "Vista avanzada",
|
||||||
|
"toggleAdvancedView": "Alternar vista avanzada",
|
||||||
|
"clearSearch": "Limpiar búsqueda",
|
||||||
|
"collapse": "Contraer",
|
||||||
|
"expand": "Expandir",
|
||||||
|
"clearFilter": "Limpiar filtro"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user