diff --git a/README.md b/README.md index fdc4776d..dd97d8e8 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ We do not want this project to be yet another bulky streaming site, instead it a On top of that, hosting should be as cheap and simple as possible. Just a static website with a proxy, with an optional backend if you want cross-device syncing. -Content is fetched from third parties and scraping is done fully done on the client. This means that the hoster has no files or media on their server. All files are streamed directly from the third parties. +Content is fetched from third parties and scraping is fully done on the client. This means that the hoster has no files or media on their server. All files are streamed directly from the third parties. ## ⚠️ Limitations diff --git a/index.html b/index.html index 4dc4ac00..1336f2ee 100644 --- a/index.html +++ b/index.html @@ -15,6 +15,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -58,4 +161,4 @@ - + \ No newline at end of file diff --git a/package.json b/package.json index 1649434d..dd1c6000 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "movie-web", - "version": "4.1.3", + "version": "4.2.0", "private": true, "homepage": "https://movie-web.app", "scripts": { @@ -28,7 +28,7 @@ "dependencies": { "@formkit/auto-animate": "^0.8.1", "@headlessui/react": "^1.7.17", - "@movie-web/providers": "^1.1.5", + "@movie-web/providers": "^2.0.1", "@noble/hashes": "^1.3.3", "@react-spring/web": "^9.7.3", "@scure/bip39": "^1.2.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 50176963..5efe6ac9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,8 +18,8 @@ dependencies: specifier: ^1.7.17 version: 1.7.17(react-dom@18.2.0)(react@18.2.0) '@movie-web/providers': - specifier: ^1.1.5 - version: 1.1.5 + specifier: ^2.0.1 + version: 2.0.1 '@noble/hashes': specifier: ^1.3.3 version: 1.3.3 @@ -1912,14 +1912,14 @@ packages: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 - /@movie-web/providers@1.1.5: - resolution: {integrity: sha512-JnqU6nVsEZ83UVcsizqzcr/vtwvHHlZt9vYwGiJEAyaUgaXJPZz3C90qzaRZ8CVWydUTRAmjRP3daRFtC1nKHw==} + /@movie-web/providers@2.0.1: + resolution: {integrity: sha512-PB1OxSsm4zwD6fuWBCmuqwMpt1UnlKssVZ8jGl6gHioS9/qFXR9Rsd8SnWISQWxF6lVRUp0DBXHfCrXGY/jwhA==} dependencies: cheerio: 1.0.0-rc.12 crypto-js: 4.2.0 form-data: 4.0.0 iso-639-1: 3.1.0 - nanoid: 3.3.6 + nanoid: 3.3.7 node-fetch: 2.7.0 unpacker: 1.0.1 transitivePeerDependencies: @@ -5234,17 +5234,10 @@ packages: stylis: 4.3.0 dev: false - /nanoid@3.3.6: - resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: false - /nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - dev: true /nanoid@5.0.4: resolution: {integrity: sha512-vAjmBf13gsmhXSgBrtIclinISzFFy22WwCYoyilZlsrRXNIHSwgFQ1bEdjRwMT3aoadeIF6HMuDRlOxzfXV8ig==} diff --git a/public/splash_screens/10.2__iPad_landscape.png b/public/splash_screens/10.2__iPad_landscape.png new file mode 100644 index 00000000..62d541fc Binary files /dev/null and b/public/splash_screens/10.2__iPad_landscape.png differ diff --git a/public/splash_screens/10.2__iPad_portrait.png b/public/splash_screens/10.2__iPad_portrait.png new file mode 100644 index 00000000..97c5cea9 Binary files /dev/null and b/public/splash_screens/10.2__iPad_portrait.png differ diff --git a/public/splash_screens/10.5__iPad_Air_landscape.png b/public/splash_screens/10.5__iPad_Air_landscape.png new file mode 100644 index 00000000..f8001cf3 Binary files /dev/null and b/public/splash_screens/10.5__iPad_Air_landscape.png differ diff --git a/public/splash_screens/10.5__iPad_Air_portrait.png b/public/splash_screens/10.5__iPad_Air_portrait.png new file mode 100644 index 00000000..c6750e7a Binary files /dev/null and b/public/splash_screens/10.5__iPad_Air_portrait.png differ diff --git a/public/splash_screens/10.9__iPad_Air_landscape.png b/public/splash_screens/10.9__iPad_Air_landscape.png new file mode 100644 index 00000000..03a44384 Binary files /dev/null and b/public/splash_screens/10.9__iPad_Air_landscape.png differ diff --git a/public/splash_screens/10.9__iPad_Air_portrait.png b/public/splash_screens/10.9__iPad_Air_portrait.png new file mode 100644 index 00000000..d7c068b2 Binary files /dev/null and b/public/splash_screens/10.9__iPad_Air_portrait.png differ diff --git a/public/splash_screens/11__iPad_Pro__10.5__iPad_Pro_landscape.png b/public/splash_screens/11__iPad_Pro__10.5__iPad_Pro_landscape.png new file mode 100644 index 00000000..c2e02978 Binary files /dev/null and b/public/splash_screens/11__iPad_Pro__10.5__iPad_Pro_landscape.png differ diff --git a/public/splash_screens/11__iPad_Pro__10.5__iPad_Pro_portrait.png b/public/splash_screens/11__iPad_Pro__10.5__iPad_Pro_portrait.png new file mode 100644 index 00000000..59178e3f Binary files /dev/null and b/public/splash_screens/11__iPad_Pro__10.5__iPad_Pro_portrait.png differ diff --git a/public/splash_screens/12.9__iPad_Pro_landscape.png b/public/splash_screens/12.9__iPad_Pro_landscape.png new file mode 100644 index 00000000..db66590f Binary files /dev/null and b/public/splash_screens/12.9__iPad_Pro_landscape.png differ diff --git a/public/splash_screens/12.9__iPad_Pro_portrait.png b/public/splash_screens/12.9__iPad_Pro_portrait.png new file mode 100644 index 00000000..2fc0f2a0 Binary files /dev/null and b/public/splash_screens/12.9__iPad_Pro_portrait.png differ diff --git a/public/splash_screens/4__iPhone_SE__iPod_touch_5th_generation_and_later_landscape.png b/public/splash_screens/4__iPhone_SE__iPod_touch_5th_generation_and_later_landscape.png new file mode 100644 index 00000000..c484d5b3 Binary files /dev/null and b/public/splash_screens/4__iPhone_SE__iPod_touch_5th_generation_and_later_landscape.png differ diff --git a/public/splash_screens/4__iPhone_SE__iPod_touch_5th_generation_and_later_portrait.png b/public/splash_screens/4__iPhone_SE__iPod_touch_5th_generation_and_later_portrait.png new file mode 100644 index 00000000..2b06bf2e Binary files /dev/null and b/public/splash_screens/4__iPhone_SE__iPod_touch_5th_generation_and_later_portrait.png differ diff --git a/public/splash_screens/8.3__iPad_Mini_landscape.png b/public/splash_screens/8.3__iPad_Mini_landscape.png new file mode 100644 index 00000000..d43bf7c1 Binary files /dev/null and b/public/splash_screens/8.3__iPad_Mini_landscape.png differ diff --git a/public/splash_screens/8.3__iPad_Mini_portrait.png b/public/splash_screens/8.3__iPad_Mini_portrait.png new file mode 100644 index 00000000..83eace82 Binary files /dev/null and b/public/splash_screens/8.3__iPad_Mini_portrait.png differ diff --git a/public/splash_screens/9.7__iPad_Pro__7.9__iPad_mini__9.7__iPad_Air__9.7__iPad_landscape.png b/public/splash_screens/9.7__iPad_Pro__7.9__iPad_mini__9.7__iPad_Air__9.7__iPad_landscape.png new file mode 100644 index 00000000..64a09053 Binary files /dev/null and b/public/splash_screens/9.7__iPad_Pro__7.9__iPad_mini__9.7__iPad_Air__9.7__iPad_landscape.png differ diff --git a/public/splash_screens/9.7__iPad_Pro__7.9__iPad_mini__9.7__iPad_Air__9.7__iPad_portrait.png b/public/splash_screens/9.7__iPad_Pro__7.9__iPad_mini__9.7__iPad_Air__9.7__iPad_portrait.png new file mode 100644 index 00000000..029e83c4 Binary files /dev/null and b/public/splash_screens/9.7__iPad_Pro__7.9__iPad_mini__9.7__iPad_Air__9.7__iPad_portrait.png differ diff --git a/public/splash_screens/iPhone_11_Pro_Max__iPhone_XS_Max_landscape.png b/public/splash_screens/iPhone_11_Pro_Max__iPhone_XS_Max_landscape.png new file mode 100644 index 00000000..ed0ce416 Binary files /dev/null and b/public/splash_screens/iPhone_11_Pro_Max__iPhone_XS_Max_landscape.png differ diff --git a/public/splash_screens/iPhone_11_Pro_Max__iPhone_XS_Max_portrait.png b/public/splash_screens/iPhone_11_Pro_Max__iPhone_XS_Max_portrait.png new file mode 100644 index 00000000..da53f3e4 Binary files /dev/null and b/public/splash_screens/iPhone_11_Pro_Max__iPhone_XS_Max_portrait.png differ diff --git a/public/splash_screens/iPhone_11__iPhone_XR_landscape.png b/public/splash_screens/iPhone_11__iPhone_XR_landscape.png new file mode 100644 index 00000000..386e0920 Binary files /dev/null and b/public/splash_screens/iPhone_11__iPhone_XR_landscape.png differ diff --git a/public/splash_screens/iPhone_11__iPhone_XR_portrait.png b/public/splash_screens/iPhone_11__iPhone_XR_portrait.png new file mode 100644 index 00000000..590a317e Binary files /dev/null and b/public/splash_screens/iPhone_11__iPhone_XR_portrait.png differ diff --git a/public/splash_screens/iPhone_13_mini__iPhone_12_mini__iPhone_11_Pro__iPhone_XS__iPhone_X_landscape.png b/public/splash_screens/iPhone_13_mini__iPhone_12_mini__iPhone_11_Pro__iPhone_XS__iPhone_X_landscape.png new file mode 100644 index 00000000..7bd624b3 Binary files /dev/null and b/public/splash_screens/iPhone_13_mini__iPhone_12_mini__iPhone_11_Pro__iPhone_XS__iPhone_X_landscape.png differ diff --git a/public/splash_screens/iPhone_13_mini__iPhone_12_mini__iPhone_11_Pro__iPhone_XS__iPhone_X_portrait.png b/public/splash_screens/iPhone_13_mini__iPhone_12_mini__iPhone_11_Pro__iPhone_XS__iPhone_X_portrait.png new file mode 100644 index 00000000..a70fae80 Binary files /dev/null and b/public/splash_screens/iPhone_13_mini__iPhone_12_mini__iPhone_11_Pro__iPhone_XS__iPhone_X_portrait.png differ diff --git a/public/splash_screens/iPhone_14_Plus__iPhone_13_Pro_Max__iPhone_12_Pro_Max_landscape.png b/public/splash_screens/iPhone_14_Plus__iPhone_13_Pro_Max__iPhone_12_Pro_Max_landscape.png new file mode 100644 index 00000000..1b06793b Binary files /dev/null and b/public/splash_screens/iPhone_14_Plus__iPhone_13_Pro_Max__iPhone_12_Pro_Max_landscape.png differ diff --git a/public/splash_screens/iPhone_14_Plus__iPhone_13_Pro_Max__iPhone_12_Pro_Max_portrait.png b/public/splash_screens/iPhone_14_Plus__iPhone_13_Pro_Max__iPhone_12_Pro_Max_portrait.png new file mode 100644 index 00000000..88a9afdd Binary files /dev/null and b/public/splash_screens/iPhone_14_Plus__iPhone_13_Pro_Max__iPhone_12_Pro_Max_portrait.png differ diff --git a/public/splash_screens/iPhone_14__iPhone_13_Pro__iPhone_13__iPhone_12_Pro__iPhone_12_landscape.png b/public/splash_screens/iPhone_14__iPhone_13_Pro__iPhone_13__iPhone_12_Pro__iPhone_12_landscape.png new file mode 100644 index 00000000..d40426eb Binary files /dev/null and b/public/splash_screens/iPhone_14__iPhone_13_Pro__iPhone_13__iPhone_12_Pro__iPhone_12_landscape.png differ diff --git a/public/splash_screens/iPhone_14__iPhone_13_Pro__iPhone_13__iPhone_12_Pro__iPhone_12_portrait.png b/public/splash_screens/iPhone_14__iPhone_13_Pro__iPhone_13__iPhone_12_Pro__iPhone_12_portrait.png new file mode 100644 index 00000000..0496f4c7 Binary files /dev/null and b/public/splash_screens/iPhone_14__iPhone_13_Pro__iPhone_13__iPhone_12_Pro__iPhone_12_portrait.png differ diff --git a/public/splash_screens/iPhone_15_Pro_Max__iPhone_15_Plus__iPhone_14_Pro_Max_landscape.png b/public/splash_screens/iPhone_15_Pro_Max__iPhone_15_Plus__iPhone_14_Pro_Max_landscape.png new file mode 100644 index 00000000..582988cb Binary files /dev/null and b/public/splash_screens/iPhone_15_Pro_Max__iPhone_15_Plus__iPhone_14_Pro_Max_landscape.png differ diff --git a/public/splash_screens/iPhone_15_Pro_Max__iPhone_15_Plus__iPhone_14_Pro_Max_portrait.png b/public/splash_screens/iPhone_15_Pro_Max__iPhone_15_Plus__iPhone_14_Pro_Max_portrait.png new file mode 100644 index 00000000..4101bc0e Binary files /dev/null and b/public/splash_screens/iPhone_15_Pro_Max__iPhone_15_Plus__iPhone_14_Pro_Max_portrait.png differ diff --git a/public/splash_screens/iPhone_15_Pro__iPhone_15__iPhone_14_Pro_landscape.png b/public/splash_screens/iPhone_15_Pro__iPhone_15__iPhone_14_Pro_landscape.png new file mode 100644 index 00000000..a88d6e00 Binary files /dev/null and b/public/splash_screens/iPhone_15_Pro__iPhone_15__iPhone_14_Pro_landscape.png differ diff --git a/public/splash_screens/iPhone_15_Pro__iPhone_15__iPhone_14_Pro_portrait.png b/public/splash_screens/iPhone_15_Pro__iPhone_15__iPhone_14_Pro_portrait.png new file mode 100644 index 00000000..2c56a023 Binary files /dev/null and b/public/splash_screens/iPhone_15_Pro__iPhone_15__iPhone_14_Pro_portrait.png differ diff --git a/public/splash_screens/iPhone_8_Plus__iPhone_7_Plus__iPhone_6s_Plus__iPhone_6_Plus_landscape.png b/public/splash_screens/iPhone_8_Plus__iPhone_7_Plus__iPhone_6s_Plus__iPhone_6_Plus_landscape.png new file mode 100644 index 00000000..e1646b9c Binary files /dev/null and b/public/splash_screens/iPhone_8_Plus__iPhone_7_Plus__iPhone_6s_Plus__iPhone_6_Plus_landscape.png differ diff --git a/public/splash_screens/iPhone_8_Plus__iPhone_7_Plus__iPhone_6s_Plus__iPhone_6_Plus_portrait.png b/public/splash_screens/iPhone_8_Plus__iPhone_7_Plus__iPhone_6s_Plus__iPhone_6_Plus_portrait.png new file mode 100644 index 00000000..2e1f04b5 Binary files /dev/null and b/public/splash_screens/iPhone_8_Plus__iPhone_7_Plus__iPhone_6s_Plus__iPhone_6_Plus_portrait.png differ diff --git a/public/splash_screens/iPhone_8__iPhone_7__iPhone_6s__iPhone_6__4.7__iPhone_SE_landscape.png b/public/splash_screens/iPhone_8__iPhone_7__iPhone_6s__iPhone_6__4.7__iPhone_SE_landscape.png new file mode 100644 index 00000000..c6bd57a4 Binary files /dev/null and b/public/splash_screens/iPhone_8__iPhone_7__iPhone_6s__iPhone_6__4.7__iPhone_SE_landscape.png differ diff --git a/public/splash_screens/iPhone_8__iPhone_7__iPhone_6s__iPhone_6__4.7__iPhone_SE_portrait.png b/public/splash_screens/iPhone_8__iPhone_7__iPhone_6s__iPhone_6__4.7__iPhone_SE_portrait.png new file mode 100644 index 00000000..24788f1a Binary files /dev/null and b/public/splash_screens/iPhone_8__iPhone_7__iPhone_6s__iPhone_6__4.7__iPhone_SE_portrait.png differ diff --git a/public/splash_screens/icon.png b/public/splash_screens/icon.png new file mode 100644 index 00000000..a43a415d Binary files /dev/null and b/public/splash_screens/icon.png differ diff --git a/src/assets/languages.ts b/src/assets/languages.ts index 0cbc0895..6af96bf7 100644 --- a/src/assets/languages.ts +++ b/src/assets/languages.ts @@ -6,6 +6,7 @@ import es from "@/assets/locales/es.json"; import et from "@/assets/locales/et.json"; import fr from "@/assets/locales/fr.json"; import he from "@/assets/locales/he.json"; +import hi from "@/assets/locales/hi.json"; import it from "@/assets/locales/it.json"; import lv from "@/assets/locales/lv.json"; import minion from "@/assets/locales/minion.json"; @@ -13,10 +14,12 @@ import ne from "@/assets/locales/ne.json"; import nl from "@/assets/locales/nl.json"; import pirate from "@/assets/locales/pirate.json"; import pl from "@/assets/locales/pl.json"; +import ptbr from "@/assets/locales/pt-BR.json"; import sv from "@/assets/locales/sv.json"; import th from "@/assets/locales/th.json"; import tok from "@/assets/locales/tok.json"; import tr from "@/assets/locales/tr.json"; +import uk from "@/assets/locales/uk.json"; import vi from "@/assets/locales/vi.json"; import zh from "@/assets/locales/zh.json"; @@ -42,6 +45,9 @@ export const locales = { es, et, tok, + hi, + pt: ptbr, + uk, }; export type Locales = keyof typeof locales; diff --git a/src/assets/locales/ar.json b/src/assets/locales/ar.json index 353ea0ef..aebe1eef 100644 --- a/src/assets/locales/ar.json +++ b/src/assets/locales/ar.json @@ -173,20 +173,8 @@ "enabled": "جارٍ العرض على الجهاز..." }, "menus": { - "captions": { - "customChoice": "اختيار ترجمة من ملف", - "customizeLabel": "تخصيص", - "offChoice": "إيقاف", - "settings": { - "delay": "تأخير الترجمة", - "fixCapitals": "تصحيح التهجئة" - }, - "title": "مقاطع الترجمة", - "unknownLanguage": "غير معروف" - }, "downloads": { "disclaimer": "يتم أخذ التنزيلات مباشرةً من قبل مقدم الخدمة. movie-web لاسيطرة له على كيفية توفير تلك التنزيلات.", - "downloadCaption": "تنزيل مقاطع الترجمة الحالية", "downloadVideo": "تنزيل الفيديو", "onAndroid": { "1": "للتنزيل على أندرويد، أنقر زر التنزيل وفي الصفحة الموالية إضغط باستمرار على الفيديو، وبعدها اختر حفظ.", @@ -224,9 +212,7 @@ "title": "جودة" }, "settings": { - "captionItem": "إعدادات الترجمة", "downloadItem": "تنزيل", - "enableCaptions": "تفعيل مقاطع الترجمة", "experienceSection": "تجربة المشاهدة", "playbackItem": "إعدادات التشغيل", "qualityItem": "جودة", @@ -370,13 +356,6 @@ }, "title": "المظهر" }, - "captions": { - "backgroundLabel": "تعتيم الخلفية", - "colorLabel": "لون", - "previewQuote": "يجب ألا أخاف. الخوف هو قاتل العقل.", - "textSizeLabel": "حجم النص", - "title": "مقاطع الترجمة" - }, "connections": { "server": { "description": "إذا كنت ترغب في الاتصال بخادم خلفي مخصص لتخزين بياناتك، قم بتفعيل هذا ووفر الرابط.", diff --git a/src/assets/locales/cs.json b/src/assets/locales/cs.json index 291d3381..331fe6c6 100644 --- a/src/assets/locales/cs.json +++ b/src/assets/locales/cs.json @@ -174,21 +174,11 @@ "enabled": "Odesílání do zařízení..." }, "menus": { - "captions": { - "customChoice": "Nahrát titulky ze souboru", - "customizeLabel": "Přizpůsobit", - "offChoice": "Vypnuto", - "settings": { - "delay": "Posunutí titulků", - "fixCapitals": "Opravit velká písmena" - }, - "title": "Titulky", - "unknownLanguage": "Neznámo" - }, "downloads": { "disclaimer": "Stahování probíhá přímo u poskytovatele. movie-web nemá kontrolu nad tím, jak jsou stahování poskytovány.", - "downloadCaption": "Stáhnout titulky", + "downloadPlaylist": "Stáhnout playlist", "downloadVideo": "Stáhnout video", + "hlsDisclaimer": "Stahování probíhá přímo u poskytovatele. movie-web nemá kontrolu nad tím, jak jsou stahování poskytovány. Vezměte prosím na vědomí, že stahujete HLS playlist, který je určen pro uživatele obeznámené s pokročilým streamováním médií.", "onAndroid": { "1": "Na Androidu klikněte na tlačítko stahování, poté na nové stránce klepněte a podržte na videu a poté vyberte uložit.", "shortTitle": "Stahování / Android", @@ -225,9 +215,7 @@ "title": "Kvalita" }, "settings": { - "captionItem": "Nastavení titulků", "downloadItem": "Stáhnout", - "enableCaptions": "Povolit titulky", "experienceSection": "Zážitek sledování", "playbackItem": "Nastavení přehrávání", "qualityItem": "Kvalita", @@ -249,6 +237,17 @@ }, "title": "Zdroje", "unknownOption": "Neznámý" + }, + "subtitles": { + "customizeLabel": "Přizpůsobit", + "offChoice": "Vypnuto", + "settings": { + "backlink": "Vlastní titulky", + "delay": "Posunutí titulků", + "fixCapitals": "Opravit velká písmena" + }, + "title": "Titulky", + "unknownLanguage": "Neznámé" } }, "metadata": { @@ -371,13 +370,6 @@ }, "title": "Vzhled" }, - "captions": { - "backgroundLabel": "Neprůhlednost pozadí", - "colorLabel": "Barva", - "previewQuote": "Nesmím se bát. Strach je zabiják mysli.", - "textSizeLabel": "Velikost písma", - "title": "Titulky" - }, "connections": { "server": { "description": "Pokud se chcete připojit k vlastnímu backendu pr ukládání dat, povolte toto a zadejte URL adresu.", @@ -415,6 +407,11 @@ "userId": "Uživatelské ID" } }, + "subtitles": { + "previewQuote": "Nesmím se bát. Strach je zabiják mysli.", + "textSizeLabel": "Velikost textu", + "title": "Titulky" + }, "unsaved": "Máte neuložené změny" } } diff --git a/src/assets/locales/de.json b/src/assets/locales/de.json index b25463c0..ed7db3d4 100644 --- a/src/assets/locales/de.json +++ b/src/assets/locales/de.json @@ -3,15 +3,15 @@ "description": "movie-web ist eine Web-App, welche das Internet nach Streams durchsucht. Das Team versucht einen minimalistischen Ansatz umzusetzen.", "faqTitle": "Häufig gestellte Fragen", "q1": { - "body": "movie-web hostet keinen eigenen Inhalt. Wenn du auf etwas zum Anschauen klickst, wird das Internet danach durchsucht (Auf dem Ladebildschirm und im Tab \"Videoquellen\" kannst du einstellen, welche Quellen verwendet werden sollen). movie-web lädt keine Videos hoch, alles Videos stammen aus der Suche.", - "title": "Woher kommen die Videos?" + "body": "movie-web hostet keinen eigenen Inhalt. Wenn du auf etwas zum Anschauen klickst, wird das Internet danach durchsucht (Auf dem Ladebildschirm und im Tab \"Videoquellen\" kannst du einstellen, welche Quellen verwendet werden sollen). movie-web lädt keine Videos hoch, alleVideos stammen aus der Suche.", + "title": "Woher stammen die Videos?" }, "q2": { "body": "Das Anfragen von Serien oder Filmen ist nicht möglich. movie-web verwaltet keine Inhalte. Alle Videos stammen vom Quellen aus dem Internet.", "title": "Wo kann ich eine Serie oder einen Film anfragen?" }, "q3": { - "body": "Unsere Suchergebnisse werden von The Movie Database (TMDB) bereitgestellt und angezeigt, egal ob unsere Videoquellen über dieses Video verfügen.", + "body": "Unsere Suchergebnisse werden von The Movie Database (TMDB) bereitgestellt und, egal ob unsere Videoquellen über dieses Video verfügen, angezeigt.", "title": "Die Suche zeigt eine Serie oder einen Film an, warum kann ich den dann nicht abspielen?" }, "title": "Über movie-web" @@ -25,7 +25,7 @@ "deviceNameLabel": "Gerätename", "deviceNamePlaceholder": "Handy", "generate": { - "description": "Deine Passphrase dient als dein Nutzername und Passwort. Speiche sie sicher ab, damit du dich in deinem Konto anmelden kannst", + "description": "Deine Passphrase dient als dein Nutzername und Passwort. Speichere sie sicher ab, damit du dich in deinem Konto anmelden kannst", "next": "Ich habe meine Passphrase gespeichert", "passphraseFrameLabel": "Passphrase", "title": "Deine Passphrase" @@ -44,8 +44,8 @@ "information": { "color1": "Profilfarbe 1", "color2": "Profilfarbe 2", - "header": "Gebe einen Namen für dein Gerät ein und wähle ein Nutzersymbol", - "icon": "Nutzersymbol", + "header": "Gebe einen Namen für dein Gerät ein und wähle ein Symbol", + "icon": "Symbol", "next": "Weiter", "title": "Kontoinformationen" } @@ -55,13 +55,13 @@ "text": "Hast du es korrekt konfiguriert?", "title": "Server nicht erreichbar" }, - "host": "Du verbindest dich mit <0>{{hostname}} - stelle sicher das du dem Server vertraust bevor du ein Konto erstellst", + "host": "Du verbindest dich mit <0>{{hostname}} - stelle sicher das du dem Server vertraust, bevor du ein Konto erstellst", "no": "Zurück", "title": "Vertraust du diesem Server?", "yes": "Ich vertraue diesem Server" }, "verify": { - "description": "Bitte gebe deine Passphrase vom früheren Schritt an, um zu bestätigen, dass du sie gespeichert hast und um dein Konto zu erstellen", + "description": "Bitte gebe deine Passphrase ein, um zu bestätigen, dass du sie gespeichert hast und um dein Konto zu erstellen", "invalidData": "Daten sind ungültig", "noMatch": "Passphrasen stimmen nicht überein", "passphraseLabel": "Deine 12-Wort Passphrase", @@ -111,25 +111,25 @@ "stopEditing": "Bearbeiten beenden" }, "search": { - "allResults": "Das ist alles, was wir haben!", + "allResults": "Das ist alles!", "failed": "Das Medium wurde nicht gefunden, bitte versuchen Sie es erneut!", "loading": "Wird geladen...", "noResults": "Wir haben nichts gefunden!", - "placeholder": "Was willst du gucken?", + "placeholder": "Was möchtest du schauen?", "sectionTitle": "Suchergebnisse" }, "titles": { "day": { - "default": "Was würdest du diesen Nachmittag gerne schauen?" + "default": "Was würdest du diesem Nachmittag gerne schauen?" }, "morning": { "default": "Was würdest du diesen Morgen gerne schauen?", "extra": [ - "Ich hab gehört Before Sunrise soll gut sein" + "Before Sunrise soll gut sein" ] }, "night": { - "default": "Was würdest du diesen Abend gerne schauen?", + "default": "Was möchtest du diesen Abend gerne schauen?", "extra": [ "Müde? Ich hab gehört The Exorcist soll gut sein." ] @@ -159,7 +159,7 @@ "notFound": { "badge": "Nicht gefunden", "goHome": "Zurück zur Startseite", - "message": "Wir haben überall gesucht: Unter den Eimern, im Schrank, hinter der Proxy, aber am Ende konnten wir die gesuchte Seite nicht finden.", + "message": "Wir haben überall gesucht: Unter den Eimern, im Schrank, hinter dem Proxy. Wir konnten die gesuchte Seite nicht finden.", "title": "Diese Seite wurde nicht gefunden" }, "overlays": { @@ -168,27 +168,17 @@ "player": { "back": { "default": "Zurück zur Startseite", - "short": "Rückmeldung" + "short": "Zurück" }, "casting": { "enabled": "Casting zum Gerät..." }, "menus": { - "captions": { - "customChoice": "Untertitel hochladen", - "customizeLabel": "Bearbeiten", - "offChoice": "Aus", - "settings": { - "delay": "Untertitelverzögerung", - "fixCapitals": "Großschreibung korrigieren" - }, - "title": "Untertitel", - "unknownLanguage": "Unbekannt" - }, "downloads": { - "disclaimer": "Videos werden direkt vom Provider heruntergeladen. movie-web hat nicht steuern, wie die Downloads bereitgestellt werden.", - "downloadCaption": "Ausgewählte Untertitel herunterladen", + "disclaimer": "Videos werden direkt vom Provider heruntergeladen. movie-web hat keinen Einfluss darauf, wie Downloads bereitgestellt werden.", + "downloadPlaylist": "Playlist herunterladen", "downloadVideo": "Video herunterladen", + "hlsDisclaimer": "movie-web hat keinen Einfluss darauf, wie Downloads bereitgestellt werden. Downloads werden direkt vom Anbieter bezogen. Bitte beachte, dass du eine HLS-Wiedergabeliste herunterlädst, diese ist für Nutzer gedacht, die mit fortgeschrittenem Multimedia-Streaming vertraut sind.", "onAndroid": { "1": "Um auf Android Herunterzuladen, tippe auf den Download-Button, tippe und halte auf der neuen Seite auf das Video und wähle Speichern aus.", "shortTitle": "Download / Android", @@ -225,9 +215,7 @@ "title": "Qualität" }, "settings": { - "captionItem": "Untertiteleinstellungen", "downloadItem": "Download", - "enableCaptions": "Untertitel aktivieren", "experienceSection": "Anzeigeerlebnis", "playbackItem": "Wiedergabeeinstellungen", "qualityItem": "Qualität", @@ -249,6 +237,17 @@ }, "title": "Quellen", "unknownOption": "Unbekannt" + }, + "subtitles": { + "customizeLabel": "Anpassen", + "offChoice": "Aus", + "settings": { + "backlink": "Eigene Untertitel", + "delay": "Untertitelverzögerung", + "fixCapitals": "Großschreibung korrigieren" + }, + "title": "Untertitel", + "unknownLanguage": "Unbekannt" } }, "metadata": { @@ -261,8 +260,8 @@ "notFound": { "badge": "Nicht gefunden", "homeButton": "Zurück zur Startseite", - "text": "Wir konnten das angeforderte Medium nicht finden.", - "title": "Das Medium konnte nicht gefunden werden." + "text": "Wir konnten das angeforderte Video nicht finden.", + "title": "Das Video konnte nicht gefunden werden." } }, "nextEpisode": { @@ -273,13 +272,13 @@ "badge": "Wiedergabefehler", "errors": { "errorAborted": "Das Laden des Videos wurde vom Nutzer abgebrochen.", - "errorDecode": "Trotz vorheriger Feststellung der Nutzbarkeit trat ein Fehler beim Versuch auf, die Mediumdatei zu decodieren, was zu einem Fehler führte.", + "errorDecode": "Beim Versuch, das Video zu dekodieren, ist ein Fehler aufgetreten, obwohl sie zuvor als brauchbar eingestuft worden war.", "errorGenericMedia": "Unbekannter Videofehler ist aufgetreten.", - "errorNetwork": "Es ist ein Netzwerkfehler aufgetreten, der das erfolgreiche Abrufen des Mediums verhinderte, obwohl es zuvor verfügbar war.", - "errorNotSupported": "Das Medium- oder Mediumanbieterobjekt wird nicht unterstützt." + "errorNetwork": "Es ist ein Netzwerkfehler aufgetreten, der verhindert hat, dass das Video erfolgreich abgerufen werden konnten, obwohl es verfügbar waren.", + "errorNotSupported": "Das Video- oder Videoanbieter wird nicht unterstützt." }, "homeButton": "Zurück zur Startseite", - "text": "Ein Fehler ist während der Wiedergabe aufgetreten. Versuche es erneut.", + "text": "Während der Wiedergabe ist ein Fehler aufgetreten. Versuche es erneut.", "title": "Hoppla, etwas ist schiefgegangen!" }, "scraping": { @@ -292,7 +291,7 @@ "badge": "Nicht gefunden", "detailsButton": "Details anzeigen", "homeButton": "Zurück zur Startseite", - "text": "Wir haben alle Anbieter durchsucht, konnten aber nicht das Video finden nach dem du suchst! Wir stellen keine eigenen Videos bereit und haben keine Kontrolle darüber, was verfügbar ist. Bitte klicke \"Details anzeigen\" für mehr Details.", + "text": "Wir haben alle Anbieter durchsucht, konnten aber nicht das Video finden nach dem du suchst! Wir stellen keine eigenen Videos bereit und haben keine Kontrolle darüber, was verfügbar ist. Bitte klicke auf \"Details anzeigen\" für mehr Details.", "title": "Wir konnten das nicht finden" } }, @@ -351,7 +350,7 @@ "firstColor": "Profilfarbe 1", "secondColor": "Profilfarbe 2", "title": "Profilbild bearbeiten", - "userIcon": "Nutzersymbol" + "userIcon": "Symbol" }, "register": { "cta": "Los geht's", @@ -371,20 +370,13 @@ }, "title": "Aussehen" }, - "captions": { - "backgroundLabel": "Hintergrund-Deckkraft", - "colorLabel": "Farbe", - "previewQuote": "Das Gras wächst nicht schneller, wenn man daran zieht.", - "textSizeLabel": "Schriftgröße", - "title": "Untertitel" - }, "connections": { "server": { "description": "Falls du dich mit einem anderen Server verbinden willst, um deine Daten zu speichern. Aktiviere dies und gebe die URL an.", "label": "Eigener Server", "urlLabel": "Eigene Server-URL" }, - "title": "Verbindungen", + "title": "Verbindung", "workers": { "addButton": "Neuen Worker hinzufügen", "description": "Damit die App funktioniert werden alle Anfrage durch einen Proxy geleitet. Aktiviere dies, falls du deinen eigenen Worker verwenden willst.", @@ -415,6 +407,11 @@ "userId": "Nutzer-ID" } }, + "subtitles": { + "previewQuote": "Das Gras wächst nicht schneller, wenn man daran zieht.", + "textSizeLabel": "Schriftgröße", + "title": "Untertitel" + }, "unsaved": "Du hast ungespeicherte Änderungen" } } diff --git a/src/assets/locales/en.json b/src/assets/locales/en.json index f0ef16ea..a9baf68a 100644 --- a/src/assets/locales/en.json +++ b/src/assets/locales/en.json @@ -1,150 +1,180 @@ { + "about": { + "description": "movie-web is a web application that searches the internet for streams. The team aims for a mostly minimalistic approach to consuming content.", + "faqTitle": "Common questions", + "q1": { + "body": "movie-web does not host any content. When you click on something to watch, the internet is searched for the selected media (On the loading screen and in the 'video sources' tab you can see which source you're using). Media never gets uploaded by movie-web, everything is through this searching mechanism.", + "title": "Where does the content come from?" + }, + "q2": { + "body": "It's not possible to request a show or movie, movie-web does not manage any content. All content is viewed through sources on the internet.", + "title": "Where can I request a show or movie?" + }, + "q3": { + "body": "Our search results are powered by The Movie Database (TMDB) and display regardless of whether our sources actually have the content.", + "title": "The search results display the show or movie, why can't I play it?" + }, + "title": "About movie-web" + }, + "actions": { + "copied": "Copied", + "copy": "Copy" + }, "auth": { + "createAccount": "Don't have an account yet? <0>Create an account.", "deviceNameLabel": "Device name", "deviceNamePlaceholder": "Personal phone", + "generate": { + "description": "Your passphrase acts as your username and password. Make sure to keep it safe as you will need to enter it to login to your account", + "next": "I have saved my passphrase", + "passphraseFrameLabel": "Passphrase", + "title": "Your passphrase" + }, "hasAccount": "Already have an account? <0>Login here.", - "createAccount": "Don't have an account yet? <0>Create an account.", + "login": { + "description": "Please enter your passphrase to login to your account", + "deviceLengthError": "Please enter a device name", + "passphraseLabel": "12-Word passphrase", + "passphrasePlaceholder": "Passphrase", + "submit": "Login", + "title": "Login to your account", + "validationError": "Incorrect or incomplete passphrase" + }, "register": { "information": { - "title": "Account information", "color1": "Profile color one", "color2": "Profile color two", - "icon": "User icon", "header": "Enter a name for your device and pick colours and a user icon of your choosing", - "next": "Next" + "icon": "User icon", + "next": "Next", + "title": "Account information" } }, - "login": { - "title": "Login to your account", - "description": "Please enter your passphrase to login to your account", - "validationError": "Incorrect or incomplete passphrase", - "deviceLengthError": "Please enter a device name", - "submit": "Login", - "passphraseLabel": "12-Word passphrase", - "passphrasePlaceholder": "Passphrase" - }, - "generate": { - "title": "Your passphrase", - "passphraseFrameLabel": "Passphrase", - "next": "I have saved my passphrase", - "description": "Your passphrase acts as your username and password. Make sure to keep it safe as you will need to enter it to login to your account" - }, "trust": { - "title": "Do you trust this server?", - "host": "You are connecting to <0>{{hostname}} - please confirm you trust it before making an account", "failed": { - "title": "Failed to reach server", - "text": "Did you configure it correctly?" + "text": "Did you configure it correctly?", + "title": "Failed to reach server" }, - "yes": "I trust this server", - "no": "Go back" + "host": "You are connecting to <0>{{hostname}} - please confirm you trust it before making an account", + "no": "Go back", + "title": "Do you trust this server?", + "yes": "I trust this server" }, "verify": { - "title": "Confirm your passphrase", "description": "Please enter your passphrase from earlier to confirm you have saved it and to create your account", "invalidData": "Data is not valid", "noMatch": "Passphrase doesn't match", - "recaptchaFailed": "ReCaptcha validation failed", "passphraseLabel": "Your 12-word passphrase", - "register": "Create account" + "recaptchaFailed": "ReCaptcha validation failed", + "register": "Create account", + "title": "Confirm your passphrase" } }, "errors": { + "badge": "It broke", "details": "Error details", "reloadPage": "Reload the page", "showError": "Show error details", - "badge": "It broke", "title": "We encountered an error!" }, - "notFound": { - "badge": "Not found", - "title": "Couldn't find that page", - "message": "We looked everywhere: under the bins, in the closet, behind the proxy but ultimately couldn't find the page you are looking for.", - "goHome": "Back to home" + "footer": { + "legal": { + "disclaimer": "Disclaimer", + "disclaimerText": "movie-web does not host any files, it merely links to 3rd party services. Legal issues should be taken up with the file hosts and providers. movie-web is not responsible for any media files shown by the video providers." + }, + "links": { + "discord": "Discord", + "dmca": "DMCA", + "github": "GitHub" + }, + "tagline": "Watch your favourite shows and movies with this open source streaming app." }, "global": { "name": "movie-web", "pages": { - "pagetitle": "{{title}} - movie-web", - "dmca": "DMCA", - "settings": "Settings", "about": "About", + "dmca": "DMCA", "login": "Login", - "register": "Register" + "pagetitle": "{{title}} - movie-web", + "register": "Register", + "settings": "Settings" + } + }, + "home": { + "bookmarks": { + "sectionTitle": "Bookmarks" + }, + "continueWatching": { + "sectionTitle": "Continue Watching" + }, + "mediaList": { + "stopEditing": "Stop editing" + }, + "search": { + "allResults": "That's all we have!", + "failed": "Failed to find media, try again!", + "loading": "Loading...", + "noResults": "We couldn't find anything!", + "placeholder": "What do you want to watch?", + "sectionTitle": "Search results" + }, + "titles": { + "day": { + "default": "What would you like to watch this afternoon?" + }, + "morning": { + "default": "What would you like to watch this morning?", + "extra": ["I hear Before Sunrise is good"] + }, + "night": { + "default": "What would you like to watch tonight?", + "extra": ["Tired? I hear The Exorcist is good."] + } } }, "media": { + "episodeDisplay": "S{{season}} E{{episode}}", "types": { "movie": "Movie", "show": "Show" + } + }, + "navigation": { + "banner": { + "offline": "Check your internet connection" }, - "episodeDisplay": "S{{season}} E{{episode}}" + "menu": { + "about": "About us", + "donation": "Donate", + "logout": "Log out", + "register": "Sync to cloud", + "settings": "Settings", + "support": "Support" + } + }, + "notFound": { + "badge": "Not found", + "goHome": "Back to home", + "message": "We looked everywhere: under the bins, in the closet, behind the proxy but ultimately couldn't find the page you are looking for.", + "title": "Couldn't find that page" + }, + "overlays": { + "close": "Close" }, "player": { - "scraping": { - "notFound": { - "badge": "Not found", - "title": "We couldn't find that", - "text": "We have searched through our providers and cannot find the media you are looking for! We do not host the media and have no control over what is available. Please click 'Show details' below for more details.", - "homeButton": "Go home", - "detailsButton": "Show details" - }, - "items": { - "pending": "Checking for videos...", - "notFound": "Doesn't have the video", - "failure": "Error occurred" - } - }, - "casting": { - "enabled": "Casting to device..." - }, - "playbackError": { - "badge": "Playback error", - "title": "Failed to play video!", - "text": "There was an error trying to play the media. Please try again.", - "homeButton": "Go home", - "errors": { - "errorAborted": "The fetching of the media was aborted by the user's request.", - "errorNetwork": "Some kind of network error occurred which prevented the media from being successfully fetched, despite having previously been available.", - "errorDecode": "Despite having previously been determined to be usable, an error occurred while trying to decode the media resource, resulting in an error.", - "errorNotSupported": "The media or media provider object is not supported.", - "errorGenericMedia": "Unknown media error occurred." - } - }, - "metadata": { - "notFound": { - "badge": "Not found", - "title": "Couldn't find that media.", - "text": "We couldn't find the media you requested. Either it's been removed or you tampered with the URL.", - "homeButton": "Back to home" - }, - "failed": { - "badge": "Failed", - "title": "Failed to load metadata", - "text": "Could not load the media's metadata from TMDB. Please check whether TMDB is down or blocked on your internet connection.", - "homeButton": "Go home" - } - }, "back": { "default": "Back to home", "short": "Back" }, - "time": { - "regular": "{{timeWatched}} / {{duration}}", - "shortRegular": "{{timeWatched}}", - "remaining": "{{timeLeft}} left • Finish at {{timeFinished, datetime}}", - "shortRemaining": "-{{timeLeft}}" - }, - "nextEpisode": { - "next": "Next episode", - "cancel": "Cancel" + "casting": { + "enabled": "Casting to device..." }, "menus": { "settings": { "videoSection": "Video settings", "experienceSection": "Viewing experience", - "enableCaptions": "Enable captions", - "captionItem": "Caption settings", + "enableSubtitles": "Enable Subtitles", + "subtitleItem": "Subtitle settings", "sourceItem": "Video sources", "playbackItem": "Playback settings", "downloadItem": "Download", @@ -174,246 +204,216 @@ "text": "There was an error while trying to find any videos, please try a different source." } }, - "captions": { - "title": "Captions", + "subtitles": { + "title": "Subtitles", "customizeLabel": "Customize", "settings": { "fixCapitals": "Fix capitalization", - "delay": "Caption delay" + "delay": "Subtitle delay", + "backlink": "Custom subtitles" }, - "customChoice": "Select caption from file", + "customChoice": "Select subtitle from file", "offChoice": "Off", "unknownLanguage": "Unknown" }, "downloads": { - "title": "Download", "disclaimer": "Downloads are taken directly from the provider. movie-web does not have control over how the downloads are provided.", - "hlsDisclaimer": "Downloads are taken directly from the provider. movie-web does not have control over how the downloads are provided. Please note that you are downloading an HLS playlist, this is intended for users familiar with advanced multimedia streaming.", - "downloadVideo": "Download video", + "downloadSubtitle": "Download current subtitle", "downloadPlaylist": "Download playlist", - "downloadCaption": "Download current caption", - "onPc": { - "1": "On PC, click the download button then, on the new page, right click the video and select Save video as", - "title": "Downloading on PC", - "shortTitle": "Download / PC" - }, + "downloadVideo": "Download video", + "hlsDisclaimer": "Downloads are taken directly from the provider. movie-web does not have control over how the downloads are provided. Please note that you are downloading an HLS playlist, this is intended for users familiar with advanced multimedia streaming.", "onAndroid": { "1": "To download on Android, click the download button then, on the new page, tap and hold on the video, then select save.", - "title": "Downloading on Android", - "shortTitle": "Download / Android" + "shortTitle": "Download / Android", + "title": "Downloading on Android" }, "onIos": { "1": "To download on iOS, click the download button then, on the new page, click , then Save to Files .", - "title": "Downloading on iOS", - "shortTitle": "Download / iOS" - } + "shortTitle": "Download / iOS", + "title": "Downloading on iOS" + }, + "onPc": { + "1": "On PC, click the download button then, on the new page, right click the video and select Save video as", + "shortTitle": "Download / PC", + "title": "Downloading on PC" + }, + "title": "Download" }, "playback": { - "title": "Playback settings", - "speedLabel": "Playback speed" + "speedLabel": "Playback speed", + "title": "Playback settings" }, "quality": { - "title": "Quality", "automaticLabel": "Automatic quality", "hint": "You can try <0>switching source to get different quality options.", - "iosNoQuality": "Due to Apple-defined limitations, quality selection is not available on iOS for this source. You can try <0>switching to another source to get different quality options." - } - } - }, - "home": { - "mediaList": { - "stopEditing": "Stop editing" - }, - "titles": { - "morning": { - "default": "What would you like to watch this morning?", - "extra": ["I hear Before Sunrise is good"] - }, - "day": { - "default": "What would you like to watch this afternoon?", - "extra": [] - }, - "night": { - "default": "What would you like to watch tonight?", - "extra": ["Tired? I hear The Exorcist is good."] + "iosNoQuality": "Due to Apple-defined limitations, quality selection is not available on iOS for this source. You can try <0>switching to another source to get different quality options.", + "title": "Quality" } }, - "search": { - "loading": "Loading...", - "sectionTitle": "Search results", - "allResults": "That's all we have!", - "noResults": "We couldn't find anything!", - "failed": "Failed to find media, try again!", - "placeholder": "What do you want to watch?" + "metadata": { + "failed": { + "badge": "Failed", + "homeButton": "Go home", + "text": "Could not load the media's metadata from TMDB. Please check whether TMDB is down or blocked on your internet connection.", + "title": "Failed to load metadata" + }, + "notFound": { + "badge": "Not found", + "homeButton": "Back to home", + "text": "We couldn't find the media you requested. Either it's been removed or you tampered with the URL.", + "title": "Couldn't find that media." + } }, - "continueWatching": { - "sectionTitle": "Continue Watching" + "nextEpisode": { + "cancel": "Cancel", + "next": "Next episode" }, - "bookmarks": { - "sectionTitle": "Bookmarks" + "playbackError": { + "badge": "Playback error", + "errors": { + "errorAborted": "The fetching of the media was aborted by the user's request.", + "errorDecode": "Despite having previously been determined to be usable, an error occurred while trying to decode the media resource, resulting in an error.", + "errorGenericMedia": "Unknown media error occurred.", + "errorNetwork": "Some kind of network error occurred which prevented the media from being successfully fetched, despite having previously been available.", + "errorNotSupported": "The media or media provider object is not supported." + }, + "homeButton": "Go home", + "text": "There was an error trying to play the media. Please try again.", + "title": "Failed to play video!" + }, + "scraping": { + "items": { + "failure": "Error occurred", + "notFound": "Doesn't have the video", + "pending": "Checking for videos..." + }, + "notFound": { + "badge": "Not found", + "detailsButton": "Show details", + "homeButton": "Go home", + "text": "We have searched through our providers and cannot find the media you are looking for! We do not host the media and have no control over what is available. Please click 'Show details' below for more details.", + "title": "We couldn't find that" + } + }, + "time": { + "regular": "{{timeWatched}} / {{duration}}", + "remaining": "{{timeLeft}} left • Finish at {{timeFinished, datetime}}", + "shortRegular": "{{timeWatched}}", + "shortRemaining": "-{{timeLeft}}" } }, - "overlays": { - "close": "Close" - }, "screens": { - "loadingUser": "Loading your profile", + "dmca": { + "text": "Welcome to movie-web's DMCA contact page! We respect intellectual property rights and want to address any copyright concerns swiftly. If you believe your copyrighted work has been improperly used on our platform, please send a detailed DMCA notice to the email below. Please include a description of the copyrighted material, your contact details, and a statement of good faith belief. We're committed to resolving these matters promptly and appreciate your cooperation in keeping movie-web a place that respects creativity and copyrights.", + "title": "DMCA" + }, "loadingApp": "Loading application", + "loadingUser": "Loading your profile", "loadingUserError": { - "text": "Failed to load your profile", - "textWithReset": "Failed to load your profile from your custom server, want to reset back to the default server?", + "logout": "Logout", "reset": "Reset custom server", - "logout": "Logout" + "text": "Failed to load your profile", + "textWithReset": "Failed to load your profile from your custom server, want to reset back to the default server?" }, "migration": { "failed": "Failed to migrate your data.", "inProgress": "Please hold, we are migrating your data. This shouldn't take long." - }, - "dmca": { - "title": "DMCA", - "text": "Welcome to movie-web's DMCA contact page! We respect intellectual property rights and want to address any copyright concerns swiftly. If you believe your copyrighted work has been improperly used on our platform, please send a detailed DMCA notice to the email below. Please include a description of the copyrighted material, your contact details, and a statement of good faith belief. We're committed to resolving these matters promptly and appreciate your cooperation in keeping movie-web a place that respects creativity and copyrights." } }, - "navigation": { - "banner": { - "offline": "Check your internet connection" - }, - "menu": { - "register": "Sync to cloud", - "settings": "Settings", - "about": "About us", - "donation": "Donate", - "support": "Support", - "logout": "Log out" - } - }, - "actions": { - "copy": "Copy", - "copied": "Copied" - }, "settings": { - "unsaved": "You have unsaved changes", + "account": { + "accountDetails": { + "deviceNameLabel": "Device name", + "deviceNamePlaceholder": "Personal phone", + "editProfile": "Edit", + "logoutButton": "Log out" + }, + "actions": { + "delete": { + "button": "Delete account", + "confirmButton": "Delete account", + "confirmDescription": "Are you sure you want to delete your account? All your data will be lost!", + "confirmTitle": "Are you sure?", + "text": "This action is irreversible. All data will be deleted and nothing can be recovered.", + "title": "Delete account" + }, + "title": "Actions" + }, + "devices": { + "deviceNameLabel": "Device name", + "failed": "Failed to load sessions", + "removeDevice": "Remove", + "title": "Devices" + }, + "profile": { + "finish": "Finish editing", + "firstColor": "Profile color one", + "secondColor": "Profile color two", + "title": "Edit profile picture", + "userIcon": "User icon" + }, + "register": { + "cta": "Get started", + "text": "Share your watch progress between devices and keep them synced.", + "title": "Sync to the cloud" + }, + "title": "Account" + }, + "appearance": { + "activeTheme": "Active", + "themes": { + "blue": "Blue", + "default": "Default", + "gray": "Gray", + "red": "Red", + "teal": "Teal" + }, + "title": "Appearance" + }, + "subtitles": { + "title": "Subtitles", + "previewQuote": "I must not fear. Fear is the mind-killer.", + "textSizeLabel": "Text size", + "backgroundLabel": "Background opacity", + "colorLabel": "Color" + }, + "connections": { + "server": { + "description": "If you would like to connect to a custom backend to store your data, enable this and provide the URL.", + "label": "Custom server", + "urlLabel": "Custom server URL" + }, + "title": "Connections", + "workers": { + "addButton": "Add new worker", + "description": "To make the application function, all traffic is routed through proxies. Enable this if you want to bring your own workers.", + "emptyState": "No workers yet, add one below", + "label": "Use custom proxy workers", + "urlLabel": "Worker URLs", + "urlPlaceholder": "https://" + } + }, + "locale": { + "language": "Application language", + "languageDescription": "Language applied to the entire application.", + "title": "Locale" + }, "reset": "Reset", "save": "Save", "sidebar": { "info": { - "title": "App information", - "hostname": "Hostname", - "backendUrl": "Backend URL", - "userId": "User ID", - "notLoggedIn": "You are not logged in", "appVersion": "App version", + "backendUrl": "Backend URL", "backendVersion": "Backend version", - "unknownVersion": "Unknown", + "hostname": "Hostname", + "insecure": "Insecure", + "notLoggedIn": "You are not logged in", "secure": "Secure", - "insecure": "Insecure" + "title": "App information", + "unknownVersion": "Unknown", + "userId": "User ID" } }, - "appearance": { - "title": "Appearance", - "activeTheme": "Active", - "themes": { - "default": "Default", - "blue": "Blue", - "teal": "Teal", - "red": "Red", - "gray": "Gray" - } - }, - "account": { - "title": "Account", - "register": { - "title": "Sync to the cloud", - "text": "Share your watch progress between devices and keep them synced.", - "cta": "Get started" - }, - "profile": { - "title": "Edit profile picture", - "firstColor": "Profile color one", - "secondColor": "Profile color two", - "userIcon": "User icon", - "finish": "Finish editing" - }, - "devices": { - "title": "Devices", - "failed": "Failed to load sessions", - "deviceNameLabel": "Device name", - "removeDevice": "Remove" - }, - "accountDetails": { - "editProfile": "Edit", - "deviceNameLabel": "Device name", - "deviceNamePlaceholder": "Personal phone", - "logoutButton": "Log out" - }, - "actions": { - "title": "Actions", - "delete": { - "title": "Delete account", - "text": "This action is irreversible. All data will be deleted and nothing can be recovered.", - "button": "Delete account", - "confirmTitle": "Are you sure?", - "confirmDescription": "Are you sure you want to delete your account? All your data will be lost!", - "confirmButton": "Delete account" - } - } - }, - "locale": { - "title": "Locale", - "language": "Application language", - "languageDescription": "Language applied to the entire application." - }, - "captions": { - "title": "Captions", - "previewQuote": "I must not fear. Fear is the mind-killer.", - "backgroundLabel": "Background opacity", - "textSizeLabel": "Text size", - "colorLabel": "Color" - }, - "connections": { - "title": "Connections", - "workers": { - "label": "Use custom proxy workers", - "description": "To make the application function, all traffic is routed through proxies. Enable this if you want to bring your own workers.", - "urlLabel": "Worker URLs", - "emptyState": "No workers yet, add one below", - "urlPlaceholder": "https://", - "addButton": "Add new worker" - }, - "server": { - "label": "Custom server", - "description": "If you would like to connect to a custom backend to store your data, enable this and provide the URL.", - "urlLabel": "Custom server URL" - } - } - }, - "about": { - "title": "About movie-web", - "description": "movie-web is a web application that searches the internet for streams. The team aims for a mostly minimalistic approach to consuming content.", - "faqTitle": "Common questions", - "q1": { - "title": "Where does the content come from?", - "body": "movie-web does not host any content. When you click on something to watch, the internet is searched for the selected media (On the loading screen and in the 'video sources' tab you can see which source you're using). Media never gets uploaded by movie-web, everything is through this searching mechanism." - }, - "q2": { - "title": "Where can I request a show or movie?", - "body": "It's not possible to request a show or movie, movie-web does not manage any content. All content is viewed through sources on the internet." - }, - "q3": { - "title": "The search results display the show or movie, why can't I play it?", - "body": "Our search results are powered by The Movie Database (TMDB) and display regardless of whether our sources actually have the content." - } - }, - "footer": { - "tagline": "Watch your favourite shows and movies with this open source streaming app.", - "links": { - "github": "GitHub", - "dmca": "DMCA", - "discord": "Discord" - }, - "legal": { - "disclaimer": "Disclaimer", - "disclaimerText": "movie-web does not host any files, it merely links to 3rd party services. Legal issues should be taken up with the file hosts and providers. movie-web is not responsible for any media files shown by the video providers." - } + "unsaved": "You have unsaved changes" } } diff --git a/src/assets/locales/es.json b/src/assets/locales/es.json index fb148e49..e5e9e625 100644 --- a/src/assets/locales/es.json +++ b/src/assets/locales/es.json @@ -174,20 +174,8 @@ "enabled": "Transmitiendo a dispositivo..." }, "menus": { - "captions": { - "customChoice": "Seleccionar subtítulo desde un archivo", - "customizeLabel": "Personalizar", - "offChoice": "Apagado", - "settings": { - "delay": "Retraso de subtítulos", - "fixCapitals": "Corregir mayúsculas" - }, - "title": "Subtítulos", - "unknownLanguage": "Desconocido" - }, "downloads": { "disclaimer": "Las descargas se realizan directamente desde el proveedor. movie-web no tiene control sobre cómo se proporcionan las descargas.", - "downloadCaption": "Descargar subtítulo actual", "downloadVideo": "Descargar vídeo", "onAndroid": { "1": "Para descargar en Android, haz clic en el botón de descarga y luego, en la nueva página, mantén presionado el vídeo y selecciona guardar.", @@ -225,9 +213,7 @@ "title": "Calidad" }, "settings": { - "captionItem": "Configuración de subtítulos", "downloadItem": "Descargar", - "enableCaptions": "Habilitar subtítulos", "experienceSection": "Experiencia de visualización", "playbackItem": "Configuración de reproducción", "qualityItem": "Calidad", @@ -371,13 +357,6 @@ }, "title": "Apariencia" }, - "captions": { - "backgroundLabel": "Opacidad del fondo", - "colorLabel": "Color", - "previewQuote": "No debo temer. El miedo es el asesino de la mente.", - "textSizeLabel": "Tamaño del texto", - "title": "Subtítulos" - }, "connections": { "server": { "description": "Si deseas conectarte a un backend personalizado para almacenar tus datos, habilita esto y proporciona la URL.", diff --git a/src/assets/locales/et.json b/src/assets/locales/et.json index 27177ef2..5ceb2105 100644 --- a/src/assets/locales/et.json +++ b/src/assets/locales/et.json @@ -1,32 +1,44 @@ { "about": { "description": "movie-web on veebirakendus, mis otsib internetti voogude jaoks. Meeskonna eesmärk on enamasti minimalistlik lähenemine sisu tarbimisele.", + "faqTitle": "Tihti küsitud küsimused", "q1": { - "body": "movie-web ei hoiusta enda sisu. Kui klõpsate, et midagi vaadata, otsitakse valitud meediat internetist (laadimisekraanil ja vahekaardil \"videoallikad\" näete, millist allikat te kasutate). Meediat ei lae movie-web kunagi üles, kõik toimub selle otsingumehhanismi kaudu." + "body": "movie-web ei hoiusta enda sisu. Kui klõpsate, et midagi vaadata, otsitakse valitud meediat internetist (laadimisekraanil ja vahekaardil \"videoallikad\" näete, millist allikat te kasutate). Meediat ei lae movie-web kunagi üles, kõik toimub selle otsingumehhanismi kaudu.", + "title": "Kust tuleb meie sisu?" }, "q2": { - "body": "Saadet või filmi ei ole võimalik taotelda, movie-web ei halda mingit sisu. Kogu sisu vaadatakse interneti allikate kaudu." - } + "body": "Saadet või filmi ei ole võimalik taotelda, movie-web ei halda mingit sisu. Kogu sisu vaadatakse interneti allikate kaudu.", + "title": "Kust ma saan kindlat saadet või filmi paluda?" + }, + "q3": { + "body": "Meie otsingutulemusi toetab The Movie Database (TMDB) ja need kuvatakse sõltumata sellest, kas meie allikates on sisu tegelikult olemas.", + "title": "Otsingutulemustes kuvatakse saade või film. Miks ma ei saa seda esitada?" + }, + "title": "movie-web'i kohta" + }, + "actions": { + "copied": "Kopeeritud", + "copy": "Kopeeri" }, "auth": { "createAccount": "Ei ole kontot veel?<0>Loo konto.", "deviceNameLabel": "Seadme nimi", "deviceNamePlaceholder": "Isiklik telefon", "generate": { - "description": "Teie parool toimib teie kasutajanime ja paroolina. Veenduge, et see oleks ohutus kohas, kuna peate kasutama seda, et logida oma kontosse sisse", - "next": "Olen salvestanud oma parooli", - "passphraseFrameLabel": "Parool", - "title": "Sinu parool" + "description": "Teie paroolifraas toimib teie kasutajanime ja paroolina. Veenduge, et see oleks ohutus kohas, kuna peate kasutama seda, et logida oma kontosse sisse", + "next": "Olen salvestanud oma paroolifraasi", + "passphraseFrameLabel": "Paroolifraas", + "title": "Sinu paroolifraas" }, - "hasAccount": "On juba konto? <0>Logi sisse siin.", + "hasAccount": "On juba konto? <0>Logi sisse.", "login": { - "description": "Palun sisestage parool, et logida kontosse sisse", + "description": "Palun sisestage paroolifraas, et logida kontosse sisse", "deviceLengthError": "Palun sisesta seadme nimi", - "passphraseLabel": "12-Sõnaline parool", - "passphrasePlaceholder": "Parool", + "passphraseLabel": "12-Sõnaline paroolifraas", + "passphrasePlaceholder": "Paroolifraas", "submit": "Logi sisse", "title": "Logi sisse oma kontosse", - "validationError": "Vale vōi mittetäielik parool" + "validationError": "Vale vōi mittetäielik paroolifraas" }, "register": { "information": { @@ -49,13 +61,13 @@ "yes": "Usaldan seda serverit" }, "verify": { - "description": "Palun sisestage oma salasõna, et kinnitada, et olete selle salvestanud ja luua oma konto", + "description": "Palun sisestage oma paroolifraas, et kinnitada, et olete selle salvestanud ja luua oma konto", "invalidData": "Andmed ei kehti", - "noMatch": "Parool ei klapi", - "passphraseLabel": "Sinu 12-sõnaline parool", + "noMatch": "Paroolifraas ei klapi", + "passphraseLabel": "Sinu 12-sõnaline paroolifraas", "recaptchaFailed": "ReCaptcha valideerimine ebaõnnestua", "register": "Loo konto", - "title": "Kinnita oma parool" + "title": "Kinnita oma paroolifraas" } }, "errors": { @@ -67,8 +79,15 @@ }, "footer": { "legal": { + "disclaimer": "Lahtiütlemine", "disclaimerText": "movie-web ei hoiusta ühtegi faili, vaid ainult lingib kolmandate osapoolte teenustele. Juriidilised küsimused tuleks lahendada failihostide ja teenusepakkujatega. movie-web ei vastuta videopakkujate poolt näidatud meediafailide eest." - } + }, + "links": { + "discord": "Discord", + "dmca": "DMCA", + "github": "GitHub" + }, + "tagline": "Vaadake selle avatud lähtekoodiga voogesituse rakendusega oma lemmiksaateid ja -filme." }, "global": { "name": "movie-web", @@ -124,6 +143,19 @@ "show": "Saade" } }, + "navigation": { + "banner": { + "offline": "Kontrollige oma Interneti-ühendust" + }, + "menu": { + "about": "Meie kohta", + "donation": "Anneta", + "logout": "Logi välja", + "register": "Sünkrooni pilvega", + "settings": "Sätted", + "support": "Abi" + } + }, "notFound": { "badge": "Ei leitud", "goHome": "Tagasi koju", @@ -138,29 +170,22 @@ "default": "Tagasi koju", "short": "Tagasi" }, + "casting": { + "enabled": "Seadmesse ülekandmine..." + }, "menus": { - "captions": { - "customChoice": "Vali subtiitrid failist", - "customizeLabel": "Kohanda", - "offChoice": "Välja", - "settings": { - "delay": "Subtiitri viivitus", - "fixCapitals": "Paranda kapitaliseerimine" - }, - "title": "Subtiitrid", - "unknownLanguage": "Teadmata" - }, "downloads": { "disclaimer": "Allalaadimine toimub otse teenusepakkujalt. movie-web ei saa kontrollida, kuidas allalaadimine toimub.", - "downloadCaption": "Lae alla praegused subtiitrid", + "downloadPlaylist": "Laadige esitusloend alla", "downloadVideo": "Lae alla video", + "hlsDisclaimer": "Allalaadimised võetakse otse teenusepakkujalt. movie-web ei kontrolli, kuidas allalaadimisi pakutakse. Pange tähele, et laadite alla HLS-i esitusloendit, see on mõeldud kasutajatele, kes on tuttavad multimeediumi voogesitusega.", "onAndroid": { "1": "Et allalaadida Androidi telefonil, vajuta allalaadimise nupule, siis uuel leheküljel vajuta ja hoia video peal, siis vali salvesta.", "shortTitle": "Allalaadimine / Android", "title": "Androidil allalaadimine" }, "onIos": { - "1": "Et allalaadida iOS telefonil, vajuta allalaadimise nupule, siis uuel leheküljel vajuta , siis Salvesta failidesse ", + "1": "Et allalaadida iOS telefonil, vajuta allalaadimise nupule, siis uuel leheküljel vajuta , siis Salvesta failidesse .", "shortTitle": "Allalaadimine / iOS", "title": "iOSil allalaadimine" }, @@ -190,9 +215,7 @@ "title": "Kvaliteet" }, "settings": { - "captionItem": "Subtiitrite sätted", "downloadItem": "Lae alla", - "enableCaptions": "Luba subtiitrid", "experienceSection": "Vaatamise kogemus", "playbackItem": "Taasesituse sätted", "qualityItem": "Kvaliteet", @@ -214,6 +237,17 @@ }, "title": "Allikad", "unknownOption": "Teadmata" + }, + "subtitles": { + "customizeLabel": "Kohanda", + "offChoice": "Välja", + "settings": { + "backlink": "Kohandatud Subtiitrid", + "delay": "Subtiitrite viivitus", + "fixCapitals": "Parandage suurtähtede kasutamine" + }, + "title": "Subtiitrid", + "unknownLanguage": "Tundmatu" } }, "metadata": { @@ -270,12 +304,114 @@ }, "screens": { "dmca": { - "text": "Tere tulemast movie-webi DMCA kontaktilehele! Me austame intellektuaalomandi õigusi ja soovime kiiresti lahendada kõik autoriõigusega seotud probleemid. Kui usute, et teie autoriõigusega kaitstud tööd on meie platvormil vääralt kasutatud, saatke palun üksikasjalik DMCA-teade alljärgnevale e-posti aadressile. Palun lisage autoriõigusega kaitstud materjali kirjeldus, oma kontaktandmed ja avaldus heauskse veendumuse kohta. Oleme pühendunud nende küsimuste kiirele lahendamisele ja hindame teie koostööd, et movie-web oleks koht, kus austatakse loovust ja autoriõigusi." + "text": "Tere tulemast movie-webi DMCA kontaktilehele! Me austame intellektuaalomandi õigusi ja soovime kiiresti lahendada kõik autoriõigusega seotud probleemid. Kui usute, et teie autoriõigusega kaitstud tööd on meie platvormil vääralt kasutatud, saatke palun üksikasjalik DMCA-teade alljärgnevale e-posti aadressile. Palun lisage autoriõigusega kaitstud materjali kirjeldus, oma kontaktandmed ja avaldus heauskse veendumuse kohta. Oleme pühendunud nende küsimuste kiirele lahendamisele ja hindame teie koostööd, et movie-web oleks koht, kus austatakse loovust ja autoriõigusi.", + "title": "DMCA" }, "loadingApp": "Rakenduse laadimine", "loadingUser": "Teie profiili laadimine", "loadingUserError": { - "text": "Profiili laadimine ebaōnnestus" + "logout": "Logi välja", + "reset": "Lähtestage kohandatud server", + "text": "Profiili laadimine ebaōnnestus", + "textWithReset": "Profiili laadimine kohandatud serverist ebaõnnestus. Kas soovite lähtestada vaikeserverile?" + }, + "migration": { + "failed": "Teie andmete üleviimine ebaõnnestus.", + "inProgress": "Palun oodake, me viime teie andmeid üle. See ei tohiks kaua aega võtta." } + }, + "settings": { + "account": { + "accountDetails": { + "deviceNameLabel": "Seadme nimi", + "deviceNamePlaceholder": "Isiklik telefon", + "editProfile": "Muuda", + "logoutButton": "Logi välja" + }, + "actions": { + "delete": { + "button": "Kustuta konto", + "confirmButton": "Kustuta konto", + "confirmDescription": "Kas olete kindel, et soovite oma konto kustutada? Kõik teie andmed lähevad kaotsi!", + "confirmTitle": "Oled sa kindel?", + "text": "See toiming on pöördumatu. Kõik andmed kustutatakse ja midagi ei saa taastada.", + "title": "Kustuta konto" + }, + "title": "Tegevused" + }, + "devices": { + "deviceNameLabel": "Seadme nimi", + "failed": "Seansside laadimine ebaõnnestus", + "removeDevice": "Eemalda", + "title": "Seadmed" + }, + "profile": { + "finish": "Lõpeta redigeerimine", + "firstColor": "Profiili värv üks", + "secondColor": "Profiili värv kaks", + "title": "Redigeeri profiilipilti", + "userIcon": "Kasutaja ikoon" + }, + "register": { + "cta": "Alustama", + "text": "Jagage oma vaatamise edenemist seadmete vahel ja hoidke neid sünkroonituna.", + "title": "Sünkrooni pilvega" + }, + "title": "Konto" + }, + "appearance": { + "activeTheme": "Aktiivne", + "themes": { + "blue": "Sinine", + "default": "Vaikimisi", + "gray": "Hall", + "red": "Punane", + "teal": "Tumesinine" + }, + "title": "Välimus" + }, + "connections": { + "server": { + "description": "Kui soovite kohandatud backend'i kasutada oma andmete hoidmiseks, siis lubage see ja varustage URL.", + "label": "Kohandatud server", + "urlLabel": "Kohandatud serveri URL" + }, + "title": "Ühendused", + "workers": { + "addButton": "Lisa uus töötaja", + "description": "Rakenduse toimimiseks suunatakse kogu liiklus puhverserverite kaudu. Lubage see, kui soovite oma puhverserverit kasutada.", + "emptyState": "Töötajaid pole veel, lisage üks", + "label": "Kasutage kohandatud puhverserveri töötajaid", + "urlLabel": "Töötajate URL-id", + "urlPlaceholder": "https://" + } + }, + "locale": { + "language": "Rakenduse keel", + "languageDescription": "Keel on rakendatud kogu rakendusele.", + "title": "Lokaal" + }, + "reset": "Lähtesta", + "save": "Salvesta", + "sidebar": { + "info": { + "appVersion": "Rakenduse versioon", + "backendUrl": "Backend'i URL", + "backendVersion": "Backend'i versioon", + "hostname": "Hostinimi", + "insecure": "Ebakindel", + "notLoggedIn": "Sa pole sisse loginud", + "secure": "Turvaline", + "title": "Rakenduse teave", + "unknownVersion": "Teadmatu", + "userId": "Kasutaja ID" + } + }, + "subtitles": { + "previewQuote": "Ma ei tohi karta. Hirm on meelemõrvar.", + "textSizeLabel": "Teksti suurus", + "title": "Subtiitrid" + }, + "unsaved": "Teil on salvestamata muudatusi" } } diff --git a/src/assets/locales/fr.json b/src/assets/locales/fr.json index 79961dc4..cb715890 100644 --- a/src/assets/locales/fr.json +++ b/src/assets/locales/fr.json @@ -174,20 +174,8 @@ "enabled": "Casting à l'appareil..." }, "menus": { - "captions": { - "customChoice": "Télécharger des sous-titres", - "customizeLabel": "Personnaliser", - "offChoice": "Désactivé", - "settings": { - "delay": "Délai des sous-titres", - "fixCapitals": "Correction de la majuscule" - }, - "title": "Sous-titres", - "unknownLanguage": "Inconnu" - }, "downloads": { "disclaimer": "Les téléchargements sont effectués directement par le fournisseur. movie-web n'a aucun contrôle sur la manière dont les téléchargements sont effectués.", - "downloadCaption": "Télécharger les sous-titres actuels", "downloadVideo": "Télécharger la vidéo", "onAndroid": { "1": "Pour télécharger sur Android, cliquez sur le bouton de téléchargement puis, sur la nouvelle page, tapez et maintenez sur la vidéo, puis sélectionnez enregistrer.", @@ -225,9 +213,7 @@ "title": "Qualité" }, "settings": { - "captionItem": "Paramètres des sous-titres", "downloadItem": "Télécharger", - "enableCaptions": "Activer les sous-titres", "experienceSection": "Expérience de visionnage", "playbackItem": "Paramètres de lecture", "qualityItem": "Qualité", @@ -371,13 +357,6 @@ }, "title": "Apparence" }, - "captions": { - "backgroundLabel": "Opacité de l'arrière-plan", - "colorLabel": "Couleur", - "previewQuote": "Je ne dois pas avoir peur. La peur est un tueur d'esprit.", - "textSizeLabel": "Taille du texte", - "title": "Sous-titres" - }, "connections": { "server": { "description": "Si vous souhaitez vous connecter à un backend personnalisé pour stocker vos données, activez cette option et indiquez l'URL.", diff --git a/src/assets/locales/he.json b/src/assets/locales/he.json index 3c811283..c8e51e11 100644 --- a/src/assets/locales/he.json +++ b/src/assets/locales/he.json @@ -174,21 +174,11 @@ "enabled": "משדר למכשיר..." }, "menus": { - "captions": { - "customChoice": "בחר כתוביות מהקובץ", - "customizeLabel": "התאם אישית", - "offChoice": "כבוי", - "settings": { - "delay": "עיכוב בכיתוב", - "fixCapitals": "תקן שימוש באותיות גדולות" - }, - "title": "כתוביות", - "unknownLanguage": "לא ידוע" - }, "downloads": { "disclaimer": "ההורדות נלקחות ישירות מהספק. ל-movie-web אין שליטה על האופן שבו מסופקות ההורדות.", - "downloadCaption": "הורד את הכתוביות הנוכחיות", + "downloadPlaylist": "הורד פלייליסט", "downloadVideo": "הורד וידאו", + "hlsDisclaimer": "ההורדות נלקחות ישירות מהספק. ל-movie-web אין שליטה על האופן שבו מסופקות ההורדות. שימו לב שאתם מורידים רשימת השמעה של HLS, זה מיועד למשתמשים שמכירים הזרמת מולטימדיה מתקדמת.", "onAndroid": { "1": "כדי להוריד באנדרואיד, לחץ על כפתור ההורדה ולאחר מכן, בדף החדש, הקש והחזק על הסרטון, ולאחר מכן בחר שמור.", "shortTitle": "הורדה / אנדרויד", @@ -225,9 +215,7 @@ "title": "איכות" }, "settings": { - "captionItem": "הגדרות כתוביות", "downloadItem": "הורד", - "enableCaptions": "אפשר כתוביות", "experienceSection": "חווית צפייה", "playbackItem": "הגדרות ניגון", "qualityItem": "איכות", @@ -249,6 +237,17 @@ }, "title": "מקורות", "unknownOption": "לא ידוע" + }, + "subtitles": { + "customizeLabel": "התאם", + "offChoice": "כבוי", + "settings": { + "backlink": "כתוביות מותאמות אישית", + "delay": "עיכוב בכיתוב", + "fixCapitals": "תקן שימוש באותיות גדולות" + }, + "title": "כתוביות", + "unknownLanguage": "לא ידוע" } }, "metadata": { @@ -371,13 +370,6 @@ }, "title": "מראה" }, - "captions": { - "backgroundLabel": "אטימות רקע", - "colorLabel": "צבע", - "previewQuote": "אסור לי לפחד. הפחד הוא קוטל הנפש.", - "textSizeLabel": "גודל הטקסט", - "title": "כתוביות" - }, "connections": { "server": { "description": "אם תרצה להתחבר ל-backend מותאם אישית כדי לאחסן את הנתונים שלך, הפעל זאת וספק את כתובת האתר.", @@ -415,6 +407,11 @@ "userId": "זהות המשתמש" } }, + "subtitles": { + "previewQuote": "אסור לי לפחד. הפחד הוא קוטל הנפש.", + "textSizeLabel": "גודל הטקסט", + "title": "כתוביות" + }, "unsaved": "יש לך שינויים שלא נשמרו" } } diff --git a/src/assets/locales/hi.json b/src/assets/locales/hi.json new file mode 100644 index 00000000..5c92aad1 --- /dev/null +++ b/src/assets/locales/hi.json @@ -0,0 +1,423 @@ +{ + "about": { + "description": "मूवी-वेब एक वेब एप्लिकेशन है जो इंटरनेट पर स्ट्रीम्स की खोज करता है। टीम का लक्ष्य सामग्री के उपभोग के लिए अधिकतर न्यूनतम दृष्टिकोण अपनाना है।", + "faqTitle": "सामान्य प्रश्न", + "q1": { + "body": "मूवी-वेब किसी भी कंटेंट को होस्ट नहीं करता है। जब आप देखने के लिए किसी चीज़ पर क्लिक करते हैं, तो इंटरनेट पर चयनित मीडिया की खोज की जाती है (लोडिंग स्क्रीन पर और 'वीडियो स्रोत' टैब में आप देख सकते हैं कि आप किस स्रोत का उपयोग कर रहे हैं)। मीडिया कभी भी मूवी-वेब द्वारा अपलोड नहीं किया जाता है, सब कुछ इस खोज तंत्र के माध्यम से होता है।", + "title": "फिल्म कहां से आती है?" + }, + "q2": { + "body": "किसी शो या मूवी का अनुरोध करना संभव नहीं है, मूवी-वेब किसी भी फिलम का प्रबंधन नहीं करता है। सभी फिल्में इंटरनेट पर स्रोतों के माध्यम से देखी जाती है।", + "title": "मैं किसी शो या मूवी का अनुरोध कहां कर सकता हूं?" + }, + "q3": { + "body": "हमारे खोज परिणाम मूवी डेटाबेस (टीएमडीबी) द्वारा संचालित होते हैं और इस पर ध्यान दिए बिना प्रदर्शित होते हैं कि हमारे स्रोतों में वास्तव में सामग्री है या नहीं।", + "title": "खोज परिणाम शो या मूवी प्रदर्शित करते हैं, मैं फिलम क्यों नहीं चला पा रहा ?" + }, + "title": "मूवी-वेब के बारे में" + }, + "actions": { + "copied": "कॉपी किया गया हुआ है", + "copy": "कॉपी" + }, + "auth": { + "createAccount": "अब तक कोई खाता नहीं है? <0>खाता बनाएं।", + "deviceNameLabel": "डिवाइस का नाम", + "deviceNamePlaceholder": "निजी फ़ोन", + "generate": { + "description": "आपका पासफ़्रेज़ आपके नाम और पासवर्ड के रूप में कार्य करता है। इसे सुरक्षित रखना सुनिश्चित करें क्योंकि आपको अपने खाते में लॉगिन करने के लिए इसे दर्ज करना होगा", + "next": "मैंने अपना पासफ़्रेज़ सहेज कर लिया है", + "passphraseFrameLabel": "पासफ़्रेज़", + "title": "तुम्हारा पासफ़्रेज़" + }, + "hasAccount": "पहले से एक खाता मौजूद है? <0>यहां लॉगिन करें।", + "login": { + "description": "कृपया अपने खाते में लॉगिन करने के लिए अपना पासफ़्रेज़ दर्ज करें", + "deviceLengthError": "कृपया डिवाइस का नाम दर्ज करें", + "passphraseLabel": "12-शब्द का पासफ़्रेज़", + "passphrasePlaceholder": "पासफ़्रेज़", + "submit": "लॉग इन", + "title": "अपने अकाउंट में लॉग इन करें", + "validationError": "ग़लत या अपूर्ण पासफ़्रेज़" + }, + "register": { + "information": { + "color1": "प्रोफ़ाइल का पहला रंग", + "color2": "प्रोफ़ाइल का दूसरा रंग", + "header": "अपने डिवाइस के लिए एक नाम दर्ज करें और अपने पसंद का रंग और एक आइकन चुनें", + "icon": "आइकन", + "next": "अगला", + "title": "खाता संबंधी जानकारी" + } + }, + "trust": { + "failed": { + "text": "क्या आपने इसे सही ढंग से कॉन्फ़िगर किया?", + "title": "सर्वर तक पहुंचने में विफल" + }, + "host": "आप <0>{{hostname}} से कनेक्ट हो रहे हैं - खाता बनाने से पहले कृपया पुष्टि करें कि आप इस पर भरोसा करते हैं", + "no": "पीछे जाये", + "title": "क्या आपको इस सर्वर पर भरोसा है?", + "yes": "मुझे इस सर्वर पर भरोसा है" + }, + "verify": { + "description": "यह पुष्टि करने के लिए कि आपने इसे सहेज लिया है और अपना खाता बनाने के लिए कृपया अपना पहले का पासफ़्रेज़ दर्ज करें", + "invalidData": "डेटा मान्य नहीं है", + "noMatch": "पासफ़्रेज़ मेल नहीं खाता", + "passphraseLabel": "आपका 12-शब्दों वाला पासफ़्रेज़", + "recaptchaFailed": "कैप्चा सत्यापन विफल रहा", + "register": "खाता बनाएं", + "title": "अपने पासफ़्रेज़ की पुष्टि करें" + } + }, + "errors": { + "badge": "कुछ टूट गया है शायद", + "details": "गलतियों की जानकारी", + "reloadPage": "पृष्ठ को पुन: लोड करें", + "showError": "गलतियों का विवरण दिखाएँ", + "title": "हमें एक गलति का सामना करना पड़ा!" + }, + "footer": { + "legal": { + "disclaimer": "अस्वीकरण", + "disclaimerText": "मूवी-वेब किसी फ़ाइल को होस्ट नहीं करता है, यह केवल तृतीय पक्ष सेवाओं से लिंक करता है। कानूनी मुद्दों को फ़ाइल होस्ट और प्रदाताओं के साथ उठाया जाना चाहिए। मूवी-वेब वीडियो प्रदाताओं द्वारा दिखाई गई किसी भी मीडिया फ़ाइल के लिए ज़िम्मेदार नहीं है।" + }, + "links": { + "discord": "डीसकॉर्ड", + "dmca": "DMCA", + "github": "गिटहब" + }, + "tagline": "अपने पसंदीदा शो और फिल्में देखें, इस ओपन सोर्स स्ट्रीमिंग ऐप के साथ।" + }, + "global": { + "name": "मूवी-वेब", + "pages": { + "about": "साइट के बारे में", + "dmca": "DMCA", + "login": "लॉग इन", + "pagetitle": "{{title}} - मूवी-वेब", + "register": "नया खाता बनायें", + "settings": "छेड़ छाड़ करे" + } + }, + "home": { + "bookmarks": { + "sectionTitle": "बुकमार्क" + }, + "continueWatching": { + "sectionTitle": "देखना जारी रखें" + }, + "mediaList": { + "stopEditing": "एडिट करना बंद करे" + }, + "search": { + "allResults": "बस यही है!", + "failed": "मीडिया ढूंढने में विफल, पुनः प्रयास करें!", + "loading": "लोडा हो रहा है..।", + "noResults": "हमें कुछ नहीं मिला!", + "placeholder": "क्या देखना चाहते हो भाई?", + "sectionTitle": "खोज के परिणाम" + }, + "titles": { + "day": { + "default": "आप आज शाम क्या देखना चाहेंगे?" + }, + "morning": { + "default": "आप आज सुबह को क्या देखना चाहेंगे?", + "extra": [ + "मैंने सुना है सूर्योदय से पहले ठीक है" + ] + }, + "night": { + "default": "आप आज रात को क्या देखना चाहेंगे?", + "extra": [ + "थके हुए हो? मैंने सुना एक्सोरसिस्ट अच्छी मूवी है।" + ] + } + } + }, + "media": { + "episodeDisplay": "S{{season}} E{{episode}}", + "types": { + "movie": "मूवी", + "show": "शृंखला" + } + }, + "navigation": { + "banner": { + "offline": "अपना इंटरनेट संपर्क जांचे" + }, + "menu": { + "about": "हमारे बारे में", + "donation": "दान करें", + "logout": "लॉग आउट", + "register": "क्लाउड से सिंक करें", + "settings": "चेड चाड करे", + "support": "सहायता" + } + }, + "notFound": { + "badge": "नहीं मिला", + "goHome": "घर वापिस जा रहा हूँ", + "message": "हमने हर जगह देखा: डिब्बे के नीचे, कोठरी में, प्रॉक्सी के पीछे लेकिन अंततः वह पेज नहीं मिला जिसे आप ढूंढ रहे थे।", + "title": "वह पृष्ठ नहीं मिल सका" + }, + "overlays": { + "close": "बंद करना" + }, + "player": { + "back": { + "default": "घर वापिस", + "short": "वापिस" + }, + "casting": { + "enabled": "डिवाइस पर कास्ट किया जा रहा है..।" + }, + "menus": { + "downloads": { + "disclaimer": "डाउनलोड सीधे प्रदाता से लिए जाते हैं। मूवी-वेब का इस पर नियंत्रण नहीं है कि डाउनलोड कैसे प्रदान किए जाते हैं।", + "downloadPlaylist": "प्लेलिस्ट डाउनलोड करें", + "downloadSubtitle": "वर्तमान उपशीर्षक डाउनलोड करें", + "downloadVideo": "वीडियो डाउनलोड करें", + "hlsDisclaimer": "डाउनलोड सीधे प्रदाता से लिए जाते हैं। मूवी-वेब का इस पर नियंत्रण नहीं है कि डाउनलोड कैसे प्रदान किए जाते हैं। कृपया ध्यान दें कि आप एक एचएलएस प्लेलिस्ट डाउनलोड कर रहे हैं, यह उन्नत मल्टीमीडिया स्ट्रीमिंग से परिचित उपयोगकर्ताओं के लिए है।", + "onAndroid": { + "1": "एंड्रॉइड पर डाउनलोड करने के लिए, डाउनलोड बटन पर क्लिक करें, फिर नए पेज पर, वीडियो पर टैप करके रखें, फिर save चुनें।", + "shortTitle": "डाउनलोड / एंड्रॉइड", + "title": "एंड्रॉइड पर डाउनलोड हो रहा है" + }, + "onIos": { + "1": "iOS पर डाउनलोड करने के लिए, डाउनलोड बटन पर क्लिक करें, फिर नए पेज पर पर क्लिक करें, फिर फ़ाइलों में सहेजें पर क्लिक करें।", + "shortTitle": "डाउनलोड / आईओएस", + "title": "आईओएस पर डाउनलोड हो रहा है" + }, + "onPc": { + "1": "पीसी पर, डाउनलोड बटन पर क्लिक करें, फिर नए पेज पर, वीडियो पर राइट क्लिक करें और वीडियो को इस रूप में सेव करें चुनें", + "shortTitle": "डाउनलोड / पीसी", + "title": "पीसी पर डाउनलोड हो रहा है" + }, + "title": "डाउनलोड" + }, + "episodes": { + "button": "एपिसोड", + "emptyState": "इस सीज़न में कोई एपिसोड नहीं है, बाद में दोबारा जाँचें!", + "episodeBadge": "E{{episode}}", + "loadingError": "सीज़न लोड करने में त्रुटि", + "loadingList": "लोड..।", + "loadingTitle": "लोडा हो रहा है..।" + }, + "playback": { + "speedLabel": "प्लेबैक गति", + "title": "प्लेबैक सेटिंग्स" + }, + "quality": { + "automaticLabel": "स्वचालित गुणवत्ता", + "hint": "आप विभिन्न गुणवत्ता विकल्प प्राप्त करने के लिए <0>स्रोत स्विचिंग का प्रयास कर सकते हैं।", + "iosNoQuality": "Apple द्वारा परिभाषित सीमाओं के कारण, इस स्रोत के लिए iOS पर गुणवत्ता चयन उपलब्ध नहीं है। आप विभिन्न गुणवत्ता विकल्प प्राप्त करने के लिए <0>किसी अन्य स्रोत पर स्विच करने का प्रयास कर सकते हैं।", + "title": "गुणवत्ता" + }, + "settings": { + "downloadItem": "डाउनलोड", + "enableSubtitles": "उपशीर्षक सक्षम करें", + "experienceSection": "देखने का अनुभव", + "playbackItem": "प्लेबैक सेटिंग्स", + "qualityItem": "चित्र की गुणवत्ता", + "sourceItem": "वीडियो स्रोत", + "subtitleItem": "उपशीर्षक सेटिंग्स", + "videoSection": "वीडियो सेटिंग्स" + }, + "sources": { + "failed": { + "text": "किसी भी वीडियो को खोजने का प्रयास करते समय एक त्रुटि हुई, कृपया किसी भिन्न स्रोत का प्रयास करें।", + "title": "स्क्रैप करने में विफल" + }, + "noEmbeds": { + "text": "हम कोई एम्बेड नहीं ढूंढ पाए, कृपया कोई भिन्न स्रोत आज़माएँ।", + "title": "कोई एंबेड नहीं मिला" + }, + "noStream": { + "text": "इस स्रोत के पास इस फिल्म या शो के लिए कोई स्ट्रीम नहीं है।", + "title": "कोई धारा नहीं" + }, + "title": "सूत्रों का कहना है", + "unknownOption": "अज्ञात" + }, + "subtitles": { + "customChoice": "फ़ाइल से उपशीर्षक चुनें", + "customizeLabel": "अनुकूलित करें", + "offChoice": "बंद", + "settings": { + "backlink": "कस्टम उपशीर्षक", + "delay": "उपशीर्षक विलंब", + "fixCapitals": "पूंजीकरण ठीक करें" + }, + "title": "उपशीर्षक", + "unknownLanguage": "अज्ञात" + } + }, + "metadata": { + "failed": { + "badge": "असफल", + "homeButton": "घर जाओ", + "text": "टीएमडीबी से मीडिया का मेटाडेटा लोड नहीं किया जा सका। कृपया जांचें कि क्या आपके इंटरनेट कनेक्शन पर टीएमडीबी बंद है या अवरुद्ध है।", + "title": "मेटाडेटा लोड करने में विफल" + }, + "notFound": { + "badge": "नहीं मिला", + "homeButton": "घर वापिस", + "text": "हमें आपके द्वारा अनुरोधित मीडिया नहीं मिल सका। या तो इसे हटा दिया गया है या आपने यूआरएल के साथ छेड़छाड़ की है।", + "title": "वह मीडिया नहीं मिल सका।" + } + }, + "nextEpisode": { + "cancel": "रद्द करना", + "next": "अगले प्रकरण" + }, + "playbackError": { + "badge": "प्लेबैक त्रुटि", + "errors": { + "errorAborted": "उपयोगकर्ता के अनुरोध पर मीडिया को लाना रोक दिया गया था।", + "errorDecode": "पहले प्रयोग योग्य होने के लिए निर्धारित होने के बावजूद, मीडिया संसाधन को डीकोड करने का प्रयास करते समय एक त्रुटि उत्पन्न हुई, जिसके परिणामस्वरूप त्रुटि हुई।", + "errorGenericMedia": "अज्ञात मीडिया त्रुटि उत्पन्न हुई।", + "errorNetwork": "किसी प्रकार की नेटवर्क त्रुटि उत्पन्न हुई जिसके कारण मीडिया पहले से उपलब्ध होने के बावजूद सफलतापूर्वक प्राप्त नहीं हो सका।", + "errorNotSupported": "मीडिया या मीडिया प्रदाता ऑब्जेक्ट समर्थित नहीं है।" + }, + "homeButton": "घर जाओ", + "text": "मीडिया चलाने का प्रयास करते समय एक त्रुटि हुई. कृपया पुन: प्रयास करें।", + "title": "वीडियो चलाने में विफल!" + }, + "scraping": { + "items": { + "failure": "त्रुटि हुई", + "notFound": "वीडियो नहीं है", + "pending": "वीडियो की जांच की जा रही है..।" + }, + "notFound": { + "badge": "नहीं मिला", + "detailsButton": "प्रदर्शन का विवरण", + "homeButton": "घर जाओ", + "text": "हमने अपने प्रदाताओं के माध्यम से खोज की है और आपको वह मीडिया नहीं मिल सका जिसकी आप तलाश कर रहे हैं! हम मीडिया की मेजबानी नहीं करते हैं और जो उपलब्ध है उस पर हमारा कोई नियंत्रण नहीं है। अधिक जानकारी के लिए कृपया नीचे 'विवरण दिखाएं' पर क्लिक करें।", + "title": "हमें वह नहीं मिला" + } + }, + "time": { + "regular": "{{timeWatched}} / {{duration}}", + "remaining": "{{timeLeft}} समय बचा है • ख़तम होगा {{timeFinished, datetime}}", + "shortRegular": "{{timeWatched}}", + "shortRemaining": "-{{timeLeft}}" + } + }, + "screens": { + "dmca": { + "text": "मूवी-वेब के DMCA संपर्क पृष्ठ में आपका स्वागत है! हम बौद्धिक संपदा अधिकारों का सम्मान करते हैं और किसी भी कॉपीराइट संबंधी चिंताओं का शीघ्र समाधान करना चाहते हैं। यदि आपको लगता है कि आपके कॉपीराइट किए गए कार्य का हमारे प्लेटफ़ॉर्म पर अनुचित तरीके से उपयोग किया गया है, तो कृपया नीचे दिए गए ईमेल पर एक विस्तृत DMCA नोटिस भेजें। कृपया कॉपीराइट सामग्री का विवरण, अपना संपर्क विवरण और सद्भावना विश्वास का एक बयान शामिल करें। हम इन मामलों को तुरंत हल करने के लिए प्रतिबद्ध हैं और मूवी-वेब को रचनात्मकता और कॉपीराइट का सम्मान करने वाला स्थान बनाए रखने में आपके सहयोग की सराहना करते हैं।", + "title": "DMCA" + }, + "loadingApp": "एप्लिकेशन लोड हो रहा है", + "loadingUser": "आपकी प्रोफ़ाइल लोड हो रही है", + "loadingUserError": { + "logout": "लॉग आउट", + "reset": "कस्टम सर्वर रीसेट करें", + "text": "आपकी प्रोफ़ाइल लोड करने में विफल", + "textWithReset": "आपके कस्टम सर्वर से आपकी प्रोफ़ाइल लोड करने में विफल, डिफ़ॉल्ट सर्वर पर वापस रीसेट करना चाहते हैं?" + }, + "migration": { + "failed": "आपका डेटा स्थानांतरित करने में विफल।", + "inProgress": "कृपया रुकें, हम आपका डेटा स्थानांतरित कर रहे हैं। इसमें ज्यादा समय नहीं लगना चाहिए।" + } + }, + "settings": { + "account": { + "accountDetails": { + "deviceNameLabel": "डिवाइस का नाम", + "deviceNamePlaceholder": "निजी फ़ोन", + "editProfile": "संपादन करना", + "logoutButton": "लॉग आउट" + }, + "actions": { + "delete": { + "button": "खाता हटा दो", + "confirmButton": "खाता हटा दो", + "confirmDescription": "क्या आप इस खाते को हटाने के लिए सुनिश्चित हैं? आपका सारा डेटा खो जाएगा!", + "confirmTitle": "क्या आपको यकीन है?", + "text": "यह क्रिया अपरिवर्तनीय है. सारा डेटा हटा दिया जाएगा और कुछ भी पुनर्प्राप्त नहीं किया जा सकेगा।", + "title": "खाता हटा दो" + }, + "title": "कार्रवाई" + }, + "devices": { + "deviceNameLabel": "डिवाइस का नाम", + "failed": "सत्र लोड करने में विफल", + "removeDevice": "निकालना", + "title": "उपकरण" + }, + "profile": { + "finish": "संपादन समाप्त करें", + "firstColor": "प्रोफ़ाइल का रंग एक", + "secondColor": "प्रोफ़ाइल रंग दो", + "title": "प्रोफाइल तस्वीर को संपादित करें", + "userIcon": "आइकन" + }, + "register": { + "cta": "शुरू हो जाओ", + "text": "अपनी प्रगति को उपकरणों के बीच साझा करें और उन्हें समन्वयित रखें।", + "title": "क्लाउड से सिंक करें" + }, + "title": "खाता" + }, + "appearance": { + "activeTheme": "सक्रिय", + "themes": { + "blue": "नीला", + "default": "गलती करना", + "gray": "स्लेटी", + "red": "लाल", + "teal": "टील" + }, + "title": "उपस्थिति" + }, + "connections": { + "server": { + "description": "यदि आप अपना डेटा संग्रहीत करने के लिए कस्टम बैकएंड से कनेक्ट करना चाहते हैं, तो इसे सक्षम करें और URL प्रदान करें।", + "label": "कस्टम सर्वर", + "urlLabel": "कस्टम सर्वर यूआरएल" + }, + "title": "सम्बन्ध", + "workers": { + "addButton": "नया कार्यकर्ता जोड़ें", + "description": "एप्लिकेशन को कार्यशील बनाने के लिए, सभी ट्रैफ़िक को प्रॉक्सी के माध्यम से रूट किया जाता है। यदि आप अपने स्वयं के श्रमिकों को लाना चाहते हैं तो इसे सक्षम करें।", + "emptyState": "अभी तक कोई कर्मचारी नहीं, नीचे एक जोड़ें", + "label": "कस्टम प्रॉक्सी कार्यकर्ताओं का उपयोग करें", + "urlLabel": "कार्यकर्ता यूआरएल", + "urlPlaceholder": "https://" + } + }, + "locale": { + "language": "अनुप्रयोग भाषा", + "languageDescription": "भाषा संपूर्ण अनुप्रयोग पर लागू होती है।", + "title": "स्थानीय" + }, + "reset": "रीसेट", + "save": "सेव", + "sidebar": { + "info": { + "appVersion": "एप्लिकेशन वेरीज़न", + "backendUrl": "बैकएंड यूआरएल", + "backendVersion": "बैकएंड संस्करण", + "hostname": "होस्ट का नाम", + "insecure": "असुरक्षित", + "notLoggedIn": "आपने लॉग - इन नहीं किया", + "secure": "सुरक्षित", + "title": "ऐप की जानकारी", + "unknownVersion": "अज्ञात", + "userId": "उपयोगकर्ता पहचान" + } + }, + "subtitles": { + "backgroundLabel": "पृष्ठभूमि अस्पष्टता", + "colorLabel": "रंग", + "previewQuote": "मुझे डरना नहीं चाहिए. डर मन हत्यारा है।", + "textSizeLabel": "टेक्स्ट का साइज़", + "title": "उपशीर्षक" + }, + "unsaved": "आपके पास सहेजे नहीं गए परिवर्तन हैं" + } +} diff --git a/src/assets/locales/it.json b/src/assets/locales/it.json index 1507eb05..88bf1b11 100644 --- a/src/assets/locales/it.json +++ b/src/assets/locales/it.json @@ -1,71 +1,66 @@ { - "global": { - "name": "movie-web" + "global": { + "name": "movie-web" + }, + "home": { + "bookmarks": { + "sectionTitle": "Segnalibri" }, - "home": { - "search": { - "allResults": "Ecco tutto ciò che abbiamo!", - "sectionTitle": "Risultati della ricerca", - "noResults": "Non abbiamo trovato nulla!", - "failed": "Impossibile trovare i media, riprova!", - "loading": "Caricamento...", - "placeholder": "Cosa vuoi guardare?" - }, - "bookmarks": { - "sectionTitle": "Segnalibri" - }, - "continueWatching": { - "sectionTitle": "Continua a guardare" - } + "continueWatching": { + "sectionTitle": "Continua a guardare" }, - "media": { - "types": { - "movie": "Film", - "show": "Serie" - }, - "episodeDisplay": "S{{season}} E{{episode}}" - }, - "player": { - "playbackError": { - "title": "Ops, qualcosa si è rotto!" - }, - "metadata": { - "notFound": { - "badge": "Non trovato", - "homeButton": "Torna alla home", - "title": "Impossibile trovare quel media.", - "text": "Non siamo riusciti a trovare il media richiesto. È stato rimosso o hai manomesso l'URL." - } - }, - "menus": { - "captions": { - "customChoice": "Carica sottotitolo", - "customizeLabel": "Personalizza", - "title": "Sottotitoli" - }, - "sources": { - "title": "Fonti" - }, - "episodes": { - "button": "Episodi", - "loadingTitle": "Caricamento...", - "loadingList": "Caricamento..." - } - }, - "back": { - "default": "Torna alla home", - "short": "Indietro" - } - }, - "notFound": { - "badge": "Non trovato", - "goHome": "Torna alla home", - "title": "Impossibile trovare quella pagina", - "message": "Abbiamo cercato ovunque: sotto i bidoni, nell'armadio, dietro il proxy, ma alla fine non siamo riusciti a trovare la pagina che stai cercando." - }, - "navigation": { - "banner": { - "offline": "Controlla la tua connessione internet" - } + "search": { + "allResults": "Ecco tutto ciò che abbiamo!", + "failed": "Impossibile trovare i media, riprova!", + "loading": "Caricamento...", + "noResults": "Non abbiamo trovato nulla!", + "placeholder": "Cosa vuoi guardare?", + "sectionTitle": "Risultati della ricerca" } + }, + "media": { + "episodeDisplay": "S{{season}} E{{episode}}", + "types": { + "movie": "Film", + "show": "Serie" + } + }, + "navigation": { + "banner": { + "offline": "Controlla la tua connessione internet" + } + }, + "notFound": { + "badge": "Non trovato", + "goHome": "Torna alla home", + "message": "Abbiamo cercato ovunque: sotto i bidoni, nell'armadio, dietro il proxy, ma alla fine non siamo riusciti a trovare la pagina che stai cercando.", + "title": "Impossibile trovare quella pagina" + }, + "player": { + "back": { + "default": "Torna alla home", + "short": "Indietro" + }, + "menus": { + "episodes": { + "button": "Episodi", + "loadingList": "Caricamento...", + "loadingTitle": "Caricamento..." + }, + "sources": { + "title": "Fonti" + } + }, + "metadata": { + "notFound": { + "badge": "Non trovato", + "homeButton": "Torna alla home", + "text": "Non siamo riusciti a trovare il media richiesto. È stato rimosso o hai manomesso l'URL.", + "title": "Impossibile trovare quel media." + } + }, + "playbackError": { + "title": "Ops, qualcosa si è rotto!" + } + } } diff --git a/src/assets/locales/km.json b/src/assets/locales/km.json new file mode 100644 index 00000000..8b371bae --- /dev/null +++ b/src/assets/locales/km.json @@ -0,0 +1,10 @@ +{ + "about": { + "description": "movie-web គឺ​ជា​កម្មវិធី​បណ្ដាញវែបសាយ​ដែល​ស្វែងរក​អ៊ីនធឺណិត​សម្រាប់​ការ​ផ្សាយ។ ក្រុមនេះមានគោលបំណងសម្រាប់វិធីសាស្រ្តតិចតួចបំផុតក្នុងការប្រើប្រាស់មាតិកា។", + "faqTitle": "សំណួរទូទៅ", + "q1": { + "body": "movie-web មិនផ្ទុកមាតិកាណាមួយទេ។ នៅពេលអ្នកចុចលើអ្វីមួយដើម្បីមើល អ៊ីនធឺណិតត្រូវបានស្វែងរកសម្រាប់មេឌៀដែលបានជ្រើសរើស (នៅលើអេក្រង់ផ្ទុក និងក្នុងផ្ទាំង 'ប្រភពវីដេអូ' អ្នកអាចឃើញប្រភពណាមួយដែលអ្នកកំពុងប្រើ)។ ប្រព័ន្ធផ្សព្វផ្សាយមិនដែលត្រូវបានបង្ហោះដោយគេហទំព័រភាពយន្តនោះទេ អ្វីគ្រប់យ៉ាងគឺតាមរយៈយន្តការស្វែងរកនេះ។", + "title": "តើមាតិកាបានមកពីណា?" + } + } +} diff --git a/src/assets/locales/lv.json b/src/assets/locales/lv.json index 0f0a0f9c..de2ad471 100644 --- a/src/assets/locales/lv.json +++ b/src/assets/locales/lv.json @@ -173,20 +173,8 @@ "enabled": "Atskaņo uz ierīci..." }, "menus": { - "captions": { - "customChoice": "Atlasiet failā parakstu", - "customizeLabel": "Paraksti", - "offChoice": "Izslēgts", - "settings": { - "delay": "Parakstu aizkave", - "fixCapitals": "Labojiet lielo burtu lietojumu" - }, - "title": "Paraksti", - "unknownLanguage": "Nezināms" - }, "downloads": { "disclaimer": "Lejupielādes tiek ņemtas tieši no pakalpojumu sniedzēja. Movie-web nevar kontrolēt, kā tiek nodrošinātas lejupielādes.", - "downloadCaption": "Lejupielādēt pašreizējo parakstu", "downloadVideo": "Lejupielādēt video", "onAndroid": { "1": "Lai lejupielādētu operētājsistēmā Android, noklikšķiniet uz lejupielādes pogas, pēc tam jaunajā lapā pieskarieties videoklipam un turiet to, pēc tam atlasiet saglabāt.", @@ -224,9 +212,7 @@ "title": "Kvalitāte" }, "settings": { - "captionItem": "Parakstu iestatījumi", "downloadItem": "Lejupladēt", - "enableCaptions": "Iespējot parakstus", "experienceSection": "Skatīšanās pieredze", "playbackItem": "Atskaņošana iestādijumi", "qualityItem": "Kvalitāte", @@ -370,13 +356,6 @@ }, "title": "Izskats" }, - "captions": { - "backgroundLabel": "Fona necaurredzamība", - "colorLabel": "Krāsa", - "previewQuote": "Es nedrīkstu baidīties. Bailes ir prāta slepkava.", - "textSizeLabel": "Teksta lielums", - "title": "Paraksti" - }, "connections": { "server": { "description": "Ja vēlaties izveidot savienojumu ar pielāgotu aizmugursistēmu, lai saglabātu savus datus, iespējojiet to un norādiet URL.", diff --git a/src/assets/locales/minion.json b/src/assets/locales/minion.json index 0c27762d..99c10198 100644 --- a/src/assets/locales/minion.json +++ b/src/assets/locales/minion.json @@ -173,20 +173,8 @@ "enabled": "Casting to banana..." }, "menus": { - "captions": { - "customChoice": "Banana", - "customizeLabel": "Banana", - "offChoice": "Banana", - "settings": { - "delay": "Banana", - "fixCapitals": "Banana" - }, - "title": "Banana", - "unknownLanguage": "Banana" - }, "downloads": { "disclaimer": "Downloads are taken directly from the banana. banana-web does not have banana over how the banana are banana.", - "downloadCaption": "Banana", "downloadVideo": "Banana", "onAndroid": { "1": "To banana on Banana, click the banana banana then, on the new banana, tap and hold on the banana, then select banana.", @@ -224,9 +212,7 @@ "title": "Banana" }, "settings": { - "captionItem": "Banana settings", "downloadItem": "Banana", - "enableCaptions": "Enable banana", "experienceSection": "Banana Viewing experience", "playbackItem": "Banana settings", "qualityItem": "Banana", @@ -333,18 +319,18 @@ "text": "Whaaat? This banana is irreversible. All bananas will be banana and nothing can be banana.", "title": "Banana" }, - "title": "Banana" + "title": "Bananas" }, "devices": { "deviceNameLabel": "Banana name", - "failed": "Failed to load bananas", + "failed": "Failed to load bananas :'(", "removeDevice": "Banana", - "title": "Banana" + "title": "Bananas" }, "profile": { - "finish": "Banana banana", - "firstColor": "Minion color one", - "secondColor": "Minion color two", + "finish": "Finish banana", + "firstColor": "Minion color banana", + "secondColor": "Minion color banana", "title": "Edit banana banana", "userIcon": "Minion icon" }, @@ -366,27 +352,20 @@ }, "title": "Banana" }, - "captions": { - "backgroundLabel": "Banana opacity", - "colorLabel": "Banana", - "previewQuote": "I must not banana. Banana is the banana-killer.", - "textSizeLabel": "Banana size", - "title": "Banana" - }, "connections": { "server": { "description": "Banana you would like to banana to a banana banana to store your banana, banana this and banana the URL.", "label": "Banana banana", "urlLabel": "Banana banana URL" }, - "title": "Banana", + "title": "Bananas", "workers": { - "addButton": "Banana banana banana", + "addButton": "Add new banana", "description": "Banana make the banana function, all banana is banana through bananas. Banana this if you banana to banana your own bananas.", "emptyState": "No bananas yet, banana one banana", - "label": "Banana custom banana", + "label": "Banana custom banana workers", "urlLabel": "Banana URLs", - "urlPlaceholder": "https://" + "urlPlaceholder": "banana://" } }, "locale": { @@ -410,6 +389,11 @@ "userId": "Minion ID" } }, + "subtitles": { + "previewQuote": "I must not banana. Banana is the minion-killer.", + "textSizeLabel": "Banana size", + "title": "Bananas" + }, "unsaved": "Whaaat? You have unsaved bananas" } } diff --git a/src/assets/locales/ne.json b/src/assets/locales/ne.json index 31c3255b..5cc90c08 100644 --- a/src/assets/locales/ne.json +++ b/src/assets/locales/ne.json @@ -174,21 +174,11 @@ "enabled": "उपकरणमा कास्ट गर्दै..." }, "menus": { - "captions": { - "customChoice": "फाइलबाट क्याप्शन चयन गर्नुहोस्", - "customizeLabel": "रुचिको अनुसार बनाउनु", - "offChoice": "बन्द", - "settings": { - "delay": "क्याप्सन ढिलाइ", - "fixCapitals": "पूंजीकरण ठीक गर्नुहोस्" - }, - "title": "क्याप्शन", - "unknownLanguage": "अज्ञात" - }, "downloads": { "disclaimer": "डाउनलोडहरू सीधा प्रदायकबाट लिइन्छ। movie-web ले डाउनलोडहरू कसरी प्रदान गरिन्छ भन्नेमा नियन्त्रण गर्दैन।", - "downloadCaption": "डाउनलोड चलिरहेको क्याप्शन", + "downloadPlaylist": "डाउनलोड प्लेलिस्ट", "downloadVideo": "डाउनलोड भिडियो", + "hlsDisclaimer": "डाउनलोडहरू सीधा प्रदायकबाट लिइन्छ। movie-webले डाउनलोडहरू कसरी प्रदान गरिन्छ भन्नेमा नियन्त्रण गर्दैन। कृपया ध्यान दिनुहोस् कि तपाइँ HLS प्लेलिस्ट डाउनलोड गर्दै हुनुहुन्छ, यो उन्नत मल्टिमिडिया स्ट्रिमिङसँग परिचित प्रयोगकर्ताहरूको लागि हो।", "onAndroid": { "1": "एन्ड्रोइड मा, डाउनलोड बटन क्लिक गर्नुहोस् त्यसपछि, नयाँ पृष्ठमा, भिडियोमा ट्याप गर्नुहोस् र होल्ड गर्नुहोस्, त्यसपछि बचत चयन गर्नुहोस्।", "shortTitle": "डाउनलोड / एन्ड्रोइड", @@ -225,9 +215,7 @@ "title": "क्वालिटी" }, "settings": { - "captionItem": "क्याप्शन सेत्तिन्ग्स", "downloadItem": "डाउनलोड", - "enableCaptions": "क्याप्सन इनेबल गर्नुहोस्", "experienceSection": "हेर्ने अनुभव", "playbackItem": "प्लेब्याक सेटिङ", "qualityItem": "क्वालिटी", @@ -249,6 +237,17 @@ }, "title": "स्रोतहरू", "unknownOption": "अज्ञात" + }, + "subtitles": { + "customizeLabel": "अनुकूलन गर्नुहोस्", + "offChoice": "बन्द", + "settings": { + "backlink": "अनुकूलन उपशीर्षकहरू", + "delay": "क्याप्शन ढिलाइ", + "fixCapitals": "पूंजीकरण ठीक गर्नुहोस्" + }, + "title": "क्याप्शन", + "unknownLanguage": "अज्ञात" } }, "metadata": { @@ -371,13 +370,6 @@ }, "title": "रूप-रंग" }, - "captions": { - "backgroundLabel": "पृष्ठभूमि अस्पष्टता", - "colorLabel": "रङ", - "previewQuote": "म डराउनु हुँदैन। डर मनको हत्यारा हो।", - "textSizeLabel": "शब्दको आकार", - "title": "क्याप्शन" - }, "connections": { "server": { "description": "यदि तपाईं आफ्नो डेटा भण्डारण गर्न अनुकूलन ब्याकइन्डमा जडान गर्न चाहनुहुन्छ भने, यसलाई सक्षम गर्नुहोस् र URL प्रदान गर्नुहोस्।", @@ -415,6 +407,11 @@ "userId": "प्रयोगकर्ता ID" } }, + "subtitles": { + "previewQuote": "म डराउनु हुँदैन। डर दिमागको हत्यारा हो।", + "textSizeLabel": "टेक्स्ट साइज", + "title": "क्याप्शन" + }, "unsaved": "तपाईंसँग सुरक्षित नगरिएका परिवर्तनहरू छन्" } } diff --git a/src/assets/locales/nl.json b/src/assets/locales/nl.json index fabaf41e..7d85d534 100644 --- a/src/assets/locales/nl.json +++ b/src/assets/locales/nl.json @@ -107,20 +107,8 @@ "enabled": "Aan het casten..." }, "menus": { - "captions": { - "customChoice": "Ondertiteling uploaden", - "customizeLabel": "Instellingen", - "offChoice": "Geen ondertiteling", - "settings": { - "delay": "Tijdverschil ondertiteling", - "fixCapitals": "Hoofdletters corrigeren" - }, - "title": "Ondertiteling", - "unknownLanguage": "Onbekend" - }, "downloads": { "disclaimer": "Downloads worden direct bij de bron opgehaald. movie-web heeft geen controle over het bestand dat je ontvangt.", - "downloadCaption": "Ondertiteling downloaden", "downloadVideo": "Download filmpje", "title": "Download" }, @@ -133,9 +121,7 @@ "loadingTitle": "Aan het zoeken..." }, "settings": { - "captionItem": "Instellingen ondertiteling", "downloadItem": "Download", - "enableCaptions": "Ondertiteling aanzetten", "experienceSection": "Kijk-ervaring", "playbackItem": "Afspeel instellingen", "qualityItem": "Kwaliteit", diff --git a/src/assets/locales/pirate.json b/src/assets/locales/pirate.json index ed892aed..2ce777fd 100644 --- a/src/assets/locales/pirate.json +++ b/src/assets/locales/pirate.json @@ -129,20 +129,8 @@ "short": "Back" }, "menus": { - "captions": { - "customChoice": "Upload sea shanties", - "customizeLabel": "Customize", - "offChoice": "Off", - "settings": { - "delay": "Shanty delay", - "fixCapitals": "Fix capitalization" - }, - "title": "Sea Shanties", - "unknownLanguage": "Unknown" - }, "downloads": { "disclaimer": "Downloads be taken directly from the provider. movie-web does not have control over how the downloads be provided.", - "downloadCaption": "Download sea shanty", "downloadVideo": "Download film", "onAndroid": { "1": "To download on Android, tap and hold on the film, then select save.", @@ -180,9 +168,7 @@ "title": "Quality" }, "settings": { - "captionItem": "Sea Shanty settings", "downloadItem": "Buried Treasure", - "enableCaptions": "Enable Sea Shanties", "experienceSection": "Viewing Experience", "playbackItem": "Playback settings", "qualityItem": "Quality", @@ -320,13 +306,6 @@ }, "title": "Appearance" }, - "captions": { - "backgroundLabel": "Background opacity", - "colorLabel": "Color", - "previewQuote": "I must not fear. Fear be the mind-killer.", - "textSizeLabel": "Text size", - "title": "Captions" - }, "connections": { "server": { "description": "To make the application function, all traffic be routed through proxies. Enable this if ye want to bring yer own sailors.", diff --git a/src/assets/locales/pl.json b/src/assets/locales/pl.json index eb84442f..149f8789 100644 --- a/src/assets/locales/pl.json +++ b/src/assets/locales/pl.json @@ -1,74 +1,417 @@ { - "global": { - "name": "movie-web" + "about": { + "description": "movie-web jest aplikacją internetową, która wyszukuje w internecie strumienia. Zespół dąży do minimalistycznego podejścia do konsumpcji treści.", + "faqTitle": "Częste pytania", + "q1": { + "body": "movie-web nie udostępnia żadnych treści. Kiedy klikniesz na coś co chcesz obejrzeć, internet zostanie przeszukany pod kątem wybranych multimediów (na ekranie ładowania oraz w zakładce „źródła wideo” możesz zobaczyć, z jakiego źródła korzystasz). Media nigdy nie są przesyłane przez movie-web, wszystko odbywa się za pośrednictwem tego mechanizmu wyszukiwania.", + "title": "Skąd pochodzą treści?" }, - "home": { - "search": { - "allResults": "To wszystko co mamy!", - "sectionTitle": "Wyniki wyszukiwania", - "noResults": "Nie mogliśmy niczego znaleźć!", - "failed": "Nie udało się znaleźć mediów, Spróbuj ponownie!", - "loading": "Wczytywanie...", - "placeholder": "Co chciałbyś obejrzeć?" - }, - "bookmarks": { - "sectionTitle": "Zakładki" - }, - "continueWatching": { - "sectionTitle": "Kontynuuj oglądanie" - } + "q2": { + "body": "Nie można złożyć wniosku o programu ani filmu, movie-web nie zarządza żadną treścią. Wszystkie treści są przeglądane za pośrednictwem źródeł w Internecie.", + "title": "Gdzie mogę złożyć wniosek o programie lub filmie?" }, - "media": { - "types": { - "movie": "Filmy", - "show": "Seriale" - }, - "episodeDisplay": "S{{season}} E{{episode}}" + "q3": { + "body": "Nasze wyniki wyszukiwania pochodzą z TMDB i są wyświetlane niezależnie od tego, czy nasze źródła faktycznie posiadają daną treść.", + "title": "W wyniku wyszukiwania wyświetlany jest program lub film. Dlaczego nie mogę go odtworzyć?" }, - "player": { - "playbackError": { - "title": "Ups, popsuło się!" - }, - "metadata": { - "notFound": { - "badge": "Nie znaleziono", - "homeButton": "Wróć na stronę główną", - "title": "Nie można znaleźć multimediów.", - "text": "Nie mogliśmy znaleźć rządanych multimediów. Albo zostały usunięte, albo grzebałeś przy adresie URL." - } - }, - "menus": { - "captions": { - "customChoice": "Załącz", - "customizeLabel": "Personalizuj", - "title": "Napisy" - }, - "sources": { - "title": "Źródła" - }, - "episodes": { - "button": "Odcinki", - "loadingTitle": "Wczytywanie...", - "loadingList": "Wczytywanie..." - } - }, - "back": { - "default": "Wróć na stronę główną", - "short": "Wróć" - } + "title": "O movie-web" + }, + "actions": { + "copied": "Skopiowano", + "copy": "Kopiuj" + }, + "auth": { + "createAccount": "Nie masz jeszcze konta? <0>Utwórz konto.", + "deviceNameLabel": "Nazwa urządzenia", + "deviceNamePlaceholder": "Telefon osobisty", + "generate": { + "description": "Twoja fraza hasła działa jak nazwa użytkownika i hasło. Pamiętaj aby zachować go w bezpiecznym miejscu, ponieważ będziesz musiał go wprowadzić aby zalogować się na swoje konto", + "next": "Zapisałem frazę hasła", + "passphraseFrameLabel": "Fraza hasła", + "title": "Twoja fraza hasła" }, - "notFound": { - "badge": "Nie znaleziono", - "goHome": "Wróć na stronę główną", - "title": "Nie można znaleźć tej strony", - "message": "Szukaliśmy wszędzie: w koszu, w szafie a nawet w piwnicy, ale nie byliśmy w stanie znaleźć strony której szukasz." + "hasAccount": "Masz już konto? <0>Zaloguj się tutaj.", + "login": { + "description": "Proszę wpisać frazę hasła, aby zalogować się na swoje konto", + "deviceLengthError": "Proszę wpisać nazwę urządzenia", + "passphraseLabel": "12-wyrazowa fraza hasła", + "passphrasePlaceholder": "Fraza hasła", + "submit": "Zaloguj się", + "title": "Zaloguj się na swoje konto", + "validationError": "Nieprawidłowe lub niedokończone fraza hasła" }, - "navigation": { - "banner": { - "offline": "Sprawdź swoje połączenie sieciowe" - } + "register": { + "information": { + "color1": "Kolor profilu jeden", + "color2": "Kolor profilu dwa", + "header": "Wpisz nazwę swojego urządzenia i wybierz kolory oraz ikonę użytkownika", + "icon": "Ikona użytkownika", + "next": "Dalej", + "title": "Informacje o koncie" + } }, - "overlays": { - "close": "Zamknąć" + "trust": { + "failed": { + "text": "Skonfigurowałeś to poprawnie?", + "title": "Nie udało się połączyć z serwerem" + }, + "host": "Łączysz się z <0>{{hostname}} - przed utworzeniem konta potwierdź że ufasz temu serwerowi", + "no": "Wstecz", + "title": "Ufasz temu serwerowi?", + "yes": "Ufam temu serwerowi" + }, + "verify": { + "description": "Wprowadź swoją frazę hasła, aby potwierdzić jego zapisanie i utworzyć konto", + "invalidData": "Dane są nieprawidłowe", + "noMatch": "Fraza hasła nie pasuje", + "passphraseLabel": "Twoja 12-wyrazowa fraza hasła", + "recaptchaFailed": "Weryfikacja ReCaptcha nie powiodła się", + "register": "Utwórz konto", + "title": "Potwierdź swoją frazę hasła" } + }, + "errors": { + "badge": "Zepsuło się", + "details": "Szczegóły błędu", + "reloadPage": "Odśwież stronę", + "showError": "Pokaż szczegóły błędu", + "title": "Napotkaliśmy błąd!" + }, + "footer": { + "legal": { + "disclaimer": "Zastrzeżenie", + "disclaimerText": "movie-web nie przechowuje żadnych plików, zawiera jedynie łącza do usług stron trzecich. Kwestie prawne należy konsultować z hostami plików i dostawcami. movie-web nie ponosi odpowiedzialności za jakiekolwiek pliki multimedialne prezentowane przez dostawców wideo." + }, + "links": { + "discord": "Discord", + "dmca": "DMCA", + "github": "GitHub" + }, + "tagline": "Oglądaj swoje ulubione programy i filmy za pomocą tej aplikacji streamingowej typu open source." + }, + "global": { + "name": "movie-web", + "pages": { + "about": "Informacje", + "dmca": "DMCA", + "login": "Zaloguj sie", + "pagetitle": "{{title}} - movie-web", + "register": "Zarejestruj się", + "settings": "Ustawienia" + } + }, + "home": { + "bookmarks": { + "sectionTitle": "Zakładki" + }, + "continueWatching": { + "sectionTitle": "Kontynuuj oglądanie" + }, + "mediaList": { + "stopEditing": "Przestań edytować" + }, + "search": { + "allResults": "To wszystko co mamy!", + "failed": "Nie udało się znaleźć mediów, Spróbuj ponownie!", + "loading": "Wczytywanie...", + "noResults": "Nie mogliśmy niczego znaleźć!", + "placeholder": "Co chciałbyś obejrzeć?", + "sectionTitle": "Wyniki wyszukiwania" + }, + "titles": { + "day": { + "default": "Co chciałbyś obejrzeć dziś po południu?" + }, + "morning": { + "default": "Co chciałbyś obejrzeć dziś rano?", + "extra": [ + "Słyszałem że „Przed wschodem słońca” jest dobre" + ] + }, + "night": { + "default": "Co chciałbyś obejrzeć dziś wieczorem?", + "extra": [ + "Zmęczony? Słyszałem że „Egzorcysta” jest dobry." + ] + } + } + }, + "media": { + "episodeDisplay": "S{{season}} E{{episode}}", + "types": { + "movie": "Filmy", + "show": "Seriale" + } + }, + "navigation": { + "banner": { + "offline": "Sprawdź swoje połączenie sieciowe" + }, + "menu": { + "about": "O nas", + "donation": "Wspieraj nas", + "logout": "Wyloguj się", + "register": "Synchronizuj z chmurą", + "settings": "Ustawienia", + "support": "Wsparcie" + } + }, + "notFound": { + "badge": "Nie znaleziono", + "goHome": "Wróć na stronę główną", + "message": "Szukaliśmy wszędzie: w koszu, w szafie, a nawet w piwnicy, ale nie byliśmy w stanie znaleźć strony której szukasz.", + "title": "Nie można znaleźć tej strony" + }, + "overlays": { + "close": "Zamknij" + }, + "player": { + "back": { + "default": "Wróć na stronę główną", + "short": "Wróć" + }, + "casting": { + "enabled": "Przesyłam na urządzenie..." + }, + "menus": { + "downloads": { + "disclaimer": "Pliki do pobrania są pobierane bezpośrednio od dostawcy. movie-web nie ma kontroli nad sposobem dostarczania plików do pobrania.", + "downloadPlaylist": "Pobierz playlistę", + "downloadVideo": "Pobierz wideo", + "hlsDisclaimer": "Pliki do pobrania są pobierane bezpośrednio od dostawcy. movie-web nie ma kontroli nad sposobem dostarczania plików do pobrania. Należy pamiętać, że pobierana jest playlista HLS, przeznaczona dla użytkowników zaznajomionych z zaawansowanym strumieniowaniem multimediów.", + "onAndroid": { + "1": "Aby pobrać na Androidzie, kliknij przycisk pobierania, a następnie na nowej stronie dotknij i przytrzymaj na filmie, a następnie wybierz zapisz.", + "shortTitle": "Pobierz / Android", + "title": "Pobieranie na Androidzie" + }, + "onIos": { + "1": "Aby pobrać na iOS, kliknij przycisk pobierania, a następnie na nowej stronie, kliknij , a następnie Zapisz do plików .", + "shortTitle": "Pobierz / iOS", + "title": "Pobieranie na iOS" + }, + "onPc": { + "1": "Na komputerze, kliknij przycisk pobierania, a następnie na nowej stronie, kliknij wideo prawym przyciskiem myszy i wybierz Zapisz wideo jako", + "shortTitle": "Pobierz / Komputer", + "title": "Pobieranie na komputerze" + }, + "title": "Pobierz" + }, + "episodes": { + "button": "Odcinki", + "emptyState": "Nie ma odcinków w tym sezonie, sprawdź później!", + "episodeBadge": "E{{episode}}", + "loadingError": "Błąd podczas ładowania sezonu", + "loadingList": "Wczytywanie...", + "loadingTitle": "Wczytywanie..." + }, + "playback": { + "speedLabel": "Szybkość odtwarzania", + "title": "Ustawienia odtwarzania" + }, + "quality": { + "automaticLabel": "Jakość automatyczna", + "hint": "Możesz spróbować <0>przełączyć źródło aby uzyskać różne opcje jakości.", + "iosNoQuality": "Ze względu na ograniczenia zdefiniowane przez Apple, wybór jakości nie jest dostępny w systemie iOS dla tego źródła. Możesz spróbować <0>przełączyć na inne źródło aby uzyskać inne opcje jakości.", + "title": "Jakość" + }, + "settings": { + "downloadItem": "Pobierz", + "experienceSection": "Odtwarzanie", + "playbackItem": "Ustawienia odtwarzania", + "qualityItem": "Jakość", + "sourceItem": "Źródła wideo", + "videoSection": "Ustawienia wideo" + }, + "sources": { + "failed": { + "text": "Wystąpił błąd podczas próby znalezienia filmów. Spróbuj użyć innego źródła.", + "title": "Nie udało się zgarnąć" + }, + "noEmbeds": { + "text": "Nie znaleźliśmy żadnych osadzonych plików. Spróbuj użyć innego źródła.", + "title": "Nie znaleziono osadzonych treści" + }, + "noStream": { + "text": "To źródło nie ma strumieni dla tego filmu lub programu.", + "title": "Brak strumienia" + }, + "title": "Źródła", + "unknownOption": "Nieznany" + }, + "subtitles": { + "customizeLabel": "Dostosuj", + "offChoice": "Wyłączone", + "settings": { + "backlink": "Własne napisy", + "delay": "Opóźnienie napisów", + "fixCapitals": "Popraw kapitalizację" + }, + "title": "Napisy", + "unknownLanguage": "Nieznany" + } + }, + "metadata": { + "failed": { + "badge": "Nie powiodło się", + "homeButton": "Wróć na stronę główną", + "text": "Nie można załadować metadanych multimediów z TMDB. Sprawdź czy TMDB nie działa lub jest zablokowany na twoim połączeniu internetowym.", + "title": "Nie udało się załadować metadanych" + }, + "notFound": { + "badge": "Nie znaleziono", + "homeButton": "Wróć na stronę główną", + "text": "Nie znaleźliśmy żądanych multimediów. Albo został usunięty, albo zmieniłeś adres URL.", + "title": "Nie można znaleźć multimediów." + } + }, + "nextEpisode": { + "cancel": "Anuluj", + "next": "Następny odcinek" + }, + "playbackError": { + "badge": "Błąd odtwarzania", + "errors": { + "errorAborted": "Pobieranie multimediów zostało przerwane na żądanie użytkownika.", + "errorDecode": "Pomimo wcześniejszego stwierdzenia że zasób multimedialny nadaje się do użytku, wystąpił błąd podczas próby dekodowania zasobu multimedialnego, co spowodowało błąd.", + "errorGenericMedia": "Wystąpił nieznany błąd multimediów.", + "errorNetwork": "Wystąpił jakiś błąd sieciowy, który uniemożliwił pomyślne pobranie multimediów, mimo że były one wcześniej dostępne.", + "errorNotSupported": "Obiekt multimediów lub dostawcy multimediów nie jest obsługiwany." + }, + "homeButton": "Wróć na stronę główną", + "text": "Wystąpił błąd podczas próby odtworzenia multimediów. Spróbuj ponownie.", + "title": "Nie udało się odtworzyć wideo!" + }, + "scraping": { + "items": { + "failure": "Wystąpił błąd", + "notFound": "Nie ma wideo", + "pending": "Sprawdzanie filmów..." + }, + "notFound": { + "badge": "Nie znaleziono", + "detailsButton": "Pokaż szczegóły", + "homeButton": "Wróć na stronę główną", + "text": "Przeszukaliśmy naszych dostawców i nie możemy znaleźć poszukiwanych multimediów! Nie przechowujemy multimediów i nie mamy kontroli nad ich dostępnością. Kliknij \"Pokaż szczegóły\" poniżej, aby uzyskać więcej informacji.", + "title": "Nie mogliśmy znaleźć tego" + } + }, + "time": { + "regular": "{{timeWatched}} / {{duration}}", + "remaining": "Zostało {{timeLeft}} • Skończ o {{timeFinished, datetime}}", + "shortRegular": "{{timeWatched}}", + "shortRemaining": "-{{timeLeft}}" + } + }, + "screens": { + "dmca": { + "text": "Witamy na stronie kontaktowej DMCA serwisu movie-web! Szanujemy prawa własności intelektualnej i chcemy szybko rozwiązywać wszelkie problemy związane z prawami autorskimi. Jeśli uważasz że twoja praca chroniona prawem autorskim została niewłaściwie wykorzystana na naszej platformie, proszę wysłać szczegółowe powiadomienie DMCA na poniższy adres e-mail. Prosimy o dołączenie opisu materiału chronionego prawem autorskim, danych kontaktowych i oświadczenia w dobrej wierze. Zależy nam na szybkim rozwiązywaniu takich spraw i będziemy wdzięczni za współpracę w utrzymaniu movie-web jako miejsce w którym szanuje się kreatywność i prawa autorskie.", + "title": "DMCA" + }, + "loadingApp": "Wczytywanie aplikacji", + "loadingUser": "Wczytywanie profilu", + "loadingUserError": { + "logout": "Wyloguj się", + "reset": "Zresetuj serwer niestandardowy", + "text": "Nie udało się wczytać profilu", + "textWithReset": "Nie udało się wczytać profilu z niestandardowego serwera, chcesz powrócić do domyślnego serwera?" + }, + "migration": { + "failed": "Migracja danych nie powiodła się.", + "inProgress": "Proszę czekać, przeprowadzamy migrację danych. Nie powinno to zająć dużo czasu." + } + }, + "settings": { + "account": { + "accountDetails": { + "deviceNameLabel": "Nazwa urządzenia", + "deviceNamePlaceholder": "Telefon osobisty", + "editProfile": "Edytuj", + "logoutButton": "Wyloguj się" + }, + "actions": { + "delete": { + "button": "Usuń konto", + "confirmButton": "Usuń konto", + "confirmDescription": "Na pewno chcesz usunąć swoje konto? Wszystkie twoje dane zostaną stracone!", + "confirmTitle": "Jesteś pewny?", + "text": "Działanie to jest nieodwracalne. Wszystkie dane zostaną usunięte i nie będzie można ich odzyskać.", + "title": "Usuń konto" + }, + "title": "Działania" + }, + "devices": { + "deviceNameLabel": "Nazwa urządzenia", + "failed": "Nie udało się załadować sesji", + "removeDevice": "Usuń", + "title": "Urządzenia" + }, + "profile": { + "finish": "Zakończ edycję", + "firstColor": "Kolor profilu jeden", + "secondColor": "Kolor profilu dwa", + "title": "Edytuj zdjęcie profilowe", + "userIcon": "Ikona użytkownika" + }, + "register": { + "cta": "Rozpocznij", + "text": "Udostępnij postępy oglądania między urządzeniami i synchronizuj je.", + "title": "Synchronizuj z chmurą" + }, + "title": "Konto" + }, + "appearance": { + "activeTheme": "Aktywny", + "themes": { + "blue": "Niebieski", + "default": "Domyślny", + "gray": "Szary", + "red": "Czerwony", + "teal": "Morski" + }, + "title": "Wygląd" + }, + "connections": { + "server": { + "description": "Jeśli chcesz połączyć się z niestandardowym backendem w celu przechowywania danych, włącz tę opcję i podaj adres URL.", + "label": "Serwer niestandardowy", + "urlLabel": "Adres URL niestandardowego serwera" + }, + "title": "Połączenia", + "workers": { + "addButton": "Dodaj nowego pracownika", + "description": "Aby aplikacja działała, cały ruch jest kierowany przez serwery proxy. Włącz tę opcję, jeśli chcesz korzystać z własnych pracowników.", + "emptyState": "Brak pracowników, dodaj jednego poniżej", + "label": "Używaj niestandardowych pracowników proxy", + "urlLabel": "Adresy URL pracowników", + "urlPlaceholder": "https://" + } + }, + "locale": { + "language": "Język aplikacji", + "languageDescription": "Język zastosowany do całej aplikacji.", + "title": "Język" + }, + "reset": "Reset", + "save": "Zapisz", + "sidebar": { + "info": { + "appVersion": "Wersja aplikacji", + "backendUrl": "Adres URL backendu", + "backendVersion": "Wersja backendu", + "hostname": "Nazwa hosta", + "insecure": "Niebezpieczny", + "notLoggedIn": "Nie jesteś zalogowany", + "secure": "Bezpieczne", + "title": "Informacje o aplikacji", + "unknownVersion": "Nieznany", + "userId": "Identyfikator użytkownika" + } + }, + "subtitles": { + "previewQuote": "Nie wolno mi się bać. Strach zabija myślenie.", + "textSizeLabel": "Rozmiar czcionki", + "title": "Napisy" + }, + "unsaved": "Masz niezapisane zmiany" + } } diff --git a/src/assets/locales/pt-BR.json b/src/assets/locales/pt-BR.json new file mode 100644 index 00000000..39a76936 --- /dev/null +++ b/src/assets/locales/pt-BR.json @@ -0,0 +1,417 @@ +{ + "about": { + "description": "movie-web é uma aplicação web que busca na internet por streams. A equipe visa uma abordagem principalmente minimalista para consumir conteúdo.", + "faqTitle": "Perguntas comuns", + "q1": { + "body": "movie-web não hospeda nenhum conteúdo. Quando você clica em algo para assistir, a internet é pesquisada pela mídia selecionada (Na tela de carregamento e na aba 'fontes de vídeo' você pode ver qual fonte está usando). A mídia nunca é carregada pelo movie-web, tudo é através deste mecanismo de busca.", + "title": "De onde vem o conteúdo?" + }, + "q2": { + "body": "Não é possível solicitar um filme ou série, o movie-web não gerencia nenhum conteúdo. Todo o conteúdo é visualizado através de fontes na internet.", + "title": "Onde posso solicitar um filme ou série?" + }, + "q3": { + "body": "Nossos resultados de pesquisa são alimentados pelo The Movie Database (TMDB) e são exibidos independentemente de nossas fontes terem ou não o conteúdo.", + "title": "Os resultados da pesquisa mostram o filme ou série, por que não consigo reproduzi-lo?" + }, + "title": "Sobre o movie-web" + }, + "actions": { + "copied": "Copiado", + "copy": "Copiar" + }, + "auth": { + "createAccount": "Ainda não tem uma conta? <0>Crie uma conta.", + "deviceNameLabel": "Nome do dispositivo", + "deviceNamePlaceholder": "Telefone pessoal", + "generate": { + "description": "Sua frase de acesso funciona como seu nome de usuário e senha. Certifique-se de mantê-la segura, pois você precisará inseri-la para entrar na sua conta", + "next": "Eu salvei minha frase de acesso", + "passphraseFrameLabel": "Frase de acesso", + "title": "Sua frase de acesso" + }, + "hasAccount": "Já tem uma conta? <0>Entre aqui.", + "login": { + "description": "Por favor, insira sua frase de acesso para entrar na sua conta", + "deviceLengthError": "Por favor, insira um nome para o dispositivo", + "passphraseLabel": "Frase de acesso de 12 palavras", + "passphrasePlaceholder": "Frase de acesso", + "submit": "Entrar", + "title": "Entrar na sua conta", + "validationError": "Frase de acesso incorreta ou incompleta" + }, + "register": { + "information": { + "color1": "Cor do perfil um", + "color2": "Cor do perfil dois", + "header": "Digite um nome para o seu dispositivo e escolha cores e um ícone de usuário de sua preferência", + "icon": "Ícone do usuário", + "next": "Próximo", + "title": "Informações da conta" + } + }, + "trust": { + "failed": { + "text": "Você o configurou corretamente?", + "title": "Falha ao alcançar o servidor" + }, + "host": "Você está se conectando a <0>{{hostname}} - por favor, confirme se confia nele antes de criar uma conta", + "no": "Voltar", + "title": "Você confia neste servidor?", + "yes": "Eu confio neste servidor" + }, + "verify": { + "description": "Por favor, insira sua frase de acesso anterior para confirmar que você a salvou e para criar sua conta", + "invalidData": "Dados não são válidos", + "noMatch": "Frase de acesso não corresponde", + "passphraseLabel": "Sua frase de acesso de 12 palavras", + "recaptchaFailed": "Falha na validação do ReCaptcha", + "register": "Criar conta", + "title": "Confirme sua frase de acesso" + } + }, + "errors": { + "badge": "Quebrou", + "details": "Detalhes do erro", + "reloadPage": "Recarregar a página", + "showError": "Mostrar detalhes do erro", + "title": "Encontramos um erro!" + }, + "footer": { + "legal": { + "disclaimer": "Aviso legal", + "disclaimerText": "movie-web não hospeda nenhum arquivo, apenas fornece links para serviços de terceiros. Questões legais devem ser tratadas com os hosts de arquivos e provedores. movie-web não é responsável por quaisquer arquivos de mídia exibidos pelos provedores de vídeo." + }, + "links": { + "discord": "Discord", + "dmca": "DMCA", + "github": "GitHub" + }, + "tagline": "Assista seus programas e filmes favoritos com este aplicativo de streaming de código aberto." + }, + "global": { + "name": "movie-web", + "pages": { + "about": "Sobre", + "dmca": "DMCA", + "login": "Entrar", + "pagetitle": "{{title}} - movie-web", + "register": "Registrar", + "settings": "Configurações" + } + }, + "home": { + "bookmarks": { + "sectionTitle": "Favoritos" + }, + "continueWatching": { + "sectionTitle": "Continue assistindo" + }, + "mediaList": { + "stopEditing": "Parar de editar" + }, + "search": { + "allResults": "Isso é tudo que temos!", + "failed": "Falha ao encontrar mídia, tente novamente!", + "loading": "Carregando...", + "noResults": "Não conseguimos encontrar nada!", + "placeholder": "O que você quer assistir?", + "sectionTitle": "Resultados da pesquisa" + }, + "titles": { + "day": { + "default": "O que você gostaria de assistir esta tarde?" + }, + "morning": { + "default": "O que você gostaria de assistir esta manhã?", + "extra": [ + "Ouvi dizer que Antes do Amanhecer é bom" + ] + }, + "night": { + "default": "O que você gostaria de assistir esta noite?", + "extra": [ + "Cansado? Ouvi dizer que O Exorcista é bom." + ] + } + } + }, + "media": { + "episodeDisplay": "T{{season}} E{{episode}}", + "types": { + "movie": "Filme", + "show": "Série" + } + }, + "navigation": { + "banner": { + "offline": "Verifique sua conexão com a internet" + }, + "menu": { + "about": "Sobre nós", + "donation": "Doar", + "logout": "Sair", + "register": "Sincronizar com a nuvem", + "settings": "Configurações", + "support": "Suporte" + } + }, + "notFound": { + "badge": "Não encontrado", + "goHome": "Voltar para o início", + "message": "Procuramos em todos os lugares: debaixo das lixeiras, no armário, atrás do proxy, mas no final não conseguimos encontrar a página que você está procurando.", + "title": "Não conseguimos encontrar essa página" + }, + "overlays": { + "close": "Fechar" + }, + "player": { + "back": { + "default": "Voltar para o início", + "short": "Voltar" + }, + "casting": { + "enabled": "Transmitindo para o dispositivo..." + }, + "menus": { + "downloads": { + "disclaimer": "Os downloads são feitos diretamente do provedor. movie-web não tem controle sobre como os downloads são fornecidos.", + "downloadPlaylist": "Baixar playlist", + "downloadVideo": "Baixar vídeo", + "hlsDisclaimer": "Os downloads são feitos diretamente do provedor. movie-web não tem controle sobre como os downloads são fornecidos. Por favor, note que você está baixando uma playlist HLS, isso é destinado para usuários familiarizados com streaming multimídia avançado.", + "onAndroid": { + "1": "Para baixar no Android, clique no botão de download e, na nova página, toque e segure no vídeo, depois selecione salvar.", + "shortTitle": "Baixar / Android", + "title": "Baixando no Android" + }, + "onIos": { + "1": "Para baixar no iOS, clique no botão de download e, na nova página, clique em , depois em Salvar em Arquivos .", + "shortTitle": "Baixar / iOS", + "title": "Baixando no iOS" + }, + "onPc": { + "1": "No PC, clique no botão de download e, na nova página, clique com o botão direito do mouse no vídeo e selecione Salvar vídeo como", + "shortTitle": "Baixar / PC", + "title": "Baixando no PC" + }, + "title": "Baixar" + }, + "episodes": { + "button": "Episódios", + "emptyState": "Não há episódios nesta temporada, volte mais tarde!", + "episodeBadge": "E{{episode}}", + "loadingError": "Erro ao carregar temporada", + "loadingList": "Carregando...", + "loadingTitle": "Carregando..." + }, + "playback": { + "speedLabel": "Velocidade de reprodução", + "title": "Configurações de reprodução" + }, + "quality": { + "automaticLabel": "Qualidade automática", + "hint": "Você pode tentar <0>trocar de fonte para obter diferentes opções de qualidade.", + "iosNoQuality": "Devido a limitações definidas pela Apple, a seleção de qualidade não está disponível no iOS para esta fonte. Você pode tentar <0>trocar para outra fonte para obter diferentes opções de qualidade.", + "title": "Qualidade" + }, + "settings": { + "downloadItem": "Baixar", + "experienceSection": "Experiência de visualização", + "playbackItem": "Configurações de reprodução", + "qualityItem": "Qualidade", + "sourceItem": "Fontes de vídeo", + "videoSection": "Configurações de vídeo" + }, + "sources": { + "failed": { + "text": "Houve um erro ao tentar encontrar vídeos, por favor, tente uma fonte diferente.", + "title": "Falha ao raspar" + }, + "noEmbeds": { + "text": "Não conseguimos encontrar nenhum incorporado, por favor, tente uma fonte diferente.", + "title": "Nenhum incorporado encontrado" + }, + "noStream": { + "text": "Esta fonte não tem transmissões para este filme ou série.", + "title": "Sem transmissão" + }, + "title": "Fontes", + "unknownOption": "Desconhecido" + }, + "subtitles": { + "customizeLabel": "Personalizar", + "offChoice": "Desativadas", + "settings": { + "backlink": "Legendas personalizadas", + "delay": "Atraso da legenda", + "fixCapitals": "Corrigir letras maiúsculas" + }, + "title": "Legendas", + "unknownLanguage": "Desconhecido" + } + }, + "metadata": { + "failed": { + "badge": "Falhou", + "homeButton": "Ir para o início", + "text": "Não foi possível carregar os metadados da mídia do TMDB. Por favor, verifique se o TMDB está fora do ar ou bloqueado na sua conexão de internet.", + "title": "Falha ao carregar metadados" + }, + "notFound": { + "badge": "Não encontrado", + "homeButton": "Voltar para o início", + "text": "Não conseguimos encontrar a mídia que você solicitou. Ou ela foi removida ou você alterou o URL.", + "title": "Não conseguimos encontrar essa mídia." + } + }, + "nextEpisode": { + "cancel": "Cancelar", + "next": "Próximo episódio" + }, + "playbackError": { + "badge": "Erro de reprodução", + "errors": { + "errorAborted": "A busca pela mídia foi abortada a pedido do usuário.", + "errorDecode": "Apesar de ter sido previamente determinado como utilizável, ocorreu um erro ao tentar decodificar o recurso de mídia, resultando em um erro.", + "errorGenericMedia": "Ocorreu um erro desconhecido de mídia.", + "errorNetwork": "Ocorreu algum tipo de erro de rede que impediu a mídia de ser buscada com sucesso, apesar de ter sido previamente disponível.", + "errorNotSupported": "A mídia ou objeto do provedor de mídia não é suportado." + }, + "homeButton": "Ir para o início", + "text": "Houve um erro ao tentar reproduzir a mídia. Por favor, tente novamente.", + "title": "Falha ao reproduzir o vídeo!" + }, + "scraping": { + "items": { + "failure": "Ocorreu um erro", + "notFound": "Não tem o vídeo", + "pending": "Verificando vídeos..." + }, + "notFound": { + "badge": "Não encontrado", + "detailsButton": "Mostrar detalhes", + "homeButton": "Ir para o início", + "text": "Procuramos em nossos provedores e não conseguimos encontrar a mídia que você está procurando! Não hospedamos a mídia e não temos controle sobre o que está disponível. Por favor, clique em 'Mostrar detalhes' abaixo para mais informações.", + "title": "Não conseguimos encontrar isso" + } + }, + "time": { + "regular": "{{timeWatched}} / {{duration}}", + "remaining": "{{timeLeft}} restantes • Terminar às {{timeFinished, datetime}}", + "shortRegular": "{{timeWatched}}", + "shortRemaining": "-{{timeLeft}}" + } + }, + "screens": { + "dmca": { + "text": "Bem-vindo à página de contato do DMCA do movie-web! Respeitamos os direitos de propriedade intelectual e queremos resolver quaisquer preocupações com direitos autorais rapidamente. Se você acredita que seu trabalho protegido por direitos autorais foi usado indevidamente em nossa plataforma, envie um aviso detalhado de DMCA para o e-mail abaixo. Inclua uma descrição do material protegido por direitos autorais, seus detalhes de contato e uma declaração de crença de boa fé. Estamos comprometidos em resolver essas questões prontamente e agradecemos sua cooperação em manter o movie-web um lugar que respeita a criatividade e os direitos autorais.", + "title": "DMCA" + }, + "loadingApp": "Carregando aplicativo", + "loadingUser": "Carregando seu perfil", + "loadingUserError": { + "logout": "Sair", + "reset": "Redefinir servidor personalizado", + "text": "Falha ao carregar seu perfil", + "textWithReset": "Falha ao carregar seu perfil do seu servidor personalizado, deseja redefinir para o servidor padrão?" + }, + "migration": { + "failed": "Falha ao migrar seus dados.", + "inProgress": "Por favor, aguarde, estamos migrando seus dados. Isso não deve demorar muito." + } + }, + "settings": { + "account": { + "accountDetails": { + "deviceNameLabel": "Nome do dispositivo", + "deviceNamePlaceholder": "Telefone pessoal", + "editProfile": "Editar", + "logoutButton": "Sair" + }, + "actions": { + "delete": { + "button": "Excluir conta", + "confirmButton": "Excluir conta", + "confirmDescription": "Você tem certeza de que deseja excluir sua conta? Todos os seus dados serão perdidos!", + "confirmTitle": "Você tem certeza?", + "text": "Esta ação é irreversível. Todos os dados serão excluídos e nada poderá ser recuperado.", + "title": "Excluir conta" + }, + "title": "Ações" + }, + "devices": { + "deviceNameLabel": "Nome do dispositivo", + "failed": "Falha ao carregar sessões", + "removeDevice": "Remover", + "title": "Dispositivos" + }, + "profile": { + "finish": "Finalizar edição", + "firstColor": "Cor do perfil um", + "secondColor": "Cor do perfil dois", + "title": "Editar foto de perfil", + "userIcon": "Ícone do usuário" + }, + "register": { + "cta": "Começar", + "text": "Compartilhe seu progresso de visualização entre dispositivos e mantenha-os sincronizados.", + "title": "Sincronizar com a nuvem" + }, + "title": "Conta" + }, + "appearance": { + "activeTheme": "Ativo", + "themes": { + "blue": "Azul", + "default": "Padrão", + "gray": "Cinza", + "red": "Vermelho", + "teal": "Verde-azulado" + }, + "title": "Aparência" + }, + "connections": { + "server": { + "description": "Se você deseja se conectar a um backend personalizado para armazenar seus dados, ative isso e forneça a URL.", + "label": "Servidor personalizado", + "urlLabel": "URL do servidor personalizado" + }, + "title": "Conexões", + "workers": { + "addButton": "Adicionar novo worker", + "description": "Para fazer o aplicativo funcionar, todo o tráfego é roteado através de proxies. Ative isso se você quiser trazer seus próprios workers.", + "emptyState": "Ainda não há workers, adicione um abaixo", + "label": "Usar proxy workers personalizados", + "urlLabel": "URLs dos workers", + "urlPlaceholder": "https://" + } + }, + "locale": { + "language": "Idioma do aplicativo", + "languageDescription": "Idioma aplicado a todo o aplicativo.", + "title": "Região" + }, + "reset": "Redefinir", + "save": "Salvar", + "sidebar": { + "info": { + "appVersion": "Versão do aplicativo", + "backendUrl": "URL do backend", + "backendVersion": "Versão do backend", + "hostname": "Nome do host", + "insecure": "Inseguro", + "notLoggedIn": "Você não está logado", + "secure": "Seguro", + "title": "Informações do aplicativo", + "unknownVersion": "Desconhecido", + "userId": "ID do usuário" + } + }, + "subtitles": { + "previewQuote": "Eu não devo ter medo. Medo é o assassino da mente.", + "textSizeLabel": "Tamanho do texto", + "title": "Legendas" + }, + "unsaved": "Você tem alterações não salvas" + } +} diff --git a/src/assets/locales/ru.json b/src/assets/locales/ru.json new file mode 100644 index 00000000..95a5fe1c --- /dev/null +++ b/src/assets/locales/ru.json @@ -0,0 +1,5 @@ +{ + "about": { + "faqTitle": "Общие вопросы" + } +} diff --git a/src/assets/locales/sv.json b/src/assets/locales/sv.json index 6f58d518..f5cc4f50 100644 --- a/src/assets/locales/sv.json +++ b/src/assets/locales/sv.json @@ -3,7 +3,7 @@ "description": "movie-web är en webbapplikation som söker efter strömmar på internet. Teamet strävar efter en mestadels minimalistisk ansats för att konsumera innehåll.", "faqTitle": "Vanliga frågor", "q1": { - "body": "movie-web hostar inte något innehåll. När du klickar på något att titta på, söks internet efter den valda median (På laddningsskärmen och i fliken 'video sources' kan du se vilken källa du använder). Media laddas aldrig upp av movie-web, allt går genom detta sökmechanism.", + "body": "Movie-web hostar ingen innehåll. När du klickar på något att titta på, söks internet efter det valda mediet (På laddningsskärmen och i fliken 'Videokällor' kan du se vilken källa du använder). Inget medium laddas upp av movie-web, allt sker genom sökmotorn.", "title": "Var kommer innehållet ifrån?" }, "q2": { @@ -78,15 +78,15 @@ }, "footer": { "legal": { - "disclaimer": "Ansvarsfriskrivning", - "disclaimerText": "movie-web hostar inga filer, den länkar bara till tjänster från tredje part. Juridiska frågor bör tas upp med filvärdar och leverantörer. movie-web ansvarar inte för några mediefiler som visas av videoleverantörerna." + "disclaimer": "Friskriver sig från ansvar", + "disclaimerText": "Movie-web hostar inga filer utan länkar endast till filer från tredje part. Eventuella juridiska frågor bör tas upp med källorna till materialet. Movie-web varken ansvarar eller styr över de mediefiler som visas." }, "links": { "discord": "Discord", "dmca": "DMCA", "github": "GitHub" }, - "tagline": "Titta på dina favoritprogram och filmer med denna öppna källkodsströmapp." + "tagline": "Titta på dina favoritprogram och filmer helt gratis." }, "global": { "name": "movie-web", @@ -173,20 +173,8 @@ "enabled": "Castar till enheten..." }, "menus": { - "captions": { - "customChoice": "Välj undertext från fil", - "customizeLabel": "Anpassa", - "offChoice": "Av", - "settings": { - "delay": "Fördröjning för undertexter", - "fixCapitals": "Åtgärda versaler" - }, - "title": "Undertexter", - "unknownLanguage": "Okänd" - }, "downloads": { "disclaimer": "Nedladdningar görs direkt från leverantören. movie-web har ingen kontroll över hur nedladdningarna tillhandahålls.", - "downloadCaption": "Ladda ner aktuell undertext", "downloadVideo": "Ladda ner video", "onAndroid": { "1": "För att ladda ner på Android, klicka på nedladdningsknappen och på den nya sidan trycker och håller på videon, välj sedan spara.", @@ -224,9 +212,7 @@ "title": "Kvalitet" }, "settings": { - "captionItem": "Undertextinställningar", "downloadItem": "Ladda ner", - "enableCaptions": "Aktivera undertexter", "experienceSection": "Visningsupplevelse", "playbackItem": "Uppspelningsinställningar", "qualityItem": "Kvalitet", @@ -370,13 +356,6 @@ }, "title": "Utseende" }, - "captions": { - "backgroundLabel": "Bakgrundstransparens", - "colorLabel": "Färg", - "previewQuote": "Jag får inte frukta. Rädsla är tankedödaren.", - "textSizeLabel": "Textstorlek", - "title": "Textning" - }, "connections": { "server": { "description": "Om du vill ansluta till en anpassad bakänd för att lagra dina data, aktivera detta och ange URL:en.", diff --git a/src/assets/locales/th.json b/src/assets/locales/th.json index a62c17ca..d1edc1b0 100644 --- a/src/assets/locales/th.json +++ b/src/assets/locales/th.json @@ -27,6 +27,7 @@ "generate": { "description": "รหัสผ่านของคุณถูกตั้งเช่นเดียวกับชื่อผู้ใช้และรหัสผ่าน โปรดตรวจสอบให้แน่ใจว่ารหัสผ่านของคุณถูกเก็บอย่างปลอดภัย คุณจำเป็นต้องใช้เพื่อเข้าสู่ระบบบัญชีของคุณ", "next": "ฉันบันทึกรหัสผ่านของฉันแล้ว", + "passphraseFrameLabel": "หรัสผ่าน", "title": "หรัสผ่านของคุณ" }, "hasAccount": "คุณมีบัญชีแล้วหรือไม่? <0>เข้าสู่ระบบที่นี่.", @@ -173,20 +174,8 @@ "enabled": "เชื่อมต่ออุปกรณ์.." }, "menus": { - "captions": { - "customChoice": "เลือกคําบรรยายจากไฟล์", - "customizeLabel": "ปรับแต่ง", - "offChoice": "ปิด", - "settings": { - "delay": "คําบรรยายล่าช้า", - "fixCapitals": "แก้ไขตัวพิมพ์ใหญ่" - }, - "title": "คําบรรยาย", - "unknownLanguage": "ไม่ทราบ" - }, "downloads": { "disclaimer": "การดาวน์โหลดจะถูกนํามาจากผู้ให้บริการโดยตรง movie-web ไม่สามารถควบคุมวิธีการดาวน์โหลดได้", - "downloadCaption": "ดาวน์โหลดคำบรรยายปัจจุบัน", "downloadVideo": "ดาวน์โหลดวิดีโอ", "onAndroid": { "1": "หากต้องการดาวน์โหลดบน Android ให้คลิกปุ่มดาวน์โหลด จากนั้นในหน้าใหม่ แตะ บนวิดีโอค้างไว้ จากนั้นเลือก บันทึก", @@ -224,9 +213,7 @@ "title": "คุณภาพ" }, "settings": { - "captionItem": "การตั้งค่าคําบรรยาย", "downloadItem": "ดาวน์โหลด", - "enableCaptions": "เปิดใช้งานคําบรรยาย", "experienceSection": "ประสบการณ์รับชม", "playbackItem": "ตั้งค่าการเล่น", "qualityItem": "คุณภาพ", @@ -370,13 +357,6 @@ }, "title": "ธีม" }, - "captions": { - "backgroundLabel": "ความทึบของพื้นหลัง", - "colorLabel": "สี", - "previewQuote": "ข้าต้องไม่กลัว ความกลัวจักพิฆาตจิตใจ", - "textSizeLabel": "ขนาดตัวหนังสือ", - "title": "คำบรรยาย" - }, "connections": { "server": { "description": "หากคุณต้องการเชื่อมต่อกับ backend ที่กําหนดเองเพื่อจัดเก็บข้อมูลของคุณ ให้เปิดใช้งานสิ่งนี้และระบุ URL", diff --git a/src/assets/locales/tok.json b/src/assets/locales/tok.json index 1e9113d6..0462ac48 100644 --- a/src/assets/locales/tok.json +++ b/src/assets/locales/tok.json @@ -159,20 +159,8 @@ "enabled": "mi pana e sitelen tawa ilo ante..." }, "menus": { - "captions": { - "customChoice": "o pana tan ilo", - "customizeLabel": "o ante", - "offChoice": "ala", - "settings": { - "delay": "ante tenpo", - "fixCapitals": "o pona e suli nimi" - }, - "title": "nimi toki", - "unknownLanguage": "mi sona ala" - }, "downloads": { "disclaimer": "sina kama jo e sitelen tawa ilo sina tan lipu mama. ilo Muwi-We li lawa ala e nasin jo", - "downloadCaption": "o jo e nimi toki", "downloadVideo": "o jo e sitelen", "onAndroid": { "1": "ilo Android la o luka e nena 'o jo'. lon lipu sin la o luka wawa e sitelen. o luka e nena 'o jo'", @@ -210,9 +198,7 @@ "title": "pona lukin" }, "settings": { - "captionItem": "nasin nimi", "downloadItem": "o jo", - "enableCaptions": "nimi toki", "experienceSection": "nasin lukin", "playbackItem": "nasin pali", "qualityItem": "pona lukin", @@ -348,13 +334,6 @@ }, "title": "kule" }, - "captions": { - "backgroundLabel": "kon", - "colorLabel": "kule", - "previewQuote": "kijetesantakalu tonsi li lanpan ala lanpan e soko?", - "textSizeLabel": "suli", - "title": "nimi toki" - }, "connections": { "title": "kulupu" }, diff --git a/src/assets/locales/tr.json b/src/assets/locales/tr.json index b3011c49..29211535 100644 --- a/src/assets/locales/tr.json +++ b/src/assets/locales/tr.json @@ -174,20 +174,8 @@ "enabled": "Cihaza yansıtılıyor..." }, "menus": { - "captions": { - "customChoice": "Altyazı yükle", - "customizeLabel": "Seçenekler", - "offChoice": "Kapalı", - "settings": { - "delay": "Altyazı gecikmesi", - "fixCapitals": "Büyük harf kullanımını düzelt" - }, - "title": "Altyazılar", - "unknownLanguage": "Bilinmeyen" - }, "downloads": { "disclaimer": "İndirme bağlantıları doğrudan sağlayıcının kendisinden alınır. movie-web'in sağlanan indirme bağlantıları üzerinde hiçbir konrolü yoktur.", - "downloadCaption": "Geçerli altyazıyı indir", "downloadVideo": "Videoyu indir", "onAndroid": { "1": "Android'e indirmek için önce indir butonuna basın, sonra açılan yeni sayfada video üzerine basılı tutun, ardından Videoyu indir seçeneğini seçin.", @@ -225,9 +213,7 @@ "title": "Kalite" }, "settings": { - "captionItem": "Altyazı ayarları", "downloadItem": "İndir", - "enableCaptions": "Altyazıları etkinleştir", "experienceSection": "İzleme deneyimi", "playbackItem": "Oynatma ayarları", "qualityItem": "Kalite", @@ -371,13 +357,6 @@ }, "title": "Görünüm" }, - "captions": { - "backgroundLabel": "Arka plan opaklığı", - "colorLabel": "Renk", - "previewQuote": "Korkmamalıyım. Korku aklın katilidir.", - "textSizeLabel": "Yazı boyutu", - "title": "Altyazılar" - }, "connections": { "server": { "description": "Verilerinizi depolamak için özel bir arkayüze bağlanmak istiyorsanız, bunu etkinleştirin ve URL'yi sağlayın.", diff --git a/src/assets/locales/uk.json b/src/assets/locales/uk.json new file mode 100644 index 00000000..deed8fb9 --- /dev/null +++ b/src/assets/locales/uk.json @@ -0,0 +1,283 @@ +{ + "about": { + "description": "movie-web це веб-додаток, який шукає інтернет для стрімінгових відтворень. Команда прагне до мінімалістичного стилю в споживанні контенту.", + "faqTitle": "Загальні питання", + "q1": { + "body": "movie-web не зберігає жодного контенту. Коли ви натискаєте щось для перегляду, в Інтернеті виконується пошук вибраного медіа (на екрані завантаження та на вкладці «джерела відео» ви можете побачити, яке джерело ви використовуєте). Медіафайли ніколи не завантажуються за допомогою \"movie-web\", усе відбувається через цей механізм пошуку.", + "title": "Звідки береться вміст?" + }, + "q2": { + "body": "Неможливо подати запит на шоу чи фільм, оскільки movie-web не керує жодним вмістом. Весь контент переглядається через джерела в Інтернеті.", + "title": "Де я можу подати запит на шоу чи фільм?" + }, + "q3": { + "body": "Наші результати пошуку надходять від The Movie Database (TMDB) і відображаються незалежно від того, чи насправді є вміст у наших джерелах.", + "title": "Результати пошуку відображають шоу чи фільм, чому я не можу його відтворити?" + }, + "title": "Про movie-web" + }, + "actions": { + "copied": "Скопійовано", + "copy": "Копіювати" + }, + "auth": { + "createAccount": "У вас ще немає облікового запису? <0>Створити обліковий запис.", + "deviceNameLabel": "Ім'я пристрою", + "deviceNamePlaceholder": "Особистий телефон", + "generate": { + "description": "Ваша парольна фраза виступає як ваше ім'я користувача та пароль. Переконайтеся, що ви зберігаєте його в безпеці, оскільки вам буде потрібно вводити його для входу в свій обліковий запис", + "next": "Я зберіг(ла) свою парольну фразу", + "passphraseFrameLabel": "Парольна фраза", + "title": "Ваша парольна фраза" + }, + "hasAccount": "Вже є аккаунт? <0>Увійдіть тут.", + "login": { + "description": "Будь ласка, введіть свій пароль для входу до вашого облікового запису", + "deviceLengthError": "Будь ласка, введіть назву пристрою", + "passphraseLabel": "Парольна фраза з 12 слів", + "passphrasePlaceholder": "Парольна фраза", + "submit": "Логін", + "title": "Увійти до свого облікового запису", + "validationError": "Неправильна або неповна парольна фраза" + }, + "register": { + "information": { + "color1": "Перший колір профілю", + "color2": "Другий колір профілю", + "header": "Введіть ім'я для вашого пристрою та виберіть кольори та іконку користувача за вашим бажанням", + "icon": "Іконка користувача", + "next": "Наступний", + "title": "Інформація про обліковий запис" + } + }, + "trust": { + "failed": { + "text": "Чи ви налаштували це правильно?", + "title": "Не вдалося зв’язатися з сервером" + }, + "host": "Ви під’єднуєтеся до <0>{{hostname}} – підтвердьте, що довіряєте йому, перш ніж створювати обліковий запис", + "no": "Повернутися назад", + "title": "Чи довіряєте ви цьому серверу?", + "yes": "Я довіряю цьому серверу" + }, + "verify": { + "description": "Будь ласка, введіть свою парольну фразу, яка була раніше, щоб підтвердити її збереження та створити обліковий запис", + "invalidData": "Дані недійсні", + "noMatch": "Парольна фраза не збігається", + "passphraseLabel": "Ваша парольна фраза з 12 слів", + "recaptchaFailed": "Валідація капчі не вдалася", + "register": "Створити акаунт", + "title": "Підтвердьте свою парольну фразу" + } + }, + "errors": { + "badge": "Це зламалося", + "details": "Деталі помилки", + "reloadPage": "Перезавантажити сторінку", + "showError": "Показати деталі помилки", + "title": "Ми зіткнулися з помилкою!" + }, + "footer": { + "legal": { + "disclaimer": "Застереження", + "disclaimerText": "movie-web не містить жодних файлів, він лише посилається на сторонні служби. Юридичні питання слід вирішувати з хостами та провайдерами файлів. movie-web не несе відповідальності за будь-які медіафайли, показані постачальниками відео." + }, + "links": { + "discord": "Діскорд", + "dmca": "DMCA", + "github": "GitHub" + }, + "tagline": "Дивіться свої улюблені шоу та фільми за допомогою цього відкритого стрімінгового додатка." + }, + "global": { + "name": "movie-web", + "pages": { + "about": "Про", + "dmca": "DMCA", + "login": "Логін", + "pagetitle": "{{title}} - movie-web", + "register": "Зареєструватися", + "settings": "Налаштування" + } + }, + "home": { + "bookmarks": { + "sectionTitle": "Закладки" + }, + "continueWatching": { + "sectionTitle": "Продовжити перегляд" + }, + "mediaList": { + "stopEditing": "Зупинити редагування" + }, + "search": { + "allResults": "Це все, що ми маємо!", + "failed": "Не вдалося знайти медіафайли, повторіть спробу!", + "loading": "Завантаження...", + "noResults": "Ми не змогли знайти нічого!", + "placeholder": "Що ви хочете подивитися?", + "sectionTitle": "Результати пошуку" + }, + "titles": { + "day": { + "default": "Що б ви хотіли подивитися сьогодні вдень?" + }, + "morning": { + "default": "Що б ви хотіли подивитися сьогодні вранці?" + }, + "night": { + "default": "Що б ви хотіли подивитися сьогодні ввечері?" + } + } + }, + "media": { + "episodeDisplay": "С{{season}} Е{{episode}}", + "types": { + "movie": "Фільм", + "show": "Шоу" + } + }, + "navigation": { + "banner": { + "offline": "Перевірте підключення до Інтернету" + }, + "menu": { + "about": "Про нас", + "donation": "Пожертвуйте", + "logout": "Вийти", + "register": "Синхронізація з хмарою", + "settings": "Налаштування", + "support": "Підтримка" + } + }, + "notFound": { + "badge": "Не знайдено", + "goHome": "На головну", + "message": "Ми шукали всюди: під смітниками, у шафі, за проксі-сервером, але зрештою не змогли знайти сторінку, яку ви шукали.", + "title": "Не вдалося знайти цю сторінку" + }, + "overlays": { + "close": "Закрити" + }, + "player": { + "back": { + "default": "На головну", + "short": "Назад" + }, + "casting": { + "enabled": "Трансляція на пристрій..." + }, + "menus": { + "downloads": { + "disclaimer": "Завантаження беруться безпосередньо від провайдера. У movie-web немає контролю над тим, як надаються завантаження.", + "downloadPlaylist": "Завантажити плейлист", + "downloadSubtitle": "Завантажити поточні субтитри", + "downloadVideo": "Завантажити відео", + "hlsDisclaimer": "Завантаження виконуються безпосередньо від постачальника. У movie-web немає контролю над тим, як надаються завантаження. Будь ласка, зверніть увагу, що ви завантажуєте список відтворення HLS, він призначений для користувачів, знайомих із розширеним потоковим мультимедійним вмістом.", + "onAndroid": { + "1": "Щоб завантажити на Android, натисніть кнопку завантаження, потім на новій сторінці торкніться й утримуйте відео, а потім виберіть зберегти.", + "shortTitle": "Завантажити / Android", + "title": "Завантажити на Android" + }, + "onIos": { + "1": "Щоб завантажити на iOS, натисніть кнопку завантаження, далі на новій сторінці, натисніть , а потім Зберегти у файли .", + "shortTitle": "Завантажити / iOS", + "title": "Завантаження на iOS" + }, + "onPc": { + "1": "На комп'ютері натисніть кнопку завантаження, далі на новій вкладці клацніть правим кліком по відео та виберіть Зберегти відео як", + "shortTitle": "Завантажити / Комп'ютер", + "title": "Завантаження на комп'ютер" + }, + "title": "Завантажити" + }, + "episodes": { + "button": "Епізоди", + "emptyState": "У цьому сезоні немає серій, перевірте пізніше!", + "episodeBadge": "Е{{episode}}", + "loadingError": "Помилка завантаження сезону", + "loadingList": "Завантаження...", + "loadingTitle": "Завантаження..." + }, + "playback": { + "speedLabel": "Швидкість відтворення", + "title": "Налаштування відтворення" + }, + "quality": { + "automaticLabel": "Якість автоматична", + "hint": "Спробуйте <0>переключити джерело, аби отримати інші варіанти якості.", + "iosNoQuality": "Через обмеження, встановлені Apple, вибір якості не доступний у системі iOS для цього джерела. Ви можете спробувати <0>змінити джерело, щоб отримати інші варіанти якості.", + "title": "Якість" + }, + "settings": { + "downloadItem": "Завантажити", + "enableSubtitles": "Увімкнути субтитри", + "experienceSection": "Враження від перегляду", + "playbackItem": "Налаштування відтворення", + "qualityItem": "Якість", + "sourceItem": "Джерела відео", + "subtitleItem": "Налаштування субтитрів", + "videoSection": "Налаштування відео" + }, + "sources": { + "failed": { + "text": "Під час спроби знайти будь-яке відео сталася помилка. Спробуйте інше джерело.", + "title": "Не вдалося отримати дані" + }, + "noEmbeds": { + "text": "Ми не змогли знайти жодних вставок. Будь ласка, спробуйте інше джерело.", + "title": "Не знайдено вбудованих елементів" + }, + "noStream": { + "text": "Це джерело не має потоків для цього фільму чи шоу.", + "title": "Немає потоку" + }, + "title": "Джерела", + "unknownOption": "Невідомий" + }, + "subtitles": { + "customChoice": "Виберіть субтитри з файлу", + "customizeLabel": "Налаштувати", + "offChoice": "Вимкнено", + "settings": { + "backlink": "Власні субтитри", + "delay": "Затримка субтитрів", + "fixCapitals": "Виправити використання великих літер" + }, + "title": "Субтитри", + "unknownLanguage": "Невідомий" + } + }, + "metadata": { + "failed": { + "badge": "Не вдалося", + "homeButton": "Повернутися на головну", + "text": "Не вдалося завантажити метадані мультимедіа з TMDB. Перевірте, чи не відбувається збій TMDB або чи не є заблоковано у вашому інтернет-з'єднанні.", + "title": "Не вдалося завантажити метадані" + }, + "notFound": { + "badge": "Не знайдено", + "homeButton": "Повернутися на головну", + "text": "Не вдалося знайти запитані мультимедіа. Вони або були вилучені, або ви змінили URL.", + "title": "Не вдалося знайти це мультимедіа." + } + }, + "nextEpisode": { + "cancel": "Відмінити", + "next": "Наступний епізод" + }, + "playbackError": { + "badge": "Помилка відтворення", + "errors": { + "errorAborted": "Завантаження мультимедіа було скасовано на вимогу користувача.", + "errorGenericMedia": "Виникла невідома помилка мультимедіа.", + "errorNetwork": "Виникла якась помилка мережі, яка завадила успішному завантаженню мультимедіа, незважаючи на те, що раніше вони були доступні.", + "errorNotSupported": "Медіаоб'єкт або провайдер медіа не підтримується." + }, + "homeButton": "Повернутися на головну" + } + }, + "settings": { + "unsaved": "У вас є незбережені зміни" + } +} diff --git a/src/assets/locales/vi.json b/src/assets/locales/vi.json index fcf6ceed..902d54b8 100644 --- a/src/assets/locales/vi.json +++ b/src/assets/locales/vi.json @@ -1,71 +1,66 @@ { - "global": { - "name": "movie-web" + "global": { + "name": "movie-web" + }, + "home": { + "bookmarks": { + "sectionTitle": "Đánh dấu" }, - "home": { - "search": { - "allResults": "Đó là tất cả chúng tôi có!", - "sectionTitle": "Kết quả tìm kiếm", - "noResults": "Chúng tôi không thể tìm thấy gì!", - "failed": "Không thể tìm thấy nội dung, hãy thử lại!", - "loading": "Đang tải...", - "placeholder": "Bạn muốn xem gì?" - }, - "bookmarks": { - "sectionTitle": "Đánh dấu" - }, - "continueWatching": { - "sectionTitle": "Tiếp tục xem" - } + "continueWatching": { + "sectionTitle": "Tiếp tục xem" }, - "media": { - "types": { - "movie": "Phim", - "show": "Chương trình truyền hình" - }, - "episodeDisplay": "M{{season}} T{{episode}}" - }, - "player": { - "playbackError": { - "title": "Rất tiếc, đã hỏng!" - }, - "metadata": { - "notFound": { - "badge": "Không tìm thấy", - "homeButton": "Quay lại trang chính", - "title": "Không thể tìm thấy nội dung.", - "text": "Chúng tôi không thể tìm thấy nội dung mà bạn yêu cầu. Hoặc là nó đã bị xóa, hoặc bạn đã xáo trộn URL." - } - }, - "menus": { - "captions": { - "customChoice": "Tải phụ đề lên", - "customizeLabel": "Tùy chỉnh", - "title": "Phụ đề" - }, - "sources": { - "title": "Nguồn" - }, - "episodes": { - "button": "Tập", - "loadingTitle": "Đang tải...", - "loadingList": "Đang tải..." - } - }, - "back": { - "default": "Quay lại trang chính", - "short": "Quay lại" - } - }, - "notFound": { - "badge": "Không tìm thấy", - "goHome": "Quay lại trang chính", - "title": "Không thể tìm thấy trang", - "message": "Chúng tôi đã tìm kiếm khắp nơi: dưới thùng rác, trong tủ quần áo, đằng sau máy chủ proxy nhưng vẫn không thể tìm thấy trang bạn đang tìm kiếm." - }, - "navigation": { - "banner": { - "offline": "Hãy kiểm tra kết nối Internet của bạn" - } + "search": { + "allResults": "Đó là tất cả chúng tôi có!", + "failed": "Không thể tìm thấy nội dung, hãy thử lại!", + "loading": "Đang tải...", + "noResults": "Chúng tôi không thể tìm thấy gì!", + "placeholder": "Bạn muốn xem gì?", + "sectionTitle": "Kết quả tìm kiếm" } + }, + "media": { + "episodeDisplay": "M{{season}} T{{episode}}", + "types": { + "movie": "Phim", + "show": "Chương trình truyền hình" + } + }, + "navigation": { + "banner": { + "offline": "Hãy kiểm tra kết nối Internet của bạn" + } + }, + "notFound": { + "badge": "Không tìm thấy", + "goHome": "Quay lại trang chính", + "message": "Chúng tôi đã tìm kiếm khắp nơi: dưới thùng rác, trong tủ quần áo, đằng sau máy chủ proxy nhưng vẫn không thể tìm thấy trang bạn đang tìm kiếm.", + "title": "Không thể tìm thấy trang" + }, + "player": { + "back": { + "default": "Quay lại trang chính", + "short": "Quay lại" + }, + "menus": { + "episodes": { + "button": "Tập", + "loadingList": "Đang tải...", + "loadingTitle": "Đang tải..." + }, + "sources": { + "title": "Nguồn" + } + }, + "metadata": { + "notFound": { + "badge": "Không tìm thấy", + "homeButton": "Quay lại trang chính", + "text": "Chúng tôi không thể tìm thấy nội dung mà bạn yêu cầu. Hoặc là nó đã bị xóa, hoặc bạn đã xáo trộn URL.", + "title": "Không thể tìm thấy nội dung." + } + }, + "playbackError": { + "title": "Rất tiếc, đã hỏng!" + } + } } diff --git a/src/assets/locales/zh.json b/src/assets/locales/zh.json index 709c2d17..a08ad097 100644 --- a/src/assets/locales/zh.json +++ b/src/assets/locales/zh.json @@ -174,21 +174,11 @@ "enabled": "正在投放到设备…" }, "menus": { - "captions": { - "customChoice": "上传字幕", - "customizeLabel": "自定义", - "offChoice": "关闭", - "settings": { - "delay": "字幕延迟", - "fixCapitals": "修复大小写" - }, - "title": "字幕", - "unknownLanguage": "未知" - }, "downloads": { "disclaimer": "下载内容是直接从内容提供者获取的。movie-web 无法控制下载内容如何被提供。", - "downloadCaption": "下载当前字幕", + "downloadPlaylist": "下载播放列表", "downloadVideo": "下载视频", + "hlsDisclaimer": "下载内容是直接从内容提供者获取的。movie-web 无法控制下载内容如何被提供。请注意,您正在下载 HLS 播放列表,这适用于熟悉高级多媒体串流技术的用户。", "onAndroid": { "1": "要从 Android 下载,先点击下载按钮,之后在新的页面上, 点击并按住视频,然后选择 保存。", "shortTitle": "下载 / Android", @@ -225,9 +215,7 @@ "title": "质量" }, "settings": { - "captionItem": "字幕设置", "downloadItem": "下载", - "enableCaptions": "启用字幕", "experienceSection": "观看体验", "playbackItem": "播放设置", "qualityItem": "质量", @@ -249,6 +237,17 @@ }, "title": "视频源", "unknownOption": "未知" + }, + "subtitles": { + "customizeLabel": "自定义", + "offChoice": "关闭", + "settings": { + "backlink": "自定义字幕", + "delay": "字幕延时", + "fixCapitals": "修整大小写" + }, + "title": "字幕", + "unknownLanguage": "未知" } }, "metadata": { @@ -371,13 +370,6 @@ }, "title": "外观" }, - "captions": { - "backgroundLabel": "背景透明度", - "colorLabel": "颜色", - "previewQuote": "我一定不会害怕。 恐惧是心灵杀手。", - "textSizeLabel": "字体大小", - "title": "字幕" - }, "connections": { "server": { "description": "若您想连接到自定义后端保存数据,请启用此选项并提供 URL。", @@ -415,6 +407,11 @@ "userId": "用户 ID" } }, + "subtitles": { + "previewQuote": "我不能害怕。恐惧是心灵的杀手。", + "textSizeLabel": "字体大小", + "title": "字幕" + }, "unsaved": "您有未保存的更改" } } diff --git a/src/components/FlagIcon.tsx b/src/components/FlagIcon.tsx index b153cd25..e5666dec 100644 --- a/src/components/FlagIcon.tsx +++ b/src/components/FlagIcon.tsx @@ -21,6 +21,8 @@ const countryOverrides: Record = { zh: "cn", sl: "si", sv: "se", + et: "ee", + ne: "np", }; export function FlagIcon(props: FlagIconProps) { @@ -47,10 +49,14 @@ export function FlagIcon(props: FlagIconProps) { ); + let backgroundClass = "bg-video-context-flagBg"; + if (countryCode === "np") backgroundClass = "bg-white"; + return ( diff --git a/src/components/player/atoms/settings/CaptionSettingsView.tsx b/src/components/player/atoms/settings/CaptionSettingsView.tsx index 000cbd30..5515946d 100644 --- a/src/components/player/atoms/settings/CaptionSettingsView.tsx +++ b/src/components/player/atoms/settings/CaptionSettingsView.tsx @@ -214,7 +214,7 @@ export function CaptionSetting(props: { ); } -export const colors = ["#ffffff", "#80b1fa", "#e2e535"]; +export const colors = ["#ffffff", "#b0b0b0", "#80b1fa", "#e2e535"]; export function CaptionSettingsView({ id }: { id: string }) { const { t } = useTranslation(); @@ -229,11 +229,11 @@ export function CaptionSettingsView({ id }: { id: string }) { return ( <> router.navigate("/captions")}> - Custom captions + {t("player.menus.subtitles.settings.backlink")} setDelay(v)} @@ -244,7 +244,7 @@ export function CaptionSettingsView({ id }: { id: string }) { />
- {t("player.menus.captions.settings.fixCapitals")} + {t("player.menus.subtitles.settings.fixCapitals")}
updateStyling({ backgroundOpacity: v / 100 })} @@ -263,7 +263,7 @@ export function CaptionSettingsView({ id }: { id: string }) { textTransformer={(s) => `${s}%`} /> `${s}%`} @@ -271,7 +271,9 @@ export function CaptionSettingsView({ id }: { id: string }) { value={styling.size * 100} />
- {t("settings.captions.colorLabel")} + + {t("settings.subtitles.colorLabel")} +
{colors.map((v) => ( fileInput.current?.click()} > - {t("player.menus.captions.customChoice")} + {t("player.menus.subtitles.customChoice")} { const input = subs.map((t) => ({ ...t, @@ -162,11 +162,11 @@ export function CaptionsView({ id }: { id: string }) { onClick={() => router.navigate("/captions/settings")} className="py-1 -my-1 px-3 -mx-3 rounded tabbable" > - {t("player.menus.captions.customizeLabel")} + {t("player.menus.subtitles.customizeLabel")} } > - {t("player.menus.captions.title")} + {t("player.menus.subtitles.title")}
@@ -174,7 +174,7 @@ export function CaptionsView({ id }: { id: string }) {
disable()} selected={!lang}> - {t("player.menus.captions.offChoice")} + {t("player.menus.subtitles.offChoice")} {content} diff --git a/src/components/player/atoms/settings/Downloads.tsx b/src/components/player/atoms/settings/Downloads.tsx index 4a7dcef2..9dfa8309 100644 --- a/src/components/player/atoms/settings/Downloads.tsx +++ b/src/components/player/atoms/settings/Downloads.tsx @@ -78,7 +78,7 @@ export function DownloadView({ id }: { id: string }) { theme="secondary" download="subtitles.srt" > - {t("player.menus.downloads.downloadCaption")} + {t("player.menus.downloads.downloadSubtitle")} ) : ( @@ -113,7 +113,7 @@ export function DownloadView({ id }: { id: string }) { theme="secondary" download="subtitles.srt" > - {t("player.menus.downloads.downloadCaption")} + {t("player.menus.downloads.downloadSubtitle")} )} diff --git a/src/components/player/atoms/settings/QualityView.tsx b/src/components/player/atoms/settings/QualityView.tsx index 87f8af9b..d649fb79 100644 --- a/src/components/player/atoms/settings/QualityView.tsx +++ b/src/components/player/atoms/settings/QualityView.tsx @@ -22,6 +22,7 @@ const alwaysVisibleQualities: Record = { "480": true, "720": true, "1080": true, + "4k": false, }; function useIsIosHls() { diff --git a/src/components/player/atoms/settings/SettingsMenu.tsx b/src/components/player/atoms/settings/SettingsMenu.tsx index 14b3827f..c9ecdf52 100644 --- a/src/components/player/atoms/settings/SettingsMenu.tsx +++ b/src/components/player/atoms/settings/SettingsMenu.tsx @@ -32,7 +32,7 @@ export function SettingsMenu({ id }: { id: string }) { const selectedLanguagePretty = selectedCaptionLanguage ? getLanguageFromIETF(selectedCaptionLanguage) ?? - t("player.menus.captions.unknownLanguage") + t("player.menus.subtitles.unknownLanguage") : undefined; const source = usePlayerStore((s) => s.source); @@ -81,13 +81,13 @@ export function SettingsMenu({ id }: { id: string }) { /> } > - {t("player.menus.settings.enableCaptions")} + {t("player.menus.settings.enableSubtitles")} router.navigate("/captions")} rightText={selectedLanguagePretty ?? undefined} > - {t("player.menus.settings.captionItem")} + {t("player.menus.settings.subtitleItem")} router.navigate("/playback")}> {t("player.menus.settings.playbackItem")} diff --git a/src/components/player/hooks/useSourceSelection.ts b/src/components/player/hooks/useSourceSelection.ts index 6ae19e51..e28507cf 100644 --- a/src/components/player/hooks/useSourceSelection.ts +++ b/src/components/player/hooks/useSourceSelection.ts @@ -73,8 +73,8 @@ export function useEmbedScraping( setSourceId(sourceId); setCaption(null); setSource( - convertRunoutputToSource({ stream: result.stream }), - convertProviderCaption(result.stream.captions), + convertRunoutputToSource({ stream: result.stream[0] }), + convertProviderCaption(result.stream[0].captions), progress, ); router.close(); @@ -132,8 +132,8 @@ export function useSourceScraping(sourceId: string | null, routerId: string) { if (result.stream) { setCaption(null); setSource( - convertRunoutputToSource({ stream: result.stream }), - convertProviderCaption(result.stream.captions), + convertRunoutputToSource({ stream: result.stream[0] }), + convertProviderCaption(result.stream[0].captions), progress, ); setSourceId(sourceId); @@ -187,8 +187,8 @@ export function useSourceScraping(sourceId: string | null, routerId: string) { setSourceId(sourceId); setCaption(null); setSource( - convertRunoutputToSource({ stream: embedResult.stream }), - convertProviderCaption(embedResult.stream.captions), + convertRunoutputToSource({ stream: embedResult.stream[0] }), + convertProviderCaption(embedResult.stream[0].captions), progress, ); router.close(); diff --git a/src/components/player/internals/KeyboardEvents.tsx b/src/components/player/internals/KeyboardEvents.tsx index 4e8e3f81..3a833e76 100644 --- a/src/components/player/internals/KeyboardEvents.tsx +++ b/src/components/player/internals/KeyboardEvents.tsx @@ -9,6 +9,8 @@ import { useEmpheralVolumeStore } from "@/stores/volume"; export function KeyboardEvents() { const router = useOverlayRouter(""); const display = usePlayerStore((s) => s.display); + const mediaProgress = usePlayerStore((s) => s.progress); + const { isSeeking } = usePlayerStore((s) => s.interface); const mediaPlaying = usePlayerStore((s) => s.mediaPlaying); const time = usePlayerStore((s) => s.progress.time); const { setVolume, toggleMute } = useVolume(); @@ -27,6 +29,8 @@ export function KeyboardEvents() { toggleLastUsed, display, mediaPlaying, + mediaProgress, + isSeeking, isRolling, time, router, @@ -40,6 +44,8 @@ export function KeyboardEvents() { toggleLastUsed, display, mediaPlaying, + mediaProgress, + isSeeking, isRolling, time, router, @@ -52,6 +58,8 @@ export function KeyboardEvents() { toggleLastUsed, display, mediaPlaying, + mediaProgress, + isSeeking, isRolling, time, router, @@ -83,11 +91,29 @@ export function KeyboardEvents() { ); if (k === "m") dataRef.current.toggleMute(); + // Video playback speed + if (k === ">" || k === "<") { + const options = [0.25, 0.5, 1, 1.5, 2]; + let idx = options.indexOf(dataRef.current.mediaPlaying?.playbackRate); + if (idx === -1) idx = options.indexOf(1); + const nextIdx = idx + (k === ">" ? 1 : -1); + const next = options[nextIdx]; + if (next) dataRef.current.display?.setPlaybackRate(next); + } + // Video progress if (k === "ArrowRight") dataRef.current.display?.setTime(dataRef.current.time + 5); if (k === "ArrowLeft") dataRef.current.display?.setTime(dataRef.current.time - 5); + if (k === "j") + dataRef.current.display?.setTime(dataRef.current.time - 10); + if (k === "l") + dataRef.current.display?.setTime(dataRef.current.time + 10); + if (k === "." && dataRef.current.mediaPlaying?.isPaused) + dataRef.current.display?.setTime(dataRef.current.time + 1); + if (k === "," && dataRef.current.mediaPlaying?.isPaused) + dataRef.current.display?.setTime(dataRef.current.time - 1); // Utils if (k === "f") dataRef.current.display?.toggleFullscreen(); diff --git a/src/components/player/utils/convertRunoutputToSource.ts b/src/components/player/utils/convertRunoutputToSource.ts index efc59f20..fba59e63 100644 --- a/src/components/player/utils/convertRunoutputToSource.ts +++ b/src/components/player/utils/convertRunoutputToSource.ts @@ -1,4 +1,4 @@ -import { RunOutput } from "@movie-web/providers"; +import { Stream } from "@movie-web/providers"; import { SourceFileStream, @@ -7,6 +7,7 @@ import { } from "@/stores/player/utils/qualities"; const allowedQualitiesMap: Record = { + "4k": "4k", "1080": "1080", "480": "480", "360": "360", @@ -21,7 +22,7 @@ function isAllowedQuality(inp: string): inp is SourceQuality { } export function convertRunoutputToSource(out: { - stream: RunOutput["stream"]; + stream: Stream; }): SourceSliceSource { if (out.stream.type === "hls") { return { diff --git a/src/hooks/useProviderScrape.tsx b/src/hooks/useProviderScrape.tsx index 2ee2af5b..7e1ab4bf 100644 --- a/src/hooks/useProviderScrape.tsx +++ b/src/hooks/useProviderScrape.tsx @@ -23,7 +23,7 @@ export interface ScrapingSegment { embedId?: string; status: "failure" | "pending" | "notfound" | "success" | "waiting"; reason?: string; - error?: unknown; + error?: any; percentage: number; } @@ -60,8 +60,10 @@ function useBaseScrape() { }, []); const startEvent = useCallback((id: ScraperEvent<"start">) => { + const lastIdTmp = lastId.current; setSources((s) => { if (s[id]) s[id].status = "pending"; + if (lastIdTmp && s[lastIdTmp]) s[lastIdTmp].status = "success"; return { ...s }; }); setCurrentSource(id); diff --git a/src/pages/parts/auth/TrustBackendPart.tsx b/src/pages/parts/auth/TrustBackendPart.tsx index c2e2325c..3fa818ef 100644 --- a/src/pages/parts/auth/TrustBackendPart.tsx +++ b/src/pages/parts/auth/TrustBackendPart.tsx @@ -14,7 +14,6 @@ import { import { Loading } from "@/components/layout/Loading"; import { MwLink } from "@/components/text/Link"; import { useBackendUrl } from "@/hooks/auth/useBackendUrl"; -import { conf } from "@/setup/config"; interface TrustBackendPartProps { onNext?: (meta: MetaResponse) => void; @@ -25,7 +24,7 @@ export function TrustBackendPart(props: TrustBackendPartProps) { const backendUrl = useBackendUrl(); const hostname = useMemo(() => new URL(backendUrl).hostname, [backendUrl]); const result = useAsync(() => { - return getBackendMeta(conf().BACKEND_URL); + return getBackendMeta(backendUrl); }, [backendUrl]); const { t } = useTranslation(); diff --git a/src/pages/parts/player/PlayerPart.tsx b/src/pages/parts/player/PlayerPart.tsx index d5a180c3..1f55013b 100644 --- a/src/pages/parts/player/PlayerPart.tsx +++ b/src/pages/parts/player/PlayerPart.tsx @@ -121,7 +121,7 @@ export function PlayerPart(props: PlayerPartProps) {
{status === playerStatus.PLAYING ? : null} - + {status === playerStatus.PLAYING ? : null}
diff --git a/src/pages/parts/player/ScrapeErrorPart.tsx b/src/pages/parts/player/ScrapeErrorPart.tsx index 6b52c796..75526ca2 100644 --- a/src/pages/parts/player/ScrapeErrorPart.tsx +++ b/src/pages/parts/player/ScrapeErrorPart.tsx @@ -35,6 +35,8 @@ export function ScrapeErrorPart(props: ScrapeErrorPartProps) { Object.values(data.sources).forEach((v) => { str += `${v.id}: ${v.status}\n`; if (v.reason) str += `${v.reason}\n`; + if (v.error?.message) + str += `${v.error.name ?? "unknown"}: ${v.error.message}\n`; if (v.error) str += `${v.error.toString()}\n`; }); return str; diff --git a/src/pages/parts/player/ScrapingPart.tsx b/src/pages/parts/player/ScrapingPart.tsx index ea86ee57..6687d3b1 100644 --- a/src/pages/parts/player/ScrapingPart.tsx +++ b/src/pages/parts/player/ScrapingPart.tsx @@ -75,11 +75,8 @@ export function ScrapingPart(props: ScrapingProps) { })(); }, [startScraping, props, report, isMounted]); - const currentProvider = sourceOrder.find( - (s) => sources[s.id].status === "pending", - ); let currentProviderIndex = sourceOrder.findIndex( - (provider) => currentProvider?.id === provider.id, + (s) => s.id === currentSource || s.children.includes(currentSource ?? ""), ); if (currentProviderIndex === -1) currentProviderIndex = sourceOrder.length - 1; diff --git a/src/pages/parts/settings/CaptionsPart.tsx b/src/pages/parts/settings/CaptionsPart.tsx index 8327e343..f40e1d93 100644 --- a/src/pages/parts/settings/CaptionsPart.tsx +++ b/src/pages/parts/settings/CaptionsPart.tsx @@ -58,7 +58,7 @@ export function CaptionPreview(props: { } > @@ -79,11 +79,11 @@ export function CaptionsPart(props: { return (
- {t("settings.captions.title")} + {t("settings.subtitles.title")}
@@ -93,7 +93,7 @@ export function CaptionsPart(props: { textTransformer={(s) => `${s}%`} /> `${s}%`} @@ -104,7 +104,7 @@ export function CaptionsPart(props: { />
- {t("settings.captions.colorLabel")} + {t("settings.subtitles.colorLabel")}
{colors.map((v) => ( diff --git a/src/pages/parts/settings/SidebarPart.tsx b/src/pages/parts/settings/SidebarPart.tsx index 66d33028..2b6e5c3f 100644 --- a/src/pages/parts/settings/SidebarPart.tsx +++ b/src/pages/parts/settings/SidebarPart.tsx @@ -54,7 +54,7 @@ export function SidebarPart() { icon: Icons.BRUSH, }, { - textKey: "settings.captions.title", + textKey: "settings.subtitles.title", id: "settings-captions", icon: Icons.CAPTIONS, }, @@ -82,17 +82,20 @@ export function SidebarPart() { const el = document.getElementById(link.id); if (!el) return { distance: Infinity, link: link.id }; const rect = el.getBoundingClientRect(); - const distanceTop = Math.abs(centerTarget - rect.top); const distanceBottom = Math.abs(centerTarget - rect.bottom); - const distance = Math.min(distanceBottom, distanceTop); return { distance, link: link.id }; }) .sort((a, b) => a.distance - b.distance); - // shortest distance to the part of the screen we want is the active link - setActiveLink(viewList[0]?.link ?? ""); + // Check if user has scrolled past the bottom of the page + if (window.innerHeight + window.scrollY >= document.body.offsetHeight) { + setActiveLink(settingLinks[settingLinks.length - 1].id); + } else { + // shortest distance to the part of the screen we want is the active link + setActiveLink(viewList[0]?.link ?? ""); + } } document.addEventListener("scroll", recheck); recheck(); diff --git a/src/stores/player/utils/qualities.ts b/src/stores/player/utils/qualities.ts index dbc7a3d2..dbd84b5c 100644 --- a/src/stores/player/utils/qualities.ts +++ b/src/stores/player/utils/qualities.ts @@ -1,6 +1,8 @@ +import { Qualities } from "@movie-web/providers"; + import { QualityStore } from "@/stores/quality"; -export type SourceQuality = "unknown" | "360" | "480" | "720" | "1080"; +export type SourceQuality = Qualities; export type StreamType = "hls" | "mp4"; @@ -30,6 +32,7 @@ const qualitySorting: Record = { "480": 20, "720": 30, "1080": 40, + "4k": 25, // 4k has lower priority, you need faster internet for it }; const sortedQualities: SourceQuality[] = Object.entries(qualitySorting) .sort((a, b) => b[1] - a[1]) @@ -98,7 +101,8 @@ export function selectQuality( throw new Error("couldn't select quality"); } -const qualityMap: Record = { +const qualityNameMap: Record = { + "4k": "4K", "1080": "1080p", "360": "360p", "480": "480p", @@ -106,8 +110,8 @@ const qualityMap: Record = { unknown: "unknown", }; -export const allQualities = Object.keys(qualityMap) as SourceQuality[]; +export const allQualities = Object.keys(qualityNameMap) as SourceQuality[]; export function qualityToString(quality: SourceQuality): string { - return qualityMap[quality]; + return qualityNameMap[quality]; } diff --git a/src/utils/providers.ts b/src/utils/providers.ts index 530495a7..e5c8503c 100644 --- a/src/utils/providers.ts +++ b/src/utils/providers.ts @@ -1,5 +1,5 @@ import { - ProviderBuilderOptions, + Fetcher, ProviderControls, makeProviders, makeSimpleProxyFetcher, @@ -49,7 +49,7 @@ async function fetchButWithApiTokens( } function makeLoadBalancedSimpleProxyFetcher() { - const fetcher: ProviderBuilderOptions["fetcher"] = async (a, b) => { + const fetcher: Fetcher = async (a, b) => { const currentFetcher = makeSimpleProxyFetcher( getLoadbalancedProxyUrl(), fetchButWithApiTokens,