This commit is contained in:
Agustin Ferrari 2019-02-01 20:15:34 -03:00
commit c0e73e71c5
7 changed files with 601 additions and 335 deletions

274
locales/eu.json Normal file
View File

@ -0,0 +1,274 @@
{
"`x` subscribers": "",
"`x` videos": "",
"LIVE": "",
"Shared `x` ago": "",
"Unsubscribe": "",
"Subscribe": "Harpidetu",
"Login to subscribe to `x`": "",
"View channel on YouTube": "Ikusi kanala YouTuben",
"newest": "berrienak",
"oldest": "zaharrenak",
"popular": "ospetsuenak",
"Preview page": "Aurrebista orria",
"Next page": "Hurrengo orria",
"Clear watch history?": "Garbitu ikusitakoen historia?",
"Yes": "Bai",
"No": "Ez",
"Import and Export Data": "Datuak inportatu eta esportatu",
"Import": "Inportatu",
"Import Invidious data": "Invidiouseko datuak inportatu",
"Import YouTube subscriptions": "YouTubeko harpidetzak inportatu",
"Import FreeTube subscriptions (.db)": "FreeTubeko harpidetzak inportatu (.db)",
"Import NewPipe subscriptions (.json)": "NewPipeko harpidetzak inportatu (.json)",
"Import NewPipe data (.zip)": "NewPipeko datuak inportatu (.zip)",
"Export": "Esportatu",
"Export subscriptions as OPML": "Esportatu harpidetzak OPML bezala",
"Export subscriptions as OPML (for NewPipe & FreeTube)": "",
"Export data as JSON": "",
"Delete account?": "Kontua ezabatu?",
"History": "Historia",
"Previous page": "Aurreko orria",
"An alternative front-end to YouTube": "",
"JavaScript license information": "",
"source": "",
"Login": "",
"Login/Register": "",
"Login to Google": "",
"User ID:": "",
"Password:": "",
"Time (h:mm:ss):": "",
"Text CAPTCHA": "",
"Image CAPTCHA": "",
"Sign In": "",
"Register": "",
"Email:": "",
"Google verification code:": "",
"Preferences": "",
"Player preferences": "",
"Always loop: ": "",
"Autoplay: ": "",
"Autoplay next video: ": "",
"Listen by default: ": "",
"Default speed: ": "",
"Preferred video quality: ": "",
"Player volume: ": "",
"Default comments: ": "",
"Default captions: ": "",
"Fallback captions: ": "",
"Show related videos? ": "",
"Visual preferences": "",
"Dark mode: ": "",
"Thin mode: ": "",
"Subscription preferences": "",
"Redirect homepage to feed: ": "",
"Number of videos shown in feed: ": "",
"Sort videos by: ": "",
"published": "",
"published - reverse": "",
"alphabetically": "",
"alphabetically - reverse": "",
"channel name": "",
"channel name - reverse": "",
"Only show latest video from channel: ": "",
"Only show latest unwatched video from channel: ": "",
"Only show unwatched: ": "",
"Only show notifications (if there are any): ": "",
"Data preferences": "",
"Clear watch history": "",
"Import/Export data": "",
"Manage subscriptions": "",
"Watch history": "",
"Delete account": "",
"Save preferences": "",
"Subscription manager": "",
"`x` subscriptions": "",
"Import/Export": "",
"unsubscribe": "",
"Subscriptions": "",
"`x` unseen notifications": "",
"search": "",
"Sign out": "",
"Released under the AGPLv3 by Omar Roth.": "",
"Source available here.": "",
"View JavaScript license information.": "",
"Trending": "",
"Watch video on Youtube": "",
"Genre: ": "",
"License: ": "",
"Family friendly? ": "",
"Wilson score: ": "",
"Engagement: ": "",
"Whitelisted regions: ": "",
"Blacklisted regions: ": "",
"Shared `x`": "",
"Hi! Looks like you have JavaScript disabled. Click here to view comments, keep in mind it may take a bit longer to load.": "",
"View YouTube comments": "",
"View more comments on Reddit": "",
"View `x` comments": "",
"View Reddit comments": "",
"Hide replies": "",
"Show replies": "",
"Incorrect password": "",
"Quota exceeded, try again in a few hours": "",
"Unable to login, make sure two-factor authentication (Authenticator or SMS) is enabled.": "",
"Invalid TFA code": "",
"Login failed. This may be because two-factor authentication is not enabled on your account.": "",
"Invalid answer": "",
"Invalid CAPTCHA": "",
"CAPTCHA is a required field": "",
"User ID is a required field": "",
"Password is a required field": "",
"Invalid username or password": "",
"Please sign in using 'Sign in with Google'": "",
"Password cannot be empty": "",
"Password cannot be longer than 55 characters": "",
"Please sign in": "",
"Invidious Private Feed for `x`": "",
"channel:`x`": "",
"Deleted or invalid channel": "",
"This channel does not exist.": "",
"Could not get channel info.": "",
"Could not fetch comments": "",
"View `x` replies": "",
"`x` ago": "",
"Load more": "",
"`x` points": "",
"Could not create mix.": "",
"Playlist is empty": "",
"Invalid playlist.": "",
"Playlist does not exist.": "",
"Could not pull trending pages.": "",
"Hidden field \"challenge\" is a required field": "",
"Hidden field \"token\" is a required field": "",
"Invalid challenge": "",
"Invalid token": "",
"Invalid user": "",
"Token is expired, please try again": "",
"English": "",
"English (auto-generated)": "",
"Afrikaans": "",
"Albanian": "",
"Amharic": "",
"Arabic": "",
"Armenian": "",
"Azerbaijani": "",
"Bangla": "",
"Basque": "",
"Belarusian": "",
"Bosnian": "",
"Bulgarian": "",
"Burmese": "",
"Catalan": "",
"Cebuano": "",
"Chinese (Simplified)": "",
"Chinese (Traditional)": "",
"Corsican": "",
"Croatian": "",
"Czech": "",
"Danish": "",
"Dutch": "",
"Esperanto": "",
"Estonian": "",
"Filipino": "",
"Finnish": "",
"French": "",
"Galician": "",
"Georgian": "",
"German": "",
"Greek": "",
"Gujarati": "",
"Haitian Creole": "",
"Hausa": "",
"Hawaiian": "",
"Hebrew": "",
"Hindi": "",
"Hmong": "",
"Hungarian": "",
"Icelandic": "",
"Igbo": "",
"Indonesian": "",
"Irish": "",
"Italian": "",
"Japanese": "",
"Javanese": "",
"Kannada": "",
"Kazakh": "",
"Khmer": "",
"Korean": "",
"Kurdish": "",
"Kyrgyz": "",
"Lao": "",
"Latin": "",
"Latvian": "",
"Lithuanian": "",
"Luxembourgish": "",
"Macedonian": "",
"Malagasy": "",
"Malay": "",
"Malayalam": "",
"Maltese": "",
"Maori": "",
"Marathi": "",
"Mongolian": "",
"Nepali": "",
"Norwegian": "",
"Nyanja": "",
"Pashto": "",
"Persian": "",
"Polish": "",
"Portuguese": "",
"Punjabi": "",
"Romanian": "",
"Russian": "",
"Samoan": "",
"Scottish Gaelic": "",
"Serbian": "",
"Shona": "",
"Sindhi": "",
"Sinhala": "",
"Slovak": "",
"Slovenian": "",
"Somali": "",
"Southern Sotho": "",
"Spanish": "",
"Spanish (Latin America)": "",
"Sundanese": "",
"Swahili": "",
"Swedish": "",
"Tajik": "",
"Tamil": "",
"Telugu": "",
"Thai": "",
"Turkish": "",
"Ukrainian": "",
"Urdu": "",
"Uzbek": "",
"Vietnamese": "",
"Welsh": "",
"Western Frisian": "",
"Xhosa": "",
"Yiddish": "",
"Yoruba": "",
"Zulu": "",
"`x` years": "",
"`x` months": "",
"`x` weeks": "",
"`x` days": "",
"`x` hours": "",
"`x` minutes": "",
"`x` seconds": "",
"Fallback comments: ": "",
"Popular": "",
"Top": "",
"About": "",
"Rating: ": "",
"Language: ": "",
"Default": "",
"Music": "",
"Gaming": "",
"News": "",
"Movies": "",
"Download": "",
"Download as: ": ""
}

View File

@ -1,280 +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": "", "Default": "По-умолчанию",
"Music": "", "Music": "Музыка",
"Gaming": "", "Gaming": "Игры",
"News": "", "News": "Новости",
"Movies": "", "Movies": "Фильмы",
"Download": "", "Download": "Скачать",
"Download as: ": "" "Download as: ": "Скачать как: "
} }

View File

@ -1128,21 +1128,21 @@ post "/preferences" do |env|
listen = listen == "on" listen = listen == "on"
speed = env.params.body["speed"]?.try &.as(String).to_f? speed = env.params.body["speed"]?.try &.as(String).to_f?
speed ||= 1.0 speed ||= DEFAULT_USER_PREFERENCES.speed
quality = env.params.body["quality"]?.try &.as(String) quality = env.params.body["quality"]?.try &.as(String)
quality ||= "hd720" quality ||= DEFAULT_USER_PREFERENCES.quality
volume = env.params.body["volume"]?.try &.as(String).to_i? volume = env.params.body["volume"]?.try &.as(String).to_i?
volume ||= 100 volume ||= DEFAULT_USER_PREFERENCES.volume
comments_0 = env.params.body["comments_0"]?.try &.as(String) || "youtube" comments_0 = env.params.body["comments_0"]?.try &.as(String) || DEFAULT_USER_PREFERENCES.comments[0]
comments_1 = env.params.body["comments_1"]?.try &.as(String) || "" comments_1 = env.params.body["comments_1"]?.try &.as(String) || DEFAULT_USER_PREFERENCES.comments[1]
comments = [comments_0, comments_1] comments = [comments_0, comments_1]
captions_0 = env.params.body["captions_0"]?.try &.as(String) || "" captions_0 = env.params.body["captions_0"]?.try &.as(String) || DEFAULT_USER_PREFERENCES.captions[0]
captions_1 = env.params.body["captions_1"]?.try &.as(String) || "" captions_1 = env.params.body["captions_1"]?.try &.as(String) || DEFAULT_USER_PREFERENCES.captions[1]
captions_2 = env.params.body["captions_2"]?.try &.as(String) || "" captions_2 = env.params.body["captions_2"]?.try &.as(String) || DEFAULT_USER_PREFERENCES.captions[2]
captions = [captions_0, captions_1, captions_2] captions = [captions_0, captions_1, captions_2]
related_videos = env.params.body["related_videos"]?.try &.as(String) related_videos = env.params.body["related_videos"]?.try &.as(String)
@ -1154,7 +1154,7 @@ post "/preferences" do |env|
redirect_feed = redirect_feed == "on" redirect_feed = redirect_feed == "on"
locale = env.params.body["locale"]?.try &.as(String) locale = env.params.body["locale"]?.try &.as(String)
locale ||= "en-US" locale ||= DEFAULT_USER_PREFERENCES.locale
dark_mode = env.params.body["dark_mode"]?.try &.as(String) dark_mode = env.params.body["dark_mode"]?.try &.as(String)
dark_mode ||= "off" dark_mode ||= "off"
@ -1165,10 +1165,10 @@ post "/preferences" do |env|
thin_mode = thin_mode == "on" thin_mode = thin_mode == "on"
max_results = env.params.body["max_results"]?.try &.as(String).to_i? max_results = env.params.body["max_results"]?.try &.as(String).to_i?
max_results ||= 40 max_results ||= DEFAULT_USER_PREFERENCES.max_results
sort = env.params.body["sort"]?.try &.as(String) sort = env.params.body["sort"]?.try &.as(String)
sort ||= "published" sort ||= DEFAULT_USER_PREFERENCES.sort
latest_only = env.params.body["latest_only"]?.try &.as(String) latest_only = env.params.body["latest_only"]?.try &.as(String)
latest_only ||= "off" latest_only ||= "off"

View File

@ -79,36 +79,36 @@ class Preferences
autoplay: Bool, autoplay: Bool,
continue: { continue: {
type: Bool, type: Bool,
default: false, default: DEFAULT_USER_PREFERENCES.continue,
}, },
listen: { listen: {
type: Bool, type: Bool,
default: false, default: DEFAULT_USER_PREFERENCES.listen,
}, },
speed: Float32, speed: Float32,
quality: String, quality: String,
volume: Int32, volume: Int32,
comments: { comments: {
type: Array(String), type: Array(String),
default: ["youtube", ""], default: DEFAULT_USER_PREFERENCES.comments,
converter: StringToArray, converter: StringToArray,
}, },
captions: { captions: {
type: Array(String), type: Array(String),
default: ["", "", ""], default: DEFAULT_USER_PREFERENCES.captions,
}, },
redirect_feed: { redirect_feed: {
type: Bool, type: Bool,
default: false, default: DEFAULT_USER_PREFERENCES.redirect_feed,
}, },
related_videos: { related_videos: {
type: Bool, type: Bool,
default: true, default: DEFAULT_USER_PREFERENCES.related_videos,
}, },
dark_mode: Bool, dark_mode: Bool,
thin_mode: { thin_mode: {
type: Bool, type: Bool,
default: false, default: DEFAULT_USER_PREFERENCES.thin_mode,
}, },
max_results: Int32, max_results: Int32,
sort: String, sort: String,
@ -116,11 +116,11 @@ class Preferences
unseen_only: Bool, unseen_only: Bool,
notifications_only: { notifications_only: {
type: Bool, type: Bool,
default: false, default: DEFAULT_USER_PREFERENCES.notifications_only,
}, },
locale: { locale: {
type: String, type: String,
default: "en-US", default: DEFAULT_USER_PREFERENCES.locale,
}, },
}) })
end end

View File

@ -633,6 +633,10 @@ def fetch_video(id, proxies, region)
end end
end end
if info["errorcode"]?.try &.== "2"
raise "Video unavailable."
end
title = info["title"] title = info["title"]
author = info["author"] author = info["author"]
ucid = info["ucid"] ucid = info["ucid"]
@ -741,14 +745,14 @@ def process_video_params(query, preferences)
volume ||= preferences.volume volume ||= preferences.volume
end end
autoplay ||= 0 autoplay ||= DEFAULT_USER_PREFERENCES.autoplay.to_unsafe
continue ||= 0 continue ||= DEFAULT_USER_PREFERENCES.continue.to_unsafe
listen ||= 0 listen ||= DEFAULT_USER_PREFERENCES.listen.to_unsafe
preferred_captions ||= [] of String preferred_captions ||= DEFAULT_USER_PREFERENCES.captions
quality ||= "hd720" quality ||= DEFAULT_USER_PREFERENCES.quality
speed ||= 1 speed ||= DEFAULT_USER_PREFERENCES.speed
video_loop ||= 0 video_loop ||= DEFAULT_USER_PREFERENCES.video_loop.to_unsafe
volume ||= 100 volume ||= DEFAULT_USER_PREFERENCES.volume
autoplay = autoplay == 1 autoplay = autoplay == 1
continue = continue == 1 continue = continue == 1

View File

@ -115,37 +115,25 @@ var player = videojs("player", options, function() {
}); });
player.on('error', function(event) { player.on('error', function(event) {
if (player.error().code === 2) { if (player.error().code === 2 || player.error().code === 4) {
console.log("An error occured in the player, reloading..."); setInterval(setTimeout(function (event) {
console.log("An error occured in the player, reloading...");
var currentTime = player.currentTime(); var currentTime = player.currentTime();
var playbackRate = player.playbackRate(); var playbackRate = player.playbackRate();
player.load(); var paused = player.paused()
if (currentTime > 0.5) {
currentTime -= 0.5;
}
player.currentTime(currentTime);
player.playbackRate(playbackRate);
player.play()
} else if (player.error().code === 4) {
console.log("Detected invalid source, removing...");
var currentTime = player.currentTime();
var sources = player.options().sources;
for (var i = 0; i < sources.length; i++) { player.load();
if (sources[i].src === player.currentSource().src) { if (currentTime > 0.5) {
sources.splice(i, 1); currentTime -= 0.5;
break
} }
}; player.currentTime(currentTime);
player.playbackRate(playbackRate);
player.load();
if (currentTime > 0.5) { if (!paused) {
currentTime -= 0.5; player.play();
} }
player.currentTime(currentTime); }, 5000), 5000);
player.src(sources);
player.play();
} }
}); });

View File

@ -141,7 +141,7 @@
</div> </div>
</div> </div>
</div> </div>
<% if preferences && preferences.related_videos || plid %> <% if !preferences || preferences && preferences.related_videos || plid %>
<div class="pure-u-1 pure-u-md-1-5"> <div class="pure-u-1 pure-u-md-1-5">
<% if plid %> <% if plid %>
<div id="playlist" class="h-box"> <div id="playlist" class="h-box">