diff --git a/.github/workflows/auto-close-duplicate.yaml b/.github/workflows/auto-close-duplicate.yaml new file mode 100644 index 00000000..2eea099e --- /dev/null +++ b/.github/workflows/auto-close-duplicate.yaml @@ -0,0 +1,37 @@ +name: Close duplicates +on: + issues: + types: [opened] +jobs: + run: + runs-on: ubuntu-latest + permissions: write-all + steps: + - uses: iv-org/close-potential-duplicates@v1 + with: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # Issue title filter work with anymatch https://www.npmjs.com/package/anymatch. + # Any matched issue will stop detection immediately. + # You can specify multi filters in each line. + filter: '' + # Exclude keywords in title before detecting. + exclude: '' + # Label to set, when potential duplicates are detected. + label: duplicate + # Get issues with state to compare. Supported state: 'all', 'closed', 'open'. + state: open + # If similarity is higher than this threshold([0,1]), issue will be marked as duplicate. + threshold: 0.9 + # Reactions to be add to comment when potential duplicates are detected. + # Available reactions: "-1", "+1", "confused", "laugh", "heart", "hooray", "rocket", "eyes" + reactions: '' + close: true + # Comment to post when potential duplicates are detected. + comment: | + Hello, your issue is a duplicate of this/these issue(s): {{#issues}} + - #{{ number }} [accuracy: {{ accuracy }}%] + {{/issues}} + + If this is a mistake please explain why and ping @\unixfox, @\SamantazFox and @\TheFrenchGhosty. + + Please refrain from opening new issues, it won't help in solving your problem. diff --git a/Makefile b/Makefile index 29be727c..d4657792 100644 --- a/Makefile +++ b/Makefile @@ -31,6 +31,10 @@ ifeq ($(DISABLE_QUIC), 1) FLAGS += -Ddisable_quic endif +ifeq ($(API_ONLY), 1) + FLAGS += -Dapi_only +endif + # ----------------------- # Main @@ -82,6 +86,7 @@ clean: distclean: clean rm -rf libs + rm -rf ~/.cache/{crystal,shards} # ----------------------- @@ -106,11 +111,12 @@ help: @echo "" @echo "Build options available for this Makefile:" @echo "" - @echo " RELEASE Make a release build (Default: 1)" - @echo " STATIC Link libraries statically (Default: 0)" + @echo " RELEASE Make a release build (Default: 1)" + @echo " STATIC Link libraries statically (Default: 0)" @echo "" - @echo " DISABLE_QUIC Disable support for QUIC (Default: 0)" - @echo " NO_DBG_SYMBOLS Strip debug symbols (Default: 0)" + @echo " API_ONLY Build invidious without a GUI (Default: 0)" + @echo " DISABLE_QUIC Disable support for QUIC (Default: 0)" + @echo " NO_DBG_SYMBOLS Strip debug symbols (Default: 0)" diff --git a/README.md b/README.md index 602ad2e2..88770383 100644 --- a/README.md +++ b/README.md @@ -153,9 +153,9 @@ Weblate also allows you to log-in with major SSO providers like Github, Gitlab, - [WatchTube](https://github.com/WatchTubeTeam/WatchTube): Powerful YouTube client for Apple Watch. - [Yattee](https://github.com/yattee/yattee): Alternative YouTube frontend for iPhone, iPad, Mac and Apple TV. - [TubiTui](https://codeberg.org/777/TubiTui): A lightweight, libre, TUI-based YouTube client. -- [Ytfzf](https://github.com/pystardust/ytfzf): A posix script to find and watch youtube videos from the terminal. (Without API) -- [Playlet](https://github.com/iBicha/playlet): Unofficial Youtube client for Roku TV -- [Clipious](https://github.com/lamarios/clipious): Unofficial Invidious client for Android +- [Ytfzf](https://github.com/pystardust/ytfzf): A posix script to find and watch youtube videos from the terminal. (Without API). +- [Playlet](https://github.com/iBicha/playlet): Unofficial Youtube client for Roku TV. +- [Clipious](https://github.com/lamarios/clipious): Unofficial Invidious client for Android. ## Liability diff --git a/assets/js/watch.js b/assets/js/watch.js index cff84e4d..36506abd 100644 --- a/assets/js/watch.js +++ b/assets/js/watch.js @@ -282,7 +282,7 @@ function get_youtube_replies(target, load_more, load_replies) { if (load_more) { body = body.parentNode.parentNode; body.removeChild(body.lastElementChild); - body.innerHTML += response.contentHtml; + body.insertAdjacentHTML('beforeend', response.contentHtml); } else { body.removeChild(body.lastElementChild); diff --git a/config/config.example.yml b/config/config.example.yml index 88f33b9b..c78af824 100644 --- a/config/config.example.yml +++ b/config/config.example.yml @@ -255,8 +255,7 @@ https_only: false #registration_enabled: true ## -## Allow/Forbid users to log-in. This setting affects the ability -## to connect with BOTH Google and Invidious (local) accounts. +## Allow/Forbid users to log-in. ## ## Accepted values: true, false ## Default: true @@ -466,13 +465,17 @@ jobs: #use_pubsub_feeds: false ## -## HMAC signing key used for CSRF tokens and pubsub +## HMAC signing key used for CSRF tokens, cookies and pubsub ## subscriptions verification. ## +## Note: This parameter is mandatory and should be a random string. +## Such random string can be generated on linux with the following +## command: `pwgen 20 1` +## ## Accepted values: a string ## Default: ## -#hmac_key: +hmac_key: "CHANGE_ME!!" ## ## List of video IDs where the "download" widget must be diff --git a/docker-compose.yml b/docker-compose.yml index eb83b020..6a854475 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -30,6 +30,7 @@ services: # domain: # https_only: false # statistics_enabled: false + hmac_key: "CHANGE_ME!!" healthcheck: test: wget -nv --tries=1 --spider http://127.0.0.1:3000/api/v1/comments/jNQXAC9IVRw || exit 1 interval: 30s diff --git a/locales/af.json b/locales/af.json index 0967ef42..35f40a13 100644 --- a/locales/af.json +++ b/locales/af.json @@ -1 +1,15 @@ -{} +{ + "generic_views_count": "{{count}} kyk", + "generic_views_count_plural": "{{count}} kyke", + "generic_videos_count": "{{count}} video", + "generic_videos_count_plural": "{{count}} videos", + "generic_playlists_count": "{{count}} snitlys", + "generic_playlists_count_plural": "{{count}} snitlyste", + "generic_subscriptions_count": "{{count}} intekening", + "generic_subscriptions_count_plural": "{{count}} intekeninge", + "LIVE": "LEWENDIG", + "generic_subscribers_count": "{{count}} intekenaar", + "generic_subscribers_count_plural": "{{count}} intekenare", + "Shared `x` ago": "`x` gelede gedeel", + "New passwords must match": "Nuwe wagwoord moet ooreenstem" +} diff --git a/locales/ar.json b/locales/ar.json index 6fe5b8bf..c137d1a3 100644 --- a/locales/ar.json +++ b/locales/ar.json @@ -14,7 +14,6 @@ "Clear watch history?": "هل تريد محو سجل المشاهدة؟", "New password": "كلمة مرور جديدة", "New passwords must match": "يَجبُ أن تكون كلمتا المرور متطابقتين", - "Cannot change password for Google accounts": "لا يُمكن تغيير كلمة المرور لِحسابات جوجل", "Authorize token?": "رمز التفويض؟", "Authorize token for `x`?": "السماح بالرمز المميز ل 'x'؟", "Yes": "نعم", @@ -37,7 +36,6 @@ "source": "المصدر", "Log in": "تسجيل الدخول", "Log in/register": "تسجيل الدخول \\ إنشاء حساب", - "Log in with Google": "تسجيل الدخول باستخدام جوجل", "User ID": "مُعرِّف المُستخدم", "Password": "كلمة المرور", "Time (h:mm:ss):": "الوقت (h:mm:ss):", @@ -46,13 +44,12 @@ "Sign In": "تسجيل الدخول", "Register": "التسجيل", "E-mail": "البريد الإلكتروني", - "Google verification code": "رمز تحقق جوجل", "Preferences": "الإعدادات", "preferences_category_player": "إعدادات المُشغِّل", "preferences_video_loop_label": "كرر المقطع المرئيّ دائما: ", "preferences_autoplay_label": "تشغيل تلقائي: ", - "preferences_continue_label": "شغل المقطع التالي تلقائيًا: ", - "preferences_continue_autoplay_label": "شغل المقطع التالي تلقائيًا: ", + "preferences_continue_label": "تشغيل المقطع التالي تلقائيًا: ", + "preferences_continue_autoplay_label": "شغل المقطع التالي تلقائيًا: . ", "preferences_listen_label": "تشغيل النسخة السمعية تلقائيًا: ", "preferences_local_label": "بروكسي المقاطع المرئيّة؟ ", "preferences_speed_label": "السرعة الافتراضية: ", @@ -158,23 +155,18 @@ "View more comments on Reddit": "عرض المزيد من التعليقات على\\من موقع ريديت", "View `x` comments": { "([^.,0-9]|^)1([^.,0-9]|$)": "عرض `x` تعليقات", - "": "عرض `x` تعليقات" + "": "عرض `x` تعليقات." }, "View Reddit comments": "عرض تعليقات ريديت", "Hide replies": "إخفاء الردود", "Show replies": "عرض الردود", "Incorrect password": "كلمة السر غير صحيحة", - "Quota exceeded, try again in a few hours": "تم تجاوز عدد المرات المسموح بها، حاول مجددًا بعد بضع ساعات", - "Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "غير قادر على تسجيل الدخول، تأكد من تشغيل المصادقة الثنائية 2FA.", - "Invalid TFA code": "كود مصادقة ثنائية 2FA غير صحيح", - "Login failed. This may be because two-factor authentication is not turned on for your account.": "فشل تسجيل الدخول. قد يكون هذا بسبب أن المصادقة الثنائية 2FA معطلة في حسابك.", "Wrong answer": "إجابة خاطئة", "Erroneous CAPTCHA": "الكابتشا CAPTCHA غير صاحلة", "CAPTCHA is a required field": "مكان الكابتشا CAPTCHA مطلوب", "User ID is a required field": "مكان اسم المستخدم مطلوب", "Password is a required field": "مكان كلمة السر مطلوب", "Wrong username or password": "اسم المستخدم او كلمة السر غير صحيح", - "Please sign in using 'Log in with Google'": "الرجاء تسجيل الدخول باستخدام \"تسجيل الدخول باستخدام Google\"", "Password cannot be empty": "لا يمكن أن تكون كلمة السر فارغة", "Password cannot be longer than 55 characters": "يجب أن لا تتعدى كلمة السر 55 حرفًا", "Please log in": "الرجاء تسجيل الدخول", diff --git a/locales/bn.json b/locales/bn.json index 3d1cb5da..9d1c7b24 100644 --- a/locales/bn.json +++ b/locales/bn.json @@ -11,7 +11,6 @@ "Clear watch history?": "দেখার ইতিহাস সাফ করবেন?", "New password": "নতুন পাসওয়ার্ড", "New passwords must match": "নতুন পাসওয়ার্ড অবশ্যই মিলতে হবে", - "Cannot change password for Google accounts": "গুগল অ্যাকাউন্টগুলোর জন্য পাসওয়ার্ড পরিবর্তন করা যায় না", "Authorize token?": "টোকেন অনুমোদন করবেন?", "Authorize token for `x`?": "`x` -এর জন্য টোকেন অনুমোদন?", "Yes": "হ্যাঁ", @@ -34,7 +33,6 @@ "source": "সূত্র", "Log in": "লগ ইন", "Log in/register": "লগ ইন/রেজিস্টার", - "Log in with Google": "গুগল দিয়ে লগ ইন করুন", "User ID": "ইউজার আইডি", "Password": "পাসওয়ার্ড", "Time (h:mm:ss):": "সময় (ঘণ্টা:মিনিট:সেকেন্ড):", @@ -43,7 +41,6 @@ "Sign In": "সাইন ইন", "Register": "নিবন্ধন", "E-mail": "ই-মেইল", - "Google verification code": "গুগল যাচাইকরণ কোড", "Preferences": "পছন্দসমূহ", "preferences_category_player": "প্লেয়ারের পছন্দসমূহ", "preferences_video_loop_label": "সর্বদা লুপ: ", diff --git a/locales/bn_BD.json b/locales/bn_BD.json index 53cb79ae..a82b0da7 100644 --- a/locales/bn_BD.json +++ b/locales/bn_BD.json @@ -14,7 +14,6 @@ "Clear watch history?": "দেখার ইতিহাস সাফ করবেন?", "New password": "নতুন পাসওয়ার্ড", "New passwords must match": "নতুন পাসওয়ার্ড অবশ্যই মিলতে হবে", - "Cannot change password for Google accounts": "গুগল অ্যাকাউন্টগুলোর জন্য পাসওয়ার্ড পরিবর্তন করা যায় না", "Authorize token?": "টোকেন অনুমোদন করবেন?", "Authorize token for `x`?": "`x` -এর জন্য টোকেন অনুমোদন?", "Yes": "হ্যাঁ", @@ -37,7 +36,6 @@ "source": "সূত্র", "Log in": "লগ ইন", "Log in/register": "লগ ইন/রেজিস্টার", - "Log in with Google": "গুগল দিয়ে লগ ইন করুন", "User ID": "ইউজার আইডি", "Password": "পাসওয়ার্ড", "Time (h:mm:ss):": "সময় (ঘণ্টা:মিনিট:সেকেন্ড):", @@ -46,7 +44,6 @@ "Sign In": "সাইন ইন", "Register": "নিবন্ধন", "E-mail": "ই-মেইল", - "Google verification code": "গুগল যাচাইকরণ কোড", "Preferences": "পছন্দসমূহ", "preferences_category_player": "প্লেয়ারের পছন্দসমূহ", "preferences_video_loop_label": "সর্বদা লুপ: ", diff --git a/locales/ca.json b/locales/ca.json index 901249ac..4392c2a9 100644 --- a/locales/ca.json +++ b/locales/ca.json @@ -4,7 +4,6 @@ "preferences_quality_label": "Qualitat de vídeo preferida: ", "newest": "més nou", "No": "No", - "Google verification code": "Codi de verificació de Google", "User ID": "ID d'usuari", "Preferences": "Preferències", "Dark mode: ": "Mode fosc: ", @@ -137,7 +136,6 @@ "channel_tab_channels_label": "Canals", "channel_tab_playlists_label": "Llistes de reproducció", "channel_tab_community_label": "Comunitat", - "Invalid TFA code": "Codi TFA no vàlid", "Czech": "Txec", "Default": "Per defecte", "Amharic": "Amàric", @@ -186,7 +184,6 @@ "Released under the AGPLv3 on Github.": "Publicat sota l'AGPLv3 a GitHub.", "Token manager": "Gestor de testimonis", "Watch history": "Historial de reproduccions", - "Cannot change password for Google accounts": "No es pot canviar la contrasenya dels comptes de Google", "Authorize token?": "Autoritzar testimoni?", "Source available here.": "Font disponible aquí.", "Export subscriptions as OPML (for NewPipe & FreeTube)": "Exporta subscripcions com a OPML (per a NewPipe i FreeTube)", @@ -225,7 +222,6 @@ }, "View Reddit comments": "Veure comentaris de Reddit", "Incorrect password": "Contrasenya incorrecta", - "Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "No es pot iniciar la sessió, assegureu-vos que l'autenticació de dos factors (Autenticador o SMS) estigui activada.", "Erroneous CAPTCHA": "CAPTCHA erroni", "CAPTCHA is a required field": "El CAPTCHA és un camp obligatori", "Korean (auto-generated)": "Coreà (generat automàticament)", @@ -272,7 +268,6 @@ "Khmer": "Khmer", "This channel does not exist.": "Aquest canal no existeix.", "Song: ": "Cançó: ", - "Login failed. This may be because two-factor authentication is not turned on for your account.": "S'ha produït un error en iniciar sessió. Això pot ser perquè l'autenticació de dos factors no està activada per al vostre compte.", "channel:`x`": "canal: `x`", "Deleted or invalid channel": "Canal suprimit o no vàlid", "Could not get channel info.": "No s'ha pogut obtenir la informació del canal.", @@ -291,7 +286,6 @@ "User ID is a required field": "L'identificador d'usuari és un camp obligatori", "Password is a required field": "La contrasenya és un camp obligatori", "Wrong username or password": "Nom d'usuari o contrasenya incorrectes", - "Please sign in using 'Log in with Google'": "Si us plau, inicieu la sessió amb 'Inicieu sessió amb Google'", "Password cannot be longer than 55 characters": "La contrasenya no pot tenir més de 55 caràcters", "Invidious Private Feed for `x`": "Feed privat Invidious per a `x`", "generic_views_count": "{{count}} visualització", @@ -436,7 +430,6 @@ "preferences_quality_dash_option_240p": "240p", "preferences_quality_dash_option_720p": "720p", "preferences_quality_dash_option_480p": "480p", - "Log in with Google": "Inicia sessió amb Google", "preferences_quality_dash_option_1440p": "1440p", "Previous page": "Pàgina anterior", "Only show latest video from channel: ": "Mostra només l'últim vídeo del canal: ", @@ -445,7 +438,6 @@ "Import NewPipe subscriptions (.json)": "Importar subscripcions de NewPipe (.json)", "crash_page_you_found_a_bug": "Heu trobat un error a Invidious!", "Subscribe": "Subscriu-me", - "Quota exceeded, try again in a few hours": "S'ha superat la quota, torna-ho a provar d'aquí a unes hores", "generic_count_days": "{{count}} dia", "generic_count_days_plural": "{{count}} dies", "Trending": "Tendència", @@ -483,5 +475,6 @@ "Engagement: ": "Atracció: ", "Redirect homepage to feed: ": "Redirigeix la pàgina d'inici al feed: ", "Standard YouTube license": "Llicència estàndard de YouTube", - "Download is disabled": "Les baixades s'han inhabilitat" + "Download is disabled": "Les baixades s'han inhabilitat", + "Import YouTube playlist (.csv)": "Importar llista de reproducció de YouTube (.csv)" } diff --git a/locales/cs.json b/locales/cs.json index 8e656827..73ed960d 100644 --- a/locales/cs.json +++ b/locales/cs.json @@ -14,7 +14,6 @@ "Clear watch history?": "Smazat historii?", "New password": "Nové heslo", "New passwords must match": "Hesla se musí shodovat", - "Cannot change password for Google accounts": "Nelze změnit heslo pro účty Google", "Authorize token?": "Autorizovat token?", "Authorize token for `x`?": "Autorizovat token pro `x`?", "Yes": "Ano", @@ -37,7 +36,6 @@ "source": "zdrojový kód", "Log in": "Přihlásit se", "Log in/register": "Přihlásit se/vytvořit účet", - "Log in with Google": "Přihlásit se s Googlem", "User ID": "ID uživatele", "Password": "Heslo", "Time (h:mm:ss):": "Čas (h:mm:ss):", @@ -46,7 +44,6 @@ "Sign In": "Přihlásit se", "Register": "Vytvořit účet", "E-mail": "E-mail", - "Google verification code": "Verifikační číslo Google", "Preferences": "Nastavení", "preferences_category_player": "Nastavení přehravače", "preferences_video_loop_label": "Vždy opakovat: ", @@ -335,7 +332,6 @@ "preferences_quality_dash_option_1440p": "1440p", "invidious": "Invidious", "View more comments on Reddit": "Zobrazit více komentářů na Redditu", - "Invalid TFA code": "Nesprávný TFA kód", "generic_playlists_count_0": "{{count}} playlist", "generic_playlists_count_1": "{{count}} playlisty", "generic_playlists_count_2": "{{count}} playlistů", @@ -349,7 +345,6 @@ "subscriptions_unseen_notifs_count_1": "{{count}} nezobrazená oznámení", "subscriptions_unseen_notifs_count_2": "{{count}} nezobrazených oznámení", "Show replies": "Zobrazit odpovědi", - "Quota exceeded, try again in a few hours": "Kvóta překročena, zkuste to znovu za pár hodin", "Password cannot be longer than 55 characters": "Heslo nesmí být delší než 55 znaků", "comments_view_x_replies_0": "Zobrazit {{count}} odpověď", "comments_view_x_replies_1": "Zobrazit {{count}} odpovědi", @@ -433,7 +428,6 @@ "View YouTube comments": "Zobrazit YouTube komentáře", "Blacklisted regions: ": "Oblasti na černé listině: ", "Wrong username or password": "Nesprávné uživatelské jméno nebo heslo", - "Please sign in using 'Log in with Google'": "Přihlaste se prosím pomocí Googlu", "Password cannot be empty": "Heslo nemůže být prázné", "preferences_category_misc": "Různá nastavení", "preferences_show_nick_label": "Zobrazit přezdívku na vrchu: ", @@ -452,8 +446,6 @@ "([^.,0-9]|^)1([^.,0-9]|$)": "Zobrazit `x` komentář", "": "Zobrazit `x` komentářů" }, - "Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Nepodařilo se přihlásit, ujistěte se, že je povoleno dvoufázové ověřování (autentifikátor nebo SMS).", - "Login failed. This may be because two-factor authentication is not turned on for your account.": "Přihlášení selhalo. Toto se může stát, když není na vašem účtu povolené dvoufázové ověřování.", "Could not get channel info.": "Nepodařilo se získat informace o kanálu.", "Could not fetch comments": "Nepodařilo se získat komentáře", "Could not create mix.": "Nepodařilo se vytvořit mix.", diff --git a/locales/da.json b/locales/da.json index 2bee6c80..16607546 100644 --- a/locales/da.json +++ b/locales/da.json @@ -14,7 +14,6 @@ "Clear watch history?": "Ryd afspilningshistorik?", "New password": "Nyt kodeord", "New passwords must match": "Nye kodeord skal matche", - "Cannot change password for Google accounts": "Kan ikke skifte kodeord til Google-konti", "Authorize token?": "Godkend token?", "Authorize token for `x`?": "Godkend token til `x`?", "Yes": "Ja", @@ -37,7 +36,6 @@ "source": "kilde", "Log in": "Log på", "Log in/register": "Log på/registrer", - "Log in with Google": "Log på med Google", "User ID": "Bruger ID", "Password": "Kodeord", "Time (h:mm:ss):": "Tid (t:mm:ss):", @@ -46,7 +44,6 @@ "Sign In": "Log ind", "Register": "Registrer", "E-mail": "E-mail", - "Google verification code": "Google-verifikationskode", "Preferences": "Præferencer", "preferences_category_player": "Afspillerindstillinger", "preferences_video_loop_label": "Altid gentag: ", @@ -159,17 +156,12 @@ "Hide replies": "Skjul svar", "Show replies": "Vis svar", "Incorrect password": "Forkert adgangskode", - "Quota exceeded, try again in a few hours": "Kvota overskredet, prøv igen om et par timer", - "Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Login fejlet, tjek at totrinsbekræftelse (Authenticator eller SMS) er slået til.", - "Invalid TFA code": "Ugyldig TFA kode", - "Login failed. This may be because two-factor authentication is not turned on for your account.": "Login fejlede. Dette kan skyldes, at to-faktor autentificering ikke er aktiveret for din konto.", "Wrong answer": "Forkert svar", "Erroneous CAPTCHA": "Fejlagtig CAPTCHA", "CAPTCHA is a required field": "CAPTCHA er et obligatorisk felt", "User ID is a required field": "Bruger ID er et krævet felt", "Password is a required field": "Adgangskode er et obligatorisk felt", "Wrong username or password": "Forkert brugernavn eller adgangskode", - "Please sign in using 'Log in with Google'": "Log ind via 'Log ind med Google'", "Password cannot be empty": "Adgangskoden må ikke være tom", "Password cannot be longer than 55 characters": "Adgangskoden må ikke være længere end 55 tegn", "Please log in": "Venligst log ind", diff --git a/locales/de.json b/locales/de.json index 3c1120c0..66f2ae6f 100644 --- a/locales/de.json +++ b/locales/de.json @@ -14,7 +14,6 @@ "Clear watch history?": "Verlauf löschen?", "New password": "Neues Passwort", "New passwords must match": "Neue Passwörter müssen übereinstimmen", - "Cannot change password for Google accounts": "Ich kann das Passwort deines Google Kontos nicht ändern", "Authorize token?": "Token autorisieren?", "Authorize token for `x`?": "Token für `x` autorisieren?", "Yes": "Ja", @@ -37,7 +36,6 @@ "source": "Quelle", "Log in": "Anmelden", "Log in/register": "Anmelden/registrieren", - "Log in with Google": "Mit Google anmelden", "User ID": "Benutzer-ID", "Password": "Passwort", "Time (h:mm:ss):": "Zeit (h:mm:ss):", @@ -46,7 +44,6 @@ "Sign In": "Anmelden", "Register": "Registrieren", "E-mail": "E-Mail", - "Google verification code": "Google-Bestätigungscode", "Preferences": "Einstellungen", "preferences_category_player": "Wiedergabeeinstellungen", "preferences_video_loop_label": "Immer wiederholen: ", @@ -164,17 +161,12 @@ "Hide replies": "Antworten verstecken", "Show replies": "Antworten anzeigen", "Incorrect password": "Falsches Passwort", - "Quota exceeded, try again in a few hours": "Kontingent überschritten, versuche es in ein paar Stunden erneut", - "Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Anmeldung nicht möglich, stellen Sie sicher, dass die Zwei-Faktor-Authentisierung (Authenticator oder SMS) aktiviert ist.", - "Invalid TFA code": "Ungültiger TFA Code", - "Login failed. This may be because two-factor authentication is not turned on for your account.": "Die Anmeldung ist fehlgeschlagen. Dies kann daran liegen, dass die Zwei-Faktor-Authentisierung für Ihr Konto nicht aktiviert ist.", "Wrong answer": "Ungültige Antwort", "Erroneous CAPTCHA": "Ungültiges CAPTCHA", "CAPTCHA is a required field": "CAPTCHA ist eine erforderliche Eingabe", "User ID is a required field": "Benutzer ID ist eine erforderliche Eingabe", "Password is a required field": "Passwort ist eine erforderliche Eingabe", "Wrong username or password": "Ungültiger Benutzername oder Passwort", - "Please sign in using 'Log in with Google'": "Bitte melden Sie sich mit „Mit Google anmelden“ an", "Password cannot be empty": "Passwort darf nicht leer sein", "Password cannot be longer than 55 characters": "Passwort darf nicht länger als 55 Zeichen sein", "Please log in": "Bitte anmelden", @@ -483,5 +475,6 @@ "Channel Sponsor": "Kanalsponsor", "Standard YouTube license": "Standard YouTube-Lizenz", "Song: ": "Musik: ", - "Download is disabled": "Herunterladen ist deaktiviert" + "Download is disabled": "Herunterladen ist deaktiviert", + "Import YouTube playlist (.csv)": "YouTube Playlist Importieren (.csv)" } diff --git a/locales/el.json b/locales/el.json index 8d0c84dd..13cff649 100644 --- a/locales/el.json +++ b/locales/el.json @@ -14,7 +14,6 @@ "Clear watch history?": "Διαγραφή ιστορικού προβολής;", "New password": "Νέος κωδικός πρόσβασης", "New passwords must match": "Οι νέοι κωδικοί πρόσβασης πρέπει να ταιριάζουν", - "Cannot change password for Google accounts": "Δεν επιτρέπεται η αλλαγή κωδικού πρόσβασης λογαριασμών Google", "Authorize token?": "Εξουσιοδότηση διασύνδεσης;", "Authorize token for `x`?": "Εξουσιοδότηση διασύνδεσης με `x`;", "Yes": "Ναι", @@ -37,7 +36,6 @@ "source": "πηγή", "Log in": "Σύνδεση", "Log in/register": "Σύνδεση/εγγραφή", - "Log in with Google": "Σύνδεση με Google", "User ID": "Ταυτότητα χρήστη", "Password": "Κωδικός πρόσβασης", "Time (h:mm:ss):": "Ώρα (ω:λλ:δδ):", @@ -46,7 +44,6 @@ "Sign In": "Σύνδεση", "Register": "Εγγραφή", "E-mail": "Ηλεκτρονικό ταχυδρομείο", - "Google verification code": "Κωδικός επαλήθευσης Google", "Preferences": "Προτιμήσεις", "preferences_category_player": "Προτιμήσεις αναπαραγωγής", "preferences_video_loop_label": "Αυτόματη επανάληψη: ", @@ -155,17 +152,12 @@ "Hide replies": "Απόκρυψη απαντήσεων", "Show replies": "Προβολή απαντήσεων", "Incorrect password": "Λανθασμένος κωδικός πρόσβασης", - "Quota exceeded, try again in a few hours": "Έχετε υπερβεί το όριο προσπαθειών, δοκιμάστε ξανα σε λίγες ώρες", - "Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Αδυναμία σύνδεσης, βεβαιωθείτε πως ο έλεγχος ταυτότητας δύο παραγόντων (με Authenticator ή SMS) είναι ενεργοποιημένος.", - "Invalid TFA code": "Μη έγκυρος κωδικός ελέγχου ταυτότητας δύο παραγόντων", - "Login failed. This may be because two-factor authentication is not turned on for your account.": "Αποτυχία σύνδεσης. Ίσως ευθύνεται η έλλειψη ελέγχου ταυτότητας δύο παραγόντων για το λογαριασμό σας.", "Wrong answer": "Λανθασμένη απάντηση", "Erroneous CAPTCHA": "Λανθασμένο CAPTCHA", "CAPTCHA is a required field": "Το CAPTCHA είναι απαιτούμενο πεδίο", "User ID is a required field": "Η ταυτότητα χρήστη είναι απαιτούμενο πεδίο", "Password is a required field": "Ο κωδικός πρόσβασης είναι απαιτούμενο πεδίο", "Wrong username or password": "Λανθασμένο όνομα χρήστη ή κωδικός πρόσβασης", - "Please sign in using 'Log in with Google'": "Συνδεθείτε με την επιλογή 'Σύνδεση με Google'", "Password cannot be empty": "Ο κωδικός πρόσβασης δεν γίνεται να είναι κενός", "Password cannot be longer than 55 characters": "Ο κωδικός πρόσβασης δεν γίνεται να υπερβαίνει τους 55 χαρακτήρες", "Please log in": "Συνδεθείτε", diff --git a/locales/en-US.json b/locales/en-US.json index 96b6799b..e13ba968 100644 --- a/locales/en-US.json +++ b/locales/en-US.json @@ -24,7 +24,6 @@ "Clear watch history?": "Clear watch history?", "New password": "New password", "New passwords must match": "New passwords must match", - "Cannot change password for Google accounts": "Cannot change password for Google accounts", "Authorize token?": "Authorize token?", "Authorize token for `x`?": "Authorize token for `x`?", "Yes": "Yes", @@ -48,7 +47,6 @@ "source": "source", "Log in": "Log in", "Log in/register": "Log in/register", - "Log in with Google": "Log in with Google", "User ID": "User ID", "Password": "Password", "Time (h:mm:ss):": "Time (h:mm:ss):", @@ -57,7 +55,6 @@ "Sign In": "Sign In", "Register": "Register", "E-mail": "E-mail", - "Google verification code": "Google verification code", "Preferences": "Preferences", "preferences_category_player": "Player preferences", "preferences_video_loop_label": "Always loop: ", @@ -208,17 +205,12 @@ "Hide replies": "Hide replies", "Show replies": "Show replies", "Incorrect password": "Incorrect password", - "Quota exceeded, try again in a few hours": "Quota exceeded, try again in a few hours", - "Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.", - "Invalid TFA code": "Invalid TFA code", - "Login failed. This may be because two-factor authentication is not turned on for your account.": "Login failed. This may be because two-factor authentication is not turned on for your account.", "Wrong answer": "Wrong answer", "Erroneous CAPTCHA": "Erroneous CAPTCHA", "CAPTCHA is a required field": "CAPTCHA is a required field", "User ID is a required field": "User ID is a required field", "Password is a required field": "Password is a required field", "Wrong username or password": "Wrong username or password", - "Please sign in using 'Log in with Google'": "Please sign in using 'Log in with Google'", "Password cannot be empty": "Password cannot be empty", "Password cannot be longer than 55 characters": "Password cannot be longer than 55 characters", "Please log in": "Please log in", diff --git a/locales/eo.json b/locales/eo.json index 4e789390..a4b46bef 100644 --- a/locales/eo.json +++ b/locales/eo.json @@ -14,7 +14,6 @@ "Clear watch history?": "Ĉu forigi vidohistorion?", "New password": "Nova pasvorto", "New passwords must match": "Novaj pasvortoj devas kongrui", - "Cannot change password for Google accounts": "Ne eblas ŝanĝi pasvorton por kontoj de Google", "Authorize token?": "Ĉu rajtigi ĵetonon?", "Authorize token for `x`?": "Ĉu rajtigi ĵetonon por `x`?", "Yes": "Jes", @@ -37,7 +36,6 @@ "source": "fonto", "Log in": "Ensaluti", "Log in/register": "Ensaluti/Registriĝi", - "Log in with Google": "Ensaluti al Google", "User ID": "Uzula identigilo", "Password": "Pasvorto", "Time (h:mm:ss):": "Horo (h:mm:ss):", @@ -46,7 +44,6 @@ "Sign In": "Ensaluti", "Register": "Registriĝi", "E-mail": "Retpoŝto", - "Google verification code": "Kontrolkodo de Google", "Preferences": "Agordoj", "preferences_category_player": "Spektilaj agordoj", "preferences_video_loop_label": "Ĉiam ripeti: ", @@ -164,17 +161,12 @@ "Hide replies": "Kaŝi respondojn", "Show replies": "Montri respondojn", "Incorrect password": "Malbona pasvorto", - "Quota exceeded, try again in a few hours": "Kvoto transpasita, provu denove post iuj horoj", - "Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Ne povas ensaluti, certigu, ke dufaktora aŭtentigo (Authenticator aŭ SMS) estas ebligita.", - "Invalid TFA code": "Nevalida TFA-kodo", - "Login failed. This may be because two-factor authentication is not turned on for your account.": "Ensalutado fiaskis. Eble ĉar la dufaktora aŭtentigo estas malebligita en via konto.", "Wrong answer": "Nevalida respondo", "Erroneous CAPTCHA": "Nevalida CAPTCHA", "CAPTCHA is a required field": "CAPTCHA estas deviga kampo", "User ID is a required field": "Uzula identigilo estas deviga kampo", "Password is a required field": "Pasvorto estas deviga kampo", "Wrong username or password": "Nevalida uzantnomo aŭ pasvorto", - "Please sign in using 'Log in with Google'": "Bonvolu ensaluti per 'Ensaluti per Google'", "Password cannot be empty": "Pasvorto ne povas esti malplena", "Password cannot be longer than 55 characters": "Pasvorto ne povas esti pli longa ol 55 signoj", "Please log in": "Bonvolu ensaluti", diff --git a/locales/es.json b/locales/es.json index 0425ed68..b3103a25 100644 --- a/locales/es.json +++ b/locales/es.json @@ -14,7 +14,6 @@ "Clear watch history?": "¿Quiere borrar el historial de reproducción?", "New password": "Nueva contraseña", "New passwords must match": "Las nuevas contraseñas deben coincidir", - "Cannot change password for Google accounts": "No se puede cambiar la contraseña de la cuenta de Google", "Authorize token?": "¿Autorizar el token?", "Authorize token for `x`?": "¿Autorizar el token para `x`?", "Yes": "Sí", @@ -37,7 +36,6 @@ "source": "código fuente", "Log in": "Iniciar sesión", "Log in/register": "Iniciar sesión/Registrarse", - "Log in with Google": "Iniciar sesión en Google", "User ID": "Nombre", "Password": "Contraseña", "Time (h:mm:ss):": "Hora (h:mm:ss):", @@ -46,7 +44,6 @@ "Sign In": "Iniciar sesión", "Register": "Registrarse", "E-mail": "Correo", - "Google verification code": "Código de verificación de Google", "Preferences": "Preferencias", "preferences_category_player": "Preferencias del reproductor", "preferences_video_loop_label": "Repetir siempre: ", @@ -164,17 +161,12 @@ "Hide replies": "Ocultar las respuestas", "Show replies": "Mostrar las respuestas", "Incorrect password": "Contraseña incorrecta", - "Quota exceeded, try again in a few hours": "Cuota excedida, prueba otra vez en unas horas", - "Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "No se puede iniciar sesión, asegúrese de que la autentificación de dos factores (autentificador o SMS) esté habilitada.", - "Invalid TFA code": "Código TFA no válido", - "Login failed. This may be because two-factor authentication is not turned on for your account.": "Error de inicio de sesion. Puede deberse a que la autentificación de dos factores no está habilitada en su cuenta.", "Wrong answer": "Respuesta no válida", "Erroneous CAPTCHA": "CAPTCHA no válido", "CAPTCHA is a required field": "El CAPTCHA es un campo obligatorio", "User ID is a required field": "El nombre es un campo obligatorio", "Password is a required field": "La contraseña es un campo obligatorio", "Wrong username or password": "Nombre o contraseña incorrecto", - "Please sign in using 'Log in with Google'": "Inicie sesión con «Iniciar sesión con Google»", "Password cannot be empty": "La contraseña no puede estar en blanco", "Password cannot be longer than 55 characters": "La contraseña no debe tener más de 55 caracteres", "Please log in": "Inicie sesión, por favor", @@ -398,8 +390,8 @@ "search_filters_features_option_three_sixty": "360°", "videoinfo_watch_on_youTube": "Ver en YouTube", "preferences_save_player_pos_label": "Guardar posición de reproducción: ", - "generic_views_count": "{{count}} vista", - "generic_views_count_plural": "{{count}} vistas", + "generic_views_count": "{{count}} visualización", + "generic_views_count_plural": "{{count}} visualizaciones", "generic_subscribers_count": "{{count}} suscriptor", "generic_subscribers_count_plural": "{{count}} suscriptores", "generic_subscriptions_count": "{{count}} suscripción", @@ -415,7 +407,7 @@ "generic_playlists_count": "{{count}} lista de reproducción", "generic_playlists_count_plural": "{{count}} listas de reproducciones", "generic_videos_count": "{{count}} video", - "generic_videos_count_plural": "{{count}} videos", + "generic_videos_count_plural": "{{count}} video", "generic_count_months": "{{count}} mes", "generic_count_months_plural": "{{count}} meses", "comments_points_count": "{{count}} punto", diff --git a/locales/et.json b/locales/et.json index 74338aba..7f652810 100644 --- a/locales/et.json +++ b/locales/et.json @@ -25,7 +25,6 @@ "Clear watch history?": "Kustuta vaatamiste ajalugu?", "New password": "Uus salasõna", "New passwords must match": "Uued salasõnad peavad ühtima", - "Cannot change password for Google accounts": "Google'i kasutaja salasõna ei saa muuta", "Import and Export Data": "Impordi ja ekspordi andmed", "Import": "Impordi", "Import YouTube subscriptions": "Impordi tellimused Youtube'ist/OPML-ist", @@ -38,7 +37,6 @@ "History": "Ajalugu", "JavaScript license information": "JavaScripti litsentsi info", "source": "allikas", - "Log in with Google": "Logi sisse Google'iga", "User ID": "Kasutada ID", "Password": "Salasõna", "Time (h:mm:ss):": "Aeg (h:mm:ss):", @@ -118,12 +116,10 @@ "Hide replies": "Peida vastused", "Show replies": "Näita vastuseid", "Incorrect password": "Vale salasõna", - "Login failed. This may be because two-factor authentication is not turned on for your account.": "Sisselogimine ei õnnestunud. Asi võib olla selles, et", "Wrong answer": "Vale vastus", "User ID is a required field": "Kasutaja ID on kohustuslik väli", "Password is a required field": "Salasõna on kohustuslik väli", "Wrong username or password": "Vale kasutajanimi või salasõna", - "Please sign in using 'Log in with Google'": "Palun kasutage 'Logi sisse Google'iga'", "Password cannot be longer than 55 characters": "Salasõna ei tohi olla pikem kui 55 tähemärki", "Password cannot be empty": "Salasõna ei tohi olla tühi", "Please log in": "Palun logige sisse", @@ -290,8 +286,6 @@ "": "Vaata `x` kommentaare" }, "Khmer": "Khmeeri", - "Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Sisselogimine ei õnnestunud. Kontrollige, kas two-factor authentication (Authenticator või SMS) on sisselülitatud.", - "Invalid TFA code": "Vale TFA-kood", "Bosnian": "Bosnia", "Corsican": "Korsika", "Javanese": "Jaava", diff --git a/locales/eu.json b/locales/eu.json index 9e093a52..8b365270 100644 --- a/locales/eu.json +++ b/locales/eu.json @@ -14,7 +14,6 @@ "Clear watch history?": "Garbitu ikusitakoen historia?", "New password": "Pasahitz berria", "New passwords must match": "Pasahitza berriek bat egin behar dute", - "Cannot change password for Google accounts": "Ezin da pasahitza aldatu Google kontuetan", "Authorize token?": "Baimendu tokena?", "Yes": "Bai", "No": "Ez", @@ -36,7 +35,6 @@ "source": "iturburua", "Log in": "Saioa hasi", "Log in/register": "Hasi saioa / Eman izena", - "Log in with Google": "Hasi saioa Googlekin", "User ID": "Erabiltzaile IDa", "Password": "Pasahitza", "Time (h:mm:ss):": "Denbora (h:mm:ss):", @@ -93,7 +91,6 @@ "Import/export data": "Inportatu/exportatu data", "Create playlist": "Zerrenda sortu", "Hi! Looks like you have JavaScript turned off. Click here to view comments, keep in mind they may take a bit longer to load.": "Aditu! JavaScript itzalita dakazula ematen du. Hemen sakatu iruzkinak ikusteko. Denbora luza leikeela kontuan hartu.", - "Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Ezinezkoa izena eman. Ziurtatu berresteko bi faktoreak (Authenticator edo SMS) piztuta daudela.", "generic_views_count": "{{count}}ikusia", "generic_views_count_plural": "{{count}}ikusiak", "generic_playlists_count": "{{count}}zerrenda", @@ -136,7 +133,6 @@ "License: ": "Lizentzia: ", "Family friendly? ": "Adeikorra familiarekin? ", "Wilson score: ": "Wilsonen puntuazioa: ", - "Quota exceeded, try again in a few hours": "Kuota gaindituta, ordu batzuren bueltan berriro saiatu", "comments_view_x_replies": "{{count}} erantzuna ikusi", "comments_view_x_replies_plural": "{{count}} erantzunak ikusi", "Catalan": "Katalaniera", @@ -204,7 +200,6 @@ "preferences_category_data": "Dataren lehentasunak", "preferences_default_home_label": "Homepage lehenetsia: ", "preferences_automatic_instance_redirect_label": "berbideratze adibide automatikoa (atzera egin berbideratzeko: invidious.io) ", - "Please sign in using 'Log in with Google'": "'Log in Googlerekin' erabili", "`x` uploaded a video": "' x'(e)k bideo bat igo du", "published - reverse": "argitaratuta - alderantziz", "Could not get channel info.": "Kanalaren adierazpena ezin lortu.", @@ -220,7 +215,6 @@ "Premieres in `x`": "'x'eko estrenaldiak", "Delete playlist `x`?": "'x' zerrenda ezabatu nahi?", "Token is expired, please try again": "Token kadukatua, saiatu berriro", - "Invalid TFA code": "TFA kodea ez da zuzena", "CAPTCHA enabled: ": "CAPTCHA gaitu: ", "Released under the AGPLv3 on Github.": "GitHubeko AGPLv3pean argitaratuta.", "channel:`x`": "Kanal: 'x'", @@ -242,9 +236,7 @@ "preferences_category_subscription": "Harpidetzaren lehentasunak", "Hidden field \"challenge\" is a required field": "\"challenge\" eremu ezkutua beharrezkoa da", "German": "Alemaniarra", - "Login failed. This may be because two-factor authentication is not turned on for your account.": "Ezin izena eman. Izan leike zure konturako berresteko bi faktoreak piztuta ez daudela.", "View YouTube comments": "YouTubeko iruzkinak ikusi", - "Google verification code": "Googleren berresteko kodea", "`x` is live": "'x' bizirik darrai", "Password cannot be empty": "Pasahitza ezin da hutsik utzi", "preferences_video_loop_label": "Beti begiztatu: ", diff --git a/locales/fa.json b/locales/fa.json index 29a0c527..9b6c625d 100644 --- a/locales/fa.json +++ b/locales/fa.json @@ -19,7 +19,6 @@ "Clear watch history?": "پاک کردن تاریخچه نمایش؟", "New password": "گذرواژه تازه", "New passwords must match": "گذارواژه های تازه باید باهم همخوانی داشته باشند", - "Cannot change password for Google accounts": "نمیتوان گذرواژه را برای حساب های کاربری گوگل تغییر داد", "Authorize token?": "توکن دسترسی؟", "Authorize token for `x`?": "توکن دسترسی برای `x`؟", "Yes": "بله", @@ -42,7 +41,6 @@ "source": "منبع", "Log in": "ورود", "Log in/register": "ورود/ثبت نام", - "Log in with Google": "ورود با گوگل", "User ID": "شناسه کاربری", "Password": "گذرواژه", "Time (h:mm:ss):": "زمان (h:mm:ss):", @@ -51,7 +49,6 @@ "Sign In": "ورود", "Register": "ثبت نام", "E-mail": "ایمیل", - "Google verification code": "کد تایید گوگل", "Preferences": "ترجیحات", "preferences_category_player": "ترجیحات نمایش‌دهنده", "preferences_video_loop_label": "همواره ویدئو را بازپخش کن ", @@ -171,17 +168,12 @@ "Hide replies": "مخفی کردن پاسخ ها", "Show replies": "نمایش پاسخ ها", "Incorrect password": "گذرواژه نا درست", - "Quota exceeded, try again in a few hours": "سهمیه بیشتر شده است، چند ساعت بعد دوباره تلاش کنید", - "Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "قادر به ورود نیستید، مطمئن شوید احراز تایید-دو‌مرحله (Authenticator یا پیام‌کوتاه) خاموش باشد.", - "Invalid TFA code": "کد TFA نادرست است", - "Login failed. This may be because two-factor authentication is not turned on for your account.": "ورود با خطا مواجه شد. این ممکن است به خاطر احراز تایید-دو‌مرحله باشد که برای حساب کاربری شما فعال نشده است.", "Wrong answer": "پاسخ غلط", "Erroneous CAPTCHA": "CAPTCHA نا درست", "CAPTCHA is a required field": "CAPTCHA یک فیلد ضروری است", "User ID is a required field": "شناسه کاربری یک فیلد ضروری است", "Password is a required field": "گذرواژه یک فیلد ضروری است", "Wrong username or password": "نام کاربری یا گذرواژه غلط است", - "Please sign in using 'Log in with Google'": "لطفا با استفاده از 'ورود توسط گوگل' وارد شوید", "Password cannot be empty": "گذرواژه نمیتواند خالی باشد", "Password cannot be longer than 55 characters": "گذر واژه نمیتواند از ۵۵ کاراکتر بیشتر باشد", "Please log in": "لطفا وارد شوید", diff --git a/locales/fi.json b/locales/fi.json index 366a2739..5d8578a5 100644 --- a/locales/fi.json +++ b/locales/fi.json @@ -14,7 +14,6 @@ "Clear watch history?": "Tyhjennä katseluhistoria?", "New password": "Uusi salasana", "New passwords must match": "Uusien salasanojen täytyy täsmätä", - "Cannot change password for Google accounts": "Google-tilien salasanaa ei voi vaihtaa", "Authorize token?": "Valuutetaanko tunnus?", "Authorize token for `x`?": "Valtuutetaanko tunnus `x`:lle?", "Yes": "Kyllä", @@ -37,7 +36,6 @@ "source": "lähde", "Log in": "Kirjaudu sisään", "Log in/register": "Kirjaudu sisään/rekisteröidy", - "Log in with Google": "Kirjaudu sisään Googlella", "User ID": "Käyttäjätunnus", "Password": "Salasana", "Time (h:mm:ss):": "Aika (h:mm:ss):", @@ -46,7 +44,6 @@ "Sign In": "Kirjaudu sisään", "Register": "Rekisteröidy", "E-mail": "Sähköposti", - "Google verification code": "Google-vahvistuskoodi", "Preferences": "Asetukset", "preferences_category_player": "Soittimen asetukset", "preferences_video_loop_label": "Toista jatkuvasti aina: ", @@ -163,17 +160,12 @@ "Hide replies": "Piilota vastaukset", "Show replies": "Näytä vastaukset", "Incorrect password": "Väärä salasana", - "Quota exceeded, try again in a few hours": "Kiintiö ylitetty, yritä parin tunnin kuluttua uudestaan", - "Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Sisäänkirjautuminen epäonnistui. Varmista, että kaksivaiheinen tunnistautuminen (Authenticator tai tekstiviesti) on käytössä.", - "Invalid TFA code": "Virheellinen turvakoodi", - "Login failed. This may be because two-factor authentication is not turned on for your account.": "Sisäänkirjautuminen epäonnistui. Tämä voi johtua siitä, että kaksivaiheinen tunnistautuminen on pois käytöstä tunnuksellasi.", "Wrong answer": "Väärä vastaus", "Erroneous CAPTCHA": "Virheellinen CAPTCHA", "CAPTCHA is a required field": "CAPTCHA-kenttä vaaditaan", "User ID is a required field": "Käyttäjätunnus vaaditaan", "Password is a required field": "Salasana vaaditaan", "Wrong username or password": "Väärä käyttäjänimi tai salasana", - "Please sign in using 'Log in with Google'": "Ole hyvä ja kirjaudu sisään Google-tunnuksella", "Password cannot be empty": "Salasana ei voi olla tyhjä", "Password cannot be longer than 55 characters": "Salasana ei voi olla yli 55 merkkiä pitkä", "Please log in": "Kirjaudu sisään, ole hyvä", diff --git a/locales/fr.json b/locales/fr.json index bb40916b..d2607a49 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -24,7 +24,6 @@ "Clear watch history?": "Êtes-vous sûr de vouloir supprimer l'historique des vidéos regardées ?", "New password": "Nouveau mot de passe", "New passwords must match": "Les nouveaux mots de passe doivent correspondre", - "Cannot change password for Google accounts": "Le mot de passe d'un compte Google ne peut pas être changé depuis Invidious", "Authorize token?": "Autoriser le token ?", "Authorize token for `x`?": "Autoriser le token pour `x` ?", "Yes": "Oui", @@ -47,7 +46,6 @@ "source": "source", "Log in": "Se connecter", "Log in/register": "Se connecter/S'inscrire", - "Log in with Google": "Se connecter avec Google", "User ID": "Identifiant utilisateur", "Password": "Mot de passe", "Time (h:mm:ss):": "Heure (h:mm:ss) :", @@ -56,7 +54,6 @@ "Sign In": "Se connecter", "Register": "S'inscrire", "E-mail": "E-mail", - "Google verification code": "Code de vérification Google", "Preferences": "Préférences", "preferences_category_player": "Préférences du lecteur", "preferences_video_loop_label": "Lire en boucle : ", @@ -179,17 +176,12 @@ "Hide replies": "Masquer les réponses", "Show replies": "Afficher les réponses", "Incorrect password": "Mot de passe incorrect", - "Quota exceeded, try again in a few hours": "Nombre de tentatives de connexion dépassé, réessayez dans quelques heures", - "Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Impossible de se connecter, si après plusieurs tentative vous ne parvenez toujours pas à vous connecter, assurez-vous que l'authentification à deux facteurs (Authenticator ou SMS) est activée.", - "Invalid TFA code": "Code d'authentification à deux facteurs invalide", - "Login failed. This may be because two-factor authentication is not turned on for your account.": "La connexion a échoué. Cela peut être dû au fait que l'authentification à deux facteurs n'est pas activée sur votre compte.", "Wrong answer": "Réponse invalide", "Erroneous CAPTCHA": "CAPTCHA invalide", "CAPTCHA is a required field": "Veuillez entrer un CAPTCHA", "User ID is a required field": "Veuillez entrer un Identifiant Utilisateur", "Password is a required field": "Veuillez entrer un Mot de passe", "Wrong username or password": "Nom d'utilisateur ou mot de passe invalide", - "Please sign in using 'Log in with Google'": "Veuillez vous connecter en utilisant \"Se connecter avec Google\"", "Password cannot be empty": "Le mot de passe ne peut pas être vide", "Password cannot be longer than 55 characters": "Le mot de passe ne doit pas comporter plus de 55 caractères", "Please log in": "Veuillez vous connecter", @@ -473,7 +465,7 @@ "search_filters_features_option_vr180": "VR180", "search_filters_duration_option_none": "Toutes les durées", "error_video_not_in_playlist": "La vidéo demandée n'existe pas dans cette liste de lecture. Cliquez ici pour retourner à la liste de lecture.", - "channel_tab_shorts_label": "Clips", + "channel_tab_shorts_label": "Vidéos courtes", "channel_tab_streams_label": "Vidéos en direct", "channel_tab_playlists_label": "Listes de lecture", "channel_tab_channels_label": "Chaînes", @@ -483,5 +475,6 @@ "Standard YouTube license": "Licence YouTube Standard", "Music in this video": "Musique dans cette vidéo", "Channel Sponsor": "Soutien de la chaîne", - "Download is disabled": "Le téléchargement est désactivé" + "Download is disabled": "Le téléchargement est désactivé", + "Import YouTube playlist (.csv)": "Importer des listes de lecture de Youtube (.csv)" } diff --git a/locales/he.json b/locales/he.json index ab42313b..6fee93b2 100644 --- a/locales/he.json +++ b/locales/he.json @@ -14,7 +14,6 @@ "Clear watch history?": "לנקות את היסטוריית הצפייה?", "New password": "סיסמה חדשה", "New passwords must match": "על הסיסמאות החדשות להתאים", - "Cannot change password for Google accounts": "לא ניתן לשנות את הסיסמה לחשבונות Google", "Authorize token?": "לאשר את האסימון?", "Authorize token for `x`?": "האם לאשר את האסימון עבור `x`?", "Yes": "כן", @@ -37,7 +36,6 @@ "source": "source", "Log in": "כניסה", "Log in/register": "כניסה/הרשמה", - "Log in with Google": "כניסה עם Google", "User ID": "שם משתמש", "Password": "סיסמה", "Time (h:mm:ss):": "זמן (h:mm:ss):", @@ -46,7 +44,6 @@ "Sign In": "התחברות", "Register": "הרשמה", "E-mail": "דוא״ל", - "Google verification code": "קוד האימות של Google", "Preferences": "העדפות", "preferences_category_player": "העדפות הנגן", "preferences_autoplay_label": "ניגון אוטומטי: ", @@ -137,7 +134,6 @@ "User ID is a required field": "חובה למלא את שדה שם המשתמש", "Password is a required field": "חובה למלא את שדה הסיסמה", "Wrong username or password": "שם משתמש שגוי או סיסמה שגויה", - "Please sign in using 'Log in with Google'": "נא להתחבר בעזרת \"התחברות עם Google\"", "Password cannot be longer than 55 characters": "על אורך הסיסמה להיות 55 תווים לכל היותר", "Please log in": "נא להתחבר", "channel:`x`": "ערוץ:`x`", diff --git a/locales/hi.json b/locales/hi.json index 41335266..dcb7294d 100644 --- a/locales/hi.json +++ b/locales/hi.json @@ -4,7 +4,6 @@ "No": "नहीं", "Export subscriptions as OPML (for NewPipe & FreeTube)": "OPML के रूप में सदस्यताएँ निर्यात करें (NewPipe और FreeTube के लिए)", "Log in/register": "लॉग-इन/पंजीकृत करें", - "Log in with Google": "Google के साथ लॉग-इन करें", "preferences_autoplay_label": "अपने आप चलाने की सुविधा: ", "preferences_dark_mode_label": "थीम: ", "preferences_default_home_label": "डिफ़ॉल्ट मुखपृष्ठ: ", @@ -58,7 +57,6 @@ "Clear watch history?": "देखने का इतिहास मिटाएँ?", "New password": "नया पासवर्ड", "New passwords must match": "पासवर्ड्स को मेल खाना होगा", - "Cannot change password for Google accounts": "Google खातों के लिए पासवर्ड नहीं बदल सकते", "Authorize token?": "टोकन को प्रमाणित करें?", "Authorize token for `x`?": "`x` के लिए टोकन को प्रमाणित करें?", "Import and Export Data": "डेटा को आयात और निर्यात करें", @@ -81,7 +79,6 @@ "Password": "पासवर्ड", "Register": "पंजीकृत करें", "E-mail": "ईमेल", - "Google verification code": "Google प्रमाणीकरण कोड", "Time (h:mm:ss):": "समय (घं:मिमि:सेसे):", "Text CAPTCHA": "टेक्स्ट CAPTCHA", "Image CAPTCHA": "चित्र CAPTCHA", @@ -224,15 +221,10 @@ "Hide replies": "जवाब छिपाएँ", "Show replies": "जवाब दिखाएँ", "Incorrect password": "गलत पासवर्ड", - "Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "लॉग-इन नहीं किया जा सका, सुनिश्चित करें कि दो-कारक प्रमाणीकरण (Authenticator या SMS) सक्षम है।", - "Invalid TFA code": "अमान्य TFA कोड", - "Login failed. This may be because two-factor authentication is not turned on for your account.": "लॉग-इन नाकाम रहा। ऐसा इसलिए हो सकता है कि दो-कारक प्रमाणीकरण आपके खाते पर सक्षम नहीं है।", - "Quota exceeded, try again in a few hours": "कोटा पार हो चुका है, कृपया कुछ घंटों में फिर कोशिश करें", "CAPTCHA is a required field": "CAPTCHA एक ज़रूरी फ़ील्ड है", "User ID is a required field": "सदस्य ID एक ज़रूरी फ़ील्ड है", "Password is a required field": "पासवर्ड एक ज़रूरी फ़ील्ड है", "Wrong username or password": "गलत सदस्यनाम या पासवर्ड", - "Please sign in using 'Log in with Google'": "कृपया 'Google के साथ लॉग-इन करें' के साथ साइन-इन करें", "Password cannot be empty": "पासवर्ड खाली नहीं हो सकता", "Password cannot be longer than 55 characters": "पासवर्ड में अधिकतम 55 अक्षर हो सकते हैं", "Invidious Private Feed for `x`": "`x` के लिए Invidious निजी फ़ीड", diff --git a/locales/hr.json b/locales/hr.json index 46e07b83..0549fa70 100644 --- a/locales/hr.json +++ b/locales/hr.json @@ -14,7 +14,6 @@ "Clear watch history?": "Izbrisati povijest gledanja?", "New password": "Nova lozinka", "New passwords must match": "Nove lozinke se moraju poklapati", - "Cannot change password for Google accounts": "Nije moguće promijeniti lozinku za Google račune", "Authorize token?": "Autorizirati token?", "Authorize token for `x`?": "Autorizirati token za `x`?", "Yes": "Da", @@ -37,7 +36,6 @@ "source": "izvor", "Log in": "Prijavi se", "Log in/register": "Prijavi se/registriraj se", - "Log in with Google": "Prijavi se pomoću Googlea", "User ID": "Korisnički ID", "Password": "Lozinka", "Time (h:mm:ss):": "Vrijeme (h:mm:ss):", @@ -46,7 +44,6 @@ "Sign In": "Prijavi se", "Register": "Registriraj se", "E-mail": "E-mail adresa", - "Google verification code": "Googleov potvrdni kod", "Preferences": "Postavke", "preferences_category_player": "Postavke playera", "preferences_video_loop_label": "Uvijek ponavljaj: ", @@ -164,17 +161,12 @@ "Hide replies": "Sakrij odgovore", "Show replies": "Prikaži odgovore", "Incorrect password": "Neispravna lozinka", - "Quota exceeded, try again in a few hours": "Kvota je prekoračena. Pokušaj ponovo za par sati", - "Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Prijava neuspjela. Provjeri da je dvofaktorska autentifikacija uključena (Authenticator ili SMS).", - "Invalid TFA code": "Neispravan TFA kod", - "Login failed. This may be because two-factor authentication is not turned on for your account.": "Prijava neuspjela. Možda zato što za tvoj račun nije uključena dvofaktorska autentifikacija.", "Wrong answer": "Krivi odgovor", "Erroneous CAPTCHA": "Neispravan CAPTCHA", "CAPTCHA is a required field": "CAPTCHA je obavezno polje", "User ID is a required field": "Korisnički ID je obavezno polje", "Password is a required field": "Polje lozinke je obavezno polje", "Wrong username or password": "Krivo korisničko ime ili lozinka", - "Please sign in using 'Log in with Google'": "Za prijavu koristi „Prijavi se pomoću Googlea”", "Password cannot be empty": "Polje lozinke ne smije ostati prazno", "Password cannot be longer than 55 characters": "Lozinka ne može biti duža od 55 znakova", "Please log in": "Prijavi se", diff --git a/locales/hu-HU.json b/locales/hu-HU.json index f93930e0..1899b71c 100644 --- a/locales/hu-HU.json +++ b/locales/hu-HU.json @@ -24,7 +24,6 @@ "Clear watch history?": "Törölve legyen a megnézett videók naplója?", "New password": "Új jelszó", "New passwords must match": "Az új jelszavaknak egyezniük kell.", - "Cannot change password for Google accounts": "A Google-fiók jelszavát nem lehet megváltoztatni.", "Authorize token?": "Engedélyezve legyen a token?", "Authorize token for `x`?": "Engedélyezve legyen a token erre? „`x`”", "Yes": "Igen", @@ -47,7 +46,6 @@ "source": "forrás", "Log in": "Bejelentkezés", "Log in/register": "Bejelentkezés/Regisztrálás", - "Log in with Google": "Bejelentkezés Google-fiókkal", "User ID": "Felhasználói azonosító", "Password": "Jelszó", "Time (h:mm:ss):": "A pontos idő (ó:pp:mm):", @@ -56,7 +54,6 @@ "Sign In": "Bejelentkezés", "Register": "Regisztrálás", "E-mail": "E-mail-cím", - "Google verification code": "A Google ellenőrző kódja", "Preferences": "Beállítások", "preferences_category_player": "Lejátszó beállításai", "preferences_video_loop_label": "Videó állandó ismétlése: ", @@ -173,16 +170,12 @@ "Hide replies": "Válaszok elrejtése", "Show replies": "Válaszok mutatása", "Incorrect password": "A jelszó nem megfelelő", - "Quota exceeded, try again in a few hours": "A kvótát meghaladták. Néhány órával később próbáld meg újból betölteni.", - "Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Nem sikerült bejelentkezni. A kétlépcsős (hitelesítő vagy szöveges üzenet általi) hitelesítésnek bekapcsolva kell lennie.", - "Login failed. This may be because two-factor authentication is not turned on for your account.": "Nem sikerült bejelentkezni. Ennek oka lehet, hogy a kétlépcsős hitelesítés nincs bekapcsolva a fiók beállításaiban.", "Wrong answer": "Nem jól válaszoltál.", "Erroneous CAPTCHA": "A CAPTCHA hibás.", "CAPTCHA is a required field": "A CAPTCHA-mezőt ki kell tölteni.", "User ID is a required field": "A felhasználói azonosítót meg kell adni.", "Password is a required field": "Meg kell adni egy jelszót.", "Wrong username or password": "Vagy a felhasználói név, vagy pedig a jelszó nem megfelelő.", - "Please sign in using 'Log in with Google'": "A „Bejelentkezés Google-el” gombbal jelentkezz be.", "Password cannot be empty": "A jelszót nem lehet kihagyni.", "Password cannot be longer than 55 characters": "A jelszó nem lehet hosszabb 55 karakternél.", "Please log in": "Kérjük, jelentkezz be.", @@ -419,7 +412,6 @@ "Switch Invidious Instance": "Váltás másik Invidious-oldalra", "Urdu": "urdu", "search_filters_date_option_week": "Ezen a héten", - "Invalid TFA code": "A kétlépéses hitelesítés kódja nem megfelelő", "footer_documentation": "Dokumentáció", "search_filters_features_option_hd": "HD", "next_steps_error_message_go_to_youtube": "Ugrás a YouTube-ra", diff --git a/locales/id.json b/locales/id.json index f0adfdb1..ef677251 100644 --- a/locales/id.json +++ b/locales/id.json @@ -19,7 +19,6 @@ "Clear watch history?": "Bersihkan riwayat tontonan?", "New password": "Kata sandi baru", "New passwords must match": "Kata sandi baru harus cocok", - "Cannot change password for Google accounts": "Tidak dapat mengganti kata sandi untuk akun Google", "Authorize token?": "Otorisasi token?", "Authorize token for `x`?": "Otorisasi token untuk `x`?", "Yes": "Ya", @@ -42,7 +41,6 @@ "source": "sumber", "Log in": "Masuk", "Log in/register": "Masuk/Daftar", - "Log in with Google": "Masuk dengan Google", "User ID": "ID Pengguna", "Password": "Kata Sandi", "Time (h:mm:ss):": "Waktu (j:mm:dd):", @@ -51,7 +49,6 @@ "Sign In": "Masuk", "Register": "Daftar", "E-mail": "Surel", - "Google verification code": "Kode verifikasi Google", "Preferences": "Preferensi", "preferences_category_player": "Preferensi pemutar", "preferences_video_loop_label": "Selalu ulangi: ", @@ -171,17 +168,12 @@ "Hide replies": "Sembunyikan balasan", "Show replies": "Lihat balasan", "Incorrect password": "Kata sandi salah", - "Quota exceeded, try again in a few hours": "Kuota penuh, coba lagi dalam beberapa jam", - "Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Tidak dapat masuk, pastikan autentikasi dua-faktor (autentikator atau SMS) sudah nyala.", - "Invalid TFA code": "Kode TFA tidak valid", - "Login failed. This may be because two-factor authentication is not turned on for your account.": "Gagal masuk. Ini mungkin disebabkan autentikasi dua-faktor tidak dinyalakan untuk akun Anda.", "Wrong answer": "Jawaban salah", "Erroneous CAPTCHA": "CAPTCHA salah", "CAPTCHA is a required field": "CAPTCHA perlu diisi", "User ID is a required field": "ID pengguna perlu diisi", "Password is a required field": "Kata sandi perlu diisi", "Wrong username or password": "Nama pengguna atau kata sandi salah", - "Please sign in using 'Log in with Google'": "Harap masuk menggunakan 'Masuk dengan Google'", "Password cannot be empty": "Kata sandi tidak boleh kosong", "Password cannot be longer than 55 characters": "Kata sandi tidak boleh lebih dari 55 karakter", "Please log in": "Harap masuk", diff --git a/locales/is.json b/locales/is.json index 3282eb50..ea4c4693 100644 --- a/locales/is.json +++ b/locales/is.json @@ -14,7 +14,6 @@ "Clear watch history?": "Hreinsa áhorfssögu?", "New password": "Nýtt lykilorð", "New passwords must match": "Nýtt lykilorð verður að passa", - "Cannot change password for Google accounts": "Ekki er hægt að breyta lykilorði fyrir Google reikninga", "Authorize token?": "Leyfa tákn?", "Authorize token for `x`?": "Leyfa tákn fyrir `x`?", "Yes": "Já", @@ -37,7 +36,6 @@ "source": "uppspretta", "Log in": "Skrá inn", "Log in/register": "Innskráning/nýskráning", - "Log in with Google": "Skrá inn með Google", "User ID": "Notandakenni", "Password": "Lykilorð", "Time (h:mm:ss):": "Tími (h:mm: ss):", @@ -46,7 +44,6 @@ "Sign In": "Skrá inn", "Register": "Nýskrá", "E-mail": "Tölvupóstur", - "Google verification code": "Google staðfestingarkóði", "Preferences": "Kjörstillingar", "preferences_category_player": "Kjörstillingar spilara", "preferences_video_loop_label": "Alltaf lykkja: ", @@ -155,17 +152,12 @@ "Hide replies": "Fela svör", "Show replies": "Sýna svör", "Incorrect password": "Rangt lykilorð", - "Quota exceeded, try again in a few hours": "Kvóti fór yfir, reyndu aftur eftir nokkrar klukkustundir", - "Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Ekki er hægt að skrá þig inn, vertu viss um að tvíþætt staðfesting (Authenticator eða SMS) sé kveikt á.", - "Invalid TFA code": "Ógildur TFA kóði", - "Login failed. This may be because two-factor authentication is not turned on for your account.": "Innskráning mistókst. Þetta gæti verið vegna þess að tvíþátta staðfesting er ekki kveikt á reikningnum þínum.", "Wrong answer": "Rangt svar", "Erroneous CAPTCHA": "Rangt CAPTCHA", "CAPTCHA is a required field": "CAPTCHA er nauðsynlegur reitur", "User ID is a required field": "Notandakenni er nauðsynlegur reitur", "Password is a required field": "Lykilorð er nauðsynlegur reitur", "Wrong username or password": "Rangt notandanafn eða lykilorð", - "Please sign in using 'Log in with Google'": "Vinsamlegast skráðu þig inn með því að nota 'Innskráning með Google'", "Password cannot be empty": "Lykilorð má ekki vera autt", "Password cannot be longer than 55 characters": "Lykilorð má ekki vera lengra en 55 stafir", "Please log in": "Vinsamlegast skráðu þig inn", diff --git a/locales/it.json b/locales/it.json index 9299add7..a3d0f5da 100644 --- a/locales/it.json +++ b/locales/it.json @@ -20,7 +20,6 @@ "Clear watch history?": "Eliminare la cronologia dei video guardati?", "New password": "Nuova password", "New passwords must match": "Le nuove password devono corrispondere", - "Cannot change password for Google accounts": "Non è possibile modificare la password per gli account Google", "Authorize token?": "Autorizzare gettone?", "Authorize token for `x`?": "Autorizzare gettone per `x`?", "Yes": "Sì", @@ -43,7 +42,6 @@ "source": "sorgente", "Log in": "Accedi", "Log in/register": "Accedi/Registrati", - "Log in with Google": "Accedi con Google", "User ID": "ID utente", "Password": "Password", "Time (h:mm:ss):": "Orario (h:mm:ss):", @@ -52,7 +50,6 @@ "Sign In": "Accedi", "Register": "Registrati", "E-mail": "E-mail", - "Google verification code": "Codice di verifica Google", "Preferences": "Preferenze", "preferences_category_player": "Preferenze del riproduttore", "preferences_video_loop_label": "Ripeti sempre: ", @@ -169,17 +166,12 @@ "Hide replies": "Nascondi le risposte", "Show replies": "Mostra le risposte", "Incorrect password": "Password sbagliata", - "Quota exceeded, try again in a few hours": "Limite superato, prova di nuovo fra qualche ora", - "Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Impossibile autenticarsi, controlla che l'autenticazione in due passaggi (Authenticator o SMS) sia attiva.", - "Invalid TFA code": "Codice di autenticazione a due fattori non valido", - "Login failed. This may be because two-factor authentication is not turned on for your account.": "Login fallito. L'errore potrebbe essere causato dal fatto che la verifica in due passaggi non è attiva sul tuo account.", "Wrong answer": "Risposta errata", "Erroneous CAPTCHA": "CAPTCHA errato", "CAPTCHA is a required field": "Il CAPTCHA è un campo obbligatorio", "User ID is a required field": "L'ID utente è obbligatorio", "Password is a required field": "La password è un campo obbligatorio", "Wrong username or password": "Nome utente o password errati", - "Please sign in using 'Log in with Google'": "Per favore accedi con «Entra con Google»", "Password cannot be empty": "La password non può essere vuota", "Password cannot be longer than 55 characters": "La password non può contenere più di 55 caratteri", "Please log in": "Per favore, accedi", diff --git a/locales/ja.json b/locales/ja.json index d9207d3f..8adcbf6a 100644 --- a/locales/ja.json +++ b/locales/ja.json @@ -1,9 +1,9 @@ { "generic_views_count_0": "{{count}} 回視聴", - "generic_videos_count_0": "{{count}} 個の動画", - "generic_playlists_count_0": "{{count}} 個の再生リスト", + "generic_videos_count_0": "{{count}}本の動画", + "generic_playlists_count_0": "{{count}}個の再生リスト", "generic_subscribers_count_0": "{{count}} 人の登録者", - "generic_subscriptions_count_0": "{{count}} 個の登録チャンネル", + "generic_subscriptions_count_0": "{{count}}個の登録チャンネル", "LIVE": "ライブ", "Shared `x` ago": "`x`前に公開", "Unsubscribe": "登録解除", @@ -19,7 +19,6 @@ "Clear watch history?": "再生履歴を削除しますか?", "New password": "新しいパスワード", "New passwords must match": "新しいパスワードが一致していません", - "Cannot change password for Google accounts": "Google アカウントのパスワードは変更できません", "Authorize token?": "トークンを認証しますか?", "Authorize token for `x`?": "トークン `x` を認証しますか?", "Yes": "はい", @@ -42,7 +41,6 @@ "source": "ソース", "Log in": "ログイン", "Log in/register": "ログイン/登録", - "Log in with Google": "Google でログイン", "User ID": "ユーザー ID", "Password": "パスワード", "Time (h:mm:ss):": "時間 (時:分分:秒秒):", @@ -51,16 +49,15 @@ "Sign In": "サインイン", "Register": "登録", "E-mail": "メールアドレス", - "Google verification code": "Google 認証コード", "Preferences": "設定", "preferences_category_player": "プレイヤーの設定", "preferences_video_loop_label": "常にループ: ", "preferences_autoplay_label": "自動再生: ", - "preferences_continue_label": "次の動画を再生: ", + "preferences_continue_label": "次の動画を自動再生: ", "preferences_continue_autoplay_label": "次の動画を自動再生: ", - "preferences_listen_label": "デフォルトで音声モードを使用: ", - "preferences_local_label": "動画視聴にプロキシーを経由: ", - "preferences_speed_label": "標準の再生速度: ", + "preferences_listen_label": "音声モードを使用: ", + "preferences_local_label": "動画視聴にプロキシを経由: ", + "preferences_speed_label": "再生速度の初期値: ", "preferences_quality_label": "優先する画質: ", "preferences_volume_label": "プレイヤーの音量: ", "preferences_comments_label": "デフォルトのコメント: ", @@ -109,7 +106,7 @@ "Delete account": "アカウントを削除", "preferences_category_admin": "管理者設定", "preferences_default_home_label": "ホームに表示するページ: ", - "preferences_feed_menu_label": "フィードメニュー: ", + "preferences_feed_menu_label": "フィードのメニュー: ", "preferences_show_nick_label": "ログイン名を上部に表示: ", "Top enabled: ": "トップページを有効化: ", "CAPTCHA enabled: ": "CAPTCHA を有効化: ", @@ -120,12 +117,12 @@ "Subscription manager": "登録チャンネルの管理", "Token manager": "トークンの管理", "Token": "トークン", - "tokens_count_0": "{{count}} 個のトークン", + "tokens_count_0": "{{count}}個のトークン", "Import/export": "インポート/エクスポート", "unsubscribe": "登録解除", "revoke": "取り消す", "Subscriptions": "登録チャンネル", - "subscriptions_unseen_notifs_count_0": "{{count}} 個の未読通知", + "subscriptions_unseen_notifs_count_0": "{{count}}件の未読通知", "search": "検索", "Log out": "ログアウト", "Released under the AGPLv3 on Github.": "GitHub 上で AGPLv3 の元で公開", @@ -171,17 +168,12 @@ "Hide replies": "返信を非表示", "Show replies": "返信を表示", "Incorrect password": "パスワードが間違っています", - "Quota exceeded, try again in a few hours": "試行を制限中です。数時間後にやり直してください", - "Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "ログインできませんでした。2段階認証 (認証アプリまたは SMS) が有効になっていることを確認してください。", - "Invalid TFA code": "TFA (2段階認証) コードが無効です", - "Login failed. This may be because two-factor authentication is not turned on for your account.": "ログインに失敗しました。あなたのアカウントで2段階認証が有効になっていない可能性があります。", "Wrong answer": "回答が間違っています", "Erroneous CAPTCHA": "CAPTCHA が間違っています", "CAPTCHA is a required field": "CAPTCHA は必須項目です", "User ID is a required field": "ユーザー ID は必須項目です", "Password is a required field": "パスワードは必須項目です", "Wrong username or password": "ユーザー名またはパスワードが間違っています", - "Please sign in using 'Log in with Google'": "「Google でログイン」を使用してログインしてください", "Password cannot be empty": "パスワードは空にできません", "Password cannot be longer than 55 characters": "パスワードは55文字より長くできません", "Please log in": "ログインしてください", @@ -347,7 +339,7 @@ "search_filters_sort_option_relevance": "関連度", "search_filters_sort_option_rating": "評価", "search_filters_sort_option_date": "アップロード日", - "search_filters_sort_option_views": "再生回数", + "search_filters_sort_option_views": "視聴回数", "search_filters_type_label": "種類", "search_filters_duration_label": "再生時間", "search_filters_features_label": "特徴", @@ -383,7 +375,7 @@ "search_filters_duration_option_long": "20 分以上", "preferences_region_label": "地域: ", "footer_donate_page": "寄付する", - "preferences_quality_dash_label": "優先するDash画質 : ", + "preferences_quality_dash_label": "優先するDASH画質: ", "preferences_quality_dash_option_4320p": "4320p", "preferences_quality_dash_option_240p": "240p", "preferences_quality_dash_option_144p": "144p", @@ -403,7 +395,7 @@ "none": "なし", "download_subtitles": "字幕 - `x` (.vtt)", "search_filters_features_option_purchased": "購入済み", - "preferences_quality_option_dash": "DASH (適応品質)", + "preferences_quality_option_dash": "DASH (適応的画質)", "preferences_quality_dash_option_worst": "最悪", "preferences_quality_dash_option_best": "最高", "videoinfo_started_streaming_x_ago": "`x`前に配信を開始", @@ -444,7 +436,7 @@ "Popular enabled: ": "人気動画を有効化 ", "search_message_use_another_instance": " 別のインスタンス上での検索も可能です。", "search_filters_apply_button": "選択したフィルターを適用", - "user_saved_playlists": "`x` 個の保存した再生リスト", + "user_saved_playlists": "`x`個の保存済みの再生リスト", "crash_page_you_found_a_bug": "Invidious のバグのようです!", "crash_page_refresh": "ページを更新を試す", "preferences_watch_history_label": "再生履歴を有効化 ", diff --git a/locales/ko.json b/locales/ko.json index 2b454add..9c8db5a1 100644 --- a/locales/ko.json +++ b/locales/ko.json @@ -32,7 +32,6 @@ "preferences_video_loop_label": "항상 반복: ", "preferences_category_player": "플레이어 설정", "Preferences": "설정", - "Google verification code": "구글 인증 코드", "E-mail": "이메일", "Register": "회원가입", "Sign In": "로그인", @@ -42,7 +41,6 @@ "Time (h:mm:ss):": "시각 (h:mm:ss):", "Password": "비밀번호", "User ID": "사용자 ID", - "Log in with Google": "구글로 로그인", "Log in/register": "로그인/회원가입", "Log in": "로그인", "source": "출처", @@ -65,7 +63,6 @@ "Yes": "예", "Authorize token for `x`?": "`x` 에 대한 토큰을 승인하시겠습니까?", "Authorize token?": "토큰을 승인하시겠습니까?", - "Cannot change password for Google accounts": "구글 계정의 비밀번호를 변경할 수 없습니다", "New passwords must match": "새 비밀번호는 일치해야 합니다", "New password": "새 비밀번호", "Clear watch history?": "재생 기록을 삭제 하시겠습니까?", @@ -112,7 +109,6 @@ "This channel does not exist.": "이 채널은 존재하지 않습니다.", "Deleted or invalid channel": "삭제되었거나 더 이상 존재하지 않는 채널", "channel:`x`": "채널:`x`", - "Invalid TFA code": "유효하지 않은 TFA 코드", "Show replies": "댓글 보기", "Hide replies": "댓글 숨기기", "Incorrect password": "잘못된 비밀번호", @@ -249,7 +245,6 @@ "Engagement: ": "약속: ", "Wilson score: ": "Wilson Score: ", "Family friendly? ": "전연령 영상입니까? ", - "Quota exceeded, try again in a few hours": "한도량을 초과했습니다. 몇 시간 후에 다시 시도하세요", "View `x` comments": { "([^.,0-9]|^)1([^.,0-9]|$)": "`x`개의 댓글 보기", "": "`x`개의 댓글 보기" @@ -272,7 +267,6 @@ "Bulgarian": "불가리아어", "Bosnian": "보스니아어", "Belarusian": "벨라루스어", - "Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "로그인할 수 없습니다. 이중 인증(Authenticator 또는 SMS)이 켜져 있는지 확인하세요.", "View more comments on Reddit": "레딧에서 더 많은 댓글 보기", "View YouTube comments": "유튜브 댓글 보기", "Hi! Looks like you have JavaScript turned off. Click here to view comments, keep in mind they may take a bit longer to load.": "자바스크립트가 꺼져 있는 것 같습니다! 댓글을 보려면 여기를 클릭하세요. 댓글을 로드하는 데 시간이 조금 더 걸릴 수 있습니다.", @@ -282,13 +276,11 @@ "Please log in": "로그인하세요", "Password cannot be longer than 55 characters": "비밀번호는 55자 이하여야 합니다", "Password cannot be empty": "비밀번호는 비워둘 수 없습니다", - "Please sign in using 'Log in with Google'": "'구글로 로그인'을 사용하여 로그인하세요", "Wrong username or password": "잘못된 사용자 이름 또는 비밀번호", "Password is a required field": "비밀번호는 필수 입력란입니다", "User ID is a required field": "사용자 ID는 필수 입력란입니다", "CAPTCHA is a required field": "캡차는 필수 입력란입니다", "Erroneous CAPTCHA": "잘못된 캡차", - "Login failed. This may be because two-factor authentication is not turned on for your account.": "로그인 실패. 계정에 이중 인증이 설정되어 있지 않기 때문일 수 있습니다.", "Blacklisted regions: ": "차단된 지역: ", "Playlists": "재생목록", "View as playlist": "재생목록으로 보기", @@ -467,5 +459,6 @@ "Album: ": "앨범: ", "Music in this video": "동영상 속 음악", "Artist: ": "아티스트: ", - "Download is disabled": "다운로드가 비활성화 되어있음" + "Download is disabled": "다운로드가 비활성화 되어있음", + "Import YouTube playlist (.csv)": "유튜브 플레이리스트 가져오기 (.csv)" } diff --git a/locales/lt.json b/locales/lt.json index 91c7febe..740be7b6 100644 --- a/locales/lt.json +++ b/locales/lt.json @@ -14,7 +14,6 @@ "Clear watch history?": "Išvalyti žiūrėjimo istoriją?", "New password": "Naujas slaptažodis", "New passwords must match": "Naujas slaptažodis turi sutapti", - "Cannot change password for Google accounts": "Negalima pakeisti Google paskyros slaptažodžio", "Authorize token?": "Autorizuoti žetoną?", "Authorize token for `x`?": "Autorizuoti žetoną `x`?", "Yes": "Taip", @@ -37,7 +36,6 @@ "source": "šaltinis", "Log in": "Prisijungti", "Log in/register": "Prisijungti/ registruotis", - "Log in with Google": "Prisijungti naudojantis Google", "User ID": "Naudotojo ID", "Password": "Slaptažodis", "Time (h:mm:ss):": "Laikas (h:mm:ss):", @@ -46,7 +44,6 @@ "Sign In": "Prisijungti", "Register": "Registruotis", "E-mail": "El. paštas", - "Google verification code": "Google patvirtinimo kodas", "Preferences": "Pasirinktys", "preferences_category_player": "Grotuvo pasirinktys", "preferences_video_loop_label": "Visada kartoti: ", @@ -164,17 +161,12 @@ "Hide replies": "Slėpti atsakymus", "Show replies": "Rodyti atsakymus", "Incorrect password": "Slaptažodis neteisingas", - "Quota exceeded, try again in a few hours": "Viršyta kvota, bandykite dar kartą po keleto valandų", - "Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Nepavyko prisijungti, įsitikinkite, kad yra įjungta dviejų etapų autentifikacija (Autentifikatorius arba SMS).", - "Invalid TFA code": "Neteisingas TFA kodas", - "Login failed. This may be because two-factor authentication is not turned on for your account.": "Prisijungimas nepavyko. Tai gali būti todėl, kad jūsų paskyroje nėra įjungta dviejų etapų autentifikacija.", "Wrong answer": "Atsakymas neteisingas", "Erroneous CAPTCHA": "Klaidinga CAPTCHA", "CAPTCHA is a required field": "CAPTCHA yra reikalinga šiam laukeliui", "User ID is a required field": "Vartotojo ID yra reikalingas šiam laukeliui", "Password is a required field": "Slaptažodis yra reikalingas šiam laukeliui", "Wrong username or password": "Neteisingas vartotojo vardas arba slaptažodis", - "Please sign in using 'Log in with Google'": "Prašome prisijungti naudojant \"Prisijungti su\" Google \"", "Password cannot be empty": "Slaptažodžio laukelis negali būti tuščias", "Password cannot be longer than 55 characters": "Slaptažodis negali būti ilgesnis nei 55 simboliai", "Please log in": "Prašome prisijungti", diff --git a/locales/nb-NO.json b/locales/nb-NO.json index d29cca43..1e0e9e77 100644 --- a/locales/nb-NO.json +++ b/locales/nb-NO.json @@ -14,7 +14,6 @@ "Clear watch history?": "Tøm visningshistorikk?", "New password": "Nytt passord", "New passwords must match": "Nye passordfelter må stemme overens", - "Cannot change password for Google accounts": "Kan ikke endre passord for Google-kontoer", "Authorize token?": "Identitetsbekreft symbol?", "Authorize token for `x`?": "Identitetsbekreft symbol for `x`?", "Yes": "Ja", @@ -37,7 +36,6 @@ "source": "kilde", "Log in": "Logg inn", "Log in/register": "Logg inn/registrer", - "Log in with Google": "Logg inn med Google", "User ID": "Bruker-ID", "Password": "Passord", "Time (h:mm:ss):": "Tid (h:mm:ss):", @@ -46,7 +44,6 @@ "Sign In": "Innlogging", "Register": "Registrer", "E-mail": "E-post", - "Google verification code": "Google-bekreftelseskode", "Preferences": "Innstillinger", "preferences_category_player": "Avspillerinnstillinger", "preferences_video_loop_label": "Alltid gjenta: ", @@ -164,17 +161,12 @@ "Hide replies": "Skjul svar", "Show replies": "Vis svar", "Incorrect password": "Feil passord", - "Quota exceeded, try again in a few hours": "Kvote overskredet, prøv igjen om et par timer", - "Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Kunne ikke logge inn, forsikre deg om at tofaktor-identitetsbekreftelse (Authenticator eller SMS) er skrudd på.", - "Invalid TFA code": "Ugyldig tofaktorkode", - "Login failed. This may be because two-factor authentication is not turned on for your account.": "Innlogging mislyktes. Dette kan være fordi tofaktor-identitetsbekreftelse er skrudd av på kontoen din.", "Wrong answer": "Ugyldig svar", "Erroneous CAPTCHA": "Ugyldig CAPTCHA", "CAPTCHA is a required field": "CAPTCHA er et påkrevd felt", "User ID is a required field": "Bruker-ID er et påkrevd felt", "Password is a required field": "Passord er et påkrevd felt", "Wrong username or password": "Ugyldig brukernavn eller passord", - "Please sign in using 'Log in with Google'": "Logg inn ved bruk av \"Google-innlogging\"", "Password cannot be empty": "Passordet kan ikke være tomt", "Password cannot be longer than 55 characters": "Passordet kan ikke være lengre enn 55 tegn", "Please log in": "Logg inn", @@ -472,5 +464,17 @@ "search_filters_apply_button": "Bruk valgte filtre", "search_filters_date_option_none": "Siden begynnelsen", "search_filters_features_option_vr180": "VR180", - "error_video_not_in_playlist": "Forespurt video finnes ikke i denne spillelisten. Trykk her for spillelistens hjemmeside." + "error_video_not_in_playlist": "Forespurt video finnes ikke i denne spillelisten. Trykk her for spillelistens hjemmeside.", + "Standard YouTube license": "Standard YouTube-lisens", + "Song: ": "Sang: ", + "channel_tab_streams_label": "Direktesendinger", + "channel_tab_shorts_label": "Kortvideoer", + "channel_tab_playlists_label": "Spillelister", + "Music in this video": "Musikk i denne videoen", + "channel_tab_channels_label": "Kanaler", + "Artist: ": "Artist: ", + "Album: ": "Album: ", + "Download is disabled": "Nedlasting er avskrudd", + "Channel Sponsor": "Kanalsponsor", + "Import YouTube playlist (.csv)": "Importer YouTube-spilleliste (.csv)" } diff --git a/locales/nl.json b/locales/nl.json index dfc68671..aa5da731 100644 --- a/locales/nl.json +++ b/locales/nl.json @@ -14,7 +14,6 @@ "Clear watch history?": "Wil je de kijkgeschiedenis wissen?", "New password": "Nieuw wachtwoord", "New passwords must match": "De nieuwe wachtwoorden moeten overeenkomen", - "Cannot change password for Google accounts": "Kan het wachtwoord van Google-accounts niet wijzigen", "Authorize token?": "Wil je de toegangssleutel machtigen?", "Authorize token for `x`?": "Wil je de toegangssleutel machtigen voor `x`?", "Yes": "Ja", @@ -37,7 +36,6 @@ "source": "bron", "Log in": "Inloggen", "Log in/register": "Inloggen/Registreren", - "Log in with Google": "Inloggen met Google", "User ID": "Gebruikers-id", "Password": "Wachtwoord", "Time (h:mm:ss):": "Tijd (h:mm:ss):", @@ -46,7 +44,6 @@ "Sign In": "Inloggen", "Register": "Registreren", "E-mail": "E-mailadres", - "Google verification code": "Google-verificatiecode", "Preferences": "Instellingen", "preferences_category_player": "Spelerinstellingen", "preferences_video_loop_label": "Altijd herhalen: ", @@ -159,17 +156,12 @@ "Hide replies": "Antwoorden verbergen", "Show replies": "Antwoorden tonen", "Incorrect password": "Wachtwoord is onjuist", - "Quota exceeded, try again in a few hours": "Quota overschreden; probeer het over een paar uur opnieuw", - "Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Kan niet inloggen. Zorg ervoor dat authenticatie in twee stappen (Authenticator of sms) is ingeschakeld.", - "Invalid TFA code": "Onjuiste TFA-code", - "Login failed. This may be because two-factor authentication is not turned on for your account.": "Inloggen mislukt. Wellicht is authenticatie in twee stappen niet ingeschakeld op je account.", "Wrong answer": "Onjuist antwoord", "Erroneous CAPTCHA": "Onjuiste CAPTCHA", "CAPTCHA is a required field": "CAPTCHA is vereist", "User ID is a required field": "Gebruikers-id is vereist", "Password is a required field": "Wachtwoord is vereist", "Wrong username or password": "Onjuiste gebruikersnaam of wachtwoord", - "Please sign in using 'Log in with Google'": "Log in via 'Inloggen met Google'", "Password cannot be empty": "Het wachtwoordveld mag niet leeg zijn", "Password cannot be longer than 55 characters": "Het wachtwoord mag niet langer dan 55 tekens zijn", "Please log in": "Log in", diff --git a/locales/pl.json b/locales/pl.json index ca80757c..e237db8b 100644 --- a/locales/pl.json +++ b/locales/pl.json @@ -14,7 +14,6 @@ "Clear watch history?": "Wyczyścić historię?", "New password": "Nowe hasło", "New passwords must match": "Nowe hasła muszą być identyczne", - "Cannot change password for Google accounts": "Nie można zmienić hasła do konta Google", "Authorize token?": "Autoryzować token?", "Authorize token for `x`?": "Autoryzować token dla `x`?", "Yes": "Tak", @@ -37,7 +36,6 @@ "source": "źródło", "Log in": "Zaloguj", "Log in/register": "Zaloguj/Zarejestruj", - "Log in with Google": "Zaloguj do Google", "User ID": "ID użytkownika", "Password": "Hasło", "Time (h:mm:ss):": "Godzina (h:mm:ss):", @@ -46,7 +44,6 @@ "Sign In": "Zaloguj się", "Register": "Zarejestruj się", "E-mail": "E-mail", - "Google verification code": "Kod weryfikacyjny Google", "Preferences": "Preferencje", "preferences_category_player": "Ustawienia odtwarzacza", "preferences_video_loop_label": "Zawsze zapętlaj: ", @@ -163,17 +160,12 @@ "Hide replies": "Ukryj odpowiedzi", "Show replies": "Pokaż odpowiedzi", "Incorrect password": "Niepoprawne hasło", - "Quota exceeded, try again in a few hours": "Przekroczony limit zapytań, spróbuj ponownie za kilka godzin", - "Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Nie udało się zalogować, upewnij się, że dwuetapowe uwierzytelnianie (Autentykator lub SMS) jest aktywne.", - "Invalid TFA code": "Niepoprawny kod TFA", - "Login failed. This may be because two-factor authentication is not turned on for your account.": "Nie udało się zalogować. To może być spowodowane wyłączoną dwustopniową autoryzacją na twoim koncie.", "Wrong answer": "Niepoprawna odpowiedź", "Erroneous CAPTCHA": "CAPTCHA wykonane błędnie", "CAPTCHA is a required field": "CAPTCHA jest polem wymaganym", "User ID is a required field": "ID użytkownika jest polem wymaganym", "Password is a required field": "Hasło jest polem wymaganym", "Wrong username or password": "Niepoprawny login lub hasło", - "Please sign in using 'Log in with Google'": "Zaloguj się używając \"Zaloguj się przez Google\"", "Password cannot be empty": "Hasło nie może być puste", "Password cannot be longer than 55 characters": "Hasło nie może być dłuższe niż 55 znaków", "Please log in": "Proszę się zalogować", diff --git a/locales/pt-BR.json b/locales/pt-BR.json index 759aec94..81290398 100644 --- a/locales/pt-BR.json +++ b/locales/pt-BR.json @@ -14,7 +14,6 @@ "Clear watch history?": "Limpar histórico de reprodução?", "New password": "Nova senha", "New passwords must match": "Nova senha deve ser igual", - "Cannot change password for Google accounts": "Não é possível alterar sua senha de contas do Google", "Authorize token?": "Autorizar o token?", "Authorize token for `x`?": "Autorizar o token para `x`?", "Yes": "Sim", @@ -37,7 +36,6 @@ "source": "código-fonte", "Log in": "Entrar", "Log in/register": "Entrar/Registrar", - "Log in with Google": "Entrar com conta Google", "User ID": "Usuário", "Password": "Senha", "Time (h:mm:ss):": "Hora (h:mm:ss):", @@ -46,7 +44,6 @@ "Sign In": "Entrar", "Register": "Registrar", "E-mail": "E-mail", - "Google verification code": "Código de verificação do Google", "Preferences": "Preferências", "preferences_category_player": "Preferências do reprodutor", "preferences_video_loop_label": "Repetir sempre: ", @@ -166,17 +163,12 @@ "Hide replies": "Ocultar respostas", "Show replies": "Mostrar respostas", "Incorrect password": "Senha incorreta", - "Quota exceeded, try again in a few hours": "Cota excedida, tente novamente em algumas horas", - "Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Não foi possível fazer login, sua autenticação em dois passos (app autenticador ou sms) deve estar ativada.", - "Invalid TFA code": "Código TFA inválido", - "Login failed. This may be because two-factor authentication is not turned on for your account.": "Falha no login. Isso pode acontecer porque a autenticação em dois passos está desativada para sua conta.", "Wrong answer": "Resposta incorreta", "Erroneous CAPTCHA": "CAPTCHA inválido", "CAPTCHA is a required field": "O CAPTCHA é um campo obrigatório", "User ID is a required field": "O nome de usuário é um campo obrigatório", "Password is a required field": "A senha é um campo obrigatório", "Wrong username or password": "Nome de usuário ou senha inválidos", - "Please sign in using 'Log in with Google'": "Por favor, entre usando 'Entrar com conta Google'", "Password cannot be empty": "A senha não pode ficar em branco", "Password cannot be longer than 55 characters": "A senha não pode ter mais que 55 caracteres", "Please log in": "Por favor, inicie sua sessão", @@ -483,5 +475,6 @@ "Standard YouTube license": "Licença padrão do YouTube", "Song: ": "Música: ", "Channel Sponsor": "Patrocinador do Canal", - "Download is disabled": "Download está desativado" + "Download is disabled": "Download está desativado", + "Import YouTube playlist (.csv)": "Importar lista de reprodução do YouTube (.csv)" } diff --git a/locales/pt-PT.json b/locales/pt-PT.json index 43834d70..3834c9e2 100644 --- a/locales/pt-PT.json +++ b/locales/pt-PT.json @@ -14,7 +14,6 @@ "Clear watch history?": "Limpar histórico de reprodução?", "New password": "Nova palavra-chave", "New passwords must match": "As novas palavra-chaves devem corresponder", - "Cannot change password for Google accounts": "Não é possível alterar a palavra-chave para contas do Google", "Authorize token?": "Autorizar token?", "Authorize token for `x`?": "Autorizar token para `x`?", "Yes": "Sim", @@ -37,7 +36,6 @@ "source": "código-fonte", "Log in": "Iniciar sessão", "Log in/register": "Iniciar sessão/registar", - "Log in with Google": "Iniciar sessão com o Google", "User ID": "Utilizador", "Password": "Palavra-chave", "Time (h:mm:ss):": "Tempo (h:mm:ss):", @@ -46,7 +44,6 @@ "Sign In": "Iniciar sessão", "Register": "Registar", "E-mail": "E-mail", - "Google verification code": "Código de verificação do Google", "Preferences": "Preferências", "preferences_category_player": "Preferências do reprodutor", "preferences_video_loop_label": "Repetir sempre: ", @@ -166,17 +163,12 @@ "Hide replies": "Ocultar respostas", "Show replies": "Mostrar respostas", "Incorrect password": "Palavra-chave incorreta", - "Quota exceeded, try again in a few hours": "Cota excedida. Tente novamente dentro de algumas horas", - "Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Não é possível iniciar a sessão, certifique-se que a autenticação de dois fatores (Autenticador ou SMS) está ativada.", - "Invalid TFA code": "Código TFA inválido", - "Login failed. This may be because two-factor authentication is not turned on for your account.": "Falhou o início de sessão. Isto pode ser devido a não ter ativado na sua conta a autenticação de dois fatores (2FA).", "Wrong answer": "Resposta errada", "Erroneous CAPTCHA": "CAPTCHA inválido", "CAPTCHA is a required field": "CAPTCHA é um campo obrigatório", "User ID is a required field": "O nome de utilizador é um campo obrigatório", "Password is a required field": "Palavra-chave é um campo obrigatório", "Wrong username or password": "Nome de utilizador ou palavra-chave incorreto", - "Please sign in using 'Log in with Google'": "Por favor, inicie sessão usando 'Iniciar sessão com o Google'", "Password cannot be empty": "A palavra-chave não pode estar vazia", "Password cannot be longer than 55 characters": "A palavra-chave não pode ser superior a 55 caracteres", "Please log in": "Por favor, inicie sessão", diff --git a/locales/pt.json b/locales/pt.json index cbce0e5a..dfa411c3 100644 --- a/locales/pt.json +++ b/locales/pt.json @@ -63,8 +63,6 @@ "Could not pull trending pages.": "Não foi possível obter as páginas de tendências.", "Could not create mix.": "Não foi possível criar a mistura.", "Deleted or invalid channel": "Canal eliminado ou inválido", - "Login failed. This may be because two-factor authentication is not turned on for your account.": "Falhou o início de sessão. Isto pode ser devido a não ter ativado na sua conta a autenticação de dois fatores (2FA).", - "Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Não é possível iniciar a sessão, certifique-se que a autenticação de dois fatores (Autenticador ou SMS) está ativada.", "Hi! Looks like you have JavaScript turned off. Click here to view comments, keep in mind they may take a bit longer to load.": "Olá! Parece que o JavaScript está desativado. Clique aqui para ver os comentários, entretanto eles podem levar mais tempo para carregar.", "Delete playlist": "Eliminar lista de reprodução", "Delete playlist `x`?": "Eliminar a lista de reprodução 'x'?", @@ -81,7 +79,6 @@ "Log in/register": "Iniciar sessão/registar", "Delete account?": "Eliminar conta?", "Import and Export Data": "Importar e exportar dados", - "Cannot change password for Google accounts": "Não é possível alterar a palavra-chave para contas do Google", "Filipino": "Filipino", "Estonian": "Estónio", "Esperanto": "Esperanto", @@ -125,15 +122,12 @@ "Please log in": "Por favor, inicie sessão", "Password cannot be longer than 55 characters": "A palavra-chave não pode ser superior a 55 caracteres", "Password cannot be empty": "A palavra-chave não pode estar vazia", - "Please sign in using 'Log in with Google'": "Por favor, inicie sessão usando 'Iniciar sessão com o Google'", "Wrong username or password": "Nome de utilizador ou palavra-chave incorreto", "Password is a required field": "Palavra-chave é um campo obrigatório", "User ID is a required field": "O nome de utilizador é um campo obrigatório", "CAPTCHA is a required field": "CAPTCHA é um campo obrigatório", "Erroneous CAPTCHA": "CAPTCHA inválido", "Wrong answer": "Resposta errada", - "Invalid TFA code": "Código TFA inválido", - "Quota exceeded, try again in a few hours": "Cota excedida. Tente novamente dentro de algumas horas", "Incorrect password": "Palavra-chave incorreta", "Show replies": "Mostrar respostas", "Hide replies": "Ocultar respostas", @@ -232,7 +226,6 @@ "preferences_video_loop_label": "Repetir sempre: ", "preferences_category_player": "Preferências do reprodutor", "Preferences": "Preferências", - "Google verification code": "Código de verificação do Google", "E-mail": "E-mail", "Register": "Registar", "Image CAPTCHA": "Imagem CAPTCHA", @@ -240,7 +233,6 @@ "Time (h:mm:ss):": "Tempo (h:mm:ss):", "Password": "Palavra-chave", "User ID": "Utilizador", - "Log in with Google": "Iniciar sessão com o Google", "Log in": "Iniciar sessão", "source": "código-fonte", "JavaScript license information": "Informação de licença do JavaScript", @@ -483,5 +475,6 @@ "Song: ": "Canção: ", "Channel Sponsor": "Patrocinador do canal", "Standard YouTube license": "Licença padrão do YouTube", - "Download is disabled": "A descarga está desativada" + "Download is disabled": "A descarga está desativada", + "Import YouTube playlist (.csv)": "Importar lista de reprodução do YouTube (.csv)" } diff --git a/locales/ro.json b/locales/ro.json index 0f6407d6..85bf746f 100644 --- a/locales/ro.json +++ b/locales/ro.json @@ -14,7 +14,6 @@ "Clear watch history?": "Doriți să ștergeți istoricul?", "New password": "Parola nouă", "New passwords must match": "Câmpurile \"Parolă nouă\" trebuie să fie identice", - "Cannot change password for Google accounts": "Parola pentru un cont Google nu poate fi schimbată de pe Invidious", "Authorize token?": "Autorizați token-ul?", "Authorize token for `x`?": "Autorizați token-ul pentru `x` ?", "Yes": "Da", @@ -37,7 +36,6 @@ "source": "sursă", "Log in": "Conectați-vă", "Log in/register": "Conectați-vă/Creați-vă un cont", - "Log in with Google": "Conectați-vă cu Google", "User ID": "ID Utilizator", "Password": "Parolă", "Time (h:mm:ss):": "Ora (h:mm:ss) :", @@ -46,7 +44,6 @@ "Sign In": "Conectați-vă", "Register": "Înregistrați-vă", "E-mail": "E-mail", - "Google verification code": "Cod de verificare Google", "Preferences": "Preferințe", "preferences_category_player": "Setări de redare", "preferences_video_loop_label": "Reluați videoclipul la nesfârșit: ", @@ -155,17 +152,12 @@ "Hide replies": "Ascundeți replicile", "Show replies": "Afișați replicile", "Incorrect password": "Parolă incorectă", - "Quota exceeded, try again in a few hours": "Numărul de tentative de conectare a fost depășit. Va rugăm să încercați din nou în câteva ore", - "Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Conectare eșuată. Dacă nu reușiți să vă conectați, verificați dacă ați activat autentificarea cu doi factori (Autentificator sau SMS).", - "Invalid TFA code": "Codul de autentificare cu doi factori este invalid", - "Login failed. This may be because two-factor authentication is not turned on for your account.": "Conectare eșuată. Acest lucru ar putea fi cauzat de faptul că nu ați activat autentificarea cu doi factori.", "Wrong answer": "Răspuns invalid", "Erroneous CAPTCHA": "CAPTCHA invalid", "CAPTCHA is a required field": "Câmpul CAPTCHA este obligatoriu", "User ID is a required field": "Câmpul ID Utilizator este obligatoriu", "Password is a required field": "Câmpul Parolă este obligatoriu", "Wrong username or password": "Nume de utilizator sau parolă invalidă", - "Please sign in using 'Log in with Google'": "Vă rog conectați-vă folosind \"Conectați-vă cu Google\"", "Password cannot be empty": "Parola nu poate fi goală", "Password cannot be longer than 55 characters": "Parola nu poate să conțină mai mult de 55 de caractere", "Please log in": "Vă rog conectați-vă", diff --git a/locales/ru.json b/locales/ru.json index 0031f79a..a93207ad 100644 --- a/locales/ru.json +++ b/locales/ru.json @@ -4,7 +4,7 @@ "Unsubscribe": "Отписаться", "Subscribe": "Подписаться", "View channel on YouTube": "Смотреть канал на YouTube", - "View playlist on YouTube": "Просмотреть подборку на ютубе", + "View playlist on YouTube": "Посмотреть плейлист на YouTube", "newest": "сначала новые", "oldest": "сначала старые", "popular": "популярные", @@ -14,7 +14,6 @@ "Clear watch history?": "Очистить историю просмотров?", "New password": "Новый пароль", "New passwords must match": "Новые пароли не совпадают", - "Cannot change password for Google accounts": "Изменить пароль учётной записи Google невозможно", "Authorize token?": "Авторизовать токен?", "Authorize token for `x`?": "Авторизовать токен для `x`?", "Yes": "Да", @@ -37,7 +36,6 @@ "source": "источник", "Log in": "Войти", "Log in/register": "Войти или зарегистрироваться", - "Log in with Google": "Войти через Google", "User ID": "ИД пользователя", "Password": "Пароль", "Time (h:mm:ss):": "Время (ч:мм:сс):", @@ -46,7 +44,6 @@ "Sign In": "Войти", "Register": "Зарегистрироваться", "E-mail": "Эл. почта", - "Google verification code": "Код подтверждения Google", "Preferences": "Настройки", "preferences_category_player": "Настройки проигрывателя", "preferences_video_loop_label": "Всегда повторять: ", @@ -129,14 +126,14 @@ "Public": "Публичный", "Unlisted": "Нет в списке", "Private": "Приватный", - "View all playlists": "Просмотреть все подборки", + "View all playlists": "Посмотреть все плейлисты", "Updated `x` ago": "Обновлено `x` назад", - "Delete playlist `x`?": "Удалить подборку `x`?", - "Delete playlist": "Удалить подборку", - "Create playlist": "Создать подборку", + "Delete playlist `x`?": "Удалить плейлист `x`?", + "Delete playlist": "Удалить плейлист", + "Create playlist": "Создать плейлист", "Title": "Заголовок", - "Playlist privacy": "Видимость подборки", - "Editing playlist `x`": "Изменение подборки `x`", + "Playlist privacy": "Видимость плейлиста", + "Editing playlist `x`": "Редактирование плейлиста `x`", "Show more": "Развернуть", "Show less": "Свернуть", "Watch on YouTube": "Смотреть на YouTube", @@ -164,17 +161,12 @@ "Hide replies": "Скрыть ответы", "Show replies": "Показать ответы", "Incorrect password": "Неправильный пароль", - "Quota exceeded, try again in a few hours": "Лимит превышен, попробуйте снова через несколько часов", - "Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Не удалось войти. Проверьте, не включена ли двухфакторная аутентификация (по коду или смс).", - "Invalid TFA code": "Неправильный код двухфакторной аутентификации", - "Login failed. This may be because two-factor authentication is not turned on for your account.": "Не удалось войти. Это может быть из-за того, что в вашем аккаунте не включена двухфакторная аутентификация.", "Wrong answer": "Неправильный ответ", "Erroneous CAPTCHA": "Неправильная капча", "CAPTCHA is a required field": "Необходимо решить капчу", "User ID is a required field": "Необходимо ввести идентификатор пользователя", "Password is a required field": "Необходимо ввести пароль", "Wrong username or password": "Неправильный логин или пароль", - "Please sign in using 'Log in with Google'": "Пожалуйста, нажмите «Войти через Google»", "Password cannot be empty": "Пароль не может быть пустым", "Password cannot be longer than 55 characters": "Пароль не может быть длиннее 55 символов", "Please log in": "Пожалуйста, войдите", @@ -187,9 +179,9 @@ "`x` ago": "`x` назад", "Load more": "Загрузить ещё", "Could not create mix.": "Не удалось создать микс.", - "Empty playlist": "Подборка пуста", - "Not a playlist.": "Это не подборка.", - "Playlist does not exist.": "Подборка не существует.", + "Empty playlist": "Плейлист пуст", + "Not a playlist.": "Это не плейлист.", + "Playlist does not exist.": "Плейлист не существует.", "Could not pull trending pages.": "Не удаётся загрузить страницы «в тренде».", "Hidden field \"challenge\" is a required field": "Необходимо заполнить скрытое поле «challenge»", "Hidden field \"token\" is a required field": "Необходимо заполнить скрытое поле «токен»", @@ -310,7 +302,7 @@ "About": "О сайте", "Rating: ": "Рейтинг: ", "preferences_locale_label": "Язык: ", - "View as playlist": "Смотреть как подборку", + "View as playlist": "Смотреть как плейлист", "Default": "По умолчанию", "Music": "Музыка", "Gaming": "Игры", @@ -326,16 +318,16 @@ "Audio mode": "Аудио режим", "Video mode": "Видео режим", "channel_tab_videos_label": "Видео", - "Playlists": "Подборки", + "Playlists": "Плейлисты", "channel_tab_community_label": "Сообщество", - "search_filters_sort_option_relevance": "по актуальности", - "search_filters_sort_option_rating": "по рейтингу", - "search_filters_sort_option_date": "по дате загрузки", - "search_filters_sort_option_views": "по просмотрам", + "search_filters_sort_option_relevance": "актуальности", + "search_filters_sort_option_rating": "рейтингу", + "search_filters_sort_option_date": "дате загрузки", + "search_filters_sort_option_views": "просмотрам", "search_filters_type_label": "Тип", "search_filters_duration_label": "Длительность", "search_filters_features_label": "Дополнительно", - "search_filters_sort_label": "Сортировать", + "search_filters_sort_label": "Сортировать по", "search_filters_date_option_hour": "Последний час", "search_filters_date_option_today": "Сегодня", "search_filters_date_option_week": "Эта неделя", @@ -343,7 +335,7 @@ "search_filters_date_option_year": "Этот год", "search_filters_type_option_video": "Видео", "search_filters_type_option_channel": "Канал", - "search_filters_type_option_playlist": "Подборка", + "search_filters_type_option_playlist": "Плейлист", "search_filters_type_option_movie": "Фильм", "search_filters_type_option_show": "Сериал", "search_filters_features_option_hd": "HD", @@ -385,7 +377,7 @@ "videoinfo_youTube_embed_link": "Версия для встраивания", "videoinfo_invidious_embed_link": "Ссылка для встраивания", "download_subtitles": "Субтитры - `x` (.vtt)", - "user_created_playlists": "`x` созданных подборок", + "user_created_playlists": "`x` созданных плейлистов", "crash_page_you_found_a_bug": "Похоже, вы нашли ошибку в Invidious!", "crash_page_before_reporting": "Прежде чем сообщать об ошибке, убедитесь, что вы:", "crash_page_refresh": "пробовали перезагрузить страницу", @@ -393,9 +385,9 @@ "generic_videos_count_0": "{{count}} видео", "generic_videos_count_1": "{{count}} видео", "generic_videos_count_2": "{{count}} видео", - "generic_playlists_count_0": "{{count}} подборка", - "generic_playlists_count_1": "{{count}} подборки", - "generic_playlists_count_2": "{{count}} подборок", + "generic_playlists_count_0": "{{count}} плейлист", + "generic_playlists_count_1": "{{count}} плейлиста", + "generic_playlists_count_2": "{{count}} плейлистов", "tokens_count_0": "{{count}} токен", "tokens_count_1": "{{count}} токена", "tokens_count_2": "{{count}} токенов", @@ -454,7 +446,7 @@ "footer_source_code": "Исходный код", "footer_original_source_code": "Оригинальный исходный код", "footer_modfied_source_code": "Изменённый исходный код", - "user_saved_playlists": "`x` сохранённых подборок", + "user_saved_playlists": "`x` сохранённых плейлистов", "crash_page_search_issue": "поискали похожую проблему на GitHub", "comments_points_count_0": "{{count}} плюс", "comments_points_count_1": "{{count}} плюса", @@ -488,10 +480,10 @@ "search_filters_duration_option_medium": "Средние (4 - 20 минут)", "search_filters_apply_button": "Применить фильтры", "Popular enabled: ": "Популярное включено: ", - "error_video_not_in_playlist": "Запрошенного видео нет в этой подборке. Нажмите тут, чтобы вернуться к странице подборки.", - "channel_tab_playlists_label": "Подборки", + "error_video_not_in_playlist": "Запрошенного видео нет в этом плейлисте. Нажмите тут, чтобы вернуться к странице плейлиста.", + "channel_tab_playlists_label": "Плейлисты", "channel_tab_channels_label": "Каналы", - "channel_tab_streams_label": "Живое вещание", + "channel_tab_streams_label": "Стримы", "channel_tab_shorts_label": "Shorts", "Music in this video": "Музыка в этом видео", "Artist: ": "Исполнитель: ", @@ -499,5 +491,6 @@ "Song: ": "Композиция: ", "Standard YouTube license": "Стандартная лицензия YouTube", "Channel Sponsor": "Спонсор канала", - "Download is disabled": "Загрузка отключена" + "Download is disabled": "Загрузка отключена", + "Import YouTube playlist (.csv)": "Импорт плейлиста YouTube (.csv)" } diff --git a/locales/si.json b/locales/si.json index 69501343..19f34fac 100644 --- a/locales/si.json +++ b/locales/si.json @@ -14,7 +14,6 @@ "oldest": "පැරණිතම", "popular": "ජනප්‍රිය", "last": "අවසන්", - "Cannot change password for Google accounts": "Google ගිණුම් සඳහා මුරපදය වෙනස් කළ නොහැක", "Authorize token?": "ටෝකනය අනුමත කරනවා ද?", "Authorize token for `x`?": "`x` සඳහා ටෝකනය අනුමත කරනවා ද?", "Yes": "ඔව්", @@ -31,7 +30,6 @@ "An alternative front-end to YouTube": "YouTube සඳහා විකල්ප ඉදිරිපස අන්තයක්", "source": "මූලාශ්‍රය", "Log in/register": "පුරන්න/ලියාපදිංචිවන්න", - "Log in with Google": "Google සමඟ පුරන්න", "Password": "මුරපදය", "Time (h:mm:ss):": "වේලාව (h:mm:ss):", "Sign In": "පුරන්න", @@ -86,7 +84,6 @@ "User ID": "පරිශීලක කේතය", "Text CAPTCHA": "CAPTCHA පෙල", "Image CAPTCHA": "CAPTCHA රූපය", - "Google verification code": "Google සත්‍යාපන කේතය", "E-mail": "විද්‍යුත් තැපෑල", "preferences_quality_label": "කැමති වීඩියෝ ගුණත්වය: ", "preferences_quality_option_hd720": "HD720", diff --git a/locales/sk.json b/locales/sk.json index cdb3a596..7346dc58 100644 --- a/locales/sk.json +++ b/locales/sk.json @@ -12,7 +12,6 @@ "Clear watch history?": "Vymazať históriu sledovania?", "New password": "Nové heslo", "New passwords must match": "Nové heslá sa musia zhodovať", - "Cannot change password for Google accounts": "Heslo pre účty Google sa nedá zmeniť", "Authorize token?": "Autorizovať token?", "Yes": "Áno", "No": "Nie", @@ -34,7 +33,6 @@ "source": "zdroj", "Log in": "Prihlásiť sa", "Log in/register": "Prihlásiť sa/Registrovať", - "Log in with Google": "Prihlásiť sa pomocou účtu Google", "User ID": "ID používateľa", "Password": "Heslo", "Time (h:mm:ss):": "Čas (h:mm:ss):", @@ -43,7 +41,6 @@ "Sign In": "Prihlásiť sa", "Register": "Registrovať", "E-mail": "E-mail", - "Google verification code": "Overovací kód Google", "Preferences": "Nastavenia", "preferences_category_player": "Nastavenia prehrávača", "preferences_video_loop_label": "Vždy opakovať: ", diff --git a/locales/sl.json b/locales/sl.json index 410b432c..45f63c6b 100644 --- a/locales/sl.json +++ b/locales/sl.json @@ -8,7 +8,6 @@ "Clear watch history?": "Izbrisati zgodovino ogledov?", "New password": "Novo geslo", "New passwords must match": "Nova gesla se morajo ujemati", - "Cannot change password for Google accounts": "Ni mogoče spremeniti gesla za račune Google", "Authorize token?": "Naj odobrim žeton?", "Yes": "Da", "Import and Export Data": "Uvoz in izvoz podatkov", @@ -22,7 +21,6 @@ "Export subscriptions as OPML (for NewPipe & FreeTube)": "Izvozi naročnine kot OPML (za NewPipe in FreeTube)", "Log in": "Prijava", "Log in/register": "Prijava/registracija", - "Log in with Google": "Prijavi se z Googlom", "User ID": "ID uporabnika", "Password": "Geslo", "Time (h:mm:ss):": "Čas (h:mm:ss):", @@ -32,7 +30,6 @@ "Sign In": "Prijavi se", "Register": "Registriraj se", "E-mail": "E-pošta", - "Google verification code": "Googlova koda za preverjanje", "Preferences": "Nastavitve", "preferences_video_loop_label": "Vedno v zanki: ", "preferences_autoplay_label": "Samodejno predvajanje: ", @@ -120,9 +117,6 @@ "([^.,0-9]|^)1([^.,0-9]|$)": "Poglej `x` komentar", "": "Poglej `x` komentarjev" }, - "Quota exceeded, try again in a few hours": "Kvota je presežena, poskusi znova čez nekaj ur", - "Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Ne morem se prijaviti, preveri, ali je vklopljeno dvofaktorsko preverjanje pristnosti (avtentikator ali SMS).", - "Please sign in using 'Log in with Google'": "Prijavi se z uporabo »Prijava z Googlom«", "Password cannot be empty": "Geslo ne sme biti prazno", "`x` ago": "`x` nazaj", "Load more": "Naloži več", @@ -348,8 +342,6 @@ "View Reddit comments": "Oglej si komentarje na Redditu", "This channel does not exist.": "Ta kanal ne obstaja.", "Hide replies": "Skrij odgovore", - "Invalid TFA code": "Neveljavna koda TFA", - "Login failed. This may be because two-factor authentication is not turned on for your account.": "Prijava ni uspela. To je lahko zato, ker za tvoj račun ni vklopljeno dvofaktorsko preverjanje pristnosti.", "Invidious Private Feed for `x`": "Invidious zasebni vir za `x`", "Deleted or invalid channel": "Izbrisan ali neveljaven kanal", "Empty playlist": "Prazen seznam predvajanja", @@ -515,5 +507,6 @@ "Song: ": "Pesem: ", "Standard YouTube license": "Standardna licenca YouTube", "Channel Sponsor": "Sponzor kanala", - "Download is disabled": "Prenos je onemogočen" + "Download is disabled": "Prenos je onemogočen", + "Import YouTube playlist (.csv)": "Uvoz seznama predvajanja YouTube (.csv)" } diff --git a/locales/sq.json b/locales/sq.json index 7f29a035..d28eb784 100644 --- a/locales/sq.json +++ b/locales/sq.json @@ -35,12 +35,10 @@ "videoinfo_youTube_embed_link": "Trupëzojeni", "videoinfo_invidious_embed_link": "Lidhje Trupëzimi", "oldest": "më të vjetrat", - "Cannot change password for Google accounts": "S’mund të ndryshojë fjalëkalimin për llogari Google", "New passwords must match": "Fjalëkalimet e rinj duhet të përputhen me njëri-tjetrin", "Authorize token?": "Të autorizohet token-i?", "Authorize token for `x`?": "Të autorizohet token-i për `x`?", "Log in/register": "Hyni/regjistrohuni", - "Log in with Google": "Hyni me Google", "User ID": "ID Përdoruesi", "Password": "Fjalëkalim", "Time (h:mm:ss):": "Kohë (h:mm:ss):", @@ -156,19 +154,14 @@ "Whitelisted regions: ": "Rajone të lejuara: ", "Premieres `x`": "Premiera `x`", "Hi! Looks like you have JavaScript turned off. Click here to view comments, keep in mind they may take a bit longer to load.": "Njatjeta! Duket sikur keni JavaScript-in të çaktivizuar. Klikoni këtu që të shihni komentet, mbani parasysh se mund të duhet pak më tepër kohë që të ngarkohen.", - "Quota exceeded, try again in a few hours": "Janë tejkaluar kuotat, riprovoni pas pak orësh", "Blacklisted regions: ": "Rajone të palejuara: ", "Premieres in `x`": "Premiera në `x`", - "Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "S’arrihet të bëhet hyrja, sigurohuni se mirëfilltësimi dyfaktorësh (me Mirëfilltësues apo SMS) është i aktivizuar.", "Wrong answer": "Përgjigje e gabuar", - "Invalid TFA code": "Kod MDF i pavlefshëm", - "Login failed. This may be because two-factor authentication is not turned on for your account.": "Dështoi hyrja. Kjo mund të vijë ngaqë për llogarinë tuaj s’është aktivizuar mirëfilltësimi dyfaktorësh.", "Erroneous CAPTCHA": "CAPTCHA e gabuar", "CAPTCHA is a required field": "CAPTCHA është fushë e domosdoshme", "User ID is a required field": "ID-ja e përdoruesit është fushë e domosdoshme", "Password is a required field": "Fusha e fjalëkalimit është e domosdoshme", "Wrong username or password": "Emër përdoruesi ose fjalëkalim i gabuar", - "Please sign in using 'Log in with Google'": "Ju lutemi, bëni hyrjen duke përdorur “Bëni hyrjen me Google”", "Password cannot be empty": "Fjalëkalimi s’mund të jetë i zbrazët", "Password cannot be longer than 55 characters": "Fjalëkalimi s’mund të jetë më i gjatë se 55 shenja", "Please log in": "Ju lutemi, bëni hyrjen", @@ -303,7 +296,6 @@ "Previous page": "Faqja e mëparshme", "Clear watch history?": "Të spastrohet historiku i parjeve?", "New password": "Fjalëkalim i ri", - "Google verification code": "Kod verifikimi Google", "preferences_related_videos_label": "Shfaq video të afërta: ", "preferences_annotations_label": "Si parazgjedhje, shfaqi shënimet: ", "preferences_show_nick_label": "Shfaqe nofkën në krye: ", diff --git a/locales/sr.json b/locales/sr.json index fd19c493..a2853b68 100644 --- a/locales/sr.json +++ b/locales/sr.json @@ -14,7 +14,6 @@ "Clear watch history?": "Izbrisati povest pregledanja?", "New password": "Nova lozinka", "New passwords must match": "Nove lozinke moraju biti istovetne", - "Cannot change password for Google accounts": "Nije moguće promeniti lozinku za Google naloge", "Authorize token?": "Ovlasti žeton?", "Authorize token for `x`?": "Ovlasti žeton za `x`?", "Yes": "Da", @@ -37,7 +36,6 @@ "source": "izvor", "Log in": "Prijavi se", "Log in/register": "Prijavi se/Otvori nalog", - "Log in with Google": "Prijavi se pomoću Google-a", "User ID": "Korisnički ID", "Password": "Lozinka", "Time (h:mm:ss):": "Vreme (č:mm:ss):", @@ -46,7 +44,6 @@ "Sign In": "Prijava", "Register": "Otvori nalog", "E-mail": "E-pošta", - "Google verification code": "Google-ova overna koda", "Preferences": "Podešavanja", "preferences_category_player": "Podešavanja reproduktora", "preferences_video_loop_label": "Uvek ponavljaj: ", @@ -57,13 +54,11 @@ "preferences_local_label": "Prikaz video zapisa preko posrednika: ", "Playlist privacy": "Podešavanja privatnosti plej liste", "Editing playlist `x`": "Izmena plej liste `x`", - "Please sign in using 'Log in with Google'": "Molimo Vas da se prijavite pomoću 'Log in with Google'", "Playlist does not exist.": "Nepostojeća plej lista.", "Erroneous challenge": "Pogrešan izazov", "Maltese": "Malteški", "Download": "Preuzmi", "Download as: ": "Preuzmi kao: ", - "Quota exceeded, try again in a few hours": "Kvota je premašena, molimo vas da pokušate ponovo za par sati", "Bangla": "Bangla/Bengalski", "preferences_quality_dash_label": "Preferirani kvalitet DASH video formata: ", "Token manager": "Upravljanje žetonima", @@ -182,7 +177,6 @@ "": "Prikaži `x` komentara" }, "View Reddit comments": "Prikaži Reddit komentare", - "Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Neuspešna prijava, proverite da li ste upalili dvofaktornu autentikaciju (Autentikator ili SMS).", "CAPTCHA is a required field": "CAPTCHA je obavezno polje", "Croatian": "Hrvatski", "Estonian": "Estonski", @@ -283,8 +277,6 @@ "Wrong answer": "Pogrešan odgovor", "preferences_quality_label": "Preferirani video kvalitet: ", "Hide replies": "Sakrij odgovore", - "Invalid TFA code": "Nevažeća TFA koda", - "Login failed. This may be because two-factor authentication is not turned on for your account.": "Neuspešna prijava! Ovo se možda dešava jer dvofaktorna autentikacija nije omogućena na vašem nalogu.", "Erroneous CAPTCHA": "Pogrešna CAPTCHA", "Erroneous token": "Pogrešan žeton", "Czech": "Češki", diff --git a/locales/sr_Cyrl.json b/locales/sr_Cyrl.json index bef9915d..218f31c9 100644 --- a/locales/sr_Cyrl.json +++ b/locales/sr_Cyrl.json @@ -14,7 +14,6 @@ "Clear watch history?": "Избрисати повест прегледања?", "New password": "Нова лозинка", "New passwords must match": "Нове лозинке морају бити истоветне", - "Cannot change password for Google accounts": "Није могуће променити лозинку за Google налоге", "Authorize token?": "Овласти жетон?", "Authorize token for `x`?": "Овласти жетон за `x`?", "Yes": "Да", @@ -37,7 +36,6 @@ "source": "извор", "Log in": "Пријави се", "Log in/register": "Пријави се/Отворите налог", - "Log in with Google": "Пријави се помоћу Google-а", "User ID": "Кориснички ИД", "Password": "Лозинка", "Time (h:mm:ss):": "Време (ч:мм:сс):", @@ -46,7 +44,6 @@ "Sign In": "Пријава", "Register": "Отвори налог", "E-mail": "Е-пошта", - "Google verification code": "Google-ова оверна кода", "Preferences": "Подешавања", "preferences_category_player": "Подешавања репродуктора", "preferences_video_loop_label": "Увек понављај: ", @@ -150,8 +147,6 @@ "Burmese": "Бурмански", "preferences_quality_dash_label": "Преферирани квалитет DASH видео формата: ", "Erroneous token": "Погрешан жетон", - "Quota exceeded, try again in a few hours": "Квота је премашена, молимо вас да покушате поново за пар сати", - "Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Неуспешна пријава, проверите да ли сте упалили двофакторну аутентикацију (Аутентикатор или СМС).", "CAPTCHA is a required field": "CAPTCHA је обавезно поље", "No such user": "Непостојећи корисник", "Chinese (Traditional)": "Кинески (Традиционални)", @@ -164,7 +159,6 @@ "preferences_show_nick_label": "Прикажи надимке на врху: ", "Report statistics: ": "Извештавај о статистици: ", "Show more": "Прикажи више", - "Login failed. This may be because two-factor authentication is not turned on for your account.": "Неуспешна пријава! Ово се можда дешава јер двофакторна аутентикација није омогућена на vашем налогу.", "Wrong answer": "Погрешан одговор", "Hidden field \"token\" is a required field": "Сакривено \"token\" поље је обавезно", "English": "Енглески", @@ -198,7 +192,6 @@ "User ID is a required field": "Кориснички ИД је обавезно поље", "Password is a required field": "Лозинка је обавезно поље", "Wrong username or password": "Погрешно корисничко име или лозинка", - "Please sign in using 'Log in with Google'": "Молимо Вас да се пријавите помоћу 'Log in with Google'", "Password cannot be empty": "Лозинка не може бити празна", "Password cannot be longer than 55 characters": "Лозинка не може бити дужа од 55 карактера", "Invidious Private Feed for `x`": "Инвидиоус Приватни Довод за `x`", @@ -324,7 +317,6 @@ "Released under the AGPLv3 on Github.": "Избачено под лиценцом AGPLv3 на GitHub-у.", "Afrikaans": "Африканс", "preferences_automatic_instance_redirect_label": "Аутоматско пребацивање на другу инстанцу у случају отказивања (пречи ће назад на редирецт.инвидиоус.ио): ", - "Invalid TFA code": "Неважећа TFA кода", "Please log in": "Молимо вас да се пријавите", "English (auto-generated)": "Енглески (аутоматски генерисано)", "Hindi": "Хинди", diff --git a/locales/sv-SE.json b/locales/sv-SE.json index 39e94fd3..a319fffd 100644 --- a/locales/sv-SE.json +++ b/locales/sv-SE.json @@ -14,7 +14,6 @@ "Clear watch history?": "Töm visningshistorik?", "New password": "Nytt lösenord", "New passwords must match": "Nya lösenord måste stämma överens", - "Cannot change password for Google accounts": "Kan inte ändra lösenord på Google-konton", "Authorize token?": "Auktorisera åtkomsttoken?", "Authorize token for `x`?": "Auktorisera åtkomsttoken för `x`?", "Yes": "Ja", @@ -37,7 +36,6 @@ "source": "källa", "Log in": "Logga in", "Log in/register": "Logga in/registrera", - "Log in with Google": "Logga in med Google", "User ID": "Användar-ID", "Password": "Lösenord", "Time (h:mm:ss):": "Tid (h:mm:ss):", @@ -46,7 +44,6 @@ "Sign In": "Inloggning", "Register": "Registrera", "E-mail": "E-post", - "Google verification code": "Google-bekräftelsekod", "Preferences": "Inställningar", "preferences_category_player": "Spelarinställningar", "preferences_video_loop_label": "Loopa alltid: ", @@ -162,17 +159,12 @@ "Hide replies": "Dölj svar", "Show replies": "Visa svar", "Incorrect password": "Fel lösenord", - "Quota exceeded, try again in a few hours": "Kvoten överskriden, försök igen om ett par timmar", - "Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Kunde inte logga in, försäkra dig om att tvåfaktors-autentisering (Authenticator eller SMS) är påslagen.", - "Invalid TFA code": "Ogiltig tvåfaktor-kod", - "Login failed. This may be because two-factor authentication is not turned on for your account.": "Inloggning misslyckades. Detta kan vara för att tvåfaktors-autentisering inte är påslaget på ditt konto.", "Wrong answer": "Fel svar", "Erroneous CAPTCHA": "Ogiltig CAPTCHA", "CAPTCHA is a required field": "CAPTCHA är ett obligatoriskt fält", "User ID is a required field": "Användar-ID är ett obligatoriskt fält", "Password is a required field": "Lösenord är ett obligatoriskt fält", "Wrong username or password": "Ogiltigt användarnamn eller lösenord", - "Please sign in using 'Log in with Google'": "Logga in genom \"Google-inloggning\"", "Password cannot be empty": "Lösenordet kan inte vara tomt", "Password cannot be longer than 55 characters": "Lösenordet kan inte vara längre än 55 tecken", "Please log in": "Logga in", diff --git a/locales/tr.json b/locales/tr.json index ca74ef23..22732a51 100644 --- a/locales/tr.json +++ b/locales/tr.json @@ -14,7 +14,6 @@ "Clear watch history?": "İzleme geçmişi temizlensin mi?", "New password": "Yeni Parola", "New passwords must match": "Yeni Parolalar Eşleşmek Zorunda", - "Cannot change password for Google accounts": "Google Hesapları İçin Parola Değiştirilemez", "Authorize token?": "Belirteç yetkilendirilsin mi?", "Authorize token for `x`?": "`x` için belirteç yetkilendirilsin mi?", "Yes": "Evet", @@ -37,7 +36,6 @@ "source": "Kaynak", "Log in": "Oturum Aç", "Log in/register": "Oturum Aç/Kayıt Ol", - "Log in with Google": "Google İle Oturum Aç", "User ID": "Kullanıcı Kimliği", "Password": "Parola", "Time (h:mm:ss):": "Zaman (h:mm:ss):", @@ -46,7 +44,6 @@ "Sign In": "Oturum Aç", "Register": "Kayıt Ol", "E-mail": "E-Posta", - "Google verification code": "Google Doğrulama Kodu", "Preferences": "Tercihler", "preferences_category_player": "Oynatıcı Tercihleri", "preferences_video_loop_label": "Sürekli Döngü: ", @@ -164,17 +161,12 @@ "Hide replies": "Cevapları Gizle", "Show replies": "Cevapları Göster", "Incorrect password": "Yanlış Parola", - "Quota exceeded, try again in a few hours": "Kota aşıldı, birkaç saat içinde tekrar deneyin.", - "Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Oturum açılamadı, iki faktörlü kimlik doğrulamanın (Kimlik Doğrulayıcı ya da SMS) açık olduğundan emin olun.", - "Invalid TFA code": "Geçersiz TFA Kodu", - "Login failed. This may be because two-factor authentication is not turned on for your account.": "Giriş başarısız. Bunun nedeni, hesabınız için iki faktörlü kimlik doğrulamanın açık olmaması olabilir.", "Wrong answer": "Yanlış Cevap", "Erroneous CAPTCHA": "Hatalı CAPTCHA", "CAPTCHA is a required field": "CAPTCHA Zorunlu Bir Alandır", "User ID is a required field": "Kullanıcı Kimliği Zorunlu Bir Alandır", "Password is a required field": "Parola Zorunlu Bir Alandır", "Wrong username or password": "Yanlış Kullanıcı Adı ya da Parola", - "Please sign in using 'Log in with Google'": "Lütfen 'Google İle Giriş Yap' Seçeneğini Kullanarak Oturum Açın", "Password cannot be empty": "Parola Boş Olamaz", "Password cannot be longer than 55 characters": "Parola 55 Karakterden Uzun Olamaz", "Please log in": "Lütfen Oturum Açın", diff --git a/locales/uk.json b/locales/uk.json index 863916f7..308b10ca 100644 --- a/locales/uk.json +++ b/locales/uk.json @@ -14,7 +14,6 @@ "Clear watch history?": "Очистити історію переглядів?", "New password": "Новий пароль", "New passwords must match": "Нові паролі не співпадають", - "Cannot change password for Google accounts": "Змінити пароль обліківки Google неможливо", "Authorize token?": "Авторизувати токен?", "Authorize token for `x`?": "Авторизувати токен для `x`?", "Yes": "Так", @@ -37,7 +36,6 @@ "source": "джерело", "Log in": "Увійти", "Log in/register": "Увійти або зареєструватися", - "Log in with Google": "Увійти через Google", "User ID": "ID користувача", "Password": "Пароль", "Time (h:mm:ss):": "Час (г:хх:сс):", @@ -46,7 +44,6 @@ "Sign In": "Увійти", "Register": "Зареєструватися", "E-mail": "Електронна пошта", - "Google verification code": "Код підтвердження Google", "Preferences": "Налаштування", "preferences_category_player": "Налаштування програвача", "preferences_video_loop_label": "Завжди повторювати: ", @@ -155,17 +152,12 @@ "Hide replies": "Сховати відповіді", "Show replies": "Показати відповіді", "Incorrect password": "Неправильний пароль", - "Quota exceeded, try again in a few hours": "Ліміт перевищено, спробуйте знову за декілька годин", - "Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Не вдається увійти. Перевірте, чи не ввімкнена двофакторна аутентифікація (за кодом чи смс).", - "Invalid TFA code": "Неправильний код двофакторної автентифікації", - "Login failed. This may be because two-factor authentication is not turned on for your account.": "Не вдається увійти. Це може бути через те, що у вашій обліківці не ввімкнена двофакторна аутентифікація.", "Wrong answer": "Неправильна відповідь", "Erroneous CAPTCHA": "Неправильна капча", "CAPTCHA is a required field": "Необхідно пройти CAPTCHA", "User ID is a required field": "Необхідно ввести ID користувача", "Password is a required field": "Необхідно ввести пароль", "Wrong username or password": "Неправильний логін чи пароль", - "Please sign in using 'Log in with Google'": "Будь ласка, натисніть «Увійти через Google»", "Password cannot be empty": "Пароль не може бути порожнім", "Password cannot be longer than 55 characters": "Пароль не може бути довшим за 55 знаків", "Please log in": "Будь ласка, увійдіть", diff --git a/locales/vi.json b/locales/vi.json index 3f7125c4..d79c684c 100644 --- a/locales/vi.json +++ b/locales/vi.json @@ -1,10 +1,10 @@ { "generic_videos_count_0": "{{count}} video", - "generic_subscribers_count_0": "{{count}} subscribers", + "generic_subscribers_count_0": "{{count}} người theo dõi", "LIVE": "TRỰC TIẾP", "Shared `x` ago": "Đã chia sẻ` x` trước", - "Unsubscribe": "Hủy đăng ký", - "Subscribe": "Đăng ký", + "Unsubscribe": "Hủy theo dõi", + "Subscribe": "Theo dõi", "View channel on YouTube": "Xem kênh trên YouTube", "View playlist on YouTube": "Xem danh sách phát trên YouTube", "newest": "mới nhất", @@ -16,22 +16,21 @@ "Clear watch history?": "Xóa lịch sử xem?", "New password": "Mật khẩu mới", "New passwords must match": "Mật khẩu mới phải khớp", - "Cannot change password for Google accounts": "Không thể thay đổi mật khẩu cho tài khoản Google", "Authorize token?": "Cấp phép mã thông báo?", "Authorize token for `x`?": "Cấp phép mã thông báo cho` x`?", "Yes": "Đúng", "No": "Không", "Import and Export Data": "Nhập và xuất dữ liệu", "Import": "Nhập", - "Import Invidious data": "Nhập dữ liệu sống động", - "Import YouTube subscriptions": "Nhập đăng ký YouTube", + "Import Invidious data": "Nhập dữ liệu Invidious JSON", + "Import YouTube subscriptions": "Nhập dữ liệu thuê bao YouTube/OPML", "Import FreeTube subscriptions (.db)": "Nhập đăng ký FreeTube (.db)", "Import NewPipe subscriptions (.json)": "Nhập đăng ký NewPipe (.json)", "Import NewPipe data (.zip)": "Nhập dữ liệu NewPipe (.zip)", "Export": "Xuất", "Export subscriptions as OPML": "Xuất đăng ký dưới dạng OPML", "Export subscriptions as OPML (for NewPipe & FreeTube)": "Xuất đăng ký dưới dạng OPML (cho NewPipe & FreeTube)", - "Export data as JSON": "Xuất dữ liệu dưới dạng JSON", + "Export data as JSON": "Xuất dữ liệu Invidious dưới dạng JSON", "Delete account?": "Xóa tài khoản?", "History": "Lịch sử", "An alternative front-end to YouTube": "Giao diện người dùng thay thế cho YouTube", @@ -39,7 +38,6 @@ "source": "nguồn", "Log in": "Đăng nhập", "Log in/register": "Đăng nhập / đăng ký", - "Log in with Google": "Đăng nhập bằng Google", "User ID": "Tên người dùng", "Password": "Mật khẩu", "Time (h:mm:ss):": "Thời gian (h: mm: ss):", @@ -48,36 +46,35 @@ "Sign In": "Đăng nhập", "Register": "Đăng ký", "E-mail": "E-mail", - "Google verification code": "Mã xác minh của Google", "Preferences": "Sở thích", - "preferences_category_player": "Tùy chọn người chơi", + "preferences_category_player": "Tùy chọn trình phát video", "preferences_video_loop_label": "Luôn lặp lại: ", "preferences_autoplay_label": "Tự chạy: ", - "preferences_continue_label": "Phát tiếp theo theo mặc định: ", + "preferences_continue_label": "Phát kế tiếp theo mặc định: ", "preferences_continue_autoplay_label": "Tự động phát video tiếp theo: ", "preferences_listen_label": "Nghe theo mặc định: ", "preferences_local_label": "Video proxy: ", "preferences_speed_label": "Tốc độ mặc định: ", "preferences_quality_label": "Chất lượng video ưa thích: ", - "preferences_volume_label": "Khối lượng trình phát: ", + "preferences_volume_label": "Âm lượng trình phát video: ", "preferences_comments_label": "Nhận xét mặc định: ", "youtube": "YouTube", - "reddit": "reddit", + "reddit": "Reddit", "preferences_captions_label": "Phụ đề mặc định: ", "Fallback captions: ": "Phụ đề dự phòng: ", "preferences_related_videos_label": "Hiển thị các video có liên quan: ", "preferences_annotations_label": "Hiển thị chú thích theo mặc định: ", "preferences_extend_desc_label": "Tự động mở rộng mô tả video: ", - "preferences_vr_mode_label": "Video 360 độ tương tác: ", + "preferences_vr_mode_label": "Video 360 độ tương tác (yêu cầu WebGL): ", "preferences_category_visual": "Tùy chọn hình ảnh", - "preferences_player_style_label": "Phong cách người chơi: ", + "preferences_player_style_label": "Phong cách trình phát: ", "Dark mode: ": "Chế độ tối: ", "preferences_dark_mode_label": "Chủ đề: ", "dark": "tối", "light": "ánh sáng", "preferences_thin_mode_label": "Chế độ mỏng: ", "preferences_category_misc": "Tùy chọn khác", - "preferences_automatic_instance_redirect_label": "Chuyển hướng phiên bản tự động (dự phòng thành redirect.invidious.io): ", + "preferences_automatic_instance_redirect_label": "Tự động chuyển hướng phiên bản (dự phòng về redirect.invidious.io): ", "preferences_category_subscription": "Tùy chọn đăng ký", "preferences_annotations_subscribed_label": "Hiển thị chú thích theo mặc định cho các kênh đã đăng ký: ", "Redirect homepage to feed: ": "Chuyển hướng trang chủ đến nguồn cấp dữ liệu: ", @@ -117,14 +114,14 @@ "Subscription manager": "Người quản lý đăng ký", "Token manager": "Trình quản lý mã thông báo", "Token": "Mã thông báo", - "search": "Tìm kiếm", + "search": "tìm kiếm", "Log out": "Đăng xuất", "Source available here.": "Nguồn có sẵn ở đây.", "View JavaScript license information.": "Xem thông tin giấy phép JavaScript.", "View privacy policy.": "Xem chính sách bảo mật.", "Trending": "Xu hướng", "Public": "Công cộng", - "Unlisted": "Riêng tư", + "Unlisted": "Không hiển thị", "Private": "Riêng tư", "View all playlists": "Xem tất cả danh sách phát", "Updated `x` ago": "Đã cập nhật` x` trước", @@ -152,17 +149,12 @@ "Hide replies": "Ẩn câu trả lời", "Show replies": "Hiển thị câu trả lời", "Incorrect password": "Mật khẩu không đúng", - "Quota exceeded, try again in a few hours": "Đã vượt quá hạn ngạch, hãy thử lại sau vài giờ nữa", - "Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Không thể đăng nhập, hãy đảm bảo rằng xác thực hai yếu tố (Authenticator hoặc SMS) được bật.", - "Invalid TFA code": "Mã TFA không hợp lệ", - "Login failed. This may be because two-factor authentication is not turned on for your account.": "Đăng nhập không thành công. Điều này có thể là do xác thực hai yếu tố chưa được bật cho tài khoản của bạn.", "Wrong answer": "Câu trả lời sai", "Erroneous CAPTCHA": "CAPTCHA bị lỗi", "CAPTCHA is a required field": "CAPTCHA là trường bắt buộc", "User ID is a required field": "User ID là trường bắt buộc", "Password is a required field": "Mật khẩu là trường bắt buộc", "Wrong username or password": "Tên người dùng hoặc mật khẩu sai", - "Please sign in using 'Log in with Google'": "Vui lòng đăng nhập bằng 'Đăng nhập bằng Google'", "Password cannot be empty": "Mật khẩu không được để trống", "Password cannot be longer than 55 characters": "Mật khẩu không được dài hơn 55 ký tự", "Please log in": "Xin vui lòng đăng nhập", @@ -345,6 +337,51 @@ "generic_playlists_count": "{{count}} danh sách phát", "generic_views_count": "{{count}} lượt xem", "View `x` comments": { - "": "Xem `x` bình luận" - } + "": "Xem `x` bình luận", + "([^.,0-9]|^)1([^.,0-9]|$)": "Hiển thị `x`bình luận" + }, + "Song: ": "Ca khúc: ", + "Premieres in `x`": "Trình chiếu lần đầu vào `x`", + "preferences_quality_dash_option_worst": "Thấp nhất", + "preferences_watch_history_label": "Bật lịch sử video đã xem ", + "preferences_quality_option_hd720": "HD720", + "unsubscribe": "hủy đăng kí", + "revoke": "gỡ bỏ", + "preferences_quality_dash_label": "Chất lượng video DASH ưa thích ", + "preferences_quality_dash_option_auto": "Tự động", + "Subscriptions": "Thuê bao", + "View YouTube comments": "Hiển thị bình luận trên YouTube", + "View more comments on Reddit": "Hiển thị thêm bình luận từ Reddit", + "Music in this video": "Nhạc trong video này", + "Artist: ": "Nghệ sĩ: ", + "Premieres `x`": "Phát lần đầu `x`", + "preferences_region_label": "Nội dung theo quốc gia ", + "search_message_change_filters_or_query": "Thử mở rộng nội dung tìm kiếm hoặc thay đổi bộ lọc.", + "preferences_quality_option_small": "Nhỏ", + "preferences_quality_dash_option_144p": "144p", + "invidious": "Invidious", + "preferences_quality_dash_option_240p": "240p", + "Import/export": "Xuất/nhập dữ liệu", + "preferences_quality_dash_option_4320p": "4320p", + "preferences_quality_option_dash": "DASH (tự tối ưu chất lượng)", + "generic_subscriptions_count_0": "{{count}} thuê bao", + "preferences_quality_dash_option_1440p": "1440p", + "preferences_quality_dash_option_480p": "480p", + "preferences_quality_dash_option_2160p": "2160p", + "search_message_no_results": "Tìm kiếm không có kết quả.", + "preferences_quality_dash_option_1080p": "1080p", + "preferences_quality_dash_option_720p": "720p", + "preferences_quality_option_medium": "Trung bình", + "Load more": "Hiển thị thêm", + "comments_points_count_0": "{{count}} điểm", + "Import YouTube playlist (.csv)": "Nhập danh sách phát YouTube (.csv)", + "preferences_quality_dash_option_best": "Tốt nhất", + "preferences_quality_dash_option_360p": "360p", + "subscriptions_unseen_notifs_count_0": "{{count}} thông báo chưa đọc", + "Released under the AGPLv3 on Github.": "Phát hành dưới giấy phép AGPLv3 trên GitHub.", + "search_message_use_another_instance": " Bạn cũng có thể tìm kiếm ở một phiên bản khác.", + "Standard YouTube license": "Giấy phép YouTube thông thường", + "Album: ": "Album: ", + "preferences_save_player_pos_label": "Lưu vị trí xem cuối cùng ", + "Hi! Looks like you have JavaScript turned off. Click here to view comments, keep in mind they may take a bit longer to load.": "Xin chào! Có vẻ như bạn đã tắt JavaScript. Bấm vào đây để xem bình luận, lưu ý rằng thời gian tải có thể lâu hơn." } diff --git a/locales/zh-CN.json b/locales/zh-CN.json index fdd940c3..58b834fa 100644 --- a/locales/zh-CN.json +++ b/locales/zh-CN.json @@ -19,7 +19,6 @@ "Clear watch history?": "清除观看历史?", "New password": "新密码", "New passwords must match": "新密码必须匹配", - "Cannot change password for Google accounts": "无法为 Google 账户更改密码", "Authorize token?": "授权令牌?", "Authorize token for `x`?": "`x` 的授权令牌?", "Yes": "是", @@ -42,7 +41,6 @@ "source": "source", "Log in": "登录", "Log in/register": "登录/注册", - "Log in with Google": "使用 Google 账户登录", "User ID": "用户 ID", "Password": "密码", "Time (h:mm:ss):": "时间 (h:mm:ss):", @@ -51,7 +49,6 @@ "Sign In": "登录", "Register": "注册", "E-mail": "E-mail", - "Google verification code": "Google 验证代码", "Preferences": "偏好设置", "preferences_category_player": "播放器偏好设置", "preferences_video_loop_label": "始终循环: ", @@ -171,17 +168,12 @@ "Hide replies": "隐藏回复", "Show replies": "显示回复", "Incorrect password": "密码错误", - "Quota exceeded, try again in a few hours": "已超出限额,请于几小时后重试", - "Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "无法登录。请确认你的短信或验证器的二步验证已打开。", - "Invalid TFA code": "无效的二步验证码", - "Login failed. This may be because two-factor authentication is not turned on for your account.": "登录失败。可能是因为二步验证未打开。", "Wrong answer": "错误的回复", "Erroneous CAPTCHA": "验证码错误", "CAPTCHA is a required field": "验证码必填", "User ID is a required field": "用户名必填", "Password is a required field": "密码必填", "Wrong username or password": "用户名或密码错误", - "Please sign in using 'Log in with Google'": "请通过谷歌账户登录", "Password cannot be empty": "密码不能为空", "Password cannot be longer than 55 characters": "密码长度不能大于 55", "Please log in": "请登录", diff --git a/locales/zh-TW.json b/locales/zh-TW.json index 593a946a..7da2d762 100644 --- a/locales/zh-TW.json +++ b/locales/zh-TW.json @@ -19,7 +19,6 @@ "Clear watch history?": "清除觀看歷史?", "New password": "新密碼", "New passwords must match": "新密碼必須符合", - "Cannot change password for Google accounts": "無法變更 Google 帳號的密碼", "Authorize token?": "授權 token?", "Authorize token for `x`?": "`x` 的授權 token?", "Yes": "是", @@ -42,7 +41,6 @@ "source": "來源", "Log in": "登入", "Log in/register": "登入/註冊", - "Log in with Google": "使用 Google 登入", "User ID": "使用者 ID", "Password": "密碼", "Time (h:mm:ss):": "時間 (h:mm:ss):", @@ -51,7 +49,6 @@ "Sign In": "登入", "Register": "註冊", "E-mail": "電子郵件", - "Google verification code": "Google 驗證碼", "Preferences": "偏好設定", "preferences_category_player": "播放器偏好設定", "preferences_video_loop_label": "總是循環播放: ", @@ -171,17 +168,12 @@ "Hide replies": "隱藏回覆", "Show replies": "顯示回覆", "Incorrect password": "不正確的密碼", - "Quota exceeded, try again in a few hours": "超過限額,請在幾個小時後再試一次", - "Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "無法登入,請確定雙因素驗證(驗證器或簡訊)已開啟。", - "Invalid TFA code": "無效的 TFA 代碼", - "Login failed. This may be because two-factor authentication is not turned on for your account.": "登入失敗。這可能是因為您的帳號未開啟雙因素驗證的關係。", "Wrong answer": "錯誤的答案", "Erroneous CAPTCHA": "錯誤的 CAPTCHA", "CAPTCHA is a required field": "CAPTCHA 為必填欄位", "User ID is a required field": "使用者 ID 為必填欄位", "Password is a required field": "密碼為必填欄位", "Wrong username or password": "錯誤的使用者名稱或密碼", - "Please sign in using 'Log in with Google'": "請使用「以 Google 登入」來登入", "Password cannot be empty": "密碼不能為空", "Password cannot be longer than 55 characters": "密碼不能長於55個字元", "Please log in": "請登入", diff --git a/spec/invidious/utils_spec.cr b/spec/invidious/utils_spec.cr new file mode 100644 index 00000000..7c2c2711 --- /dev/null +++ b/spec/invidious/utils_spec.cr @@ -0,0 +1,46 @@ +require "../spec_helper" + +Spectator.describe "Utils" do + describe "decode_date" do + it "parses short dates (en-US)" do + expect(decode_date("1s ago")).to be_close(Time.utc - 1.second, 500.milliseconds) + expect(decode_date("2min ago")).to be_close(Time.utc - 2.minutes, 500.milliseconds) + expect(decode_date("3h ago")).to be_close(Time.utc - 3.hours, 500.milliseconds) + expect(decode_date("4d ago")).to be_close(Time.utc - 4.days, 500.milliseconds) + expect(decode_date("5w ago")).to be_close(Time.utc - 5.weeks, 500.milliseconds) + expect(decode_date("6mo ago")).to be_close(Time.utc - 6.months, 500.milliseconds) + expect(decode_date("7y ago")).to be_close(Time.utc - 7.years, 500.milliseconds) + end + + it "parses short dates (en-GB)" do + expect(decode_date("55s ago")).to be_close(Time.utc - 55.seconds, 500.milliseconds) + expect(decode_date("44min ago")).to be_close(Time.utc - 44.minutes, 500.milliseconds) + expect(decode_date("22hr ago")).to be_close(Time.utc - 22.hours, 500.milliseconds) + expect(decode_date("1day ago")).to be_close(Time.utc - 1.day, 500.milliseconds) + expect(decode_date("2days ago")).to be_close(Time.utc - 2.days, 500.milliseconds) + expect(decode_date("3wk ago")).to be_close(Time.utc - 3.weeks, 500.milliseconds) + expect(decode_date("11mo ago")).to be_close(Time.utc - 11.months, 500.milliseconds) + expect(decode_date("11yr ago")).to be_close(Time.utc - 11.years, 500.milliseconds) + end + + it "parses long forms (singular)" do + expect(decode_date("1 second ago")).to be_close(Time.utc - 1.second, 500.milliseconds) + expect(decode_date("1 minute ago")).to be_close(Time.utc - 1.minute, 500.milliseconds) + expect(decode_date("1 hour ago")).to be_close(Time.utc - 1.hour, 500.milliseconds) + expect(decode_date("1 day ago")).to be_close(Time.utc - 1.day, 500.milliseconds) + expect(decode_date("1 week ago")).to be_close(Time.utc - 1.week, 500.milliseconds) + expect(decode_date("1 month ago")).to be_close(Time.utc - 1.month, 500.milliseconds) + expect(decode_date("1 year ago")).to be_close(Time.utc - 1.year, 500.milliseconds) + end + + it "parses long forms (plural)" do + expect(decode_date("5 seconds ago")).to be_close(Time.utc - 5.seconds, 500.milliseconds) + expect(decode_date("17 minutes ago")).to be_close(Time.utc - 17.minutes, 500.milliseconds) + expect(decode_date("23 hours ago")).to be_close(Time.utc - 23.hours, 500.milliseconds) + expect(decode_date("3 days ago")).to be_close(Time.utc - 3.days, 500.milliseconds) + expect(decode_date("2 weeks ago")).to be_close(Time.utc - 2.weeks, 500.milliseconds) + expect(decode_date("9 months ago")).to be_close(Time.utc - 9.months, 500.milliseconds) + expect(decode_date("8 years ago")).to be_close(Time.utc - 8.years, 500.milliseconds) + end + end +end diff --git a/src/invidious.cr b/src/invidious.cr index b5abd5c7..84e1895d 100644 --- a/src/invidious.cr +++ b/src/invidious.cr @@ -58,11 +58,10 @@ end alias IV = Invidious CONFIG = Config.load -HMAC_KEY = CONFIG.hmac_key || Random::Secure.hex(32) +HMAC_KEY = CONFIG.hmac_key PG_DB = DB.open CONFIG.database_url ARCHIVE_URL = URI.parse("https://archive.org") -LOGIN_URL = URI.parse("https://accounts.google.com") PUBSUB_URL = URI.parse("https://pubsubhubbub.appspot.com") REDDIT_URL = URI.parse("https://www.reddit.com") YT_URL = URI.parse("https://www.youtube.com") diff --git a/src/invidious/channels/videos.cr b/src/invidious/channels/videos.cr index 12ed4a7d..beb86e08 100644 --- a/src/invidious/channels/videos.cr +++ b/src/invidious/channels/videos.cr @@ -20,7 +20,7 @@ def produce_channel_videos_continuation(ucid, page = 1, auto_generated = nil, so case sort_by when "newest" then 1_i64 when "popular" then 2_i64 - when "oldest" then 3_i64 # Broken as of 10/2022 :c + when "oldest" then 4_i64 else 1_i64 # Fallback to "newest" end diff --git a/src/invidious/config.cr b/src/invidious/config.cr index 0ade79cc..b8156537 100644 --- a/src/invidious/config.cr +++ b/src/invidious/config.cr @@ -85,7 +85,7 @@ class Config # Used to tell Invidious it is behind a proxy, so links to resources should be https:// property https_only : Bool? # HMAC signing key for CSRF tokens and verifying pubsub subscriptions - property hmac_key : String? + property hmac_key : String = "" # Domain to be used for links to resources on the site where an absolute URL is required property domain : String? # Subscribe to channels using PubSubHubbub (requires domain, hmac_key) @@ -206,6 +206,16 @@ class Config end {% end %} + # HMAC_key is mandatory + # See: https://github.com/iv-org/invidious/issues/3854 + if config.hmac_key.empty? + puts "Config: 'hmac_key' is required/can't be empty" + exit(1) + elsif config.hmac_key == "CHANGE_ME!!" + puts "Config: The value of 'hmac_key' needs to be changed!!" + exit(1) + end + # Build database_url from db.* if it's not set directly if config.database_url.to_s.empty? if db = config.db @@ -218,7 +228,7 @@ class Config path: db.dbname, ) else - puts "Config : Either database_url or db.* is required" + puts "Config: Either database_url or db.* is required" exit(1) end end diff --git a/src/invidious/helpers/helpers.cr b/src/invidious/helpers/helpers.cr index c3b53339..23ff0da9 100644 --- a/src/invidious/helpers/helpers.cr +++ b/src/invidious/helpers/helpers.cr @@ -22,31 +22,6 @@ struct Annotation property annotations : String end -def login_req(f_req) - data = { - # Unfortunately there's not much information available on `bgRequest`; part of Google's BotGuard - # Generally this is much longer (>1250 characters), see also - # https://github.com/ytdl-org/youtube-dl/commit/baf67a604d912722b0fe03a40e9dc5349a2208cb . - # For now this can be empty. - "bgRequest" => %|["identifier",""]|, - "pstMsg" => "1", - "checkConnection" => "youtube", - "checkedDomains" => "youtube", - "hl" => "en", - "deviceinfo" => %|[null,null,null,[],null,"US",null,null,[],"GlifWebSignIn",null,[null,null,[]]]|, - "f.req" => f_req, - "flowName" => "GlifWebSignIn", - "flowEntry" => "ServiceLogin", - # "cookiesDisabled" => "false", - # "gmscoreversion" => "undefined", - # "continue" => "https://accounts.google.com/ManageAccount", - # "azt" => "", - # "bgHash" => "", - } - - return HTTP::Params.encode(data) -end - def html_to_content(description_html : String) description = description_html.gsub(/(
)|()/, { "
": "\n", diff --git a/src/invidious/helpers/utils.cr b/src/invidious/helpers/utils.cr index bcf7c963..a006d602 100644 --- a/src/invidious/helpers/utils.cr +++ b/src/invidious/helpers/utils.cr @@ -111,24 +111,27 @@ def decode_date(string : String) else nil # Continue end - # String matches format "20 hours ago", "4 months ago"... - date = string.split(" ")[-3, 3] - delta = date[0].to_i + # String matches format "20 hours ago", "4 months ago", "20s ago", "15min ago"... + match = string.match(/(?\d+) ?(?[smhdwy]\w*) ago/) - case date[1] - when .includes? "second" + raise "Could not parse #{string}" if match.nil? + + delta = match["count"].to_i + + case match["span"] + when .starts_with? "s" # second(s) delta = delta.seconds - when .includes? "minute" + when .starts_with? "mi" # minute(s) delta = delta.minutes - when .includes? "hour" + when .starts_with? "h" # hour(s) delta = delta.hours - when .includes? "day" + when .starts_with? "d" # day(s) delta = delta.days - when .includes? "week" + when .starts_with? "w" # week(s) delta = delta.weeks - when .includes? "month" + when .starts_with? "mo" # month(s) delta = delta.months - when .includes? "year" + when .starts_with? "y" # year(s) delta = delta.years else raise "Could not parse #{string}" @@ -437,7 +440,7 @@ def parse_link_endpoint(endpoint : JSON::Any, text : String, video_id : String) # - https://github.com/iv-org/invidious/issues/3062 text = %(#{text}) else - text = %(#{reduce_uri(url)}) + text = %(#{reduce_uri(text)}) end end return text diff --git a/src/invidious/jobs.cr b/src/invidious/jobs.cr index 524a3624..b6b673f7 100644 --- a/src/invidious/jobs.cr +++ b/src/invidious/jobs.cr @@ -2,7 +2,7 @@ module Invidious::Jobs JOBS = [] of BaseJob # Automatically generate a structure that wraps the various - # jobs' configs, so that the follwing YAML config can be used: + # jobs' configs, so that the following YAML config can be used: # # jobs: # job_name: diff --git a/src/invidious/routes/account.cr b/src/invidious/routes/account.cr index 5aa4452c..9d930841 100644 --- a/src/invidious/routes/account.cr +++ b/src/invidious/routes/account.cr @@ -42,11 +42,6 @@ module Invidious::Routes::Account sid = sid.as(String) token = env.params.body["csrf_token"]? - # We don't store passwords for Google accounts - if !user.password - return error_template(400, "Cannot change password for Google accounts") - end - begin validate_request(token, sid, env.request, HMAC_KEY, locale) rescue ex @@ -54,7 +49,7 @@ module Invidious::Routes::Account end password = env.params.body["password"]? - if !password + if password.nil? || password.empty? return error_template(401, "Password is a required field") end diff --git a/src/invidious/routes/api/v1/authenticated.cr b/src/invidious/routes/api/v1/authenticated.cr index ce2ee812..a35d2f2b 100644 --- a/src/invidious/routes/api/v1/authenticated.cr +++ b/src/invidious/routes/api/v1/authenticated.cr @@ -178,10 +178,6 @@ module Invidious::Routes::API::V1::Authenticated Invidious::Database::Users.subscribe_channel(user, ucid) end - # For Google accounts, access tokens don't have enough information to - # make a request on the user's behalf, which is why we don't sync with - # YouTube. - env.response.status_code = 204 end diff --git a/src/invidious/routes/before_all.cr b/src/invidious/routes/before_all.cr index 8e2a253f..396840a4 100644 --- a/src/invidious/routes/before_all.cr +++ b/src/invidious/routes/before_all.cr @@ -80,49 +80,23 @@ module Invidious::Routes::BeforeAll raise "Cannot use token as SID" end - # Invidious users only have SID - if !env.request.cookies.has_key? "SSID" - if email = Invidious::Database::SessionIDs.select_email(sid) - user = Invidious::Database::Users.select!(email: email) - csrf_token = generate_response(sid, { - ":authorize_token", - ":playlist_ajax", - ":signout", - ":subscription_ajax", - ":token_ajax", - ":watch_ajax", - }, HMAC_KEY, 1.week) + if email = Database::SessionIDs.select_email(sid) + user = Database::Users.select!(email: email) + csrf_token = generate_response(sid, { + ":authorize_token", + ":playlist_ajax", + ":signout", + ":subscription_ajax", + ":token_ajax", + ":watch_ajax", + }, HMAC_KEY, 1.week) - preferences = user.preferences - env.set "preferences", preferences + preferences = user.preferences + env.set "preferences", preferences - env.set "sid", sid - env.set "csrf_token", csrf_token - env.set "user", user - end - else - headers = HTTP::Headers.new - headers["Cookie"] = env.request.headers["Cookie"] - - begin - user, sid = get_user(sid, headers, false) - csrf_token = generate_response(sid, { - ":authorize_token", - ":playlist_ajax", - ":signout", - ":subscription_ajax", - ":token_ajax", - ":watch_ajax", - }, HMAC_KEY, 1.week) - - preferences = user.preferences - env.set "preferences", preferences - - env.set "sid", sid - env.set "csrf_token", csrf_token - env.set "user", user - rescue ex - end + env.set "sid", sid + env.set "csrf_token", csrf_token + env.set "user", user end end diff --git a/src/invidious/routes/feeds.cr b/src/invidious/routes/feeds.cr index fb482e33..fc62c5a3 100644 --- a/src/invidious/routes/feeds.cr +++ b/src/invidious/routes/feeds.cr @@ -83,10 +83,6 @@ module Invidious::Routes::Feeds headers = HTTP::Headers.new headers["Cookie"] = env.request.headers["Cookie"] - if !user.password - user, sid = get_user(sid, headers) - end - max_results = env.params.query["max_results"]?.try &.to_i?.try &.clamp(0, MAX_ITEMS_PER_PAGE) max_results ||= user.preferences.max_results max_results ||= CONFIG.default_user_preferences.max_results diff --git a/src/invidious/routes/login.cr b/src/invidious/routes/login.cr index 6454131a..d0f7ac22 100644 --- a/src/invidious/routes/login.cr +++ b/src/invidious/routes/login.cr @@ -24,9 +24,6 @@ module Invidious::Routes::Login captcha_type = env.params.query["captcha"]? captcha_type ||= "image" - tfa = env.params.query["tfa"]? - prompt = nil - templated "user/login" end @@ -47,283 +44,18 @@ module Invidious::Routes::Login account_type ||= "invidious" case account_type - when "google" - tfa_code = env.params.body["tfa"]?.try &.lchop("G-") - traceback = IO::Memory.new - - # See https://github.com/ytdl-org/youtube-dl/blob/2019.04.07/youtube_dl/extractor/youtube.py#L82 - begin - client = nil # Declare variable - {% unless flag?(:disable_quic) %} - client = CONFIG.use_quic ? QUIC::Client.new(LOGIN_URL) : HTTP::Client.new(LOGIN_URL) - {% else %} - client = HTTP::Client.new(LOGIN_URL) - {% end %} - - headers = HTTP::Headers.new - - login_page = client.get("/ServiceLogin") - headers = login_page.cookies.add_request_headers(headers) - - lookup_req = { - email, nil, [] of String, nil, "US", nil, nil, 2, false, true, - {nil, nil, - {2, 1, nil, 1, - "https://accounts.google.com/ServiceLogin?passive=true&continue=https%3A%2F%2Fwww.youtube.com%2Fsignin%3Fnext%3D%252F%26action_handle_signin%3Dtrue%26hl%3Den%26app%3Ddesktop%26feature%3Dsign_in_button&hl=en&service=youtube&uilel=3&requestPath=%2FServiceLogin&Page=PasswordSeparationSignIn", - nil, [] of String, 4}, - 1, - {nil, nil, [] of String}, - nil, nil, nil, true, - }, - email, - }.to_json - - traceback << "Getting lookup..." - - headers["Content-Type"] = "application/x-www-form-urlencoded;charset=utf-8" - headers["Google-Accounts-XSRF"] = "1" - - response = client.post("/_/signin/sl/lookup", headers, login_req(lookup_req)) - lookup_results = JSON.parse(response.body[5..-1]) - - traceback << "done, returned #{response.status_code}.
" - - user_hash = lookup_results[0][2] - - if token = env.params.body["token"]? - answer = env.params.body["answer"]? - captcha = {token, answer} - else - captcha = nil - end - - challenge_req = { - user_hash, nil, 1, nil, - {1, nil, nil, nil, - {password, captcha, true}, - }, - {nil, nil, - {2, 1, nil, 1, - "https://accounts.google.com/ServiceLogin?passive=true&continue=https%3A%2F%2Fwww.youtube.com%2Fsignin%3Fnext%3D%252F%26action_handle_signin%3Dtrue%26hl%3Den%26app%3Ddesktop%26feature%3Dsign_in_button&hl=en&service=youtube&uilel=3&requestPath=%2FServiceLogin&Page=PasswordSeparationSignIn", - nil, [] of String, 4}, - 1, - {nil, nil, [] of String}, - nil, nil, nil, true, - }, - }.to_json - - traceback << "Getting challenge..." - - response = client.post("/_/signin/sl/challenge", headers, login_req(challenge_req)) - headers = response.cookies.add_request_headers(headers) - challenge_results = JSON.parse(response.body[5..-1]) - - traceback << "done, returned #{response.status_code}.
" - - headers["Cookie"] = URI.decode_www_form(headers["Cookie"]) - - if challenge_results[0][3]?.try &.== 7 - return error_template(423, "Account has temporarily been disabled") - end - - if token = challenge_results[0][-1]?.try &.[-1]?.try &.as_h?.try &.["5001"]?.try &.[-1].as_a?.try &.[-1].as_s - account_type = "google" - captcha_type = "image" - prompt = nil - tfa = tfa_code - captcha = {tokens: [token], question: ""} - - return templated "user/login" - end - - if challenge_results[0][-1]?.try &.[5] == "INCORRECT_ANSWER_ENTERED" - return error_template(401, "Incorrect password") - end - - prompt_type = challenge_results[0][-1]?.try &.[0].as_a?.try &.[0][2]? - if {"TWO_STEP_VERIFICATION", "LOGIN_CHALLENGE"}.includes? prompt_type - traceback << "Handling prompt #{prompt_type}.
" - case prompt_type - when "TWO_STEP_VERIFICATION" - prompt_type = 2 - else # "LOGIN_CHALLENGE" - prompt_type = 4 - end - - # Prefer Authenticator app and SMS over unsupported protocols - if !{6, 9, 12, 15}.includes?(challenge_results[0][-1][0][0][8].as_i) && prompt_type == 2 - tfa = challenge_results[0][-1][0].as_a.select { |auth_type| {6, 9, 12, 15}.includes? auth_type[8] }[0] - - traceback << "Selecting challenge #{tfa[8]}..." - select_challenge = {prompt_type, nil, nil, nil, {tfa[8]}}.to_json - - tl = challenge_results[1][2] - - tfa = client.post("/_/signin/selectchallenge?TL=#{tl}", headers, login_req(select_challenge)).body - tfa = tfa[5..-1] - tfa = JSON.parse(tfa)[0][-1] - - traceback << "done.
" - else - traceback << "Using challenge #{challenge_results[0][-1][0][0][8]}.
" - tfa = challenge_results[0][-1][0][0] - end - - if tfa[5] == "QUOTA_EXCEEDED" - return error_template(423, "Quota exceeded, try again in a few hours") - end - - if !tfa_code - account_type = "google" - captcha_type = "image" - - case tfa[8] - when 6, 9 - prompt = "Google verification code" - when 12 - prompt = "Login verification, recovery email: #{tfa[-1][tfa[-1].as_h.keys[0]][0]}" - when 15 - prompt = "Login verification, security question: #{tfa[-1][tfa[-1].as_h.keys[0]][0]}" - else - prompt = "Google verification code" - end - - tfa = nil - captcha = nil - return templated "user/login" - end - - tl = challenge_results[1][2] - - request_type = tfa[8] - case request_type - when 6 # Authenticator app - tfa_req = { - user_hash, nil, 2, nil, - {6, nil, nil, nil, nil, - {tfa_code, false}, - }, - }.to_json - when 9 # Voice or text message - tfa_req = { - user_hash, nil, 2, nil, - {9, nil, nil, nil, nil, nil, nil, nil, - {nil, tfa_code, false, 2}, - }, - }.to_json - when 12 # Recovery email - tfa_req = { - user_hash, nil, 4, nil, - {12, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, - {tfa_code}, - }, - }.to_json - when 15 # Security question - tfa_req = { - user_hash, nil, 5, nil, - {15, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, - {tfa_code}, - }, - }.to_json - else - return error_template(500, "Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.") - end - - traceback << "Submitting challenge..." - - response = client.post("/_/signin/challenge?hl=en&TL=#{tl}", headers, login_req(tfa_req)) - headers = response.cookies.add_request_headers(headers) - challenge_results = JSON.parse(response.body[5..-1]) - - if (challenge_results[0][-1]?.try &.[5] == "INCORRECT_ANSWER_ENTERED") || - (challenge_results[0][-1]?.try &.[5] == "INVALID_INPUT") - return error_template(401, "Invalid TFA code") - end - - traceback << "done.
" - end - - traceback << "Logging in..." - - location = URI.parse(challenge_results[0][-1][2].to_s) - cookies = HTTP::Cookies.from_client_headers(headers) - - headers.delete("Content-Type") - headers.delete("Google-Accounts-XSRF") - - loop do - if !location || location.path == "/ManageAccount" - break - end - - # Occasionally there will be a second page after login confirming - # the user's phone number ("/b/0/SmsAuthInterstitial"), which we currently don't handle. - - if location.path.starts_with? "/b/0/SmsAuthInterstitial" - traceback << "Unhandled dialog /b/0/SmsAuthInterstitial." - end - - login = client.get(location.request_target, headers) - - headers = login.cookies.add_request_headers(headers) - location = login.headers["Location"]?.try { |u| URI.parse(u) } - end - - cookies = HTTP::Cookies.from_client_headers(headers) - sid = cookies["SID"]?.try &.value - if !sid - raise "Couldn't get SID." - end - - user, sid = get_user(sid, headers) - - # We are now logged in - traceback << "done.
" - - host = URI.parse(env.request.headers["Host"]).host - - cookies.each do |cookie| - cookie.secure = Invidious::User::Cookies::SECURE - - if cookie.extension - cookie.extension = cookie.extension.not_nil!.gsub(".youtube.com", host) - cookie.extension = cookie.extension.not_nil!.gsub("Secure; ", "") - end - env.response.cookies << cookie - end - - if env.request.cookies["PREFS"]? - user.preferences = env.get("preferences").as(Preferences) - Invidious::Database::Users.update_preferences(user) - - cookie = env.request.cookies["PREFS"] - cookie.expires = Time.utc(1990, 1, 1) - env.response.cookies << cookie - end - - env.redirect referer - rescue ex - traceback.rewind - # error_message = translate(locale, "Login failed. This may be because two-factor authentication is not turned on for your account.") - error_message = %(#{ex.message}
Traceback:
#{traceback.gets_to_end}
) - return error_template(500, error_message) - end when "invidious" - if !email + if email.nil? || email.empty? return error_template(401, "User ID is a required field") end - if !password + if password.nil? || password.empty? return error_template(401, "Password is a required field") end user = Invidious::Database::Users.select(email: email) if user - if !user.password - return error_template(400, "Please sign in using 'Log in with Google'") - end - if Crypto::Bcrypt::Password.new(user.password.not_nil!).verify(password.byte_slice(0, 55)) sid = Base64.urlsafe_encode(Random::Secure.random_bytes(32)) Invidious::Database::SessionIDs.insert(sid, email) @@ -367,8 +99,6 @@ module Invidious::Routes::Login captcha_type ||= "image" account_type = "invidious" - tfa = false - prompt = "" if captcha_type == "image" captcha = Invidious::User::Captcha.generate_image(HMAC_KEY) @@ -481,11 +211,4 @@ module Invidious::Routes::Login env.redirect referer end - - def self.captcha(env) - headers = HTTP::Headers{":authority" => "accounts.google.com"} - response = YT_POOL.client &.get(env.request.resource, headers) - env.response.headers["Content-Type"] = response.headers["Content-Type"] - response.body - end end diff --git a/src/invidious/routes/notifications.cr b/src/invidious/routes/notifications.cr index 272a3dc7..8922b740 100644 --- a/src/invidious/routes/notifications.cr +++ b/src/invidious/routes/notifications.cr @@ -24,50 +24,6 @@ module Invidious::Routes::Notifications user = user.as(User) - if !user.password - channel_req = {} of String => String - - channel_req["receive_all_updates"] = env.params.query["receive_all_updates"]? || "true" - channel_req["receive_no_updates"] = env.params.query["receive_no_updates"]? || "" - channel_req["receive_post_updates"] = env.params.query["receive_post_updates"]? || "true" - - channel_req.reject! { |k, v| v != "true" && v != "false" } - - headers = HTTP::Headers.new - headers["Cookie"] = env.request.headers["Cookie"] - - html = YT_POOL.client &.get("/subscription_manager?disable_polymer=1", headers) - - cookies = HTTP::Cookies.from_client_headers(headers) - html.cookies.each do |cookie| - if {"VISITOR_INFO1_LIVE", "YSC", "SIDCC"}.includes? cookie.name - if cookies[cookie.name]? - cookies[cookie.name] = cookie - else - cookies << cookie - end - end - end - headers = cookies.add_request_headers(headers) - - if match = html.body.match(/'XSRF_TOKEN': "(?[^"]+)"/) - session_token = match["session_token"] - else - return env.redirect referer - end - - headers["content-type"] = "application/x-www-form-urlencoded" - channel_req["session_token"] = session_token - - subs = XML.parse_html(html.body) - subs.xpath_nodes(%q(//a[@class="subscription-title yt-uix-sessionlink"]/@href)).each do |channel| - channel_id = channel.content.lstrip("/channel/").not_nil! - channel_req["channel_id"] = channel_id - - YT_POOL.client &.post("/subscription_ajax?action_update_subscription_preferences=1", headers, form: channel_req) - end - end - if redirect env.redirect referer else diff --git a/src/invidious/routes/playlists.cr b/src/invidious/routes/playlists.cr index 0d242ee6..1dd3f32e 100644 --- a/src/invidious/routes/playlists.cr +++ b/src/invidious/routes/playlists.cr @@ -320,10 +320,6 @@ module Invidious::Routes::Playlists end end - if !user.password - # TODO: Playlist stub, sync with YouTube for Google accounts - # playlist_ajax(playlist_id, action, env.request.headers) - end email = user.email case action @@ -410,8 +406,8 @@ module Invidious::Routes::Playlists return error_template(500, ex) end - page_count = (playlist.video_count / 100).to_i - page_count += 1 if (playlist.video_count % 100) > 0 + page_count = (playlist.video_count / 200).to_i + page_count += 1 if (playlist.video_count % 200) > 0 if page > page_count return env.redirect "/playlist?list=#{plid}&page=#{page_count}" @@ -422,7 +418,7 @@ module Invidious::Routes::Playlists end begin - videos = get_playlist_videos(playlist, offset: (page - 1) * 100) + videos = get_playlist_videos(playlist, offset: (page - 1) * 200) rescue ex return error_template(500, "Error encountered while retrieving playlist videos.
#{ex.message}") end diff --git a/src/invidious/routes/subscriptions.cr b/src/invidious/routes/subscriptions.cr index 0704c05e..7f9ec592 100644 --- a/src/invidious/routes/subscriptions.cr +++ b/src/invidious/routes/subscriptions.cr @@ -43,11 +43,6 @@ module Invidious::Routes::Subscriptions channel_id = env.params.query["c"]? channel_id ||= "" - if !user.password - # Sync subscriptions with YouTube - subscribe_ajax(channel_id, action, env.request.headers) - end - case action when "action_create_subscription_to_channel" if !user.subscriptions.includes? channel_id @@ -82,14 +77,6 @@ module Invidious::Routes::Subscriptions user = user.as(User) sid = sid.as(String) - if !user.password - # Refresh account - headers = HTTP::Headers.new - headers["Cookie"] = env.request.headers["Cookie"] - - user, sid = get_user(sid, headers) - end - action_takeout = env.params.query["action_takeout"]?.try &.to_i? action_takeout ||= 0 action_takeout = action_takeout == 1 diff --git a/src/invidious/routing.cr b/src/invidious/routing.cr index 72ee9194..daaf4d88 100644 --- a/src/invidious/routing.cr +++ b/src/invidious/routing.cr @@ -57,7 +57,6 @@ module Invidious::Routing get "/login", Routes::Login, :login_page post "/login", Routes::Login, :login post "/signout", Routes::Login, :signout - get "/Captcha", Routes::Login, :captcha # User preferences get "/preferences", Routes::PreferencesRoute, :show diff --git a/src/invidious/user/imports.cr b/src/invidious/user/imports.cr index e4b25156..0a2fe1e2 100644 --- a/src/invidious/user/imports.cr +++ b/src/invidious/user/imports.cr @@ -6,7 +6,7 @@ struct Invidious::User # Parse a youtube CSV subscription file def parse_subscription_export_csv(csv_content : String) - rows = CSV.new(csv_content, headers: true) + rows = CSV.new(csv_content.strip('\n'), headers: true) subscriptions = Array(String).new # Counter to limit the amount of imports. @@ -32,10 +32,10 @@ struct Invidious::User def parse_playlist_export_csv(user : User, raw_input : String) # Split the input into head and body content - raw_head, raw_body = raw_input.split("\n\n", limit: 2, remove_empty: true) + raw_head, raw_body = raw_input.strip('\n').split("\n\n", limit: 2, remove_empty: true) # Create the playlist from the head content - csv_head = CSV.new(raw_head, headers: true) + csv_head = CSV.new(raw_head.strip('\n'), headers: true) csv_head.next title = csv_head[4] description = csv_head[5] @@ -51,7 +51,7 @@ struct Invidious::User Invidious::Database::Playlists.update_description(playlist.id, description) # Add each video to the playlist from the body content - csv_body = CSV.new(raw_body, headers: true) + csv_body = CSV.new(raw_body.strip('\n'), headers: true) csv_body.each do |row| video_id = row[0] if playlist diff --git a/src/invidious/users.cr b/src/invidious/users.cr index b763596b..65566d20 100644 --- a/src/invidious/users.cr +++ b/src/invidious/users.cr @@ -3,75 +3,6 @@ require "crypto/bcrypt/password" # Materialized views may not be defined using bound parameters (`$1` as used elsewhere) MATERIALIZED_VIEW_SQL = ->(email : String) { "SELECT cv.* FROM channel_videos cv WHERE EXISTS (SELECT subscriptions FROM users u WHERE cv.ucid = ANY (u.subscriptions) AND u.email = E'#{email.gsub({'\'' => "\\'", '\\' => "\\\\"})}') ORDER BY published DESC" } -def get_user(sid, headers, refresh = true) - if email = Invidious::Database::SessionIDs.select_email(sid) - user = Invidious::Database::Users.select!(email: email) - - if refresh && Time.utc - user.updated > 1.minute - user, sid = fetch_user(sid, headers) - - Invidious::Database::Users.insert(user, update_on_conflict: true) - Invidious::Database::SessionIDs.insert(sid, user.email, handle_conflicts: true) - - begin - view_name = "subscriptions_#{sha256(user.email)}" - PG_DB.exec("CREATE MATERIALIZED VIEW #{view_name} AS #{MATERIALIZED_VIEW_SQL.call(user.email)}") - rescue ex - end - end - else - user, sid = fetch_user(sid, headers) - - Invidious::Database::Users.insert(user, update_on_conflict: true) - Invidious::Database::SessionIDs.insert(sid, user.email, handle_conflicts: true) - - begin - view_name = "subscriptions_#{sha256(user.email)}" - PG_DB.exec("CREATE MATERIALIZED VIEW #{view_name} AS #{MATERIALIZED_VIEW_SQL.call(user.email)}") - rescue ex - end - end - - return user, sid -end - -def fetch_user(sid, headers) - feed = YT_POOL.client &.get("/subscription_manager?disable_polymer=1", headers) - feed = XML.parse_html(feed.body) - - channels = feed.xpath_nodes(%q(//ul[@id="guide-channels"]/li/a)).compact_map do |channel| - if {"Popular on YouTube", "Music", "Sports", "Gaming"}.includes? channel["title"] - nil - else - channel["href"].lstrip("/channel/") - end - end - - channels = get_batch_channels(channels) - - email = feed.xpath_node(%q(//a[@class="yt-masthead-picker-header yt-masthead-picker-active-account"])) - if email - email = email.content.strip - else - email = "" - end - - token = Base64.urlsafe_encode(Random::Secure.random_bytes(32)) - - user = Invidious::User.new({ - updated: Time.utc, - notifications: [] of String, - subscriptions: channels, - email: email, - preferences: Preferences.new(CONFIG.default_user_preferences.to_tuple), - password: nil, - token: token, - watched: [] of String, - feed_needs_update: true, - }) - return user, sid -end - def create_user(sid, email, password) password = Crypto::Bcrypt::Password.create(password, cost: 10) token = Base64.urlsafe_encode(Random::Secure.random_bytes(32)) @@ -91,38 +22,6 @@ def create_user(sid, email, password) return user, sid end -def subscribe_ajax(channel_id, action, env_headers) - headers = HTTP::Headers.new - headers["Cookie"] = env_headers["Cookie"] - - html = YT_POOL.client &.get("/subscription_manager?disable_polymer=1", headers) - - cookies = HTTP::Cookies.from_client_headers(headers) - html.cookies.each do |cookie| - if {"VISITOR_INFO1_LIVE", "YSC", "SIDCC"}.includes? cookie.name - if cookies[cookie.name]? - cookies[cookie.name] = cookie - else - cookies << cookie - end - end - end - headers = cookies.add_request_headers(headers) - - if match = html.body.match(/'XSRF_TOKEN': "(?[^"]+)"/) - session_token = match["session_token"] - - headers["content-type"] = "application/x-www-form-urlencoded" - - post_req = { - session_token: session_token, - } - post_url = "/subscription_ajax?#{action}=1&c=#{channel_id}" - - YT_POOL.client &.post(post_url, headers, form: post_req) - end -end - def get_subscription_feed(user, max_results = 40, page = 1) limit = max_results.clamp(0, MAX_ITEMS_PER_PAGE) offset = (page - 1) * limit diff --git a/src/invidious/videos.cr b/src/invidious/videos.cr index 0038a97a..f38b33e5 100644 --- a/src/invidious/videos.cr +++ b/src/invidious/videos.cr @@ -394,7 +394,9 @@ def fetch_video(id, region) if reason = info["reason"]? if reason == "Video unavailable" raise NotFoundException.new(reason.as_s || "") - else + elsif !reason.as_s.starts_with? "Premieres" + # dont error when it's a premiere. + # we already parsed most of the data and display the premiere date raise InfoException.new(reason.as_s || "") end end diff --git a/src/invidious/videos/parser.cr b/src/invidious/videos/parser.cr index 2e8eecc3..9cc0ffdc 100644 --- a/src/invidious/videos/parser.cr +++ b/src/invidious/videos/parser.cr @@ -78,7 +78,11 @@ def extract_video_info(video_id : String, proxy_region : String? = nil) elsif video_id != player_response.dig("videoDetails", "videoId") # YouTube may return a different video player response than expected. # See: https://github.com/TeamNewPipe/NewPipe/issues/8713 - raise VideoNotAvailableException.new("The video returned by YouTube isn't the requested one. (WEB client)") + # Line to be reverted if one day we solve the video not available issue. + return { + "version" => JSON::Any.new(Video::SCHEMA_VERSION.to_i64), + "reason" => JSON::Any.new("Can't load the video on this Invidious instance. YouTube is currently trying to block Invidious instances. Click here for more info about the issue."), + } else reason = nil end diff --git a/src/invidious/views/components/search_box.ecr b/src/invidious/views/components/search_box.ecr index 1240e5bd..a03785d1 100644 --- a/src/invidious/views/components/search_box.ecr +++ b/src/invidious/views/components/search_box.ecr @@ -1,6 +1,6 @@
- autofocus<% end %> name="q" placeholder="<%= translate(locale, "search") %>" title="<%= translate(locale, "search") %>" diff --git a/src/invidious/views/privacy.ecr b/src/invidious/views/privacy.ecr index 643f880b..bc5ff40b 100644 --- a/src/invidious/views/privacy.ecr +++ b/src/invidious/views/privacy.ecr @@ -16,12 +16,11 @@
  • a list of channel UCIDs the user is subscribed to
  • a user ID (for persistent storage of subscriptions and preferences)
  • a json object containing user preferences
  • -
  • a hashed password if applicable (not present on google accounts)
  • +
  • a hashed password
  • a randomly generated token for providing an RSS feed of a user's subscriptions
  • a list of video IDs identifying watched videos
  • Users can clear their watch history using the clear watch history page.

    -

    If a user is logged in with a Google account, no password will ever be stored. This website uses the session token provided by Google to identify a user, but does not store the information required to make requests on a user's behalf without their knowledge or consent.

    Data you passively provide

    When you request any resource from this website (for example: a page, a font, an image, or an API endpoint) information about the request may be logged.

    diff --git a/src/invidious/views/user/login.ecr b/src/invidious/views/user/login.ecr index 01d7a210..2b03d280 100644 --- a/src/invidious/views/user/login.ecr +++ b/src/invidious/views/user/login.ecr @@ -7,42 +7,6 @@
    <% case account_type when %> - <% when "google" %> - -
    - <% if email %> - - <% else %> - - "> - <% end %> - - <% if password %> - - <% else %> - - "> - <% end %> - - <% if prompt %> - - - <% end %> - - <% if tfa %> - - <% end %> - - <% if captcha %> - - - - "> - <% end %> - - -
    - <% else # "invidious" %>
    diff --git a/src/invidious/yt_backend/connection_pool.cr b/src/invidious/yt_backend/connection_pool.cr index 46e5bf85..658731cf 100644 --- a/src/invidious/yt_backend/connection_pool.cr +++ b/src/invidious/yt_backend/connection_pool.cr @@ -8,13 +8,15 @@ def add_yt_headers(request) if request.headers["User-Agent"] == "Crystal" - request.headers["User-Agent"] ||= "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36" + request.headers["User-Agent"] ||= "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" end + request.headers["Accept-Charset"] ||= "ISO-8859-1,utf-8;q=0.7,*;q=0.7" request.headers["Accept"] ||= "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" request.headers["Accept-Language"] ||= "en-us,en;q=0.5" + # Preserve original cookies and add new YT consent cookie for EU servers - request.headers["Cookie"] = "#{request.headers["cookie"]?}; CONSENT=YES+" + request.headers["Cookie"] = "#{request.headers["cookie"]?}; CONSENT=PENDING+#{Random.rand(100..999)}" if !CONFIG.cookies.empty? request.headers["Cookie"] = "#{(CONFIG.cookies.map { |c| "#{c.name}=#{c.value}" }).join("; ")}; #{request.headers["cookie"]?}" end diff --git a/src/invidious/yt_backend/extractors.cr b/src/invidious/yt_backend/extractors.cr index 8ff4c1f9..6686e6e7 100644 --- a/src/invidious/yt_backend/extractors.cr +++ b/src/invidious/yt_backend/extractors.cr @@ -381,7 +381,7 @@ private module Parsers # Parses an InnerTube itemSectionRenderer into a SearchVideo. # Returns nil when the given object isn't a ItemSectionRenderer # - # A itemSectionRenderer seems to be a simple wrapper for a videoRenderer, used + # A itemSectionRenderer seems to be a simple wrapper for a videoRenderer or a playlistRenderer, used # by the result page for channel searches. It is located inside a continuationItems # container.It is very similar to RichItemRendererParser # @@ -394,6 +394,8 @@ private module Parsers private def self.parse(item_contents, author_fallback) child = VideoRendererParser.process(item_contents, author_fallback) + child ||= PlaylistRendererParser.process(item_contents, author_fallback) + return child end diff --git a/src/invidious/yt_backend/youtube_api.cr b/src/invidious/yt_backend/youtube_api.cr index 91a9332c..3dd9e9d8 100644 --- a/src/invidious/yt_backend/youtube_api.cr +++ b/src/invidious/yt_backend/youtube_api.cr @@ -7,16 +7,18 @@ module YoutubeAPI private DEFAULT_API_KEY = "AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8" - private ANDROID_APP_VERSION = "17.33.42" + private ANDROID_APP_VERSION = "18.20.38" # github.com/TeamNewPipe/NewPipeExtractor/blob/943b7c033bb9d07ead63ddab4441c287653e4384/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeParsingHelper.java#L1308 - private ANDROID_USER_AGENT = "com.google.android.youtube/17.33.42 (Linux; U; Android 12; US) gzip" + private ANDROID_USER_AGENT = "com.google.android.youtube/18.20.38 (Linux; U; Android 12; US) gzip" private ANDROID_SDK_VERSION = 31_i64 private ANDROID_VERSION = "12" - private IOS_APP_VERSION = "17.33.2" + + private IOS_APP_VERSION = "18.21.3" # github.com/TeamNewPipe/NewPipeExtractor/blob/943b7c033bb9d07ead63ddab4441c287653e4384/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeParsingHelper.java#L1330 - private IOS_USER_AGENT = "com.google.ios.youtube/17.33.2 (iPhone14,5; U; CPU iOS 15_6 like Mac OS X;)" + private IOS_USER_AGENT = "com.google.ios.youtube/18.21.3 (iPhone14,5; U; CPU iOS 15_6 like Mac OS X;)" # github.com/TeamNewPipe/NewPipeExtractor/blob/943b7c033bb9d07ead63ddab4441c287653e4384/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeParsingHelper.java#L1224 - private IOS_VERSION = "15.6.0.19G71" + private IOS_VERSION = "15.6.0.19G71" + private WINDOWS_VERSION = "10.0" # Enumerate used to select one of the clients supported by the API @@ -43,7 +45,7 @@ module YoutubeAPI ClientType::Web => { name: "WEB", name_proto: "1", - version: "2.20221118.01.00", + version: "2.20230602.01.00", api_key: DEFAULT_API_KEY, screen: "WATCH_FULL_SCREEN", os_name: "Windows", @@ -63,7 +65,7 @@ module YoutubeAPI ClientType::WebMobile => { name: "MWEB", name_proto: "2", - version: "2.20220805.01.00", + version: "2.20230531.05.00", api_key: DEFAULT_API_KEY, os_name: "Android", os_version: ANDROID_VERSION,