#include "js.h"
#include "cachedhttp.h"
+#include "jsvm.h"
namespace {
Http &cachedHttp() {
return *result;
}
- resetNAM();
-
auto function = engine->evaluate(name);
if (!function.isCallable()) {
qWarning() << function.toString() << " is not callable";
checkError(setTimeoutWrapperFunction);
engine->globalObject().setProperty("clearTimeout", timer.property("clearTimeout"));
+ QJSValue vm = engine->newQObject(new JSVM(engine));
+ engine->globalObject().setProperty("runInContextQt", vm.property("runInContext"));
+
connect(cachedHttp().get(url), &HttpReply::finished, this, [this](auto &reply) {
if (!reply.isSuccessful()) {
emit initFailed("Cannot load JS");
auto value = engine->evaluate(reply.body());
if (!checkError(value)) {
qDebug() << "Initialized";
+ resetNAM();
ready = true;
emit initialized();
}
HEADERS += \
$$PWD/js.h \
$$PWD/jsnamfactory.h \
- $$PWD/jsresult.h
+ $$PWD/jsresult.h \
+ $$PWD/jsvm.h
SOURCES += \
$$PWD/js.cpp \
$$PWD/jsnamfactory.cpp \
- $$PWD/jsresult.cpp
+ $$PWD/jsresult.cpp \
+ $$PWD/jsvm.cpp
--- /dev/null
+#include "jsvm.h"
+
+JSVM::JSVM(QQmlEngine *parent) : QObject{parent}, parentEngine(parent) {}
+
+QJSValue JSVM::runInContext(QString code, QJSValue props) {
+ auto engine = QQmlEngine(this);
+
+ auto objectKeysFunction = parentEngine->evaluate("Object.keys");
+ auto keys = objectKeysFunction.call({props});
+ const int keyLength = keys.property("length").toInt();
+ for (int i = 0; i < keyLength; ++i) {
+ auto key = keys.property(i).toString();
+ auto value = props.property(key).toString();
+ qDebug() << "Setting property" << key << value;
+ engine.globalObject().setProperty(key, value);
+ }
+
+ auto res = engine.evaluate(code).toString();
+ return parentEngine->toScriptValue(res);
+}
--- /dev/null
+#ifndef JSVM_H
+#define JSVM_H
+
+#include <QtCore>
+#include <QtQml>
+
+class JSVM : public QObject {
+ Q_OBJECT
+public:
+ explicit JSVM(QQmlEngine *parent);
+
+ Q_INVOKABLE QJSValue runInContext(QString code, QJSValue props);
+
+private:
+ QQmlEngine *parentEngine;
+};
+
+#endif // JSVM_H
mpv_observe_property(mpv, 0, "volume", MPV_FORMAT_DOUBLE);
mpv_observe_property(mpv, 0, "mute", MPV_FORMAT_FLAG);
mpv_observe_property(mpv, 0, "pause", MPV_FORMAT_FLAG);
+ mpv_observe_property(mpv, 0, "paused-for-cache", MPV_FORMAT_FLAG);
}
// This slot is invoked by wakeup() (through the mpvEvents signal).
}
}
+ else if (strcmp(prop->name, "paused-for-cache") == 0) {
+ if (prop->format == MPV_FORMAT_FLAG) {
+ int pausedForCache = *(int *)prop->data;
+ setState(pausedForCache == 1 ? Media::BufferingState : Media::PlayingState);
+ }
+ }
+
break;
}
</message>
<message>
<source>Powered by %1</source>
- <translation type="unfinished"/>
+ <translation>بدعم من %1</translation>
</message>
<message>
<source>Open-source software</source>
</message>
<message numerus="yes">
<source>You have %n new video(s)</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>You have %n new video(s)</numerusform><numerusform>You have %n new video(s)</numerusform><numerusform>You have %n new video(s)</numerusform><numerusform>You have %n new video(s)</numerusform><numerusform>You have %n new video(s)</numerusform><numerusform>لديك %n فيديو جديد</numerusform></translation>
</message>
</context>
<context>
</message>
<message numerus="yes">
<source>%n day(s) ago</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>%n يوم مضى</numerusform><numerusform>%n يوم مضى</numerusform><numerusform>%n يوم مضى</numerusform><numerusform>%n يوم مضى</numerusform><numerusform>%n يوم مضى</numerusform><numerusform>%n يوم مضى</numerusform></translation>
</message>
<message numerus="yes">
<source>%n month(s) ago</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>%n شهر مضى</numerusform><numerusform>%n شهر مضى</numerusform><numerusform>%n شهر مضى</numerusform><numerusform>%n شهر مضى</numerusform><numerusform>%n شهر مضى</numerusform><numerusform>%n شهر مضى</numerusform></translation>
</message>
<message>
<source>K</source>
</message>
<message numerus="yes">
<source>%n week(s) ago</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>%n اسبوع مضى</numerusform><numerusform>%n اسبوع مضى</numerusform><numerusform>%n اسبوع مضى</numerusform><numerusform>%n اسبوع مضى</numerusform><numerusform>%n اسبوع مضى</numerusform><numerusform>%n اسبوع مضى</numerusform></translation>
</message>
<message numerus="yes">
<source>%n year(s) ago</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>%n سنة مضت</numerusform><numerusform>%n سنة مضت</numerusform><numerusform>%n سنة مضت</numerusform><numerusform>%n سنة مضت</numerusform><numerusform>%n سنة مضت</numerusform><numerusform>%n سنة مضت</numerusform></translation>
</message>
</context>
<context>
</message>
<message numerus="yes">
<source>%n Download(s)</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>%n تحميل</numerusform><numerusform>%n تحميل</numerusform><numerusform>%n تحميل</numerusform><numerusform>%n تحميل</numerusform><numerusform>%n تحميل</numerusform><numerusform>%n تحميل</numerusform></translation>
</message>
</context>
<context>
</message>
<message>
<source>Menu</source>
- <translation type="unfinished"/>
+ <translation>قائمة</translation>
</message>
<message>
<source>&Love %1? Rate it!</source>
</message>
<message>
<source>This year</source>
- <translation type="unfinished"/>
+ <translation>هذه السنة</translation>
</message>
<message>
<source>HD</source>
</message>
<message>
<source>Music</source>
- <translation type="unfinished"/>
+ <translation>موسيقى</translation>
</message>
<message>
<source>News</source>
- <translation type="unfinished"/>
+ <translation>الأخبار</translation>
</message>
<message>
<source>Movies</source>
- <translation type="unfinished"/>
+ <translation>الأفلام</translation>
</message>
<message>
<source>Gaming</source>
- <translation type="unfinished"/>
+ <translation>الألعاب</translation>
</message>
</context>
<context>
</message>
<message>
<source>Download Update</source>
- <translation type="unfinished"/>
+ <translation>تحميل التحديث</translation>
</message>
<message>
<source>Downloading update...</source>
</message>
<message>
<source>Version %1 is available.</source>
- <translation type="unfinished"/>
+ <translation>الإصدار %1 متوفر.</translation>
</message>
<message>
<source>An update has been downloaded and is ready to be installed.</source>
</message>
<message>
<source>Download Update</source>
- <translation type="unfinished"/>
+ <translation>تحميل التحديث</translation>
</message>
</context>
</TS>
\ No newline at end of file
</message>
<message>
<source>Powered by %1</source>
- <translation type="unfinished"/>
+ <translation>Styrket af 1%</translation>
</message>
<message>
<source>Open-source software</source>
- <translation type="unfinished"/>
+ <translation>Åben-Kildekode software</translation>
</message>
<message>
<source>Icon designed by %1.</source>
-<?xml version="1.0" ?><!DOCTYPE TS><TS language="gl" version="2.1">
+<?xml version="1.0" ?><!DOCTYPE TS><TS version="2.1" language="gl">
<context>
<name>AboutView</name>
<message>
</message>
<message numerus="yes">
<source>%n year(s) ago</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>%n ano(s) atrás</numerusform><numerusform>%n ano(s) atrás</numerusform></translation>
</message>
</context>
<context>
</message>
<message>
<source>Rewind %1 seconds</source>
- <translation type="unfinished"/>
+ <translation>Rebobina %1 segundos</translation>
</message>
<message>
<source>Fast forward %1 seconds</source>
- <translation type="unfinished"/>
+ <translation>Avanzar %1 segundos</translation>
</message>
<message>
<source>channel</source>
- <translation type="unfinished"/>
+ <translation>canle</translation>
</message>
</context>
<context>
</message>
<message>
<source>This year</source>
- <translation type="unfinished"/>
+ <translation>Este ano</translation>
</message>
<message>
<source>HD</source>
- <translation type="unfinished"/>
+ <translation>HD</translation>
</message>
<message>
<source>4K</source>
- <translation type="unfinished"/>
+ <translation>4K</translation>
</message>
<message>
<source>HDR</source>
- <translation type="unfinished"/>
+ <translation>HDR</translation>
</message>
</context>
<context>
</message>
<message>
<source>Remove</source>
- <translation type="unfinished"/>
+ <translation>Eliminar</translation>
</message>
<message>
<source>Need a remote control for %1? Try %2!</source>
- <translation type="unfinished"/>
+ <translation>Necesitas un control remoto para %1? Proba %2!</translation>
</message>
<message>
<source>I keep improving %1 to make it the best I can. Support this work!</source>
- <translation type="unfinished"/>
+ <translation>Sigo mellorando %1 para que sexa o mellor posible. Apoia este traballo!</translation>
</message>
<message>
<source>An update is ready to be installed. Quit and install update.</source>
- <translation type="unfinished"/>
+ <translation>Hai unha actualización para ser instalada. Saia e instale a actualización.</translation>
</message>
</context>
<context>
</message>
<message>
<source>Trending</source>
- <translation type="unfinished"/>
+ <translation>Tendencia</translation>
</message>
<message>
<source>Music</source>
- <translation type="unfinished"/>
+ <translation>Música</translation>
</message>
<message>
<source>News</source>
- <translation type="unfinished"/>
+ <translation>Noticias</translation>
</message>
<message>
<source>Movies</source>
- <translation type="unfinished"/>
+ <translation>Películas</translation>
</message>
<message>
<source>Gaming</source>
- <translation type="unfinished"/>
+ <translation>Xogos</translation>
</message>
</context>
<context>
<name>Updater</name>
<message>
<source>Check for Updates...</source>
- <translation type="unfinished"/>
+ <translation>Buscando actualizacións...</translation>
</message>
<message>
<source>Version %1 is available...</source>
- <translation type="unfinished"/>
+ <translation>Está dispoñible a versión %1...</translation>
</message>
<message>
<source>Downloading version %1...</source>
- <translation type="unfinished"/>
+ <translation>Baixando a versión %1...</translation>
</message>
<message>
<source>Restart to Update</source>
- <translation type="unfinished"/>
+ <translation>Reiniciar para actualizar</translation>
</message>
<message>
<source>Version %1 download failed</source>
- <translation type="unfinished"/>
+ <translation>Erro ao baixar a versión %1</translation>
</message>
<message>
<source>Check for Updates</source>
- <translation type="unfinished"/>
+ <translation>Buscar actualizacións</translation>
</message>
<message>
<source>Download Update</source>
- <translation type="unfinished"/>
+ <translation>Baixar actualización</translation>
</message>
<message>
<source>Downloading update...</source>
</message>
<message>
<source>Retry Update Download</source>
- <translation type="unfinished"/>
+ <translation>Volver a intentar baixar a actualización</translation>
</message>
<message>
<source>You have the latest version.</source>
- <translation type="unfinished"/>
+ <translation>Xa tes a última versión.</translation>
</message>
<message>
<source>Version %1 is available.</source>
- <translation type="unfinished"/>
+ <translation>Está dispoñible a versión %1.</translation>
</message>
<message>
<source>An update has been downloaded and is ready to be installed.</source>
- <translation type="unfinished"/>
+ <translation>Baixouse unha actualización e está listo para que se instale.</translation>
</message>
</context>
<context>
<name>updater::DefaultUpdater</name>
<message>
<source>There are currently no updates available.</source>
- <translation type="unfinished"/>
+ <translation>Non hai actualmente actualizacións dispoñibles.</translation>
</message>
</context>
<context>
<name>updater::Dialog</name>
<message>
<source>You already have the latest version</source>
- <translation type="unfinished"/>
+ <translation>Xa tes a última versión</translation>
</message>
<message>
<source>Downloading %1 %2...</source>
- <translation type="unfinished"/>
+ <translation>Baixando %1 %2...</translation>
</message>
<message>
<source>A new version of %1 is available!</source>
</message>
<message>
<source>Download Update</source>
- <translation type="unfinished"/>
+ <translation>Baixar actualización</translation>
</message>
</context>
</TS>
\ No newline at end of file
</message>
<message>
<source>Powered by %1</source>
- <translation type="unfinished"/>
+ <translation>Ditenagai oleh %1</translation>
</message>
<message>
<source>Open-source software</source>
- <translation type="unfinished"/>
+ <translation>Peranti lunak sumber terbuka</translation>
</message>
<message>
<source>Icon designed by %1.</source>
</message>
<message numerus="yes">
<source>%n year(s) ago</source>
- <translation><numerusform>%n ano atrás</numerusform><numerusform>%n anos atrás</numerusform></translation>
+ <translation><numerusform>%n ano atrás</numerusform><numerusform>%n ano(s) atrás</numerusform></translation>
</message>
</context>
<context>
</message>
<message>
<source>Restart to Update</source>
- <translation>Reiniciar para atualizar</translation>
+ <translation>Reiniciar para Atualizar</translation>
</message>
<message>
<source>Version %1 download failed</source>
</message>
<message>
<source>Check for Updates</source>
- <translation>Verificar se há atualizações</translation>
+ <translation>Verificar se há Atualizações</translation>
</message>
<message>
<source>Download Update</source>
-<?xml version="1.0" ?><!DOCTYPE TS><TS language="ru" version="2.1">
+<?xml version="1.0" ?><!DOCTYPE TS><TS version="2.1" language="ru">
<context>
<name>AboutView</name>
<message>
</message>
<message numerus="yes">
<source>%n year(s) ago</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>%n год назад</numerusform><numerusform>%n лет назад</numerusform><numerusform>%n лет назад</numerusform><numerusform>%n лет назад</numerusform></translation>
</message>
</context>
<context>
</message>
<message numerus="yes">
<source>%n Download(s)</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>Скачано %n раз</numerusform><numerusform>Скачано %n раз</numerusform><numerusform>Скачано %n раз</numerusform><numerusform>Скачано %n раз</numerusform></translation>
</message>
</context>
<context>
</message>
<message>
<source>channel</source>
- <translation type="unfinished"/>
+ <translation>канал</translation>
</message>
</context>
<context>
</message>
<message>
<source>This year</source>
- <translation type="unfinished"/>
+ <translation>В этом году</translation>
</message>
<message>
<source>HD</source>
- <translation type="unfinished"/>
+ <translation>HD</translation>
</message>
<message>
<source>4K</source>
- <translation type="unfinished"/>
+ <translation>4K</translation>
</message>
<message>
<source>HDR</source>
- <translation type="unfinished"/>
+ <translation>HDR</translation>
</message>
</context>
<context>
</message>
<message>
<source>Remove</source>
- <translation type="unfinished"/>
+ <translation>Убрать</translation>
</message>
<message>
<source>Need a remote control for %1? Try %2!</source>
- <translation type="unfinished"/>
+ <translation>Нужен пульт для %1? Попробуйте %2!</translation>
</message>
<message>
<source>I keep improving %1 to make it the best I can. Support this work!</source>
- <translation type="unfinished"/>
+ <translation>Я буду улучшать %1 , чтобы достичь лучшего результата. Поддержите работу!</translation>
</message>
<message>
<source>An update is ready to be installed. Quit and install update.</source>
- <translation type="unfinished"/>
+ <translation>Обновление готово для установки. Выйдите и установите обновление.</translation>
</message>
</context>
<context>
</message>
<message>
<source>Trending</source>
- <translation type="unfinished"/>
+ <translation>Популярное</translation>
</message>
<message>
<source>Music</source>
- <translation type="unfinished"/>
+ <translation>Музыка</translation>
</message>
<message>
<source>News</source>
- <translation type="unfinished"/>
+ <translation>Новости</translation>
</message>
<message>
<source>Movies</source>
- <translation type="unfinished"/>
+ <translation>Фильмы</translation>
</message>
<message>
<source>Gaming</source>
- <translation type="unfinished"/>
+ <translation>Игры</translation>
</message>
</context>
<context>
<name>Updater</name>
<message>
<source>Check for Updates...</source>
- <translation type="unfinished"/>
+ <translation>Проверить обновления...</translation>
</message>
<message>
<source>Version %1 is available...</source>
- <translation type="unfinished"/>
+ <translation>Доступна версия %1 </translation>
</message>
<message>
<source>Downloading version %1...</source>
- <translation type="unfinished"/>
+ <translation>Качаю версию %1...</translation>
</message>
<message>
<source>Restart to Update</source>
- <translation type="unfinished"/>
+ <translation>Перезапуск для обновления</translation>
</message>
<message>
<source>Version %1 download failed</source>
- <translation type="unfinished"/>
+ <translation>Загрузка версии %1 сорвалась</translation>
</message>
<message>
<source>Check for Updates</source>
- <translation type="unfinished"/>
+ <translation>Проверить обновления</translation>
</message>
<message>
<source>Download Update</source>
- <translation type="unfinished"/>
+ <translation>Скачать обновление</translation>
</message>
<message>
<source>Downloading update...</source>
</message>
<message>
<source>Retry Update Download</source>
- <translation type="unfinished"/>
+ <translation>Попытаться скачать обновление заново</translation>
</message>
<message>
<source>You have the latest version.</source>
- <translation type="unfinished"/>
+ <translation>У вас последняя версия.</translation>
</message>
<message>
<source>Version %1 is available.</source>
- <translation type="unfinished"/>
+ <translation>Доступна версия %1 </translation>
</message>
<message>
<source>An update has been downloaded and is ready to be installed.</source>
- <translation type="unfinished"/>
+ <translation>Обновление было загружено и готово к установке.</translation>
</message>
</context>
<context>
<name>updater::DefaultUpdater</name>
<message>
<source>There are currently no updates available.</source>
- <translation type="unfinished"/>
+ <translation>Нет новых обновлений.</translation>
</message>
</context>
<context>
<name>updater::Dialog</name>
<message>
<source>You already have the latest version</source>
- <translation type="unfinished"/>
+ <translation>У вас уже последняя версия</translation>
</message>
<message>
<source>Downloading %1 %2...</source>
- <translation type="unfinished"/>
+ <translation>Загружается %1 %2...</translation>
</message>
<message>
<source>A new version of %1 is available!</source>
</message>
<message>
<source>Download Update</source>
- <translation type="unfinished"/>
+ <translation>Скачать обновление</translation>
</message>
</context>
</TS>
\ No newline at end of file
</message>
<message>
<source>Toggle &Menu Bar</source>
- <translation type="unfinished"/>
+ <translation>Приховати &Menu Bar</translation>
</message>
<message>
<source>Menu</source>
</message>
<message>
<source>You can still access the menu bar by pressing the ALT key</source>
- <translation type="unfinished"/>
+ <translation>Відкрити меню можна натисканням ALT</translation>
</message>
</context>
<context>
</message>
<message>
<source>Please <a href='%1'>donate</a> to support the continued development of %2.</source>
- <translation>Будь ласка, <a href='%1'>внесіть пожертву,</a> аби підтримати подальший розвиток %2.</translation>
+ <translation>Будь ласка, <a href='%1'>внесіть пожертву</a>, щоб підтримати подальший розвиток %2.</translation>
</message>
<message>
<source>Translate %1 to your native language using %2</source>
</message>
<message>
<source>Powered by %1</source>
- <translation type="unfinished"/>
+ <translation>За допомогою %1</translation>
</message>
<message>
<source>Open-source software</source>
- <translation type="unfinished"/>
+ <translation>ПЗ із відкритим джерельним кодом</translation>
</message>
<message>
<source>Icon designed by %1.</source>
</message>
<message>
<source>The full version allows you to watch videos without interruptions.</source>
- <translation>Повна версія дозволяє дивитися видиво без перерв.</translation>
+ <translation>Повна версія дозволяє дивитися відео без перерв.</translation>
</message>
<message>
<source>By purchasing the full version, you will also support the hard work I put into creating %1.</source>
- <translation>Ð\9fÑ\80и кÑ\83пÑ\96влÑ\96 повноÑ\97 веÑ\80Ñ\81Ñ\96Ñ\97, Ð\92и, Ñ\82акож, надаÑ\94Ñ\82е пÑ\96дÑ\82Ñ\80имкÑ\83 важкÑ\96й Ñ\80обоÑ\82Ñ\96, Ñ\8fка бÑ\83ла задÑ\96Ñ\8fна пÑ\96д Ñ\87аÑ\81 створення %1.</translation>
+ <translation>Ð\9aÑ\83пÑ\83Ñ\8eÑ\87и повнÑ\83 веÑ\80Ñ\81Ñ\96Ñ\8e Ð\92и Ñ\82акож пÑ\96дÑ\82Ñ\80имÑ\83Ñ\94Ñ\82е важкÑ\83 пÑ\80аÑ\86Ñ\8e внеÑ\81енÑ\83 в створення %1.</translation>
</message>
<message>
<source>Use Demo</source>
<name>AppWidget</name>
<message>
<source>Download</source>
- <translation type="unfinished"/>
+ <translation>Завантажити</translation>
</message>
</context>
<context>
</message>
<message numerus="yes">
<source>You have %n new video(s)</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>У Вас %n нове відео</numerusform><numerusform>У Вас %n нових відео</numerusform><numerusform>У Вас %n нових відео</numerusform><numerusform>У Вас %n нових відео</numerusform></translation>
</message>
</context>
<context>
<name>ChannelItemDelegate</name>
<message>
<source>All Videos</source>
- <translation>Усі видива</translation>
+ <translation>Усі відео</translation>
</message>
<message>
<source>Unwatched Videos</source>
- <translation>Не переглянуті видива</translation>
+ <translation>Не переглянуті відео</translation>
</message>
</context>
<context>
</message>
<message>
<source>Most Watched</source>
- <translation>Найбільш переглядаюче</translation>
+ <translation>Найбільш переглядувані</translation>
</message>
<message>
<source>Sort by</source>
- <translation>Сортувати за</translation>
+ <translation>Ґатункувати за</translation>
</message>
<message>
<source>Mark all as watched</source>
</message>
<message>
<source>You have no subscriptions. Use the star symbol to subscribe to channels.</source>
- <translation>У Вас немає підписок. Використовуйте символ зірочки, аби підписуватися на канали.</translation>
+ <translation>У Вас нема підписок. Використовуйте символ зірочки, щоб підписуватися на канали.</translation>
</message>
<message>
<source>All Videos</source>
- <translation>Усі видива</translation>
+ <translation>Усі відео</translation>
</message>
<message>
<source>Unwatched Videos</source>
- <translation>Не переглянуті видива</translation>
+ <translation>Не переглянуті відео</translation>
</message>
<message>
<source>Mark as Watched</source>
</message>
<message>
<source>There are no updated subscriptions at this time.</source>
- <translation>Наразі оновлень підписок немає.</translation>
+ <translation>Наразі оновлень підписок нема.</translation>
</message>
</context>
<context>
<name>DataUtils</name>
<message>
<source>Just now</source>
- <translation>Тільки що</translation>
+ <translation>Тільки-но</translation>
</message>
<message numerus="yes">
<source>%n hour(s) ago</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>%n год. тому</numerusform><numerusform>%n год. тому</numerusform><numerusform>%n год. тому</numerusform><numerusform>%n год. тому</numerusform></translation>
</message>
<message numerus="yes">
<source>%n day(s) ago</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>%n день тому</numerusform><numerusform>%n дні тому</numerusform><numerusform>%n днів тому</numerusform><numerusform>%n днів тому</numerusform></translation>
</message>
<message numerus="yes">
<source>%n month(s) ago</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>%n місяць тому</numerusform><numerusform>%n місяці тому</numerusform><numerusform>%n місяців тому</numerusform><numerusform>%n місяців тому</numerusform></translation>
</message>
<message>
<source>K</source>
<comment>K as in Kilo, i.e. thousands</comment>
- <translation type="unfinished"/>
+ <translation>Тис</translation>
</message>
<message>
<source>M</source>
<comment>M stands for Millions</comment>
- <translation type="unfinished"/>
+ <translation>Млн</translation>
</message>
<message>
<source>B</source>
<comment>B stands for Billions</comment>
- <translation type="unfinished"/>
+ <translation>Млрд</translation>
</message>
<message>
<source>%1 views</source>
</message>
<message numerus="yes">
<source>%n week(s) ago</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>%n тиждень тому</numerusform><numerusform>%n тижні тому</numerusform><numerusform>%n тижнів тому</numerusform><numerusform>%n тижнів тому</numerusform></translation>
</message>
<message numerus="yes">
<source>%n year(s) ago</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>%n рік тому</numerusform><numerusform>%n роки тому</numerusform><numerusform>%n років тому</numerusform><numerusform>%n років тому</numerusform></translation>
</message>
</context>
<context>
</message>
<message numerus="yes">
<source>%n Download(s)</source>
- <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
+ <translation><numerusform>%n Завантаження</numerusform><numerusform>%n Завантаження</numerusform><numerusform>%n Завантажень</numerusform><numerusform>%n Завантажень</numerusform></translation>
</message>
</context>
<context>
<name>Extra</name>
<message>
<source>The executable file has been tempered with, maybe by a virus.</source>
- <translation>Ð\92иконÑ\83ваний Ñ\84айл бÑ\83ло поÑ\88коджено, може бÑ\83Ñ\82и, вÑ\96Ñ\80Ñ\83Ñ\81.</translation>
+ <translation>Ð\92иконÑ\83ваний Ñ\84айл бÑ\83ло поÑ\88коджено, можливо вÑ\96Ñ\80Ñ\83Ñ\81ом.</translation>
</message>
<message>
<source>%1 will not run. Try installing again.</source>
</message>
<message>
<source>Next track</source>
- <translation>Ð\9dаÑ\81Ñ\82Ñ\83пний Ñ\82Ñ\80ек</translation>
+ <translation>Ð\9dаÑ\81Ñ\82Ñ\83пна доÑ\80Ñ\96жка</translation>
</message>
<message>
<source>Previous track</source>
- <translation>Ð\9fопеÑ\80еднÑ\96й Ñ\82Ñ\80ек</translation>
+ <translation>Ð\9fопеÑ\80еднÑ\8f доÑ\80Ñ\96жка</translation>
</message>
<message>
<source>Increase volume</source>
</message>
<message>
<source>Find videos and channels by keyword</source>
- <translation>Знайти видива та канали за ключовими словами</translation>
+ <translation>Знайти відео та канали за ключовими словами</translation>
</message>
<message>
<source>Browse</source>
</message>
<message>
<source>Browse videos by category</source>
- <translation>Оглянути видива за катеґоріями</translation>
+ <translation>Оглянути відео за катеґоріями</translation>
</message>
<message>
<source>Subscriptions</source>
</message>
<message>
<source>Go back to the previous track</source>
- <translation>Повернутися до попереднього треку</translation>
+ <translation>Повернутися до попередньої доріжки</translation>
</message>
<message>
<source>S&kip</source>
</message>
<message>
<source>Skip to the next video</source>
- <translation>Перейти до наступного видива</translation>
+ <translation>Перейти до наступного відео</translation>
</message>
<message>
<source>&Play</source>
</message>
<message>
<source>Hide the playlist and the toolbar</source>
- <translation>Сховати перелік та панель інструментів</translation>
+ <translation>Сховати перелік та панель знарядь</translation>
</message>
<message>
<source>Open the &YouTube Page</source>
</message>
<message>
<source>Go to the YouTube video page and pause playback</source>
- <translation>Відкрити сторінку YouTube та призупинити відтворення видива</translation>
+ <translation>Відкрити сторінку YouTube та призупинити відтворення відео</translation>
</message>
<message>
<source>Copy the YouTube &Link</source>
</message>
<message>
<source>Copy the current video YouTube link to the clipboard</source>
- <translation>Скопіювати YouTube посилання поточного видива до буферу</translation>
+ <translation>Скопіювати YouTube-посилання поточного відео до буферу</translation>
</message>
<message>
<source>Copy the Video Stream &URL</source>
- <translation>Копіювати посилання на ви&диво потік</translation>
+ <translation>Копіювати посилання на ві&деопотік</translation>
</message>
<message>
<source>Copy the current video stream URL to the clipboard</source>
- <translation>Скопіювати посилання поточного видива до буферу</translation>
+ <translation>Скопіювати посилання поточного відео до буферу</translation>
</message>
<message>
<source>Find Video &Parts</source>
- <translation>Знайти &фраґменти видива</translation>
+ <translation>Знайти &фрагменти відео</translation>
</message>
<message>
<source>Find other video parts hopefully in the right order</source>
- <translation>Знайти інші частини видива, сподіваюся, у правильному порядку</translation>
+ <translation>Знайти инші частини відео, сподіваюсь, у правильному порядку</translation>
</message>
<message>
<source>&Remove</source>
</message>
<message>
<source>Remove the selected videos from the playlist</source>
- <translation>Ð\92илÑ\83Ñ\87иÑ\82и обÑ\80анÑ\96 видива з пеÑ\80елÑ\96кÑ\83</translation>
+ <translation>Ð\92илÑ\83Ñ\87иÑ\82и вибÑ\80анÑ\96 вÑ\96део з гÑ\80айлиÑ\81Ñ\82а</translation>
</message>
<message>
<source>Move &Up</source>
</message>
<message>
<source>Move up the selected videos in the playlist</source>
- <translation>Ð\9fеÑ\80емÑ\96Ñ\81Ñ\82иÑ\82и обÑ\80ане видиво догоÑ\80и Ñ\83 пеÑ\80елÑ\96кÑ\83</translation>
+ <translation>Ð\9fеÑ\80емÑ\96Ñ\81Ñ\82иÑ\82и вибÑ\80ане вÑ\96део догоÑ\80и Ñ\83 гÑ\80айлиÑ\81Ñ\82Ñ\96</translation>
</message>
<message>
<source>Move &Down</source>
</message>
<message>
<source>Move down the selected videos in the playlist</source>
- <translation>Ð\9fеÑ\80емÑ\96Ñ\81Ñ\82иÑ\82и обÑ\80ане видиво донизÑ\83 в пеÑ\80елÑ\96кÑ\83</translation>
+ <translation>Ð\9fеÑ\80емÑ\96Ñ\81Ñ\82иÑ\82и вибÑ\80ане вÑ\96део донизÑ\83 в гÑ\80айлиÑ\81Ñ\82Ñ\96</translation>
</message>
<message>
<source>&Clear Recent Searches</source>
</message>
<message>
<source>Clear the search history. Cannot be undone.</source>
- <translation>Очистити історію пошуку (зміни незворотні).</translation>
+ <translation>Очистити дієпис пошуку (зміни незворотні).</translation>
</message>
<message>
<source>&Quit</source>
</message>
<message>
<source>&Website</source>
- <translation>&Веб-сайт</translation>
+ <translation>&Вебсайт</translation>
</message>
<message>
<source>%1 on the Web</source>
</message>
<message>
<source>Manually start playing videos</source>
- <translation>Почати відтворення видива самотужки</translation>
+ <translation>Почати відтворення відео самотужки</translation>
</message>
<message>
<source>&Downloads</source>
</message>
<message>
<source>Show details about video downloads</source>
- <translation>Ð\9fоказаÑ\82и деÑ\82алÑ\96 пÑ\80о видива, Ñ\89о заванÑ\82ажÑ\83Ñ\8eÑ\82Ñ\8cÑ\81Ñ\8f</translation>
+ <translation>Ð\9fоказаÑ\82и деÑ\82алÑ\96 пÑ\80о заванÑ\82ажÑ\83ванÑ\96 вÑ\96део</translation>
</message>
<message>
<source>&Download</source>
</message>
<message>
<source>Download the current video</source>
- <translation>Завантажити це видиво</translation>
+ <translation>Завантажити це відео</translation>
</message>
<message>
<source>Take &Snapshot</source>
</message>
<message>
<source>Share the current video using %1</source>
- <translation>Поділитися поточним видивом за допомогою %1</translation>
+ <translation>Поділитися поточним відео за допомогою %1</translation>
</message>
<message>
<source>&Email</source>
</message>
<message>
<source>&Stop After This Video</source>
- <translation>Зу&пинити після цього видиво</translation>
+ <translation>Зу&пинити після цього відео</translation>
</message>
<message>
<source>&Report an Issue...</source>
</message>
<message>
<source>&Related Videos</source>
- <translation>Схо&жі видива</translation>
+ <translation>Схо&жі відео</translation>
</message>
<message>
<source>Watch videos related to the current one</source>
- <translation>Дивитися видива, пов’язані з поточним</translation>
+ <translation>Дивитися відео, пов’язані з поточним</translation>
</message>
<message>
<source>Open in &Browser...</source>
</message>
<message>
<source>Restricted Mode</source>
- <translation type="unfinished"/>
+ <translation>Безпечний режим</translation>
</message>
<message>
<source>Hide videos that may contain inappropriate content</source>
- <translation type="unfinished"/>
+ <translation>Сховати відео, які можуть містити невідповідний вміст</translation>
</message>
<message>
<source>Toggle &Menu Bar</source>
- <translation type="unfinished"/>
+ <translation>Приховати &Меню</translation>
</message>
<message>
<source>Menu</source>
- <translation type="unfinished"/>
+ <translation>Меню</translation>
</message>
<message>
<source>&Love %1? Rate it!</source>
</message>
<message>
<source>&Playlist</source>
- <translation>&Ð\9fеÑ\80елÑ\96к вÑ\96дÑ\82воÑ\80еннÑ\8f</translation>
+ <translation>&Ð\93Ñ\80айлиÑ\81Ñ\82</translation>
</message>
<message>
<source>&Video</source>
- <translation>&Видиво</translation>
+ <translation>&Відео</translation>
</message>
<message>
<source>&Share</source>
</message>
<message>
<source>Press %1 to raise the volume, %2 to lower it</source>
- <translation>Ð\9dаÑ\82иÑ\81нÑ\96Ñ\82Ñ\8c %1, аби пÑ\80иглÑ\83Ñ\88иÑ\82и гÑ\83Ñ\87нÑ\96Ñ\81Ñ\82Ñ\8c, Ñ\82а %2, щоб її відновити</translation>
+ <translation>Ð\9dаÑ\82иÑ\81нÑ\96Ñ\82Ñ\8c %1, аби пÑ\80иглÑ\83Ñ\88иÑ\82и гÑ\83Ñ\87нÑ\96Ñ\81Ñ\82Ñ\8c, Ñ\96 %2, щоб її відновити</translation>
</message>
<message>
<source>Choose your content location</source>
</message>
<message>
<source>If you close %1 now, this download will be cancelled.</source>
- <translation>Якщо закрити %1 негайно, усі завантаження буде скасовано.</translation>
+ <translation>Якщо закрити %1 негайно, всі завантаження буде скасовано.</translation>
</message>
<message>
<source>Close and cancel download</source>
</message>
<message>
<source>Maximum video definition set to %1</source>
- <translation>Режим чіткості видива %1</translation>
+ <translation>Режим чіткости відео %1</translation>
</message>
<message>
<source>Your privacy is now safe</source>
</message>
<message>
<source>You can still access the menu bar by pressing the ALT key</source>
- <translation type="unfinished"/>
+ <translation>Відкрити меню можна натисканням ALT</translation>
</message>
</context>
<context>
<name>MediaView</name>
<message>
<source>You can now paste the YouTube link into another application</source>
- <translation>Тепер Ви можете використовувати YouTube посилання на видиво у зовнішній проґрамі</translation>
+ <translation>Тепер Ви можете використовувати YouTube-посилання на відео у зовнішній проґрамі</translation>
</message>
<message>
<source>You can now paste the video stream URL into another application</source>
- <translation>Тепер Ви можете використовувати посилання на видиво у зовнішній проґрамі</translation>
+ <translation>Тепер Ви можете використовувати посилання на відео у зовнішній проґрамі</translation>
</message>
<message>
<source>The link will be valid only for a limited time.</source>
- <translation>Ð\9fоÑ\81иланнÑ\8f бÑ\83де дÑ\96йÑ\81не лиÑ\88е пÑ\80оÑ\82Ñ\8fгом обмеженого часу.</translation>
+ <translation>Ð\9fоÑ\81иланнÑ\8f бÑ\83де дÑ\96йÑ\81не лиÑ\88е впÑ\80одовж обмеженого часу.</translation>
</message>
<message>
<source>Downloading %1</source>
</message>
<message>
<source>Switched to %1</source>
- <translation type="unfinished"/>
+ <translation>Перемикнутися на %1</translation>
</message>
<message>
<source>Unsubscribed from %1</source>
</message>
<message>
<source>channel</source>
- <translation type="unfinished"/>
+ <translation>канал</translation>
</message>
</context>
<context>
<name>PickMessage</name>
<message>
<source>Pick a video</source>
- <translation type="unfinished"/>
+ <translation>Оберіть відео</translation>
</message>
</context>
<context>
</message>
<message>
<source>Open parent folder</source>
- <translation>Перейти до теки з видивами</translation>
+ <translation>Перейти до теки з відео</translation>
</message>
<message>
<source>Restart downloading</source>
- <translation>Ð\97аванÑ\82ажиÑ\82и заново</translation>
+ <translation>Ð\9fеÑ\80езапÑ\83Ñ\81Ñ\82иÑ\82и заванÑ\82аженнÑ\8f</translation>
</message>
</context>
<context>
</message>
<message>
<source>No more videos</source>
- <translation>Більше немає</translation>
+ <translation>Більше нема</translation>
</message>
</context>
<context>
<name>RefineSearchWidget</name>
<message>
<source>Sort by</source>
- <translation>Сортувати за</translation>
+ <translation>Ґатункувати за</translation>
</message>
<message>
<source>Relevance</source>
</message>
<message>
<source>This year</source>
- <translation type="unfinished"/>
+ <translation>Цього року</translation>
</message>
<message>
<source>HD</source>
- <translation type="unfinished"/>
+ <translation>HD</translation>
</message>
<message>
<source>4K</source>
- <translation type="unfinished"/>
+ <translation>4K</translation>
</message>
<message>
<source>HDR</source>
- <translation type="unfinished"/>
+ <translation>HDR</translation>
</message>
</context>
<context>
</message>
<message>
<source>Remove</source>
- <translation type="unfinished"/>
+ <translation>Вилучити</translation>
</message>
<message>
<source>Need a remote control for %1? Try %2!</source>
- <translation type="unfinished"/>
+ <translation>Потрібен пульт дистанційного керування для %1? Спробуйте %2!</translation>
</message>
<message>
<source>I keep improving %1 to make it the best I can. Support this work!</source>
- <translation type="unfinished"/>
+ <translation>Я постійно вдосконалюю %1, щоб зробити це якнайкраще. Підтримайте цю роботу!</translation>
</message>
<message>
<source>An update is ready to be installed. Quit and install update.</source>
- <translation type="unfinished"/>
+ <translation>Оновлення готове до встановлення. Закрийте та встановіть оновлення.</translation>
</message>
</context>
<context>
</message>
<message>
<source>&Forward</source>
- <translation type="unfinished"/>
+ <translation>&Уперед</translation>
</message>
<message>
<source>Forward to %1</source>
</message>
<message>
<source>Trending</source>
- <translation type="unfinished"/>
+ <translation>Тенденція</translation>
</message>
<message>
<source>Music</source>
- <translation type="unfinished"/>
+ <translation>Музика</translation>
</message>
<message>
<source>News</source>
- <translation type="unfinished"/>
+ <translation>Новини</translation>
</message>
<message>
<source>Movies</source>
- <translation type="unfinished"/>
+ <translation>Фільми</translation>
</message>
<message>
<source>Gaming</source>
- <translation type="unfinished"/>
+ <translation>Ігри</translation>
</message>
</context>
<context>
</message>
<message>
<source>Downloading %1...</source>
- <translation type="unfinished"/>
+ <translation>Завантаження %1...</translation>
</message>
</context>
<context>
<name>Updater</name>
<message>
<source>Check for Updates...</source>
- <translation type="unfinished"/>
+ <translation>Перевірити наявність оновлень...</translation>
</message>
<message>
<source>Version %1 is available...</source>
- <translation type="unfinished"/>
+ <translation>Доступна версія %1 ...</translation>
</message>
<message>
<source>Downloading version %1...</source>
- <translation type="unfinished"/>
+ <translation>Завантаження версії %1...</translation>
</message>
<message>
<source>Restart to Update</source>
- <translation type="unfinished"/>
+ <translation>Перезапустити оновлення</translation>
</message>
<message>
<source>Version %1 download failed</source>
- <translation type="unfinished"/>
+ <translation>Не вдалося завантажити версію %1</translation>
</message>
<message>
<source>Check for Updates</source>
- <translation type="unfinished"/>
+ <translation>Перевірити наявність оновлень</translation>
</message>
<message>
<source>Download Update</source>
- <translation type="unfinished"/>
+ <translation>Завантажити оновлення</translation>
</message>
<message>
<source>Downloading update...</source>
</message>
<message>
<source>Retry Update Download</source>
- <translation type="unfinished"/>
+ <translation>Повторити спробу завантаження оновлення</translation>
</message>
<message>
<source>You have the latest version.</source>
- <translation type="unfinished"/>
+ <translation>У вас остання версія.</translation>
</message>
<message>
<source>Version %1 is available.</source>
- <translation type="unfinished"/>
+ <translation>Доступна версія %1.</translation>
</message>
<message>
<source>An update has been downloaded and is ready to be installed.</source>
- <translation type="unfinished"/>
+ <translation>Оновлення завантажено та готове до встановлення.</translation>
</message>
</context>
<context>
<name>YTJSVideo</name>
<message>
<source>Cannot get video stream for %1</source>
- <translation>Ð\9dе вдалоÑ\81Ñ\8f оÑ\82Ñ\80имаÑ\82и видивопотік для %1</translation>
+ <translation>Ð\9dе вдалоÑ\81Ñ\8c оÑ\82Ñ\80имаÑ\82и вÑ\96деопотік для %1</translation>
</message>
</context>
<context>
<name>YTRegions</name>
<message>
<source>Algeria</source>
- <translation>Алжир</translation>
+ <translation>Алжір</translation>
</message>
<message>
<source>Argentina</source>
- <translation>Аргентина</translation>
+ <translation>Арґентина</translation>
</message>
<message>
<source>Australia</source>
</message>
<message>
<source>Russia</source>
- <translation>РоÑ\81Ñ\96йÑ\81Ñ\8cка ФедеÑ\80аÑ\86ія</translation>
+ <translation>Ð\9cоÑ\81ковія</translation>
</message>
<message>
<source>Saudi Arabia</source>
</message>
<message>
<source>Spain</source>
- <translation>Ð\86спанія</translation>
+ <translation>Ð\95спанія</translation>
</message>
<message>
<source>Sweden</source>
</message>
<message>
<source>United Kingdom</source>
- <translation>Ð\92еликобританія</translation>
+ <translation>Ð\92елика Ð\91ританія</translation>
</message>
<message>
<source>Yemen</source>
<name>YTVideo</name>
<message>
<source>Cannot get video stream for %1</source>
- <translation>Ð\9dе вдалоÑ\81Ñ\8f оÑ\82Ñ\80имаÑ\82и видивопотік для %1</translation>
+ <translation>Ð\9dе вдалоÑ\81Ñ\8c оÑ\82Ñ\80имаÑ\82и вÑ\96деопотік для %1</translation>
</message>
</context>
<context>
<name>updater::DefaultUpdater</name>
<message>
<source>There are currently no updates available.</source>
- <translation type="unfinished"/>
+ <translation>Наразі оновлень нема.</translation>
</message>
</context>
<context>
<name>updater::Dialog</name>
<message>
<source>You already have the latest version</source>
- <translation type="unfinished"/>
+ <translation>У вас вже є остання версія</translation>
</message>
<message>
<source>Downloading %1 %2...</source>
- <translation type="unfinished"/>
+ <translation>Завантаження %1 %2...</translation>
</message>
<message>
<source>A new version of %1 is available!</source>
</message>
<message>
<source>Download Update</source>
- <translation type="unfinished"/>
+ <translation>Завантажити оновлення</translation>
</message>
</context>
</TS>
\ No newline at end of file
</message>
<message numerus="yes">
<source>%n year(s) ago</source>
- <translation type="unfinished"><numerusform></numerusform></translation>
+ <translation><numerusform>%n 年前</numerusform></translation>
</message>
</context>
<context>
</message>
<message>
<source>This year</source>
- <translation type="unfinished"/>
+ <translation>今年</translation>
</message>
<message>
<source>HD</source>
- <translation type="unfinished"/>
+ <translation>HD</translation>
</message>
<message>
<source>4K</source>
- <translation type="unfinished"/>
+ <translation>4K</translation>
</message>
<message>
<source>HDR</source>
- <translation type="unfinished"/>
+ <translation>HDR</translation>
</message>
</context>
<context>
</message>
<message>
<source>An update is ready to be installed. Quit and install update.</source>
- <translation type="unfinished"/>
+ <translation>更新已准备好,退出并安装更新</translation>
</message>
</context>
<context>
</message>
<message>
<source>Trending</source>
- <translation type="unfinished"/>
+ <translation>趋势</translation>
</message>
<message>
<source>Music</source>
- <translation type="unfinished"/>
+ <translation>音乐</translation>
</message>
<message>
<source>News</source>
- <translation type="unfinished"/>
+ <translation>新闻</translation>
</message>
<message>
<source>Movies</source>
- <translation type="unfinished"/>
+ <translation>电影</translation>
</message>
<message>
<source>Gaming</source>
- <translation type="unfinished"/>
+ <translation>游戏</translation>
</message>
</context>
<context>
<name>Updater</name>
<message>
<source>Check for Updates...</source>
- <translation type="unfinished"/>
+ <translation>查检更新</translation>
</message>
<message>
<source>Version %1 is available...</source>
- <translation type="unfinished"/>
+ <translation>版本 %1 可用</translation>
</message>
<message>
<source>Downloading version %1...</source>
- <translation type="unfinished"/>
+ <translation>下载版本 %1...</translation>
</message>
<message>
<source>Restart to Update</source>
- <translation type="unfinished"/>
+ <translation>重启开始更新</translation>
</message>
<message>
<source>Version %1 download failed</source>
- <translation type="unfinished"/>
+ <translation>版本 %1 下载失败</translation>
</message>
<message>
<source>Check for Updates</source>
- <translation type="unfinished"/>
+ <translation>查检更新</translation>
</message>
<message>
<source>Download Update</source>
- <translation type="unfinished"/>
+ <translation>下载更新</translation>
</message>
<message>
<source>Downloading update...</source>
</message>
<message>
<source>Retry Update Download</source>
- <translation type="unfinished"/>
+ <translation>重试下载更新</translation>
</message>
<message>
<source>You have the latest version.</source>
- <translation type="unfinished"/>
+ <translation>已是最新版本</translation>
</message>
<message>
<source>Version %1 is available.</source>
- <translation type="unfinished"/>
+ <translation>版本 %1 可用</translation>
</message>
<message>
<source>An update has been downloaded and is ready to be installed.</source>
- <translation type="unfinished"/>
+ <translation>更新下载,准备更新</translation>
</message>
</context>
<context>
<name>updater::DefaultUpdater</name>
<message>
<source>There are currently no updates available.</source>
- <translation type="unfinished"/>
+ <translation>当前没有更新可用</translation>
</message>
</context>
<context>
<name>updater::Dialog</name>
<message>
<source>You already have the latest version</source>
- <translation type="unfinished"/>
+ <translation>已是最新版本</translation>
</message>
<message>
<source>Downloading %1 %2...</source>
- <translation type="unfinished"/>
+ <translation>已下载 %1 %2...</translation>
</message>
<message>
<source>A new version of %1 is available!</source>
</message>
<message>
<source>Download Update</source>
- <translation type="unfinished"/>
+ <translation>下载更新</translation>
</message>
</context>
</TS>
\ No newline at end of file
CONFIG += c++17 exceptions_off rtti_off object_parallel_to_source
TEMPLATE = app
-VERSION = 3.9.1
+VERSION = 3.9.3
DEFINES += APP_VERSION="$$VERSION"
APP_NAME = Minitube
} else if (VideoAPI::impl() == VideoAPI::YT3) {
YT3::instance().initApiKeys();
} else if (VideoAPI::impl() == VideoAPI::JS) {
- JS::instance().initialize(QUrl(QLatin1String(Constants::WEBSITE) + "-ws/bundle2.js"));
+ JS::instance().initialize(QUrl(QLatin1String(Constants::WEBSITE) + "-ws/bundle3.js"));
// JS::instance().initialize(QUrl("http://localhost:8000/bundle-test.js"));
Invidious::instance().initServers();
}
QAction *regionAction = MainWindow::instance()->getRegionAction();
regionAction->setText(region.name);
regionAction->setIcon(YTRegions::iconForRegionId(region.id));
+
+ loadNextPreview();
+}
+
+void StandardFeedsView::loadNextPreview(VideoSourceWidget *previous) {
+ int index = 0;
+ if (previous) {
+ index = sourceWidgets.indexOf(previous);
+ index++;
+ if (index == sourceWidgets.length() || index < 0) return;
+ }
+ auto w = sourceWidgets.at(index);
+ w->loadPreview()->finally([this, w] { loadNextPreview(w); });
}
void StandardFeedsView::layoutCategories(const QVector<YTCategory> &categories) {
int i = layout->count();
const int cols = VideoAPI::impl() == VideoAPI::YT3 ? 5 : 2;
layout->addWidget(w, i / cols, i % cols);
+
+ connect(w, &QObject::destroyed, this, [this, w] { sourceWidgets.removeOne(w); });
+ sourceWidgets << w;
}
void StandardFeedsView::removeVideoSourceWidget(VideoSourceWidget *videoSourceWidget) {
private:
void resetLayout();
void addVideoSourceWidget(VideoSource *videoSource);
+ void loadNextPreview(VideoSourceWidget *previous = nullptr);
+
YTStandardFeed *
buildStandardFeed(const QString &feedId, const QString &label, QString time = QString());
QGridLayout *layout;
+ QVector<VideoSourceWidget *> sourceWidgets;
};
#endif // CATEGORIESVIEW_H
lastPixelRatio(0) {
videoSource->setParent(this);
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
- loadPreview();
connect(this, SIGNAL(activated()), SLOT(activate()));
}
video->loadThumb(size(), lastPixelRatio)
.then([this](auto variant) { setPixmapData(variant.toByteArray()); })
.onFailed([](auto msg) { qDebug() << msg; })
- .finally([videos] {
+ .finally([this, videos] {
for (auto v : videos)
v->deleteLater();
+ emit previewLoaded();
});
}
update();
}
-void VideoSourceWidget::loadPreview() {
- connect(videoSource, SIGNAL(gotVideos(QVector<Video*>)),
- SLOT(previewVideo(QVector<Video*>)), Qt::UniqueConnection);
+EmptyPromise *VideoSourceWidget::loadPreview() {
+ auto promise = new EmptyPromise(this);
+ connect(this, &VideoSourceWidget::previewLoaded, promise, &EmptyPromise::resolve);
+ connect(this, &VideoSourceWidget::unavailable, promise, [promise] {
+ promise->reject(staticMetaObject.className() + QLatin1String(" unavailable"));
+ });
+
+ connect(videoSource, SIGNAL(gotVideos(QVector<Video *>)), SLOT(previewVideo(QVector<Video *>)),
+ Qt::UniqueConnection);
videoSource->loadVideos(1, 1);
+
+ return promise;
}
QPixmap VideoSourceWidget::playPixmap() {
#include <QtWidgets>
+#include "emptypromise.h"
#include "gridwidget.h"
class Video;
public:
VideoSourceWidget(VideoSource *videoSource, QWidget *parent = 0);
VideoSource *getVideoSource() { return videoSource; }
+ EmptyPromise *loadPreview();
signals:
void activated(VideoSource *videoSource);
+ void previewLoaded();
void unavailable(VideoSourceWidget *videoSourceWidget);
protected:
void setPixmapData(const QByteArray &bytes);
private:
- void loadPreview();
-
QPixmap playPixmap();
VideoSource *videoSource;
QPixmap pixmap;