diff --git a/src/lib/apis/tmdb/tmdb-api.ts b/src/lib/apis/tmdb/tmdb-api.ts index 6a6a3aeb..4d8656dd 100644 --- a/src/lib/apis/tmdb/tmdb-api.ts +++ b/src/lib/apis/tmdb/tmdb-api.ts @@ -7,6 +7,7 @@ import { settings } from '../../stores/settings.store'; import type { TitleType } from '../../types'; import type { Api } from '../api.interface'; import { user } from '../../stores/user.store'; +import { localSettings } from '../../stores/localstorage.store'; const CACHE_ONE_DAY = 'max-age=86400'; const CACHE_FOUR_DAYS = 'max-age=345600'; @@ -113,8 +114,9 @@ export class TmdbApi implements Api { movie_id: tmdbId }, query: { + language: get(localSettings)?.language, append_to_response: 'videos,credits,external_ids,images', - ...({ include_image_language: get(settings)?.language + ',en,null' } as any) + ...({ include_image_language: get(localSettings)?.language + ',en,null' } as any) } } }) @@ -126,7 +128,7 @@ export class TmdbApi implements Api { ?.GET('/3/movie/popular', { params: { query: { - language: get(settings)?.language, + language: get(localSettings)?.language, region: get(settings)?.discover.region } } @@ -143,6 +145,7 @@ export class TmdbApi implements Api { external_id: tvdbId }, query: { + external_source: 'tvdb_id' } }, @@ -167,8 +170,9 @@ export class TmdbApi implements Api { series_id: tmdbId }, query: { + language: get(localSettings)?.language, append_to_response: 'videos,aggregate_credits,external_ids,images', - ...({ include_image_language: get(settings)?.language + ',en,null' } as any) + ...({ include_image_language: get(localSettings)?.language + ',en,null' } as any) } }, headers: { @@ -213,7 +217,7 @@ export class TmdbApi implements Api { .GET('/3/tv/popular', { params: { query: { - language: get(settings)?.language + language: get(localSettings)?.language } } }) @@ -255,6 +259,7 @@ export class TmdbApi implements Api { episode_number: episode }, query: { + language: get(localSettings)?.language, // Spécifiez la langue ici append_to_response: 'credits,external_ids,images' } } @@ -280,6 +285,7 @@ export class TmdbApi implements Api { person_id: person_id }, query: { + language: get(localSettings)?.language, append_to_response: 'images,movie_credits,tv_credits,external_ids' } } @@ -338,6 +344,7 @@ export class TmdbApi implements Api { account_object_id: userId }, query: { + language: get(localSettings)?.language, page: i + 1 } } @@ -413,6 +420,7 @@ export class TmdbApi implements Api { account_object_id: userId }, query: { + language: get(localSettings)?.language, page: i + 1 } } @@ -536,7 +544,7 @@ export const getTmdbMovie = async (tmdbId: number) => }, query: { append_to_response: 'videos,credits,external_ids,images', - ...({ include_image_language: get(settings)?.language + ',en,null' } as any) + ...({ include_image_language: get(localSettings)?.language + ',en,null' } as any) } } }).then((res) => res.data as TmdbMovieFull2 | undefined); @@ -548,7 +556,8 @@ export const getTmdbSeriesFromTvdbId = async (tvdbId: string) => external_id: tvdbId }, query: { - external_source: 'tvdb_id' + external_source: 'tvdb_id', + language: get(localSettings)?.language } }, headers: { @@ -571,7 +580,7 @@ export const getTmdbSeries = async (tmdbId: number): Promise .then( (r) => ( - r?.backdrops?.find((b) => b.iso_639_1 === get(settings)?.language) || + r?.backdrops?.find((b) => b.iso_639_1 === get(localSettings)?.language) || r?.backdrops?.find((b) => b.iso_639_1 === 'en') || r?.backdrops?.find((b) => b.iso_639_1) || r?.backdrops?.[0] @@ -735,7 +744,7 @@ export const getTmdbItemBackdrop = (item: { images: { backdrops: { file_path: string; iso_639_1: string }[] }; }) => ( - item?.images?.backdrops?.find((b) => b.iso_639_1 === get(settings)?.language) || + item?.images?.backdrops?.find((b) => b.iso_639_1 === get(localSettings)?.language) || item?.images?.backdrops?.find((b) => b.iso_639_1 === 'en') || item?.images?.backdrops?.find((b) => b.iso_639_1) || item?.images?.backdrops?.[0] diff --git a/src/lib/components/ContextMenu/LibraryItemContextItems.svelte b/src/lib/components/ContextMenu/LibraryItemContextItems.svelte index 90f8d715..3f87c385 100644 --- a/src/lib/components/ContextMenu/LibraryItemContextItems.svelte +++ b/src/lib/components/ContextMenu/LibraryItemContextItems.svelte @@ -11,6 +11,7 @@ import type { TitleType } from '../../types'; import ContextMenuDivider from './ContextMenuDivider.svelte'; import ContextMenuItem from './ContextMenuItem.svelte'; + import { _ } from 'svelte-i18n'; export let jellyfinItem: JellyfinItem | undefined = undefined; export let sonarrSeries: SonarrSeries | undefined = undefined; @@ -42,30 +43,30 @@ - Mark as watched + {_('contextMenu.markAsWatched')} - Mark as unwatched + {_('contextMenu.markAsUnwatched')} - Open in Jellyfin + {_('contextMenu.openInJellyfin')} {#if type === 'movie'} window.open($settings.radarr.baseUrl + '/movie/' + radarrMovie?.tmdbId)} > - Open in Radarr + {_('contextMenu.openInRadarr')} {:else} window.open($settings.sonarr.baseUrl + '/series/' + sonarrSeries?.titleSlug)} > - Open in Sonarr + {_('contextMenu.openInSonarr')} {/if} window.open(`https://www.themoviedb.org/${type}/${tmdbId}`)}> - Open in TMDB + {_('contextMenu.openInTMDB')} diff --git a/src/lib/components/Dialog/ConfirmDialog.svelte b/src/lib/components/Dialog/ConfirmDialog.svelte index 8e6fa8b7..c9777e1f 100644 --- a/src/lib/components/Dialog/ConfirmDialog.svelte +++ b/src/lib/components/Dialog/ConfirmDialog.svelte @@ -3,6 +3,7 @@ import Button from '../Button.svelte'; import { modalStack } from '../Modal/modal.store'; import Dialog from './Dialog.svelte'; + import { _ } from 'svelte-i18n'; type ActionFn = (() => Promise) | (() => any); @@ -38,10 +39,10 @@ {$_('confirmDialogs.cancel')} diff --git a/src/lib/components/Dialog/CreateOrEditProfileModal.svelte b/src/lib/components/Dialog/CreateOrEditProfileModal.svelte index bac0bcb1..86fd009b 100644 --- a/src/lib/components/Dialog/CreateOrEditProfileModal.svelte +++ b/src/lib/components/Dialog/CreateOrEditProfileModal.svelte @@ -18,6 +18,7 @@ import { navigate } from '../StackRouter/StackRouter'; import Toggle from '../Toggle.svelte'; import { get } from 'svelte/store'; + import { _ } from 'svelte-i18n'; enum Tabs { EditProfile, @@ -166,11 +167,11 @@

- {createNew ? 'Create Account' : 'Edit Profile'} -

- name + {createNew ? $_('settings.profile.createProfile') : $_('settings.profile.editProfile')} + + {$_('settings.profile.name')} tab.set(Tabs.ProfilePictures)}> - Profile Picture + {$_('settings.profile.profilePicture')} {#if !createNew} @@ -179,7 +180,7 @@ bind:value={oldPassword} type={oldPasswordVisible ? 'text' : 'password'} > - Old Password + {$_('settings.profile.oldPassword')} (oldPasswordVisible = !oldPasswordVisible)} @@ -193,7 +194,7 @@ bind:value={newPassword} type={newPasswordVisible ? 'text' : 'password'} > - New Password + {$_('settings.profile.newPassword')} (newPasswordVisible = !newPasswordVisible)} @@ -202,7 +203,7 @@ {#if isAdmin || admin}
- + Admin
{/if} @@ -211,7 +212,7 @@ {/if} {#if !createNew} - + {$_('settings.profile.deleteAccount')} {:else} - + {/if}
@@ -236,7 +237,7 @@ detail.stopPropagation(); }} > -

Select Profile Picture

+

{$_('settings.profile.profilePicture')}

import Container from '../../../Container.svelte'; + import { _ } from 'svelte-i18n';
- Loading... + {$_('navbar.loading')}
diff --git a/src/lib/components/Integrations/JellyfinIntegration.svelte b/src/lib/components/Integrations/JellyfinIntegration.svelte index 888c491c..de16296e 100644 --- a/src/lib/components/Integrations/JellyfinIntegration.svelte +++ b/src/lib/components/Integrations/JellyfinIntegration.svelte @@ -5,6 +5,7 @@ import SelectField from '../SelectField.svelte'; import { jellyfinApi, type JellyfinUser } from '../../apis/jellyfin/jellyfin-api'; import { derived, get } from 'svelte/store'; + import { _ } from 'svelte-i18n'; const dispatch = createEventDispatcher<{ 'click-user': { @@ -108,14 +109,14 @@ isValid={jellyfinUsers?.then((u) => !!u?.length)} on:change={handleChange} > - Base Url + {$_('settings.integrations.baseUrl')} !!u?.length)} on:change={handleChange} > - API Key + {$_('settings.integrations.apiKey')} @@ -127,7 +128,7 @@ dispatch('click-user', { user: jellyfinUser, users, setJellyfinUser })} class="mb-4" > - User + {$_('settings.integrations.user')} {/if} {/await} diff --git a/src/lib/components/Integrations/RadarrIntegration.svelte b/src/lib/components/Integrations/RadarrIntegration.svelte index 079a79e5..4accfba4 100644 --- a/src/lib/components/Integrations/RadarrIntegration.svelte +++ b/src/lib/components/Integrations/RadarrIntegration.svelte @@ -4,6 +4,7 @@ import { radarrApi } from '../../apis/radarr/radarr-api'; import { user } from '../../stores/user.store'; import { derived, get } from 'svelte/store'; + import { _ } from 'svelte-i18n'; let baseUrl = get(user)?.settings.radarr.baseUrl || ''; let apiKey = get(user)?.settings.radarr.apiKey || ''; @@ -85,9 +86,9 @@
- Base Url + {$_('settings.integrations.baseUrl')} - API Key + {$_('settings.integrations.apiKey')}
{#if error} diff --git a/src/lib/components/Integrations/SonarrIntegration.svelte b/src/lib/components/Integrations/SonarrIntegration.svelte index 446e5874..b9fc0b3f 100644 --- a/src/lib/components/Integrations/SonarrIntegration.svelte +++ b/src/lib/components/Integrations/SonarrIntegration.svelte @@ -4,6 +4,7 @@ import { createEventDispatcher } from 'svelte'; import { user } from '../../stores/user.store'; import { derived, get } from 'svelte/store'; + import { _ } from 'svelte-i18n'; let baseUrl = get(user)?.settings.sonarr.baseUrl || ''; let apiKey = get(user)?.settings.sonarr.apiKey || ''; @@ -85,9 +86,9 @@
- Base Url + {$_('settings.integrations.baseUrl')} - API Key + {$_('settings.integrations.apiKey')}
{#if error} diff --git a/src/lib/components/Integrations/TmdbIntegrationConnect.svelte b/src/lib/components/Integrations/TmdbIntegrationConnect.svelte index 0e41e635..19222e1b 100644 --- a/src/lib/components/Integrations/TmdbIntegrationConnect.svelte +++ b/src/lib/components/Integrations/TmdbIntegrationConnect.svelte @@ -5,6 +5,7 @@ import { createEventDispatcher, onMount } from 'svelte'; import { ExternalLink } from 'radix-icons-svelte'; import { user } from '../../stores/user.store'; + import { _ } from 'svelte-i18n'; const dispatch = createEventDispatcher<{ connected: null }>(); @@ -51,9 +52,9 @@ } -

Connect a TMDB Account

+

{$_('settings.integrations.connectTmdb')}

- To connect your TMDB account, log in via the link below and then click "Complete Connection". + {$_('settings.integrations.tmdbText')}
{#if tmdbConnectQrCode} @@ -71,9 +72,9 @@ {#if tmdbConnectLink} - + {/if} diff --git a/src/lib/components/Lang/I18n.svelte b/src/lib/components/Lang/I18n.svelte index 340772e2..899aacb4 100644 --- a/src/lib/components/Lang/I18n.svelte +++ b/src/lib/components/Lang/I18n.svelte @@ -1,5 +1,7 @@ diff --git a/src/lib/components/LanguageSettings.svelte b/src/lib/components/LanguageSettings.svelte new file mode 100644 index 00000000..b81e64aa --- /dev/null +++ b/src/lib/components/LanguageSettings.svelte @@ -0,0 +1,57 @@ + + + + + {#if showLanguageDialog} + (showLanguageDialog = false)}> +
+ {#each Object.entries(AVAILABLE_LANGUAGES) as [code, language]} + handleSelectLanguage(code)}> + {language.name} + + {/each} +
+
+ {/if} diff --git a/src/lib/components/Login.svelte b/src/lib/components/Login.svelte index 84456d65..1ceba9c4 100644 --- a/src/lib/components/Login.svelte +++ b/src/lib/components/Login.svelte @@ -5,6 +5,7 @@ import { createLocalStorageStore } from '../stores/localstorage.store'; import { sessions } from '../stores/session.store'; import { createEventDispatcher } from 'svelte'; + import { _ } from 'svelte-i18n'; const dispatch = createEventDispatcher<{ login: null }>(); @@ -23,9 +24,9 @@ .then((res) => { console.log('res', res); if (res?.request?.status === 401) { - error = 'Invalid credentials. Please try again.'; + error = $_('login.invalidCredentials'); } else if (res?.request.status !== 200) { - error = 'Error occurred: ' + res.request.statusText; + error = $_('login.errorOccurred') + ': ' + res.request.statusText; } else { dispatch('login'); } @@ -40,22 +41,22 @@ -

Login to Reiverr

+

{$_('login.title')}

- If this is your first time logging in, a new account will be created based on your credentials. + {$_('login.firstTime')}
baseUrl.set(e.detail)} class="mb-4 w-full"> - Server + {$_('login.server')} name.set(detail)} class="mb-4 w-full"> - Name + {$_('login.name')} - Password + {$_('login.password')} {$_('login.submit')} {#if error} diff --git a/src/lib/components/MediaManagerModal/MMAddToRadarrDialog.svelte b/src/lib/components/MediaManagerModal/MMAddToRadarrDialog.svelte index 9baf4b74..ef0a6521 100644 --- a/src/lib/components/MediaManagerModal/MMAddToRadarrDialog.svelte +++ b/src/lib/components/MediaManagerModal/MMAddToRadarrDialog.svelte @@ -15,6 +15,7 @@ import { capitalize, formatSize } from '../../utils'; import { ArrowRight, Check, Plus } from 'radix-icons-svelte'; import Button from '../Button.svelte'; + import { _ } from 'svelte-i18n'; type AddOptionsStore = { rootFolderPath: string | null; @@ -126,9 +127,9 @@ >
-

Add {title} to Sonarr?

+

{$_('dialogs.add')} {title} {$_('dialogs.toRadarr')}

- Before you can fetch episodes, you need to add this series to Sonarr. + {$_('dialogs.addToRadarrMessage')}
-

Root Folder

+

{$_('dialogs.rootFolder')}

{selectedRootFolder?.path} - ({formatSize(selectedRootFolder?.freeSpace || 0)} left) + ({formatSize(selectedRootFolder?.freeSpace || 0)} {$_('dialogs.left')})
@@ -150,7 +151,7 @@ >

- Quality Profile + {$_('dialogs.qualityProfile')}

{selectedQualityProfile?.name} @@ -166,7 +167,7 @@ >

- Minimum Availability + {$_('dialogs.minimumAvailability')}

{capitalize($addOptionsStore.minimumAvailability || 'released')} @@ -187,10 +188,10 @@ @@ -200,7 +201,7 @@ class={tabClasses(tab === 'root-folders', true)} bind:selectable={rootFoldersTab} > -

Root Folder

+

{$_('dialogs.rootFolder')}

{#each rootFolders as rootFolder}
- {rootFolder.path} ({formatSize(rootFolder.freeSpace || 0)} left) + {rootFolder.path} ({formatSize(rootFolder.freeSpace || 0)} {$_('dialogs.left')})
{#if selectedRootFolder?.id === rootFolder.id} @@ -227,7 +228,7 @@ class={tabClasses(tab === 'quality-profiles', true)} bind:selectable={qualityProfilesTab} > -

Quality Profile

+

{$_('dialogs.qualityProfile')}

{#each qualityProfiles as qualityProfile} -

Monitor Episodes

+

{$_('dialogs.monitorEpisodes')}

{#each movieAvailabilities as availibility}

Add {title} to Sonarr?

- Before you can fetch episodes, you need to add this series to Sonarr. + {$_('dialogs.addToSonarrMessage')}
-

Root Folder

+

{$_('dialogs.rootFolder')}

{selectedRootFolder?.path} - ({formatSize(selectedRootFolder?.freeSpace || 0)} left) + ({formatSize(selectedRootFolder?.freeSpace || 0)} {$_('dialogs.left')})
@@ -151,7 +152,7 @@ >

- Quality Profile + {$_('dialogs.qualityProfile')}

{selectedQualityProfile?.name} @@ -167,7 +168,7 @@ >

- Monitor Strategy + {$_('dialogs.monitorStrategy')}

{capitalize($addOptionsStore.monitorOptions || 'none')} @@ -228,7 +229,7 @@ class={tabClasses(tab === 'quality-profiles', true)} bind:selectable={qualityProfilesTab} > -

Quality Profile

+

{$_('dialogs.qualityProfile')}

{#each qualityProfiles as qualityProfile} -

Monitor Episodes

+

{$_('dialogs.monitorEpisodes')}

{#each sonarrMonitorOptions as monitorOption}

{#if series.status !== 'Ended'} - Since {new Date(series.first_air_date || Date.now())?.getFullYear()} + {$_('library.content.since')} {new Date(series.first_air_date || Date.now())?.getFullYear()} {:else} - Ended {new Date(series.last_air_date || Date.now())?.getFullYear()} + {$_('library.content.ended')} {new Date(series.last_air_date || Date.now())?.getFullYear()} {/if}

+
diff --git a/src/lib/pages/ManagePage.svelte b/src/lib/pages/ManagePage.svelte index 6e2665ac..25d77a86 100644 --- a/src/lib/pages/ManagePage.svelte +++ b/src/lib/pages/ManagePage.svelte @@ -23,6 +23,8 @@ import { scrollIntoView } from '../selectable'; import { reiverrApi } from '../apis/reiverr/reiverr-api'; import TmdbIntegration from '../components/Integrations/TmdbIntegration.svelte'; + import { _ } from 'svelte-i18n'; + import LanguageSettings from '../components/LanguageSettings.svelte'; enum Tabs { Interface, @@ -101,7 +103,7 @@ 'text-primary-500': hasFocus })} > - Accounts + {$_('settings.accounts.accounts')}
- About + {$_('settings.navbar.about')} @@ -124,7 +126,7 @@
- + @@ -132,7 +134,7 @@ />
- + @@ -140,19 +142,31 @@ />
- + localSettings.update((p) => ({ ...p, checkForUpdates: detail }))} />
+ + +
+ + { + console.log('Language changed to:', detail.language); + }} + /> +
+ +
-

My Profile

+

{$_('settings.accounts.myprofile')}

- Logged in as + {$_('settings.accounts.loginAs')} - + {#await users then usersR} {#if usersR?.length}
-

Server Accounts

+

{$_('settings.accounts.serverAccounts')} +

{#each usersR.filter((u) => u.id !== $user?.id) as user} {/each} { createModal(EditProfileModal, { createNew: true, @@ -205,7 +220,7 @@ }); }} > - Create + {$_('settings.accounts.create')} @@ -216,7 +231,7 @@
-

Integrations

+

{$_('settings.navbar.integrations')}

Sonarr

- +
@@ -235,7 +250,7 @@ >

Radarr

- +
@@ -245,7 +260,7 @@ class="bg-primary-800 rounded-xl p-8" on:enter={scrollIntoView({ vertical: 64 })} > -

Tmdb Account

+

{$_('settings.accounts.newaccount')}

{#if !connected}
@@ -254,7 +269,7 @@ iconAfter={ArrowRight} on:clickOrSelect={() => createModal(TmdbIntegrationConnectDialog, {})} > - Connect + {$_('settings.integrations.tmdb.connect')}
{/if} @@ -304,7 +319,7 @@ let:handleSave let:stale > - + @@ -322,14 +337,14 @@
meta.env: {JSON.stringify(import.meta.env)}
- User agent: {window?.navigator?.userAgent} -
Last key code: {lastKeyCode}
-
Last key: {lastKey}
+ {$_('settings.about.userAgent')} {window?.navigator?.userAgent} +
{$_('settings.about.lastKeyCode')} {lastKeyCode}
+
{$_('settings.about.lastKey')} {lastKey}
{#if tizenMediaKey} -
Tizen media key: {tizenMediaKey}
+
{$_('settings.about.tizenMediaKey')} {tizenMediaKey}
{/if}
- +
diff --git a/src/lib/pages/MoviePage.svelte b/src/lib/pages/MoviePage.svelte index aee1cda2..042738c1 100644 --- a/src/lib/pages/MoviePage.svelte +++ b/src/lib/pages/MoviePage.svelte @@ -32,6 +32,7 @@ import { capitalize, formatSize } from '../utils'; import ConfirmDialog from '../components/Dialog/ConfirmDialog.svelte'; import { TMDB_BACKDROP_SMALL } from '../constants.js'; + import { _ } from 'svelte-i18n'; export let id: string; const tmdbId = Number(id); @@ -91,8 +92,8 @@ function createConfirmDeleteSeasonDialog(files: MovieFileResource[]) { createModal(ConfirmDialog, { - header: 'Delete Season Files?', - body: `Are you sure you want to delete all ${files.length} file(s)?`, // TODO: These messages could be better, for series too + header: $_('library.content.confirmDeleteSeasonHeader'), + body: $_('library.content.confirmDeleteSeasonBody', { count: files.length }), // TODO: These messages could be better, for series too confirm: () => radarrApi .deleteFiles(files.map((f) => f.id || -1)) @@ -102,8 +103,8 @@ function createConfirmCancelDownloadsDialog(downloads: MovieDownload[]) { createModal(ConfirmDialog, { - header: 'Cancel Season Downloads?', - body: `Are you sure you want to cancel all ${downloads.length} download(s)?`, // TODO: These messages could be better, for series too + header: $_('library.content.confirmCancelDownloadsHeader'), + body: $_('library.content.confirmCancelDownloadsBody', { count: downloads.length }), // TODO: These messages could be better, for series too confirm: () => radarrApi .cancelDownloads(downloads.map((f) => f.id || -1)) @@ -176,12 +177,12 @@ on:clickOrSelect={() => jellyfinItem.Id && playerState.streamJellyfinId(jellyfinItem.Id)} > - Play + {$_('library.content.play')} {/if} @@ -205,11 +206,11 @@ {#if PLATFORM_WEB} {/if} @@ -221,7 +222,7 @@ {#await tmdbMovie then movie} -
Show Cast
+
{$_('library.content.castAndCrew')}
{#each movie?.credits?.cast?.slice(0, 15) || [] as credit} {/each} @@ -229,7 +230,7 @@ {/await} {#await recommendations then recommendations} -
Recommendations
+
{$_('library.content.recommendations')}
{#each recommendations || [] as recommendation} {/each} @@ -238,11 +239,11 @@
{#await tmdbMovie then movie} -

More Information

+

{$_('library.content.moreInformation')}

-

Directed By

+

{$_('library.content.directedBy')}

{movie?.credits.crew ?.filter((c) => c.job === 'Director') @@ -251,7 +252,7 @@
-

Written By

+

{$_('library.content.writtenBy')}

{movie?.credits.crew ?.filter((c) => c.job === 'Writer') @@ -262,13 +263,13 @@
-

Languages

+

{$_('library.content.languages')}

{movie?.spoken_languages?.map((language) => language.name).join(', ')}
-

Release Date

+

{$_('library.content.releaseDate')}

{new Date(movie?.release_date || 0).toLocaleDateString('en-US', { year: 'numeric', @@ -287,7 +288,7 @@ class="flex-1 bg-secondary-950 pt-8 pb-16 px-32 flex flex-col" on:enter={scrollIntoView({ top: 32 })} > -

Local Files

+

{$_('library.content.localFiles')}

{#each downloads as download} @@ -377,13 +378,13 @@ {#if files?.length} {/if} {#if downloads?.length} {/if} diff --git a/src/lib/pages/MoviesHomePage.svelte b/src/lib/pages/MoviesHomePage.svelte index 0fd16860..4ebdc8d1 100644 --- a/src/lib/pages/MoviesHomePage.svelte +++ b/src/lib/pages/MoviesHomePage.svelte @@ -11,9 +11,14 @@ import TmdbCard from '../components/Card/TmdbCard.svelte'; import { navigate } from '../components/StackRouter/StackRouter'; import DetachedPage from '../components/DetachedPage/DetachedPage.svelte'; + import { _ } from 'svelte-i18n'; - const continueWatching = jellyfinApi.getContinueWatching('movie'); - const recentlyAdded = jellyfinApi.getRecentlyAdded('movie'); + const continueWatching = jellyfinApi.getContinueWatching('movie').then(items => { + return items.filter(item => item.Type === 'Movie'); + }); + const recentlyAdded = jellyfinApi.getRecentlyAdded('movie').then(items => { + return items.filter(item => item.Type === 'Movie'); + }); const popularMovies = tmdbApi.getPopularMovies(); @@ -72,7 +77,7 @@ {#await continueWatching then continueWatching} {#if continueWatching?.length} - Continue Watching + {$_('discover.continueWatching')} {#each continueWatching as item (item.Id)} {/each} @@ -81,7 +86,7 @@ {#await recentlyAdded then recentlyAdded} {#if recentlyAdded?.length} - Recently Added + {$_('discover.recentlyAdded')} {#each recentlyAdded as item (item.Id)} {/each} @@ -93,7 +98,7 @@ {#await popularMovies then popularMovies} - Popular + {$_('discover.trending')} {#each popularMovies as item} {/each} @@ -115,7 +120,7 @@ {#await newDigitalReleases then nowStreaming} - New Digital Releases + {$_('discover.newDigitalReleases')} {#each nowStreaming as item} {/each} @@ -137,7 +142,7 @@ {#await upcomingMovies then upcomingSeries} - Upcoming Movies + {$_('discover.upcomingMovies')} {#each upcomingSeries as item} {/each} diff --git a/src/lib/pages/PersonPage.svelte b/src/lib/pages/PersonPage.svelte index 5aafe5b2..abbf73d0 100644 --- a/src/lib/pages/PersonPage.svelte +++ b/src/lib/pages/PersonPage.svelte @@ -8,6 +8,7 @@ import TmdbCard from '../components/Card/TmdbCard.svelte'; import Container from '../../Container.svelte'; import { scrollIntoView } from '../selectable'; + import { _ } from 'svelte-i18n'; export let id: string; $: person = tmdbApi.getPerson(Number(id)); @@ -63,7 +64,7 @@ class="flex items-center gap-1 uppercase text-zinc-300 font-semibold tracking-wider mt-2 text-lg" >

- Born {new Date(person.birthday || 0).toLocaleDateString('en-US', { + {$_('personPage.born')} {new Date(person.birthday || 0).toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' diff --git a/src/lib/pages/SearchPage.svelte b/src/lib/pages/SearchPage.svelte index 77729cb9..1dc1ff71 100644 --- a/src/lib/pages/SearchPage.svelte +++ b/src/lib/pages/SearchPage.svelte @@ -10,6 +10,7 @@ import AnimateScale from '../components/AnimateScale.svelte'; import type { Readable } from 'svelte/store'; import DetachedPage from '../components/DetachedPage/DetachedPage.svelte'; + import { _ } from 'svelte-i18n'; let searchQuery = ''; let typingTimeout: ReturnType | undefined = undefined; @@ -65,7 +66,7 @@ class="bg-transparent outline-none placeholder:text-secondary-400" bind:value={searchQuery} on:input={() => handleInput(searchQuery)} - placeholder="Search titles..." + placeholder={$_('search.placeHolder')} bind:this={searchInput} /> diff --git a/src/lib/pages/SeriesHomePage.svelte b/src/lib/pages/SeriesHomePage.svelte index 07492302..bb668e14 100644 --- a/src/lib/pages/SeriesHomePage.svelte +++ b/src/lib/pages/SeriesHomePage.svelte @@ -12,6 +12,7 @@ import { navigate } from '../components/StackRouter/StackRouter'; import { TMDB_SERIES_GENRES } from '../apis/tmdb/tmdb-api.js'; import DetachedPage from '../components/DetachedPage/DetachedPage.svelte'; + import { _ } from 'svelte-i18n'; const continueWatching = jellyfinApi.getContinueWatchingSeries(); const recentlyAdded = jellyfinApi.getRecentlyAdded('series'); @@ -65,7 +66,7 @@ {#await continueWatching then continueWatching} {#if continueWatching?.length} - Continue Watching + {$_('discover.continueWatching')} {#each continueWatching as item (item.Id)} {/each} @@ -74,7 +75,7 @@ {#await recentlyAdded then recentlyAdded} {#if recentlyAdded?.length} - Recently Added + {$_('discover.recentlyAdded')} {#each recentlyAdded as item (item.Id)} {/each} @@ -86,7 +87,7 @@ {#await popular then popular} - Popular + {$_('discover.trending')} {#each popular as item} {/each} @@ -108,7 +109,7 @@ {#await nowStreaming then nowStreaming} - Now Streaming + {$_('discover.streamingNow')} {#each nowStreaming as item} {/each} @@ -130,7 +131,7 @@ {#await upcomingSeries then upcomingSeries} - Upcoming Series + {$_('discover.upcomingSeries')} {#each upcomingSeries as item} {/each} diff --git a/src/lib/pages/UsersPage.svelte b/src/lib/pages/UsersPage.svelte index 8852a763..b25801b3 100644 --- a/src/lib/pages/UsersPage.svelte +++ b/src/lib/pages/UsersPage.svelte @@ -12,6 +12,7 @@ import { Plus, Trash } from 'radix-icons-svelte'; import ProfileIcon from '../components/ProfileIcon.svelte'; import { profilePictures } from '../profile-pictures'; + import { _ } from 'svelte-i18n'; $: users = getUsers($sessions.sessions); @@ -35,7 +36,7 @@ {#await users then users} {#if users?.length} -

Who is watching?

+

{$_('login.whoIsWatching')}

{#each users as item} {@const user = item.user} @@ -66,7 +67,7 @@ }} icon={Trash} > - Remove all Accounts + {$_('login.removeAllAccounts')} {:else} diff --git a/src/lib/stores/localstorage.store.ts b/src/lib/stores/localstorage.store.ts index 95af4a16..67cd86a7 100644 --- a/src/lib/stores/localstorage.store.ts +++ b/src/lib/stores/localstorage.store.ts @@ -35,9 +35,11 @@ export const localSettings = createLocalStorageStore<{ useCssTransitions: boolean; checkForUpdates: boolean; skippedVersion: string; + language: string; }>('settings', { animateScrolling: true, useCssTransitions: true, checkForUpdates: true, - skippedVersion: '' + skippedVersion: '', + language: 'en' });