diff --git a/src/setup/i18n.ts b/src/setup/i18n.ts index 56ac9b0f..1c7d23fa 100644 --- a/src/setup/i18n.ts +++ b/src/setup/i18n.ts @@ -4,10 +4,13 @@ import { initReactI18next } from "react-i18next"; // Languages import { captionLanguages } from "./iso6391"; +import cs from "./locales/cs/translation.json"; +import de from "./locales/de/translation.json"; import en from "./locales/en/translation.json"; import fr from "./locales/fr/translation.json"; import nl from "./locales/nl/translation.json"; import tr from "./locales/tr/translation.json"; +import zh from "./locales/zh/translation.json"; const locales = { en: { @@ -22,6 +25,15 @@ const locales = { fr: { translation: fr, }, + de: { + translation: de, + }, + zh: { + translation: zh, + }, + cs: { + translation: cs, + }, }; i18n // detect user language diff --git a/src/setup/locales/cs/translation.json b/src/setup/locales/cs/translation.json new file mode 100644 index 00000000..a7e5e826 --- /dev/null +++ b/src/setup/locales/cs/translation.json @@ -0,0 +1,128 @@ +{ + "global": { + "name": "movie-web" + }, + "search": { + "loading_series": "Načítání Vašich oblíbených seriálů...", + "loading_movie": "Načítání Vašich oblíbených filmů...", + "loading": "Načítání...", + "allResults": "To je vše co máme!", + "noResults": "Nemohli jsme nic najít!", + "allFailed": "Nepodařilo se najít média, zkuste to znovu!", + "headingTitle": "Výsledky vyhledávání", + "bookmarks": "Záložky", + "continueWatching": "Pokračujte ve sledování", + "title": "Co si přejete sledovat?", + "placeholder": "Co si přejete sledovat?" + }, + "media": { + "movie": "Filmy", + "series": "Seriály", + "stopEditing": "Zastavit upravování", + "errors": { + "genericTitle": "Jejda, rozbilo se to!", + "failedMeta": "Nepovedlo se načíst meta", + "mediaFailed": "Nepodařilo se nám požádat o Vaše média, zkontrolujte své internetové připojení a zkuste to znovu.", + "videoFailed": "Při přehrávání požadovaného videa došlo k chybě. Pokud se tohle opakuje prosím nahlašte nám to na <0>Discord serveru nebo na <1>GitHubu." + } + }, + "seasons": { + "seasonAndEpisode": "S{{season}} E{{episode}}" + }, + "notFound": { + "genericTitle": "Nenalezeno", + "backArrow": "Zpátky domů", + "media": { + "title": "Nemohli jsme najít Vaše média.", + "description": "Nemohli jsme najít média o které jste požádali. Buďto jsme ho nemohli najít, nebo jste manipulovali s URL." + }, + "provider": { + "title": "Tento poskytovatel byl zakázán", + "description": "Měli jsme s tímto poskytovatelem problémy, nebo byl moc nestabilní na používání, a tak jsme ho museli zakázat." + }, + "page": { + "title": "Tuto stránku se nepodařilo najít", + "description": "Dívali jsme se všude: pod koši, ve skříni, za proxy, ale nakonec jsme nemohli najít stránku, kterou hledáte." + } + }, + "searchBar": { + "movie": "Film", + "series": "Seriál", + "Search": "Hledání" + }, + "videoPlayer": { + "findingBestVideo": "Hledáme pro Vás nejlepší video", + "noVideos": "Jejda, nemohli jsme žádné video najít", + "loading": "Načítání...", + "backToHome": "Zpátky domů", + "backToHomeShort": "Zpět", + "seasonAndEpisode": "S{{season}} E{{episode}}", + "timeLeft": "Zbývá {{timeLeft}}", + "finishAt": "Končí ve {{timeFinished, datetime}}", + "buttons": { + "episodes": "Epizody", + "source": "Zdroj", + "captions": "Titulky", + "download": "Stáhnout", + "settings": "Nastavení", + "pictureInPicture": "Obraz v obraze", + "playbackSpeed": "Rychlost přehrávání" + }, + "popouts": { + "back": "Zpět", + "sources": "Zdroje", + "seasons": "Sezóny", + "captions": "Titulky", + "playbackSpeed": "Rychlost přehrávání", + "customPlaybackSpeed": "Vlastní rychlost přehrávání", + "captionPreferences": { + "title": "Upravit", + "delay": "Zpoždení", + "fontSize": "Velikost", + "opacity": "Průhlednost", + "color": "Barva" + }, + "episode": "E{{index}} - {{title}}", + "noCaptions": "Žádné titulky", + "linkedCaptions": "Propojené titulky", + "customCaption": "Vlastní titulky", + "uploadCustomCaption": "Nahrát titulky", + "noEmbeds": "Nebyla nalezena žádná vložení pro tento zdroj", + + "errors": { + "loadingWentWong": "Něco se nepovedlo při načítání epizod pro {{seasonTitle}}", + "embedsError": "Něco se povedlo při načítání vložení pro tuhle věc, kterou máte tak rádi" + }, + "descriptions": { + "sources": "Jakého poskytovatele chcete použít?", + "embeds": "Vyberte video, které chcete sledovat", + "seasons": "Vyberte sérii, kterou chcete sledovat", + "episode": "Vyberte epizodu", + "captions": "Vyberte jazyk titulků", + "captionPreferences": "Upravte titulky tak, jak se Vám budou líbit", + "playbackSpeed": "Změňtě rychlost přehrávání" + } + }, + "errors": { + "fatalError": "Došlo k závažné chybě v přehrávači videa, prosím nahlašte ji na <0>Discord serveru nebo na <1>GitHubu." + } + }, + "settings": { + "title": "Nastavení", + "language": "Jazyk", + "captionLanguage": "Jazyk titulků" + }, + "v3": { + "newSiteTitle": "Je dostupná nová verze!", + "newDomain": "https://movie-web.app", + "newDomainText": "movie-web se brzy přesune na novou doménu: <0>https://movie-web.app. Nezapomeňte si aktualizovat záložky, protože <1>stará stránka přestane fungovat {{date}}.", + "tireless": "Pracovali jsme neúnavně na této nové aktualizaci, a tak doufáme, že se Vám bude líbit co jsme v posledních měsících kuchtili.", + "leaveAnnouncement": "Vezměte mě tam!" + }, + "casting": { + "casting": "Přehrávání do zařízení..." + }, + "errors": { + "offline": "Zkontrolujte své internetové připojení" + } +} diff --git a/src/setup/locales/de/translation.json b/src/setup/locales/de/translation.json new file mode 100644 index 00000000..5edad4d0 --- /dev/null +++ b/src/setup/locales/de/translation.json @@ -0,0 +1,127 @@ +{ + "global": { + "name": "movie-web" + }, + "search": { + "loading_series": "Auf der Suche nach Ihrer Lieblingsserie...", + "loading_movie": "Auf der Suche nach Ihren Lieblingsfilmen...", + "loading": "Wird geladen...", + "allResults": "Das ist alles, was wir haben!", + "noResults": "Wir haben nichts gefunden!", + "allFailed": "Das Medium wurde nicht gefunden, bitte versuchen Sie es erneut!", + "headingTitle": "Suchergebnisse", + "bookmarks": "Favoriten", + "continueWatching": "Weiter ansehen", + "title": "Was willst du sehen?", + "placeholder": "Was willst du sehen?" + }, + "media": { + "movie": "Filme", + "series": "Serie", + "stopEditing": "Beenden Sie die Bearbeitung", + "errors": { + "genericTitle": "Hoppla, etwas ist falsch gegangen!", + "failedMeta": "Metadaten konnten nicht geladen werden", + "mediaFailed": "Wir konnten die angeforderten Medien nicht abrufen.", + "videoFailed": "Beim Abspielen des angeforderten Videos ist ein Fehler aufgetreten. <0>Discord Oder weiter <1>GitHub." + } + }, + "seasons": { + "seasonAndEpisode": "S{{season}} E{{episode}}" + }, + "notFound": { + "genericTitle": "Nicht gefunden", + "backArrow": "Zurück zur Startseite", + "media": { + "title": "Das Medium konnte nicht gefunden werden", + "description": "Wir konnten die angeforderten Medien nicht finden." + }, + "provider": { + "title": "Dieser Anbieter wurde deaktiviert", + "description": "Wir hatten Probleme mit dem Anbieter oder er war zu instabil, sodass wir ihn deaktivieren mussten." + }, + "page": { + "title": "Diese Seite kann nicht gefunden werden", + "description": "Wir haben überall gesucht, aber am Ende konnten wir die gesuchte Seite nicht finden." + } + }, + "searchBar": { + "movie": "Film", + "series": "Serie", + "Search": "Forschen" + }, + "videoPlayer": { + "findingBestVideo": "Auf der Suche nach dem besten Video für Sie", + "noVideos": "Entschuldigung, wir konnten keine Videos für Sie finden", + "loading": "Wird geladen...", + "backToHome": "Zurück zur Startseite", + "backToHomeShort": "Rückmeldung", + "seasonAndEpisode": "S{{season}} E{{episode}}", + "timeLeft": "{{timeLeft}} bleibt", + "finishAt": "Ende um {{timeFinished, datetime}}", + "buttons": { + "episodes": "Folgen", + "source": "Quelle", + "captions": "Untertitel", + "download": "Herunterladen", + "settings": "Einstellungen", + "pictureInPicture": "Bild-im-Bild", + "playbackSpeed": "Wiedergabegeschwindigkeit" + }, + "popouts": { + "back": "Zurück", + "sources": "Quellen", + "seasons": "Saison", + "captions": "Untertitel", + "playbackSpeed": "Lesegeschwindigkeit", + "customPlaybackSpeed": "Benutzerdefinierte Wiedergabegeschwindigkeit", + "captionPreferences": { + "title": "Personifizieren", + "delay": "Zeitlimit", + "fontSize": "Größe", + "opacity": "Opazität", + "color": "Farbe" + }, + "episode": "E{{index}} - {{title}}", + "noCaptions": "Keine Untertitel", + "linkedCaptions": "Verbundene Untertitel", + "customCaption": "Benutzerdefinierte Untertitel", + "uploadCustomCaption": "Untertitel hochladen", + "noEmbeds": "Für diese Quelle wurde kein eingebetteter Inhalt gefunden", + "errors": { + "loadingWentWong": "Beim Laden der Folgen für {{seasonTitle}} ist ein Problem aufgetreten ", + "embedsError": "Beim Laden der eingebetteter Medien ist ein Problem aufgetreten" + }, + "descriptions": { + "sources": "Welchen Anbieter möchten Sie nutzen?", + "embeds": "Wählen Sie das Video aus, das Sie ansehen möchten", + "seasons": "Wählen Sie die Staffel aus, die Sie sehen möchten", + "episode": "Wählen Sie eine Folge aus", + "captions": "Wählen Sie eine Untertitelsprache", + "captionPreferences": "Passen Sie das Erscheinungsbild von Untertiteln an", + "playbackSpeed": "Wiedergabegeschwindigkeit ändern" + } + }, + "errors": { + "fatalError": "Der Videoplayer hat einen Fehler festgestellt, bitte melden Sie ihn dem Server <0>Discord Oder weiter <1>GitHub." + } + }, + "settings": { + "title": "Einstellungen", + "language": "Sprache", + "captionLanguage": "Untertitelsprache" + }, + "v3": { + "newSiteTitle": "Neue Version verfügbar!", + "newDomain": "https://movie-web.app", + "newDomainText": "movie-web zieht in Kürze auf eine neue Domain um: <0>https://movie-web.app. <1>Die alte Website funktioniert nicht mehr {{date}}.", + "tireless": "Wir haben unermüdlich an diesem neuen Update gearbeitet und hoffen, dass Ihnen das gefällt, was wir in den letzten Monaten vorbereitet haben.", + "leaveAnnouncement": "Bring mich dahin!" + }, + "casting": { + "casting": "An Gerät übertragen..." + }, + "errors": { + "offline": "Ihre Internetverbindung ist instabil" + } +} diff --git a/src/setup/locales/en/translation.json b/src/setup/locales/en/translation.json index fba37d84..d8b81da4 100644 --- a/src/setup/locales/en/translation.json +++ b/src/setup/locales/en/translation.json @@ -58,7 +58,7 @@ "backToHomeShort": "Back", "seasonAndEpisode": "S{{season}} E{{episode}}", "timeLeft": "{{timeLeft}} left", - "finishAt": "Finish at {{timeFinished}}", + "finishAt": "Finish at {{timeFinished, datetime}}", "buttons": { "episodes": "Episodes", "source": "Source", diff --git a/src/setup/locales/fr/translation.json b/src/setup/locales/fr/translation.json index a54f38ec..408570df 100644 --- a/src/setup/locales/fr/translation.json +++ b/src/setup/locales/fr/translation.json @@ -58,7 +58,7 @@ "backToHomeShort": "Retour", "seasonAndEpisode": "S{{season}} E{{episode}}", "timeLeft": "{{timeLeft}} restant", - "finishAt": "Terminer à {{timeFinished}}", + "finishAt": "Terminer à {{timeFinished, datetime}}", "buttons": { "episodes": "Épisodes", "source": "Source", diff --git a/src/setup/locales/nl/translation.json b/src/setup/locales/nl/translation.json index 94e796e8..23ecb618 100644 --- a/src/setup/locales/nl/translation.json +++ b/src/setup/locales/nl/translation.json @@ -58,7 +58,7 @@ "backToHomeShort": "Terug", "seasonAndEpisode": "S{{season}} A{{episode}}", "timeLeft": "Nog {{timeLeft}}", - "finishAt": "Afgelopen om {{timeFinished}}", + "finishAt": "Afgelopen om {{timeFinished, datetime}}", "buttons": { "episodes": "Afleveringen", "source": "Bron", diff --git a/src/setup/locales/zh/translation.json b/src/setup/locales/zh/translation.json new file mode 100644 index 00000000..39b0998d --- /dev/null +++ b/src/setup/locales/zh/translation.json @@ -0,0 +1,127 @@ +{ + "global": { + "name": "movie-web" + }, + "search": { + "loading_series": "正在获取您最喜欢的连续剧……", + "loading_movie": "正在获取您最喜欢的影片……", + "loading": "载入中……", + "allResults": "以上是我们能找到的所有结果!", + "noResults": "我们找不到任何结果!", + "allFailed": "查找媒体失败,请重试!", + "headingTitle": "搜索结果", + "bookmarks": "书签", + "continueWatching": "继续观看", + "title": "您想看些什么?", + "placeholder": "您想看些什么?" + }, + "media": { + "movie": "电影", + "series": "连续剧", + "stopEditing": "退出编辑", + "errors": { + "genericTitle": "哎呀,出问题了!", + "failedMeta": "加载元数据失败", + "mediaFailed": "我们未能请求到您要求的媒体,检查互联网连接并重试。", + "videoFailed": "我们在播放您要求的视频时遇到了错误。如果错误持续发生,请向 <0>Discord 服务器或 <1>GitHub 提交问题报告。" + } + }, + "seasons": { + "seasonAndEpisode": "第{{season}}季 第{{episode}}集" + }, + "notFound": { + "genericTitle": "未找到", + "backArrow": "返回首页", + "media": { + "title": "无法找到媒体", + "description": "我们无法找到您请求的媒体。它可能已被删除,或您篡改了 URL" + }, + "provider": { + "title": "该内容提供者已被停用", + "description": "我们的提供者出现问题,或是太不稳定,导致无法使用,所以我们不得不将其停用。" + }, + "page": { + "title": "无法找到页面", + "description": "我们已经到处找过了:不管是垃圾桶下、橱柜里或是代理之后。但最终并没有发现您查找的页面。" + } + }, + "searchBar": { + "movie": "电影", + "series": "连续剧", + "Search": "搜索" + }, + "videoPlayer": { + "findingBestVideo": "正在为您探测最佳视频", + "noVideos": "哎呀,无法为您找到任何视频", + "loading": "载入中……", + "backToHome": "返回首页", + "backToHomeShort": "返回", + "seasonAndEpisode": "第{{season}}季 第{{episode}}集", + "timeLeft": "还剩余 {{timeLeft}}", + "finishAt": "在 {{timeFinished, datetime}} 结束", + "buttons": { + "episodes": "分集", + "source": "视频源", + "captions": "字幕", + "download": "下载", + "settings": "设置", + "pictureInPicture": "画中画", + "playbackSpeed": "播放速度" + }, + "popouts": { + "back": "返回", + "sources": "视频源", + "seasons": "分季", + "captions": "字幕", + "playbackSpeed": "播放速度", + "customPlaybackSpeed": "自定义播放速度", + "captionPreferences": { + "title": "自定义", + "delay": "延迟", + "fontSize": "尺寸", + "opacity": "透明度", + "color": "颜色" + }, + "episode": "第{{index}}集 - {{title}}", + "noCaptions": "没有字幕", + "linkedCaptions": "已链接字幕", + "customCaption": "自定义字幕", + "uploadCustomCaption": "上传字幕", + "noEmbeds": "未发现该视频源的嵌入内容", + "errors": { + "loadingWentWong": "加载 {{seasonTitle}} 的分集时出现了一些问题", + "embedsError": "为您喜欢的这一东西加载嵌入内容时出现了一些问题" + }, + "descriptions": { + "sources": "您想使用哪个内容提供者?", + "embeds": "选择要观看的视频", + "seasons": "选择您要观看的季", + "episode": "选择一个分集", + "captions": "选择字幕语言", + "captionPreferences": "让字幕看起来如您所想", + "playbackSpeed": "改变播放速度" + } + }, + "errors": { + "fatalError": "视频播放器遇到致命错误,请向 <0>Discord 服务器或 <1>GitHub 报告。" + } + }, + "settings": { + "title": "设置", + "language": "语言", + "captionLanguage": "字幕语言" + }, + "v3": { + "newSiteTitle": "新的版本现已发布!", + "newDomain": "https://movie-web.app", + "newDomainText": "movie-web 将很快转移到新的域名:<0>https://movie-web.app。请确保已经更新全部书签链接,<1>旧网站将于 {{date}} 停止工作。", + "tireless": "为了这一新版本,我们不懈努力,希望您会喜欢我们在过去几个月中所做的一切。", + "leaveAnnouncement": "请带我去!" + }, + "casting": { + "casting": "正在投射到设备……" + }, + "errors": { + "offline": "检查您的互联网连接" + } +} diff --git a/src/video/components/actions/TimeAction.tsx b/src/video/components/actions/TimeAction.tsx index 46a27b44..9a05d6fa 100644 --- a/src/video/components/actions/TimeAction.tsx +++ b/src/video/components/actions/TimeAction.tsx @@ -55,20 +55,20 @@ export function TimeAction(props: Props) { hasHours ); const duration = formatSeconds(videoTime.duration, hasHours); - const timeLeft = formatSeconds( + const remaining = formatSeconds( (videoTime.duration - videoTime.time) / mediaPlaying.playbackSpeed, hasHours ); const timeFinished = new Date( new Date().getTime() + - (videoTime.duration * 1000) / mediaPlaying.playbackSpeed - ).toLocaleTimeString("en-US", { - hour: "numeric", - minute: "numeric", - hour12: true, - }); + ((videoTime.duration - videoTime.time) * 1000) / + mediaPlaying.playbackSpeed + ); const formattedTimeFinished = ` - ${t("videoPlayer.finishAt", { timeFinished, + formatParams: { + timeFinished: { hour: "numeric", minute: "numeric" }, + }, })}`; let formattedTime: string; @@ -77,10 +77,10 @@ export function TimeAction(props: Props) { formattedTime = `${currentTime} ${props.noDuration ? "" : `/ ${duration}`}`; } else if (timeFormat === VideoPlayerTimeFormat.REMAINING && !isMobile) { formattedTime = `${t("videoPlayer.timeLeft", { - timeLeft, + timeLeft: remaining, })}${videoTime.time === videoTime.duration ? "" : formattedTimeFinished} `; } else if (timeFormat === VideoPlayerTimeFormat.REMAINING && isMobile) { - formattedTime = `-${timeLeft}`; + formattedTime = `-${remaining}`; } else { formattedTime = ""; }