Skip to content

Commit 45f6150

Browse files
committed
feat(web): video player i18n
1 parent affe0ac commit 45f6150

7 files changed

Lines changed: 154 additions & 6 deletions

File tree

i18n/de.json

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1518,6 +1518,27 @@
15181518
"marked_all_as_read": "Alle als gelesen markiert",
15191519
"matches": "Treffer",
15201520
"matching_assets": "Passende Dateien",
1521+
"media_chrome": {
1522+
"decode_error": "Dekodierungsfehler",
1523+
"enter_fullscreen_mode": "Vollbildmodus aktivieren",
1524+
"exit_fullscreen_mode": "Vollbildmodus beenden",
1525+
"media_error_description": "Ein Medienfehler hat die Wiedergabe abgebrochen. Das Medium könnte beschädigt sein oder Ihr Browser unterstützt dieses Format nicht.",
1526+
"mute": "Stumm schalten",
1527+
"network_error": "Netzwerkfehler",
1528+
"network_error_description": "Ein Netzwerkfehler hat dazu geführt, dass der Medien-Download fehlgeschlagen ist.",
1529+
"not_supported_error": "Quelle nicht unterstützt",
1530+
"not_supported_error_description": "Ein nicht unterstützter Fehler ist aufgetreten. Der Server oder das Netzwerk ist fehlgeschlagen, oder Ihr Browser unterstützt dieses Format nicht.",
1531+
"playback_rate": "Wiedergabegeschwindigkeit",
1532+
"playback_rate_current": "aktuelle Wiedergabegeschwindigkeit",
1533+
"playback_rate_value": "Wiedergabegeschwindigkeit {playbackRate}",
1534+
"playback_time": "Wiedergabezeit",
1535+
"second": "Sekunde",
1536+
"seconds": "Sekunden",
1537+
"time_value_remaining": "{time} verbleibend",
1538+
"time_value_of_total_time": "{currentTime} von {totalTime}",
1539+
"unmute": "Stummschaltung aufheben",
1540+
"volume": "Lautstärke"
1541+
},
15211542
"media_type": "Medientyp",
15221543
"memories": "Erinnerungen",
15231544
"memories_all_caught_up": "Alles aufgeholt",

i18n/en.json

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1523,6 +1523,27 @@
15231523
"marked_all_as_read": "Marked all as read",
15241524
"matches": "Matches",
15251525
"matching_assets": "Matching Assets",
1526+
"media_chrome": {
1527+
"decode_error": "Decode error",
1528+
"enter_fullscreen_mode": "Enter fullscreen mode",
1529+
"exit_fullscreen_mode": "Exit fullscreen mode",
1530+
"media_error_description": "A media error caused playback to be aborted. The media could be corrupt or your browser does not support this format.",
1531+
"mute": "Mute",
1532+
"network_error": "Network error",
1533+
"network_error_description": "A network error caused the media download to fail.",
1534+
"not_supported_error": "Source Not Supported",
1535+
"not_supported_error_description": "An unsupported error occurred. The server or network failed, or your browser does not support this format.",
1536+
"playback_rate": "Playback rate",
1537+
"playback_rate_current": "current playback rate",
1538+
"playback_rate_value": "Playback rate {playbackRate}",
1539+
"playback_time": "playback time",
1540+
"second": "second",
1541+
"seconds": "seconds",
1542+
"time_value_remaining": "{time} remaining",
1543+
"time_value_of_total_time": "{currentTime} of {totalTime}",
1544+
"unmute": "Unmute",
1545+
"volume": "volume"
1546+
},
15261547
"media_type": "Media type",
15271548
"memories": "Memories",
15281549
"memories_all_caught_up": "All caught up",
@@ -1761,7 +1782,6 @@
17611782
"play_original_video": "Play original video",
17621783
"play_original_video_setting_description": "Prefer playback of original videos rather than transcoded videos. If original asset is not compatible it may not playback correctly.",
17631784
"play_transcoded_video": "Play transcoded video",
1764-
"playback_speed": "Playback speed",
17651785
"please_auth_to_access": "Please authenticate to access",
17661786
"port": "Port",
17671787
"preferences_settings_subtitle": "Manage the app's preferences",

i18n/es.json

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1518,6 +1518,27 @@
15181518
"marked_all_as_read": "Todos marcados como leídos",
15191519
"matches": "Coincidencias",
15201520
"matching_assets": "Recursos coincidentes",
1521+
"media_chrome": {
1522+
"decode_error": "Error de decodificación",
1523+
"enter_fullscreen_mode": "Entrar en modo pantalla completa",
1524+
"exit_fullscreen_mode": "Salir del modo pantalla completa",
1525+
"media_error_description": "Un error de medios causó la interrupción de la reproducción. El contenido podría estar dañado o tu navegador no admite este formato.",
1526+
"mute": "Silenciar",
1527+
"network_error": "Error de red",
1528+
"network_error_description": "Un error de red causó la falla en la descarga del contenido.",
1529+
"not_supported_error": "Fuente no compatible",
1530+
"not_supported_error_description": "Ocurrió un error de incompatibilidad. El servidor o la red fallaron, o tu navegador no admite este formato.",
1531+
"playback_rate": "Velocidad de reproducción",
1532+
"playback_rate_current": "velocidad de reproducción actual",
1533+
"playback_rate_value": "Velocidad de reproducción {playbackRate}",
1534+
"playback_time": "tiempo de reproducción",
1535+
"second": "segundo",
1536+
"seconds": "segundos",
1537+
"time_value_remaining": "{time} restante",
1538+
"time_value_of_total_time": "{currentTime} de {totalTime}",
1539+
"unmute": "Reactivar sonido",
1540+
"volume": "volumen"
1541+
},
15211542
"media_type": "Tipo de medio",
15221543
"memories": "Recuerdos",
15231544
"memories_all_caught_up": "Puesto al día",

i18n/fr.json

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1518,6 +1518,27 @@
15181518
"marked_all_as_read": "Tout a été marqué comme lu",
15191519
"matches": "Correspondances",
15201520
"matching_assets": "Médias correspondants",
1521+
"media_chrome": {
1522+
"decode_error": "Erreur de décodage",
1523+
"enter_fullscreen_mode": "Mettre en mode plein écran",
1524+
"exit_fullscreen_mode": "Quitter le mode plein écran",
1525+
"media_error_description": "Une erreur de média a provoqué l’interruption de la lecture. Le média peut être corrompu ou votre navigateur ne prend pas en charge ce format.",
1526+
"mute": "Désactiver le son",
1527+
"network_error": "Erreur réseau",
1528+
"network_error_description": "Une erreur réseau a causé l’échec du téléchargement du média.",
1529+
"not_supported_error": "Source non supportée",
1530+
"not_supported_error_description": "Une erreur non supportée s’est produite. Le serveur ou le réseau a échoué, ou votre navigateur ne prend pas en charge ce format.",
1531+
"playback_rate": "Taux de lecture",
1532+
"playback_rate_current": "taux de lecture actuel",
1533+
"playback_rate_value": "Taux de lecture {playbackRate}",
1534+
"playback_time": "durée de lecture",
1535+
"second": "seconde",
1536+
"seconds": "secondes",
1537+
"time_value_remaining": "{time} restant",
1538+
"time_value_of_total_time": "{currentTime} sur {totalTime}",
1539+
"unmute": "Activer le son",
1540+
"volume": "volume"
1541+
},
15211542
"media_type": "Type de média",
15221543
"memories": "Souvenirs",
15231544
"memories_all_caught_up": "Vous avez tout vu",

i18n/pt.json

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1518,6 +1518,27 @@
15181518
"marked_all_as_read": "Tudo marcado como lido",
15191519
"matches": "Correspondências",
15201520
"matching_assets": "Conteúdos coincidentes",
1521+
"media_chrome": {
1522+
"decode_error": "Erro de decodificação",
1523+
"enter_fullscreen_mode": "Entrar no modo de tela cheia",
1524+
"exit_fullscreen_mode": "Sair do modo de tela cheia",
1525+
"media_error_description": "Um erro de mídia fez com que a reprodução fosse interrompida. O conteúdo pode estar corrompido ou seu navegador não suporta este formato.",
1526+
"mute": "Silenciar",
1527+
"network_error": "Erro de rede",
1528+
"network_error_description": "Um erro de rede causou a falha no download do conteúdo.",
1529+
"not_supported_error": "Fonte não suportada",
1530+
"not_supported_error_description": "Ocorreu um erro de incompatibilidade. O servidor ou a rede falharam, ou seu navegador não suporta este formato.",
1531+
"playback_rate": "Taxa de reprodução",
1532+
"playback_rate_current": "taxa de reprodução atual",
1533+
"playback_rate_value": "Taxa de reprodução {playbackRate}",
1534+
"playback_time": "tempo de reprodução",
1535+
"second": "segndo",
1536+
"seconds": "segundos",
1537+
"time_value_remaining": "{time} restante",
1538+
"time_value_of_total_time": "{currentTime} de {totalTime}",
1539+
"unmute": "Ativar som",
1540+
"volume": "volume"
1541+
},
15211542
"media_type": "Tipo de média",
15221543
"memories": "Memórias",
15231544
"memories_all_caught_up": "Finalizamos por hoje",

web/src/lib/components/asset-viewer/VideoNativeViewer.svelte

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import { assetViewerFadeDuration } from '$lib/constants';
55
import { assetViewerManager } from '$lib/managers/asset-viewer-manager.svelte';
66
import { castManager } from '$lib/managers/cast-manager.svelte';
7-
import { autoPlayVideo, loopVideo as loopVideoPreference } from '$lib/stores/preferences.store';
7+
import { autoPlayVideo, lang, loopVideo as loopVideoPreference } from '$lib/stores/preferences.store';
88
import { getAssetMediaUrl, getAssetPlaybackUrl } from '$lib/utils';
99
import { AssetMediaSize, type AssetResponseDto } from '@immich/sdk';
1010
import { Icon, LoadingSpinner } from '@immich/ui';
@@ -166,6 +166,7 @@
166166
<!-- dir=ltr based on https://github.com/videojs/video.js/issues/949 -->
167167
<media-controller
168168
dir="ltr"
169+
lang={$lang}
169170
nohotkeys
170171
class="dark h-full max-w-full"
171172
style:aspect-ratio={aspectRatio}
@@ -194,14 +195,14 @@
194195
></video>
195196

196197
{#if extendedControls}
197-
<media-settings-menu hidden anchor="auto" class="w-3xs rounded-xl border border-light-300 shadow-sm">
198+
<media-settings-menu hidden anchor="auto" class="min-w-3xs rounded-xl border border-light-300 shadow-sm">
198199
<Icon slot="checked-indicator" icon={mdiCheck} class="m-2" />
199200
<media-settings-menu-item class="mx-1 rounded-lg p-1 ps-2">
200-
{$t('playback_speed')}
201+
{$t('media_chrome.playback_rate')}
201202
<Icon slot="suffix" icon={mdiChevronRight} class="m-2" />
202203
<media-playback-rate-menu slot="submenu" hidden rates="0.5 1 1.5 2">
203204
<Icon slot="back-icon" icon={mdiChevronLeft} class="m-2" />
204-
<span slot="title">{$t('playback_speed')}</span>
205+
<span slot="title">{$t('media_chrome.playback_rate')}</span>
205206
</media-playback-rate-menu>
206207
</media-settings-menu-item>
207208
</media-settings-menu>

web/src/routes/+layout.svelte

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
import { serverConfigManager } from '$lib/managers/server-config-manager.svelte';
1414
import ServerRestartingModal from '$lib/modals/ServerRestartingModal.svelte';
1515
import { Route } from '$lib/route';
16-
import { locale } from '$lib/stores/preferences.store';
16+
import { lang, locale } from '$lib/stores/preferences.store';
1717
import { sidebarStore } from '$lib/stores/sidebar.svelte';
1818
import { closeWebsocketConnection, openWebsocketConnection, websocketStore } from '$lib/stores/websocket';
1919
import { maintenanceShouldRedirect } from '$lib/utils/maintenance';
@@ -35,6 +35,8 @@
3535
toastManager,
3636
TooltipProvider,
3737
} from '@immich/ui';
38+
import { En } from 'media-chrome/lang/en';
39+
import { addTranslation } from 'media-chrome/utils/i18n';
3840
import { onMount, type Snippet } from 'svelte';
3941
import { t } from 'svelte-i18n';
4042
import { get } from 'svelte/store';
@@ -73,6 +75,47 @@
7375
save: $t('save'),
7476
supporter: $t('supporter'),
7577
});
78+
79+
addTranslation($lang, {
80+
...En,
81+
'Enter fullscreen mode': $t('media_chrome.enter_fullscreen_mode'),
82+
'Exit fullscreen mode': $t('media_chrome.exit_fullscreen_mode'),
83+
Mute: $t('media_chrome.mute'),
84+
Unmute: $t('media_chrome.unmute'),
85+
Play: $t('play'),
86+
Pause: $t('pause'),
87+
'Playback rate': $t('media_chrome.playback_rate'),
88+
'Playback rate {playbackRate}': $t('media_chrome.playback_rate_value'),
89+
Settings: $t('settings'),
90+
volume: $t('media_chrome.volume'),
91+
'current playback rate': $t('media_chrome.playback_rate_current'),
92+
'playback time': $t('media_chrome.playback_time'),
93+
settings: $t('settings'),
94+
play: $t('play'),
95+
pause: $t('pause'),
96+
mute: $t('media_chrome.mute'),
97+
unmute: $t('media_chrome.unmute'),
98+
'enter fullscreen mode': $t('media_chrome.enter_fullscreen_mode'),
99+
'exit fullscreen mode': $t('media_chrome.exit_fullscreen_mode'),
100+
101+
'Network Error': $t('media_chrome.network_error'),
102+
'Decode Error': $t('media_chrome.decode_error'),
103+
'Source Not Supported': $t('media_chrome.not_supported_error'),
104+
'A network error caused the media download to fail.': $t('media_chrome.network_error_description'),
105+
'A media error caused playback to be aborted. The media could be corrupt or your browser does not support this format.':
106+
$t('media_chrome.media_error_description'),
107+
'An unsupported error occurred. The server or network failed, or your browser does not support this format.': $t(
108+
'media_chrome.not_supported_error_description',
109+
),
110+
hour: $t('hour'),
111+
hours: $t('hours'),
112+
minute: $t('minute'),
113+
minutes: $t('minutes'),
114+
second: $t('media_chrome.second'),
115+
seconds: $t('media_chrome.seconds'),
116+
'{time} remaining': $t('media_chrome.time_value_remaining'),
117+
'{currentTime} of {totalTime}': $t('media_chrome.time_value_of_total_time'),
118+
});
76119
});
77120
78121
$effect(() => setLocale($locale));

0 commit comments

Comments
 (0)