Compare commits

..

No commits in common. "f51a435f75e7a4980e0d77dda78e58e7761a599a" and "8ec75fcfda7b795f28075834e514fafe41d1a0fe" have entirely different histories.

80 changed files with 1031 additions and 344 deletions

View File

@ -1,37 +0,0 @@
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.

View File

@ -31,10 +31,6 @@ ifeq ($(DISABLE_QUIC), 1)
FLAGS += -Ddisable_quic
endif
ifeq ($(API_ONLY), 1)
FLAGS += -Dapi_only
endif
# -----------------------
# Main
@ -86,7 +82,6 @@ clean:
distclean: clean
rm -rf libs
rm -rf ~/.cache/{crystal,shards}
# -----------------------
@ -114,7 +109,6 @@ help:
@echo " RELEASE Make a release build (Default: 1)"
@echo " STATIC Link libraries statically (Default: 0)"
@echo ""
@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)"

View File

@ -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

View File

@ -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.insertAdjacentHTML('beforeend', response.contentHtml);
body.innerHTML += response.contentHtml;
} else {
body.removeChild(body.lastElementChild);

View File

@ -255,7 +255,8 @@ https_only: false
#registration_enabled: true
##
## Allow/Forbid users to log-in.
## Allow/Forbid users to log-in. This setting affects the ability
## to connect with BOTH Google and Invidious (local) accounts.
##
## Accepted values: true, false
## Default: true
@ -465,17 +466,13 @@ jobs:
#use_pubsub_feeds: false
##
## HMAC signing key used for CSRF tokens, cookies and pubsub
## HMAC signing key used for CSRF tokens 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: <none>
##
hmac_key: "CHANGE_ME!!"
#hmac_key:
##
## List of video IDs where the "download" widget must be

View File

@ -30,7 +30,6 @@ 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

View File

@ -1,15 +1 @@
{
"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"
}
{}

View File

@ -14,6 +14,7 @@
"Clear watch history?": "هل تريد محو سجل المشاهدة؟",
"New password": "كلمة مرور جديدة",
"New passwords must match": "يَجبُ أن تكون كلمتا المرور متطابقتين",
"Cannot change password for Google accounts": "لا يُمكن تغيير كلمة المرور لِحسابات جوجل",
"Authorize token?": "رمز التفويض؟",
"Authorize token for `x`?": "السماح بالرمز المميز ل 'x'؟",
"Yes": "نعم",
@ -36,6 +37,7 @@
"source": "المصدر",
"Log in": "تسجيل الدخول",
"Log in/register": "تسجيل الدخول \\ إنشاء حساب",
"Log in with Google": "تسجيل الدخول باستخدام جوجل",
"User ID": "مُعرِّف المُستخدم",
"Password": "كلمة المرور",
"Time (h:mm:ss):": "الوقت (h:mm:ss):",
@ -44,12 +46,13 @@
"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": "السرعة الافتراضية: ",
@ -155,18 +158,23 @@
"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": "الرجاء تسجيل الدخول",

View File

@ -11,6 +11,7 @@
"Clear watch history?": "দেখার ইতিহাস সাফ করবেন?",
"New password": "নতুন পাসওয়ার্ড",
"New passwords must match": "নতুন পাসওয়ার্ড অবশ্যই মিলতে হবে",
"Cannot change password for Google accounts": "গুগল অ্যাকাউন্টগুলোর জন্য পাসওয়ার্ড পরিবর্তন করা যায় না",
"Authorize token?": "টোকেন অনুমোদন করবেন?",
"Authorize token for `x`?": "`x` -এর জন্য টোকেন অনুমোদন?",
"Yes": "হ্যাঁ",
@ -33,6 +34,7 @@
"source": "সূত্র",
"Log in": "লগ ইন",
"Log in/register": "লগ ইন/রেজিস্টার",
"Log in with Google": "গুগল দিয়ে লগ ইন করুন",
"User ID": "ইউজার আইডি",
"Password": "পাসওয়ার্ড",
"Time (h:mm:ss):": "সময় (ঘণ্টা:মিনিট:সেকেন্ড):",
@ -41,6 +43,7 @@
"Sign In": "সাইন ইন",
"Register": "নিবন্ধন",
"E-mail": "ই-মেইল",
"Google verification code": "গুগল যাচাইকরণ কোড",
"Preferences": "পছন্দসমূহ",
"preferences_category_player": "প্লেয়ারের পছন্দসমূহ",
"preferences_video_loop_label": "সর্বদা লুপ: ",

View File

@ -14,6 +14,7 @@
"Clear watch history?": "দেখার ইতিহাস সাফ করবেন?",
"New password": "নতুন পাসওয়ার্ড",
"New passwords must match": "নতুন পাসওয়ার্ড অবশ্যই মিলতে হবে",
"Cannot change password for Google accounts": "গুগল অ্যাকাউন্টগুলোর জন্য পাসওয়ার্ড পরিবর্তন করা যায় না",
"Authorize token?": "টোকেন অনুমোদন করবেন?",
"Authorize token for `x`?": "`x` -এর জন্য টোকেন অনুমোদন?",
"Yes": "হ্যাঁ",
@ -36,6 +37,7 @@
"source": "সূত্র",
"Log in": "লগ ইন",
"Log in/register": "লগ ইন/রেজিস্টার",
"Log in with Google": "গুগল দিয়ে লগ ইন করুন",
"User ID": "ইউজার আইডি",
"Password": "পাসওয়ার্ড",
"Time (h:mm:ss):": "সময় (ঘণ্টা:মিনিট:সেকেন্ড):",
@ -44,6 +46,7 @@
"Sign In": "সাইন ইন",
"Register": "নিবন্ধন",
"E-mail": "ই-মেইল",
"Google verification code": "গুগল যাচাইকরণ কোড",
"Preferences": "পছন্দসমূহ",
"preferences_category_player": "প্লেয়ারের পছন্দসমূহ",
"preferences_video_loop_label": "সর্বদা লুপ: ",

View File

@ -4,6 +4,7 @@
"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: ",
@ -136,6 +137,7 @@
"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",
@ -184,6 +186,7 @@
"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)",
@ -222,6 +225,7 @@
},
"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)",
@ -268,6 +272,7 @@
"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.",
@ -286,6 +291,7 @@
"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ó",
@ -430,6 +436,7 @@
"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: ",
@ -438,6 +445,7 @@
"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",
@ -475,6 +483,5 @@
"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",
"Import YouTube playlist (.csv)": "Importar llista de reproducció de YouTube (.csv)"
"Download is disabled": "Les baixades s'han inhabilitat"
}

View File

@ -14,6 +14,7 @@
"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",
@ -36,6 +37,7 @@
"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):",
@ -44,6 +46,7 @@
"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: ",
@ -332,6 +335,7 @@
"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ů",
@ -345,6 +349,7 @@
"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",
@ -428,6 +433,7 @@
"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: ",
@ -446,6 +452,8 @@
"([^.,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.",

View File

@ -14,6 +14,7 @@
"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",
@ -36,6 +37,7 @@
"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):",
@ -44,6 +46,7 @@
"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: ",
@ -156,12 +159,17 @@
"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",

View File

@ -14,6 +14,7 @@
"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",
@ -36,6 +37,7 @@
"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):",
@ -44,6 +46,7 @@
"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: ",
@ -161,12 +164,17 @@
"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",
@ -475,6 +483,5 @@
"Channel Sponsor": "Kanalsponsor",
"Standard YouTube license": "Standard YouTube-Lizenz",
"Song: ": "Musik: ",
"Download is disabled": "Herunterladen ist deaktiviert",
"Import YouTube playlist (.csv)": "YouTube Playlist Importieren (.csv)"
"Download is disabled": "Herunterladen ist deaktiviert"
}

View File

@ -14,6 +14,7 @@
"Clear watch history?": "Διαγραφή ιστορικού προβολής;",
"New password": "Νέος κωδικός πρόσβασης",
"New passwords must match": "Οι νέοι κωδικοί πρόσβασης πρέπει να ταιριάζουν",
"Cannot change password for Google accounts": "Δεν επιτρέπεται η αλλαγή κωδικού πρόσβασης λογαριασμών Google",
"Authorize token?": "Εξουσιοδότηση διασύνδεσης;",
"Authorize token for `x`?": "Εξουσιοδότηση διασύνδεσης με `x`;",
"Yes": "Ναι",
@ -36,6 +37,7 @@
"source": "πηγή",
"Log in": "Σύνδεση",
"Log in/register": "Σύνδεση/εγγραφή",
"Log in with Google": "Σύνδεση με Google",
"User ID": "Ταυτότητα χρήστη",
"Password": "Κωδικός πρόσβασης",
"Time (h:mm:ss):": "Ώρα (ω:λλ:δδ):",
@ -44,6 +46,7 @@
"Sign In": "Σύνδεση",
"Register": "Εγγραφή",
"E-mail": "Ηλεκτρονικό ταχυδρομείο",
"Google verification code": "Κωδικός επαλήθευσης Google",
"Preferences": "Προτιμήσεις",
"preferences_category_player": "Προτιμήσεις αναπαραγωγής",
"preferences_video_loop_label": "Αυτόματη επανάληψη: ",
@ -152,12 +155,17 @@
"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": "Συνδεθείτε",

View File

@ -24,6 +24,7 @@
"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",
@ -47,6 +48,7 @@
"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):",
@ -55,6 +57,7 @@
"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: ",
@ -205,12 +208,17 @@
"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",

View File

@ -14,6 +14,7 @@
"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",
@ -36,6 +37,7 @@
"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):",
@ -44,6 +46,7 @@
"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: ",
@ -161,12 +164,17 @@
"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",

View File

@ -14,6 +14,7 @@
"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í",
@ -36,6 +37,7 @@
"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):",
@ -44,6 +46,7 @@
"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: ",
@ -161,12 +164,17 @@
"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",
@ -390,8 +398,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}} visualización",
"generic_views_count_plural": "{{count}} visualizaciones",
"generic_views_count": "{{count}} vista",
"generic_views_count_plural": "{{count}} vistas",
"generic_subscribers_count": "{{count}} suscriptor",
"generic_subscribers_count_plural": "{{count}} suscriptores",
"generic_subscriptions_count": "{{count}} suscripción",
@ -407,7 +415,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}} video",
"generic_videos_count_plural": "{{count}} videos",
"generic_count_months": "{{count}} mes",
"generic_count_months_plural": "{{count}} meses",
"comments_points_count": "{{count}} punto",

View File

@ -25,6 +25,7 @@
"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",
@ -37,6 +38,7 @@
"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):",
@ -116,10 +118,12 @@
"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",
@ -286,6 +290,8 @@
"": "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",

View File

@ -14,6 +14,7 @@
"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",
@ -35,6 +36,7 @@
"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):",
@ -91,6 +93,7 @@
"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",
@ -133,6 +136,7 @@
"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",
@ -200,6 +204,7 @@
"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.",
@ -215,6 +220,7 @@
"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'",
@ -236,7 +242,9 @@
"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: ",

View File

@ -19,6 +19,7 @@
"Clear watch history?": "پاک کردن تاریخچه نمایش؟",
"New password": "گذرواژه تازه",
"New passwords must match": "گذارواژه های تازه باید باهم همخوانی داشته باشند",
"Cannot change password for Google accounts": "نمیتوان گذرواژه را برای حساب های کاربری گوگل تغییر داد",
"Authorize token?": "توکن دسترسی؟",
"Authorize token for `x`?": "توکن دسترسی برای `x`؟",
"Yes": "بله",
@ -41,6 +42,7 @@
"source": "منبع",
"Log in": "ورود",
"Log in/register": "ورود/ثبت نام",
"Log in with Google": "ورود با گوگل",
"User ID": "شناسه کاربری",
"Password": "گذرواژه",
"Time (h:mm:ss):": "زمان (h:mm:ss):",
@ -49,6 +51,7 @@
"Sign In": "ورود",
"Register": "ثبت نام",
"E-mail": "ایمیل",
"Google verification code": "کد تایید گوگل",
"Preferences": "ترجیحات",
"preferences_category_player": "ترجیحات نمایش‌دهنده",
"preferences_video_loop_label": "همواره ویدئو را بازپخش کن ",
@ -168,12 +171,17 @@
"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": "لطفا وارد شوید",

View File

@ -14,6 +14,7 @@
"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ä",
@ -36,6 +37,7 @@
"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):",
@ -44,6 +46,7 @@
"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: ",
@ -160,12 +163,17 @@
"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ä",

View File

@ -24,6 +24,7 @@
"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",
@ -46,6 +47,7 @@
"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) :",
@ -54,6 +56,7 @@
"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 : ",
@ -176,12 +179,17 @@
"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",
@ -465,7 +473,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. <a href=\"`x`\">Cliquez ici pour retourner à la liste de lecture.</a>",
"channel_tab_shorts_label": "Vidéos courtes",
"channel_tab_shorts_label": "Clips",
"channel_tab_streams_label": "Vidéos en direct",
"channel_tab_playlists_label": "Listes de lecture",
"channel_tab_channels_label": "Chaînes",
@ -475,6 +483,5 @@
"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é",
"Import YouTube playlist (.csv)": "Importer des listes de lecture de Youtube (.csv)"
"Download is disabled": "Le téléchargement est désactivé"
}

View File

@ -14,6 +14,7 @@
"Clear watch history?": "לנקות את היסטוריית הצפייה?",
"New password": "סיסמה חדשה",
"New passwords must match": "על הסיסמאות החדשות להתאים",
"Cannot change password for Google accounts": "לא ניתן לשנות את הסיסמה לחשבונות Google",
"Authorize token?": "לאשר את האסימון?",
"Authorize token for `x`?": "האם לאשר את האסימון עבור `x`?",
"Yes": "כן",
@ -36,6 +37,7 @@
"source": "source",
"Log in": "כניסה",
"Log in/register": "כניסה/הרשמה",
"Log in with Google": "כניסה עם Google",
"User ID": "שם משתמש",
"Password": "סיסמה",
"Time (h:mm:ss):": "זמן (h:mm:ss):",
@ -44,6 +46,7 @@
"Sign In": "התחברות",
"Register": "הרשמה",
"E-mail": "דוא״ל",
"Google verification code": "קוד האימות של Google",
"Preferences": "העדפות",
"preferences_category_player": "העדפות הנגן",
"preferences_autoplay_label": "ניגון אוטומטי: ",
@ -134,6 +137,7 @@
"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`",

View File

@ -4,6 +4,7 @@
"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": "डिफ़ॉल्ट मुखपृष्ठ: ",
@ -57,6 +58,7 @@
"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": "डेटा को आयात और निर्यात करें",
@ -79,6 +81,7 @@
"Password": "पासवर्ड",
"Register": "पंजीकृत करें",
"E-mail": "ईमेल",
"Google verification code": "Google प्रमाणीकरण कोड",
"Time (h:mm:ss):": "समय (घं:मिमि:सेसे):",
"Text CAPTCHA": "टेक्स्ट CAPTCHA",
"Image CAPTCHA": "चित्र CAPTCHA",
@ -221,10 +224,15 @@
"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 निजी फ़ीड",

View File

@ -14,6 +14,7 @@
"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",
@ -36,6 +37,7 @@
"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):",
@ -44,6 +46,7 @@
"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: ",
@ -161,12 +164,17 @@
"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",

View File

@ -24,6 +24,7 @@
"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",
@ -46,6 +47,7 @@
"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):",
@ -54,6 +56,7 @@
"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: ",
@ -170,12 +173,16 @@
"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.",
@ -412,6 +419,7 @@
"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",

View File

@ -19,6 +19,7 @@
"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",
@ -41,6 +42,7 @@
"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):",
@ -49,6 +51,7 @@
"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: ",
@ -168,12 +171,17 @@
"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",

View File

@ -14,6 +14,7 @@
"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á",
@ -36,6 +37,7 @@
"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):",
@ -44,6 +46,7 @@
"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: ",
@ -152,12 +155,17 @@
"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",

View File

@ -20,6 +20,7 @@
"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ì",
@ -42,6 +43,7 @@
"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):",
@ -50,6 +52,7 @@
"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: ",
@ -166,12 +169,17 @@
"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",

View File

@ -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,6 +19,7 @@
"Clear watch history?": "再生履歴を削除しますか?",
"New password": "新しいパスワード",
"New passwords must match": "新しいパスワードが一致していません",
"Cannot change password for Google accounts": "Google アカウントのパスワードは変更できません",
"Authorize token?": "トークンを認証しますか?",
"Authorize token for `x`?": "トークン `x` を認証しますか?",
"Yes": "はい",
@ -41,6 +42,7 @@
"source": "ソース",
"Log in": "ログイン",
"Log in/register": "ログイン/登録",
"Log in with Google": "Google でログイン",
"User ID": "ユーザー ID",
"Password": "パスワード",
"Time (h:mm:ss):": "時間 (時:分分:秒秒):",
@ -49,15 +51,16 @@
"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": "デフォルトのコメント: ",
@ -106,7 +109,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 を有効化: ",
@ -117,12 +120,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 の元で公開",
@ -168,12 +171,17 @@
"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": "ログインしてください",
@ -339,7 +347,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": "特徴",
@ -375,7 +383,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",
@ -395,7 +403,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`前に配信を開始",
@ -436,7 +444,7 @@
"Popular enabled: ": "人気動画を有効化 ",
"search_message_use_another_instance": " <a href=\"`x`\">別のインスタンス上での検索</a>も可能です。",
"search_filters_apply_button": "選択したフィルターを適用",
"user_saved_playlists": "`x`個の保存済みの再生リスト",
"user_saved_playlists": "`x` 個の保存した再生リスト",
"crash_page_you_found_a_bug": "Invidious のバグのようです!",
"crash_page_refresh": "<a href=\"`x`\">ページを更新</a>を試す",
"preferences_watch_history_label": "再生履歴を有効化 ",

View File

@ -32,6 +32,7 @@
"preferences_video_loop_label": "항상 반복: ",
"preferences_category_player": "플레이어 설정",
"Preferences": "설정",
"Google verification code": "구글 인증 코드",
"E-mail": "이메일",
"Register": "회원가입",
"Sign In": "로그인",
@ -41,6 +42,7 @@
"Time (h:mm:ss):": "시각 (h:mm:ss):",
"Password": "비밀번호",
"User ID": "사용자 ID",
"Log in with Google": "구글로 로그인",
"Log in/register": "로그인/회원가입",
"Log in": "로그인",
"source": "출처",
@ -63,6 +65,7 @@
"Yes": "예",
"Authorize token for `x`?": "`x` 에 대한 토큰을 승인하시겠습니까?",
"Authorize token?": "토큰을 승인하시겠습니까?",
"Cannot change password for Google accounts": "구글 계정의 비밀번호를 변경할 수 없습니다",
"New passwords must match": "새 비밀번호는 일치해야 합니다",
"New password": "새 비밀번호",
"Clear watch history?": "재생 기록을 삭제 하시겠습니까?",
@ -109,6 +112,7 @@
"This channel does not exist.": "이 채널은 존재하지 않습니다.",
"Deleted or invalid channel": "삭제되었거나 더 이상 존재하지 않는 채널",
"channel:`x`": "채널:`x`",
"Invalid TFA code": "유효하지 않은 TFA 코드",
"Show replies": "댓글 보기",
"Hide replies": "댓글 숨기기",
"Incorrect password": "잘못된 비밀번호",
@ -245,6 +249,7 @@
"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`개의 댓글 보기"
@ -267,6 +272,7 @@
"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.": "자바스크립트가 꺼져 있는 것 같습니다! 댓글을 보려면 여기를 클릭하세요. 댓글을 로드하는 데 시간이 조금 더 걸릴 수 있습니다.",
@ -276,11 +282,13 @@
"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": "재생목록으로 보기",
@ -459,6 +467,5 @@
"Album: ": "앨범: ",
"Music in this video": "동영상 속 음악",
"Artist: ": "아티스트: ",
"Download is disabled": "다운로드가 비활성화 되어있음",
"Import YouTube playlist (.csv)": "유튜브 플레이리스트 가져오기 (.csv)"
"Download is disabled": "다운로드가 비활성화 되어있음"
}

View File

@ -14,6 +14,7 @@
"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",
@ -36,6 +37,7 @@
"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):",
@ -44,6 +46,7 @@
"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: ",
@ -161,12 +164,17 @@
"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",

View File

@ -14,6 +14,7 @@
"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",
@ -36,6 +37,7 @@
"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):",
@ -44,6 +46,7 @@
"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: ",
@ -161,12 +164,17 @@
"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",
@ -464,17 +472,5 @@
"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. <a href=\"`x`\">Trykk her for spillelistens hjemmeside.</a>",
"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)"
"error_video_not_in_playlist": "Forespurt video finnes ikke i denne spillelisten. <a href=\"`x`\">Trykk her for spillelistens hjemmeside.</a>"
}

View File

@ -14,6 +14,7 @@
"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",
@ -36,6 +37,7 @@
"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):",
@ -44,6 +46,7 @@
"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: ",
@ -156,12 +159,17 @@
"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",

View File

@ -14,6 +14,7 @@
"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",
@ -36,6 +37,7 @@
"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):",
@ -44,6 +46,7 @@
"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: ",
@ -160,12 +163,17 @@
"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ć",

View File

@ -14,6 +14,7 @@
"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",
@ -36,6 +37,7 @@
"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):",
@ -44,6 +46,7 @@
"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: ",
@ -163,12 +166,17 @@
"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",
@ -475,6 +483,5 @@
"Standard YouTube license": "Licença padrão do YouTube",
"Song: ": "Música: ",
"Channel Sponsor": "Patrocinador do Canal",
"Download is disabled": "Download está desativado",
"Import YouTube playlist (.csv)": "Importar lista de reprodução do YouTube (.csv)"
"Download is disabled": "Download está desativado"
}

View File

@ -14,6 +14,7 @@
"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",
@ -36,6 +37,7 @@
"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):",
@ -44,6 +46,7 @@
"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: ",
@ -163,12 +166,17 @@
"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",

View File

@ -63,6 +63,8 @@
"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'?",
@ -79,6 +81,7 @@
"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",
@ -122,12 +125,15 @@
"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",
@ -226,6 +232,7 @@
"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",
@ -233,6 +240,7 @@
"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",
@ -475,6 +483,5 @@
"Song: ": "Canção: ",
"Channel Sponsor": "Patrocinador do canal",
"Standard YouTube license": "Licença padrão do YouTube",
"Download is disabled": "A descarga está desativada",
"Import YouTube playlist (.csv)": "Importar lista de reprodução do YouTube (.csv)"
"Download is disabled": "A descarga está desativada"
}

View File

@ -14,6 +14,7 @@
"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",
@ -36,6 +37,7 @@
"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) :",
@ -44,6 +46,7 @@
"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: ",
@ -152,12 +155,17 @@
"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ă",

View File

@ -4,7 +4,7 @@
"Unsubscribe": "Отписаться",
"Subscribe": "Подписаться",
"View channel on YouTube": "Смотреть канал на YouTube",
"View playlist on YouTube": осмотреть плейлист на YouTube",
"View playlist on YouTube": росмотреть подборку на ютубе",
"newest": "сначала новые",
"oldest": "сначала старые",
"popular": "популярные",
@ -14,6 +14,7 @@
"Clear watch history?": "Очистить историю просмотров?",
"New password": "Новый пароль",
"New passwords must match": "Новые пароли не совпадают",
"Cannot change password for Google accounts": "Изменить пароль учётной записи Google невозможно",
"Authorize token?": "Авторизовать токен?",
"Authorize token for `x`?": "Авторизовать токен для `x`?",
"Yes": "Да",
@ -36,6 +37,7 @@
"source": "источник",
"Log in": "Войти",
"Log in/register": "Войти или зарегистрироваться",
"Log in with Google": "Войти через Google",
"User ID": "ИД пользователя",
"Password": "Пароль",
"Time (h:mm:ss):": "Время (ч:мм:сс):",
@ -44,6 +46,7 @@
"Sign In": "Войти",
"Register": "Зарегистрироваться",
"E-mail": "Эл. почта",
"Google verification code": "Код подтверждения Google",
"Preferences": "Настройки",
"preferences_category_player": "Настройки проигрывателя",
"preferences_video_loop_label": "Всегда повторять: ",
@ -126,14 +129,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",
@ -161,12 +164,17 @@
"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": "Пожалуйста, войдите",
@ -179,9 +187,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": "Необходимо заполнить скрытое поле «токен»",
@ -302,7 +310,7 @@
"About": "О сайте",
"Rating: ": "Рейтинг: ",
"preferences_locale_label": "Язык: ",
"View as playlist": "Смотреть как плейлист",
"View as playlist": "Смотреть как подборку",
"Default": "По умолчанию",
"Music": "Музыка",
"Gaming": "Игры",
@ -318,16 +326,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": "Эта неделя",
@ -335,7 +343,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",
@ -377,7 +385,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": "пробовали <a href=\"`x`\"> перезагрузить страницу</a>",
@ -385,9 +393,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}} токенов",
@ -446,7 +454,7 @@
"footer_source_code": "Исходный код",
"footer_original_source_code": "Оригинальный исходный код",
"footer_modfied_source_code": "Изменённый исходный код",
"user_saved_playlists": "`x` сохранённых плейлистов",
"user_saved_playlists": "`x` сохранённых подборок",
"crash_page_search_issue": "поискали <a href=\"`x`\">похожую проблему на GitHub</a>",
"comments_points_count_0": "{{count}} плюс",
"comments_points_count_1": "{{count}} плюса",
@ -480,10 +488,10 @@
"search_filters_duration_option_medium": "Средние (4 - 20 минут)",
"search_filters_apply_button": "Применить фильтры",
"Popular enabled: ": "Популярное включено: ",
"error_video_not_in_playlist": "Запрошенного видео нет в этом плейлисте. <a href=\"`x`\">Нажмите тут, чтобы вернуться к странице плейлиста.</a>",
"channel_tab_playlists_label": лейлисты",
"error_video_not_in_playlist": "Запрошенного видео нет в этой подборке. <a href=\"`x`\">Нажмите тут, чтобы вернуться к странице подборки.</a>",
"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: ": "Исполнитель: ",
@ -491,6 +499,5 @@
"Song: ": "Композиция: ",
"Standard YouTube license": "Стандартная лицензия YouTube",
"Channel Sponsor": "Спонсор канала",
"Download is disabled": "Загрузка отключена",
"Import YouTube playlist (.csv)": "Импорт плейлиста YouTube (.csv)"
"Download is disabled": "Загрузка отключена"
}

View File

@ -14,6 +14,7 @@
"oldest": "පැරණිතම",
"popular": "ජනප්‍රිය",
"last": "අවසන්",
"Cannot change password for Google accounts": "Google ගිණුම් සඳහා මුරපදය වෙනස් කළ නොහැක",
"Authorize token?": "ටෝකනය අනුමත කරනවා ද?",
"Authorize token for `x`?": "`x` සඳහා ටෝකනය අනුමත කරනවා ද?",
"Yes": "ඔව්",
@ -30,6 +31,7 @@
"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": "පුරන්න",
@ -84,6 +86,7 @@
"User ID": "පරිශීලක කේතය",
"Text CAPTCHA": "CAPTCHA පෙල",
"Image CAPTCHA": "CAPTCHA රූපය",
"Google verification code": "Google සත්‍යාපන කේතය",
"E-mail": "විද්‍යුත් තැපෑල",
"preferences_quality_label": "කැමති වීඩියෝ ගුණත්වය: ",
"preferences_quality_option_hd720": "HD720",

View File

@ -12,6 +12,7 @@
"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",
@ -33,6 +34,7 @@
"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):",
@ -41,6 +43,7 @@
"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ť: ",

View File

@ -8,6 +8,7 @@
"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",
@ -21,6 +22,7 @@
"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):",
@ -30,6 +32,7 @@
"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: ",
@ -117,6 +120,9 @@
"([^.,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č",
@ -342,6 +348,8 @@
"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",
@ -507,6 +515,5 @@
"Song: ": "Pesem: ",
"Standard YouTube license": "Standardna licenca YouTube",
"Channel Sponsor": "Sponzor kanala",
"Download is disabled": "Prenos je onemogočen",
"Import YouTube playlist (.csv)": "Uvoz seznama predvajanja YouTube (.csv)"
"Download is disabled": "Prenos je onemogočen"
}

View File

@ -35,10 +35,12 @@
"videoinfo_youTube_embed_link": "Trupëzojeni",
"videoinfo_invidious_embed_link": "Lidhje Trupëzimi",
"oldest": "më të vjetrat",
"Cannot change password for Google accounts": "Smund 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):",
@ -154,14 +156,19 @@
"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.": "Sarrihet 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 smund të jetë i zbrazët",
"Password cannot be longer than 55 characters": "Fjalëkalimi smund të jetë më i gjatë se 55 shenja",
"Please log in": "Ju lutemi, bëni hyrjen",
@ -296,6 +303,7 @@
"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: ",

View File

@ -14,6 +14,7 @@
"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",
@ -36,6 +37,7 @@
"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):",
@ -44,6 +46,7 @@
"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: ",
@ -54,11 +57,13 @@
"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",
@ -177,6 +182,7 @@
"": "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",
@ -277,6 +283,8 @@
"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",

View File

@ -14,6 +14,7 @@
"Clear watch history?": "Избрисати повест прегледања?",
"New password": "Нова лозинка",
"New passwords must match": "Нове лозинке морају бити истоветне",
"Cannot change password for Google accounts": "Није могуће променити лозинку за Google налоге",
"Authorize token?": "Овласти жетон?",
"Authorize token for `x`?": "Овласти жетон за `x`?",
"Yes": "Да",
@ -36,6 +37,7 @@
"source": "извор",
"Log in": "Пријави се",
"Log in/register": "Пријави се/Отворите налог",
"Log in with Google": "Пријави се помоћу Google-а",
"User ID": "Кориснички ИД",
"Password": "Лозинка",
"Time (h:mm:ss):": "Време (ч:мм:сс):",
@ -44,6 +46,7 @@
"Sign In": "Пријава",
"Register": "Отвори налог",
"E-mail": "Е-пошта",
"Google verification code": "Google-ова оверна кода",
"Preferences": "Подешавања",
"preferences_category_player": "Подешавања репродуктора",
"preferences_video_loop_label": "Увек понављај: ",
@ -147,6 +150,8 @@
"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)": "Кинески (Традиционални)",
@ -159,6 +164,7 @@
"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": "Енглески",
@ -192,6 +198,7 @@
"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`",
@ -317,6 +324,7 @@
"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": "Хинди",

View File

@ -14,6 +14,7 @@
"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",
@ -36,6 +37,7 @@
"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):",
@ -44,6 +46,7 @@
"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: ",
@ -159,12 +162,17 @@
"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",

View File

@ -14,6 +14,7 @@
"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",
@ -36,6 +37,7 @@
"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):",
@ -44,6 +46,7 @@
"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ü: ",
@ -161,12 +164,17 @@
"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",

View File

@ -14,6 +14,7 @@
"Clear watch history?": "Очистити історію переглядів?",
"New password": "Новий пароль",
"New passwords must match": "Нові паролі не співпадають",
"Cannot change password for Google accounts": "Змінити пароль обліківки Google неможливо",
"Authorize token?": "Авторизувати токен?",
"Authorize token for `x`?": "Авторизувати токен для `x`?",
"Yes": "Так",
@ -36,6 +37,7 @@
"source": "джерело",
"Log in": "Увійти",
"Log in/register": "Увійти або зареєструватися",
"Log in with Google": "Увійти через Google",
"User ID": "ID користувача",
"Password": "Пароль",
"Time (h:mm:ss):": "Час (г:хх:сс):",
@ -44,6 +46,7 @@
"Sign In": "Увійти",
"Register": "Зареєструватися",
"E-mail": "Електронна пошта",
"Google verification code": "Код підтвердження Google",
"Preferences": "Налаштування",
"preferences_category_player": "Налаштування програвача",
"preferences_video_loop_label": "Завжди повторювати: ",
@ -152,12 +155,17 @@
"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": "Будь ласка, увійдіть",

View File

@ -1,10 +1,10 @@
{
"generic_videos_count_0": "{{count}} video",
"generic_subscribers_count_0": "{{count}} người theo dõi",
"generic_subscribers_count_0": "{{count}} subscribers",
"LIVE": "TRỰC TIẾP",
"Shared `x` ago": "Đã chia sẻ` x` trước",
"Unsubscribe": "Hủy theo dõi",
"Subscribe": "Theo dõi",
"Unsubscribe": "Hủy đăng ký",
"Subscribe": "Đăng ký",
"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,21 +16,22 @@
"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 Invidious JSON",
"Import YouTube subscriptions": "Nhập dữ liệu thuê bao YouTube/OPML",
"Import Invidious data": "Nhập dữ liệu sống động",
"Import YouTube subscriptions": "Nhập đăng ký YouTube",
"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 Invidious dưới dạng JSON",
"Export data as JSON": "Xuất dữ liệu 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",
@ -38,6 +39,7 @@
"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):",
@ -46,35 +48,36 @@
"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 trình phát video",
"preferences_category_player": "Tùy chọn người chơi",
"preferences_video_loop_label": "Luôn lặp lại: ",
"preferences_autoplay_label": "Tự chạy: ",
"preferences_continue_label": "Phát kế tiếp theo mặc định: ",
"preferences_continue_label": "Phát tiếp theo 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": "Âm lượng trình phát video: ",
"preferences_volume_label": "Khối lượng trình phát: ",
"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 (yêu cầu WebGL): ",
"preferences_vr_mode_label": "Video 360 độ tương tác: ",
"preferences_category_visual": "Tùy chọn hình ảnh",
"preferences_player_style_label": "Phong cách trình phát: ",
"preferences_player_style_label": "Phong cách người chơi: ",
"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": "Tự động chuyển hướng phiên bản (dự phòng về redirect.invidious.io): ",
"preferences_automatic_instance_redirect_label": "Chuyển hướng phiên bản tự động (dự phòng thành 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: ",
@ -114,14 +117,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": "Không hiển thị",
"Unlisted": "Riêng tư",
"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",
@ -149,12 +152,17 @@
"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",
@ -337,51 +345,6 @@
"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",
"([^.,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 <a href=\"`x`\"> ở một phiên bản khác</a>.",
"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."
"": "Xem `x` bình luận"
}
}

View File

@ -19,6 +19,7 @@
"Clear watch history?": "清除观看历史?",
"New password": "新密码",
"New passwords must match": "新密码必须匹配",
"Cannot change password for Google accounts": "无法为 Google 账户更改密码",
"Authorize token?": "授权令牌?",
"Authorize token for `x`?": "`x` 的授权令牌?",
"Yes": "是",
@ -41,6 +42,7 @@
"source": "source",
"Log in": "登录",
"Log in/register": "登录/注册",
"Log in with Google": "使用 Google 账户登录",
"User ID": "用户 ID",
"Password": "密码",
"Time (h:mm:ss):": "时间 (h:mm:ss):",
@ -49,6 +51,7 @@
"Sign In": "登录",
"Register": "注册",
"E-mail": "E-mail",
"Google verification code": "Google 验证代码",
"Preferences": "偏好设置",
"preferences_category_player": "播放器偏好设置",
"preferences_video_loop_label": "始终循环: ",
@ -168,12 +171,17 @@
"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": "请登录",

View File

@ -19,6 +19,7 @@
"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": "是",
@ -41,6 +42,7 @@
"source": "來源",
"Log in": "登入",
"Log in/register": "登入/註冊",
"Log in with Google": "使用 Google 登入",
"User ID": "使用者 ID",
"Password": "密碼",
"Time (h:mm:ss):": "時間 (h:mm:ss):",
@ -49,6 +51,7 @@
"Sign In": "登入",
"Register": "註冊",
"E-mail": "電子郵件",
"Google verification code": "Google 驗證碼",
"Preferences": "偏好設定",
"preferences_category_player": "播放器偏好設定",
"preferences_video_loop_label": "總是循環播放: ",
@ -168,12 +171,17 @@
"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": "請登入",

View File

@ -1,46 +0,0 @@
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

View File

@ -58,10 +58,11 @@ end
alias IV = Invidious
CONFIG = Config.load
HMAC_KEY = CONFIG.hmac_key
HMAC_KEY = CONFIG.hmac_key || Random::Secure.hex(32)
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")

View File

@ -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 4_i64
when "oldest" then 3_i64 # Broken as of 10/2022 :c
else 1_i64 # Fallback to "newest"
end

View File

@ -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,16 +206,6 @@ 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
@ -228,7 +218,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

View File

@ -22,6 +22,31 @@ 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(/(<br>)|(<br\/>)/, {
"<br>": "\n",

View File

@ -111,27 +111,24 @@ def decode_date(string : String)
else nil # Continue
end
# String matches format "20 hours ago", "4 months ago", "20s ago", "15min ago"...
match = string.match(/(?<count>\d+) ?(?<span>[smhdwy]\w*) ago/)
# String matches format "20 hours ago", "4 months ago"...
date = string.split(" ")[-3, 3]
delta = date[0].to_i
raise "Could not parse #{string}" if match.nil?
delta = match["count"].to_i
case match["span"]
when .starts_with? "s" # second(s)
case date[1]
when .includes? "second"
delta = delta.seconds
when .starts_with? "mi" # minute(s)
when .includes? "minute"
delta = delta.minutes
when .starts_with? "h" # hour(s)
when .includes? "hour"
delta = delta.hours
when .starts_with? "d" # day(s)
when .includes? "day"
delta = delta.days
when .starts_with? "w" # week(s)
when .includes? "week"
delta = delta.weeks
when .starts_with? "mo" # month(s)
when .includes? "month"
delta = delta.months
when .starts_with? "y" # year(s)
when .includes? "year"
delta = delta.years
else
raise "Could not parse #{string}"
@ -440,7 +437,7 @@ def parse_link_endpoint(endpoint : JSON::Any, text : String, video_id : String)
# - https://github.com/iv-org/invidious/issues/3062
text = %(<a href="#{url}">#{text}</a>)
else
text = %(<a href="#{url}">#{reduce_uri(text)}</a>)
text = %(<a href="#{url}">#{reduce_uri(url)}</a>)
end
end
return text

View File

@ -2,7 +2,7 @@ module Invidious::Jobs
JOBS = [] of BaseJob
# Automatically generate a structure that wraps the various
# jobs' configs, so that the following YAML config can be used:
# jobs' configs, so that the follwing YAML config can be used:
#
# jobs:
# job_name:

View File

@ -42,6 +42,11 @@ 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
@ -49,7 +54,7 @@ module Invidious::Routes::Account
end
password = env.params.body["password"]?
if password.nil? || password.empty?
if !password
return error_template(401, "Password is a required field")
end

View File

@ -178,6 +178,10 @@ 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

View File

@ -80,8 +80,10 @@ module Invidious::Routes::BeforeAll
raise "Cannot use token as SID"
end
if email = Database::SessionIDs.select_email(sid)
user = Database::Users.select!(email: email)
# 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",
@ -98,6 +100,30 @@ module Invidious::Routes::BeforeAll
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
end
end
dark_mode = convert_theme(env.params.query["dark_mode"]?) || preferences.dark_mode.to_s

View File

@ -83,6 +83,10 @@ 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

View File

@ -24,6 +24,9 @@ module Invidious::Routes::Login
captcha_type = env.params.query["captcha"]?
captcha_type ||= "image"
tfa = env.params.query["tfa"]?
prompt = nil
templated "user/login"
end
@ -44,18 +47,283 @@ 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}.<br/>"
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}.<br/>"
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}.<br/>"
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.<br/>"
else
traceback << "Using challenge #{challenge_results[0][-1][0][0][8]}.<br/>"
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.<br/>"
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.<br/>"
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}<br/>Traceback:<br/><div style="padding-left:2em" id="traceback">#{traceback.gets_to_end}</div>)
return error_template(500, error_message)
end
when "invidious"
if email.nil? || email.empty?
if !email
return error_template(401, "User ID is a required field")
end
if password.nil? || password.empty?
if !password
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)
@ -99,6 +367,8 @@ 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)
@ -211,4 +481,11 @@ 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

View File

@ -24,6 +24,50 @@ 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>[^"]+)"/)
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

View File

@ -320,6 +320,10 @@ 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
@ -406,8 +410,8 @@ module Invidious::Routes::Playlists
return error_template(500, ex)
end
page_count = (playlist.video_count / 200).to_i
page_count += 1 if (playlist.video_count % 200) > 0
page_count = (playlist.video_count / 100).to_i
page_count += 1 if (playlist.video_count % 100) > 0
if page > page_count
return env.redirect "/playlist?list=#{plid}&page=#{page_count}"
@ -418,7 +422,7 @@ module Invidious::Routes::Playlists
end
begin
videos = get_playlist_videos(playlist, offset: (page - 1) * 200)
videos = get_playlist_videos(playlist, offset: (page - 1) * 100)
rescue ex
return error_template(500, "Error encountered while retrieving playlist videos.<br>#{ex.message}")
end

View File

@ -43,6 +43,11 @@ 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
@ -77,6 +82,14 @@ 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

View File

@ -57,6 +57,7 @@ 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

View File

@ -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.strip('\n'), headers: true)
rows = CSV.new(csv_content, 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.strip('\n').split("\n\n", limit: 2, remove_empty: true)
raw_head, raw_body = raw_input.split("\n\n", limit: 2, remove_empty: true)
# Create the playlist from the head content
csv_head = CSV.new(raw_head.strip('\n'), headers: true)
csv_head = CSV.new(raw_head, 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.strip('\n'), headers: true)
csv_body = CSV.new(raw_body, headers: true)
csv_body.each do |row|
video_id = row[0]
if playlist

View File

@ -3,6 +3,75 @@ 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))
@ -22,6 +91,38 @@ 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>[^"]+)"/)
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

View File

@ -394,9 +394,7 @@ def fetch_video(id, region)
if reason = info["reason"]?
if reason == "Video unavailable"
raise NotFoundException.new(reason.as_s || "")
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
else
raise InfoException.new(reason.as_s || "")
end
end

View File

@ -78,11 +78,7 @@ 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
# 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. <a href=\"https://github.com/iv-org/invidious/issues/3822\">Click here for more info about the issue.</a>"),
}
raise VideoNotAvailableException.new("The video returned by YouTube isn't the requested one. (WEB client)")
else
reason = nil
end

View File

@ -1,6 +1,6 @@
<form class="pure-form" action="/search" method="get">
<fieldset>
<input type="search" id="searchbox" autocorrect="off"
<input type="search" id="searchbox" autocomplete="off" autocorrect="off"
autocapitalize="none" spellcheck="false" <% if autofocus %>autofocus<% end %>
name="q" placeholder="<%= translate(locale, "search") %>"
title="<%= translate(locale, "search") %>"

View File

@ -16,11 +16,12 @@
<li>a list of channel UCIDs the user is subscribed to</li>
<li>a user ID (for persistent storage of subscriptions and preferences)</li>
<li>a json object containing user preferences</li>
<li>a hashed password</li>
<li>a hashed password if applicable (not present on google accounts)</li>
<li>a randomly generated token for providing an RSS feed of a user's subscriptions</li>
<li>a list of video IDs identifying watched videos</li>
</ul>
<p>Users can clear their watch history using the <a href="/clear_watch_history">clear watch history</a> page.</p>
<p>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.</p>
<h3>Data you passively provide</h3>
<p>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.</p>

View File

@ -154,8 +154,8 @@
</div>
</div>
<% if CONFIG.footer %>
<div class="h-box v-box" id="footer-info">
<%= CONFIG.footer %>
<div class="h-box" style="padding-top: 1em; padding-bottom: 0.5em;">
<div id="footer-info" style="text-align: center;"><%= CONFIG.footer %></div>
</div>
<% end %>
</footer>

View File

@ -7,6 +7,42 @@
<div class="pure-u-1 pure-u-lg-3-5">
<div class="h-box">
<% case account_type when %>
<% when "google" %>
<form class="pure-form pure-form-stacked" action="/login?referer=<%= URI.encode_www_form(referer) %>&type=google" method="post">
<fieldset>
<% if email %>
<input name="email" type="hidden" value="<%= HTML.escape(email) %>">
<% else %>
<label for="email"><%= translate(locale, "E-mail") %> :</label>
<input required class="pure-input-1" name="email" type="email" placeholder="<%= translate(locale, "E-mail") %>">
<% end %>
<% if password %>
<input name="password" type="hidden" value="<%= HTML.escape(password) %>">
<% else %>
<label for="password"><%= translate(locale, "Password") %> :</label>
<input required class="pure-input-1" name="password" type="password" placeholder="<%= translate(locale, "Password") %>">
<% end %>
<% if prompt %>
<label for="tfa"><%= translate(locale, prompt) %> :</label>
<input required class="pure-input-1" name="tfa" type="text" placeholder="<%= translate(locale, prompt) %>">
<% end %>
<% if tfa %>
<input type="hidden" name="tfa" value="<%= tfa %>">
<% end %>
<% if captcha %>
<img style="width:50%" src="/Captcha?v=2&ctoken=<%= captcha[:tokens][0] %>"/>
<input type="hidden" name="token" value="<%= captcha[:tokens][0] %>">
<label for="answer"><%= translate(locale, "Answer") %> :</label>
<input type="text" name="answer" type="text" placeholder="<%= translate(locale, "Answer") %>">
<% end %>
<button type="submit" class="pure-button pure-button-primary"><%= translate(locale, "Sign In") %></button>
</fieldset>
</form>
<% else # "invidious" %>
<form class="pure-form pure-form-stacked" action="/login?referer=<%= URI.encode_www_form(referer) %>&type=invidious" method="post">
<fieldset>

View File

@ -8,15 +8,13 @@
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/114.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/104.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=PENDING+#{Random.rand(100..999)}"
request.headers["Cookie"] = "#{request.headers["cookie"]?}; CONSENT=YES+"
if !CONFIG.cookies.empty?
request.headers["Cookie"] = "#{(CONFIG.cookies.map { |c| "#{c.name}=#{c.value}" }).join("; ")}; #{request.headers["cookie"]?}"
end

View File

@ -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 or a playlistRenderer, used
# A itemSectionRenderer seems to be a simple wrapper for a videoRenderer, used
# by the result page for channel searches. It is located inside a continuationItems
# container.It is very similar to RichItemRendererParser
#
@ -394,8 +394,6 @@ 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

View File

@ -7,18 +7,16 @@ module YoutubeAPI
private DEFAULT_API_KEY = "AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8"
private ANDROID_APP_VERSION = "18.20.38"
private ANDROID_APP_VERSION = "17.33.42"
# 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/18.20.38 (Linux; U; Android 12; US) gzip"
private ANDROID_USER_AGENT = "com.google.android.youtube/17.33.42 (Linux; U; Android 12; US) gzip"
private ANDROID_SDK_VERSION = 31_i64
private ANDROID_VERSION = "12"
private IOS_APP_VERSION = "18.21.3"
private IOS_APP_VERSION = "17.33.2"
# 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/18.21.3 (iPhone14,5; U; CPU iOS 15_6 like Mac OS X;)"
private IOS_USER_AGENT = "com.google.ios.youtube/17.33.2 (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 WINDOWS_VERSION = "10.0"
# Enumerate used to select one of the clients supported by the API
@ -45,7 +43,7 @@ module YoutubeAPI
ClientType::Web => {
name: "WEB",
name_proto: "1",
version: "2.20230602.01.00",
version: "2.20221118.01.00",
api_key: DEFAULT_API_KEY,
screen: "WATCH_FULL_SCREEN",
os_name: "Windows",
@ -65,7 +63,7 @@ module YoutubeAPI
ClientType::WebMobile => {
name: "MWEB",
name_proto: "2",
version: "2.20230531.05.00",
version: "2.20220805.01.00",
api_key: DEFAULT_API_KEY,
os_name: "Android",
os_version: ANDROID_VERSION,