diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index db0987cf..4e68b7f2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -38,9 +38,9 @@ jobs: matrix: stable: [true] crystal: - - 1.0.0 - - 1.1.1 - 1.2.2 + - 1.3.2 + - 1.4.0 include: - crystal: nightly stable: false diff --git a/assets/js/player.js b/assets/js/player.js index e478fb8f..f5bec651 100644 --- a/assets/js/player.js +++ b/assets/js/player.js @@ -49,6 +49,42 @@ videojs.Vhs.xhr.beforeRequest = function(options) { var player = videojs('player', options); +player.on('error', () => { + if (video_data.params.quality !== 'dash') { + if (!player.currentSrc().includes("local=true") && !video_data.local_disabled) { + var currentSources = player.currentSources(); + for (var i = 0; i < currentSources.length; i++) { + currentSources[i]["src"] += "&local=true" + } + player.src(currentSources) + } + else if (player.error().code === 2 || player.error().code === 4) { + setTimeout(function (event) { + console.log('An error occurred in the player, reloading...'); + + var currentTime = player.currentTime(); + var playbackRate = player.playbackRate(); + var paused = player.paused(); + + player.load(); + + if (currentTime > 0.5) currentTime -= 0.5; + + player.currentTime(currentTime); + player.playbackRate(playbackRate); + + if (!paused) player.play(); + }, 10000); + } + } +}); + +if (video_data.params.quality == 'dash') { + player.reloadSourceOnError({ + errorInterval: 10 + }); +} + /** * Function for add time argument to url * @param {String} url @@ -144,27 +180,6 @@ if (isMobile()) { }) } -player.on('error', function (event) { - if (player.error().code === 2 || player.error().code === 4) { - setTimeout(function (event) { - console.log('An error occurred in the player, reloading...'); - - var currentTime = player.currentTime(); - var playbackRate = player.playbackRate(); - var paused = player.paused(); - - player.load(); - - if (currentTime > 0.5) currentTime -= 0.5; - - player.currentTime(currentTime); - player.playbackRate(playbackRate); - - if (!paused) player.play(); - }, 5000); - } -}); - // Enable VR video support if (!video_data.params.listen && video_data.vr && video_data.params.vr_mode) { player.crossOrigin("anonymous") @@ -751,7 +766,7 @@ if (window.location.pathname.startsWith("/embed/")) { // Create hyperlink for current instance redirect_element = document.createElement("a"); - redirect_element.setAttribute("href", `http://${window.location.host}/watch?v=${window.location.pathname.replace("/embed/","")}`) + redirect_element.setAttribute("href", `//${window.location.host}/watch?v=${window.location.pathname.replace("/embed/","")}`) redirect_element.appendChild(document.createTextNode("Invidious")) watch_on_invidious_button.el().appendChild(redirect_element) diff --git a/assets/js/silvermine-videojs-quality-selector.min.js b/assets/js/silvermine-videojs-quality-selector.min.js index 88621e8d..1877047d 100644 --- a/assets/js/silvermine-videojs-quality-selector.min.js +++ b/assets/js/silvermine-videojs-quality-selector.min.js @@ -1,4 +1,4 @@ -/*! @silvermine/videojs-quality-selector 2020-03-02 v1.1.2-36-g64d620a-dirty */ +/*! @silvermine/videojs-quality-selector 2022-04-13 v1.1.2-43-gaa06e72-dirty */ -!function u(o,c,a){function l(e,n){if(!c[e]){if(!o[e]){var t="function"==typeof require&&require;if(!n&&t)return t(e,!0);if(s)return s(e,!0);var r=new Error("Cannot find module '"+e+"'");throw r.code="MODULE_NOT_FOUND",r}var i=c[e]={exports:{}};o[e][0].call(i.exports,function(n){return l(o[e][1][n]||n)},i,i.exports,u,o,c,a)}return c[e].exports}for(var s="function"==typeof require&&require,n=0;n":">",'"':""","'":"'","`":"`"},W=h.invert(P);h.escape=D(P),h.unescape=D(W),h.result=function(n,e,t){h.isArray(e)||(e=[e]);var r=e.length;if(!r)return h.isFunction(t)?t.call(n):t;for(var i=0;i/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};function Y(n){return"\\"+K[n]}var z=/(.)^/,K={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},G=/\\|'|\r|\n|\u2028|\u2029/g;h.template=function(u,n,e){!n&&e&&(n=e),n=h.defaults({},n,h.templateSettings);var t,r=RegExp([(n.escape||z).source,(n.interpolate||z).source,(n.evaluate||z).source].join("|")+"|$","g"),o=0,c="__p+='";u.replace(r,function(n,e,t,r,i){return c+=u.slice(o,i).replace(G,Y),o=i+n.length,e?c+="'+\n((__t=("+e+"))==null?'':_.escape(__t))+\n'":t?c+="'+\n((__t=("+t+"))==null?'':__t)+\n'":r&&(c+="';\n"+r+"\n__p+='"),n}),c+="';\n",n.variable||(c="with(obj||{}){\n"+c+"}\n"),c="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+c+"return __p;\n";try{t=new Function(n.variable||"obj","_",c)}catch(n){throw n.source=c,n}function i(n){return t.call(this,n,h)}var a=n.variable||"obj";return i.source="function("+a+"){\n"+c+"}",i},h.chain=function(n){var e=h(n);return e._chain=!0,e};function H(n,e){return n._chain?h(e).chain():e}h.mixin=function(t){return h.each(h.functions(t),function(n){var e=h[n]=t[n];h.prototype[n]=function(){var n=[this._wrapped];return i.apply(n,arguments),H(this,e.apply(h,n))}}),h},h.mixin(h),h.each(["pop","push","reverse","shift","sort","splice","unshift"],function(e){var t=r[e];h.prototype[e]=function(){var n=this._wrapped;return t.apply(n,arguments),"shift"!==e&&"splice"!==e||0!==n.length||delete n[0],H(this,n)}}),h.each(["concat","join","slice"],function(n){var e=r[n];h.prototype[n]=function(){return H(this,e.apply(this._wrapped,arguments))}}),h.prototype.value=function(){return this._wrapped},h.prototype.valueOf=h.prototype.toJSON=h.prototype.value,h.prototype.toString=function(){return String(this._wrapped)},"function"==typeof define&&define.amd&&define("underscore",[],function(){return h})}()}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],3:[function(n,e,t){"use strict";var i=n("underscore"),u=n("../events");e.exports=function(n){var r=n.getComponent("MenuItem");return n.extend(r,{constructor:function(n,e){var t=e.source;if(!i.isObject(t))throw new Error('was not provided a "source" object, but rather: '+typeof t);e=i.extend({selectable:!0,label:t.label},e),r.call(this,n,e),this.source=t},handleClick:function(n){r.prototype.handleClick.call(this,n),this.player().trigger(u.QUALITY_REQUESTED,this.source)}})}},{"../events":5,underscore:2}],4:[function(n,e,t){"use strict";var i=n("underscore"),u=n("../events"),o=n("./QualityOption"),c="vjs-quality-changing";e.exports=function(n){var e,r=n.getComponent("MenuButton"),t=o(n);return e=n.extend(r,{constructor:function(t,n){r.call(this,t,n),t.on(u.QUALITY_REQUESTED,function(n,e){this.setSelectedSource(e),t.addClass(c),t.one("loadeddata",function(){t.removeClass(c)})}.bind(this)),t.on(u.PLAYER_SOURCES_CHANGED,function(){this.update()}.bind(this)),t.on(u.QUALITY_SELECTED,function(n,e){this.setSelectedSource(e)}.bind(this)),t.one("ready",function(){this.selectedSrc=t.src(),this.update()}.bind(this)),this.controlText("Open quality selector menu")},setSelectedSource:function(n){var e=n?n.src:void 0;this.selectedSrc!==e&&(this.selectedSrc=e,i.each(this.items,function(n){n.selected(n.source.src===e)}))},createItems:function(){var e=this.player(),n=e.currentSources();return i.map(n,function(n){return new t(e,{source:n,selected:n.src===this.selectedSrc})}.bind(this))},buildWrapperCSSClass:function(){return"vjs-quality-selector "+r.prototype.buildWrapperCSSClass.call(this)}}),n.registerComponent("QualitySelector",e),e}},{"../events":5,"./QualityOption":3,underscore:2}],5:[function(n,e,t){"use strict";e.exports={QUALITY_REQUESTED:"qualityRequested",QUALITY_SELECTED:"qualitySelected",PLAYER_SOURCES_CHANGED:"playerSourcesChanged"}},{}],6:[function(n,e,t){"use strict";var c=n("underscore"),r=n("./events"),i=n("./components/QualitySelector"),u=n("./middleware/SourceInterceptor"),a=n("./util/SafeSeek");e.exports=function(n){n=n||window.videojs,i(n),u(n),n.hook("setup",function(o){o.on(r.QUALITY_REQUESTED,function(n,e){var t=o.currentSources(),r=o.currentTime(),i=o.playbackRate(),u=o.paused();c.each(t,function(n){n.selected=!1}),c.findWhere(t,{src:e.src}).selected=!0,o._qualitySelectorSafeSeek&&o._qualitySelectorSafeSeek.onQualitySelectionChange(),o.src(t),o.ready(function(){o._qualitySelectorSafeSeek&&!o._qualitySelectorSafeSeek.hasFinished()||(o._qualitySelectorSafeSeek=new a(o,r),o.playbackRate(i)),u||o.play()})})})},e.exports.EVENTS=r},{"./components/QualitySelector":4,"./events":5,"./middleware/SourceInterceptor":7,"./util/SafeSeek":9,underscore:2}],7:[function(n,e,t){"use strict";var u=n("underscore"),o=n("../events");e.exports=function(n){n.use("*",function(i){return{setSource:function(n,e){var t,r=i.currentSources();i._qualitySelectorSafeSeek&&i._qualitySelectorSafeSeek.onPlayerSourcesChange(),u.isEqual(r,i._qualitySelectorPreviousSources)||(i.trigger(o.PLAYER_SOURCES_CHANGED,r),i._qualitySelectorPreviousSources=r),t=u.find(r,function(n){return!0===n.selected||"true"===n.selected||"selected"===n.selected})||n,i.trigger(o.QUALITY_SELECTED,t),e(null,t)}}})}},{"../events":5,underscore:2}],8:[function(n,e,t){"use strict";n("./index")()},{"./index":6}],9:[function(n,e,t){"use strict";var r=n("class.extend");e.exports=r.extend({init:function(n,e){this._player=n,this._seekToTime=e,this._hasFinished=!1,this._keepThisInstanceWhenPlayerSourcesChange=!1,this._seekWhenSafe()},_seekWhenSafe:function(){this._player.readyState()<3?(this._seekFn=this._seek.bind(this),this._player.one("canplay",this._seekFn)):this._seek()},onPlayerSourcesChange:function(){this._keepThisInstanceWhenPlayerSourcesChange?this._keepThisInstanceWhenPlayerSourcesChange=!1:this.cancel()},onQualitySelectionChange:function(){this.hasFinished()||(this._keepThisInstanceWhenPlayerSourcesChange=!0)},_seek:function(){this._player.currentTime(this._seekToTime),this._keepThisInstanceWhenPlayerSourcesChange=!1,this._hasFinished=!0},hasFinished:function(){return this._hasFinished},cancel:function(){this._player.off("canplay",this._seekFn),this._keepThisInstanceWhenPlayerSourcesChange=!1,this._hasFinished=!0}})},{"class.extend":1}]},{},[8]); +!function u(o,c,a){function l(e,n){if(!c[e]){if(!o[e]){var t="function"==typeof require&&require;if(!n&&t)return t(e,!0);if(s)return s(e,!0);var r=new Error("Cannot find module '"+e+"'");throw r.code="MODULE_NOT_FOUND",r}var i=c[e]={exports:{}};o[e][0].call(i.exports,function(n){return l(o[e][1][n]||n)},i,i.exports,u,o,c,a)}return c[e].exports}for(var s="function"==typeof require&&require,n=0;n":">",'"':""","'":"'","`":"`"},W=h.invert(P);h.escape=D(P),h.unescape=D(W),h.result=function(n,e,t){h.isArray(e)||(e=[e]);var r=e.length;if(!r)return h.isFunction(t)?t.call(n):t;for(var i=0;i/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};function Y(n){return"\\"+K[n]}var z=/(.)^/,K={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},G=/\\|'|\r|\n|\u2028|\u2029/g;h.template=function(u,n,e){!n&&e&&(n=e),n=h.defaults({},n,h.templateSettings);var t,r=RegExp([(n.escape||z).source,(n.interpolate||z).source,(n.evaluate||z).source].join("|")+"|$","g"),o=0,c="__p+='";u.replace(r,function(n,e,t,r,i){return c+=u.slice(o,i).replace(G,Y),o=i+n.length,e?c+="'+\n((__t=("+e+"))==null?'':_.escape(__t))+\n'":t?c+="'+\n((__t=("+t+"))==null?'':__t)+\n'":r&&(c+="';\n"+r+"\n__p+='"),n}),c+="';\n",n.variable||(c="with(obj||{}){\n"+c+"}\n"),c="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+c+"return __p;\n";try{t=new Function(n.variable||"obj","_",c)}catch(n){throw n.source=c,n}function i(n){return t.call(this,n,h)}var a=n.variable||"obj";return i.source="function("+a+"){\n"+c+"}",i},h.chain=function(n){var e=h(n);return e._chain=!0,e};function H(n,e){return n._chain?h(e).chain():e}h.mixin=function(t){return h.each(h.functions(t),function(n){var e=h[n]=t[n];h.prototype[n]=function(){var n=[this._wrapped];return i.apply(n,arguments),H(this,e.apply(h,n))}}),h},h.mixin(h),h.each(["pop","push","reverse","shift","sort","splice","unshift"],function(e){var t=r[e];h.prototype[e]=function(){var n=this._wrapped;return t.apply(n,arguments),"shift"!==e&&"splice"!==e||0!==n.length||delete n[0],H(this,n)}}),h.each(["concat","join","slice"],function(n){var e=r[n];h.prototype[n]=function(){return H(this,e.apply(this._wrapped,arguments))}}),h.prototype.value=function(){return this._wrapped},h.prototype.valueOf=h.prototype.toJSON=h.prototype.value,h.prototype.toString=function(){return String(this._wrapped)},"function"==typeof define&&define.amd&&define("underscore",[],function(){return h})}()}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],3:[function(n,e,t){"use strict";var i=n("underscore"),u=n("../events");e.exports=function(n){var r=n.getComponent("MenuItem");return n.extend(r,{constructor:function(n,e){var t=e.source;if(!i.isObject(t))throw new Error('was not provided a "source" object, but rather: '+typeof t);e=i.extend({selectable:!0,label:t.label},e),r.call(this,n,e),this.source=t},handleClick:function(n){r.prototype.handleClick.call(this,n),this.player().trigger(u.QUALITY_REQUESTED,this.source)}})}},{"../events":5,underscore:2}],4:[function(n,e,t){"use strict";var i=n("underscore"),u=n("../events"),o=n("./QualityOption"),c="vjs-quality-changing";e.exports=function(n){var e,r=n.getComponent("MenuButton"),t=o(n);return e=n.extend(r,{constructor:function(t,n){r.call(this,t,n),t.on(u.QUALITY_REQUESTED,function(n,e){this.setSelectedSource(e),t.addClass(c),t.one("loadeddata",function(){t.removeClass(c)})}.bind(this)),t.on(u.PLAYER_SOURCES_CHANGED,function(){this.update()}.bind(this)),t.on(u.QUALITY_SELECTED,function(n,e){this.setSelectedSource(e)}.bind(this)),t.one("ready",function(){this.selectedSrc=t.src(),this.update()}.bind(this)),this.controlText("Open quality selector menu")},setSelectedSource:function(n){var e=n?n.src:void 0;this.selectedSrc!==e&&(this.selectedSrc=e,i.each(this.items,function(n){n.selected(n.source.src===e)}))},createItems:function(){var e=this.player(),n=e.currentSources();return n=n.filter(function(n){return null==n.hidequalityoption}),i.map(n,function(n){return new t(e,{source:n,selected:n.src===this.selectedSrc})}.bind(this))},buildWrapperCSSClass:function(){return"vjs-quality-selector "+r.prototype.buildWrapperCSSClass.call(this)}}),n.registerComponent("QualitySelector",e),e}},{"../events":5,"./QualityOption":3,underscore:2}],5:[function(n,e,t){"use strict";e.exports={QUALITY_REQUESTED:"qualityRequested",QUALITY_SELECTED:"qualitySelected",PLAYER_SOURCES_CHANGED:"playerSourcesChanged"}},{}],6:[function(n,e,t){"use strict";var c=n("underscore"),r=n("./events"),i=n("./components/QualitySelector"),u=n("./middleware/SourceInterceptor"),a=n("./util/SafeSeek");e.exports=function(n){n=n||window.videojs,i(n),u(n),n.hook("setup",function(o){o.on(r.QUALITY_REQUESTED,function(n,e){var t=o.currentSources(),r=o.currentTime(),i=o.playbackRate(),u=o.paused();c.each(t,function(n){n.selected=!1}),c.findWhere(t,{src:e.src}).selected=!0,o._qualitySelectorSafeSeek&&o._qualitySelectorSafeSeek.onQualitySelectionChange(),o.src(t),o.ready(function(){o._qualitySelectorSafeSeek&&!o._qualitySelectorSafeSeek.hasFinished()||(o._qualitySelectorSafeSeek=new a(o,r),o.playbackRate(i)),u||o.play()})})})},e.exports.EVENTS=r},{"./components/QualitySelector":4,"./events":5,"./middleware/SourceInterceptor":7,"./util/SafeSeek":9,underscore:2}],7:[function(n,e,t){"use strict";var u=n("underscore"),o=n("../events");e.exports=function(n){n.use("*",function(i){return{setSource:function(n,e){var t,r=i.currentSources();i._qualitySelectorSafeSeek&&i._qualitySelectorSafeSeek.onPlayerSourcesChange(),u.isEqual(r,i._qualitySelectorPreviousSources)||(i.trigger(o.PLAYER_SOURCES_CHANGED,r),i._qualitySelectorPreviousSources=r),t=u.find(r,function(n){return!0===n.selected||"true"===n.selected||"selected"===n.selected})||n,i.trigger(o.QUALITY_SELECTED,t),e(null,t)}}})}},{"../events":5,underscore:2}],8:[function(n,e,t){"use strict";n("./index")()},{"./index":6}],9:[function(n,e,t){"use strict";var r=n("class.extend");e.exports=r.extend({init:function(n,e){this._player=n,this._seekToTime=e,this._hasFinished=!1,this._keepThisInstanceWhenPlayerSourcesChange=!1,this._seekWhenSafe()},_seekWhenSafe:function(){this._player.readyState()<3?(this._seekFn=this._seek.bind(this),this._player.one("canplay",this._seekFn)):this._seek()},onPlayerSourcesChange:function(){this._keepThisInstanceWhenPlayerSourcesChange?this._keepThisInstanceWhenPlayerSourcesChange=!1:this.cancel()},onQualitySelectionChange:function(){this.hasFinished()||(this._keepThisInstanceWhenPlayerSourcesChange=!0)},_seek:function(){this._player.currentTime(this._seekToTime),this._keepThisInstanceWhenPlayerSourcesChange=!1,this._hasFinished=!0},hasFinished:function(){return this._hasFinished},cancel:function(){this._player.off("canplay",this._seekFn),this._keepThisInstanceWhenPlayerSourcesChange=!1,this._hasFinished=!0}})},{"class.extend":1}]},{},[8]); //# sourceMappingURL=silvermine-videojs-quality-selector.min.js.map \ No newline at end of file diff --git a/docker/Dockerfile b/docker/Dockerfile index df35a179..178c758f 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,4 +1,4 @@ -FROM crystallang/crystal:1.2.2-alpine AS builder +FROM crystallang/crystal:1.4.0-alpine AS builder RUN apk add --no-cache sqlite-static yaml-static ARG release diff --git a/docker/Dockerfile.arm64 b/docker/Dockerfile.arm64 index 5f4d3793..abfbb9b7 100644 --- a/docker/Dockerfile.arm64 +++ b/docker/Dockerfile.arm64 @@ -1,5 +1,5 @@ -FROM alpine:3.15 AS builder -RUN apk add --no-cache 'crystal=1.2.2-r0' shards sqlite-static yaml-static yaml-dev libxml2-dev zlib-static openssl-libs-static openssl-dev musl-dev +FROM alpine:edge AS builder +RUN apk add --no-cache 'crystal=1.4.0-r0' shards sqlite-static yaml-static yaml-dev libxml2-dev zlib-static openssl-libs-static openssl-dev musl-dev ARG release @@ -34,7 +34,7 @@ RUN if [ ${release} == 1 ] ; then \ --link-flags "-lxml2 -llzma"; \ fi -FROM alpine:3.15 +FROM alpine:edge RUN apk add --no-cache librsvg ttf-opensans WORKDIR /invidious RUN addgroup -g 1000 -S invidious && \ diff --git a/locales/ar.json b/locales/ar.json index f009fd46..01c9bbb9 100644 --- a/locales/ar.json +++ b/locales/ar.json @@ -141,7 +141,6 @@ "Show less": "عرض اقل", "Watch on YouTube": "مشاهدة الفيديو على اليوتيوب", "Switch Invidious Instance": "تبديل المثيل Invidious", - "Broken? Try another Invidious Instance": "معطل؟ جرب مثيل Invidious آخر", "Hide annotations": "إخفاء الملاحظات في الفيديو", "Show annotations": "عرض الملاحظات في الفيديو", "Genre: ": "النوع: ", @@ -355,7 +354,6 @@ "search_filters_features_option_four_k": "4k", "search_filters_features_option_location": "الأماكن", "search_filters_features_option_hdr": "وضع التباين العالي", - "search_filters_label": "معامل الفرز", "Current version: ": "الإصدار الحالي: ", "next_steps_error_message": "بعد ذلك يجب أن تحاول: ", "next_steps_error_message_refresh": "تحديث", @@ -459,5 +457,6 @@ "Portuguese (Brazil)": "البرتغالية (البرازيل)", "Russian (auto-generated)": "الروسية (منشأة تلقائيا)", "Spanish (Spain)": "الإسبانية (إسبانيا)", - "crash_page_search_issue": "بحثت عن المشكلات الموجودة على GitHub " + "crash_page_search_issue": "بحثت عن المشكلات الموجودة على GitHub ", + "search_filters_title": "معامل الفرز" } diff --git a/locales/cs.json b/locales/cs.json index f8af17d2..318866b1 100644 --- a/locales/cs.json +++ b/locales/cs.json @@ -262,29 +262,28 @@ "Video mode": "Videový režim", "Videos": "Videa", "Community": "Komunita", - "search_filters_sort_option_rating": "hodnocení", - "search_filters_sort_option_date": "datum", - "search_filters_sort_option_views": "zhlédnutí", - "search_filters_duration_label": "délka", - "search_filters_date_option_hour": "hodina", - "search_filters_date_option_today": "dnes", - "search_filters_date_option_week": "týden", - "search_filters_date_option_month": "měsíc", - "search_filters_date_option_year": "rok", - "search_filters_type_option_video": "video", - "search_filters_type_option_channel": "kanál", - "search_filters_type_option_playlist": "playlist", - "search_filters_type_option_movie": "film", - "search_filters_type_option_show": "zobrazit", + "search_filters_sort_option_rating": "Hodnocení", + "search_filters_sort_option_date": "Datum nahrání", + "search_filters_sort_option_views": "Počet zhlédnutí", + "search_filters_duration_label": "Délka", + "search_filters_date_option_hour": "Poslední hodina", + "search_filters_date_option_today": "Dnes", + "search_filters_date_option_week": "Tento týden", + "search_filters_date_option_month": "Tento měsíc", + "search_filters_date_option_year": "Tento rok", + "search_filters_type_option_video": "Video", + "search_filters_type_option_channel": "Kanál", + "search_filters_type_option_playlist": "Playlist", + "search_filters_type_option_movie": "Film", + "search_filters_type_option_show": "Seriál", "search_filters_features_option_hd": "HD", - "search_filters_features_option_subtitles": "titulky", + "search_filters_features_option_subtitles": "Titulky", "search_filters_features_option_c_commons": "Creative Commons", "search_filters_features_option_three_d": "3D", - "search_filters_features_option_live": "živě", - "search_filters_features_option_four_k": "4k", - "search_filters_features_option_location": "umístění", + "search_filters_features_option_live": "Živě", + "search_filters_features_option_four_k": "4K", + "search_filters_features_option_location": "Umístění", "search_filters_features_option_hdr": "HDR", - "search_filters_label": "Filtr", "generic_count_days_0": "{{count}} dnem", "generic_count_days_1": "{{count}} dny", "generic_count_days_2": "{{count}} dny", @@ -374,20 +373,15 @@ "generic_count_minutes_0": "{{count}} minutou", "generic_count_minutes_1": "{{count}} minutami", "generic_count_minutes_2": "{{count}} minutami", - "short": "Krátké (< 4 minuty)", - "long": "Dlouhé (> 20 minut)", "footer_documentation": "Dokumentace", "next_steps_error_message_refresh": "Obnovit stránku", "Chinese": "Čínština", - "360": "360°", "Dutch (auto-generated)": "Nizozemština (automaticky generováno)", "Erroneous token": "Chybný token", "tokens_count_0": "{{count}} token", "tokens_count_1": "{{count}} tokeny", "tokens_count_2": "{{count}} tokenů", "Portuguese (Brazil)": "Portugalština (Brazílie)", - "content_type": "Typ", - "sort": "Řazení", "Token is expired, please try again": "Token vypršel, zkuste to prosím znovu", "English (United States)": "Angličtina (Spojené státy)", "Cantonese (Hong Kong)": "Kantonština (Hong Kong)", @@ -401,7 +395,6 @@ "%A %B %-d, %Y": "%A %B %-d, %Y", "YouTube comment permalink": "Permanentní odkaz YouTube komentáře", "permalink": "permalink", - "purchased": "Zakoupeno", "footer_original_source_code": "Původní zdrojový kód", "adminprefs_modified_source_code_url_label": "URL repozitáře s upraveným zdrojovým kódem", "Video unavailable": "Video není dostupné", @@ -434,11 +427,9 @@ "Erroneous CAPTCHA": "Chybná CAPTCHA", "Password is a required field": "Heslo je vyžadované pole", "preferences_automatic_instance_redirect_label": "Automatické přesměrování instance (fallback na redirect.invidious.io): ", - "Broken? Try another Invidious Instance": "Je něco rozbité? Zkuste jinou instanci Invidious", "Switch Invidious Instance": "Přepnout instanci Invidious", "Empty playlist": "Prázdný playlist", "footer_source_code": "Zdrojový kód", - "relevance": "Relevantnost", "View YouTube comments": "Zobrazit YouTube komentáře", "Blacklisted regions: ": "Oblasti na černé listině: ", "Wrong username or password": "Nesprávné uživatelské jméno nebo heslo", @@ -454,7 +445,6 @@ "Deleted or invalid channel": "Smazaný nebo neplatný kanál", "This channel does not exist.": "Tento kanál neexistuje.", "Hidden field \"token\" is a required field": "Skryté pole \"token\" je vyžadované", - "features": "Funkce", "Wilson score: ": "Skóre Wilson: ", "Shared `x`": "Zveřejněno `x`", "Premieres in `x`": "Premiéra za `x`", @@ -477,5 +467,24 @@ "Erroneous challenge": "Chybná výzva", "Premieres `x`": "Premiéra `x`", "CAPTCHA is a required field": "CAPTCHA je vyžadované pole", - "`x` ago": "Před `x`" + "`x` ago": "Před `x`", + "search_message_change_filters_or_query": "Zkuste rozšířit vyhledávaný dotaz a/nebo změnit filtry.", + "search_filters_date_option_none": "Jakékoli datum", + "search_filters_date_label": "Datum nahrání", + "search_filters_type_option_all": "Jakýkoli typ", + "search_filters_duration_option_none": "Jakákoli délka", + "search_filters_type_label": "Typ", + "search_filters_duration_option_short": "Krátká (< 4 minuty)", + "search_message_no_results": "Nenalezeny žádné výsledky.", + "search_filters_title": "Filtry", + "search_filters_duration_option_medium": "Střední (4 - 20 minut)", + "search_filters_duration_option_long": "Dlouhá (> 20 minut)", + "search_message_use_another_instance": " Můžete také hledat na jiné instanci.", + "search_filters_features_label": "Vlastnosti", + "search_filters_features_option_three_sixty": "360°", + "search_filters_features_option_vr180": "VR180", + "search_filters_features_option_purchased": "Zakoupeno", + "search_filters_sort_label": "Řadit dle", + "search_filters_sort_option_relevance": "Relevantnost", + "search_filters_apply_button": "Použít vybrané filtry" } diff --git a/locales/da.json b/locales/da.json index 9e221145..4816c2c9 100644 --- a/locales/da.json +++ b/locales/da.json @@ -215,7 +215,6 @@ "permalink": "permalink", "search_filters_sort_option_date": "Upload dato", "search_filters_features_label": "Funktioner", - "search_filters_label": "Filter", "Khmer": "Khmer", "Finnish": "Finsk", "search_filters_date_option_week": "Denne uge", @@ -349,7 +348,6 @@ "next_steps_error_message": "Efter det burde du prøve at: ", "Sinhala": "Singalesisk (Sinhala)", "Thai": "Thai", - "Broken? Try another Invidious Instance": "I stykker? Prøv en anden Invidious instans", "No such user": "Brugeren findes ikke", "Token is expired, please try again": "Token er udløbet, prøv igen", "Catalan": "Catalansk", @@ -461,5 +459,6 @@ "generic_count_weeks_plural": "{{count}} uger", "crash_page_you_found_a_bug": "Det ser ud til, at du har fundet en fejl i Invidious!", "crash_page_read_the_faq": "læs Ofte stillede spørgsmål (FAQ)", - "crash_page_search_issue": "søgte efter eksisterende problemer på GitHub" + "crash_page_search_issue": "søgte efter eksisterende problemer på GitHub", + "search_filters_title": "Filter" } diff --git a/locales/de.json b/locales/de.json index b46b7ec4..24b83bb3 100644 --- a/locales/de.json +++ b/locales/de.json @@ -141,7 +141,6 @@ "Show less": "Weniger anzeigen", "Watch on YouTube": "Video auf YouTube ansehen", "Switch Invidious Instance": "Invidious Instanz wechseln", - "Broken? Try another Invidious Instance": "Kaputt? Versuche eine andere Invidious Instanz", "Hide annotations": "Anmerkungen ausblenden", "Show annotations": "Anmerkungen anzeigen", "Genre: ": "Genre: ", @@ -355,7 +354,6 @@ "search_filters_features_option_four_k": "4K", "search_filters_features_option_location": "Standort", "search_filters_features_option_hdr": "HDR", - "search_filters_label": "Filtern", "Current version: ": "Aktuelle Version: ", "next_steps_error_message": "Danach folgendes versuchen: ", "next_steps_error_message_refresh": "Aktualisieren", @@ -461,5 +459,6 @@ "Chinese (China)": "Chinesisch (China)", "Chinese (Taiwan)": "Chinesisch (Taiwan)", "Korean (auto-generated)": "Koreanisch (automatisch generiert)", - "Portuguese (auto-generated)": "Portugiesisch (automatisch generiert)" + "Portuguese (auto-generated)": "Portugiesisch (automatisch generiert)", + "search_filters_title": "Filtern" } diff --git a/locales/el.json b/locales/el.json index 29beb75c..048a520b 100644 --- a/locales/el.json +++ b/locales/el.json @@ -405,7 +405,6 @@ "search_filters_date_option_month": "Αυτόν τον μήνα", "Released under the AGPLv3 on Github.": "Κυκλοφορεί υπό την AGPLv3 στο GitHub.", "search_filters_sort_label": "Ταξινόμηση κατά", - "search_filters_label": "Φίλτρο", "search_filters_type_option_movie": "Ταινία", "footer_modfied_source_code": "Τροποποιημένος πηγαίος κώδικας", "search_filters_features_label": "Χαρακτηριστικά", @@ -449,5 +448,6 @@ "videoinfo_youTube_embed_link": "Ενσωμάτωση", "videoinfo_invidious_embed_link": "Σύνδεσμος Ενσωμάτωσης", "search_filters_type_option_show": "Μπάρα προόδου διαβάσματος", - "preferences_watch_history_label": "Ενεργοποίηση ιστορικού παρακολούθησης: " + "preferences_watch_history_label": "Ενεργοποίηση ιστορικού παρακολούθησης: ", + "search_filters_title": "Φίλτρο" } diff --git a/locales/eo.json b/locales/eo.json index cd3447a7..40ab5f39 100644 --- a/locales/eo.json +++ b/locales/eo.json @@ -141,7 +141,6 @@ "Show less": "Montri malpli", "Watch on YouTube": "Vidi filmeton en JuTubo", "Switch Invidious Instance": "Ŝanĝi instalaĵon de Indivious", - "Broken? Try another Invidious Instance": "Ĉu misfunkcio? Provu alian instalaĵon de Indivious", "Hide annotations": "Kaŝi prinotojn", "Show annotations": "Montri prinotojn", "Genre: ": "Ĝenro: ", @@ -355,7 +354,6 @@ "search_filters_features_option_four_k": "4k", "search_filters_features_option_location": "loko", "search_filters_features_option_hdr": "granddinamikgama", - "search_filters_label": "filtri", "Current version: ": "Nuna versio: ", "next_steps_error_message": "Poste, vi provu: ", "next_steps_error_message_refresh": "Reŝargi", @@ -369,5 +367,6 @@ "footer_original_source_code": "Originala fontkodo", "footer_donate_page": "Donaci", "preferences_region_label": "Lando de la enhavo: ", - "preferences_quality_dash_label": "Preferata DASH-a videkvalito: " + "preferences_quality_dash_label": "Preferata DASH-a videkvalito: ", + "search_filters_title": "Filtri" } diff --git a/locales/es.json b/locales/es.json index 28ca0bf5..0958a736 100644 --- a/locales/es.json +++ b/locales/es.json @@ -141,7 +141,6 @@ "Show less": "Mostrar menos", "Watch on YouTube": "Ver el vídeo en YouTube", "Switch Invidious Instance": "Cambiar Instancia de Invidious", - "Broken? Try another Invidious Instance": "¿Algún error? Prueba otra instancia de Invidious", "Hide annotations": "Ocultar anotaciones", "Show annotations": "Mostrar anotaciones", "Genre: ": "Género: ", @@ -355,7 +354,6 @@ "search_filters_features_option_four_k": "4k", "search_filters_features_option_location": "ubicación", "search_filters_features_option_hdr": "hdr", - "search_filters_label": "filtro", "Current version: ": "Versión actual: ", "next_steps_error_message": "Después de lo cual deberías intentar: ", "next_steps_error_message_refresh": "Recargar la página", @@ -459,5 +457,18 @@ "Korean (auto-generated)": "Coreano (generados automáticamente)", "Spanish (Mexico)": "Español (Méjico)", "Spanish (auto-generated)": "Español (generados automáticamente)", - "preferences_watch_history_label": "Habilitar historial de reproducciones: " + "preferences_watch_history_label": "Habilitar historial de reproducciones: ", + "search_message_no_results": "No se han encontrado resultados.", + "search_message_change_filters_or_query": "Pruebe ampliar la consulta de búsqueda y/o a cambiar los filtros.", + "search_filters_title": "Filtros", + "search_filters_date_label": "Fecha de subida", + "search_filters_date_option_none": "Cualquier fecha", + "search_filters_type_option_all": "Cualquier tipo", + "search_filters_duration_option_none": "Cualquier duración", + "search_filters_features_option_vr180": "VR180", + "search_filters_apply_button": "Aplicar filtros seleccionados", + "tokens_count": "{{count}} token", + "tokens_count_plural": "{{count}} tokens", + "search_message_use_another_instance": " También puede buscar en otra instancia.", + "search_filters_duration_option_medium": "Medio (4 - 20 minutes)" } diff --git a/locales/eu.json b/locales/eu.json index 041e9195..9e093a52 100644 --- a/locales/eu.json +++ b/locales/eu.json @@ -243,7 +243,6 @@ "Hidden field \"challenge\" is a required field": "\"challenge\" eremu ezkutua beharrezkoa da", "German": "Alemaniarra", "Login failed. This may be because two-factor authentication is not turned on for your account.": "Ezin izena eman. Izan leike zure konturako berresteko bi faktoreak piztuta ez daudela.", - "Broken? Try another Invidious Instance": "Akatsaren bat? Invidiouseko beste adibide bat saiatu", "View YouTube comments": "YouTubeko iruzkinak ikusi", "Google verification code": "Googleren berresteko kodea", "`x` is live": "'x' bizirik darrai", diff --git a/locales/fa.json b/locales/fa.json index 26f1b220..5ea976f5 100644 --- a/locales/fa.json +++ b/locales/fa.json @@ -148,7 +148,6 @@ "Show less": "نمایش کم‌تر", "Watch on YouTube": "تماشا در یوتیوب", "Switch Invidious Instance": "تعویض نمونه اینویدیوس", - "Broken? Try another Invidious Instance": "کار نمی‌کند؟ نمونه دیگری از اینویدیوس را امتحان کنید", "Hide annotations": "مخفی کردن حاشیه نویسی ها", "Show annotations": "نمایش حاشیه نویسی ها", "Genre: ": "ژانر: ", @@ -371,7 +370,6 @@ "search_filters_features_option_four_k": "4K", "search_filters_features_option_location": "مکان", "search_filters_features_option_hdr": "HDR", - "search_filters_label": "پالایه", "Current version: ": "نسخه فعلی: ", "next_steps_error_message": "اکنون بایستی یکی از این موارد را امتحان کنید: ", "next_steps_error_message_refresh": "تازه‌سازی", @@ -412,5 +410,6 @@ "footer_original_source_code": "کد منبع اصلی", "search_filters_duration_option_long": "بلند (> 20 دقیقه)", "adminprefs_modified_source_code_url_label": "URL مخزن کد منبع ویریش شده", - "search_filters_duration_option_short": "کوتاه (< 4 دقیقه)" + "search_filters_duration_option_short": "کوتاه (< 4 دقیقه)", + "search_filters_title": "پالایه" } diff --git a/locales/fi.json b/locales/fi.json index ce1fbee7..2aa64ea7 100644 --- a/locales/fi.json +++ b/locales/fi.json @@ -140,7 +140,6 @@ "Show less": "Näytä vähemmän", "Watch on YouTube": "Katso YouTubessa", "Switch Invidious Instance": "Vaihda Invidious-instanssia", - "Broken? Try another Invidious Instance": "Rikki? Kokeile toista Invidious-instanssia", "Hide annotations": "Piilota merkkaukset", "Show annotations": "Näytä merkkaukset", "Genre: ": "Genre: ", @@ -354,7 +353,6 @@ "search_filters_features_option_four_k": "4K", "search_filters_features_option_location": "Sijainti", "search_filters_features_option_hdr": "HDR", - "search_filters_label": "Suodatin", "Current version: ": "Tämänhetkinen versio: ", "next_steps_error_message": "Sinun tulisi kokeilla seuraavia: ", "next_steps_error_message_refresh": "Päivitä", @@ -461,5 +459,16 @@ "Spanish (Mexico)": "Espanja (Meksiko)", "Spanish (Spain)": "Espanja (Espanja)", "Turkish (auto-generated)": "Turkki (automaattisesti luotu)", - "Vietnamese (auto-generated)": "Vietnam (automaattisesti luotu)" + "Vietnamese (auto-generated)": "Vietnam (automaattisesti luotu)", + "search_filters_title": "Suodatin", + "search_message_no_results": "Ei tuloksia löydetty.", + "search_message_change_filters_or_query": "Yritä hakukyselysi laajentamista ja/tai suodattimien muuttamista.", + "search_filters_duration_option_none": "Mikä tahansa kesto", + "search_filters_features_option_vr180": "VR180", + "search_filters_apply_button": "Ota valitut suodattimet käyttöön", + "search_filters_date_label": "Latausaika", + "search_filters_duration_option_medium": "Keskipituinen (4 - 20 minuuttia)", + "search_message_use_another_instance": " Voit myös hakea toisella instanssilla.", + "search_filters_date_option_none": "Milloin tahansa", + "search_filters_type_option_all": "Mikä tahansa tyyppi" } diff --git a/locales/fr.json b/locales/fr.json index 7684f13e..6fee70f9 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -155,7 +155,6 @@ "Show less": "Afficher moins", "Watch on YouTube": "Voir la vidéo sur Youtube", "Switch Invidious Instance": "Changer d'instance", - "Broken? Try another Invidious Instance": "Instance Invidious défectueuse ? Essayez-en une autre", "Hide annotations": "Masquer les annotations", "Show annotations": "Afficher les annotations", "Genre: ": "Genre : ", @@ -361,33 +360,32 @@ "Videos": "Vidéos", "Playlists": "Listes de lecture", "Community": "Communauté", - "search_filters_sort_option_relevance": "pertinence", - "search_filters_sort_option_rating": "évaluation", - "search_filters_sort_option_date": "date", - "search_filters_sort_option_views": "nombre de vues", - "search_filters_type_label": "type", - "search_filters_duration_label": "durée", - "search_filters_features_label": "fonctionnalités", + "search_filters_sort_option_relevance": "Pertinence", + "search_filters_sort_option_rating": "Notation", + "search_filters_sort_option_date": "Date d'ajout", + "search_filters_sort_option_views": "Nombre de vues", + "search_filters_type_label": "Type de contenu", + "search_filters_duration_label": "Durée", + "search_filters_features_label": "Fonctionnalités", "search_filters_sort_label": "Trier par", - "search_filters_date_option_hour": "dernière heure", - "search_filters_date_option_today": "aujourd'hui", - "search_filters_date_option_week": "semaine", - "search_filters_date_option_month": "mois", - "search_filters_date_option_year": "année", - "search_filters_type_option_video": "vidéo", - "search_filters_type_option_channel": "chaîne", - "search_filters_type_option_playlist": "liste de lecture", - "search_filters_type_option_movie": "film", - "search_filters_type_option_show": "émission", + "search_filters_date_option_hour": "Dernière heure", + "search_filters_date_option_today": "Aujourd'hui", + "search_filters_date_option_week": "Cette semaine", + "search_filters_date_option_month": "Ce mois-ci", + "search_filters_date_option_year": "Cette année", + "search_filters_type_option_video": "Vidéo", + "search_filters_type_option_channel": "Chaîne", + "search_filters_type_option_playlist": "Liste de lecture", + "search_filters_type_option_movie": "Film", + "search_filters_type_option_show": "Émission", "search_filters_features_option_hd": "HD", - "search_filters_features_option_subtitles": "sous-titres / CC", + "search_filters_features_option_subtitles": "Sous-titres (CC)", "search_filters_features_option_c_commons": "Creative Commons", "search_filters_features_option_three_d": "3D", - "search_filters_features_option_live": "en direct", + "search_filters_features_option_live": "En direct", "search_filters_features_option_four_k": "4K", "search_filters_features_option_location": "emplacement", "search_filters_features_option_hdr": "HDR", - "search_filters_label": "filtrer", "Current version: ": "Version actuelle : ", "next_steps_error_message": "Vous pouvez essayer de : ", "next_steps_error_message_refresh": "Rafraîchir la page", @@ -420,7 +418,7 @@ "videoinfo_started_streaming_x_ago": "En stream depuis `x`", "videoinfo_watch_on_youTube": "Regarder sur YouTube", "videoinfo_youTube_embed_link": "Intégrer", - "search_filters_features_option_purchased": "Acheter", + "search_filters_features_option_purchased": "Acheté", "videoinfo_invidious_embed_link": "Lien intégré", "download_subtitles": "Sous-titres - `x` (.vtt)", "user_saved_playlists": "`x` listes de lecture sauvegardées", @@ -461,5 +459,16 @@ "Vietnamese (auto-generated)": "Vietnamien (auto-généré)", "Russian (auto-generated)": "Russe (auto-généré)", "Spanish (Spain)": "Espagnol (Espagne)", - "preferences_watch_history_label": "Activer l'historique de visionnage : " + "preferences_watch_history_label": "Activer l'historique de visionnage : ", + "search_filters_title": "Filtres", + "search_message_change_filters_or_query": "Essayez d'élargir votre recherche et/ou de changer les filtres.", + "search_filters_date_option_none": "Toutes les dates", + "search_filters_duration_option_medium": "Moyenne (de 4 à 20 minutes)", + "search_filters_apply_button": "Appliquer les filtres", + "search_message_no_results": "Aucun résultat.", + "search_message_use_another_instance": " Vous pouvez également effectuer votre recherche sur une autre instance.", + "search_filters_type_option_all": "Tous les types", + "search_filters_date_label": "Date d'ajout", + "search_filters_features_option_vr180": "VR180", + "search_filters_duration_option_none": "Toutes les durées" } diff --git a/locales/he.json b/locales/he.json index fc75b953..384b2657 100644 --- a/locales/he.json +++ b/locales/he.json @@ -300,6 +300,6 @@ "search_filters_features_option_four_k": "4K", "search_filters_features_option_location": "מיקום", "search_filters_features_option_hdr": "HDR", - "search_filters_label": "סינון", - "Current version: ": "הגרסה הנוכחית: " + "Current version: ": "הגרסה הנוכחית: ", + "search_filters_title": "סינון" } diff --git a/locales/hr.json b/locales/hr.json index d6c8d6aa..94633aac 100644 --- a/locales/hr.json +++ b/locales/hr.json @@ -141,7 +141,6 @@ "Show less": "Pokaži manje", "Watch on YouTube": "Gledaj na YouTubeu", "Switch Invidious Instance": "Promijeni Invidious instancu", - "Broken? Try another Invidious Instance": "Pokvarena? Probaj jednu drugu Invidious instancu", "Hide annotations": "Sakrij napomene", "Show annotations": "Prikaži napomene", "Genre: ": "Žanr: ", @@ -355,7 +354,6 @@ "search_filters_features_option_four_k": "4k", "search_filters_features_option_location": "lokacija", "search_filters_features_option_hdr": "hdr", - "search_filters_label": "filtar", "Current version: ": "Trenutačna verzija: ", "next_steps_error_message": "Nakon toga bi trebali pokušati sljedeće: ", "next_steps_error_message_refresh": "Aktualiziraj stranicu", @@ -477,5 +475,6 @@ "Korean (auto-generated)": "Korejski (automatski generiran)", "Portuguese (auto-generated)": "Portugalski (automatski generiran)", "Spanish (auto-generated)": "Španjolski (automatski generiran)", - "preferences_watch_history_label": "Aktiviraj povijest gledanja: " + "preferences_watch_history_label": "Aktiviraj povijest gledanja: ", + "search_filters_title": "Filtar" } diff --git a/locales/hu-HU.json b/locales/hu-HU.json index 1c1d9598..a3679813 100644 --- a/locales/hu-HU.json +++ b/locales/hu-HU.json @@ -389,7 +389,6 @@ "Released under the AGPLv3 on Github.": "AGPLv3 licenc alapján a GitHubon", "search_filters_features_option_three_d": "3D-ben", "search_filters_features_option_live": "Élőben", - "search_filters_label": "Szűrők", "next_steps_error_message_refresh": "Újratöltés", "footer_donate_page": "Adakozás", "footer_source_code": "Forráskód", @@ -414,7 +413,6 @@ "search_filters_date_option_hour": "Az elmúlt órában", "search_filters_type_option_movie": "Film", "search_filters_features_option_hdr": "HDR", - "Broken? Try another Invidious Instance": "Nem működik? Próbáld meg egy másik Invidious oldallal.", "search_filters_duration_label": "Játékidő", "next_steps_error_message": "Az alábbi lehetőségek állnak rendelkezésre: ", "Xhosa": "xhosza", @@ -460,5 +458,6 @@ "Italian (auto-generated)": "olasz (automatikusan generált)", "Dutch (auto-generated)": "holland (automatikusan generált)", "French (auto-generated)": "francia (automatikusan generált)", - "Vietnamese (auto-generated)": "vietnámi (automatikusan generált)" + "Vietnamese (auto-generated)": "vietnámi (automatikusan generált)", + "search_filters_title": "Szűrők" } diff --git a/locales/id.json b/locales/id.json index 3053d69c..71b7bdb1 100644 --- a/locales/id.json +++ b/locales/id.json @@ -148,7 +148,6 @@ "Show less": "Tampilkan lebih sedikit", "Watch on YouTube": "Tonton di YouTube", "Switch Invidious Instance": "Ganti peladen Invidious", - "Broken? Try another Invidious Instance": "Rusak? Coba peladen Invidious yang lain", "Hide annotations": "Sembunyikan anotasi", "Show annotations": "Tampilkan anotasi", "Genre: ": "Genre: ", @@ -371,7 +370,6 @@ "search_filters_features_option_four_k": "4K", "search_filters_features_option_location": "Lokasi", "search_filters_features_option_hdr": "HDR", - "search_filters_label": "Saring", "Current version: ": "Versi saat ini: ", "next_steps_error_message": "Setelah itu Anda harus mencoba: ", "next_steps_error_message_refresh": "Segarkan", @@ -419,5 +417,6 @@ "crash_page_before_reporting": "Sebelum melaporkan masalah, pastikan anda memiliki:", "English (United States)": "Inggris (US)", "preferences_watch_history_label": "Aktifkan riwayat tontonan: ", - "English (United Kingdom)": "Inggris (UK)" + "English (United Kingdom)": "Inggris (UK)", + "search_filters_title": "Saring" } diff --git a/locales/it.json b/locales/it.json index 69699f05..7ba5ff2d 100644 --- a/locales/it.json +++ b/locales/it.json @@ -372,7 +372,6 @@ "search_filters_features_option_four_k": "4K", "search_filters_features_option_location": "Posizione", "search_filters_features_option_hdr": "HDR", - "search_filters_label": "Filtra", "Current version: ": "Versione attuale: ", "preferences_quality_dash_option_240p": "240p", "preferences_quality_dash_option_360p": "360p", @@ -409,22 +408,22 @@ "preferences_automatic_instance_redirect_label": "Reindirizzamento automatico dell'istanza (ripiego su redirect.invidious.io): ", "Video unavailable": "Video non disponibile", "preferences_show_nick_label": "Mostra nickname in alto: ", - "short": "Corto (< 4 minuti)", "videoinfo_youTube_embed_link": "Incorpora", "videoinfo_invidious_embed_link": "Incorpora collegamento", "user_created_playlists": "playlist create da `x`", "preferences_save_player_pos_label": "Memorizza il minutaggio raggiunto dal video: ", - "purchased": "Acquistato", "preferences_quality_option_dash": "DASH (qualità adattiva)", "preferences_region_label": "Nazione del contenuto: ", "preferences_category_misc": "Preferenze varie", - "show": "Serie", - "long": "Lungo (> 20 minuti)", "next_steps_error_message": "Dopodiché dovresti provare a: ", "next_steps_error_message_refresh": "Aggiornare", "footer_donate_page": "Dona", "footer_source_code": "Codice sorgente", "adminprefs_modified_source_code_url_label": "Link per il repository del codice sorgente modificato", "Show more": "Mostra di più", - "Broken? Try another Invidious Instance": "Non funzionante? Prova un’altra istanza Invidious" + "search_filters_title": "Filtra", + "search_filters_type_option_show": "Serie", + "search_filters_duration_option_short": "Corto (< 4 minuti)", + "search_filters_duration_option_long": "Lungo (> 20 minuti)", + "search_filters_features_option_purchased": "Acquistato" } diff --git a/locales/ja.json b/locales/ja.json index 977efd53..20d3c20e 100644 --- a/locales/ja.json +++ b/locales/ja.json @@ -148,7 +148,6 @@ "Show less": "表示を減らす", "Watch on YouTube": "YouTube で視聴", "Switch Invidious Instance": "Invidiousインスタンスの変更", - "Broken? Try another Invidious Instance": "壊れる?違うInvidiousインスタンスを試してみる", "Hide annotations": "アノテーションを隠す", "Show annotations": "アノテーションを表示", "Genre: ": "ジャンル: ", @@ -371,7 +370,6 @@ "search_filters_features_option_four_k": "4K", "search_filters_features_option_location": "場所", "search_filters_features_option_hdr": "HDR", - "search_filters_label": "フィルタ", "Current version: ": "現在のバージョン: ", "next_steps_error_message": "下記のものを試して下さい: ", "next_steps_error_message_refresh": "再読込", @@ -434,5 +432,6 @@ "Spanish (Mexico)": "スペイン語 (メキシコ)", "Spanish (Spain)": "スペイン語 (スペイン)", "Vietnamese (auto-generated)": "ベトナム語 (自動生成)", - "360": "360°" + "search_filters_title": "フィルタ", + "search_filters_features_option_three_sixty": "360°" } diff --git a/locales/ko.json b/locales/ko.json index 616380cf..12c2b31f 100644 --- a/locales/ko.json +++ b/locales/ko.json @@ -199,7 +199,6 @@ "search_filters_features_option_three_d": "3D", "search_filters_features_option_location": "지역", "search_filters_features_option_four_k": "4K", - "search_filters_label": "필터", "search_filters_features_option_hdr": "HDR", "Current version: ": "현재 버전: ", "next_steps_error_message_refresh": "새로 고침", @@ -298,7 +297,6 @@ "Empty playlist": "재생목록 비어 있음", "Show annotations": "주석 보이기", "Hide annotations": "주석 숨기기", - "Broken? Try another Invidious Instance": "안되나요? 다른 Invidious 인스턴스를 시도해보세요", "Switch Invidious Instance": "Invidious 인스턴스 변경", "Spanish": "스페인어", "Southern Sotho": "소토어", @@ -382,5 +380,6 @@ "footer_source_code": "소스 코드", "footer_original_source_code": "원본 소스 코드", "footer_modfied_source_code": "수정된 소스 코드", - "adminprefs_modified_source_code_url_label": "수정된 소스 코드 저장소의 URL" + "adminprefs_modified_source_code_url_label": "수정된 소스 코드 저장소의 URL", + "search_filters_title": "필터" } diff --git a/locales/lt.json b/locales/lt.json index 7ecf60cf..607b3705 100644 --- a/locales/lt.json +++ b/locales/lt.json @@ -141,7 +141,6 @@ "Show less": "Rodyti mažiau", "Watch on YouTube": "Žiaurėti Youtube", "Switch Invidious Instance": "Keisti Invidious šaltinį", - "Broken? Try another Invidious Instance": "Neveikia? Bandyk kitą Invidious šaltinį", "Hide annotations": "Slėpti anotacijas", "Show annotations": "Rodyti anotacijas", "Genre: ": "Žanras: ", @@ -355,7 +354,6 @@ "search_filters_features_option_four_k": "4K", "search_filters_features_option_location": "Vietovė", "search_filters_features_option_hdr": "HDR", - "search_filters_label": "Filtras", "Current version: ": "Dabartinė versija: ", "next_steps_error_message": "Po to turėtumėte pabandyti: ", "next_steps_error_message_refresh": "Atnaujinti", @@ -372,5 +370,6 @@ "preferences_quality_dash_label": "Pageidaujama DASH vaizdo kokybė: ", "preferences_quality_dash_option_best": "Geriausia", "preferences_quality_dash_option_worst": "Blogiausia", - "preferences_quality_dash_option_auto": "Automatinis" + "preferences_quality_dash_option_auto": "Automatinis", + "search_filters_title": "Filtras" } diff --git a/locales/nb-NO.json b/locales/nb-NO.json index dee0c94b..8d80c10c 100644 --- a/locales/nb-NO.json +++ b/locales/nb-NO.json @@ -141,7 +141,6 @@ "Show less": "Vis mindre", "Watch on YouTube": "Vis video på YouTube", "Switch Invidious Instance": "Bytt Invidious-instans", - "Broken? Try another Invidious Instance": "Knekt? Forsøk en annen Invidious-instans", "Hide annotations": "Skjul merknader", "Show annotations": "Vis merknader", "Genre: ": "Sjanger: ", @@ -355,7 +354,6 @@ "search_filters_features_option_four_k": "4k", "search_filters_features_option_location": "sted", "search_filters_features_option_hdr": "HDR", - "search_filters_label": "filtrer", "Current version: ": "Gjeldende versjon: ", "next_steps_error_message": "Etterpå bør du prøve dette: ", "next_steps_error_message_refresh": "Gjenoppfrisk", @@ -461,5 +459,6 @@ "Portuguese (auto-generated)": "Portugisisk (laget automatisk)", "Russian (auto-generated)": "Russisk (laget automatisk)", "Dutch (auto-generated)": "Nederlandsk (laget automatisk)", - "Turkish (auto-generated)": "Tyrkisk (laget automatisk)" + "Turkish (auto-generated)": "Tyrkisk (laget automatisk)", + "search_filters_title": "Filtrer" } diff --git a/locales/nl.json b/locales/nl.json index 99ae7f8e..7e9ddba6 100644 --- a/locales/nl.json +++ b/locales/nl.json @@ -349,7 +349,6 @@ "search_filters_features_option_four_k": "4K", "search_filters_features_option_location": "locatie", "search_filters_features_option_hdr": "HDR", - "search_filters_label": "verfijnen", "Current version: ": "Huidige versie: ", "Switch Invidious Instance": "Schakel tussen de Invidious Instanties", "preferences_automatic_instance_redirect_label": "Automatische instantie-omleiding (terugval naar redirect.invidious.io): ", @@ -366,7 +365,6 @@ "footer_original_source_code": "Originele bron-code", "footer_modfied_source_code": "Gewijzigde bron-code", "adminprefs_modified_source_code_url_label": "URL naar gewijzigde bron-code-opslagplaats", - "Broken? Try another Invidious Instance": "Kapot? Probeer een andere Invidious Instantie", "next_steps_error_message": "Waarna u moet proberen om: ", "footer_source_code": "Bron-code", "search_filters_duration_option_long": "Lang (> 20 minuten)", @@ -398,5 +396,6 @@ "preferences_save_player_pos_label": "Huidig afspeeltijdstip opslaan: ", "none": "geen", "search_filters_features_option_purchased": "Gekocht", - "search_filters_features_option_three_sixty": "360º" + "search_filters_features_option_three_sixty": "360º", + "search_filters_title": "Verfijnen" } diff --git a/locales/pl.json b/locales/pl.json index 6ccb712c..37f951a3 100644 --- a/locales/pl.json +++ b/locales/pl.json @@ -140,7 +140,6 @@ "Show less": "Pokaż mniej", "Watch on YouTube": "Zobacz film na YouTube", "Switch Invidious Instance": "Przełącz instancję Invidious", - "Broken? Try another Invidious Instance": "Nie działa? Spróbuj innej instancji Invidious", "Hide annotations": "Ukryj adnotacje", "Show annotations": "Pokaż adnotacje", "Genre: ": "Gatunek: ", @@ -354,7 +353,6 @@ "search_filters_features_option_four_k": "4k", "search_filters_features_option_location": "Lokalizacja", "search_filters_features_option_hdr": "hdr", - "search_filters_label": "filtr", "Current version: ": "Aktualna wersja: ", "next_steps_error_message": "Po czym powinien*ś spróbować: ", "next_steps_error_message_refresh": "Odśwież", @@ -476,5 +474,6 @@ "Japanese (auto-generated)": "japoński (wygenerowany automatycznie)", "Russian (auto-generated)": "rosyjski (wygenerowany automatycznie)", "Portuguese (auto-generated)": "portugalski (wygenerowany automatycznie)", - "Portuguese (Brazil)": "portugalski (Brazylia)" + "Portuguese (Brazil)": "portugalski (Brazylia)", + "search_filters_title": "Filtr" } diff --git a/locales/pt-BR.json b/locales/pt-BR.json index 8f95e2f2..f3a05a1a 100644 --- a/locales/pt-BR.json +++ b/locales/pt-BR.json @@ -143,7 +143,6 @@ "Show less": "Mostrar menos", "Watch on YouTube": "Assistir no YouTube", "Switch Invidious Instance": "Mudar a instância do Invidious", - "Broken? Try another Invidious Instance": "Quebrou? Tente outra Instância do Invidious", "Hide annotations": "Ocultar anotações", "Show annotations": "Mostrar anotações", "Genre: ": "Gênero: ", @@ -371,7 +370,6 @@ "search_filters_features_option_four_k": "4k", "search_filters_features_option_location": "localização", "search_filters_features_option_hdr": "hdr", - "search_filters_label": "filtro", "Current version: ": "Versão atual: ", "next_steps_error_message": "Depois disso, você deve tentar: ", "next_steps_error_message_refresh": "Atualizar", @@ -437,5 +435,6 @@ "user_created_playlists": "`x` listas de reprodução criadas", "user_saved_playlists": "`x` listas de reprodução salvas", "Video unavailable": "Vídeo indisponível", - "videoinfo_started_streaming_x_ago": "Iniciou a transmissão a `x`" + "videoinfo_started_streaming_x_ago": "Iniciou a transmissão a `x`", + "search_filters_title": "Filtro" } diff --git a/locales/pt-PT.json b/locales/pt-PT.json index 93e93d18..a57a2939 100644 --- a/locales/pt-PT.json +++ b/locales/pt-PT.json @@ -143,7 +143,6 @@ "Show less": "Mostrar menos", "Watch on YouTube": "Ver no YouTube", "Switch Invidious Instance": "Mudar a instância do Invidious", - "Broken? Try another Invidious Instance": "Falhou? Tente outra Instância do Invidious", "Hide annotations": "Ocultar anotações", "Show annotations": "Mostrar anotações", "Genre: ": "Género: ", @@ -371,9 +370,9 @@ "search_filters_features_option_four_k": "4K", "search_filters_features_option_location": "Localização", "search_filters_features_option_hdr": "HDR", - "search_filters_label": "Filtro", "Current version: ": "Versão atual: ", "next_steps_error_message": "Pode tentar as seguintes opções: ", "next_steps_error_message_refresh": "Atualizar", - "next_steps_error_message_go_to_youtube": "Ir ao YouTube" + "next_steps_error_message_go_to_youtube": "Ir ao YouTube", + "search_filters_title": "Filtro" } diff --git a/locales/pt.json b/locales/pt.json index b5dbd455..df237649 100644 --- a/locales/pt.json +++ b/locales/pt.json @@ -4,7 +4,6 @@ "search_filters_sort_option_date": "Data de envio", "search_filters_sort_option_rating": "Avaliação", "search_filters_sort_option_relevance": "Relevância", - "Broken? Try another Invidious Instance": "Falhou? Tente outra Instância do Invidious", "Switch Invidious Instance": "Mudar a instância do Invidious", "Show less": "Mostrar menos", "Show more": "Mostrar mais", @@ -17,7 +16,6 @@ "next_steps_error_message_go_to_youtube": "Ir ao YouTube", "next_steps_error_message": "Pode tentar as seguintes opções: ", "next_steps_error_message_refresh": "Atualizar", - "search_filters_label": "Filtro", "search_filters_features_option_hdr": "HDR", "search_filters_features_option_location": "Localização", "search_filters_features_option_four_k": "4K", @@ -437,5 +435,6 @@ "crash_page_read_the_faq": "leu as Perguntas frequentes (FAQ)", "crash_page_search_issue": "procurou se o erro já foi reportado no GitHub", "crash_page_report_issue": "Se nenhuma opção acima ajudou, por favor abra um novo problema no Github (preferencialmente em inglês) e inclua o seguinte texto tal qual (NÃO o traduza):", - "user_created_playlists": "`x` listas de reprodução criadas" + "user_created_playlists": "`x` listas de reprodução criadas", + "search_filters_title": "Filtro" } diff --git a/locales/ro.json b/locales/ro.json index 2ea6496b..342f5f37 100644 --- a/locales/ro.json +++ b/locales/ro.json @@ -21,7 +21,7 @@ "No": "Nu", "Import and Export Data": "Importați și Exportați Datele", "Import": "Importați", - "Import Invidious data": "Importați Datele de pe Invidious", + "Import Invidious data": "Importați datele JSON de pe Invidious", "Import YouTube subscriptions": "Importați abonamentele de pe YouTube", "Import FreeTube subscriptions (.db)": "Importați abonamentele de pe FreeTube (.db)", "Import NewPipe subscriptions (.json)": "Importați abonamentele de pe NewPipe (.json)", @@ -29,7 +29,7 @@ "Export": "Exportați", "Export subscriptions as OPML": "Exportați abonamentele în format OPML", "Export subscriptions as OPML (for NewPipe & FreeTube)": "Exportați abonamentele în format OPML (pentru NewPipe și FreeTube)", - "Export data as JSON": "Exportați datele în format JSON", + "Export data as JSON": "Exportați datele Invidious în format JSON", "Delete account?": "Sunteți siguri că doriți să vă ștergeți contul?", "History": "Istoric", "An alternative front-end to YouTube": "O alternativă front-end pentru YouTube", @@ -155,7 +155,7 @@ "Hide replies": "Ascundeți replicile", "Show replies": "Afișați replicile", "Incorrect password": "Parolă incorectă", - "Quota exceeded, try again in a few hours": "Numărul de tentative de conectare a fost depășit. Va rugăm să încercați din nou în câteva ore.", + "Quota exceeded, try again in a few hours": "Numărul de tentative de conectare a fost depășit. Va rugăm să încercați din nou în câteva ore", "Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Conectare eșuată. Dacă nu reușiți să vă conectați, verificați dacă ați activat autentificarea cu doi factori (Autentificator sau SMS).", "Invalid TFA code": "Codul de autentificare cu doi factori este invalid", "Login failed. This may be because two-factor authentication is not turned on for your account.": "Conectare eșuată. Acest lucru ar putea fi cauzat de faptul că nu ați activat autentificarea cu doi factori.", @@ -174,7 +174,7 @@ "Deleted or invalid channel": "Canal șters sau invalid", "This channel does not exist.": "Acest canal nu există.", "Could not get channel info.": "Nu am putut primi informații despre acest canal.", - "Could not fetch comments": "Încărcarea comentariilor a eșuat.", + "Could not fetch comments": "Încărcarea comentariilor a eșuat", "`x` ago": "acum `x`", "Load more": "Vedeți mai mult", "Could not create mix.": "Nu am putut crea această listă de redare.", @@ -187,7 +187,7 @@ "Erroneous challenge": "Challenge invalid", "Erroneous token": "Token invalid", "No such user": "Acest utilizator nu există", - "Token is expired, please try again": "Token-ul este expirat, vă rugăm să reîncercați.", + "Token is expired, please try again": "Jetonul a expirat, vă rugăm să încercați din nou", "English": "Engleză", "English (auto-generated)": "Engleză (generată automat)", "Afrikaans": "Afrikaans", @@ -295,7 +295,7 @@ "Yoruba": "Yoruba", "Zulu": "Zoulou", "Fallback comments: ": "Comentarii alternative: ", - "Popular": "Popular", + "Popular": "Populare", "Top": "Top", "About": "Despre", "Rating: ": "Evaluare: ", @@ -318,5 +318,173 @@ "Videos": "Videoclipuri", "Playlists": "Liste de redare", "Community": "Comunitate", - "Current version: ": "Versiunea actuală: " + "Current version: ": "Versiunea actuală: ", + "crash_page_read_the_faq": "citit lista Întrebărilor Frecvente (FAQ)", + "generic_count_days_0": "{{count}} zi", + "generic_count_days_1": "{{count}} zile", + "generic_count_days_2": "{{count}} de zile", + "generic_count_hours_0": "{{count}} oră", + "generic_count_hours_1": "{{count}} ore", + "generic_count_hours_2": "{{count}} de ore", + "generic_count_minutes_0": "{{count}} minut", + "generic_count_minutes_1": "{{count}} minute", + "generic_count_minutes_2": "{{count}} de minute", + "generic_views_count_0": "{{count}} vizionare", + "generic_views_count_1": "{{count}} vizionări", + "generic_views_count_2": "{{count}} de vizionări", + "subscriptions_unseen_notifs_count_0": "{{count}} notificare neverificată", + "subscriptions_unseen_notifs_count_1": "{{count}} notificări neverificate", + "subscriptions_unseen_notifs_count_2": "{{count}} de notificări neverificate", + "crash_page_refresh": "încercat să reîmprospătați pagina", + "crash_page_switch_instance": "am încercat să folosim o altă instanță", + "preferences_watch_history_label": "Activează istoricul: ", + "invidious": "Invidious", + "preferences_vr_mode_label": "Videoclipuri interactive de 360 de grade (necesită WebGL): ", + "English (United Kingdom)": "Engleză (Regatul Unit)", + "English (United States)": "Engleză (Statele Unite ale Americii)", + "Chinese": "Chineză", + "Chinese (China)": "Chineză (China)", + "Chinese (Hong Kong)": "Chineză (Hong Kong)", + "Chinese (Taiwan)": "Chineză (Taiwan)", + "Cantonese (Hong Kong)": "Cantoneză (Hong Kong)", + "Portuguese (auto-generated)": "Portugheză (generată automat)", + "Portuguese (Brazil)": "Portugheză (Brazilia)", + "Russian (auto-generated)": "Rusă (generată automat)", + "Turkish (auto-generated)": "Turcă (generată automat)", + "Vietnamese (auto-generated)": "Vietnameză (generată automat)", + "videoinfo_started_streaming_x_ago": "În direct de acum `x`", + "preferences_quality_dash_option_2160p": "2160p", + "footer_modfied_source_code": "Codul sursă modificat", + "preferences_quality_dash_label": "Calitatea video DASH preferată: ", + "generic_videos_count_0": "{{count}} videoclip", + "generic_videos_count_1": "{{count}} videoclipuri", + "generic_videos_count_2": "{{count}} de videoclipuri", + "generic_playlists_count_0": "{{count}} playlist", + "generic_playlists_count_1": "{{count}} playlisturi", + "generic_playlists_count_2": "{{count}} de playlisturi", + "tokens_count_0": "{{count}} jeton", + "tokens_count_1": "{{count}} jetoane", + "tokens_count_2": "{{count}} de jetoane", + "comments_points_count_0": "{{count}} punct", + "comments_points_count_1": "{{count}} puncte", + "comments_points_count_2": "{{count}} de puncte", + "Spanish (Spain)": "Spaniolă (Spania)", + "Video unavailable": "Videoclip indisponibil", + "crash_page_search_issue": "căutat sugestiile existente pe GitHub", + "Show more": "Afișați mai mult", + "Released under the AGPLv3 on Github.": "Lansat sub licența AGPLv3 pe GitHub.", + "preferences_quality_option_dash": "DASH (calitate adaptativă)", + "preferences_quality_option_hd720": "HD720", + "preferences_quality_option_small": "Mică", + "preferences_quality_dash_option_1440p": "1440p", + "preferences_quality_dash_option_1080p": "1080p", + "preferences_category_misc": "Setări diverse", + "preferences_automatic_instance_redirect_label": "Redirecționare automată de instanță (trecere prin redirect.invidious.io): ", + "preferences_quality_dash_option_480p": "480p", + "preferences_quality_option_medium": "Medie", + "Switch Invidious Instance": "Schimbă instanța Invidious", + "preferences_quality_dash_option_720p": "720p", + "preferences_quality_dash_option_auto": "Automatică", + "preferences_quality_dash_option_best": "Cea mai bună", + "preferences_quality_dash_option_worst": "Cea mai redusă", + "preferences_quality_dash_option_4320p": "4320p", + "preferences_quality_dash_option_360p": "360p", + "preferences_region_label": "Țară de conținut: ", + "preferences_extend_desc_label": "Extindeți automat descrierea: ", + "preferences_show_nick_label": "Afișați numele de utilizator pe partea de sus: ", + "generic_subscribers_count_0": "{{count}} abonat", + "generic_subscribers_count_1": "{{count}} abonați", + "generic_subscribers_count_2": "{{count}} de abonați", + "generic_subscriptions_count_0": "{{count}} abonament", + "generic_subscriptions_count_1": "{{count}} abonamente", + "generic_subscriptions_count_2": "{{count}} de abonamente", + "Search": "Căutați", + "search_filters_title": "Filtre", + "search_filters_date_label": "Data încărcării", + "none": "niciunul", + "search_message_use_another_instance": " Puteți căuta într-o altă instanță.", + "comments_view_x_replies_0": "Afișați {{count}} răspuns", + "comments_view_x_replies_1": "Afișați {{count}} răspunsuri", + "comments_view_x_replies_2": "Afișați {{count}} de răspunsuri", + "search_message_no_results": "Nu s-au găsit rezultate.", + "Dutch (auto-generated)": "Olandeză (generată automat)", + "Indonesian (auto-generated)": "Indoneziană (generată automat)", + "German (auto-generated)": "Germană (generată automat)", + "French (auto-generated)": "Franceză (generată automat)", + "Interlingue": "Interlingue", + "Italian (auto-generated)": "Italiană (generată automat)", + "Japanese (auto-generated)": "Japoneză (generată automat)", + "Korean (auto-generated)": "Coreeană (generată automat)", + "Spanish (auto-generated)": "Spaniolă (generată automat)", + "search_filters_date_option_none": "Oricând", + "search_filters_date_option_year": "an", + "search_filters_type_option_channel": "canal", + "Spanish (Mexico)": "Spaniolă (Mexic)", + "generic_count_weeks_0": "{{count}} săptămână", + "generic_count_weeks_1": "{{count}} săptămâni", + "generic_count_weeks_2": "{{count}} de săptămâni", + "generic_count_seconds_0": "{{count}} secundă", + "generic_count_seconds_1": "{{count}} secunde", + "generic_count_seconds_2": "{{count}} de secunde", + "search_filters_type_option_video": "videoclip", + "generic_count_years_0": "{{count}} an", + "generic_count_years_1": "{{count}} ani", + "generic_count_years_2": "{{count}} de ani", + "generic_count_months_0": "{{count}} lună", + "generic_count_months_1": "{{count}} luni", + "generic_count_months_2": "{{count}} de luni", + "search_filters_duration_label": "durată", + "search_filters_date_option_month": "lună", + "search_filters_type_label": "Tip", + "search_filters_date_option_today": "azi", + "search_filters_date_option_week": "săptămână", + "search_filters_features_option_vr180": "VR180", + "search_filters_type_option_playlist": "playlist", + "search_filters_type_option_movie": "film", + "search_filters_type_option_show": "emisiune", + "search_filters_duration_option_short": "Scurt (< 4 minute)", + "search_filters_duration_option_medium": "Medie (4 - 20 de minute)", + "search_filters_duration_option_none": "Fără limită", + "search_filters_duration_option_long": "Lungă (> 20 de minute)", + "search_filters_features_label": "atribute", + "search_filters_features_option_live": "în direct", + "search_filters_features_option_four_k": "4K", + "search_filters_features_option_c_commons": "Creative Commons", + "search_filters_features_option_three_sixty": "360°", + "search_filters_features_option_three_d": "3D", + "search_filters_features_option_subtitles": "subtitrări/CC", + "search_filters_features_option_hd": "HD", + "search_filters_features_option_hdr": "HDR", + "search_filters_features_option_purchased": "Cumpărate", + "next_steps_error_message": "După ce ar trebui să încercați să: ", + "user_saved_playlists": "`x` playlisturi salvate", + "search_filters_features_option_location": "locație", + "search_filters_sort_label": "Sortați după", + "search_filters_sort_option_relevance": "relevanță", + "search_filters_sort_option_rating": "clasificare", + "search_filters_sort_option_date": "Data încărcării", + "search_filters_sort_option_views": "Numărul de vizionări", + "footer_source_code": "Codul sursă", + "search_filters_apply_button": "Aplicați filtrele selectate", + "footer_original_source_code": "Codul sursă original", + "next_steps_error_message_refresh": "Reîmprospătează", + "next_steps_error_message_go_to_youtube": "Mergeți pe YouTube", + "footer_donate_page": "Donați", + "adminprefs_modified_source_code_url_label": "URL către depozitul de cod sursă modificat", + "footer_documentation": "Documentație", + "videoinfo_youTube_embed_link": "Încorporați", + "videoinfo_watch_on_youTube": "Vizionați pe YouTube", + "videoinfo_invidious_embed_link": "Link de încorporare", + "download_subtitles": "Subtitrări - `x` (.vtt)", + "user_created_playlists": "`x` playlisturi create", + "preferences_save_player_pos_label": "Salvați poziția de redare: ", + "crash_page_you_found_a_bug": "Se pare că ați găsit un bug în aplicația Invidious!", + "crash_page_before_reporting": "Înainte de a reporta bugul, asigurați-vă că ați:", + "search_filters_date_option_hour": "oră", + "search_message_change_filters_or_query": "Încercați să lărgiți căutarea sau să modificați filtrele.", + "crash_page_report_issue": "Dacă niciuna dintre sugestiile de mai sus v-a ajutat, vă rugăm să postați o nouă sugestie pe GitHub (cel mai bine în engleză), și să includeți următorul text în post (să nu îl traduceți):", + "search_filters_type_option_all": "orice tip", + "preferences_quality_dash_option_240p": "240p", + "preferences_quality_dash_option_144p": "144p", + "Show less": "Afișați mai puțin" } diff --git a/locales/ru.json b/locales/ru.json index 6ed6b296..88bb64ad 100644 --- a/locales/ru.json +++ b/locales/ru.json @@ -141,7 +141,6 @@ "Show less": "Показать меньше", "Watch on YouTube": "Смотреть на YouTube", "Switch Invidious Instance": "Сменить экземпляр Invidious", - "Broken? Try another Invidious Instance": "Сломался? Попробуйте другой экземпляр Invidious", "Hide annotations": "Скрыть аннотации", "Show annotations": "Показать аннотации", "Genre: ": "Жанр: ", @@ -355,7 +354,6 @@ "search_filters_features_option_four_k": "4K", "search_filters_features_option_location": "Местоположение", "search_filters_features_option_hdr": "HDR", - "search_filters_label": "Фильтр", "Current version: ": "Текущая версия: ", "next_steps_error_message": "После чего следует попробовать: ", "next_steps_error_message_refresh": "Обновить", @@ -477,5 +475,6 @@ "Video unavailable": "Видео недоступно", "preferences_save_player_pos_label": "Запоминать позицию: ", "preferences_region_label": "Страна: ", - "preferences_watch_history_label": "Включить историю просмотров " + "preferences_watch_history_label": "Включить историю просмотров ", + "search_filters_title": "Фильтр" } diff --git a/locales/sk.json b/locales/sk.json index f20ad75a..cdb3a596 100644 --- a/locales/sk.json +++ b/locales/sk.json @@ -18,15 +18,15 @@ "No": "Nie", "Import and Export Data": "Import a Export údajov", "Import": "Import", - "Import Invidious data": "Importovať údaje Invidious", - "Import YouTube subscriptions": "Importovať odbery YouTube", + "Import Invidious data": "Importovať JSON údaje Invidious", + "Import YouTube subscriptions": "Importovať odbery YouTube/OPML", "Import FreeTube subscriptions (.db)": "Importovať odbery FreeTube (.db)", "Import NewPipe subscriptions (.json)": "Importovať odbery NewPipe (.json)", "Import NewPipe data (.zip)": "Importovať údaje NewPipe (.zip)", "Export": "Export", "Export subscriptions as OPML": "Exportovať odbery ako OPML", "Export subscriptions as OPML (for NewPipe & FreeTube)": "Exportovať odbery ako OPML (pre NewPipe a FreeTube)", - "Export data as JSON": "Export údajov ako JSON", + "Export data as JSON": "Exportovať údaje Invidious ako JSON", "Delete account?": "Zrušiť účet?", "History": "História", "An alternative front-end to YouTube": "Alternatívny front-end pre YouTube", @@ -84,5 +84,23 @@ "preferences_unseen_only_label": "Zobraziť iba neprehrané: ", "preferences_notifications_only_label": "Zobraziť iba upozornenia (ak existujú): ", "Enable web notifications": "Povoliť webové upozornenia", - "`x` uploaded a video": "`x` nahral(a) video" + "`x` uploaded a video": "`x` nahral(a) video", + "generic_views_count_0": "{{count}} zhliadnutie", + "generic_views_count_1": "{{count}} zhliadnutia", + "generic_views_count_2": "{{count}} zhliadnutí", + "generic_subscribers_count_0": "{{count}} odberateľ", + "generic_subscribers_count_1": "{{count}} odberatelia", + "generic_subscribers_count_2": "{{count}} odberateľov", + "Shared `x` ago": "Zverejnené pred `x`", + "generic_playlists_count_0": "{{count}} playlist", + "generic_playlists_count_1": "{{count}} playlisty", + "generic_playlists_count_2": "{{count}} playlistov", + "generic_videos_count_0": "{{count}} video", + "generic_videos_count_1": "{{count}} videá", + "generic_videos_count_2": "{{count}} videí", + "generic_subscriptions_count_0": "{{count}} odber", + "generic_subscriptions_count_1": "{{count}} odbery", + "generic_subscriptions_count_2": "{{count}} odberov", + "Authorize token for `x`?": "Autorizovať token pre `x`?", + "View playlist on YouTube": "Zobraziť playlist na YouTube" } diff --git a/locales/sq.json b/locales/sq.json index c87c5446..76f1eaa3 100644 --- a/locales/sq.json +++ b/locales/sq.json @@ -147,7 +147,6 @@ "Show less": "Shfaq më pak", "Watch on YouTube": "Shiheni në YouTube", "Switch Invidious Instance": "Ndërroni Instancë Invidious", - "Broken? Try another Invidious Instance": "E prishur? Provoni një tjetër Instancë Invidious", "Hide annotations": "Fshihi shënimet", "Show annotations": "Shfaq shënime", "License: ": "Licencë: ", @@ -371,7 +370,6 @@ "Nepali": "Nepaleze", "Norwegian Bokmål": "Norvegjishte Bokmål", "search_filters_features_option_three_sixty": "360°", - "search_filters_label": "Filtroji", "Current version: ": "Versioni i tanishëm: ", "next_steps_error_message": "Pas të cilës duhet të provoni të: ", "next_steps_error_message_refresh": "Rifreskoje", @@ -448,5 +446,6 @@ "Import YouTube subscriptions": "Importoni pajtime YouTube/OPML", "Export data as JSON": "Eksportoji të dhënat Invidious si JSON", "preferences_vr_mode_label": "Video me ndërveprim 360 gradë (lyp WebGL): ", - "Shared `x`": "Ndau me të tjerë `x`" + "Shared `x`": "Ndau me të tjerë `x`", + "search_filters_title": "Filtra" } diff --git a/locales/sr.json b/locales/sr.json index 620c83dc..d2f990ae 100644 --- a/locales/sr.json +++ b/locales/sr.json @@ -150,7 +150,6 @@ "search_filters_features_option_c_commons": "Creative Commons (Licenca)", "search_filters_features_option_three_d": "3D", "search_filters_features_option_hdr": "Video Visoke Rezolucije", - "search_filters_label": "Filter", "next_steps_error_message": "Nakon čega bi trebali probati: ", "next_steps_error_message_go_to_youtube": "Idi na YouTube", "footer_documentation": "Dokumentacija", @@ -226,7 +225,6 @@ "preferences_captions_label": "Podrazumevani titl: ", "Music": "Muzika", "search_filters_type_label": "Tip", - "Broken? Try another Invidious Instance": "Ne funkcioniše ispravno? Probajte drugu Invidious instancu", "Tamil": "Tamilski", "Save preferences": "Sačuvaj podešavanja", "Only show latest unwatched video from channel: ": "Prikaži samo poslednje video klipove koji nisu pogledani sa kanala: ", @@ -369,5 +367,6 @@ "unsubscribe": "prekini sa praćenjem", "Blacklisted regions: ": "Zabranjene oblasti: ", "Polish": "Poljski", - "Yoruba": "Joruba" + "Yoruba": "Joruba", + "search_filters_title": "Filter" } diff --git a/locales/sr_Cyrl.json b/locales/sr_Cyrl.json index 6aea400a..c0f1224f 100644 --- a/locales/sr_Cyrl.json +++ b/locales/sr_Cyrl.json @@ -189,7 +189,6 @@ "search_filters_features_option_c_commons": "Creative Commons (Лиценца)", "search_filters_features_option_live": "Уживо", "search_filters_features_option_location": "Локација", - "search_filters_label": "Филтер", "next_steps_error_message": "Након чега би требали пробати: ", "footer_donate_page": "Донирај", "footer_documentation": "Документација", @@ -345,7 +344,6 @@ "search_filters_features_option_subtitles": "Титл/Превод", "preferences_extend_desc_label": "Аутоматски прикажи цео опис видеа: ", "Show less": "Прикажи мање", - "Broken? Try another Invidious Instance": "Не функционише исправно? Пробајте другу Invidious инстанцу", "Family friendly? ": "Погодно за породицу? ", "Premieres `x`": "Премерe у `x`", "Bosnian": "Босански", @@ -369,5 +367,6 @@ "Hebrew": "Хебрејски", "Korean": "Корејски", "Kurdish": "Курдски", - "Malay": "Малајски" + "Malay": "Малајски", + "search_filters_title": "Филтер" } diff --git a/locales/sv-SE.json b/locales/sv-SE.json index 44cb92ed..777899d0 100644 --- a/locales/sv-SE.json +++ b/locales/sv-SE.json @@ -139,7 +139,6 @@ "Show less": "Visa mindre", "Watch on YouTube": "Titta på YouTube", "Switch Invidious Instance": "Byt Invidious Instans", - "Broken? Try another Invidious Instance": "Trasig? Prova en annan Invidious Instance", "Hide annotations": "Dölj länkar-i-video", "Show annotations": "Visa länkar-i-video", "Genre: ": "Genre: ", @@ -353,7 +352,6 @@ "search_filters_features_option_four_k": "4k", "search_filters_features_option_location": "plats", "search_filters_features_option_hdr": "hdr", - "search_filters_label": "Filter", "Current version: ": "Nuvarande version: ", "next_steps_error_message_refresh": "Uppdatera", "next_steps_error_message_go_to_youtube": "Gå till Youtube", @@ -361,5 +359,6 @@ "footer_source_code": "Källkod", "search_filters_duration_option_long": "Lång (> 20 minuter)", "footer_documentation": "Dokumentation", - "search_filters_duration_option_short": "Kort (< 4 minuter)" + "search_filters_duration_option_short": "Kort (< 4 minuter)", + "search_filters_title": "Filter" } diff --git a/locales/tr.json b/locales/tr.json index 75de6d33..b1991c35 100644 --- a/locales/tr.json +++ b/locales/tr.json @@ -141,7 +141,6 @@ "Show less": "Daha az göster", "Watch on YouTube": "YouTube'da izle", "Switch Invidious Instance": "Invidious Örneğini Değiştir", - "Broken? Try another Invidious Instance": "Bozuk mu? Başka bir Invidious örneğini deneyin", "Hide annotations": "Ek açıklamaları gizle", "Show annotations": "Ek açıklamaları göster", "Genre: ": "Tür: ", @@ -355,7 +354,6 @@ "search_filters_features_option_four_k": "4K", "search_filters_features_option_location": "Konum", "search_filters_features_option_hdr": "HDR", - "search_filters_label": "Filtrele", "Current version: ": "Şu anki sürüm: ", "next_steps_error_message": "Bundan sonra şunları denemelisiniz: ", "next_steps_error_message_refresh": "Yenile", @@ -461,5 +459,16 @@ "Portuguese (auto-generated)": "Portekizce (otomatik oluşturuldu)", "Spanish (Spain)": "İspanyolca (İspanya)", "Vietnamese (auto-generated)": "Vietnamca (otomatik oluşturuldu)", - "preferences_watch_history_label": "İzleme geçmişini etkinleştir: " + "preferences_watch_history_label": "İzleme geçmişini etkinleştir: ", + "search_message_use_another_instance": " Ayrıca başka bir örnekte arayabilirsiniz.", + "search_filters_type_option_all": "Herhangi bir tür", + "search_filters_duration_option_none": "Herhangi bir süre", + "search_message_no_results": "Sonuç bulunamadı.", + "search_filters_date_label": "Yükleme tarihi", + "search_filters_apply_button": "Seçili filtreleri uygula", + "search_filters_date_option_none": "Herhangi bir tarih", + "search_filters_duration_option_medium": "Orta (4 - 20 dakika)", + "search_filters_features_option_vr180": "VR180", + "search_filters_title": "Filtreler", + "search_message_change_filters_or_query": "Arama sorgunuzu genişletmeyi ve/veya filtreleri değiştirmeyi deneyin." } diff --git a/locales/uk.json b/locales/uk.json index 5b006999..dd03d559 100644 --- a/locales/uk.json +++ b/locales/uk.json @@ -355,7 +355,6 @@ "generic_count_hours_0": "{{count}} годину", "generic_count_hours_1": "{{count}} години", "generic_count_hours_2": "{{count}} годин", - "content_type": "Тип", "crash_page_switch_instance": "спробуйте використати інший сервер", "crash_page_read_the_faq": "прочитайте часті питання (ЧаП)", "crash_page_search_issue": "перегляньте наявні обговорення на GitHub", @@ -386,15 +385,6 @@ "Spanish (auto-generated)": "Іспанська (автогенератор)", "Spanish (Mexico)": "Іспанська (Мексика)", "Spanish (Spain)": "Іспанська (Іспанія)", - "views": "Кількість переглядів", - "today": "Сьогодні", - "playlist": "Список відтворення", - "long": "Довге (понад 20 хвилин)", - "hd": "HD", - "creative_commons": "Creative Commons", - "3d": "3D", - "hdr": "HDR", - "360": "360°", "next_steps_error_message_go_to_youtube": "Перейти до YouTube", "footer_donate_page": "Пожертвувати", "footer_documentation": "Документація", @@ -415,29 +405,11 @@ "preferences_save_player_pos_label": "Зберегти позицію відтворення: ", "preferences_show_nick_label": "Псевдонім угорі: ", "Show more": "Докладніше", - "week": "Цей тиждень", - "year": "Цей рік", - "video": "Відео", - "channel": "Канал", - "subtitles": "Субтитри", - "live": "Наживо", - "4k": "4K", - "filter": "Фільтр", "next_steps_error_message": "Після чого спробуйте: ", "next_steps_error_message_refresh": "Оновити сторінку", - "relevance": "Доречність", - "rating": "Рейтинг", - "duration": "Тривалість", - "sort": "Порядок", - "movie": "Фільм", "Search": "Пошук", - "location": "Місце", "preferences_extend_desc_label": "Автоматично розширювати опис відео: ", - "month": "Цей місяць", - "features": "Функції", "preferences_category_misc": "Різноманітні параметри", - "date": "Дата вивантаження", - "hour": "Ця година", "Show less": "Коротше", "preferences_quality_option_small": "Низька", "preferences_quality_dash_option_240p": "240p", @@ -453,18 +425,14 @@ "preferences_automatic_instance_redirect_label": "Автоматична зміна сервера (redirect.invidious.io як резерв): ", "Switch Invidious Instance": "Інший сервер Invidious", "preferences_quality_dash_option_480p": "480p", - "Broken? Try another Invidious Instance": "Не працює? Спробуйте інший сервер Invidious", "Chinese (Taiwan)": "Китайська (Тайвань)", "Dutch (auto-generated)": "Нідерландська (автогенератор)", "Indonesian (auto-generated)": "Індонезійська (автогенератор)", "Japanese (auto-generated)": "Японська (автогенератор)", - "show": "Шоу", "Korean (auto-generated)": "Корейська (автогенератор)", "generic_count_months_0": "{{count}} місяць", "generic_count_months_1": "{{count}} місяці", "generic_count_months_2": "{{count}} місяців", - "short": "Коротке (до 4 хвилин)", - "purchased": "Придбання", "videoinfo_youTube_embed_link": "Вкласти", "generic_count_minutes_0": "{{count}} хвилину", "generic_count_minutes_1": "{{count}} хвилини", @@ -477,5 +445,46 @@ "download_subtitles": "Субтитри — `x` (.vtt)", "comments_points_count_0": "{{count}} пункт", "comments_points_count_1": "{{count}} пункти", - "comments_points_count_2": "{{count}} пунктів" + "comments_points_count_2": "{{count}} пунктів", + "search_filters_features_option_three_d": "3D", + "search_filters_features_option_location": "Геомітка", + "search_filters_duration_option_none": "Будь-які", + "search_filters_features_option_hd": "HD", + "search_message_change_filters_or_query": "Спробуйте ширший запит і/або інші фільтри.", + "search_filters_type_option_all": "Будь-що", + "search_filters_type_option_movie": "Фільм", + "search_filters_type_option_show": "Шоу", + "search_filters_duration_label": "Тривалість", + "search_filters_duration_option_short": "Короткі (до 4 хвилин)", + "search_message_no_results": "Результатів не знайдено.", + "search_filters_date_label": "Дата вивантаження", + "search_filters_date_option_none": "Будь-яка дата", + "search_filters_date_option_today": "Сьогодні", + "search_filters_date_option_week": "Цей тиждень", + "search_filters_type_label": "Тип", + "search_filters_type_option_channel": "Канал", + "search_message_use_another_instance": " Можете також пошукати іншим сервером.", + "search_filters_title": "Фільтри", + "search_filters_date_option_hour": "Остання година", + "search_filters_date_option_month": "Цей місяць", + "search_filters_date_option_year": "Цей рік", + "search_filters_type_option_video": "Відео", + "search_filters_type_option_playlist": "Добірка", + "search_filters_duration_option_medium": "Середні (4–20 хвилин)", + "search_filters_duration_option_long": "Довгі (понад 20 хвилин)", + "search_filters_features_label": "Особливості", + "search_filters_features_option_live": "Наживо", + "search_filters_features_option_four_k": "4K", + "search_filters_features_option_subtitles": "Субтитри", + "search_filters_features_option_c_commons": "Creative Commons", + "search_filters_features_option_three_sixty": "360°", + "search_filters_features_option_hdr": "HDR", + "search_filters_sort_label": "Спершу", + "search_filters_sort_option_date": "Нещодавні", + "search_filters_apply_button": "Застосувати фільтри", + "search_filters_features_option_vr180": "VR180", + "search_filters_features_option_purchased": "Придбано", + "search_filters_sort_option_relevance": "Відповідні", + "search_filters_sort_option_rating": "Рейтингові", + "search_filters_sort_option_views": "Популярні" } diff --git a/locales/vi.json b/locales/vi.json index 3112ef4a..709013a2 100644 --- a/locales/vi.json +++ b/locales/vi.json @@ -138,7 +138,6 @@ "Show less": "Hiện ít hơn", "Watch on YouTube": "Xem trên YouTube", "Switch Invidious Instance": "Chuyển phiên bản Invidious", - "Broken? Try another Invidious Instance": "Bị hỏng? Hãy thử một Phiên bản Invidious khác", "Hide annotations": "Ẩn chú thích", "Show annotations": "Hiển thị chú thích", "Genre: ": "Thể loại: ", @@ -341,6 +340,6 @@ "search_filters_features_option_four_k": "4k", "search_filters_features_option_location": "vị trí", "search_filters_features_option_hdr": "hdr", - "search_filters_label": "bộ lọc", - "Current version: ": "Phiên bản hiện tại: " + "Current version: ": "Phiên bản hiện tại: ", + "search_filters_title": "bộ lọc" } diff --git a/locales/zh-CN.json b/locales/zh-CN.json index bc1a3e4b..ed180628 100644 --- a/locales/zh-CN.json +++ b/locales/zh-CN.json @@ -148,7 +148,6 @@ "Show less": "显示较少", "Watch on YouTube": "在 YouTube 观看", "Switch Invidious Instance": "切换 Invidious 实例", - "Broken? Try another Invidious Instance": "无法正常工作? 尝试另一个 Invidious 实例", "Hide annotations": "隐藏注释", "Show annotations": "显示注释", "Genre: ": "风格: ", @@ -371,7 +370,6 @@ "search_filters_features_option_four_k": "4k", "search_filters_features_option_location": "位置", "search_filters_features_option_hdr": "hdr", - "search_filters_label": "过滤器", "Current version: ": "当前版本: ", "next_steps_error_message": "在此之后你应尝试: ", "next_steps_error_message_refresh": "刷新", @@ -445,5 +443,16 @@ "French (auto-generated)": "法语 (自动生成)", "Turkish (auto-generated)": "土耳其语 (自动生成)", "Spanish (Spain)": "西班牙语 (西班牙)", - "preferences_watch_history_label": "启用观看历史: " + "preferences_watch_history_label": "启用观看历史: ", + "search_message_use_another_instance": " 你也可以 在另一实例上搜索。", + "search_filters_title": "过滤器", + "search_filters_date_label": "上传日期", + "search_filters_apply_button": "应用所选过滤器", + "search_message_no_results": "没找到结果。", + "search_filters_duration_option_medium": "中等(4-20 分钟)", + "search_filters_date_option_none": "任意日期", + "search_message_change_filters_or_query": "尝试扩大你的搜索查询和/或更改过滤器。", + "search_filters_duration_option_none": "任意时长", + "search_filters_type_option_all": "任意类型", + "search_filters_features_option_vr180": "VR180" } diff --git a/locales/zh-TW.json b/locales/zh-TW.json index 189dba18..4b6fa71b 100644 --- a/locales/zh-TW.json +++ b/locales/zh-TW.json @@ -148,7 +148,6 @@ "Show less": "顯示較少", "Watch on YouTube": "在 YouTube 上觀看", "Switch Invidious Instance": "切換 Invidious 站台", - "Broken? Try another Invidious Instance": "故障了嗎?試試看其他 Invidious 站台吧", "Hide annotations": "隱藏註釋", "Show annotations": "顯示註釋", "Genre: ": "風格: ", @@ -371,7 +370,6 @@ "search_filters_features_option_four_k": "4K", "search_filters_features_option_location": "位置", "search_filters_features_option_hdr": "HDR", - "search_filters_label": "篩選條件", "Current version: ": "目前版本: ", "next_steps_error_message": "之後您應該嘗試: ", "next_steps_error_message_refresh": "重新整理", @@ -445,5 +443,16 @@ "Portuguese (Brazil)": "葡萄牙語(巴西)", "Japanese (auto-generated)": "日語(自動產生)", "Portuguese (auto-generated)": "葡萄牙語(自動產生)", - "preferences_watch_history_label": "啟用觀看紀錄: " + "preferences_watch_history_label": "啟用觀看紀錄: ", + "search_message_change_filters_or_query": "嘗試擴大您的查詢字詞與/或變更過濾條件。", + "search_filters_apply_button": "套用選定的過濾條件", + "search_message_no_results": "找不到結果。", + "search_filters_duration_option_none": "任何時長", + "search_filters_duration_option_medium": "中等(4到20分鐘)", + "search_filters_features_option_vr180": "VR180", + "search_message_use_another_instance": " 您也可以在其他站台上搜尋。", + "search_filters_title": "過濾條件", + "search_filters_date_label": "上傳日期", + "search_filters_type_option_all": "任何類型", + "search_filters_date_option_none": "任何日期" } diff --git a/shard.lock b/shard.lock index e7123ce3..cdce1160 100644 --- a/shard.lock +++ b/shard.lock @@ -14,11 +14,11 @@ shards: exception_page: git: https://github.com/crystal-loot/exception_page.git - version: 0.2.1 + version: 0.2.2 kemal: git: https://github.com/kemalcr/kemal.git - version: 1.1.0 + version: 1.1.2 kilt: git: https://github.com/jeromegn/kilt.git diff --git a/shard.yml b/shard.yml index bf382ec3..9c9b0d37 100644 --- a/shard.yml +++ b/shard.yml @@ -18,7 +18,10 @@ dependencies: version: ~> 0.18.0 kemal: github: kemalcr/kemal - version: ~> 1.1.0 + version: ~> 1.1.2 + kilt: + github: jeromegn/kilt + version: ~> 0.6.1 protodec: github: iv-org/protodec version: ~> 0.1.4 diff --git a/spec/invidious/search/query_spec.cr b/spec/invidious/search/query_spec.cr new file mode 100644 index 00000000..4853e9e9 --- /dev/null +++ b/spec/invidious/search/query_spec.cr @@ -0,0 +1,200 @@ +require "../../../src/invidious/search/filters" +require "../../../src/invidious/search/query" + +require "http/params" +require "spectator" + +Spectator.configure do |config| + config.fail_blank + config.randomize +end + +Spectator.describe Invidious::Search::Query do + describe Type::Regular do + # ------------------- + # Query parsing + # ------------------- + + it "parses query with URL prameters (q)" do + query = described_class.new( + HTTP::Params.parse("q=What+is+Love+10+hour&type=video&duration=long"), + Invidious::Search::Query::Type::Regular, nil + ) + + expect(query.type).to eq(Invidious::Search::Query::Type::Regular) + expect(query.channel).to be_empty + expect(query.text).to eq("What is Love 10 hour") + + expect(query.filters).to eq( + Invidious::Search::Filters.new( + type: Invidious::Search::Filters::Type::Video, + duration: Invidious::Search::Filters::Duration::Long + ) + ) + end + + it "parses query with URL prameters (search_query)" do + query = described_class.new( + HTTP::Params.parse("search_query=What+is+Love+10+hour&type=video&duration=long"), + Invidious::Search::Query::Type::Regular, nil + ) + + expect(query.type).to eq(Invidious::Search::Query::Type::Regular) + expect(query.channel).to be_empty + expect(query.text).to eq("What is Love 10 hour") + + expect(query.filters).to eq( + Invidious::Search::Filters.new( + type: Invidious::Search::Filters::Type::Video, + duration: Invidious::Search::Filters::Duration::Long + ) + ) + end + + it "parses query with legacy filters (q)" do + query = described_class.new( + HTTP::Params.parse("q=Nyan+cat+duration:long"), + Invidious::Search::Query::Type::Regular, nil + ) + + expect(query.type).to eq(Invidious::Search::Query::Type::Regular) + expect(query.channel).to be_empty + expect(query.text).to eq("Nyan cat") + + expect(query.filters).to eq( + Invidious::Search::Filters.new( + duration: Invidious::Search::Filters::Duration::Long + ) + ) + end + + it "parses query with legacy filters (search_query)" do + query = described_class.new( + HTTP::Params.parse("search_query=Nyan+cat+duration:long"), + Invidious::Search::Query::Type::Regular, nil + ) + + expect(query.type).to eq(Invidious::Search::Query::Type::Regular) + expect(query.channel).to be_empty + expect(query.text).to eq("Nyan cat") + + expect(query.filters).to eq( + Invidious::Search::Filters.new( + duration: Invidious::Search::Filters::Duration::Long + ) + ) + end + + it "parses query with both URL params and legacy filters" do + query = described_class.new( + HTTP::Params.parse("q=Vamos+a+la+playa+duration:long&type=Video&date=year"), + Invidious::Search::Query::Type::Regular, nil + ) + + expect(query.type).to eq(Invidious::Search::Query::Type::Regular) + expect(query.channel).to be_empty + expect(query.text).to eq("Vamos a la playa duration:long") + + expect(query.filters).to eq( + Invidious::Search::Filters.new( + type: Invidious::Search::Filters::Type::Video, + date: Invidious::Search::Filters::Date::Year + ) + ) + end + + # ------------------- + # Type switching + # ------------------- + + it "switches to channel search (URL param)" do + query = described_class.new( + HTTP::Params.parse("q=thunderbolt+4&channel=UC0vBXGSyV14uvJ4hECDOl0Q"), + Invidious::Search::Query::Type::Regular, nil + ) + + expect(query.type).to eq(Invidious::Search::Query::Type::Channel) + expect(query.channel).to eq("UC0vBXGSyV14uvJ4hECDOl0Q") + expect(query.text).to eq("thunderbolt 4") + expect(query.filters.default?).to be_true + end + + it "switches to channel search (legacy)" do + query = described_class.new( + HTTP::Params.parse("q=channel%3AUCRPdsCVuH53rcbTcEkuY4uQ+rdna3"), + Invidious::Search::Query::Type::Regular, nil + ) + + expect(query.type).to eq(Invidious::Search::Query::Type::Channel) + expect(query.channel).to eq("UCRPdsCVuH53rcbTcEkuY4uQ") + expect(query.text).to eq("rdna3") + expect(query.filters.default?).to be_true + end + + it "switches to subscriptions search" do + query = described_class.new( + HTTP::Params.parse("q=subscriptions:true+tunak+tunak+tun"), + Invidious::Search::Query::Type::Regular, nil + ) + + expect(query.type).to eq(Invidious::Search::Query::Type::Subscriptions) + expect(query.channel).to be_empty + expect(query.text).to eq("tunak tunak tun") + expect(query.filters.default?).to be_true + end + end + + describe Type::Channel do + it "ignores extra parameters" do + query = described_class.new( + HTTP::Params.parse("q=Take+on+me+channel%3AUC12345679&type=video&date=year"), + Invidious::Search::Query::Type::Channel, nil + ) + + expect(query.type).to eq(Invidious::Search::Query::Type::Channel) + expect(query.channel).to be_empty + expect(query.text).to eq("Take on me") + expect(query.filters.default?).to be_true + end + end + + describe Type::Subscriptions do + it "works" do + query = described_class.new( + HTTP::Params.parse("q=Harlem+shake&type=video&date=year"), + Invidious::Search::Query::Type::Subscriptions, nil + ) + + expect(query.type).to eq(Invidious::Search::Query::Type::Subscriptions) + expect(query.channel).to be_empty + expect(query.text).to eq("Harlem shake") + + expect(query.filters).to eq( + Invidious::Search::Filters.new( + type: Invidious::Search::Filters::Type::Video, + date: Invidious::Search::Filters::Date::Year + ) + ) + end + end + + describe Type::Playlist do + it "ignores extra parameters" do + query = described_class.new( + HTTP::Params.parse("q=Harlem+shake+type:video+date:year&channel=UC12345679"), + Invidious::Search::Query::Type::Playlist, nil + ) + + expect(query.type).to eq(Invidious::Search::Query::Type::Playlist) + expect(query.channel).to be_empty + expect(query.text).to eq("Harlem shake") + + expect(query.filters).to eq( + Invidious::Search::Filters.new( + type: Invidious::Search::Filters::Type::Video, + date: Invidious::Search::Filters::Date::Year + ) + ) + end + end +end diff --git a/src/ext/kemal_content_for.cr b/src/ext/kemal_content_for.cr new file mode 100644 index 00000000..a4f3fd96 --- /dev/null +++ b/src/ext/kemal_content_for.cr @@ -0,0 +1,16 @@ +# Overrides for Kemal's `content_for` macro in order to keep using +# kilt as it was before Kemal v1.1.1 (Kemal PR #618). + +require "kemal" +require "kilt" + +macro content_for(key, file = __FILE__) + %proc = ->() { + __kilt_io__ = IO::Memory.new + {{ yield }} + __kilt_io__.to_s + } + + CONTENT_FOR_BLOCKS[{{key}}] = Tuple.new {{file}}, %proc + nil +end diff --git a/src/invidious/helpers/static_file_handler.cr b/src/ext/kemal_static_file_handler.cr similarity index 100% rename from src/invidious/helpers/static_file_handler.cr rename to src/ext/kemal_static_file_handler.cr diff --git a/src/invidious.cr b/src/invidious.cr index 9f3d5d10..dd240852 100644 --- a/src/invidious.cr +++ b/src/invidious.cr @@ -16,7 +16,13 @@ require "digest/md5" require "file_utils" + +# Require kemal, kilt, then our own overrides require "kemal" +require "kilt" +require "./ext/kemal_content_for.cr" +require "./ext/kemal_static_file_handler.cr" + require "athena-negotiation" require "openssl/hmac" require "option_parser" diff --git a/src/invidious/comments.cr b/src/invidious/comments.cr index ab9fcc8b..c6e7fd17 100644 --- a/src/invidious/comments.cr +++ b/src/invidious/comments.cr @@ -574,31 +574,41 @@ def content_to_comment_html(content) if run["navigationEndpoint"]? if url = run["navigationEndpoint"]["urlEndpoint"]?.try &.["url"].as_s url = URI.parse(url) + displayed_url = url if url.host == "youtu.be" url = "/watch?v=#{url.request_target.lstrip('/')}" + displayed_url = "youtube.com#{url}" elsif url.host.nil? || url.host.not_nil!.ends_with?("youtube.com") if url.path == "/redirect" # Sometimes, links can be corrupted (why?) so make sure to fallback # nicely. See https://github.com/iv-org/invidious/issues/2682 url = HTTP::Params.parse(url.query.not_nil!)["q"]? || "" + displayed_url = url else url = url.request_target + displayed_url = "youtube.com#{url}" end end - text = %(#{text}) + text = %(#{reduce_uri(displayed_url)}) elsif watch_endpoint = run["navigationEndpoint"]["watchEndpoint"]? length_seconds = watch_endpoint["startTimeSeconds"]? video_id = watch_endpoint["videoId"].as_s - if length_seconds && length_seconds.as_i > 0 + if length_seconds && length_seconds.as_i >= 0 text = %(#{text}) else - text = %(#{text}) + text = %(#{"youtube.com/watch?v=#{video_id}"}) end elsif url = run.dig?("navigationEndpoint", "commandMetadata", "webCommandMetadata", "url").try &.as_s - text = %(#{text}) + if text.starts_with?(/\s?@/) + # Handle "pings" in comments differently + # See: https://github.com/iv-org/invidious/issues/3038 + text = %(#{text}) + else + text = %(#{reduce_uri(url)}) + end end end diff --git a/src/invidious/helpers/macros.cr b/src/invidious/helpers/macros.cr index 75df1612..43e7171b 100644 --- a/src/invidious/helpers/macros.cr +++ b/src/invidious/helpers/macros.cr @@ -48,13 +48,19 @@ module JSON::Serializable end end -macro templated(filename, template = "template", navbar_search = true) +macro templated(_filename, template = "template", navbar_search = true) navbar_search = {{navbar_search}} - render "src/invidious/views/#{{{filename}}}.ecr", "src/invidious/views/#{{{template}}}.ecr" + + {{ filename = "src/invidious/views/" + _filename + ".ecr" }} + {{ layout = "src/invidious/views/" + template + ".ecr" }} + + __content_filename__ = {{filename}} + content = Kilt.render({{filename}}) + Kilt.render({{layout}}) end macro rendered(filename) - render "src/invidious/views/#{{{filename}}}.ecr" + Kilt.render("src/invidious/views/#{{{filename}}}.ecr") end # Similar to Kemals halt method but works in a diff --git a/src/invidious/helpers/utils.cr b/src/invidious/helpers/utils.cr index c1dc17db..8ae5034a 100644 --- a/src/invidious/helpers/utils.cr +++ b/src/invidious/helpers/utils.cr @@ -383,3 +383,11 @@ def fetch_random_instance return filtered_instance_list.sample(1)[0] end + +def reduce_uri(uri : URI | String, max_length : Int32 = 50, suffix : String = "…") : String + str = uri.to_s.sub(/^https?:\/\//, "") + if str.size > max_length + str = "#{str[0, max_length]}#{suffix}" + end + return str +end diff --git a/src/invidious/routes/api/manifest.cr b/src/invidious/routes/api/manifest.cr index ca429df5..23d11f65 100644 --- a/src/invidious/routes/api/manifest.cr +++ b/src/invidious/routes/api/manifest.cr @@ -56,7 +56,7 @@ module Invidious::Routes::API::Manifest xml.element("Period") do i = 0 - {"audio/mp4", "audio/webm"}.each do |mime_type| + {"audio/mp4"}.each do |mime_type| mime_streams = audio_streams.select { |stream| stream["mimeType"].as_s.starts_with? mime_type } next if mime_streams.empty? @@ -83,7 +83,7 @@ module Invidious::Routes::API::Manifest potential_heights = {4320, 2160, 1440, 1080, 720, 480, 360, 240, 144} - {"video/mp4", "video/webm"}.each do |mime_type| + {"video/mp4"}.each do |mime_type| mime_streams = video_streams.select { |stream| stream["mimeType"].as_s.starts_with? mime_type } next if mime_streams.empty? diff --git a/src/invidious/search/query.cr b/src/invidious/search/query.cr index 1c2b37d2..34b36b1d 100644 --- a/src/invidious/search/query.cr +++ b/src/invidious/search/query.cr @@ -10,7 +10,7 @@ module Invidious::Search Playlist # "Add playlist item" search end - @type : Type = Type::Regular + getter type : Type = Type::Regular @raw_query : String @query : String = "" @@ -63,14 +63,17 @@ module Invidious::Search # Specific handling case @type - when .playlist?, .channel? - # In "add playlist item" mode, filters are parsed from the query - # string itself (legacy), and the channel is ignored. - # + when .channel? # In "channel search" mode, filters are ignored, but we still parse # the query prevent transmission of legacy filters to youtube. # - @filters, @query, @channel, _ = Filters.from_legacy_filters(@raw_query || "") + _, _, @query, _ = Filters.from_legacy_filters(@raw_query) + # + when .playlist? + # In "add playlist item" mode, filters are parsed from the query + # string itself (legacy), and the channel is ignored. + # + @filters, _, @query, _ = Filters.from_legacy_filters(@raw_query) # when .subscriptions?, .regular? if params["sp"]? @@ -84,7 +87,7 @@ module Invidious::Search if @filters.default? && @raw_query.includes?(':') # Parse legacy filters from query - @filters, @query, @channel, subs = Filters.from_legacy_filters(@raw_query || "") + @filters, @channel, @query, subs = Filters.from_legacy_filters(@raw_query) else @query = @raw_query || "" end diff --git a/src/invidious/views/components/item.ecr b/src/invidious/views/components/item.ecr index 5f8bde13..ce7af783 100644 --- a/src/invidious/views/components/item.ecr +++ b/src/invidious/views/components/item.ecr @@ -52,11 +52,11 @@ <% if !env.get("preferences").as(Preferences).thin_mode %>
- <% if plid = env.get?("remove_playlist_items") %> -
" method="post"> + <% if plid_form = env.get?("remove_playlist_items") %> + " method="post"> ">

- + @@ -117,11 +117,11 @@

- <% elsif plid = env.get? "add_playlist_items" %> -
" method="post"> + <% elsif plid_form = env.get? "add_playlist_items" %> + " method="post"> ">

- + diff --git a/src/invidious/views/components/player.ecr b/src/invidious/views/components/player.ecr index 206ba380..fffefc9a 100644 --- a/src/invidious/views/components/player.ecr +++ b/src/invidious/views/components/player.ecr @@ -7,8 +7,19 @@ <% else %> <% if params.listen %> - <% audio_streams.each_with_index do |fmt, i| %> - <% if params.local %>&local=true<% end %>" type='<%= fmt["mimeType"] %>' label="<%= fmt["bitrate"] %>k" selected="<%= i == 0 ? true : false %>"> + <% audio_streams.each_with_index do |fmt, i| + src_url = "/latest_version?id=#{video.id}&itag=#{fmt["itag"]}" + src_url += "&local=true" if params.local + + bitrate = fmt["bitrate"] + mimetype = HTML.escape(fmt["mimeType"].as_s) + + selected = i == 0 ? true : false + %> + + <% if !params.local && !CONFIG.disabled?("local") %> + + <% end %> <% end %> <% else %> <% if params.quality == "dash" %> @@ -28,6 +39,9 @@ selected = params.quality ? (params.quality == quality) : (i == 0) %> + <% if !params.local && !CONFIG.disabled?("local") %> + + <% end %> <% end %> <% end %> diff --git a/src/invidious/views/embed.ecr b/src/invidious/views/embed.ecr index 27a8e266..ce5ff7f0 100644 --- a/src/invidious/views/embed.ecr +++ b/src/invidious/views/embed.ecr @@ -24,7 +24,8 @@ "video_series" => video_series, "params" => params, "preferences" => preferences, - "premiere_timestamp" => video.premiere_timestamp.try &.to_unix + "premiere_timestamp" => video.premiere_timestamp.try &.to_unix, + "local_disabled" => CONFIG.disabled?("local") }.to_pretty_json %> diff --git a/src/invidious/views/watch.ecr b/src/invidious/views/watch.ecr index 0e4af3ab..2e493f4c 100644 --- a/src/invidious/views/watch.ecr +++ b/src/invidious/views/watch.ecr @@ -64,7 +64,8 @@ we're going to need to do it here in order to allow for translations. "preferences" => preferences, "premiere_timestamp" => video.premiere_timestamp.try &.to_unix, "vr" => video.is_vr, - "projection_type" => video.projection_type + "projection_type" => video.projection_type, + "local_disabled" => CONFIG.disabled?("local") }.to_pretty_json %> diff --git a/videojs-dependencies.yml b/videojs-dependencies.yml index 6de23d25..e9ccc9dd 100644 --- a/videojs-dependencies.yml +++ b/videojs-dependencies.yml @@ -1,9 +1,7 @@ -# Due to an firefox issue, we're stuck on 7.11.0. If you're hosting a private instance -# and you're using a chromium based browser, feel free to bump this to the latest version -# in order to get support for higher resolutions on more videos. +# Due to a 'video append of' error (see #3011), we're stuck on 7.12.1. video.js: - version: 7.11.0 - shasum: e20747d890716085e7255a90d73c00f32324a224 + version: 7.12.1 + shasum: 1d12eeb1f52e3679e8e4c987d9b9eb37e2247fa2 videojs-contrib-quality-levels: version: 2.1.0