diff --git a/public/config.js b/public/config.js index 03ccca7a..5acde08e 100644 --- a/public/config.js +++ b/public/config.js @@ -15,5 +15,5 @@ window.__CONFIG__ = { VITE_BACKEND_URL: "https://sudo-flix-backend.lol", // "https://mw-backend.lonelil.com", // A comma separated list of disallowed IDs in the case of a DMCA claim - in the format "series-" and "movie-" - VITE_DISALLOWED_IDS: "" + VITE_DISALLOWED_IDS: "", }; diff --git a/src/assets/languages.ts b/src/assets/languages.ts index 8cdb2a95..868c4bce 100644 --- a/src/assets/languages.ts +++ b/src/assets/languages.ts @@ -3,6 +3,7 @@ import bg from "@/assets/locales/bg.json"; import bn from "@/assets/locales/bn.json"; import ca from "@/assets/locales/ca.json"; import cat from "@/assets/locales/cat.json"; +import caVl from "@/assets/locales/ca@valencia.json"; import cs from "@/assets/locales/cs.json"; import de from "@/assets/locales/de.json"; import el from "@/assets/locales/el.json"; @@ -47,6 +48,7 @@ import zh from "@/assets/locales/zh.json"; export const locales = { en, ca, + "ca-ES": caVl, cs, de, fr, diff --git a/src/assets/locales/ca.json b/src/assets/locales/ca.json index ffbf7e9b..b768a47f 100644 --- a/src/assets/locales/ca.json +++ b/src/assets/locales/ca.json @@ -57,6 +57,8 @@ }, "host": "Us esteu connectant a <0>{{hostname}}. Confirmeu que hi confieu abans de crear un compte", "no": "Torna", + "noHost": "El servidor no s'ha configurat, per tant, no es pot crear un compte", + "noHostTitle": "El servidor no està configurat!", "title": "Confieu en aquest servidor?", "yes": "Confie en aquest servidor" }, @@ -95,7 +97,8 @@ "about": "Quant a", "dmca": "DMCA", "login": "Inicia sessió", - "pagetitle": "{{title}} - sudo-flix", + "onboarding": "Configura", + "pagetitle": "{{title}} - movie-web", "register": "Registra", "settings": "Configuració" } @@ -117,7 +120,12 @@ "noResults": "No hem pogut trobar res!", "placeholder": { "default": "Què voleu mirar?", - "extra": [] + "extra": [ + "Què voleu explorar?", + "Què hi ha a la vostra llista de seguiment?", + "Quina és la vostra pel·lícula preferida?", + "Quina és la vostra sèrie preferida?" + ] }, "sectionTitle": "Resultats de la cerca" }, @@ -130,11 +138,15 @@ }, "morning": { "default": "Què us agradaria mirar aquest matí?", - "extra": ["He sentit que «Abans de l'alba» és bona"] + "extra": [ + "He sentit que «Abans de l'alba» és bona" + ] }, "night": { "default": "Què us agradaria mirar aquesta nit?", - "extra": ["Esteu cansat? He sentit que «L'exorcista» és bona."] + "extra": [ + "Esteu cansat? He sentit que «L'exorcista» és bona." + ] } } }, @@ -167,22 +179,37 @@ "onboarding": { "defaultConfirm": { "cancel": "Cancel·la", + "confirm": "Usa la configuració per defecte", + "description": "La configuració per defecte no té els millors fluxos i pot ser insuportablement lenta.", "title": "Segur?" }, "extension": { "back": "Torna", + "explainer": "Mitjançant l'extensió del navegador, podeu obtenir els millors fluxos que oferim. Amb només una simple instal·lació.", + "explainerIos": "Lamentablement, l'extensió del navegador no és compatible amb iOS, premeu Torna per a triar una altra opció.", + "extensionHelp": "Si heu instal·lat l'extensió, però no es detecta, obriu l'extensió al menú d'extensions del navegador i seguiu els passos en pantalla.", "linkChrome": "Instal·la l'extensió de Chrome", "linkFirefox": "Instal·la l'extensió de Firefox", + "notDetecting": "S'ha instal·lat a Chrome, però el lloc no el detecta? Proveu de recarregar la pàgina.", "notDetectingAction": "Recarrega la pàgina", "status": { - "disallowedAction": "Activa l'extensió" + "disallowed": "L'extensió no està activada per a aquesta pàgina", + "disallowedAction": "Activa l'extensió", + "failed": "No s'ha pogut sol·licitar l'estat", + "loading": "Esperant que instal·leu l'extensió", + "outdated": "La versió de l'extensió és massa antiga", + "success": "L'extensió funciona com s'esperava!" }, - "submit": "Continua" + "submit": "Continua", + "title": "Comencem amb una extensió" }, "proxy": { "back": "Torna", + "explainer": "Amb el mètode del servidor intermediari, podeu obtenir fluxos d'alta qualitat fent un servidor intermediari propi.", "input": { + "errorConnection": "No s'ha pogut connectar al servidor intermediari", "errorInvalidUrl": "URL no vàlid", + "errorNotProxy": "S'esperava un servidor intermediari, però és un lloc web", "label": "URL del servidor intermediari", "placeholder": "https://" }, @@ -191,15 +218,25 @@ "title": "Fem un nou servidor intermediari" }, "start": { + "explainer": "Per a obtenir els millors fluxos possibles, haureu de triar quin mètode de transmissió voleu utilitzar.", "options": { + "default": { + "text": "No vull fluxos de bona qualitat,<0 /> <1>utilitza la configuració per defecte" + }, "extension": { "action": "Instal·la l'extensió", - "quality": "Millor qualitat" + "description": "Instal·leu l'extensió del navegador i accediu a les millors fonts.", + "quality": "Millor qualitat", + "title": "Extensió del navegador" }, "proxy": { - "action": "Configura el servidor intermediari" + "action": "Configura el servidor intermediari", + "description": "Configureu un servidor intermediari en només 5 minuts i accediu a bones fonts.", + "quality": "Bona qualitat", + "title": "Servidor intermediari personalitzat" } - } + }, + "title": "Configurem el movie-web" } }, "overlays": { @@ -215,10 +252,11 @@ }, "menus": { "downloads": { - "disclaimer": "Les baixades s'obtenen directament del proveïdor. sudo-flix no té control sobre com es proporcionen les baixades.", + "copyHlsPlaylist": "Copia l'enllaç de la llista HLS", + "disclaimer": "Les baixades s'obtenen directament del proveïdor. movie-web no té control sobre com es proporcionen les baixades.", "downloadSubtitle": "Baixa els subtítols actuals", "downloadVideo": "Baixa el vídeo", - "hlsDisclaimer": "Les baixades s'obtenen directament del proveïdor. sudo-flix no té control sobre com es proporcionen les baixades. Tingueu en compte que esteu baixant una llista de reproducció HLS, destinada als usuaris familiaritzats amb la transmissió multimèdia avançada.", + "hlsDisclaimer": "Les baixades s'obtenen directament del proveïdor. movie-web no té control sobre com es proporcionen les baixades.

Tingueu en compte que esteu baixant una llista de reproducció HLS, no es recomana baixar-la si no esteu familiaritzat amb formats de transmissió avançats. Proveu diferents fonts per a diferents formats.", "onAndroid": { "1": "Per a baixar-lo a Android, feu clic al botó de baixada i, a la pàgina nova, manteniu premut el vídeo i, a continuació, seleccioneu Desa.", "shortTitle": "Baixa / Android", @@ -301,8 +339,15 @@ }, "dmca": { "badge": "Eliminat", + "text": "Aquest contingut ja no està disponible a causa d'un avís de retirada o d'una reclamació de drets d'autor.", "title": "El contingut s'ha eliminat" }, + "extensionPermission": { + "badge": "Falta el permís", + "button": "Utilitza l'extensió", + "text": "Teniu l'extensió del navegador, però necessitem el vostre permís per a començar a utilitzar l'extensió.", + "title": "Configureu l'extensió" + }, "failed": { "badge": "Ha fallat", "homeButton": "Vés a l'inici", @@ -436,15 +481,29 @@ }, "setup": { "doSetup": "Configura", + "errorStatus": { + "description": "Sembla que heu de revisar un o més elements de la configuració.", + "title": "S'ha de revisar algun element" + }, + "itemError": "Hi ha alguna cosa malament en la configuració. Torneu a fer la configuració per a solucionar-ho.", "items": { "default": "Configuració per defecte", - "extension": "Extensió" + "extension": "Extensió", + "proxy": "Servidor personalitzat" }, - "redoSetup": "Reconfigura" + "redoSetup": "Reconfigura", + "successStatus": { + "description": "Tot està preparat perquè comenceu a mirar el vostre contingut preferit.", + "title": "Tot està configurat!" + }, + "unsetStatus": { + "description": "Feu clic al botó de la dreta per a iniciar el procés de configuració.", + "title": "No heu fet la configuració" + } }, "title": "Connexions", "workers": { - "addButton": "Afig un «worker»", + "addButton": "Afegeix un «worker»", "description": "Per fer funcionar l'aplicació, tot el trànsit s'encamina a través de servidors intermediaris. Activeu-ho si voleu portar els vostres propis «workers». <0>Instruccions.", "emptyState": "Encara no hi ha «workers», afegiu-ne un a continuació", "label": "Utilitza «workers» intermediaris personalitzats", @@ -456,6 +515,7 @@ "language": "Llengua de l'aplicació", "languageDescription": "La llengua s'aplica a tota l'aplicació.", "thumbnail": "Genera miniatures", + "thumbnailDescription": "Majoritàriament, els vídeos no tenen miniatures. Podeu activar aquesta opció per a generar-les sobre la marxa, però poden alentir el vídeo.", "thumbnailLabel": "Genera miniatures", "title": "Configuració" }, diff --git a/src/assets/locales/ca@valencia.json b/src/assets/locales/ca@valencia.json new file mode 100644 index 00000000..8f883342 --- /dev/null +++ b/src/assets/locales/ca@valencia.json @@ -0,0 +1,547 @@ +{ + "about": { + "description": "movie-web és una aplicació web que cerca fluxos a internet. L'equip té com a objectiu un enfocament majoritàriament minimalista del consum de contingut.", + "faqTitle": "Preguntes freqüents", + "q1": { + "body": "movie-web no allotja cap contingut. Quan feu clic en un contingut per a mirar-lo, es busca a Internet (a la pantalla de càrrega i a la pestanya «Fonts de vídeo» podeu mirar quina font utilitzeu). movie-web mai puja contingut, tot és a través del mecanisme de cerca.", + "title": "D'on prové el contingut?" + }, + "q2": { + "body": "No és possible sol·licitar un programa o una pel·lícula, movie-web no gestiona cap contingut. Tot el contingut es visualitza a través de fonts a internet.", + "title": "On puc sol·licitar un programa o una pel·lícula?" + }, + "q3": { + "body": "Els resultats de cerca funcionen amb The Movie Database (TMDB) i es mostren independentment de si les nostres fonts realment tenen el contingut.", + "title": "Els resultats de la cerca mostren el programa o la pel·lícula, per què no puc reproduir-lo?" + }, + "title": "Sobre movie-web" + }, + "actions": { + "copied": "S'ha copiat", + "copy": "Copia" + }, + "auth": { + "createAccount": "Encara no teniu un compte? <0>Creeu un compte.", + "deviceNameLabel": "Nom del dispositiu", + "deviceNamePlaceholder": "Telèfon personal", + "generate": { + "description": "La frase de contrasenya actua com a nom d'usuari i contrasenya. Assegureu-vos de mantindre-la segura, ja que haureu d'introduir-la per a iniciar la sessió al vostre compte", + "next": "He desat la frase de contrasenya", + "passphraseFrameLabel": "Frase de contrasenya", + "title": "La vostra frase de contrasenya" + }, + "hasAccount": "Ja teniu un compte? <0>Inicieu sessió ací.", + "login": { + "description": "Introduïu la vostra frase de contrasenya per a iniciar sessió al vostre compte", + "deviceLengthError": "Introduïu un nom per al dispositiu", + "passphraseLabel": "Frase de contrasenya de 12 paraules", + "passphrasePlaceholder": "Frase de contrasenya", + "submit": "Inicia sessió", + "title": "Inicieu sessió al vostre compte", + "validationError": "Frase de contrasenya incorrecta o incompleta" + }, + "register": { + "information": { + "color1": "Color de perfil 1", + "color2": "Color de perfil 2", + "header": "Introduïu un nom per al dispositiu i trieu els colors i la icona d'usuari que vulgueu", + "icon": "Icona d'usuari", + "next": "Següent", + "title": "Informació del compte" + } + }, + "trust": { + "failed": { + "text": "L'heu configurada correctament?", + "title": "No s'ha pogut accedir al servidor" + }, + "host": "Esteu connectant-vos a <0>{{hostname}}. Confirmeu que hi confieu abans de crear un compte", + "no": "Torna", + "noHost": "El servidor no s'ha configurat, per tant, no es pot crear un compte", + "noHostTitle": "El servidor no està configurat!", + "title": "Confieu en este servidor?", + "yes": "Confie en este servidor" + }, + "verify": { + "description": "Introduïu la vostra frase de contrasenya anterior per a confirmar que l'heu desat, i crear el compte", + "invalidData": "La data no és vàlida", + "noMatch": "La frase de contrasenya no coincideix", + "passphraseLabel": "Frase de contrasenya de 12 paraules", + "recaptchaFailed": "Ha fallat la validació de ReCaptcha", + "register": "Crea el compte", + "title": "Confirmeu la frase de contrasenya" + } + }, + "errors": { + "badge": "S'ha trencat", + "details": "Detalls de l'error", + "reloadPage": "Recarrega la pàgina", + "showError": "Mostra els detalls de l'error", + "title": "Hem trobat un error!" + }, + "footer": { + "legal": { + "disclaimer": "Avís d'exempció de responsabilitat", + "disclaimerText": "movie-web no allotja cap fitxer, només enllaça a serveis de tercers. Els problemes legals s'han d'abordar amb qui allotja i els proveïdors de fitxers. movie-web no es fa responsable del contingut mostrat pels proveïdors de vídeo." + }, + "links": { + "discord": "Discord", + "dmca": "DMCA", + "github": "GitHub" + }, + "tagline": "Mireu els vostres programes i pel·lícules preferits amb esta aplicació de codi obert de reproducció en temps real." + }, + "global": { + "name": "movie-web", + "pages": { + "about": "Quant a", + "dmca": "DMCA", + "login": "Inicia sessió", + "onboarding": "Configura", + "pagetitle": "{{title}} - movie-web", + "register": "Registra", + "settings": "Configuració" + } + }, + "home": { + "bookmarks": { + "sectionTitle": "Marcadors" + }, + "continueWatching": { + "sectionTitle": "Continueu mirant" + }, + "mediaList": { + "stopEditing": "Deixa d'editar" + }, + "search": { + "allResults": "Això és tot el que tenim!", + "failed": "No s'ha pogut trobar cap contingut, torneu-ho a provar!", + "loading": "S'està carregant…", + "noResults": "No hem pogut trobar res!", + "placeholder": { + "default": "Què voleu mirar?", + "extra": [ + "Què voleu explorar?", + "Què hi ha a la vostra llista de seguiment?", + "Quina és la vostra pel·lícula preferida?", + "Quina és la vostra sèrie preferida?" + ] + }, + "sectionTitle": "Resultats de la cerca" + }, + "titles": { + "day": { + "default": "Què vos agradaria mirar esta vesprada?", + "extra": [ + "Voleu aventura? Jurassic Park podria ser l'elecció perfecta." + ] + }, + "morning": { + "default": "Què vos agradaria mirar este matí?", + "extra": [ + "He sentit que «Abans de l'alba» és bona" + ] + }, + "night": { + "default": "Què vos agradaria mirar esta nit?", + "extra": [ + "Esteu cansat? He sentit que «L'exorcista» és bona." + ] + } + } + }, + "media": { + "episodeDisplay": "T{{season}} E{{episode}}", + "types": { + "movie": "Pel·lícula", + "show": "Sèrie/Programa" + } + }, + "navigation": { + "banner": { + "offline": "Comproveu la connexió a internet" + }, + "menu": { + "about": "Quant a nosaltres", + "donation": "Feu una donació", + "logout": "Tanca la sessió", + "register": "Sincronitza al núvol", + "settings": "Configuració", + "support": "Ajuda" + } + }, + "notFound": { + "badge": "No s'ha trobat", + "goHome": "Torna a l'inici", + "message": "Hem mirat per tot arreu: davall de les papereres, a l'armari, darrere del servidor intermediari, però al remat no hem pogut trobar la pàgina que busqueu.", + "title": "No s'ha pogut trobar la pàgina" + }, + "onboarding": { + "defaultConfirm": { + "cancel": "Cancel·la", + "confirm": "Usa la configuració per defecte", + "description": "La configuració per defecte no té els millors fluxos i pot ser insuportablement lenta.", + "title": "Segur?" + }, + "extension": { + "back": "Torna", + "explainer": "Mitjançant l'extensió del navegador, podeu obtindre els millors fluxos que oferim. Amb només una simple instal·lació.", + "explainerIos": "Lamentablement, l'extensió del navegador no és compatible amb iOS, premeu Torna per a triar una altra opció.", + "extensionHelp": "Si heu instal·lat l'extensió, però no es detecta, obriu l'extensió al menú d'extensions del navegador i seguiu els passos en pantalla.", + "linkChrome": "Instal·la l'extensió de Chrome", + "linkFirefox": "Instal·la l'extensió de Firefox", + "notDetecting": "S'ha instal·lat a Chrome, però el lloc no el detecta? Proveu de recarregar la pàgina.", + "notDetectingAction": "Recarrega la pàgina", + "status": { + "disallowed": "L'extensió no està activada per a esta pàgina", + "disallowedAction": "Activa l'extensió", + "failed": "No s'ha pogut sol·licitar l'estat", + "loading": "Esperant que instal·leu l'extensió", + "outdated": "La versió de l'extensió és massa antiga", + "success": "L'extensió funciona com s'esperava!" + }, + "submit": "Continua", + "title": "Comencem amb una extensió" + }, + "proxy": { + "back": "Torna", + "explainer": "Amb el mètode del servidor intermediari, podeu obtindre fluxos d'alta qualitat fent un servidor intermediari propi.", + "input": { + "errorConnection": "No s'ha pogut connectar al servidor intermediari", + "errorInvalidUrl": "URL no vàlid", + "errorNotProxy": "S'esperava un servidor intermediari, però és un lloc web", + "label": "URL del servidor intermediari", + "placeholder": "https://" + }, + "link": "Com fer un servidor intermediari", + "submit": "Envia el servidor intermediari", + "title": "Fem un nou servidor intermediari" + }, + "start": { + "explainer": "Per a obtindre els millors fluxos possibles, haureu de triar quin mètode de transmissió voleu utilitzar.", + "options": { + "default": { + "text": "No vull fluxos de bona qualitat,<0 /> <1>utilitza la configuració per defecte" + }, + "extension": { + "action": "Instal·la l'extensió", + "description": "Instal·leu l'extensió del navegador i accediu a les millors fonts.", + "quality": "Millor qualitat", + "title": "Extensió del navegador" + }, + "proxy": { + "action": "Configura el servidor intermediari", + "description": "Configureu un servidor intermediari en només 5 minuts i accediu a bones fonts.", + "quality": "Bona qualitat", + "title": "Servidor intermediari personalitzat" + } + }, + "title": "Configurem el movie-web" + } + }, + "overlays": { + "close": "Tanca" + }, + "player": { + "back": { + "default": "Torna a l'inici", + "short": "Torna" + }, + "casting": { + "enabled": "S'està emetent al dispositiu…" + }, + "menus": { + "downloads": { + "copyHlsPlaylist": "Copia l'enllaç de la llista HLS", + "disclaimer": "Les baixades s'obtenen directament del proveïdor. movie-web no té control sobre com es proporcionen les baixades.", + "downloadSubtitle": "Baixa els subtítols actuals", + "downloadVideo": "Baixa el vídeo", + "hlsDisclaimer": "Les baixades s'obtenen directament del proveïdor. movie-web no té control sobre com es proporcionen les baixades.

Tingueu en compte que esteu baixant una llista de reproducció HLS, no es recomana baixar-la si no esteu familiaritzat amb formats de transmissió avançats. Proveu diferents fonts per a diferents formats.", + "onAndroid": { + "1": "Per a baixar-lo a Android, feu clic al botó de baixada i, a la pàgina nova, manteniu premut el vídeo i, a continuació, seleccioneu Desa.", + "shortTitle": "Baixa / Android", + "title": "Baixada a Android" + }, + "onIos": { + "1": "Per a baixar a iOS, feu clic al botó de baixada i, a la pàgina nova, feu clic a /> i, a continuació, Desa als Arxius .", + "shortTitle": "Baixa / iOS", + "title": "Baixada a iOS" + }, + "onPc": { + "1": "En un PC, feu clic al botó de baixada i, a la pàgina nova, feu clic amb el botó dret al vídeo i seleccioneu Anomena i desa el vídeo", + "shortTitle": "Baixa / PC", + "title": "Baixada a un PC" + }, + "title": "Baixa" + }, + "episodes": { + "button": "Episodi", + "emptyState": "No hi ha episodis en esta temporada, torneu-ho a comprovar més tard!", + "episodeBadge": "E{{episode}}", + "loadingError": "Error en carregar la temporada", + "loadingList": "S'està carregant…", + "loadingTitle": "S'està carregant…", + "unairedEpisodes": "Un o més episodis d'esta temporada s'han desactivat perquè encara no s'han emés." + }, + "playback": { + "speedLabel": "Velocitat de la reproducció", + "title": "Configuració de la reproducció" + }, + "quality": { + "automaticLabel": "Qualitat automàtica", + "hint": "Podeu provar a <0>canviar la font per a obtindre diferents opcions de qualitat.", + "iosNoQuality": "A causa de les limitacions definides per Apple, la selecció de qualitat no està disponible a iOS per a esta font. Podeu provar a <0>canviar a una altra font per a obtindre diferents opcions de qualitat.", + "title": "Qualitat" + }, + "settings": { + "downloadItem": "Baixa", + "enableSubtitles": "Activa els subtítols", + "experienceSection": "Experiència de visualització", + "playbackItem": "Configuració de la reproducció", + "qualityItem": "Qualitat", + "sourceItem": "Fonts de vídeo", + "subtitleItem": "Configuració dels subtítols", + "videoSection": "Configuració de vídeo" + }, + "sources": { + "failed": { + "text": "S'ha produït un error en intentar trobar vídeos, proveu una font diferent.", + "title": "No s'ha pogut obtindre" + }, + "noEmbeds": { + "text": "No hem pogut trobar cap incrustat, proveu una font diferent.", + "title": "No s'ha trobat cap incrustació" + }, + "noStream": { + "text": "esta font no té fluxos per a esta pel·lícula o programa.", + "title": "Cap flux" + }, + "title": "Fonts", + "unknownOption": "Desconeguda" + }, + "subtitles": { + "customChoice": "Selecciona un fitxer de subtítols", + "customizeLabel": "Personalitza", + "offChoice": "Desactivats", + "settings": { + "backlink": "Subtítols personalitzats", + "delay": "Retard dels subtítols", + "fixCapitals": "Corregeix les majúscules/minúscules" + }, + "title": "Subtítols", + "unknownLanguage": "Desconeguda" + } + }, + "metadata": { + "api": { + "text": "No s'han pogut carregar les metadades de l'API, comproveu la connexió a Internet.", + "title": "No s'han pogut carregar les metadades de l'API" + }, + "dmca": { + "badge": "Eliminat", + "text": "este contingut ja no està disponible a causa d'un avís de retirada o d'una reclamació de drets d'autor.", + "title": "El contingut s'ha eliminat" + }, + "extensionPermission": { + "badge": "Falta el permís", + "button": "Utilitza l'extensió", + "text": "Teniu l'extensió del navegador, però necessitem el vostre permís per a començar a utilitzar l'extensió.", + "title": "Configureu l'extensió" + }, + "failed": { + "badge": "Ha fallat", + "homeButton": "Vés a l'inici", + "text": "No s'han pogut carregar les metadades del contingut des de TMDB. Comproveu si TMDB no funciona o està bloquejat a la vostra connexió a Internet.", + "title": "Ha fallat la càrrega de les metadades" + }, + "notFound": { + "badge": "No s'ha trobat", + "homeButton": "Torna a l'inici", + "text": "No hem pogut trobar el contingut sol·licitat. O bé s'ha eliminat o bé heu alterat l'URL.", + "title": "No s'ha trobat el contingut." + } + }, + "nextEpisode": { + "cancel": "Cancel·la", + "next": "Episodi següent" + }, + "playbackError": { + "badge": "Error en la reproducció", + "errors": { + "errorAborted": "S'ha interromput l'obtenció del contingut per petició de l'usuari.", + "errorDecode": "Tot i haver-se determinat prèviament que era utilitzable, s'ha produït un error en intentar descodificar el recurs multimèdia.", + "errorGenericMedia": "S'ha produït un error desconegut al contingut.", + "errorNetwork": "S'ha produït algun tipus d'error de xarxa que ha impedit que el contingut s'obtinga correctament, tot i haver estat disponibles prèviament.", + "errorNotSupported": "El contingut o el proveïdor del contingut no és compatible." + }, + "homeButton": "Torna a l'inici", + "text": "S'ha produït un error en intentar reproduir el contingut. Torneu-ho a provar.", + "title": "No s'ha pogut reproduir el vídeo!" + }, + "scraping": { + "items": { + "failure": "S'ha produït un error", + "notFound": "No té el vídeo", + "pending": "S'estan cercant vídeos…" + }, + "notFound": { + "badge": "No s'ha trobat", + "detailsButton": "Mostra els detalls", + "homeButton": "Torna a l'inici", + "text": "Hem buscat a través dels nostres proveïdors i no trobem el contingut que busqueu! No allotgem contingut i no tenim control sobre què hi ha disponible. Feu clic a «Mostra els detalls» a continuació per a més informació.", + "title": "No s'ha pogut trobar" + } + }, + "time": { + "regular": "{{timeWatched}} / {{duration}}", + "remaining": "{{timeLeft}} restants • Acaba a les {{timeFinished, datetime}}", + "shortRegular": "{{timeWatched}}", + "shortRemaining": "-{{timeLeft}}" + }, + "turnstile": { + "description": "Verifiqueu que sou humà completant el Captcha de la dreta. Ho fem per a mantindre segura movie-web!", + "error": "No s'ha pogut verificar la humanitat. Torneu-ho a provar.", + "title": "Necessitem verificar que sou humà.", + "verifyingHumanity": "Verificant la vostra humanitat…" + } + }, + "screens": { + "dmca": { + "text": "Vos donem la benvinguda a la pàgina de contacte DMCA de movie-web! Respectem els drets de propietat intel·lectual i volem resoldre qualsevol problema de drets d'autor ràpidament. Si creieu que la vostra obra protegida per drets d'autor s'ha utilitzat incorrectament a la nostra plataforma, envieu un avís detallat de la DMCA al correu electrònic següent. Incloeu una descripció del material protegit per drets d'autor, les vostres dades de contacte i una declaració de creença de bona fe. Ens comprometem a resoldre estes assumptes amb agilitat i agraïm la vostra col·laboració per a mantindre movie-web en un lloc que respecta la creativitat i els drets d'autor.", + "title": "DMCA" + }, + "loadingApp": "S'està carregant l'aplicació", + "loadingUser": "S'està carregant el perfil", + "loadingUserError": { + "logout": "Tanca la sessió", + "reset": "Restableix el servidor personalitzat", + "text": "Ha fallat la càrrega del perfil", + "textWithReset": "Error en carregar el vostre perfil des del servidor personalitzat, voleu restablir el servidor per defecte?" + }, + "migration": { + "failed": "La migració de les dades ha fallat.", + "inProgress": "Espereu, estem migrant les vostres dades. No hauria de tardar massa." + } + }, + "settings": { + "account": { + "accountDetails": { + "deviceNameLabel": "Nom del dispositiu", + "deviceNamePlaceholder": "Telèfon personal", + "editProfile": "Edita", + "logoutButton": "Tanca la sessió" + }, + "actions": { + "delete": { + "button": "Elimina el compte", + "confirmButton": "Elimina el compte", + "confirmDescription": "Segur que voleu eliminar el compte? Es perdran totes les dades!", + "confirmTitle": "Segur?", + "text": "esta acció és irreversible. Totes les dades s'eliminaran i no es podrà recuperar res.", + "title": "Elimina el compte" + }, + "title": "Accions" + }, + "devices": { + "deviceNameLabel": "Nom del dispositiu", + "failed": "La càrrega de sessions ha fallat", + "removeDevice": "Elimina", + "title": "Dispositiu" + }, + "profile": { + "finish": "Finalitza l'edició", + "firstColor": "Color de perfil 1", + "secondColor": "Color de perfil dos", + "title": "Edita la foto de perfil", + "userIcon": "Icona d'usuari" + }, + "register": { + "cta": "Comença", + "text": "Compartiu el progrés de la visualització entre dispositius i manteniu-los sincronitzats.", + "title": "Sincronització amb el núvol" + }, + "title": "Compte" + }, + "appearance": { + "activeTheme": "Actiu", + "themes": { + "blue": "Blau", + "default": "Per defecte", + "gray": "Gris", + "red": "Vermell", + "teal": "Verd blavós" + }, + "title": "Aparença" + }, + "connections": { + "server": { + "description": "Si voleu connectar-vos a un rerefons personalitzat per a emmagatzemar les vostres dades, activeu-ho i proporcioneu l'URL. <0>Instruccions.", + "label": "Servidor personalitzat", + "urlLabel": "URL del servidor personalitzat" + }, + "setup": { + "doSetup": "Configura", + "errorStatus": { + "description": "Sembla que heu de revisar un o més elements de la configuració.", + "title": "S'ha de revisar algun element" + }, + "itemError": "Hi ha alguna cosa malament en la configuració. Torneu a fer la configuració per a solucionar-ho.", + "items": { + "default": "Configuració per defecte", + "extension": "Extensió", + "proxy": "Servidor personalitzat" + }, + "redoSetup": "Reconfigura", + "successStatus": { + "description": "Tot està preparat perquè comenceu a mirar el vostre contingut preferit.", + "title": "Tot està configurat!" + }, + "unsetStatus": { + "description": "Feu clic al botó de la dreta per a iniciar el procés de configuració.", + "title": "No heu fet la configuració" + } + }, + "title": "Connexions", + "workers": { + "addButton": "Afig un «worker»", + "description": "Per fer funcionar l'aplicació, tot el trànsit s'encamina a través de servidors intermediaris. Activeu-ho si voleu portar els vostres propis «workers». <0>Instruccions.", + "emptyState": "Encara no hi ha «workers», afegiu-ne un a continuació", + "label": "Utilitza «workers» intermediaris personalitzats", + "urlLabel": "URL dels «workers»", + "urlPlaceholder": "https://" + } + }, + "preferences": { + "language": "Llengua de l'aplicació", + "languageDescription": "La llengua s'aplica a tota l'aplicació.", + "thumbnail": "Genera miniatures", + "thumbnailDescription": "Majoritàriament, els vídeos no tenen miniatures. Podeu activar esta opció per a generar-les sobre la marxa, però poden alentir el vídeo.", + "thumbnailLabel": "Genera miniatures", + "title": "Configuració" + }, + "reset": "Restableix", + "save": "Desa", + "sidebar": { + "info": { + "appVersion": "Versió de l'aplicació", + "backendUrl": "URL del rerefons", + "backendVersion": "Versió del rerefons", + "hostname": "Nom de l'amfitrió", + "insecure": "Insegur", + "notLoggedIn": "No heu iniciat sessió", + "secure": "Segur", + "title": "Informació de l'aplicació", + "unknownVersion": "Desconeguda", + "userId": "ID d'usuari" + } + }, + "subtitles": { + "backgroundLabel": "Opacitat del fons", + "colorLabel": "Color", + "previewQuote": "No he de tindre por. La por és l'assassina de la ment.", + "textSizeLabel": "Grandària del text", + "title": "Subtítols" + }, + "unsaved": "Hi ha canvis sense desar" + } +} diff --git a/src/assets/locales/es.json b/src/assets/locales/es.json index 6b6d38ae..9e5bd8e1 100644 --- a/src/assets/locales/es.json +++ b/src/assets/locales/es.json @@ -57,6 +57,8 @@ }, "host": "Te estás conectando a <0>{{hostname}} - por favor, confirma si confías en este antes de crear una cuenta", "no": "Regresar", + "noHost": "El servidor no se ha configurado, por lo tanto, no puede crear una cuenta", + "noHostTitle": "¡El servidor no está configurado!", "title": "¿Confías en este servidor?", "yes": "Confío en este servidor" }, @@ -118,7 +120,12 @@ "noResults": "¡No pudimos encontrar nada!", "placeholder": { "default": "¿Qué te gustaría ver?", - "extra": [] + "extra": [ + "¿Qué quieres explorar?", + "¿Qué hay en tu lista de reproducción?", + "¿Cuál es tu película favorita?", + "¿Cuál es tu serie favorita?" + ] }, "sectionTitle": "Resultados de búsqueda" }, @@ -131,11 +138,15 @@ }, "morning": { "default": "¿Qué te gustaría ver esta mañana?", - "extra": ["Escuché que “Antes del amanecer” es buena"] + "extra": [ + "Escuché que “Antes del amanecer” es buena" + ] }, "night": { "default": "¿Qué te gustaría ver esta noche?", - "extra": ["¿Cansado? Escuché que “El Exorcista” es buena."] + "extra": [ + "¿Cansado? Escuché que “El Exorcista” es buena." + ] } } }, diff --git a/src/assets/locales/fa.json b/src/assets/locales/fa.json index c595647b..98eec9b3 100644 --- a/src/assets/locales/fa.json +++ b/src/assets/locales/fa.json @@ -57,6 +57,8 @@ }, "host": "شما در حال اتصال به <0>{{hostname}} هستید - لطفا قبل از ایجاد حساب کاربری خود از اعتماد به آن اطمینان حاصل کنید", "no": "بازگشت", + "noHost": "سرور پیکربندی نشده، بنابرین نمیتوانید حسابی ایجاد کنید", + "noHostTitle": "سرور پیکر بندی نشده!", "title": "آیا به این سرور اعتماد دارید؟", "yes": "بله اعتماد دارم" }, @@ -71,7 +73,7 @@ } }, "errors": { - "badge": "مشکلی پیش آمده", + "badge": "مشکلی رخ داده", "details": "جزئیات خطا", "reloadPage": "صفحه را دوباره بارگذاری کنید", "showError": "نمایش جزئیات خطا", @@ -115,7 +117,7 @@ "allResults": "همه چیزی بود که داشتیم!", "failed": "چیزی پیدا نشد، دوباره تلاش کنید!", "loading": "در حال بارگذاری...", - "noResults": "چیزی پیدا نکردیم!", + "noResults": "نتونستیم چیزی پیدا کنیم!", "placeholder": { "default": "چه می‌خواهید تماشا کنید؟", "extra": [ diff --git a/src/assets/locales/fr.json b/src/assets/locales/fr.json index a87be90b..86d93015 100644 --- a/src/assets/locales/fr.json +++ b/src/assets/locales/fr.json @@ -118,8 +118,7 @@ "loading": "Chargement...", "noResults": "Nous n'avons rien trouvé !", "placeholder": { - "default": "Que voulez-vous voir ?", - "extra": [] + "default": "Que voulez-vous voir ?" }, "sectionTitle": "Résultats de la recherche" }, @@ -132,7 +131,9 @@ }, "morning": { "default": "Que voulez-vous regarder ce matin ?", - "extra": ["Les films, c'est comme les voyages : ça nous ouvre l'esprit"] + "extra": [ + "Les films, c'est comme les voyages : ça nous ouvre l'esprit" + ] }, "night": { "default": "Que voulez-vous regarder ce soir ?", @@ -164,7 +165,7 @@ }, "notFound": { "badge": "Introuvable", - "goHome": "Retourer à l'accueil", + "goHome": "Retourner à l'accueil", "message": "Nous avons cherché partout : sous les poubelles, dans le placard, derrière le proxy, mais nous n'avons finalement pas trouvé la page que vous cherchez.", "title": "Impossible de trouver cette page" }, diff --git a/src/assets/locales/hi.json b/src/assets/locales/hi.json index 7f1dfe00..eab0a337 100644 --- a/src/assets/locales/hi.json +++ b/src/assets/locales/hi.json @@ -57,6 +57,8 @@ }, "host": "आप <0>{{hostname}} से कनेक्ट हो रहे हैं - खाता बनाने से पहले कृपया पुष्टि करें कि आप इस पर भरोसा करते हैं", "no": "पीछे जाये", + "noHost": "सर्वर कॉन्फ़िगर नहीं किया गया है, इसलिए आप खाता नहीं बना सकते", + "noHostTitle": "सर्वर कॉन्फ़िगर नहीं है!", "title": "क्या आपको इस सर्वर पर भरोसा है?", "yes": "मुझे इस सर्वर पर भरोसा है" }, @@ -118,7 +120,12 @@ "noResults": "हमें कुछ नहीं मिला!", "placeholder": { "default": "क्या देखना चाहते हो?", - "extra": [] + "extra": [ + "आप क्या अन्वेषण करना चाहते हैं?", + "आपकी वॉचलिस्ट में क्या है?", + "आपकी पसंदीदा फिल्म कौनसी है?", + "आपकी पसंदीदा सीरीज़ कौन सी है?" + ] }, "sectionTitle": "खोज के परिणाम" }, @@ -131,11 +138,15 @@ }, "morning": { "default": "आप आज सुबह को क्या देखना चाहेंगे?", - "extra": ["मैंने सुना है सूर्योदय से पहले ठीक है"] + "extra": [ + "मैंने सुना है सूर्योदय से पहले ठीक है" + ] }, "night": { "default": "आप आज रात को क्या देखना चाहेंगे?", - "extra": ["थके हुए हो? मैंने सुना एक्सोरसिस्ट अच्छी मूवी है।"] + "extra": [ + "थके हुए हो? मैंने सुना एक्सोरसिस्ट अच्छी मूवी है।" + ] } } }, @@ -241,6 +252,7 @@ }, "menus": { "downloads": { + "copyHlsPlaylist": "HLS प्लेलिस्ट लिंक कॉपी करें", "disclaimer": "डाउनलोड सीधे प्रदाता से लिए जाते हैं। मूवी-वेब का इस पर नियंत्रण नहीं है कि डाउनलोड कैसे प्रदान किए जाते हैं।", "downloadSubtitle": "वर्तमान उपशीर्षक डाउनलोड करें", "downloadVideo": "वीडियो डाउनलोड करें", diff --git a/src/assets/locales/is-IS.json b/src/assets/locales/is-IS.json index 0e1486d8..d3dcb6ba 100644 --- a/src/assets/locales/is-IS.json +++ b/src/assets/locales/is-IS.json @@ -11,7 +11,7 @@ "title": "Hvar get ég beðið um þætti eða myndir?" }, "q3": { - "body": "Okkar leitar niðurstöður eru knúnar af The Movie Database (TMDB) og eru sýndar þótt að okkar heimildir hafa ekki efnið.", + "body": "Leitarniðurstöður okkar eru knúnar af The Movie Database (TMDB) og eru sýndar þótt að heimildir okkar hafa ekki efnið.", "title": "Leitarniðurstöðurnar sýna þættina eða myndina, af hverju get ég ekki spilað það?" }, "title": "Um sudo-flix" @@ -57,6 +57,8 @@ }, "host": "Þú ert að tengjast við <0>{{hostname}} - vinsamlegast staðfestu að þú treystir því áður en þú býrð til reikning", "no": "Fara til baka", + "noHost": "Netjónninn hefur ekki verið stilltur, þess vegna getur þú ekki búið til reikning", + "noHostTitle": "Netþjónn ekki stilltur!", "title": "Treystir þú þessum netþjóni?", "yes": "Ég treysti þessum netþjóni" }, @@ -80,15 +82,28 @@ "footer": { "legal": { "disclaimer": "Fyrirvari", - "disclaimerText": "sudo-flix hýsir engar skrár, það tengist eingöngu þjónustu þriðja aðila. Lagleg atriði ættu að vera rædd við skráarhýsinga og veitanda. sudo-flix er ekki ábyrg fyrir neinum skrám sýndar af myndbands veitöndum." + "disclaimerText": "movie-web hýsir engar skrár, það tengist eingöngu þjónustu þriðja aðila. Lagleg atriði ættu að vera rædd við skráarhýsinga og veitanda. movie-web er ekki ábyrg fyrir neinum skrám sýndar af myndbands veitöndum." + }, + "links": { + "discord": "Discord", + "dmca": "DMCA", + "github": "GitHub" + }, + "links": { + "discord": "Discord", + "dmca": "DMCA", + "github": "GitHub" }, "tagline": "Horfðu á uppáhalds þætti og myndirnar þínar með þessu opna hugbúnaða forriti." }, "global": { + "name": "movie-web", "pages": { "about": "Um", + "dmca": "DMCA", "login": "Skrá inn", "onboarding": "Setja upp", + "pagetitle": "{{title}} - movie-web", "register": "Skrá", "settings": "Stillingar" } @@ -110,7 +125,12 @@ "noResults": "Við gátum ekki fundið neitt!", "placeholder": { "default": "Hvað viltu horfa á?", - "extra": [] + "extra": [ + "Hvað viltu kanna?", + "Hvað er á áhorfslistanum þínum?", + "Hvað er uppáhalds bíómyndin þín?", + "Hvað er uppáhalds þáttaröðin þín?" + ] }, "sectionTitle": "Leitar niðurstöður" }, @@ -123,11 +143,15 @@ }, "morning": { "default": "Hvað myndirðu vilja horfa á þessum morgni?", - "extra": ["Ég heyrði að Before Sunrise sé góð"] + "extra": [ + "Ég heyrði að Before Sunrise sé góð" + ] }, "night": { "default": "Hvað myndirðu vilja horfa á í nótt?", - "extra": ["Þreytt? Ég heyrði að The Exorcist sé góð."] + "extra": [ + "Þreytt? Ég heyrði að The Exorcist sé góð." + ] } } }, @@ -191,7 +215,8 @@ "errorConnection": "Gat ekki tengst umboð", "errorInvalidUrl": "Ekki gildur hlekkur", "errorNotProxy": "Bjóst við umboði en fékk heimasíðu", - "label": "Umboðs hlekkur" + "label": "Umboðs hlekkur", + "placeholder": "https://" }, "link": "Lærðu hvernig þú býrð til umboð", "submit": "Staðfesta umboð", @@ -232,6 +257,7 @@ }, "menus": { "downloads": { + "copyHlsPlaylist": "Afrita HLS spilalista hlekk", "disclaimer": "Niðurhalningar eru teknar beint frá heimildini. sudo-flix hefur engan kraft yfir hvernig niðurhalningarnar eru gefnar.", "downloadSubtitle": "Hlaða niður nú verandi texta", "downloadVideo": "Hlaða niður myndbandi", @@ -372,7 +398,10 @@ } }, "time": { - "remaining": "{{timeLeft}} er eftir • Þú klárar {{timeFinished, datetime}}" + "regular": "{{timeWatched}} / {{duration}}", + "remaining": "{{timeLeft}} er eftir • Þú klárar {{timeFinished, datetime}}", + "shortRegular": "{{timeWatched}}", + "shortRemaining": "-{{timeLeft}}" }, "turnstile": { "description": "Vinsamlegast sannreyndu að þú sért manneskja með því að klára Captcha-ið til hægri. Þetta er til þess að halda sudo-flix öruggu!", @@ -383,7 +412,8 @@ }, "screens": { "dmca": { - "text": "Velkomin á sambands síðu sudo-flix! Við virðum hugverkarétt og viljum ræða einhver höfundarréttar áhyggjur fljótt. Ef að þú trúir að höfundarréttur þíns verks hefur verið misnotaður á okkar síðu, vinsamlegast sentu ítarlega DMCA tilkynningu til netfangsing fyrir neðan þennan texta. Vinsamlegast láttu fylgja með lýsingu af höfundaréttavarna efninu, tengiliða upplýsingat þínar, og yfirlýsingu um góða trú. Við erum staðráðin í að leysa þessi mál tafarlaust og þökkum samstarf þitt við að halda sudo-flix stað sem virðir sköpunargáfu og höfundarrétt." + "text": "Velkomin á sambands síðu sudo-flix! Við virðum hugverkarétt og viljum ræða einhver höfundarréttar áhyggjur fljótt. Ef að þú trúir að höfundarréttur þíns verks hefur verið misnotaður á okkar síðu, vinsamlegast sentu ítarlega DMCA tilkynningu til netfangsing fyrir neðan þennan texta. Vinsamlegast láttu fylgja með lýsingu af höfundaréttavarna efninu, tengiliða upplýsingat þínar, og yfirlýsingu um góða trú. Við erum staðráðin í að leysa þessi mál tafarlaust og þökkum samstarf þitt við að halda sudo-flix stað sem virðir sköpunargáfu og höfundarrétt.", + "title": "DMCA" }, "loadingApp": "Hlaðandi forriti", "loadingUser": "Hlaðandi þínum reikningi", @@ -482,7 +512,8 @@ "description": "Til að láta forritið virka, allri umboð er beint í gegnum umboð. Virktu þetta ef þú villt koma með þína eigin starfsmenn. <0>Leiðbeiningar.", "emptyState": "Engir starfsmenn komnir, bættu við einum fyir neðan þennan texta", "label": "Notaðu sérsniðaða umboðs starfsmenn", - "urlLabel": "Starfsmanna hlekkir" + "urlLabel": "Starfsmanna hlekkir", + "urlPlaceholder": "https://" } }, "preferences": { diff --git a/src/assets/locales/it.json b/src/assets/locales/it.json index ca5dfb61..2a591c1c 100644 --- a/src/assets/locales/it.json +++ b/src/assets/locales/it.json @@ -30,7 +30,7 @@ "passphraseFrameLabel": "Frase password", "title": "La tua frase password" }, - "hasAccount": "Hai già un account? <0>Accedi ", + "hasAccount": "Hai già un account? <0>Accedi.", "login": { "description": "Inserisci la tua frase password per accedere al vostro account", "deviceLengthError": "Inserisci un nome per il dispositivo", @@ -57,6 +57,8 @@ }, "host": "Ti stai collegando a <0>{{hostname}} - conferma la tua fiducia prima di creare un account", "no": "Indietro", + "noHost": "Il server non è configurato, quindi non si può creare un account", + "noHostTitle": "Server non è configurato!", "title": "Ti fidi di questo server?", "yes": "Mi fido di questo server" }, diff --git a/src/assets/locales/ne.json b/src/assets/locales/ne.json index 8d14e89e..3e3d83ff 100644 --- a/src/assets/locales/ne.json +++ b/src/assets/locales/ne.json @@ -57,6 +57,8 @@ }, "host": "तपाइँ <0>{{hostname}} मा कनेक्ट हुनुहुन्छ - कृपया खाता बनाउनु अघि तपाइँ यसलाई विश्वास गर्नुहुन्छ भनेर पुष्टि गर्नुहोस्", "no": "पछाडी जाउ", + "noHost": "सर्भर कन्फिगर गरिएको छैन, त्यसैले तपाईंले खाता सिर्जना गर्न सक्नुहुन्न", + "noHostTitle": "सर्भर कन्फिगर गरिएको छैन!", "title": "के तपाइँ यो सर्भरमा भरोसा गर्नुहुन्छ?", "yes": "म यो सर्भरलाई भरोसा गर्छु" }, diff --git a/src/assets/locales/nl.json b/src/assets/locales/nl.json index d34f9ea1..48fafe46 100644 --- a/src/assets/locales/nl.json +++ b/src/assets/locales/nl.json @@ -57,6 +57,8 @@ }, "host": "Je gaat zo verbinden met <0>{{hostname}}, check even of je deze link vertrouwt", "no": "Vorige pagina", + "noHost": "De server is nog niet geconfigureerd, daarom kunt u geen account aanmaken", + "noHostTitle": "Server niet geconfigureerd!", "title": "Vertrouw je deze server?", "yes": "Ik vertrouw deze server" }, @@ -118,7 +120,12 @@ "noResults": "We konden helaas niets vinden!", "placeholder": { "default": "Wat wil je graag kijken?", - "extra": [] + "extra": [ + "Wat wil je verkennen?", + "Wat staat er op jouw kijklijst?", + "Wat is jouw favoriete film?", + "Wat is jouw favoriete serie?" + ] }, "sectionTitle": "Zoekresultaten" }, @@ -131,11 +138,15 @@ }, "morning": { "default": "Waar wil je deze ochtend naar kijken?", - "extra": ["Ik hoor dat Before Sunrise goed is"] + "extra": [ + "Ik hoor dat Before Sunrise goed is" + ] }, "night": { "default": "Wat wil je vanavond bekijken?", - "extra": ["Moe? Ik hoor dat The Exorcist goed is."] + "extra": [ + "Moe? Ik hoor dat The Exorcist goed is." + ] } } }, @@ -176,10 +187,10 @@ "back": "Terug", "explainer": "Door gebruik te maken van de browserextensie kun je de beste streams krijgen. Met slechts een eenvoudige installatie.", "explainerIos": "Helaas, de browserextensie is niet ondersteund op iOS. Druk op Terug om een andere optie te kiezen.", - "extensionHelp": "Als je de extensie hebt geïnstalleerd maar niet wordt gedetecteerd, Open dan de extensie via het extensies menu in je browser en volg de stappen op het scherm.", + "extensionHelp": "Als je de extensie hebt geïnstalleerd maar niet wordt gedetecteerd, open dan de extensie via het extensies menu in je browser en volg de stappen op het scherm.", "linkChrome": "Installeer de Chrome-extensie", "linkFirefox": "Installeer de Firefox-extensie", - "notDetecting": "Geïnstalleerd op Chrome maar wordt niet weergegeven? Probeer de pagina opnieuw te laden!", + "notDetecting": "Geïnstalleerd op Chrome, maar de site detecteert het niet? Probeer de pagina opnieuw te laden!", "notDetectingAction": "Pagina opnieuw laden", "status": { "disallowed": "Extensie is niet ingeschakeld voor deze pagina", @@ -207,7 +218,7 @@ "title": "Laten we een nieuwe proxy instellen" }, "start": { - "explainer": "Om de beste mogelijke streams te krijgen, moet je kiezen welke streamingmethode je wilt gebruiken.", + "explainer": "Om de beste streams mogelijk te krijgen, moet je kiezen welke streammethode je wilt gebruiken.", "options": { "default": { "text": "Ik wil geen streams van goede kwaliteit, <0 /> <1>Gebruik de standaardinstellingen." @@ -241,7 +252,8 @@ }, "menus": { "downloads": { - "disclaimer": "Downloads worden direct bij de bron opgehaald. sudo-flix heeft geen controle over het bestand dat je ontvangt.", + "copyHlsPlaylist": "HLS-afspeellijstlink kopiëren", + "disclaimer": "Downloads worden direct bij de bron opgehaald. movie-web heeft geen controle over het bestand dat je ontvangt.", "downloadSubtitle": "Download huidige ondertiteling", "downloadVideo": "Download filmpje", "hlsDisclaimer": "Downloads worden rechtstreeks van de aanbieder gehaald. sudo-flix heeft geen controle over de manier waarop de downloads worden aangeboden.

Houd er rekening mee dat u nu een HLS-afspeellijst downloadt, het wordt afgeraden deze te downloaden als u niet bekend bent met geavanceerde streamingbestandstypen. Probeer verschillende bronnen voor verschillende streamingbestandstypen.", diff --git a/src/assets/locales/pa.json b/src/assets/locales/pa.json index a3a139f4..e7aaf7c4 100644 --- a/src/assets/locales/pa.json +++ b/src/assets/locales/pa.json @@ -57,6 +57,8 @@ }, "host": "ਤੁਸੀਂ <0>{{hostname}} ਨਾਲ ਜੁੜ ਰਹੇ ਹੋ - ਕਿਰਪਾ ਕਰਕੇ ਖਾਤਾ ਬਣਾਉਣ ਤੋਂ ਪਹਿਲਾਂ ਪੁਸ਼ਟੀ ਕਰੋ ਕਿ ਤੁਸੀਂ ਇਸ 'ਤੇ ਭਰੋਸਾ ਕਰਦੇ ਹੋ", "no": "ਵਾਪਸ ਜਾਓ", + "noHost": "ਸਰਵਰ ਕੌਂਫਿਗਰ ਨਹੀਂ ਕੀਤਾ ਗਿਆ ਹੈ, ਇਸਲਈ ਤੁਸੀਂ ਖਾਤਾ ਨਹੀਂ ਬਣਾ ਸਕਦੇ ਹੋ", + "noHostTitle": "ਸਰਵਰ ਕੌਂਫਿਗਰ ਨਹੀਂ ਕੀਤਾ ਗਿਆ!", "title": "ਕੀ ਤੁਸੀਂ ਇਸ ਸਰਵਰ 'ਤੇ ਭਰੋਸਾ ਕਰਦੇ ਹੋ?", "yes": "ਮੈਨੂੰ ਇਸ ਸਰਵਰ 'ਤੇ ਭਰੋਸਾ ਹੈ" }, @@ -118,7 +120,12 @@ "noResults": "ਅਸੀਂ ਕੁਝ ਵੀ ਨਹੀਂ ਲੱਭ ਸਕੇ!", "placeholder": { "default": "ਤੁਸੀਂ ਕੀ ਦੇਖਣਾ ਚਾਹੁੰਦੇ ਹੋ?", - "extra": [] + "extra": [ + "ਤੁਸੀਂ ਕੀ ਪੜਚੋਲ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?", + "ਤੁਹਾਡੀ ਨਿਗਰਾਨੀ ਸੂਚੀ ਵਿੱਚ ਕੀ ਹੈ?", + "ਤੁਹਾਡੀ ਮਨਪਸੰਦ ਫਿਲਮ ਕਿਹੜੀ ਹੈ?", + "ਤੁਹਾਡੀ ਮਨਪਸੰਦ ਲੜੀ ਕਿਹੜੀ ਹੈ?" + ] }, "sectionTitle": "ਖੋਜ ਨਤੀਜੇ" }, @@ -131,11 +138,15 @@ }, "morning": { "default": "ਤੁਸੀਂ ਅੱਜ ਸਵੇਰੇ ਕੀ ਦੇਖਣਾ ਚਾਹੋਗੇ?", - "extra": ["ਮੈਂ ਸੁਣਦਾ ਹਾਂ ਕਿ ਸੂਰਜ ਚੜ੍ਹਨ ਤੋਂ ਪਹਿਲਾਂ ਚੰਗਾ ਹੁੰਦਾ ਹੈ"] + "extra": [ + "ਮੈਂ ਸੁਣਦਾ ਹਾਂ ਕਿ ਸੂਰਜ ਚੜ੍ਹਨ ਤੋਂ ਪਹਿਲਾਂ ਚੰਗਾ ਹੁੰਦਾ ਹੈ" + ] }, "night": { "default": "ਤੁਸੀਂ ਅੱਜ ਰਾਤ ਕੀ ਦੇਖਣਾ ਚਾਹੋਗੇ?", - "extra": ["ਥੱਕ ਗਏ? ਮੈਂ ਸੁਣਿਆ ਹੈ ਕਿ Exorcist ਚੰਗਾ ਹੈ."] + "extra": [ + "ਥੱਕ ਗਏ? ਮੈਂ ਸੁਣਿਆ ਹੈ ਕਿ Exorcist ਚੰਗਾ ਹੈ." + ] } } }, @@ -241,6 +252,7 @@ }, "menus": { "downloads": { + "copyHlsPlaylist": "HLS ਪਲੇਲਿਸਟ ਲਿੰਕ ਕਾਪੀ ਕਰੋ", "disclaimer": "ਡਾਊਨਲੋਡ ਸਿੱਧੇ ਪ੍ਰਦਾਤਾ ਤੋਂ ਲਏ ਜਾਂਦੇ ਹਨ. ਮੂਵੀ-ਵੈੱਬ ਦਾ ਇਸ 'ਤੇ ਕੰਟਰੋਲ ਨਹੀਂ ਹੈ ਕਿ ਡਾਊਨਲੋਡ ਕਿਵੇਂ ਪ੍ਰਦਾਨ ਕੀਤੇ ਜਾਂਦੇ ਹਨ.", "downloadSubtitle": "ਮੌਜੂਦਾ ਉਪਸਿਰਲੇਖ ਡਾਊਨਲੋਡ ਕਰੋ", "downloadVideo": "ਵੀਡੀਓ ਡਾਊਨਲੋਡ ਕਰੋ", diff --git a/src/assets/locales/sl.json b/src/assets/locales/sl.json index 7018060d..144a37ae 100644 --- a/src/assets/locales/sl.json +++ b/src/assets/locales/sl.json @@ -57,6 +57,8 @@ }, "host": "Povezujete se z <0>{{hostname}} - pred ustvarjanjem računa potrdite, da mu zaupate", "no": "Nazaj", + "noHost": "Strežnik ni nastavljen, zato ustvarjanje profila ni mogoče", + "noHostTitle": "Strežnik ni nastavljen!", "title": "Ali zaupate temu strežniku?", "yes": "Zaupam strežniku" }, diff --git a/src/assets/locales/zh.json b/src/assets/locales/zh.json index 94711c5a..5c6fbd1a 100644 --- a/src/assets/locales/zh.json +++ b/src/assets/locales/zh.json @@ -57,6 +57,8 @@ }, "host": "您正在连接到 <0>{{hostname}} - 在创建账户前,确保您信任它", "no": "返回", + "noHost": "服务器尚未进行配置,因此您无法创建账户", + "noHostTitle": "未配置服务器!", "title": "您是否信任这个服务器?", "yes": "我信任这个服务器" }, diff --git a/src/backend/metadata/tmdb.ts b/src/backend/metadata/tmdb.ts index 2bae75d1..b143b312 100644 --- a/src/backend/metadata/tmdb.ts +++ b/src/backend/metadata/tmdb.ts @@ -144,12 +144,16 @@ export function decodeTMDBId( const baseURL = "https://api.themoviedb.org/3"; +const apiKey = conf().TMDB_READ_API_KEY; + const headers = { accept: "application/json", - Authorization: `Bearer ${conf().TMDB_READ_API_KEY}`, + Authorization: `Bearer ${apiKey}`, }; async function get(url: string, params?: object): Promise { + if (!apiKey) throw new Error("TMDB API key not set"); + const res = await mwFetch(encodeURI(url), { headers, baseURL, diff --git a/src/components/buttons/Button.tsx b/src/components/buttons/Button.tsx index f5c81b8d..8502e506 100644 --- a/src/components/buttons/Button.tsx +++ b/src/components/buttons/Button.tsx @@ -1,5 +1,6 @@ import classNames from "classnames"; import { ReactNode, useCallback } from "react"; +import { useNavigate } from "react-router-dom"; import { Icon, Icons } from "@/components/Icon"; import { Spinner } from "@/components/layout/Spinner"; @@ -20,6 +21,7 @@ interface Props { } export function Button(props: Props) { + const navigate = useNavigate(); const { onClick, href, loading } = props; const cb = useCallback( ( @@ -31,10 +33,14 @@ export function Button(props: Props) { if (loading) return; if (href && !onClick) { event.preventDefault(); - window.open(href, "_blank", "noreferrer"); + if (!href.includes("http")) { + navigate(href); + } else { + window.open(href, "_blank", "noreferrer"); + } } else onClick?.(event); }, - [onClick, href, loading], + [loading, href, onClick, navigate], ); let colorClasses = "bg-white hover:bg-gray-200 text-black"; diff --git a/src/hooks/auth/useBackendUrl.ts b/src/hooks/auth/useBackendUrl.ts index 64545227..adee8622 100644 --- a/src/hooks/auth/useBackendUrl.ts +++ b/src/hooks/auth/useBackendUrl.ts @@ -1,7 +1,7 @@ import { conf } from "@/setup/config"; import { useAuthStore } from "@/stores/auth"; -export function useBackendUrl(): string | undefined { +export function useBackendUrl(): string | null { const backendUrl = useAuthStore((s) => s.backendUrl); return backendUrl ?? conf().BACKEND_URL; } diff --git a/src/pages/parts/admin/TMDBTestPart.tsx b/src/pages/parts/admin/TMDBTestPart.tsx index a7f8fa50..d760c948 100644 --- a/src/pages/parts/admin/TMDBTestPart.tsx +++ b/src/pages/parts/admin/TMDBTestPart.tsx @@ -25,7 +25,7 @@ export function TMDBTestPart() { errorText: "", }); - if (tmdbApiKey.length === 0) { + if (!tmdbApiKey || tmdbApiKey.length === 0) { return setStatus({ hasTested: true, success: false, diff --git a/src/pages/parts/settings/SidebarPart.tsx b/src/pages/parts/settings/SidebarPart.tsx index 13db06fe..98404c84 100644 --- a/src/pages/parts/settings/SidebarPart.tsx +++ b/src/pages/parts/settings/SidebarPart.tsx @@ -14,7 +14,7 @@ import { useAuthStore } from "@/stores/auth"; const rem = 16; -function SecureBadge(props: { url: string | undefined }) { +function SecureBadge(props: { url: string | null }) { const { t } = useTranslation(); const secure = props.url ? props.url.startsWith("https://") : false; return ( diff --git a/src/setup/config.ts b/src/setup/config.ts index 01d4042c..485ce367 100644 --- a/src/setup/config.ts +++ b/src/setup/config.ts @@ -31,10 +31,10 @@ export interface RuntimeConfig { DONATION_LINK: string; DISCORD_LINK: string; DMCA_EMAIL: string | null; - TMDB_READ_API_KEY: string; + TMDB_READ_API_KEY: string | null; NORMAL_ROUTER: boolean; PROXY_URLS: string[]; - BACKEND_URL: string; + BACKEND_URL: string | null; DISALLOWED_IDS: string[]; TURNSTILE_KEY: string | null; CDN_REPLACEMENTS: Array; @@ -66,48 +66,48 @@ const env: Record = { HAS_ONBOARDING: import.meta.env.VITE_HAS_ONBOARDING, }; -// loads from different locations, in order: environment (VITE_{KEY}), window (public/config.js) -function getKeyValue(key: keyof Config): string | undefined { - let windowValue = (window as any)?.__CONFIG__?.[`VITE_${key}`]; - if ( - windowValue !== null && - windowValue !== undefined && - windowValue.length === 0 - ) - windowValue = undefined; - return env[key] ?? windowValue ?? undefined; +function coerceUndefined(value: string | null | undefined): string | undefined { + if (value == null) return undefined; + if (value.length === 0) return undefined; + return value; } -function getKey(key: keyof Config, defaultString?: string): string { - return getKeyValue(key)?.toString() ?? defaultString ?? ""; +// loads from different locations, in order: environment (VITE_{KEY}), window (public/config.js) +function getKeyValue(key: keyof Config): string | undefined { + const windowValue = (window as any)?.__CONFIG__?.[`VITE_${key}`]; + + return coerceUndefined(env[key]) ?? coerceUndefined(windowValue) ?? undefined; +} + +function getKey(key: keyof Config): string | null; +function getKey(key: keyof Config, defaultString: string): string; +function getKey(key: keyof Config, defaultString?: string): string | null { + return getKeyValue(key)?.toString() ?? defaultString ?? null; } export function conf(): RuntimeConfig { - const dmcaEmail = getKey("DMCA_EMAIL"); - const chromeExtension = getKey("ONBOARDING_CHROME_EXTENSION_INSTALL_LINK"); - const firefoxExtension = getKey("ONBOARDING_FIREFOX_EXTENSION_INSTALL_LINK"); - const proxyInstallLink = getKey("ONBOARDING_PROXY_INSTALL_LINK"); - const turnstileKey = getKey("TURNSTILE_KEY"); return { APP_VERSION, GITHUB_LINK, DONATION_LINK, DISCORD_LINK, - DMCA_EMAIL: dmcaEmail.length > 0 ? dmcaEmail : null, - ONBOARDING_CHROME_EXTENSION_INSTALL_LINK: - chromeExtension.length > 0 ? chromeExtension : null, - ONBOARDING_FIREFOX_EXTENSION_INSTALL_LINK: - firefoxExtension.length > 0 ? firefoxExtension : null, - ONBOARDING_PROXY_INSTALL_LINK: - proxyInstallLink.length > 0 ? proxyInstallLink : null, + DMCA_EMAIL: getKey("DMCA_EMAIL"), + ONBOARDING_CHROME_EXTENSION_INSTALL_LINK: getKey( + "ONBOARDING_CHROME_EXTENSION_INSTALL_LINK", + ), + ONBOARDING_FIREFOX_EXTENSION_INSTALL_LINK: getKey( + "ONBOARDING_FIREFOX_EXTENSION_INSTALL_LINK", + ), + ONBOARDING_PROXY_INSTALL_LINK: getKey("ONBOARDING_PROXY_INSTALL_LINK"), BACKEND_URL: getKey("BACKEND_URL", BACKEND_URL), TMDB_READ_API_KEY: getKey("TMDB_READ_API_KEY"), - PROXY_URLS: getKey("CORS_PROXY_URL") + PROXY_URLS: getKey("CORS_PROXY_URL", "") .split(",") - .map((v) => v.trim()), + .map((v) => v.trim()) + .filter((v) => v.length > 0), NORMAL_ROUTER: getKey("NORMAL_ROUTER", "false") === "true", HAS_ONBOARDING: getKey("HAS_ONBOARDING", "false") === "true", - TURNSTILE_KEY: turnstileKey.length > 0 ? turnstileKey : null, + TURNSTILE_KEY: getKey("TURNSTILE_KEY"), DISALLOWED_IDS: getKey("DISALLOWED_IDS", "") .split(",") .map((v) => v.trim())