mirror of
https://github.com/iv-org/invidious.git
synced 2024-11-25 06:57:22 +00:00
Merge branch 'master' into master
This commit is contained in:
commit
8cd0137aed
@ -262,8 +262,23 @@ img.thumbnail {
|
|||||||
|
|
||||||
#player-container {
|
#player-container {
|
||||||
position: relative;
|
position: relative;
|
||||||
padding-bottom: 56.25%;
|
padding-bottom: 55.25%;
|
||||||
margin-left: 1em;
|
margin-left: 2em;
|
||||||
margin-right: 1em;
|
margin-right: 2em;
|
||||||
height: 0;
|
height: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#progress-container {
|
||||||
|
width: 100%;
|
||||||
|
border-radius: 2px;
|
||||||
|
background: #aaa;
|
||||||
|
}
|
||||||
|
|
||||||
|
#download-progress {
|
||||||
|
width: 0%;
|
||||||
|
border-radius: 2px;
|
||||||
|
height: 10px;
|
||||||
|
background-color: #0078e7;
|
||||||
|
margin-top: 0.5em;
|
||||||
|
margin-bottom: 0.5em;
|
||||||
|
}
|
||||||
|
@ -50,3 +50,59 @@ function hide_youtube_replies(target) {
|
|||||||
target.innerHTML = "Show replies";
|
target.innerHTML = "Show replies";
|
||||||
target.setAttribute("onclick", "show_youtube_replies(this)");
|
target.setAttribute("onclick", "show_youtube_replies(this)");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function download_video(target) {
|
||||||
|
var title = target.getAttribute("data-title");
|
||||||
|
var children = document.getElementById("download_widget").children;
|
||||||
|
var progress = document.getElementById("download-progress");
|
||||||
|
var url = "";
|
||||||
|
|
||||||
|
document.getElementById("progress-container").style.display = "";
|
||||||
|
|
||||||
|
for (i = 0; i < children.length; i++) {
|
||||||
|
if (children[i].selected) {
|
||||||
|
url = children[i].getAttribute("data-url");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
url = "/videoplayback" + url.split("/videoplayback")[1];
|
||||||
|
|
||||||
|
var xhr = new XMLHttpRequest();
|
||||||
|
xhr.open("GET", url);
|
||||||
|
xhr.responseType = "arraybuffer";
|
||||||
|
|
||||||
|
xhr.onprogress = function(event) {
|
||||||
|
if (event.lengthComputable) {
|
||||||
|
progress.style.width = "" + (event.loaded / event.total)*100 + "%";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
xhr.onload = function(event) {
|
||||||
|
if (event.currentTarget.status != 200) {
|
||||||
|
console.log("Downloading " + title + " failed.")
|
||||||
|
document.getElementById("progress-container").style.display = "none";
|
||||||
|
progress.style.width = "0%";
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var data = new Blob([xhr.response], {'type' : 'video/mp4'});
|
||||||
|
var videoFile = window.URL.createObjectURL(data);
|
||||||
|
|
||||||
|
var link = document.createElement('a');
|
||||||
|
link.href = videoFile;
|
||||||
|
link.setAttribute('download', title);
|
||||||
|
document.body.appendChild(link);
|
||||||
|
|
||||||
|
window.requestAnimationFrame(function() {
|
||||||
|
var event = new MouseEvent('click');
|
||||||
|
link.dispatchEvent(event);
|
||||||
|
document.body.removeChild(link);
|
||||||
|
});
|
||||||
|
|
||||||
|
document.getElementById("progress-container").style.display = "none";
|
||||||
|
progress.style.width = "0%";
|
||||||
|
};
|
||||||
|
|
||||||
|
xhr.send(null);
|
||||||
|
}
|
@ -275,6 +275,6 @@
|
|||||||
"Gaming": "الألعاب",
|
"Gaming": "الألعاب",
|
||||||
"News": "الأخبار",
|
"News": "الأخبار",
|
||||||
"Movies": "الأفلام",
|
"Movies": "الأفلام",
|
||||||
"Download as: ": "تحميل كـ",
|
"Download as:": "تحميل كـ",
|
||||||
"Download": "تحميل"
|
"Download": "تحميل"
|
||||||
}
|
}
|
||||||
|
549
locales/de.json
549
locales/de.json
@ -1,273 +1,280 @@
|
|||||||
{
|
{
|
||||||
"`x` subscribers": "`x` Abonnenten",
|
"`x` subscribers": "`x` Abonnenten",
|
||||||
"`x` videos": "`x` Videos",
|
"`x` videos": "`x` Videos",
|
||||||
"LIVE": "LIVE",
|
"LIVE": "LIVE",
|
||||||
"Shared `x` ago": "Vor `x` geteilt",
|
"Shared `x` ago": "Vor `x` geteilt",
|
||||||
"Unsubscribe": "Abbestellen",
|
"Unsubscribe": "Abbestellen",
|
||||||
"Subscribe": "Abonnieren",
|
"Subscribe": "Abonnieren",
|
||||||
"Login to subscribe to `x`": "Einloggen um `x` zu abonnieren",
|
"Login to subscribe to `x`": "Einloggen um `x` zu abonnieren",
|
||||||
"View channel on YouTube": "Kanal auf YouTube anzeigen",
|
"View channel on YouTube": "Kanal auf YouTube anzeigen",
|
||||||
"newest": "neueste",
|
"newest": "neueste",
|
||||||
"oldest": "älteste",
|
"oldest": "älteste",
|
||||||
"popular": "beliebt",
|
"popular": "beliebt",
|
||||||
"Preview page": "Vorschau Seite",
|
"Preview page": "Vorschau Seite",
|
||||||
"Next page": "Nächste Seite",
|
"Next page": "Nächste Seite",
|
||||||
"Clear watch history?": "Verlauf löschen?",
|
"Clear watch history?": "Verlauf löschen?",
|
||||||
"Yes": "Ja",
|
"Yes": "Ja",
|
||||||
"No": "Nein",
|
"No": "Nein",
|
||||||
"Import and Export Data": "Import und Export Daten",
|
"Import and Export Data": "Import und Export Daten",
|
||||||
"Import": "Importieren",
|
"Import": "Importieren",
|
||||||
"Import Invidious data": "Invidious Daten importieren",
|
"Import Invidious data": "Invidious Daten importieren",
|
||||||
"Import YouTube subscriptions": "YouTube Abonnements importieren",
|
"Import YouTube subscriptions": "YouTube Abonnements importieren",
|
||||||
"Import FreeTube subscriptions (.db)": "FreeTube Abonnements importieren (.db)",
|
"Import FreeTube subscriptions (.db)": "FreeTube Abonnements importieren (.db)",
|
||||||
"Import NewPipe subscriptions (.json)": "NewPipe Abonnements importieren (.json)",
|
"Import NewPipe subscriptions (.json)": "NewPipe Abonnements importieren (.json)",
|
||||||
"Import NewPipe data (.zip)": "NewPipe Daten importieren (.zip)",
|
"Import NewPipe data (.zip)": "NewPipe Daten importieren (.zip)",
|
||||||
"Export": "Exportieren",
|
"Export": "Exportieren",
|
||||||
"Export subscriptions as OPML": "Abonnements als OPML exportieren",
|
"Export subscriptions as OPML": "Abonnements als OPML exportieren",
|
||||||
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Abonnements als OPML exportieren (für NewPipe & FreeTube)",
|
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Abonnements als OPML exportieren (für NewPipe & FreeTube)",
|
||||||
"Export data as JSON": "Daten als JSON exportieren",
|
"Export data as JSON": "Daten als JSON exportieren",
|
||||||
"Delete account?": "Account löschen?",
|
"Delete account?": "Account löschen?",
|
||||||
"History": "Verlauf",
|
"History": "Verlauf",
|
||||||
"Previous page": "Vorherige Seite",
|
"Previous page": "Vorherige Seite",
|
||||||
"An alternative front-end to YouTube": "Eine alternative Oberfläche für YouTube",
|
"An alternative front-end to YouTube": "Eine alternative Oberfläche für YouTube",
|
||||||
"JavaScript license information": "JavaScript Lizenzinformationen",
|
"JavaScript license information": "JavaScript Lizenzinformationen",
|
||||||
"source": "Quelle",
|
"source": "Quelle",
|
||||||
"Login": "Einloggen",
|
"Login": "Einloggen",
|
||||||
"Login/Register": "Einloggen/Registrieren",
|
"Login/Register": "Einloggen/Registrieren",
|
||||||
"Login to Google": "In Google einloggen",
|
"Login to Google": "In Google einloggen",
|
||||||
"User ID:": "Benutzer ID:",
|
"User ID:": "Benutzer ID:",
|
||||||
"Password:": "Passwort:",
|
"Password:": "Passwort:",
|
||||||
"Time (h:mm:ss):": "Zeit (h:mm:ss):",
|
"Time (h:mm:ss):": "Zeit (h:mm:ss):",
|
||||||
"Text CAPTCHA": "Text CAPTCHA",
|
"Text CAPTCHA": "Text CAPTCHA",
|
||||||
"Image CAPTCHA": "Image CAPTCHA",
|
"Image CAPTCHA": "Image CAPTCHA",
|
||||||
"Sign In": "Einloggen",
|
"Sign In": "Einloggen",
|
||||||
"Register": "Registrieren",
|
"Register": "Registrieren",
|
||||||
"Email:": "Email:",
|
"Email:": "Email:",
|
||||||
"Google verification code:": "Google Bestätigungscode:",
|
"Google verification code:": "Google Bestätigungscode:",
|
||||||
"Preferences": "Einstellungen",
|
"Preferences": "Einstellungen",
|
||||||
"Player preferences": "Playereinstellungen",
|
"Player preferences": "Playereinstellungen",
|
||||||
"Always loop: ": "Immer wiederholen: ",
|
"Always loop: ": "Immer wiederholen: ",
|
||||||
"Autoplay: ": "Automatisch abspielen: ",
|
"Autoplay: ": "Automatisch abspielen: ",
|
||||||
"Autoplay next video: ": "nächstes Video automatisch abspielen: ",
|
"Autoplay next video: ": "nächstes Video automatisch abspielen: ",
|
||||||
"Listen by default: ": "Nur Ton als Standard: ",
|
"Listen by default: ": "Nur Ton als Standard: ",
|
||||||
"Default speed: ": "Standardgeschwindigkeit: ",
|
"Default speed: ": "Standardgeschwindigkeit: ",
|
||||||
"Preferred video quality: ": "Bevorzugte Videoqualität: ",
|
"Preferred video quality: ": "Bevorzugte Videoqualität: ",
|
||||||
"Player volume: ": "Playerlautstärke: ",
|
"Player volume: ": "Playerlautstärke: ",
|
||||||
"Default comments: ": "Standardkommentare: ",
|
"Default comments: ": "Standardkommentare: ",
|
||||||
"youtube": "youtube",
|
"youtube": "youtube",
|
||||||
"reddit": "reddit",
|
"reddit": "reddit",
|
||||||
"Default captions: ": "Standarduntertitel: ",
|
"Default captions: ": "Standarduntertitel: ",
|
||||||
"Fallback captions: ": "Ersatzuntertitel: ",
|
"Fallback captions: ": "Ersatzuntertitel: ",
|
||||||
"Show related videos? ": "Ähnliche Videos anzeigen? ",
|
"Show related videos? ": "Ähnliche Videos anzeigen? ",
|
||||||
"Visual preferences": "Anzeigeeinstellungen",
|
"Visual preferences": "Anzeigeeinstellungen",
|
||||||
"Dark mode: ": "Nachtmodus: ",
|
"Dark mode: ": "Nachtmodus: ",
|
||||||
"Thin mode: ": "Schlanker Modus: ",
|
"Thin mode: ": "Schlanker Modus: ",
|
||||||
"Subscription preferences": "Abonnementeinstellungen",
|
"Subscription preferences": "Abonnementeinstellungen",
|
||||||
"Redirect homepage to feed: ": "Startseite zu Feed umleiten: ",
|
"Redirect homepage to feed: ": "Startseite zu Feed umleiten: ",
|
||||||
"Number of videos shown in feed: ": "Anzahl von Videos die im Feed angezeigt werden: ",
|
"Number of videos shown in feed: ": "Anzahl von Videos die im Feed angezeigt werden: ",
|
||||||
"Sort videos by: ": "Videos sortieren nach: ",
|
"Sort videos by: ": "Videos sortieren nach: ",
|
||||||
"published": "veröffentlicht",
|
"published": "veröffentlicht",
|
||||||
"published - reverse": "veröffentlicht - invertiert",
|
"published - reverse": "veröffentlicht - invertiert",
|
||||||
"alphabetically": "alphabetisch",
|
"alphabetically": "alphabetisch",
|
||||||
"alphabetically - reverse": "alphabetisch - invertiert",
|
"alphabetically - reverse": "alphabetisch - invertiert",
|
||||||
"channel name": "Kanalname",
|
"channel name": "Kanalname",
|
||||||
"channel name - reverse": "Kanalname - invertiert",
|
"channel name - reverse": "Kanalname - invertiert",
|
||||||
"Only show latest video from channel: ": "Nur neueste Videos des Kanals anzeigen: ",
|
"Only show latest video from channel: ": "Nur neueste Videos des Kanals anzeigen: ",
|
||||||
"Only show latest unwatched video from channel: ": "Nur neueste ungesehene Videos des Kanals anzeigen: ",
|
"Only show latest unwatched video from channel: ": "Nur neueste ungesehene Videos des Kanals anzeigen: ",
|
||||||
"Only show unwatched: ": "Nur ungesehene anzeigen: ",
|
"Only show unwatched: ": "Nur ungesehene anzeigen: ",
|
||||||
"Only show notifications (if there are any): ": "Nur Benachrichtigungen anzeigen (wenn es welche gibt): ",
|
"Only show notifications (if there are any): ": "Nur Benachrichtigungen anzeigen (wenn es welche gibt): ",
|
||||||
"Data preferences": "Dateneinstellungen",
|
"Data preferences": "Dateneinstellungen",
|
||||||
"Clear watch history": "Verlauf löschen",
|
"Clear watch history": "Verlauf löschen",
|
||||||
"Import/Export data": "Daten im- exportieren",
|
"Import/Export data": "Daten im- exportieren",
|
||||||
"Manage subscriptions": "Abonnements verwalten",
|
"Manage subscriptions": "Abonnements verwalten",
|
||||||
"Watch history": "Verlauf",
|
"Watch history": "Verlauf",
|
||||||
"Delete account": "Account löschen",
|
"Delete account": "Account löschen",
|
||||||
"Save preferences": "Einstellungen speichern",
|
"Save preferences": "Einstellungen speichern",
|
||||||
"Subscription manager": "Abonnementverwaltung",
|
"Subscription manager": "Abonnementverwaltung",
|
||||||
"`x` subscriptions": "`x` Abonnements",
|
"`x` subscriptions": "`x` Abonnements",
|
||||||
"Import/Export": "Importieren/Exportieren",
|
"Import/Export": "Importieren/Exportieren",
|
||||||
"unsubscribe": "abbestellen",
|
"unsubscribe": "abbestellen",
|
||||||
"Subscriptions": "Abonnements",
|
"Subscriptions": "Abonnements",
|
||||||
"`x` unseen notifications": "`x` ungesehene Benachrichtigungen",
|
"`x` unseen notifications": "`x` ungesehene Benachrichtigungen",
|
||||||
"search": "Suchen",
|
"search": "Suchen",
|
||||||
"Sign out": "Abmelden",
|
"Sign out": "Abmelden",
|
||||||
"Released under the AGPLv3 by Omar Roth.": "Veröffentlicht unter AGPLv3 von Omar Roth.",
|
"Released under the AGPLv3 by Omar Roth.": "Veröffentlicht unter AGPLv3 von Omar Roth.",
|
||||||
"Source available here.": "Quellcode verfügbar hier.",
|
"Source available here.": "Quellcode verfügbar hier.",
|
||||||
"Liberapay: ": "Liberapay: ",
|
"Liberapay: ": "Liberapay: ",
|
||||||
"Patreon: ": "Patreon: ",
|
"Patreon: ": "Patreon: ",
|
||||||
"BTC: ": "BTC: ",
|
"BTC: ": "BTC: ",
|
||||||
"BCH: ": "BCH: ",
|
"BCH: ": "BCH: ",
|
||||||
"View JavaScript license information.": "Javascript Lizenzinformationen anzeigen.",
|
"View JavaScript license information.": "Javascript Lizenzinformationen anzeigen.",
|
||||||
"Trending": "Trending",
|
"Trending": "Trending",
|
||||||
"Watch video on Youtube": "Video auf YouTube ansehen",
|
"Watch video on Youtube": "Video auf YouTube ansehen",
|
||||||
"Genre: ": "Genre: ",
|
"Genre: ": "Genre: ",
|
||||||
"License: ": "Lizenz: ",
|
"License: ": "Lizenz: ",
|
||||||
"Family friendly? ": "Familienfreundlich? ",
|
"Family friendly? ": "Familienfreundlich? ",
|
||||||
"Wilson score: ": "Wilson-Score: ",
|
"Wilson score: ": "Wilson-Score: ",
|
||||||
"Engagement: ": "Engagement: ",
|
"Engagement: ": "Engagement: ",
|
||||||
"Whitelisted regions: ": "Erlaubte Regionen: ",
|
"Whitelisted regions: ": "Erlaubte Regionen: ",
|
||||||
"Blacklisted regions: ": "Unerlaubte Regionen: ",
|
"Blacklisted regions: ": "Unerlaubte Regionen: ",
|
||||||
"Shared `x`": "Geteilt `x`",
|
"Shared `x`": "Geteilt `x`",
|
||||||
"Hi! Looks like you have JavaScript disabled. Click here to view comments, keep in mind it may take a bit longer to load.": "Hallo! Anscheinend haben Sie JavaScript deaktiviert. Klicken Sie hier um Kommentare anzuzeigen, beachten sie dass es etwas länger dauern kann um sie zu laden.",
|
"Hi! Looks like you have JavaScript disabled. Click here to view comments, keep in mind it may take a bit longer to load.": "Hallo! Anscheinend haben Sie JavaScript deaktiviert. Klicken Sie hier um Kommentare anzuzeigen, beachten sie dass es etwas länger dauern kann um sie zu laden.",
|
||||||
"View YouTube comments": "YouTube Kommentare anzeigen",
|
"View YouTube comments": "YouTube Kommentare anzeigen",
|
||||||
"View more comments on Reddit": "Mehr Kommentare auf Reddit anzeigen",
|
"View more comments on Reddit": "Mehr Kommentare auf Reddit anzeigen",
|
||||||
"View `x` comments": "`x` Kommentare anzeigen",
|
"View `x` comments": "`x` Kommentare anzeigen",
|
||||||
"View Reddit comments": "Reddit Kommentare anzeigen",
|
"View Reddit comments": "Reddit Kommentare anzeigen",
|
||||||
"Hide replies": "Antworten verstecken",
|
"Hide replies": "Antworten verstecken",
|
||||||
"Show replies": "Antworten anzeigen",
|
"Show replies": "Antworten anzeigen",
|
||||||
"Incorrect password": "Falsches Passwort",
|
"Incorrect password": "Falsches Passwort",
|
||||||
"Quota exceeded, try again in a few hours": "Kontingent überschritten, versuche es in ein paar Stunden erneut",
|
"Quota exceeded, try again in a few hours": "Kontingent überschritten, versuche es in ein paar Stunden erneut",
|
||||||
"Unable to login, make sure two-factor authentication (Authenticator or SMS) is enabled.": "Login nicht möglich, stellen Sie sicher dass two-factor Authentifikation (Authentifizierung oder SMS) aktiviert ist.",
|
"Unable to login, make sure two-factor authentication (Authenticator or SMS) is enabled.": "Login nicht möglich, stellen Sie sicher dass two-factor Authentifikation (Authentifizierung oder SMS) aktiviert ist.",
|
||||||
"Invalid TFA code": "Ungültiger TFA Code",
|
"Invalid TFA code": "Ungültiger TFA Code",
|
||||||
"Login failed. This may be because two-factor authentication is not enabled on your account.": "Login fehlgeschlagen. Das kann daran liegen dass two-factor Authentifizierung in ihrem Account nicht aktiviert ist.",
|
"Login failed. This may be because two-factor authentication is not enabled on your account.": "Login fehlgeschlagen. Das kann daran liegen dass two-factor Authentifizierung in ihrem Account nicht aktiviert ist.",
|
||||||
"Invalid answer": "Ungültige Antwort",
|
"Invalid answer": "Ungültige Antwort",
|
||||||
"Invalid CAPTCHA": "Ungültiges CAPTCHA",
|
"Invalid CAPTCHA": "Ungültiges CAPTCHA",
|
||||||
"CAPTCHA is a required field": "CAPTCHA ist eine erforderliche Eingabe",
|
"CAPTCHA is a required field": "CAPTCHA ist eine erforderliche Eingabe",
|
||||||
"User ID is a required field": "Benutzer ID 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",
|
"Password is a required field": "Passwort ist eine erforderliche Eingabe",
|
||||||
"Invalid username or password": "Ungültiger Benutzername oder Passwort",
|
"Invalid username or password": "Ungültiger Benutzername oder Passwort",
|
||||||
"Please sign in using 'Sign in with Google'": "Bitte melden sie sich mit 'Mit Google anmelden' an",
|
"Please sign in using 'Sign in with Google'": "Bitte melden sie sich mit 'Mit Google anmelden' an",
|
||||||
"Password cannot be empty": "Passwort darf nicht leer sein",
|
"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",
|
"Password cannot be longer than 55 characters": "Passwort darf nicht länger als 55 Zeichen sein",
|
||||||
"Please sign in": "Bitte anmelden",
|
"Please sign in": "Bitte anmelden",
|
||||||
"Invidious Private Feed for `x`": "Invidious Persönlicher Feed für `x`",
|
"Invidious Private Feed for `x`": "Invidious Persönlicher Feed für `x`",
|
||||||
"channel:`x`": "Kanal:`x`",
|
"channel:`x`": "Kanal:`x`",
|
||||||
"Deleted or invalid channel": "Gelöschter oder ungültiger Kanal",
|
"Deleted or invalid channel": "Gelöschter oder ungültiger Kanal",
|
||||||
"This channel does not exist.": "Dieser Kanal existiert nicht.",
|
"This channel does not exist.": "Dieser Kanal existiert nicht.",
|
||||||
"Could not get channel info.": "Kanalinformationen konnten nicht geladen werden.",
|
"Could not get channel info.": "Kanalinformationen konnten nicht geladen werden.",
|
||||||
"Could not fetch comments": "Kommentare konnten nicht geladen werden",
|
"Could not fetch comments": "Kommentare konnten nicht geladen werden",
|
||||||
"View `x` replies": "Zeige `x` Antworten",
|
"View `x` replies": "Zeige `x` Antworten",
|
||||||
"`x` ago": "vor `x`",
|
"`x` ago": "vor `x`",
|
||||||
"Load more": "Mehr laden",
|
"Load more": "Mehr laden",
|
||||||
"`x` points": "`x` Punkte",
|
"`x` points": "`x` Punkte",
|
||||||
"Could not create mix.": "Mix konnte nicht erstellt werden.",
|
"Could not create mix.": "Mix konnte nicht erstellt werden.",
|
||||||
"Playlist is empty": "Playlist ist leer",
|
"Playlist is empty": "Playlist ist leer",
|
||||||
"Invalid playlist.": "Ungültige Playlist.",
|
"Invalid playlist.": "Ungültige Playlist.",
|
||||||
"Playlist does not exist.": "Playlist existiert nicht.",
|
"Playlist does not exist.": "Playlist existiert nicht.",
|
||||||
"Could not pull trending pages.": "Trending Seiten konnten nicht geladen werden.",
|
"Could not pull trending pages.": "Trending Seiten konnten nicht geladen werden.",
|
||||||
"Hidden field \"challenge\" is a required field": "Verstecktes Feld \"challenge\" ist eine erforderliche Eingabe",
|
"Hidden field \"challenge\" is a required field": "Verstecktes Feld \"challenge\" ist eine erforderliche Eingabe",
|
||||||
"Hidden field \"token\" is a required field": "Verstecktes Feld \"token\" ist eine erforderliche Eingabe",
|
"Hidden field \"token\" is a required field": "Verstecktes Feld \"token\" ist eine erforderliche Eingabe",
|
||||||
"Invalid challenge": "Ungültiger Test",
|
"Invalid challenge": "Ungültiger Test",
|
||||||
"Invalid token": "Ungöltige Marke",
|
"Invalid token": "Ungöltige Marke",
|
||||||
"Invalid user": "Ungültiger Benutzer",
|
"Invalid user": "Ungültiger Benutzer",
|
||||||
"Token is expired, please try again": "Marke ist abgelaufen, bitte erneut versuchen",
|
"Token is expired, please try again": "Marke ist abgelaufen, bitte erneut versuchen",
|
||||||
"English": "Englisch",
|
"English": "Englisch",
|
||||||
"English (auto-generated)": "Englisch (automatisch erzeugt)",
|
"English (auto-generated)": "Englisch (automatisch erzeugt)",
|
||||||
"Afrikaans": "Afrikaans",
|
"Afrikaans": "Afrikaans",
|
||||||
"Albanian": "Albanisch",
|
"Albanian": "Albanisch",
|
||||||
"Amharic": "Amharisch",
|
"Amharic": "Amharisch",
|
||||||
"Arabic": "Arabisch",
|
"Arabic": "Arabisch",
|
||||||
"Armenian": "Armenisch",
|
"Armenian": "Armenisch",
|
||||||
"Azerbaijani": "Aserbaidschanisch",
|
"Azerbaijani": "Aserbaidschanisch",
|
||||||
"Bangla": "Bengalisch",
|
"Bangla": "Bengalisch",
|
||||||
"Basque": "Baskisch",
|
"Basque": "Baskisch",
|
||||||
"Belarusian": "Weißrussisch",
|
"Belarusian": "Weißrussisch",
|
||||||
"Bosnian": "Bosnisch",
|
"Bosnian": "Bosnisch",
|
||||||
"Bulgarian": "Bulgarisch",
|
"Bulgarian": "Bulgarisch",
|
||||||
"Burmese": "Burmesisch",
|
"Burmese": "Burmesisch",
|
||||||
"Catalan": "Katalanisch",
|
"Catalan": "Katalanisch",
|
||||||
"Cebuano": "Cebuano",
|
"Cebuano": "Cebuano",
|
||||||
"Chinese (Simplified)": "Chinesisch (vereinfacht)",
|
"Chinese (Simplified)": "Chinesisch (vereinfacht)",
|
||||||
"Chinese (Traditional)": "Chinesisch (traditionell)",
|
"Chinese (Traditional)": "Chinesisch (traditionell)",
|
||||||
"Corsican": "Korsisch",
|
"Corsican": "Korsisch",
|
||||||
"Croatian": "Kroatisch",
|
"Croatian": "Kroatisch",
|
||||||
"Czech": "Tschechisch",
|
"Czech": "Tschechisch",
|
||||||
"Danish": "Dänisch",
|
"Danish": "Dänisch",
|
||||||
"Dutch": "Niederländisch",
|
"Dutch": "Niederländisch",
|
||||||
"Esperanto": "Esperanto",
|
"Esperanto": "Esperanto",
|
||||||
"Estonian": "Estnisch",
|
"Estonian": "Estnisch",
|
||||||
"Filipino": "Philippinisch",
|
"Filipino": "Philippinisch",
|
||||||
"Finnish": "Finnisch",
|
"Finnish": "Finnisch",
|
||||||
"French": "Französisch",
|
"French": "Französisch",
|
||||||
"Galician": "Galizisch",
|
"Galician": "Galizisch",
|
||||||
"Georgian": "Georgisch",
|
"Georgian": "Georgisch",
|
||||||
"German": "Deutsch",
|
"German": "Deutsch",
|
||||||
"Greek": "Griechisch",
|
"Greek": "Griechisch",
|
||||||
"Gujarati": "Gujarati",
|
"Gujarati": "Gujarati",
|
||||||
"Haitian Creole": "Haitianisches Kreolisch",
|
"Haitian Creole": "Haitianisches Kreolisch",
|
||||||
"Hausa": "Hausa",
|
"Hausa": "Hausa",
|
||||||
"Hawaiian": "Hawaiianisch",
|
"Hawaiian": "Hawaiianisch",
|
||||||
"Hebrew": "Hebräisch",
|
"Hebrew": "Hebräisch",
|
||||||
"Hindi": "Hindi",
|
"Hindi": "Hindi",
|
||||||
"Hmong": "Hmong",
|
"Hmong": "Hmong",
|
||||||
"Hungarian": "Ungarisch",
|
"Hungarian": "Ungarisch",
|
||||||
"Icelandic": "Isländisch",
|
"Icelandic": "Isländisch",
|
||||||
"Igbo": "Igbo",
|
"Igbo": "Igbo",
|
||||||
"Indonesian": "Indonesisch",
|
"Indonesian": "Indonesisch",
|
||||||
"Irish": "Irisch",
|
"Irish": "Irisch",
|
||||||
"Italian": "Italienisch",
|
"Italian": "Italienisch",
|
||||||
"Japanese": "Japanisch",
|
"Japanese": "Japanisch",
|
||||||
"Javanese": "Javanisch",
|
"Javanese": "Javanisch",
|
||||||
"Kannada": "Kannada",
|
"Kannada": "Kannada",
|
||||||
"Kazakh": "Kasachisch",
|
"Kazakh": "Kasachisch",
|
||||||
"Khmer": "Khmer",
|
"Khmer": "Khmer",
|
||||||
"Korean": "Koreanisch",
|
"Korean": "Koreanisch",
|
||||||
"Kurdish": "Kurdisch",
|
"Kurdish": "Kurdisch",
|
||||||
"Kyrgyz": "Kirgisisch",
|
"Kyrgyz": "Kirgisisch",
|
||||||
"Lao": "Laotisch",
|
"Lao": "Laotisch",
|
||||||
"Latin": "Lateinisch",
|
"Latin": "Lateinisch",
|
||||||
"Latvian": "Lettisch",
|
"Latvian": "Lettisch",
|
||||||
"Lithuanian": "Litauisch",
|
"Lithuanian": "Litauisch",
|
||||||
"Luxembourgish": "Luxemburgisch",
|
"Luxembourgish": "Luxemburgisch",
|
||||||
"Macedonian": "Mazedonisch",
|
"Macedonian": "Mazedonisch",
|
||||||
"Malagasy": "Madagassisch",
|
"Malagasy": "Madagassisch",
|
||||||
"Malay": "Malaiisch",
|
"Malay": "Malaiisch",
|
||||||
"Malayalam": "Malayalam",
|
"Malayalam": "Malayalam",
|
||||||
"Maltese": "Maltesisch",
|
"Maltese": "Maltesisch",
|
||||||
"Maori": "Maori",
|
"Maori": "Maori",
|
||||||
"Marathi": "Marathi",
|
"Marathi": "Marathi",
|
||||||
"Mongolian": "Mongolisch",
|
"Mongolian": "Mongolisch",
|
||||||
"Nepali": "Nepalesisch",
|
"Nepali": "Nepalesisch",
|
||||||
"Norwegian": "Norwegisch",
|
"Norwegian": "Norwegisch",
|
||||||
"Nyanja": "Nyanja",
|
"Nyanja": "Nyanja",
|
||||||
"Pashto": "Paschtunisch",
|
"Pashto": "Paschtunisch",
|
||||||
"Persian": "Persisch",
|
"Persian": "Persisch",
|
||||||
"Polish": "Polnisch",
|
"Polish": "Polnisch",
|
||||||
"Portuguese": "Portugiesisch",
|
"Portuguese": "Portugiesisch",
|
||||||
"Punjabi": "Pandschabi",
|
"Punjabi": "Pandschabi",
|
||||||
"Romanian": "Rumänisch",
|
"Romanian": "Rumänisch",
|
||||||
"Russian": "Russisch",
|
"Russian": "Russisch",
|
||||||
"Samoan": "Samoanisch",
|
"Samoan": "Samoanisch",
|
||||||
"Scottish Gaelic": "Schottisches Gälisch",
|
"Scottish Gaelic": "Schottisches Gälisch",
|
||||||
"Serbian": "Serbisch",
|
"Serbian": "Serbisch",
|
||||||
"Shona": "Schona",
|
"Shona": "Schona",
|
||||||
"Sindhi": "Sindhi",
|
"Sindhi": "Sindhi",
|
||||||
"Sinhala": "Singhalesisch",
|
"Sinhala": "Singhalesisch",
|
||||||
"Slovak": "Slowakisch",
|
"Slovak": "Slowakisch",
|
||||||
"Slovenian": "Slowenisch",
|
"Slovenian": "Slowenisch",
|
||||||
"Somali": "Somali",
|
"Somali": "Somali",
|
||||||
"Southern Sotho": "Südliches Sotho",
|
"Southern Sotho": "Südliches Sotho",
|
||||||
"Spanish": "Spanisch",
|
"Spanish": "Spanisch",
|
||||||
"Spanish (Latin America)": "Spanisch (Lateinamerika)",
|
"Spanish (Latin America)": "Spanisch (Lateinamerika)",
|
||||||
"Sundanese": "Sundanesisch",
|
"Sundanese": "Sundanesisch",
|
||||||
"Swahili": "Suaheli",
|
"Swahili": "Suaheli",
|
||||||
"Swedish": "Schwedisch",
|
"Swedish": "Schwedisch",
|
||||||
"Tajik": "Tadschikisch",
|
"Tajik": "Tadschikisch",
|
||||||
"Tamil": "Tamilisch",
|
"Tamil": "Tamilisch",
|
||||||
"Telugu": "Telugu",
|
"Telugu": "Telugu",
|
||||||
"Thai": "Thailändisch",
|
"Thai": "Thailändisch",
|
||||||
"Turkish": "Türkisch",
|
"Turkish": "Türkisch",
|
||||||
"Ukrainian": "Ukrainisch",
|
"Ukrainian": "Ukrainisch",
|
||||||
"Urdu": "Urdu",
|
"Urdu": "Urdu",
|
||||||
"Uzbek": "Usbekisch",
|
"Uzbek": "Usbekisch",
|
||||||
"Vietnamese": "Vietnamesisch",
|
"Vietnamese": "Vietnamesisch",
|
||||||
"Welsh": "Walisisch",
|
"Welsh": "Walisisch",
|
||||||
"Western Frisian": "Westfriesisch",
|
"Western Frisian": "Westfriesisch",
|
||||||
"Xhosa": "Xhosa",
|
"Xhosa": "Xhosa",
|
||||||
"Yiddish": "Jiddisch",
|
"Yiddish": "Jiddisch",
|
||||||
"Yoruba": "Joruba",
|
"Yoruba": "Joruba",
|
||||||
"Zulu": "Zulu",
|
"Zulu": "Zulu",
|
||||||
"`x` years": "`x` Jahre",
|
"`x` years": "`x` Jahre",
|
||||||
"`x` months": "`x` Monate",
|
"`x` months": "`x` Monate",
|
||||||
"`x` weeks": "`x` Wochen",
|
"`x` weeks": "`x` Wochen",
|
||||||
"`x` days": "`x` Tage",
|
"`x` days": "`x` Tage",
|
||||||
"`x` hours": "`x` Stunden",
|
"`x` hours": "`x` Stunden",
|
||||||
"`x` minutes": "`x` Minuten",
|
"`x` minutes": "`x` Minuten",
|
||||||
"`x` seconds": "`x` Sekunden",
|
"`x` seconds": "`x` Sekunden",
|
||||||
"Fallback comments: ": "",
|
"Fallback comments: ": "",
|
||||||
"Popular": "Populär",
|
"Popular": "Populär",
|
||||||
"Top": "",
|
"Top": "",
|
||||||
"About": "Über",
|
"About": "Über",
|
||||||
"Rating: ": "Bewertung: ",
|
"Rating: ": "Bewertung: ",
|
||||||
"Language: ": "Sprache: "
|
"Language: ": "Sprache: ",
|
||||||
|
"Default": "",
|
||||||
|
"Music": "",
|
||||||
|
"Gaming": "",
|
||||||
|
"News": "",
|
||||||
|
"Movies": "",
|
||||||
|
"Download": "",
|
||||||
|
"Download as: ": ""
|
||||||
}
|
}
|
||||||
|
@ -263,5 +263,12 @@
|
|||||||
"Top": "Top",
|
"Top": "Top",
|
||||||
"About": "About",
|
"About": "About",
|
||||||
"Rating: ": "Rating: ",
|
"Rating: ": "Rating: ",
|
||||||
"Language: ": "Language: "
|
"Language: ": "Language: ",
|
||||||
|
"Default": "Default",
|
||||||
|
"Music": "Music",
|
||||||
|
"Gaming": "Gaming",
|
||||||
|
"News": "News",
|
||||||
|
"Movies": "Movies",
|
||||||
|
"Download": "Download",
|
||||||
|
"Download as: ": "Download as: "
|
||||||
}
|
}
|
||||||
|
@ -263,5 +263,12 @@
|
|||||||
"Top": "Haut",
|
"Top": "Haut",
|
||||||
"About": "Sur",
|
"About": "Sur",
|
||||||
"Rating: ": "Évaluation: ",
|
"Rating: ": "Évaluation: ",
|
||||||
"Language: ": "Langue: "
|
"Language: ": "Langue: ",
|
||||||
|
"Default": "",
|
||||||
|
"Music": "",
|
||||||
|
"Gaming": "",
|
||||||
|
"News": "",
|
||||||
|
"Movies": "",
|
||||||
|
"Download": "",
|
||||||
|
"Download as: ": ""
|
||||||
}
|
}
|
||||||
|
@ -1,267 +1,274 @@
|
|||||||
{
|
{
|
||||||
"`x` subscribers": "`x` abonnenter",
|
"`x` subscribers": "`x` abonnenter",
|
||||||
"`x` videos": "`x` videoer",
|
"`x` videos": "`x` videoer",
|
||||||
"LIVE": "SANNTIDSVISNING",
|
"LIVE": "SANNTIDSVISNING",
|
||||||
"Shared `x` ago": "Delt for `x` siden",
|
"Shared `x` ago": "Delt for `x` siden",
|
||||||
"Unsubscribe": "Opphev abonnement",
|
"Unsubscribe": "Opphev abonnement",
|
||||||
"Subscribe": "Abonner",
|
"Subscribe": "Abonner",
|
||||||
"Login to subscribe to `x`": "Logg inn for å abonnere på `x`",
|
"Login to subscribe to `x`": "Logg inn for å abonnere på `x`",
|
||||||
"View channel on YouTube": "Vis kanal på YouTube",
|
"View channel on YouTube": "Vis kanal på YouTube",
|
||||||
"newest": "nyeste",
|
"newest": "nyeste",
|
||||||
"oldest": "eldste",
|
"oldest": "eldste",
|
||||||
"popular": "populært",
|
"popular": "populært",
|
||||||
"Preview page": "Forhåndsvis side",
|
"Preview page": "Forhåndsvis side",
|
||||||
"Next page": "Neste side",
|
"Next page": "Neste side",
|
||||||
"Clear watch history?": "Tøm visningshistorikk?",
|
"Clear watch history?": "Tøm visningshistorikk?",
|
||||||
"Yes": "Ja",
|
"Yes": "Ja",
|
||||||
"No": "Nei",
|
"No": "Nei",
|
||||||
"Import and Export Data": "Importer- og eksporter data",
|
"Import and Export Data": "Importer- og eksporter data",
|
||||||
"Import": "Importer",
|
"Import": "Importer",
|
||||||
"Import Invidious data": "Importer Invidious-data",
|
"Import Invidious data": "Importer Invidious-data",
|
||||||
"Import YouTube subscriptions": "Importer YouTube-abonnenter",
|
"Import YouTube subscriptions": "Importer YouTube-abonnenter",
|
||||||
"Import FreeTube subscriptions (.db)": "Importer FreeTube-abonnenter (.db)",
|
"Import FreeTube subscriptions (.db)": "Importer FreeTube-abonnenter (.db)",
|
||||||
"Import NewPipe subscriptions (.json)": "Importer NewPipe-abonnenter (.json)",
|
"Import NewPipe subscriptions (.json)": "Importer NewPipe-abonnenter (.json)",
|
||||||
"Import NewPipe data (.zip)": "Importer NewPipe-data (.zip)",
|
"Import NewPipe data (.zip)": "Importer NewPipe-data (.zip)",
|
||||||
"Export": "Eksporter",
|
"Export": "Eksporter",
|
||||||
"Export subscriptions as OPML": "Eksporter abonnenter som OPML",
|
"Export subscriptions as OPML": "Eksporter abonnenter som OPML",
|
||||||
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Eksporter abonnenter som OPML (for NewPipe og FreeTube)",
|
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Eksporter abonnenter som OPML (for NewPipe og FreeTube)",
|
||||||
"Export data as JSON": "Eksporter data som JSON",
|
"Export data as JSON": "Eksporter data som JSON",
|
||||||
"Delete account?": "Slett konto?",
|
"Delete account?": "Slett konto?",
|
||||||
"History": "Historikk",
|
"History": "Historikk",
|
||||||
"Previous page": "Forrige side",
|
"Previous page": "Forrige side",
|
||||||
"An alternative front-end to YouTube": "En alternativ grenseflate for YouTube",
|
"An alternative front-end to YouTube": "En alternativ grenseflate for YouTube",
|
||||||
"JavaScript license information": "JavaScript-lisensinformasjon",
|
"JavaScript license information": "JavaScript-lisensinformasjon",
|
||||||
"source": "kilde",
|
"source": "kilde",
|
||||||
"Login": "Logg inn",
|
"Login": "Logg inn",
|
||||||
"Login/Register": "Logg inn/registrer",
|
"Login/Register": "Logg inn/registrer",
|
||||||
"Login to Google": "Logg inn med Google",
|
"Login to Google": "Logg inn med Google",
|
||||||
"User ID:": "Bruker-ID:",
|
"User ID:": "Bruker-ID:",
|
||||||
"Password:": "Passord:",
|
"Password:": "Passord:",
|
||||||
"Time (h:mm:ss):": "Tid (h:mm:ss):",
|
"Time (h:mm:ss):": "Tid (h:mm:ss):",
|
||||||
"Text CAPTCHA": "Tekst-CAPTCHA",
|
"Text CAPTCHA": "Tekst-CAPTCHA",
|
||||||
"Image CAPTCHA": "Bilde-CAPTCHA",
|
"Image CAPTCHA": "Bilde-CAPTCHA",
|
||||||
"Sign In": "Innlogging",
|
"Sign In": "Innlogging",
|
||||||
"Register": "Registrer",
|
"Register": "Registrer",
|
||||||
"Email:": "E-post:",
|
"Email:": "E-post:",
|
||||||
"Google verification code:": "Google-bekreftelseskode:",
|
"Google verification code:": "Google-bekreftelseskode:",
|
||||||
"Preferences": "Innstillinger",
|
"Preferences": "Innstillinger",
|
||||||
"Player preferences": "Avspillerinnstillinger",
|
"Player preferences": "Avspillerinnstillinger",
|
||||||
"Always loop: ": "Alltid gjenta: ",
|
"Always loop: ": "Alltid gjenta: ",
|
||||||
"Autoplay: ": "Autoavspilling: ",
|
"Autoplay: ": "Autoavspilling: ",
|
||||||
"Autoplay next video: ": "Autospill neste video: ",
|
"Autoplay next video: ": "Autospill neste video: ",
|
||||||
"Listen by default: ": "Lytt som forvalg: ",
|
"Listen by default: ": "Lytt som forvalg: ",
|
||||||
"Default speed: ": "Forvalgt hastighet: ",
|
"Default speed: ": "Forvalgt hastighet: ",
|
||||||
"Preferred video quality: ": "Foretrukket videokvalitet: ",
|
"Preferred video quality: ": "Foretrukket videokvalitet: ",
|
||||||
"Player volume: ": "Avspillerlydstyrke: ",
|
"Player volume: ": "Avspillerlydstyrke: ",
|
||||||
"Default comments: ": "Forvalgte kommentarer: ",
|
"Default comments: ": "Forvalgte kommentarer: ",
|
||||||
"Default captions: ": "Forvalgte undertitler: ",
|
"Default captions: ": "Forvalgte undertitler: ",
|
||||||
"Fallback captions: ": "Tilbakefallsundertitler: ",
|
"Fallback captions: ": "Tilbakefallsundertitler: ",
|
||||||
"Show related videos? ": "Vis relaterte videoer? ",
|
"Show related videos? ": "Vis relaterte videoer? ",
|
||||||
"Visual preferences": "Visuelle innstillinger",
|
"Visual preferences": "Visuelle innstillinger",
|
||||||
"Dark mode: ": "Mørk drakt: ",
|
"Dark mode: ": "Mørk drakt: ",
|
||||||
"Thin mode: ": "Tynt modus: ",
|
"Thin mode: ": "Tynt modus: ",
|
||||||
"Subscription preferences": "Abonnementsinnstillinger",
|
"Subscription preferences": "Abonnementsinnstillinger",
|
||||||
"Redirect homepage to feed: ": "Videresend hjemmeside til flyt: ",
|
"Redirect homepage to feed: ": "Videresend hjemmeside til flyt: ",
|
||||||
"Number of videos shown in feed: ": "Antall videoer å vise i flyt: ",
|
"Number of videos shown in feed: ": "Antall videoer å vise i flyt: ",
|
||||||
"Sort videos by: ": "Sorter videoer etter: ",
|
"Sort videos by: ": "Sorter videoer etter: ",
|
||||||
"published": "publisert",
|
"published": "publisert",
|
||||||
"published - reverse": "publisert - motsatt",
|
"published - reverse": "publisert - motsatt",
|
||||||
"alphabetically": "alfabetisk",
|
"alphabetically": "alfabetisk",
|
||||||
"alphabetically - reverse": "alfabetisk - motsatt",
|
"alphabetically - reverse": "alfabetisk - motsatt",
|
||||||
"channel name": "kanalnavn",
|
"channel name": "kanalnavn",
|
||||||
"channel name - reverse": "kanalnavn - motsatt",
|
"channel name - reverse": "kanalnavn - motsatt",
|
||||||
"Only show latest video from channel: ": "Kun vis siste video fra kanal: ",
|
"Only show latest video from channel: ": "Kun vis siste video fra kanal: ",
|
||||||
"Only show latest unwatched video from channel: ": "Kun vis siste usette video fra kanal: ",
|
"Only show latest unwatched video from channel: ": "Kun vis siste usette video fra kanal: ",
|
||||||
"Only show unwatched: ": "Kun vis usette: ",
|
"Only show unwatched: ": "Kun vis usette: ",
|
||||||
"Only show notifications (if there are any): ": "Kun vis merknader (hvis det er noen): ",
|
"Only show notifications (if there are any): ": "Kun vis merknader (hvis det er noen): ",
|
||||||
"Data preferences": "Datainnstillinger",
|
"Data preferences": "Datainnstillinger",
|
||||||
"Clear watch history": "Tøm visningshistorikk",
|
"Clear watch history": "Tøm visningshistorikk",
|
||||||
"Import/Export data": "Importer/eksporter data",
|
"Import/Export data": "Importer/eksporter data",
|
||||||
"Manage subscriptions": "Behandle abonnementer",
|
"Manage subscriptions": "Behandle abonnementer",
|
||||||
"Watch history": "Visningshistorikk",
|
"Watch history": "Visningshistorikk",
|
||||||
"Delete account": "Slett konto",
|
"Delete account": "Slett konto",
|
||||||
"Save preferences": "Lagre innstillinger",
|
"Save preferences": "Lagre innstillinger",
|
||||||
"Subscription manager": "Abonnementsbehandler",
|
"Subscription manager": "Abonnementsbehandler",
|
||||||
"`x` subscriptions": "`x` abonnementer",
|
"`x` subscriptions": "`x` abonnementer",
|
||||||
"Import/Export": "Importer/eksporter",
|
"Import/Export": "Importer/eksporter",
|
||||||
"unsubscribe": "opphev abonnement",
|
"unsubscribe": "opphev abonnement",
|
||||||
"Subscriptions": "Abonnement",
|
"Subscriptions": "Abonnement",
|
||||||
"`x` unseen notifications": "`x` usette merknader",
|
"`x` unseen notifications": "`x` usette merknader",
|
||||||
"search": "søk",
|
"search": "søk",
|
||||||
"Sign out": "Logg ut",
|
"Sign out": "Logg ut",
|
||||||
"Released under the AGPLv3 by Omar Roth.": "Utgitt med AGPLv3+lisens av Omar Roth.",
|
"Released under the AGPLv3 by Omar Roth.": "Utgitt med AGPLv3+lisens av Omar Roth.",
|
||||||
"Source available here.": "Kildekode tilgjengelig her.",
|
"Source available here.": "Kildekode tilgjengelig her.",
|
||||||
"View JavaScript license information.": "Vis JavaScript-lisensinfo.",
|
"View JavaScript license information.": "Vis JavaScript-lisensinfo.",
|
||||||
"Trending": "Trendsettende",
|
"Trending": "Trendsettende",
|
||||||
"Watch video on Youtube": "Vis video på YouTube",
|
"Watch video on Youtube": "Vis video på YouTube",
|
||||||
"Genre: ": "Sjanger: ",
|
"Genre: ": "Sjanger: ",
|
||||||
"License: ": "Lisens: ",
|
"License: ": "Lisens: ",
|
||||||
"Family friendly? ": "Familievennlig? ",
|
"Family friendly? ": "Familievennlig? ",
|
||||||
"Wilson score: ": "Wilson-poengsum: ",
|
"Wilson score: ": "Wilson-poengsum: ",
|
||||||
"Engagement: ": "Engasjement: ",
|
"Engagement: ": "Engasjement: ",
|
||||||
"Whitelisted regions: ": "Hvitlistede regioner: ",
|
"Whitelisted regions: ": "Hvitlistede regioner: ",
|
||||||
"Blacklisted regions: ": "Svartelistede regioner: ",
|
"Blacklisted regions: ": "Svartelistede regioner: ",
|
||||||
"Shared `x`": "Delt `x`",
|
"Shared `x`": "Delt `x`",
|
||||||
"Hi! Looks like you have JavaScript disabled. Click here to view comments, keep in mind it may take a bit longer to load.": "Hei. Det ser ut til at du har JavaScript avslått. Klikk her for å vise kommentarer, ha i minnet at innlasting tar lengre tid.",
|
"Hi! Looks like you have JavaScript disabled. Click here to view comments, keep in mind it may take a bit longer to load.": "Hei. Det ser ut til at du har JavaScript avslått. Klikk her for å vise kommentarer, ha i minnet at innlasting tar lengre tid.",
|
||||||
"View YouTube comments": "Vis YouTube-kommentarer",
|
"View YouTube comments": "Vis YouTube-kommentarer",
|
||||||
"View more comments on Reddit": "Vis flere kommenterer på Reddit",
|
"View more comments on Reddit": "Vis flere kommenterer på Reddit",
|
||||||
"View `x` comments": "Vis `x` kommentarer",
|
"View `x` comments": "Vis `x` kommentarer",
|
||||||
"View Reddit comments": "Vis Reddit-kommentarer",
|
"View Reddit comments": "Vis Reddit-kommentarer",
|
||||||
"Hide replies": "Skjul svar",
|
"Hide replies": "Skjul svar",
|
||||||
"Show replies": "Vis svar",
|
"Show replies": "Vis svar",
|
||||||
"Incorrect password": "Feil passord",
|
"Incorrect password": "Feil passord",
|
||||||
"Quota exceeded, try again in a few hours": "Kvote overskredet, prøv igjen om et par timer",
|
"Quota exceeded, try again in a few hours": "Kvote overskredet, prøv igjen om et par timer",
|
||||||
"Unable to login, make sure two-factor authentication (Authenticator or SMS) is enabled.": "Kunne ikke logge inn, forsikre deg om at tofaktor-identitetsbekreftelse (Authenticator eller SMS) er skrudd på.",
|
"Unable to login, make sure two-factor authentication (Authenticator or SMS) is enabled.": "Kunne ikke logge inn, forsikre deg om at tofaktor-identitetsbekreftelse (Authenticator eller SMS) er skrudd på.",
|
||||||
"Invalid TFA code": "Ugyldig tofaktorkode",
|
"Invalid TFA code": "Ugyldig tofaktorkode",
|
||||||
"Login failed. This may be because two-factor authentication is not enabled on your account.": "Innlogging mislyktes. Dette kan være fordi tofaktor-identitetsbekreftelse er skrudd av på kontoen din.",
|
"Login failed. This may be because two-factor authentication is not enabled on your account.": "Innlogging mislyktes. Dette kan være fordi tofaktor-identitetsbekreftelse er skrudd av på kontoen din.",
|
||||||
"Invalid answer": "Ugyldig svar",
|
"Invalid answer": "Ugyldig svar",
|
||||||
"Invalid CAPTCHA": "Ugyldig CAPTCHA",
|
"Invalid CAPTCHA": "Ugyldig CAPTCHA",
|
||||||
"CAPTCHA is a required field": "CAPTCHA er et påkrevd felt",
|
"CAPTCHA is a required field": "CAPTCHA er et påkrevd felt",
|
||||||
"User ID is a required field": "Bruker-ID 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",
|
"Password is a required field": "Passord er et påkrevd felt",
|
||||||
"Invalid username or password": "Ugyldig brukernavn eller passord",
|
"Invalid username or password": "Ugyldig brukernavn eller passord",
|
||||||
"Please sign in using 'Sign in with Google'": "Logg inn ved bruk av \"Google-innlogging\"",
|
"Please sign in using 'Sign in with Google'": "Logg inn ved bruk av \"Google-innlogging\"",
|
||||||
"Password cannot be empty": "Passordet kan ikke være tomt",
|
"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",
|
"Password cannot be longer than 55 characters": "Passordet kan ikke være lengre enn 55 tegn",
|
||||||
"Please sign in": "Logg inn",
|
"Please sign in": "Logg inn",
|
||||||
"Invidious Private Feed for `x`": "Ugyldig privat flyt for `x`",
|
"Invidious Private Feed for `x`": "Ugyldig privat flyt for `x`",
|
||||||
"channel:`x`": "kanal `x`",
|
"channel:`x`": "kanal `x`",
|
||||||
"Deleted or invalid channel": "Slettet eller ugyldig kanal",
|
"Deleted or invalid channel": "Slettet eller ugyldig kanal",
|
||||||
"This channel does not exist.": "Denne kanalen finnes ikke.",
|
"This channel does not exist.": "Denne kanalen finnes ikke.",
|
||||||
"Could not get channel info.": "Kunne ikke innhente kanalinfo.",
|
"Could not get channel info.": "Kunne ikke innhente kanalinfo.",
|
||||||
"Could not fetch comments": "Kunne ikke hente kommentarer",
|
"Could not fetch comments": "Kunne ikke hente kommentarer",
|
||||||
"View `x` replies": "Vis `x` svar",
|
"View `x` replies": "Vis `x` svar",
|
||||||
"`x` ago": "`x` siden",
|
"`x` ago": "`x` siden",
|
||||||
"Load more": "Last inn flere",
|
"Load more": "Last inn flere",
|
||||||
"`x` points": "`x` poeng",
|
"`x` points": "`x` poeng",
|
||||||
"Could not create mix.": "Kunne ikke opprette miks.",
|
"Could not create mix.": "Kunne ikke opprette miks.",
|
||||||
"Playlist is empty": "Spillelisten er tom",
|
"Playlist is empty": "Spillelisten er tom",
|
||||||
"Invalid playlist.": "Ugyldig spilleliste.",
|
"Invalid playlist.": "Ugyldig spilleliste.",
|
||||||
"Playlist does not exist.": "Spillelisten finnes ikke.",
|
"Playlist does not exist.": "Spillelisten finnes ikke.",
|
||||||
"Could not pull trending pages.": "Kunne ikke hente trendsettende sider.",
|
"Could not pull trending pages.": "Kunne ikke hente trendsettende sider.",
|
||||||
"Hidden field \"challenge\" is a required field": "Skjult felt \"utfordring\" er et påkrevd felt",
|
"Hidden field \"challenge\" is a required field": "Skjult felt \"utfordring\" er et påkrevd felt",
|
||||||
"Hidden field \"token\" is a required field": "Skjult felt \"symbol\" er et påkrevd felt",
|
"Hidden field \"token\" is a required field": "Skjult felt \"symbol\" er et påkrevd felt",
|
||||||
"Invalid challenge": "Ugyldig utfordring",
|
"Invalid challenge": "Ugyldig utfordring",
|
||||||
"Invalid token": "Ugyldig symbol",
|
"Invalid token": "Ugyldig symbol",
|
||||||
"Invalid user": "Ugyldig bruker",
|
"Invalid user": "Ugyldig bruker",
|
||||||
"Token is expired, please try again": "Symbol utløpt, prøv igjen",
|
"Token is expired, please try again": "Symbol utløpt, prøv igjen",
|
||||||
"English": "Engelsk",
|
"English": "Engelsk",
|
||||||
"English (auto-generated)": "Engelsk (auto-generert)",
|
"English (auto-generated)": "Engelsk (auto-generert)",
|
||||||
"Afrikaans": "",
|
"Afrikaans": "",
|
||||||
"Albanian": "Albansk",
|
"Albanian": "Albansk",
|
||||||
"Amharic": "",
|
"Amharic": "",
|
||||||
"Arabic": "Arabisk",
|
"Arabic": "Arabisk",
|
||||||
"Armenian": "Armensk",
|
"Armenian": "Armensk",
|
||||||
"Azerbaijani": "",
|
"Azerbaijani": "",
|
||||||
"Bangla": "",
|
"Bangla": "",
|
||||||
"Basque": "",
|
"Basque": "",
|
||||||
"Belarusian": "Hviterussisk",
|
"Belarusian": "Hviterussisk",
|
||||||
"Bosnian": "Bosnisk",
|
"Bosnian": "Bosnisk",
|
||||||
"Bulgarian": "Bulgarsk",
|
"Bulgarian": "Bulgarsk",
|
||||||
"Burmese": "Burmesisk",
|
"Burmese": "Burmesisk",
|
||||||
"Catalan": "Katalansk",
|
"Catalan": "Katalansk",
|
||||||
"Cebuano": "",
|
"Cebuano": "",
|
||||||
"Chinese (Simplified)": "",
|
"Chinese (Simplified)": "",
|
||||||
"Chinese (Traditional)": "",
|
"Chinese (Traditional)": "",
|
||||||
"Corsican": "",
|
"Corsican": "",
|
||||||
"Croatian": "",
|
"Croatian": "",
|
||||||
"Czech": "Tsjekkisk",
|
"Czech": "Tsjekkisk",
|
||||||
"Danish": "Dansk",
|
"Danish": "Dansk",
|
||||||
"Dutch": "",
|
"Dutch": "",
|
||||||
"Esperanto": "Esperanto",
|
"Esperanto": "Esperanto",
|
||||||
"Estonian": "",
|
"Estonian": "",
|
||||||
"Filipino": "",
|
"Filipino": "",
|
||||||
"Finnish": "Finsk",
|
"Finnish": "Finsk",
|
||||||
"French": "Fransk",
|
"French": "Fransk",
|
||||||
"Galician": "",
|
"Galician": "",
|
||||||
"Georgian": "",
|
"Georgian": "",
|
||||||
"German": "",
|
"German": "",
|
||||||
"Greek": "",
|
"Greek": "",
|
||||||
"Gujarati": "",
|
"Gujarati": "",
|
||||||
"Haitian Creole": "",
|
"Haitian Creole": "",
|
||||||
"Hausa": "",
|
"Hausa": "",
|
||||||
"Hawaiian": "",
|
"Hawaiian": "",
|
||||||
"Hebrew": "",
|
"Hebrew": "",
|
||||||
"Hindi": "",
|
"Hindi": "",
|
||||||
"Hmong": "",
|
"Hmong": "",
|
||||||
"Hungarian": "Ungarsk",
|
"Hungarian": "Ungarsk",
|
||||||
"Icelandic": "Islandsk",
|
"Icelandic": "Islandsk",
|
||||||
"Igbo": "",
|
"Igbo": "",
|
||||||
"Indonesian": "Indonesisk",
|
"Indonesian": "Indonesisk",
|
||||||
"Irish": "Irsk",
|
"Irish": "Irsk",
|
||||||
"Italian": "Italiensk",
|
"Italian": "Italiensk",
|
||||||
"Japanese": "Japansk",
|
"Japanese": "Japansk",
|
||||||
"Javanese": "",
|
"Javanese": "",
|
||||||
"Kannada": "",
|
"Kannada": "",
|
||||||
"Kazakh": "",
|
"Kazakh": "",
|
||||||
"Khmer": "",
|
"Khmer": "",
|
||||||
"Korean": "",
|
"Korean": "",
|
||||||
"Kurdish": "",
|
"Kurdish": "",
|
||||||
"Kyrgyz": "",
|
"Kyrgyz": "",
|
||||||
"Lao": "",
|
"Lao": "",
|
||||||
"Latin": "",
|
"Latin": "",
|
||||||
"Latvian": "",
|
"Latvian": "",
|
||||||
"Lithuanian": "",
|
"Lithuanian": "",
|
||||||
"Luxembourgish": "",
|
"Luxembourgish": "",
|
||||||
"Macedonian": "",
|
"Macedonian": "",
|
||||||
"Malagasy": "",
|
"Malagasy": "",
|
||||||
"Malay": "",
|
"Malay": "",
|
||||||
"Malayalam": "",
|
"Malayalam": "",
|
||||||
"Maltese": "",
|
"Maltese": "",
|
||||||
"Maori": "",
|
"Maori": "",
|
||||||
"Marathi": "",
|
"Marathi": "",
|
||||||
"Mongolian": "",
|
"Mongolian": "",
|
||||||
"Nepali": "",
|
"Nepali": "",
|
||||||
"Norwegian": "Norsk bokmål",
|
"Norwegian": "Norsk bokmål",
|
||||||
"Nyanja": "",
|
"Nyanja": "",
|
||||||
"Pashto": "",
|
"Pashto": "",
|
||||||
"Persian": "",
|
"Persian": "",
|
||||||
"Polish": "",
|
"Polish": "",
|
||||||
"Portuguese": "",
|
"Portuguese": "",
|
||||||
"Punjabi": "",
|
"Punjabi": "",
|
||||||
"Romanian": "",
|
"Romanian": "",
|
||||||
"Russian": "Russisk",
|
"Russian": "Russisk",
|
||||||
"Samoan": "",
|
"Samoan": "",
|
||||||
"Scottish Gaelic": "",
|
"Scottish Gaelic": "",
|
||||||
"Serbian": "Serbisk",
|
"Serbian": "Serbisk",
|
||||||
"Shona": "",
|
"Shona": "",
|
||||||
"Sindhi": "",
|
"Sindhi": "",
|
||||||
"Sinhala": "",
|
"Sinhala": "",
|
||||||
"Slovak": "Slovakisk",
|
"Slovak": "Slovakisk",
|
||||||
"Slovenian": "Slovensk",
|
"Slovenian": "Slovensk",
|
||||||
"Somali": "Somali",
|
"Somali": "Somali",
|
||||||
"Southern Sotho": "",
|
"Southern Sotho": "",
|
||||||
"Spanish": "Spansk",
|
"Spanish": "Spansk",
|
||||||
"Spanish (Latin America)": "",
|
"Spanish (Latin America)": "",
|
||||||
"Sundanese": "",
|
"Sundanese": "",
|
||||||
"Swahili": "",
|
"Swahili": "",
|
||||||
"Swedish": "Svensk",
|
"Swedish": "Svensk",
|
||||||
"Tajik": "",
|
"Tajik": "",
|
||||||
"Tamil": "",
|
"Tamil": "",
|
||||||
"Telugu": "",
|
"Telugu": "",
|
||||||
"Thai": "",
|
"Thai": "",
|
||||||
"Turkish": "Tyrkisk",
|
"Turkish": "Tyrkisk",
|
||||||
"Ukrainian": "Ukrainsk",
|
"Ukrainian": "Ukrainsk",
|
||||||
"Urdu": "",
|
"Urdu": "",
|
||||||
"Uzbek": "",
|
"Uzbek": "",
|
||||||
"Vietnamese": "Vietnamesisk",
|
"Vietnamese": "Vietnamesisk",
|
||||||
"Welsh": "",
|
"Welsh": "",
|
||||||
"Western Frisian": "",
|
"Western Frisian": "",
|
||||||
"Xhosa": "",
|
"Xhosa": "",
|
||||||
"Yiddish": "",
|
"Yiddish": "",
|
||||||
"Yoruba": "",
|
"Yoruba": "",
|
||||||
"Zulu": "",
|
"Zulu": "",
|
||||||
"`x` years": "`x` år",
|
"`x` years": "`x` år",
|
||||||
"`x` months": "`x` måneder",
|
"`x` months": "`x` måneder",
|
||||||
"`x` weeks": "`x` uker",
|
"`x` weeks": "`x` uker",
|
||||||
"`x` days": "`x` dager",
|
"`x` days": "`x` dager",
|
||||||
"`x` hours": "`x` timer",
|
"`x` hours": "`x` timer",
|
||||||
"`x` minutes": "`x` minutter",
|
"`x` minutes": "`x` minutter",
|
||||||
"`x` seconds": "`x` sekunder",
|
"`x` seconds": "`x` sekunder",
|
||||||
"Fallback comments: ": "Tilbakefallskommentarer: ",
|
"Fallback comments: ": "Tilbakefallskommentarer: ",
|
||||||
"Popular": "Pupulært",
|
"Popular": "Pupulært",
|
||||||
"Top": "Topp",
|
"Top": "Topp",
|
||||||
"About": "Om",
|
"About": "Om",
|
||||||
"Rating: ": "Vurdering: ",
|
"Rating: ": "Vurdering: ",
|
||||||
"Language: ": "Språk: "
|
"Language: ": "Språk: ",
|
||||||
|
"Default": "",
|
||||||
|
"Music": "",
|
||||||
|
"Gaming": "",
|
||||||
|
"News": "",
|
||||||
|
"Movies": "",
|
||||||
|
"Download": "",
|
||||||
|
"Download as: ": ""
|
||||||
}
|
}
|
||||||
|
@ -263,5 +263,12 @@
|
|||||||
"Top": "",
|
"Top": "",
|
||||||
"About": "",
|
"About": "",
|
||||||
"Rating: ": "",
|
"Rating: ": "",
|
||||||
"Language: ": ""
|
"Language: ": "",
|
||||||
|
"Default": "",
|
||||||
|
"Music": "",
|
||||||
|
"Gaming": "",
|
||||||
|
"News": "",
|
||||||
|
"Movies": "",
|
||||||
|
"Download": "",
|
||||||
|
"Download as: ": ""
|
||||||
}
|
}
|
||||||
|
@ -263,5 +263,12 @@
|
|||||||
"Top": "",
|
"Top": "",
|
||||||
"About": "",
|
"About": "",
|
||||||
"Rating: ": "",
|
"Rating: ": "",
|
||||||
"Language: ": ""
|
"Language: ": "",
|
||||||
|
"Default": "",
|
||||||
|
"Music": "",
|
||||||
|
"Gaming": "",
|
||||||
|
"News": "",
|
||||||
|
"Movies": "",
|
||||||
|
"Download": "",
|
||||||
|
"Download as: ": ""
|
||||||
}
|
}
|
||||||
|
549
locales/ru.json
549
locales/ru.json
@ -1,273 +1,280 @@
|
|||||||
{
|
{
|
||||||
"`x` subscribers": "`x` подписчиков",
|
"`x` subscribers": "`x` подписчиков",
|
||||||
"`x` videos": "`x` видео",
|
"`x` videos": "`x` видео",
|
||||||
"LIVE": "ПРЯМОЙ ЭФИР",
|
"LIVE": "ПРЯМОЙ ЭФИР",
|
||||||
"Shared `x` ago": "Опубликовано `x` назад",
|
"Shared `x` ago": "Опубликовано `x` назад",
|
||||||
"Unsubscribe": "Отписаться",
|
"Unsubscribe": "Отписаться",
|
||||||
"Subscribe": "Подписаться",
|
"Subscribe": "Подписаться",
|
||||||
"Login to subscribe to `x`": "Войти, чтобы подписаться на `x`",
|
"Login to subscribe to `x`": "Войти, чтобы подписаться на `x`",
|
||||||
"View channel on YouTube": "Канал на YouTube",
|
"View channel on YouTube": "Канал на YouTube",
|
||||||
"newest": "новые",
|
"newest": "новые",
|
||||||
"oldest": "старые",
|
"oldest": "старые",
|
||||||
"popular": "популярные",
|
"popular": "популярные",
|
||||||
"Preview page": "Предварительный просмотр",
|
"Preview page": "Предварительный просмотр",
|
||||||
"Next page": "Следующая страница",
|
"Next page": "Следующая страница",
|
||||||
"Clear watch history?": "Очистить историю просмотров?",
|
"Clear watch history?": "Очистить историю просмотров?",
|
||||||
"Yes": "Да",
|
"Yes": "Да",
|
||||||
"No": "Нет",
|
"No": "Нет",
|
||||||
"Import and Export Data": "Импорт и экспорт данных",
|
"Import and Export Data": "Импорт и экспорт данных",
|
||||||
"Import": "Импорт",
|
"Import": "Импорт",
|
||||||
"Import Invidious data": "Импортировать данные Invidious",
|
"Import Invidious data": "Импортировать данные Invidious",
|
||||||
"Import YouTube subscriptions": "Импортировать YouTube подписки",
|
"Import YouTube subscriptions": "Импортировать YouTube подписки",
|
||||||
"Import FreeTube subscriptions (.db)": "Импортировать FreeTube подписки (.db)",
|
"Import FreeTube subscriptions (.db)": "Импортировать FreeTube подписки (.db)",
|
||||||
"Import NewPipe subscriptions (.json)": "Импортировать NewPipe подписки (.json)",
|
"Import NewPipe subscriptions (.json)": "Импортировать NewPipe подписки (.json)",
|
||||||
"Import NewPipe data (.zip)": "Импортировать данные NewPipe (.zip)",
|
"Import NewPipe data (.zip)": "Импортировать данные NewPipe (.zip)",
|
||||||
"Export": "Экспорт",
|
"Export": "Экспорт",
|
||||||
"Export subscriptions as OPML": "Экспортировать подписки в OPML",
|
"Export subscriptions as OPML": "Экспортировать подписки в OPML",
|
||||||
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Экспортировать подписки в OPML (для NewPipe и FreeTube)",
|
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Экспортировать подписки в OPML (для NewPipe и FreeTube)",
|
||||||
"Export data as JSON": "Экспортировать данные в JSON",
|
"Export data as JSON": "Экспортировать данные в JSON",
|
||||||
"Delete account?": "Удалить аккаунт?",
|
"Delete account?": "Удалить аккаунт?",
|
||||||
"History": "История",
|
"History": "История",
|
||||||
"Previous page": "Предыдущая страница",
|
"Previous page": "Предыдущая страница",
|
||||||
"An alternative front-end to YouTube": "Альтернативный фронтенд для YouTube",
|
"An alternative front-end to YouTube": "Альтернативный фронтенд для YouTube",
|
||||||
"JavaScript license information": "Лицензии JavaScript",
|
"JavaScript license information": "Лицензии JavaScript",
|
||||||
"source": "источник",
|
"source": "источник",
|
||||||
"Login": "Войти",
|
"Login": "Войти",
|
||||||
"Login/Register": "Войти/Регистрация",
|
"Login/Register": "Войти/Регистрация",
|
||||||
"Login to Google": "Войти через Google",
|
"Login to Google": "Войти через Google",
|
||||||
"User ID:": "ID пользователя:",
|
"User ID:": "ID пользователя:",
|
||||||
"Password:": "Пароль:",
|
"Password:": "Пароль:",
|
||||||
"Time (h:mm:ss):": "Время (ч:мм:сс):",
|
"Time (h:mm:ss):": "Время (ч:мм:сс):",
|
||||||
"Text CAPTCHA": "Текст капчи",
|
"Text CAPTCHA": "Текст капчи",
|
||||||
"Image CAPTCHA": "Изображение капчи",
|
"Image CAPTCHA": "Изображение капчи",
|
||||||
"Sign In": "Войти",
|
"Sign In": "Войти",
|
||||||
"Register": "Регистрация",
|
"Register": "Регистрация",
|
||||||
"Email:": "Эл. почта:",
|
"Email:": "Эл. почта:",
|
||||||
"Google verification code:": "Код подтверждения Google:",
|
"Google verification code:": "Код подтверждения Google:",
|
||||||
"Preferences": "Настройки",
|
"Preferences": "Настройки",
|
||||||
"Player preferences": "Настройки проигрывателя",
|
"Player preferences": "Настройки проигрывателя",
|
||||||
"Always loop: ": "Всегда повторять: ",
|
"Always loop: ": "Всегда повторять: ",
|
||||||
"Autoplay: ": "Автовоспроизведение: ",
|
"Autoplay: ": "Автовоспроизведение: ",
|
||||||
"Autoplay next video: ": "Автовоспроизведение следующего видео: ",
|
"Autoplay next video: ": "Автовоспроизведение следующего видео: ",
|
||||||
"Listen by default: ": "Режим \"только аудио\" по-умолчанию: ",
|
"Listen by default: ": "Режим \"только аудио\" по-умолчанию: ",
|
||||||
"Default speed: ": "Скорость по-умолчанию: ",
|
"Default speed: ": "Скорость по-умолчанию: ",
|
||||||
"Preferred video quality: ": "Предпочтительное качество видео: ",
|
"Preferred video quality: ": "Предпочтительное качество видео: ",
|
||||||
"Player volume: ": "Громкость воспроизведения: ",
|
"Player volume: ": "Громкость воспроизведения: ",
|
||||||
"Default comments: ": "Источник комментариев: ",
|
"Default comments: ": "Источник комментариев: ",
|
||||||
"youtube": "YouTube",
|
"youtube": "YouTube",
|
||||||
"reddit": "Reddit",
|
"reddit": "Reddit",
|
||||||
"Default captions: ": "Субтитры по-умолчанию: ",
|
"Default captions: ": "Субтитры по-умолчанию: ",
|
||||||
"Fallback captions: ": "Резервные субтитры: ",
|
"Fallback captions: ": "Резервные субтитры: ",
|
||||||
"Show related videos? ": "Показывать похожие видео? ",
|
"Show related videos? ": "Показывать похожие видео? ",
|
||||||
"Visual preferences": "Визуальные настройки",
|
"Visual preferences": "Визуальные настройки",
|
||||||
"Dark mode: ": "Темная тема: ",
|
"Dark mode: ": "Темная тема: ",
|
||||||
"Thin mode: ": "Облегченный режим: ",
|
"Thin mode: ": "Облегченный режим: ",
|
||||||
"Subscription preferences": "Настройки подписок",
|
"Subscription preferences": "Настройки подписок",
|
||||||
"Redirect homepage to feed: ": "Отображать ленту вместо главной страницы: ",
|
"Redirect homepage to feed: ": "Отображать ленту вместо главной страницы: ",
|
||||||
"Number of videos shown in feed: ": "Число видео в ленте: ",
|
"Number of videos shown in feed: ": "Число видео в ленте: ",
|
||||||
"Sort videos by: ": "Сортировать видео по: ",
|
"Sort videos by: ": "Сортировать видео по: ",
|
||||||
"published": "дате публикации",
|
"published": "дате публикации",
|
||||||
"published - reverse": "дате - обратный порядок",
|
"published - reverse": "дате - обратный порядок",
|
||||||
"alphabetically": "алфавиту",
|
"alphabetically": "алфавиту",
|
||||||
"alphabetically - reverse": "алфавиту - обратный порядок",
|
"alphabetically - reverse": "алфавиту - обратный порядок",
|
||||||
"channel name": "имени канала",
|
"channel name": "имени канала",
|
||||||
"channel name - reverse": "имени канала - обратный порядок",
|
"channel name - reverse": "имени канала - обратный порядок",
|
||||||
"Only show latest video from channel: ": "Отображать только последние видео с каждого канала: ",
|
"Only show latest video from channel: ": "Отображать только последние видео с каждого канала: ",
|
||||||
"Only show latest unwatched video from channel: ": "Отображать только непросмотренные видео с каждого канала: ",
|
"Only show latest unwatched video from channel: ": "Отображать только непросмотренные видео с каждого канала: ",
|
||||||
"Only show unwatched: ": "Отображать только непросмотренные видео: ",
|
"Only show unwatched: ": "Отображать только непросмотренные видео: ",
|
||||||
"Only show notifications (if there are any): ": "Отображать только оповещения (если есть): ",
|
"Only show notifications (if there are any): ": "Отображать только оповещения (если есть): ",
|
||||||
"Data preferences": "Настройки данных",
|
"Data preferences": "Настройки данных",
|
||||||
"Clear watch history": "Очистить историю просмотра",
|
"Clear watch history": "Очистить историю просмотра",
|
||||||
"Import/Export data": "Импорт/Экспорт данных",
|
"Import/Export data": "Импорт/Экспорт данных",
|
||||||
"Manage subscriptions": "Управление подписками",
|
"Manage subscriptions": "Управление подписками",
|
||||||
"Watch history": "История просмотров",
|
"Watch history": "История просмотров",
|
||||||
"Delete account": "Удалить аккаунт",
|
"Delete account": "Удалить аккаунт",
|
||||||
"Save preferences": "Сохранить настройки",
|
"Save preferences": "Сохранить настройки",
|
||||||
"Subscription manager": "Менеджер подписок",
|
"Subscription manager": "Менеджер подписок",
|
||||||
"`x` subscriptions": "`x` подписок",
|
"`x` subscriptions": "`x` подписок",
|
||||||
"Import/Export": "Импорт/Экспорт",
|
"Import/Export": "Импорт/Экспорт",
|
||||||
"unsubscribe": "отписаться",
|
"unsubscribe": "отписаться",
|
||||||
"Subscriptions": "Подписки",
|
"Subscriptions": "Подписки",
|
||||||
"`x` unseen notifications": "`x` новых оповещений",
|
"`x` unseen notifications": "`x` новых оповещений",
|
||||||
"search": "поиск",
|
"search": "поиск",
|
||||||
"Sign out": "Выйти",
|
"Sign out": "Выйти",
|
||||||
"Released under the AGPLv3 by Omar Roth.": "Распространяется Omar Roth по AGPLv3.",
|
"Released under the AGPLv3 by Omar Roth.": "Распространяется Omar Roth по AGPLv3.",
|
||||||
"Source available here.": "Исходный код доступен здесь.",
|
"Source available here.": "Исходный код доступен здесь.",
|
||||||
"Liberapay: ": "Liberapay: ",
|
"Liberapay: ": "Liberapay: ",
|
||||||
"Patreon: ": "Patreon: ",
|
"Patreon: ": "Patreon: ",
|
||||||
"BTC: ": "BTC: ",
|
"BTC: ": "BTC: ",
|
||||||
"BCH: ": "BCH: ",
|
"BCH: ": "BCH: ",
|
||||||
"View JavaScript license information.": "Посмотреть лицензии JavaScript кода.",
|
"View JavaScript license information.": "Посмотреть лицензии JavaScript кода.",
|
||||||
"Trending": "В тренде",
|
"Trending": "В тренде",
|
||||||
"Watch video on Youtube": "Смотреть на YouTube",
|
"Watch video on Youtube": "Смотреть на YouTube",
|
||||||
"Genre: ": "Жанр: ",
|
"Genre: ": "Жанр: ",
|
||||||
"License: ": "Лицензия: ",
|
"License: ": "Лицензия: ",
|
||||||
"Family friendly? ": "Семейный просмотр: ",
|
"Family friendly? ": "Семейный просмотр: ",
|
||||||
"Wilson score: ": "Рейтинг Вильсона: ",
|
"Wilson score: ": "Рейтинг Вильсона: ",
|
||||||
"Engagement: ": "Вовлеченность: ",
|
"Engagement: ": "Вовлеченность: ",
|
||||||
"Whitelisted regions: ": "Доступно для: ",
|
"Whitelisted regions: ": "Доступно для: ",
|
||||||
"Blacklisted regions: ": "Недоступно для: ",
|
"Blacklisted regions: ": "Недоступно для: ",
|
||||||
"Shared `x`": "Опубликовано `x`",
|
"Shared `x`": "Опубликовано `x`",
|
||||||
"Hi! Looks like you have JavaScript disabled. Click here to view comments, keep in mind it may take a bit longer to load.": "Похоже, что у Вас отключен JavaScript. Нажмите сюда, чтобы увидеть комментарии (учтите, что они могут загружаться дольше).",
|
"Hi! Looks like you have JavaScript disabled. Click here to view comments, keep in mind it may take a bit longer to load.": "Похоже, что у Вас отключен JavaScript. Нажмите сюда, чтобы увидеть комментарии (учтите, что они могут загружаться дольше).",
|
||||||
"View YouTube comments": "Смотреть комментарии с YouTube",
|
"View YouTube comments": "Смотреть комментарии с YouTube",
|
||||||
"View more comments on Reddit": "Больше комментариев на Reddit",
|
"View more comments on Reddit": "Больше комментариев на Reddit",
|
||||||
"View `x` comments": "Показать `x` комментариев",
|
"View `x` comments": "Показать `x` комментариев",
|
||||||
"View Reddit comments": "Смотреть комментарии с Reddit",
|
"View Reddit comments": "Смотреть комментарии с Reddit",
|
||||||
"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 login, make sure two-factor authentication (Authenticator or SMS) is enabled.": "Вход не выполнен, проверьте, не включена ли двухфакторная аутентификация.",
|
"Unable to login, make sure two-factor authentication (Authenticator or SMS) is enabled.": "Вход не выполнен, проверьте, не включена ли двухфакторная аутентификация.",
|
||||||
"Invalid TFA code": "Неправильный TFA код",
|
"Invalid TFA code": "Неправильный TFA код",
|
||||||
"Login failed. This may be because two-factor authentication is not enabled on your account.": "Не удалось войти. Это может быть из-за того, что в вашем аккаунте не включена двухфакторная аутентификация.",
|
"Login failed. This may be because two-factor authentication is not enabled on your account.": "Не удалось войти. Это может быть из-за того, что в вашем аккаунте не включена двухфакторная аутентификация.",
|
||||||
"Invalid answer": "Неверный ответ",
|
"Invalid answer": "Неверный ответ",
|
||||||
"Invalid CAPTCHA": "Неверная капча",
|
"Invalid 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": "Необходимо ввести пароль",
|
||||||
"Invalid username or password": "Недопустимый пароль или имя пользователя",
|
"Invalid username or password": "Недопустимый пароль или имя пользователя",
|
||||||
"Please sign in using 'Sign in with Google'": "Пожалуйста войдите через Google",
|
"Please sign in using 'Sign in with Google'": "Пожалуйста войдите через Google",
|
||||||
"Password cannot be empty": "Пароль не может быть пустым",
|
"Password cannot be empty": "Пароль не может быть пустым",
|
||||||
"Password cannot be longer than 55 characters": "Пароль не может быть длиннее 55 символов",
|
"Password cannot be longer than 55 characters": "Пароль не может быть длиннее 55 символов",
|
||||||
"Please sign in": "Пожалуйста, войдите",
|
"Please sign in": "Пожалуйста, войдите",
|
||||||
"Invidious Private Feed for `x`": "Приватная лента Invidious для `x`",
|
"Invidious Private Feed for `x`": "Приватная лента Invidious для `x`",
|
||||||
"channel:`x`": "канал: `x`",
|
"channel:`x`": "канал: `x`",
|
||||||
"Deleted or invalid channel": "Канал удален или не найден",
|
"Deleted or invalid channel": "Канал удален или не найден",
|
||||||
"This channel does not exist.": "Такой канал не существует.",
|
"This channel does not exist.": "Такой канал не существует.",
|
||||||
"Could not get channel info.": "Невозможно получить информацию о канале.",
|
"Could not get channel info.": "Невозможно получить информацию о канале.",
|
||||||
"Could not fetch comments": "Невозможно получить комментарии",
|
"Could not fetch comments": "Невозможно получить комментарии",
|
||||||
"View `x` replies": "Показать `x` ответов",
|
"View `x` replies": "Показать `x` ответов",
|
||||||
"`x` ago": "`x` назад",
|
"`x` ago": "`x` назад",
|
||||||
"Load more": "Загрузить больше",
|
"Load more": "Загрузить больше",
|
||||||
"`x` points": "`x` очков",
|
"`x` points": "`x` очков",
|
||||||
"Could not create mix.": "Невозможно создать \"микс\".",
|
"Could not create mix.": "Невозможно создать \"микс\".",
|
||||||
"Playlist is empty": "Плейлист пуст",
|
"Playlist is empty": "Плейлист пуст",
|
||||||
"Invalid playlist.": "Некорректный плейлист.",
|
"Invalid playlist.": "Некорректный плейлист.",
|
||||||
"Playlist does not exist.": "Плейлист не существует.",
|
"Playlist does not exist.": "Плейлист не существует.",
|
||||||
"Could not pull trending pages.": "Невозможно получить страницы \"в тренде\".",
|
"Could not pull trending pages.": "Невозможно получить страницы \"в тренде\".",
|
||||||
"Hidden field \"challenge\" is a required field": "Необходимо заполнить скрытое поле \"challenge\"",
|
"Hidden field \"challenge\" is a required field": "Необходимо заполнить скрытое поле \"challenge\"",
|
||||||
"Hidden field \"token\" is a required field": "Необходимо заполнить скрытое поле \"токен\"",
|
"Hidden field \"token\" is a required field": "Необходимо заполнить скрытое поле \"токен\"",
|
||||||
"Invalid challenge": "Неправильный ответ в \"challenge\"",
|
"Invalid challenge": "Неправильный ответ в \"challenge\"",
|
||||||
"Invalid token": "Неправильный токен",
|
"Invalid token": "Неправильный токен",
|
||||||
"Invalid user": "Недопустимое имя пользователя",
|
"Invalid user": "Недопустимое имя пользователя",
|
||||||
"Token is expired, please try again": "Срок действия токена истек, попробуйте позже",
|
"Token is expired, please try again": "Срок действия токена истек, попробуйте позже",
|
||||||
"English": "Английский",
|
"English": "Английский",
|
||||||
"English (auto-generated)": "Английский (созданы автоматически)",
|
"English (auto-generated)": "Английский (созданы автоматически)",
|
||||||
"Afrikaans": "",
|
"Afrikaans": "",
|
||||||
"Albanian": "",
|
"Albanian": "",
|
||||||
"Amharic": "",
|
"Amharic": "",
|
||||||
"Arabic": "",
|
"Arabic": "",
|
||||||
"Armenian": "",
|
"Armenian": "",
|
||||||
"Azerbaijani": "",
|
"Azerbaijani": "",
|
||||||
"Bangla": "",
|
"Bangla": "",
|
||||||
"Basque": "",
|
"Basque": "",
|
||||||
"Belarusian": "",
|
"Belarusian": "",
|
||||||
"Bosnian": "",
|
"Bosnian": "",
|
||||||
"Bulgarian": "",
|
"Bulgarian": "",
|
||||||
"Burmese": "",
|
"Burmese": "",
|
||||||
"Catalan": "",
|
"Catalan": "",
|
||||||
"Cebuano": "",
|
"Cebuano": "",
|
||||||
"Chinese (Simplified)": "",
|
"Chinese (Simplified)": "",
|
||||||
"Chinese (Traditional)": "",
|
"Chinese (Traditional)": "",
|
||||||
"Corsican": "",
|
"Corsican": "",
|
||||||
"Croatian": "",
|
"Croatian": "",
|
||||||
"Czech": "",
|
"Czech": "",
|
||||||
"Danish": "",
|
"Danish": "",
|
||||||
"Dutch": "",
|
"Dutch": "",
|
||||||
"Esperanto": "",
|
"Esperanto": "",
|
||||||
"Estonian": "",
|
"Estonian": "",
|
||||||
"Filipino": "",
|
"Filipino": "",
|
||||||
"Finnish": "",
|
"Finnish": "",
|
||||||
"French": "",
|
"French": "",
|
||||||
"Galician": "",
|
"Galician": "",
|
||||||
"Georgian": "",
|
"Georgian": "",
|
||||||
"German": "",
|
"German": "",
|
||||||
"Greek": "",
|
"Greek": "",
|
||||||
"Gujarati": "",
|
"Gujarati": "",
|
||||||
"Haitian Creole": "",
|
"Haitian Creole": "",
|
||||||
"Hausa": "",
|
"Hausa": "",
|
||||||
"Hawaiian": "",
|
"Hawaiian": "",
|
||||||
"Hebrew": "",
|
"Hebrew": "",
|
||||||
"Hindi": "",
|
"Hindi": "",
|
||||||
"Hmong": "",
|
"Hmong": "",
|
||||||
"Hungarian": "",
|
"Hungarian": "",
|
||||||
"Icelandic": "",
|
"Icelandic": "",
|
||||||
"Igbo": "",
|
"Igbo": "",
|
||||||
"Indonesian": "",
|
"Indonesian": "",
|
||||||
"Irish": "",
|
"Irish": "",
|
||||||
"Italian": "",
|
"Italian": "",
|
||||||
"Japanese": "",
|
"Japanese": "",
|
||||||
"Javanese": "",
|
"Javanese": "",
|
||||||
"Kannada": "",
|
"Kannada": "",
|
||||||
"Kazakh": "",
|
"Kazakh": "",
|
||||||
"Khmer": "",
|
"Khmer": "",
|
||||||
"Korean": "",
|
"Korean": "",
|
||||||
"Kurdish": "",
|
"Kurdish": "",
|
||||||
"Kyrgyz": "",
|
"Kyrgyz": "",
|
||||||
"Lao": "",
|
"Lao": "",
|
||||||
"Latin": "",
|
"Latin": "",
|
||||||
"Latvian": "",
|
"Latvian": "",
|
||||||
"Lithuanian": "",
|
"Lithuanian": "",
|
||||||
"Luxembourgish": "",
|
"Luxembourgish": "",
|
||||||
"Macedonian": "",
|
"Macedonian": "",
|
||||||
"Malagasy": "",
|
"Malagasy": "",
|
||||||
"Malay": "",
|
"Malay": "",
|
||||||
"Malayalam": "",
|
"Malayalam": "",
|
||||||
"Maltese": "",
|
"Maltese": "",
|
||||||
"Maori": "",
|
"Maori": "",
|
||||||
"Marathi": "",
|
"Marathi": "",
|
||||||
"Mongolian": "",
|
"Mongolian": "",
|
||||||
"Nepali": "",
|
"Nepali": "",
|
||||||
"Norwegian": "",
|
"Norwegian": "",
|
||||||
"Nyanja": "",
|
"Nyanja": "",
|
||||||
"Pashto": "",
|
"Pashto": "",
|
||||||
"Persian": "",
|
"Persian": "",
|
||||||
"Polish": "",
|
"Polish": "",
|
||||||
"Portuguese": "",
|
"Portuguese": "",
|
||||||
"Punjabi": "",
|
"Punjabi": "",
|
||||||
"Romanian": "",
|
"Romanian": "",
|
||||||
"Russian": "",
|
"Russian": "",
|
||||||
"Samoan": "",
|
"Samoan": "",
|
||||||
"Scottish Gaelic": "",
|
"Scottish Gaelic": "",
|
||||||
"Serbian": "",
|
"Serbian": "",
|
||||||
"Shona": "",
|
"Shona": "",
|
||||||
"Sindhi": "",
|
"Sindhi": "",
|
||||||
"Sinhala": "",
|
"Sinhala": "",
|
||||||
"Slovak": "",
|
"Slovak": "",
|
||||||
"Slovenian": "",
|
"Slovenian": "",
|
||||||
"Somali": "",
|
"Somali": "",
|
||||||
"Southern Sotho": "",
|
"Southern Sotho": "",
|
||||||
"Spanish": "",
|
"Spanish": "",
|
||||||
"Spanish (Latin America)": "",
|
"Spanish (Latin America)": "",
|
||||||
"Sundanese": "",
|
"Sundanese": "",
|
||||||
"Swahili": "",
|
"Swahili": "",
|
||||||
"Swedish": "",
|
"Swedish": "",
|
||||||
"Tajik": "",
|
"Tajik": "",
|
||||||
"Tamil": "",
|
"Tamil": "",
|
||||||
"Telugu": "",
|
"Telugu": "",
|
||||||
"Thai": "",
|
"Thai": "",
|
||||||
"Turkish": "",
|
"Turkish": "",
|
||||||
"Ukrainian": "",
|
"Ukrainian": "",
|
||||||
"Urdu": "",
|
"Urdu": "",
|
||||||
"Uzbek": "",
|
"Uzbek": "",
|
||||||
"Vietnamese": "",
|
"Vietnamese": "",
|
||||||
"Welsh": "",
|
"Welsh": "",
|
||||||
"Western Frisian": "",
|
"Western Frisian": "",
|
||||||
"Xhosa": "",
|
"Xhosa": "",
|
||||||
"Yiddish": "",
|
"Yiddish": "",
|
||||||
"Yoruba": "",
|
"Yoruba": "",
|
||||||
"Zulu": "",
|
"Zulu": "",
|
||||||
"`x` years": "`x` лет",
|
"`x` years": "`x` лет",
|
||||||
"`x` months": "`x` месяцев",
|
"`x` months": "`x` месяцев",
|
||||||
"`x` weeks": "`x` недель",
|
"`x` weeks": "`x` недель",
|
||||||
"`x` days": "`x` дней",
|
"`x` days": "`x` дней",
|
||||||
"`x` hours": "`x` часов",
|
"`x` hours": "`x` часов",
|
||||||
"`x` minutes": "`x` минут",
|
"`x` minutes": "`x` минут",
|
||||||
"`x` seconds": "`x` секунд",
|
"`x` seconds": "`x` секунд",
|
||||||
"Fallback comments: ": "Резервные комментарии: ",
|
"Fallback comments: ": "Резервные комментарии: ",
|
||||||
"Popular": "Популярное",
|
"Popular": "Популярное",
|
||||||
"Top": "Топ",
|
"Top": "Топ",
|
||||||
"About": "О сайте",
|
"About": "О сайте",
|
||||||
"Rating: ": "Рейтинг: ",
|
"Rating: ": "Рейтинг: ",
|
||||||
"Language: ": "Язык: "
|
"Language: ": "Язык: ",
|
||||||
|
"Default": "",
|
||||||
|
"Music": "",
|
||||||
|
"Gaming": "",
|
||||||
|
"News": "",
|
||||||
|
"Movies": "",
|
||||||
|
"Download": "",
|
||||||
|
"Download as: ": ""
|
||||||
}
|
}
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
require "detect_language"
|
require "detect_language"
|
||||||
require "digest/md5"
|
require "digest/md5"
|
||||||
|
require "file_utils"
|
||||||
require "kemal"
|
require "kemal"
|
||||||
require "openssl/hmac"
|
require "openssl/hmac"
|
||||||
require "option_parser"
|
require "option_parser"
|
||||||
@ -35,6 +36,8 @@ channel_threads = CONFIG.channel_threads
|
|||||||
feed_threads = CONFIG.feed_threads
|
feed_threads = CONFIG.feed_threads
|
||||||
video_threads = CONFIG.video_threads
|
video_threads = CONFIG.video_threads
|
||||||
|
|
||||||
|
logger = Invidious::LogHandler.new
|
||||||
|
|
||||||
Kemal.config.extra_options do |parser|
|
Kemal.config.extra_options do |parser|
|
||||||
parser.banner = "Usage: invidious [arguments]"
|
parser.banner = "Usage: invidious [arguments]"
|
||||||
parser.on("-t THREADS", "--crawl-threads=THREADS", "Number of threads for crawling YouTube (default: #{crawl_threads})") do |number|
|
parser.on("-t THREADS", "--crawl-threads=THREADS", "Number of threads for crawling YouTube (default: #{crawl_threads})") do |number|
|
||||||
@ -69,6 +72,10 @@ Kemal.config.extra_options do |parser|
|
|||||||
exit
|
exit
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
parser.on("-o OUTPUT", "--output=OUTPUT", "Redirect output (default: STDOUT)") do |output|
|
||||||
|
FileUtils.mkdir_p(File.dirname(output))
|
||||||
|
logger = Invidious::LogHandler.new(File.open(output, mode: "a"))
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
Kemal::CLI.new
|
Kemal::CLI.new
|
||||||
@ -295,7 +302,7 @@ get "/watch" do |env|
|
|||||||
next env.redirect "/watch?v=#{ex.message}"
|
next env.redirect "/watch?v=#{ex.message}"
|
||||||
rescue ex
|
rescue ex
|
||||||
error_message = ex.message
|
error_message = ex.message
|
||||||
STDOUT << id << " : " << ex.message << "\n"
|
logger.write("#{id} : #{ex.message}\n")
|
||||||
next templated "error"
|
next templated "error"
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -2135,6 +2142,16 @@ get "/c/:user" do |env|
|
|||||||
env.redirect anchor["href"]
|
env.redirect anchor["href"]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Legacy endpoint for /user/:username
|
||||||
|
get "/profile" do |env|
|
||||||
|
user = env.params.query["user"]?
|
||||||
|
if !user
|
||||||
|
env.redirect "/"
|
||||||
|
else
|
||||||
|
env.redirect "/user/#{user}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
get "/user/:user" do |env|
|
get "/user/:user" do |env|
|
||||||
user = env.params.url["user"]
|
user = env.params.url["user"]
|
||||||
env.redirect "/channel/#{user}"
|
env.redirect "/channel/#{user}"
|
||||||
@ -3849,4 +3866,5 @@ add_handler FilteredCompressHandler.new
|
|||||||
add_handler DenyFrame.new
|
add_handler DenyFrame.new
|
||||||
add_context_storage_type(User)
|
add_context_storage_type(User)
|
||||||
|
|
||||||
|
Kemal.config.logger = logger
|
||||||
Kemal.run
|
Kemal.run
|
||||||
|
@ -1,21 +1,21 @@
|
|||||||
class Config
|
class Config
|
||||||
YAML.mapping({
|
YAML.mapping({
|
||||||
crawl_threads: Int32,
|
crawl_threads: Int32, # Number of threads to use for finding new videos from YouTube (used to populate "top" page)
|
||||||
channel_threads: Int32,
|
channel_threads: Int32, # Number of threads to use for crawling videos from channels (for updating subscriptions)
|
||||||
feed_threads: Int32,
|
feed_threads: Int32, # Number of threads to use for updating feeds
|
||||||
video_threads: Int32,
|
video_threads: Int32, # Number of threads to use for updating videos in cache (mostly non-functional)
|
||||||
db: NamedTuple(
|
db: NamedTuple( # Database configuration
|
||||||
user: String,
|
user: String,
|
||||||
password: String,
|
password: String,
|
||||||
host: String,
|
host: String,
|
||||||
port: Int32,
|
port: Int32,
|
||||||
dbname: String,
|
dbname: String,
|
||||||
),
|
),
|
||||||
dl_api_key: String?,
|
dl_api_key: String?, # DetectLanguage API Key (used to filter non-English results from "top" page), mostly non-functional
|
||||||
https_only: Bool?,
|
https_only: Bool?, # Used to tell Invidious it is behind a proxy, so links to resources should be https://
|
||||||
hmac_key: String?,
|
hmac_key: String?, # HMAC signing key for CSRF tokens
|
||||||
full_refresh: Bool,
|
full_refresh: Bool, # Used for crawling channels: threads should check all videos uploaded by a channel
|
||||||
domain: String,
|
domain: String, # Domain to be used for links to resources on the site where an absolute URL is required
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
|
35
src/invidious/helpers/logger.cr
Normal file
35
src/invidious/helpers/logger.cr
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
require "logger"
|
||||||
|
|
||||||
|
class Invidious::LogHandler < Kemal::BaseLogHandler
|
||||||
|
def initialize(@io : IO = STDOUT)
|
||||||
|
end
|
||||||
|
|
||||||
|
def call(context : HTTP::Server::Context)
|
||||||
|
time = Time.now
|
||||||
|
call_next(context)
|
||||||
|
elapsed_text = elapsed_text(Time.now - time)
|
||||||
|
|
||||||
|
@io << time << ' ' << context.response.status_code << ' ' << context.request.method << ' ' << context.request.resource << ' ' << elapsed_text << '\n'
|
||||||
|
|
||||||
|
if @io.is_a? File
|
||||||
|
@io.flush
|
||||||
|
end
|
||||||
|
|
||||||
|
context
|
||||||
|
end
|
||||||
|
|
||||||
|
def write(message : String)
|
||||||
|
@io << message
|
||||||
|
|
||||||
|
if @io.is_a? File
|
||||||
|
@io.flush
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
private def elapsed_text(elapsed)
|
||||||
|
millis = elapsed.total_milliseconds
|
||||||
|
return "#{millis.round(2)}ms" if millis >= 1
|
||||||
|
|
||||||
|
"#{(millis * 1000).round(2)}µs"
|
||||||
|
end
|
||||||
|
end
|
@ -8,7 +8,7 @@
|
|||||||
<script src="/js/videojs-markers.min.js"></script>
|
<script src="/js/videojs-markers.min.js"></script>
|
||||||
<script src="/js/videojs-share.min.js"></script>
|
<script src="/js/videojs-share.min.js"></script>
|
||||||
<script src="/js/videojs-http-streaming.min.js"></script>
|
<script src="/js/videojs-http-streaming.min.js"></script>
|
||||||
<% if env.get?("user") && env.get("user").as(User).preferences.quality == "dash" %>
|
<% if params[:quality] == "dash" %>
|
||||||
<script src="/js/dash.mediaplayer.min.js"></script>
|
<script src="/js/dash.mediaplayer.min.js"></script>
|
||||||
<script src="/js/videojs-dash.min.js"></script>
|
<script src="/js/videojs-dash.min.js"></script>
|
||||||
<script src="/js/videojs-contrib-quality-levels.min.js"></script>
|
<script src="/js/videojs-contrib-quality-levels.min.js"></script>
|
||||||
|
@ -53,6 +53,34 @@
|
|||||||
<div class="pure-u-1 pure-u-md-1-5">
|
<div class="pure-u-1 pure-u-md-1-5">
|
||||||
<div class="h-box">
|
<div class="h-box">
|
||||||
<p><a href="https://www.youtube.com/watch?v=<%= video.id %>"><%= translate(locale, "Watch video on Youtube") %></a></p>
|
<p><a href="https://www.youtube.com/watch?v=<%= video.id %>"><%= translate(locale, "Watch video on Youtube") %></a></p>
|
||||||
|
|
||||||
|
<form class="pure-form pure-form-stacked">
|
||||||
|
<div class="pure-control-group">
|
||||||
|
<label for="download_widget"><%= translate(locale, "Download as: ") %></label>
|
||||||
|
<select style="width:100%" name="download_widget" id="download_widget">
|
||||||
|
<% video_streams.each do |option| %>
|
||||||
|
<option data-url="<%= option["url"] %>"><%= option["quality_label"] %> - <%= option["type"].split(";")[0] %> @ <%= option["fps"] %>fps - video only</option>
|
||||||
|
<% end %>
|
||||||
|
<% audio_streams.each do |option| %>
|
||||||
|
<option data-url="<%= option["url"] %>"><%= option["type"].split(";")[0] %> @ <%= option["bitrate"] %>k - audio only</option>
|
||||||
|
<% end %>
|
||||||
|
<% fmt_stream.each do |option| %>
|
||||||
|
<option data-url="<%= option["url"] %>"><%= itag_to_metadata?(option["itag"]).try &.["height"]? || "~240" %>p - <%= option["type"].split(";")[0] %></option>
|
||||||
|
<% end %>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="progress-container" style="width:100%; display:none">
|
||||||
|
<div id="download-progress">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button type="button" data-title="<%= video.title.dump_unquoted %>-<%= video.id %>.mp4" onclick="download_video(this)"
|
||||||
|
class="pure-button pure-button-primary">
|
||||||
|
<%= translate(locale, "Download") %>
|
||||||
|
</button>
|
||||||
|
</form>
|
||||||
|
|
||||||
<p><i class="icon ion-ios-eye"></i> <%= number_with_separator(video.views) %></p>
|
<p><i class="icon ion-ios-eye"></i> <%= number_with_separator(video.views) %></p>
|
||||||
<p><i class="icon ion-ios-thumbs-up"></i> <%= number_with_separator(video.likes) %></p>
|
<p><i class="icon ion-ios-thumbs-up"></i> <%= number_with_separator(video.likes) %></p>
|
||||||
<p><i class="icon ion-ios-thumbs-down"></i> <%= number_with_separator(video.dislikes) %></p>
|
<p><i class="icon ion-ios-thumbs-down"></i> <%= number_with_separator(video.dislikes) %></p>
|
||||||
@ -268,8 +296,15 @@ function unsubscribe() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
<% if plid %>
|
<% if plid %>
|
||||||
function get_playlist() {
|
function get_playlist(timeouts = 0) {
|
||||||
playlist = document.getElementById("playlist");
|
playlist = document.getElementById("playlist");
|
||||||
|
|
||||||
|
if (timeouts > 10) {
|
||||||
|
console.log("Failed to pull playlist");
|
||||||
|
playlist.innerHTML = "";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
playlist.innerHTML = ' \
|
playlist.innerHTML = ' \
|
||||||
<h3><center class="loading"><i class="icon ion-ios-refresh"></i></center></h3> \
|
<h3><center class="loading"><i class="icon ion-ios-refresh"></i></center></h3> \
|
||||||
<hr>'
|
<hr>'
|
||||||
@ -323,15 +358,22 @@ function get_playlist() {
|
|||||||
comments = document.getElementById("playlist");
|
comments = document.getElementById("playlist");
|
||||||
comments.innerHTML =
|
comments.innerHTML =
|
||||||
'<h3><center class="loading"><i class="icon ion-ios-refresh"></i></center></h3><hr>';
|
'<h3><center class="loading"><i class="icon ion-ios-refresh"></i></center></h3><hr>';
|
||||||
get_playlist();
|
get_playlist(timeouts + 1);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
get_playlist();
|
get_playlist();
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
function get_reddit_comments() {
|
function get_reddit_comments(timeouts = 0) {
|
||||||
comments = document.getElementById("comments");
|
comments = document.getElementById("comments");
|
||||||
|
|
||||||
|
if (timeouts > 10) {
|
||||||
|
console.log("Failed to pull comments");
|
||||||
|
comments.innerHTML = "";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
var fallback = comments.innerHTML;
|
var fallback = comments.innerHTML;
|
||||||
comments.innerHTML =
|
comments.innerHTML =
|
||||||
'<h3><center class="loading"><i class="icon ion-ios-refresh"></i></center></h3>';
|
'<h3><center class="loading"><i class="icon ion-ios-refresh"></i></center></h3>';
|
||||||
@ -382,12 +424,19 @@ function get_reddit_comments() {
|
|||||||
xhr.ontimeout = function() {
|
xhr.ontimeout = function() {
|
||||||
console.log("Pulling comments timed out.");
|
console.log("Pulling comments timed out.");
|
||||||
|
|
||||||
get_reddit_comments();
|
get_reddit_comments(timeouts + 1);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
function get_youtube_comments() {
|
function get_youtube_comments(timeouts = 0) {
|
||||||
comments = document.getElementById("comments");
|
comments = document.getElementById("comments");
|
||||||
|
|
||||||
|
if (timeouts > 10) {
|
||||||
|
console.log("Failed to pull comments");
|
||||||
|
comments.innerHTML = "";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
var fallback = comments.innerHTML;
|
var fallback = comments.innerHTML;
|
||||||
comments.innerHTML =
|
comments.innerHTML =
|
||||||
'<h3><center class="loading"><i class="icon ion-ios-refresh"></i></center></h3>';
|
'<h3><center class="loading"><i class="icon ion-ios-refresh"></i></center></h3>';
|
||||||
@ -438,7 +487,7 @@ function get_youtube_comments() {
|
|||||||
|
|
||||||
comments.innerHTML =
|
comments.innerHTML =
|
||||||
'<h3><center class="loading"><i class="icon ion-ios-refresh"></i></center></h3>';
|
'<h3><center class="loading"><i class="icon ion-ios-refresh"></i></center></h3>';
|
||||||
get_youtube_comments();
|
get_youtube_comments(timeouts + 1);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user